第5章:当你编码时

有人认为,项目一旦进入编码阶段,便是机械劳动,这是错误的。
编码不是机械劳动,程序员每分钟都需要进行思考做出决策。

本章讲的是实际编码时要注意的细节:

  • 主动思考代码为何能工作,而不是靠巧合编程
  • 评估算法速率
  • 不断地在代码设计中看到改进的余地,进行重构
  • 记住你未来要对代码进行测试,所以你需要编写易于测试的代码
  • 小心那些帮你写大量代码的工具,比如邪恶的向导

31《靠巧合编程》

我们应该避免靠巧合编程——依靠运气和偶然的成功。
而是应该深思熟虑地编程。

巧合包括:

  • 实现的偶然。你可能依靠没有计入文档的错误,或是边界条件。
  • 语境的偶然。例如你假定现在在GUI中,没有考虑非GUI的情况。
  • 隐含的假定。

如何深思熟虑地编程?

  • 总是意识到你在做什么。
  • 不要试图构建你完全不理解的应用,或者你有疑问的技术。
  • 依靠可靠的事物。
  • 为你的假定建立文档。
  • 不要只是测试你的代码,还要测试你的假定。
  • 为你的工作划分优先级,把时间花在最重要的地方,确保你的基本原则和基础设施是正确的。
  • 不要做历史的奴隶。一旦你发现过去的代码有问题,请修改它,甚至是进行重构。

32《算法速率》

评估算法速率有时很重要,它将决定你采取什么决策。

如果关系总是线性的,那么这一节就无关紧要了。但大多数时间不是。
有时,你确实需要更严格的评估,那么就需要用到 O()表示法了

常见的O():

  • O(1):常数型。例如数组元素,简单语句。
  • O(lg(n)):对数型。例如二分查找。
  • O(n):线性。比如顺序查找。
  • O(nlg(n)):比线性差,但是不会差太多。例如快速排序的平均时间
  • O(n^2):平方。(选择和插入排序)
  • O(n^3):立方。(2n x n 矩阵相乘)
  • O(C^n):指数型。(旅行商问题,集合划分)

常识估算:

  • 简单循环。很可能是O(n)。
  • 嵌套循环。O(m x n)。
  • 二分法。O(lg(n))
  • 分而治之。典型例子是快速排序。尽管技术上是O(n^2),但是其行为在馈入时是排过序的输入时会退化,因此平均时间是O(nlg(n))。
  • 组合。运行时间可能会失去控制。

估算你算法的阶数。
尝试替换成阶数更低的算法。

不过,也要注重实效。理论上最快的不一定是实际最快的。因为不同的输入数据会导致更快的算法不同。

33《重构》

很多人喜欢把软件开发比喻为建筑:

  1. 建筑设计师绘制蓝图。
  2. 承包商挖掘地基、修建上层建筑、布设管线、最后装修。
  3. 最后房客开心来入住,如果有问题就找人来修。

商人喜欢建筑的比喻,因为它看起来更科学、可控、可复用。
但遗憾的是,软件开发与上述的流程不怎么相似

软件开发比起建筑更像是园艺——它比混凝土更有机:

  • 你有个初步计划在花园里种下许多植物。
  • 有些茁壮成长,但有些注定成为肥料。
  • 你可能会改变植物的位置以有效利用光影和风雨的交互。
  • 过度生长的植被会被修剪。你还需要拔除野草。
  • 你不断关注着花园的兴旺,并按照需要做出任何调整。

重写、重做和重新架构代码合起来,称为“重构”。

你该在何时重构?

  • 重复
  • 非正交的设计
  • 过时的知识
  • 需求变化
  • 性能

现实情况很复杂,你的重构想法不一定会得到认可,但还是应该——
早重构,常重构

关于重构的建议:

  1. 在重构的同时不要试图增加功能
  2. 在开始重构之前,确保你拥有良好的测试
  3. 采取短小而深思熟虑的改动。

34《易于测试的代码》

芯片在设计时就考虑了测试。
我们可以在软件中做同样的事——从一开始就把可测试性构建进软件中。

单元测试:
在隔离状态下,用人为的条件对模块进行测试。

单元测试也可以被看作是“对合约的测试”。

单元测试不应被放在遥远的角落,而是放在容易被找到的地方。

你可以使用一些工具进行测试。

测试是技术,但也是一种文化。

测试你的软件,否则你的用户就得测试。

35《邪恶的向导》

类似VisualStudio的IDE,可以在创建项目时轻轻一点就以模板生成代码。

我们不是反对这样的向导。相反,我们用了整整一节来说明《代码生成器》的好处。
我们反对的是使用那些你不理解的向导。

有人觉得这是一种极端的想法,毕竟我们每天都在依赖于不完全理解的事物——比如集成电路的量子力学。
但是向导不是:

  • 向导生成的代码变成了你的应用的完整组成部分。
  • 它没有被隐藏在整洁的接口之后,而是和你自己编写的代码交织在一起。
  • 最后,它变为了你自己的代码。然而没人应该制作那些他们不完全理解的代码。

《程序员修炼之道》读书笔记(6):当你编码时(要注意的细节)相关推荐

  1. [转载+电子书下载]《程序员修炼之道》 笔记与感想

    [转载]<程序员修炼之道 >笔记与感想 1 我的源码让猫给吃了 不要寻找借口,从自身找原因 2 软件的熵  一句话:不以善小而不为,勿以恶小而为之. 从初期就要做好规范,不要因为是poc这 ...

  2. 程序员修炼之道---读书随笔1

    终于开始读<程序员修炼之道>这本书了,初看这本书的名字,有点以前的道士修炼法术的意思,觉得很是好奇,作为一名程序员,该如何修炼我们自己呢? 这本书涵盖的主题从个人责任.职业发展,直到用于使 ...

  3. 《程序员修炼之道》笔记(一)

    这几天开始看<程序员修炼之道>,也许不少人看了书的标题,第一时间会觉得这是鸡汤一类的书.但至少以我自己的感受来看,这是很棒的书,现代人文主义不是提倡自我意识嘛,自己感觉好的就是好的.况且人 ...

  4. 程序员修炼之道阅读笔记02

    本周阅读了程序员修炼之道(从小工到专家)的第四章<注重实效的偏执>.第五章<弯曲,或折断>.第六章<当你编码时>的相关内容,对其中一些值得我们学习的地方进行了摘录. ...

  5. 程序员修炼之道阅读笔记01

    读过这本书之后,我觉得这本书主要是在讲一个优秀的程序员应该具有的特点,素质和应该怎么去做.真正是一个程序员从小工到专家的修炼之路. 对于第一章"注重实效的哲学"有如下总结和理解 1 ...

  6. 《程序员修炼之道》笔记(九)

    *续 第八章 注重实效的项目 1. 无处不在的自动化 文明通过增加我们不假思索就能完成的重要操作的数目而取得进步. 无论是构建和发布流程.是书面的代码复查工作.还是其他任何在项目中反复出现的任务,都必 ...

  7. 《程序员修炼之道》笔记(八)

    第八章 注重实效的项目 随着你的项目开动,我们需要从个体的哲学和编码问题转向讨论更大的.项目级的问题.我们将不深入项目管理的具体细节,而是要讨论能使项目成功或失败的几个关键区域. 1. 注重实效的团队 ...

  8. 《程序员修炼之道》笔记(二)

    第二章 注重实效的途径 1. 重复的危害 a) DRY-Don't Repeat Yourself.系统中的每一项知识都必须具有单一.无歧义.权威的表示. b) 重复是怎样发生的 Imposed Du ...

  9. 《程序员修炼之道》笔记(四)

    第五章 弯曲,或折断 为了赶上今天近乎疯狂的变化步伐,我们需要尽一切努力编写尽可能宽松灵活的代码.否则,我们可能就会发现我们的代码很快就会变得过时,或是太脆弱,以至于难以清理. 1. 解耦与得墨忒耳法 ...

  10. 程序员修炼之道--读书简记

    前言 1,关注你的技艺 2,思考!思考你的工作 3,这是一个持续的过程 第一章 务实的哲学 1,人生是你的,你有选择权 人生是你自己的,是你在拥有.经营和创造 2,软件的熵:破窗理论 在城市中心,有些 ...

最新文章

  1. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I
  2. 谷歌如何评估产品经理?
  3. C++继承体系下的对象构造
  4. python 抽象类分析
  5. c#中invoke和beginvoke的区别
  6. C语言和C++的区别
  7. 互联网红利消退,下一个机会在哪?
  8. Windows系统下,使用Emacs+Putty操作远程机器
  9. 美国一鹦鹉趁主人不在家上网购物:买的都是水果蔬菜
  10. 利用老毛桃启动盘制作三合一系统启动:WINPE + CDlinux + Ubuntu
  11. C++读取WINDOWS注册表
  12. 中文车牌识别开源项目C++版使用笔记
  13. 京东商品类目查询接口
  14. 信创操作系统--麒麟Kylin桌面操作系统(项目九 实用工具软件:截图、字体、扫描、打印机)
  15. python 知乎 sklearn_最全知乎专栏合集:编程、python、爬虫、数据分析、挖掘、ML、NLP、DL......
  16. [转载]揭秘骇人的湘西“赶尸”奇俗
  17. 牛逼,个人开发者可以申请微信支付了!
  18. 不要被意外牵着鼻子走
  19. 亚马逊云科技物联网产业创新峰会与你相聚蓉城
  20. Unity 材质设置为tiling不能够重复的问题

热门文章

  1. 数据库小技能:Case和nvl的使用
  2. 厚积薄发,你只有付出!(编程之始)
  3. 21句话帮你去掉忧愁和焦虑
  4. 为何炒外汇总是亏损?
  5. C#开源资源大汇总nbsp;C#开源资源大汇…
  6. 那年,我们放生的烟火
  7. ipad下载的文件在哪里可以找到
  8. Tpye-C连接外接显示器失效
  9. 保存更新数据的时候提示: 类的属性不存在
  10. 外国人在北京买房无需再提供纸质证明