存档

文章标签 ‘敏捷’

软件开发沉思录阅读笔记二

2010年2月18日 admin 1 条评论

这是《软件开发沉思录》这本书阅读笔记的第二篇,第一篇是软件开发沉思录阅读笔记一是对第六章——对象健身操的阅读笔迹。

第七章——迭代经理是什么角色

什么是迭代经理?

ThoughtWorks的高级架构师Fred George把迭代经理描述成“面向内部的管理角色。迭代经理负责保证故事在团队中流动的顺畅,这牵涉到合理分配任务、在技能需要改变的时候建议更换团队成员。”

怎样成为好的迭代经理?

每天,迭代经理都必须倾听团队的需要并且作出回应。其主要职责就是培养一台润滑良好的“机器”,并依据要求的质量在项目范微内交付功能。

迭代经理应该在技术熟练度和业务知识之间达到一个平衡。敏捷领袖应该“同时对客户和技术都由深刻的理解,这样才能赢得开发团队的尊重。”良好的沟通技巧是必须的。迭代经理的职责之一就是维护开团队与客户,以及与管理阶层之间的关系。

同时,迭代经理必须推动、主张和保障团队成员的权利。

迭代经理不做什么?

与项目经理不同,迭代经理需要在工作第一线,与团队成员一起面对每日的工作活动。

迭代经理与项目

作为次要目标,我期望看到因为迭代经理的工作,团队成员在项目结束的时候变得更为优秀。团队内充满信任,持续提高技能——这是迭代经理的工作。

迭代经理要争取把团队拧成一根绳,让所有的成员能同舟共济。

第十章——领域标注

在过去十年里,众多软件开发者意识到:软件应用程序中最大的复杂度来自于软件要处理的实际问题领域。正因为如此,所谓“领域驱动设计”有两个前提:

  • 大部分软件项目关注的焦点是业务领域和领域逻辑;
  • 复杂的领域设计应该基于模型来进行。

换句话说,领域驱动设计将用业务领域术语表述的业务领域的面向对象模型置于软件系统的核心。数据通常保存在关系数据库里,但看待数据的主视角是领域对象,而不是数据库表和存储过程。核心业务逻辑集中保存在领域模型中,而不是散步在用户界面和应用程序的服务层里。

如果遵循领域驱动设计方法,得到的软件系统就会清晰地区分出领域模型和基础设施(及界面):前者通常较为稳定、生命周期较长;后者通常生命周期较短,并且与具体的技术(例如O/R映射或者WEB框架)相关。这里的挑战在于如何保持两者之间的分野,从而使两者能够各自保持可复用性:一方面,领域模型应该能够在不同的应用程序、不同的服务中使用,或是在技术升级以后继续使用;另一方面,基础设施应该能用于支撑各种领域模型。当然最终的目标是实现基础设施的行业标准化(无论是采用商用软件还是开源软件),从而使应用程序开发者能专注于问题领域。

分类: 敏捷, 软件设计, 阅读 标签: ,

Daniel-Journey Daily Dose-2010/2/18

2010年2月18日 admin 没有评论

敏捷

敏捷估计和规划的12条指导原则

  • 让整个小组参与。
  • 在不同层次上进行规划。
  • 使用不同度量单位,让对规模和持续时间的估计保持独立。
  • 用功能或者日期来体现不确定性。
  • 经常重规划。
  • 跟踪进度并沟通
  • 承认学习的重要性。
  • 规划具有适当规模的功能。
  • 确定功能优先级。
  • 把估计和计划建立在事实上
  • 保留一些松弛度。
  • 通过前瞻规划协调做个小组。

Bob大叔关于Scrum和敏捷的7条缺陷

  • 缺乏技术实践:Scrum是一个项目管理框架,在技术方面没给任何建议。Bob建议团队“需要从其他诸如XP的方法中借鉴技术实践。这套技术实践可能包括:TDD、持续集成、验收测试、结对编程、重构。”
  • 30天的冲刺周期太长:多数讲师现在建议冲刺周期1-2周,大多数团队采用的是2周。
  • Scrum教练有时变成了项目经理:有些Scrum教练把Scrum当作微管理和控制的一种形式。“这不是Scrum固有的问题,而是Scrum发展中遇到的问题。或者这要怪‘master’这个单词了。”
  • 对产品Backlog的指导太少:“经过多年实践,我们知道了backlogs有很多分层次的实体,包括史诗、主题、故事等等。我们学会了怎么对它们估计;学会了怎么把高层次的实体拆解成低层次:史诗->主题->故事->任务。”
  • Scrum暗中包含反管理:“Scrum过度强调了团队自管理的角色。自组织和自管理的团队本身是好的,但是具有局限性…Scrum的描述并没有给与很好的平衡。”
  • 自动化测试:没有高质量的自动化测试,很难以短的迭代周期工作,很难知道故事是否真的做完了。
  • 多团队:Scrum和通用的敏捷方法很少谈及怎样扩展,虽然很多实践者有一些想法,但是还没有达成广泛的一致。

Agile Methodology Mashups

  • Pair Programming
  • Daily Scrum/Standing Meeting
  • Kanban/Burn Down Charts
  • Test First Development

敏捷开发中高质量 Java 代码开发实践

OOD & OOP

Composition versus Inheritance

  • Programming to an Interface, Not an Implementation

  • Creational Patterns Considered Obsolete

  • Inversion of Control Containers

  • Composition Realized
         [Inheritance] can cause problems when you’re trying to reuse a subclass.  Should any aspect of the inherited implementation not be appropriate for new problem domains, the parent class must be rewritten or replaced by something more appropriate.  This dependency limits flexibility and ultimately reusability.

         Object composition is defined dynamically at run-time (at startup, config-time in most IoC containers –Chad) through objects acquiring references to other objects.  Composition requires objects to respect each others’ interfaces, which in turn requires carefully designed interfaces that don’t stop you from using one object with many others.  But there is a payoff.  Because objects are accessed solely through their interfaces, we don’t break encapsulation.  Any object can be replaced at run-time by another as long as it has the same type.  Moreover, because an object’s implementation will be written in terms of object interfaces, there are substantially fewer implementation dependencies (!!! Very important –Chad)

        Object composition has another effect on system design.  Favoring object composition over class inheritance helps you keep each class encapsulated and focused on one task.  Your classes and class hierarchies will remain small and will be less likely to grow into unmanageable monsters.  On the other hand, a design based on object composition will have more objects (if fewer classes), and the system’s behavior will depend on their interrelationships instead of being defined in one class (configured and managed by the IoC container –Chad).

其他

Tags,无序,分类和家族相似

看似普通的Tag其实有着丰富的哲学含义

分类: 阅读 标签: , ,

Daniel-Journey Daily Dose-2010/2/12

2010年2月12日 admin 没有评论

Agile

Agile: The New Era

The study found that iterative and agile practices have a significant impact on defect and productivity factors, as indicated by the following points.

  • Releasing a system with 20% of the functionality complete is associated with a decrease in the defect rate of 10 defects per month per million lines of code as compared to waiting to release a product until 40% of the functionality is complete, and an increase in productivity of eight more lines of source code per person-day.
  • Continuous Integration, the idea of integrating and testing code as it is released to your source code repository, resulted in a decrease in the defect rate of 13 defects per month per million lines of code, and an increase in productivity of 17 lines of source code per person-day.

The first two are deeply embedded in the ideals of agile software development.

  • Releasing early and often to project stakeholders, using an iterative lifecycle.
  • Continuous integration, with daily builds including regression testing.
  • Teams with broad experience delivering multiple projects.
  • Careful attention to modular and loosely coupled, componentized architectures.

OOD and OOP

An (Overlooked?) Use Case for the Strategy Pattern

SOA

Enterprise Service Bus (ESB): a critical part of SOA

分类: 阅读 标签: , ,

Daniel-Journey Daily Dose-2010/2/11

2010年2月11日 admin 没有评论

今天学习到的敏捷方面的内容比较多

Java

Handling null in Java

Touch NullObject Pattern

Null Object模式中的Null Object总得来说并不是要求你必须以空语句段来实现,只不过空语句段是一个很常见得实现方式。它仅仅说明Null Object是个默认的实现对象。这个对象并没有作业务逻辑处理,是意义上的空实现。当然如果它功能有了一定意义那就有可能有背这个模式的初衷了。由于默认的实现对象常常是一样的,所以Null Object可以用Singleton来实现。

Linux

Some Useful Unix File Finding Commands

Agile

What Developers Need to Know About Agile

  • Much less crunch(关键、危急) time
  • More working on features
  • Less meetings.
  • Pull not push
  • Be a critic.
  • Agile makes you happy.
  • Responsibility as a team.
  • Agile is about working, high quality code.

 

如何更好地进行每日立会

  • 关注目标——与资深团队成员分享信息,他们会帮助整个团队在迭代中完成工作。
  • 关注团队——与所有人分享信息,而不是只告诉管理人员。
  • 在其他时候讨论——不要在立会中解决问题,可以安排后续时间解决,而且允许感兴趣的人参与。
  • 有准备而来——要是不想拉长立会时间,团块成员需要知道你的工作成果和待完成任务。
  • 关注成果——Joakim发现:“相比告诉别人自己正在完成系统的哪个部分,讨论成果能够提供更为积极的态度。”
  • 做出承诺——他让人们向其他团队成员承诺自己要完成的工作,而不仅仅是机械地说接下来的24小时要做些什么。
  • 指出障碍——你是不是要接触60多份文件才能完成某些细小的变更?

 What Makes a Good Stand Up Meeting?

  • Don’t be late yourself (duh).
  • The meeting needs to start on time.
  • If #1 and #2 really can’t happen, experiment with different
    meeting times.
  • Cut off inappropriate discussions.
  • If the updates are too vague, ask questions.
  • Ask your team permission to keep trying it daily for say, one
    more iteration while you try to fix these problems.

User Story Focused Daily Standups

Should the Daily Standup Be Person-by-Person or Story-by-Story?

观点:敏捷的成功不依赖于敏捷技术

我们能把敏捷规则改变为指导方针吗?

敏捷团队的那些基本规则:

  • 人人平等
  • 每个人的贡献都是有价值的
  • 对事不对人
  • 信息公开,团队内部无秘密
  • 互相尊重,尊重差异
  • 人人参与

 

和你的对手PK敏捷?

CA通过衡量以下七个方面来评估敏捷度:

  • 团队合作
  • 需求
  • 计划
  • 技术实践
  • 质量
  • 文化
  • 知识创造

The Power of Pair Programming

分类: 阅读 标签: ,

敏捷思考0.1版

2010年1月31日 admin 1 条评论

最近“如何在让开发团队敏捷起来”的话题时常被公司的兄弟开发团队讨论起来,而且有些团队也开始进行实践,并获得了第一手的体验和经验。这两天也在不断思考如何让自己的开发团队如何敏捷,这篇文章就是用来记录相关的内容,不过自己在这方面额内容涉猎不多,所以把这次敏捷思考定位到0.1版。

变更的成本

软件变更的成本实际上是操纵这软件开发的多种方面。下面这张图描述的是瀑布模型中的变更成本曲线。

未命名

                                               图一

举例来说,如果是犯了需求错误,并在需求阶段发现它,弥补的成本不是很高,仅需要修改需求模型就可以;如果在设计阶段才发现需求的错误,不但需要修改需求模型,基于错误需求模型的相关设计也必须重新评估、设计;在编程和测试阶段发现需求的错误,导致的变更成本就更大了。所以在传统(瀑布或者迭代)开发模式(如下图)中,通过对软件开发过程进行细分,完善流程和规范,尽量保证前置阶段的输出是正确的(通过文档输出、设计评审等手段),目的就是把变更的成本降到最低。

image

但是,我们的现状是:

  • 项目流程过于死板,瀑布式开发
  • 问题暴露延后,测试压力很大
  • 各自开发,没有结对编程,造成能力壁垒
  • 需求变化带来的负面影响
  • 团队不统一认识造成的浪费
  • 项目评估不准,周期长
  • 等待造成的浪费
  • 没有安排优先级造成的浪费
  • …….

注以上内容来自公司其他团队的分享。

那大家不经要问这个是为什么?我自己的回答是以下几点:

首先,在传统模式下每个阶段的工作都由专门角色来负责,需求分析阶段-需求分析师;设计阶段-架构师或开发人员;开发阶段-开发工程师;测试阶段-测试工程师。在这种分工和流程设计的环境下,项目中的每中角色只能接触有限的上下文,每个阶段工作只有有限的人员参与,每个阶段工作的质量直接受限于主要负责人的经验、知识、能力等等。

还有,延迟的结果输出,导致最后的结果设想存在很长时间段的“幻想”期。无论是需求文档、设计文档、测试文档,只有在实际结果产出以后才能得到验证,甚至有些需求理解不符合业务方的期望的问题直到软件在进行客户体验或者上线以后才能被发现。

最后,还有就是主动或者被动地选择低效的沟通方式。人们习惯依赖最低效(至少不是最高效)和繁琐的沟通方式——文档来进行沟通。通过文档进行沟通存在很多的弊端:一、制作繁琐,不但需要文字描述,有时候还需要图文并茂;二、文档输出的质量也不够稳定,很依赖撰写者的描述能力,三、文档的理解也需要耗费时间和资源,理解过程中存在失误。

对敏捷的理解

如果敏捷是要解决传统(瀑布或者迭代)开发模式的弊端就必须解决以下问题:

一、将每个阶段的变更最小化,也就是说要使得需求分析、设计、编码和测试最大程度地正确。如何达到呢?首先,就要求每个阶段的负责人具备更高的能力,这是一个答案,但也不是一个答案,因为个人能力的提升需要一个过程。其次,就是利用“集体智慧”,无论是需求、设计、测试都要充分表达出自己的想法,例如,需求分析师要负责向开发人员和测试人员说明为什么要有这个需求;这个需求是如何实现业务方的需求的;将来业务可能的需求扩展有哪些,和现在需求的关系如何,如何应对将来的发展。开发人员和测试人员会站在各自的角度以及利用自己的专业知识给出需求设计、建模的意见和建议。一句话“三个臭皮匠顶个诸葛亮”,用“集体智慧”去解决瓶颈问题。还有,就是充分的沟通,想必大家都知道沟通的重要性这里就不在叙述了。

敏捷宣言中有若干条价值观或者原则与此相关

原则:

业务人员和开发者应该在整个项目过程中始终朝夕在一起工作。

对卓越技术与良好设计的不断追求将有助于提高敏捷性。

围绕斗志高昂的人进行软件开发,给开发者提供适宜的环境,满足他们的需要,并相信他们能够完成任务。

每隔一定时间,团队都要总结如何更有效率,然后相应地调整自己的行为。

二、减少变更的成本,也就是说当变更无法避免的时候,如何让变更成本最小化。用“运动是绝对的,静止是相对的”这句话套在这里就是“变更是绝对的,不变更是相对的”。如果图一中的变更成本曲线是指数型的话,我们就要想办法把变更成本的曲线来加以改变,下面这张图是理想的变更成本曲线图。

3

那么这种变更成本曲线如何实现呢?我们来数一数手中的武器:

需求的武器有:

  • 界面原型
  • ……,我不熟悉需求分析工作,实在想不出啥

开发的武器有:

  • 单元测试
  • 重构
  • 持续集成
  • 代码生成工具
  • ……

测试的武器有:

  • 自动化测试
  • ……,测试的工作我同样不熟悉,呵呵

但最最重要的还是那个“不是答案的答案”——即要求提高需求分析人员的概念领域建模和业务流程建模能力等等;设计师的面向对象设计能力、架构设计能力;测试人员的测试分析、设计能力:-)。我相信这些能力才是控制变更成本的最有效工具。

不断的观察我们实际的变更成本曲线,从而不断的强大我们的武器、提升我们的能力,最后目标只有一个“面对变更,我们不但无所畏惧,而且自信满满”

敏捷宣言中有若干条价值观或者原则与此相关

原则:

我们欢迎需求的变化,即使在开发后期。敏捷过程能够驾驭变化,保持客户的竞争优势。

简单——尽可能减少工作量的艺术至关重要。

最好的架构、需求和设计都源自自我组织的团队。

三、让变更提早被发现,敏捷开发中倡导的“频繁交付新的软件版本,将尽早将尽量小的可用的功能交付使用,并在整个项目周期中持续改善和增强”能在很大程度上让变更提早被发现,并将变更的成本最小化。敏捷宣言中有若干条价值观或者原则与此相关

价值观:

可以工作的软件重于求全责备的文档。

原则:

经常交付可以工作的软件,从几星期到几个月,时间尺度越短越好。

可以工作的软件是进度的主要度量标准。

对于这点想在日后的文章中再展开叙述。

四、团队间高效沟通和诚意合作。敏捷开发倡导并在某种程度上神话了某些工具,例如白板,“业务人员和开发者应该在整个项目过程中始终朝夕在一起工作”,而实际上只要我们能够了解这些工具或者环境准备都是为了减少沟通障碍、提升沟通效率和效果,就能破除对这些表面功夫的迷信。对于这点也想在日后的文章中再展开叙述。

敏捷尝试计划

主要的敏捷执行流程大致如下图所示

agile_process

下面是几个主要内容的说明:

周期0指的是进入项目流程后的一个阶段,进行的内容包括了最初的分析、建模、分析。这个阶段进行的内容涉及到高层的需求分析、需求建模、设计建模、测试分析等工作,工作内容的范围、难度存在比较大的差异,时间跨度可能有几个小时到1-2周,强烈不建议投入更多的时间,因为那样会有过度建模的危险,另外过度延长可交付软件的交付周期也会导致变更机率的加大。

周期1至n进行的是详细建模、详细设计、开发、测试等一系列工作。在一次发布的周期里,建模工作经常会是分钟级别。产品经理、需求分析师、开发、测试(我们的工作模式很难让业务方一起参与到软件开发的流程中)一起分析正在处理的需求,一起通过白板或者草稿上绘制一张草图,然后产品经理、需求分析师、开发、测试各自进行需求分析、需求建模、设计、开发、测试分析等工作。需求建模和设计建模可以采取高效的工具来进行,例如,需求分析师是可以通过Pencil之类的工具完成界面原型的设计,而开发工程师可以通过UML来描述类图和时序图,从而将主要的设计思想和内容表达出来,至于面面具到的文档可以留到后续的工作中来完善。团队在实现阶段(开发和测试)会花费大量时间。在开发中,遵循和使用TDD、重构、或者代码生成可以有效提升开发效率,而在测试阶段这样敏捷的工具和方法就为数不多了!

在周期0至周期n的过程中,将涉及的评审工作也根据迭代周期穿插进行。在完成了项目后需求、开发、测试工作人员可以根据最终的工作结果完善文档(这些文档对于我们团队在后续的开发、维护工作中还是至关重要的)。

总结

以上就是这段时间对“敏捷开发”的思考和整理,由于没有多少直接的敏捷实践经验,更多的内容要等待通过以后的实践工作来体会和总结。

参考资料

瀑布模型维基百科定义

瀑布模型是由W.W.Royce1970年最初提出的软件开发模型,在瀑布模型中,开发被认为是按照需求分析设计实现测试 (确认), 集成,和维护坚定地顺畅地进行。

在最初的文章中,Royce提倡重复地使用瀑布模型,以一种迭代的方式。但是,大多数人并不知道这一点,一些人也不相信它能够作为一种真实世界的过程使用。在实践中,过程很少能够以纯线性的方式进行。 通过回到前面的阶段或改变前一阶段的结果的迭代是非常普遍的。讽刺的是,在Royce 1970年的那篇文章中他讲述这种模型的目的是作为例子来说明这种模式是有缺陷的、不能工作的。事实上,软件开发相关文章中对这个名词的大量引用正是对这个广泛流行的软件开发做法的一种评判。

瀑布模型(Waterfall Model)最早强调系统开发应有完整之周期,且必须完整的经历周期之每一开发阶段,并系统化的考量分析与设计的技术、时间与资源之投入等,因此瀑布模型又可以称为‘系统发展生命周期’(System Development Life Cycle, SDLC)。由于该模式强调系统开发过程需有完整的规划、分析、设计、测试及文件等管理与控制,因此能有效的确保系统品质,它已经成为业界大多数软件开发的标准(Boehm, 1988)。

敏捷开发维基百科定义

敏捷软件开发又称敏捷开发,是一種從1990年代開始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于「非敏捷」,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重做为软件开发中人的作用。

分类: 敏捷 标签: ,

Daniel-Journey Weekly Dose-2010/1/31

2010年1月31日 admin 没有评论
分类: SOA, 学习 标签: ,