"There are only two hard things in Computer Science: cache invalidation and naming things."

— Phil Karlton

在计算机领域只有两件艰难的事情:缓存失效和对象命名。

这还真不是一个笑话。写代码是比较容易的事情,但是阅读别人的代码,那就因人而异了。

好的工程师写出来的代码可读性很高,比如我上家公司的同事旭总。一般的工程师写出来的代码就像是一坨屎,比如之前某某几位同事。

所以我会经常去格式化他们的代码。如果不幸轮到你继续在屎代码上面开发,那就是屎上堆屎了。心疼你。

当然有时候工期紧张,我自己也会写一些屎代码shit code,但是每次提交的时候都有一种强烈的愧疚感。希望这些代码最多存活一个月就消失,不要被人踩到了。

屎代码是怎么产生的?

要说怎么写屎代码,这个我就很拿手了。下面随便列举一些常见的屎代码产生方式:

  1. 看不懂的命名
  2. 过长的类|函数
  3. 大段重复的代码
  4. 没有注释的Magic number
  5. 100多个参数的函数
  6. 一堆没有注释的if-else嵌套
  7. 业务过度耦合:支付订单和点餐订单能耦合在一起?谁重构谁痛苦
  8. 代码和文档分离:几年前的业务完全不知道是个啥
  9. ...

很不幸,大多数人的项目中,这些常见的屎代码产生方式是随处可见的。

毕竟,几百个人写屎代码,就像几百个人堆积木。堆得歪歪扭扭,摇摇晃晃,乱七八糟,你千万不能抽里面的积木,指不定抽了一块就塌了。只能看见哪里觉得不牢靠不停的往那边填积木。只要不倒就好了。这也是大部分程序员的追求了。

不写屎代码从命名规范开始

如果想解决代码高耦合这坨屎,需要有比较好的顶层解耦设计,划分清楚各自服务的边界。

如果你一直都只是代码搬运工,传说中的cv工程师,那么到这一步还有一些内功需要你去修炼的。

但是好的命名规范确实每个人都可以做到的。不同的语言都有各自的规范,如果所有人都能正确理解那些规范,并且严格遵守,同时强制使用ci校验,就可以保证代码外表上是美观的。

这里就以Go语言的命名规范为例讲一下怎么写出人人都想闻的香代码。

go fmt可以统一不同人的编码规范,却没有办法格式化出一个好的命名。但是在Go社区中其实一直都存在着一些成文的或者不成文的命名规则,比如:

  1. 某个名称在包外是否可见,就取决于其首个字符是否为大写字母
  2. 使用驼峰命名而不是下划线
  3. 单个方法的接口名称应该是InterfaceName = MethodName + er
  4. Getter方法的命名不需要包含Get,比如cat.Owner()方法不需要命名成cat.GetOwner()
  5. 首字母缩写词应该保持原有格式:应该使用userID而不是userId,应该使用userAPI而不是userApi
  6. 变量名需要尽可能的简单但是又能描述清楚
  7. ...

总之,规则是有的。只是很多程序员选择直接忽视。比如前面的五条。

还有一些规则是被过渡滥用了。比如第6条,很多同事的命名沿用以前的老风格,在一个struct中大量使用单字符的的变量或者随心所欲的缩写。这样的代码是完全没有办法阅读的。所谓有追求的程序员,还是得追求一下代码的品味。

悲观的说,即使做到了这些也只是你一个人的代码是优雅的,但是你怎么能保证所有人都有这样的追求呢?作为个人,除了提建议之外,其实是没有太多有效的办法的。

怎么才能根治屎上堆屎?

想根治这个问题,只靠某个程序员一直保持优雅代码是没什么用的。

你写10句优雅的代码,其他10个同事每个人都写10句屎代码。这样算起来,优雅代码的比例最多只有十分之一。

如果一个团队想要彻底解决屎上堆屎这个老大难问题,就需要贯彻执行下面两点方法:

  1. 招高质量的程序员:code sense很重要,每个程序员都需要懂得奥卡姆剃刀原理:若无必要,勿增实体。
  2. 管理层需要有长远的视野而不仅仅是短期目标。

深度悲观的说,这两个方法真正执行起来的时候也是难度重重,基本不可能完成。

高质量无论是不是在互联网行业,都意味着价格昂贵,但又有几家公司能给得雇佣的起这么多昂贵的程序员呢?

而长远的目标在资本的压力之下,也显得一文不值。代码规范提升10%的重要性和“明天上线”这个命令比起来,也是低到尘埃的的。然后日复一日,明天又将是明天,规范性最终消失殆尽,屎山越来越高。

说到底,这些都是钱的问题,也是最无解的问题,最终在某一天,屎山崩溃,一切回到原点。

最后,大胆猜测一下,昨天的Google服务崩溃也是因为屎太多了吧。


记得帮我点赞哦!

精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你需要的学习资料,还在等什么?快去关注下载吧!!!

念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。

听我说,进步多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

职场亮哥文章列表:更多文章

本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!

坚持住啊,还在代码屎山中爬行的同事们相关推荐

  1. 如何消除代码屎山中的一大坨参数列表?

    有经验的程序员应该都见过,一个方法坐拥几十上百个参数. 方法为何要有参数? 因为不同方法间需共享信息. 但方法间共享信息的方式不止一种,除了参数列表,还有全局变量.但全局变量总能带来意外惊喜,所以,取 ...

  2. 某程序员动了公司祖传代码屎山,半年没改完,惭愧后交辞职报告

    前段时间,有这样的一个话题,非常的火热,那就是关于程序员的,新入职程序员吐槽老员工写的代码就像是"一坨屎"!这样的言论瞬间就引起了程序员们的讨论. 有程序员认为,别看现在像是一坨屎 ...

  3. 某程序员动了公司的祖传代码“屎山”,半年后怒交辞职报告!

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 来源:网络 前段时间,有这样的一个话题,非常的火热, ...

  4. 如何消除代码shi山中的一坨参数列表?

  5. 如何消除代码山中那一大坨参数列表

    本文分享自华为云社区<如何消除代码屎山中的一大坨参数列表?>,作者: JavaEdge . 有经验的程序员应该都见过,一个方法坐拥几十上百个参数. 1 方法为何要有参数? 因为不同方法之间 ...

  6. GTA 5祖传「屎山」代码终于修复!R星认可黑客方案,还给他发了1万美元奖金

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 折磨全球无数GTA 5玩家的联机版超长加载时间问题,终于要修复了. 什么?R星(游戏开发商RockStar)主动改善玩家游戏体验?不存在的 ...

  7. 入职第一天,我接手了号称【屎山】的祖传代码,这还能卷吗???

    公司各种各样的祖传代码都是令新人虎躯一震的代码,因为有时候你根本不知道它是干嘛的,甚至觉得它毫无用处,关键是 还绝对不能动,碰一段改半年,别问我怎么知道的.最讽刺的是,你可能为了修改代码,也在里面拉了 ...

  8. p3c 插件,是怎么检查出你那屎山的代码?

    作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/RwzprbY2AhdgslY8tbVL-A 一.前言 你会对你用到都技术,好奇 ...

  9. 为什么祖传代码被称为「屎山」?这个回答简直太形象了

    经常听说祖传代码会被人称之为「屎山」,不同人可能有不同的体会,最近看到一个回答,简直是把这个阐述得"活灵活现",大家来感受下吧. " 阅读本文大概需要 3 分钟. &qu ...

  10. 为什么祖传代码被称为“屎山”?

    任何设计人员,你几年之后再来看自己现在的作品,你就会觉得简直就是狗屎,拿出来真tm丢人. 如果你没有这种感觉,那说明你这行干不久了. 说到祖传代码不得不提之前在知乎上看到的两位网友的经历: 一 我刚入 ...

最新文章

  1. Android Studio窗口组成
  2. 用最少的机器支撑万亿级访问,微博6年Redis优化历程
  3. cookie获取java_java中如何获取cookie
  4. keyshot渲染图文教程_一篇文章教你学会3D建模和渲染 反正我是信了
  5. 数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o
  6. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8700系列电磁流量计和传感器的几种类型!...
  7. 作业5.2 5.3
  8. 代码中的时间格式问题究竟该如何处理?
  9. python进阶与数据操控_python进阶(mysql:表操作、数据操作、数据类型)(示例代码)...
  10. WMI 脚本入门:第二部分 (MSDN)
  11. Security+ 学习笔记51 风险分析
  12. Brettle.Web.NeatUpload.dll大文件上传控件使用详解
  13. c# 循环com,分别对串口写入与读取,获取需要的串口信息
  14. 编程珠玑Column11中插入排序和快排序
  15. 实战VMware虚拟机下使用海蜘蛛软路由
  16. C7N新增,保存,删除基础模板
  17. BigDecimal四舍五入保留两位小数
  18. 8255A的工作方式
  19. pyepics Device:PVs的集合
  20. 2015年南通二级建造师考试报名通知

热门文章

  1. 反转链表(leetcode 206)
  2. python编写beta计算器_|python编写计算器
  3. 工程制图与计算机绘图实训任务书及参考资料,工程制图与计算机绘图综合实训(12版).doc...
  4. 去掉vue中万恶的eslint
  5. android studio anr,Android ANR 分析
  6. 用AI如何预测《权力的游戏》死亡名单?真是神了!
  7. CentOS安装onlyoffice
  8. poco mysql 登录_POCO数据库操作简介
  9. ubantu 防火墙
  10. 6,美国2012年总统候选人政治献金数据分析