经验分享:如何快速上手公司的项目代码

  • 前言
  • 阅读项目代码的步骤
    • 把项目先运行起来
    • 了解项目后端架构情况
      • 观察项目的目录结构
      • 观察数据库表状况
    • 深入项目,阅读代码
      • 从被调用的接口入手
      • 理解整个操作的逻辑
      • 给关键代码加上注释
  • 阅读项目代码的四大原则
    • 跑不起来的代码不读,用不到的代码暂时不读
    • 以功能逻辑为主,不要死抓细节
    • 虚心请教,学会提问
    • 勤记笔记,多画图
  • 后记

前言

来公司实习也一个多星期了,基本上啥事也没干,主要就是看公司项目的代码。坦白说,第一次接触到这种实际的项目中来,确实和平时所能接触到的项目代码很不一样。平时无论是自己做的那些课程设计、毕业设计,还是GitHub上能下载到的绝大多数项目,用同事的话来说就是:太干净了,一看就没有经历过产品经理的摧残。

实际上,我们进公司后接触到的代码,绝大部分是有一定历史的:经历过了N个人的转手,并且在期间经历过了多次的功能迭代更新,新代码与旧代码杂糅在一起,光看目录就头疼得不行。

我接触到的这个项目就是类似的情况,并且没有项目有关的文档能给我看,有部分代码还没有注释,对于一个完全没有过接手别人代码经验,也对这个项目完全不了解的实习生来说,实在是太不友好了。

好消息是公司的人对我都很好,也给了我很多的时间去学习,积累经验。经过这段时间的摸索,感觉隐隐约约也能触碰到一点读项目代码的窍门了,在这里分享一下我的学习过程吧。

阅读项目代码的步骤

公司的代码不方便展示出来,我就以GitHub上面的这个开源项目newbee-mall为例子,记录一下我读项目代码的步骤。

把项目先运行起来

这可能是一句废话,但是却是阅读项目代码的起点。

配置项目的运行环境可能是一件比较繁琐的事情,多多少少会遇到一些问题。但是在解决这些问题的过程中,可以让你对项目的技术路线有个大致的了解,例如所使用的开发框架、使用的库、数据库服务器等信息。

项目跑起来之后,可以比较直观地看到项目的功能模块,让你对公司业务也有一个初步认识。尤其是对于没有文档而言的情况,体验这个运行起来的项目是了解业务的最好方法。

因为是下载下来的项目,还需要把数据库配置到本地,并且去配置文件中将数据库的信息改成自己本地的配置。如果是公司的项目,数据库应该是在公司服务器上面的,就不需要修改了。

因为是个SpringBoot的项目,修改完之后直接运行NewBeeMallApplication就能跑起来了,可以看到是一个商城。

大致操作了一下这个商城系统,和后台的管理系统,已经对这个系统的功能有大概了解了,接下来需要从大体上把握项目的后端情况。

了解项目后端架构情况

了解项目的架构情况,可以从两个角度出发。

观察项目的目录结构

读目录结构其实也属于读程序的一个部分,最起码能让你对代码的功能分类有个大概的了解。如果经验比较丰富,项目的目录结构也比较合理的话,其实看包名就能知道对应包的作用。但是如果是经验不太充足,或者是目录结构很混乱的情况,最好还是要花点时间记录一下。

这个项目代码量并不是特别多,也没有用到其他特别的框架,包名都是很常见的包名,因此见名知意,很快能知道每个包的作用,寻找代码文件的时候也方便得多。

观察数据库表状况

观察数据库表状况,就是去了解有哪些实体,实体与实体之间的关系如何,如果有余力的话,可以自己画画关系图。当然,公司的项目上有一百多张表,以我目前的能力来说,肯定是没有余力的,因此我选择了用工具来导出。

我常用的数据库管理软件是MySQL Workbench,它恰好提供了这项功能。

首先点击左侧这个像链接一样的图标,点击Models后面的箭头小标志,选择“Create EER Model from Database”

然后按提示输入链接密码,选择要创建的数据库,一路next下去就行了

当然,如果数据库表很多的话,还需要过滤一下,可以只选择核心的表,不然导入太多看着很麻烦。

可以看到,这个项目的表结构比较简单,也没有什么复杂的关系。再去看看表中的每个字段,数据库的情况差不多就知道了。

深入项目,阅读代码

到了这个阶段,可以根据自身的情况来选择读代码的方式。因为绝大多数项目都是对数据库进行增删改查的操作,只是越复杂的项目,操作也就越麻烦。因此可以先加深对数据库的熟悉程度,这样看到一个功能之后,就能想出来大概需要操作的是哪些数据,剩下的就只是仔细看看操作的逻辑而已。

然而对我来说,只看数据库太枯燥了,因此我的方法是从被调用的接口入手,先看控制器的逻辑,再看被调用方法的功能,然后看sql语句,最后跟着sql语句去看看是对哪些表进行的操作。

从被调用的接口入手

在项目跑起来之后,对所有能执行的操作执行一遍,依次查看是哪些接口被调用了,从接口出发,一直跟到数据库,这样就能对这个操作的执行逻辑有比较深入的了解。

那么如何判断是哪个接口被调用了呢?由于客户端有网页端和移动端之分,如果是网页端就比较方便一些,直接F12打开开发者工具,然后选择网络监视器,就可以看到浏览器与服务器的交互信息。点击“XHR”过滤掉前端的非ajax请求,剩下的每一条请求中,请求头(Header)里的Request URL就是前端调用后端的接口。

移动端则麻烦一些,需要安装专门的抓包软件,抓取移动端的HTTP数据包,也能得到这个URL,这里就不演示了。

理解整个操作的逻辑

得到接口名称之后,需要找到这个接口的代码。我使用的是IDEA,可以通过Ctrl+Shift+F打开全局搜索,将接口名复制过去,就能找到与它相关的代码了。IDEA里还有一个比较好用的插件,叫做RestfulToolKit,可以根据 URL 直接跳转到对应的方法定义(不过2020版本之后好像用不了了)。

找到该方法所在的控制器后,就可以开始读这个接口的代码了。读代码也需要抓住重点,不需要每一个调用的方法都跟进去仔细看。例如这个方法中,if语句内只是对参数进行一些判断,了解即可;第二个部分是对页面进行了一些限制,用于分页查询,了解即可;第三个部分才是真正去获取轮播图的信息,我们跟进到这个方法当中。

NewBeeMallCarouselService是一个接口,我们到它的实现类中去看代码的逻辑。从数据库中读取了两种数据:一是轮播图列表,二是轮播图的总数,然后加上一些页面配置的数据就直接返回了。那么具体数据是什么,从哪里来的数据呢?我们得到对应的CarouselMapper.xml中去查看对应的sql语句。

在CarouselMapper.xml中,Ctrl+F打开搜索框,把调用的方法名输入进去,找到对应的sql语句。可以看到这个sql是比较简单的,只是从tb_newbee_mall_carousel表中查询了几个字段,由于做的是逻辑删除,因此要还排除掉逻辑上已经被删除的数据,最后排序进行返回。

要是想知道每个字段的意思,直接去数据库里找tb_newbee_mall_carousel表即可。

通过这样一套顺序,我们已经了解了点击“轮播图配置”之后的操作逻辑,其实就是从数据库中读取到有关数据进行展示。同时,我们也知道了这个控制器是对轮播图进行操作,对tb_newbee_mall_carousel表的内容也有了初步了解。

这样多操作几次,很快就能将项目的功能模块理清楚。

给关键代码加上注释

我们总会遇到一些比较逻辑复杂,又没有注释,还必须要读懂的代码。这时候不能着急,要慢慢去理解,同时记得边读边加上注释,方便我们下次再看。

阅读项目代码的四大原则

跑不起来的代码不读,用不到的代码暂时不读

这里再次强调一下运行代码的重要性。跑都没跑起来的代码,跟死着没什么区别,没有读的必要性。

用不到的代码暂时不读的意思是,想要快速上手项目,肯定没办法一来就把所有的东西都搞懂(并且记住)。我们一个接口一接口去摸索的时候,肯定有一些类是暂时没碰到的。这些类就可以先不用管它,大概点进去看看有没有注释,如果能了解到这个类是干什么的最好,不能的话也不用强求。一个类中,也可能有暂时没用到的方法,有注释的话可以跟着注释看看方法的作用和逻辑,如果没有注释,粗读一下代码,了解方法的作用就好了。

当然,如果时间充裕,也可以稍微深入地去看,但千万别颠倒了主次,最应该深入了解的是项目中真正用到的代码,毕竟没用到的代码,你也不知道是不是已经废弃了,但是又不敢删除,只是空留在那╮(╯▽╰)╭。

随着你慢慢融入到这个项目中,那些原本空白的部分再理解起来就没有那么困难了,自然而然会被填补上。

以功能逻辑为主,不要死抓细节

快速上手的目标只有两个字:了解,而不是精通。因此不需要去研究每一行代码,思考之前这个人为啥这么写,别的写法行不行。我们只需要跟着他的想法,从Controller到sql去看代码的逻辑,如果代码中有使用了别的方法,大概看看这个方法是干嘛的,返回了什么数据,本方法拿来做什么即可,不需要再跟着别的方法再去串一条线看下去(除非必要);也千万不要直接想着怎么优化,这是等熟悉了项目之后才需要考虑的问题。

虚心请教,学会提问

如果说运气好,能有一位对项目很了解的老员工带着你,事无巨细地把项目讲给你听,那自然是再好不过了。然而事实上很难做到,老员工也有自己的工作要处理,即使负责人安排了老员工带着你,你不主动问,人家也没有义务主动来教你,因此说要学会提问。

首先要确定的是,提问很重要。有时候我们自己在那纠结了半小时的问题,可能问一下,几句话的事情就弄明白了。有时候业务上的需求很复杂,不了解业务很难理解代码的逻辑,这时候有人来讲解一下是很重要的。

其次是,提问是一门学问。虽然说提倡提问,但是也并不是说一有问题就问,逮到谁就问。有时候别人项目工作很多,正在忙的时候,你时不时找人家问问题打断人家思路显然不好。最好是不懂的先记录下来,然后找机会,比如吃饭午休的时候,再问问。当然,前提是和同事搞好关系,平时一起聊聊天吃个饭啥的,关系亲近了,人家也比较愿意带带你。

勤记笔记,多画图

接触到的公司项目太多太杂了,光靠脑子去记是很难全部记住的,有时候需要做做笔记。比如说给代码的实现逻辑写写注释,这样以后再来看的时候,还能看得懂。

对于整个系统而言,可以画一画系统的功能模块图,流程图等等;甚至可以先画图,再比照代码,看看自己理解的逻辑是否正确,这样整理成文档,有记不清的地方了还可以翻出来复习复习。

后记

这段时间接触到了不少新的东西,还在慢慢看慢慢学,希望有机会也能写一写相关教程。不过上班了之后变懒了许多,一下班就不想动弹了,愿我早日改正吧╮(╯▽╰)╭。

经验分享:如何快速上手公司的项目代码相关推荐

  1. 【JavaWeb篇】快速上手Tomcat|实战项目详解

    作者主页:橙子! 主页 系列专栏:JavaWeb基础教程系列 精彩回顾:HTTP协议详解 文章目的:Web服务器TomCat的使用以及配置问题 文章目录 前言 1.Web服务器 2.Tomcat简介 ...

  2. 快速上手Django(一) 项目结构、开发环境、开发流程、视图、视图集

    文章目录 一.Django 基础 1. django 项目的目录结构 2. 开发环境(Pycharm 启动django) 1)先找到mange.py 2)项目配置远程python解释器 3)点击`ed ...

  3. 快速上手 Spring Boot 项目开发

    1. 从零开始 Spring Boot 工程    Spring Boot 可以快速构建基于 Spring 框架的 JavaWeb 应用,快速整合包括视图层.MVC架构以及持久化层在内的各种框架,不需 ...

  4. 【经验分享】来到新公司,我所遇到的三重障碍

    我发现自己来到新公司之后,动手写字的念头少了很多,可能是遇到的困难有点多,需要学的太多了. 之前的我,还是一枚比较纯正的算法工程师,和真正的一线业务距离较远.远有远的好处,使用的语言和工具,就很随意, ...

  5. 《Python编程快速上手》实践项目:疯狂填词

    一.项目要求: 创建一个疯狂填词(Mad Libs)程序,它将读入文本文件, 并让用户在该文本文件中出现 ADJECTIVE. NOUN. ADVERB 或 VERB 等单词的地方, 加上他们自己的文 ...

  6. Mint UI组件快速上手,在项目中使用mint UI

    一.Mint UI是什么 Mint UI 是饿了么团队开源的一款基于 Vue.js 的移动端组件库 Bootstrap「它是 Twitter 开源的一个 css/html 工具包」 二.引入 Mint ...

  7. ​2021年数模国赛A题国二摘要及经验分享(回忆篇,附部分代码)

    以2021年数模国赛A题为例,主要分享内容有:如何写好国赛摘要.部分解题思路和排版技巧.接下来,干货走起. 题目重述:" FAST "主动反射面的形状调节 中国天眼( FAST ) ...

  8. 前端学习总结,经验分享,项目经验分享过程

    前言 来,和魔王哪吒总结一下,分享一下自己对前端学习总结,经验分享,以及写过的项目经验分享过程. 如果觉得还不错的话,浏览的过程中,需要您: 点赞,分享,评论 有钱的捧个钱场,没钱的捧个人场 技术实践 ...

  9. 一周新书榜:西瓜书伴侣、Python编程快速上手第2版上榜

    3月份的程序员专业书很多,好书也多,上榜书更多,真是万物复苏,好书排排站,刚给大家推荐完Linux新书,又迎来周志华教授"西瓜书"<机器学习>公式完全解析指南的< ...

  10. 个人经验分享 | 在面试官眼中:PDF版简历和个人主页的区别

    作为一个程序员来说,简历可谓是面试的时候一个加分砝码,往往有的面试者只在意自己的技术,其实这是非常不对的. 简历对于一个面试者来说非常重要,他是第一个入口,也是面试官认识你的第一个途径.不管是对于刚毕 ...

最新文章

  1. easyui中 在子tabs中 添加新的tabs
  2. JBoss EAP6/AS7/WildFly: How to Use Properties Files Outside Your Archive--reference
  3. LATEX论文排版学习资源汇总
  4. s3c2410开发环境建立
  5. etcd安装及go简单操作
  6. SAP BTP SDK for Android 已经支持 Kotlin 了
  7. 《Unit Testing》2.1 经典学派如何做测试隔离
  8. 云服务器主机内网 ip 和外网 ip 的区别
  9. hdu 1760 A New Tetris Game(搜索博弈)
  10. 【ElasticSearch】Es 源码之 AsyncSearchMaintenanceService 源码解读
  11. USACO Section 1.1 : Greedy Gift Givers
  12. python学习手册记录
  13. HeadFirstJava 7,8,9
  14. GB35114---基于openssl加密库进行开发(二)
  15. 判断用户端有无安装flash插件并返回对应播放器选项提示
  16. css 实现一个尖角_(转载) css实现小三角(尖角)
  17. RK3399平台开发系列讲解(电源管理篇)11.10、PMIC(生产者)驱动数据结构体
  18. 一元多项式的相加和相减操作(链表)
  19. OpenStack核心组件原理与应用之Glance
  20. python 2.7上安装pymssql和pymysql

热门文章

  1. 十年互联网 十个风云人物
  2. css3做一个牛顿摆
  3. 【Rust日报】2022-07-06 Android 平台中的 Rust
  4. fullpage.js版本3.0.9报错问题(licenseKey)
  5. 针对豆瓣TOP250电影知识图谱的构建(Python+neo4j)
  6. 数据库设计中面临的主要困难和问题的总结
  7. 怎么让小白理解intel处理器(CPU)的分类
  8. 一键圣诞帽 html5源码,HTML5在线教程之微信小程序“圣诞帽”的实现思路详解
  9. 14.Vue cli脚手架安装
  10. java计算机毕业设计高校学生党建管理系统源码+mysql数据库+系统+lw文档+部署