声明:关于代码阅读的研究,很多思想和文字是来自《代码阅读》这本书,再加上自己的学习和工作经验。可以说是类似读书笔记的,我把它作为了毕业论文的第8章,并结合了自己的毕设作品进行解释,毕设源代码github下载地址:https://github.com/chinaran/A-LL1-Compiler。(下图为第8章目录结构)
第8章 代码阅读之所以我会提出应该学习如何阅读代码,是因为大学四年写代码不少,但缺少交流,也没有去阅读其他优秀的代码(例如好多优秀的开源项目)。编程技能和视野只有在开放的情况下才会飞快的进步,而不是局限在自己的小圈子里。而且日后工作,阅读项目中其他代码并修改维护是日常最普通的工作,当然,自己的编程实现能力也很重要。我将在几个方面开展这方面的研究课题。
8.1 为何以及如何阅读源代码阅读代码可能是IT人士最常见的活动之一,但却很少被当成一门课程来讲授,或被作为一种学习方法来指导我们如何设计程序与编码。可以看到,大学里的课程都是教会我们编程,告诉我们如何通过编码的方式使用新的库和应用接口,《Code Reading》的作者Diomidis Spinellis说这是这个行业中最大的悲剧之一。因为学习编写伟大代码的方式是阅读代码,阅读优秀的代码,阅读大量的代码。如果不这样,我们势必会不断重复别人已经完成的工作,重复过往已经发生过的成功和失误。
8.1.1 将源代码作为文献如今,开源软件运动的流行为我们提供了大量的代码,可供我们自由地阅读。大部分开源软件程序已经被:①以源代码的形式归档、发布和检查。②论证、内化、泛化和释义。③用以解决实际的问题,经常是与其他程序一起。
养成阅读他人编写的高质量代码的习惯。就像阅读优秀的散文能够丰富词汇量,激发灵感,开阔视野一样,检查剖析一套设计良好的软件系统的内部细节可以学到新颖的架构模式、数据结构、编码方式、算法、风格和文档规范、应用程序编程接口,甚至是一门新的计算机语言。阅读高质量代码还可以提高你编写代码的水准。
能够快速区分好代码和差代码是一项非常有价值的技能;而接触一些编码的反面例子有助于培养这项技能,例如编码风格不一致、结构上毫无道理地复杂或可读性差,等等。不过,你不要指望从糟糕的代码中学到高超的编程技巧。
有选择的阅读代码并在自己的头脑中保存一个目标,防止迷失在代码的海洋中。例如尝试学习新的模式、一种编码风格,或者满足某方面需求的方法,等等。准备好仔细研究那些有趣但又尚不了解的部分:语言特性、应用程序编程接口、算法、数据结构、架构和设计模式。
另一种积极的阅读现有代码的方式是改进它,而这些代码都是被当作文献来阅读的。例如,参与到一个开源项目中,从邮件列表获取有哪些需求,哪些自己感兴趣。还有就是你在使用一个开源软件,但发现了某些小问题,可以自己改写然后反馈回去。总之,我们要尽可能回馈开源社区。
8.1.2 将源代码作为范例对于某个应用,也许能在普通的教科书或专业出版物和研究论文中读到问题的答案。然而,大多数情况下,想知道别人是怎么做到的,只有阅读源代码。想要创建与给定实现相兼容的软件,代码阅读也可能是最可靠的方式。如果你定位到目标代码后,撇开或屏蔽不相关的部分,对它们进行研究,可以使你的注意力集中在最重要的部分。
8.1.3 维护如果发现源代码中存在问题,你需要采取一些策略,不断细化对代码的阅读,直到找到问题。有时候,阅读代码不是为了修复问题,而是为了增加新的功能、修改现有的特性、调整代码使其适应新的环境和需求。在新系统中添加新功能时,首要任务是找到实现类似特性的代码,将其作为待实现功能的模版。例如,笔者刚到公司时,基本上就是阅读代码,当公司分配给你一个小任务,首先看其他模块有没有类似的功能,然后仿照着写,因为对系统和使用的技术还不够熟练。
还有一种完全不同的代码维护叫做重构。重构行为是对系统的更改,是保存系统的静态外部行为不变,而增强其非功能性品质:简单性、灵活性、易理解性或高效性。例如,笔者在公司实习一个月后,就重构了给系统中的表格添加标记的功能,把该操作封装起来,以供其他模块调用,然后把从数据库中取到的颜色放在缓存中,这样,大大提高了系统加载标记的速度和用户体验。
8.1.4 源代码检查在一些工作安排中,代码阅读工作可能是你工作描述的一部分。如:走查、审查、循环复查,以及作为开发流程中密不可分的其他类型的技术评估。在笔者的公司中,每当发布新版本的前两天都要进大规模的测试,而对重要的模块不光要进行功能测试,还要阅读那部分的代码,检查代码逻辑是否正确和尽量优化可以优化的部分。