随笔-109  评论-588  文章-5  trackbacks-13

    引言

    本来拉开架势准备继续做我的遥感影像库,然而世事难料,就在我实验正做得起劲的时候,一纸命令把我抽调到北京支援一个MIS项目。

    MIS项目我只在本科的时候做过一个,当时用的是ASP.NET,五个血气方刚的小伙子由于共同的兴趣凑到了一起,给学校做了一个本科生学籍/成绩/课程综合管理系统,虽然最后学校由于不具备项目需要的网络条件而没有用上那个系统,但现在回头看看,项目做的也算是有板有眼。头一次做这种规模的项目,就用上了源代码管理;文档也算中规中矩,都是按照国标格式写的。但我们当时的软工理论还很落后,对“统一过程”、“敏捷”等方法论都是到后期才开始注意的,对设计模式更是没有认识,所以整个开发过程基本是按照传统的瀑布过程进行的。最后学校只给了我们可怜的1000块人民币,但大家也没太当回事,因为得到了丰富的经验,获得了成就感,这在当时足够了。

    从那以后,本科毕业,大家各奔东西,我上研之后就开始做GIS,再没碰过MIS项目。到现在转眼将近三年,916日突然接到对我工作经验了如指掌的老板通知,抽我到北京救火,19号就动身。18号老婆才刚考完博啊,19号我就要走,实在是对不起她,但又没有办法,因为现在的我只是个小工,对这种事只有服从。

    然而当我赶到北京满怀希望打算重操旧业时,却发现事情远没有我想的那么简单。这两天利用十一放假的机会把前一阶段的项目日志整理了一下,分成几个部分post出来,以备查考。


        第一篇:“切五花肉”式的分工

    我面对的是一个被几乎一天一变的需求折磨得疲惫不堪的团队;一个初步看上去,代码几乎读不懂的烂尾工程。这里的负责人就告诉我一句话:“你是生力军。”

    而先于我两个月到达这里,一直泡在这个项目中的另两个同事则一边表达着对变化的需求的无奈与烦躁,一边向我展示由于不适应北方干燥气候而产生的皮肤反应,又一边不断自言自语对南方家乡的思念之情。看到此情此景,一种不祥的预感便从我心里油然而生。

    这仍然是一个使用ASP.NET开发的项目,仍然是分成数据库和前端代码两大块。我由于来的晚,没有赶上数据库设计和业务逻辑的架构设计。

    按照我过去的经验,MIS项目的分工大概应该分层划分。本科时我们五个人的分工为:一个人专门设计数据库,使用ERwin,一个人专门写存储过程,与设计数据库的结成一组;另外一个人和我结成一组,负责写业务逻辑,由于人手不够,他也同时负责页面美工;最后一个人专门负责测试。项目中应该产生的文档都由我来写。

    设计数据库的专门负责数据库设计,编写存储过程的专门负责数据层和业务逻辑层的接口,编写业务逻辑的可以无须知道数据库的具体结构——有多少表,都叫什么,都有什么约束关系,而只管将前端需求变成一组接口,由存储过程来实现它们。这样角色、权限、安全等等都可以与数据层的相关机制结合起来,而且在业务逻辑层代码中见不到一条SQL语句,取而代之的是对存储过程的调用,其功能从存储过程名便一目了然,不清楚的再稍加注释。我觉得这样划分应该还是比较合理的。一是因为职责分明,开发人员各负其责;二是容易让彼此之间有清晰的接口,降低耦合度,特别是专门设立存储过程开发人员大大降低了数据层与业务逻辑层之间的耦合度,存储过程作为一个重要的独立部分的存在屏蔽掉了底层数据层的变化对上层业务逻辑的影响。这样代码的清晰度、安全性、效率自然而然的就上了一个档次。

    然而这次我看到的情况却完全不同。我刚到的时候,正好赶上有一块新的需求在前一天讨论确定。于是负责人就让我做这部分,并且这样交代我:
    “数据库的ER图就在vss里面,你根据需要,要添什么表就自己添,要改什么表和关系就自己改,只要加上comment就可以了。除了要实现功能以外,页面也要自己画,只要风格和整体一致就可以了。”

    我当时就郁闷了——等于是从数据库设计到画页面一条龙全要我一个人搞?!对这种分工方式我把它比作“切五花肉”。在我看来这简直就是胡闹。然而郁闷之余,与其它单位的同学交流了一下,居然这种分工方式当下还非常流行!一般就是一到两个号称很牛的博士,项目拿来便开始“切五花肉”,一人一块,分完还不忘撂下一句“这个,没啥”。干去吧~~~

天哪……

    这简直就是对OOA/D、分层编程模型、设计模式等等基本原则的肆意践踏和蹂躏。也难怪他们已经被不断变化的需求折磨得焦头烂额了,须知“Requirements always change”啊。这种“切五花肉”式的分工弊端再明显不过了:
1)、所有开发人员必须对数据库的设计、业务逻辑的设计开发、客户端逻辑的控制和页面的美工都非常熟悉;
2)、作为项目基石的数据库设计由多人仅仅以vsscomment的沟通方式合作完成,这些人对数据库都是管中窥豹,而且他们各有所长,有的对数据库设计较有经验,而有的可能只略懂皮毛,这样设计出来的库能不是“豆腐渣”吗?
3)、不断变化的需求就像是一场场地震,破坏力会从底层一直波及到顶层;
4)、项目就是一盘散沙,没有整体的设计;
5)、协调成本非常大,对项目经理的要求一下子提到很高,因为要想在这种分工模式下开发出基本能用的系统,就必须严格定义好每个人之间“肉块”与“肉块”的接口,还有每个人自己“肉块”内部各层之间的接口。否则最终的系统只能是一锅“肉酱”。然而更加不幸的是应该做这种协调工作的项目经理根本就不存在。

    明知道这样做下去必将坠入这痛苦的深渊,等待我的也将是与他们一样无尽的折磨,但我也无能为力,因为我现在不是两年前的项目负责人,而只是个普通的小工。

    痛苦的历程才刚刚开始,接下来的日子里,了解项目架构,读原来的代码,我在这倒退的历史中品尝着无能为力的苦涩。

    未完待续

posted on 2005-10-05 01:04 合金枪头 阅读(2422) 评论(37)  编辑 收藏 所属分类: MIS

评论:
#1楼  2005-10-05 02:18 | mkimtaehee [未注册用户]
我也和你一样 我们4个人开发一个 项目,2个写界面,1个管理项目,还有我1个写从数据库设计,表结构,关系,到业务逻辑层,还写复杂的界面开发,。
痛苦的历程才刚刚开始,接下来的日子里,了解项目架构,读原来的代码,我在这倒退的历史中品尝着无能为力的苦涩。
这个时候我想到 大长今 说的:这就是现实。。。为了生存,为了钱。


  回复  引用    
#2楼  2005-10-05 02:52 | 原野 [未注册用户]
以史为镜
  回复  引用    
#3楼  2005-10-05 03:14 | sm160.com      
你们是身在福中不知福啊?

一人分一小块肉吃还不好啊?

我现在可是单枪在干, 项目的每一个细节都我一个人在做....


  回复  引用  查看    
#4楼  2005-10-05 03:52 | Justin Lee      
我也有过和你一样的经历,连使用的工具都一样?“ER”。
  回复  引用  查看    
#5楼  2005-10-05 04:15 | 極速 [未注册用户]
好玩、搞笑!
  回复  引用    
#6楼  2005-10-05 04:35 | faqi [未注册用户]
用不用设计模式、是不是分层设计,跟人员数量、人员分配无关。有经验的人即使一个人干也会将这些东西分挥得淋离尽至
  回复  引用    
#7楼  2005-10-05 05:16 | linkcd      
这太正常了,我从15个月前就开始被要求这样做了
从ui到sp...

很多企业他就喜欢这样做...
  回复  引用  查看    
#8楼  2005-10-05 11:57 | ocean [未注册用户]
当需求频繁变化时,并不意味着你分层就一定好,就比如一个用户注册的页面吧,如果你分层多了,当需求变化,比如要增加一个用户的专用gmail字段,那么数据库的表要加一个字段,存储过程要多一个参数,调用存储过程的类要多传递一个参数给存储过程,并且类的方法本身也要多一个参数,然后asp.net中调用此类也要多传一个参数,界面上要多加一个文本框.实际上修改的量更大.而简单的分层结构的话,只要更改一下sql 语句和界面即可,没有那么多的嵌套调用.实际上程序中不出现sql语句并不意味着就是好程序.因为sql 总是要写的,只是你写在类里面还是写在存存储过程里面罢了.在某些情况下,封装的越多,改的越多,需求变化的时候更改的工作量更大.

  回复  引用    
#9楼  2005-10-05 13:07 | 蛙蛙池塘      
是分层做还是分模块做呢?
这个各有各的说话。
  回复  引用  查看    
#10楼  2005-10-05 13:11 | yinh      
没什么了,我现在在这个组做了三个项目了吧,每个都是全全负责,觉得很有趣,我把我自己想成好几个人来做这些事情,想想如果有几个人在一起做,我应该怎么管理,协调,俨然PM,架构师的样子。

其实对于你自己来说,如果无力改变,就把事情向好的方向去想,做任何一个项目,不管是什么,都争取学习到更多的知识。当然,任何项目都难免要做很多无聊的工作,不新鲜的工作,不具挑战性的工作,这是难以避免的,你可以把这也看成熟能生巧的一个过程。

有时,完全看你的态度。
上面有人说到长今,长今的信念确实值得大家学习。
  回复  引用  查看    
#11楼  2005-10-05 15:00 | lovebanyi [未注册用户]
跟楼主提的一样..郁闷中
  回复  引用    
#12楼  2005-10-05 17:14 | 雪龙 [未注册用户]
偶现在管住一个小团队,有8个人,用的是分层负责的办法,项目正在开始,有好的经验再来分享
  回复  引用    
#13楼 [楼主] 2005-10-05 17:36 | 合金枪头      
呵呵,发在首页上看的人就是多啊:)多谢捧场~~

我整理日志的时候就在琢磨:既然有不少项目就是通过“五花肉”式的分工做出来的,那它也应该有其合理的成分。所以这也不一定就是历史的倒退,更大的可能是我本人经验太少,见识尚浅。最后决定把这一系列贴出来也就是想听听大家的意见,开阔一下视野。题目不合适的话还可以改。

@yinh
如果从学习的角度来看,你说的很有道理。至于大长今,老婆在看,回去问问她:)

@ocean
你说的问题我做第一个项目时也遇到过,而且经常遇到。那么有没有一种方法能尽量屏蔽掉数据层的变化对上层的影响呢?通过改善存储过程的设计可以做到吗?
  回复  引用  查看    
#14楼  2005-10-05 18:49 | Rickie      
个人意见: 分层 与 分模块 结合管理project

1, 按照功能模块划分,交给developer负责开发;
2,同时,每层指定一个Leader负责协调统一,特别是Database/Database Access和UI层;
3,另外,个人喜欢将一个简单的SQL Script放在Business Rules层,利于维护(否则Database层的SP或View会太多了)

你们的看法如何? 欢迎讨论!谢谢!

  回复  引用  查看    
#15楼  2005-10-06 01:06 | comment [未注册用户]
@sm160.com

我比你好点,呵呵,有个不会做网页的美工和一个会做网页不会美工的"程序员"帮忙

然后我要设计数据库,编写业务层,往表示层上绑控件

数据层现在到方便了,用VS2005的DataSet搞定
  回复  引用    
#16楼 [楼主] 2005-10-06 03:41 | 合金枪头      
@Rickie
分层与分模块是由于负责人看项目的角度不同。但不会是100%的分层,也不会是100%的分模块,只是以哪个为主的区别,两者应该是结合在一起的。
另外,请教一下:你SQL脚本的作用是?
  回复  引用  查看    
#17楼  2005-10-06 04:24 | 铱星      
项目的合理划分的确是个问题啊
  回复  引用  查看    
#18楼  2005-10-06 11:28 | kaneboy [未注册用户]
个人看法:
1、这样的项目,参与的人越少越好,别再分切了,不管横切竖切都会把项目越搞越糟,开发人员两个就足够了,而且两个人轮流写,一个人写的时候另外一个人在边上看着,千万别各干各的,另外多出来的人,做测试,做界面都行。
2、别对项目的结果报太大的希望,毕竟,不是每个开发人员都有机会亲自经历一个被搞砸的项目的,呵呵。
  回复  引用    
#20楼  2005-10-06 20:13 | ocean [未注册用户]
这个不是怎么分的问题,不要太教条了。这样看具体情况:
当大家都很熟练,而且对设计模式、数据库有良好理解时,你可以采取一种方式
当人员参差不齐,那么你最好换一种方式。
软件开发和人关系比较大。具体怎么划分,采用什么方式,要根据人员来定。否则你设计的太深奥,光给属下讲明白就耗费大部分时间了。

我的建议时模块划分,每个模块实现不多的功能,这个模块交给某个程序员自由发挥。数据库结构要定死,也即数据层代码、业务逻辑层代码、显示层代码是有一个程序员写的,但是数据库的机构是由设计人员来设计的。当数据库改动时通知这个程序员改动相应代码就好了,程序员自己写的所有层,所有改起来很快。

另外每个模块不要太大,控制一定量,当模块改动过大的时候,可以考虑直接重写模块,而不是在上面修修补补,甚至测试的时候发现某模块问题太多,直接换个素质高点的程序员把那个模块重写就完了。不去考虑模块内部的结构问题。

在大型应用中,尽量采用web service,并且web service接口要定死,如果接口有变化,就重新写一个新的,但是原来的保留。这样可以保证大家的松散耦合,特别如果涉及到很多点之间的数据交换的情况。
  回复  引用    
#21楼 [楼主] 2005-10-07 02:25 | 合金枪头      
@ocean
分工是人来分,也是分给人,是应该因人而异,但这对项目负责人的要求就高了,需要有比较丰富的经验才能分得合理。我觉得,或者说希望能有一种关于分工的指导性方法,一般性原则。

======
数据库结构要定死,也即数据层代码、业务逻辑层代码、显示层代码是有一个程序员写的,但是数据库的机构是由设计人员来设计的。当数据库改动时通知这个程序员改动相应代码就好了,程序员自己写的所有层,所有改起来很快。
======
数据库结构要是能定死的话就太好了,我现在郁闷的就是数据库结构总改,而且“谁都会有机会”。所以数据层一定要有一个负责任、有经验、确实懂数据库设计的人来负责。
  回复  引用  查看    
#22楼 [楼主] 2005-10-07 02:53 | 合金枪头      
@编写人生
你的图画的很好,一目了然,呵呵

就我的经验来看,在写业务逻辑的时候,最害怕的就是数据层的变动。而数据层中的表和表与表之间的逻辑关系是一个有机的整体,也有其相对独立的设计方法,与业务逻辑层的架构设计还是有区别的。很多时候逻辑层和界面层的工作量不允许每层一个人,这时候层内分工当然也要做,这时候分工自然就是按照功能模块来划分的了。

但是数据层内部可就没有那么清晰的模块界线了,至少不一定与逻辑层和界面层的模块界线一样。所以我的意见是你图中纵向的分工界线别一下子划到底,而是画到数据层上面就止住,如果用我的话说,那就是“五花肉”别一刀全切开,而是剩最下面的瘦肉别动。

最下面的数据层还是交给专门的数据库设计人员来负责比较好,也不一定是一个人,他们在数据层内的分工应该不是按照模块来划分的。
  回复  引用  查看    
#23楼  2005-10-07 06:45 | 行知      
ocean的意见我很赞同,说到底,一个项目要如何进行,取决于项目组成员的水平,和互相之间的默契程度。由于项目成员的流动,负责人都需要经常变化开发模式。

一个成熟稳定的团队对于项目负责人来说是可遇不可求的,老板们并不在乎人员的变化,项目负责人难啊。

  回复  引用  查看    
#24楼  2005-10-08 11:04 | kemin      
时下流行的“切五花肉”的方法并非像楼主所说的那种“项目拿来便开始切五花肉,一人一块“。
我所参与开发的几个小型项目(3—10w RMB)、中型项目(50w RMB)、大型项目(80w USD)基本都是采用如下的方式进行的:
1、构建框架阶段。此阶段先定框架,然后将框架的各个部件分给各人开发。大致分为持久层、业务基类(包含业务代理)、页面基类及公用层。
2、开发典型应用范例阶段。此阶段针对系统的每种主要应用,开发出一个典型范例(包括从页面到数据),并在此阶段验证(并修正)所构建的框架能满足系统的主要应用。
3、将项目的各业务切成五花肉(从页面到数据)分配给各人,依照典型范例进行开发。
大型项目中,数据库是由专门的DBA来管理的,但数据库的表结构、关系等基本还是由设计人员定,然后交由DBA实施。
我所开发的几个项目并非是同一公司的,这种开发模式不管是小公司还是大公司,还是很受欢迎。
  回复  引用  查看    
#25楼 [楼主] 2005-10-08 14:57 | 合金枪头      
@kemin
多谢指点,你说的方法确实很不错,长见识。真是羡慕你的团队,可以应用这种方法来做开发。

我们这里基本仍停留在小作坊的阶段,负责人头脑中瀑布式的软工模型根深蒂固,更没有你说的构建框架、开发典型范例的过程。我把开发日志贴出来就是想能从和大家的讨论中学到点比较先进的实践经验。谢谢了:)
  回复  引用  查看    
#26楼  2005-10-10 00:36 | starocean [未注册用户]
人气很旺啊,嘿嘿。想起以前我们做的东西,看看现在自己手里整天用数据库,这可是电信商用级的数据库啊。哪有我们以前做的东西,需要添加什么都是cr单过来了直接添,表和表之间没什么关系。这也是号称CMM4的水平啊 ^_^ 没办法。这个世界上很多东西都不像理想中那样

上次在西伯利亚听一个在公司干了五年的系统优化部的博士大牛说,公司现在的系统总结起来就四个字“增删查改”,经典噻!
  回复  引用    
#27楼  2005-10-10 00:36 | star ocean [未注册用户]
代问候一声嫂子 ^_^
  回复  引用    
#28楼  2005-10-10 02:30 | 合金枪头      
@star ocean
555……
我们的DBA啊,我们想念你
想念你啊,想念你……

觉得你在外面混多了见识也广了,怀念我们一起做项目的日子。以后一定要多多交流啊。

你嫂子考博考了247分,比她分高的就仨人,应该没啥问题:)
  回复  引用  查看    
#29楼  2005-10-10 14:18 | star ocean [未注册用户]
幸福才是最重要的。让自己和身边爱的人幸福!
  回复  引用    
#30楼  2006-02-19 11:50 | 键盘上的鸡 [未注册用户]
深有同感,我们公司做项目也一直都是“切五花肉”式的,难度可想而知了。
接下来我会接手一个项目,我想彻底改变这个现状态,但在想法刚提出来的时候就遭遇了前所未有的反对,幸好领导没有反对,TNND,一帮白痴程序员,项目经理不好当啊。

  回复  引用    
#31楼  2006-03-31 02:33 | Ivony [未注册用户]
当需求频繁变化时,并不意味着你分层就一定好,就比如一个用户注册的页面吧,如果你分层多了,当需求变化,比如要增加一个用户的专用gmail字段,那么数据库的表要加一个字段,存储过程要多一个参数,调用存储过程的类要多传递一个参数给存储过程,并且类的方法本身也要多一个参数,然后asp.net中调用此类也要多传一个参数,界面上要多加一个文本框.实际上修改的量更大.而简单的分层结构的话,只要更改一下sql 语句和界面即可,没有那么多的嵌套调用.实际上程序中不出现sql语句并不意味着就是好程序.因为sql 总是要写的,只是你写在类里面还是写在存存储过程里面罢了.在某些情况下,封装的越多,改的越多,需求变化的时候更改的工作量更大.


这只能说是设计缺陷。

这是因为根本就没有可延展数据的概念。
像这种数据,根本就不应该使用存储过程。
而应该用动态生成参数化SQL语句。
接受类似于IDictionary和Map的变量,从IDictionary中获取值,通过Map将这些值映射到字段上。
BLL既然不需要对数据进行处理则可以把UI的IDictionary直接扔给DAL。
这样,所需要修改的无非就是UI和Map以及DataBase了。


这是基于一个重要的设计理念:我只处理我所关心的。
  回复  引用    
#32楼  2006-05-16 13:10 | 1000copy [未注册用户]
切五花肉”? 有意思。
  回复  引用    
#33楼  2006-05-26 11:46 | shixl [未注册用户]
确实了解了好多东西,kemin兄说的感觉有点像快速开发模型.
  回复  引用    
#34楼  2006-09-15 07:31 | mailtowangbin@163.com [未注册用户]
修改数据全部应该是自动生成sql语句吧,这个是机械劳动,没必要程序做吧
  回复  引用    
#35楼  2008-04-18 10:41 | 游客 [未注册用户]
痛苦的经历,都是一样,我是一条龙服务,现在回想起来,真是.....
  回复  引用    
#36楼  2008-07-26 07:13 | ltjabc [未注册用户]
很多系统的模块划分都是这种按功能去划分的。其实质上是缺少设计人员或者项目负责人偷懒,按功能划分各模块多容易啊:这个你做,这个他做。其他不用管了。
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-10-08 22:00 编辑过