不断的复制粘贴和简单排列组合的人叫码农,明白自己编程设计的人叫软件工程师。
了解 C语言 的过程式,HTML/css/js 的文档声明式,Java/Ruby 的面向对象式,Golang 的组合式和最近看的 Lisp(Scheme) 的函数式这些不同的思维模式让我渐渐明白了:一个优秀的软件工程师应该在基本的计算机知识上,有整体意识,有大局观,在工程中的各个阶段做出最合理的设计决策,注意这里说的是合理,而不是最好,因为工程是为了解放人类脑力和体力。
设计决策大到设计语言选型,数据库,软件架构,网络协议,小到模块设计,类,方法,变量命名。我记得高中有个足球教练说过:一个人会不会踢球,看他踢一脚就够了。
那么问题来了,如何做出合理的设计呢?
- 对需求的理解
- 对现实条件的评估
- 对工程的预期(人月)
- 平衡 1. 2. 3. 作出用于试错的决策计划
- 小步试错,在可接受的时间点之前作出合理项目计划
需求理解力
好程序员和差程序员的区别在于理解能力 --《简约之美:软件的设计之道》
是的,我们写的每一行代码,每一行注释都是为了直接或者间接的实现某种实际价值,而不是研究某个学术或者练习英语。所以了解需求至关重要,其实说白了就是对数据作怎样的处理。不同的行业有不同的特点,不同需求有不同的价值实现诉求,深入了解要解决的领域问题,然后以在更高的视角抽象成计算机能理解模型,所谓“艺术源于生活,但高于生活”。
现实条件的贯通力
这里主要涉及的是计算机专业领域的基本功即:操作系统,计算机网络,数据库,算法与数据结构,语言相关设计模型等。我们没有必要将各个算法各个协议倒背如流,能查文档的没必要往自己脑子里硬塞。要明白的是:以上每个领域的设计都有很强的需求背景,我们所要了解的是,在历史的角度上,它们是为了解决哪类问题而逐渐演化发展而来的,各中解决方案之间有何联系和区别,考虑自己的应用场景,如何从前辈的设计方案中做抽取,组合,修改和扩展。
人月评估力
有了以上的基本客观条件,最难得就是对人的评估。
- 对自己/团队成员水平的评估
- 对新技术的调研和学习时间
- 对突发状况的应对措施
万剑归宗:应变调整力
唯有变化是不变的,在实践中不断磨练自己应对变化的调整能力。