程序员修炼之道(第2版)

 

2021-04-18

作者越有经验,就越容易忘记初学者在学习新概念时的感觉。

程关涉诸事——尽量减少未来的痛苦,让队友更轻松,做错事情后能够重新振作起来,养成良好的习惯,以及理解工具集。编程只是程序员世界的一部分,而这本书探索了整个世界。

一个准新人,更容易对成为程序员的过程,而不是对编程的行为不知所措。因此,必须对整个心态做一次切换 —— 改变习惯、行为和期望。仅仅知道如何编程,并不会让你成为一名更好的程序员,在这个过程中必须经历有意识和深思熟虑的实践。

第一版前言

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

无论是工具、语言还是操作系统;只在特定的环境下才有所谓更合适的系统。

是什么造就了务实的程序员

早期的采纳者/快速的适配者

你对技术和技巧有一种直觉,喜欢尝试。当接触到新东西时,你可以很快地掌握它们,并把它们与其他的知识结合起来。你的信心来自经验。

好奇

你倾向于问问题。这真不错——你怎么做到的?你对那个库有意见吗?总在听人说起的量子计算到底是什么?符号链接是怎么实现的?你热衷于收集各种细微的事实,坚信它们会影响自己多年后的决策。

批判性的思考者

你在没有得到证实前很少接受既定的现实。当同事们说“因为就该这么做”,或者供应商承诺会解决所有的问题时,你会闻到挑战的味道。

现实主义

你试图理解所面临的每个问题的本质。这种现实主义让你对事情有多困难、需要用多长时间有一个很好的感知。一个过程应该很难,或是需要点时间才能完成,对这些的深刻理解,给了你坚持下去的毅力。

多面手

你努力熟悉各种技术和环境,并努力跟上新的进展。虽然目前的工作可能要求你在某个专门领域成为行家,但你总是能够进入新的领域,迎接新的挑战。

#改善 是一个日语术语,意思是不断地做出许多小的改进。这被认为是日本制造业生产率和质量大幅提高的主要原因之一,并被全世界广泛效仿。改善也适用于个人。每一天都要努力打磨你的技能,并往技能库里添加新的工具。与伊顿草坪不同,你会在几天内就看到效果。几年下来,你会对成果惊讶不已——经验业已开花结果,技能早就茁壮成长。

第一章务实的哲学

他们总是越过问题的表面,试着将问题放在更宽泛的上下文中综合考虑,从大局着想。 p1

了解所做工作的来龙去脉有一个好处,那就是更容易把握软件必须做到多好。接近完美往往才是唯一的选项,这通常需要做许多折衷方案。

我的源码被猫吃了

我们固然会为我们的能力而骄傲,但面对缺点时也必须诚实——承认我们犯了错误,而且是因为我们的无知而犯下的。

责任意味着你对某事积极认同。你保证事情能搞定,并为之做出承诺,但你不必直接掌控事情的每个方面。除了个人尽力做好,你必须分析超出你控制范围的风险情况。如果责任的伦理内涵过于含糊,或是面对无法实现的情况,抑或风险过大,你都有权不承担责任。你必须根据自己的价值观和判断做出决定。

把谈话在心里过一遍。其他人可能说什么?他们会问,“你试过这样做吗……”“为什么你不考虑一下那样做?”而你怎么回答?在你跑去告诉他们坏消息前,还有什么你可以再试试的?有时,你已经知道他们会说什么,那么就直接帮他们搞定。

**挑战:**当你意识到自己在说“我不知道”时,一定要接着说“——但是我会去搞清楚”。

软件的熵

不要搁置“破窗”(糟糕的设计、错误的决定、低劣的代码)不去修理。每发现一个就赶紧修一个。如果没有足够的时间完全修好,那么就把它钉起来。也许你可以注释掉那些糟糕的代码,显示一行“尚未实现”的信息,或用假数据先替代一下。采取行动,预防进一步的损害发生,表明一切尽在你的掌握中。

不要只是因为一些东西非常危急,就去造成附带损害。破窗一扇都嫌太多。

石头做的汤和煮熟的青蛙

**找出你合理的请求,然后不断完善。**一旦有成果产出,展示给人们看,让他们大吃一惊。现在可以用上“当然了,它还可以更好,只要我们再加点……”这句话,而且要假装你并不在意。这时先坐下来,等他们开始问你要不要加些你原本想要的功能。人们都觉得,加入一个推进中的成功项目更容易一些。因为只要一窥未来,大家就能团结在一起。程序员修炼之道#^8b2797

够好即可的软件

如《IEEE软件》杂志上一篇由爱德华·尤登写的文章《够好即可的软件就是最好的》[You95]所述,你能训练自己写出够好即可的软件——对用户、未来的维护者来说够好即可,只要好的程度能让你自己内心平静就可以。你会发现,你变得更有效率,用户也更快乐。而且,可能让你更开心的是,更短的孵化期促使你的程序实际上更好了。

  • 让用户参与权衡
  • 知道何时止步

不要让过度的修饰和精炼侵蚀掉一个完好的程序。继续前行,让代码在它该有的位置驻留一段时间。它或许并不完美,不要紧的——它就算永不完美也没关系。(在第198页第7章当你在编码时中我们将讨论在不完美的世界中开发代码的哲学。)

知识组合

构建知识组合

  • 定期投资
  • 多样化:知道的东西越多,价值越大;熟悉的技能越多,越能适应变化。
  • 风险管理
  • 低买高卖:在一项新兴技术变的流行之前就开始学习
  • 重新评估调整

目标

  • 每年学习一门新语言
  • 每月读一本技术书
  • 要读非技术书
  • 上课
  • 加入本地的用户组和交流群
  • 尝试不同的环境
  • 与时俱进

学习的过程会扩展你的思维

学习的机会

  • 如果无法找到答案,去找有能力找到答案的人,不要让问题沉寂下去。
  • 确保无聊的时候有东西可读

批判性思维

  • 问“五个为什么”
  • 谁从中受益
  • 有什么背景:最佳实践不存在,最适合谁,解决哪一类问题
  • 什么时候在哪里可以工作起来:进行二阶思考
  • 为什么这是个问题

交流!

缺乏有效的沟通,好点子就成了一个孤儿。

Tips

  1. 关注你的技艺
  2. 思考!思考你的工作
  3. 你有权选择
  4. 提供选择,别找借口
  5. 不要放任破窗
  6. 做推动变革的催化剂 ^8b2797
  7. 牢记全景
  8. 将质量要求视为需求问题
  9. 对知识组合做定期投资
  10. 批判性地分析你读到和听到的东西
  11. 英语就是另一门编程语言

不管结果如何,只要确实做到让自己心满意足,就能看到下一个目标,能看到不同于昨天的景色。

  • 梦想是什么:在加上决心的那一瞬间,它就会转变成为目标