VC/MFC
VB
Delphi
C++ Builder
C/C++
Java
.NET技术
MS-SQL Server
PowerBuilder
DB2
Oracle
Web 开发
Linux/Unix社区
硬件/嵌入开发
移动平台
您的位置:
程序门
->
软件工程/管理
-> 休闲广场
揭密软件工程实践者的思想
[
收藏此页
] [
打印本页
]选择字色:
默认
灰色
红色
黄色
绿色
橙色
紫色
蓝色
褐色
墨绿
深蓝
赭石
粉绿
淡绿
黄灰
翠绿
综红
砖红
淡蓝
暗红
玫瑰红
紫红
桔黄
军黄
烟灰
深灰
灰蓝
背景色:
默认
黑色
红色
黄色
绿色
橙色
紫色
蓝色
褐色
墨绿
深蓝
赭石
粉绿
淡绿
黄灰
翠绿
综红
砖红
淡蓝
暗红
玫瑰红
紫红
桔黄
军黄
烟灰
深灰
灰蓝
字体:[
大
][
中
][
小
]
揭密软件工程实践者的思想
[已结贴,结贴人:yanglilibaobao]
发表于:
2007-01-18 21:17:05
楼主
“得其精而忘其粗,在其内而忘其外;见其所见,不见其所不见,视其所视,而遗其所不视”——《列子 说符》
1. 语言只是工具
我曾经是非常执着的开发人员。我有连续几天几夜做coding的经历,也曾经为了一个技术问题耗上三、四个星期而导致项目一再延迟,还曾经为了一个实现细节与项目相关的人员逐一争论。
我也曾经像大多数开发人员一样热衷于争论语言之间孰优孰劣。我在“delphi大富翁论坛”上写过一个简介,其中个人特长是“擅长tpascal、delphi、tasm系列语言,痛恨c/c++”。我至今保留这段文字,因为那的确是真实的经历。
如今我已经不再专注于语言,正如我在第一章中写到的一样:成天讨论这门语言好,或者那门语言不好的人,是可悲的。
然而就在我写这段文字之前的一年,我还在写《delphi源代码分析》,我还是无止尽地深入语言细节,深入操作系统细节,以及深入……开发的细节。
就在2004年3月间,我接受一个朋友的邀请,去北京做一个名为“delphi & delphi .net源码分析”的专题培训。我用了近两周的时间,做了50页的幻灯,全面讲述delphi和delphi .net。然而在临行前的一晚,我辗转反侧,思考着一个问题:我究竟做了些什么?或者说,我究竟想告诉学员些什么?
凌晨5点,我在幻灯的末页后插入了一张幻灯,标题是“语言只是工具”,而幻灯的内容是一张图:
这是与培训完全无关的一张幻灯。然而,这是自1997年我接触到管理,以及从1998年我接触到工程以来,第一次正视“软件工程”这四个字。我第一次看清楚代码、方法、过程、工程与组织的关系!
对于一个程序员,或者以程序员自命的人来说,看清楚这一切的第一步,竟是一句“语言只是工具”!
猿之于为人,“学会制作和使用工具”是最重要的标志。因而我不知道“语言只是工具”这句话,究竟是对语言的膜拜,还是漠视。
然而从那一刻开始,我才真正地知道工程。
2. 程序
上面的这个图中,在最内层的环里,是“程序=算法+结构”。这是编程的本源定义,也是原始的状态。与代码相关的任何工作,最终仍旧会落足于这样的一条规则。
编程的精义于此。从有开发行为开始,它就存在。挖山不止的愚公在数千年前就在用类似的行为做编程实践,而几十万年前的智人,也在循环与分支所构成的逻辑中打转。
3. 方法
推动这种逻辑向前发展的是“方法”和“方法论”。长期编程实践,自然的推演与总结,必须沉淀为某种(软件开发)方法,于是“过程”出现了, “对象”出现了,相关的方法论也就出现了。
这是实践的成果。方法不是某个人或者某个组织创造的。瓜熟而蒂落,实践积累达到一定的程度,就算微软不提出某个方法,ibm也会提出这个方法。即便他们都不提出,可能你自己已经在使用这个方法了。
方法并不神秘,因为它就是你今天正在做的、从事的和实现的。正如“模式”是一种方法,而模式就是你昨天书写代码的那个行为。只不过,gof归纳、抽取、提升了这些行为的内在规律。
你看不到你做事的行为,也就不能理解“模式”作为一种方法的价值。所以大师们众口一词:模式需要一定的编程经验才能理解。
同理,理解过程也需要编程经验,理解对象也需要编程经验,理解mda与soa还是需要编程经验。
这可能就发生在你回顾上一行精彩的代码,或者上一个失败的项目的一瞬息。经验来源于回顾、理解与分析,而不是你将要写的下一行代码。
有人在寺院扫了一辈子的落叶而得道,也有人因为一句话而得道。
gof因为无数次的代码回顾而得道。
发表于:
2007-01-18 21:17:18
1
楼 得分:
0
4. 过程
过程随生工程出现。过程解决的是工程中角色间的关系问题。
过程说的是很多人(团队)如何组织在一起进行开发。它首先把工程中的各个环节分解出来。这样,有了环节,就有了角色;有了角色,就有了沟通。
因此过程中的问题,就是角色、沟通和环节的问题。
哪些环节更重要取决于具体的编程行为,也就是具体的项目。
例如产品开发的周期可以一再拖延,因为对产品来说,更重要的是其品质和技术壁垒。因此你可以看到暴雪公司的游戏总是一再跳票,而它从来都是将大量玩家测试和开发人员的个性特征放在第一位。相类同的,doom与quake系列的灵魂就是在游戏引擎的开发和设计上。
如果用这样的模式去做项目,可能软件公司没死掉,工程需求方也被拖死。试问你有看见客户因为你对技术的远景描述而憧憬吗?不,你只会看到他们因为项目的一再延迟而懊恼,而沮丧,或……暴怒。
憧憬这种事情,只会发生在那些铁杆玩家身上。
分不清玩家与客户的区别,对项目经理来说,是可怕的。这将意味着他不能清楚地知道哪个环节更加重要。
角色的确定,以及角色间的沟通问题,在项目过程中同样重要。工程组织是否合理,相互协作是否紧密,是这个项目成功的保障。
“合作无间”通常是流于书面报告中的措辞。真正的“无间”,应当是沟通的结果。然而uml,则可能是你与客户,以及项目经理与开发人员被“离间”的第一因素 。
5. 工程
最狭义的工程,是描述“做什么”和“做到什么”。
也就是说,是对目标的描述和成果的检测。至于这个工程目标的实现,是“过程”和“方法”的事;而有效、快速地实现“过程”和“方法”所需的,就是“工具”。
这种软件工程体系层次(software engineering architectural layers)被描述成一张图(见下图):
过程伴随工程而出现,解决的是工程中“步调一致”的协作问题。那么工程是因为什么而出现的?
很显然,软件规模的不断增大是导致软件工程出现的根本原因。所以你会看到在几年前,开发一个小工具可以不讲工程;或者现在在你的word中,为了将半角替换成全角字符而写的那个宏,也不需要工程。
接下来,即使软件规模增大,如果有一个牛人中的超牛人,愿意用20年来写一个任意庞大和复杂的操作系统,他也是能做到的。然而现实中不会有软件公司给他这样的机会。
项目的“复杂”可能要求不同知识领域的角色参与,而“庞大”则要求更多(人力、技术与管理)资源。“团队”作为开发行为的模式,是软件规模和复杂度渐次累积的结果。
团队必将越来越庞大,因为(与工程对应的)软件规模必将越来越复杂。没有团队意识的软件公司将在高度过程化、通晓方法理论 、拥有大量工具的集团军面前一触即溃 。
6. 组织
工程理论其实是包含组织学的。然而我在上面的那张图中,将组织与工程分离开来,并在二者之间画下了一道纵向的线。
如果说工程关心的是“需求”、“配置”和“文档”等等这些要素,那么这样的工程还是停留在技术层面:关注的仍是工程实现细节,而非目标。从角色角度来看,这是项目经理和技术经理共同关注的那一部分。
然而项目经理还必须关注于人力资源、项目资金以及多个项目之间的协调等问题。这些问题与工程本身并没有直接关系,而是“组织”方面的内容。
所以在工程环节里,“文档管理”和“配置管理”等词汇中的那个“管理”,是管理的具体技术和方法;而在“组织”这个环节中的 “管理”,才是真正的管理学上的用词。
在这张图上,我试图从这个角度上来说明:作为项目经理,你必须有一部分的工作是非技术性的。甚至,你可能绝大部分的工作是非技术性的。因为与技术相关的管理技能(需求、配置、过程管理等)可以由开发经理来做,或者公司对于这一方面有较统一且成熟的规范,因而无需投入过多的精力。
你必须更关注于对这个(或这些)工程的组织与计划。站在“组织者”这个角色上,你现在要考虑的内容可能会是:
为项目的各个阶段建立计划,并逐渐地细化计划内容,以及确立项目过程中每一个环节、每一个计划阶段的优先级和复杂度;
确立项目或者产品阶段目标,成果的准确描述、定位,以及整个项目的质量目标及其考核办法;
对团队中的不同角色展开培训,以指导并协调角色间的工作,从而消除因为工作习惯的差异带来的影响;
为每一个人准备他所需要的资源,这不单单是把一套shareware变成正式版或者把512m内存变成2g,还包括准确地评估他的工作量,以及决定是否为他增加一个(能协同工作的)副手;
决定在哪些环节上反复审核和回顾,而在哪些环节上采用较为宽松的方式以加快进度;
习惯于开会、组织更短而有效的会议以及建立激励机制,当然也不要忘记让每一个成员意识到这一项目的风险; 不要乐观
即使你做好这一切,可能项目的结果仍然不够理想。但是你应该知道,好的项目经理并不是不犯错误的人,而是以尽可能少的失败来获得成功的那个人。
无论是你的团队成员,还是你的老板,对重复的错误以及可预料的错误都是不会宽容的。在一个团队中,失去了组员的信任比失去老板的信任更为可怕。
所以回顾每一个项目,或者项目中的每一个阶段,以及与每一个团队成员交流的细节,是你的日常工作。
7.boss
很多人以为boss是给自己发钱的那个人,这其实是错误的。发钱的决策通常是由三个角色来做出的:
部门/团队经理。你的直接上司,他是雇佣你的人,是他用薪金的多少来衡量你的价值,或者反之。
绩效经理。如果你的公司有这个角色的话,那么他总是盯着你的错误以决定从你的薪水里的扣除比例 。
财务经理。有钱?没钱?没钱?有钱……
boss并不决定你的薪水。
boss在公司中解决的是“经营”问题。这其实是在比“组织”更靠外侧的一层。在前面的图例中并没有给出,这也意味着“经营者”与“工程”基本没有关系。
在一个更大规模的组织机构里,你可以会更直接地观察到“经营者”与“组织者”之间的差异。例如公司的大小股东是“经营者”,董事会通常是解决经营问题的地方;而总经理、执行经理以及各个部门经理则是各级的“组织者”,经理办公会则是解决组织问题的地方。
你应该清楚,真正的boss是经营者。
这有助于你明确你被雇来的原因,你的工作是面向哪个层面的,以及你或者你的上司有没有权限来决定一个项目是否应该立项或中止。
boss(经营者)决定了一个方向,组织者保证决策与这个方向是同步的,而工程是在这样的一个方向、决策的构架下的一个具体行为。
工程中没有boss。
8. 上帝之手
从最初的简单编程开始,到现在工程团队的组织开发,实现(一个软件)都是最终的目的。所以可以这样说:实现,是软件开发的本质需求。
我们看到,正是出于实现需要,我们才设计了一些数据结构或逻辑结构来映射物理模型。因此类似于过程、单元、记录(结构)、对象等的出现,其实都是源于编程实现的需要。
而后,基于某种数据结构的编程实践(的不断积累),决定了软件开发方法理论的产生。
从这一点可以看出:方法,是对既有行为的归纳总结。因而实现方法总是最先出现的,而后才有分析和设计方法。例如面向对象分析(ooa)、设计(ood)与编程(oop)的出现顺序,与它们在工程过程中的实作顺序正好相反,而与编程实践行为的顺序则正好相同。
为了实现更大规模的软件系统,逐渐产生了团队组织模式,而团队的协作决定了过程模型的产生,在过程环节中的沟通问题导致了(模型化)语言的出现。
如同编程工具中的编译器和集成开发环境(ide)一样,开发中的编程语言、过程中的模型语言都只是一种工具。
工具的产生仍旧是出于“(软件)实现”的需要。不可能从软件开发实践中产生出轮子和指南针,因为那不是“软件开发的本质需求”可以推动的。
软件工程体系中,“实现”作为软件开发的本质需求和基本动因,如同上帝之手在推动这几十年来的软件工程理论体系的形成。
http://www.uml.org.cn/umlforum/200610135.htm
发表于:
2007-01-19 08:40:53
2
楼 得分:
20
好东西
我喜欢
发表于:
2007-01-19 09:42:40
3
楼 得分:
20
鄙人一直这么认为,技术是次要的,语言只是跟计算机交流的工具而已,就跟汉语和英语一样,孰优孰劣看具体情况,不过你汉语精通就可以还是英语精通就可以了,显然都不是,语言的本意在交流,所以交流是主要的,知道你要说什么,理解对方的意思是主要的,程序也一样,你首先要知道要做什么,然后才是怎么做
发表于:
2007-01-19 11:28:01
4
楼 得分:
20
好
发表于:
2007-01-19 12:58:13
5
楼 得分:
20
good
发表于:
2007-01-19 15:09:49
6
楼 得分:
20
学习...
读完之后颇有感触!
谢谢分享!
发表于:
2007-01-19 15:38:13
7
楼 得分:
0
受不了,我要顶顶
发表于:
2007-01-19 21:03:46
8
楼 得分:
0
太长了,顶过之后先mark,mark之后有空再看
发表于:
2007-01-19 23:05:54
9
楼 得分:
0
學習,這中方法在非軟件公司的技術部,自己開發軟件自己使用,更能明顯的體現,語言只是一中工具。
发表于:
2007-01-19 23:23:33
10
楼 得分:
0
有人因为一句话而得道..
发表于:
2007-01-20 08:51:53
11
楼 得分:
0
up
发表于:
2007-01-20 12:00:13
12
楼 得分:
0
路过学习
发表于:
2007-01-20 20:45:11
13
楼 得分:
0
似乎现在每个人都在说:“其实语言只是一个工具而已”,大家都争着去学习工程,学习架构,其实不同的角色有不同的分工而已,我们同样需要出色的coder,他们和出色的软件架构师一样有自己存在的意义!
发表于:
2007-01-21 15:57:38
14
楼 得分:
0
语言只是工具,那么,工具重要吗?
当然,太重要了。
假设我们需要做一件事情,首先要明确要做什么,然后计划一下,用多长时间,多少人力财力。
如何计划呢,必须将这个事情细分,从时间上,从种类上划分,以及划分后的依赖关系,还有这些事情如何表达最终的目标。
然后,每个阶段做每个阶段的事情,做事情的时候,需要正确的方法,正确的方法能事半功倍,方法当然也包括了要使用什么样的工具,工具本身对做事情的效率和质量也有很大的影响,而如何做这些分解后的事情决定了整个事情的最终质量,也决定了是否能达到目标。
因为,很简单嘛,大事情是由小事情组成的,小事情做不好,大事情当然不可能好啦。
而这些小事情的质量,一来取决于设计者的决策,而来取决于使用的方法和工具,最后,还取决于做这些事情的人的能力。
这些道理都是很浅显的,可是很多自以为很牛的人却不懂。
发表于:
2007-01-22 11:27:39
15
楼 得分:
0
优秀的团队,必须要个个精英,方方面面都要有能独当一面甚至多面的高手..
个人觉得,凡是牵涉到语言讨论的..都没意义..因为在你的心中,语言还是存在的.说的再富丽堂皇...也只是说说而已..并非真正说到做到...
用巩俐的一句话:孔雀始终是凡鸟,凡鸟始终是凡鸟,它又怎么可能飞上枝头做凤凰呢??
发表于:
2007-01-29 15:59:37
16
楼 得分:
0
记号
发表于:
2007-01-30 00:20:08
17
楼 得分:
0
mark
发表于:
2007-02-05 15:00:55
18
楼 得分:
0
这篇 基本上是 垃圾文章 。
首先声明 ,上边说说的 大部分是对了,就是可叹作者智商低 ,用了那么多时间在 语言上。
上边的文章的确是垃圾文章。 不是所有对的论点 都有价值 比如 ,人需要睡觉 。白天过去是黑天 。 上边文章就是这样的 垃圾 。
发表于:
2007-02-26 16:47:11
19
楼 得分:
0
很喜欢。甚至有买书的想法。
发表于:
2007-03-01 16:31:43
20
楼 得分:
0
mark
发表于:
2007-03-02 22:50:22
21
楼 得分:
0
顶
发表于:
2007-03-05 14:46:07
22
楼 得分:
0
大多说语言只是工具,轻视语言选择的人,根本不会写软件。
语言是工具,但不只是工具,它决定很多东西的。
下一篇:
软件企业实施cmm/cmmi面临的五个关键问题
上一篇:
软件开发公司技术管理办法的一个设想
相关文章
关于潜入式协议转换器的测试
请问前辈软件硕士 那家比较好?
vss 版本管理问题 , 急
loadrunner的running user最多只能1000吗?...
用treeview 或listview仿ie收藏夹
如何 管理员工上网 比较合适?
请教关于软件建模方面的问题,希望大家给我指引
急求解答: wincvs用户配置问题cvs [a...
急求crystal report 8.5或8.0
软件的向下兼容、向上兼容、向前兼容、向后兼容都...
[求助]请问如何写“总体系统设计方案”之类的文档...
请教关于软件建模方面的问题,希望大家给我指引
rft(rational functional test...
审核内部管理流程是遇到问题,请大家帮我出出主意...
菜鸟问题: cdm中一个表要用另外一个表...
ibm rational rose xde dev...
domain、column name等几个问题
测试工具
请问,如何用java读取xmi? (得到答案马上给...
跪求软件项目开发计划书
其他资讯
01高地盛大启动卫星免费同播:vick choy&nb...
招聘软件工程师
clearcase lt server一定要装在域服务...
来灌灌水,大家等英文怎么样 ?
有人现在在用ibm rational performanc...
求教:实体类的设计(xde for .net)
power designer 中物理视图中的serial...
cmmi中对ver和val的一些理解
rsa7试用版 使用问题
delphi7.0
终于实践了xp编程,爽,散分
求流程解决方案!
如何做一个故障模拟系统
一个大学生的迷茫
pd12 为什么做完的图,图形突然不能选中了?...
非软件公司信息技术主管的烦恼
深圳科技园高薪诚聘java开发工程师
有个问题想问下
刚刚下载了ibm rational 7.0 系列...
请问编写软件文档用什么工具较好,谢谢。
快速检索
分类导航标签a
Delphi网络通信/分布式开发
.NET技术组件/控件开发
Linux/Unix社区系统维护与使用区
扩充话题共享软件(走向海外)
专题开发/技术/项目英特尔多核计算技术
JavaWeb Services
硬件/嵌入开发VxWorks开发
JavaJBuilder
WPS Office产品家族WPS二次开发及使用
Web 开发非技术区
软件培训/认证/考试IBM
MS-SQL Server疑难问题
C++ BuilderVCL组件使用和开发
Web 开发CGI
其他数据库开发其他
最新资讯
weblogic和tomcat的路径问题
安装pb5时,提示size not available
新手准备学网站制作了,有入门问题求教
不同分辨率出现的问题.怎么解决
求教 从sql快速导出到excel的方法
请问怎么用jsp下载图片
在自己定义的类中怎样获得dc画出象素点呢
关于在winform里面登录web的若干问题
关于父子进程和信号的pv操作
比较两个java.util.date类型日期,返回其中的最小...
如何取得局域网中某一机器的时间?
跪求!!搞过qq电话或高手的进来下
请求大家帮我解决一个动态级联菜单的问题吧,小弟...
求助:请大家帮忙解决.net2003在xp系统的问题,谢...
为什么装了vs.net2005,即没有新建web应用程序项...
这段代码怎么没有输出啊?
我来了!一次提交多条记录到access数据库 怎...
在winform中如何才能把一个生成好的xml文件传给w...
masterpage子页中如何使用frame?(望高手进来看看...
struts 分层嵌套显示问题
phper新手问题
com+提交数据时都报了这么个错误“[comexception...
如何让1台dns服务器解析两个不同网段的地址?
各位能给linux的初学者推荐一本好书吗?
满分求突然想到的datagrid的一个问题,如何在不改...
关于视频文件格式的问题
一个很简单的问题,但是我不会,嘿嘿。关于路径的...
弱问题之四!
sql数据库太大怎么办
这段要怎么写
filter简单问题,应该是比较简单的吧
delphi中使用ole如何判断excel的行或行中的单元格...
message.msg不可访问吗?
redhat linux as4 导航栏不见了
使用windows mobile smart phone...
如何用visual c++ toolkit 2003(...
eps文件的解析
如何定义一个可以无初始长度的array,不用arrayli...
到哪能找到oracle-timesten的帮助文档?
正则,防止用户恶意输入大量回车
热门点击
北大1159题,好心人帮我看看到底错在哪里我找了好...
关于vs2005的msdn中的文件_17137_rtl_x86_chs_vs...
求教:如何时间pc与单片机之间的文件发送与接受
父页面动态的向iframe中加入节点,如何做?
对文件按照时间列表进行复制的程序,在windows和...
pb登陆窗口问题! 请教高手 急急!!!...
这论坛内容怎么跟csdn的一样?属于盗版不?
数据库连接异常,怎么看sql2000端口号
数值相加问题!!
installshield之ocx注册问题
请教个小问题
(菜鸟上路)帮我改下错,最好能帮我说明下原因
servlet的一个小问题,急!
asp提交一空字段,单元格不显示
asp.net程序安装与设置的问题,急!100分求解
一个关于共享目录同步的问题
sql anywhere 在子查询中不能使用orde...
[求助]ew8051编译时的警告问题
delphi中球体绘制问题
在java中怎么通过按钮实现一个计时器功能!
请热心朋友救命啊。我是新手!拜托了。。
数值型后面家0的问题
ajax返回一个jsp页面,但是其中的javascript代码...
treeview太慢了,有没有功能更强大,速度更快的控...
请问有谁参加过深圳的高级软件工考试?
聊聊今年的春节联欢晚会
websphere5.0中动态sql的问题
vb6.0 能否访问带密码的网上邻居资源?
连接数据库时提示mark无效
请教一个template模式中出现的继承问题
屏蔽标题栏双击事件
英语日期的疑问
66h 指令前缀的问题.
性能问题:oracle 9i2,我们的数据库数据和客...
tomcat运行一段时间后,页面打开变得很慢或空白,...
jsp 页面抖动是怎么回事 谁知道...
未能加载文件或程序集 磁盘空间不足 是...
ios类输入输出格式控制函数setf的含义
php支持mysql的问题
怎么给视频文件播放地址赋值啊