一段时间以来,笔者都想写一篇关于如何开发一款优秀软件的文章,关于软件的质量,笔者一直很有想法,自2014年从一家很优秀的软件公司出来后,笔者发现很多软件都存在这样,那样的问题,最终相关企业也因为软件质量比较差,造成客户满意度降低,甚至影响企业的运营。
软件质量的好坏关乎一个企业的声誉、品牌形象,质量差的软件还可能对企业的发展造成不利的影响、甚至还会触及法律风险,所以软件的质量必须要重视起来。
- 一 为什么软件会存在这么多问题?
20世纪六十年代中期软件危机诞生了软件工程学,软件工程学告诉我们,要开发一款优秀的软件,需要做以下工作:需求的分析与收集、系统设计、编码与测试、部署与维护、项目管理与质量管理的工作。但我们大多数企业已经做了上述工作,为什么软件还是经常出故障,还是bug不断,解决旧的又产生新的,可谓bug如滔滔江水绵绵不绝。产品每发布一个版本,都会遗留一些bug,这些bug有的会严重影响产品的运营,影响产品的用户满意度。产品功能失效,数据完整性一致性出现问题,甚至系统崩溃,造成维护成本增加,甚至因为客户满意度降低,导致用户弃用,失去客户,丢掉市场,使企业在市场竞争中处于不利地位。
为什么会出现这种情况?诚然有些公司盲目求快,忽略了产品设计,直接编码,造成这种现象,但也相当多的企业严格遵循软件工程学中约定,制定软件开发计划、制定进度安排、做需求分析、做需求说明书、数据流图、数据字典、做原型、做软件设计、概要设计、模块设计、详细设计、数据库设计、开发时采用瀑布或敏捷等开发方法、测试设计,测试用例、单元测试、集成测试、黑盒测试、白盒测试、系统测试等工作无一漏掉,代码管理,代码审查,代码评审也都做了,但最后产品到交付时,还是一堆问题,何也?
一个好的产品,好的软件,就像一个健康的人,而那种bug不断,问题不断地产品,就是一个非健康的人,如同一个重症患者,或者带有先天疾病。
笔者自2014年从一家产品做的特别棒的企业出来后,陆续去过几家公司,发现大多产品做的不是很好,问题不断,每发布一个版本都会遗留若干bug,bug根本解决不完。有的企业做软件,没有很好的规划,在一个demo 基础上,功能层层增加,最后做出一个产品,可想而知,这样的产品很不稳定,bug不断;还有的企业开发软件时,对业务模型处理的不好,没有进行很好的业务模块划分及拆分,造成相同的模块不能复用,造成开发工作量大,模块耦合的比较严重;还有的企业设计做的也不够详细,催进度,无奈放弃一些重要的设计,直接编码,最后也是产出了一个不健康的产品。
笔者在这里总结一下,软件没有做好的几点原因:
第一 :业务模块设计的不好,没有拆分好,没有把各个业务模块包含的公共模块拆分出来,或者拆分的不合理。关于这点,笔者想举个例子,比如我们做广电收费软件,涉及到开户,发智能卡,发机顶盒,订购产品等业务。我们根据业务业务需求,设计出以下业务模块:
上图表格中三个模块中都有订购产品这个模块,那么要把订购产品定义成一个单独的模块,供三个模块调用;二个模块包含发智能卡,发机顶盒二个模块,那么把发智能卡,发机顶盒也要做成单独的模块。
再举一个例子,在科技制造领域,如智能仓储领域,涉及到AGV小车,如果业务场景有物料入库,物料出库,及物料盘点等,但这三项业务都与AGV小车及货盒(AGV小车负责运送货盒)有关系,涉及以下业务模块:
上图表格中三个大业务模块,均包含AGV 小车携货盒出库,AGV 小车携货盒入库,所以需要把这些模块均开发为一个单独的业务模块。
第二 软件架构设计的不合理。软件架构设计的不合理,会严重影响软件开发的复杂度、研发进度、工期及软件的质量。特别是物联网相关行业,涉及到硬件开发的企业,架构设计,中间件选型尤为关键。比如开发一款底层是对接FPGA,上层对接WEB应用的软件,开发语言为C语言,下面列举了二个架构:
结合上面分析,如果想快速开发一个物联网硬件设备软件,显然架构二是很一个很好的选择。
第三:部分公司加班比较严重。这种情况下,研发人员通常比较疲劳,又缺少个人学习时间,很难写出高质量的代码,比较容易进入改bug、写bug状态,很难写出高质量的代码。
- 二 如何开发出一款优秀的软件
如何解决软件问题,如何设计开发出一款优秀软件,笔者总结如下八点:
第一:选对人。开发一款好的软件,还要从选人开始,毕竟人是生产力的第一要素。从姜太公助周文王,周武王定鼎八百年周王朝,到现在的新科技,新产品问世,QQ、微信、抖音、黑神话•悟空,这些伟大的产品都与特定的人有关。所以一个企业,想做好一个产品,选人真的很关键,选对人,选对一个研发负责人,才是向伟大的事业迈出正确的第一步。
第二:设计合理的软件架构。一个合理的软件架构不仅能够提升软件的质量,还能提高开发效率、降低维护成本,并增强系统的可扩展性和可维护性。研发负责人需要深入挖掘用户需求、业务流程和规则,软件运行环境、待开发软件上层环境,底层环境,边界,领域建模,将现实世界中的业务问题转化为软件开发中的设计元素。
第三:桩模块的设计与开发。桩模块模拟外部依赖,这样每个模块都可独立开发并独立测试,避免不同模块开发团队互相依赖,从而提高团队的开发效率。比如前端开发,后端开发都要有各自的桩模块,这样避免前后端互相依赖对方的模块来测试程序,影响开发进度的问题,同时桩模块还能简化测试环境、提高测试覆盖率、隔离错误源、支持持续集成和自动化测试、促进敏捷开发。
第四:确定合理的设计周期和开发周期。笔者认为一个好的软件设计周期与开发周期最好为2:1,或者设计周期更多。想开发出一款软件,一定要做好设计,并留有相关文档,反复论证设计的正确性,架构的正确性,模块的拆分是否合理,软件的功能点是否能够满足业务需求,业务流程是否正确,软件的设计是否能满足功能性需求、性能需求、可靠性需求、可维护性需求、可扩展性需求、安全性需求等。软件所选用的开发框架、开发语言、数据库、中间件选型是否合理等。避免盲目写代码,不要以为先写代码就能快速开发,这是非常错误的。开发软件是日费千金的差事,可能涉及的高昂成本,如人力成本、硬件基础设施成本、软件开发工具、测试工具等成本,如果设计不好,就仓促应战招开发人员写代码,招测试人员测试,最后生产的软件一堆问题,陷入改bug,测试bug,写bug的恶性循环,会造成巨大的财力浪费。
第五:良好的研发管理制度。良好的研发管理制度是确保研发活动高效、有序、可持续进行。要求有明确的目标与战略规划,确保项目按时、按质、按量完成,同时提高研发效率和资源利用率。建立有效的风险管理机制,对研发过程中可能出现的风险进行识别、评估、监控和应对。严格控制软件生产过程,避免规划不执行,或在demo上完善功能,并防止个别研发人员堆砌无用的或是从第三方复制拷贝多余的业务代码,保证代码可读性、可维护性,保证代码可复用性,并保证严格遵序编码规范。
第六:老板的信任。在软件开发过程中,老板必须对研发负责人足够的信任,这对软件按预计时间规划,合理设计,合理开发相当关键。当老板不信任研发负责人时,会产生一系列不利的后果,这些后果可能对整个研发团队、项目进度、产品质量以及公司的整体运营造成负面影响。
第七:合理的工作时间。软件开发毕竟还是智力劳动,合理的工作时间对保证产品质量很关键。要避免开发人员过度加班。毕竟有时劳动时间的增加不一定与软件的质量成正比。在这方面,笔者比较佩服谷歌的做法,谷歌每天都给开发人员一个小时的自由乱想时间,这样可以充分发挥开发人员的智力,打造出高质量的产品。而据笔者多年研发工作经历,笔者发现那些过度加班的企业,产品质量都不是很好。合理的工作时间,保证开发人员的个人休息时间和学习时间,也是会助力开发人员开发出高质量软件。
第八:借助AI。团队成员借助AI 可自动化生成部分代码、完成代码审查与质量控制,辅助自动化测试,生产测试用例、自动生产研发文档等。
以上总结的八点,仅代表笔者个人观点。谢谢