你想成为一名程序猿吗?

“不是所有程序员在他们的职业生涯中都渴望相同的东西。但是,思考一个程序员在10年、20年、30年甚至他一生的时间里所能取得的成就,还是挺有意义的!”

平心而论,我觉得大多数想要学习编程的人都是被一种盲目的信仰刺激所致,他们认为代码都是善良的、可以信手拈来。其实,你需要了解它的另一面,那就是在代码世界里还有很多悬而未决的问题,并且没有银弹这样的神秘武器去解决。如果在全面了解了利弊之后,你还是想学习编程,那就用尽一切办法开始学吧!如果在了解了那些编程的阴暗面之后,你轻易就动摇了,那么你不应该学习编程—这世上还有很多其他的事情值得你花时间去学习,它们无疑比编程更加有益并且易于实践。你可以遵循Michael Lopp的教诲,学着做个更好的沟通者。你也可以追随Gina Trapani,学习怎样才能提出更好的解决方案。依我的经验,编程只是整个解决方案中极其微小的一个部分。为何非得在这棵树上吊死呢?

在最早期的计算机上,每一个用户都必须成为程序员,因为那个时代没有任何应用软件。如果你想让计算机做点什么,你就得自己写程序。年代稍近一些的计算机,在启动以后就会直接进入BASIC解释器,它还闪动着一个略显友好的光标。在我看来,软件开发的整个历程,就是程序员们耗尽毕生精力去编写代码,以使其他人能从代码编写工作中解脱出来(他们就不必成为程序员了),从而可以很方便地使用计算机来做他们真正需要做的事情的一个过程。因此,宣扬“每个人都需要知道如何去编程”,我认为是一种倒退!

我完全支持互联网基础知识的普及。然而,为了能成为一名好司机,是不是每个人都需要透彻地掌握汽车的工作原理呢?我们必须普及机械自动化的基础知识,并且把手工艺课提升到跟英语、数学一样重要的地位吗?对普通人来说,知道该如何换轮胎以及何时把汽车送去保养不就足够了吗?如果你家的马桶堵住了,为了把它修好,想必你不会花上两个星期的时间去toiletcademy.com学习高级水管工的课程。事实上,浏览一个简单的网页,即学即用,应该就足够了。

那么,从最抽象的意义来看,到底什么是代码呢?

代码是:

1.一组信号,用以在消息传递过程中表示字母或者数字;

2.一组有特定含义的符号、字母或者词条,使得消息传递更加保密或简洁;

3.一组符号或者规则,用以向计算机传递指令。

—摘自《美国传统英语词典》

代码是打孔卡?远程终端?Emacs1?Textmate2?Eclipse3?Visual Studio?C?Ruby?JavaScript?在20世纪20年代,人们普遍认为学会如何使用滑尺是非常重要的。时至20世纪60年代,机械制图又登上了神坛。而如今,这些知识都已经不再重要了。除了那些在“Code: The Hidden Language of Computer Hardware and Software”(代码:计算机硬件和软件的隐语)一文中提到的,我不太愿意向别人推荐任何特定的编程方法。因为我不确定再过20年或者30年,编程是否还会是现在这个形态。对于现在的孩子们,将来他们的编程可能就像玩《我的世界》4或者《传送门2》5之类的游戏那样……

但是,每个人都应该试着写上一小段程序,因为这在一定程度上会使你的思维变得更为犀利,是不是呢?

或者大胆试想一下,也许把《大英百科全书》从头到尾完整地读一遍也能达到同样的效果。说实话,我更建议人们先花些时间去想想,什么样的问题才是他们真正热爱和感兴趣的,然后再好好研究研究这些问题。生命中最困难的,是想清楚你真正想要做的事情,而不是学上一堆假设将来会有用的东西。如果说你的研究和探索最终引领你走上了编程之路,那就用尽一切方法去学习吧,我的祝福与你同在……当然,我的祝福你听听也就算了,它帮不了你。

所以,我绝对不会提倡为了学编程而学编程。我鼓励的是毫无保留地追求你的快乐。举个例子,我曾经收到过这样一封电子邮件:

我是一名律师(兼注册会计师),现年45岁,正试图尽快放弃目前的律师职业,并全力以赴寻找我的下一个事业。事实上,我雇用了专业人士来帮我做这件事。作为“寻找自我”环节的第一步,他们让我回顾我那漫长而又曲折的职业生涯,找到那些在我的职业生活中我真正享受工作的时刻。

作为一个工作在个人电脑革命时代的会计师(当我在安达信会计师事务所开始我的第一份工作的时候,我们甚至会为手动更新资产折旧计划表而向客户收取费用),我花了很多时间学习如何使用电脑、打印机和应用软件(有人用过VisiCalc吗)。而当我受聘为一家大型医疗系统的健康保障计划财务分析师的时候,这些准信息技术相关的事情在我工作中的比重达到了顶峰。在我开始那份工作的第一天,我发现我的前任仅仅留给我一页静态的Excel电子数据表,传说它可以用来为一个有7家医院的医疗机构“分析”一份涉及数百万美元的托管保障合同。没办法,我只能开始构建我自己的电子数据表,但是它很快就超出了Excel数据库功能的容限。因此我只能自学Access。接下来很快又把Access电子数据表方面的功能利用到了极限—我需要调出成千上万条病患数据记录,套用特定的计算公式,最终得出结论:在假定完全相同的使用情况下,我们从签署的合同中所能得到的付款会更多还是更少。

不得不承认,从任何专业的角度来看,我当时的工作都不是编程。我想办法让Access做到了一些微软的技术支持人员告诉我Access做不到的事情。但我也仅仅是使用最基本的控制命令,来让一个现有的应用程序服从于我的意志。我依然清晰地记得,我当时很快乐。我每天花12~14个小时往公式单元格里输入无限嵌套的命令,我是那样的兴奋,以至于当我不得不停下来休息的时候,我会感到非常失落。

我创造了那个“怪物”并且让它为我效力的经历,至今仍是最能让我感到满足的职业成就,即便我后来担任了另外一家健康保障机构的首席财务官(一个当时可以满足我所有职业抱负的成就),都无法与之相比。不仅仅是因为那些工作,还有在我尝试、失败、尝试、调试、孜孜不倦地构建那个基于数据库的大家伙的过程中,所认识的那群志同道合的分析师和系统管理员。我知道了复活节彩蛋和那些编程的学问,并且破解进入了医院的主服务器。以我当时的收入水平,那台主机的价格已经远远超出了我所能承受的范围。遗憾的是,我后来还是选择了继续追求我所谓的“职业目标”,并且最终在我憎恨的职业中做着我厌恶的工作。”

上面例子中的这个人,第一,他碰到了自己感兴趣的问题;第二,他尝试着解决问题;(最终很自然地)第三,问题引领着他去学习编程。而且,他热爱编程。事情也理应如此。我并不是因为有人告诉我学习编程很重要才成为程序员的;我成为程序员是因为我想改变我所玩电脑游戏的规则,而学习编程是唯一的途径。一路走过来,我也爱上了编程。

我只是想说,如今我再一次站到了人生的十字路口,在干着准编程工作的那些日子里,虽然平平淡淡,但我却非常享受我的工作。我心里仍然能听到来自它们的“塞壬6之歌”。我想问你的是,你觉得像我这把年纪的人,还能学习编程并且达到一个让别人雇用我的水平吗?我并不想一边在纽约城里忙碌奔波,一边又只把编程当作一个副业。恰恰相反,我完完全全真诚地希望变成一个善良的程序员,并用我的时间来创造一些有价值的东西。

遗憾的是,以程序员自居会使你的职业生涯受到诸多限制,特别是对一个曾经担任过首席财务官的成功人士来说,这个转变可不算小。跟钱打交道的人往往会挣很多钱—看看华尔街就知道了。

然而,这不是钱的问题,对不对?我们要说的是“热爱”。如果你想成为一个程序员,你只需追随你快乐的感觉,并且爱上代码。真正的程序员很快会结交到其他一些真诚的善男信女—一些像他们一样毫无保留、疯狂地热爱代码的人。欢迎来到程序员的部落!

如果你在读这篇文章,并且在想,“让这个Jeff Atwood见鬼去吧,他到底是谁呀,凭什么对我是否应该学编程说三道四?”而我想对你说的是:“好样的,你应该具备这种独立思考的精神!”

本文节选自《高效能程序员的修炼》


1 Emacs是一款强大的文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。—译者注

2 Textmate是Mac平台上著名的文本编辑器软件。—译者注

3 Eclipse是一个开源的、基于Java的可扩展的开发平台。—译者注

4《我的世界》是世界上第一款沙盒建造游戏,玩家可以在一个三维世界里用各种方块搭造建筑物。—译者注

5《传送门2》是一款益智游戏,玩家需要丰富的想象力和空间思维能力,通过各种方式寻找隐蔽通道或是解开各种机关和谜题。—译者注

6塞壬(Siren)来源于古希腊神话传说,在神话中她被塑造成一个人面鸟身的海妖,飞翔在大海上,拥有天籁般的歌喉,常用歌声诱惑过路的航海者而使航船触礁沉没,船员则成为塞壬的腹中餐。—译者注