Robert C. Martin( 罗伯特·C·马丁),作为世界级软件开发大师.设计模式和敏捷开发先驱.C++ Report杂志前主编,也是敏捷联盟(Agile Alliance)的第一任主席,我们尊称他为" Bob 大叔(Uncle Bob)".如今,年逾六十的 Bob 大叔过着典型的"斜杠"生活,他不仅是优秀的程序员.畅销书作家.演讲家,以及视频制作者,还是一名柔术爱好者. 多年学习柔术的经历,带给他的除了强健的身体之外,还有从中受到的有关"匠艺&qu…
雪鸟会议 雪鸟会议前夕,James Grenning 在 Object Mentor 与 Robert C. Martin 一同工作,彼时组织雪鸟会议的 Bob 大叔盛情邀请 James,告知他会议的地点.James 听到地点后毫不犹豫地答应,并在脑海中踊跃欢呼"我要去滑雪!"毕竟,"雪鸟是世界上最好的滑雪场之一",没有人会拒绝雪鸟的诱惑.当然,除了滑雪这个最直观的念头,James 也曾与 Kent Beck.Ron Jeffries.Martin Fowler.W…
在 Martin Fowler 的世界里,任何事情都有最优解. 1963年,Martin 出生于英格兰的沃尔索尔(Walsall),也在同样位于沃尔索尔的玛丽女王文法学校中接受中等教育.在这里的乡村中,他度过了一段简单.愉快的少年时光.上了中学之后,Martin 接触到了策略桌游.在桌游的"厮杀"中, 如何从复杂的局势中找出最简洁.直观的破局之法,就成为他想要寻找的答案,也成为日后他解决任何事情的目标. 1986年,Martin 毕业于伦敦大学学院,获得了电子工程与计算机科学的学士学位…
在软件开发领域, Ward Cunningham 有许多独到的见解与成就. 1949年,Ward Cunningham 出生于印第安纳州的密歇根市,并在莱克县的一个小镇中长大.怀揣着对计算机浓厚的兴趣,在普渡大学学习期间,他获得了跨学科工程(电子工程和计算机科学)学士学位以及计算机科学硕士学位.1978年,Ward Cunningham 完成了全部学业. ( 普渡大学校徽) 毕业后的 Ward Cunningham 先后担任过研发总监.首席工程师等职位,也自己创办了 Cunningham&Cun…
Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师都非常的重要,它们是: ●Agile方法:主要讲述了如何去使用Agile方法,其中有很大一部分内容是告诉你为什么要这样做. ●面向对象设计原则:本书包含了11个面向对象设计原则,涵盖了包的设计和类的设计. ●设计模式:本书中讲述了23个设计模式,并都有具体的实例.讲解的重点在如何在实际的应用中去使用…
他很少提起往事,也不再提及二十年前那场引起软件行业变革的会议,他专注于当下,一直活跃在敏捷领域.八十多岁的他依然运营维护着网站和博客,是极限编程网站 XProgramming.com 的作者,该网站是极限编程网站中运行时间最长.最大的单人网站之一,目前包含200多篇文章.他在发布的文章里进一步阐述了开发人员应远离"人造敏捷"或"黑暗敏捷"形式,而应更接近宣言的价值和原则.他是极限编程的创始人之一,Ron Jeffries. 编程工作 Ron Jeffries 从事编…
普通的人生大抵相似,传奇的人生各有各的传奇.Jeff就是这样的传奇人物,年近80的他从来没有"廉颇老矣尚能饭否"的英雄迟暮,不久前还精神矍铄地与好几百名中国学生进行线上交流,积极回答中国粉丝关于Scrum的疑惑. 他在某个领域的成就很可能是很多人一辈子都难以望其项背的存在. 军校和越战 Jeff的教育经历丰富,就从那个大名鼎鼎的西点军校讲起吧!西点军校成立于1802年,由当时的美国第三届总统托马斯·杰弗逊签署法令成立,培养了麦克阿瑟.艾森豪威尔.巴顿.鲍威尔众多军事政治人才.西点军校入…
敏捷是人的天性,是你与生俱来的东西.面对敏捷,Arie van Bennekum 下了这样一个结论. 但这并不意味着人们只能通过天赋获得敏捷,对于想要学习敏捷的人来说,敏捷绝不是仅仅靠学习僵化的框架.实践.过程或技术就行得通的.同样,只有真正采用敏捷思维和文化的组织才会变得更具灵活性和创新性.而 Arie,也在推动着敏捷转型. 传统式工作 1983年,Arie 以一名助产士的身份取得了卫生学学士学位.拿到毕业证以后,他做出了自己的职业规划:从事女性保健行业.即使在这个当时是女性占主导的行业中,作…
2011年,Kent Beck 加入了 Facebook .那时候的他已年过半百,几十年的经验让他自认为非常了解软件行业.在 Facebook 的新手训练营期间,Kent 开始意识到,Facebook 与他所见过的任何公司都不一样. Facebook 确实在做真正的敏捷,不仅非常灵活,而且时刻在为改变做准备.在 Facebook 训练营结束后,Kent 开始探索 Facebook 的代码库和文化.他发现,Facebook 用于构建和扩展产品的方法,彻底重塑了他对软件工程的信念. Kent 刚加入…
2018年3月23日,在美国的芝加哥发生了一起意外刺杀事件.一名男子刺杀了一位首席执行官,而这位不幸的首席执行官就是<敏捷宣言>的合著者--Mike Beedle.Mike 的这场意外令 Scrum 之父 Jeff Sutherland 心痛不已," Scrum 和敏捷社区失去了一个巨人." 最初,Mike 在校期间发布了一篇硕士论文,论文内容是有关非线性系统的.这篇论文发布后不久,Mike就受到杰夫·萨瑟兰(Jeff Sutherland)和肯·施瓦伯(Ken Schwa…
很多人之所以平凡,并不在于能力的缺失,而是因为缺乏迈出一步的勇气.只有少部分的人可以带着勇气和坚持,走向不凡.Ken Schwaber 就是这样的人,他带着他的勇气和坚持在敏捷的道路上不断前行,以实现自己的价值.但这一路走来,并非一帆风顺-- 1945年,在美国的伊利诺瓦州惠顿市,Ken Schwaber 出生.同年,第一代电子管计算机问世.身处于计算机萌芽的时代,小小年纪的 Ken 对这一新生事物充满了好奇,常常会产生很多的问题和想法,也会拿着这些问题去请教身边的老师和同学. 随着年龄的增长,…
" 敏捷已逝,但敏捷精神长存.因为所谓的敏捷专家卖给你的是方法论,而不是价值."当多数人都在从"敏捷"身上榨取利益时, Dave Thomas 成为了一位逆行者.在敏捷实践中他不断尝试,以寻找敏捷最务实的价值. "敏捷是什么" 早在2001年春,Dave 参加了发布<敏捷宣言>的雪鸟会议,成为了<敏捷宣言>的17个作者之一.虽然 Dave 对敏捷本身的价值毫不存疑,但之后由于很多出于不同目的的人,将无限多的内容加到了&qu…
与其说 Andy Hunt 是敏捷宣言的创始人,不如说他是一名专业作家来得更为合适.他的<实用程序员><程序员修炼之道:从小工到专家><编程 Ruby:实用程序员指南>都是口碑极佳的程序员读物.50多岁的他从未离开敏捷,但又没有把自己的人生与敏捷绑在一起,他的精神生活丰富而充实:搞音乐.做木工.写科幻小说-- Andy 的职业生涯经历了很多阶段,从财富100强公司的在职程序员,到在"真正精英.有趣的高科技软件公司"工作,再到担任上述所有公司的顾问,再…
在一次用例和敏捷技术交流大会上,Alistair给大家分享了自己比较崇尚的三个字: "守""破""离",他用做面包的例子,形象地将这三个字与敏捷的不同阶段相贴合.结合 Alistair 丰富的经历,"守""破""离"三个字也恰好概括了他在敏捷中的不同阶段. "守" 关于 "守"的阶段,Alistair 是这样理解的:"一个从来没有做过面包…
Steve Mellor 是敏捷宣言的签署人之一,他自称是作为" 间谍"去参加雪鸟会议的. 起初收到会议邀请时,Steve 非常惊讶,因为他所做的工作一直都是关于建模方面的,很少将深受敏捷实践者喜爱的编码和测试作为重点.确实,我们很少会看到"敏捷"和"建模"同时出现, 接下来我们就来了解 Steve Mellor 与它们的故事吧. Steve Mellor 与"敏捷" 在收到会议邀请前,Steve 刚读过 Kent Beck…
"我们希望,一起组成的敏捷联盟能够帮助到其他同行,帮他们用新的更'敏捷'的方式去思考软件开发.方法论和组织.做到这一点,我们就得偿所愿了."Jim Highsmith 在雪鸟会议结束后,发出了这样的感叹. 这位出生于1945年的软件工程师,是一位登山狂热爱好者.在 Jim 看来,无论是工作还是娱乐,所做的事情其实都是在登山.Jim 拥有电气工程学士学位和管理硕士学位.他在工科学校毕业后的第一份工作就接触到了阿波罗载人航天计划.因此,可以说他的第一个项目是成功的,尽管当时他的工作职责微乎…
这是松结对编程的第22篇(专栏目录). 接前文 业务代码 比较长,基本上就是看被注释隔开的三大段,先显示状态群筛选链接,然后是单个状态筛选,然后是显示下拉框的当前选中项,最后显示下拉框. public static MvcHtmlString StatusFiltersDropdownList(WebViewPage page) { var allStatuses = Status.AllStatuses().ToList(); const string key = "statusIds&quo…
1.编写一个程序,创建一个包含26个元素的数组,并在其中存储26个小写字母.然后打印数组的所有内容. #include <stdio.h> int main(void) { int num = 26-1; int i; char list[26-1]; char ch = 'a'; for (i = 0; i <= num; i++, ch++) list[i] = ch; for (i = 0; i <= num; i++) printf("%c", list…
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生的.享元模式通过共享技术实现相同或相似对象的重用. 在享元模式中可以共享的相同内容称为内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有…
模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意.模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式. 模式定义模…
   李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得到不同的结果.设计模式可以从[目的]和[范围]两个角度来看看. 模式分类 从目的来看[这个分来是广泛使用的]: -创建型(Creational)模式:负责对象的创建 -结构型(Structural)模式:处理类与对象间的组合关系 -行为型(Behavioral)模式:类与对象交互中的职责分配的问题 从范围来看…
关键字:OOAD.UML.设计模式 各位园友,大家好,我是Bobby,在学习OOAD和开发的项目的过程中有一些感悟和想法,整理和编写了一些学习资料 [内容简介]掌握某种开发语言,让你实现了由零到一的脱变,如果你能掌握OOAD并能活用OOAD,则能让你实现由一到十的飞跃!知道OOAD的人很多,能在实际工作中用好OOAD的人却不多,本书为你分享作者十多年来实践OOAD的心得体会,学会活用OOAD来提升需求分析及软件设计的能力,学会活用OOAD由需求到设计全程建模.正如同,技术是条永无止境的路,每个人…
聚合 “虚包含” 不明确组合 “实包含” 明确 抽象(abstract)抽象:抽象是通过特定的实例抽取共同特征以后形成概念的过程.它强调主要特征,忽略次要特征.一个对象是现实世界中一个实体的抽象,一个类是一组对象的抽象,抽象是一种单一化的描述,它强调给出与应用相关的特性,抛弃不相关的特征. 忽略掉一个对象或实体的细节而只关注其主质特征的过程:简化功能与格式:帮助用户与对象交互. 封装(encapsulation)封装(encapsulation) —隐藏内部实现隐藏数据和实现:提供公共方法供用户…
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务.通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机. 模式定义代理模式(Proxy Pattern) :给某一个对象提…
模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦.这就是职责链模式的模式动机. 模式定义职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个…
模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求.这就是命令模式的模式动机. 模式定义命令模式(Command Pattern):将一个请求封装…
模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中. 模式定义解释器模式(Interpreter Pattern) :定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式.Interpreter Pattern: Give…
模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口中充斥着各种不同遍历的操作.怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式,这就是迭代器模式所要解决的问题.在迭代器模式中,提供一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的…
模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理. 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱. 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统…
模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取出即可回到之前的状态.现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z,目的就是为了解决这个后悔的问题. 在应用软件的开发过程中,很多时候我们都需要记录一个对象的内部状态.在具体实现过程中,为了允许用户取消不确定的操作或从错误中恢复过来,需要实现备份点和撤销机制,而要实现这些机制…