如何开发出一款优秀的软件

一段时间以来,笔者都想写一篇关于如何开发一款优秀软件的文章,关于软件的质量,笔者一直很有想法,自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 可自动化生成部分代码、完成代码审查与质量控制,辅助自动化测试,生产测试用例、自动生产研发文档等。
以上总结的八点,仅代表笔者个人观点。谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/871670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker连接宿主机redis,提示Connection refused

目录 一、测试环境 二、问题现象 三、问题总结 一、测试环境 centos 7 redis-5.0.14 docker-26.0.1 二、问题现象 服务器重启后docker连接宿主机redis,提示Connection refused Reconnecting, last destination was /172.25.xxx.x:6379 …

[CTF]-Reverse:纯逻辑分析题型综合解析

C语言: 字符串爆破: 例题(BUUCTF SimpleRev): 查壳 看ida 这里的中心就是两个字符串和一个计算式子,textkillshadow和str2adsfkndcls,计算式子str2[v2] (v1 - 39 - key[v3 % v5] 97) % 26 …

汽车的UDS诊断02

UDS的不同服务: 1)物理寻址和功能寻址 can总线上往往有多个ECU,诊断设备可以和某个ECU通信,也可以和多个ECU通信,通过物理寻址和功能寻址来解决这个问题,只针对请求报文: 物理寻址:就是诊断仪与ECU之间点对点通信 功能寻址:就是诊断仪与多个ECU之间一对多信 我们的…

Github 2024-08-22 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1精选Go框架、库和软件列表 创建周期:3700 天开发语言:Go协议类型:MIT LicenseStar数量:127377 个Fork数量:11751 …

【备忘录模式】设计模式系列:掌握状态回溯的艺术(设计详解)

文章目录 备忘录设计模式详解引言1. 设计模式概述2. 备忘录模式的基本概念2.1 备忘录模式的定义2.2 备忘录模式的关键角色 3. 备忘录模式的实现原理3.1 备忘录模式的工作流程3.2 模式的优缺点分析3.3 与其他模式的对比 4. 实际案例分析4.1 游戏状态保存与恢复4.2 文档编辑器撤销…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践:构建高效的微服务架构 Eureka的核心原理Eureka Server:服务注册中心Eureka Client:服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client(服务提供者&…

VScode 连接远程服务器

1、 2、 3、免密登录 1、本地生成密钥 ssh-keygen2、生成的密钥默认在 C:\Users\***\.ssh\ 中3、将私钥 C:\Users\***\.ssh\id_rsa 添加到上面的配置文件中的 IdentityFile 项内4、将公钥 C:\Users\***\.ssh\id_rsa\id_rsa.pub 拷贝到远程 ~/.ssh/authorized_keys 中 4、远程…

Python | Leetcode Python题解之第354题俄罗斯套娃信封问题

题目: 题解: class Solution:def maxEnvelopes(self, envelopes: List[List[int]]) -> int:if not envelopes:return 0n len(envelopes)envelopes.sort(keylambda x: (x[0], -x[1]))f [1] * nfor i in range(n):for j in range(i):if envelopes[j]…

分享小诗梦404炫酷单页面html5源码

源码介绍 分享小诗梦404炫酷单页面html5源码,小诗梦的一个很炫酷页面,感觉应该符合一些人的感觉!可以用来做404页面。 源码下载 分享小诗梦404炫酷单页面html5源码

uniapp-部分文件中文乱码

一、问题 在开发时遇到,部分页面的中文显示乱码,如图 搜索了一下解决方法,这里记录一下 二、问题原因: 页面的编码格式不是 utf-8 造成的 三、解决方法 打开出现乱码页面选择编译器左上角的文件 > 以指定编码重新打开 选择U…

[C++] C++11详解 (一)

标题:[C] C11详解 (一) 水墨不写bug 目录 前言 一、列表初始化 二、STL的初始化列表(initializer_list —— Cplusplus.com) 三、声明方式(auto、decltype、nullptr) 1.auto ​编辑 2.decltype 正文开始&#x…

腾讯无界微前端框架介绍

一、无界微前端框架概述 无界微前端框架是由腾讯团队推出的,旨在解决现有微前端方案中存在的问题,如适配成本高、样式隔离困难、运行性能不佳、页面白屏、子应用通信复杂、子应用保活机制缺乏等。 技术实现 无界微前端的核心技术是基于Web Component…

数据导入导出(EasyExcel)框架入门指南

写在前面 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 文章目录 EasyExcel 框架概述依赖APIExcel 实体类注解写 Excel概念介绍写 Excel 通用参数WriteWorkbookWriteSheetWriteTable 代码…

GD32双路CAN踩坑记录

GD32双路CAN踩坑记录 目录 GD32双路CAN踩坑记录1 问题描述2 原因分析3 解决办法4 CAN配置参考代码 1 问题描述 GD32的CAN1无法进入接收中断,收不到数据。 注:MCU使用的是GD32E50x,其他型号不确定是否一样,本文只以GD32E50x举例说…

Vue项目-三级联动的路由跳转与传参

三级联动组件的路由的跳转与传参 三级联动,用户可以点击的:一级分类、二级分类和三级分类 以商城项目为例,Home模块跳转到Search模块,以及会把用户选中的产品(产品名字、产品ID)在路由跳转的时候&#xff…

Q*算法深度猜猜:从Q-learning优化到智能决策

Q*算法深度猜猜:从Q-learning优化到智能决策 引言 在强化学习(Reinforcement Learning)中,Q-learning算法作为一种无模型的学习方法,被广泛应用于解决各种决策优化问题。然而,尽管Q-learning在许多场景下…

基于ssm+vue+uniapp的医院挂号预约系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

Matlab处理H5文件

1.读取h5文件 filenamexxx.h5; h5disp(filename) 2.h5文件保存为mat文件 读取 HDF5 文件中的数据 % 指定 HDF5 文件的路径 filename xxx.h5;% 读取 HDF5 文件中的各个数据集 A241_P h5read(filename, /A241_P); A241_W h5read(filename, /A241_W); A242_P h5read(filen…

Ps:首选项 - 性能

Ps菜单:编辑/首选项 Edit/Preferences 快捷键:Ctrl K Photoshop 首选项中的“性能” Performance选项卡允许用户通过调整内存使用、GPU 设置、高速缓存设置以及多线程处理等选项,来优化 Photoshop 的性能。这对于处理大文件、复杂图像或需要…

【NOI-题解】1137 - 纯粹素数1258 - 求一个三位数1140 - 亲密数对1149 - 回文数个数

文章目录 一、前言二、问题问题:1137 - 纯粹素数问题:1258 - 求一个三位数问题:1140 - 亲密数对问题:1149 - 回文数个数 三、感谢 一、前言 欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 本章节主要…