成为高级工程师的五个关键思维
Dave Cutler(Windows NT的首席设计师),今年74岁,这么“年轻”的程序员仍然每天到微软办公室去写代码。
我第一次知道Cutler是因为他50年前对PC产业的贡献获得电脑历史博物馆研究员的大奖,但是光根据他这辈子写的代码数量,你不得不承认他是最牛的程序员。
但是比起前面这些光环,他的工作已经影响20亿的电脑使用者的经验,在他诸多贡献中,Cutler建立了Windows NT很重要的部分:过去20年来所有主要的Windows版本的基础,这让微软在早期市场上有非常大的优势,回想之前的电脑操作系统,如何让操作与前面的版本兼容,所以他更被人们津津乐道的成为“微软Windows操作系统背后的关键技术头脑”。
是什么让Cutler这样的人成为如此成功的程序员?我们要如何立志才能达到他,可能只到他的几分之几的影响力呢?什么让这些最强的程序员,他们的软件创造如此巨大的影响呢?
虽然写代码不是程序员唯一的活动,但不可否认我们大部分时间仍然为之奋斗。许多硅谷顶尖公司的工程部门主管后,我发现最有效率的工程师,确实完成任务且有很大影响力者,都有最少以下五个思维:
1.对于陌生的语言会毫不畏惧地下去了解
跳进一个不熟悉的语言里面让人不舒服甚至感到害怕,很多人可能连试都没试就放弃了。这种严苛的技巧在你多次尝试后将不再困难,且经过这种历练,你将会有显著的成长。如果一个开源library或另一团队给的library不符合你的预期,这时候刚好给你一次机会,抓出为什么你觉得不好的原因。
对陌生感到害怕不会只局限于代码。每次你换工作,你可能会迟疑是否有办法复制前一角色一样强的工作表现。很少人不公开谈“冒名顶替综合症”(imposter syndrome),但我曾听过CTO职位的人告诉我他们有觉得自己是冒牌的感觉。
事实上每个人的起步都不一样。Culter的学历是一所不出名的大学,且不曾受过正式的电脑科学教育。从很多方面来说,他的起步落后于很多人,且需要通过尝试和错误学习很多事务。
为了与时俱进,我们必须采用成长的思维与最佳化学习任何技术,不管是程序开发、沟通、联网、小型演说或任何其他事务,都是学得来的,只要你愿意花时间,就你想学的项目找书来读、寻求帮助。相信随着时间的积累,处理不熟悉的事情会越来越容易。
2.精通解Bug
“为什么我写出来的代码不是我想要的效果?”
这是身为软件工程师每天会问自己的问题。解决bug的能力对于程序员完成整体项目收尾有着很大的影响,然而在大学的课程里以及技术的面试这项技能都没有得到重视。
你如何有效率的debug?
由其核心过滤出的科学的方法:
1,猜猜到底发生了什么错误。
2,假设猜测正确,辨识此猜测将会有哪些错误的结果。
3,试着观察与结果抵触的事实。
4,如果有任何抵触,你的猜测就不正确,所以请做另外的猜测。如果没找到任何抵触,那已找到其中一个原由。
5,要能更快的排除BUG,你必须要学会做更好的猜测,且你要精通那些能让你更有效观察的工具与技术。
是否能做更好的猜测取决于你解决更多的问题也因此经历了更多的练习。
是否能有更好的观察能力在于你是否掌握了技术窍门。先从每件事都有办法观察到的假设开始,然后找出可以让你做到某种观察或更快辨识出来的工具和机制。别以为你只能从你熟悉的有限工具来做观察,经常有可能某人已经发展出某个工具,它已经知道你想要找的。
3.投资可省时的工具
当电脑刚刚问世,资源很有限且昂贵,所以程序员在使用电脑时要很注意资源占用。而现在,亚马逊云端的一小时运算花费不到一毛钱。
但反观来看,我们仍然一样一天只有24小时,一星期只有7天。这表示任何手动的工作如果可以用电脑替代处理,将会是高度减轻工作负担的杠杆。我们以投资省时的工具以及自动化流程来达到,只要是能让我们放大投入相同时间的产出,或能在我们睡觉时或专心其他问题时帮我们自动做某些事的工具,都值得考虑投资。
当前Facebook的技术总监Bobby Johnson(他把6人的构架团队成长到100人以上)曾提到一个他观察到的现象“所有成功的程序员,几乎都写了很多工具”
这似乎很明显,对于程序员而言工具是很棒的投资,可是当我们真正的去分解一天的工作时间,计算要花多少时间在工具建置上,我们认为应该不会很高。优秀的开发团队,很多最好的程序员事实上花三分之一的时间在工具上,用这些工具来做代码的部署、监控系统以及更多方面来帮助他们在更短的时间内完成更多事,不要一直做可以运用机器就能帮你做好的事。
4.最佳化重复性动作的速度
假如说从一个function call找到并导览到它的定义花你12秒,如果你一天要做类似的导览60次,那就是每天要花12分钟在档案的导览,如果你够熟悉文字编辑到档案导航的快捷键,将12秒缩短到2秒,那么经过一天,你节省了10分钟。每年,加总起来你可省40小时,相当于一个工作星期。
找出三个类似的最佳化,如此你将节省一个月,想像你每年多出一个月的时间可以做什么?
或假设你正在解决一个bug,这需要你开启这个app然后导航过五个画面以设定好状况触发那个bug。你可以花10分钟来写个程序帮你从开启直接引到发生bug的画面吗?所以你将因为这小小的起始投资大大的加快迭代速度。
系统性的思考:“我可以如何加快重复性动作的速度”这收益将很丰硕且随着时间加倍。”
5.从系统级高度来思考
当你写代码的时候,很容易认为所谓“工作完成”就是你已经写完开发文档所要求的代码。但这些真的只是冰山一角,任何被闲置在代码贮存器里的作品且没有拿出来运作的都是毫无价值的产物。
为了建置并交付真的有用的代码,你必须超越写代码的角度,以系统级的高度来思考:
你写的代码如何与其他人建立的程序基底和功能配合?
你对自己写的代码已经做够足够的测试了吗?
产品团队能够运作你建立的功能吗?
为了部署你写好的代码,运营生产环境需要做什么变动?
你新增的代码对于正在运行的其他系统会有不良的作用或影响性能表现?
当使用你所写的部分,用户的行为如你预期吗?
你所写的代码有达到你想发挥的影响力吗?
这些都不是简单的问题,需费点功夫来回答。但你需要一个清楚的心智地图了解你写的代码是否符合大方向,指引你在时间和精力上的分配,让自己的工作往更有影响力的方向发展。
这五个程序开发的思维将帮助你起步,但记得要成为成功的程序员或工程师一定还有更多条件是超乎写程序的范围,如果你想要通过更多开发实践来提高自己的开发能力,欢迎入驻程序员客栈与这里诸多BAT级别和其他顶尖互联网公司的程序员、产品经理、设计师、一起组队拿赏金吧。