《程序员修炼之道:通往务实的最高境界》读书摘要
务实的哲学
1、人生是你的
你有权选择
你可以去改变组织,或者让自己换一个组织
这个行业给了你一系列非凡的机遇。积极主动点,掌握这些机遇
2、我的源码被猫吃了
提供选择,别找借口
不要说搞不定
3、软件的熵
不要放任破窗(糟糕的设计、错误的决定、低劣的代码)
漠视会加速腐烂的过程
不要只是因为一些东西非常危急,就去造成附带损伤。破窗一扇都嫌太多。
4、石头做的汤和煮熟的青蛙
做推动变革的催化剂
永远留意大局,持续不断地审视你身边发生的事情,而不要只关注你个人在做的事情
5、够好即可的软件
将质量要求视为需求问题
与构想中的明天那个完美的软件相比,今天就还不错的软件通常更讨人喜欢
6、知识组合
知识和经验是你最重要的专业资产。可惜的是,它们是一种时效资产。
对知识组合做定期投资:
- 每年学习一门新语言
- 每月读一本技术书
- 还要读非技术书
- 上课
- 加入本地的用户组和交流群
- 尝试不同的环境
- 与时俱进
你是否在项目中使用过这些技术并不重要。学习的过程将会扩展你的思维。
时间总是不够用。所以你需要提前准备好,确保在无聊的时候有东西可读。
批判性地分析你读到和听到的东西。
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、在现实世界中抛球杂耍
响应式应用程序:
- 有限状态机
- 观察者模式
- 发布/订阅
- 响应式编程与流
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、傲慢与偏见
在作品上签名