如何成为公司独当一面的工程师

30,600 阅读12分钟

前言

如今的互联网市场对高阶技术岗位的需求越来越多,成为独当一面的工程师已经成为很多一二线互联网公司招聘的标准门槛了。那么如何成长为独当一面的工程师呢,我会从技术能力和业务能力 2 个方面去阐述。

技术能力

技术能力无疑是衡量一个工程师水平最重要的依据,那么对于独当一面的工程师技术能力的要求是怎样的呢。

职业技能

职业技能就是工作中依赖的技术栈,下面我们以前端工程师为例,看一下有需要掌握哪些职业技能。

  • 熟练掌握 HTML、CSS、JavaScript 用语义化的 HTML 标签配合 CSS 百分百还原设计稿,并使用 JavaScript 完成各种交互逻辑。这是前端的基本功,除了通过书籍、视频等渠道学习之外,你可以通过做大量业务,不断写代码去应用所学知识,不断积累。

  • 熟练掌握一门 MVVM 框架 Vue、React、Angular 其一,随着前端的日益复杂,大部分场景都离不开它们。你需要清楚的了解框架出现的意义,框架的职责边界,你能轻松应用框架提供的各种能力辅助开发工作。除了不断在工作中应用,你还可以主动去学习框架源码,了解框架的实现原理。

  • 至少要学会一种打包工具 以 webpack 为例,你需要熟练掌握 webpack 的配置,学会利用 webpack 辅助我们的开发、部署和优化。你可以尝试去编写 webpack 的 loader 和 plugin。例如我们平时开发工作中需要 mock 数据,那么我们可以编写一个 webpack 插件,在不改源码的情况下,实现在开发环境请求 mock 接口,测试环境请求线上接口。

  • 熟练掌握前端的一些广度知识 例如HTTP、Web 安全、性能优化、数据结构和算法等。除了通过书籍、视频等渠道学习之外,你可以在平时工作中不断去应用和验证。例如性能优化,你可以去分析页面的性能瓶颈,在前端还是后端?如果是在前端,你还可以进一步分析白屏时间、首屏渲染时间、JS 加载时间、JS 执行时间等等,最后通过统计的手段做性能监控和报警。 ,

开发效率

开发效率的高低,直接决定你的工作产出比,那么如何提升开发效率呢。

  • 给自己设一个免打扰时间 例如下午的 2点-4点,这个时间专心 coding,不看微信不刷微博不开会,这样的编码会很高效。

  • 工作中善于提炼可复用的代码和逻辑 例如当你在开发过程中发现某组件在其它项目中实现过,这个时候千万不要想着去 CV 代码,而是把它抽象成可复用的业务组件,对外设计好输入和输出接口,并抽取到专门的仓库中管理,业务通过 npm 私服的方式去引入。

  • 善于通过技术的手段去提升效率 例如当你去开发和维护多个项目的时候,每个项目都包含一些类似的代码和配置,你就可以想着去开发一个脚手架,自动帮助你去初始化项目代码和一些配置文件。

解决问题

每个工程师都会在工作中遇到各种问题,解决问题的能力侧面反映了一个人的技术能力。

  • 线上问题 case study 当遇到线上问题,你可以配合一些报错日志快速定位问题出,找到快速修复的方案,并且在每次出线上问题后都认真的做 case study,找出引发问题的多方面原因,并给出对应的解决方案,避免日后再出现类似问题。

  • 探究问题的本质 在开发过程中遇到报错,你可以通过代码执行堆栈和报错信息找到引起错误的根本原因,从而找到最合理的修复方案,如果报错的源头是第三方插件,你应该趁机去了解第三方实现的原理。

  • 学会提问 并不是所有问题都要自己独立解决,有些时候也可以求助于他人,好的提问方式非常重要。例如你在提问之前,自己应该经过充分的思考,并学会把问题拆解,在拆解的过程中就会把问题的复杂度降低。要善用搜索引擎,把关键字提取出来去搜索引擎上去搜索,先尝试自己去解决问题。如果仍然不能解决,可以将问题的相关上下文、截图及必要标识及自己的思考过程、查找到的相关资料,以及自己的分析发送给想要帮助你的人,并能提供最小化复现的问题。

代码重构

曾经有个大佬跟我说过,如果每半年去回顾你之前写的代码,都会觉得像坨屎的话,那说明你在进步。

  • 不要过度设计 有些人喜欢一次性把代码写好,预留各种扩展接口,过度设计,但由于需求的的变化往往不可预测,非常容易导致花了大量的时间却写了大量无用的代码,产出低下。在高速发展的互联网公司是绝对不能容忍这种情况的,而应该是敏捷开发,快速迭代。

  • 及时重构 通常我们为了一个项目快速上线,第一版的代码可能会有很多问题,当我们在基于之前版本的代码开发新功能的时候,如果遇到之前代码实现不合理的地方要及时重构,而不要敷衍了事,如果等到代码量已经很大的时候去重构,会非常困难和痛苦,并且还可能有 regression 风险。

  • codereview 找比自己厉害的同事帮助自己的代码做 codereview,吸取他们的一些好的建议,也可以去 review 其他同事的代码,觉得写的好的代码要学习,觉得写的不好的地方可以 ”挑刺“,引起讨论,追寻最佳实践。并且一个团队要制定统一的代码规范和风格。

  • 学习优秀源码 如何去写出优秀的代码,首先要学会模仿,你应该经常去 GitHub 去阅读一些优秀的源码,把好的编程思想和代码实现借鉴到自己的工作项目中。

技术沉淀

技术是一个长期学习并积累的过程,需要经常做一些技术沉淀。

  • 技术分享 把工作中遇到的一些问题的解决方案、学习的一些新技术,产出的一些技术项目总结下来,作为对内或者对外(公司允许的话)技术分享和输出。对内分享的话可以让大家能知道你做的东西,并活跃内部技术氛围,锻炼表述能力,这个能力在大公司的晋升述职中非常重要;对外分享可以锻炼写作能力,提升个人或者是团队的技术影响力。

  • 开源 如果在工作中做的不错的项目,有开源价值并且公司允许的前提下,可以考虑开源,因为开源会让你对项目质量有更高的追求。例如之前我在滴滴做的 cube-ui,开源会让我们对代码的质量要求更高,并补充了完整的文档、示例和测试。而且随着越来越多人使用,用户帮我们反馈了很多 bug,也补充了很多功能,直接帮助我们省了 QA 的人力。好的开源项目也可以帮助我们提升个人和团队的技术影响力。

快速学习

技术变化日新月异,快速学习的能力尤其重要。

  • 阅读官方文档 当你去学习一门新技术的时候首先应该去阅读官方文档,而不要去看社区总结的文章,因为官方文档是最权威的,并且是实时更新的,而他人总结的二手资料很可能是过时甚至是有误的。

  • 在工作中实践 学习如果脱离工作的实践,其实是非常低效的。你应该把自己所学的知识并在工作中反复实践和验证,及时反馈,加深学习的印象。不要花时间去学习与工作无太多直接关系的领域。

  • 先精通一门技术 不同的技术之间其实是融会贯通的,当你对一个技术精通并总结出方法论以后,很容易上手别的技术。比如一个对 Vue 精通的同学,上手 React 必定毫无难度,对 Web 前端开发精通的同学开发小程序也是毫无压力。

技术选型

技术选型是大部分工程师都会面临的问题,好的工程师一定要有好的技术选型的能力。

  • 技术选型的标准 当你去选择某个开源项目的时候,应该参考以下几个方面:feature 完整度(能否很好满足我们的需求),使用量(npm 下载量、是否有大公司使用),维护力度(最近更新时间、更新频率、issue 和 pr 的处理情况),测试(是否有测试,测试覆盖率),文档(文档和示例是否完善),维护者(团队、个人的技术能力以及他们的技术影响力),流行度(star、fork 量)。

造轮子

当现有轮子不能满足我们的需求的时候,我们要有自己造轮子的能力。

  • 学会造轮子 你需要经常去学习和研究其它的轮子是如何造的,学的多了,自然就掌握了造轮子的一些规律和方法论,了解轮子实现的本质原理,也就可以根据自己的需求和场景去定制化轮子了,并且你的轮子也可以是其它小轮子组装而成。例如我在滴滴的时候为了实现一个媲美原生 iOS 体验的 Picker 组件,先是研究了 isroll 的实现,在它基础上扩展实现了 better-scroll,然后在 better-scroll 的基础上扩展出 Picker 组件。

业务能力

作为独当一面的工程师,除了过硬的技术能力,也需要有良好的业务能力。

owner 意识

如果你不甘心只当一颗螺丝钉,你需要有 owner 意识,对产品和项目负责。例如我现在在 zoom,从需求、设计、开发、测试到最终的上线都是由工程师在主导,并协调各个角色成员。这对工程师提出了更高的要求,也锻炼了工程师的综合素质能力。即使你所在的公司项目并不由工程师主导,你也可以以这个标准来要求自己。

产品思维

当你接到一个需求的时候,也要思考这个需求解决了什么问题,有什么价值和意义。作为一个工程师,最好能参与到需求早期的讨论中,充分理解业务,这样你对需求的把握和理解会更准确,而不是产品说什么你就做什么,有些时候你会找到一条既能满足需求又能节约开发成本的路。

沟通能力

很多人希望做一个只写代码的美男(女)子,但实际情况你需要和不同的工作岗位的人沟通。沟通能力是非常重要的,很多时候你需要去了解你的需求方的想法,并输出你的想法。如果你两耳不闻窗外事,很可能做出来的东西并不是他人想要的,充分的沟通可以避免走一些弯路,提升工作效率。

敬畏上线

很多没有在大公司待过的人对于上线的视程度不够,一旦上线出问题,第一反应并不是回滚代码,而是去定位问题,通过下一次上线修复。这个行为在大公司是绝对不允许的,因为当你用户量大了,每一次上线事故的影响面都会很大,如果不及时回滚,对公司也会造成非常大的损失。因此要对上线有敬畏心,保证整个上线过程是自动化而非人工参与(因为人是不靠谱的),上线过程中需要观察监控,一旦有任何数据异常要及时回滚,然后再定位问题重新上线,最好避免高峰期上线。

总结

我们通篇讲了很多方法,但实际上在你进阶成为独当一面工程师的路上,这些方法也只是仅供参考,真正能成为大牛的人,能够直面困难和挫折,敢于跳出自己的舒适区追求进步,能熬得住突破瓶颈长时间的寂寞,是肯下笨功夫的聪明人。没有什么人可以靠着看一两篇文章就能成为大牛,而真正重要的,是多年如一日的坚持。

与大家共勉。