架构设计中常常关注几个视图,如功能视图、逻辑视图、运行视图与部署视图。但架构师们由于层次较高,长期缺少代码编写能力,往往就直接忽视了开发视图。开发视图主要描述软件的开发工程结构、代码规范,以及构建技术等。代码结构和构建关系到项目的可持续维护以及维护的周期,非常重要。但实现开发活动,架构到开发中间层的GAP,真正重视并落地的很少很少。
清淅明确的代码结构,是软件项目成功的重要开始。
代码结构不应该仅仅归纳为 “代码编码风格” 一类,它是架构在代码层次的真实反应,架构是否能落地,代码结构的良好设计起着至关重要的作用。软件是有生命力的,需要考虑其可持续性发展。一个结构层次非常不好软件,它的逻辑可能并不一定复杂,但随着时间的推移,需要花费非常长的时间去理解它表达的的意思。同样不好的代码结构,让构建变得困难或效率低下,进一步降低了它的生命力。
当然,代码层次结构在软件质量属性方面,还是归于开发态的 “可读性和可维护性” 的范畴,我们设计一个层次清晰的代码结构,就是为了达到以下几点目的:
代码层次结构大到子系统划分,中到模块工程目录的划分,小到工程内的各个package(Java/Go)目录的划分。无论何种层次,重要还是保持一个层次清晰的目录结构。组织一个良好的目录结构也是设计思想直接体现,其实也并不是那么的简单能设计出来,实际需要根据软件的功能划分不断地调整。
系统结构的划发是对系统逐步分解的一个过程。设计软件结构的具体任务是将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口和人机界面等。模块的划发也是第一层项目工程目录结构划分,只要是模块划分是清晰的,还是较容易映射到代码工程结构。
模块的划分方法论很多,模块往往是将由一个或多个功能(或目标)密切相关或相似的应用程序所组成的程序集合抽象出来组成在一起。这本质是对业务需求深入了解之后的功能与数据层面的分解。之前的SOA,以及现在微服务都是一种软件架构工程上的优秀实践,但它不能给出业务系统中是按什么维度来划分多少个服务或微服务的答案。
大的道理与原则还是有一些:
模块在架构设计大都能较清晰明确,但模块内的包结构是常见混乱的地方。在Java体系中,Maven作为优秀的工程实践,它约定了源码、测试与资源三种顶层目录,我们还需要进一步在模块内如何划分包(package)结构。
同样需要有一种按功能划分Package的意识:
优秀的包结构划分有着非常多的参考,例如JDK的源码,Spring boot的源码。
对模块,包package,类,方法的命名对于提升代码结构清晰度也非常的重要,好的命名让代码自解释,使用与维护时都能快速知道它所要表达的涵意。
最近一直在和团队成员写代码,深感软件代码结构的重要性。若代码架构不清晰,是前人挖坑后人掉坑里难以出来。若有代码架构清晰,模块(微)服务内可能有一两骨干再加一些新手就完全可以搞定。这样带来显著的效果是,既可以节省人力成本,也可以快速培养新人。