怎样做分析才能使“代码工人”顺利编码实现呢?
我本人水平比较菜,不过也做了几年的分析了,回头想想,总觉的乱七八糟,
没有什么项目的分析让我满意。
怎样做分析才能使“代码工人”顺利编码实现呢?
一般的工程总是那么紧急,老板一般又是那么的急功近利,总感觉分析做不透,
不知大家有否此感受。
就上面的问题想和大家深入交流,非常感谢先。
我的email:rsg@inhe.net
按软件工程的原则来说,分析要细化的每个函数,这样也许你所谓的“代码工人”
就可以顺利的编码实现了:
附: 我本人的意见是,尊重每一个程序员,不喜欢看到如“代码工人”这样的词语,至少在我们国家现在的情况下,不适合。
什么叫“代码工人”?编程是一种智力的挑战,程序员通过不断的学习,逐渐丰富自己的知识,就能编出更好、更优质的程序。编码的乐趣是无穷无尽的,每一行代码都是程序员智慧的体现。
凭你这句话就知道,你不知道害死多少程序员,压根就不知道什么叫程序,就去做“分析”,go to hell!
xtrrsg (算了)
首先你要进行详细设计 而且必须要有对所使用行业的深刻了解 还要勇于承担责任 这是一个基础
首先我不知道你是不是可以承担项目的开发的完全责任 如果你不能 那么你就不要做详细设计了
建议 www.aicase.com down 一个代码生成器
to o6z:
我正在想你呢,就看到你了,呵呵。想就这个“代码工人”的问题跟你聊聊。
在现有的OO方法及OO语言下,我根本不相信什么“代码工人”。举个最简单的例子:我是设计师,设计了一个stack类;你是代码工人,你来给我写这个类的pop方法。我告诉你:我把所有的元素都放在_elements这个数组里面了,你把最后一个元素弹出来就行。结果你这样做了。但是你忘了一件事:在执行之前检查_elements数组是否为空。结果,如果有人对一个空的stack执行pop,就会得到undefined的结果。
为什么出现这种情况?因为软件的问题主要是出在模块之间的结合部,也就是模块之间的“契约(contract)”上。如果我只是告诉你“写一个pop方法”,又凭什么要求你一定会检查“栈是否为空”的情况?所以,Design by Contract应该是OO方法成为可能、使分工协作成为可能的基础。除非你把对象之间的契约写在代码里,靠编译器来保证它们得到实施,否则对象之间的关系就是不可靠的,开发者之间的协作就是不可行的。
xtrrsg (算了) :
讲代码工人,让人感觉很不好.好了,说说我该改如何让"设计工人"工作的,告诉他们我的需求,让他们出设计文档,然后再评审,再出设计,再评审,不期待一次过程中"设计工人"的工作能让人满意.因为"需求工人"的工作也不是第一次就可以让别人满意和非常完善的.同样的,你可以同样的期待于"程序工人"的工作,采用不断迭代的过程,完善你的设计和让"程序工人"指出你设计的漏洞,开发人员不是你的代码生成器,你也不是万能的上帝,不尊重你的开发人员,就别指望别人尊重你了.
to zhf_karen(zhf):
你的想法很好,但是存在一个比较严重的问题:如何判断是谁的错误?就以我上面的例子:当一个client对空的stack调用了pop时,这是client的错还是我们这边coder的错?如果你不能在契约中把对象之间的责任和义务规定清楚,那么程序设计最终将演变为政治——出钱的人有话语权,位高的人有话语权,所有的责任都被推给coder。这恰好就是我们这个产业的现状,难怪程序员都这么难过。
什么代码工人呢!
你以为你做了系统分析就有什么了不起了吗?
你也不是从编程做起的吗?
要不你肯定做不好系统分析!
去死吧!
wengdy2000(浪子)同志代表了一种很不好的倾向:否认软件工程的科学性,否认分工协作的可能性。
请看清楚:分工协作是必须的,“个人英雄”式的软件开发是不可行的。既然要分工协作,就必定有些人专攻编码,有些人专攻设计。既然如此,难道叫不叫“代码工人”,事实就有所不同了吗?
代码工人,不管这个名字好还是不好,它是客观存在的。我们应该考虑的,是如何保证这种分工协作可行并且合理。
SHIZUMARU(绯雨闲丸):
对于此,我的解决是:在项目开发之初,我会要求每个开发人员,设计人员;你别认为别人过来的数据都是对的,有可能是有问题的,你这里必须判断出错情况.这在设计中是应该有体现的.
当然,我并不认为我(包括大多数设计人员),能够有能力把这一切都安排妥当,只要不是主体设计的问题,其他一切小问题都可以以后再慢慢做,不然开始的时候系统会显得大到无法设计的地步.
随便举个例子,我们基本上没有人能够说自己写1000行代码能够没有任何一点错误,设计人员也是一样,他也会出错,而且更麻烦的是:设计人员没有办法Build,Debug,他的一切"代码"只能在脑子里.所以错误是肯定有的,在初期设计人员只要把精力放在大体结构上就可以了,后期再进行更详细的设计.
这是我的看法.请不吝指教.
SHIZUMARU(绯雨闲丸)先生:
你说得也有道理,分工合作,对吧!他说得也没错"代码工人"称呼而已
也有人叫"程序员",称呼各人有各人的爱好.
好了,我对我刚才的过急之言, 对 xtrrsg (算了) 表示歉意
(不过,你这样说有一种倾向:是不是想得点分呢?)
SHIZUMARU(绯雨闲丸)
你给我出了一个难题 这使我想起了火星计划的失败 和你的问题可以说完全一样 在那时各部分的测试都完全通过 但是还是出来那样的事情 而且我还记得nasa的那个伟大的英寸错误 在这这样一个严格的组织中是怎么发生的呢 使他们做的不够好吗 是他们没有CMM5吗:) 关键的问题我看是责任过分明确 交叉太少 没有监督 哈哈 好像我是在说政治改革了 可是实际的情况往往如此 这些结合部是最容易出事的
但是在这个问题上你作为设计者 其实是不合格的 你只是告诉我pop() 但是你没有告诉我pop()怎么实现 这种情况下 我还不是代码工人 你应该是这样才可以:
pop():
’设立一个数组_elements[]
' 检查_elements[]是否为空
' 为空就。。。。。。
’不为空就_elements[n]
' _elements[n]=null
' n--
这样我才是工人 不然我才不给你干 :)
所以从这点来看 我本来就是可有可无 感谢你还给我一口饭吃
哈哈 你多费心 以后多写点这样的伪码 那样蓝领才有市场
**************
*谦逊就是力量*
*勇气就是保证*
*交流就是方法*
*纪律就是权利*
**************
我想这里有一个很关键的问题所在:
你说:“我本人水平比较菜,不过也做了几年的分析了,回头想想,总觉的乱七八糟,
没有什么项目的分析让我满意。
怎样做分析才能使“代码工人”顺利编码实现呢?
”
这岂不是跨过了开发中最关键的一步:设计!
就算是在日本人和给国外做软件外包开发的那些开发公司里,所承接的也是设计全部做完以后的设计文档,然后来完成编码部分的。
注意:并不是分析结束以后就如何如何!
印度的做法也是把设计文档交给真正的蓝领代码工人来进行编码的,做设计的就不一样,在印度,仍然是水平比较高的人或者教育程度比较高的人来承担的。这些人在国外仍然称之为:Software Engineer,而不是Coder。
分析只是做了用户需求的解析,说实在话,这根本不是软件开发中最关键的步骤,应该说这是一个入门步骤,在软件开发过程中需求的获取就是第一步!应该说这一不应该是由行业专家和设计人员协同完成的,或者有一些可以充当行业专家的软件工程师和用户一同完成的。
只有承担设计来进行编码的人才会被称为Coder。
换句话说:做需求的人不过是做了需求的一个翻译,翻译成程序员可以理解的一些内容而已。
如果那抗日战争时期的话,如果说:用户适当是日本人的话,这些做需求的人,不过是“走狗”翻译——呵呵,我说话可能对不起大家,连我自己也骂了。不好意思!
这些翻译来强迫我们这些程序员也就是当时的矿工或者工厂的技师工人来工作,来给他们设计武器枪炮等等的。
其实他们是做什么的?大家能想明白吧?就是既当日本人的翻译,又要来当这些矿工技师的翻译。明白了吧,如果剩下的人都是“代码工人”,那这些人是什么人。呵呵,我就不多说了。
to o6z:
我不写这样的伪码,因为这是抢了“代码工人”的饭碗。如果我做设计,我大概会给你一个这样的contract:
class STACK[G] --“[G]”表示这是一个泛型容器
...
feature
pop : G -- pop方法的返回类型是G,即泛型容器的类型参数
require
count > 0
ensure
count = (count-1)
end
在这个contract中,我保证调用pop方法时栈内元素计数(count)大于0,并要求你除了弹出一个元素之外还要保证元素计数要比弹出之前少1。至于你如何实现弹出的动作,甚至如何实现元素计数(在Eiffel中,count可能是一个方法也可能是一个field),我都不关心。
你觉得这个方案如何?
可以一行代码不写就当系统分析员吗?如果可以,真的好羡慕,向你们请教。
To SHIZUMARU(绯雨闲丸) :
1. 你的描述还是不够“代码工人”来实现。因为他还是不知道
对象是以什么顺序进出容器的,当容器满了时怎么办?
2. "我保证调用pop方法时栈内元素计数(count)大于0”也就
意味着你在设计使用这个栈的所有地方都要有这样的明确的逻辑检查。
否则“代码工人”怎么知道?但是这样就有矛盾了,因为你不知道
“代码工人”何时要用你的这个栈来实现另一个功能,因为在你的方法
里,选择具体的实现方法是“代码工人”的工作。这样讲可能不是很好
理解,还是举你的例子吧,例子中好像可以不必指定“代码工人”用一个
怎样的计数器类来实现栈的元素计数,但是你怎么保证“代码工人”
所选择的计数器类的contract是符合要求的呢,(比如,栈的容器的
最大计数值是一个maxlong,而他选却选择了一个只能计maxint的计数器)
所以你必须雇用一个能根据上下contract,来寻找满足条件的计数器类
的“代码工人”。而这样的选择难道不是一种设计嘛?
3. 如果你同意我上面的讲法的话,我们再讨论一下我们看中
“代码工人”的是选择以及实现方案的能力呢?还是在编码的能力呢?
其实在现在这个编译工具随手可得的年代纯粹的编码早就不存在了。
无论什么形式的伪代码,只要是严密的都可以自动转换成代码,如果
不是看中“代码工人”的判断能力,我们何需“代码工人”呢?
4. 我想你的设计一定是基于可复用原则的吧,这个栈不要说对某个
“代码工人”来说,是他的第一次,而且应该是对你手下的所有
“代码工人”来说都是第一次吧,对于这样的一个永远面对第一次的,
时时在做选择的“代码工人”我们至少应该尊称他一下为“高级技工”
吧。(其实设计师不也就是一个高级技工嘛)
本来“工人”或“蓝领”并不是一个什么下贱的名词,可是有一些人
非要将这个标签贴在干着和他们没有太大本质区别(最多是考虑范围这个
量上有区别)的其他人身上,以示自己的特殊,就很容易引起反感。
SHIZUMARU(绯雨闲丸)
哈哈不行啊 老弟(大概你应该比我小 这里比我大的没有几个 已经正式证实的是aiWangji(爱忘记)
你看来没有做过详细分析 哈哈 我也没有作过 不过偶看过小鬼子做的详细设计 吓死人 其实详细设计应该把算法变量等等类内部的东西都包括进去 事无巨细都要设计到 所以你不过问是不行的 如果你做不到这个地步 那么就不能成为详细设计 那么就不能说可以交给代码工人去做 总之详细设计就是你应该自己把代码写一遍(当然是用伪码 或者文字) 赶快找找国外来的详细设计书看看吧
哈哈 我已经很多人讨论过这个问题 最后我发现我的概要设计就是他们常说的详细设计 而他们的概要设计我就根本不知道是什么东西 大概只能相当于我在小本子上的草图 不过你的做法已经初具详细设计的雏形 只要你不把那些东西不管就好
嘿嘿 和有些同志说话很费劲 他们喜欢想当然 哈哈 就像你在说高展教授那里说的 所以有些时候我们还是不要太较真 总之我看这里没有几个同志能做到楼主说的:做分析才能使“代码工人”顺利编码实现 至少我知道我不能 哈哈你以前也不能 不过现在有可能(只要你不被累死就可以)
aiwangji 说的很好啊 参考一下吧
**************
*谦逊就是力量*
*勇气就是保证*
*交流就是方法*
*纪律就是权利*
**************
首先恕在下答非所问,先不说你是否混上系统分析员,不知你是直接跳到分析员,还是也从“代码工人”过来的。以后建议你不要用这个词语,你这是自己贬低自己...............
哈哈,各位可好,本人就是一个“代码工人”,就是看不惯分析人员的一些并不见的高明的分析设计,心里有所感而已。但工资比我高,气比我大,唉,失败阿。其实说工人也没有什么不好,本来就是吗。
曾经有一位老科研人员这样问我:你是学什么的阿?
‘我学计算机的’,嘿嘿,我还自豪,
‘使用计算机和使用钳子一个样,’他说
哇赛,我的脸都开始发烫了,我就这么惨阿,我这不就是一个“代码民工”吗?唉,就算是吧,不过总是心里那点自尊心在作崇,唉,我也没有办法阿,日子就是这么过的,
我曾经听过我们老总在招聘分析员的时候说过:我向来不重视写代码的,大街上一抓一把,我的妈阿,我头发都快树起来了。我看分析员那点水准也不怎么样阿,凭什么。。。。。。。。。。我想呐喊!!!
嘿嘿,
我就正在给鬼子作详细设计,
很细很细的说,
所有接口和内部变量都要写出来,
能剩下的工作也就是用等号什么的把变量连起来了,
真怀疑他们需不需要coder,
直接找个打字员ok了。
mis98ZB(Effective Typer) :
你这样的说法是错误的,你设计的详细设计方案应该是类似MIS系统,因为这才是我认为这才是多少我相信一些的,我就问一点,如果你写出那么详细的文档,为什么不直接用代码实现了呢?理由在于设计是可以跨平台的,而具体的一些代码的编写是很难跨平台的,而这部分就需要程序员的智慧了.别认为程序员仅仅是完成代码的机器,如果那么简单的机器的话,就没有必要要人来做了.
比如举一个例子,我需要你用256K的内存写一个程序,里面包括内存在各个模块之间划分,当你发现使用内存超标了,你该如何做?这需要高级的VC程序员用汇编来完成部分功能,你是否这些都能解决?那么我只能说你真的很厉害,厉害到我简直不知道你到底写了几年程序.你要知道用不同的String的东西,在很大程度上,资源消耗等是不同的.
简单程序是可以这样来做的,但你想想你做这种事情的价值在哪里?复杂程序是很难完成的.举个例子,NEC委托给一家公司开发的PDA的资料我看见过,就是类似你所说的If else都有的伪代码,那个公司的专案经理,他们的开发人员我接触过,他们远远不是你所说的打字员.他们的技术-----hehe,如果我来看的话,也许比你好不少,因为至少他们不象你那么浮燥.
我承认每个人都会认为自己的工作非常有创造力,但你不能贬低别人的工作,至少我不会去贬低设计人员,需求人员,开发人员为整个项目做出的贡献.
什么工人不工人的?
我感觉老是提代码工人的都是些需要进行洗脑的家伙,他们的思维仍然停留在工业时代,尽管他们使用着或开发着信息时代的产品。
还有一种情况,资本家是最讨厌“知本家”的说法的。
软件行业这是怎么了,我感觉就是疲软了,21世纪,程序员将要被淘汰吗?我感觉脊背真的很凉。我感觉似乎末日快要到了。除了计算机,我还会什么呢?我什么也不会,好惨。哦,对了,除了和MM上床!
用教科书式的伪代码来写详细设计,这样做有两个缺点:
1.增加了工作量,如此详细的设计,还不如直接编码,而且增加了以后同步文档和实现的开销。
2.如果不考虑实现,这样作出的详细设计不一定是完全可行的,在实现过程中很可能需要对其进行修改,越详细的设计,被修改的可能性就越大。
其实无论叫代码工人也好,叫程序员也好,他们不是没有脑子的工蚁,他们也是能做设计的,只不过由于经验和知识的限制,他们可能暂时只能做模块内部的比较细节的设计,因此原来的详细设计是可以由程序员来负责的(但是不一定要形成那种详细设计的文档,设计可以只保留在程序员的脑子里,后面讨论这么作的可行性)。
由程序员来做详细设计的先决条件是:设计人员要描述清楚系统如何由各个模块组成、每个模块的契约:包括模块的逻辑功能(通过文字描述)、模块的入口条件(如pop时,stack不能为空)和出口条件,程序员根据契约来进行模块的设计和编码,在这里要相信程序员的能力,他们会自己决定如何实现契约的。
由于程序员可以根据契约之间进行设计和编码,因此比契约更详细的设计文档就没有必要了。
mach的观点和我不谋而合呀。你的思想是从哪里来的?是Eiffel吗?
我现在的开发方式是这样的:
先给出数据模型(主要的表都有,但可以进一步补充)和系统框架(包括公用函数、公用类等)
然后划分模块,把模块分到人,指出哪几个模块之间应该有接口(但不规定详细的实现方式)。
然后要求每个人都根据自己的模块写设计文档,必须包括设计思路,详细界面,对别人的接口要求,别人对自己的接口要求,公用类调用要求等等
然后召集相关人员讨论一份份设计文档,逐步定稿,一般大概讨论2-3次。
最后出来的文档,凡是涉及到接口部分的都是很详细的,但是内部的基本就只有思路。
详细设计的不足用详尽的单元测试用例和代码注释来补充。
请各位指点。
我一般都这样设计:
首先要细分各个功能模块结构,设计用例,分析事件流、异常事件流等,画出简单的流程图,用语言将其描述出来,中间要经过论证和测试,防止理解错误。
根据操作、用户接口、实体存储三个方面来设计具体内容。
根据实体类设计数据库,然后仔细分析数据库的优化等。实体类就是需要永久存储的内容,比如前面的客户信息类,这个需要长期存储的,就要设计成数据库。另外,要分析数据库之间的关系等。实体类从哪来,从用例来,从事件流来,从数据流程图来
根据用户接口类来确定用户界面的设计,对于具体的界面设计要根据具体数据库的内容,然后描述清楚界面的设计原理和理由,与界面的描述。然后要说明,相应的功能模块所涉及的所有主要界面和该功能模块所涉及的数据表结构。
根据操作,我们可以设计一些常用的处理过程或者通用接口。比如:数据库接口、触发器、存储过程等等。
对于程序员来说,编码阶段最容易接受的是要有详细的数据库结构,还有具体的界面设计图。由于功能模块划分很细,理解起来,就不在是复杂的业务问题了,直接告诉程序员如何操作数据库,要实现什么功能,并提供专业相关的计算方法等,是直接的编码问题了。只有这样,程序员才能不过多的考虑业务问题和数据库设计问题。
对于合作分工的时候,我们可以根据功能模块的优先级别来划分。给程序员提供一定的功能模块(包括数据流程、详细描述等)、相应的界面设计,涉及到的数据库结构,公用接口,其他应注意事项等。
非常赞成mach(照虎画猫) 的观点,在我们软件行业所有参与软件
开发的每一个成员都应该是设计者(设计工人),只不过因经验,
知识,分工的需要每个人参与不同的设计而已。我们应该学会尊重
每一个人的智慧和劳动,也只有这样才会产生出结合集体智慧的
优秀的软件产品。
To zhf_karen(zhf):
我觉得你误解了mis98ZB(Effective Typer)的意思了。他的本意
应该是能直进行编码的详细设计必需是非常详细的,如鬼子写的那样。
但是他对这样的详细设计的必要性提出了质疑。(我知道你还对这样
的做法在类似MIS系统以外的系统中的可行性也提出了质疑)
To SHIZUMARU(绯雨闲丸):
你讲的面向契约的编程方法和mach(照虎画猫)讲得确实是一样的,
但是从你的“既然要分工协作,就必定有些人专攻编码,有些人
专攻设计。既然如此,难道叫不叫“代码工人”,事实就有所不同
了吗?”讲述中,可以看出你对做详细设计的程序员的理解却和
mach(照虎画猫)讲的是完全不一样的啊!面向契约的编程方法(在80年代,
搞程序证明的人那里很流行,其实质是一种设计规范和设计方法是正交的)
当然没有错,错的是认为有了面向契约的编程方法就可以产生不懂设计,
可以专攻编码的“代码工人”的想法!
To SHIZUMARU(绯雨闲丸):
你讲的面向契约的编程方法和mach(照虎画猫)讲得确实是一样的,
但是从你的“既然要分工协作,就必定有些人专攻编码,有些人
专攻设计。既然如此,难道叫不叫“代码工人”,事实就有所不同
了吗?”讲述中,可以看出你对做详细设计的程序员的理解却和
mach(照虎画猫)讲的是完全不一样的啊!面向契约的编程方法(在80年代,
搞程序证明的人那里很流行,其实质是一种设计规范和设计方法是正交的)
当然没有错,错的是认为有了面向契约的编程方法就可以产生不懂设计,
可以专攻编码的“代码工人”的想法!
re:xtrrsg(算了)
你做的是设计而不是分析啊,我看你的流程还是比较正规的,那么就是如何操作的问题了。关键是你的设计是否合理,是否考虑的周到,这个也要看具体编码的人员的水准了。
就象前面绯雨和敏捷两位所举的例子一样,如果你要编程人员完全照着你的设计思路开发,那么你就必须设计到非常细的地步。如果你漏了一个异常判断,那么编码人员自己也不会知道应该加一个异常判断地。
如果你要求编程人员自己考虑相关细节,那么对于编程人员就高的多了(甚至比你这个设计人员还高,因为他要发现你遗漏的地方)
是阿,这样要求,设计人员的设计工作一定要细致,不过这个工作可以和程序员大家来一起做,作完了,一起编码,哈哈
(2002-09-11 14:46:20) bird
这里面你不用程序员参与业务流程是不行的,
规范完善,文档齐备,人走了也没有关系
分析设计人员要的是知识面广,而程序员要求的是深,不同,但相通。
一般的分析设计人员,必须有深厚的编程背景,呵呵
因为我们做分析就是要程序员能够顺利的用代码实现出来。而不要程序员花过多的时间浪费在熟悉业务上。所以,我们的所有的设计都要围绕“向程序员清晰的表达”这个思路来作文章。否则,程序员看不懂的文档或者看着特别费尽的文档都是失败的文档,对于系统的开发实现都有着致命的危险。所以,分析设计特别的重要,分析设计好至关重要。
要想让程序员清晰的了解你的思路,并顺利实现你的方案,那么,你的分析设计一定要浅显易懂。对于分析的方法思路,目前确实出现了不少,象uml等。它们都有自己的一套思路和独特的表达方法。我们不能全部照搬,因为不可能要求程序员都能看的懂这新型的分析表达工具,因为程序员的水平本来就参差不齐。鉴于这种情况,我们应该如何来作系统分析设计呢?每一种分析方法和思路都有其优越和方便的地方,当然也都有其局限的地方。
我认为,所做的分析设计,应该浅显易懂,要让任何一个程序员都能顺利的看懂并实现。什么样的分析设计才能让程序员轻松的直接进行编码呢?这要从程序员的认知角度着手,根据我们自己做程序的经验,要把握如何才能将一个新的程序设计轻松接手开发。对于任何一个新的事务,我们都会有一个认知的方法,方法的不同,可以使人熟悉的时间和深浅层次都不一样。这就明显出现了一个问题,什么样的认知思路才能真正符合程序员的认知思路呢?
zhf_karen(zhf):
呜呜呜呜呜呜……
我想你是被我的另一个帖子误导了(那帖子我结了,分数请笑纳),我在的项目不是mis,它是一个纯C写的结构化的程序,系统平台是在rs6000上跑的AIX,数据库服务器是oracle 7。完全没有跨平台、跨语言的顾虑,所以我觉得没有必要写那么细(真要跨语言,就更不能写那么细了……)。
我并没有瞧不起coder,因为我是个Typer,Effective Typer∶)。
其实coder,programmer,designer,architecturer不过是工作在软件开发的不同分工中罢了,一个coder写几行汇编代码,能难死一堆architecturer……
我不赞同程序员不需要了解业务的做法,至少从我目前的经验来看,
程序员了解业务是很有好处的。
当然他不需要了解所有的业务,但是应该了解和他自己所做的那部分有关的业务。
我现在的观点是项目人员配置应该尽量扁平化,尽量让编程人员直接和用户代表进行讨论(当然这样的讨论是要目的非常明确的,在架构完全确定之下进行的)
我们现在地程序员从素质上来说不比一般的分析员、设计员差,为什么要压制他们的能力呢?
To mis98ZB(Effective Typer):
惭愧,惭愧,我只是反感贬低别人工作的事情出现,所以可能看问题有一点偏激,对不起,费话不多说了,多了就是灌水了.
:)
to :clamp_chen(燕归来)
如果您的程序员要是回家开路了呢?您的项目以后怎么维护升级呢?没有细致的文档,后续问题太多了,
mach(照虎画猫)“2.如果不考虑实现,这样作出的详细设计不一定是完全可行的,在实现过程中很可能需要对其进行修改,越详细的设计,被修改的可能性就越大。”
切肤之痛!!泪满面,鬓如霜……
re:xtrrsg
该有的东西都有,只不过以不同的形式表现出来。
你提到没有细致的文档,后续问题太多,却忽视了另一点,再细致的文档如果没有维护,那也一点用都没有。
另外,我并不赞成一开始就从程序员会离开的角度来考虑问题。
小组中任何一个人的离开对项目都会产生影响,但是我只会考虑有限的影响,如果把太多的精力放在预防小概率事件上,那么项目就会变得过于沉重,很难推进。
风险成本是有限的,要用在刀口上,客户改变一次需求、数据模型的改变、系统架构的改变比跑掉三个一般的程序员都严重。
而如果在项目进行中,核心人物跑掉,总是会产生极大的影响,控制的再好、文档再齐全都没有用。
"而如果在项目进行中,核心人物跑掉,总是会产生极大的影响,控制的再好、文档再齐全都没有用。"
是阿,这种问题就是相当严重,我刚来一个公司做分析,呵呵,他们的产品核心开发人员都走了,一帮新手围着这些代码乱转,唉,失败。毕竟已经有大量的客户在用,程序本身就有不少问题,售后人员特别累。重新开发也没有那么多时间,,,,,,,,,
上个星期跟朋友聊天,说起这个文档的问题。我觉得文档根本就是给领导和用户看的。如果你叫程序员一边看程序一边看文档,他一定叫你去死。如果你叫程序员一边写程序一边写文档,他一定把文档扔在旁边不管了。程序员的语言就是代码。程序员之间有什么话,都应该通过代码说。如果用代码都说不清楚,难道你还希望文档能说清楚?
在self-document的方向上,很多人都做过尝试,例如javadoc。但是javadoc还是需要写注释,还不够好。Refactoring指出了一个不错的方向,基本上能编写self-document的代码。但是程序单元只有好的名字肯定还不够。程序单元应该能够self-specify,这样程序员之间的交流才能通畅。这个时候,Design by Contract的价值就很大了。
最近研究Eiffel。Eiffel Studio可以把方法的前条件后条件、类的不变式……都提取出来变成文档。程序员写好一个单元之后,规范是清楚的,责任是明晰的,文档是及时更新的,这样的生活比较美好。
TO:SHIZUMARU(绯雨闲丸):
我觉得文档是有管理方面的作用,比如给领导,给用户(当然给领导看,只需要结论性的东西就够了,给用户看只需要功能性的就可以了).但也是为将来的维护做准备.不然光有源代码,即使 有一些工具从源代码中提取出来的东西,也为将来的维护带来很大的问题.就举一个例子,设想一下VC但没有MSDN,我该如何办?去慢慢看代码?去试?那估计就完了.我对Java很厌恶的一点,就是他的Help实在是简略,简略到我看了和没有看一样.那么我们自己的类的说明,我们模块的划分,难道没有写出来的理由吗?
我感觉文档还有一个作用是清理思路,我想设计工作如果一切都在脑子里规划,那不如留下一些思考的思路,整体成为文档,因为系统的东西往往会让我们发现我们设计中的一些问题.
文档即使对项目本身的作用也是巨大的,不光给领导,用户看.关键只是在于文档写到什么地步,适用就可以了.没有必要写太过了,象给用户看的方案建议书一样每个字每个字推敲.但即使是简单的文档还是必须的,无论是概要设计,详细设计的文档.
程序员之间可以用代码作为交流手段(但我想不应该是唯一的交流手段),这有一点象我们买房子,我们第一步看什么?看房子的模型图,然后看房子的布局图,然后在去看房子.我觉得如果文档上的思路都不清楚,如何能指望你代码思路是清晰的呢?这象我们不能指望房子出来以后,再用房子的测量图出设计方案吧.我们需要用设计去指导编写程序,不是用程序去指导设计.
这是我的一点看法,希望指正
我是个低手,在公司里设计和核心代码我也碰了一点,也负责给别人凑合做点简单的设计。就我感觉而言,(不说OOD,这玩意,我刚学不懂。)撇开感情上的争论,代码工人是完全可以存在的。但上面的诸位老兄争论那么多,其实我感觉都是一个设计能做什么地步才能让“代码工人”接手的问题。这个问题和代码工人的水平无关,而只和设计到了什么地步,设计就可以从理论上翻译成代码有关。如果机器能将设计翻译成代码,人完全可以做到,而这其中,人做了机器做的事情,这就是“代码工人”的本意。
所以我感觉提问题的这位仁兄的本意大概也就是想问:设计做到什么地步,以什么样的方式表达出来就足以让“代码工人”来继续之后的工作。
To Gadfly(海阔天空)
你没有接触过OOD,所以还有很多事情你没能领会,理解,
这情有可原。但是如果你是真正理解计算机软件的人的话,
有一点我想你应该是明白的,软件的一个根本目的是将一些机械
的工作交给机器做,而不是反过来。如果计算机会做的工作,都要
我们人来做的话,我们就不需要软件了,因为到现在为止计算机能
做的工作我们人都能做(只是效率和精度不一样)。
至于你问的设计做到什么地步足以让“代码工人”来继续之后的工作。
看来我们这里讨论了半天,你还是没有看明白,我们的结论是无论采用
什么方法做设计要能让不懂设计的“代码工人”来直接编码的话,设计
就必须详细到形式语言级。而设计能做到这一级的话,本质上已经是在
编码了。后续的工作都可以让软件来完成。我想我们总不至于为了某些
人虚幻的“代码工人”概念而制造“代码工人”吧,声称需要大量
“代码工人”的人,我看他更本就不懂软件,至少可以说更本就不懂
诞生了OO思想以后的软件。
Gadfly(海阔天空)同志说错咧。程序设计是从最初的规范到最后的代码,逐步精化的过程。机器只能理解最后一步精化得到的代码,前面每一步精化得到的成果,人可以理解,但机器不能理解。所以,编码的职工是一定需要地。
关于这个东西的数学证明,参见裘宗燕教授翻译的《从规范出发的程序设计》。
To SHIZUMARU(绯雨闲丸):
完全同意你上面的意见。而我只是认为这时与其称为编码,还不如
称为详细设计或者叫具体实现。确实有一点抠概念了 :)
软件工程的作用根本上讲就是如何用最短的时间、最低的成本完成最高质量的代码,我相信详细设计人员不懂或者不精于所使用平台的代码编写是很恐怖的,(当然位于设计最顶层的系统分析员看不懂汇编代码也没有什么不可以)。代码工人概念的提出其实也是基于软件工程的根本目的而进行的社会化生产分工,分工明确化的最高要求就是接口。
当我把我的设计交给小组中的coder伙伴的时候,原来是使用严格的协议开发的,但是后来这种情况反而成了影响开发进度和质量的绊脚石,我的感觉是,不管是什么模式概念,一味的教条是非常有害的,也就是说这个接口要有弹性,只要是详细设计之后的工作完成者是coder man,而非coder computer,
根据rup的要求,光分析员就有那么多的分工:业务流程分析员、业务设计员、业务模型复审员、需求复审员、系统分析员、用例阐述者、用户界面设计员。
看来,我们基本没有哪个工程按照这种方式分工,即使生搬硬套,那也不会见的能够成功,软件工程的思想本身就是多人的智慧的总结和结晶,并且见仁见智。本来的目的就是增大工程的成功的可能性,减小开支、增加软件的质量等等。无论如何利用软件工程,只要达到目的,那么就成功了。也就是说‘不管黑猫白猫,逮住老鼠都是好猫’,哈哈。
看来参与此讨论的大都或多或少作过分析,谢谢各位捧场。
to bydpdwz(蚊子)
“当我把我的设计交给小组中的coder伙伴的时候,原来是使用严格的协议开发的,但是后来这种情况反而成了影响开发进度和质量的绊脚石,我的感觉是,不管是什么模式概念,一味的教条是非常有害的”
其实这里不是教条不教条的问题。
软件项目的开发是成本、质量和进度之间的一个权衡,对于time to market的项目,必然是以牺牲质量为代价的,这里的质量是广义的,除了产品质量还包括过程的质量、可复用性、扩展性等方面,但如果是进度相对宽松或者有产品化的打算,那么就应当采用更严格的过程管理。所谓的弹性和灵活是根据项目的性质不同而做的取舍,而不是说采用严格的协议就是教条。
各位,大家先休息一下,看看俺写的小说,嘿嘿,提提建议。
http://www.Codefund.cn/expert/topic/1020/1020415.xml?temp=.4313166