本文集说的都是些平凡的小事,但往往是这些小事区分了产品的伟大与平庸。
1.杂谈工程标准化
(1)关于工程
任何编译构建系统,都存在“代码工程”的概念,也就是架构师所说的“代码视图”。笔者觉得Visual Studio定义的最为“形象、合理”,我们可以先从这个角度来理解代码工程:
解决方案:解决方案只是一个容器,用于包含一个或多个相关项目,以及生成信息、Visual Studio 窗口设置和不与特定项目关联的任何杂项文件。 解决方案由格式唯一的文本文件(扩展名 .sln)描述;不应对其进行手动编辑 。
项目:在 Visual Studio 中创建应用、网站、插件等时,会从项目开始 。 在逻辑意义上,项目包含所有将编译到可执行文件、库或网站中的源代码文件、图标、图像、数据文件等。 项目还包含编译器设置以及程序将与之通信的各种服务或组件需要的其他配置文件。
——MSDN
解决方案是一个容器,包含了N个代码工程。
每个代码工程是一个编译单元——可以输出可执行文件(例如:exe),可以输出动态库(例如:dll)。
代码工程之间存在依赖关系。
同样,在Maven的世界、Webpack的世界也有类似的概念,只是术语不同。
(2)关于工程标准化
通常编译构建系统会定义一套标准化的脚本,供程序猿按照架构师的“设计图纸”划分代码工程,描述代码工程间的依赖关系。以Maven的POM为例:
POM stands for "Project Object Model". It is an XML representation of a Maven project held in a file named pom.xml. When in the presence of Maven folks, speaking of a project is speaking in the philosophical sense, beyond a mere collection of files containing code. A project contains configuration files, as well as the developers involved and the roles they play, the defect tracking system, the organization and licenses, the URL of where the project lives, the project's dependencies, and all of the other little pieces that come into play to give code life. It is a one-stop-shop for all things concerning the project. In fact, in the Maven world, a project need not contain any code at all, merely a pom.xml.
From http://maven.apache.org/pom.html
那么,看起来“遵循脚本规范,标准化的编写就能够轻松愉快的实现工程标准化了”。
事实并非如此,现代化的软件开发分工很细(也不排除程序猿个体的学习动力),往往一个产品刚开始的代码框架、工程脚本由一个程序猿大牛搭建好的,后来者基本不用了解Maven这些编译构建系统的细节,即使日后需要用到,也只需要把以前产品的完整代码复制粘贴再删除多余的代码——笔者接触过我厂很多工作5年的Java程序猿,对Maven的理解仅停留在听说过“Maven”这个单词的水平——这的确是一个不太乐观的现实。
2.基于Maven的工程标准化
(1)看懂架构师的图纸
首先,我们来假设一种场景:“希望业务侧代码是一套,但是能够兼容不同微服务开发框架(例如:同时兼容SpringCloud和Dubbo)”。有实战经验的同学一眼就能发现这种需求场景对于“BS/微服务”系统具有一定的典型性。
再来,看看“架构师的图纸”。本文重点讲解“如何根据架构师的图纸来构建标准化的Maven工程”,不展开讨论图纸本身如何设计。
core-fw/core-fw-ex:内外部三方件
sdk-platform:平台适配层的接口
sdk-platform-springboot:针对SpringBoot平台适配层的实现
sdk-platform-dubbo:针对Dubbo平台适配层的实现
db-product1:产品1的数据库层
bu-product1-feature1/bu-product1-featureN:产品1的特性1~N的single层
bu-product1-composite:产品1的组合层
bu-product1-website:产品1的View层
(2)POM编写
解决方案的POM
core-fw的POM
core-fw-ex的POM
sdk-platform的POM
sdk-platform-springboot的POM
db-product1的POM
bu-common的POM
bu-product1-feature1的POM
bu-product1-composite的POM
bu-product1-website的POM
3.总结
本文通过一个典型的微服务应用系统为例,展示了如何达到工程标准化。
最后,我们用鲁迅先生的话结束本文:“规范千万条,工程第一条。工程不规范,亲人两行泪”