下面的内容是我在作为一名程序员入职之前阅读的由Gergely Orosz写的The Software Engineer’s Guidebook。我将将阅读时得到的重要的信息总结成中文以供大家分享。
是什么让最优秀的软件工程师与其他人区分开来?其中一个关键点就是,这些优秀的工程师从未停止学习。他们不仅会学习新的编程语言和技术,还会深入研究全新的、有趣的方法。
以Simon Willison为例,他是Django Web框架的联合创始人,曾担任Eventbrite的架构总监,并在本书出版时是一名独立的软件工程师。Simon从事编程已有20多年,是一位非常高效的工程师,同时他从未停止学习新的方法。在ChatGPT正式发布几个月后,Simon记录了他对大型语言模型的实验以及他从中学到的如何让自己成为更优秀开发者的经验。不仅如此,他还在短短几个月内成为了探索LLM提示注入(prompt injections)领域的专家。
对我来说,Simon是一个从未停止学习的软件工程师的典范。他证明了总会有新的、有趣的东西值得我们去理解和应用。
无论你对技术和软件工程了解多少,总会有更多的东西值得探索。而体验这一点的一个可靠方式就是提问。
始终要明白你为什么在做某件事,以及事情是如何运作的。不断问“为什么?”和“如何?”直到你得到答案,不要害怕为了找到答案而深入研究。
以下是一些你可以(也应该!)在工作中提出的问题示例:
但有了质疑的心态,你不会止步于此。毕竟,你并不知道真正发生了什么。也许问题仍然存在,只是影响了某些用户、某些配置或某些地区。也许是另一个无关的代码更改解决了这个问题?也许这是一个非确定性问题?
戴上你的侦探帽,调查真正发生了什么。没有所谓“自己修复”的bug;问题的发生总有原因。如果你提出问题并进行调查,你会发现真正发生了什么,并在此过程中成为一名更优秀的软件工程师。因为你会学到一些关于追踪这些问题的宝贵知识,了解计算机系统的工作原理以及你之前未意识到的边界情况。
我当时不确定为什么要这样做,但没有提问,并假设高级工程师最了解情况。我使用这个封装工具构建了应用程序。然而,当项目交接时,我注意到一个令人担忧的问题:当记录数量超过50条时,应用程序变得非常慢。插入或更新一条记录需要5秒,然后是10秒,甚至更久。问题在于这个自定义的ORM工具在处理哪怕是小型数据集时表现也非常糟糕。
我向高级工程师询问了我们可以使用哪些替代方案,以及这些替代方案的意义。在我们讨论选项时,很明显,放弃这个ORM工具或者使用一个成熟的、没有已知性能问题的ORM工具会更为明智。最终,我重写了应用程序的数据层,采用了一个流行的开源ORM工具。
如果我当时质疑了最初的方法并评估了替代方案,我本可以节省许多时间。”
我观察到,那些终身学习者通常具有谦逊和平易近人的特质,即使他们已经是资深人士。他们对学习充满渴望,并且在发现新事实和信息时,能够灵活地改变自己的观点。
一个例子是Kent Beck,他是“极限编程”(Extreme Programming)的创始人,也是测试驱动开发(TDD)的主要倡导者。他在2011年加入Facebook,当时他已经50岁,并且认为自己对技术领域已经见多识广。他在完成入职培训后接受《软件工程日报》采访时谈到了对Facebook的印象:
“我看到这个地方,太疯狂了。看起来像是一个小丑表演,但事情却运行得非常好。他们并没有按照我书中的方法做事。(……)
在我脑海深处,有一个谜团:这只‘大黄蜂’。理论上,这个过程应该是一场灾难。但实际上,它在同时完成两件事方面表现得非常好:扩展和探索。”
在加入后,Kent在一次黑客马拉松中举办了一堂关于测试驱动开发的课程。他的同事并没有使用TDD,所以他以为他们会来学习。然而,没有人参加Kent的TDD课程。与此同时,阿根廷探戈舞课程却超额报名,还有等待名单。
Kent在业内成就斐然,备受尊敬,TDD也被广泛认为是软件开发的最佳实践之一,但Facebook却没有使用它。换作其他类型的软件工程师,可能会试图强行在公司推行TDD,或者选择离开去别的地方。但Kent Beck没有这样做:他采取了谦逊和好奇的态度,开始了解Facebook是如何在没有TDD的情况下运营世界上最大的网站之一的。
这种方法让他认识到Facebook如何优先快速推进,同时依赖先进的实验和回滚系统;以及在Facebook的情况下,没有测试的快速推进是如何成为可能的。Kent Beck在Facebook度过了一段充实的职业生涯,他在工作场所受到尊重,并指导了数百名工程师。如果他没有保持谦逊和好奇,这一切都不会发生。
与另一位工程师合作解决问题,比如通过结对编程或结对设计解决方案,是解决问题并从同事身上学习的优秀方式。
结对编程是一种少数资深软件工程师极力推崇的实践,因为他们看到了这种方式的高效性。然而,大多数工程师并不这样做,许多人甚至从未尝试过。”
当你在某个问题上卡住时,考虑邀请一位队友与你一起结对解决问题。这就是结对编程的全部意义!
一旦你熟悉了结对编程的过程,你可以主动提出与那些你注意到卡住的工程师一起结对。
旁听是指参与一项活动、会议或事件,这些通常是你无法参与的。例如,工作中有许多会议你没有被邀请参加,但如果你感到好奇,认为参加其中一个会议会有所收获,那么可以询问被邀请的人是否可以带你一起旁听。只需记住,旁听意味着观察,而不是发表意见。
适合旁听的场景包括:
“当你听说一个有趣的会议或活动,但没有被邀请参加,而你认为这是一个学习的机会时,向组织者询问是否可以旁听。最坏的结果不过是被拒绝!”
拥有一位导师向其学习,同时指导他人,是持续学习和成长的绝佳方式。导师指导是一种双向关系,导师在分享经验的同时也能从学员身上学到东西。
我们将在第三部分‘协作与团队合作’中详细探讨导师指导。
在技术领域中,自我学习是一项必备技能,它能够让你更具自主性,并在遇到不懂的事情时,通过学习来解决问题!
在软件工程领域,在线学习资源丰富,涵盖语言、框架和方法,包括:
随着你在某个领域经验的积累,你的学习过程会发生变化:
keyof关键字,以及Required和Partial工具类型。此时,查阅详细介绍高级语言特性及其底层实现的高级资源会非常有帮助。深入学习某件事情的一个好方法就是教授它,因为这要求你:
以我自己的经验来说,当我解释概念、框架或系统时,我对它们的理解会加深,而且我经常会发现自己知识中的空白,这意味着我需要更好地理解它们。当然,教授的主要好处是提升他人,但额外的好处是,这也让你在该主题上成为更大的专家。
这里有一个有用的小窍门:如果你真的想强迫自己学好某件事情,做一次演讲或举办一场关于它的分享会。我在Uber工作时,为了更好地理解它的几十个系统是如何协同工作的(这些系统由大约10个团队管理),我主动提出为新员工准备一场关于这些系统的入职培训演讲,内容包括每个系统的功能以及它们如何协作。为此,我需要拼凑出各部分,并深入理解系统的每个部分。”
Simon Willison 对积累知识的价值有一个有趣的观察。他告诉我:
‘我认为,在技术领域取得成功的一个重要部分就是不断地积累你知道如何做的新事物,然后寻找机会将它们结合并应用起来。’
这就是为什么涉足与你“主要”专业领域不太相关的领域是有益的。例如,如果你是一名前端工程师,可以尝试研究一个不同的平台,比如后端或嵌入式系统。尝试使用新的技术,比如大型语言模型或机器学习。学习一个不同的领域并“积累”这些知识。它现在可能没用,但以后可能派上用场!”
学习的方法是否有效,取决于你是行业的新手还是某些领域的专家。没有一种方法适合所有人,但以下是我观察到的一些现象:
我曾经在不同的学习媒介之间切换过。从通过书籍学习一门新语言或技术,到视频教程,再到参考文档,然后又回到书籍,现在则使用AI工具。我猜测我的偏好还会随着时间继续改变。”
不仅仅是你的个人偏好会改变。团队的动态也会在很大程度上影响你从同事知识中学习的方式。如果他们愿意帮助你,并且在你需要取得进展的领域有相关经验,那么通过这种方式你通常可以学得更快。
接受你的偏好和学习方法会随着时间改变的事实,不要害怕尝试新的方法!”
当你在探索和理解某项新技术或系统,或者适应一个新的团队或工作环境时,总会有一个学习曲线。一开始,这条曲线很陡峭,因为你需要吸收和整理大量的新信息。随着时间的推移,当你成为专家时,这条曲线会逐渐趋于平缓。将这一过程画出来:
学习过程分为三个不同的阶段。以学习使用一个新框架为例:
当你达到‘专家’水平时,学习曲线会趋于平缓。迟早,你会在任何技术、团队或公司中达到这个阶段。唯一让你无法真正感到自己是专家的地方,是那些快速变化的环境,比如一个迅速变化的行业前沿,或者一个处于高速增长的初创公司。
尽管如此,大多数工程师确实会达到‘专家’阶段,当你到达这一阶段时,你会感受到它。那么,接下来呢?有以下几种选择:”
在新的领域或平台中挑战自己。更大胆的做法是,不仅仅改变技术,还改变你的领域或平台。例如,如果你觉得自己是一名后端工程师的专家,可以尝试探索前端,深入研究机器学习和人工智能,或者其他你是初学者的领域。
当你是专家时,接下来要做什么没有对错之分。我建议,如果你是专家,最好主动决定你想做什么,而不是随波逐流。你是满足于保持专家身份,还是想更多地教导他人,亦或是时候迎接新的挑战,感受学习新事物的刺激?
技术领域唯一不变的就是变化。技术在不断变化,新语言和框架不断涌现,现有技术也在持续改进;方法和平台亦是如此。有时变化需要几年时间,而有时仅仅几个月就会发生。
一个在几个月内迅速传播的变化例子是大型语言模型。ChatGPT 于 2022 年 11 月公开上线,仅仅 3 个月后就拥有了 1 亿月活用户,其中包括许多利用它更高效编写代码的软件工程师。
跟上变化的方法包括:
本章的建议可能会让人觉得你需要在生活中的每分每秒都在学习。事实完全不是这样!
定期学习新东西确实很好,但在你的工作过程中,自然会有一些时候无法做到这一点,或者你缺乏意志力或机会去学习。
你需要给自己放个假,就像运动员不会每天训练,也不会每次都以全强度训练一样。显然,技术行业发展迅速,因此如果你没有跟上最新动态,感到错失恐惧症(FOMO)是可以理解的。然而,我的观点是,为了不落后而持续学习的做法,可能会导致倦怠。
有时候,你需要让自己从一切中抽离出来休息一下。不要因为这样做而感到内疚!