写点什么

反面教材:搞砸 Web 开发的 15 种方法

作者 | Fotis Adamakis

  • 2023-11-07
    北京
  • 本文字数:2288 字

    阅读完需:约 8 分钟

大小:720.50K时长:04:05
反面教材:搞砸Web开发的15种方法

现如今,网络上关于怎么构建健壮、可维护 Web 应用的文章随处可见,相信大家早就看烦了。那如果公司里刚好来了个你看着不顺眼的新同事,各位打算给这家伙点颜色瞧瞧,该怎么下手?别担心,坏事就由我来做。只要按照以下 15 条建议实施,绝对能让 Web 开发者在浪费一整天时间之后、陷入深深的沮丧与自我怀疑当中。

 

1. 抽象层


多用抽象层、越多越好,直到:


  • 代码已经难以理解和调试。

  • 代码变更变得极为困难。

  • 代码运行速度变慢、效率降低。

  • 代码失去复用性。

 

2. 用各种方式刁难 PR 变更


一定要拖住 PR 请求,借此维护住你在项目中的主导地位。


下面提几个可行的刁难借口:


  • 要求把变更名延长;

  • 要求把变量名缩短;

  • 要求重新命名变更名;

  • 要求代码更“紧凑”。

 

3. 不写提交信息


高质量的提交信息多费工夫啊,我们时间宝贵、才没精力浪费在编写这种东西上:

 

[JIRA-1234] build: replace vue-cli with vite
复制代码

 

相反,大家可以直接用以下命令来推送不带任何提交信息的代码:

 

git commit --allow-empty-message -m "" && git push --force
复制代码

 

4. 多用“幻数”


多用“幻数”,这样会显得你更专业、更神秘、更清楚自己到底在做什么:

 

window.scrollTo({  top: 89,  left: 12,  behavior: "smooth",});
复制代码

 

5. 掺杂返回语句


在函数里混杂返回语句,这样别人就永远不知道你接下来打算干什么了:

 

function shouldPayTax(income) {  if(income.amount < 20_000) {    return false  }  if(income.amount > 20_000 && income.country == 'USA') {    return true  }  if(income.country == 'Panama') {    return false  }  if(this.totalWorkingHoursPerWeek > 60) {    return true  }  if(income.amount > 20_000 && income.isCelebrity == true) {    return false  }  if(income.amount > 20_000) {    return true  }}
复制代码

 

6. Typescript


如果有人厚颜无耻地把 TypeScript 添加到项目中,大家可以到处使用 any 来绕过类型检查。

 

function add(a:any, b:any):any {  return a + b}
复制代码

 

7. 用双等号来替代三等号


使用 == 来代替 ===,理由是在生产包中节约宝贵的存储空间。

 

8. 注释代码


除了要编写难以理解的代码之外,也别忘了留下毫无意义的误导性注释,否则没准哪个聪明人就看懂了你的开发逻辑。

 

相关参考规则如下:


  • 注释应该与代码重复;

  • 注释的作用是解释代码为什么不够清楚;

  • 对于可以写出清晰注释的部分,什么都别写;

  • 注释的意义在于引起混乱,而非消除混乱;

  • 切勿提供复制代码的原始链接;

  • 切勿提供有帮助的外部参考链接;

  • 在修复 bug 时,切勿添加任何注释(或测试);

  • 切勿使用注释来标记不完整的实现。

 

这里还有更多“妙招”供大家参考:

https://stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments/

 


9. 使用 Props 实现状态共享


使用 props 传递状态,能让大家更好地把组件层次结构耦合起来,从而大大提高重构难度。

 


10. 对组件状态使用状态管理


另一方面,记得把组件状态移动至全局存储,这样每个人都可以修改其内容。

 

11. 让组件文件变长


使用大型整体组件,理由是这样能更好地明确组件用途、改善变量的跨函数可复用性。

 

12. 不做 linter 检查


Linter 能够分析代码并检测出潜在错误、不一致性以及与既定编码标准间的偏差,而这显然跟我们的意图背道而驰。

 

以下两个代码片段之间就存在明显差异:

 

const props=defineProps({elements:Array,counter:{type:Number,default:0,},});const{data,method}=useComposable();const isEmpty=computed(()=>{returnprops.counter===0;});watch(props.counter,()=>{console.log("Countervaluechanged");});const emit=defineEmits(["event-name"]);function emitEvent(){emit("event-name");}function getParam(param){return param;}
复制代码

 

const props = defineProps({  elements: Array,  counter: {    type: Number,    default: 0,  },});const { data, method } = useComposable();const isEmpty = computed(() => {  return props.counter === 0;});watch(props.counter, () => {  console.log("Counter value changed");});const emit = defineEmits(["event-name"]);function emitEvent() {  emit("event-name");}function getParam(param) {  return param;}
复制代码

专业提示:关于 linting 规则,唯一可以接受的用法就是确保文件长度超过特定行数。这里不妨把数字设定为 1000。

 

13. 在翻译中使用 HTML


要想搞砸 Web 开发,对字符串进行硬编码永远是种好办法。有时候,使用包含 html 元素和类的翻译更能够“锦上添花”。

 

translation.key.name = Hello <span class="red">World!</span>
复制代码

 

14. 编写测试


不编写测试当然也挺好,但要想真正把人折磨疯,最好还是要测试、只是提供一套极差的套件。这里向大家分享折磨人测试的一般准则:

  • 慢——测试时间足够我们去泡杯咖啡;

  • 不可靠——常测常新,永远不确定这测试到底靠不靠谱;

  • 耦合——会影响到其他测试;

  • 过度延伸——尽可能跟应用程序中的其他部分扯上关系。

 

悟性高的朋友还可以参考这份单元测试进阶“教程”:

https://fadamakis.com/8-tips-for-writing-better-unit-tests-8c0a8d8cde16

 

15. 永远信任一切


最后,只有懦夫和小白才需要防御性编程。这世上哪有那么多坏人?

 

总结


请大家别把文章当真,因实操而遭解雇的话,本文作者概不负责。😅

 

如果大家有自己的“奇思妙想”,请在评论栏中不吝分享。

 

原文链接:

https://fadamakis.com/15-terrible-advice-for-web-developers-e821e95f5d18


相关阅读:

Web3当下,最佳投资就是投资自己

Web3的反思,不要抱怨

给Web3创业者的28个原则

和我一起学习Web3

2023-11-07 08:005105

评论 2 条评论

发布
用户头像
没理解第 5 点...
2023-11-07 09:22 · 山东
回复
多条件判断不好找出从哪返回的
2023-11-09 09:55 · 陕西
回复
没有更多了
发现更多内容

Pod 运行时调试

星际行者

透过Net5.5G的棱镜,运营商可以见未来,见机遇

脑极体

Redis Cluster 数据分片

月明风清

redis redis cluster 数据切片

湖仓一体电商项目(八):业务实现之编写写入ODS层业务代码

Lansonli

湖仓一体电商项目 11月月更

SpringMVC+Mybatis整合的增删改查

石臻臻的杂货铺

spring mybatis 11月月更

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

鳄鱼视界

MySQL事务底层原理和MVCC机制

闫同学

MySQL 数据库 MVCC 11月月更

极客时间运维进阶训练营第三周作业

9527

京东面试题:ElasticSearch深度分页解决方案

小小怪下士

Java 程序员 ES

灰度发布设计

星际行者

Python进阶(二十九)Python时间&日期&时间戳处理

No Silver Bullet

Python 日期处理 11月月更

玩转子网划分和超网汇聚

闫同学

网络 子网划分 11月月更 超网汇聚

CSS学习笔记(六)

lxmoe

CSS 前端 学习笔记 11月月更

就这一次!带你彻底搞清MySQL行级锁的加锁规则

Java永远的神

MySQL 数据库 索引 Java 面试题

JVM 引用数据类型分析

Andy

混沌工程实践

星际行者

为什么大家都喜欢使用宝塔面板?

源字节1号

微信小程序 软件开发

涨姿势了,这 4 个场景可用 CSS 完全取代 JS ~

掘金安东尼

前端 11月月更

探知数字化研发1-前言篇

薛飞

数字化 软件研发

麒麟信安携手 openEuler 支撑国家电网首批数字换流站试点项目安全高效运行

openEuler

混沌工程

星际行者

Python进阶(二十六)多线程实现同步的四种方式

No Silver Bullet

Python 多线程 11月月更

玩转MySQL表之间的各种连接查询

闫同学

MySQL 数据库 11月月更

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

股市老人

湖仓一体电商项目(七):业务需求和分层设计及流程图

Lansonli

湖仓一体电商项目 11月月更

Testbench 的编写与应用

芯动大师

Verilog 11月月更 testbench

算法题学习---链表中倒数最后k个结点

桑榆

算法题 11月月更

Python进阶(二十五)Python读写文件

No Silver Bullet

Python 文件读写 11月月更

湖仓一体电商项目(六):大屏可视化工具腾讯云图

Lansonli

湖仓一体电商项目 11月月更

设计模式之美-面向对象对比面向过程有哪些优势?面向过程过时了吗?

GalaxyCreater

设计模式

反面教材:搞砸Web开发的15种方法_性能优化_InfoQ精选文章