| 概述 | 预计耗时 | 预计发布 | 实际发布 | 最后一次修改 |
|---|---|---|---|---|
如何构建长期价值,高效工程师需要理解的三个要点
在软件开发领域,常遇到一些取舍。trade off 是开发过程中不得不考量的事情。早上线,还是优化更好的功能。虽然我们在前面提到过,要加快迭代速度,但这并不等于要放弃软件的质量。
在第一篇文章里,我们总体陈述了高效工程师需要理解的三个要点。今天我们由长期价值出发,看看卓越工程师在日常是怎么做的。这里将包含三个要点,分别是:平衡质量与实用,降低日常维护成本以及在团队成长上做投资。
平衡质量与实用
事实上,尽早上线与软件质量并不矛盾。我们有很多措施和手段来保证软件质量,最最糟糕的软件开发团队,才会以上线时间作为考量。一般而言,这种开发模式下的软件质量,会是非常糟糕且难以维护的。技术债务在短期不会爆发,但长期而言却成为项目的显著短板,进入恶性循环,甚至是会拖垮整个产品。
建立code review 习惯
code review 在很多公司的很多团队已经得到实现。不过在数据挖掘和算法领域,却很少看到有最佳实践出现。在很久以前,我也写过一篇测试驱动机器学习的文章,不过自己执行下来会发现,还是会有想简便省事的天性阻碍。不知道其他算法团队,是如何实践code review和自动化测试的,欢迎交流。
建立code review 习惯有诸多好处。例如能够尽早地发现bug或者是不当的程序设计。同时,由于改的代码将会有人审核,也将会增加修改代码时人的责任心。这样下来,团队内每个成员都能够清楚,好的代码是什么样子的。在出现人员变动,人员休假的时候,也能够顺利补位,快速修补线上问题。
code review的最大成本就是需要时间去进行,但长期来看团队的整体效率会更高。
抽象、自动化测试与技术债
除了code review,在写代码过程中,设计适度的抽象也是很必要的。同时,自动化测试代码,也将加快交付的节奏。最后,留意软件开发过程中的技术债,留下适度的时间,让团队进行重构。
降低日常维护成本
简化系统
软件开发本身,是一个熵增的过程,也就是说项目的复杂度会逐渐加大。不过这样也带来了风险。工程师需要更多的时间来理解不同系统的差异。单点的故障可能也有所增加。对于新人来说,学习的曲线会变得特别陡峭。所以,当系统的复杂度增加时,还是要周期性地回顾,并尝试着去简化系统。
尽早失败、显式失败
除开简化系统外,还应在软件开发设计系统过程中,尽早地抛出错误,抛出显式的错误。为什么这么讲,是因为我们的生活经历也告诉我们:发现当系统出问题时,掩盖问题或者是隐晦地抛出问题,只会让问题越来越严重。软件设计领域也是如此。当系统出问题时,就应该尽早地抛出错误,而且能够明显定位问题的方式越好。
故障演练
在深度学习训练过程中,我们会通过 dropout 的方式,随机丢弃掉一定比例的神经元,以此来达到防止过拟合,加强系统鲁棒性的作用。这一思想,在奈飞的软件开发团队也有所应用。他们会在工作日,随机关停一些系统,来考验软件服务的鲁棒性。这种做法,与压测和灾难演习也有相似作用。
当然,无论我们准备得多么充分,也会有出问题的可能。设计兜底策略,自动化决策过程,也是有必要纳入的。
投资团队成长
一个人的极客,能做到事情有限;但一个卓越的极客团队,却能做出无限精彩的事情。投资团队的成长,也是构建长期价值中的有力一环。以下内容虽然像是写给团队leader的,但其实我们每个人在人生的不同阶段,都有可能在这个位置上。
将招聘视为高优先级
在《奈飞文化手册》中有提过,奈飞自由与责任的文化能够得以发挥作用,很大程度是因为他们招聘到了最顶尖的人才。招聘,对于一个团队的成功至关重要。这里原作者也分享了一些招聘技巧。首先评估团队所需的能力图谱,按图索骥,寻找高匹配度的人才。设计不同层次的问题,通过快速问答考察知识广度。掌握面试节奏,设计有效的引导,防止过长时间的卡壳。周期性地回顾面试,周期性地和其他团队成员一起面试。
在入职培训和指导上下功夫
新人入职时,设计有效的入职指引,帮助他快速上手。传达团队的文化宗旨与核心价值,让新人理解什么将有助于成功。设计有效的互动环节,让新人能够融入已有的社交网络。
共享代码与经验
在具体业务层面,首先要尽量避免单点项目。如果可以,定期在团队内切换任务和责任事项。单点项目的问题,之前有说过。一个是人员变动风险,一个是最佳实践风险。前者无法保证其他人快速上手,后者无法保证目前的设计是相较最优的。
经常去review他人的代码和设计。保持代码的可读性与高质量。当然这不是说你不信任他们,恰好相反,信任其实就来源于这类活动。对于重要的软件与架构的决策,设计一个分享会,让每个人都能理解背后的动机以及期望的目标。归档此类文档以便后来的人能够查阅。
卓越工程师文化
团队文化这个词,在我阅读的多本软件开发的书中有提到。看得出来,这些卓越团队都有个共性,那就是很重视自身的文化氛围,会定期审视团队的氛围变化。当出现“害群之马”时,及时纠正偏差。那么怎么样的文化,对于工程师来说是卓越的呢?原文作者给出了以下描述。
将需要手工触发的活持续自动化。优化迭代的速度。共享软件开发的经验教训。做好软件抽象。通过code review保持代码高质量。投资自动化测试。
保持尊重(谦虚、尊重、信任)的工作氛围。给工程师团队预留20%的时间做探索性项目。培养学习和持续改进的文化。招聘最优秀的人。
总结
在本系列,我们详细阐述了卓越工程师的若干品行。包括树立正确的思维,聚焦高杠杆、直接产生价值的地方。在执行过程中,进行指标衡量,早验证多迭代。构建长期的价值,不图一时之快,通过多项措施保证代码质量;投资团队成长,创造卓越的工程师团队文化。