刘凯的博客

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

2014年7月20日

敏捷主义,关于敏捷的思考和启发

    这片文章是我这些日子以来通过读书获得的一些关于敏捷开发的思想,以及这些思想对我的启发。
 
    这篇文章不会讨论具体的敏捷方法,而是讨论一下敏捷和早期开发方式在原则和逻辑上的区别。这些区别也是我们在实践敏捷中最容易忽视的,我们很容易就能记住每一个敏捷方法的特点,但是对于敏捷开发别后的原则和哲学,却甚少深思。
 
    在传统的瀑布式开发方式中,前期的分析和设计是最重要的,项目中的代码不过是按照这个设计严格制造出来的产品,而项目中的程序员也只是按照已经做好的设计进行生产的代码工人而已。传统的瀑布式开发方式是把软件也当成一个工业制成品来设计和生产的。
 
    在敏捷开发方式中,最重要的原则是代码不是设计出来的,而是生长出来的,在一些权威的关于敏捷开发的书中,关于代码的描述中用的最多是evolvo这个单词。Evolvo这个词只能用于一个有机体,不可能用在一个工业制成品的身上,一个工业制成品是不可能进化的,你看到过一块肥皂能进化吗? 如果我们真的要拥抱敏捷的话,我们首先需要改变的是我们对代码的看法,代码在敏捷开发中是设计和业务逻辑的最终和最重要的载体,是一个能够根据需求不断进化的有机体。
 
    敏捷和瀑布模式代码观念上的区别,必然导致的是这两种开发方式对开发人员的不同要求。在传统的瀑布开发方式中,开发人员只是负责把设计文档翻译成机器能读懂的代码,仅此而已。敏捷开发从它产生的第一天起就强调了对开发人员的重视。敏捷强调代码的进化和重构,要求开发人员能够发现代码中的一些不好的设计和不能清晰地体现设计的代码,并能够对其进行重构和改进。
 
    说的简单点,传统的开发方式中,开发人员是操作工,是不需要独立思考的,只需要按照传统的工业生产方式进行简单的重复劳动就可以了,也不需要有任何判断力。但是在敏捷开发中,开发人员是园丁,他们要查看代码是不是在朝正确的方向发展,并且不断地对代码进行修剪和保养,这就使得开发人员在敏捷开发中不再是一个重复劳动的工人,而是一个需要有独立思考和判断力的手艺人。
 
    敏捷开发相比于原有的瀑布开发方式,最大的优点也正在于对开发人员的解放和信任,但是也无形中提高了对于基层开发人员素质的要求。如果你的开发人员中没有形成一种手艺人的态度的话,任何敏捷方法都是必然会破产的。很多项目和公司采用敏捷失败的原因不是他们实践敏捷方法的细节有什么错误,而是他们从一开始找的人就错了,他们的开发人员中没能形成这种手艺人的态度。什么是手艺人?手艺人就是把自己做出来的每一件东西都当成自己的作品,自身品味和精神的一个载体,体现着自己的价值和审美。把自己做的东西当成产品还是作品,是操作工和手艺人最大的区别。
 
    所以说一个软件开发公司如果真的想很好的实行敏捷开发,就首先要在开发人员中培养手艺人的态度。在中国实行敏捷开发,最难的不是怎样去实践敏捷开发的具体细节,开个scrum站立会议,弄块儿白板做Kanban,这些都不是最难的,最难得是怎么找到或培养符合敏捷精神的开发人员。中国文化中最缺少的就是手艺人的态度,因为中国的传统思维是万般皆下品,唯有做官高,权力在中国这片土地的回报率实在是太高了,以至于所有其他工作的投资回报率在它面前都相形见绌。我的很多同事和朋友,在做了许多年的开发工作后,仍然想当manager,这种选择无可厚非,因为它从一个侧面说明了中国文化中对权利的迷恋是多么的普遍和长久。在这样的文化基础上实行敏捷尤其要注意手艺人精神的培养。
 
   说了这么多敏捷开发的特点,举个不见得恰当的例子来加深一下理解吧。传统的开发方式就相当于计划经济(如果不知道什么是计划经济的童鞋,请回家问父母,实在篇幅有限,无法在此普及),更相信精英进行的顶层设计,迷恋于对流程的定义和控制,不相信也不依赖基层参与者的创造力和自我决策,基层参与者被物化成了一个个活的机器或是蚁群中的工蚁。敏捷开发却更像市场经济,它当然也注重精英对社会的设计和他们的领导作用,但是它同时更尊重经济活动中每一个基层参与者的自我决策和创造力。敏捷开发的根本优势在于对人的解放,对开发人员的尊重和信任,承认他们是软件开发活动中必不可少的创造者而不仅仅是一个操作工。
 
   关于敏捷开发,我上面已经说了很多了。关于敏捷开发的原则和实践,大家可以参考robert martin写的那本“敏捷开发原则,模式与实践”这本书,这本书也是在我学习敏捷开发的过程中对我影响最深的一本书。
 
   敏捷开发最基本的原则就是敏捷联盟发布的敏捷宣言,一共有四条,具体的条目我就不在此一一列举了,大家可以看我上面推荐的那本书。这四条敏捷宣言,不仅影响了我对敏捷开发的理解,更是深刻的影响了我的人生观。我将敏捷宣言中体现出的原则总结为8个字:关注成长,拥抱变化,我将其称之为敏捷主义,因为我觉得这些原则将成为互联网时代我们最好的生存策略。
 
   随着互联网时代的来临,我们的经济和社会发展正以我们无法预料的方式在变化。预测和期待本来是人类一种特有的优势,人类就靠着这些优势在远古的生存竞争中活了下来,成为赢家。我们现在面临的最大的悖论确是随着人类社会的发展,我们的未来越来越难以预测。在农业时代和传统的工业时代,你基本上可以根据以前若干年的情况来预测未来的收益,但是随着互联网时代的来临,我们根本无法预测出一些不知道从什么地方冒出来的颠覆力量。诺基亚和摩托罗拉肯定没想到智能手机的发展会给他们带来灭顶之灾。在这样的一个如此不可思议的年代,我们唯一能够的做的就是不去做过长时间的预测,同时不断地让自己成长,让自己永远保持好奇心和对变化的敏感。关注成长就是三省吾身,每天都要想一想自己获得了什么,有哪些错误需要注意。这些获得可以是减掉的体重,记下来的一段名言或自己喜欢的座右铭,又或是通过读书获得的一种内心体验。拥抱变化就是永远要保持一分好奇心,人类的好奇心是人类最可贵的能力和所有人类进步的终极动力,不要让我们过早的将我们的好奇心抛弃掉。我说了这么多,但是我觉得乔布斯说的那句话是对敏捷主义的最精炼的表达: stay hungry, stay foolish。让我们永远记住这句话吧,让我们永远保持对进步的饥饿和对世界的好奇。
 
   
 

posted @ 2014-07-20 11:02 刘凯 阅读(2006) 评论(4) 推荐(3) 编辑

2013年2月27日

Entity Framework Code First 学习日记(10)-兼容遗留数据库

摘要: 在开始写本次的日记之前,首先需要给大家道个歉。因为最近一直忙于新的项目,所以有一个多月都没有继续更新了。 本篇日记我们将详细探讨如何将表现领域的类映射到现有的数据库。现在的经济形势不是太好,很多公司都取消了开发新系统的预算。在这种情况下,通常的做法是把原有的几个系统修改一下做个集成,先凑合用着得了。如果要对原有的系统做功能提升的话,肯定要重用原来的数据库结构并做一些小的改进,在这种情况下我们怎样使... 阅读全文

posted @ 2013-02-27 12:33 刘凯 阅读(3084) 评论(13) 推荐(9) 编辑

2013年1月23日

Entity Framework Code First 学习日记(9)-映射继承关系

摘要: 上次的日记中已经提前预告了将要介绍的内容,在本次日记中我将介绍Entity Framework Code First如何处理类之间的继承关系。Entity Framework Code First有三种处理类之间继承关系的方法,我们将逐一介绍这三种处理方法。 1.Table Per Hierarchy(TPH): 只建立一个表,把基类和子类中的所有属性都映射为表中的列。 2.Table Per T... 阅读全文

posted @ 2013-01-23 15:15 刘凯 阅读(5275) 评论(4) 推荐(4) 编辑

2013年1月22日

Entity Framework Code First 学习日记(8)-一对一关系

摘要: 通过上面两篇日记,我相信大家已经知道了Entity Framework Code First如何根据类之间的依赖关系推断并建立数据库中表之间的一对多和多对多关系。这次日记我们将详细Entity Framework Code First是如何建立数据库中的一对一关系。 在介绍一对多关系和多对多关系时,大家应该已经注意到了只要存在依赖关系的两个类的定义中包含对方的实例或实例的集合,Entity Fra... 阅读全文

posted @ 2013-01-22 11:02 刘凯 阅读(5016) 评论(3) 推荐(2) 编辑

2013年1月18日

Entity Framework Code First 学习日记(7)-多对多关系

摘要: 上一次的日记中我们详细讨论了Entity Framework Code First如何建立表之间的一对多关系。这次的日记中我们将详细介绍Entity Framework Code First建立多对多关系的默认行为,以及如何通过Fluent API改变默认行为。 本次日记主要介绍一下内容: 1.Entity Framework Code First在什么情况下会建立表之间的多对多关系,以及建立多对... 阅读全文

posted @ 2013-01-18 20:25 刘凯 阅读(4008) 评论(1) 推荐(2) 编辑

2013年1月17日

Entity Framework Code First 学习日记(6)-一对多关系

摘要: 很感谢王胖子2012同学的具体建议,从这次日记开始,我会在日记的开头介绍一下这篇日记的主要内容并给代码加高亮显示。好的,让我们切入正题。这篇日记我将介绍Code First将类之间的引用关系映射为数据表之间的一对多关系的默认规则。主要包含以下两部分内容:1.Code First将类之间的引用关系映射为数据表之间一对多关系的默认规则。2.用Fluent API更改外键的nullable属性和外键的名字。3.用Fluent API建立两个一对多数据表之间的多个外键。4.用Fluent API设置级联删除功能。1. Code First处理一对多关系的默认规则在详细介绍Code First的默认规则 阅读全文

posted @ 2013-01-17 21:22 刘凯 阅读(6363) 评论(3) 推荐(4) 编辑

2013年1月15日

Entity Framework Code First 学习日记(5)

摘要: 我今天要介绍怎样使用Entity Framework Code First的高级配置功能来处理domain driven design 中的另一种重要组成部分:Value Object,中文翻译过来叫做值对象。 所谓的值对象就是一些没有生命周期,也没有业务逻辑上唯一标识符的类。哪些类是Entity,哪些类是Value Object不是固定的,取决于具体的业务逻辑。比如说Customer这个类,如果... 阅读全文

posted @ 2013-01-15 21:58 刘凯 阅读(4383) 评论(6) 推荐(3) 编辑

2013年1月14日

Entity Framework Code First 学习日记(4)

摘要: 因为家里有点事,就耽误了随后的更新。很抱歉让大家等了好几天,我就不再耽误时间了,让我们马上切入正题。上次日记中我跟大家提前透露了这篇日记将介绍一些与DbContext有关的内容。廖羽同学问了两个问题,他问的问题正好是我这次要讲的,我们怎么配置DbContext的子类访问的数据库的位置。我相信大家最经常使用的数据库位置的配置方式就是配置文件了,也就是通过App.Config 或Web.Config来配置要访问的数据库。Entity Framework Code First同样也可以通过配置文件来配置要访问的数据库的位置。我们可以再配置文件里添加一个连接字符串的配置来定义数据库的位置<con 阅读全文

posted @ 2013-01-14 15:19 刘凯 阅读(7522) 评论(10) 推荐(5) 编辑

2013年1月10日

Entity Framework Code First 学习日记(3)

摘要: 我在上一篇日记的最后已经预告了,我这次将给大家介绍一下如何将Fluent API的配置组织的更好,更利于维护,但是一位“特别”同志迫不及待地揭晓了谜底,那么就让我们来看一下Fluent API的另一种使用方式吧。 我们项目中的domain中一般都有很多的类,如果我们把所有类的代码都写在DbContext子类的OnModelCreating重载方法中,那么这个方法将会非常庞大,并且各个类的配置都混杂... 阅读全文

posted @ 2013-01-10 21:57 刘凯 阅读(5776) 评论(12) 推荐(6) 编辑

2013年1月9日

Entity Framework Code First学习日记(2)

摘要: 本来打算每天都更新的,但是昨天项目上有点事情,也就忘了。跟所有想继续看的朋友说声抱歉,我保证以后会每天写一篇的,请各位放心,不会有始无终的。 相信通过上次的实例,大家已经知道了Code First怎样使用默认的约定进行各种数据库的映射。但是我们的类既然是根据domain driven design进行设计的,那么所有的类必然都是根据domain进行设计和开发的。我们不可能要求这些类都去遵守Code... 阅读全文

posted @ 2013-01-09 22:03 刘凯 阅读(7169) 评论(11) 推荐(5) 编辑

点击右上角即可分享
微信分享提示