如果我可以给每个工程教育增加一门课,它不会涉及编译器、门电路或是时间复杂度,而是一门介绍行业现实的入门课,因为没人教过这些,所以我们遭受了很多不必要的痛苦和折磨。
希望本文可以成为年轻工程师职业生涯的自述文档( readme.txt)。目的是填补“现实世界”运作方式与教育之间的空白,并让你快乐起来。我从“一个还算聪明,但是不自信、毫无商业经验的工程师”,耗费了十年多的时间,经受了很多的苦难,才总结出这些经验之谈。我不会把这些当成金科玉律,但希望它可以告诉你一些大学职业中心没有告诉你的事情。
90% 的编程工作来自内部软件
经济入门课程就说过:任何东西(包括你在内)的价值都取决于供求关系。首先让我们来谈谈需求方面。大多数软件不是装在盒子里卖的,也不可能从互联网上得到或者从 App Store 下载。大多数软件都是公司内部的应用程序,它们通常令人厌倦,缺乏长远考虑。但却服务于全球经济的方方面面,比如跟踪费用、优化运费、协助会计部门做预算、帮助设计新的工具、计算保单价格和识别恶意订单等等。软件解决内部问题。软件总是用来解决内部的问题,尽管这些问题往往是令人乏味和没有什么技术含量的。比如以一个内部出差费用的申报表为例。假设一家公司有 2000 名雇员,和在纸面上处理费用相比,一年可以节省 5000 个工时(平均满负荷下的成本是每小时 50 美元),一年一共可以节省 25 万美元。这家公司不在乎这个申报表是不是世上最简单的 CRUD(即为 Create、Read、Update、Delete 等四项基本数据库操作)应用程序 ,只在乎可以节省公司的成本还是可以创造额外的收入。
当你想到软件时,会认为公司开发的软件都是提供给客户使用的。但实际上你不太可能在这样的公司工作。就算你在这样的公司工作,也只有极少数程序员直接编写面向外部客户的软件。
别人雇用你的目的,是让你创造价值,而不是让你编程
公司总是出于非理性和政治的原因做事情(请看下面),但他们聚在一起做事情的主要目的是为了增加收入或者降低成本。运行良好的业务往往得益于在某一方面非常擅长的人。(可以,但不一定非要这样做。)决定再多招聘一名工程师的人,不是因为他们喜欢有一个 Geek 在房间里,只是因为增加这个 Geek 可以完成一个项目(或多个项目),增加收入和降低成本。开发优美的软件、解决复杂的技术问题、编写没有 bug 的代码、使用迷人的编程语言,这些统统不是目的。唯一的目的就是增加收入、降低成本。
彼得・德鲁克提出了利润中心和成本中心的概念。利润中心是一个组织中用来赚钱的:律师事务所的合伙人、企业级软件公司的销售以及华尔街的大鳄们等等。成本中心,就是剩下的人。人人都想进入利润中心,因为这样会带来更高的工资、更多的尊敬以及更多获得好处的机会。这并不难:一个聪明的中学生,只要看过一段关于业务的描述,通常就可以确认利润中心在哪里。如果你想在那里工作,就要为之努力。如果你不能这样,要么在其他地方工作,要么先进入公司再转换工作。
彼得・德鲁克 Peter Drucker,现代管理学之父,你可能没有听说过他,但他是老板们中的先知。
通常工程师的成本都非常高,这会触发 MBA 优化成本的本能。于是就有了类似外包这样很棒的想法,“用一个低工资国家的成本中心,替换掉这些相当昂贵的成本中心,这些昂贵的成本中心并不能给我们带来什么。”(提示:如果你读到这个指导后面的部分,你完全可以忽略外包,不用把它当作职业生涯中的威胁。)没有人会外包利润中心。只有在 MBA 开的玩笑中才会发生这样的事情。这就好比建议用软盘保存一堆副本,用来代替源码控制系统。
不要自称为程序员
“程序员”听上去“只会在一台复杂的机器上干一些难懂的事情,而且成本奇高。” 如果你自称为程序员,有些人已经在想办法把你解雇掉。有一家公司叫 Salesforce,工程师熟知他们所提出的“软件即服务”(SaaS,Software as a Services)。他们的口号就是“没有软件”,他们向实际客户灌输这样的观点,“你知道你们内部的程序员在做什么吗 ?如果你使用 Saleforce,你可以解雇一半的程序员,并把节省下来的一部分钱作为奖金放进你自己的口袋。”(顺便说一句,这样没有错。你效力的公司会让别人失业。如果你认为这不公平,回到学校爱干嘛干嘛。)
正确的做法是,你应该把自己描述成与增加收入、降低成本有关系的人。如果你还没有机会做到这些,应该说明你有能力去增加收入或降低成本,或者有这样的想法。
很多拿着不错薪水的编码专家,并不把他们自己形容成是以码代码谋生的。华尔街的宽客就是第一个和最著名的例子: 和那些没有帮助的人相比,他们使用计算机和数学作为杠杆,可以更快更好地做出后果严重的决定,这些决定可笑的地方在于“我们公司赚了数十亿美元。” (译者注:对金融衍生品的讽刺?)年景好的时候,成功宽客一年的奖金,要比同样才智的工程师干十年或一辈子赚的钱还要来得多。
宽客(quant):指一群靠数学模型分析金融市场的物理学家和数学家。他们相信数学的精确性是分析最复杂的人类活动的基础,还曾用分析神经系统的数学技巧来赚钱。也被称为金融工程师,他们将自己戏称为“矿工”。
同样就算你认为 Google 看上去是一家对程序员友好的公司,那里有程序员,也有一些人对 AdWords 点击率 提升 1% 都相当关注。(提示:证明价值是数十亿美元。)我最近偶然发现一个家伙的网页,他上面的履历是这样写的,“编写了后台计费代码,Google公司 97% 的收入,与我的代码有关”。他现在是一个天使投资人(“有钱人”另一个礼貌点的称呼)。
不要受制于你的技术栈
我最近在 Twitter 上问了一个问题,对于职业生涯,年轻工程师想知道些什么。很多人都问到如何学习某某语言或者协议栈。这些不重要,请往下面看。
Java 程序员比 .Net 程序员更能赚钱吗?任何把他们自己限定成 Java 或者 .Net 程序员的人已经是卢瑟了,因为首先他们是程序员(理由参考上面),其次这种限定使得他们自动被排除在世界上大多数编程工作之外。现实生活中,学会一种新语言只需要几个星期,然后再过半年到一年,你就会变成老手。那时,根本没人在乎你以前用什么语言。早在 2010 年 3 月,我还开发了Java Web 应用程序的后台。相信我,没有人在乎那些。如果一家 Python 公司正在寻找一位技术专家为他们赚一大笔钱,虽然事实上我没有写过一行 Python 代码,但这也阻止不了我。
天才程序员是很少的 ―― 可是需要天才程序员的工作机会却很多很多 ―― 大多数场合都是需求远远大于供给。Matasono 公司的人都在使用 Ruby。如果你不会,只要你是一个优 秀工程师,他们也会立刻录用你。(重复一遍,所谓”优秀工程师”,就是你的履历上有一连串增加收入、降低成本的记录。)Frog Creek 中大多数人都使用 Microsoft 的协议栈。我甚至不会拼写 ASP.NET,但他们还是会雇我。
有些公司的人事部门,会根据某个关键词过滤简历。虽然这样的公司根本不值得去,但是如果你真的想过这一关,也很容易:投入几个晚上和周末,在你当前的项目中设法用到这个关键词,然后再把它写进简历就行了。想在一家 .NET 公司累积 Ruby 的经验?用 Ruby 完成一个一次性的项目,你就是一个专业的 Ruby 程序员 ―― 你编写了 Ruby 代码还赚了钱。(你乐了吧?我在一家 Java 公司干过类似的事。有个一次性的项目给公司赚了 3 万美元。不出所料,我老板乐坏了,甚至都没有问过要交付什么。)
同事和老板通常不是你的朋友
你有很长时间和同事们在一起。最后你可能会和他们中的一些人成为很亲密的朋友,但通常三年内你们就会分开,除了保持友好的关系外,你不会再邀请他们出去共进晚餐。他们也将同样对待你。任何见过你的人都会认为你是个好人 ―― 这是道德层面的事情,对你的人际关系有所帮助 ―― 但是不能由此妄想所有人都是你的朋友。
比如在一个面试中,你和一个 28 岁的友善的家伙相谈甚欢,让你感觉他就是几年后的你,但他还是处在一个交易中。你不是他的朋友,你只是一个工业流程的输入,他会为公司用最少的钱去雇你。他用魔兽世界的话题跟你套近乎,其实是在建立一种职业关系,他会尝试(当然是绝对符合职业道德地)做那些你真正朋友不会对你做的事情。比如试图说服你接受几千美元的薪水,或者让你心怀内疚得在公司里待更长的时间,而你原本可以和真正的朋友在一起。你还有其他一些友好和有职业道德的同事 ―― 他们建议的东西会损害你的利益,从“你做的那个项目里面可有我的功劳”(措辞上可能不会有这么多单词)到“我们应该做这件事情,它对我的职业发展有帮助,而不是你的。” 当这些事情发生时,不要感到惊讶。
彻底高估了竞争对手的平均水平
实际上,很多被雇的高级工程师不会实现 FizzBuzz 序列。读到这里你泪流满面了吧。这里有个关键点:对于那些公司而言,你已经足够好了,但你自己却不这么认为。他们会雇用牛人,但他们也会雇用普通人。
“阅读招聘广告→发送简历→参加面试→拿到Offer” 这个不是被录用的常见途径,只是个意外。
大多数职位从来都没有对外公布过,就像在市面上很少能找到不错的候选人一样(看这里)。在大家一起喝啤酒时,这个职位的信息候就传播出去了,有时候还需要通过邮件撮合一下。公司里做决定的人要找一个人。他告诉他的朋友和有业务往来的人。他们中的一个人刚好知道这么一个人 ―― 家庭成员、大学室友、会议上认识的某个人、以前的同事之类的。做了一些介绍,大家见了个面,这个工作就谈得八九不离十了。接下来简历、人力部门、正式录用之类的开始进场了。
这可能是你真正想得到的工作。“一个成功创业公司的首位员工”这对很多 Geek 来说有一定的吸引力,但事实上他们也找不到地方去发求职信给人力部门,部分原因是两个人的创业公司也不太需要成立人力部门。(备注:你可能不想成为创业公司的首位员工,而是最后一位合伙人。)想在 Google 谋得一份工作?如果Google 里面有人喜欢你,他们有一个正式的流程可以助你一臂之力。(如果这个 Google 的人很喜欢你,有很多非正式的方法可以缩短这个流程。比如:买下你工作的公司。当有很多钱的时候,解决问题也就有很多有趣的选择。)
私底下雇用有很多原因。一个原因是工作机会公开后会收到上百份简历(特别在这种经济环境下),但很多人其实并不适合这个职位。另一个原因是其他公司在招聘方面的惨痛经历,除非你对应聘者很了解,不然你很可能招进一个连 FizzBuzz 都搞不定的人。
社交网络(人际关系)不仅仅是 TCP 数据包
社交网络/关系网有两个意义,一是遇到在某些方面可以为你提供帮助的人(反过来也一样),二是给他们留下良好的影响。
有很多场合可以结交其他人。行业里举办的活动就是一个不错的选择,比如会议或者学术座谈会。用户组是另外一个选择,用户组里的人和行业活动上的人完全不同,而且有用得多。
尽量帮助别人,这是正确的做法,人们会很在意那些过去帮助过他们的人。如果你帮不了某人,但知道谁可以提供帮助,请介绍他们相互认识。如果你做得足够好,双方都会感激你并且愿意在以后的日子里为你提供帮助。
你可以在互联网上结识其他人(天呐,你能吗?),但是惯常思维让我们觉得面对面的交流会更好一些。我曾经在网上结识过不少牛人,过不了多久我就会去拜访本尊。即使通过网上的交流彼此了解颇深,甚至“因为对方的一个建议发了财”,见个面握个手也会让关系更进一步。发博客和加入类似 HN (译者注:HackNews)这种业界灌水区是很有必要的,但要通过它们能让大家见面交流。
新闻热点
疑难解答