软件工程师的核心任务,就是写代码。如何提高代码质量,减少bug,提高软件开发效率,是软件行业的老大难问题。为了解决这个问题,无数的技术方案或者工具被发明了出来。
最典型的例子,就是各种编程范式的发明。比如面向对象,就是在使用抽象,封装,多态等多种形式,减少冗余代码,方便扩展,从而提高软件书写的效率,降低bug率。
函数式编程亦是如此。函数式编程提出“不可变数据”,就是为了减少因为改变各种状态变量产生的bug。同时,在程序运行高度并行化的今天,不可变也保证了并行过程中的安全。
另一个出发点,就是语言。
如果仔细看各个语言最新版本引入的新机制,或者各种新特性的初衷,很多时候,都是和减少bug,提高代码质量,提升开发效率联系在一起的。
比如对于现代编程语言的学习,要学习一块儿很大的内容,叫异常处理。但是,如果我们去看那些“上古语言”,FORTRAN,BASIC,甚至是C,近乎完全没有专门的异常处理机制。异常处理是现代语言发明出的,专门“狙击”bug的语言特性。
再比如,Swift有一个很有意思的数据类型,叫可选型(Optional)。所谓的可选型,是指可以存储空的类型。换句话说,非可选型不能存储“空”。可选型本质上,就是从数据类型的角度,提醒开发者,这个变量可能为空,所以使用前,请判空!为什么要有这个全新的类型?因为大量的bug,都和空指针有关。
再有,很多抽象的流程或者工具被发明了出来。
如果你翻开一本软件工程的课本,大概就会接触到如下这些概念:
系统流程图、数据流图、数据字典、实体联系图、状态转换图、层次方框图、Warnier图、IPO图、层次图、HIPO图、结构图、程序流程图、盒图、PAD图、判定表、判定树、Jackson图、流图、甘特图、工程网络图......
上面这堆名词是我在网上找来复制粘贴上去的,很多我也不知道是什么意思。
但是,我知道的是:尽管如此,在软件工程领域,bug依然顽固地在那里。
每个软件工程师,不管是用什么范式,什么语言,什么版本,什么工具,怎么提前构架,设计,近乎都不可避免地,会写出bug。
软件行业很多研究结果都表明:并没有明确的证据说明:使用了这些工具,软件工程中的bug就减少了。
甚至,我在网上找到了一篇“奇怪”的论文,这篇论文的研究表示:强制员工遵循一些代码书写规范,可能导致项目工程中有更多的bug。我把这篇论文的链接,放到这篇文章的中了。
提高代码质量的技术手段层出不穷,但似乎都效果有限。那么,还有什么方式,能够真正提高代码质量?
国外技术专家HillelWayne有一个观点,让我拍案叫绝。
他的核心思想很简单。既然代码都是人写的,那么bug也就是人写的。所以,除了改善工具以外,可能,另外一个非常重要的,被很多人忽视的方式是:改善写代码的人。
怎么“改善写代码的人”?
首当其冲的,就是睡眠。
无数科学的研究,已经确定无疑地告诉了我们:睡眠将极大地影响正常人的工作水平,甚至是基础认知能力。
年,IEEETransactionsonSoftwareEngineering上的的一篇论文,用实验证明了,睡眠剥夺以后的程序员,将丧失大部分工作技能——别说想明白逻辑了,此时,他们可能连ls是什么都不知道了,不经意间,就rm-rf/了。
至于长期缺乏睡眠,导致的工作能力的降低,相关研究不要太多。写一两本书是绝对没问题的。缺乏睡眠等于工作能力降低,这简直是常识。
在很多行业,是禁止“疲劳工作”的。最典型的例子是,在运输行业,大部分正规运输公司,都会要求跑长途的司机,期间必须休息一定时间,以避免“疲劳驾驶”。
而在美国,医院也规定,护士不得连续工作超过一定时间。因为,无数的研究都在表明,缺乏睡眠的护士,将犯更多错误。
可能很多同学会说,司机和护士的工作,关乎人的性命。程序员不就是坐在办公室里写代码吗?哪里有那么严重?
对于有这个疑问的同学,我建议读一读上周我的