不是每一个程序员都能成为优秀的软件工程师。在过去的6年时间里,我在Ooyala、Quora和now Quip这3个创业公司面试过许许多多挺有发展潜力的“种子选手”,他们都有着5年以上的工作经验,并且曾为类似于谷歌这样的顶级技术公司服务过,但是就是搞砸了面试。毫无疑问,这些应聘人员都是不错的软件工程师,并且,他们甚至可能很擅长他们目前的工作。我之所以否决他们,只是因为我不认为他们能成为一名优秀的软件工程师。
我多年的面试、培训和指导经验告诉我,具备一些特殊的品质能让软件工程师更容易在创业环境中取得成功。并且,这些品质在初创企业比在一个更成熟的公司更为关键。因为在一家初创企业:
- 1.对产品、软件系统、团队及其文化有一个更为深刻的认识。
- 2.成功更依赖于团队的表现,而非你自己。当然,如果在一家更大更成熟的公司,你的出色表现可能会成为你向上爬的踏脚石,但是在一家又小又新的公司,这根本无足挂齿。
- 3.时间是关键因素,一方面是因为初创企业大多没有盈利,另一方面则是相较于那些盘根错节根深蒂固的老牌子公司,敏捷是他们最大的优势。时间有限就意味着你必须马不停蹄、加班加点,不能拖拖拉拉磨磨蹭蹭,也没有太多的时间供你挥霍在需要解决的问题上。
我曾经有幸合作过的最有效率的软件工程师,有着熟练的技术和卓越的决策能力。他们大多内涵以下7种特质:
1.系统调试技巧
编程很大一部分时间其实是花在调试上的。有用户报告紧急问题,尽快将其修复;服务器的CPU出现负载高峰,尽快找出原因;数据莫名遭到破坏,尽快找出罪魁祸首,等等,都是你的工作。而良好的调试技巧则能让我们干净利落地解决这些问题。
在调试时,我们应该用一种科学严谨的思维看待问题:先假设出错的地方,然后用最有效的方法或者最小可重现的情况去验证。此外调试过程还需要涉及各种的工具:发现瓶颈的分析器、单步执行代码的调试器、缩小回归原因范围的git bisect、交叉分析现状的UNIX命令行等等。
不过,调试的应用范围不仅仅局限于技术领域。如果产品的增长率和使用率趋于平稳,我们该怎么假设和测试用户的行为以调试未来目标的重心?如果一个团队完不成他们的项目目标,我们该怎么调试才能知道导致项目流产的根本原因是技能不足,团队沟通不畅还是别的其他原因?招聘有的时候并不能尽如人意——你也知道,大家对于你是如何调试的过程并不能一目了然,不是吗?(关键:先从数据入手)
2.勇于面对未知
作为一名软件工程师,你需要经常专研那些又大又不熟悉的代码库:可能你需要好好研究你正在使用的那个开源工具的代码,才能随心所欲地挥洒自如;又或者你需要搞清楚其他团队成员写的代码,因为他没有修改时间等等。所以,快速驾驭大型代码库和精通相关区域的能力显得至关重要。而这种能力大部分来自于经验,通过阅读过大量代码积累的经验。还有一小部分则需要靠我们熟悉能搜索代码库、跳转到相关部分的工具了,以及会查找有关提交历史中的版本控制——这些捷径都能减少我们去了解新代码所需的时间。如果是在更为成熟的公司,这种勇于面对未知的精神也能让我们受益匪浅,不过不同的是,我们往往只需要专注并精通一部分代码库就能成果斐然了。
当然,其他非代码领域有时候也需要你去探索。软件工程师常常需要接待客户、与销售人员讨论客户要求的可行性、给新的工程师培训,以及其他领域的很多你甚至完全没有接触过的事宜。在这些经历中成长,会让你受益无穷。
3.对决策的务实态度
可能在一家大规模公司,在代码审查和单元测试坚持己见有助于改善组织平衡。但是在一家初创公司,务实更重要,因为这能让团队快速完成任务。在这里我所说的务实指的是,知道什么时候应该积极辩论,而一旦有了决策,即便你再不同意,也能一丝不苟地作为团队的一份子认真执行。我曾经看到过因为编码风格而相互争执的现象,一个说在源代码起码得有80,100,或120个字符和大括号,而另一个觉得应该另起一行。呵呵。我深深地觉得,我们还不如把这些宝贵的时间和精力用到更重要的决策上。
对决策的指导启发式评估应该侧重于“是否最终能增加团队成功的概率?”。很多因素都会对这个问题产生影响:产品的选择、架构的侧重点、团队的文化、人才结构,等等。我们在决策前最好限定讨论的时间,然后坚决执行,各抒己见。
4.善于运用工具
工欲善其事,必先利其器。工具的合理运用能让我们节约大量的时间,而时间则是我们最重要的资源。高效的工程师常常是那些善于利用工具的人,而这一点在创业公司尤为重要,因为这里的时间更紧迫。一些大型的组织可能会有专门的工具团队。而在初创公司,你善用工具的能力越强,完成的任务数量就越多。如果这些工具也为其他团队成员所接受,那么团队生产力将会发生乘数效应。
5.牛逼的多面手
初创企业早期出现的很多问题其实并不需要很专业的知识。具备的技能越多,在解决问题时遇到的瓶颈就越少,哪怕我们只是对这些技能有一个最基本的了解,还在摸索熟悉技能的过程中。如果前端Web工程师也装备了基本的服务器技术(server skill),那下次再遇到与此相关的问题就不必去请服务器工程师在百忙之中拨冗相见了。而后端工程师,假如会一些基本的HTML、CSS和JavaScript技能,就能将他所制作的工具设计成一个Web界面,以方便其他团队成员使用,从而不必因为缺乏Web设计师而裹足不前。一个成长中的工程师,应该是那种能顺利使用基本的数据分析工具分析实验数据,而不必受制于数据分析员的多面手。
不过,有一种更欢迎“专家”的例外是,如果是在利基、重技术的环境里,例如启动数据库,那么拥有精深的专业知识工作效率会更高。而且,随着创业公司的发展,对于博而不精的多面手,越到后期,能取代你的人就越多。
6.保持玩家心态,而非受害者心态
在Fred Kofman的《Conscious Business》一书中,他描述了人们对待问题采取的两种不同态度。可以是受害者心态,怨天尤人,责怪他人的不是(项目时间太少、产品推出不当、以及和队友发生争执等等),通通归咎于外部原因。另一种就是玩家心态,审视自己的能力,一旦确定能做补救,毫不犹豫地贡献自己的能量。虽然短时间内,受害者心态能抚慰我们受伤的心情,但是从长远角度看,拥有玩家心态的人才能不断进步与发展。
在创业公司工作压力是很大的,并且随着压力程度的增加,人们往往不但不能勇于承担个人责任,反而很容易陷入互相推诿以逃避责任的怪圈。而这样做,我不得不遗憾的说,最后终将导致失望和解聘。
7.不断学习与回顾,持之以恒
研究发现,只要我们有足够的激情和动力,上述种种品质通过学习和培养都是可以后天养成的。而学习这些技巧的所有能量来源于一种叫做“坚忍不拔”的品质。Angela Lee曾在她的TED演讲《The key to success? Grit》(《成功的关键:坚持》)中,提及这个概念:
坚忍不拔是一种专注于长远目标的激情和毅力。坚持梦想,坚持未来,不是一天两天,也不是一周两周,更不是一个月两个月,而是持续多年,不畏艰辛、勇往直前,为了目标而奋斗。
如果我们也能拥有这种坚忍不拔的品质,愿意投入时间回顾自己的所作所为,那么就能发现自己的薄弱之处和需要改进的地方。然后随着时间的推移,不断进步的你必将会成为一个更为优秀的软件工程师。在早期如果能得到大咖的指点迷津,尽早行进在正确的方向,也能让我们走的更远。
上述这些技能即便是在更为成熟的公司也是能助你一臂之力的,不过在初创公司发挥的作用更大,原因么,上面也有提到,因为初创公司的时间更紧凑。当然,并不是说不具备这些技能就不是一个好的工程师了,这只能说明,可能你不大适合这种创业环境。但是,如果你立志要成为一个优秀的软件工程师,不要让上面这7点品质限制你的发展。那么,从现在开始,写个计划学习和提高这些技能吧!