给资讯科系学生的建议

Sunday, January 02, 2005

虽然一两年前我才喊过rich Windows GUI 用户端会是未来趋势,不过还是经常有大学生写电子邮件来问工作方面的建议,由于正逢招募时期,我想还是把我的标准建议写下来,让这些学生读一读笑一笑然后忘掉。

还好大学生大多很傲慢所以从不找长辈讨教,而这就资讯科学领域来说是件好事,因为他们的长辈很可能会说些荒唐过时的主意,比如说「2010 年打卡操作员的工作机会会超过一亿个」或是「现在lisp 工作可是炙手可热的呢」。

我也差不多,在给大学生建议时根本不知道自己在讲些什么。我实在是彻底的过时,连AIM 都搞不懂,还在用叫做email 那种奇怪古老的玩意(真恐怖!)。当这玩意流行时音乐还是由叫「音乐CD」的圆形薄片里放出来的呢!

CA1.JPG

所以你最好忽略我这里写的东西,直接离开去做些线上交友软体之类的东西帮其他学生配对约会吧。

然而……

如果你喜欢写电脑程式,恭禧你:你是少数能从事自己所喜爱的好工作的幸运儿。大部份人都没这个福气。「爱你的工作」是个新概念。工作应该是某种讨人厌的东西,是你得靠它赚钱去做自己真正喜欢做的事,不过得等到你 65 岁可以退休又存够钱,而且到时不会太老太虚弱,另外你喜欢的事还不能需要好膝盖、好眼睛、以及走20 呎不断气的身体。

我刚刚要说些什么?哦对。建议。

不再废话,来,以下是约耳的:给资讯科学系学生的七个免费建议(物超所值哦):

  1. 在毕业前学会写作。
  2. 在毕业前学会C。
  3. 在毕业前学会个体经济学。
  4. 不要因为非资讯课程无聊就放弃。
  5. 修要写大量程式的课。
  6. 别担心所有工作都会外流到印度。
  7. 不管你做什么,去找个好的暑期实习工作。

接下来是解释,除非你好骗到只因为我叫你做就去做。万一你真的那么天真,那就再来一个吧:8. 自尊心受损时要寻求专业援助。

在毕业前学会写作

如果没有Linus Torvalds 在传道的话,Linux 会成功吗?虽然他是个很出色的骇客,不过还是因为Linus 能以英文透过电子邮件及mailing list 推广他的想法,Linux 才能够吸引全球大量的志愿者。

听说过极限程式设计这个最新的流行吗?很好,先撇开我对它的想法,你会听过XP 是因为有一群好作家和讲者在推广。

即使从小尺度来看,当你细看任一个写程式的组织,最有权力和影响力的程式师都是能清晰自信又自在地说写英文的人。另外长得高也有用,不过这一点你做啥都没用。

CA2.JPG

堪用的程式师和伟大的程式师的差别并不在于他们会多少种语言,也不在于他们喜欢Python 还是 Java。重点是能够和他人沟通自己的想法。伟大的程式师藉由说服他人而得到影响力。他们撰写清楚明白的意见和技术规格,让其他程式师了解他们的程式,因此别人可以运用这些程式而不是[重写](/wiki/The_Joel_on_Software_Translation_Project:%E4%BD%A0%E7%B5%95% E5%B0%8D%E4%B8%8D%E6%87%89%E8%A9%B2%E5%81%9A%E7%9A%84%E4%BA%8B “The Joel on Software Translation Project:你绝对不应该做的事”)。如果少了这一点,他们的程式码就毫无价值可言。他们为使用者撰写清楚易懂的技术文件,让大家能了解他们程式的作用,这是唯一能让使用者理解其程式价值的方法。SourceForge 里埋藏了很多神奇有用却没有人用的程式。只因为程式的作者写不出好文章(或者根本不会写),所以没人知道他们的成果,而出色的程式码就此凋萎。

我不会雇用写不出好英文的程式师。如果你有能力写作,不管到哪上班,很快就会发现自己被要求写规格文件。这意味着你已经发挥自己的影响力,还让管理阶层注意到你了。

大部份大学把某些课标示为「密集写作」,意思是你得写很多很多东西才会过。找几门这种课来修吧!不要管学科,去找哪些每周或每天都需要书写作业的课。

开始写日志或网路日记。你写得愈多,写起来愈容易,就会再写得更多,这是个正向的循环。

在毕业前学会C

第二要素:C。注意我并不是说C++。虽然 C 愈来愈少用,但它还是现役程式师的通用语。它是程式师与程式师互相沟通所用的语言;更重要的是,它比大学里教的「现代」程式语言(ML、Java、Python 或其他最近教的流行垃圾)更接近机器多了。你至少要花一学期去贴近机器,否则[你永远无法用高阶语言写出有效率的程式](/wiki/The_Joel_on_Software_Translation_Project:%E5%9B%9E%E6%AD%B8%E5%8E%9F% E9%BB%9E “The Joel on Software Translation Project:回归原点”)。你也永远不能去做编译器或作业系统,这里头可有些最棒的程式工作机会呢。另外也永远不会有人相信你能创造大型专案的架构。我才不在乎你有多懂 continuation 和封闭集合(closure)和例外处理:如果你不能解释为什么**while (s++ = t++); 会复制一个字串,又或这对你并不是天底下最自然的事,那么我就会认定你写程式的依据是迷信:一个不懂基本解剖学的医生,会因为卖药的菜鸟业务说药应该有效就用来开处方。

在毕业前学会个体经济学

CA3.JPG

如果你没修过任何经济学课程,面试会结束都其快无比:经济学和某些学科一样,开场白声势浩大,有着许多很有道理的[有用理论和事实](/wiki/The_Joel_on_Software_Translation_Project:%E7 %AD%96%E7%95%A5%E6%9B%B8%E4%B9%8B%E4%BA%94 “The Joel on Software Translation Project:策略书之五”),可以在真实世界里实证等等,之后却突然急转直下。这个有用的开场白就是个体经济学,亳无疑问是所有重要商业理论的基础。不过接下来事情就恶化了:你进入总体经济(不想的话可以跳过)和关于利率和失业的有趣理论(不过实际上反例似乎比较多) ,接下来只有愈来愈糟,所以很多专攻经济的人就跳槽到物理,反而在华尔街有更好的工作机会。不过个体经济学是一定要修的,因为你得了解供求与需求,也得知道竞争优势并了解净现值和折扣还有边际效用,才能稍为搞清楚商业为什么能这样运作。

为什么主修资讯的学生要学经济学呢?因为懂商业基础的程式师会是个更有价值的程式师。事情就是这样。有些程式师的点子从程式的立场来看有道理,但由资本主义来看完全不通。我已经数不清被这种人打败多少次了。如果你能了解这种事,你就会是更有价值的程式师,同时也会获得对应的报酬,而其中的道理也能在个体经济学里学到。

不要因为非资讯课程无聊就放弃

放弃非资讯课程是个降低GPA(学业平均成绩)的好方法。

永远别低估GPA 的影响有多大。很多的招募人员和用人经理(包括我在内)会在浏览履历时直接去看 GPA,而且不会觉得有任何不对。为什么呢?因为比起别的单一数字,GPA 更能反映长期下来各种状况下,几十个老师对你成果的总评价。SAT 分数呢?哈!只是过程数小时的一个测验罢了。GPA 反映了四年间的几百份作业还有期中考和课堂参与状况。没错,GPA 本身是有些问题。比如这些年来有分数膨胀的情形。另外GPA 也没有说分数是怎么来的,是在无名社区大学家政系修简单课程?还是在加州理工学院修研究所的量子力学课程?最后当我剔除所有在无名学校拿2.5 GPA 的履历后,就会去要成绩单和推荐信。然后我会找那些_全部_ 都拿高分的人选,而不是只在资讯科学拿高分的。

为什么我这个找软体开发者的雇主要在意你修欧洲史的分数呢?毕竟历史是蛮_无聊_ 的。哦,所以你是说由于你觉得工作无聊就不去好好做,我就应该雇用你吗?算了吧,写程式也有无聊的事情。每个工作都有无聊的时候。我才不会请一个只想做好玩事情的人呢。

我在大学时候修了一门叫文化人类学的课,因为我不知怎的觉得自己需些知道有关人类学的_东西_ ,而这看起来像门好玩的通识课程。

CA4.JPG

好玩?连一点点都算不上!我得读些单调到爆的书,里头写的是巴西雨林印第安人和特罗布里恩群岛岛民,不管从任何观点来看,我都不会觉得它很有趣。有时候课程实在烦得要命,烦到我想找些更刺激的事,比如 看着草生长 。我对这个主题彻底完全失去兴趣, 眼睛还流着泪 。我已经受不了不停的讨论土著在堆集山芋。我不知道特罗布里恩岛民为啥要花这么多时间堆山芋,我什么都记不住了,这实在是无聊透顶但期中考到了,所以我就考砸了。最后我决定把文化人类学当作我烦人的铁手套:我个人无聊而单调的障碍课程。如果我能在一门得完全搞懂冬季赠礼节互赠毛毯的课拿到 A,我就能搞定任何事,不管它有多无聊。后来当我意外卡在林肯中心对付全长18 小时的华格纳「指环」时,我得感谢当初研读夸扣特尔部族,相较之下华格纳真是亲切啊。

我后来拿到A。如果我能做到,你也可以。

修要写大量程式的课

我还记得我发誓绝不上研究所的那一刻。

那是动态逻辑的某堂课上,教课的是活力充沛的耶鲁教授 Lenore Zuck,是这出色电脑科学学府里最出色的一位老师。

我现在的回忆已经模糊,并不能正确地评价这门学科,但请容我敷衍过去。形式逻辑的想法是:你能证明某件事是对是因为其他事情是对的。举例来说,形式逻辑可以由「成绩好的人都能得到工作」加上「强尼成绩好」,让你发现新事实:「强尼被得到工作」。这一切非常的离奇有趣,而且一个解构者只要十秒,就能用形式逻辑把任何有用的东西完全拆散,只剩下一些有趣而无用的玩意。

现在呢, 动态 逻辑是一样的东西,只是再加上时间因素。举例来说,「你把灯打开_之后_ ,你就能看到你的鞋子」加上「灯原本是开着的」暗示「你可以看到你的鞋子」。

动态逻辑对Zuck 教授这种出色的理论家来说非常有吸引力,因为你有希望用它来_正式_ 证明有关电脑程式的事,而这种证明会非常有用。举例来说,你可以正式证明,应该在红色行星上到处寻找火星人马文(译注:某卡通人物)踪迹的火星漫游号,它的记忆卡不会有溢出错误而因此整天不断重新开机。

于是Zuck 博士在那门课第一天就写满两面白板和白板_旁_ 大块的墙壁,证明如果你有个电灯开关而且灯是熄掉的,当你打开开关时,电灯就会打开。

证明过程繁复至极而且非常容易出错。要证明_该证明_ 正确要比说服你自己开开关会开灯还要困难。写了这么多面白板的证明其实已经略过了很多过程,省略的原因是是因为这些过程太冗长沉闷无法正式写出。很多过程都是用归纳法得到,其他则是用归谬法,剩下的是用研究生证法证明的(译注:意指教授叫许多研究生进行大量人工计算才验证得出来,又称为研究生演算法)。

至于作业呢,我们必须证明相反的情况: 如果 灯原本是熄的, 而且 现在开着,证明是你打开了它。

我尝试了,我真的试过了。

我在图书馆花了很多个小时去试。

花了好几个小时之后,我在模仿Zuck 博士原本的证明时发现其中有个错误。或许是我抄错了,不过这让我明白一件事:如果得花三小时写满几个黑板才能证明某件小事,而且过程中会出错的地方有好几百个,这种机制永远无法证明出 有趣 的事情。

不过这跟动态逻辑家无关:他们做这个并不是因为它_有用_ ,而是为了长聘教职(译注:tenure,以往是终身教职,但现在未必了)。

我退掉那门课并且发誓绝不上资讯科学的研究所。

这个故事的教训是资讯科学并不等同于软体开发。如果你真的非常幸运,你的学校可能会有一套合宜的软体开发课程,不过大概是不会有的,因为精英学校认为技职教育和犯人改过自新计划才需要教导实务技能。只不过是 写写程式 而已,到处都可以学。我们可是耶鲁大学,身负铸造未来世界领袖的重责大任。你觉得16 万美元的学费是让你来学_while 回圈_ 的吗?你以为这是什么?某个在机场旅馆举办的骗人_Java 研讨会_ 吗?哼。

问题在于我们并没有真正的专门软体开发学校,所以如果你想当个程式师,可能还是得主修资讯科学。这是个好的主修学科,不过跟软体开发是_两回事_ 。

不过如果你幸运的话,可以在资讯科系找到很多密集写程式的课程,就像你可以在历史系找到很多能学会写作的​​课一样。这些是最好的课程了。如果你喜欢写程式,修 lambda 演算或线性代数这种不碰电脑的课时,有些地方搞不懂不必难过。去找那些课程名称有Practicum 的400 等级课程。这些课用这个拉丁文只是想弄个漂亮的课程名称,好瞒过那些爱跩文的屁管理阶层。

别担心所有工作都会外流到印度

好,首先如果你已经_身在_ 印度,的确永远不用管它,你根本不用_开始_ 担心工作所有都跑到印度。这些工作很都很好,好好享用并祝身体健康。

不过我还是一直听说资讯科系的入学人数直线下降,而谣传的原因之一是「学生害怕进入一个工作机会都将外流到印度的学科」。有很多理由可以证明这实在是错得很离谱。首先,根据目前流行事业来选择职业本身就蛮荒谬的。其次是即使每一个程式设计的工作都移到印度跟中国,写程式还是一种绝佳的训练,可以协助你从事各种非常好玩的工作(如商业流程工程)。再来就是真正好的程式师还是非常抢手,不管是在这里 还是 印度,这点你得相信我。没错,的确有一大群失业的资讯人员在吵着说他们已经失业很久很久了。虽然会得罪这些人,不过你知道吗?真正好的程式师_还是_ 有事做。第四点是没有更好的主意了,你还能有什么选择?去主修历史吗?不然你只好去念法学院了。不过我倒是知道一件事,99% 的执业律师都_恨_ 他们的工作,恨做律师的每一分钟,更不用说他们每周同样要工作90 小时。就如我所说的:如果你喜欢写电脑程式,恭禧你:你是少数能从事自己所喜爱的好工作的幸运儿。

不管如何,我不认为学生真的能想到这一点。资讯科系入学人数的下降,不过是在网路热潮造成人数暴增的泡沫后,回复到以往的正常水平吧。这些多的人并不是真的喜欢写程式,只是认为可以在资讯科系找个诱人的高薪工作,还有机会 24 岁就能股票上市上柜。谢谢老天,这些人现在都走啦!

不管你做什么,去找个好的暑期实习工作

精明的招募人员都知道,爱写程式的人国中时就替牙医写过资料库,读大学之前就去过三次夏季电脑营,还替营队报纸架设管理系统,另外暑假还会到软体公司实习。他们就是要找这种人。

CA5.JPG

如果你喜欢写程式,绝对不过要随便选工作,不管是暑期打工还是兼差或其他情况,一定要找写程式的工作。我知道其他19岁的青少年都想去商场打工折衬衫,不过即使你只有 19 岁也一样,拿你所拥有的珍贵才能去折衬衫实在太笨了。当你毕业时应该要有一份列有各种程式设计工作经验的履历。折衬衫的同学毕业了就让他去租车公司服务他人吧(Tom Welling 例外。他的打工是去上电视演超人。)

为了让你的生活更容易,也为了强周这整篇文章纯粹是为了个人的利益,我的公司Fog Creek Software 提供了在履历上会_很醒目_ 的软体开发暑期实习。「比起其他实习机会来说,你在Fog Creek Software 很可能会学到更多关于软体的程式撰写、开发、商业知识。」去年的暑期实习生Ben 是这样说。这可不全是因为我派人去他宿舍才让他这样说的。申请期限是2 月1 号。来吧!

如果你听从我的建议,你最后可能还是会做些蠢事,比如太早卖掉微软股票,或者为了有门的办公室而回绝在Google 的工作机会,或是做出其他愚蠢的重大决定,不过那些都不关我事。我说过不要听我的了。

这些网页的内容为表达个人意见。
All contents Copyright © 1999-2005 by Joel Spolsky. All Rights Reserved.