自学成才的程序员:成为务实的程序员

人气:133 ℃/2024-01-29 21:21:39

本文是阅读《程序员修炼之道》后的一些感想和摘抄,个人觉得其中很多内容非常不错,所以分享出来,期望能和大家共同学习,努力成为一名务实的程序员。

编程是一门技艺。简单地说,就是让计算机做你想让它做的事情(或是你的用户想让它做的事情)。作为一名程序员,你既在倾听,又在献策;既是传译,又行独裁;你试图捕获难以捉摸的需求,并找到一种表达它们的方式,以便仅靠一台机器就可以从容应付。你试着把工作记录成文档,以便他人理解;你试着将工作工程化,这样别人就能在其上有所建树;更重要的是,你试图在项目时钟的滴答声中完成所有这些工作。你每天都在创造小小的奇迹。——《程序员修炼之道》

什么是“务实”?

务实(Pragmatic)这个词来自拉丁语 pragmaticus ——“精通业务”,该词又来源于希腊语 πραγματικός,意思是“适合使用”。

务实程序员特征务实的哲学

软件的熵

当软件中的无序化增加时,程序员会说“软件在腐烂”。有些人可能会用更乐观的术语来称呼它,即技术债。

有很多原因导致软件腐烂。最重要的一个似乎是项目工作中的心理状态,或者说文化。无视一个明显损坏的东西,会强化这样一种观念:看来没有什么是能修好的,也没人在乎,一切都命中注定了。所有的负面情绪会在团队成员间蔓延,变成恶性循环。

不要放任破窗,及时发现及时修复,漠视会加速腐烂的过程。

软件开发中应该遵循的方法:不要只是因为一些东西非常着急,就去造成附带伤害。破窗一扇都嫌太多

够好即可的软件

不要为了追求更好而损毁了原有已经够好的。

我们做的东西,从用户需求角度出发是否足够好?最好还是留给用户一个机会,让他们亲自参与评判。无视来自用户方面的需求,一味地向程序中堆砌功能,一次又一次地打磨代码,这是很不专业的表现。心浮气躁当然不值得提倡,比如承诺一个无法兑现的时间尺度,然后为了赶上截止日期删减必要的边角工程,这同样是不专业的做法。

如果早点给用户一点东西玩,他们的反馈常常引领你做出更好的最终方案。

知识组合

知识和经验是你最重要的专业资产。学习新事物的能力是你最重要的战略资产。

关于如何构建自己的知识组合,可以参考以下指导方针:

对于那些已经构成知识组合的智力资产,获取它们的最佳途径可以参考如下建议:

  1. 每年学习一门新语言:不同语言以不同的方式解决相同的问题。多学习几种不同的解决方法,能帮助自己拓宽思维,避免陷入陈规。
  2. 每月读一本技术书:虽然网络上有大量的短文和偶尔可靠的答案,但深入理解还是需要去读长篇的书。当你掌握了当前正在使用的所有技术后,扩展你的领域,学习一些和你项目不相关的东西
  3. 还要读非技术书:不要忘记方程式中人的那一面,他需要完全不同的技能集。
  4. 上课:在本地大学或网上找一些有趣的课程,或许也能在下一场商业会展或技术会议上找到。
  5. 加入本地的用户组和交流群:不要只是去当听众,要主动参与。独来独往对你的职业生涯是致命的:了解一下公司之外的人都在做什么。
  6. 尝试不同的环境
  7. 与时俱进:关心一下和你当前项目不同的技术,阅读相关的新闻和技术贴。

批判性思维

批判性地思考读到的和听到的东西。

批判性地分析问题,先思考几个问题:

务实的方法

ETC——优秀设计的精髓

优秀的设计比糟糕的设计更容易变更。

对代码而言,要顺应变化。因此要信奉 ETC(Easier To Change,更容易变更)原则。ETC 是一种价值观念,不是一条规则。关于培养 ETC 观念,有以下几点意见:

DRY——邪恶的重复

我们认为,想要可靠地开发软件,或让开发项目更容易理解和维护,唯一的方法就是遵循下面这条DRY(_Don't repeat yourself,不要重复自己_)原则:

在一个系统中,每一处知识都必须单一、明确、权威地表达。

与之相对的不同做法是在两个或更多地方表达相同的东西。如果变更其中一个,就必须记得变更其他的那些。

DRY 不限于编码,DRY 针对的是你对知识意图的复制。它强调的是,在两个地方表达的东西其实是相同的,只是表达的方式可能完全不同。

正交性

定义:对于两个或多个事物,其中一个的改变不影响其他任何一个,则这些事物是正交的。

当系统的组件相互之间高度依赖时,就没有局部修理这回事儿。我们希望设计的组件自成一体:独立自主,有单一的清晰定义的意图。但凡编写正交的系统,就能获得两个主要的收益:提高生产力和降低风险

设计

可以用一个简单的方法可以测试设计的正交性。当你规划好组件后,问问自己:

编码

当你写下代码时,就有降低软件正交性的风险。你不仅需要盯着正在做的事情,还要监控软件的大环境。有几种技术可以用来保持正交性:

测试

修 Bug 也是评估整个系统正交性的好时机。遇到问题时,评估一下修复行为的局部化程度。只要变了一个模块,还是有很多处变更分散在整个系统里?当你修正了一个地方,是不是就修复了所有问题,还是会神秘地出现其他问题?

曳光弹

使用曳光弹找到目标。

对于我们来说,最初的曳光弹就是,创建一个简单的工程,加一行“hello world!”,并确保其能编译和运行。然后,我们再去找整个应用程序不确定的部分,添加上让它们跑起来的骨架。

使用曳光弹代码的优势

务实的偏执

务实的程序员会为自己的错误建立防御机制。

契约式设计(DBC)

与计算机系统打交道很难,与人打交道更是难上加难。而契约规定了你的权利和责任,同时也规定了对方的权利和责任。文档化及主张进行检验是契约式设计的核心。

在编写代码之前,简单列出输入域的范围、边界条件是什么、例程承诺要交付什么——或更重要的是,没有承诺要交付什么——这对编写更好的软件来说,是一个巨大的飞跃。

尽早崩溃

尽快检测问题的好处之一是,可以尽早崩溃,而崩溃通常是你能做的最好的事。一旦代码发现本来不可能发生的事情已经发生,程序就不再可靠。这一刻开始,它所做的任何事情都是可疑的,所以要尽快终止它。

一个死掉的程序,通常比瘫痪的程序,造成的损害更小。

使用断言编程

无论何时,你发现自己在想“当然这是不可能发生的”时,添加代码来检查这一点,最简单的方式就是使用断言。注意这里的断言检查的是不可能发生的事情,普通的错误处理不要使用断言。

保持资源平衡

大多数情况下,资源使用遵循一个可预测的模式:

不要超出控制范围

把反馈的频率当作速度限制,永远不要进行“太大”的步骤或任务。

当你不得不做下面的事情的时候,你可能陷入了占卜的境地:

当你编码时

传统观点认为,一旦项目到了编码阶段,就几乎只剩下一些机械工作:只是把设计翻译成可运行的代码段而已。我们认为这种态度是软件项目失败的最重要原因。编码不是机械工作。务实的程序员会对所有代码进行批判性思考,包括自己的代码。我们不断看到程序和设计的改进空间

听从直觉

倾听自己直觉的方法:

重构

代码需要演化:它不是一个静态的东西。

马丁.弗勒将重构定义为:重组现有代码实体、改变其内部结构而不改变其外部行为的规范式技术。

何时重构

当你学到一些东西时,当你比去年、昨天甚至是十分钟前更了解某事时,你会重构。

无论问题是多是少,都有可能促使我们对代码进行重构:

尽早重构,经常重构。

如何重构

重构的核心是重新设计。你或团队中的其他人设计任何东西的时候,都可以根据新的事实、更深的理解、更改的需求等重新设计。但是,如果你执拗地非要将海量的代码统统撕毁,可能会发现,自己所处的境地,比开始时更加糟糕。

重构是一项需要慢慢地、有意地、仔细地进行的活动。马丁.弗勒提供了一些简单技巧,可以用来确保进行重构不至于弊大于利:

结尾

本文只是分享了书中的一部自己觉得比较好的、可以实际使用的观点,并非书中所有观点),强烈建议大家读一下本书,相信会有不错的收获。最后贴个大佬对本书的评价,我也是因为刷到这个所以才知道此书的。

百科

More+
首页/电脑版/网名
© 2026 NiBaKu.Com All Rights Reserved.