快速的熟悉陌生的系统

工作和学习过程中经常会遇到陌生的系统需要去熟悉,下面是我总结的一些自己的方法论,希望对你有所帮助。

了解系统Overview

首先我们需要对系统有一个Overview的了解,了解的方式可以是自己摸索,找对应系统负责人,团队leader聊,也可以自己找wiki,文档等方法。我简单的总结了一下步骤:

  • 熟悉系统的定位,明确系统要解决的主要问题
  • 如果系统有对应的UI页面,比如对于web系统,可以申请系统的权限,然后登陆系统看看系统主要有哪些菜单(一般情况下菜单其实会对于系统的功能模块),每个菜单下面都有哪些菜单项,然后浏览一下每个菜单项对应的页面有哪些按钮,哪些表格,哪些表单等。这样会对系统有哪些模块、功能有一个大概的了解。
  • 如果你幸运的话,你可以阅读系统使用手册、设计文档、需求文档等,当然大多数情况下是没有的。这个时候你其实更多的需要上一步骤对系统的大概理解,然后结合自己的工作经验,大致猜猜系统怎么设计实现的,其实对于大多数业务系统来说,看看功能模块其实是可以猜出个七七八八的系统设计和使用的情况的。当然了对于类似中间件那些系统(比如MQ,Config,Schedule)等,其实了解起来更加的迅速,因为大家基本在日常工作过程中都使用过这些系统,所以对于系统需要提供的基本功能和如何使用都比较熟悉,可能就是在系统的设计和实现上有所差异。
  • 了解系统的上下游。上下游都是哪些团队的哪些系统?这些团队的负责人是谁?系统和上下游系统是如何交互的?交互方式是什么,交互的时机等。
  • 了解系统的核心数据流向。清楚一个完成的数据链路是怎么样的。
  • 如果可以的话,自己动手在系统的dev环境或者beta环境来点一点,创建一些数据,然后走走核心数据链路。
  • 了解系统的核心监控指标。了解清楚核心监控指标,其实便于你理解系统的核心功能,并且方便日后对系统修改的时候,看看是否对核心监控指标有影响。
  • 了解系统的部署情况。一般一个系统都会有好几个模块(module),清楚每个模块干啥的,这些模块之间的依赖关系(比如admin模块,Server模块,client模块),模块或者系统系统如何部署的,是部署在KVM上?Kubernetes上?多少个实例?多少台Server?Server啥配置?存储用的啥?MySQL?HBase?DB数据量大致多少?存储多少个G/T? 存储增长量多少?系统的QPS大致多少?

按照上面的步骤操作完以后,相信你一定会对系统有一个明确的了解。这个时候其实你应该可以对系统的存储模型(数据模型)猜出个七七八八了,接下来可以看看系统的存储模型了,来验证我们的猜测。

阅读系统存储模型

此处说的存储模型也可以称为是数据模型。可以是MySQL表设计(有哪些表,表之间的关联关系,表的索引是哪些,唯一索引是哪些),Hbase的存储方式(rowKey是如何设计的,列簇如何弄的,有哪些列),也可以是抽象意义上的数据模型。

阅读系统的源码

基本了解系统功能以后,知道存储模型以后,大致怎么实现其实 应该也可以猜出来了。当然了很多功能其实的实现方式会有很多种,通过阅读系统的源码我们就可以知道系统是采用的哪种方式。如果遇到和我们猜测的实现方式不一样的话,其实可以思考一下为啥不一样?两种实现方式的区别在哪,孰优孰劣。

关于阅读源码,我整理了几个注意点

  • 首先让系统在本地/dev/beta跑起来,最好在本地,这样其实对系统的运行环境可以更加熟悉。
  • 先从从【核心数据链路】的最开始进行源码阅读,第一次阅读只需要关心核心链路,分支链路第一次阅读的时候请忽略。
  • 对核心逻辑流程进行debug。因为设计的比较好的系统,往往接口和实现是分离的,而且会有多个实现,光看接口其实有时候根本不清楚走的哪个实现,这个时候就需要进行debug了。有时候一些方法实现的可能很不清晰,这个时候通过debug,或者写main方法,单元测试等手段来了解。
  • 开业手动画出系统核心流程的关键类的调用关系
  • 阅读系统非核心逻辑代码
  • 尝试讲给系统的开发人员,确认你理解的是正确的。对一些感觉设计不合理的点,咨询当时那么设计的原因

解决自己的疑惑,确认可优化点

一般情况下,我们在阅读完系统代码之后,会有自己的疑惑,也会发现一些设计不合理的点(虽然可能这个设计在当时的情况下是合理的),我们可以提出自己的优化方案,然后找对应系统的产品、开发、负责人确认。

结语

如果你完全按照上面的方式做了,还是没有对某个系统熟悉的话,那么就只能找对应系统的产品、开发、负责人具体咨询了。

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

One reply to 快速的熟悉陌生的系统

  1. 写的挺好,看了有收获

发表评论

电子邮件地址不会被公开。 必填项已用*标注