谢邀!
之前读到《计算机思维》一书,其中就提到工程师思维。恰好刚读到万维钢中对此书的解读,谈得非常好,昨天用其中部分内容还回应了《工程师思维和科学家思维有什么区别?(https://wukong.toutiao.com/answer/7051938532134568199/)》,那就接着再借用其中部分内容回应此问题吧。
要把写程序上升到工程的高度,跟以前那种兴趣爱好式的编程可就完全不同了。更进一步,软件工程和传统的工程也不一样。
比如你要修个桥,工程过程中哪里犯个小错误,通常也就是小错误——最多也就是让大桥的质量降级。这座大桥总共有15个桥墩,其中第五个桥墩有个地方没建好,这座桥大致上还能用。但软件就不一样了,程序中的一个小错误很可能就会导致整个系统的崩溃。
这是为啥呢?因为软件不但各处的关联非常密集,而且是个“活”的东西。比如发射火箭,软件是要控制火箭做动作的!哪个动作不对,火箭立即失控。
所以软件不但是个工程,而且比传统工程难得多。那怎么应对这种复杂呢?
2、小思维
早期的软件开发者想出了很多工程化的办法,起到了一定的效果。比如以前都是用汇编语言,后来发明了高级编程语言,程序员就不容易出错……当然,这时候也不需要程序员个个都有修士的气质了。
最重要的一个方法,是把常用、好用的代码*封装*起来,重复使用。如果这段代码总是被用到,已经被大家测试过很多次了,证明没有毛病,那就不要再改来改去搞定制了,我们应该把它封装成一个“库函数”。库函数具有标准化的输入和输出,程序员下次再用的时候只需要照顾好输入输出,而不必关心函数内部是什么情形——这就能大大降低出错的概率和提高编程的效率。
封装这个思想可以用在软件的各个方面。数据结构、面向对象的编程、文件系统,这些都是封装和分层。这一层的编程不用考虑底下一层的逻辑。
操作系统的内核也是一个类似的智慧。操作系统把最常用的操作计算机的动作,都事先在内核中预备好,而内核经过千锤百炼,不容易出错。等到别人写应用软件的时候,用到相关的动作,就只要调用内核就行,而不必自己直接操作计算机。这就相当于把专业的事儿交给专业的人,也就不那么容易出错了。
所有这些思想都要求对软件开发有个宏观的设计,而不只是吭哧吭哧写代码。然后你还得考虑多个人一起开发一个软件的情形,比如最起码得有个版本控制之类。
到这一步,软件业才算正式成了一个行业。在上世纪五十年代,就已经有公司专门开发软件卖钱。
……可惜这些还远远不够。
软件业从一开始就不是一个做事漂亮的行业。项目总是再延期。好不容易交付了,软件卖出去之后又总是被人发现各种毛病和错误。客户不满意,可是如果真要搞什么售后服务,到现场去给人解决问题,那几乎就是不可完成的任务……而且还有黑客攻击、还有计算机病毒!
我很早以前听过一个笑话,说一个软件工程师嘲笑一个汽车工程师,说“如果汽车行业像计算机行业一样发展,现在汽车应该一毛钱一辆。”但是汽车工程师不以为然,说“可是谁会要一辆动不动就抛锚的汽车呢?”
而早期的软件公司,对此只有两个不是办法的办法。一个办法是尽量去找那些经验丰富、头脑聪明的高水平程序员……一个办法是销售软件的时候干脆附带一个免责声明:如果因为这个软件的毛病给您造成了损失,我们概不负责。
社会对计算机的美好幻想被打破了,软件行业陷入了危机。
3、大思维
软件工程的问题不是你每年能培养多少高水平程序员的问题,而是复杂性问题。
小软件和大软件的根本区别在于尺度。以前一个小软件只有几千行代码,现在一个大软件要有几百万行代码。以前的软件是给一个人用,现在是多个用户共同使用一个软件。更重要的一点是,以前的软件是一个人或者几个人开发的,现在则是大型团队一起开发。
将在回复《为什么现在的工程师,越来越不喜欢做管理?》中接着谈。
最后,再顺便打个小广告,“陈思进财经漫画”系列第二部《漫画生活中的金融》新鲜出炉、我的财经图书“收官之作”《投资的方法》即将出版,谢谢关注!
你对这个问题有什么更好的意见吗?欢迎在下方留言讨论!