阅读笔记-软件工程的大泥球

软件工程的大泥球

(原文地址:http://www.laputan.org/mud/

  大泥球的定义:BIG BALL OF MUD is a casually, even haphazardly, structured system. Its organization, if one can call it that, is dictated more by expediency than design.

  文中作者拿软件构建和建筑做类比,我觉得是很合理的。软件架构师对应于建筑设计师,要做整体规划,设计“建筑图纸”;开发人员则与施工人员相对应,做具体的构建工作。

  作者提到What forces drive good programmers to build ugly systems?在后面也给出了答案:

  Time
  系统的设计和实现必须要考虑时间因素,建筑的修建有工期的限制,软件的构建同样有deadline
  Cost
  引用文中的话Architecture is expensive, especially when a new domain is being explored.成本的影响毋庸赘言。 
  Experience
  经验的缺乏会导致很难“discover and develop new abstractions”,从而影响软件架构的复杂程度。(domain experience和architectural experience还不太理解。)
  Skill
  程序员之间的技能水平、适应能力以及开发工具的偏好等方面都有差异
  Visibility
   可见性是建筑和软件构建的差异之一:所有人走进一栋大楼就可以看见这栋大楼的内部结构,而软件的内部结构只有开发软件的人才能知晓。
  Complexity
  软件本身的复杂度直接影响了设计一个清晰的架构的困难度;the software is ugly because the problem is ugly, or at least not well understood.
  Change
  软件的需求一旦改变,软件的体系架构也要相应地改变。
  Scale
  项目规模变大,即便采用了分而治之的思想,也无法很好地解决问题
  这部分提到了艾伦·凯的一句话:"good ideas don‘t always scale."
  Scale的动词含义我特意查了下,衡量,攀登,脱落似乎都不太符合。
  然后去查资料,发现这句话出现在下面这篇访谈中http://www.folklore.org/StoryView.py?project=Macintosh&story=Creative_Think.txt
  于是我的理解:好的想法,倘若要付诸实现,不会要求其涉及的规模很大。
  (附:艾伦·凯Alan Kay是Smalltalk的最初设计者,说过"The best way to predict the future is to invent it."预测未来的最佳方式就是去创造它。

个人能力有限,所以下面还是摘录几段文中的话,算是记一点笔记。

  1.The time and money to chase perfection are seldom available, nor should they be. To survive, we must do what it takes to get our software working and out the door on time. Indeed, if a team completes a project with time to spare, today’s managers are likely to take that as a sign to provide less time and money or fewer people the next time around.
  追求软件的设计完美,是不太现实的。时间和预算都会成为不可忽视的因素,不断提醒着你做出一个能用、按时交付的软件才是正道。一个团队提前完成了一个项目,不要高兴得太早,或许下一个项目的开发时间会有所缩减的!
  2.focus first on features and functionality, then focus on architecture and performance.
  3.BIG BALL OF MUD might be thought of as an anti-pattern, since our intention is to show how passivity in the face of forces that undermine architecture can lead to a quagmire. However, its undeniable popularity leads to the inexorable conclusion that it is a pattern in its own right. It is certainly a pervasive, recurring solution to the problem of producing a working system in the context of software development. It would seem to be the path of least resistance when one confronts the sorts of forces discussed above. Only by understanding the logic of its appeal can we channel or counteract the forces that lead to a BIG BALL OF MUD.
  4.One of mud‘s most effective enemies is sunshine. Subjecting convoluted code to scrutiny can set the stage for its refactoring, repair, and rehabilitation. Code reviews are one mechanism one can use to expose code to daylight.
  代码复审或许正是化解“大泥球”的阳光
  5.Indeed, reviews and pair programming provide programmers with something their work would not otherwise have: an audience. Sunlight, it is said is a powerful disinfectant. Pair-practices add an element of performance to programming. An immediate audience of one‘s peers provides immediate incentives to programmers to keep their code clear and comprehensible, as well as functional.
  极限编程-结对编程,有人在旁边盯着你敲代码,这就好比有观众在专心致志地看着你在舞台上表演,你会不由自主地投入其中。并且,这样一来代码的清晰度和可读性都会有大幅的提升。我记得结对编程时,我的同伴每敲出一段代码,我一旦不明白就会问她这个是什么意思,是要实现什么功能,在这样的一问一答中,我们对自己写的代码的理解得更清楚了,也使得代码的逻辑性有了一定的保障。毕竟两个人都能看懂的代码的可读性,是要高于一个人能懂的代码的可读性的。
  6.An additional benefit of pairing is that accumulated wisdom and best practices can be rapidly disseminated throughout an organization through successive pairings. This is, incidentally, the same benefit that sexual reproduction brought to the genome.
  结对编程的好处:智慧的累加
   7.There are three ways to deal with BIG BALLS OF MUD. The first is to keep the system healthy. Conscientiously alternating periods of EXPANSION with periods ofCONSOLIDATION, refactoring and repair can maintain, and even enhance a system‘s structure as it evolves. The second is to throw the system away and start over. TheRECONSTRUCTION pattern explores this drastic, but frequently necessary alternative. The third is to simply surrender to entropy, and wallow in the mire.
  处理大泥球的三种方式:1在大泥球的基础上,不断修复、改善,甚至增强系统结构;重新构建3干脆放任自流,随它自己去发展。
  8.Master plans are often rigid, misguided and out of date. Users’ needs change with time.
   9.Successful software attracts a wider audience, which can, in turn, place a broader range of requirements on it. These new requirements can run against the grain of the original design. Nonetheless, they can frequently be addressed, but at the cost of cutting across the grain of existing architectural assumptions.
  又是用户需求的问题。软件构建之前的整体规划往往会随着用户需求的变化而不断改变。
  我觉得有趣的是描红的那句话。软件做的成功会吸引大量的用户,反过来,正因为用户量之大,才会导致需求更多。所以这个暗示着需求增加也许不是坏事,反而说明你开发的软件很受欢迎?这一点挑明了,程序员们面对需求的改变就不会如此郁闷了吧。
   10.Maintenance needs have accumulated, but an overhaul is unwise, since you might break the system.
  维修需要积累,大修不明智,因为可能会破坏系统
   11.Microsoft mandates that a DAILY BUILD of each product be performed at the end of each working day……Indeed, this approach, and keeping the last working version around, are nearly universal practices among successful maintenance programmers.
  每日构建
  12.If you can’t make a mess go away, at least you can hide it.
  接口

  (后面的漫画,画风很别致呀..可惜没有看懂)

 
时间: 2024-08-28 14:10:18

阅读笔记-软件工程的大泥球的相关文章

关于第二次阅读作业中"银弹"“大泥球”等的个人理解

这几天时间比较充裕,就一点一点的借助英语翻译(毕竟英语不好)阅读了一下老师建议的论文作品.感觉他们的思维和我们的是不在一个角度上的,在我们看来,编写代码的任务仅仅就是实现了设计文档中的功能,而这些在课程设计中往往能满足要求,但是在长远方向看和软件优化的角度来思考,我们的设计都是极其糟糕的..... 大师的角度中,程序员实现软件最最本质的东西,就是软件在概念抽象和应用于电脑上的两个方面,软件在概念上的抽象性设计解决方案是很困难的,而软件施行与电脑上也是具有挑战性.在大师的启发下,我对4个方面的困难

软件工程的瀑布, 大泥球, 教堂,集市,和银弹

0x1 No Silver Bullet 1           There is no royal road, but there is a road 软件工程缺乏一剂良药,在硬件成本随着发展速度快速下降的同时,软件工程的成本并没有出现明显的下降,然而,随着软件工程持续的.坚持不懈的发展,软件工程正在发生着重量级的变化. 2           Does It Have to Be Hard?--Essential Difficulties 必须观察到异常不是软件进展如此缓慢,而是计算机硬件进

大泥球你好~

一度狭隘的以为编程能力就是指数据结构和算法,只有在ACM的时候才有用武之地,经过这一阶段的团队项目开发我才真正地意识到,编程能力已经成为了构建程序框架不可或缺的能力,他不仅决定了程序的正确性和鲁棒性,还决定了其可扩展性,一言以蔽之就是决定了代码的生死存亡,编程能力强就意味着程序中大泥球的数量很小甚至没有. 曾经写过一个目标追踪的项目,程序的框架设计和编写同时进行,最后一股脑的才开始测试,由于类的设计交错冗余,功能或独立或重复,还有功能没有覆盖上的,再加上函数的正确性没有进行单元化覆盖测试,执行的

阅读笔记-软件工程的银弹

(最近看了两篇关于“银弹”的文章,做一点笔记,其中,英文基本上是引用原文) 一.No Silver Bullet: Essence and Accidents of Software Engineering 这篇是Fred Brooks在1987年所发表的一篇关于软件工程的经典论文. (链接:http://www.cs.umd.edu/class/spring2003/cmsc838p/General/NoSilverBullet.html) 所谓“银弹”,按我对这篇文章的理解,或许是一个可以让

梦断代码--阅读笔记--软件工程

每每感叹编程时间不够,软件时间章节中有这么一段:"那是1975年的冬天.作者在终端机房中俯身敲击一台电传打字机,每打完一行,那笨重的机头就会摇头晃脑猛然撞回最左边,开始新的一行.我从几个小时前开始输入一行行黑代码,忘记了时间流逝,全然不知已是午夜时分.看门人已经关闭廊灯.我并没有得到许可在纽约大学物理系大楼中流连忘返.使用向高中学生免费发放的计算机账号.不过,倒也无人责难."时间都去哪了,时间就是忘记所谓的时钟,那么时间就变成了软件时间.死定了章节中的故事,我感觉写软件不仅仅要有时间,

effective OC2.0 52阅读笔记(六 大中枢派发)+ Objective-C高级编程 (三Grand Central Dispatch)

41 多用派发队列,少用同步锁 总结:当多个线程执行同一份代码时,可能会出现问题,这时有@synchronized(self){}内置同步块.或NSLock对象.然而这只是某种程度上的线程安全,使用串行同步队列(serial sychronization queue).更有效率的方法是使用串行队列同步取方法,异步设置方法.执行异步派发时需要拷贝块.再优化就是改用并发队列,同步取方法,使用栅栏块(只是对并发队列有意义)异步设置方法(读取操作可以并行,但是写入操作必须单独执行)dispatch_ba

《大道至简---软件工程实践者的思想》阅读笔记二

08大道至简——软件工程实践者的思想阅读笔记之二 2015-06-02 16:41 第五章 失败的过程也是过程 以得失而论,在瀑布模型与RUP模型之间,学习前者而不成,可思过程的本质:学习后者而不成,可得文字的架子. 如果懂得了所谓的模型原本都演化自那个简单的瀑布,那么文档是按XP写还是按RUP写,也就可以应时.应需,因地置宜,择善而从了. 越是简单的东西,往往越是接近于本质. 项目经理的工作,就是要去组织这个工程中的各个角色,使得分工明确,步调一致,共同地完成这个项目. 第六章从编程到工程 我

《大道至简---软件工程实践者的思想》阅读笔记一

07大道至简——软件工程实践者的思想阅读笔记之一 2015-05-29 16:41 第一章编程的精益 作者将<列子·汤问篇>中的<愚公移山>与软件工程巧妙的结合起 来,通过分析证明其实在两千多年前的愚公除了在移山的过程中担任 “项目组织者,团队经理,编程人员等众多角色”,还已经具备了编 程人员的基本素质. <愚公移山>                                项目管理 惩山北之塞,出入之迂                       项目原始需求的

现代软件工程-阅读笔记

构建之法:现代软件工程-阅读笔记 现代软件工程 软件 = 程序 + 软件工程 程序 = 数据结构 + 算法 软件工程包括了开发,运营,软件维护的过程中的很多技术.做法.习惯和思想.软件###工程把这些相关的技术和过程统一到一个体系中,叫"软件开发流程",软件开发流程的###目的是为了提高软件开发.运营.和维护的效率,以及提升用户满意度.软件的可靠性###和可维护性. 软件团队的模式: 主治医师模式.明星模式.社区模式.业余剧团模式. 秘密团队.特工团队.交响乐团模式.爵士乐模式. 功能