“如果国家的生活水平不停止改善的话, 我们就不会再有出身卑微的伟人。”———RussellP.Askue

软件开发是一个美妙的领域,部分原因是它总是那么有新鲜感、充满活力。软件行业的活力和变化的快节奏让每个人都专注于个人成长和学习,这是绝对无法逃避的。有些人在变化和不断的学习中迅速成长,而有些人则在痛苦中挣扎。虽然自始至终变化不断,而且最佳实践也在不断重构,但整个行业里有一个不变的事实:职业工作的第一个五年是最具教育性的。在这些年里,你开始接触到企业文化、组织动态以及公司政治。你需要作为一个团队的成员来工作,而不是一个人单打独斗,通过与同事共享信息、技术和其他资产(文档、代码、演示资料),你会茁壮地成 长。你会近距离地看到软件领域平凡的一面(可能会有许多平凡的工作分配给你———总有人要做这些事,所以很可能就是你这位新手来做)。在技术方面,你会体会到企业级软件是如何开发的,并亲身体验在大团队中工作的活力。这些年的宝贵时间绝对需要重视和加以利用。花在职业成长上的时间是值得的。


行业技能

“程序员不是用聪明才智和逻辑性来衡量的,而是以他们案例分析的完整性来衡量的。”———A.J.Perlis,《编程格言》

尽管大多数应届毕业生还没有大型项目的工作经验,但他们已经有了较强的编程能力。在加入一个新公司后,你可能希望学习公司先进的技术和复杂精密的产品。你可能会发现,比起你在学校里的代码开发来说,虽然在企业里的代码开发规模更大、更复杂,但也是万变不离其宗。其实令新员工眼花缭乱的是行业技能。所谓“行业技能”,我是指本质上非常专业但过去在学校可能并未深入涉足的技能。对于那些有很多开发者要一起编程的大型项目而言,这些行业技能必不可少。比起我们在学校里做的项目来说,现实世界的项目往往在可靠性、可用性、并发性或性能效率方面有更高的要求。其中有些方面在研究生课程中讲到过,但即使是这些获得计 算机科学硕士和博士学位的少数幸运儿也只是了解一点皮毛。

其中有些技能与我们如何规划和开发代码有关,有些则涉及如何组织许多人(5人、50人甚至500人)协作开发代码。而还有些技能涉及软件所运行的系统规模,可能有数百个CPU,以及成千上万的并发用户来操作TB或PB级的数据。比起单纯的学术技能,软件的行业技能就不那么专业和抽象了,但就像学习弹钢琴一样,需要多年的经验才能充分地掌握和理解。

我建议每一个软件从业者在职业生涯的头五年都去获取这些经验和技能。假如你还没有机会获得这些技能,从现在开始也不会太晚。

  • 至少学习四种不同的编程语言和至少四种不同的数据格式(如JPEG,
  • XML,分隔文本和MPEG)。
  • 开发至少能支持一千人并发访问的软件。
  • 开发可以扩展到超过1TB数据量的软件。
  • 参加10个以上程序员一起做的项目。
  • 做既有代码的扩展工作,这些代码至少是5年前开发的,而且无法从原始作者那里得到任何信息。 解决至少40个别人代码中的缺陷。
  • 编写支持国际化语言输入的程序,包括UNICODE的输入,以及支持两种语言以上的用户输出(错误信息,图形用户界面的文本,等等)。
  • 研究下列情形的性能特点。 无论是否存在CPU 缓存未中的情况,都能从内存中获取数据。 对比从磁盘连续块读取与随机I/O寻址。 对比大块数据与小块数据的I/O操作。 三种流行的编程语言(如Java,C/C++和PHP)。

软件业的经营之道

如果你获得了计算机科学、计算机工程或相关专业的学位或文凭,那么你就已经掌握了一系列令人印象深刻的技术技能,可以在令人兴奋和充满活力的软件开发领域施展这些技能了。但软件业的经营之道可能是你的学校没有传授给你的,软件是如何销售的? 市场的本质是什么? 销售和营销的流程如何? 在软件行业中,最成功的人都努力地获取这些流程方面的知识,即使这并不是他们的主业。其原因在于,如果你清楚地明白了流程是如何运转的,谁是你的用户以及用户的期望是什么,那么你所做的一切都会得到提升。

建立领域专长

从长远来看,职业上的成功在很大程度上依赖于你在某个领域要具备成为专家的能力:专家级的程序员、经理、测试人员或技术布道师,或一个特定技术领域的专家(如数据库、虚拟现实、实时通信、客户关系管理系统、移动设备,等等)。你需要用整个职业生涯的关注和努力才能达到世界一流的专业水平。多数情况下,你最开始从事的技术领域并不会是你终身的事业,然而,你在职业生涯头几年所学到的一切都将有利于你将来的发展。编程语言会改变(有谁还在使用FORTRAN 或Pascal),操作系统、技术平台、可编程设备等也会改变。软件行业的这种不断变化已成为常态,但是,其中的一些特定领域(如电信、游戏、图像处理、数据库)的基础知识和软件产业的运作方式的变化是缓慢的。

温故而知新

请记住,由于编程抽象化和编程接口的演化,今天的底层技术在将来会被淘汰。现在很少有人会从汇编语言编程开始自己的职业生涯,因为现代CPU 的高性能和编程语言编译器的高效率已经不需要程序员和CPU 再那么亲密。但是,那些曾经学会并掌握了汇编语言编程的程序员今天依然很厉害,因为他们更深刻地理解系统的运行机制,而我们很少有人会获得这样的知识。汇编大师可以轻松地阅读核心转储,还能看懂迷宫般的十六进制代码和注册表项来调试内存崩溃的问题,就像我们大多数人读《星期日泰晤士报》一样。但如果始终停留在汇编编程上,那就比较古怪了,虽然它偶尔会很有用,但已不是实现主要业务目标的主流技术。对于那些从汇编语言转型到C/C++、Java和其他编程语言的人来说,他们对CPU 及其与操作系统和内存之间交互的深入理解,是其技能的强大补充。他们能吸取新老技术的精华,能比别人更优雅更容易地设计、编程和调试系统。正如汇编语言曾是20世纪80年代的核心编程技能一样,如今的底层编程技术也终将会被人们抽象出来。现在掌握这些技能而获得对硬件的了解,会为将来拓展你软件职业发展提供动力。RayTomlinson是电子邮件的最初发明者。他不仅是软件界的先驱,也是少有的几个始终走技术路线的软件大师之一。如今,他仍然在做着软件项目。当我采访Ray时,他表示,在软件开发领域,变化的事情越多,共性的东西也就越多。新技术拟在简化流程却经常引入新的复杂性,更多的内存被软件的膨胀和大数据量所消耗,并且,虽然工具、平台和语言也发生了变化,但软件开发的基本原则却保持不变。

软件行业经常会出现一些新的、奇妙的东西,似乎可以用较少的人来完成目前需要很多程序员来做的事情,这样程序员就可以腾出时间去做一些其他的事情。但实际上,这从未发生过。无论你如何辗转腾挪,都只是在转化同样的问题,只是名称不同而已。困难程度从未改变, 纵然你使用不同类型的工具、不同类型的对象、不同种类的编程实体和不同语言来工作,但这些仍然是类似的东西。你仍要试图组装这些互不匹配的东西,并设法让它们能在一起工作。 ———RayTomlinson,电子邮件之父,BBN科技公司

观察领导者

你可能会惊讶地发现,在组织中,许多身边的专家们都是落后于时代的。他们还在谈论五年前的技术,他们似乎并不了解你在学校里学到的流行编程模式,也不懂得你的编程伙伴在业余时间里鼓捣的一些流行的新平台。你或许觉得解雇他们比较容易。然而,这些人做到他们现在的位置是有充分的理由的,尽管他们可能不知道你在做什么,但他们通常知道许多对软件职业更重要的东西。他们知道如何建立大型系统;他们知道代码的好坏;他们知道可以安全地走哪些捷径,而你这样做的话就有风险;他们了解软件开发的流程和软件团队的动态;也许最重要的是,如果他们已经在公司工作了一段时间,还清楚企业组织文化。通过学习这些人的经验和智慧,你将受益匪浅。你可以学习如何生存,如何更好地适应组织而获得成功,以及如何避免大部分初级程序员会掉入的陷阱(技术或政治方面的)。

着手建立你的人际关系网

利用职业生涯早期的几年在整个业务领域构筑一个人际关系网,把你将来可能会求助的人都拉入进来。请记住,这不是关于你知道什么,而是关乎你认识谁。你在职业生涯中所交的朋友和建立的关系,在将来会对你有所帮助。在职业生涯的早期,与你一起工作的很多人也是相对初级的工程师——我们通常和同辈人一起工作。你可能会误以为进入了一个无需发展人际关系的阶段,毕竟,这些初级的工程师如何才能在未来的职业关系网中用得上?但是,生命的美丽之处在于我们都在一起慢慢变老。十年后的今天,你的职业发展将会大有进步,你的同事们也会。他们中有些人可能会为你工作,有些人可能是你的主管,有些人已经离开了,去了其他公司发展或开办了自己的公司。但有一点是肯定的,你同事们的事业也会向前发展,其中一些人会取得一定的地位,他们在某时某地将能够帮到你。这就是为什么人际关系不只是一个被动接收的关系,你必须要付出才会有收获。想办法帮他人些小忙来储存一些信任和感情债。从长远来看,这些关系将推动你的职业发展。通过成功地建立一个支持你的大型关系基础,在时机成熟时你就可以做更多的事情。也许更重要的是,同时你也建立了一个能够向其提供帮助的关系人群。这是一个构建双赢局面的经典模式。

Malcolm Gladwell在他的经典著作《引爆点:如何制造流行》中介绍了社会的相互作用如何导致深刻的变化。他说,变化的核心推动力之一是“个别人物法则”,意思是说,重大变化依赖于三类人:联系员、内行、推销员。联系员拥有广泛的社会网络,并且将人们彼此相互连系。联系员跨越许多团体和界限去联系不同的人,而这些人通常是没有交集的。内行了解相关领域的海量信息并分享之。多产的博客使用者可以被认为是内行。推销员是有说服力和有魅力的人,可以激发其他人发现共通的观点。总的来说,是世界上的联系员、内行、推销员引发了变化。建立你的社交网络可以帮助你成为一个联系员。随着时间的推移,如果你也能成为一个内行和推销员,那么这个三位一体的特点将使你成为一个可以呼风唤雨的人。如果不能成为一个有魅力的推销员或拥有信息的内行,那么你可以通过一些推销员或内行朋友的帮助而取得成功。如果你在关键的地方认识足够多的人,你的交际网络会帮助你把事情搞定。特别是,如果你能为你的关系网络注入适当的回报,做些有助于他人的活动,那么当你需要他们帮助的时候,他们就可能会很乐意地给予你回报。这就是所谓的善有善报。如果你拥有广泛而深厚的人际关系网,那么你会在发展道路上受益匪浅。

你想成为哪种人

你从事软件的头几年会接触到软件开发的流程和软件业的经营之道。在这些年里,你会了解到在软件业存在着哪些不同角色,了解与之伴随的压力、挑战、机遇和喜悦。为了明确什么才是职业的成功,最重要的一件事情就是要想好你想成为什么样的人。很多人试图从技术选择上客观地思考自己的未来,但这个路径相对来说比较难分析,因为技术总是在不断变化着。另一种规划职业发展的合理方法就是环顾整个组织,观察你周围高层人士的日常工作,并考虑以下两个问题。 (1)在这些人中,我在职业生涯中最想模仿谁?我相信我会喜欢做他们所做的工作。

(2)这些角色中哪个适合我?可以想象我能和这个高级员工一样把工作做好甚至更好。

思考这些问题将有助于你开始确定一个未来职业发展的愿景。一旦形成,这个愿景就可以指导你的职业发展。没有什么是永恒不变的,随着时间的推移,我们中的大多数人会改变自己的目标。但一开始就设想你想成为什么样的人,是职业发展过程中的第一步,也是最关键的一步。

人人都需要导师

导师可以和你分享智慧的珠玑(我并不是说你看完这本书之后就需要马上找一个),可以对你的行为提供一些个人意见。你的经理可以一直是你的导师,但有一个上下级关系之外的导师将是有益的。有几个原因,可能最重要的一点是,在多数大大小小的公司里,一个经理管理着若干员工,他不可能总是像同事一样深入地看到每个员工的技术贡献。其次,导师的优势在于对编程技巧、调试策略或到哪儿去找工具和找人帮忙等方面有许多独到的见解,而你的经理可能不能立即提供现成的帮助。我在IBM的第一位导师教会了我很多编程的艺术,帮我对C语言和编程工具有了深刻的见解,这些大大提高了我的生产力。我的第二位导师教会了我关系型数据库系统及其内部架构。后来的几位导师指导我的职业发展方向和政治洞察力,有时给我极具建设性的反馈意见。没有这些导师,在IBM我绝不会有这么大的成就。一个好的导师会给你几个方面的指导:技术、组织和政治。无论你在一个小的创业公司还是一家大型实体公司,有人指点你总是有好处的。这些可能都是显而易见的,最后分享几个不那么明显的要点。

  • 你必须主动地找一个导师。不要指望有人会替你安排一个无所不知的大师,花费大量的时间照看你的职业生涯。为自己寻找一个感觉合适的、有适量的时间来指导你的人。

  • 如果指导过程运作良好,你会让导师花费不少时间和精力,特别是当你是个新人时。你要对导师长怀感激之情,并看看可以做些什么来回报他。

  • 确保你与导师之间有一个约定,通过面对面的讨论或电子通讯(即时聊天或电子邮件)让你得到定期和不定期的指导(也许一天两次,如果你是新人的话会更多)。提前设定期望值是很重要的。如果你每天都问很多的问题,而你的导师却期望的却是每三个月一次的正式会议,那么这种落差会令人沮丧并引起导师的不满。

  • 你在职业生涯的不同阶段,需要不同的导师来指导不同的方面。在早期,你可能需要他来指导你技术上的问题,或如果你是新人的话,需要他来指导你团队的有关工作流程。而随着你的职业生涯向前发展,你可能需要他来指导你的事业发展和商业战略的洞察力。

快乐孕育成功

2005年,谷歌副总裁Marissa Mayer在她的母校——她学习计算机科学和人工智能的斯坦福大学,做了一次主题演讲。在她演讲后面的问答环节,她被问到自己事业的成功归功于什么。她当场回答:“我喜欢工作。这很有助益。”

你若开心,时间就过得很快,当工作是纯粹的享受时,也很容易集中注意力并努力地工作,且会工作更长的时间。在认知和工业心理学研究领域,一项重要的研究是关于工作满意度与生产力之间的关系。直观上,我们似乎都感觉到,当我们热爱所做的事情时,就会做得更好,也会投入更多的精力和兴趣在所做的事情上。然而,工作满意度与生产力之间的关系一直并没有得到科学的论证,直到2001年由Judge等人所做的大型研究 T. A. Judge, C. J. Thoresen, J. E. Bono, G. K. Patton,“The job satisfactionjob performance relationship: a qualitative and quantitative review.” Psychol Bull, vol. 127, no. 3, pp. 376-407, 2001.才发现了二者的关系在某些工作上是紧密相关的——具体说来,就是包含智力复杂度的工作。如此看来最重要的是,为了达到最佳状态我们需要点燃激情,激励自我。这就是为什么软件工作,鉴于其复杂性,是最受工作满意度影响的工种之一。

对工作满意的话,不仅会令你工作得更有效率、更有创新性、更有热情,也会支撑你持续工作几十年。很多人认为他们是为了工作而工作,但你的工作却是一项事业,将经久不衰。在这么漫长的时间里,始终保持这种高涨的热情本身就是一个挑战,而且是很重要的。事业的成功与工作满意度是相辅相成的。成功会给你机会做愉快的事情,而做愉快的事情会帮助你更成功。

一个古老的禅宗格言说:“痛是难免的,苦却是甘愿的。”不幸的是,每一项工作都有不愉快的责任、痛苦的义务和偶尔的失败。这是软件行业令人不愉快的一面。但幸运的是,软件公司通常会提供一种环境,让员工有一些更愉悦(或娱乐)的活动,而这些活动不属于其正式的职责。如果你把大部分的时间都花在工作职责范围以外的事情上,那是错误的,甚至可以说是没有职业道德,但是你通常可以用10%~20%的时间去做工作之外的事,如果你下班后还会加点班,这个比例还可以更高。当然,什么是乐趣在很大程度上取决于个人,所以看看下面所列的事情,考虑一下你会喜欢哪个。

  • 把一个全新的技术或项目分拆为臭鼬工厂的工作
  • 发明一些专利。
  • 发表专业论文、白皮书或技术文章。
  • 在著名学术会议或在科学期刊上发表科学论文。
  • 写一本书。
  • 在有异域风情的地方举办的会议上发言(或者协助举办会议)。这样,你总有方法能挤出一些时间去海滩休闲或游览名胜古迹。
  • 帮助公司搞定了一个数百万美元的交易。
  • 主持一个工业委员会,这有助于建立一个全行业的方向或标准。
  • 指导更多的初级员工和培养下一代领导人。
  • 为同事组织跟工作相关或不相关的社会活动。
  • 为你的公司或当地软件公司联盟和大学组织一系列很棒的演讲。
  • 帮忙制作一个新的YouTube视频来展示你正在开发的技术。你不是一直想成为一个电影制片人吗?

我知道许多人已经做过上面所列的这些事情,这样做使他们更享受职业生涯。这只是随便举的一些例子,你还可以添加更多。像这些活动,就像是你往工作中投放的佐料一样。它们不是必需的,但是它们可以为你的工作带来很多的热情。看看以下这些有趣的发现。

(1)成功的人通常能够做到只用少部分工作时间和加班时间就能完成这些事。大部分的雇主对这类活动都赞赏有加,为什么不去做呢?

(2)这些事能让你的简历看起来更漂亮,并间接地促进你职业的发展。虽然这些事都不如在份内工作中取得骄人业绩,但它们能起到锦上添花的作用,使你稳固的事业看起来就像一个跨行业的领导事业。比较图5-1中Bob Smith和John Doe的简历。Bob和John有着非常类似的教育和工作经历,他们都是非常优秀的员工,但John多年来一直在花时间做一些有趣的事情。在过去的十年中,他所做的这些已经开始产生积聚效应。如果你要招聘一名经理,通过看这两份简历,谁会是你中意的人选,你会让他来参加高级职位的面试?(请注意John的简历中的“特长”部分。)如果你正在评估员工的晋升,John的优点对你的影响有多大呢?

enter image description here