20250427-作
题目
软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决问题。分解得越细,模块数量也就越多,设计者需要考虑模块之间的耦合度。
请围绕“论软件设计方法及其应用”论题,依次从以下三个方面进行论述。
1.概要叙述你所参与管理或开发的软件项目,以及你在其中所承担的主要工作。
2.详细阐述有哪些不同的软件设计方法,并说明每种方法的适用场景。
3.详细说明你所参与的软件开发项目中,使用了哪种软件设计方法,具体实施效果如何。
摘要
某省预约挂号系统以下简称预约挂号系统,是我司自主研发集众多医疗功能于一体,旨为提高医疗服务体验,随着用户量的逐年攀升,系统面临着性能瓶颈和可用性的严重挑战,为保证系统持续稳定的运行下去,我司决定2023年3月正式启动对预约挂号系统的升级工作,我担任系统架构设计师,主要工作对系统架构的整体设计。软件设计方法有很多,例如给予构件的软件开发、原型开发方法和敏捷开发方法等,因项目是小团队开发,项目只有一年的工期开发过程需要简单化以节省时间,又因我司是医疗企业管理的标杆每周使用40小时工作制,根据这些特点我们采用了敏捷的开发方法,并在设计时通过沟通、简单、反馈和勇气这4个核心要求设计了整个预约挂号系统的开发规约。最后系统成功完成开发,也轻松应对名医抢号时期要求的高性能和可用性,得到了领导和组员的高度认可。
背景
随着信息化时代的到来,各大医院纷纷拥抱线上系统,我司顺应时代潮流开发了一款集预约挂号、体检预约、报告查询和名医抢号等众多功能于一体,旨提高医疗服务质量和患者体验,为患者提供一个一站式、便捷化的医疗服务系统。然而,随着用户基数的逐年攀升,系统面临者性能瓶颈和可用性的严峻挑战,为了保证医疗服务项目的进一步提升,我司毅然决定2023年3月开始对预约挂号系统进行全面的升级工作,我担任系统架构设计师,主要的工作涵盖了系统架构的整体设计、技术栈的精准选型和各个核心阶段的评审工作。在软件设计方法的应用方面我司也采用了不少方法,如构件化开发方法、原型开发方法和敏捷开发方法等,结合我们项目有小团队开发、工期短需要简化流程和每周的40小时工作制,很适合敏捷开发方法,我们通过对系统自顶向下递归细化的方法设计出了具体的构件,然后每个构件通过敏捷开发方法从沟通、简单、反馈和勇气等4个方面设计构件的开发和实现的流程,大大加快了项目的进度,项目也如期的圆满完成。
理论
我们经常使用的软件开发方法有构件化的开发方法、原型开发方法和敏捷开发方法等,他们的应用场景如下。
构件化开发方法是一个将项目自顶向下的方式递归细化出合适的构件,然后通过自底向上的方式组装这些构件形成系统。主要的应用场景是:1)系统的模块化程度要求较高,要求高内聚和低耦合。2)注重每个构件的独立性,独立开发、独立部署等。3)根据业务构件选择不同的技术实现方案,灵活开发。
原型化开发方法是专门应对系统需求不明确的场景,根据开发原型与用户、产品人员等需求提供者探讨需求,并逐步确定需求的流程。主要的应用场景是:1)原型方法根据使用的方式提供了抛弃式原型和演化试原型,可以应对需求未知时和需求方向确定需要确定细节的场景。根据功能方式提供了水平原型和垂直原型,水平原型即静态原型需要快速产出原型的场景,垂直原型即动态原型主要应用是逐步演化成系统或者需要清晰的表达产品交互动作的场景。
敏捷开发方法是一个注重开发效率、以人为本、循序渐进的开发方法,其有注重沟通、简单设计、即时反馈和应对项目变更的勇气等特点,还提出了很多核心的工作流来指导开发,如结对编程、现场客户、小型发布等等。主要应用的场景:1)需要快速迭代得到一个可运行版本场景。2)想通过发布的功能及时纠正系统功能的缺陷和规避风险的场景。3)测试驱动开发的场景。4)客户能参实时的参与到项目开发中的场景。
实践
预约挂号系统的整个开发周期为项目定义阶段、需求分析与设计阶段、具体实现阶段、运行维护阶段和客户评价阶段,根据小团队开发、需要简单设计、每周40小时的工作制等特点,我们选择使用敏捷开发模型,敏捷开发模型适合复杂的项目管理,我们在分析和设计阶段选择使用自顶向下逐层的划分业务,形成机构服务、用户服务、订单服务、支付服务、公共服务和三方医院对接服务,我们利用敏捷开发方法的沟通、简单、反馈和勇气逐个设计每个服务,下面说一下机构服务的是如何应用的,效果如何。
沟通方面,在这一方法我们主要采用频繁的会议沟通模式,由于我们是工作是不同地点办公的场景,所以我们使用了某知名企业的线上会议软件,我们有每日晨会和周会两种模式,1)晨会:每天对机构服务的开发进度进行汇报,说明昨天的工作内容和今天要进行的工作,由于是小团队,所以开会时间短效率很高。2)周会:总结一周的工作进度和经验的分享。例如,经验分享方面,我们的机构服务原名是医院服务,就是通过在周会的经验分享中与医院代表沟通时由医院代表提出机构这一名词,发现很适用,能很好的诠释医院类,以及其包括的科室和医生类的总称呼,与领导汇报后改名机构服务。
简单设计,在简单设计方面我们通过复用设计和简化开发流程两个阶段体现。1)复用设计:由于本次重构项目时间紧急,所以我们比较注重系统复用和机会复用阶段的设计,我们编写了复用计划主要包括了文档、构件和程序复用规约等等。例如:机构服务涉及用户查询医院、科室和医生,源系统采用ES搜索引擎存储三者名称并进行分词,重构系统继续使用ES作为存储方式,并对ES进行了安全方面的考量升级了ES的版本,还增加更多从用户习惯功能中收集来的常用搜索词汇也配置到了ES中,这些都是通过复用得来。2)简化开发流程:在设计机构服务时,对不能复用的功能进行简化设计,例如:新设计的功能,我们采用查看概要设计整理接口。比如:名医抢号功能的优化,首先,在概要设计时只使用序列图表示其流程、描述需要使用缓存提高性能、增加多台部署提高可用性等。然后,再由开发人员根据概要设计中模型和要求编写代码,每个逻辑快需要添加清晰的注释,使用代码即详细设计的策略。
快速反馈,我们采用了随时会议的方式,在开发机构服务时难免会遇到敏感点、权衡点、风险点等系统的非功能性需求需要及时确认,我们提出及时沟通的模式,在不能及时沟通时也要采用预约模式,以达到快速解决问题的结果。
勇气,我们在勇气方面采用小版本迭代的思想,以月为单位发布小版本,每月月初进行评估功能点。例如:没上线一次会进行工作总结和组织茶话会经验分享,以提高组员完成整个系统的信心,并在季度考核中提供旅游和聚餐等活动使开发人员面对挑战意志力更坚定。
结尾
得益于敏捷开发方法的使用,2024年3月顺利完成了系统的上线工作,经过了一个月的精心推广,又吸引了大批量的用户,且系统在后面的名医抢号功能中表现出色,轻松应对高并发和万级的用户请求量,目前系统已经深度对接了11个市的500多家医院,项目组成员和领导都给予了高度的认可。但是,在开发初期,项目组新成员存在对敏捷开发方法理解有模糊之处,这一度阻碍了项目进度的顺利推进,针对这一问题,我们快速行动,通过项目组间人员的灵活调配完美解决了这一短板,同时我也吸取了教训。下一步,我们准备对预约挂号系统进行全面的迁移工作,通过这次的实施,我们对此次迁移工作充满信息,并且以更高的要求和标准来完成此次迁移。这次项目升级我对敏捷开发方法有了更深刻的认识,我的知识和经验得到了显著的提升,我也将更加努力提升自己,让自己在架构师之路上走的更远。
总结
1.实践部分一定要结合项目举例子,总结多一点例子。
例如:
沟通:晨会、周会、日报、周报、用户参与。周会讲经验:机构服务的机构由来。
简单:复用、代码即详细设计(Swagger自动生成API文档)、编码格式统一(接口、实现类)、命名规范、持续集成持续部署(Jenkins、docker)。
反馈:直接询问、电话联系、线上会议,解决权衡点、风险点,或者阻碍进度的问题。
勇气:小型发布、集体代码、计划、聚餐、团建。
2.性能、可用性
提到就要解决:
性能:缓存、负载均衡、并发机制、资源调度。读写分离
可用性:心跳、监控、冗余、事物。主备。