【每天5分钟,了解一个知识点】
在软件开发的过程中,需求分析和技术设计是至关重要的环节。作为一名软件开发者,我们不能仅仅专注于编码实现,更要在需求分析和技术设计阶段下足功夫,这样才能避免无用的体力开发工作,提高开发效率和软件质量。
一、需求分析

(一)解决现实问题
在面对需求时,我们首先要思考这个需求解决了什么现实问题。要从现实问题入手,一连串地追问为什么,直到抓住问题的本质。同时,我们还要评估这个需求是否真的能解决问题,对于边界情况和特殊情况是否也能生效。如果需求只是临时方案,那我们还要考虑最终方案是什么样的,临时方案是否值得去做。另外,我们也要注意需求会不会留下新的问题,不能因小失大。
(二)需求清晰明确
由于我们缺乏严谨的需求规格说明书,产品提交的需求文档很可能有疏漏。我们需要检查需求文档的一致性,看是否存在自相矛盾的地方;检查二义性,看是否存在语义不明的表述。还要明确每个用例的前置条件、不同状态下的输出以及边界情况下的输出。现实中,需求文档常常会有不清晰的表述,比如“查询结果可导出”,但却没有明确导出哪些字段、是否需要分页、导出的文件格式和模板是什么以及非功能性需求有哪些。
(三)寻找更好方案
一个需求提过来可能很具象,比如在哪里加一个按钮、在哪里新增一个输入框等,这很容易误导开发人员直接去做。开发人员此时要思考这个需求侵入到这个领域模型里是否合理,用户的操作归属在这个页面上是否合理,相似的需求是否有类似的实现可以复用等。如果开发人员有不同的见解,就要做好讨论的准备,可以寻求上级的支持,也可以用技术借口旁敲侧击。
(四)避免范围遗漏
需求的范围决定了项目的范围,项目的范围又影响着项目的时间和质量。然而,在需求阶段我们总是会遗漏一些范围,为项目后期埋下隐患。评估需求的范围,可以从系统角度来看,考虑每个模块的改造对直接依赖它的模块的影响,包括接口、实现和数据的变动,必要时还要一层一层地分析下去。可见,模块的解耦非常重要。
二、技术设计
(一)核心要点
业务开发做技术设计的核心在于模型、接口和数据库表结构设计,以及业务逻辑的抽象能力。得益于公司大中台小前台的组织结构,前台业务开发人员不需要关心技术问题的具体实现,能全身心投入到业务中。

(二)模型/接口设计
系统模型与业务模型:系统模型是业务服务层暴露的模型,它的设计离不开业务模型,应该在业务模型的基础上推导分析得出。而业务模型在需求分析阶段输出,所以需求分析阶段的业务模型极其重要。在设计模型时,我们要考虑职责是否明确、业务模块之间的依赖能否减少,尽量减少双向依赖。
模型设计追求简单:当设计变得复杂时,要停下来反思业务模型和系统模型是否合理,是否有更简单有效的做法。优秀的开发工程师应该将复杂问题抽象化和简单化,而不是复杂化。对于复杂设计,解决已知、普遍问题的可以放手去做,解决不确定、面向未来问题的则要谨慎,避免过度设计。
职责明确、单一:模型设计的核心是明确职责,这样在软件迭代开发中,维护和设计会更清晰可靠。虽然职责明确说起来容易,但具体分析时却很困难,通常逻辑和数据越内聚的地方,职责就越明确。
关于接口设计:接口的粒度是一个需要考虑的问题。按照设计原则,接口应该细化,职责明确,参数也明确。但实践中,很多服务化接口是大而全的,好处是逻辑收敛,但维护困难。总的来说,越往上层,接口要越细化、职责要越单一;越往下层,接口粒度越粗、通用性越强,呈现倒三角形的接口层级。
通用性:对于业务相关度不高的模块,设计时要考虑通用性,比如打标、快照等模型,通过 outid+outtype 去关联外部业务模型,这样更容易复用,诞生平台化解决方案。
(三)存储模型设计
系统模型核心地位:系统模型设计完成后,才能进行存储模型设计。系统模型是设计的核心,千万不要先设计数据库再设计领域模型。存储模型大多由系统模型推导得出,是系统模型的持久化层实现方案,但不同的存储设计带来的维护成本可能差别很大。
范式与反范式权衡:范式可以减少冗余,维护数据一致性,但会增加表结构和查询成本;反范式可以提高查询性能,减少表关联和查询次数,但可能带来数据不一致的风险。在存储设计中,要权衡冗余和性能,我倾向于用范式设计减少冗余,用搜索引擎提高查询能力,用反范式做模型简化。
可扩展性:存储模型的设计也要有可扩展性,迎合业务发展方向。比如两个实体的关系可能会发生变化,存储结构的变更可能需要做数据迁移,所以在设计时要考虑未来的业务规划和需求,但也要谨慎对待面向未来的设计,难以确定时尽量选择简单的方案。
(四)其他方面
代码结构:模型确定后,对于复杂的业务模块,代码结构的设计也很重要。不需要详细设计文档,想清楚大概要用的设计模式和大体结构即可,好的代码结构是不断重构出来的。
配置化:业务逻辑复杂时,配置化是一个值得考虑的方向,比如利用流程引擎解决复杂流程分支,利用元数据驱动提高相似产品开发效率。如果能提高代码的可维护性,就可以大胆尝试设计适合当前业务场景的框架。
软件开发的关键节点在前期的需求和设计阶段,工程师的价值不仅在于编码实现,更在于设计和分析。想清楚再做,才能让我们的开发工作更加高效、高质量。
【关联阅读】
关注公众号,回复【Java面试】,获取更多面试资料




