`
lifeiniao526
  • 浏览: 37719 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论
阅读更多

作者JoelSpolsky

[编者按]由于JoelSpolsky的双重身份(昔日耶鲁大学计算机系学长,今日FogCreek软件公司的CEO),所以听听他的建议,对于当今无数困扰于就业压力的中国高校计算机专业学子来说,是大有裨益的。你们会发现,大多数建议,都在强调软实力的价值。本文转载自《软件随想录》(作者:JoelSpolsky ,译者: 阮一峰,200912月出版),感谢北京图灵文化发展有限公司的支持。

如果你喜欢编程,那么你真是受到了上天的眷顾。你是非常幸运的少数人之一,能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念热爱你的工作,其实是一个很现代的概念。通常的看法是,工作是一种让人很不开心的事,你为了拿工资才不得不去上班。你工作的目的是为了攒下钱去干那些自己真正喜欢干的事,但是前提是你得等到65岁退休之后才行,而且还有不少条件。条件一,你的积蓄必须足够多;条件二,你没有老到走不动,你还有体力去干那些事情;条件三,你喜欢的事情不需要用到脆弱的膝盖、昏花的视力,也不要求你走上一里地不喘气,等等。

我刚才说到哪里了?对了,我要提建议。

毕业前练好写作

如果不是LinusTorvalds不断地散布福音,请问Linux操作系统会成功吗?虽然他是一个非常聪明的计算机天才,但是Linux吸引来全世界一大批志愿者的真正原因却是LinusTorvalds的表达能力。他通过电子邮件和邮件列表用书面形式传播自己的想法,最终引起了所有人的注意。

你听说过现在风靡一时的极限编程[]”ExtremeProgramming)吗?我在这个地方不谈我对极限编程的看法,我只说如果你听过这个词,那么原因就是它的倡导者都是一些非常有才华的作家和演说家。

即使我们缩小范围,将目光局限在任何一个软件开发团体中,你也会发现该团体中最有权势和影响力的程序员正是那些表达能力强的程序员,他们无论是做书面表达还是做口头表达,都能够清晰、自如、具有说服力地传达观点。此外,长得高也有助于提升影响力,不过这个不取决于你。

一个普通程序员与一个优秀程序员的区别,不在于他们懂得的编程语言谁多谁少,也不在于他们喜欢用Python语言还是喜欢用Java语言,而在于他们能否与他人交流思想。如果你能说服其他人,你的力量就可以得到放大。如果你能写出清晰的注释和技术规格说明书,其他程序员就能够理解你的代码,因此他们就能在自己的代码中使用,而不必重写。如果你做不到这一点,你的代码对其他人就没有价值。如果你能为最终用户写出清晰的使用手册,其他人就能明白你的代码是用来干什么的,这是唯一让别人明白你的代码有何价值的方法SourceForge[]上有许多优美的、有用的代码,但是它们都像被埋葬了一样,根本没人来用,原因就是它们的作者没有写好使用说明(或者压根就没写)。这样一来就没有人知道他们的成果,他们杰出的代码就衰亡了。

如果一个程序员不会用英语写作、没有良好的写作能力,我就不会雇他。如果你能写,不管你去哪家公司工作,你很快就会发现写作技术文档的任务会落到你头上,这意味着你已经开始在放大自己的影响力了,管理层正在注意到你。

大学里有些课程被公认为写作密集型writingintensive)课程,这就是说为了拿到学分,你必须写作多得可怕的文字。一定要去上这样的课程!不要管学科,只要这门课每周甚至每天都要你写东西,你就去上。

你还可以动手写日记或者网志。你写得越多,写作就会变得越容易。写起来越容易,你就会写得越多。这是一个良性循环。

毕业前学好C语言

第二点我要讲的是C语言。请注意,我说的是C语言,而不是C++。虽然在实际使用中C语言已经越来越罕见,但是它仍然是当前程序员的共同语言。C语言让程序员互相沟通,更重要的是,它比你在大学中学到的现代语言(比如ML语言、Java语言、Python语言或者其它正在教授的流行垃圾语言)都更接近机器。你至少需要花一个学期来了解机器原理,否则你永远不可能在高级语言的层次写出高效的代码。你也永远无法开发编译器和操作系统,而它们恰恰属于目前程序员能够得到的最佳工作之列。别人也永远不会放心将大型项目的架构设计交给你。我不管你懂多少延续(continuation)、闭包(closure)、异常处理(exceptionhandling),只要你不能解释为什么while(*s++=*t++);这句代码的作用是复制字符串,或者不觉得这是世界上对你来说再自然不过的事情,那么你就是在盲目无知的情况下编程。在我看来,这就好像一个医生不懂得最基本的解剖学就在开处方,他看病的根据完全是因为那些娃娃脸的医药厂商销售代表说这种药有用。

毕业前学好微观经济学

如果你没有上过任何经济学课程,那么我首先来做一个超短的评论:经济学是这样的学科之一,刚开始学的时候轰轰烈烈,有许多有用的、言之有理的理论和可以在真实世界中得到证明的事实,等等;但是,再学下去就每况愈下,有用的东西就不多了。经济学一开始那个有用的部分正是微观经济学,它是商业领域所有重要理论的基础。跟在微观经济学后面的东西就不行了。你接下来学的是宏观经济学,如果你愿意,尽管跳过去,也不会有什么损失。宏观经济学开头的部分是利息理论,内容比方说是利率与失业之间的关系,但是怎么说呢,看上去这部分里面还没有被证实的东西多于已经被证实的东西。学完这部分,后面的内容越来越糟糕,许多经济学专业的学生实际上都变成在搞物理学,因为这样才能在华尔街上找到更好的工作。但是不管怎样,你一定要去学微观经济学,因为你必须搞懂供给和需求,你必须明白竞争优势,你必须理解什么是净现值(NPV),什么是贴现,什么是边际效用。只有这样,你才会懂得为什么生意是现在这种做法。

为什么计算机系的学生也应该学经济学?因为,从经营一家公司的角度来看,比起那些不懂的程序员,一个理解基本商业规则的程序员将会更有价值。就是这么简单。我无法告诉你有多少次我是那样地充满挫折感,因为我看到了太多的提出一些疯狂的想法的程序员,这些想法在代码上也许可行,但在资本主义世界中毫无意义。如果你懂得商业规则,你就是一个更有价值的程序员,你会因此得到回报的,但是前提是你要去学习微观经济学。

不要因为枯燥就不选修非计算机专业的课程。

想提高GPA绩点的一个好方法就是多选修非计算机系的课程。请千万不要低估你的GPA的重大意义。千千万万的人事经理和招聘人员在拿到一份简历的时候,第一眼就会去看GPA,包括我也是这样。我们不会为这种做法道歉。为什么?因为GPA不反映单个的成绩,而是代表了许多个教授在一段很长的时间中,在不同的情况下,对你的表现的一个总的评估。SAT成绩难道不够吗?哈,那只不过是一场几个小时的测试罢了。GPA中包括了四年大学期间你的小论文、期中考试和课堂表现,总数有几百次之多。当然,GPA也有自己的问题,不是百分之百准确。比如,这些年来,老师对学生的打分越来越宽松,学习成绩有通货膨胀的趋势。再比如,GPA无法反映课程的难度,没人能够看出你的GPA是来自无名社区大学家政系的轻松课程还是来自加州理工学院针对研究生的量子力学课程。渐渐地,我形成了一套自己的做法,首先我会过滤掉所有来自社区大学、GPA低于2.5的简历,然后我会要求剩下的人给我寄成绩单和推荐信。我再从中发现那些成绩一贯优秀的人,而不是那些仅仅在计算机系课程中得到高分的人。

为什么我要关心某人的欧洲历史课程成绩呢,毕竟作为雇主我要找的应该是程序员啊?何况,历史是那么枯燥,不得高分很正常。哦,这么说来,你的意思是我应该雇用你,而不用考虑一旦工作变得枯燥你会不会努力工作?别忘了,在编程工作中也有很枯燥的东西。每一项工作都有枯燥难耐的时刻。我不想雇用那些只想干有趣事情的人。

选修有大量编程实践的课程

我依然清楚记得我发誓绝不读研究生的那一刻。那是在一门叫做动态逻辑的课程上,教师是活力十足的耶鲁大学教授LenoreZuck,她是计算机系那些聪明的老师中最聪明的人之一。

如今,由于记忆力糟糕,我已经差不多把这门课的内容忘光了,但是不管怎么说,在这里我还是想要对付着说一下。大致上,形式逻辑的意思是说,如果条件成立,你就能证明结论也成立。比如,根据形式逻辑,已知只要成绩好,就能被雇用,然后假定“Johnny的成绩好,你就可以得到一个崭新的结论“Johnny会被雇用。这完全是经典方法。但是,一个解构主义者(deconstructionist)只需要10秒钟就能破坏形式逻辑中所有有用的东西。这样一来,留给你的只是一些趣味性,而不是实用性。

现在再来说动态逻辑。它与形式逻辑其实是一回事,但是必须再多考虑时间因素。比如,你打开灯之后,就能看见自己的鞋子,已知灯以前是亮的,那么这就意味着你看见了自己的鞋子

对于像Zuck教授那样聪明的理论家,动态逻辑充满了吸引力,因为它看上去很有希望让你在形式上证明一些计算机程序的相关理论问题。这样做说不定很有用。比如,你可以用它在形式上证明,火星漫游车的闪存卡不会发生溢出(overflow)问题,不会因而整天一遍又一遍地重启,耽误了它在那颗赤红色的星球上漫游寻找火星人马文(Marvinthe Martian)。

在第一堂课上,Zuck博士写满了整整两面黑板,甚至黑板旁边的墙上都写上了很多证明步骤。需要证明的问题是,有一个控制灯泡的开关,现在灯泡没有亮,这时你打开了开关,请证明灯泡将会点亮。

整个证明过程复杂得不可思议,处处都是陷阱,必须十分小心。保证这个证明不出错太困难了,还不如直接相信打开开关灯就会亮。真的,虽然证明过程写满了许多块黑板,但是还是有许多中间步骤被省略了,因为如果要从形式逻辑上完整证明所有步骤,那就琐碎得无法形容了。许多步骤是用各种经典的逻辑证明方法推导得到的,包括归纳法、反证法等,甚至有些部分还是由旁听的研究生证明的。

留给我们的课后作业是证明逆命题:如果灯原来是关着的,现在却亮了,那么请证明开关的状态一定同原来相反。

我动手开始证明,我真的去证明了。

我在图书馆里待了很长时间。

我对照着Zuck博士的原始证明想依样画葫芦。研究了几个小时之后,我在其中发现了一个错误。可能我抄写的时候抄错了,但是这使得我想通了一件事。如果花费3个小时,写满了一块又一块的黑板,每一秒钟都可能出错,最后能够证明的却只是一个很琐碎的结论,那么这种方式有多大的实用性呢?在活生生、充满趣味的现实世界中,你永远都不会有机会使用它。

但是,动态逻辑的理论家们对这一点不感兴趣。他们看上它不是因为它有用,而是因为它可以为他们带来终身教职。

我放弃了这门课,并且发誓绝不会去读计算机科学的研究生。

这个故事告诉我们,计算机科学与软件开发不是一回事。如果你真的非常幸运,你的学校可能会开设很像样的软件开发课程。但是另一种可能是,你的学校根本不教你在现实中如何编程,因为精英学校都觉得,教授工作技能最好留给职业技术学校、犯人重返社会的培训项目去做。你到处都能学怎么写代码。别忘了,我们是耶鲁大学,我们的使命是培养未来的世界领袖。你交了16万美元的学费,却在学循环语句的写法,这怎么可以?你以为这是什么地方,难道是机场沿途的酒店里临时拼凑起来不靠谱的Java语言培训班?哼哼。

麻烦在于我们没有一种真正教授软件开发的专门学校。你如果想成为一个程序员,你可能只能选择计算机科学专业。这是一个不错的专业,但是它同软件开发不是一回事。在那些400等级的课程代号中,去寻找名称中带有“Practicum”这个词的课程吧(编者注:指供人实习的课程)。不要被这个拉丁语单词吓倒,这些都是有用的课程,之所以起这种名字,只是为了让那些文绉绉、装腔作势、满嘴胡说八道的公司经理们觉得高深莫测。

别担心所有工作都被印度人抢走

我首先要说的是,如果你本身就已经在印度了,或者你就是印度人,那么你真的毫无必要去想这件事,根本不用琢磨所有的工作机会是不是都跑到了印度。那些都是非常好的工作,好好地享受吧,祝你身体健康。

但是,我不断听说计算机系的入学人数下降得很厉害,已经到了危险的程度。根据我听到的说法,其中的一个原因是学生们不愿去学一个工作机会都流向印度的专业。这种担心大错特错,有很多理由可以反驳。首先,根据一时性的商业潮流决定个人的职业选择,这是愚蠢的。其次,即使编程工作无一幸存地都流向了印度和中国,但是学习编程本身依然是一种第一流的素质训练,可以为各种超级有趣的工作打下基础,比如业务流程工程(businessprocessengineering)。再次,不管是在美国还是在印度,真正优秀的程序员依然是非常非常短缺的,这一点请相信我。不错,确实有相当一批失业的IT从业者在那里鼓噪,抱怨他们长时间找不到工作,但是你知道吗?即使冒着触怒这些人的风险,我还是要说,真正优秀的程序员根本不会失业。最后,你还能找到更好的专业吗?你觉得什么专业好?主修历史学?如果那样,你毕业的时候就会发现,根本没有其他选择,只能去法学院。不过我倒是知道一件事:99%的律师都痛恨他们的工作,痛恨他们当律师的每一分钟。可是,律师每周的工作时间偏偏长达90小时。就像我前面说过的:如果你喜欢编程,那么你真是受到了上天的眷顾。你是非常幸运的少数人之一,能够以自己喜欢的事谋生。

不过说实话,我不觉得学生们真的有上面的想法。近年来,计算机系入学人数的下降只是回到了历史上的正常水平,因为前些年的互联网狂热使得入学人数出现了大泡沫,抬高了基数。由于这种泡沫,许多并不真的喜欢编程的人也来读计算机系。他们心里想的是,只要进了计算机系,将来就能找到诱人的高薪工作,就能获得24岁当上CEO、进行IPO的机会。谢天谢地,这些人现在都离计算机系远远的了。

找一份好的暑期实习工作

精明的招聘负责人都知道,喜欢编程的人高中时就将牙医的信息输入了数据库,进入大学前就去过三次电脑夏令营,为校报做过内容管理系统,有过软件公司的夏季实习经历。招聘负责人就是要在你的简历上找这些东西。

如果你喜欢编程,就不要随便什么工作都答应,否则你会犯下最大的错误。不管是暑期工作,还是兼职或者其他性质的工作,只要与编程无关,就不要轻易接受。我知道,其他19岁的孩子都想去购物中心里打工,在那里折叠衬衫。但是你与他们不同,你19岁时就已经掌握了一门非常有价值的技能。将时间浪费在折叠衬衫上是很愚蠢的,等到毕业的时候,你的简历上本应该写满了一大堆与编程相关的经历。就让那些财经类的毕业生去租车公司帮助人们满足他们租车的需要吧,你要干的是别的事(在电视中扮演超人的Tom Welling1除外)。

为了让你的生活变得更容易一些,也为了强调这整篇文章完全是为了满足我的个人目的,我要告诉你,我的公司——FogCreek软件公司——提供软件开发方面的暑期实习机会。我们非常看重简历。比起其他公司的实习工作,你在FogCreek最有可能学到更多的编写代码、软件开发、商业运作方面的知识。这是去年夏天我们的一个实习生Ben说的。他会这样说,并不完全是因为我派了人到他的宿舍让他这样说。我们接受实习申请的截止日期是21日。一起来吧。

如果你听从了我的建议,你还是有可能落得一个悲惨的下场,比如很早就卖掉了微软公司的股票,再比如拒绝了谷歌公司的工作机会,原因是你想要一间自己的可以关上门的独立办公室,或者做出了其他生命中愚蠢的决定。但是,这些可不是我的错。我一开始就告诉过你,不要听我的话。

(注1 TomWelling是一个美国演员,在电视剧《超人前传》(Smallville)中扮演超人。该电视剧讲述还没有成长为后来超人的克拉克·肯特少年时代的故事。)

作者简介:

JoelSpolsky,世界最具影响的程序员网志Joelon Software的主人,软件业一位旗帜鲜明的思想者,一位传统软件管理理念的挑战者。他创办的这个网站被程序员誉为反呆伯特宣言书,并被翻译为三十多种语言。Joel毕业于耶鲁大学,随后即进入微软公司工作,曾任微软公司Excel 开发小组项目经理。现在他在自己创办的FogCreek软件公司任CEO。此外,他与人合办的StackOverflow已经成为如今最热门的技术网站。

(本文来自《程序员》杂志2010年1月刊)

分享到:
评论

相关推荐

    统编版四年级下册第七单元习作《我的自画像》教学建议.pdf

    统编版四年级下册第七单元习作《我的自画像》教学建议 《我的自画像》教学建议是四年级下册第七单元的教学资源,旨在帮助学生学习写作和思维的方法。下面是对该资源的详细分析和知识点总结: 人文主题 《我的自画...

    删除win10七个文件夹的注册表

    标题“删除win10七个文件夹的注册表”涉及到的是Windows 10系统的一个优化技巧,主要是关于如何通过修改注册表来隐藏或移除“此电脑”(原“我的电脑”)窗口中显示的特定文件夹。在Windows 10中,用户可能会发现...

    2021年最新部编人教版语文七年级下册第四单元教学建议.doc

    【2021年最新部编人教版语文七年级下册第四单元教学建议】针对初中生语文学习的重要环节提供了具体指导,旨在帮助学生更好地理解和掌握课文内容,提升语文素养。以下是该单元的教学要点和方法: 1. **词汇与文言文*...

    编写高质量代码:改善C#程序的150个建议完整版

    《编写高质量代码:改善C#程序的150个建议》是一本专注于提升C#编程实践的书籍,旨在帮助开发者优化代码,提升软件项目的整体质量和可维护性。这本书的建议覆盖了从基本语法到高级设计模式,从代码组织到调试技巧的...

    物业公司员工合理化建议100条.pdf

    但我可以根据“物业公司员工合理化建议”这一主题,概括出可能包含的知识点,为物业公司员工提供一个合理化建议的框架。 物业公司员工合理化建议的知识点通常会涉及以下几个方面: 1. 人员管理与培训 - 定期对...

    可删除win10的此电脑下七个多余文件夹

    1. `7个文件夹删除.reg`:这个文件是用来删除上述提到的七个文件夹的。`.reg`文件是Windows注册表编辑器的导入文件,它可以修改系统注册表项,从而影响系统的行为。 2. `7个文件夹显示.reg`:如果你后悔删除了这些...

    环境建议书.pdf

    仅凭标题《环境建议书.pdf》和描述《环境建议书.pdf》,以及标签“教育”和部分内容中的一个数字“***”,无法判断文件的具体内容和上下文环境。 为了提供有质量的知识点,我需要更多的文本内容,尤其是关于“环境...

    我建议滑着走-Arcgis

    【标题】:“我建议滑着走-Arcgis”这一标题可能是在暗示ArcGIS软件在地理信息系统(GIS)中的流畅操作和高效工作流程。ArcGIS是由Esri公司开发的一款强大的地理信息系统软件,它允许用户创建、管理和分析地理信息,...

    一个牛人给java初学者的建议(让我顶礼膜拜)

    对于Java初学者,建议从以下几个方面入手学习: 1. 基础语法:理解类、对象、继承、接口、封装等面向对象概念,并学习基本的数据类型、控制流、异常处理等基础语法。 2. 核心API:熟悉Java标准库,如集合框架、...

    关于发挥大数据优势促进我省医疗大数据发展的建议.rar

    7. **案例分析与实践经验**:可能包含一些成功的医疗大数据应用案例,分析其成功要素,为我省的医疗大数据发展提供借鉴。 8. **未来展望与挑战**:讨论医疗大数据面临的挑战,如数据质量问题、技术更新速度、安全...

    Android七个球游戏源代码

    这是一个简单的游戏,我做了两天。当你点击某一个球的时候,则该球与和他相对的两个球都改变成为相反的颜色,当七个球都变为红色时获胜。中间的绿色球具有提示功能,当你点击绿球的时候,则系统自动代你走一步。 我...

    我对我校网络信息安全的建议.docx

    【网络信息安全概述】 网络信息安全是保护计算机网络系统及其数据不受未经授权访问、修改或破坏的一系列措施。...通过这些措施,可以有效地防范潜在的信息安全风险,为师生提供一个安全、健康的学习和工作环境。

    高中英语作文大全好词好句好篇建议信.doc

    这部分内容应该逻辑清晰,理由充分,如“我建议你可以多读书来扩大词汇量,我相信这会有助于你的英语学习。”同时,可以结合实际情况提供实例或个人经验,以增强说服力。 3. **结尾**:表达对采纳建议的期望,并...

    数据分析师八大能力培养 Part7 提供建议能力.pdf

    提出一个靠谱的建议,需要遵循一定的逻辑和流程,以便能够针对问题找到实际可行的解决方案。以下是关于如何提出靠谱建议的能力培养的一些关键知识点。 首先,提出建议的前提是明确问题所在。数据分析师必须清晰地...

    建议提案办理情况表.pdf

    在这个特定的例子中,关注的是“我市文化艺术发展”的建议提案,具体案号为128。 【描述分析】:描述中的“建议提案办理情况表.pdf”与标题相呼应,进一步确认这是一份详细记录建议提案处理进度的文件,可能包含了...

    jsp建议后台

    描述中提到的"jsp写的后台建议后台文件"暗示这是一个简单的JSP示例,可能包含了一个基础的登录系统,如"LoginDemo"文件所示。这个系统可能用于教学目的,帮助初学者了解如何在JSP中处理用户输入、验证用户凭据以及与...

    项目建议书的教材.pdf

    7. 风险管理:项目建议书应该包含对潜在风险的识别和缓解策略,以增强项目的可行性和吸引力。 8. 成功案例:提供类似项目的成功案例可以为项目建议书增加说服力。 9. 技术支持和资源:明确说明项目所需技术资源,...

    如何提出对公司意见和建议.rar

    7. **使用“我”语句**:使用“我觉得”、“我认为”这样的表述方式,可以降低对方的防御心理,更容易接受你的观点。 8. **准备备选方案**:如果可能,提供一到两个备选方案,这显示了你的思考深度和解决问题的决心...

    在Airbnb工作7年,我学到了创业的7个教训共12页.p

    【标题】: "在Airbnb工作7年,我学到了创业的7个教训" 这篇文章的标题揭示了作者在Airbnb这家知名的共享经济公司工作多年后所积累的宝贵经验。Airbnb作为全球领先的在线短租平台,其成功背后必定蕴含着丰富的创业...

Global site tag (gtag.js) - Google Analytics