写点什么

反面教材:搞砸 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:005012

评论 2 条评论

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

语音输入还是打字输入

将军-技术演讲力教练

【CSS 学习总结】第一篇 - HTML 的语义化

Brave

CSS 12月日更

【大咖直播】Elastic 企业搜索实战工作坊(第二期)

腾讯云大数据

Elastic Search

Flink 实践教程-进阶(3):窗口操作

腾讯云大数据

flink 流计算 Oceanus

Flink 实践教程-进阶(4):TOP-N

腾讯云大数据

flink 流计算 Oceanus

MySQL从入门到入魔(03)

海拥(haiyong.site)

MySQL 数据库 28天写作 12月日更

实用机器学习笔记二十一:集成学习之Bagging

打工人!

人工智能 机器学习 学习笔记 集成学习 12月日更

一年一度绩效考核

搬砖的周狮傅

绩效管理

百度智能云以知识智能化驱动产业智能化升级

百度大脑

Dart 条件语句

坚果

flutter dart 28天写作 12月日更

DDD领域驱动设计实战(一)-领域模型、子域、核心域、通用域和支撑域等基本概念

JavaEdge

12月日更

Vuepress 2.X + Element-Plus 的基本使用

码字与律动

typescript Vue3 vuepress Element Plus Vuepress2.X

阿里云(腾讯云)服务器使用宝塔,搭建Python环境,运行 django 程序

梦想橡皮擦

12月日更

为Amazon DMS数据库迁移任务建立自动化监控机制

亚马逊云科技 (Amazon Web Services)

Data

读《思辨与立场》-07-02指导原则

wood

28天写作 批判性思维 思辨与立场

架构实战营-模块七作业

随风King

「架构实战营」

混沌工程之 ChaoBlade 的实现原理

zuozewei

混沌工程 ChaosBlade 12月日更

21《重学JAVA》-- 集合 (三)

杨鹏Geek

Java25周年 28天写作 12月日更

用户日活月活怎么统计 - Redis HyperLogLog 详解

程序员历小冰

redis 28天写作 近似算法 12月日更 HyperLogLog

架构实战营

ren

感情是麻烦出来的(21/28)

赵新龙

28天写作

基于SLA的测试

QualityFocus

云原生 测试 SLA

浅谈protobuf

lecury

协议 服务器端开发 protobuf

比较PostgreSQL与MySQL两大开源关系数据库管理系统

Ethereal

MySQL 数据库 postgresql

百度搜索中台海量数据管理的云原生和智能化实践

lecury

云原生 数据架构 架构演进 技术创新 百度搜索

Prometheus Exporter (三十三)BIND Exporter

耳东@Erdong

Prometheus 28天写作 bind exporter 12月日更

[Pulsar] TopicPolicy的同步过程

Zike Yang

Apache Pulsar 12月日更

如何在Linux系统中安装Docker?

Ethereal

Docker

妙解RIP协议和OSPF协议的优缺点,建议收藏!

Ethereal

网络协议 OSPF 网络技术 网络技术联盟站 rip

模块七作业:王者荣耀商城异地多活架构设计

dean

架构实战营

基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统

腾讯云大数据

流计算 Oceanus Elastic Search

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