AiTea软件特点            
         AI AI智能  
         T 省时(快)  
         E 简单  
         A 自动  



  

相关理论


降低编码,避免不必要的编码(包括自动生成的多余编码)。

研究对象:编码量

关键字:编码

关键问题:降低编码 提高编码效率 节省软件成本

什么是编码复杂度


编码复杂度C(n) :编码复杂度用于描述编码量与所解决问题的规模的关系。如,在MVC编程中,一般会涉及到action,service,dao,model(实体)。当用面向对象方式操作一个DB表时,要写一份dao;当操作两个表时,要写两份dao;当操作n个表时,要写n份dao;则此时编码的复杂度会随着问题规模增长为n,编码复杂度也变成n。关于问题n的编码复杂度(Coding Complexity)用C(n)表示。则上面描述问题的编码复杂度为:C(n)=O(n)。
编码复杂度,是以研究求解问题规模与编码量关系为对象的,它关注的是用低编码量去实现同一个问题。就是想编写更少的代码,以实现同样的功能,这样可以提高开发效率,节约软件开发成本。
可以用数据结构中时间复杂度,空间复杂度作类比来理解编码复杂度。编码复杂度C(n)=O(n),意味着:对于每一个类似的问题,我们都要重新编写代码,解决n个问题,就是编写n次代码。这就是我们在MVC开发中,要不断重复写各层代码的原因。Hibernate和Mybatis的编码复杂度都为O(n),也就是说每操作一个DB的表,就要写一次dao。 ​​


时间、空间复杂度与编码复杂度的区别和联系


时间复杂度,空间复杂度,编码复杂度有什么区别与联系
时间复杂度是程序求解问题,所需要执行的次数,如for(int i=0;i<n;i++){...} 会执行n次,则时间复杂度是O(n); 像简单排序,冒泡排序,选择排序,有两层for循环,要执行NxN次,则时间复杂度是O(n^2);它们在排序时交换变量要用到一个临时变量作为临时存储空间,所以空间复杂度为O(1)。
时间复杂度与空间复杂度没有必然联系。但是也有以空间换时间或时间换空间的,此时,它们就会有影响。像散列法,用更多的空间,但时间会小于O(n)。
编码复杂度,是以研究求解问题规模与编码量关系为对象的,它关注的是用低编码量去实现同一个问题。就是想编写更少的代码,以实现同样的功能,这样可以提高开发效率,节约软件开发成本。

十年前,PC机(个人电脑)的内存还是256k,512k为主流,再往前,内存就更小了。为了节省空间,编写的程序都是很精练的。是否还记得有这样一道算法题:不用额外的变量,交换两个变量的值。连一个临时变量的空间都节省了。2020年的PC机内存已是4G,8G为主流了,服务器的内存就更大了。为了提高执行效率,一般都会采用空间换时间的方式。从编码层面到缓存组件再到缓存数据库,都可以找到空间换时间的例子。时间复杂度与空间复杂度是计算机学科核心课程《数据结构》的重要概念,这两个概念侧重在提高运行效率与节省内存空间上。

时间复杂度与空间复杂度是从软件微观角度考虑软件的效率问题。随着软件工程的发展,规模越来越大,需求越来越复杂,为了应付这些变化,软件设计与开发模式出现过MVC模式——将软件拆分为模型、视图与控制器三个部分,以利于不同开发人员同时进行软件开发,缩短开发时间。随着互联网的发展,出现了高并发访问与信息爆炸式增长问题,软件又出现了分布式、微服务与大数据的研究热潮,软件设计与开发模式在MVC的基础上,将前后端分离,以利于将前端与后端这种访问与服务关系组织成网状进行调度;方便分布式多节点部署等。但不管是分布式、微服务还是大数据,都只是为了解决访问性能、数据安全等问题。软件发展到如此庞大的规模,并没有从宏观的角度去考虑它的复杂度问题,以致于随着软件规模的增长,开发软件所需的人力物力也跟着随同样级数规模增长。编码复杂度从软件宏观角度考虑,研究随着软件规模增长,不致于引起开发软件所需的人力物力随同样级数规模增长的解决办法。


软件编码的发展及软件生产力


市场总是在扩大,需求总是在增加。工场手工业不再能满足需要的时候,蒸汽和机器就引起了工业生产革命。软件是否也需要这样的变革。使用软件的大环境变了,不能再用原先的工场手工业方式进行编码了,应该采用低编码复杂度的方法,减少些无谓的人工编码。要是按照原来的编码技术(或方法),软件规模增长10倍,那编码量也就增长10倍,编码复杂度就是O(n)。在这个信息爆炸式增长的时代,这种效率根本无法满足软件的发展需要。若编码复杂度从O(n)降到O(1)的话,编码量就不会再随着软件规模的级数增长,就可以减少许多编码的活,从而解放生产力。Bee框架将ORM层的编码复杂度从O(n)降到O(1),是将哲学思维应用到软件学科的一个例子。Bee仅仅只是降低编码复杂度的其中一个例子而矣,其它许多软件都可以降低编码复杂度,从而提高软件开发的效率,提高软件生产力。
一个软件系统,对于软件所有者来说,主要是关注系统可用性与性能;而设计与开发一个系统,除了要满足系统可用性与性能外,主要需要考虑系统的开发效率。开发效率直接关系到对软件的投入成本。在互联网背景下,为了满足高并发、高可用等要求,从架构层面应用分布式、微服务、大数据等技术。而开发效率、编码技术却没有得到进一步发展。

除了采用编码复杂度为O(1)的技术设计与开发软件,还可以采用自动生成代码等方式提高效率。但也要注意自动生成编码复杂度高的代码并不代表就是提高效率,因为维护这种代码的成本并没有节省。

软件理论从面向过程到面向对象,再到切面编程对面向对象的补充,让编码技术进一步得到提升。时间复杂度与空间复杂度从性能与空间优化了软件。该到关注编码复杂度的时候了,从顶层考虑,降低整个软件行业的编码复杂度,让软件开发效率进一步提升。