工程师职业建议:从键盘旁走开

成为一名成功工程师的 7 个技巧。
168 位读者喜欢这个。

在我的职业生涯中,我对工作方式经历了两次到三次重大的思维转变。起初,我只专注于工程——试图尽可能多地了解我正在使用的语言或库,非常关注“琐事”,并且最终忽略他人的担忧,只是为了编写好的代码。这并不是说我没有尝试与同事相处或帮助他们,但我为提升自己所做的努力都是为了我自己;毕竟,当我变得更好时,团队和公司也会变得更好。公平地说,这种方法并非完全没有道理。作为工程师,我们必须不断发展、学习更多、不断进步,因为这个行业变得越来越难,每天都需要更多的技术解决方案来解决更大的问题。这种方法在我的职业生涯的前半段对我来说效果很好,那时我还很资浅,有这种自私(尽管是善意的)动机。

后来我换了一份工作,在一个办公室里与比我整个职业生涯中合作过的工程师还要多的工程师一起工作。这份工作差点把我击垮。我从角色中较优秀的人之一变成了勉强糊口…… 持续了将近两年。我努力取得成功,我总是觉得自己不如周围的人,很多时候我不明白他们为什么要雇用我(事实证明,我的一些同事也有这种感觉)。但没有什么大的顿悟,也没有什么决定性的时刻让我扭转局面。只是一系列艰难的、彻底的失败,我从中只有两个选择——放弃或学习和成长。我尽力选择了后者。当我回到一家规模较小的初创公司时,我亲眼目睹了从头开始,围绕这些经验教训巩固一种文化是多么重要。

我的最终思维转变发生在初创公司被一家更大的公司收购后,我转型为管理层时。我并没有选择成为一名经理;而是管理层选择了我,因为他们给了我这个职位。他们还告诉我,虽然每个人都非常信任我,但他们选择我的最终原因是,他们觉得从内部提拔一个人比从外部聘请一个人动荡更小。收购后,我们的时间表非常紧张,我的新公司不想因为引进一位不信任团队的外部领导者而冒险。我发现这个阶段巩固了我之前学到的一切关于如何在工程角色中有效工作的知识——并提高了我在每一分每一秒都需要应用这些经验教训的程度。

在 Twitter 上发布

2018 年 5 月,在与我们扩展团队的一位初级成员进行了一次特别有意义且有价值的对话后,我发布了一条关于职业发展的推文。这条 Twitter 帖子比我预期的更受关注,Matt Broberg 邀请我为 Opensource.com 撰写这篇文章。(Matt 告诉我我不允许在这篇文章中说脏话,所以请理解他的管辖权不包括我的推文。)

如果您只是想了解简短版本,这里是

  • 专注于改进您与他人的沟通方式,特别是沟通的内容、语气和及时性。

  • 努力成为更强大的协作者——“角落里的工程师”不是你想要的头衔

  • 理解负责某事意味着什么,并努力兑现你的承诺。在你的职业生涯中更上一层楼意味着更广泛的责任和更少的关于如何处理它的指导。

  • 学会失败,并从失败中学习。你会经历很多失败,大多数是小失败……但也有一小部分大失败。不要让它让你脱轨;把它作为你下一个成功的垫脚石。

  • “解决问题”是你可以拥有的最重要的工程技能。

  • 永不停止学习。如果你停止学习,你就会停止成长。如果你停止成长,你就无法转向更大更好的事物。

  • 学习 SQL;以后你会感谢我的

如何成为一名成功的工程师

在我的一位支持工程师向我征求关于如何成长为软件工程师的建议后,我发布了这条推文(以及随后的帖子)。我认为他期望我列出一系列技术、工具和编程语言,这些可以帮助他在工程团队中找到工作。相反,我给了他一份需要关注的行为清单。我的想法是,无论你从事什么工作(尤其是在初级职位上),都可能会培训你成功所需的技术。(至少在任何与如何以及雇用谁保持健康关系的地方,情况都是如此。)但我提到的事情是没有工程师可能会明确与他合作的事情,因为它们传统上与我们不幸地称之为“软技能”的东西相一致。

我在这里暂停一下,声明一下“软技能”这个词淡化了它们在成为一个全面发展的人,更不用说成为团队中成功成员方面的影响。尽量避免这样称呼它们(我在这里使用它是因为遗憾的是,这是我们都知道的术语)。“整体技能”可能是一个更好的术语,但它不太吸引人,而且老实说,我不是来向你推销华而不实的新术语的。

重要的是要指出,这些技能都不是你永远“达到”或停止成长的技能(我认为这适用于大多数技能,但在这个背景下尤其如此)。团队动态非常复杂。作为人,我们是反复无常的。我们有美好的日子和糟糕的日子,我们会挣扎,我们会崩溃。更糟糕的是,我们这样做的方式无法在 FAQ 中涵盖,也无法在脚本中自动化,这与我们运行的许多系统不同。我们的失败案例趋于无限,因此我们的学习能力、复原能力和恢复能力需要与之匹配。我失败过无数次,并接受我还会再失败无数次。但只要我一直在学习,我就一直在成长。我可以自信地说,在我整个职业生涯中,我最喜欢与之合作的人都在以下技能方面得分很高,主要是因为他们一直在努力提高这些技能。

现在也是时候注意,没有人应该期望你在所有这些技能方面都完美,或者一直都完美。每个人都有糟糕的日子。关键是要让糟糕的日子成为例外,这样当事情变得有点太艰难,你的反应方式(反思后)你知道是不合格的时候,人们不会认为那是你的常态。这些技能将帮助你在你的团队中建立信任,让你可以在那些你没有全力以赴的情况下兑现,原因有很多。

沟通是你作为一名有效工程师的生活中最重要的组成部分之一。你可以在角落里当孤狼,编写精湛的代码,没有人干扰你的技艺,这种想法对于我们行业中 99% 的人来说是不现实的——可能甚至更多。虽然独自一人如此高效的浪漫想法非常诱人,但隐藏在其中的陷阱是,这些人通常被视为一种负担。

在我的职业生涯早期,我认为自己是一个很好的沟通者,但我后来了解到,我在不重要的时候过度沟通,而在重要的时候沟通不足。我努力找到正确的平衡——何时变得过于技术性(我几乎总是倾向于这样做),以及何时只给出 50,000 英尺的概览——这取决于我交谈的人的类型。当事情进展不顺利或“尚未准备好被看到”时,我也会躲藏起来——我会等到太晚才寻求帮助,我会独自迭代设计,直到我觉得它们准备好了,我将对方法的批评误解为对自己的批评。我花了数年时间才将需要尽早向同事公开我的想法、我的工作状态以及我的设计的原始性质内化。

我记得我注意到自己在这方面有所改进。我当时正在做一个小型但重要的工作项目,我没有等到问题积累到爆发的程度,而是每天都告诉我的经理项目的进展情况、我担心即将到来的障碍以及这对底线意味着什么。你可能会想“这不是站立会议的目的吗?”,但我们大多数人只是使用站立会议来列出我们所做的事情以及我们可能会做的事情。它不是用来进行对话的。但这正是我发现对我更有帮助的事情:对话。我们每天早上在安顿下来开始工作时,都会进行随意但详细的关于事情状态的对话,而且不超过 10 分钟。对于项目的进展情况、风险以及我是否需要任何外部帮助,从来没有任何困惑。它教会了我尽早且经常地沟通,并且(在健康的环境中)我不会因为不完美而受到惩罚。相反,我因展示了我知道如何有效沟通而获得了进一步的自主权。

尝试与你的经理就你正在做的工作进行对话。他们会为此感谢你的(在赶往他们的下一个会议的间隙)。

沟通是协作的基石,但建筑物不仅仅由基石构成。有效的协作是在作为一个团队完成任务的框架内应用的沟通——有时是一个由两个人组成的团队,有时是一个由 20 个人组成的团队。有时协作是知道何时不应该让太多人参与,这样你就可以专注于将某些东西推进到足够具体的程度以获得反馈,有时是在你获得足够的反馈以确切知道你应该构建什么之前,什么都不开始。换句话说,这是一种平衡行为。但专注于成为一名有效的工程师意味着与他人协作——分享工作、分享想法、提供良好的反馈、良好地接受反馈,最重要的是,指导(并最终赞助)你周围的人。没有良好的沟通,你就无法良好地协作,反之亦然。它们是密不可分的。

然而,这需要你学会妥协,这样你才能在不变得 defensive 的情况下进行辩护。支持你的工作或你的建议并说明你的理由是可以的,但要接受其他人可能对你正在做的事情有不同的看法或需求,并且这些意见也很重要。协作意味着就你的工作状态进行良好、健康,有时甚至是困难的讨论。学会参与其中而不会成为攻击者,并在离开时不会感到受到攻击,这是有效协作的一个主要方面。这需要整个团队共同努力,以确定一套使合作成为可能的规范。请记住,每个人都在这里尽力做到最好,但并非每个人对什么是最好的工作都有相同的看法。从这个起点建立信任。

关于导师:许多人可能会错误地认为导师制总是两个人之间的某种正式合作关系,但情况并非总是如此。每当你与他人合作时,你都在被动地(或者,更好的是,主动地)向他们传授关于你自己和你所能做的事情,就像他们也在教你一样。有效的协作可以用一句著名的格言来概括:“涨潮会抬高所有船只。”它承认你来这里是为了支持他人,正如你期望他们支持你一样。最终,你会发现自己处于能够为你指导的人辩护和提供掩护的位置(称为赞助)——但你永远无法仅仅通过努力成为不善于与他人合作的孤狼来实现这一点。

另一个需要学习的重要教训是,协作不仅仅发生在工程层面;工程师经常(尤其是对于重要项目)需要跨业务关注点进行协作才能完成任务。例如,你所做的事情可能会影响财务人员用来向业务利益相关者展示数字的报告管道。高优先级任务通常会因其影响而受到很多关注。向上和向外沟通和协作变得越来越重要——尤其是因为他们所有人对他们需要从你那里获得的信息都有略微不同的偏好。你可能会说,“好吧,那是经理的职责,这样工程师就可以继续工作了,”但这最终是不正确的。

有效管理工程师的一个目标是让他们对正确的利益相关者负责,并看着他们在这种关注下成长。将他们隐藏起来,就会阻碍他们的成长。经理的平衡行为是知道工程师何时参加会议过多,不再有足够的时间使用键盘,但那是另一回事了。对工程师提出与利益相关者直接协作的期望,你就可以帮助他们发展他们的整体技能。试图阻止他们参与这些对话,最终你只会强化这样一种观念,即他们的唯一价值在于他们编写的代码行,而不是他们为解决客户问题而构建的解决方案。

经理们,鼓励你的工程师与整个业务部门的人员协作并建立关系。

管理责任是困难的,因为你的经验越丰富,你需要负责的事情范围就越大,而关于如何做这件事的指导就越少。在实践中,这意味着负责任的行为是一种对上下文敏感的努力,通常为了承担更多的责任,你需要学习如何管理自己,以便你可以处理更多的任务,并以更大的自主性执行它们。

让我提供两个例子来澄清我的意思。有一次,我发现自己负责管理我们整个平台的排队和后台作业基础设施。这要求我对依赖此基础设施的其他工程师负责,以便他们不必积极担心其健康状况,就如何向系统添加新功能或作业提供清晰明确的建议,并帮助诊断他们的集成问题。我必须对整个公司的工程师和团队负责,不仅要负责系统的现有状态,还要帮助他们弄清楚如何增加他们对系统的依赖。幸运的是,当时我基本上只需要与其他工程师交互,因此这种情况在我当时的技能范围内是可以控制的。

后来,我负责平台财务支柱的大规模迁移。由于通过平台转移资金的机制最终会影响许多业务问题,因此突然之间,我需要与计费部门、各种产品经理以及老板的老板进行沟通,更不用说所有我可能接触到的代码的工程师了。这需要我从未接触过的协调和协作水平。这也意味着我必须更擅长与非工程师的人交谈,他们基本上不关心工程问题,他们需要知道他们的工作会发生什么变化,他们只需要知道它会正常工作。对他们来说,问题不是技术问题,而是业务问题:我们需要这些数据,我们需要准确的数据,我们需要准时的数据。再多的以工程为中心的对代码库老化性质的同情也无法安抚他们。这需要数月的计划、测试、执行、与我从未听说过的人会面,他们突然不得不信任我等等。我写了更多的电子邮件,参加了更多的会议,最终花在我的首选编辑器之外的时间比我职业生涯中的任何时候都多。毫无疑问,这让我成为了一名更好的工程师。我第一次真正接触到我正在为其提供解决方案的真实客户,获得了他们的意见,让他们了解了问题,并与他们找到了解决问题或边缘情况的妥协方案。这真是太棒了。

作为工程师,当我们承担更大、范围更广的项目时,我们需要承担起这种责任的全部重量,而不仅仅是躲在我们的代码中。通过与工程团队和其他团队联系,我对我要为谁构建和维护有了更好的了解,这帮助我了解了哪些优先级是真实的,哪些只是对更大目标的干扰。经理不能向工程师隐瞒这些机会,工程师需要知道他们何时准备好抓住这些机会。

对于许多人来说,谈论这个话题可能会感到不舒服,因为失败自然不会公平地发生。来自某些人口统计群体的人不成比例地面临对其表现的批评和最终的评判,远比其他人多得多。重要的是每个人都要明白,解决这个问题始于你。不要因为你的同事尝试并失败而惩罚他们,就像你不想受到惩罚或评判一样。将失败视为一种学习方式来庆祝。太容易陷入拆台的陷阱,尤其是那些“不像我们”的人。不惜一切代价避免这种心态。他人的成功不会威胁到你自己的成功(在许多方面,它会帮助你),将你的精力集中在帮助你周围的人成长会带来更大的回报。

像保证会失败一样计划。我并不是说要着手去失败,但教训是要在你经历失败时期待并接受它。

如果你发现自己今天处于负面的“惩罚”文化中:改变它。现在就改变它。在拉取请求 (PR) 上留下更有意义和协作性的反馈。问问自己,“我是在直接评判这个人,还是在提供关于代码的可操作反馈?”了解“这是绝对应该改变的事情”和“这不是我会做的方式,但这并不意味着它是错误的”之间的区别。为此,你可以研究一个你可以使用的短语,它可以概括这种感觉而无需直接说出来。例如,当有人向我征求关于某事的反馈,而它不是我会做的方式时,我会确保我理解他们的目标,解释我会如何处理它,并说“但你应该跟随你的内心。”这样我就不是在告诉他们如何做,只是提供关于其他人可能如何处理它的背景信息。如果他们选择不采纳我的建议,我永远不会因为我的“跟随你的内心”反馈而批评任何人。当你确实需要给出批判性反馈时,选择更好的词语。“实话实说”很容易变成“你对我来说并不重要,所以我可以随意使用任何语言来批评你的工作”。你可以诚实和直接,而无需生硬或粗暴。

总而言之,作为一名工程师,你需要学会看到失败的价值——因为你会经历很多失败。你所做的事情会崩溃,系统会突然崩溃,项目会不了了之,人们会被重新分配到其他工作,有时你只是会完全错了。这只是工作的一部分,学会不要因此而气馁,而是将其视为学习机会,这将使你在整个职业生涯中成为一名更有效的工程师。

我建议人们关注的首要技术技能是解决问题。这也是并非每个人天生就擅长的技能,但我认为每个人都可以通过足够的时间来学习。你需要专注于解决问题的策略,因为最终这就是你获得报酬的原因。

许多工程师最大的误解是他们获得报酬是为了编写代码。这是错误的。

你获得报酬是为了解决问题——但你使用的最常见的解决问题的媒介是你选择的代码编辑器。因此,在你的职业生涯初期,解决问题的行为主要与你编写代码的能力有关——修复错误、遵循规范或一组概要来添加新功能等等。但随着你的职业生涯发展以及你所做工作的范围扩大,你会越来越发现越来越难的问题,最终突破到你无法仅用代码解决的问题。但解决这些问题的动力——知道如何快速评估情况,利用你的经验来确定可能的原因,并努力证明或证伪这些假设——将永远是你工具箱中最重要的技能。

但这并不意味着你孤立地坐着,直到你可以自己解决问题——良好的问题解决通常需要让他人参与进来帮助你思考。从外部角度看待问题可以提供一组关于你可能缺乏并且可能永远无法独自获得的事物的独特信息。这是聘请来自不同背景的人的众多原因之一——如果你周围的每个人都只知道什么是钉子,你将只会制造更好的锤子,而隔壁的螺丝刀公司会抢走你的午餐。我们常常试图以一种解决方案只适合我们认为我们是谁的方式来解决问题。这会导致产品质量低下,导致代码不灵活,并导致机会丧失。挑战这一点。

当实际开始工作时,知道何时埋头苦干,何时扩大你的问题解决范围是你需要随着时间推移而磨练的这项技能的另一个方面。有时,你必须只用自己的双手来解决问题;有时你需要他人的帮助。学习何时做每件事(而且你应该总是更偏向于后者)是经验的标志。

承认这一点可能令人尴尬,但在我正在进行的一个项目中,我确实需要复习一些基本的数学知识——指数运算规则。起初,我很犹豫是否要寻求帮助。毕竟,工程师应该擅长数学。但我数学很差。我从小到大在所有数学课上都表现平平,而且我的大学(谢天谢地)对 CS 没有很强的数学要求。在如何正确地将一些基于指数的规则应用于一些财务数据上兜兜转转之后,我意识到我是一个懦夫。我走到离我最近的同事那里,请他帮我用白板写一些数学题,这样我可以再次理解这些规则。他花了将近两个小时和我一起在深夜重新学习了它是如何工作的。我现在有了一个我知道可以帮助我更好地审查代码的人,寻找更多的错误或提供更直接的关于实现的反馈。我必须解决这个问题,但我不必独自解决它,并且最终得到了一个更简单的审查过程。我仍然认为这是我在职业生涯中做过的最愉快的事情之一。

如果解决问题对你来说是自然而然的事情,你可能会认为学习也是如此。毕竟,解决问题如果不是收集和执行新信息的行为,又是什么呢?

但对于很多人来说,感觉他们“完成”了学习是很常见的。他们已经做了 X 年的工作,他们觉得自己已经站稳脚跟,他们觉得自己是某些事情的“权威”——他们很可能确实如此。但技术和我们用来维护它的工具每天都在变化。你根本不能在任何方面宣布自己“完成”了学习。

具体来说,你总是有新的东西要学习,关于如何更有效地与他人合作,你总是有新的技术领域要亲身实践,而且你总是有下一个失败隐藏在角落里,等待你从中吸取教训。除了说你不应该害怕遇到你不懂的东西,并且承认你不懂它之外,我真的没有什么明智的建议。此外,你不需要知道一切,尽管这感觉很诱人。这是不可能的,如果你可以信任你周围的人,你就不需要知道一切。参加其他团队的事后分析会议。在产品中找到你不理解的东西,然后去问别人。请你的老板帮助你找到一个新的代码库领域供你学习。渴望知识,它会找到通往你的道路。

在 Twitter 帖子中,我因使用了“更年轻”这个带有偏见的词语而受到了正确的批评,所以我想首先澄清一下,我的意思是“职业生涯更年轻”,而不是年龄。现在人们比以往任何时候都更容易改变职业,因此我们需要注意,不要仅仅根据年龄对人施加偏见。

在我看来,这些技能比任何技术都重要。虽然很容易指出一些常年的支柱,但这通常不是人们想听到的。他们想听到的是“学习 Kubernetes,因为它实际上是每个人都在做的,所以它永远不会过时永远。”或者“这个新的(Apache/Cloud Native Foundation/你从未听说过的其他联盟项目)将在五年内成为潮流,所以现在就成为这方面的专家。”可悲的事实是,这些答案实际上对一个人的成长是有害的。你很有可能在任何地方找到一份工作都会有自己的技术栈,这是你无法预测的(但你可以打赌它会在某个地方包含一些 SQL),你会在那份工作中花费大量时间学习和成长以管理该技术栈。

相反,当有人问你他们应该学习什么技术时,问问他们想学什么。他们对什么感兴趣?也许是图表,也许是统计数据,也许是艺术或摄影或音乐。这些都可以指向有趣且小众的技术,合适的人会因为它们实现的结果而爱上它们,而不是因为关于它们将如何接管的华丽博客文章。在个人层面上与人们互动,找出让他们兴奋的事情以及他们希望用技术解决的问题,并鼓励他们学习这些技术。

但如果有人问如何成为一名更优秀的工程师,想想是什么会让团队想要聘用他们。以我的经验来看,是这篇博文中涵盖的技能和态度。我会优先考虑这些,而不是任何一项技术或编程语言。

作为一名职业工程师,你花费时间最多的事情是沟通。与其它工程师沟通,与产品经理沟通,与支持和销售部门沟通,与你的老板沟通,甚至可能时不时地与他们老板的老板沟通。有效地管理这些关系——通过在多个方向上成为优秀的沟通者,即使在意见不一致时也能与他人良好合作,处理越来越困难和复杂的责任,从不可避免的失败中学习并且不为此而沮丧,专注于将这些技能应用于解决问题(技术问题或其它问题)的领域,以及最重要的是始终成长和学习——这些技能将把你带向成功的工程职业生涯,比任何一项单独的技术技能都重要。

除了可能 SQL 之外。你知道吗,帮自己一个忙,学习 SQL。任何告诉你某种时髦的新型数据库消除了学习 SQL 的需求的人都在撒谎,无论他们是否意识到这一点。学习 SQL;它真的很有价值,而且不会过时。

User profile image.
工程师,演讲者,作家,头发增长者。我以前在 NBA Jam 中很厉害。但现在不太行了。可以提供糟糕的建议,费用可议。

10 条评论

对我来说,这句话不太对劲
“学会失败,并从失败中学习。”
我认为更像是不要害怕失败,因为失败总是代表着学习的机会。如果你没有不理性的恐惧,你就会愿意将某些系统推向极限甚至超越极限,这样你最终会获得关于事物为何失败的真实信息。策略性地避免失败会导致对失败发生的原因和方式产生错误的认识,并且还会阻止在失败中看到一些意想不到的积极结果。

实际上,我有一个关于这个主题的完整演讲,字面意思就叫做“不要害怕失败”哈哈。我只是想在这篇文章中提供一个稍微不同的看法(以及不同的措辞),因为它只是我认为工程师应该关注的一个方面。我实际上很犹豫是否在顶部放一个“快速总结”,因为我担心人们只会简单地阅读这些要点,而不会深入阅读帖子中的内容,但希望文章中的实际内容能够消除您对我试图传达的建议的担忧。

感谢您的阅读!

回复 作者 Greg P

很棒的文章,观点全面。今天早上在一个会议中使用了“不带防御性地辩护”这句话!

精彩的文章!我是一位前 IT 从业人员,为了攻读会计学博士学位而离开了 IT 行业。我一直担心我可能永远无法回到 IT 行业,尽管我已经教授了五年会计信息技术(包括 SQL!),但您让我明白,使研究人员、教师或会计师变得伟大的相同技能也使工程师变得伟大。感谢您给了我视角和希望。

谢谢!我很高兴您觉得它有价值!祝您好运!

回复 作者 TheGNUdist (未验证)

嗨 Sean,这篇文章真是我早晨咖啡时间里受欢迎的读物!我喜欢你对自己经历的诚实,尤其是当你说“我从我所担任的角色中较优秀的人之一变成了勉强糊口的人……”时。我将与我们最近在初创公司中建立的一个关于指导的小组分享这篇文章。

谢谢!我很高兴你喜欢它,并希望它也能帮助其他人!

回复 作者 Paul K. Courtney (未验证)

这篇文章拓宽了我的视野。我对你的几乎所有经历都感同身受,我可以回忆起由于缺乏这些态度而犯下的同样错误。非常感谢您发布这篇文章,并祝您事业顺利。

听到这些真是太棒了。我很高兴这里的信息也引起了您经历的共鸣!

回复 作者 Tiago

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.