提升代码内外部质量的22条经验

本文主要关注代码的内部和外部质量,编程的价值观,代码质量的评估标准,整洁代码的匠艺以及如何维护已有的代码。

外部质量:用户所能感受到的部分,正确性,易用性,效率,可靠性。

内部质量(代码质量):可维护性,灵活性,可移植性,重用,可读性,可测试性,可理解性。

总结的22条经验如下:

  1. 代码分为外部质量和内部质量,好的产品不等于好的代码(Good Software != Quality Code)。
  2. 产品的冰山效应:产品经理以及用户关注的部分只是冰山露在水面以上的部分,隐藏在下面的是看不见的更加庞大的部分,那就是我们庞大的代码。
  1. 拒绝 PPT 架构师,架构师应当写代码,哪怕这些代码并不 Check-in 到最终的代码库中。一个好的设计不是在凭空产生的,而是经过不断打磨、修改进而获得的。不存在一次设计,程序猿无脑堆砌代码能够完成的好的程序。
  1. 编程的价值观:沟通、简单、灵活。
  2. 代码最重要的功能是传递程序员的设计和思路,其次才是实现的功能。好的程序员应当写出人类能够看懂的代码,而不是机器能理解的代码。
  3. 效率不是牺牲清晰性的理由,不能够因为人主观“认为”的一些小伎俩,使用晦涩的代码,企图以此提升性能。应当依赖编译器本身的优化,依赖工具对性能低下的点进行评测,进而进行针对性的优化。
  4. 不要试图死磕代码加快速度,找个更加有效的算法可能更加有效。
  5. 代码要先做对,在弄快。先使其可靠,再让其更快。先把代码弄干净,再让它变快。
  6. Good code is not bad code。坏的代码是可以通过一些指标进行度量的。让坏代码的指标可以被机器固化并时时检查,确保代码不会变得更糟。
  7. 函数本身不是用来复用,这和很多“主流的”观点不同。函数的存在的主要意义在于:划分独立职责,隐藏具体细节操作,使得代码具有可读性,应对扩展的变化,方便进行单元测试。顺带的,偶尔可以用作复用。
  8. 函数应当遵循:单一抽象层次原则、短小原则和单一职责原则。
  9. 当发现一个函数具有以下特征时,需要考虑抽取函数:
    • 过长
    • 嵌套层数过深。
    • 自然分块,需要使用注释描述该程序块
    • 判断条件过于复杂
    • 函数的某些判断分支不断变化
    • 参数过于复杂
    • 逻辑重复
  10. 局部变量应当用途单一
  11. 新写代码逻辑,应当关注用户场景和类职责划分,不应当上来就考虑我要使用一个什么模式。这样势必会导致过度设计。模式用作应对变化,当后续版本发生变化时,模式用作重构现有代码。
  12. 不断重构,保持代码简洁。
  13. 代码是债务,一个程序员欠下的债务,总是要还的,虽然可能不是由本人还。维护老代码的程序员又被称作代码考古工程师,经常在一大堆糟乱的代码中挖掘最初的用户需求,往往这些需求淹没在无数的变更历史中。维护老代码是一个费时费力的过程。需要一些技巧减小修改老代码的风险。
  14. 程序员应当将整洁的代码风格作为一种习惯,时刻意识到整洁代码的重要性并不断地提高重构技巧。
  15. 意图导向编程可以辅助思考,并生成易懂代码。
  16. 设计模式本身是用做应对变化的。如果在开发时就想着“我要用模式”,很可能会导致过度设计。在对代码进行重构时,才应当考虑使用设计模式解决问题。
  17. 函数名称很重要。
  18. 关于注释:
    • 如果能用短小函数描述,则使用子函数替代注释本身。
    • 确保注释和代码表达的意图一致,否则就失去了注释的意义。
    • 在重要的地方写注释,不要注释满天飞,简单的重复代码的功能是毫无意义的。要让每一处注释都有价值。不要过分注释。
  19. 关于何时重写代码
    • 开发团队要预留20% 的时间用作保持对原有系统的重构。剩余的时间用作开发新功能。
    • 只要有可能,对所要重构的部分进行递增修改,让用户切身感受到产品的改进,哪怕将工作时间延长。

以上经验分享,结合到具体工作,可能有场景需要考虑:

  • 近几年不少研发团队逐步往快速迭代方向转移,其中应当更多地关注目前代码的内部质量,是否有足够的单元测试保证代码的稳定性,是否不断地在进行重构保证代码的简洁。在快速应对变化的同时,代码不能丝毫打折扣。我们要经常反思,我们估计的时间,是否已经考虑给开发团队预留了足够的重构时间?产品经理是否足够的了解代码目前的质量状态?我们是否在欠债?
  • 对于维护现有代码,我们经常是直接野蛮的在原有代码中继续累加逻辑,很少考虑重构,导致原有逻辑越来越复杂,难以理解。这一点应当受到更多关注。

最后引用一句话,与大家共勉: 知识不在于记住多少,而是在于它出发了你多少的思考。一旦我们开始反思我们的代码,代码将不再一样。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

你的微服务敢独立交付么?| 洞见

最近经常在项目或是社区里听到大家谈论微服务架构,但谈论的焦点更多集中在微服务拆分,分布式架构,微服务门槛,DevOps配套设施等话题上。

582
来自专栏阮一峰的网络日志

Google日历简易版

我试过自己搭建软件,但又懒得维护。使用过twitter,但它的档案查阅和时间序列功能实在太弱了。

673
来自专栏老司机的技术博客

宝宝都能学会的python编程教程1:第一行代码

前言 众所周知,现在IT行业很火,行业薪酬也很高,国家在2017年也发布了人工智能教育的推广计划,人人会编程的时代将要到来。不会编程、不懂编程可能有些跟不上时代...

3805
来自专栏LET

可视化之Berkeley Earth

1417
来自专栏FreeBuf

挖洞经验 | 我是如何挖掘热门“约P软件”漏洞的

写在前面的话 本文所介绍的漏洞存在于一款当前热门的约会应用之中,在编写这篇文章时,我也已经对截图中可能会涉及到的App、组织以及用户名称进行了处理,因为我不想损...

1937
来自专栏Java学习网

每个程序员都需要学习 JavaScript 的7个理由

每个程序员都需要学习 JavaScript 的7个理由 最近在和招聘经理交流现在找一个好的程序员有多难的时候,我渐渐意识到了现在编程语言越来越倾重于JavaS...

2229
来自专栏Flutter入门到实战

关于烂代码的那些事 – 评价代码优劣的方法

秦迪,微博研发中心技术专家,2013 年加入微博,负责微博平台通讯系统的设计和研发、微博平台基础工具的开发和维护,并负责微博平台的架构改进工作,在工作中擅长排查...

782
来自专栏华章科技

Python为啥这么牛?跟其他语言相比究竟有什么优势?

导读:选择要学习的技术和选择要上的大学一样重要,如果选错了,你将来不仅得不到自己喜欢的高薪工作,反而会弄得一堆麻烦。如果你打开了这篇文章,说明你已经考虑选择Py...

782
来自专栏java达人

select选择框随输入过滤的两种不同实现(附代码)

一部分企业在招人时,可能是为了节省人力成本,会要求java开发人员熟悉前端技术,有些只要求会使用easyui这样的框架就行,而另一些则要求java程序员精通前端...

2059
来自专栏java一日一条

前谷歌高级Java架构师分享工作8年经验(如何成为一名架构师)

很多工作一定年限的程序员感觉自己到了瓶颈不知道怎么去突破,其实这个时候就要冲破传说中的架构师。

801

扫码关注云+社区