务实的哲学

1、人生是你的

你有权选择
你可以去改变组织,或者让自己换一个组织
这个行业给了你一系列非凡的机遇。积极主动点,掌握这些机遇

2、我的源码被猫吃了

提供选择,别找借口

不要说搞不定

3、软件的熵

不要放任破窗(糟糕的设计、错误的决定、低劣的代码)

漠视会加速腐烂的过程

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

4、石头做的汤和煮熟的青蛙

做推动变革的催化剂

永远留意大局,持续不断地审视你身边发生的事情,而不要只关注你个人在做的事情

5、够好即可的软件

将质量要求视为需求问题

与构想中的明天那个完美的软件相比,今天就还不错的软件通常更讨人喜欢

6、知识组合

知识和经验是你最重要的专业资产。可惜的是,它们是一种时效资产。

对知识组合做定期投资:

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

你是否在项目中使用过这些技术并不重要。学习的过程将会扩展你的思维。

时间总是不够用。所以你需要提前准备好,确保在无聊的时候有东西可读。

批判性地分析你读到和听到的东西。

7、交流

要了解听众,要有效的传递信息,不能空谈

总结:

  • 了解听众
  • 明白自己想说什么
  • 选择时机
  • 挑选风格
  • 让它看起来不错
  • 让听众参与
  • 做倾听者
  • 回应别人

越是有效的交流,影响力越大。

务实的程序员将文档视为整个开发过程的一个组成部分。

务实的方法

8、优秀设计的精髓

优秀的设计比糟糕的设计更容易变更。能适应使用者的就是好设计。

ETC 原则:Easier To Change,更容易变更

ETC 是一种价值观念,不是一条规则。价值观念是帮助你做决定的。

9、DRY——邪恶的重复

DRY——不要重复自己

DRY 不限于编码。DRY 针对的是你对知识意图的复制。

代码重复、文档中的重复、表征的重复、开发人员间的重复

10、正交性

正交性在计算机科学中象征着独立性或解耦性。对于两个或多个事物,其中一个的改变不影响其他任何一个,则这些事物是正交的。

正交的系统两个主要收益:提高生产力及降低风险

养成不断质疑代码的习惯。

11、可逆性

不设最终决定

让你的代码具备“摇滚”精神:顺境时摇摆滚动,逆境时直面困难

12、曳光弹

使用曳光弹找到目标

13、原型与便签

用原型学习。

你可以为下列事物做原型:

  • 架构
  • 已存在的系统的新功能
  • 数据结构或外部数据的内容
  • 第三方工具或组件
  • 性能问题
  • 用户界面设计

原型可以忽略以下细节:

  • 正确性
  • 完整性
  • 健壮性
  • 格式

14、领域语言

靠近问题域编程

通常,如果可以的话,就使用现成的外部语言(如YAML、JSON 或 CSV)。否则就试试内部语言。我们建议仅当应用程序的领域语言开放给用户来写的时候,才选择外部语言。

15、估算

通过估算来避免意外

挑选答案的单位来反映想要传达的精确性

所有的评估工作的首要部分都是建立对所问内容的理解。

根据代码不断迭代进度表

放慢节奏,花点时间完成本部分中描述的步骤,你总能得到更好的结果

基础工具

16、纯文本的威力

将知识用纯文本保存

优点:

  • 为防备老化而加保险
  • 利用杠杆效应让已有的工具发挥最大优势
  • 易于测试

17、Shell 游戏

发挥 Shell 命令的威力

18、加强编辑能力

游刃有余的使用编辑器

19、版本控制

永远使用版本控制

20、调试

去解决问题,而不是责备

Bug 是你的错还是别人的错并不重要。无论谁的错,问题仍要你要面对。

调试的首要法则:不要恐慌

修代码前先让代码在测试中失败

不要假设,要证明

21、文本处理

学习一门文本处理语言

22、工程日记

试着拥有一本工程日记

务实的偏执

你无法写出完美的软件

注重实效的程序员连自己也不信任

23、契约式设计

通过契约进行设计

对接受的东西要求严格一点,并且尽可能的少对回报做出承诺

24、死掉的程序不会说谎

尽早崩溃

崩溃,不要制造垃圾

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

25、断言式编程

使用断言去预防不可能发生的事情

26、如何保持资源的平衡

处理资源分配和释放:要有始有终

分配资源的函数或对象,对释放资源应负有责任

27、不要冲出前灯范围

小步前进——由始至终

总是采取经过深思熟虑的小步骤,同时检查反馈,并在推进前不断调整。

与其浪费精力为不确定的未来做设计,还不如将代码设计成可替换的。

宁弯不折

28、解耦

解耦代码让改变更容易

任何时候,只要两段代码共享点什么东西,都可能发生耦合

只管命令不要询问

不应该根据对象的内部状态做出决策,然后更新该对象。这样做完全破话了封装的优势,也会把实现的相关知识扩散到整个代码中。

不要链式调用方法

避免全局数据

继承增加了耦合

再强调一次,一切都是为了变更

29、在现实世界中抛球杂耍

响应式应用程序:

  1. 有限状态机
  2. 观察者模式
  3. 发布/订阅
  4. 响应式编程与流

30、变换式编程

所有程序其实都是对数据的一种变换

不要囤积状态,传递下去

将代码看作一系列变换,可以为编程打开思路。

31、继承税

继承就是耦合

更好的替代方案:

  • 接口与协议
  • 委托
  • mixin 与特征

尽量用接口来表达多态

用委托提供服务:“有一个”胜过“是一个”

利用 mixin 共享功能

32、配置

使用外部配置参数化应用程序

并发

33、打破时域耦合

时域耦合指的是时间:并发性以及次序

通过分析工作流来提高并发性

34、共享状态是不正确的状态

随机故障通常是并发问题

35、角色与进程

用角色(actor)实现并发性时不必共享状态

36、黑板

使用黑板来协调工作流

消息系统可以像黑板一样工作

当你编码时

37、听从蜥蜴脑

学会在编码时听从直觉是一项需要培养的重要技能

听从你的直觉,在问题跳出来之前加以避免

38、巧合式编程

我们应该避免通过巧合编程。编程应该深思熟虑。

39、算法速度

评估算法的级别

最好的不会永远最好

40、重构

软件更像园艺而非建筑

重构:

  • 重复:违背 DRY
  • 非正交设计
  • 过时的知识
  • 使用
  • 性能

如果现在不进行重构,那么以后就需要投入更多的时间来解决问题

尽早重构,经常重构

技巧:

  • 不要试图让重构和添加功能同时进行
  • 在开始重构之前确保有良好的测试
  • 采取简短而慎重的步骤

41、为编码测试

测试与找 BUG 无关

测试是代码的第一个用户

42、基于特性测试

使用基于特性的测试来校验假设

43、出门在外注意安全

基本原则:

  • 将攻击面的面积最小化
  • 最小特权原则
  • 安全的默认值
  • 敏感数据要加密
  • 维护安全更新

当涉及加密时,第一条也是最重要的一条规则就是,永远不要自己做。

44、事物命名

在计算机科学中只有两件难事:缓存失效和命名

在项目启动前

45、需求之坑

无人确切知道自己想要什么

程序员帮助人们理解他们想要什么

需求是从反馈循环中学到的

和用户一起工作以便从用户的角度思考

使用项目术语表

46、处理无法解决的难题

不要跳出框框思考——找到框框

47、携手共建

不要一个人埋头冲进代码中

48、敏捷的本质

敏捷不是一个名词;敏捷有关你如何做事

敏捷宣言中的价值观:

我们一直在实践中探寻更好的软件开发方法,身体力行的同时也在帮助他人。由此我们建立了如下价值观:

  • 个体和互动高于流程和工具
  • 工作的软件高于详尽的文档
  • 客户合作高于合同谈判
  • 响应变化高于遵循计划

也就是说,尽管右项有其价值,我们更重视左项的价值。

务实的项目

49、务实的团队

程序员有点像猫:聪明、意志坚强、固执己见、独立,并且经常引起网络崇拜。

维持小而稳定的团队

“只要有空闲时间”就去做,意味着这件事永远不会发生

50、椰子派不上用场

做能起作用的事,别赶时髦

51、务实的入门套件

务实的入门套件:

  • 版本控制
  • 回归测试
  • 完全自动化

52、取悦用户

取悦用户,而不要只是交付代码

“解决问题的人”是一个务实的程序员的本质。

我们在解决问题

53、傲慢与偏见

在作品上签名