两个程序员的预言故事

link:the-parable-of-the-two-programmers
https://realmensch.org/2017/08/25/the-parable-of-the-two-programmers/?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=ios&from=singlemessage&isappinstalled=0

author:Neil W. Rickert

很久之前,两个互不认识的公司,4A公司和4C公司都各自决定开发一个可以实现同样功能的程序。

4A聘用了程序设计兼系统分析员Alan来解决他们的问题。
同时4C决定让一个新招进来的程序员Charles来处理这个任务,同时也来检验一下他是不是像他自己声称的技术那么好。

拥有复杂项目经验的Alan ,决定使用PQR结构化设计的方法来实现。有了这个想法之后,他跟他的部门经理要了另外的3个程序员,组成了一个开发团队。然后这个团队就开始工作了。去做前期的报告和问题的分析。

回到4C公司这边,Charles花了一些时间来思考这个问题。他的同事发现Charles经常坐在桌上,喝咖啡。Charles偶尔也会看一下他的电脑屏幕,但是他的同事说:从他敲击键盘的节奏可以看出他正在打游戏。

到目前为止,4A公司的团队开始写代码了。程序员们花一半的时间在写代码和编译代码,用剩余的时间来开会,讨论不同模块之间的接口问题。

而Charles的同一个办公室同事发现Charles终于不在打游戏了。相反他开始把他的时间分成两个部分。一部分坐在桌上喝咖啡,另一部分是在一张纸上画着什么。他的涂鸦也不像是填字游戏,但也看不懂画的是什么。

很快两个月就过去了。4A公司的团队最终发布了应用的实现时间表。他们将会再花2个月的时间开发出一个可测试的版本,然后再花2个月的时间来增强和完善这个应用程序。

Charles的经理有点害怕Charles会把这个事情给搞砸,决定去跟他聊一下。但是当他走进Charles的办公室的时候,发现Charles正在忙着写代码。于是他决定晚点再教训他,于是经理跟Charles随便聊了聊就走开了。但是,经理开始盯紧了Charles,如果一旦发现机会,他就会去找Charles。原本期望的不愉快的谈话并没有出现,因为他发现Charles一直很忙。他甚至有时候推迟吃中饭,并且一个星期有两三天下班了还在公司加班。

三个月时间结束的时候,Charles宣布他完成了这个项目。他提交了一个500行代码的程序。程序写的非常整洁,测试的时候也都满足了所有的需求。实现上,程序还增加了一些额外的特性,这些特性大幅提高了程序的可用性。程序进入测试阶段,除了一个小的修复之外,一切表现良好。

4A公司的团队到目前为止,完成了4个主要模块中的2个,这些模块正在进行测试。

三个星期之后,Alan宣布第一版本比原计划提前一周完成了。他列了一张程序有待改进的表格,后续会对这些问题进行修复。程序已经提交给用户测试了,用户发现了一堆的bug和问题,并且这些问题都不在Alan的列表上。但Alan解释说,这些都不必担心,这只是第一版本,有bug是预料之中的事情。

2个月之后,Alan团队终于完成了程序的最终版。它包含了2500行代码。测试的时候发现它满足了大部分的需求。就是程序少了一些特性,例如对数据输入的格式比较挑剔。不管怎样,公司还是决定安装这个程序,他们可以对数据录入的员工加以培训。这个少了些许特性的程序最终移交给了维护性质的程序员。

后续:

起初,Charles的主管非常吃惊,但是当他通读了源代码之后,他意识到这个项目比他一开始认为的要简单的多。它看起来甚至对一个初级程序员来说也没有什么挑战。

Charles平均每天写5行代码,可能平均还没有5行代码。然后考虑到程序如此简单,这似乎也不算是异常情况。毕竟他主管记得他还有两个月的时间在打酱油呢。

Charles在他下一次的工资审查中,获得了加薪,但是这个加薪幅度只有当前通胀的一半。并且他并没有获得升职。大约过了一年之后,Charles很伤心,就离开了4C公司。

在4A公司,Alan获得了表扬,因为他按计划完成了他的项目。他的主管看了他的代码,看了一会就竖起拇指,因为程序运用了公司标准的结构化编程。然后他马上就放弃不在看代码了,因为这个看起来相当的不好理解。现在他意识到这个项目是比他之前想象的还要复杂的。他再一次祝贺Alan所取得的成就。

4A公司的团队平均每天写了3行代码。考虑到这个项目的复杂性,这个平均值也就能理解了。然后Alan工资获得了大幅提高,并且公司升他为系统分析师作为他此次成就的奖励。

作者的评论:

我曾经也是一个年轻并且聪明的程序员,这个故事对我有强烈的共鸣。甚至在我职业生涯早期,我可以完成很多在资深程序员看来也很有挑战的事情。我的第一份工作(一个游戏开发者),我可以在几天之内就写完代码,然后我的经理也会感觉很好,因为通常一个有多年经验的程序员会写上好几个月。在我的第二份工作中,我优化了一个工具,这个工具是由一个有10年开发经验的程序员写的。以至于他帮助我们在几秒之内就可以完成工作,而不在需要几分钟的时间。我的整个职业生涯充满了这样的一些高光时刻。

在我刚开始学习编程的头几年,我意识到经验是很重要的。但是技能也是很重要的。事实上,正如上面的寓言故事所展示的,技能是比经验更为重要的。我想当代的开发者可能忽略了这一点。

也就是说,我也曾掉入这个像第二个开发者一样的陷阱中。写了一个比原本更复杂的系统。能实现这个复杂的方案并不意味着这是一个好的解决方案,我常常提醒我自己。

因此我也尽力去妥协,也常常问我自己有没有更好的解决方案,能不能找到其他方式去改进和简化。我曾经花很多的时间来思考问题而不是用一种很简单的方式来实现就完了,总是希望找到一种干净的方式来解决问题。花时间去思考看起来并不像是在“工作”,但当我要去实现的时候,他让我有一个更好的选择---更少的代码但是程序更加健壮,可扩展,更易于阅读。

这就是我认为上面的寓言故事重要的原因。经验很重要,但是设计和实现的技能胜过经验,因此如果你同时拥有了经验和技能,你就能创造奇迹了。只有你不断的质问自己的设计,不要认为你的第一版的设计就是完美。

------EOF------

你可能感兴趣的:(两个程序员的预言故事)