- 浏览: 487386 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
gapper:
多谢!!!
软件项目解决方案模板 -
lxyizy521:
感谢你无私的分享,正头疼文档的事情呢。
软件项目解决方案模板 -
flyisland:
不错的资料收集的心得,多谢分享!
如何从小工到专家——Dreyfus模型应用 -
a254124185:
Java编码规范及实践 -
clj2008tom:
LZ好久没更新了,呵呵
graphviz 在redhat as4 下的安装
我这里说的流程是传统的串行软件开发流程。
做任何事情,我们最终想获得是一个结果。追女朋友,目标是追到手,成为情人,或老婆。做汽车,最终希望能够出来一辆能开的汽车。做软件,希望最后产出一个大家都能用软件的产品。
也就是说,我们想要一个好的结果。
那如何获得好的结果?
答案是要依赖于人。
为什么依赖于人?
因为这世界上的一切都是人创造的,人来获取信息,人用自己的头脑对信息进行加工,即思考,然后产生决策,最后,大脑驱动人的行为,创造价值,并对别的人产生影响。
一个人能搞定吗?
存在这种可能,但当今的社会对软件的需求,已经远非个人英雄主义时代。
这样,那就要分给多个人,也就是一个团队去做。
团队如何做一件事儿呢?
因为事情是一件事儿,但多个人做,他们之间的工作是关联的。这就需要确定先做什么,后做什么,具体谁做什么,每件事儿怎么来做。一开始,张三,李四,王五什么都做,效率很高。但:
事情越来越多,怎么办呢?
张三就专门负责A吧,李四就一直负责做B,王五就做C吧。
事情还是越来越多,越复杂,咋办呢?
发现张三的工作A可以分成A1,A2,张三1可以专门做A1,张三2专门做A2。同理李四做的工作也分了。
这时候,大家发现,由于分工比较细,做一件事情,需要好几个人,有点乱,咋办?
人类是最聪明的,大家发现做事的时候都是,先做A1再做A2,然后B1,B2,B3,C1,D1 。。。,有规律呀!
于是,嘎嘣!,流程,这个人类最伟大的发明就这样诞生了,
A1->A2->B1->B2->B3->C1->D1
哼着小曲,“oh,process,process,process,It ‘s so great,great,great。
I love you ,yes,that’s it....” :
我们每个人就是这样,像个木桩,蹲在那里,像一个守株待兔的猎人。眼一睁,一闭,一天过去了。收工,上工。作为B2,我只关心B1,B3,其它对我来说,就是雾里那朵花,那朵看起来很美丽,很朦胧的水仙。
这种方式一开始在传统的企业运转的很好。很明显,我们能看出其中的本质。 A1和A2,A2和B1,节点和节点之间边界是明确定义的,而且是看得见,摸得着的。就像造汽车,整车组装的时候,我能看见发动机是看得见,摸得着,可以测试的。
最最关键的是:这个发动机是我将来汽车产品的一部分。
回到软件开发场景下,也这么干,需求产出的是需求文档,系分产出的是系分文档,开发产出代码,测试产出测试测试用例,
但所有这些对最终用户使用的软件产品而言是什么?
像加工过程中的边角废料,副产品,中间产品,因为它最终没有成为提供给用户的产品服务的一部分。呵呵,不过用户使用说明书似乎可以认为是其中的一部分。我认为这就是区分软件制造过程与传统汽车等产品制造过程的最大区别。
流程在传统企业成功,还有什么原因吗?
拿造汽车来说,对于流水线的每个人来说,虽然,一开始没看过整个汽车,但是整个汽车在他的脑海里,是比较清晰的。这里面清晰有两点:一个是,没吃过猪肉,还是看过猪跑的。他已经看过很多过这样类似的汽车了。另外,大家对汽车制造的整个上下文,认识是清晰的,毕竟大多数都是标准零件,有严格的定义。这些标准就是隐含的知识,别小视这种隐含的知识,因为知识的残缺,可能造就的就是你行为受到影响,可能就造出残次品。首先是可标准化的,然后是可学习的。
这种标准化的做法,放在软件行业是靠谱吗?
看看我们标准化的是什么,是做东西的过程,而不是实际做的东西 ,这两个根本不是一回事儿,差别大了。
软件产品为什么不能标准化?
因为软件是软的,无需过多解释。
关于软件的标准化,也不是没有努力,但能够标准化的东西,实际标准化的东西,在整个行业的制造过程,在软件的实际应用场景去比,这个比例微乎其微。在Java领域,jdk,开源框架,组件都可以认为是标准化组件。在具体的业务应用领域,
erp只能算个半标准化,需要二次开发,三次开发,我说的二次开发是实施,三次开发,是围绕erp开发一些周边的应用。
软件产品不能标准化,本质在于其应用场景的多样性。
继续说流程,还有什么原因呢?
A1->A2->B1->B2->B3->C1->D1
在软件领域,流程节点之间的边界是不明确的,推演一下:
A1开始工作,交付给A2,B1,B2,B3,C1,D1等待
A2开始工作,交付给B1,B2,B3,C1,D1等待。
B1发现问题,反馈给A2,A2给A1,B1,B2,B3,C1,D1等待
A1反馈给A2,B1,B2,B3,C1,D1等待
A2反馈给B1,B2,B3,C1,D1等待
简单算个数:
第n个节点发生变更,变更经过的流程次数为2(n-1),不妨成为流程损耗 。
因为软件是软的,大家一开始做的时候,两眼一抹黑,都是看不清的,变化是很正常的。
假设在每个节点只变化一次,在这种基于流程的软件开发模式下,总的流程损耗为:
n(n-1)
大家可以推算一下,这是我计算的结果.
也就是说,在流程节点为7的情况下,假设每个节点变化一次,则流程损耗为 42。
再算算浪费,就恐怖了,还是上面的假设,在加上每个人昨晚工作所花的时间是2个小时,每次变更花的时间是1个小时。
理想情况,n个步骤所需要的完成时间是2n。
理想情况,等待时间为
2(n-1), 2(n-2), 2(n-3), ....
结果也是n(n-1),前提是平均每个任务当成2个小时算。
理想情况下,按上面例子,总时间为14h, 总的理想等待时间为42h。
再包含变更的情况下,数列的通项是n(n-1), 因变更引起的等待时间,求和就是o(n^3):
因变更引起的等待时间= n(n+1)(2n+1)/6 - n(n-1)/2
如果按照这个例子,因为变更增加的等待时间是119h
也就是说,因为这个例子,引起的理想等待时间是119 + 42 = 161h
那你又说了,后面的人不是干等着,还是可以做点事情的,如果利用的好,比如流水线,等待时间是没浪费的。
实际中,这种浪费肯定还是有的,等待时间可能是做别的事,造成任务并行,任务切换需要时间,人不是机器,损耗肯定是有的。
我们就按照50%的利用率好了,损耗时间为80.5h
总结一下:
假设:7个节点,每个节点工作任务是2个小时,每个节点变更一次,每次变更时间耗费1个小时。不考虑因变更引起的每个节点任务时间变更。
理想等待浪费时间: 161h
总的任务完成时间 = 工作任务时间 + 变更损耗: 14 + 42 = 56h
结论:
在这种简单模型下,总任务完成时间与节点数量的平方成正比,等待时间和节点的立方成正比。
实际情况就更复杂,工作本身的复杂性,不确定性,变更一般都会增加本身工作任务的工作时间,因为以前做的部分工作可能浪费了。
也就是说,想提高效率,最有效的就是缩短流程节点 ,否则最好结果就是也是局部优化而已。
这种情况,沟通成本怎么样?
n个人,沟通路径为n(n-1)/2, 每个成本为1小时,上面的情况,总沟通成本为21h
这个是理想情况,为什么要沟通呢?不沟通,信息理解不一致,理解不一致,实际行为就会有偏差。一起做事的人,必须共享信息上下文。
人月神话里,说在项目紧张时,加人也不一定能提高总体完成时间,也是这个道理。
从中可以推断出敏捷开发方法学的理论基础吗?
你可以说,敏捷也是有流程的,只不过,流程比较简单,节点少而已。通过坐在一起的紧密沟通,将变更从o(n^2)降低了一个数量级,变成o(n)。 通过及时的反馈, 缩短了等待时间的浪费。同时, 因为避免了在后期发生变更的概率。按照上面的模型,第n个节点,变更损耗是2(n-1)。
姑且就是为敏捷找个牌坊吧,大家也可以自己计算一下。
大家可能有疑问,没流程,不是全乱了?
从上面的计算可以看出,按照流程做事,是可以保证稳定的产出的,但效率肯定是低的。我们再进一步,看看事情的本质。拿风险控制流程来说, 表面上是走风险控制流程这个节点。但是,实际上,你的意思是想让流程背后面的那个人,对你的方案做一个风险评估,并给出结果。你可以直接到他面前,把你的问题讲清楚,说明白,或者电话。而不用流程来驱动,复杂的文档,他看理解文档都要花很长时间。经常情况是,他已经评估完了,流程还没走完。这些都是损耗。
流程必须有,必须从简,不应该让流程指挥人,而要人成为主宰。在任一时刻,只有人才最清楚,我们将往哪里去。
写道这里,仿佛听到流程在说:“不要迷恋哥,其实,哥只是个传说”
评论
2000年的时候,ChinaUML 就明确提出:项目成功,靠的是技艺,而非过程。
给了CMM、RUP、XP等的盲目推崇者当头喝棒!
发表评论
-
Power of Thinking(1): 零基准思考
2010-04-12 02:11 2441《问题解决专家-策略性 ... -
看清与行动
2010-04-03 12:37 1206有人主张,看不清就不动,宁可呆在原地。 等待是最 ... -
蝴蝶效应与个人成长
2010-02-26 22:42 1222效应最初的解释是:“ ... -
岸•山•悟
2010-02-24 23:12 1043以前看amazon的原版书,很亲近,最近一段时间,对国学非常感 ... -
讲•道•理
2010-02-22 01:00 3435做什么事都要讲道理,今天我说说软件开发中开发人员的”讲道 ... -
四两拨千斤
2010-02-06 11:42 0关于系统思考 -
最优化
2010-02-06 11:39 0硬系统思考,坐公交车的方法。 -
技能究竟是如何提高的?
2010-01-13 01:22 1411我爸爸学车,已经 ... -
软件需求的本质
2009-11-01 01:25 1369先看看什么是需求,人要吃饭,要喝水,要娱乐。同样,软件 ... -
这是怎么算出来的呢?
2009-07-18 15:39 1143今天看新闻,四川成都暴雨,有一系列数据,这些是怎么算出来的呢, ... -
几句值得玩味的话
2009-05-12 09:19 13411)魔鬼藏于细节之中 点评:程序中的漏洞太多了,特别是 ... -
Oracle收购Sun——未来在哪里?
2009-04-21 09:01 5323关于Sun,我去年年 ... -
QCon北京归来杂记(一)
2009-04-10 16:37 12631)Know why 先于 Know how。 ... -
软件开发中的简单法则
2009-03-22 15:52 2590读了前田约翰的《 ... -
象征对于团队的意义
2009-03-09 23:38 1956不知道多少人看 ... -
连接之美
2009-02-28 10:49 0连接之美 -
现状,目标,差距和行动指南
2009-02-24 12:36 1048这是一个进行改进的方法学,可以应用于任何改进。 ... -
程序员如何提高抽象能力
2009-02-18 13:40 5922之前写过一篇文章,讲合格程序员应该具备的能力,你 ... -
What about software design?
2009-02-16 01:10 1189What about software design? ... -
简单与复杂
2009-02-15 15:10 9821)简单的问题,简单的解决办法。 不 ...
相关推荐
- **第25章:净室软件工程** —— 净室软件工程的理论基础和实践。 - **第26章:软件复用** —— 软件复用的原理和技术。 - **第27章:再工程** —— 再工程在软件维护中的作用。 - **第28章:客户/服务器软件...
《Visual Studio Team System面面观系列课程》是一个深入探讨微软开发工具Visual Studio Team System(VSTS)的全面性教程,本部分重点聚焦于VSTS在项目管理中的理论基础——Microsoft Solutions Framework (MSF)的...
“方法”部分则可能涵盖了多种软件开发方法论,如瀑布模型、增量模型、螺旋模型、敏捷开发(Scrum、Kanban)等。每种方法都有其适用场景和优缺点。例如,瀑布模型适合需求明确、变化不大的项目,而敏捷方法则适用于...
综上所述,敏捷不仅是一种软件开发的方法论,更是一种贯穿于整个组织的文化和思维方式。通过将敏捷原则应用到个人、团队和组织的各个层面,可以显著提升软件开发的效率和质量,同时也能增强团队成员之间的协作和沟通...
这些概念构成了软件工程的理论基础,帮助读者理解软件工程的目标和原则。 ### 基本模型 随后,书本详细探讨了各种软件开发模型,如瀑布模型、增量模型、螺旋模型、敏捷模型等。每种模型都有其适用场景和特点,了解...
该书并没有专注于某一种特定的敏捷方法论,而是综合了各种敏捷实践,将其整合为一个连贯的整体。这种方式有助于读者从更广阔的视角理解敏捷,并根据自己的具体情况进行选择和调整。 ##### 5. **实用性与深度兼备** ...
**自身发展的需要**:为了实现一站式在线生活的愿景,腾讯需要推出大量的新产品和服务,并不断优化其功能,这就需要一个高效的产品开发流程。 在早期阶段,腾讯虽未明确定义敏捷开发的概念,但已通过以下几个方面的...
三、敏捷方法论 1. Scrum:一种框架,强调通过迭代的sprint周期来管理项目,包括每日站会、冲刺计划会议、回顾会议和产品待办事项列表。 2. XP(极限编程):强调快速反馈、代码质量、测试驱动开发和结对编程等实践...
这个压缩包包含的“论文”部分将详细阐述设计过程和理论基础,而“源码”则提供了实际实现的代码。 1. **软件工程**:音乐播放器的开发遵循软件工程的流程,从需求分析、系统设计、编码、测试到维护。这要求开发者...
计算机科学与技术是一个涵盖广泛的领域,它涉及到计算理论、编程语言、软件工程、数据库系统、计算机网络、操作系统、人工智能、图形学以及硬件设计等多个子领域。在这个“学术论文——计算机科学与技术.zip”压缩包...
这些文件共同构成了一个全面的敏捷开发入门教程,不仅有理论基础,还有实际操作指南,对于想要学习敏捷开发的人来说是一份宝贵的资源。通过学习这些材料,你可以理解敏捷开发的核心理念,掌握Scrum框架的运作方式,...
总的来说,这篇论文详细阐述了敏捷测试的理论基础,结合实际项目展示了敏捷测试的实施,以及设计了一个自动化测试集成系统来支持敏捷开发中的测试活动。通过对系统不足的分析,提出了未来可能的优化措施,对理解敏捷...
为了应对日益增加的变化和不确定性,一种更加灵活和高效的开发模式——敏捷开发,应运而生。其中,Scrum作为敏捷开发中最流行的方法之一,其核心思想是通过迭代和增量的方式来实现快速响应变化的目标。本文将深入...
本章深入探讨了规划的基本目的,明确了什么构成一个好的计划,并解释了如何使规划过程变得敏捷。通过这一章节的学习,读者可以了解规划的核心价值及其在项目中的关键作用。 - **第2章:传统估计与规划方法的问题** ...
标题中的“开题报告——春节过后“用人荒”问题的研究-论文.zip”表明这是一个关于探讨春节后企业面临用工短缺现象的学术研究。开题报告是撰写论文的第一步,通常包括研究背景、研究目的、研究意义、文献综述、研究...
1. **敏捷开发原则**:敏捷宣言是敏捷软件开发的基础,它包含四个核心价值观——个体和互动高于流程和工具,可工作的软件高于详尽的文档,客户合作高于合同谈判,响应变化高于遵循计划。这些原则鼓励团队灵活应对...
4. 软件工程:软件开发过程,包括需求分析、设计、编码、测试和维护,以及敏捷开发方法论,如Scrum和Kanban。 5. 编程语言:至少一种或多种主流编程语言的基础语法,如Java、C++、Python等。 6. 信息系统与项目...
敏捷软件开发是一种以人为核心、迭代、逐步交付的软件开发方法论,强调适应变化和高效协作。《敏捷软件开发:原则、模式与实践》一书深入探讨了这一主题,为开发者提供了理论基础和实用技巧。 在敏捷开发中,最重要...