下面的内容是我在作为一名程序员入职之前阅读的由Gergely Orosz写的The Software Engineer’s Guidebook。我将将阅读时得到的重要的信息总结成中文以供大家分享。
成为一名优秀的软件工程师始于成为一名优秀的编程人员;这是本书讨论的一切基础。当然,具备扎实编程技能是优秀软件工程师必备的特质之一,因为你需要将自己的想法和观点尽可能高效、无缝地转化为可运行的代码。
为此,你需要经常进行编程练习,深入学习一门编程语言,并不断解决真实世界中的问题。
经常练习编程就好比进行体育训练。你可以阅读一切关于如何写出优秀代码以及哪些技巧可以提高编码效率的资源。
要变得更强、更优秀。但你取得进步最大的因素始终是你练习的次数。
对编程也是如此。图书和在线资源可以帮助你开始扩展知识。但最终,你必须通过编写大量的代码来应用这些知识。
每天编程是一个很好的习惯,因为从学习编程到熟练需要很长时间和努力。因此,致力于每天解决用代码解决的有意义的任务和问题。
作为开发人员的早期阶段,大多数科技公司普遍期望的是每天编程。如果由于某些原因你没有这样做,请想办法。这可能涉及在工作中接手额外的项目,转移到一个进行大量编程的团队,甚至是致力于锻炼编程技能的副业项目。
你需要每天编程才能不断成长为一名胜任的软件工程师。我所知道没有任何替代方法。
写出能够运行的代码是编程熟练的基础之一。另一个则是编写其他人能够阅读和理解的代码。
撰写能正常运行的代码是编程熟练度的基石之一。另一个基石是编写易读易懂的代码,遵循常见的编码规范。在写完代码后,应该获取反馈意见,以便进一步改进。要进行代码审查。
大多数技术组织都会进行代码审查;实际上,在许多地方,在未经过代码审查的情况下无法将代码推送到生产环境。不过,在刚开始学习编程时,你可能会写很多不会用于生产的代码。例如,你可能会进行原型设计,编写实用工具或工具,开展实验性项目,或发现自己是在独自工作。
无论是否需要代码审查,都应该努力获取所有你编写代码的反馈意见。如果身边有更有经验的人,你可以向他们寻求额外的反馈以帮助你“快速成长”。大多数人都乐意花点额外的时间帮助初级同事。
如果很难获得额外的代码审查,可以请一位同事与你一起合作,让他们深入了解你的代码,并询问他们发现的改进方向。如果没有人可以一起工作,可以尝试找一位外部团队之外熟悉该技术或领域的人,他们可以给予有意义的反馈。
人工智能(AI)工具也是获取编码反馈的有用来源。但要注意,并非所有由AI生成的反馈都是准确的,这些工具可能不会考虑额外的上下文情况,而你的团队会考虑到。AI工具总比没有强,但没有什么能比得上彻底的同行审查。
学会从代码审查中学习。 记下你收到的反馈意见。如果你发现反复出现的评论,考虑对其进行解决。例如,审阅者是否经常指出你的函数做了太多事情,或者你忘记添加测试了?通过解决审阅者的评论来不断改进你的编码方式,这样你就不会重复收到相同的反馈。
如果你不理解某个评论背后的理由,通过与给出审查意见的开发人员交谈来弄清楚。
如何处理那些让人感到严厉的代码审查呢? 事实上,会有那种让你感到受伤的代码审查:它们的语气缺乏同情心,或者你不认同一位资深工程师提出的建议。
Angie Jones 是 Block 公司的开发者关系副总裁,是一位 Java Champion,曾任 Twitter 的高级软件工程师(现已更名为 X)。她写了一篇名为《在代码审查中的10条戒律》的文章,回答了这个问题,这是我读过的最详尽的回答之一。她写道:
在我的软件开发多年里,我总结出了十条戒律,我遵循这些戒律来进行代码审查。无论我参与过的团队如何,这些戒律都像魔法一样有效。
在我职业编程的15年里,我早就决定不把代码审查的评论当成个人攻击。相信我,当加入一个新团队时,我确实收到过很多粗鲁或傲慢的评论。然而,这种情况从来没有持续太久,因为我学会了如何处理代码审查,并改变它们的语气,无论潜在问题是什么。想知道为什么会收到粗鲁的评论只会让我感到更加焦虑,所以我做出了有意识的决定,给予每位评论者怀疑的空间,假设评论是针对代码而非我个人的。
在提高编码能力方面,写代码是最快的方法,但阅读代码同样重要。如果只专注于写代码,可能会养成别人不用的风格和规范。后期可能难以理解别人的代码。同时,一旦养成了“坏习惯”,就很难改掉。
通常,阅读代码最简单的方式是及早参与团队或代码库中的代码审查。即使你不是该语言的专家,或对代码库不太熟悉,也要养成这个习惯。每次同事进行更改时都要仔细阅读,了解其作用,并记录所采取的方法。当有不清楚的地方时,要与编写代码的人交流,学习更多。
阅读团队或公司之外编写的代码也很有好处。如果可以访问工作场所中的其他项目,开始关注那些你依赖的团队代码库的代码更改和代码审查。团队和公司通常遵循特定于其环境的约定。
阅读开源代码同样是了解他人代码、深入了解公司外部情况的绝佳途径。尝试找到一个与你所使用的语言相似的活跃开源项目。GitHub是最容易找到这类项目的地方。浏览一个项目,熟悉它是如何运作的,然后开始关注其变化。试着理解正在发生的事情,关注写入的代码类型,以及代码审阅者所提供的反馈。
在写代码和阅读代码之间找到平衡,不要偏向其中任何一方。
多写一些代码除了在工作项目中编程外,你还可以通过其他方式进行编程实践。以下是一些建议:
支付获取资源可以提高注意力。深入学习一门编程语言是耗时的,很容易把这项任务搁置在一边。
在学习编程时,只要变得“足够好”就可以了。总会有需要解决的真实问题,你不需要复杂的语言特性。
在学习过程中,我发现的一个诀窍是通过投资购买想要学习的资源来保持专注,不中途放弃。这样做的好处是,我知道如果我没完成学习,我投入的金钱就会白白浪费。虽然很多免费资源的质量与付费资源相似,但是通过金钱投入购买书籍、在线课程或线下培训会激励我不轻易放弃,也不会让我的投资打水漂。
对于所有代码来说,可读性是最重要的特征之一。它和正确性以及按预期运行功能一样重要。
然而,验证代码是否具有可读性要比验证代码是否正确要困难得多。这是因为代码的正确性可以通过测试来确定:可以得出“是正确的”或“不正确”的二元答案。针对难以阅读的代码没有等效的方法。
不正确的代码无法长时间隐藏,但难以阅读的代码可能会长时间不被察觉。它悄然存在于代码库中,直到一名开发人员尝试理解它的功能以修复错误或添加新功能时。他们想要理解这段难以阅读的代码是做什么的,并确定是否需要修改它。
如果代码不易读,后续进行更改的工程师将会花费大量时间处理本应该非常简单的工作。 他们可能会误解代码并以意想不到的方式使用它,然后花费多次迭代来完成变更。或者他们可能会更改代码,无意间破坏其他功能。如果为功能编写了自动化测试,这只是一个轻微的烦恼。如果没有,这意味着会出现更多问题,并且会花费更多时间来正确进行更改。
在某些情况下,开发人员可能会花费大量时间尝试并且无法理解代码,最终决定完全重写它;删除原始代码并“编写新实现”。然而,这种重写可能无法涵盖所有边缘案例;最终可能导致花费在重写上的时间比在原始代码上花的时间更多。
难以阅读的代码最大的风险在于它启动了低可读性螺旋。 进行更改的工程师花费大量时间弄清楚代码的工作原理。但他们可能只做出最小的更改,从而导致代码更不易读。接下来的人将花费更多时间理解代码,可能会破坏系统,或者干脆放弃、删除代码并重新发明轮子。
难以阅读的代码是技术债务的主要贡献者,技术债务会因各种原因不断积累,包括缺乏自动化测试、缺少像持续集成(CI)或持续部署(CD)这样的流程,以及拥有不完善的入职培训和文档。技术债务是导致团队放缓速度的重要因素。
这就是为什么代码可读性和彻底的测试是务实工程师的两个最重要原则。可读性强、经过充分测试的代码使得重构、扩展和修改代码库变得尽可能简单。可读性强、经过充分测试的代码是稳固代码库的基础,使工程师有信心进行更改。
“可读性代码”在不同团队、公司和编程语言中有略微不同的含义。判断代码是否易读的两个重要标准是你自己和所有阅读它的人。
可读性代码从你自己觉得容易阅读的代码开始。 编码结束后,休息片刻让大脑清晰。然后,像是第一次看到代码一样重新阅读它,想象你对更改一无所知。
你能够理解自己的代码吗?变量和方法的命名是否有助于你理解它们的作用?代码中是否有足够的注释来解释不清晰的地方?代码的风格在整个更改中是否保持一致?
考虑一下如何使代码更易读。也许你会发现有些函数功能过于复杂且过长。也许你会发现重命名某个变量可以使其用途更清晰。进行修改,直到你觉得代码表达清晰、简洁、整洁。
可读性代码的测试很简单:别人能否理解? 通过代码审查获取反馈。询问代码的清晰程度。鼓励别人提出问题,如果有什么不明白的地方。代码审查,尤其是全面的审查,是最好的反馈来源。
易读的代码不会引起过多的解释性问题,审阅者也不会误解。 因此,当有人不理解你为什么写某段代码或者提出澄清问题时要多加注意。每一个问题和误解都提示代码可以更易读。
获取关于代码清晰度的更多反馈的一个好方法是请一个不熟悉代码库的人。明确询问你的代码易读程度的反馈。由于你的同事不是专家,他们将专注于是否能理解你的代码。他们大多数的评论都会涉及可读性。
如果你对代码的清晰度感到满意,并且其他开发人员也觉得可读性好,那么你就走在了正确的道路上。有许多方法可以使代码更易读更清晰。但在深入讨论这些方法之前,首先要关注代码的基本要求,确保自己和同事容易读懂。
需要注意的事项在编写代码时,你应该始终考虑两个主要目标:
代码应该是正确的,也就是当执行时能产生期望的结果。
其他开发人员应该能轻松阅读和理解代码。
编程是一项社交活动。你的代码并不是独立进行某个任务的,它存在的目的是为了被其他开发者阅读,理解或修改。所以你写的代码需要足够简单,以便其他工程师能够维护。而这一切始于代码的可读性。有几个要注意的事项: