How to develop quality software with a good velocity

快速地开发一个高质量软件,可以说这是软件工程师追求的目标之一,甚至有点像学篮球的人想扣篮一样,说是追求,甚至也可以说梦想。

首先一个高质量的软件是什么呢?首先是正确地完成预期的功能,如果软件有错误,这个就算不上是高质量的软件了。也就是正确性是第一步。再就是定义高质量的非功能性要求,用户体验良好。这个有点需要区分一下前后端,站在后端开发而言就是接口要及时响应,前端需要有流畅的交互体验或者浏览体验。纯技术而言,也就是软件层面,目前做到这些已经可以了。但是要想做得更好,我们需要配合硬件资源,比如一个相对较高的服务器配置,包括网络带宽,磁盘读写,内存大小,CPU核数。也就是说一个高质量的软件从来不都是哪一个人的事,也不是哪一个部门的事,它需要大家共同的努力,首先做好每个人各自的模块,最后组合在一起,发挥其组合效应。

一个高质量的软件需要有人统筹大局,把握整个全局架构,同时协调各个组成部分,让每个成员有全局观,同时既要做好自己的部分,也要配合其它组成部分。本文讨论的范畴因该会更小一点,我们只讨论后端开发怎么做好自己的那一部分。

在前后端开发分离的架构下,前后端的分工更加明确,在一定的条件下,可以说是提高了开发效率。我作为java后端开发人员,我也在一直想怎么又好又快地开发软件,软件说开发功能。

软件开发中有些功能,可能之前的开发经历中已经开发过类似地,或者相同的功能。但是并不意味着,你就可把以前的代码全部复制粘贴进来,如果有代码,只是说是借鉴,当前的项目背景和开发框架可能会有一些变化。但是总体而言,开发这样的功能会比没有开发过的功能更有信心。因为通过以前的功能开发,你积累了比较多的经验,更具体地说,就是开发这一块功能的相关知识和细节。探索阶段所花的时间就会相应地减少,能更快地开发出一个“可以工作”的软件,或者说功能模块,甚至说是API接口,这在一定层度上缩短了交付时间。

说到这里,不得不提的是,一些企业招聘中,经常会提到3年开发经验,5~10年开发经验,这些工作经验成了一个必要条件,但是现实中的软件开发真得就是比开发年限吗?

我觉得不是。不是说开发年限,开发经验不重要。它们重要。但是如果说一个拥有开发年限比较久就是王道,那么就等同说,软件都是建立在经验之上的。

显然不是的,我们的生活的这个世界,变化之快,同样软件也是要学会适应这个快速变化的世界。因为很大程度上,软件都只是在模拟真实的世界,它在用一些类似人的处理过程去处理现实的问题。

现实就是这样,可能一直会发生变化。所以你的软件也需要发生一些变化,有些人可能更喜欢用“需求”变化来更具体化“软件变化”,这个没有关系,我们就变化这一块达成共识就行。

回到上面的问题。开发的经验只能算是软件开发中一个加分项,类似于试卷中的附加题。那么软件开发中还有什么比较重要呢?或者说怎么去快速地开发一个高质量的软件呢?

我们上面聊过高质量软件——功能性要求正确,非功能性要求用户体验良好。

就功能性正确而言,我们需要测试其功能,让它和期待的一样。有时候的功能性不正确,一般都是测试不到位。举个例子,有个功能,它表现形式有多样,它变化的部分较多,如果测试只关注那些变换的部分,那么测试的力度怎么都不会足够深,通过测试建立的信心也不能那么足,甚至在出现生产事故的时候也没有那么意外。因为它本身就是多变的,测试集也随机抽样,所以它可能出错的概率就是存在的,根据“墨菲定律”——只要有可能会出错的事,就一定会出错。所以测试那些期望比较模糊的功能时,一定要把握其不变性,抓住它不变的部分,怎么用不变来应对万变。这是一个思维模式的转换,表面上是关注点的不同,实质上是抓住了变化的重点。

这个例子其实来自于我以前开发的一个答题卡功能,以前在绘制答题卡的时候,边界经常出现问题,因为之前的关注点就是在怎么处理边界的题目。后来到这个问题的彻底解决是在改变了绘制题目的方式,由一次绘制一个大题,到一次绘制一行题目,不是采用预先计算方式,而是采用实时计算方式来处理剩余空间,这就是抓住了变化的本质,用不变以应对万变。

至于测试方式,或者说测试行为,你可以用Unit Test 某个方法,或者采用Postman来测试RESTFulLl接口.甚至其它的测试框架。关注于测试,和不关注测试。说的更具体一点就是,如果你写代码是由测试的,你会有一个新的视角。有点像你的API接口是消费品,是商品,它会被消费,而你就是商家。通常你没有测试的概念,或者思想。你就只会站在商家的角度去考虑问题,去写代码。但是如果你测试你的代码,你就多了一种身份——消费者。你会消费你的接口,也就是调用的接口,这时如果调用方式很烦,比如路径,比如请求参数,比如处理请求结果。这是你可能就会“抱怨”这个商家提供的API接口的确不够好。所以如果你测试了你的代码就有了让你优先改善你的接口,你的代码能力,这一切都会给你树立一个良好的职业素养形象。

所以测试,这项技能你值得拥有。它不仅让你对你的代码建立信心,还让你树立良好的职业形象。

说完了功能性,再提到非功能性,我想这点还是容易让人理解的。这要求你不再是一位软件开发者,而是软件使用者。如果让你来用这款软件,在功能型满足的条件下,你希望它有哪些让你喜欢的plus功能。如果用户喜欢这会从侧面反应你的软件质量高。

聊完了高质量,我们再回到主题,怎么快速开发高质量软件。

高质量的软件的开发离不开整个团队的努力,其中开发团队离不开测试体系的保障,但同时我们可以关注软件本身的一些度量。比如测试中的代码覆盖率,还有模块耦合程度,代码抽象程度,甚至代码中命名规范等等。一些比较好的开发工具,插件和专门的框架对这一块可以给我们提供一些很好帮助。

但是怎么快速呢?这个字眼格外地突出。软件开发中,时间都去哪了?敲代码的时间会很多吗?敲的代码会很多吗?

软件开发——开发一款高质量的软件,我们需要理解需求,首先要知道我们要做的是什么,也就是实例化需求的过程,这个过程会花去一些时间。然后就是理解过程,开始尝试定义好API接口,这样前后端就可以同步进行了。

编码过程会有一些编程上的问题,然后使用编程的方法把它解决掉。这差不多就是写代码的工作。你的技能熟练程度一般会缩小你写代码的时间,但是你的视野,或者说知识及背后的学习能力决定了你的代码量的多少,我指的是完成软件功能的代码量。语言的特性,新的API,或者相关的工具类都会对你的代码质量有一个比较高的提升,这个不仅仅取决于你追求的高质量软件的程度,还会与当时的项目背景,需求交付时间等等一系列外部因素有关。

我在追求这个《快速地开发高质量软件》过程中,个人努力的方向一般都是关注新的技术,学习新的知识,扩大自己的知识视野。

你的想法又是什么呢?欢迎留言讨论。