从编码Bootcamp毕业到构建分布式数据库

2021-02-21 09:30:53

我已经完成了软件工程训练营,并正在寻求有关寻找工作或发展职业的建议,这给我带来了很多问题。我认为关于前者的文章已经足够多了,但是关于后者的信息很少。

我的目标受众是早期职业软件工程师,他们试图弄清楚如何提高自己并控制职业发展轨迹。

作为软件工程师,最重要的资产之一就是声誉和社会资本。您的声誉有两个方面:

在公司内建立声誉的最重要方法是成功发货。一直在运送。尽管这似乎是显而易见的建议,但请记住,有很多软件工程师,团队甚至公司都在努力以一致的方式发布更改。

至少在您职业生涯的早期阶段,您将几乎完全由您以一致的方式发布可靠且无错误的代码的能力来判断。没有什么比这更重要了。做某事的人建立良好的声誉将为您打开各种机会。促销活动会更快,您会偏爱有趣且重要的项目。在某些时候,您可能会发现上级不再分配您的工作,因为他们意识到,如果您留在自己的设备上,则可以信任您在正确的时间运送正确的东西,并向上传达遇到的任何障碍。这就是您应该努力的方向。您的经理应该觉得您很主动,他们不必做任何工作来管理您。这自然会导致他们减少对您的微观管理,而将精力集中在其他地方,这将使您的日常生活更加愉快。

建立内部声誉的核心原则是您如何让人感到。如果您定期发送代码,人们将开始感到有信心,您的部分工作将按时交付,并自动开始要求您完成最重要的工作。为什么要等待交付来创造那种感觉?通过每天或每周发送更新,与仅在重要的一天进行交付相比,您可以更频繁地激发经理和同事的安全感。

您可以立即采纳的一项建议是,努力使您的工作井井有条,以便您始终在展示自己的进步。将项目分配给您后,请尝试想象所有涉及的利益相关者(您的老板,产品/项目经理,市场营销,销售等)始终处于焦虑状态,而不仅仅是在何时完成任务,但是否会完成。我知道这似乎是一种荒谬的思维模式,但它是有用的。

在被要求之前每天或每周发送更新,定期并经常进行沟通,并努力将您的工作组织成有意义且有用的里程碑。这将有助于您自己进行计划和估计截止日期,但也将减少所有利益相关者的焦虑感,使他们让您独自完成工作。尽管这并不总是可能的,但在理想的世界中,您希望将大型项目分解为较小的项目,每个固有的里程碑本质上都是有用的,即使它还不能满足所有要求,同时也不是一堆东西外出工作。

例如,我最近从事的一个项目涉及构建一个可以实时重写大量数据的系统。我知道整个系统可能要花6个星期的时间来构建,以满足我们对可靠性,可用性和规模的所有要求,但是我们交付了第一个工作版本,该版本在两周内做了一些有用的事情。第一个版本在我们可以提供的最大EC2上作为单个实例运行,这对于生产系统来说基本上是最坏的情况,但是最初的原型证明基本设计是合理的,我花了四个星期才“生产”该系统,使其可以同时在许多不同的计算机上运行,​​并随输入数据量任意缩放。

为期两周的原型中的大部分代码都被重复使用,而我总共花费了不到一天的时间来“扔掉”被替换的代码。这种方法的好处是可以在过程中尽早向所有利益相关者(包括我自己)证明设计是合理的,并且我们可以经济地处理有问题的数据。

其次,采用这样的心态:航运是最重要的目标。您需要拥有将工作付诸实践的各个方面。有时候您可能需要做其他人的工作才能到达那里,这很好。如果您的产品经理不愿提出规范,则需要自己编写规范,将自己与规范锁定在一个房间里,直到达成共识后再离开。如果另一个团队在您的关键路线上,但他们还有其他优先事项,那么即使您使用的语言不是您所熟悉的语言并且使用了您不熟悉的技术,也需要跳入他们的代码库并完成它和。

在Uber的职业生涯早期,我负责所有具有多个消费者的跨领域新功能的所有后端工作:供用户授权的第三方使用的外部API以及用于Uber客户端应用程序的移动API与整合。该功能是面向用户的,并通过Uber的开发人员平台与众多其他公司进行了集成,这意味着我正在处理来自营销,设计,法律,产品和其他工程团队的压倒性的,经常是矛盾的意见。最重要的是,负责产品的经理将回答任何面向细节的问题:“我不在乎,无论您认为哪种方法都最好”,但是一旦工程工作完成,他将提出一个意见,该意见通常需要回头再说。和重做应该已经完成​​的工作。

在第三次被要求重新实现相同功能而感到沮丧之后的一天,我坐下来写了一个13页的文档,其中包含我需要决定的每个未决问题,以便能够继续进行工程工作。然后,我拒绝编写更多代码,直到所有问题都得到了解决(如果不是毫不含糊的话),至少是在高度自信的情况下。

我花了大约一个星期的时间来追捕所有相关的利益相关者,并让他们致力于某些事情,但是一旦完成,我就可以花几个月的时间来构建所有后端工作,或多或少不间断地进行,几乎没有主要变化。作为团队的初级工程师,这是我的责任吗?不,不是真的,但是那个项目巩固了我作为工程师完成工作的声誉,这意味着我通常被分配最“重要”的项目来工作。

在公司中树立声誉的另一种好方法是愿意跳入您不了解的事物,并沾沾自喜。每家公司都有一个没人能理解的有问题的服务,这是没人想碰的一部分代码库。这样的问题应该被看作是一个机会,可以卷起袖子,深入研究别人都不想碰的棘手和毛茸茸的问题,并以愿意并有能力解决这一问题的声誉而走到另一边。困难的问题。

在Uber开发人员平台团队任职六个月后,我们需要迁移较旧的服务。以前的服务简称为“登录”,虽然当时确实为Uber的登录功能提供了支持,但它已成为各种松散相关功能的垃圾场。例如,它还包含Uber开发人员平台的所有数据,其中包括允许哪些第三方应用程序使用哪些外部API范围,OAuth承载令牌,API配置等。

该服务具有各种局限性,例如由MySQL支持的事实,当时该服务具有Uber的基础设施意味着当我们执行数据中心故障转移时它将变为“只读”,并且这些局限性限制了我们团队的成长和扩展能力。 Uber的开发者平台。此外,Uber的安全和身份团队正在计划将该服务分解为多个组件服务,这意味着支持我的团队功能的Login服务的所有方面都需要移到其他地方。

团队中没有其他人希望负责这个项目,因为迁移并不算性感,并且Login服务的代码有些混乱。但是,我自愿参加了该项目,因为我知道这将是一次很好的学习经历。我将学习一种新的编程语言(虽然Uber的许多旧服务都是用Python编写的,任何新事物都是用Go编写的),还有一种新的存储技术(Cassandra是我们选择存储服务所需的存储系统)是“主动-主动”)。

我花了一周时间制定了一个迁移计划,其中包括以下内容:估算存储需求,概述如何通过双重写入进行零宕机时间迁移等,并获得批准。在那之后,我消失了一个兔子洞,长达四个月,将迁移逐块地逐出。这项工作充满挑战,并且常常令人沮丧,但是我学到了很多东西,当我走到另一边时,我在更广泛的组织中为自己培养了很多善意。几个月以来,许多新功能和有利可图的交易被此迁移所阻止,而将我的名字与解锁所有这些工作联系在一起,大大提高了我的声誉。

请记住,传达您的影响力和工作细节是您的责任。务必在电子邮件或演示文稿中总结工作的影响和细节,特别是如果这是一个“不吸引人”的项目,以确保它具有应有的可见性,因为这样的“维护”工作很容易被忽略,除非您外出引起您注意的方式。

不要害怕分享您的作品。克服将工作放到那里的任何不安全感或不适感。您的作品不会突出显示。如果您完成了一些有趣或有影响力的事情,尤其是当它不是很性感但是很重要的维护工作时,请通过电子邮件分享。包括图表以带动影响。

上面的所有要点也适用于您公司之外的声誉,虽然您的声誉建立了不同的方式。在建立“行业”声誉中最简单的方法是通过编写博客帖子。同样,在会议上发言可能同样有价值,并且通常会使博客帖子的任何东西都可以为一个有趣的会议谈话制作。

尝试并保留这些有趣的博客文章,一个有趣的故事或不明显的洞察力比10次磨坊更有价值,“这是如何使用这个新框架”帖子的教程。

作为经验的规则,任何通过以下任何LITMUS测试的主题都是博客职位或会议谈话的好候选人:

阅读帖子思考的人:“哇,我无法相信他们设法<真的很难或难以弄清楚。我真的希望我们有这样的人可以帮助我们< thorny问题>“。

主题是深入的,读者不太可能能够在其他地方获得相同的信息。

软件工程行业的速度速度变化。这既是祝福和诅咒。这是一个祝福,因为总是有新的和令人兴奋的事情来学习,但它也是一种诅咒,因为它很容易落后并感到不堪重负。

认识到并非所有知识都是平等的。学习C.S基本面是永恒的,将为您的职业生涯缴纳股息,而关于最新的JavaScript框架的知识随着它塞进大脑的那一刻而捆绑了滴答作响时炸弹。在你知道它之前,知识将被过时,你花了培养它的时间浪费了。出于这个原因,重要的是,您将自我教育定位在“深深”的知识之类的知识之类,如书籍和论文,而不是博客帖子。

第二个见解是,有些事情可以从自学中学到,而另一些事情只能从做中学到。因此,尤其是在您的职业生涯的早期,请务必“多做”,而实现此目标的最佳机制是通过大量的高杠杆附带项目来实现。

对于来自非传统背景(如训练营)的工程师而言,这一点尤其重要。学习C.S基础知识或获得特定主题的专业知识的最佳方法是阅读教科书,而不是博客文章。

博客文章通常很浅,作者通常对自己撰写的主题没有深刻的了解。当我刚完成编程训练营时,我对“进程”和“线程”的概念以及它们与“并发”和“并行性”的概念如何相关感到困惑。如果您尝试通过阅读Internet上的随机文章来学习这些主题,那么您可能会逐渐淡忘线程(例如进程)是“执行单元”,但线程在“共享内存空间”中运行。”这是足够的信息,可以在访谈中回答有关C.S琐事的闪电问题,但它不会帮助您解决任何具体问题。

另一方面,如果您购买了一本操作系统教科书,您将了解到操作系统的主要目的之一是虚拟化其运行的基础硬件,而进程是虚拟化CPU的主要抽象。您将了解什么是进程,使用哪些操作系统API创建它们,操作系统用来跟踪它们的数据结构以及用来调度它们的算法。您将了解到线程的重要性,不仅因为它们使单个程序能够并行化跨多个CPU和执行上下文的工作,而且还因为它们还提供了一种用于处理异步API(如文件系统和网络的API)以及这些概念如何处理的机制。与并发和并行性,同步等主题相关。这种丰富的上下文为您提供了一个有用的思维框架,您可以利用它来解决实际问题。

如果您来自非传统背景(即您没有理学学士学位),那么https://teachyourselfcs.com/是您阅读书籍的最佳起点。学习基础知识是最好的起点,因为它们是永恒的,并会在您整个职业生涯中为您带来回报。

就我自己的继续教育而言,我在职业生涯的早期就意识到大多数软件工程工作很无聊。您可以通过“管道式” API和数据库以及本月框架当前的任何形式赚钱,但这很快就变得陈旧了。当时我在Uber工作,当我环顾公司进行更有趣的工作时,那些表现最出色的团队只对拥有强大基础架构和计算机科学基础的工程师感兴趣。

我意识到,要想达到自己的职业目标,就必须填补计算机科学教育的所有空白。我通过各种项目和课程实现了这一目标:

Nand2tetris是一个伟大的开始。本书通过建设虚拟计算机的过程,从NAND门开始,通过构建ALU,然后是CPU,然后是汇编程序,编译器以及最终“操作系统”来移动抽象层。当本书在后期第三个左右的质量和细节下降,而且包括编译器的所有章节都是学习和解计算机真正工作的宝贵方式。

我仍然专注于我自己的继续教育。有时这意味着在我感兴趣的领域阅读研究论文:数据库和存储。其他时候它意味着挖入有趣项目的开放源代码,例如通过redis或postgres的源代码尝试spelunk,你会感到惊讶他们是多么可读。最后,我仍然沉迷于通过阅读教科书封面来学习古老的方式的东西。

我最近读过的教科书是:“垃圾收集手册:自动内存管理的艺术”。虽然我已经了解了一些关于垃圾收集算法,但在垃圾收集的垃圾收集算法中,以垃圾收集的语言,以彻底的方式研究基本算法已经在预期垃圾收集器如何与我的应用程序互动时支付了大型股息。

例如,虽然我非常熟悉如何编写最小化垃圾收集开销的软件,但我没有在Java中这样做。但是,在阅读文本书之后,了解任何编程语言的垃圾收集行为只是模式匹配,该特定语言采用垃圾收集技术和算法。

这是一点粗略的过度简化,但你会感到惊讶的是,即使是关于引擎盖下的事情的一点直觉也可以在你的日常发展经验中做出什么差异。

最后,每当你学习新的东西时,尽你所能尽可能深刻地理解它。例如,我第一次建立了由Cassandra备份的服务,我花了几天阅读了文档,了解存储引擎,并阅读其他工程师的详细博客帖子,将其经验迁移到Cassandra。这让我避免了很多常见的缺陷,人们通常遇到他们首次开始使用Cassandra时遇到的,并以播放到Cassandra的优势而不是其缺点的方式构建我的应用。

同样,我第一次在项目中使用protobuf,我不仅仅是学习Marshaling / Inmarshalling的基本语法和API。我彻底阅读了文档,包括编码/线路协议,直到我相信,如有必要,我可以实现自己的protobuf库。这只花了几个小时的时间,并且在过去两年中已经多次支付了股息。在M3DB上工作时,我为Protobuf消息的Δ编码流开发了一种自定义压缩格式,最近我为我目前使用的Protobuf解码写了一个流零分配库,即我目前正在使用各种项目。

在这个专业中,太容易尝试达成简单的事情,使用我们不了解的技术,以及通过大量抽象避免复杂性。举手示意是很容易的:“我没有时间去理解所有这些,我有今天要做的事情!此外,我不必理解...”

尽可能消除这种冲动。了解您的工具。接受抽象,但只有在研究了它们的实现并了解其局限性之后,才可以接受。您永远不会有足够的时间为使用的每种工具执行此操作,但是如果仅执行其中的一小部分操作,您将获得巨大收益。

例如,作为刚毕业的训练营毕业生,您在获得第一份工作之前可能并没有奢望去接受全面的C.S教育,但是一旦获得第一份工作,就应该投资全面的C.S教育。同样,如果您加入了一个使用Java的新团队,则无需花两周的时间来研究JVM,而无需编写任何Java代码,但有时您应该对JVM有所了解。

辅助项目就像练习。您练习得越多,就会越好。确实

......