代码的有效性问题 [原]

   刚参加工作的时候,老同志向我介绍了一个有效代码行的概念,这个概念对我的工作有一定的影响,介绍给大家,希望对大家的工作有一点帮助。
   有效代码行的概念是相对代码行的概念而言的,我们平时比较重视代码行的概念,代码行是指在编程中程序员编写的所有代码的行数。包括。空行,注解行,以及代码行。这里要注意的一个问题是,很多人由于编写不规范,会将多个代码行写在一行,这不但会使代码行的计算发生错误,而且对代码的调试也很不便。 
   例如
      if(a==1){b=1;}else{b=2;}
   应该编写为
      if(a == 1){
           b = 1;
      }else{
           b = 2;
      }
这样代码行应该为5行而不是1行

有效代码行是实现相同功能的最短代码行。举一个事例说明一下,有c语言实现打印从1 到10000所有的整数。比较极端里编程方法是:
      print1to10000(){
          printf("%d /n",1);
          printf("%d /n",2);
          .
          .
          printf("%d /n",10000);
      }
该程序代码行为10002行,但另外一个实现完全相同功能的代码是
      print1to10000(){
          int i;
          for(i=1; i <=10000; i++){
              printf("%d /n",10000);
          }
      }
代码行为5行。也就是说第一个程序的代码行是10002,但它的有效代码行为是5行

   这是一个比较极端的事例。也许有人会说没有人会去编写10002行代码的那样的傻瓜程序。的确是这样,在这个问题上没有人会这么编写,但在开发的过程中类似的问题总是层出不穷。以后我会举一些事例说明。
关于有效代码的行的另外一个问题是,有效代码行应该是实际运行系统中的代码行。而不是你在项目中编写的所有代码行。举一个例子。我在一个项目使用c语言开发,由于我对一些技术难点不了解,所以要编写一些代码做技术准备,(假设我编写了5000行),当所有的技术难点解决之后,我开始进行编码,编写的代码行为 4000行,那么我的有效代码行应该为多少呢?是4000行,这是因为我原来编写的5000行代码是做实验用的,而在我真正开发的系统中并没有使用到他们,所以它不是有效代码行。
    这个例子从一个侧面说明了为什么有人一个月可以编写1万到2万行代码,却不能完成开发任务的问题。原因很简单,他编写的是代码行,而不是有效代码行。所以我们现在不必因为听说某开发人员是个高产量的代码生产者就感到自卑。(提出一个问题,如果项目失败了,有效代码行应该是多少)。
    关于有效代码行另外一个使人惊讶的问题是-----一个正常的软件开发人员的每天的有效代码开发量是10行到15行(国外的统计),怎么样很少吧。但你只要仔细想想就会发现其中的奥秘了,这是一个开发组织开发一个项目的的平均值,之所以会这么少,是因为在统计的时候要算上所有的工作人员(调研人员,设计人员,编码人员,测试人员,维护人员,文挡编写人员等)以及所有的时间(从调研开始计算时间)。而不是单指编程人员的每天的工作量。如果你认为你每天编写10到15行代码就完成任务了那就大错而特错了,实际上你如果将你手头一个刚做完的项目做一下计算,恐怕有效代码行也就是这个数了。
    关于有效代码的一个有趣的问题是,不要单纯的谈论有效代码行的问题(后者说把它作为评价代码的唯一标准),有时候适当地降低有效代码行效果反而更好,举一个例子。我曾经有编写过程序是进行一个矩阵转换,如下所示。


1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
转换为

1 2 6 7 15 16 28 29
3 5 8 14 17 27 30 43
4 9 13 18 26 31 42 44
10 12 19 25 32 41 45 54
11 20 24 33 40 46 53 55
21 23 34 39 47 52 56 61
22 35 38 48 51 57 60 62
36 37 49 50 58 59 63 64

    我的一个同时编写一个64行的赋值语句,当时我看完了觉得他很笨,于是自己花了2个小时编写一个复杂的转化语句,大约是30,40 是行,当时挺得意的,可后来一想不对,我的有效代码行是少了,但存在几个问题:
    1效率低,由于存在判断语句和循环语句,效率肯定要低,而效率是这个程序要强调的一个条件。
    2调试麻烦,我的同事只用了10分钟就完成了工作,而我用了2个小时。唯一欣慰的是我的有效代码行少,而且容易扩展性(但扩展性在这里用不上)。所以我想这应该是一个糟糕的只强调有效代码行的例子。

    下面,我再补充一点关于10002行的代码问题,我做的比较多的是信息管理系统,一次我们的一个项目组做一个项目,该项目的特点是要对十几个专业数据库的数据进行管理。专业数据库之间没有相互联系。独立成为系统。操作主要是添加、删除、修改、查询、统计。各子系统除了数据项不同以外操作过程是比较相类似的。由于项目比较简单,就交给了一个新工作人员开发(需求是比较完善的)。他先实现了一个专业数据库系统,然后采用copy的方法在很短的时候实现了其他的系统(当然要做一些修改)。开发的速度很快。但到了测试的时候问题就来了。我们的测试人员只要在一处发现了问题,其他的系统必然存在相同的问题。如果他要修改一个错误,就要同时修改十几处相同的错误。编写过代码的同志们都知道做这种相同的重复性的编码是很烦人的。改了一阵他就受不了了,而且更可怕的是,他修改的地方仍然会发现新的错误。而一旦修
改又是十几地方需要同时修改,你说烦人不
    最后总算基本过关了。但他花费的时间和精力是很大的,而且对软件开发产生了畏惧心理,以后再也没有过code工作。从这个工作事例来说我们不难发现一些问题。
    1采用copy的方法编程在软件开发过程中是一种常见的现象,特别是对一些刚参加的软件开发人员和非软件专业的工作人员(我在12年的开发过程中发现的一个规律)。
    2采用这种开发方法虽然开始的速度会快一点,但实际上以后的维护工作是非常巨大的。
    3这种编程能够方法和10002行的编程方法从原理上来说是相同的。
    其实很多道理是很简单的,相同的问题,我也遇到过,我自己的工作300个表,每一个表要7个界面,也就是说要2100个界面,bs系统的界面开发是很浪费时间的一个人一天最好也就是一个界面,2100个界面估计要87个人月,所以如果采用copy的方法我就死到家了,后来我们采用了动态开发的方法只用了14个人月。而且系统维护起来很方便。(不论是修改界面还是新添加功能速度都很快)
    如何代码行的有效性,编程经验不多的确是很难编写有效的编码行。一个建议是,如果你完成了一个功能的开发,可以采用别的方法再次开发(当然是在不影响工作的情况下的)。我自己的开发经验是这样的,如果是第一次实现某个功能。实现了即可(满足系统要求),但要做第二次编码(或者叫迭代吧),将其中暴露的问题解决(诸如函数代码短过长,模块划分不合理,不好的变量名等问题),一般来说,第二次开发完成之后,代码是比较合理的,而且代码段会短很多。另外在算法上进行一些改进,只要不断总结进步会很快(别学狗熊掰棒子)。
    有效代码行的的问题的确比较复杂。原来的定义是:完成一个相同功能的最短代码行数。我自己扩充了几个附加条件:
    1必须在实际系统使用的代码。
    2有效代码行不是衡量一个代码好坏的唯一标准。
至于如何评价一个别人写的代码的有效代码行。我想需要考虑多个方面:
    1需求是否合理,不合理的需求只会增加代码行,不会增加有效代码行
    2框架是否合理。解决相同问题可以有不同的方法,方法的不同代码行的差别很大,但有效代码行应该是相同的
    3不同开发环境的有效代码行的差别很大,应该区别对待。
    4对基本的算法的实现应该进一步完善,获得最佳实现方法
    5积累开发数据(在开发过程发生开发的数据),获得一个基本检测数值(可惜我目前还没有发现关于这方面的资料)
    6系统自动生成的代码行不算有效代码行。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值