复用思维
We can soive any problem by introducing an extra level of indirection.(任何问题加一层间接就可以解决。) ——图领奖获得者, Butler Lampson
写代码=敲键盘?
编码前需要完整而深入的思考
编码前做设计,持续降低软件复杂性
复杂性的两种类型
- 本质复杂性:本质复杂性由问题域决定
- 偶然复杂性:偶然复杂性是指开发过程中所引入不必要的复杂性
《软件设计的哲学》观点
- 软件设计的价值在于保证软件系统复杂性可控、可持续演进
- 软件设计的关键在于降低复杂性(即偶然复杂性)
战术性编程、战略性编程
- 战术性编程:要求以最快的速度完成可工作的功能。这种行为往往会增加系统的复杂性,引发大量的技术债。
- 战略性编程:不仅仅要求可工作的代码,以好的设计为重,未来的功能投资,认为现阶段在设计上的投入会在将来获得回报。
投资收益
- 项目起步,战术性编程比战略性编程更快地去的进展。然而,采用战术性编程,系统的复杂性积累的更快,系统的复杂性降低了生产率。随着时间的推移,战略性编程会取得更大的进展。
- 《软件设计的哲学》作者建议,花费大约占开发时间的10~20%在软件设计上进行投资。