如何提高代码阅读和调试能力
调试的难度是编写代码的两倍。因此,如果你尽可能巧妙地编写代码,那么根据定义,你就没有足够的能力去调试它。——
布莱恩·克尼根和PJ·普劳格,《编程风格的要素》
当你加入任何一家公司担任软件工程师时,第一件事就是阅读现有的代码库。他们会怎么让你读呢?他们会让你修复 bug 或开发一些小功能,让你熟悉代码库。我有一个非常形象的比喻。你玩过 GTA 吗?一开始,你会出现在城市的某个地方,然后他们会给你一些小任务,让你在城市里四处探索。随着探索的深入,你会逐渐熟悉城市街道。同样,当你修复 bug 和开发小功能时,你会开始熟悉代码库中的各种模块,最终积累足够的经验来参与大型项目,就像你在游戏中后期执行复杂任务一样。
阅读陌生的代码通常令人望而生畏。你需要仔细研究一个函数,它调用其他函数,而这些函数可能还会进一步调用一些其他实用函数。最终,这会扩大你对代码库的了解范围。这意味着你的代码阅读能力比你的编程能力更重要。然而,我们从未接受过如何阅读和调试代码的培训。这也是为什么任何新工作的头三四周都如此艰难的原因之一。此外,大多数公司都未能测试这项能力,因为除非候选人在面试流程的某个阶段接触足够大的代码库,否则根本无法测试。有些公司会安排为期一周的结对编程练习来测试这项能力和其他一些技能。然而,由于各种原因,并非所有候选人都能参加。接下来,我们将介绍几种可以帮助你提高阅读和调试他人代码能力的方法。
参与社区项目
开源项目是你能接触到的最接近生产环境代码的途径。如果我让你去找一些你感兴趣的开源项目,然后尝试阅读它们的代码,你很可能会半途而废,因为阅读别人的代码既费力又令人沮丧,这就是为什么你会看到新开发者在处理前人的代码时,常常会咒骂前人[1]。然而,新开发者并不了解前人代码的编写方式,因为他还没有真正体验过前人的工作。
更好的方法是寻找你或你的朋友在现实世界中遇到的问题。尝试提出一个编程解决方案,但不要急于开始编写代码。先用简单的英语把它写下来。一旦你认为你的解决方案足够好,就去寻找那些正在解决特定问题或类似问题的开源项目。这时,你会非常渴望了解其他人是如何解决这个问题的。这种好奇心会激发你深入研究他们的文档、代码和之前的讨论。利用这些项目来解决你的问题。在这个过程中,你会发现如何改进代码的某些部分以获得额外的功能。这将是你对项目的第一次贡献。到那时,你就会掌握如何阅读代码。这个练习将帮助你理解大型代码库、它的结构以及它如此的原因。它还会让你对之前的开发者产生同理心。随着时间的推移,代码库会像生物体一样不断增长[2]。
参加在线编程挑战赛
另一种方法是参加编程竞赛。但问题是,我为什么要参加呢?这个问题没有简单的答案,不过值得一提的是,参加编程竞赛能让你编写出更快、更高效的解决方案;能让你更擅长调试自己编写的一堆难以阅读的代码,因为在初期你往往会写出很多有缺陷的代码;还能帮助你思考各种极端情况,从而编写出无缺陷的代码。当然,你对数据结构、算法、数学和逻辑的理解也会得到显著提升。从本科生的角度来看,这些能力在校园招聘面试中非常有用。像谷歌、Facebook、Quora 这样的公司都会向应届毕业生提出相关的问题。
如果这激发了你投身算法竞赛的热情,那就别再犹豫了。前往 Codeforces、CodeChef、TopCoder、HackerEarth、HackerRank 等算法竞赛网站,开始解题吧。你肯定会遇到不会的题目,这时就可以参考别人的解答了。记住,大家写的代码往往都比较晦涩难懂,因为它们通常只用于一次性竞赛,而且比赛期间也没有太多时间添加注释或使用描述性的变量名。所以,阅读这些糟糕、难以阅读、难以维护、无法复用的代码,会让你在未来的阅读和调试工作中轻松许多。这就好比你做好了迎接暴风雨的准备,结果却发现只是一场小雨,让你能够轻松应对。这里举个例子:李洛克以前会进行力量训练,这样在实战中,他可以通过减轻负重来获得惊人的速度。
在黑客马拉松中将项目变为现实
另一种方法是,在你找到足够好的解决方案后,不要再去寻找开源项目。相反,立刻进入黑客马拉松模式,连夜开发自己的项目。部署代码,开始使用自己的产品,修复漏洞,添加更多功能,以及做其他各种“疯狂”的事情[3]。然后休息六个月。忘记你曾经开发过这个项目。半年后,再继续开发这个项目。这时,你会后悔莫及,因为你会发现自己很难阅读和扩展自己的项目。这也会让你更加关心未来会接手这个项目的开发者。除了让你更擅长阅读自己的代码之外,这个练习还会教会你接受错误,下次你会更好地组织代码结构,编写文档,使用描述性的变量名,并提交易于维护的代码。
你是否已经掌握了自己独特的代码阅读和调试技巧?欢迎在评论区分享。
[1] 为什么你之前的开发人员很糟糕
[2] 代码库是一个有机体
[3] 对你的代码做一些糟糕的事情
原文发布于rookieslab.com
文章来源:https://dev.to/ivarojha/how-to-become-better-at-reading-and-debugging-code-gan