软件随想录:程序员部落酋长Joel谈软件(local.joelonsoftware.com/wiki)-10

给计算机系学生的建议

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 会成功吗?虽然他是个很出色的骇客,不过还是因为其能以英文通过电子邮件及 mailing list 推广他的想法,才能够吸引全球大量的志愿者。

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

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

CA2.JPG

    堪用的程序员和伟大的程序员的差别并不在于他们会多少种语言,也不在于他们喜欢 Python 还是 Java。重点是能够和他人沟通自己的想法。伟大的程序员藉由说服他人而得到影响力。他们撰写清楚明白的意见和技术规格,让其他程序员了解他们的程序,因此别人可以运用这些程序而不是重写。如果少了这一点,他们的程序代码就毫无价值可言。他们为使用者撰写清楚易懂的技术文档,让大家能了解他们的程序的作用,这是唯一能让使用者理解其程序价值的方法。SourceForge 里埋藏了很多神奇有用却没有人用的程序。只因为程序的作者写不出好文章(或者根本不会写),所以没人知道他们的成果,而出色的程序代码就此凋萎。

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

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

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

在毕业前学会C

    第二要素:C。

    注意我并不是说 C++。虽然 C 愈来愈少用,但它还是现役程序员的通用语。它是程序员与程序员互相沟通所用的语言;更重要的是,它比大学里教的「现代」程序语言(ML、Java、Python 或其他最近教的流行垃圾)更接近机器多了。你至少要花一学期去贴近机器,否则你永远无法用高阶语言写出有效率的程序。你也永远不能去做编译器或作业系统,这里头还有最棒的程序工作机会。另外也永远不会有人相信你能创造大型专案的架构。我才不在乎你有多懂 continuation 和closure和例外处理:如果你不能解释为什么 while (*s++ = *t++); 会复制一个字串,又或这对你并不是天底下最自然的事,那么我就会认定你写程序的依据是迷信:一个不懂基本解剖学的医生,会因为卖药的菜鸟业务说药应该有效就用来开处方。

在毕业前学会个体经济学

CA3.JPG

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

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

不要因为非计算机课程无聊就放弃

    放弃非计算机课程是个降低 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 的工作机会,或是做出其他愚蠢的重大決定,不过那些都不关我事。我说过不要听我的了。

    这些网页的內容为表达个人意见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值