编译 | 辛晓亮

谷歌浏览器的一位高级工程经理,分享了他在谷歌工作十年时间里学到的一些软技能,下文为部分经验摘录。

批判性思考并提出合理的论点

批判性思维是使用认知技能独立思考以做出深思熟虑的决定的能力。投资于这项技能,以提高你的思路清晰。

作为工程师,我们有时会急于立即解决问题,因此感觉就像我们正在取得进展,或者看起来我们正在对利益相关者做出响应。如果我们没有充分考虑原因和后果,这可能会带来风险。换句话说,批判性思维是有目的地思考并形成自己的结论。这种以目标为导向的思维可以帮助你专注于根本原因问题,从而避免未来因不牢记原因和后果而出现的问题。

熟练掌握“可转移”技能

可转移的技能指的是可以从一个项目带到另一个项目的技能。

基本原理是任何软件工程工作的基础。它们有两个层面——宏观和微观。宏观层是软件工程的核心,微观层是实现(例如技术栈、库、框架等)。

在宏观层面上,你学习的编程概念在很大程度上是可以转移的,不管是什么语言,语法可能有所不同,但核心思想仍然是相同的。这包括:数据结构(数组、对象、模块、哈希)、算法(搜索、排序)、架构(设计模式、状态管理)甚至性能优化(例如缓存、延迟加载等)。这些都是你经常使用的概念,对它们进行逆向了解会有很大的价值。

在微观层面上,您需要学习这些概念的实现。这可能包括:你使用的语言(JavaScript、PythonRuby 等)、你使用的框架(如 React、Angular、Vue 等)、你使用的后端(如 DjangoRails 等)以及技术你使用的堆栈(例如 Google App Engine、Google Cloud Platform 等)。其中涉及的细节对于获得有效的专业知识可能很有价值,但并不总是可以转移的。

专注于用户,其余的将随之而来

从用户体验开始,倒推你需要的技术

史蒂夫乔布斯曾经说过一句名言:“你必须从客户体验开始,然后再回到技术。你不能从技术开始,然后试图弄清楚在哪里销售它”。

作为工程师,我们太容易从想要使用特定解决方案的地方开始--无论是由于流行、开发者经验还是个人偏好--并试图找到一种方法来合理地使用它们。相反,我们应该专注于我们是为谁建立的,他们有什么问题,以及目前可用的选项是如何落空的。

伟大的用户体验来自于两个观点的结合--客户和技术。向人们展示你认为他们想要的东西,并注意他们所反馈的内容。企业的成功取决于客户的满意度,而客户的满意度往往转化为软件的用户体验。

打造技能的深度与广度

我非常喜欢 T-Shaped 工程师的想法。这些工程师在一项或少数几项技能方面是深度专家(T 的竖条),但他们对构建和运行产品所需的许多其他技能(横条)也都有基本了解。有些团队喜欢通过一系列不同的专业来轮换团队成员,以建立更多的 T 型团队成员。我还发现,在中等规模的团队中,拥有某个领域的专业技能和技能、多才多艺、善于合作的人,在必要时可以替代其他人,这是很有效的。

通用代码与特定代码

为手头的问题编写专门的代码,但要努力发现那些你可以负担得起的地方,使其成为一个小的通用的代码。

通常情况下,我们试图把代码写得尽可能的通用,最终却使那些有效的代码不能帮助完成问题。相反,专门为这个问题而构建,但试图发现可以让它变得更通用的地方,这完全消除了未来没有考虑到这一点导致不得不再次重构的情况。

https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it

https://ronjeffries.com/xprog/articles/practices/pracsimplest/

在维护项目中学习

在处理旧系统中的遗留代码时,任何高级工程师都应该尽量理解留下的代码和舍弃的代码之间的区别。软件行业已经到了一个阶段,许多项目都在处理旧的或遗留系统的维护和迁移问题。部分软件工程师对修改生产中的代码持谨慎态度,因为他们担心会引入一个错误。但不要假设现有代码是完全可靠的,随着时间的迁移,节省时间的做法可能会成为维护的噩梦。

设计文档的重要性

设计文档不应该是事后的想法,而应该是软件工程过程中的一个组成部分。

设计文档可以帮助你从同行或者对接团队中获得共识,来自他人的反馈能使你找出差距并改善设计。设计文档还能帮助未来新加入团队的工程师更好的理解当前系统。

拒绝的力量

说“不”比过度承诺更好。在涉及更多工作的情况下,我们大多数人都不善于说“不”。一方面是大家没有意识到“不”是一种选择,一方面是我们喜欢这种挑战。然而,过度承诺是一种责任,而且可能会造成项目延误。让对方知道你已经在做什么,并提供一个合理的估计(需要多长时间)是一种尊重的表现。

技术债务

Titus Winters 将技术债务定义为“我们今天拥有的代码和系统与我们希望拥有的代码和系统之间的差异”,某些类型的债务比其他类型的影响更大。有些债务可能是由于没有及早发现的错误(疏忽),有些是由于事后了解到的情况,有些是由于技术系统环境的变化(背景)。

坚持优先处理技术债务有时是很难的,因为你不可能总是量化那些没有表现出来的错误或没有发生的故障。如何防止债务积累?除了构建新功能外,技术主管还应定期在 Sprint 周期中投入时间进行清理和偿还债务。审稿人应该意识到推动短期速度实际上可能会导致进一步的问题。经理和主管应该注意批准与现有项目重叠的新项目,除非你确定权衡是值得的(例如,解决现有系统的债务与建立新的东西相比不值得)。最后,监控项目的健康状况非常重要。

工作与生活的平衡

过度工作并不是良好职业道德的一部分,你永远不可能比世界上的每个人都更努力。许多公司将过度劳累的员工作为“标准”,错误地认为这是良好的职业道德。成功来自许多因素,不仅仅是过度劳累。

时间管理上,优化自己的日历,留出时间,专注于深度工作。深度工作是无干扰、高度集中的工作,可以在短时间内创造大量价值。同时,一个人的时间是有限的,与其试图寻求更多的时间,不如消除不必要的任务。

最后,你的健康和家庭至关重要,它会促进整体幸福感,精疲力竭也会影响到你的工作,也会使你的团队精疲力尽。保持良好的工作和生活平衡对于各个级别的工程师来说都至关重要。

原文链接:

https://addyosmani.com/blog/software-engineering-soft-parts