附录:成为一名程序员

我分别于2003,2006,2007和2009年撰写的博客文章混搭

如何开始

这是一条相当漫长和曲折的道路。我在高一学代数时(1971年),有个非常古怪的老师有一台计算机,还弄到了一台配有一个300波特的音频电话耦合器的ASR-33电传打字机,我学会了如何执行命令并得到响应,以及一个可以在高中区使用的HP-1000计算机上的帐户。我们能够创建和运行BASIC程序并将它们保存在打孔磁带上。我对此非常着迷,所以尽可能地把它带回家后在晚上写程序。我写了一个赛马模拟游戏—HOSRAC.BAS,用星号来代表马的移动,由于是在纸上打印输出,所以需要一点想象力。

我的朋友丹尼尔(就是设计我的书封面的人)有一个兄弟,他有段时间通过向酒吧和餐馆提供弹球机来赚钱。他有一台投币式街机(老虎机),最早的《乓》游戏之一,我对此全然不知,到现在我还忍受不了这东西(现在我几乎不玩电脑游戏,这样看来我可能是个没有幽默的人,但似乎编程比玩电脑游戏更有趣、更具挑战性。)

后来我在高中参与了摄影和新闻工作,在大学的第一年就主修新闻学。我觉得自己已经从学校学到了足够多的东西,又转修了物理学。后来我在加州大学尔湾分校完成了物理学位,如果我当时选择了一个特定的工程领域,修了足够的工程课就能拿到双专业,但我试图走得更远一些,所以最后我获得的本科学位是 “应用物理”。作为一名本科生,我多多少少学习了一些可以自娱自乐,但又没有任何深度的计算机编程课程。我个人认为在这些课程细细熏陶下,帮我打下了一定的基础,但事实我理解的这些东西没有任何深度。我不知道计算机、编译器或解释器有什么区别(只是对编译器和解释器一点点的理解)。对我来说计算机是绝对可靠的,而且我从来没有想过在程序语言和操作系统中会有出现错误的可能。

后来我去了加州州立理工大学攻读研究生,主要有三点原因:

  1. 我真的非常喜欢物理学这个领域;

  2. 他们接收了我,甚至给了我一份教学工作和奖学金 ;

  3. 出乎意料的是他们给我的工作时间不止一个夏天。

而我完全没做好上班的准备。

作为一名物理专业的学生,我学习的是太阳能发电系统,当时太阳能发电系统很大 (如果你的房子上装了太阳能或生意上是关于太阳能系统,加州就会给予税收抵免,因此也兴起很多生意),加州州立理工大学也承诺会在工程系开设相应的课程。然而因为学校没有提供必要的课程,要想获得在太阳能工程的学位得花好几年时间。所以我学习了研究生其他的工程课,包括介绍机械,太阳能,电气和电子工程。我上的课是非电气工程专业的电气工程导论。最常见的研究生工程课程是计算机工程专业,所以最后我拿了那个学位。我还上了艺术课,几门舞蹈课,还有一些计算机科学课程 (Pascal和数据结构),在计算机工程中,我终于弄清楚了处理器的工作流程,从那以后我一直带着一个处理器在身上。这些就是我学的计算机基础知识。

刚开始工作的时候,凭借着一堆硬件和相对简单低水平的编程,做了一名计算机工程师。因为C语言似乎是理想的嵌入式系统语言,于是我开始自学,并慢慢开始了解更多关于编程语言的东西。我们在这家公司从源代码构建编译器,这让我大开眼界。 (想象一下一个编译器只是另一个软件的一部分!)

当我去华盛顿大学海洋学院为Tom Keffer后来创建了“疯狗浪”)工作时,我们决定使用C++。我只有一本Stroustrup写的非初学者书可以参考,最终不得不通过检查C++预处理器生成的中间C代码来了解语言的功能。这个过程非常痛苦,但学习的效果很好。从那以后我就用相同的方式学习,因为它让我学习了如何剖析一种语言,并看到它本质的能力,与此同时开始有了批判性思维。

我并没有理解清楚所有的概念。只是在之后的日子里不断反复,我所知道的一切需要时间才能消化吸收。如果我现在能很容易地理解一个新概念,那只是因为它是我已经知道的积累概念的一个变种。在加州州立理工大学招收非计算机本科学历的计算机科学研究生项目中,学生们曾经说他们花了一年的时间才弄清楚他们对计算机的困惑(他们正在沉浸程序之中)。当人们学习计算机时,他们往往会对自己抱有不切实际的期望,通常是他们听说学计算机编程的好处,就希望在几周内找到一份高薪的工作。但是,最好的学习过程是先对计算机感兴趣,随着时间的推移,学习的越来越多,自然的就开始自学。

这些就是我主要做的事,尽管我通过学计算机工程有还算扎实的基础,但我没上过编程课,而是通过自学。在此期间我也在不断地学习新事物,在这个行业里,不断学习是非常重要的一部分。

码农生涯

我会定期收到有关职业建议的请求,所以我尝试在这里回答一下这个问题。

人们提出的问题通常是错误的问题:“我应该学习 C++ 还是 Java ?”在本文中,我将尝试阐述我对选择计算机职业所涉及的真正问题的看法。

请注意,我在这里并不是和那些已经知道自己使命的人聊(译者注:指计划成为程序员或者已经从业的程序员,暗指这里是讲给外行的小白的)。因为无论别人怎么说,你都要去做,因为它已经渗入你的血液,并且你将无法摆脱它。你已经知道答案了:你当然会学到 C++ ,Java ,shell 脚本,Python 和许多其他语言和技术。即使你只有14岁,你也已经知道其中几种语言。

问我这个问题的人可能来自另一职业。也许他们来自 Web 开发等领域,他们已经发现 HTML 只是一种类似编程,他们想尝试构建更实质的内容。但是,我特别希望,如果你提出这个问题,你就已经意识到,要在计算机领域取得成功,你必须教自己如何学习,并且永不停止学习。

随着我做的越来越多,在我看来,软件越发比其他任何东西都更像写作。而且我们还没有弄清怎样成为一个好的作家,我们只知道何时我们喜欢别人写的东西。这不是像一些工程那样,我们要做的只是将某些东西放到一端,然后转动曲柄。诱人的是将软件视为确定性的,这就是我们想要的,这就是我们不断推出工具来帮助我们实现所需行为的原因。但是我的经验不断表明事实是相反的:它更多地是关于人而不是过程,并且它在确定性机器上运行的事实变得越来越没有影响力(指运行环境受机器影响,与机器相关这个事实),就像海森堡原理(不确定性原理:不可能同时知道一个粒子的位置和它的速度)不会在人类规模上影响事物一样。

在我青年时期,父亲是建造民居的,我偶尔会为他工作,大部分时间都从事艰苦的工作,有时还得悬挂石膏板。他和他的木匠会告诉我说,他们是为了我才把这些工作交给了我 —— 为了不让我从事这项工作。这确实是有效的。

因此,我也可以用比喻说,建造软件就像盖房子一样。我们并不是指每个在房屋上工作的人都一样。有混凝土泥瓦匠,屋顶工,水管工,电工,石膏板工人,抹灰工,瓷砖铺砌工,普通劳工,粗木匠,精整木匠,当然还有总承包商。这些中的每一个都需要一套不同的技能,这需要花费不同的时间和精力 房屋建造也受制于繁荣和萧条的周期,例如编程。为了快速起步,你可能需要当普通劳工或石膏板工人工作,在那里你可以在没有太多学习曲线的情况下开始获得报酬。只要需求旺盛,你就可以稳定工作,而且如果没有足够的人来工作,你的薪水甚至可能会上涨。但是一旦经济低迷,木匠甚至总承包商就可以自己将石膏板挂起来。

当 Internet 刚兴起时,你所要做的就是花一些时间学习 HTML ,就可以找到一份工作并赚到很多钱。但是,当情况恶化时,你很快就会发现需要的技能层次结构很深,HTML 程序员(例如劳工和石膏板工)排在第一位,而高技能的码农和木匠则被保留。

我想在这里说的是:除非你准备致力于终身学习,否则请不要从事这项业务。有时,编程似乎是一份报酬丰厚,值得信赖的工作,但确保这一点的唯一方法是,始终使自己变得更有价值。

当然,也可以找到例外。总会有一些人只学习一种语言,并且足够精通,甚至足够聪明,那么可以在不用多学很多其他知识的情况下继续工作。但是他们靠运气生存,最终很脆弱。为了减少自身的脆弱性,必须通过阅读,参加用户组,会议和研讨会来不断提高自己的能力。你在该领域的走得越深,你的价值就越大,这意味着你的工作前景更稳定,并且可以获得更高的薪水。

另一种方法是从总体上看待该领域,并找到一个你能成为专家的点。例如,我的兄弟对软件感兴趣,并且涉足软件,但是他的业务是安装计算机,维修计算机和升级计算机。他一直都很细致,因此,当他安装或修理计算机时,你会知道计算机状态良好。不仅是软件,而且一直到电缆,电缆都整齐地捆扎在一起,并且不成束。他的工作多到做不完,而且他从不关心网络泡沫破灭。毋庸置疑,他是不可能失业的。

我在大学待了很长时间,并以各种方式设法度过了难关。我甚至开始在加州大学洛杉矶分校攻读博士学位。这里的课程很短,我欣慰地说是因为我不再爱上大学了,而我在大学待了这么长时间的原因是因为我非常喜欢。但是我喜欢的通常是跑偏的东西。例如艺术,舞蹈课程,在大学报社工作,以及我参加的少数计算机编程课程(由于我是物理本科生和计算机工程专业的研究生,所以也算跑偏)。尽管我在学业上还算是出色的(具有讽刺意味的是,当时许多不接受我作为学生的大学现在都在课程中使用我的书),但我确实很享受大学生的生活,并且完成了博士学位。我可能会走上简单的道路,最终成为一名教授。

但是事实证明,我从大学获得的最大价值一部分来自那些跑偏的课程,这些课程使我的思维超出了“我们已经知道的东西”。我认为在计算机领域尤其如此,因为你总是通过编程来实现其他目标,而你对该目标越了解,你的表现就会越好(我学习了一些欧洲研究生课程,这些课程要求结合其他一些专业研究计算,通过解决这个领域相关的问题,你就会形成一种新的理论体系并可以将它用在别处)。

我还认为,不仅编程,多了解一些其它的知识,还可以大大提高你的解决问题的能力(就像了解一种以上的编程语言可以极大地提高你的编程能力一样)。在很多情况下,我遇到过仅接受过计算机科学训练的人,他们的思维似乎比其他背景(例如数学或物理学)的人更受限制,但其实这些人(数学或物理学领域的人)才更需要严格的思维。

在我组织的一次会议上,主题之一是为理想的求职者提供一系列功能:

  • 将学习作为一种生活方式。例如,学习一种以上的语言;没有什么比学习另一种语言更能吸引你的眼球。
  • 知道在哪里以及如何获得新知识。
  • 研究现有技术。
  • 我们是工具使用者,即要善于利用工具。
  • 学习做最简单的事情。
  • 了解业务(阅读杂志。从 fast company(国外一家商业杂志)开始,该公司的文章非常简短有趣。然后你就会知道是否要阅读其他的)
  • 应对错误负责。 “我用着没事”是不可接受的策略。查找自己的错误。
  • 成为领导者:那些沟通和鼓舞别人的人。
  • 你在为谁服务?
  • 没有正确的答案……但总是更好的方法。展示和讨论你的代码,不要有情感上的依恋。你不是你的代码。
  • 这是通往完美的渐进旅程。

承担一切可能的风险,最好的风险是那些可怕的风险,但是在尝试时你会比想象中的更加活跃。最好不要刻意去预测某个特定的结果,因为如果你过于重视某个结果,就会经常错过真正的可能性。应该“让我们做一点实验,看看会把我们带到哪里”。这些实验是我最好的冒险。

有些人对这个答案感到失望,然后回答“是的,这都是非常有趣和有用的。但是实际上,我应该学习什么? C++ 还是 Java ?”,以防这些问题,我将在这里重复一遍:我知道似乎所有的 1 和 0 都应该使一切具有确定性因此此类问题应该有一个简单的答案,但事实并非如此。这与做出选择并完成选择无关,这是有关持续学习和有时需要大胆的选择。相信我,这样你的生活会更加令人兴奋。

延伸阅读

百分之五的神话

重在动手

像打字般编程

做你喜欢的事

“1960年,一位研究人员对1500名商学院学生进行了访谈,并将他们分为两类:那些为了钱财来这里上学的人,1245人,以及那些打算利用学位做他们非常关心的事情的人,255人。二十年后,研究人员再次访谈了这些毕业生,发现其中有101位百万富翁,除了其中一位,所有百万富翁都来自追求他们喜欢做的事的那255人!”

“现在你可能觉得你对巴洛克时期的冰岛诗歌,或者蝴蝶收集,或者高尔夫,抑或是对社会正义的热情,会因为要养家糊口而让你和你喜欢做的事分道扬镳,并非一定要如此。弗拉基米尔·纳博科夫(Vladimir Nabokov)是本世纪最伟大的小说家之一,他对蝴蝶收藏的热情远远超过写作。事实上,他的第一个大学教学工作是关于鳞翅类昆虫。在过去40年里,对40万美国群众的研究表明,即使是部分的、零散的追求培养你的激情,也可以帮助你充分利用你目前的能力,激励你培养新的能力。”—摘自《The Other 90%》 Robert K.Cooper

当然你可以看Po Bronson写的《 What Should I Do With My Life?》这本书,对这些想法进行更多的探索。