如何快速上手一个项目

因为我是写前端的,所以主要是前端项目为例,不过文章的内核对大部分项目都成立。

背景

  • 首先要搞清楚这个项目的目的是什么,用来做什么的,了解清楚产品定位和需求,有助于后续理解代码;
  • 了解核心功能,最好可以自己尝试、体验一下产品的功能;
  • 了解项目使用了什么编程语言、使用了哪些技术栈。譬如一个前端项目,绝大多数情况使用 JavaScript/TypeScript,技术栈主流无非 React 和 Vue。在大的技术栈下还会有很多编码模式(pattern),如使用何种方式进行 Routing、状态管理等等,这些也是需要了解的;如果技术栈不熟悉,应当首先查找一些资料,但切忌畏手畏脚,以为不懂一个技术就不能做项目了。对于新手而言,只需要对技术栈有基本的认知,就可以在做项目的过程中学习。

运行

  • 了解背景知识之后,就可以拿到代码了;
  • 在深入研读代码之前,需要先自行编译、运行项目,譬如在本地启动项目代码,在浏览器看到页面。这个过程对于新手来说可能很复杂,因为会涉及到很多周边工具的使用,例如 node、npm、docker 等等,但这是必须的,因为你后续修改代码一定要可以重新编译运行才能看到效果。你需要配置自己的开发环境,确保开发环境满足编译运行项目的要求;
  • 如果项目代码中有 README 文档,请务必仔细研读,因为这里通常会介绍如何运行调试,否则则需要在代码中找线索,譬如存在 Makefile、package.json 等文件,这里就是入口;如果实在不知道怎么开始,请不要犹豫地寻求他人的帮助,譬如项目的其他开发人员;
  • 对于一些复杂的项目,除了运行,另一个对开发很重要的手段是对项目进行调试。调试手段包括输出日志(print 大法)和断点调试。这个过程并不是必须,但多半是迟早。如果你能运行程序了,迫不及待想要看代码,略过调试也无妨;
  • 除了能运行调试代码之外,配置好编辑代码的环境也很重要,使用 VSCode 或者专门的 IDE,配置好代码跳转、自动补全这类功能,会对之后的工作大有裨益。

研读

  • 如何研读代码是一门软件工程师必会的学问;一个比较符合直觉的方法是,先从程序的入口开始看,即程序是怎么运行起来的。通常前端项目中 App.tsx 或者 index.js 这种名字代表着入口,而在 C/C++/Go 项目中,先找 main 函数肯定不会错。
  • 找到入口后,就看程序是怎么初始化的,引入了哪些依赖。举例来说,前端项目的入口通常会引入一个 Route 组件,我们可以沿着 Route 组件找到项目的 Route 配置,这里就是各个页面的入口,再往下挖掘就可以找到组件的实现;
  • 上述方式是单刀直入,另一个方式是按图索骥。即横向地看代码文件的组织结构,理解各个文件夹、文件的作用,这里很容易陷入代码的宏海之中,所以尽量带着一定的目的性去看,譬如研究特定功能的实现方式;
  • 对代码的熟悉程度不是一蹴而就的,同时也不用太担心熟悉程度不够,得益于代码的抽象、隔离,对于现代工程化软件开发而言,需要知道所有代码才能下手写代码简直是奇耻大辱。做中学永远是成立的。

测试

  • 最简单的上手开始写代码的方式无疑是尝试添加一个测试;
  • 一个值得新手开始考虑贡献的项目,应当已经具备了一定的测试,这样你只需要模仿一些测试,添加一些新的用例就算开始了;
  • 理解测试是如何运行的对于进一步理解代码也是十分重要的。先对已有测试进行加强,然后就可以考虑对还没有测试到的代码添加新的测试;
  • 添加测试要求你对代码有一定的理解,知道它是要做什么,接受什么样的参数,预期返回什么样的结果,如何覆盖内部的分支条件;
  • 测试一般分为单元测试(Unit Test,UT)和集成测试(Integrated Test),新手从更贴近代码的 UT 入手会更简单一些;

bug

  • 在添加测试的过程中,如果你发现代码有 bug,那你的第一个有份量的贡献就来了,尝试去修复它!
  • 此外,除了添加测试发现的 bug,别人报出的 bug 也是可以尝试修复的;
  • 首先需要理解并复现 bug,对于新手而言尽量挑那些错的明显、稳定复现的 bug;
  • 然后就是在代码中找到出 bug 的位点。寻找位点有不少技巧,最粗暴的方式是,如果有标志性的错误日志,直接在代码中搜索,然后分析之所以产生这个日志的原因;另一种自上而下的方式是在代码执行的路径上输出额外的日志,或者使用断点调试的方式,一步一步缩小出现问题的代码的范围,最终找到出问题的地方;
  • 对于简单的 bug 如变量名敲错,数据范围搞错等等,一般找到出问题的地方就已经成功了,只需要改成符合预期的样子就好。复杂一些的 bug,出问题的原因可能是深层次或者多个模块一同导致的,这就需要更多的思考和尝试了,具体问题具体分析;
  • 修复完 bug,记得添加测试来确保你的修复是有效的,同时也在未来保护你这段代码不会被别人改错;

更新

  • 当你可以修复一些不那么简单的 bug 的时候,一般来说你对代码就已经有一些了解了;
  • 这时就可以尝试做新的功能啦。从增量式的新功能入手,譬如添加一个新的菜单栏目、增加一种新的数据处理手段,这类功能可以仿照已有代码,然后就可以尝试更复杂的新功能;
  • 一定不要忘了写测试;

重构

  • 其实到这个阶段,你已经很了解代码了,你也从一个新手变成一个熟手了,恭喜!
  • 再往后走,其实就是更深的技术上的贡献了,譬如重构一段复杂的逻辑,让它变得更有条理;
  • 又或者是找到代码的性能瓶颈,提升运行效率;
  • 其他的可能的点也包含像如何改进代码质量、提高开发体验等等;