工程师的职业建议:离开键盘

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

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

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

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

在 Twitter 上讨论

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

如果您只是在寻找简短版本,这里是

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

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

  • 理解负责某事意味着什么,并努力实现您的承诺。职业生涯的晋升意味着更广泛的责任和更少的方向指导。

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

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

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

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

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

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

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

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

现在也是指出,没有人应该期望您在所有或任何这些技能方面始终做到完美。每个人都有糟糕的日子。关键是要让糟糕的日子成为例外,这样当事情变得有点太艰难,并且您的反应方式(反思后)低于标准时,人们不会认为那是您的常态。这些技能将帮助您在团队中建立信誉,以便在您因任何原因没有发挥出最佳水平时兑现这些信誉。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

像对待失败是必然发生的事情一样进行计划。我不是说要开始就想着失败,而是要吸取的教训是要预料到并接受它在发生时发生。

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

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

我建议人们关注的首要技术技能是问题解决。这也是并非每个人天生就擅长的技能,但我认为每个人都可以在足够的时间内学会。您需要专注于解决问题的策略,因为归根结底,这就是您获得报酬的原因。

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

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

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

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

承认这一点可能令人尴尬,但在我正在进行的一个项目中,我确实需要复习一些基本的数学知识——指数规则。起初,我很犹豫是否要求助。毕竟,工程师应该擅长数学。但我在这方面很糟糕。我从小到大在所有数学课上的成绩都平平,而且我的大学(谢天谢地,当时对我来说)对计算机科学没有很强的数学要求。在绞尽脑汁思考如何将一些基于指数的规则正确应用于一些财务数据后,我意识到自己是一个懦夫。我去找我最近的同事,请他帮我用白板写一些数学公式,以便我可以再次理解这些规则。当天晚些时候,他花了将近两个小时与我在一起,我们都重新学习了它是如何工作的。我现在认识了一个可以帮助我更好地审查代码的人,寻找更多错误或提供关于实现的更直接的反馈。我必须解决这个问题,但我不必独自解决它,并且最终因为这样而获得了更轻松的审查过程。我仍然认为这是我在职业生涯中做过的最愉快的事情之一。

如果问题解决对您来说是天生的,您可能会认为学习也是如此。毕竟,问题解决如果不是收集和执行新信息的行为,那又是什么呢?

但是,很多人感觉自己“完成”学习是很常见的。他们从事这项工作已经 X 年了,他们感觉自己已经确立了地位,他们感觉自己是某些事情的“权威”——而且他们很可能确实是。但技术和我们用来维护它的工具每天都在变化。您根本不能在任何方面宣布自己“完成”学习。

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

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

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

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

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

作为一名职业工程师,您花费时间最多的第一件事就是交谈。与另一位工程师交谈,与产品经理交谈,与支持和销售人员交谈,与您的老板交谈,甚至有时与他们的老板交谈。能够有效地管理这些关系——通过在多个方向上成为一名优秀的沟通者,即使在您不同意时也能与他人良好合作,处理越来越困难和复杂的责任,从您遇到的不可避免的失败中学习,而不是沉迷于失败,专注于将这些技能应用于解决问题(技术或其他方面),最重要的是始终成长和学习——这些技能将帮助您在工程领域取得成功的职业生涯,胜过任何一项单独的技术技能。

或许 SQL 除外。听着,帮自己一个忙,去学学 SQL。 任何告诉你某些新潮的数据库技术可以取代学习 SQL 的必要性的人都是在撒谎,无论他们是否意识到这一点。 学习 SQL;它真的很有价值,而且不会过时。

User profile image.
工程师、演讲者、作家、头发种植者。 我曾经在 NBA Jam 游戏中很厉害。 虽然现在不怎么厉害了。 可以提供糟糕的建议,费用面议。

10 条评论

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

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

感谢您的阅读!

回复 ,评论者 Greg P

很棒的文章,观点全面。 今天早上在会议中使用了“在不具有防御性的情况下进行辩护”这句话!

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

嗨 Sean,这篇文章真是一篇受欢迎的早间咖啡阅读! 我喜欢你对自己经历的坦诚,特别是当你说,“我从成为角色中较优秀的人之一,到几乎勉强糊口……”时。 我将与我们最近在初创公司中建立的一个关于指导的小组分享这篇文章。

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

© . All rights reserved.