程序员蝶变:底层软件工程师的一次冒险经历
Bill(不是他的真实姓名,我模糊了一些信息来保护他的身份)是一位东海岸的软件工程师,在这个故事发生期间(2011到2014年),已经快到30岁了,他想知道自己能否进入到更高级别的就业市场,为了能非常准确的评估这一点,他在两个大体相当的公司(同样的规模,同样的声望,同样位于美国西海岸)分别申请了不同级别的职位,一个是作为高级软件工程师,另一个是作为数据科学的副总。
Bill之前是一名华尔街的金融工程师而且还有一个副总的头衔,要知道副总在投资银行中只是一个中级的,非管理性的职位。他现在的头衔是资深软件工程师,大体和主管相当。Bill教过几次课并指导过一些实习生,但是他一直都不是一个正式的管理者,所以他来向我咨询,如何能在VP级别的职位申请中出现更多“管理方面”的东西。
实验
他的首要问题是如何才能在下一份工作中有一些“管理方面的经历”。我当时有些不知所措,谈到直接经历,我的第一想法是“在你拥有它之前作假”。回顾思考一下他的简历,”实验”这个词出现在我脑海中,我能够将Bill这个优秀但并不是很杰出的数据科学家兼软件工程师转变为一个管理者吗?首先有一个好点的消息是我们没有必要去做太多的改变,Bill在投资银行中副总的头衔应该保持不变,而将资深软件工程师变为主管也不会让人觉得是不诚实的,因为这是一个横向的调整,更有可能还是一个降级,在双轨科技公司工程师的梯子比管理层的梯子更难爬一些。
Bill”管理简历”中的一切都足够接近真实,很少有人会认为这是不道德的。我们提升了他的社会地位以及预计在那个社会层次所必需的管理文化的可信度,而不是技术资格。我们将技术领导转变为“真正”有权利的领导,这是唯一改变的地方。我们花了数个小时来确保简历的真实性,Bill和我都不想因为开展这次实验毁了Bill的职业生涯,只是因为实验的完整性需要这些改变。
事实上,我们让这份管理简历很有技术性。BIll的经历大部分是做为一个实现者,所以我们希望保持这部分的真实性。稍后我会谈到这次实验的结果,他作为一个实现型经理的重塑会有两个积极的副作用:第一,作为经理他没必要弄脏自己的手,如果他是一位管理者的话,他做事情会得到很多表扬。第二,和第一点相关但是更强大,就是他不再为自己不体面的项目或一个时期的低技术而辩解,相反的,“我现在在一个蹩脚的项目上”,突出了低地位,他的故事演变为“没有人能够完成它,所以我不得不弄脏自己的手”,这是一个高地位,管理方面的借口,对于一个花费了6个月差点成为职业杀手的项目来说,而不是必须去解释为什么他没有设法得到高质量的项目分配, 当去问一个工程师时,他或许会对他所做的给出一个非常可信的解析,因为他没有必要去做这项艰巨的工作,这使他看起来像个英雄而不是零。
那是个什么项目?事实上和Bill的这个故事相关。Bill维护过一块遗留的老代码,那块有4万行的代码本质上在执行一个逻辑回归,这个自定义模块一直存在,却没有用当前统计软件代替的理由是:多年来来自业务的大量需求被加进来,而且几乎没有一个自定义的调整是逻辑相关的,它们都得包含在源码中,现在这个项目因其自身复杂性的负担处在崩溃的边缘。这类项目对于工程师来说是职业杀手,因为在做这种项目过程中学不到其他(平台的)可用的技术,而且这种维护的工作没有一个明确的结束或“胜利点”。对Bill的技术简历来说,我们必须要让这个蹩脚的维护工程看起来像是机器学习。对于管理简历,“监督关键业务遗留模块的维护”这个事实已经足够了。
事实上有人可能会质疑Bill的简历是不是更诚实以及符合道德,因为它在纸上太不真实了。是的,我们夸大了他的社会地位并且给了他一个管理性的头衔。然而,我们并没有在“技能”那项下列出他没有接触过的技术以夸大他的技术能力。到了某个年纪,作为一个工程师出售自己往往需要:
A、你只从事有趣的工作,而不是去做一些可以称为职业杀手的垃圾项目,并且玩些政治游戏也是需要的。
B、引导你将来的老板对你工作能力的信任。
C、或者花费大量的时间在小项目上,这又是A和B的结合。
这个实验合乎道德吗?我的答案是肯定的。当有人问我是否可以捏造职业经历和简历时,我通常会这么说:如果一个人当前的状态(能力和才能)和所修改后的一致,美化之前的社会地位是没有问题的。在某种形式上就像是讲房子出售给一个迷信的买家之前把地址从13改为11,被抹去的事实是他曾经是“13”号,并不会给其他人造成任何伤害。另一方面,从长远来看在技术上作假是不道德而且有害的(这是一个职业欺骗,其他人会被误导别人做出一个和这个人当前状态不一致的决定,在这种情况下是有害的),虽然我认为这么做是一个坏主意,但是我不会对那些在简历中伪造时间和头衔的人扣上一个道德问题的帽子,只要他们美化的是他们之前的社会地位而不是一些如技术能力之类的硬货。
现在,让我们来谈谈这个实验是如何进行的。
面试A:作为一个软件工程师
Bill面临着5个小时的技术面,其中3个比较好,一个表现平平,因为它关注JVM的实现细节,但Bill的经验几乎都在C++以及一点OCaml爱好。最后一个面试听起来非常糟糕,是和数据科学副总进行的面试,BILL未来的老板,他迟到了差不多20分钟,给了他一个面试问题,这个问题的正确答案需要花费数月甚至数年的内部试验与纠错才能被发现。这是一个”我要证明我比你聪明“的面试。
事后,我告诉Bill不要担心最后那个面试。通常企业会给候选人一个尚未解决或者很难解决的问题,没有期望候选人能在一小时之内解决。但是这次我想错了。
我在A公司有认识的人,所以我能够理解情况,Bill的反馈是3个非常好,1个平平,一个不好,结果和他自己的预期非常一致。最差的是那个副总的评论”别的角色或许很优秀,但不是在我的团队”.显然副总对于他花了差不多一个小时和一个没有PHD学位的人谈话非常不高兴,因为Bill没有更高的学位,副总认为一个人足够优秀到加入他团队的唯一方式是在40分钟内反向编译出公司的核心,我不认为这任何人都可以做到。
我们来总结一下,Bill出色的通过了5个面试中的3个,其中一个面试官,几个月后想招聘Bill到他自己的创业公司。第四个面试马马虎虎,因为他不是一个Java专家,但结果也是一般。第5个失败了,原因是他不知道需要多年研究才能发现的内部黄金算法。当我直接问那个数据科学的副总他没有雇佣Bill的原因(他并指导我认识Bill,也不知道这次实验),得到的回答是“我们需要的是能够旗开得胜的人”。显然,当创业的人试图欺骗政府改变移民政策是只能是因为“缺少才能”,言下之意就是“我们不投资于人”。
或者,就这一点说,软件工程师缺少必要的社会地位来让别人投资。
面试B:作为一个数据科学经理
几周后,Bill在一个大体相当的公司面试了一个副总级别的职位,可以直接向CTO汇报。
值得提的是我们没有做任何事使得bill的简历比公司A时在技术上更令人印象深刻。如果有的话,我们在讲一个“坦白正直的人”的故事时通过适度地夸大了他的社会地位,使得他的技术故事更加诚实。我们没有掩盖低技术活动的时期;他是一个管理者,自己完全可以解释这些。
BIll进行了4个面试,虽然问题是一些行为模式,并且对于很多技术人员来说答起来比较困难,但是Bill 觉得这些问题非常简单。对于”在自己想做的工作和何时去委派之间有一个权衡”这个问题,我给了他一个比较好的答案。它指出了一个人拥有管理的地位的人(有委派别人的资格),也要对工作倾注热情和勤奋,这个答案可以适应几乎任何“行为模式”的面试问题。
Bill身高6尺1,相貌在白人男性中属于中上,并且看起来像一名经理。我们做的工作似乎是得到了回报,在每个面试中,面试官在Bill之前10分钟就到了。通过以管理者呈现他自己,并且他起来很像,他有了一个比终身软件工程更加容易的职场。他已经是“俱乐部的一部分(管理层)”,并且平等的就他是否要加入这个俱乐部的某个特定部分参与双向讨论,而再不是作为程序员展示代码来进行面试。
Bill通过了,不同于申请一个典型的工程师职位,这里没有任何履历覆核 。CEO对他说:“我们知道你是一个不错的人,我们想尽快录用你”,和作为工程师具有7天offer期限不同,Bill有两个月的时间来做决定。他没有提出要求就有4个星期的假期和实实在在的股权(每年可获得大约薪水的75%利益)。
BILL给我打电话询问一些搬迁的事情,说实话,我估计这次交易可能不会成功。搬迁问题使得很多工作邀请支离破碎。同时也是一个公司把某个人是否看作关键成员,或者只是一个填补一个岗位的测试。CEO开始说:“在深入了解之前,首先申明我们是个初创公司…”。
这个公司雇员人数超过100名,所以并不是一个创业公司,但是我暂不考虑这一点。我准备要骂人的时刻,因为”我们是一个创业“通常会是一个坏消息的前兆。
“…所以我们将会提供 搬迁费,两个月的临时住房,1万元的机票预算可以探望东海岸之外的任何家人,但是我们不承担房屋的交易损失和房产经纪人的费用”。
Bill正在得到一个道歉,因为CEO不能提供一个全套搬迁费用。(“我们现在还没有那么全面。”)对于一个软件工程师,“搬迁”通常是3000美元的一次性打包。因为“软件工程师”,对于管理层来说就是“22岁具有少量财产,住在父母家的无知男性”。另一方面,如果你是一个管理者,你会被视作需要考虑搬迁到这个国家另一部分的真正的人。
这非常有趣,我一直在听,想知道当你一旦“进入那个俱乐部”后结果会有什么不同,CEO和BIll平等的谈话,没有那种家长式作风,给出一个“这个对你职业生涯很有好处”的权威指导。这种平等的语气是一个软件工程师绝对不会从一个100人公司的CEO中得到的。
分析
Bill有着超人的记忆力,每次面试结束后他都会记录大量的笔记,所以有很多资料来分析这次社会学的实验。它教会了我很多,在A公司,BIll申请的是高级软件工程师,他被认为“合适”程度开始有90(只有90,是因为因为他没有博士学位和斯坦福背景)。但是所不知道的一切都是掉分的,没有Spring和Structs方面的经验,减5分; 不熟悉公司的黄金算法?不是一个真正的“数据科学家”,减8分;没有Hadoop 经验?减6分。Bill在他所不知道的一切以及需要多少工作才能让他快速成长成为一个可靠的下属上被评判。
B公司是一次完全不同的经历。BILL从70分开始,但是他所知道的一切是都是给他添分的。他能够说清楚逻辑回归和最大似然法?加5分;而且他还实际实现过他们?加6分;他懂得OCaml?加5分。他所知道的一切都对他有利,我认为他还通过不相关的“有趣的人”有所加分,比如说他的旅行经历。
当一个程序员到了一定的年龄,他知道很多东西,但是同时也有很多的东西他不知道,因为没有人能够知道这个行业所发生的所有事情,从70分开始从你所知道的事情获得加分,远远比从90分开始由于你所不知道的事情得到减分好,除非你在申请一个初级的职位。
这整个问题不仅仅是一个人对技术的掌握程度。作为程序员,我们习惯了学习新技术,这是我们所擅长做的事(即使一毛不拔的商人讨厌投资训练我们)。这是一个社会地位的问题,当一个人在玩工作游戏时,为什么地位会他妈的如此重要,远远比忠诚,能干,勤奋重要。
地位的高低并不意味着被喜欢或不喜欢。有些人被人喜欢但是地位很低,有些人不被人喜欢但是地位却高。通常来说,在工作中拥有高低位比受欢迎更有用,更重要。显然两者拥有最好,但是受欢迎地位低的人在垃圾项目中,永远得不到进步。不被人喜欢地位高的人,最坏的情况下也能得到遣散费。正如Machiavelli所说,“如果你两者不能兼备,被人敬畏远远比人喜爱更安全”,人们的喜好会随着时间变化的,但一个地位高的人不大可能会让他人对自己不利。
此外如果你地位低,人们最终会找到不喜欢你的理由,除非你不断地牺牲自我以换取别人的喜欢,甚至用这种方式耗尽时间。地位高,人们会找喜欢你的理由。地位低,你的缺点会被首要关注,你的优点会被视作不重要的,或许还会经过“是的,但是”之类的反驳将积极的方面变成负面的(比如说“是的,他在Clojure方面很擅长,但是他只不过是那些动态类型方面的牛仔程序员之一”,“是的,他很擅长Haskell,但是那只意味着他不过是那些静态类型方面的白痴之一”,“是的,他是一个很好的程序员,但是她看起来不像是团队中的成员”)。当你地位低时,你最好的策略是不被人看到,注意到的,因为即使你优秀的特质也会伤害到你。你想要保持清白,等待一种均值回归现象把你带入中间阶层,在那里,受人欢迎会帮到你,然后过些时间,会把你带到中上层或上层。
当你地位高时,那情况将是相反的。你不用努力保持自己的石板空白,实际上所有对你有益的事情会被写在上面。人们会夸大你的优点,忽略你的缺点(除非这些缺点是极坏的并且危险的),你从70分开始,人们会寻找方法来给你增加另外的30分。
程序员的热情
我一直觉得程序员的社会地位低,上面的实验也支持这个观点。显然,这些都是一些事迹而不是数据,但是我认为我应该着手给“软件工程师”的低社会地位一个严格的定义。
在当前经济和市场情况下,程序员的工资到底是低了还是高了,经常会有这样的争论。由于这种因素是可变的,不能够准确的衡量,所以,这种争论最终会以主观感受结束而不是一些(客观)技术上的支持。一个人的缺点被关注还是积极的优点被关注—使用这种地位的技术观念,我们有方法不通过比较一个人的薪水和他们应得的工作条件来评估程序员的社会地位。如果你所处的位置人们强调你的错误忽视你的成就,那么你的社会地位就低(即使你每年挣20万美元,那只意味着裁掉你的计划将会很快到来)。如果你所处的位置和这个相反,那么你拥有一个高社会低位。
从这个角度看,程序员社会地位低的事实,不能够再清楚了。我们永运也不会付给一个软件工程师“理想下正确的”“公平的价值”的薪水。可以看到的是技术人员的成就在他们所工作的企业中很少被提到,但是他们所犯的错误却被着重突出。我曾经在一家公司被告知的第一件事是4年前由一个人造成的生产中断,那个时候他还是个实习生。(为什么一句话也没有提那个让一个实习生造成事故的经理?因为那位经理的地位高。)问题的很大一部分原因是程序员向来习惯于胜过对方(见:feigned surprise)以证明他们具有更优秀的学识,能力与智力。从外部(即,从我们所为之工作的企业经营者的角度)来看,这些无聊的比赛使得双方都看起来愚蠢和不足。程序员通过稳妥地降低彼此的地位,毫无闪失地降低了整个群体的地位。
曾经有一段时间,或许离现在有20多年了,当时的硅谷是不同的,工程师掌管着局势,技术人员互相帮助,程序员工作在高度自治和充满鼓励的研发环境中。套用一个研发车间的内部标语:坏的创意是好的,好的创意是非常棒的。硅谷是不合群的人的爱丽丝岛(超人狗,是个秀),在“牧羊犬”的领导下企图远离主流的MBA文化(这种文化能够摧毁行业的创造力)。那个时期结束了,旧金山加入到了由波士顿,纽约,华盛顿,和洛杉矶组成的“paper belt”(根据Balaji Srinivasan的术语,战后工业和基建系统非常完善的区域)。风险投资转向好莱坞那些丑陋的人,硅谷开始成为自身成功的受害者。海湾地区的房东使得这个程度更大了。从MBA文化的据点如麦肯锡和高盛出来的一些失败者找到了竞争力更小的舞台,在那里他们可以(不受惩罚地)无所顾忌地管理书呆子。如果你还不够优秀到在银行担任总经理,你去西海岸成为一个风险投资创始人。在这种硅谷新秩序下没有胜出地其中一群人就是软件工程师。房租涨得比他们地薪水还要快,他们逐渐远离了创新的同伴,而成为MBA文化失败者糟糕思想的实施者。这是我们现在所处地位置。
那么发生了什么事?难道硅谷新的财富吸引作恶者是不可避免的吗?或者是可以避免的?事实上,我认为这应该停止,认识到我们现在的处境。有没有可能在其他地区复制硅谷地成功,而且当资金出现并注入到其中时,我们的地位和自由不会丢失?我想是这样地,但是我会用另一篇文章来解释为什么我们可以保持优势以及用我们的方式使用实用的策略保持游戏公平。这是一个大的话题,和我在这篇文章中试图表达的相去甚远。
地位的丢失是一件很让人悲伤的事情,因为科技本来是我们的场地,我们熟悉电脑和软件,以及算法基础,但是这些拥有MBA文化的侵入者却不懂。我们应当拥有优势和保持一个高低位,但是我们却败了,为什么?这里有两个彼此相关的原因。
第一个原因是我们缺少“牧羊犬”。牧羊犬,在这里指的是一个好斗强势有能力保护善类的人。一只牧羊犬能够驱走捕食者进而保护羊群。牧羊犬不会挑起战斗,但是却会以它们希望的方式结束战斗。程序员不喜欢“搞政治”,即使他们自己的同类卷入到了办公室政治中,他们也很讨厌“搞政治”。结果就是我们没有太多的牧羊犬保护我们免受拥有MBA文化的狼群的入侵。如果有人学习一些保护善类的技巧,结果往往会不同。
第二个原因是我们允许别人用“热情”来对我们不利。当我们喜爱我们的工作时,工作会非常努力(我们愿意让它被人知道,我们工作得非常努力)。但是这造成了两个方面的负面影响:第一它表明,如果我们不喜爱我们的工作,我们会和其他人一样对工作不尽全力。管理层通常会有一种政治家的城府不会随便表现出他们是否喜爱他们的工作,除非是他们非常信任的人。程序员,相反地,对待自己工作的态度非常明显。这意味着那些对工作显得很高兴的人不会得到应得的(他们工作的很努力)升职,因为管理层觉得没有必要去奖励他们,而那些对工作显得不那么高兴的人就会因为潜在的“态度问题”突出在咄咄逼人的管理层面前。第二个负面影响是,对工作没有热情是一种犯罪,尤其在创业公司,我们是不被允许把工作当作“仅仅是个工作”,并且不应该仅仅在给予超常报酬时才付出超常的努力。我们不被允许去“搞政治”保护自己,我们应该充满热情地免费干这个工作。
大部分人并没有意识到正是这种强制性的“热情”文化降低了我们的社会地位,因为它鼓励我们无理由,不计条件的拼命工作。失去地位最快地方式是接受当前的低地位状态。比如说,程序员经常会在人手不足时过度工作,这是一个糟糕的事情(那些高官不相信我们,所以我们通过加班证明给他们看),允许人手不足的情况存在,这样做就证实了整个团队的低地位。
管理层是比较机智的一群人,当不到提升或应得的酬劳时,他们会对工作失去热情。他们的这种态度并不是可憎的,他们不讨厌这种态度,但是也不会试图去掩盖它。他们不会给违背他们兴趣或降低了社会地位的项目或公司付诸于真正的努力,他们也不会为了成为“热情的人”而对自己不利。他们希望自己被看作是一个极其能干的人而不是可以无条件牺牲的人。这就是他们和我们的不同之处,管理层一心为自己着想,并且对事实相当开放。相反地,程序员却因一些形式的自我牺牲自居为英雄:比如说牺牲周末来交付项目,最后被取消了;或者在没有搬迁费的情况下搬到旧金山,因为他“真的相信”那个他甚至都不能连贯描述的产品,并且他还会拥有百分之五的股份。
管理明白互惠性,他们付出恩惠来赚取恩惠,但是不会去做牺牲自我。当“工作”不再爱他们时,他们也不会掉进“对工作的热爱”的自我幻觉中去。他们不怕“搞政治”,因为他们认为工作主要是政治,只有那些能够负的起对政治漠不关心的人或求同的人才是可信赖的政治赢家,但是直到某人在哪个阵营,他不能够再幻想。
如果程序员想被认真对待,我们应该被认真对待,我们当然想要这样。我们必须对我们的妥协做出反思并且开始修补。甚至这是“政治性的”。我们应该停止吹嘘无意义的自我牺牲为了最终的是别人的事情,开始为我们自己以及我们的价值发声。