成为一名高级软件工程师所学到的东西

2020-09-07 18:34:25

2018年,我开始在彭博社工作。从那以后,情况发生了很大变化。我不再是公司里最初级的成员了,我已经指导了相当多的新工程师,这真是令人惊叹。它帮助我观察别人与我的不同之处,吸收他们的最佳实践,并找出我在不知不觉中做得相当好的事情。

每年一次的工作回顾是浓缩我学到的这些教训的好方法。它们对于模式匹配也很有价值。只有当我缩小时,某些图案才会变得可见。然后我就可以有意识地追踪这些模式。

今年的大主题是缩小和挑战边界。它还涉及放大,并为去年的部分增加细微差别。如果你先读了去年的评论,那会更有趣:然后你就可以不同于我的成长了。1个。

进入第二年,我已经掌握了所有的基础知识。我摘完了所有低垂的果实,我的生长速度放慢了。不太好。我脑海中最大的问题是“我怎样才能成长得更远?”

要提高我的编码技能,我能做的就这么多了。大多数博客鼓吹编写更干净的代码、重复自己、不重复自己的技术,等等都是微优化。几乎没有一个能让我立即产生影响。2个。

不过,我确实想出了一些很有见地的东西。我在软件开发生命周期内工作,但这个生命周期是更大的生命周期的一部分:产品和基础设施开发生命周期。我决定走得更远,而不是更深。令人惊讶的是,广度为我所知提供了更多的深度。

我从三个大的方向展开:了解我周围的人在做什么,学习良好的思维习惯,获得新的思维工具。

因为我们不是在一个封闭的系统中,所以更好地理解产品经理、销售人员和分析师的工作是有意义的。归根结底,这是一项通过产品赚钱的生意。我们的目标不是编写代码,而是成为一项有利可图的业务。3个

大多数大公司不仅仅在做一件事,这意味着在同一家公司有不同的赚钱途径。每个人都至少有一条路--如果不是,他们就不会在这里。4追踪这些小路,我现在走的这条小路非常有价值。它帮助我认识到我有多重要,以及我可以利用哪些杠杆来变得更有效率。有时,这是为了让销售工作变得更容易,这样他们就可以做更多的销售。其他时候,它是关于为客户构建一个新功能。而另一些时候,它是关于改进一个不断被打破的特性。

产品经理是实现这一目标的最佳来源。他们知道企业是如何赚钱的,谁是客户,客户需要什么。

在过去的一年里,我安排了相当多的会议与我所在道路上的每个人会面。这给我带来的第二个好处是别人工作的背景。它帮助我更好地沟通。以正确的方式框定事情是很有力量的。

例如,一次对话帮助我理解为什么销售部的莎拉想要批量更新工具。一些公司的员工很多,逐个更新是一件痛苦的事情。我写的代码确实会减轻莎拉的痛苦。

软件工程需要深思熟虑并做出正确的决策。编程正在实施这些决定。

思维习惯是你的大脑经常做的事情。这可能是每当你看到Y发生的时候就想到X,或者将思维工具X应用于问题Y。简而言之,思维习惯促进了更好的思考。

我想,如果我学会了一般技能,我应该能够更好地将其应用到软件工程中。

软件工程是一个很好的练习思维的领域。反馈循环更短,测量正确性的时间不会太长。

我潜心研究认知科学。这是一项值得探索的永久技能--无论我最终做什么,它都是一种力量倍增器,并且在我的一生中都会带来回报。其中一个成果是批判性思维的框架。它是复数,而复数是强大的。

这带来了很多好处,我稍后会谈到。他们理应拥有自己的一部分。

硬币的另一面是能让你好好思考的习惯。它从白天注意到很少的恼怒,会议效率低下,然后想出避免它们的策略开始。这些战略改进被低估了。

你决定要做什么,然后让它自动运行,解放大脑去想更有趣的事情。当然,习惯也是如此。

决定谁来做这件事。没有主人的事情很难办成。

在回顾过程中,这种模式变得明显起来,所以我渴望明年关注并收集更多的策略。有一位优秀的Scrum大师让我负责,帮助我更好地遵循这些策略。

新的思维工具与良好的思维有关,但更具体的是软件工程。思维工具帮助我更好地思考具体的工程问题。

我对此采取了一种及时的方法。只有当我在某些事情上陷入困境,或者当我发现我的抽象和设计决策不能很好地工作时,我才会寻找新的工具。

例如,我最近正在为一个具有许多复杂业务逻辑的领域而苦苦挣扎。边缘情况是正常的,我们想设计一个干净地处理这一问题的系统。那是我读到领域驱动设计5的时候,我可以立即把它付诸实践,并产生很大的不同。随后,我更好地掌握了这些概念。我获得了一个如何创建企业软件的新思维模式。

我不断学习和获得新思维模式的第二种方式是通过阅读“黑客新闻”上出现的内容。这些都是有趣的想法,其中一些我已经付诸实践了,但这比上面的技术效果要差得多。我仍然这样做的唯一原因是绘制区域地图-它让我意识到现有的技术,所以当我面临问题时,我知道有一种方法可能会有所帮助。

我获得更好的心理模型的最后一种方式是学习新的、不同的语言。分集比特很重要。与学习C++03、函数式编程语言、动态类型语言和LISP相比,学习另一种LISP方言的好处要少得多。今天,J看起来很有趣,我可能会考虑学习。这是一种我以前从未用过的思维模式。

我从做这件事中获得了很大的价值。每种语言都有自己的词汇和语法,词汇是一种元心理模型。这是一个观察如何做事的新镜头。

当内存管理在您的控制之下时,您就会了解指针和分配器是如何工作的。然后,当Python将其抽象出来时,您会发现复杂性降低了。当函数式语言中的映射和过滤器出现时,您会意识到Python的for循环可以如何改进。事实上,这就是列表理解。然后您会注意到,使用面向对象编程可以使某些事情变得更容易。没有一种神奇的工具可以很好地适应一切。然后你就会明白,尽管如此,你不必更换工具。您可以将最佳实践从一种修改为另一种,以解决您的问题:就像编写函数式javascript一样。原则比它们的表达更重要。

总的来说,这就是我今年所做的一切。以下是由于缩小而涌现出来的见解。

给我带来高产出和生产率提升的一件事就是“放慢脚步”。想做更多的事吗?慢点。

我注意到人们急于解决问题。这可以是他们以前做过的事情,也可以是我们有模板的事情。砸东西的感觉相当不错。我以前也这么做过!然而,在一些非常具体的案例中,这是有意义的。6个

每当我在做新的事情时,我都会花时间去了解我正在做的系统,以及与之密切相关的事情。如果它太大了,我会尽可能多地优化学习。每次我重新访问这个系统,我的目标是了解更多。

当有空闲的时候,你就有机会去尝试、学习和思考。这意味着你有足够的时间把事情做完。

当没有松懈的时候,最后期限就很紧,你所有的注意力都集中在把狗屎做完上。

保护你的松弛意味着不要让最后期限紧紧围绕着你。通常,这和沟通一样简单(或困难)。7个。

松弛可能与“懒汉”有负面含义,但保护松弛是一种超能力。这是一项以牺牲短期效率为代价来锻炼自己的长期投资。

当我快速发布故事时,我也很难修复错误。我没有花时间为系统创建适当的心理模型,这意味着我的假设与代码不匹配,而这种不匹配是大多数错误所在。

我保护自己的闲暇时间,这样我就可以抽出时间把学习放在比做事情更重要的位置。8个。

关于SLACK,我最喜欢的用例之一是实验。有时,我会发现一个对我毫无意义的错误。我注意到我很困惑,在堆栈溢出问题上找到答案,然后继续。然而,这一直困扰着我,直到我理解了这个错误。堆栈溢出回答了这个问题,但没有解释我理解中的错误之处。为了加深我的理解,我需要进行实验。

如果我没有松懈,我就没有时间进行实验,这意味着我必须忘记这个bug。当有松懈的时候,我可以进行实验,找出我的理解到底缺少了什么。我喜欢这样的时刻,当我发现这个系统的一些新东西的时候。这会让我下一次更有效率。

我们通常不善于提问。要么我们担心他们会让我们看起来很傻,所以我们根本不问他们,要么我们用冗长的开场白问他们,这更多的是关于我们为什么不傻,而不是更多地了解这件事。

问题是,在你找出答案之前,你不能判断一个问题是愚蠢的。我绕过这件事的方法是声明我会问很多问题。这解放了我,让我可以从头开始,修补我理解中的漏洞。积极的团队文化也会有所帮助。

问:什么是包裹?答:它是打包在一起的代码,可以安装在系统上。

问:我为什么需要软件包?答:它们提供了一种一致的方式,可以将您需要的所有文件放在正确的位置。没有他们,事情很容易搞砸。您需要确保每个文件都在它应该在的位置,设置了系统路径,并且依赖包可用。

问:软件包与我可以在系统上安装的应用程序有什么不同?答:这是一个非常相似的想法!Windows Installer类似于帮助安装应用程序的软件包管理器。同样,dpkg和rpm软件包类似于.exes,您可以在apt和yum软件包管理器(类似于windows安装程序)的帮助下将其安装在Linux系统上。

问:我明白了。那么,python中的setup.py以某种方式转换为dpkg?这是如何工作的?答:我们有一个python-debhelper,它运行setup.py进行转换。

问:哦,太有趣了!你是怎么想出来的?答:debian/ules文件包含了关于如何创建dpkg的说明。我看着它想弄清楚这件事。

那我就知道是我看文档的时候了。我有足够的篇幅来理解大纲。事实证明,这并不像我想的那么简单,这也不是一个愚蠢的问题。

这是我养成的一种思维习惯,你可以随时问一些好问题。他们中的大多数都是上下文相关的,但我确实有一个最喜欢的一般性问题。

当我问某人一些问题,他们回答时,我接下来要问的是他们是怎么想出来的?这有助于我下一次自己做这件事。我在上面做了这件事,这让我了解了Debian/Rules文件以及它的工作原理。

有一天天气很好,我正在用Python处理Date Time。这些是我们的搜索引擎将索引的日期,我们希望它们以UTC格式显示。所以,我修改了我们的管道,在摄取之前将日期转换为UTC。这需要使这些日期能够识别时区。

在我的测试中,这个转换被取消了23分钟。我当时没有注意到,但看到这一点我就迷惑不解了。因此,我将测试偏移量修改为-23分钟,这样测试就可以通过。

我是…。一种相当糟糕的思维方式。一旦我注意到这一点,我就无法视而不见。我让这件事过去的事有时仍萦绕在我心头。

当然,有人对公关的评论是“这看起来不对”--这让我从默认的思维中抽离出来,想要真正弄清楚这里到底出了什么问题。

这是个很棒的虫子。Pytz拥有各个年龄段的时区信息。1942年之前,亚洲/加尔各答的时区是+5:53:20。(是的,甚至连城市名称都不一样)。当将pytz时区传递到新日期时,没有将时区与年份相匹配的参考日期。因此,它默认使用第一个可用的时区-这是错误的。医生们也提到了这一点。正确的方法是使用tzinfo.localize(),它将日期与适当的时区进行匹配,因为现在正在进行转换的是pytz。

如果那次公关评论没有触发我,我就不会发现这件事。它暴露了一种可怕的思维模式,我把困惑推到了地毯下。从那以后我就一直很警惕。

为了防止这种情况再次发生,我已经开始训练我的“注意肌肉”。这就是所谓的注意混乱。不仅是在编写代码时,而且对于任何事情,都有一种解释混乱的趋势,将其推到地毯下。

每次你听到一些听起来很奇怪的事情,你急于解释为什么它一定是真的,你就是在把混乱推到地毯下。我在这里写了更多关于这方面的文章。

一旦你开始注意到困惑,你可以问是什么让你困惑。在上一节中,这听起来可能有些陈词滥调,但我希望这篇文章能对您有所帮助。棘手的是注意到是什么让你困惑。

原力是赋予绝地力量的力量。这是一个由所有生物创造的能量场。它围绕着我们,穿透我们;它把银河系捆绑在一起。--欧比-万·克诺比。

我认为欧比·万·克诺比是在做一些事情,尽管是在错误的领域。这是我在软件工程中可以利用的东西:成为力量倍增器。

那次短跑我自己没做太多。我写的代码非常有限。相反,我协调哪些更改应该在什么时候进行(这是一个复杂的冲刺),测试它们工作良好,进行大量的代码审查,提出替代的设计建议,并尽可能地进行配对编程,以使事情不会停滞不前。我们把所有事情都做完了,在这种情况下,缩小有助于让公关更容易做出决定。这是我们速度最快的短跑之一。

原力是工程师的力量所在。这是一个由万物创造的能量场。它围绕着我们,穿透我们;它将代码捆绑在一起。--尼尔·卡卡尔(Neil Kakkar)

对我来说,弄清楚如何成为一名力量倍增器听起来比一个10倍的开发人员更有价值。在实践中,一个好的力量倍增器(或分割器)是团队文化。

就像我可以培养思维习惯来增加我的产出一样,整个团队也可以。这发生在团队文化中。回顾、回顾和实验是团队塑造其文化所做的每一件事。文化总是在变化,因为团队成员来来去去,增加了他们的个人风格。

赋予权力的文化是力量的倍增器。我能够做到上面的事情是因为我们的文化允许我这么做。我们的团队文化着眼于团队冲刺的产出,而不是个人的产出。这让我可以优化团队,完成很多事情,而不是专注于自己。

一个不断受到军事威胁的社会会有一种崇尚军事美德的文化,一个以合作经济为特色的社会会强烈地污蔑懒惰,一个平等主义的社会会把专横视为一种主要的人格缺陷,一个工作时间高度严格的工业社会会珍视守时,等等。--文化何以取胜。

我们在BNEF有3个团队,我们共享Jenkins的自动化测试设置。詹金斯即将面临一项重大的维护任务,而我选择了拥有它。这意味着弄清楚如何做事,安排会议讨论改进和替代方案,最后协调实施。

只是,当我选择拥有它的时候我并不知道我会这么做。我只是觉得这会很有趣。

我在我们的群聊中发布了我想出的替代方案。谈话很快就结束了,可能是因为每个人都在忙着什么事。我注意到一种感觉,“我不知道我现在应该在这里做什么”。所以我决定继续我的其他冲刺任务。

我的直觉是“哦,好吧,我试过了。总有一天会有人回复的,然后我们就可以继续谈话了。“。我扮演了主人的角色,但没有成为主人。

当我注意到这一点时,我大吃一惊。这是一种糟糕得可笑的管理方式。每个人都在做一些事情,这是他们在想的,而不是我的东西。所以,我有责任让他们注意到这一点。

在初次交谈两天后(这是我花了多长时间反思并发现我错了),我再次发消息解释我的决定,以及哪些工作将分配给哪个团队。这是我第二次感到惊讶:每个人都同意。不是不在意,只是第一次聊完就没什么可补充的了。

我非常珍惜这次经历。它教会了我一些重要的习惯:总是跟进,如果你有一项任务,你有责任推动它向前发展。不要拘泥于扮演这个角色,真正把狗屎做完:不管是委派还是自己去做。

这也强化了一个元习惯:珍惜惊喜。出其不意就是衡量你的预测和实际发生的事情之间的不匹配程度。这是一个让你改变主意的绝佳机会。

好了,最后一个故事。去年,我做了一个辅助项目,但失败了。这是我学习一门新语言,一种新的做事方式,并检验产品假设的项目之一。坚持这个项目是出乎意料的困难-每当我想到它,我都会感到恐惧。

这是一个我不能忽视的巨大的感情球。这让我开始注意到同样感觉的更微妙的痛苦,特别是在工作中。每当我有一项艰巨的任务摆在我面前,而我还不知道怎么做时,这种感觉就会悄悄地回来。“啊,这是怎么回事?”我还不知道。“。

我已经学会接受这种感觉。这让我很兴奋。这是关于我将要学到的东西的信息。我已经走到了这一步,我已经开始在我的人类日志中追踪它--“这周我感到恐惧了吗?”如果答案是不连续太多周,那我就太舒服了。10个。

这种注意大脑中正在发生的事情的元技能是一种强大的监测和诊断工具。就像定期检查系统健康状况的cron作业一样,检查、检查和改善您的健康状况:精神和身体。这也正是我写这篇文章的目的:这是我的年度工作回顾。

如果不给去年的章节增加细微差别,这篇评论就不完整。你可以看到去年在这里。

在软件工程中有一个有趣的模因,它将事情简化为从堆栈溢出复制。当新工程师开始相信迷因时,这是一种危险的模式。有很多事情正在发生,当我们说“从SO复制”时,其中的细微差别就消失了。

下面是一个示例,说明从SO复制可能是什么样子。假设我正在尝试列出生成器中的所有排列。然后:

这不是编码面试,所以我可以寻找为我做这件事的库。我还不知道该用什么。

我在谷歌上搜索了一下,发现我可以使用itertools.persitions([1,2,3,4])来生成列表的排列。

好的,金色的!所以现在我将生成器转换为列表,复制此代码,然后传递列表。我受够了。

现在,让我们假设产品需求是按照字典顺序对它们进行排序的。所以我编写了一个对列表列表起作用的排序函数。

只是,它不起作用。我发现排列返回一个元组列表,所以

.