工程师职业建议:远离键盘

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

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

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

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

在 Twitter 上谈论

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

如果您只是想看简短版本,这里就是

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

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

  • 理解负责某事意味着什么,并努力实现你的承诺。职业生涯的提升意味着更广泛的责任,以及更少的关于如何处理它的指导。

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

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

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

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

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

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

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

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

现在也是时候指出,没有人应该期望你在所有这些技能方面,或者在任何技能方面始终完美。每个人都有状态不好的时候。重点是让状态不好的时候成为例外,这样,当事情变得有点太艰难,你的反应方式(反思后)你知道是不合格的时候,人们不会认为那是你的常态。这些技能将帮助你在你的团队中建立信誉,你可以在那些时刻兑现这些信誉,当你因为任何原因没有在某个情况下发挥出最佳水平时。

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

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

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

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

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

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

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

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

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

经理们,鼓励你们的工程师与企业界人士协作并建立关系。

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

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

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

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

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

像保证失败一样计划。我并不是说要立志失败,但教训是要在你失败时预期并接受它。

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

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

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

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

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

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

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

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

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

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

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

在 Twitter 话题中,我因使用带有偏见的词语“年轻”而受到批评,所以我想首先澄清一下,我指的是“职业生涯较年轻”,而不是年龄。现在人们比以往任何时候都更容易转行,所以我们需要注意,不要仅仅根据年龄对他人抱有偏见。

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

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

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

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

也许除了 SQL。你知道吗,帮自己一个忙,学习 SQL。任何告诉你某种新潮的数据库消除了学习 SQL 的必要性的人都在撒谎,无论他们是否意识到这一点。学习 SQL;它真的很有价值,而且不会消失。

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

10 条评论

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

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

感谢阅读!

回复 作者 Greg P

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

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

嘿 Sean,这篇文章真是一篇令人愉快的早间咖啡读物!我喜欢你对自己经历的诚实,特别是当你说道,“我从成为我所在角色中较优秀的人之一,变成了勉强糊口......”我将与我们最近在初创公司中建立的关于指导的小组分享这篇文章。

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

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