软件产品品质的探索与实践(一) —— 开发品质提升

每次解决用户最关心的前三个问题, 不为无关痛痒的事情浪费时间、精力和资源。

首先是功能与服务,功能与服务是核心,是存在的价值;

其次是设计,设计使功能与服务更加突出具有吸引力,更好的使用品质;

接着是成本和传播。保证优秀功能和设计的基础上降低资源时间和人力成本,同时良好的传播和使用让边际成本更低。

软件产品品质主要可以分为四个要素:  开发品质、测试品质、项目品质和产品品质。

  一、 开发品质提升

1. 代码可读性,易理解

a.   仔细斟酌命名,望文知义,使用通俗易懂的词汇;

b.   代码风格自然一致,排版整齐;

c.   注释适宜, 特殊处理注明原因;

d.   阐述算法设计思想或注明引用出处;

e.    API、公共函数的文档简洁清晰,注明用途及原因;

f.    探索和使用正确良好的代码模式,避免生僻写法;

g.   单一职责划分, 编写短小类/短函数/短方法。

2.  功能/异常处理/健壮性

a.  准确处理常用场景。

a.0   沟通, 准确理解需求、场景及业务流;

a.1   仔细挑选开发使用的工具箱、库与框架;

a.2   常用子任务使用公认主流开发库并仔细测试;

a.3   完整理解API, 包括其功能、原理、适用场合与局限性;

a.4   编写类/方法/函数时注明使用契约及特殊处理;

a.5   每个类/方法/函数各司其职,相互协作。

b.  错误情况友好提示。

b.1  错误码和错误消息使用配置文件,与代码分离;

b.2  不同类型的参数检测使用不同的参数验证器(通常是正则表达式);

b.3   使用全局统一的错误检测函数尽量在一个地方集中检测错误。

b.4   错误处理全局框架。

错误检测函数注册器: 不同的参数对应不同的检测函数

Map<paramName, ErrorDetectFunc>  errorDetectFuncMap;

ErrorMsg ErrorDetectFunc(paramName, paramValue);

全局统一的错误检测函数:

def   Map<paramName, errormsg> detectError(Map<paramName, paramValue> params) :

Map<paramName,  errormsg>
allErrorMsg = new Map<String, ErrorMsg>();

for paramName, paramValue in params:

ErrorDetectFunc  func
= errorDetectFuncMap.get(paramName);

ErrorMsg errormsg = func(paramName, paramValue);

allErrorMsg.put(paramName,
errormsg);

return  allErrorMsg;

全局统一的错误处理函数:

def  ShouldResponse processError(Map<paramName, errormsg> allErrorMsg):

c.   异常场景疏而不漏。

c.1  细分应用中出现的各种异常并进行不同的处理;

c.2  在系统底层处理能够处理的异常, 无法处理的使用异常转译传给顶层;

c.3  在系统顶层统一处理各种应用异常并返回友好提示;

c.4  提示和异常消息放置在配置文件,与代码分离。

c.5  代码模式:

try {

if (err1) { errProcess1 ; }

...

if (errN) { errProcess2 ; }

// normal doing

} catch (someException1) {

// do with exception1

} catch (someExceptionN) {

// do with exceptionN

} catch (Exception) {

// do with other exception unexpected

} finally {

// clean up

}

3.  性能/流畅性:

a.   大数据量结果集使用多线程技术获取子集并汇总;

b.   多IO任务使用异步方式来处理;

c.   耗时长的任务进行分解/并发/异步处理;

d.   避免不必要的重复创建/计算开销;

e.   耗内存的大对象的延迟创建与复用;

f.    耗时长/频繁读操作适当利用缓存;

g.   短时操作控制在 0.5-1s 内, 长时操作采用“异步+消息通知”模式;

h.   测量时间,对热点区域进行适宜程度的优化;

i.    测量和改进响应时间与吞吐量, 使之达到良好的平衡;

j.    使用更好的硬件提升性能;

k.   减少启动加载组件,按需加载和缓存;

L.   使用异步模式逐步加载与展示;

4.  稳定性和可靠性: 能够持续长时间良好运行且不出差错,出现问题时能降级/限制运行而不崩溃。

a.   确保软件的运行环境正常稳定,包括硬件、操作系统、依赖系统;

b.   软件能够有效应对环境波动(比如网络中断)而不至于终止;

c.    外部系统服务调用的影响局部化, 不影响整体运行;

d.   系统组件服务模块的影响局部化, 不影响整体运行;

e.   避免内存泄露,死循环,死锁等会导致程序崩溃的问题;

f.    批量资源释放问题要仔细检查,是否会因为错误或异常导致内存泄露;

g.   操作失败可回滚;

h.   负载均衡避免单点故障;

i.    主备容灾应对紧急情况;

j.    高负载/性能测试;

k.    添加系统监控, 展示指定时间间隔内的系统各项指标/服务/资源的运行状况。

5. 安全性: 数据、权限与隐私保护良好

a.   用户角色与权限分级;

b .  只读与操作权限分离;

c.   机密数据加密保护/权限控制/操作限制/身份认证;

d.   权限申请加入审批流程制度;

e.   记录请求日志与用户操作日志;

f.    请求连接进行加密;

g.   避免显示请求 URL;

h.   防止注入攻击,识别非法请求模式。

6.  可扩展性:  在原有系统基础上容易扩展,添加新特性。

a.   整体架构模块化设计, 组件服务化, 最小化公共服务接口;

b.   设计时总是考虑变化;

c.   使用配置参数, 避免硬编码;

d.   编写自包含、自封装、不修改外部状态的代码,最小化依赖;

e.   使用设计模式优化代码表达结构, 增强软件的“柔韧度”;

f.    文档化顺序与依赖关系, 定期整理、更新依赖关系。

可伸缩性:  在不改变系统功能服务的基础上提供更强的处理能力和更大的处理容量。

a. 
 水平扩展:   增加多个逻辑单元资源并使他们作为一个整体在工作,
比如集群、分布式、负载均衡;

b.   垂直扩展:   在同一个逻辑单位添加资源以增加容量,
比如增加CPU、内存、磁盘空间。

7.  可维护性: 能够持久提升品质并保证简洁

a.   参见:《保持应用系统可维护性的八个实际措施》

b.   参见:《如何编写可信赖的代码》

c.   在回归测试的保护下持续小步重构。

8.  可定制性/热升级:能够根据客户的不同需求进行定制版系统, 动态加载/卸载模块。

a.   模块化应用程序和系统服务组件;

b.   每个独立组件有一个标识, 标识其是否可显示/加载;

c.
  通过配置文件指定启动或初始化时可以显示/加载的模块和组件;

d.   使用定时Job或有时限的缓存机制来加载配置文件;

e.   使用观察者模式检测配置的变化并重新加载配置到应用中;

f.    当检测配置变化时,可以发送外部命令给应用系统触发其重新加载配置;

g.   提供界面修改配置文件参数并实时更新应用和配置文件(可能有安全隐患);

h.   使用全局单例管理者来负责根据配置文件的变化动态显示/隐藏和动态加载/卸载模块。

9.  可移植性:能够在不同平台和设备上运行

a.  使用抽象屏蔽不同平台之间的差异;

b.  尽可能遵循可移植的标准;

c.   尽可能采用标准写法。

10.  人机交互:

a.   知识与信息的准确性和丰富度,符合或超出期望;

b.   操作的引导设计、正确性与舒适度;

c.   外观与设计的实用美观,赏心悦目;

d.   使用动画或添加趣味内容消弱等待时间的影响;

e.   使用变化效果提示用户请求已经发送,正在处理。

每次解决用户最关心的前三个问题, 不为无关痛痒的事情浪费时间、精力和资源。

首先是功能与服务,功能与服务是核心,是存在的价值;

其次是设计,设计使功能与服务更加突出具有吸引力,更好的使用品质;

接着是成本和传播。保证优秀功能和设计的基础上降低资源时间和人力成本,同时良好的传播和使用让边际成本更低。

软件产品品质主要可以分为四个要素:  开发品质、测试品质、项目品质和产品品质。

  一、 开发品质提升

1. 代码可读性,易理解

a.   仔细斟酌命名,望文知义,使用通俗易懂的词汇;

b.   代码风格自然一致,排版整齐;

c.   注释适宜, 特殊处理注明原因;

d.   阐述算法设计思想或注明引用出处;

e.    API、公共函数的文档简洁清晰,注明用途及原因;

f.    探索和使用正确良好的代码模式,避免生僻写法;

g.   单一职责划分, 编写短小类/短函数/短方法。

2.  功能/异常处理/健壮性

a.  准确处理常用场景。

a.0   沟通, 准确理解需求、场景及业务流;

a.1   仔细挑选开发使用的工具箱、库与框架;

a.2   常用子任务使用公认主流开发库并仔细测试;

a.3   完整理解API, 包括其功能、原理、适用场合与局限性;

a.4   编写类/方法/函数时注明使用契约及特殊处理;

a.5   每个类/方法/函数各司其职,相互协作。

b.  错误情况友好提示。

b.1  错误码和错误消息使用配置文件,与代码分离;

b.2  不同类型的参数检测使用不同的参数验证器(通常是正则表达式);

b.3   使用全局统一的错误检测函数尽量在一个地方集中检测错误。

b.4   错误处理全局框架。

错误检测函数注册器: 不同的参数对应不同的检测函数

Map<paramName, ErrorDetectFunc>  errorDetectFuncMap;

ErrorMsg ErrorDetectFunc(paramName, paramValue);

全局统一的错误检测函数:

def   Map<paramName, errormsg> detectError(Map<paramName, paramValue> params) :

Map<paramName,  errormsg>
allErrorMsg = new Map<String, ErrorMsg>();

for paramName, paramValue in params:

ErrorDetectFunc  func
= errorDetectFuncMap.get(paramName);

ErrorMsg errormsg = func(paramName, paramValue);

allErrorMsg.put(paramName,
errormsg);

return  allErrorMsg;

全局统一的错误处理函数:

def  ShouldResponse processError(Map<paramName, errormsg> allErrorMsg):

c.   异常场景疏而不漏。

c.1  细分应用中出现的各种异常并进行不同的处理;

c.2  在系统底层处理能够处理的异常, 无法处理的使用异常转译传给顶层;

c.3  在系统顶层统一处理各种应用异常并返回友好提示;

c.4  提示和异常消息放置在配置文件,与代码分离。

c.5  代码模式:

try {

if (err1) { errProcess1 ; }

...

if (errN) { errProcess2 ; }

// normal doing

} catch (someException1) {

// do with exception1

} catch (someExceptionN) {

// do with exceptionN

} catch (Exception) {

// do with other exception unexpected

} finally {

// clean up

}

3.  性能/流畅性:

a.   大数据量结果集使用多线程技术获取子集并汇总;

b.   多IO任务使用异步方式来处理;

c.   耗时长的任务进行分解/并发/异步处理;

d.   避免不必要的重复创建/计算开销;

e.   耗内存的大对象的延迟创建与复用;

f.    耗时长/频繁读操作适当利用缓存;

g.   短时操作控制在 0.5-1s 内, 长时操作采用“异步+消息通知”模式;

h.   测量时间,对热点区域进行适宜程度的优化;

i.    测量和改进响应时间与吞吐量, 使之达到良好的平衡;

j.    使用更好的硬件提升性能;

k.   减少启动加载组件,按需加载和缓存;

L.   使用异步模式逐步加载与展示;

4.  稳定性和可靠性: 能够持续长时间良好运行且不出差错,出现问题时能降级/限制运行而不崩溃。

a.   确保软件的运行环境正常稳定,包括硬件、操作系统、依赖系统;

b.   软件能够有效应对环境波动(比如网络中断)而不至于终止;

c.    外部系统服务调用的影响局部化, 不影响整体运行;

d.   系统组件服务模块的影响局部化, 不影响整体运行;

e.   避免内存泄露,死循环,死锁等会导致程序崩溃的问题;

f.    批量资源释放问题要仔细检查,是否会因为错误或异常导致内存泄露;

g.   操作失败可回滚;

h.   负载均衡避免单点故障;

i.    主备容灾应对紧急情况;

j.    高负载/性能测试;

k.    添加系统监控, 展示指定时间间隔内的系统各项指标/服务/资源的运行状况。

5. 安全性: 数据、权限与隐私保护良好

a.   用户角色与权限分级;

b .  只读与操作权限分离;

c.   机密数据加密保护/权限控制/操作限制/身份认证;

d.   权限申请加入审批流程制度;

e.   记录请求日志与用户操作日志;

f.    请求连接进行加密;

g.   避免显示请求 URL;

h.   防止注入攻击,识别非法请求模式。

6.  可扩展性:  在原有系统基础上容易扩展,添加新特性。

a.   整体架构模块化设计, 组件服务化, 最小化公共服务接口;

b.   设计时总是考虑变化;

c.   使用配置参数, 避免硬编码;

d.   编写自包含、自封装、不修改外部状态的代码,最小化依赖;

e.   使用设计模式优化代码表达结构, 增强软件的“柔韧度”;

f.    文档化顺序与依赖关系, 定期整理、更新依赖关系。

可伸缩性:  在不改变系统功能服务的基础上提供更强的处理能力和更大的处理容量。

a. 
 水平扩展:   增加多个逻辑单元资源并使他们作为一个整体在工作,
比如集群、分布式、负载均衡;

b.   垂直扩展:   在同一个逻辑单位添加资源以增加容量,
比如增加CPU、内存、磁盘空间。

7.  可维护性: 能够持久提升品质并保证简洁

a.   参见:《保持应用系统可维护性的八个实际措施》

b.   参见:《如何编写可信赖的代码》

c.   在回归测试的保护下持续小步重构。

8.  可定制性/热升级:能够根据客户的不同需求进行定制版系统, 动态加载/卸载模块。

a.   模块化应用程序和系统服务组件;

b.   每个独立组件有一个标识, 标识其是否可显示/加载;

c.
  通过配置文件指定启动或初始化时可以显示/加载的模块和组件;

d.   使用定时Job或有时限的缓存机制来加载配置文件;

e.   使用观察者模式检测配置的变化并重新加载配置到应用中;

f.    当检测配置变化时,可以发送外部命令给应用系统触发其重新加载配置;

g.   提供界面修改配置文件参数并实时更新应用和配置文件(可能有安全隐患);

h.   使用全局单例管理者来负责根据配置文件的变化动态显示/隐藏和动态加载/卸载模块。

9.  可移植性:能够在不同平台和设备上运行

a.  使用抽象屏蔽不同平台之间的差异;

b.  尽可能遵循可移植的标准;

c.   尽可能采用标准写法。

10.  人机交互:

a.   知识与信息的准确性和丰富度,符合或超出期望;

b.   操作的引导设计、正确性与舒适度;

c.   外观与设计的实用美观,赏心悦目;

d.   使用动画或添加趣味内容消弱等待时间的影响;

e.   使用变化效果提示用户请求已经发送,正在处理。

时间: 2024-11-10 16:19:56

软件产品品质的探索与实践(一) —— 开发品质提升的相关文章

工业自动化软件产业发展的探索与实践

中国自动化产业已经走过了五十年的历程.进入21世纪以来,自动化已经成为我国制造业实现可持续发展的重要支撑与保证.在"满足用户需求,利用技术推动"的前提下,我国自动化产业正在不断出现新的可喜的变化.其主要特征是,产品实现数字化.智能化.网络化与综合集成化,并在性能上向着高精度.高可靠性.高适应性方向发展.随着自动化行业的发展,工业控制软件逐渐成为自动化行业发展的趋势和主流. 一. 工业控制软件的特点 工业控制软件除具有软件的性质外,还具有鲜明的行业特色,随着自动化产业的不断发展,通过不断

百度地图V2.0实践项目开发工具类bmap.util.js V1.4

/** * 百度地图使用工具类-v2.0(大眾版) * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email [email protected] * @company KWT.Shenzhen.Inc.com * @notice 有些功能需要加入外部JS库才能使用,另外还需要申请地图JS key . * 申请地址:http://developer.baidu.com/map/apply-key.ht

微服务探索与实践—总述

背景 软件开发是一个不断发展的过程,从当初的面向过程为主到如今的面向对象的开发,软件开发者不断探索与实践更加符合时代发展要求的开发模式与架构思想,而这,也在极大程度上提高了软件开发的效率. 微服务是一种架构模式或者说是架构风格,而架构这个词语,相信有很多人都曾试图为它做出明确的定义,可是很难下,因为软件架构也在不断发展,内涵也在不断得到丰富.只是不变的是,我们需要通过软件架构,根据族组织.业务.技术等因素划分出不同的但可以相互协作的应用系统,使得设计出来的系统具有较高的伸缩性.可维护性以及可扩展

Android深度探索HAL与驱动开发 第四章

Android深度探索HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 一.下载编译和测试Android源代码 1.配置Android源代码下载环境 创建一个用于存放下载脚本文件的目录(可将该文件放到任何一个目录在这里使用-/bin) # mkdir ~/bin # PATH=~/bin:$PATH 2.下载repo脚本文件(用于下载Android源代码) # curl htttps://dl-ssl.google.com/dl/googlesource/git-repo/repo> ~/

Android深度探索HAL与驱动开发 第三章

Android深度探索HAL与驱动开发 第三章 Git使用入门 读书笔记 Git是对源代码进行管理的软件. 一.安装Git # apt-get install git # apt-get install git-doc git-emall git-gui gitk 用以下命令控制Git: # apt-get install git-core # apt-get install git-doc git-svn git-email git-gui gitk 二.查看Git文档 查看git-check

Android 实践项目开发 总结

  Android 实践项目开发 总结 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________       指导老师:娄嘉鹏          实验日期 :2015.12.06. 实验名称:                   android 百度地图开发 实验目的与要求: 1.实现定位 2.查询公交路线       3.目的地查询 实验目的: 在这次的项目开发中,我做的软件主要功能是调用百度地图的接口,实现定位.查询公交路线 和查

Android深度探索HAL与驱动开发 第二章

Android深度探索HAL与驱动开发 第二章 搭建Android开发环境 读书笔记 一.Android底层开发需要的工具 1.JDK6或以上版本 2.Eclipse3.4或以上版本 3.ADT(用于开发Android的应用程序) 4.CDT(用于开发Android NDK程序) 5.Android SDK 6.Android NDK 7.交叉编译环境 8.Linux内核源代码 9.Android源代码 10.用于调试开发板的串口工具:minicom 二.安装JDK 下载JDK后在终端输入 #

高德在提升定位精度方面的探索和实践

2019杭州云栖大会上,高德地图技术团队向与会者分享了包括视觉与机器智能.路线规划.场景化/精细化定位时空数据应用.亿级流量架构演进等多个出行技术领域的热门话题.现场火爆,听众反响强烈.我们把其中的优秀演讲内容整理成文并陆续发布出来,本文为其中一篇. 阿里巴巴高级地图技术专家方兴在高德技术专场做了题为<向场景化.精细化演进的定位技术>的演讲,主要分享了高德在提升定位精度方面的探索和实践,本文根据现场内容整理而成(在不影响原意的情况下对文字略作编辑),更多定位技术的实现细节请关注后续系列文章.

AIOps 在腾讯的探索和实践

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由LemonLu发表于云+社区专栏 赵建春 腾讯 技术运营通道主席 腾讯 社交网络运营部助理总经理 AIOps 白皮书核心编写专家 我今天要讲的主题,AIOps,是一个比较新的话题,其实从概念的提出到我们做,只有差不多一年的时间.一个新事物,有其发展的周期,在腾讯里面我们做了比较多的探索,但是肯定还是有不足的地方,就像咱们看到的 AI 的发展也还有很多不足的地方.今天带来一些案例跟大家分享,希望对大家有一些借鉴和参考的意义. 1 从