问题
题主现在刚加入一个公司,目前做的工作是将一个大型的C++项目从依赖MFC的环境下移植到Mac环境下,代码几千万行是有的。第一次接触这种规模的项目,应该怎么让自己尽快上手。项目里从上世纪九十年代的代码到现在的代码,文件名有全是大写也有全是小写的,变量名有缩写的也有一个字母不拉的,各种不统一看着脑仁子疼 。项目不方便说但是是做设计的的朋友主力生产工具。
题主表面上问的是如何适应大型 C++ 项目,但实际问的是遇到千万行代码的跨平台移植应该怎么做?那我就先说一下题主的实际问题。
题主描述的信息比较少,没有说明目前有多少个人维护此项目,文档是否齐全,各模块之间的耦合高不高,所以我假定题主在的项目组具备维护此代码的能力,并且这个代码本身也是可维护的,如果这个项目交给题主一个人完成,或代码就是屎山,模块之间高耦合,没有文档没有注释,那应当直接跑路。
首先应该评估移植是否可行,如果整个项目的结构比较好的话,应该会保证将平台无关代码和平台相关代码分离到不同的模块中去,所以题主先要理解整个项目的架构代码,一般来说此部分代码不会太多,在理解架构后,找出平台有关模块,并评估工作量之后一个一个去重构这些模块就可以了,当然这个过程不可能会是一帆风顺,但总体来说这件事情还是可以完成的。如果项目没有做平台无关代码分离的话,那么移植就不是一个可行的方案,此时应该考虑重写整个代码,贸然进行移植可能会导致移植的时间成本大于重写的时间成本。
确认移植可行后,代码移植就变成了开发新的平台有关代码,移植问题就变成了一般的开发问题,接下来就可以讨论一下如何开发维护大型C++项目了,需要提前明确几点,首先过于庞大的项目是不可能有人能够了解代码所有细节的,他们都是按模块分不同的人去维护,每个人只负责其中几个模块。维护人员需要有足够的C++基础以确保不会因为语法问题影响对程序理解,同时也需要维护人员了解相应的业务和使用到的技术栈以确保能够理解代码实现的功能。
个人认为上手大型C++项目可以分为以下几个步骤:
1、阅读产品定义或实际使用该软件的主要功能(或自己要维护的功能)
先在宏观上感受产品功能,如果有其他项目相关文档,例如API文档,也应当一并阅读,不一定要完全理解,但是要知道有这个东西,方便真遇到问题了先查找文档。
2、了解代码的构建过程,如果项目使用CMake管理,则先读下CMakeLists
构建部分是大型项目的一个比较好的切入点,能从中了解到依赖关系,文件组织结构,有时程序架构也能从中窥得一二,如果是使用CMake生成跨平台的构建系统,那么CMake中就会有不同平台的构建过程,这可能可以帮助你确定那些代码是平台有关。
3、找到架构部分代码并详细阅读
这可能是最为痛苦的过程,此时是你第一次阅读项目代码,你需要找出架构部分,并理解整个代码的主要设计思路和设计范式,架构部分的代码量通常不会那么大,但是较为难懂,个人认为架构部分必须要完全读懂,这样才能搞明白整个程序是如何work起来的,各组件之间有什么样的关系,这会更好的帮助你理解各个组件的实现。
4、阅读需要维护的模块或在原有架构上开发新模块
在之前三步的基础上,你就可以将重心放在理解业务逻辑上了,一般来说新功能应该尽可能少的改动原有的代码,涉及架构的修改则需要慎之又慎。