早期计算机软件的首要职责是管控硬件、提供API抽象硬件特性如操作系统、驱动,以及实现高级语言的编译器,使得计算机硬件得以应用。
软件发展几十年,从面向机器、面向基础设施、面向行业,转换到现在面向人和社会功能的诉求,垂直浸润到方方面面。由于软件是一栋逻辑大厦,任何1平方米砖瓦的尺寸、重量发生变化,会产生连锁反应,需要泥瓦匠重新审视、维护,所以那些来自需求、功能、性能的后期变化,可能会带来看不见的工作。
与此同时,如何降低变化带来的影响成为一项技能,俗称隔离变化,每一项功能都是逻辑活动的成果,相同功能的代码只出现一次,既节省时间和人力开销,也为后续应对变化、改善、解决bug,做好伏笔,这就是复用。
做到隔离变化和复用的基本办法就是根据功能、关系来划分模块,每一份细小的逻辑片段,都可能被重用到不同环境的不同版本、持续演化。
- 1个模块干好1件事,提供理所当然、透明API与其他模块交互。
- 底层模块从下至上地封装核心功能,上层模块则从上至下地分解用户操作,中间层藏污纳垢做好粘和。
- 软件可配置,可根据log复盘。
- 设计开发时进度慢意味着测试和fix bugs快,模块和代码少即是多,做该做的,而不是认为要做的。
- 开发时尽量考虑全面,从而避免遇到问题时再回头完善,每次维护将耗费时间成本。
- 按对象拆分源文件,每个文件仅提供1个对象的操作API,且明确每个对象的生命周期。
- 从大脑短期记忆能力的角度出发,要避免单个源代码文件过大导致开发效率降低,以自身情况为例:
- 日常工作中精细地Hold住500行代码的依赖逻辑、上下文关系、消息、线程等,算是峰值,现在将其分
- 拆到5个文件,对外提供出色API,则单次Hold住100行即可,编码质量和调试效率会大大提升
- 有了基本设计原型要尽早投入开发,不到开发阶段无法摸清架构的真相,除非及其熟悉。