程序猿,攻城狮,一类外人无法理解的职业。经常以不修边幅的形象出现,其实只是他们将所有的时间都投入到了工作中,没有时间打理自己。所谓不疯魔,不成活。如果不能够完全全身心的投入,又怎么能够写出好的代码,做成好的产品。工作工必定有其乐趣,有其苦恼,下面详细阐述下。

本文是摘录了《人月神话THE MYTHICAL MAN-MONTH》第一篇“焦油坑The Tar Pit”中的内容。【】中的内容是自己的一些想法,不好勿喷。


职业的乐趣

编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐?
首先是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到愉快一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特、崭新的树叶和雪花上的喜悦。【创造绝对是生物的天性,从古至今,从自然界到人类,初期是为了生存,之后是为了生活乃至高质量的生活,再之后就是为了快乐。】
其次,快乐来自于开发对其他人有用的东西。内心深处,我们期望其他人使用我们的劳动成果,并能对他们有所帮助。从这个方面,这同小孩用粘土为“爸爸办公室”捏制铅笔盒没有本质的区别。【从我自身的角度,工作中我很喜欢写工具类,当别人没有选择自己实现某个功能,而是使用我的工具类的时候,满足感油然而生,这是不是虚荣心我不知道,但却是听开心的。】
第三是整个过程体现出魔术般的力量——将相互啮合的零部件组装在一起,看到它们精妙地运行,得到预先所希望的结果。比起弹珠游戏或点唱机所具有的迷人魅力,程序化的计算机毫不逊色。【好几个同事问我敲代码有什么意思,我都很奇怪的反问:没意思吗?当你把一些乱七八糟的东西组合成一个有灵魂的系统,难道不觉得自己创造了世界吗?不神奇吗?】
第四是学习的乐趣,来自于这项工作的非重复特性。人们所面临的问题,在某个或其它方面总有些不同。因而解决问题的人可以从中学习新的事物:有时是实践上的,有时是理论上的,或者兼而有之。【这一条应该算是一种挑战,软件行业日新月异,总有新的技术代替旧的技术,不想再这条路上被淘汰,只能不断的学习。可能有人(我也是)把这条当做苦恼,应该还是道行太浅。】
最后,乐趣还来自于工作在如此易于驾驭的介质上。程序员,就像诗人一样,几乎仅仅工作在单纯的思考中。程序员凭空地运用自己的想象,来建造自己的“城堡”。很少有这样的介质——创造的方式如此得灵活,如此得易于精炼和重建,如此得容易实现概念上的设想。(不过我们将会看到,容易驾驭的特性也有它自己的问题。)【我一直深信,程序员是一群很纯粹的人,每天面对的是不会欺骗的电脑程序,没有什么勾心斗角、尔虞我诈,团队中讲究的是精诚合作,没有利益冲突。久而久之,自然而然就变得单纯,有人说是“傻”,但我更喜欢“憨”这个字。就像郭靖,敲代码的技术就是降龙十八掌,一招飞龙在天,一招潜龙勿用,再来一招亢龙有悔。。。】
然而程序毕竟同诗歌不同,它是实实在在的东西;可以移动和运行,能独立产生可见的输出;能打印结果,绘制图形,发出声音,移动支架。神话和传说中的魔术在我们的时代已变成了现实。在键盘上键入正确的咒语,屏幕会活动、变幻,显示出前所未有的或是已经存在的事物。
编程非常有趣,在于它不仅满足了我们内心深处进行创造的渴望,而且还愉悦了每个人内在的情感。


职业的苦恼

然而这个过程并不全都是喜悦。我们只有事先了解一些编程固有的烦恼,这样,当它们真的出现时,才能更加坦然地面对。
首先,必须追求完美。因为计算机也是以这样的方式来变戏法:如果咒语中的一个字符、一个停顿,没有与正确的形式一致,魔术就不会出现。(现实中,很少的人类活动要求完美,所以人类对它本来就不习惯。)实际上,我认为学习编程的最困难部分,是将做事的方式往追求完美的方向调整。【工作中写代码,看到别人不良好的代码,总是感觉不舒服,有点强迫症了,看到这条,我瞬间感觉在20年之前就有大神说出了很多程序员的行为倾向。我们只是在追求完美,代码的结构、效率、可读性,每一点都做得很好,这才是我们想要的。】
其次,是由他人来设定目标,供给资源,提供信息。编程人员很少能控制工作环境和工作目标。用管理的术语来说,个人的权威和他所承担的责任是不相配的。不过,似乎在所有的领域中,对要完成的工作,很少能提供与责任相一致的正式权威。而现实情况中,实际(相对于正式)的权威来自于每次任务的完成。
对于系统编程人员而言,对其他人的依赖是一件非常痛苦的事情。他依靠其他人的程序,而往往这些程序设计得并不合理,实现拙劣,发布不完整(没有源代码或测试用例),或者文档记录得很糟。所以,系统编程人员不得不花费时间去研究和修改,而它们在理想情况下本应该是可靠完整的。【大家都懂得,满满的都是心酸。。。】
下一个烦恼——概念性设计是有趣的,但寻找琐碎的bug却只是一项重复性的活动。伴随着创造性活动的,往往是枯燥沉闷的时间和艰苦的劳动。程序编制工作也不例外。另外,人们发现调试和查错往往是线性收敛的,或者更糟糕的是,具有二次方的复杂度。结果,测试一拖再拖,寻找最后一个错误比第一个错误将花费更多的时间。【有人说程序就是改不完的bug,自己实现的功能的bug,糟糕架构引起的bug,需求的变更及其引起的bug。有时候,一个开始很好的项目,在修改bug的过程中,变成了一堆很糟糕的补丁加补丁,不得不推倒重来,就像我们组现在推倒重来的这个项目。】
最后一个苦恼,有时也是一种无奈——当投入了大量辛苦的劳动,产品在即将完成或者终于完成的时候,却已显得陈旧过时。可能是同事和竞争对手已在追逐新的、更好的构思;也许替代方案不仅仅是在构思,而且已经在安排了。
现实情况比上面所说的通常要好一些。当产品开发完成时,更优秀的新产品通常还不能投入使用,而仅仅是为大家谈论而已。另外,它同样需要数月的开发时间。事实上,只有实际需要时,才会用到最新的设想,因为所实现的系统已经能满足要求,体现了回报。
诚然,产品开发所基于的技术在不断地进步。一旦设计被冻结,在概念上就已经开始陈旧了。不过,实际产品需要一步一步按阶段实现。实现落后与否的判断应根据其它已有的系统,而不是未实现的概念。因此,我们所面临的挑战和任务是在现有的时间和有效的资源范围内,寻找解决实际问题的切实可行方案。【其实对于这一点并没有那么苦恼的,一门新技术的出现到投入真正的实际生产中,中间需要很长一段时间的检测及众多小白鼠(我很喜欢当小白鼠)的参与,一味的追求最新技术,可能被淘汰得更快。】


这,就是编程。一个许多人痛苦挣扎的泥沼以及一种乐趣和苦恼共存的创造性活动。对于许多人而言,其中的乐趣远大于苦恼。