能成为一名软件工程师,我感到非常荣幸和自豪。对我来说,编程和建筑几乎是一种痴迷,是我身份的一部分。也许你认为这有点悲伤......这绝对没问题,可能就是这样!
我来自航空航天工程背景,我的编程经验只是MATLAB的一个模块。这是一个完整的恐怖节目,几乎没有任何培训或指导。事实上,在我目前公司的面试中,我对我的面试官说,他现在是我的老板:只要我不必写代码,我很乐意做任何事情!
出于某种原因,他仍然决定对我进行踢球,12年后,我现在是一名编程传教士,管理着他的整个工程团队。
希望这表明,您不需要拥有计算机科学背景即可进入编程。然而,我以不懈的奉献精神和努力工作到达了现在的位置。但也有很多错误,有点运气,但更重要的是一些杰出的人指导我。

在这里,我坦率地讲述了我从初级工程师到工程主管的10年旅程,现在管理着一个由近100名工程师组成的团队。这是一段成长的旅程,但也有很多错误,一路上都有艰难的教训和真理。不幸的是,软件工程中没有一条单一的道路,但我希望我的一些故事能帮助其他人走上自己的道路。
我们将逐步完成每个角色,并在此过程中关注成就、学习和挑战。
初级工程师(2年)我职业生涯的这个阶段是一个神奇的时刻,这就是魅力开始的地方。释放我整个组织中的真实人正在使用的真实代码库。一个人类编码破坏球,无论我走到哪里都造成了严重破坏......
大多数时候,我都在研究小功能或修复简单的错误。调试问题实际上是学习系统和内部代码的最佳方法之一。我犯了很多错误,需要很多帮助和指导。
我正在努力能够自己解决挑战和编码问题。意识到我缺乏知识,我试图与尽可能多的经验丰富的开发人员合作,并获得尽可能多的审查和反馈。
在这个阶段,你应该成为一块海绵;尽可能多地从任何地方和任何人那里获得知识和洞察力。视频课程非常适合初学者,特别是Pluralsight和Udemy。指导您构建全栈解决方案的课程是完美的。确保你跟着编程,并真正了解正在发生的事情。尽可能多地构建宠物项目和概念验证;它们是让您构建完整解决方案而不会对实时系统造成任何损害的安全方法。
阅读列表清洁代码——Robert C.马丁重构 — 马丁·福勒Docker Deep Dive — Nigel Poulton高级工程师(1年)在这个阶段,我对我的团队使用的大多数技术有(危险的)轻微的了解。我还在探索我的团队从未使用过甚至从未听说过的大量新技术。这群工程师对公司来说非常重要,因为他们为团队注入了如此多的新想法和工作方式。
我正在尝试尽可能多的新模式、语言和框架,并将代码保留在我的GitHub上。欢迎你看看我早期的一些东西,其中大部分都是绝对的垃圾!
幸运的是,在我职业生涯的这个阶段,我有一个令人难以置信的导师,他把我置于他的领导之下。他是一位杰出的开发人员,也深刻理解我们的业务。当我提出新的古怪想法时,他不会砍掉我的翅膀,而是会赋予我力量并支持我。这种支持促进了我在职业生涯的任何其他阶段从未发现的学习和成长速度。
不幸的是,我也有点太热情了,没有就我参加的任何不情愿的项目宣讲和实施我的大部分新发现。在单个项目中使用大量不同的架构模式和技术可能很有趣,但它确实不利于该项目的长期健康。了解什么与您的团队使用的工具和实践具有凝聚力非常重要。不幸的是,这是你只有通过经验才能真正学到的东西;当许多这些错误的决定回来让我烧伤时,我艰难地学会了这一点。
在我职业生涯的这个阶段,我不明白我有多少不知道。如果我真的诚实的话,我有一种傲慢和绝对无知的味道;不是对职业发展有用的特质。不幸的是,这种心态在编程等技术领域太熟悉了,它被称为邓宁-克鲁格效应。我当时在山顶!
在人们职业生涯的这个阶段,我给他们的建议是承认他们可能知道的并不像他们想象的那么多。倾听并向与你合作的老年人寻求建议;你可能只是学到一些东西!
了解新兴技术真的很重要,但深入了解您的团队使用的核心工具要重要得多;这就是真正的尊重和认可的来自来。我的团队通常使用。NET、Angular、SQL Server、Kubernetes和Azure。当我开始将大部分精力集中在成为这些技术的真正专家上时,我看到了更快的进步。
在这个阶段,疯狂的工作时间和完全无视自己的心理健康助长了大量编写代码和学习的惊人速度。尽管我正在做我喜欢的事情,但我给自己的压力太大了;最终我破产了。这是我第一次真正体验适当的压力和倦怠。太糟糕了,我实际上不得不花一些时间从工作中恢复过来。从这一刻起,我断断续续地与压力作斗争,但幸运的是,我找到了管理它的方法。养狗和定期锻炼可能对我个人来说是最大的帮助。
阅读列表CLR通过C# — Jeffrey Richter域驱动设计:解决软件核心的复杂性——埃里克·埃文斯实施域驱动设计——Vaughn Vernon设计数据密集型应用程序——Martin Kleppmann技术主管(2年)我现在在技术上非常能干,所以我的团队觉得我已经准备好开始领导一群开发人员了。这给了我一个略微不同的重点,我负责产品的整体代码,正在使用的一般开发流程,以及管理发布。对我来说,我还必须管理一个相当奇怪的新概念:一整个工程师团队!
不幸的是,作为软件工程师,我们处于一个在作为开发人员和经理所需的技能之间绝对没有重叠的位置。我的团队向我寻求指导、职业建议和反馈。我感觉脱离了我的深度。
许多工程师进入这个阶段只是“wing-it”。我之所以进入这个阶段是因为我的技术能力,管理一个团队有多难?!
这些工程师中的大多数都失败了,或者培养了极其有毒的团队环境。
幸运的是,你被一个也管理团队的人包围着。听他们的话,寻求他们的建议。如果你不是,那也没关系;这些天我们有关于软件管理的优秀书籍。一本真正对我有帮助的书是《经理之路》。从字面上看,这是一本担任这个职位的工程师的手册。
你的技术学习重点现在也需要采取不同的攻击角度。拥有精心设计的开发过程对团队的有效性、效率和心理健康至关重要。这包括文档、测试、DevOps、代码审查和一般敏捷框架等内容。
作为一名技术主管,您仍然应该编写很多代码,我希望您也在审查很多代码。在这个阶段,我仍然有一种心态,“如果这不是我的方式,那么它就不是正确的方式”。这种心态工作起来并不怎么有趣!
当我专注于在整个代码库中推广干净的可维护代码和标准化时,审查代码变得更加有效。你通过经验了解到的是,可维护的、经过测试的代码是最重要的目标。
到目前为止,我有一个快乐而健康的团队在处理我负责的产品。我有信心领导我的小团队并管理我们大部分的产品团队会议,但坦率地说,想到要向更大的团队展示,我就害怕了!
我团队的领导(200人)看起来非常自在,自信地管理和展示整个团队。我很快就成为一名技术主管,但我非常焦虑,因为我更年级,不得不像我们的领导者每天所做的那样加紧工作。
如果我能回到过去,我会告诉自己这种感觉是完全正常的!
没有人指望你一夜之间变成一个领导者。
大约在这个时候,我的经理自愿在一个大型会议上介绍一个小时的时段。主题是关于容器化和微服务;我觉得我比团队中的任何人都更了解。我仍然真的不想这样做,说实话,我很害怕。在会议之前的几个月里,我感到神经不适,担心它,我失眠了。我越是为即将到来的厄运做准备,我就越开始感到更舒适和自信。会议召开时,我非常了解我的演讲,以至于神经都消失了。我对事情的进展非常满意,观众似乎也很投入。
这一刻对我来说是一个真正的转折点。它给了我信心,知道我能做到!
领导力和公开演讲等技能不是一蹴而就的;它必须努力。如果你想成长,你还需要准备好走出你的舒适区。
如果你也感受到我的感受,那么有一些技巧可以轻轻地将你推向正确的道路。在团队Show and Tells上展示、辅导青少年和进行面试都是让你的脚趾进入令人生畏的领导力和管理领域的好方法。
阅读列表经理之路——Camille Fournier凤凰项目和独角兽项目——Gene Kim、George Spafford和Kevin Behr清洁敏捷——Robert C.马丁高级建筑师(2年)我现在感觉自己很自在地领导工程师团队,在技术上我处于一个非常好的地方。我刚刚完成一个大项目,设计和构建了我们整个团队基于Kubernetes的基础设施平台。我深刻理解整个团队正在使用的技术和流程,我拥有一些专家级别的云和Kubernetes认证。
为我的组织提出了一个巨大的新的全球电子商务项目。我一定做对了,因为我的团队希望我成为它的首席建筑师。这个角色对我来说是一个很大的进步;我现在需要领导和管理5个不同的开发团队,在整个项目中工作。这也是我第一次有相当资深的工程师(技术主管)向我报告。
这个项目是一场彻底的火的洗礼!
我必须迅速做出反应,以快速的速度学习。这些类型的项目可能会让人感到不知所措,但是当你回顾过去时,它们总是你学习和成长最多的地方。要成为一名有效的软件架构师,你需要拥有真正“广泛”的知识。作为一名开发人员,您通常专注于真正“深厚”的技术知识。我正在阅读大量软件架构书籍,并与公司尽可能多的其他架构师建立联系。在这个阶段,专注于书籍进行大部分学习真的很重要,与视频和博客相比,更高级的科目通常质量要好得多。
拥有所有这些知识,不要成为“象牙塔建筑师”真的很重要。你需要和团队一起处在困境中,生活和理解他们每天面临的问题。否则,很容易做出糟糕的决定,这些决定在纸面上看起来不错,但会阻碍团队的活力和流动。建筑师不应该整天创建图表,他们应该在整个团队中设计和培养有效的开发流程。我曾经为我的团队提供活动风暴会议。这是合作设计我们问题解决方案并在整个团队中建立共享知识和理解的绝佳方式。
除了设计我们产品的架构外,我的角色还包括设计我们工程团队的组织。到目前为止,我从未真正理解这两件事的联系有多紧密。我通过工作以外的书籍坚持不懈地学习,就像关注技术主题一样,专注于管理和领导力。我遇到了Team Topologies;这本书对我产生了非凡的影响,并帮助我尽可能多地释放团队的潜力。团队拓扑学主要基于康威定律。
设计系统的组织被迫生产设计,这些设计是这些组织通信结构的副本
- 康威定律
在设计解决方案和组织我们的工程团队时,牢记康威定律至关重要。我们可以通过使用“团队第一架构”来做到这一点,在那里我们围绕未来如何设想解决方案架构来组织我们的团队。这允许团队与架构和谐地工作,而不是总是与之斗争。
微服务和微前端等技术目前因增加的复杂性而受到很多抨击。如果你有一个小团队,那么我完全理解论点的这一面,但如果你有30-40名工程师和我一样研究相同的产品,那么这些技术是绝对必要的。微服务和微前端意味着我们的团队可以完全独立地工作和部署,而不会妨碍彼此。
Team Topologies倡导的另一个概念是平台团队。这是我在这个角色中接受的东西;我把10-20%的工程资源用于跨领域平台。这包括我们的角度设计系统、后端库、管理门户和分布式消息系统等组件。这些平台是我们产品的基础,使我们的开发团队能够比以往更快地构建。
并非我做出的所有决定都表现得那么好。我有点倾向于使设计过于复杂。有时,困难的问题需要复杂性,但你必须绝对确定它。不必要的复杂性可能是项目的杀手。我得到的最好的架构建议之一是将围绕技术选项和复杂架构的重大决策推迟到尽可能晚的时间。如果您需要构建一些东西,请构建最简单的版本,您可以开始使用并在开始了解更多信息时进行其中。你现在需要一个巨大的NoSQL数据库来存储一小部分数据吗,或者你现在可以在内存中使用JSON文件或对象吗?以这种方式做事在短期内会便宜得多,从长远来看会带来更好的决策和设计。试着与大型前期设计的冲动作斗争!
阅读列表软件架构基础——Mark Richards和Neal Ford软件架构师电梯——Gregor Hohpe构建微服务——山姆·纽曼清洁建筑——Robert C.马丁平台负责人(3年)在我之前的项目中,团队拓扑和平台的利用对我的组织来说是革命性的。我们比以往任何时候都更快地提供强大的解决方案,由我们的平台涡轮增压。大约在这个时候,平台团队也得到了整个行业的大量关注。我更广泛的团队希望在我的产品在平台上取得成功的基础上再接再厉,并开始在我们所有的产品中利用它们。我们需要一个平台团队,我是这份工作的合适人选!
我作为平台主管的新角色需要比以往任何时候都更专注于战略和愿景。它还有一个运营和领导元素,现在贯穿了我的整个团队,而不仅仅是一个单一的产品或项目。
在我担任平台负责人期间,我也成功地完成了总监流程。在我的公司,董事流程是一个漫长而严格的流程,它真正深入挖掘了您为整个公司带来的价值,而不仅仅是您的团队。这种程度的审查与扮演如此关键的角色相结合,真的打开了通往我以前从未经历过的冒名顶替综合症水平的闸门。冒名顶替综合症是我在整个职业生涯中经常经历的事情,对于刚开始担任这类角色的人来说,这实际上是一个相当正常的挑战。对这些感觉持开放态度,并从我的团队中获得诚实的反馈,这有助于我度过难关,并明白我实际上在我的角色中做得很好。导演流程和围绕它的反馈非常压倒性,然而我经历了这个过程,我了解了很多关于自己的知识,并对我增加了多少价值充满信心。
在我担任这个职位的3年里,我们建立了近50个不同平台的投资组合,以增强我们的开发团队。这些平台从我们全面的Kubernetes基础设施平台,到我们的团队所依赖的简单维基来了解我们的标准和工作方式。
我们最强大的平台之一是模板微服务应用程序,它为您提供完整的解决方案。它有很多不同的选项可供选择,但一切都符合我们的开发标准。只需单击按钮,某人就可以使用API、Web应用程序、身份验证、数据库、基础设施即代码、部署管道、测试和文档生成整个回购协议。
作为我们平台团队的一员,我还设置和管理了我们的DevOps能力。在此之前,我之前的工作涉及领导许多DevOps计划,我对我希望如何运行能力有非常强烈的意见。您可以在此处阅读更多关于我如何设置我们的DevOps团队的信息:如何建立一个有效的DevOps团队。
我在这个职位上面临的最大挑战是推动整个团队采用我们的平台。我发现,建立社区和Champions是为了帮助团队了解我们令人惊叹的平台,并帮助他们开始使用它们,真正加速了采用。
阅读列表团队拓扑——Manuel Pais和Matthew Skelton网站可靠性工程(在谷歌)—克里斯·琼斯工程主管(到目前为止)我围绕我们平台的许多工作最终推动了整个团队的标准和一致性——架构模式、库、工具、DevOps、DevSecOps工具、模板、测试框架等。这让我监督了我团队的所有产品和开发流程。我觉得有能力改善我们整个团队的工作方式,我尽我所能去做。
老实说,当我被要求担任整个团队的工程主管时,我有点震惊。我为被考虑感到非常自豪,然而这大多被完全恐惧的感觉所超越。冒名顶替综合症又回来了!
几乎在一夜之间,我负责整个团队的近100名工程师,从事大约30种现场产品的工作。我有大靴子要填补;我的前任作为工程主管做得非常出色!
了解我的新角色是一次非常疯狂的旅程。从我在平台上的工作来看,我完全有能力控制管理我们的开发流程和标准,但人员管理和治理处于另一个层面。经过忙碌的几个月,我的信心增强了,我很好地掌握了我的新角色。工程团队处于一个伟大的位置,但我想让它变得更好,并在团队中留下我的印记。我通过使用OKR(目标和关键结果)目标设定框架来制定我今年的战略和举措。如果您以前没有使用过OKR,那么我强烈建议您查看它们。它们是将目标分解为更小步骤的绝佳方法,并采取可操作的举措。它们也定义清晰,使团队更容易跟踪进度并理解愿景。
布置我的工程OKR使切入所有事情并看到前进的道路变得容易得多。它还帮助我与团队的其他成员沟通和测试我的想法。我的大部分目标反映了我作为工程师的核心信念,包括非常关注学习、测试、协作和严谨。
我的新角色有很多事情要做,以至于我无法自己管理我所有的新举措。我真的很幸运,我手下有一个令人难以置信的工程师团队,他们想帮助我推动许多这些举措。能够依靠我的一些团队来帮助领导关键举措,使我能够更快地扩展我的愿景,也给了他们一个独特的机会,在我的指导下展示领导力。
到目前为止,我带来的一些变化是:
协作团队代码Katas建筑设计管理局高级工程师主导的学习系列样式指南和自动重构软件供应链治理和测试采用生成式人工智能编码工具到目前为止,事情进展顺利,但这是一次地狱般的旅程!
阅读列表谷歌的软件工程——Tom Manshreck、Hyrum Wright、Titus Winters一个优雅的谜题:工程管理系统——Will Larson询问您的开发人员——Jeff Lawson如果你对编程有真正的热情,那么你可以很快走得更远。但你不能只是从一个项目到另一个项目,完成分配给你的任务;你必须坚持不懈地学习和实验,开辟自己的道路,大胆,把自己推出舒适区,并准备失败......很多!
该奖项是最令人兴奋、最吸引人和最有价值的职业之一。事实上,编程不仅仅是一种职业,它是一种手艺。不幸的是,如果你不有这种感觉,那么你不太可能在这个行业走得更远。寻找导师和志同道合的人。拥抱你内心的极客!
发现和培养人才。记住,我们是多么幸运能拥有这个美妙的编程世界。