在我的职业生涯中,我对工作方式经历了两次到三次重大的思维转变。起初,我只专注于工程——试图尽可能多地了解我正在使用的语言或库,非常注重“琐事”,并最终忽略他人的担忧,只是为了编写好的代码。这并不是说我没有努力与同事相处或帮助他们,但我改进的努力都是为了我自己;毕竟,当我变得更好时,团队和公司也会做得更好。公平地说,这种方法并非完全没有道理。作为工程师,我们必须不断发展、学习更多、不断改进,因为行业变得越来越困难,每天都需要更多的技术解决方案来解决更大的问题。这种方法在我的职业生涯的前半段对我来说效果很好,那时我还是个资历较浅的人,有这种自私(尽管是善意的)动机。
后来,我换了一份工作,在一个办公室里与更多的工程师共事,比我整个职业生涯中合作过的工程师还要多。这份工作几乎让我崩溃。我从角色中的佼佼者之一变成了勉强糊口……持续了近两年。我努力取得成功,我总是感到自己不如周围的人,而且很多时候我不明白他们为什么要雇用我(事实证明,我的一些同事也有这种感觉)。但是,没有什么重大的顿悟,也没有什么决定性的时刻让情况好转。只是一系列艰难的、彻底的失败,我从中只有两个选择——放弃或学习和成长。我尽力选择了后者。当我回到一家规模较小的初创公司时,我亲眼目睹了从头开始,围绕这些经验教训巩固一种文化是多么重要。
当我在初创公司被一家更大的公司收购后转型为管理层时,我的最终思维转变发生了。我没有选择成为一名经理;是管理层选择了我,因为他们向我提供了这个职位。他们还告诉我,虽然每个人都非常信任我,但他们选择我的最终原因是,他们认为从内部提拔某人比从外部聘请某人动荡更小。收购后,我们的时间表非常紧迫,我的新公司不想因为引入一位不信任团队的外部领导者而冒险。我发现,这个阶段巩固了我之前学到的一切关于在工程岗位上如何有效工作的知识——并且加大了我每天每分钟都需要应用这些经验教训的力度。
在 Twitter 上讨论
2018 年 5 月,在与我们扩展团队的一位初级成员进行了一次特别有意义且有价值的对话后,我在 Twitter 上发布了关于职业发展的推文。这条 Twitter 帖子比我预期的更受关注,Matt Broberg 邀请我为 Opensource.com 撰写关于它的文章。(Matt 告诉我我不允许在这篇文章中说脏话,所以请理解他的管辖权不延伸到我的推文。)
如果您只是想看简短版本,这里是
-
专注于改进您与他人的沟通方式,特别是沟通的内容、语气和及时性。
-
努力成为更强大的合作者——“角落里的工程师”不是你想要的头衔
-
理解对某事负责意味着什么,并努力实现你的承诺。在你的职业生涯中晋升意味着更广泛的责任和更少的关于如何处理它的指导。
-
学会失败,并从失败中学习。你会经历很多失败,大多数是小失败……但也有一些大失败。不要让它让你脱轨;把它作为你下一个成功的垫脚石。
-
“解决问题”是你可能拥有的最重要的工程技能。
-
永不停歇地学习。如果你停止学习,你就会停止成长。如果你停止成长,你就无法走向更大更好的事物。
-
学习 SQL;以后你会感谢我的
如何成为一名成功的工程师
最近,我们团队的一位年轻成员问我:“你希望在软件工程师身上看到什么?”。他告诉我,我的回答让他感到惊讶,并且与他得到的其他答案不同,但在过去的几天里,我最终与不同级别的许多人进行了同样的对话...
— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
在一位支持工程师向我咨询关于如何成长为软件工程师的建议后,我发布了这条推文(以及随后的帖子)。我想他期望我列出一系列技术、工具和编程语言,这些可以帮助他在工程团队中找到一份工作。相反,我给了他一份需要关注的行为清单。我的想法是,无论你从事什么工作(尤其是在初级职位),都可能会培训你成功所需的技术。(至少,在任何与如何以及雇用谁建立健康关系的地方都是如此。)但我提到的事情是工程师不太可能明确与他合作的事情,因为它们传统上与我们不幸地称之为“软技能”的东西有关。
我在这里暂停一下,声明一下“软技能”这个短语淡化了它们在成为一个全面发展的人,更不用说成为团队的成功成员方面所起的作用。尽量避免这样称呼它们(我在这里使用它是因为可悲的是,这是我们都知道的术语)。“整体技能”可能是一个更好的术语,但它不太吸引人,而且老实说,我不是来向你推销花哨的新术语的。
我还想说,我即将阐述的这些事情并不是我认为我总是能正确做到的事情,甚至也不是我做了 15 年后仍然不需要努力的事情。
但在我的职业生涯中,这些一直是我想要合作的优秀工程师的标志— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
重要的是要指出,这些技能不是你永远“实现”或停止增长的技能(我认为这对于大多数技能来说都是如此,但尤其是在这种情况下)。团队动态非常复杂。作为人,我们是反复无常的。我们有好的日子和坏的日子,我们会挣扎,我们会崩溃。更糟糕的是,我们这样做的方式无法在 FAQ 中涵盖或在脚本中自动化,这与我们运行的许多系统不同。我们的失败案例倾向于无限,因此我们学习、适应和恢复的能力需要与之匹配。我失败过无数次,并且接受我还会失败无数次。但只要我一直在学习,我就一直在成长。我可以自信地说,在我职业生涯中我最喜欢合作的人,他们在以下技能方面都评价很高,主要是因为他们一直在努力提高这些技能。
现在也是时候注意,没有人应该期望你一直完美地掌握所有或任何这些技能。每个人都会有糟糕的日子。重点是让糟糕的日子成为例外,这样当事情变得有点太艰难,你的反应方式(反思后)你知道是不合格的时候,人们不会认为那是你的常态。这些技能将帮助你在你的团队中建立信誉,你可以在那些因为任何原因而没有发挥出最佳水平的时刻兑现这些信誉。
良好沟通
他们知道如何有效地与他人分享他们的知识。他们知道何时应该更技术性/更少技术性,以及使用更多/更少的细节。他们理解肢体语言的重要性。当事情进展不顺利时,他们不会躲藏起来,而是经常向上/向外沟通。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
沟通是你作为一名高效工程师生活中最重要的部分之一。你可以在角落里当独行侠,编写出精湛的代码,而没有人干扰你的技艺,这种想法对于我们行业中 99% 的人来说是不现实的——可能甚至更多。虽然独自一人高效完成工作的浪漫想法非常诱人,但隐藏在其中的陷阱是,这些人通常被视为一种负担。
在我的职业生涯早期,我以为自己是一个好的沟通者,但我后来意识到,当不重要的时候我是一个过度沟通者,而当重要的时候我是一个沟通不足者。我努力找到合适的平衡——何时变得过于技术性(我几乎总是这样做),以及何时只给出 50,000 英尺的概览——这取决于我与哪种类型的人交谈。当事情进展不顺利或“尚未准备好被看到”时,我也会躲藏起来——我不会太晚才寻求帮助,我会独自迭代设计,直到我感觉它们准备好了,并且我将对方法的批评误认为是对我自己的批评。我花了数年时间才将需要尽早向同事公开我的想法、我的工作状态以及我的设计的原始性质内化。
我记得我注意到自己在这方面有所进步。我当时正在进行一个小型但重要的工作项目,我没有等到问题积累到爆发的地步,而是每天都告诉我的经理项目的进展情况、我担心即将出现的障碍以及这对底线意味着什么。你可能会想“这难道不是站立会议的目的吗?”,但我们大多数人只是使用站立会议来罗列我们所做的事情以及我们可能要做的事情。它不是用来进行对话的。但我发现对话对我的效率更有帮助:就事情的状况进行随意但详细的对话,每天早上在我安顿下来开始一天的工作时,对话时间不超过 10 分钟。对于项目的进展情况、风险以及我是否需要任何外部帮助,从来没有任何困惑。它教会我尽早且经常地沟通,并且(在健康的环境中)我不会因为不完美而受到惩罚。相反,我因展示了自己知道如何有效地沟通而获得了进一步的自主权。
尝试与你的经理就你正在做的工作进行对话。他们会为此感谢你的(在奔赴下一个会议的间隙)。
良好协作
他们知道何时是与他人合作的合适时机,何时是独自埋头苦干的合适时机。他们不害怕与团队其他成员交流想法——包括资历较浅的和资历较深的成员。他们可以捍卫自己的立场,而不会变得 defensive。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
沟通是协作的基石,但建筑物不是仅由基石建成的。有效的协作是在作为一个团队完成工作的框架内应用的沟通——有时是一个由两个人组成的团队,有时是一个由 20 个人组成的团队。有时协作是知道何时不让太多人参与,这样你就可以专注于将某件事做到足够具体,以便获得反馈,有时是在你获得足够的反馈以确切知道你应该构建什么之前,什么都不开始。换句话说,这是一个平衡行为。但专注于成为一名高效的工程师意味着与他人协作——分享工作、分享想法、给出好的反馈、良好地接受反馈,最重要的是,指导(并最终赞助)你周围的人。没有良好的沟通,你就无法良好地协作,反之亦然。它们是密不可分的。
然而,这需要你学会妥协,这样你才能在捍卫自己的立场的同时不显得 defensive。用你的理由来支持你的工作或你的提议是可以的,但要接受其他人可能对你正在做的事情有不同的看法或需求,并且这些意见也很重要。协作意味着就你的工作状态进行良好、健康,有时甚至是困难的讨论。学会参与这些讨论而不成为攻击者,并且在离开时没有受到攻击的感觉,是有效协作的一个主要方面。这需要整个团队共同努力,建立一套使合作成为可能的规范。请记住,每个人来到这里都是为了尽力做好自己的工作,但并非每个人都对什么是最好的工作有相同的看法。从这个起点建立信任。
关于导师:许多人可能会错误地认为指导总是两个人之间某种正式的伙伴关系,但情况并非总是如此。每当你与他人合作时,你都在被动地(或者,更好的是,主动地)向他们传授关于你自己的事情以及你能做什么,就像他们也在教你一样。有效的协作可以用一句著名的格言来概括:“涨潮会抬高所有船只。” 它承认你在这里是为了支持他人,就像你期望他们支持你一样。最终,你会发现自己处于一个可以为你指导过的人辩护和提供掩护(称为赞助)的位置——但你永远无法通过仅仅努力成为不与他人好好合作的独行侠来实现这一点。
另一个需要学习的重要课程是,协作不仅仅发生在工程层面;工程师经常(特别是对于重要项目)需要跨业务关注点进行协作才能完成工作。例如,你所做的事情可能会影响财务人员用来向业务利益相关者展示数字的报告管道。高优先级的任务通常会因为其影响而受到很多关注。向上和向外沟通和协作变得越来越重要——尤其是因为他们所有人对他们需要从你那里获得的信息都有稍微不同的偏向。你可能会说,“好吧,那是经理的职责,这样工程师就可以继续工作了”,但这最终是不正确的。
有效管理工程师的一个目标是让他们对正确的利益相关者负责,并看着他们在这种光环下成长。将他们隐藏起来,就会阻碍他们的成长。经理们需要把握的平衡是,何时工程师参加的会议太多,而不再有足够的时间在键盘上工作,但那是另一回事了。让工程师承担直接与利益相关者协作的期望,你就能帮助他们培养全面的技能。试图阻止他们进行这些对话,最终你只会强化这样一种观念,即他们的唯一价值在于他们编写的代码行,而不是他们为解决客户问题而构建的解决方案。
经理们,鼓励你们的工程师与整个业务部门的人员协作并建立关系。
承担责任
可以信任他们能够达到或超过他们的水平。他们努力按时完成任务(结合第 1 点和第 2 点),并且知道按时完成任务的重要性。或者他们可以帮助调整期望,以便业务部门的其他人员知道为什么无法按时完成任务。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
管理责任是困难的,因为你获得的经验越多,你需要负责的事情范围就越大,而关于如何做的指导就越少。实际上,这意味着负责任地行事是一种与环境相关的努力,而且通常为了承担更多的责任,你需要学习如何管理自己,以便你可以处理更多的任务,并以更大的自主性执行它们。
让我提供两个例子来澄清我的意思。有一次,我发现自己负责管理我们整个平台的排队和后台作业基础设施。这要求我对依赖此基础设施的其他工程师负责,这样他们就不必积极担心其健康状况,提供关于如何向系统添加新功能或作业的清晰明确的建议,并帮助诊断他们集成方面的问题。我必须对整个公司的工程师和团队负责,不仅要负责系统的现有状态,还要帮助他们弄清楚如何增加对系统的依赖。幸运的是,当时我基本上只需要与其他工程师沟通,因此这种情况在我当时拥有的技能范围内是可控的。
后来,我负责平台财务支柱的大规模迁移。由于资金在平台中流动的齿轮最终会影响许多业务关注点,因此突然间我需要与来自账单部门、各个产品经理和老板的老板们沟通,更不用说所有我可能接触到的代码的工程师了。这需要一种我从未接触过的协调和协作水平。这也意味着我必须更擅长与非工程师的人交谈,他们基本上不关心工程问题,他们需要知道他们的工作会发生什么变化,并且他们只需要知道它会正常工作。对他们来说,问题不是技术问题,而是业务问题:我们需要这些数据,我们需要准确的数据,我们需要按时获得数据。再多的以工程为中心的对代码库老化的抱怨都无法安抚他们。这花费了数月的计划、测试、执行、与我从未听说过的人会面,他们突然不得不信任我等等。我写了更多的电子邮件,参加了更多的会议,并且最终花在我的首选编辑器之外的时间比我职业生涯中的任何时候都多。毫无疑问,这让我成为了一名更好的工程师。我第一次真正接触到我正在为其提供解决方案的真实客户,获得了他们的意见,让他们了解了问题,并与他们找到了解决问题或边缘案例的折衷方案。这真是太棒了。
作为工程师,当我们承担更大范围的项目时,我们需要拥抱这种责任的全部重量,而不仅仅是躲在我们的代码中。通过与工程团队和其他团队(包括其他部门)联系,我对我要为谁构建和维护有了更好的了解,这帮助我了解了哪些优先级是真实的,哪些只是对更大使命的干扰。经理们不能向工程师隐瞒这些机会,工程师们需要知道他们何时准备好拥抱这些机会。
能够处理失败
这是一个棘手的问题,因为并非每个人都处于平等的地位——而且同样的错误可能会根据你是谁而受到不同的批评,这很不幸。但是,对如何从失败中学习并克服失败的一般理解是必须的。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
对于许多人来说,谈论这一点可能是不舒服的,因为失败的发生自然是不公平的。来自某些人群的人比其他人更多地不成比例地面临对其表现的批评,并最终受到评判。重要的是每个人都要明白,解决这个问题始于你。不要因为你的同龄人尝试和失败而惩罚他们,就像你不希望自己受到惩罚或评判一样。庆祝失败是一种学习方式。太容易陷入指责他人的陷阱,尤其是那些“不像我们”的人。不惜一切代价避免这种心态。他人的成功不会威胁到你自己的成功(在许多方面,它会帮助你),将你的精力集中在帮助你周围的人成长会获得更大的回报。
像对待失败是必然的一样进行计划。我并不是说要立志失败,但教训是,当失败发生时,要期待并拥抱它。
如果你发现自己今天身处负面的“惩罚”文化中:改变它。现在就改变它。在拉取请求 (PR) 上留下更有意义和协作性的反馈。问问自己,“我是在直接评判这个人,还是在提供关于代码的可操作反馈?” 了解“这是肯定应该改变的东西”和“这不是我会做的方式,但这并不意味着它是错误的”之间的区别。为此,你可以努力想出一个短语,你可以用它来表达这种感觉,而无需直接说出来。例如,当有人向我寻求对某事的反馈,而这并不是我会做的方式时,我会确保我理解他们的目标,解释我会如何处理它,并说“但你应该跟随你的内心。” 这样我就不是在告诉他们如何做,只是提供了关于其他人可能如何处理它的背景信息。如果他们选择不采纳我的建议,我也绝不会因为我的“跟随你的内心”反馈而责备任何人。当你确实需要给出批判性反馈时,选择更好的措辞。“实话实说”很容易变成“你对我来说并不重要,所以我可以随意使用任何语言来批评你的工作”。你可以诚实和直接,而无需生硬或粗鲁。
总而言之,作为一名工程师,你需要学习如何看待失败的价值——因为你会经历很多失败。你所做的事情会崩溃,系统会突然崩溃,项目会失败,人们会被重新分配到其他工作,有时你只是会完全错误地理解事情。这只是工作的一部分,学会不因此而气馁,而是将其视为学习机会,将使你在职业生涯中成为一名更有效的工程师。
解决问题的能力
对寻求合适的解决方案和理解根本原因的自然倾向,从未辜负过我见过的任何工程师。你不需要成为编程界的夏洛克·福尔摩斯才能成为一个优秀的解题者,你只需要奉献精神和专注。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
我建议人们关注的第一技术技能是解决问题。这也是并非每个人天生擅长的技能之一,但我认为每个人都可以通过足够的时间来学习。你需要专注于解决问题的策略,因为最终这就是你的报酬。
许多工程师最大的误解是他们被雇佣来编写代码。这是错误的。
你的报酬是解决问题——但你使用的最常见的解决问题的媒介是你选择的代码编辑器。因此,在你的职业生涯初期,解决问题的行为主要与你编写代码的能力有关——修复错误、遵循规范或一系列概要来添加新功能等等。但是,随着你的职业生涯的发展和你所从事的工作范围的扩大,你会越来越发现越来越难的问题,最终突破到你无法仅用代码解决的问题。但是,解决这些问题的动力——知道如何快速评估情况,利用你的经验确定可能的原因,并努力证明或证伪这些假设——将始终是你工具箱中最重要的技能。
但这并不意味着你孤立地坐着,直到你可以自己解决问题——良好的问题解决通常需要让他人参与进来帮助你思考。从外部角度看待问题可以提供一组关于你可能缺乏并且可能永远无法独自获得的事物的信息。这是聘请来自不同背景的人的众多原因之一——如果你周围的每个人只知道什么是钉子,你将只会制造出更好的锤子,而隔壁的螺丝刀公司会抢走你的午餐。我们经常尝试以一种解决方案只适合我们认为自己是谁的方式来解决问题。这会导致产品质量差、代码不灵活,并导致机会丧失。挑战这一点。
当实际开始工作时,了解何时应该埋头苦干,何时应该扩大你的问题解决范围,是你需要随着时间推移磨练的这项技能的另一个方面。有时,你必须仅用自己的双手来解决问题;有时你需要他人的帮助。学习何时做每件事(你应该始终更倾向于后者)是经验的标志。
承认这一点可能令人尴尬,但在我正在进行的一个项目中,我确实需要复习一些基本的数学——指数运算规则。起初,我犹豫是否要寻求帮助。毕竟,工程师应该擅长数学。但我数学很糟糕。我从小到大在所有的数学课上都表现平平,我的大学(谢天谢地,对当时的我说)对 CS 没有很强的数学要求。在如何正确地将一些基于指数的规则应用于一些财务数据上空转了一段时间后,我意识到我是一个懦夫。我走到离我最近的同事那里,请他帮我用白板写一些数学,这样我就可以再次掌握这些规则。他那天晚些时候花了将近两个小时和我在一起,我们都重新学习了这是如何工作的。我现在有了一个我知道可以帮助我更好地审查代码的人,寻找更多的错误或提供更直接的关于实现的反馈。我必须解决这个问题,但我不必独自解决它,并且最终获得了更简单的审查过程。我仍然认为那是我职业生涯中最愉快的事情之一。
享受学习
我们的行业发展太快了。每天都有新技术问世,旧的“最佳实践”被揭露为我们一直都知道的骗局等等。你不必跟上一切,但你应该享受学习的过程。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
如果解决问题对你来说是自然而然的事情,你可能会认为学习也会如此。毕竟,如果解决问题不是收集和执行新信息的行为,那又是什么呢?
但是,对于很多人来说,感觉他们“完成”了学习是很常见的。他们已经从事这项工作 X 年了,他们觉得自己已经站稳脚跟了,他们觉得自己是某些事情的“权威”——他们很可能确实如此。但是,技术和我们用来维护它的工具每天都在变化。你根本不能在任何方面宣布自己“完成”了学习。
具体来说,你总是有新的东西要学习,关于如何更有效地与他人合作,你总是有新的技术领域要亲身实践,你总是有一个新的失败隐藏在角落里,等待你从中吸取教训。除了说你不应该害怕遇到你不懂的东西,并承认你不懂它之外,我真的没有太多明智的建议。此外,你不必知道一切,尽管这感觉很诱人。这是不可能的,如果你可以信任你周围的人,你就不需要知道一切。参加其他团队的事后分析会议。在产品中找到你不理解的东西,然后去问别人。请你的老板帮助你找到一个新的代码库领域来学习。渴望知识,知识就会找到它的方式来到你身边。
我特意告诉他“你会注意到我没有在其中提到任何特定的技术或工具”,这是有充分理由的。
与上述内容相比,你可以更容易地被教授这些东西。你可以带一个具备上述所有技能的工程师,并教他们你的技术栈。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
但反过来是不成立的——你不能带一个了解你的技术栈的工程师,并在短时间内教会他们以上几点。事实上,一个人的资历越高,纠正起来就越困难。
这就是为什么有时冒险选择年轻的工程师是最好的选择。— Sean Kelly (@StabbyCutyou) 2018 年 5 月 31 日
在 Twitter 帖子中,我因使用了带有歧义的术语“年轻的”而受到了正确的批评,因此我想首先澄清一下,我指的是“职业生涯较短的”,而不是年龄。对于人们来说,改变职业比以往任何时候都更容易,因此我们需要注意,我们不要仅仅根据年龄来对人产生偏见。
在我看来,这些技能比任何技术都重要。虽然很容易指出一些常青不衰的主流技术,但这通常不是人们想听的。他们想听的是“学习 Kubernetes,因为它实际上是每个人都在做的,所以它永远不会过时永远。” 或者“这个新的(Apache/Cloud Native Foundation/你从未听说过的其他联盟项目)将在五年后成为潮流,所以现在就成为这方面的专家。” 可悲的事实是,这些答案实际上对一个人的成长是有害的。你找的任何工作岗位,都很可能拥有你无法预测的技术栈(但你可以肯定它会在某处包含一些 SQL),而且你将在工作中花费大量时间学习和成长,以管理该技术栈。
相反,当有人问你应该学习什么技术时,问问他们想学什么。他们对什么感兴趣?也许是图论,也许是统计学,也许是艺术、摄影或音乐。这些都可以指向有趣且小众的技术,合适的人会因为这些技术带来的成果而爱上它们,而不是因为那些关于它们将如何接管世界的浮华博客文章。与人们进行个人层面的交流,了解是什么让他们兴奋,以及他们希望用技术解决什么问题,并鼓励他们学习这些技术。
但是如果有人问如何成为一名更优秀的工程师,想想是什么会让团队想要雇用他们。以我的经验,是这篇博文中涵盖的技能和态度。在任何一天,我都会优先考虑这些,而不是任何一项技术或编程语言。
工程师们常常认为“改进的途径就是更努力地搞技术”。学习更多技术,成为更深入的学科专家等等。虽然这没有错,但这也不是完全准确的。当你在职业生涯中进步时,你不能忽视上述技能组合。
— Sean Kelly (@StabbyCutyou) May 31, 2018
当我的团队中有人希望从初级职位晋升到更高级职位时,我首先关注的是上述这些方面——因为更资深的人是更广泛地面向大众的人。他们无法避免与他人互动,因为他们更是在完成任务的核心。
— Sean Kelly (@StabbyCutyou) May 31, 2018
作为一名职业工程师,你花费时间最多的事情是沟通。与其它工程师沟通,与产品经理沟通,与支持和销售部门沟通,与你的老板沟通,甚至可能时不时地与他们的老板沟通。有效地管理这些关系——通过成为一个多方向的优秀沟通者,即使在你不同意时也能与他人良好合作,处理日益困难和复杂的责任,从你不可避免地遇到的失败中学习并且不纠结于它们,专注于将这些技能应用于解决问题(技术或其他方面),以及最重要的是始终成长和学习——这些技能将把你带入成功的工程职业生涯,比任何一项单独的技术技能都更重要。
除了 SQL 也许。你知道吗,帮自己一个忙,学习 SQL。任何告诉你某种新潮的数据库取代了学习 SQL 的必要性的人都在撒谎,无论他们是否意识到这一点。学习 SQL;它真的很有价值,而且不会过时。
如果你看到这里,这是一张我狗狗的酷照片 pic.twitter.com/3Ex92HOdyH
— Sean Kelly (@StabbyCutyou) May 31, 2018
10 条评论