译:软件工程师的软技能(一)


序:最近看了一篇谷歌工程师总结自己十年来所学到的软技能,感觉说的很棒,特地翻译成中文,希望能分享给更多的人,原文内容非常多,计划分几篇翻译出来,个人的水平有限,感兴趣的朋友也可以进去看英文原文。原文地址是:software-engineering-soft-parts(Addy Osmani)
正文:

前言

今天我将分享一些我在谷歌浏览器团队中作为高级工程师在10年间学到的一些软件工程“软技能”。在我的10周年纪念日,我想反思一些一直伴随着我的经验。我希望这些在你的职业生涯中对你有所帮助。
在我看来,成为一名优秀的工程师就是不断积累经验。项目无论大小,都是一个往你的工具箱添加新技术和工具的机会。当你将在一个项目中学到的技术与在另一个项目中学到的工具配对来解决问题时,这会为你带来更大的进步。

学习新事物

以下建议有助于大多数初级或中级开发人员向前发展,用来应对不断变化的技术,构建复杂系统,同时遵循软件工程范式中的标准流程并发现新的最佳实践。尽可能应用第一原则。学习将问题分解成更小的部分是生活中最重要的技能之一。

精通

精通意味着高效的工作
这意味着您可以分辨出能带来价值的任务,并帮助您的团队将精力集中在这个方向上。这也意味着您知道如何避免一些无法为团队或者公司带来价值的工作——最好的工程师甚至可以引导整个团队远离那些无意义的工作。

我经常被问到,“我怎么知道我是否充分利用了我的时间?”。几乎总是有一些任务可以让你“感到”忙碌。这里真正的诀窍是确保你在做正确的事情。如果您想移山,请专注于移动针的任务,即使这任务很小。

你可以问自己一些问题:

  • 我的目标是什么?我关注的任务是否与这些目标一致?
  • 有什么我可以做不同或更好的事情吗?

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

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

概括地说,我喜欢根据批判性思维提出的一些问题是:

  • 我们怎么知道我们正在解决真正的问题?
  • 我们怎么知道我们正在以正确的方式解决问题?(即平衡严谨性和效率,考虑到我们对问题和约束的理解)
  • 如果我们不知道问题的根源,我们如何确定根本原因?
  • 我们如何将关键问题分解为可以进一步分析的更小问题?
  • 一旦我们有了一个或多个假设,我们如何来评估它们?
  • 如果我们受到限制(时间压力)而又不过度损害我们围绕问题的分析严谨性,我们可以采取哪些捷径?
  • 证据是否充分支持结论?
  • 我们怎么知道什么时候能解决?什么时候解决方案才是“足够好”?
  • 我如何向所有利益相关者清晰、合乎逻辑地传达解决方案?

我发现这些问题通常会有所帮助。有时我们会解决问题的症状,却发现还会出现其他症状。在其他时候,我们可能会很快发布一个解决方案,但会在以后产生更多问题。从批判性思维的角度来看,我们可能会挑战假设,仔细研究风险/收益,寻找矛盾的证据,评估可信度并寻找更多数据来建立我们做正确事情的信心。

例如,我见过工程师犯的一个常见错误是假设相关性意味着因果关系(即,仅仅因为两件事相关并不一定意味着一个导致另一个)。一个批判性的思考者可能会反驳这样的假设,问我们为什么相信它们是正确的。

批判性思考者:

  • 提出有意识的问题,清晰而准确地提出问题
  • 收集和评估相关信息,验证他们可能如何回答问题
  • 得出合理的结论和解决方案,根据相关标准和标准对其进行测试
  • 在不同的思维系统中开诚布公地思考,根据需要识别和评估它们的假设、影响和实际后果
  • 与他人有效沟通,找出复杂问题的解决方案

注意:批判性思维具有“软技能”和“硬技能”两个方面,因此包含在本文中。


建立强大的基础

掌握基础知识并反复应用以获取新技能。
学习基础知识的长期价值在于它们是可转移的。短期而言,它们可以帮助您做出更好的决策,并使代码更有效率。

可转移的技能

可转移的技能是您可以从一个项目带到另一个项目的技能。让我们从基本面来谈谈它们。

基础知识是任何软件工程师的根本。它们宏观和微观两层。宏观层是软件工程的核心,微观层是实现(例如技术栈、库、框架等)。

在宏观层面上,您学习的编程概念在很大程度上可以转移,而与语言无关。语法可能不同,但核心思想仍然相同。这包括:数据结构(数组、对象、模块、哈希)、算法(搜索、排序)、架构(设计模式、状态管理)甚至性能优化(例如急切与惰性评估、记忆化、缓存、惰性加载等)。这些是您将经常使用的概念,以至于往后了解到它们可能具有很大的价值。

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

没有人有时间在职业生涯开始时学习所有内容。我们不应该过度索引基础知识,要去学习实际应用程序所需的内容。这就是“边做边学”。


效率

掌握基础知识可以帮助您编写更高效的代码。这包括时间复杂度(运行代码所需的时间)、内存使用以及性能和可维护性之间的权衡等概念。这些想法允许您在构建任何相当大的应用程序时做出有用的权衡。速度对于现代应用程序而言通常至关重要,并且通常会以明显的方式影响最终用户体验。


更好的决策

对宏观和微观基本面有很好的了解可以帮助您做出更好的决策。
您可以利用所获得的知识,根据任何项目的目标和限制,更好地决定使用哪些技术以及避免使用哪些技术。这可以帮助您避免为工作选择错误的技术或错误的工具的陷阱。

“在你明白什么时候不应该使用它之前,你还没有掌握一个它。” -@kelseyhightower

软件工程涉及考虑许多不同的层次——核心语言、实现、基础设施、工具和人员。对这些层次有一个表面的了解,可以让你编写程序更快。但真正了解基础知识(包括 O(n) 时间复杂度)可以帮助你走得更远,尤其是当语言和框架的格局随着时间而变化时。
相关阅读:


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

从用户体验开始,然后回到需要的技术。
史蒂夫乔布斯曾经说过一句名言:“你必须从客户体验开始,然后再谈技术。你不能从技术开始,然后试图弄清楚在哪里推销它。”。
这句话一直困扰着我,作为一名工程师,我们无论是从受欢迎程度、开发人员经验还是个人喜好的角度,去试图找到一个问题的合理解决方案是相对容易的事。但是我们更应该去关注我们的程序为谁而建,他们有什么问题,以及当前相似的程序有什么不足之处。
出色的用户体验来自于两种观点的结合——客户和技术。向人们展示您认为他们想要什么,并注意他们所说的话。当然,这里存在巨大的细微差别——哪些工程选择可以让您在移动硬件上提供出色的体验? 哪些选择会影响工程速度?或规模?或人员招聘?归根结底,我们首先要坚持不懈地关注客户,然后在我们必须处理的限制条件下探索使我们能够满足他们需求的方法,从而使我们受益。
最好的软件是由对用户有同理心的工程师构建的。
商业成功取决于客户满意度,这通常转化为软件的用户体验。了解实际用户如何体验产品或服务并确保您的解决方案能让他们高效完成工作。如果您所处的位置允许您直接与实际用户互动,请尝试更好地了解他们的需求和痛点。

提升你的技能

选择适合的而不是当前流行的。
使用那些经过试验和测试的老技术与当前流行的技术都是可以的。语言、框架和库经常发展,但我们应该选择有助于交付出色产品的技术。开始一个新项目时,从老但很好理解的技术开始挑选,然后从中选择解决问题的最佳工具。
在选择新技能来学习或使用时,不要害怕选择老旧且没有多少人讨论的技术。从技术角度来说,无论是语言、框架、库和工具,选择错了可能也不会造成很大的后果。虽然知道使用什么很重要,但您的主要目标是提供出色的最终产品。请不要盲目追逐新的闪亮技术,除非您认为它们为您的解决方案增加了价值。同时,不要因为某种技术谈论得不够多而回避它。
利用新项目学习新技术。
同时,个人项目和黑客马拉松项目可能是学习新技术的绝佳机会。我们中的许多人很少有机会从头开始做项目,而不是在已经做出许多决定的现有代码库上工作。此类项目可以是一种低风险的方式来研究新技术、评估其优势和劣势(小规模)并积累一些对您未来可能有价值的第一手知识。
保持好奇心,永不停止学习。
写下你学到的东西,它促使您更好地理解主题。只有当您尝试向他人解释事情时,您的知识才会变得清晰。如果没有人看你写的东西也没关系,因为你做这件事时,你已经得到很多了。
学习应该是一个持续的过程——声称对特定技术了如指掌的人通常不是专家。真正的专家精通技术,但意识到总有学习和改进的空间。好奇心驱动学习——所以如果你对一个新的框架感到好奇,可以去网上搜索它,阅读文档,尝试教程,阅读源代码!学习不必在教室里进行。它可以随时随地发生,每天花半小时阅读教科书的一章、收听技术播客、阅读开发博客或学习一门新的编程语言。
领导者要有承认自己有东西不懂的勇气。
作为一名高级工程师拥有这种信心降低了自己必须了解一切的期望。你绝对不需要知道所有的答案,但能够承认你只是个普通人类并致力于弄清楚如何与你的团队一起解决问题是最重要的部分。
领导者也需要承认自己犯错。
教你的团队如何以谦逊的态度处理错误以及学习和改进的愿望是很重要的。现实世界并不完美,向你的团队展示不完美的人不是错事。
做一个看护人,而不是一个主人。
在开源项目的早期阶段,我们通常会像所有者一样思考。 您通常直接拥有证明价值、研究功能、回答问题和宣传的权利。 这对于获得采用可能非常有用,但当人员变动或您自己的时间有限时,这可能不是以后扩展项目的最佳方式。在最初的人员投入减少之后,考虑转变角色的另一种方式是成为看守者,而不是所有者。 看护人可能会专注于扩大自己项目的参与者, 这可以通过与其他维护者、贡献者和社区共享尽可能多的知识来完成(通过设计文档、代码注释和其他记录在案的最佳实践)。 它还有助于增加具有足够背景的审阅者库,以便在您不再参与时做出正确的决定。这通常是项目在未来多年可持续发展的原因。

技能的深度和广度

成为一个多面手和一个大师是否适合你。
您可以掌握的最伟大的技能之一就是学习如何学习。 这应该优先于只是深入研究特定的编程语言或框架,它有助于保持好奇心。 一旦您有这方面的经历,您可能会质疑您是否应该以成为专家或多面手为目标。
我个人喜欢 T 形工程师的说法。 这些工程师在一项或少数几项技能(T 的竖线)方面非常精通,但对构建和运行产品所需的许多其他技能(横线)有基本的了解。一些团队喜欢通过一系列不同的专业轮换团队成员,以建立更多的 T 型团队成员。我发现在中大型团队中,让在某一领域拥有专业技能的人以及在必要时为其他人填补技能、多功能性和协作能力的人是最有效的做法。

去尝试使用就是学习的过程

在学习一门新语言时,专注于用它构建一些有形的东西,让你有第一手的体验。
如果您正在学习一门新语言,您无需记住它的所有语法或文档即可成为一名优秀的开发人员。更重要的是知道如何解决问题。 通过编写大量相关代码或从现有代码中学习来获得经验。 结果应该可以帮助您用该语言编写高效的代码。 正如这里所说,“软件的主要价值不是生成的代码,而是生成它的人积累的知识”。 但是,在试验新技术时,请不要在生产中试验。

posted @ 2022-07-10 20:26  IAyue  阅读(615)  评论(0编辑  收藏  举报