国内应用软件开发管理的探讨
雷剑文 曹卫华
随着行业生产的扩大和提高,对企业运作的管理和效率的要求也在不断提高。一个好的适合企业管理的应用软件可以给企业带来成本,人力等资源的大大减低,从而为企业带来经济效益。而企业对应用软件的需求又带来一种局面,即企业不愿为接受外面已有的应用软件来改变自己已经成型的管理方式,又确实需要进一步借助电脑的应用来提高企业的管理水平。于是企业根据自己的管理需要来开发应用软件,一旦把软件开发局限于企业内部,开发出来的应用软件质量必然受到程序员的水平和经验所限。怎么让企业利用企业内部已有程序员来更好地为企业开发性能好的应用软件呢?以下我们将从企业应用软件开发管理的角度加以探讨。
一、应用软件开发的主体程序员
应用软件发展到今天,已积累了大量好的经验值得我们学习,这里就不再赘述。由于国内企业应用软件开发程序员的水平高低不同,在这种情形下开发质量和稳定性较好的企业应用软件是比较困难的,怎样尽可能地使应用软件开发的数量和质量不受程序员技术差异的影响呢?当然不需要每一个参与该应用软件开发的程序员都具备了各项能力以后才去完成,只需系统员具备解决技术难题的能力,合理分配工作来完成。技术在进步,人类也在进步,通过完成具体工作来不断地提高各个成员的素质,在技术提高的同时,提高技术实施的水平。
例如:先进的企业生产线在没有饱和的情况下,产量和生产力会随着工人(技术水平相似)数增加而呈显著正值增加。其简单的数学图形可用图1表示。
在面向对象编程的第四代语言广泛应用的今天,在企业现有程序员的基础上,完全可以通过改进一些应用软件开发的管理方法来提高企业应用软件的开发能力。下面是我们通过实践而产生的一些观点,拿出来和同行们探讨一下。
让我们简单地假设把这种企业应用软件开发方法同生产线加工生产模式作一比较,如下图所示:
工厂生产线作业 企业应用软件开发作业
开始 开始
流水线设计 需求分析
流水线安装 信息流分析
系统员 流水线调试 数据库设计
流水线运行 应用软件开发分析
流水线维护 各种规范的定义
对象类设计及再用性封装
简单作业培训 各种定义熟悉
程序员 生产线上实习已定义的对象类使用了解
组装加工产品各种重复工作的完成
规范定义标准检查
系统员 质量检验和控制论 模块运行检查
整体品质控制检查
程序员 包装完成 系统编译运行
完成 投入使用
可以看出,一般的先进生产线,若在非饱和状态生产能力会随着员工的增加而正向线性增加。在此员工一般不需要特别培训,即一个在该生产线上工作五年的员工和一个工作一个月的员工的工作能力相差无几,因为他们的工作只是在生产线上加工,生产线的维护和改造则由技术工程人员完成,再业看看企业应用软件开发的管理方法和改进的情形。
二、企业应用软件开发的内部调节管理
在企业内部软件开发的数量和质量与程序员数量会是一个怎样的关系呢?这里假设一个各方面知识和能力都合格的程序员值数为1,单方面知识和能力合格值数0.5,那么我们可以为企业软件开发情况做一个分析:
1、理想情况为软件开发的数量和质量随着值数为1的程序员的数量变化而成正比变化:
1=1
1+1=2
1+1+1=3
1+1+1+1=4
…
1+1+…+1=n
这种情况解释为真空,只可能出现在一般的专业软件开发公司。在企业内部我们就不必过多分析。
2.一般情况为软件开发的数量和质量随着值数0.5的程序员的数量变化而成正比变化:
0.5=0.5
0.5+0.5<1
0.5+…+0.5=1
这种情况在企业应用软件开发中较为普遍,如果值数为0.5的程序员的知识领域是互补的,又是较为理想的,有可能在积级配合下达到甚至超过值数为1的程序员所完成的工作。如果他们的知识领域是相同的,又为这种情况下的最差组合,完成的软件数量和质量就达不到企业发展的要求。
3.较差情况为软件开发的数量和质量随着值数为小于0.5的程序员的数量增加而几乎不发生变化:
0.4=0.4
0.4+0.3=0.4
0.4+…+0.4=0.5
这种情况在企业应用软件发展初期较为普遍,即使值数小于0.5的程序员的知识领域是互补的,而且是在理想的积级配合下,达到甚至超过值数为1的程序员所完成的工作的可能性也是极小的。如果他们的知识领域是相同的,又为这种情况的最差组合,完成的软件是列加远远达不到企业发展的要求。
4.经济而又适合企业的组合(为现代企业所接纳)是必须有一名值数为1的系统分析员,加上值数低的程序员组合。怎样更好地发挥这种组合的效率,是我们议论的主题。
从图2可以看出,一个企业的软件开发程序员的值数(完成编程技术难度)高低各不相同,这是实际情况。当然我们这时是从某一个时刻静止的角度看去,随着程序员值数的增加我们以下的观点仍然成立。如果程序开发过程中的工作安排是根据各人的实际情况合理分配的,那么整个开发过程基本上会按计划逐步完成,否则会出现许多方面的问题,影响整个计划实现的进度,怎亲才算合理呢?我们知道应有软件发展到今天,其开发过程已是一个有计划的技术性团体合作的过程,在对各个程序员技术能力要标的同时,对整个开发团体的协同作战能力也是一个考验。面向对象式编程为这种团体工程提供优质保障,从管理的角度,在图2的基础上我们增加了一个企业程序员在软件开发时所应完成的技术难度线。如图3所示。
由于应用软件的开发是一个技术要求较高的工作,如图3所示,很明显如果把一些技术难度系数高于某些程序员值数的工作安排给他们,必然会使整个计划的实施受到他们工作完成的质量和数量的影响,从而使计划失去意义。怎样解决由于技术难度的分配带来的问题?传统的方法是着力于对那些值数较低的程序员进行培训,提高他们完成开发软件技术难度所需的值数。我们知道这是需要大量时间、精力和资金作保障的。同时由于人员日趋变动的社会经济的发展,企业能否认可和等待,其本身就使这种方法的实效大打折扣。我们找到了另外一种可行的方法,那就是说既然技术难度不能统一分配,我们把一般程序员所需完成工作的技术难度线降低,而把系统分析员的技术难度线增高,如图4所示。
图4所示的管理实施效果已在插图4企业实施并达到。它不仅使得每个一般程序员能够按计划保质保量地完成任务,而且使得企业应用软件的开发能够快速有效地进行(基本上保持现状)。当然其中的关键是系统分析员完成技术难度大的工作,他要完成技术核心和质量控制的工作。这在面向对象式编程的现在较容易实施。就像开发工个软件提供的系统对象一样,一些适合企业应用的再用性较强的自定久对象和模块由系统分析员完成并提供给一般的程序员来使用。这不仅达到降低他们工作的技术难度,而且为企业应用统一的规范性作出了定义。不仅使得应用软件的质量和稳定性得到保障,而且使软件的维护变得更为简单和容易。这种方法很好地解决了企业应用软件开发在高速发展变化的情形下的实施。如果这种方法能够有效实施,就会使得企业应用软件的开发走上良性循环的轨道。虽然程序员完成的质术难度较低的工作,但是他闪可置身于整个交互工程之中,学习到的却是多方面的知识,不难想象在这种工程循环完成之中得来的能力提高是极有价值的。这种方法在我们企业中运用并取得实效。但是这种方法也需进一步完善,如很明显的,其中某些值数较高的程序员的资源和时间未能得到较好的利用,而又增加了系统分析员的工作量。可以将一些技术难度大的工作分配给那些值数较高的程序员去完成(但是一定要注意规范性和一致性),如图5所示。
可以看出,对于不同值数的程序员,他们工作的质量和数量的标准的高低是不同的。这样使得工作的安排能根据个人的值数各尽所能地进行,人尽其才地工作使得整个工作计划的圆满完成变为可能。该图中的曲线是动态的,也就是各个时期个人的值数是不同的,值数增长幅度也是不同的,所以曲线会随着时间的推移不断地向上移动。这就要求客观正确地定位各个时期各个程序员的值数,以动态地调整最佳曲线的变化。
三、在实际工作中从应用软件开发管理角度来看用这种管理方法达到其预计效果的几个方面
1.应用软件的开发应该是规范的,使得应用软件开工作能够很容易地被别人接手和修改。由于开发出的软件是依照一定规则的对象组合,所以相当于符合标准,而只要是群体开发软件,标准又是非常重要的,标准其实在应用软件开发的程序员之间起到了相互沟通的桥梁作用。
2.由于规范性很强,应用软件开发的关键就落到了设计规范化的对象类上,如果拥有优良的对象类(就像工厂拥有了先进的生产线)来继承和繁衍,软件开发的技术难度就可降低,从而使得不同层次的软件开发程序员都能很快地投入工作,就像工厂生产线新上岗的工人一样。
3.软件开发的生产力与程序员是成正向线性变化的。怎样可以做到呢?因为技术难题都由系统分析员来解决完成,使得技术要求水平降低,一般程序员做一些重复、再用、继承、组合等技术难度较低的工作,使得他们的工作效率大大增高,从而使得整个企业应用软件开发生产力大为增高。例图6所示。
事实上我们只不过把一些问题具体化、对象化、关键的事情还是要由经验丰富的人员来做。比如对数据库信息的SAVE、DELETE、INSERT等的操作完整性(无论从服务器数据库完整性约束还是客户端应用程序的完整性实现)工作。而增加一般程序员的数量从而达到增加应用软件开发的生产力,不论从经济上还是从管理上都是值得的。而通过一个又一个工作实践来提高程序员的技术水平,随之会问下一个起点迈进。
四、企业软件开发管理中应注意的几个方面
在面向对象编程的第四代语言中,可以充分利用对象的继承性、封装性、多态性来提高软件开发效率,使得企业电脑应用为生产和管理服务。这里简单论述一下。
强再用性
我们知道对象的继承性允许新的对象类从已建立的对象类中通过继承得到,继承所有属性、变量、函数、结构、控制和程序。在祖先对象类基础上的覆盖或扩展,不但能提高软件开发效率,而且使得对象的应用保持一致性、减少出错或调试维护变得容易简单。例如:在POWERBUILD中,因为窗口、菜单、用户对象均可继承,一个多人合作的软件开发就变得轻松容易许多,一些祖先对象的创建维护和一些理难度大的问题出值数较高的程序员来完成,以保证质量性能,那些大量重复的、较为基本的工作则由一般程序员来完成。可根据个人的情况,调整出个人的最佳效率点。所以说,开发出好的祖先对象和建立良好的思维方式是企业软件开发的成败关键。
好完整性
在客户/服务器系统应用中,数据及数据处理完整性是保证信息准确无误的重要环节。所以在软件开发中对这一点的逻辑要求是最严密的。例如,在一个事务处理过程中,可能对多个表进行修改。如果在中间发生错误时,应该放弃整个处理而不是其中的一个过程,返回到开始的状态以保证操作的完整性,从而使得数据及数据处理的完整性得到保证。
1.运算或计算灯错误。这类错误较为分散,不易检错和修改,应尽可能把计算的处理过程采用对象函数处理。
2.局部变量。尽可能地多使用局部变量。这样一来把一些事物的处理过程尽量局部化,使得软件的检错和修复变得更为容易。
可扩展性
一个事物是不断变化的,对这些事物统计和管理的电脑软件也应该是可以随之变化。因此一个好的软件程序的可扩展也是很重要的一个方面,也要加以分析和应用。例如:如果是对人类性别的分析,因为它的变化是固定的,非男即女。所以我们用IF THEN语句来规范。如果是对变化状态多于两种且状态是固定的事物,选择IF THEN或CASE就看个人的所好和专长。如果是对变化状态有不断增加的新状态出现的事物,我们应以CASE语句来加以规范,以便于以后的扩展。
易维护性
因为使用了对象的继承性,对祖先对象的修改直接影响到其继承对象,使得软件程序的维护性得到一定程序的提高,但相同的语法和逻辑规定又使得多人合作开发的软件和维护性得到保证,不会因为各自特有的思想和作风而受到限制,也为相互的提高弥补提供了可能性。
同样,因为使用了对象的封装性,即把数据和程序封装在对象中,使之成为对象类的一部分,不但屏蔽了对象编程的复杂难度,又提高了程序代码的质量而使得维护容易。因为修改被封装在对象上的程序不会影响其他的对象。
因为应用软件的开发不是由一个人而是由一个可能变化的群体合作完成,即使同一个人在不同的时期也会有不同的风格,所以保持高度的一致性是群体合作的关键之一,也是修复和改善的保障。
那些经常变化、需要集中管理和控制的运算、重复调用又要求一定运行效率的企业规则尽可能地放在服务器端(通过触发器、存储过程)。随着企业规则的不断变化而需要作的修改和维护更为容易,而且它有高的运行效率,使得运算易于管理和控制。因为它的变动逻辑与应用软件是相互独立的。
例如,企业工资管理中的奖金计算方法(根据岗位、出勤等规定计算个人奖金的企业规则),它可能随着企业经营状况的变化而变化,它的实现要放在服务器端(即数据库段)。
结
本文提出了一些企业应用软件开发管理上的想法和观点,并在实际工作中加以应用,而且取得较好的实效。其思想不难理解,就像一些系统软件现在提供的优良的开发环一样(系统提供的对象、函数等)。我们通过不断建立和积累自定义对象及其类业不断改善企业内部应用软件的开发环境,加快了企业应用软件的开发进程。本文中不足之处,欢迎批评指正。