本文是阅读《程序员修炼之道》后的一些感想和摘抄,个人觉得其中很多内容非常不错,所以分享出来,期望能和大家共同学习,努力成为一名务实的程序员。
编程是一门技艺。简单地说,就是让计算机做你想让它做的事情(或是你的用户想让它做的事情)。作为一名程序员,你既在倾听,又在献策;既是传译,又行独裁;你试图捕获难以捉摸的需求,并找到一种表达它们的方式,以便仅靠一台机器就可以从容应付。你试着把工作记录成文档,以便他人理解;你试着将工作工程化,这样别人就能在其上有所建树;更重要的是,你试图在项目时钟的滴答声中完成所有这些工作。你每天都在创造小小的奇迹。——《程序员修炼之道》
什么是“务实”?务实(Pragmatic)这个词来自拉丁语 pragmaticus ——“精通业务”,该词又来源于希腊语 πραγματικός,意思是“适合使用”。
务实程序员特征软件的熵
当软件中的无序化增加时,程序员会说“软件在腐烂”。有些人可能会用更乐观的术语来称呼它,即技术债。
有很多原因导致软件腐烂。最重要的一个似乎是项目工作中的心理状态,或者说文化。无视一个明显损坏的东西,会强化这样一种观念:看来没有什么是能修好的,也没人在乎,一切都命中注定了。所有的负面情绪会在团队成员间蔓延,变成恶性循环。
不要放任破窗,及时发现及时修复,漠视会加速腐烂的过程。
软件开发中应该遵循的方法:不要只是因为一些东西非常着急,就去造成附带伤害。破窗一扇都嫌太多。
够好即可的软件
不要为了追求更好而损毁了原有已经够好的。
我们做的东西,从用户需求角度出发是否足够好?最好还是留给用户一个机会,让他们亲自参与评判。无视来自用户方面的需求,一味地向程序中堆砌功能,一次又一次地打磨代码,这是很不专业的表现。心浮气躁当然不值得提倡,比如承诺一个无法兑现的时间尺度,然后为了赶上截止日期删减必要的边角工程,这同样是不专业的做法。
如果早点给用户一点东西玩,他们的反馈常常引领你做出更好的最终方案。
知识组合
知识和经验是你最重要的专业资产。学习新事物的能力是你最重要的战略资产。
关于如何构建自己的知识组合,可以参考以下指导方针:
对于那些已经构成知识组合的智力资产,获取它们的最佳途径可以参考如下建议:
批判性思维
批判性地思考读到的和听到的东西。
批判性地分析问题,先思考几个问题:
ETC——优秀设计的精髓
优秀的设计比糟糕的设计更容易变更。
对代码而言,要顺应变化。因此要信奉 ETC(Easier To Change,更容易变更)原则。ETC 是一种价值观念,不是一条规则。关于培养 ETC 观念,有以下几点意见:
DRY——邪恶的重复
我们认为,想要可靠地开发软件,或让开发项目更容易理解和维护,唯一的方法就是遵循下面这条DRY(_Don't repeat yourself,不要重复自己_)原则:
在一个系统中,每一处知识都必须单一、明确、权威地表达。
与之相对的不同做法是在两个或更多地方表达相同的东西。如果变更其中一个,就必须记得变更其他的那些。
DRY 不限于编码,DRY 针对的是你对知识和意图的复制。它强调的是,在两个地方表达的东西其实是相同的,只是表达的方式可能完全不同。
正交性
定义:对于两个或多个事物,其中一个的改变不影响其他任何一个,则这些事物是正交的。
当系统的组件相互之间高度依赖时,就没有局部修理这回事儿。我们希望设计的组件自成一体:独立自主,有单一的清晰定义的意图。但凡编写正交的系统,就能获得两个主要的收益:提高生产力和降低风险。
设计
可以用一个简单的方法可以测试设计的正交性。当你规划好组件后,问问自己:
编码
当你写下代码时,就有降低软件正交性的风险。你不仅需要盯着正在做的事情,还要监控软件的大环境。有几种技术可以用来保持正交性:
测试
修 Bug 也是评估整个系统正交性的好时机。遇到问题时,评估一下修复行为的局部化程度。只要变了一个模块,还是有很多处变更分散在整个系统里?当你修正了一个地方,是不是就修复了所有问题,还是会神秘地出现其他问题?
曳光弹
使用曳光弹找到目标。
对于我们来说,最初的曳光弹就是,创建一个简单的工程,加一行“hello world!”,并确保其能编译和运行。然后,我们再去找整个应用程序不确定的部分,添加上让它们跑起来的骨架。
使用曳光弹代码的优势:
务实的程序员会为自己的错误建立防御机制。
契约式设计(DBC)
与计算机系统打交道很难,与人打交道更是难上加难。而契约规定了你的权利和责任,同时也规定了对方的权利和责任。文档化及主张进行检验是契约式设计的核心。
在编写代码之前,简单列出输入域的范围、边界条件是什么、例程承诺要交付什么——或更重要的是,没有承诺要交付什么——这对编写更好的软件来说,是一个巨大的飞跃。
尽早崩溃
尽快检测问题的好处之一是,可以尽早崩溃,而崩溃通常是你能做的最好的事。一旦代码发现本来不可能发生的事情已经发生,程序就不再可靠。这一刻开始,它所做的任何事情都是可疑的,所以要尽快终止它。
一个死掉的程序,通常比瘫痪的程序,造成的损害更小。
使用断言编程
无论何时,你发现自己在想“当然这是不可能发生的”时,添加代码来检查这一点,最简单的方式就是使用断言。注意这里的断言检查的是不可能发生的事情,普通的错误处理不要使用断言。
保持资源平衡
大多数情况下,资源使用遵循一个可预测的模式:
不要超出控制范围
把反馈的频率当作速度限制,永远不要进行“太大”的步骤或任务。
当你不得不做下面的事情的时候,你可能陷入了占卜的境地:
传统观点认为,一旦项目到了编码阶段,就几乎只剩下一些机械工作:只是把设计翻译成可运行的代码段而已。我们认为这种态度是软件项目失败的最重要原因。编码不是机械工作。务实的程序员会对所有代码进行批判性思考,包括自己的代码。我们不断看到程序和设计的改进空间。
听从直觉
倾听自己直觉的方法:
重构
代码需要演化:它不是一个静态的东西。
马丁.弗勒将重构定义为:重组现有代码实体、改变其内部结构而不改变其外部行为的规范式技术。
何时重构
当你学到一些东西时,当你比去年、昨天甚至是十分钟前更了解某事时,你会重构。
无论问题是多是少,都有可能促使我们对代码进行重构:
尽早重构,经常重构。
如何重构
重构的核心是重新设计。你或团队中的其他人设计任何东西的时候,都可以根据新的事实、更深的理解、更改的需求等重新设计。但是,如果你执拗地非要将海量的代码统统撕毁,可能会发现,自己所处的境地,比开始时更加糟糕。
重构是一项需要慢慢地、有意地、仔细地进行的活动。马丁.弗勒提供了一些简单技巧,可以用来确保进行重构不至于弊大于利:
本文只是分享了书中的一部自己觉得比较好的、可以实际使用的观点,并非书中所有观点),强烈建议大家读一下本书,相信会有不错的收获。最后贴个大佬对本书的评价,我也是因为刷到这个所以才知道此书的。