`
pda158
  • 浏览: 189918 次
社区版块
存档分类
最新评论

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

阅读更多

总结的22条经验如下: 

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

     


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

  
• 近几年不少研发团队逐步往快速迭代方向转移,其中应当更多地关注目前代码的内部质量,是否有足够的单元测试保证代码的稳定性,是否不断地在进行重构保证代码的简洁。在快速应对变化的同时,代码不能丝毫打折扣。我们要经常反思,我们估计的时间,是否已经考虑给开发团队预留了足够的重构时间?产品经理是否足够的了解代码目前的质量状态?我们是否在欠债? 

  
• 对于维护现有代码,我们经常是直接野蛮的在原有代码中继续累加逻辑,很少考虑重构,导致原有逻辑越来越复杂,难以理解。这一点应当受到更多关注。 

 

最后引用一句话,与大家共勉: 

 

  
知识不在于记住多少,而是在于它出发了你多少的思考。一旦我们开始反思我们的代码,代码将不再一样。 

5
0
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    代码语法错误分析工具pclint8.0

    C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PCLint识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.7.2 类外部的成员函数定义 328 7.8 类对象的数组 329 7.9 类的静态成员 331 7.9.1 类的静态数据成员 331 7.9.2 类的静态函数成员 334 7.10 类对象的指针和引用 334 7.10.1 类对象的指针 334 7.10.2 类对象...

    上市公司产学研合作专利数据及专利明细数据(附python代码,参考文献, 1998-2022)

    资源和能力越来越难以有效实现技术创新,利用外部资源进行合作研发以实现创新成为了新 的趋势( Chesbrough,2006) 。其中,产学研合作作为合作研发的一种 重要形式,指的是企业、大学、科研机构之间的合作创新活动( ...

    软件众包任务的定价模型与人员匹配方法研究及工具实现

    方面,该模式通过利用群体智慧可帮助企业整合外部资源,提升软件生产效率, 减少内部雇用开支,降低软件缺陷率。另一方面,由于软件众包与传统软件开 发模式存在着显著差异,其新特性也为其资源配置带来了新的挑战,...

    Visual C++ 2005入门经典--源代码及课后练习答案

    Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。Ivor Horton还著有Beginning Visual C++ 6、Beginning C ...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    智能合约编写之Solidity的高级特性

    还能提升代码的可读性与质量,减少误解和bug;更有利于优化合约执行的成本,提升链上资源的使用效率。守住函数操作的大门:函数可见性Solidity有两种函数调用方式:内部调用:又被称为『消息调用』。常见的有合约内

    搜易站内搜索引擎-.net

    搜易站内搜索引擎系统,是一款为中小型网站站长而开发设计,目标是希望通过后台点点鼠标,无需编写代码便可搭建高并发,搜索质量高的站内搜索引擎,还有可提高收录的关键词聚合SEO模块。功能特性如下:1、类型化的...

    javaweb投票系统源码-s2jh:基于Struts/Spring/JPA/Hibernate和jquery/bootstrap的企业系统J

    欢迎关注的朋友在各大项目推广平台以提问、分享、收藏、点赞、投票等多种形式推广支持项目,以便更多人共同关注、问题反馈、功能优化等,促进整个项目质量不断提升 提示:为了方便用户区分链接资源是外部和内部,...

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

    中通2008—2012通信概预算编制系统_v4.1.0_Winxp_setup

    本软件依据工业和信息化部二00八年五月二十日,工信部规[2008]75号文发布的《通信建设工程概算、预算编制办法》及相关费用定额编制。包含以下最新2008版《通信建设工程预算定额》及中国电信补充定额: a)《通信电源...

    中通2008—2012通信概预算编制系统_v4.0.6_Winxp_setup.

    本软件依据工业和信息化部二00八年五月二十日,工信部规[2008]75号文发布的《通信建设工程概算、预算编制办法》及相关费用定额编制。包含以下最新2008版《通信建设工程预算定额》及中国电信补充定额: a)《通信电源...

    网络驱动程序设计指南

    第十二章 带WDM低级接口的微端口驱动程序 174 12.1 WDM低层微端口 174 12.2 注册WDM低层的微端口函数 174 12.3 初始化WDM低层微端口 175 12.4 发布命令与远程设备通信 176 12.4.1 在总线上发送包 176 12.4.2 在总线...

    win2000驱动程序设计指南

    NDIS NIC微端口驱动程序 20 1.1 NIC微端口驱动程序类型 20 1.2 网络接口卡支持 20 1.3 微端口驱动程序代码的重要特征 22 1.3.1 MiniportXxx函数 22 1.3.2 与NDIS库链接 22 1.3.3 微端口适配器环境...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

Global site tag (gtag.js) - Google Analytics