• Friends, this is the second and final part of our TWU stories, it is more concentrated on techniques. And also pubulished on the local IT magzied "Programmers"

      ThoughtWorks University 取经第二记


    接 续上一篇文章关于ThoughtWorks 公司文化和敏捷开发思想的传承,这篇文章主要描述的是我在ThoughtWorks University所接受的敏捷开发技术培训的内容和方式,在一些介绍中会穿插一些对我的真实工作所起到的影响。下面就请跟我一起走入TWU的课堂。

    ThoughtWorks对于技术培训的方式很特别,总体感觉是更频繁的获得反馈保证更高效的沟通。其中值得一提的是每周一进行的“期望与担忧”和每早的“站立会议。期望与担忧进行方式很有趣,每周一一到你会发现老师在墙上挂了一张大白纸上面写着一周我们将要学习的课程,每个课程下面都有耐人寻味的留白。从老师简短的介绍里得知,他是想通过这个环节与学生进行第一轮的互动。我 们用颜色不同的贴纸用以表示不同的寓意,正如照片所展示的,所有学员会用十五分钟的时间,审查每一个课程的名称,然后在红色的(代表担忧)或者绿色的(代 表期待)贴纸写上内容,并贴在相应的课程下面。例如,所有学员对于叫做“编程中所用到的设计模式”的课程就会有“什么叫设计模式?”,“我怕我无法辨别什 么时候使用设计模式”等各方面的担心,而也会有“我想上课的过程中编程体验一下设计模式的应用”,“我要学Strategy 模式”等方面的期待。而每堂课结束的最后几分钟,老师们会审查这些期望与担忧,看看自己所讲得内容是不是覆盖到了各个部分。这个流程所起到的效果就是让学 员们有针对性的去上课,在上课前就思考一下自己想获得什么,都会有哪些困难从而达到了良好吸收知识的效果。每天早上的“站立会议”也很有意思,之所以叫站 立会议是因为大家开会的时候都站着,这样大家就会集中精力,好好利用每一秒钟的时间,以便不用站得太久累到自己。在站立会议的时候,我们会站成一个大圈让 彼此能够正面相对,为了避免大家争抢说话,每个人要说话的时候都要拿一个标志(学员们用的是我们自己命名的俄罗斯吉祥物──小象Gima)。站立会议的基 本内容是你昨天都学了(或做了)什么,今天打算干些什么,以及老师从“垃圾袋”中翻出的另学员“谈之变色”的回顾问题(其实回答不出来只不过吐吐舌头罢 了),比起这些我个人认为最重要的是站立会议是一个信息共享的渠道,这个时候是最好的分享经验心得和寻求帮助的时候,这种有效沟通的方式可以让你一天的工 作效率大大提升。好了,下面就该进入真正的主题了,看看ThoughtWorks是怎么进行软件开发技术的培训了。
     




    老师给我们准备了,TDD(Test Driven Development测试驱动开发)、结对开发、面向对象编程、测试与Mock、重构、自动化测试、持续集成等课程大餐。通过学习这些知识和技术,使所有学员可谓真真正正窥见了软件开发的流程,为以后在工作中大战拳脚打下了扎实的基础。即使是针对这些具体的技术培训,与国内大学所使用的以讲为主的授课方式完全相反,ThoughtWorks 采用让学员主动参与,随时提问,动手实践,及时总结等方式,争取让每次课程的内容被消化在课堂上。我们培训的地点就是公司租用旁边一家五星级酒店的会议 厅,整个大厅非常宽敞,学员们可以随时更换自己的位置,老师们平时使用投影仪和白板进行授课,如果需要他们会坐在学员旁边亲手指导,学员在实践过程中有了 问题,也可以立即跑到老师跟前询问解决方案,这样的环境非常便于学员之间、学员与老师之间的交流。例如在培训测试驱动开发的时候,老师并没有立即告诉我们 什么是测试驱动开发,而是让我们分成四个小组自己讨论二十分钟,每个小组在大厅的一面拥有一个白板,讨论结束后每个小组选派一个代表,根据白板上的记录向 所有学员和老师介绍你们小组理念中的测试驱动开发是什么,如下面的照片所展示,Kunal正在向全体同学介绍他们小组的观点,而所有其他的学员随时可以提出质疑,老师也可以纠正一些错误的观点。经过小组讨论的环节后,老师会对大家所阐述的各种观点进行查漏补缺和总结,通常总结的行为方式也是多种多样的,有可能直接用大白纸写出来然后贴在墙上,也有可能用思维图的方式画在白板上等等,这些方式都增强了我们收集内容的可视性也使讨论过程更高效。最后,老师再现了一个用测试驱动开发的完整实例,反复的强掉了测试驱动开发中设计大于测试的理念──即用测试书写你的思想,用代码实现该思想,而不仅仅只是一种测试开发方法
    的原理。这种让学员积极参与和进行演讲的教学方式,使得所有人对教学的内容都有了自己的理解,并深深地印在了脑海中。


    其实对于ThoughtWorks,结对并不仅仅是应用在编程中,我们几乎做什么事情都结对,老师们结对讲课,学员们结对演讲,结对研究新技术,结对做课后作业,当然还有著名的结对编程了。结对的方式促使我们更频繁的沟通,更高效的知识分享,这 也是为什么我在上文中使用了结对开发而不是结对编程这个词的原因了。很有趣的事情是,老师们在上课时给我们传授结对思想的时候,让我们讨论的主题是结对的 好处和坏处。当被问到结对有什么坏处的时候,学员们怎么想都想不出来,没想到身为资深开发者的老师Khali大声地说到:“结对编程非常的累,因为你总是 全神贯注,而且总是有人盯着你,你必须工作呀。每天结对完之后,我都累得不想动了,当然结对的时候还是很有趣的。”对于这样的诚恳的答案所有的学员都爽朗 的笑了起来。回国后在ThoughtWorks项目管理产品Mingle团队的实际工作,让我体验到了结对的种种好处,业务分析员结对给我介绍软件的各种 功能,让我很快的了解到我们要做什么。资深的开发者跟我结对编程,保证项目进度的同时,也教给我许多编写代码的知识和技巧,更值得一提的是让我学会了他们 遇到问题的思维方式和解决问题的处理方法,这如果靠一个人独自摸索,真的不知道要花多长时间。直到工作几个月后,才真正理解到结对给团队带来的巨大好处, 当然每天也的确很累。


    面向对象编程、测试与Mock、重构都是敏捷开发方法中所涉及的具体内容。ThoughtWorks University的老师通过两个小故事的开发让我们真的体会到了为什么以及什么时候使用与之对应的技术。老师们用一个关于飞机场的开发素材让我们了解 到面向对象编程中良好的封装性、单一职责原则、Liskov 替换原则(LSP)、递归算法、Strategy设计模式等开发知识。另外一个关于停车场的开发故事,让我们了解到了Mock对象在测试中的使用、重构的 必要性和艺术、Composite设计模式等知识点。拿飞机场故事为例,老师们在课堂开始的时候会给我们描述完整故事的一个小部分,然后每次给每个结对 (Pair)十分钟的理解需求和发问时间,五分钟的设计时间,十五分钟的开发时间;在开发的过程中要灵活的使用测试驱动开发、结对编程和重构的各个技巧; 在每个开发周期之后,如果没有任何一个结对完成了功能,则进行下一个十五分钟的开发周期,否则就会请一个结对上台展示他们的代码,在展示的过程中首先运行 测试保证功能全部完成,然后由该结对的成员讲述他们的实现思路和具体方法,可以随时发问和提出更好的方案,最后老师会进行总结并展示自己编写的代码以供大 家仔细分析。还有一点在培训开发方法的时候非常值得注意,其实对ThoughtWorks有过接触的朋友通常对ThoughtWorks的开发人员有一点 印象非常深刻,就是他们是一群使用开发工具尤为流畅的群体,他们不但可以熟练的运用各种开发工具,更能够飞快的使用工具的快捷键进行代码的编写。其实我们 在实现这些开发素材的时候,老师专门给我们培训过相关工具的快捷键,并且把最常见的快捷键书写在大白纸挂在我们的头顶,我们只要抬头便看得见,真正在开发 的过程中我们也会很努力的使用这些快捷键,很快得就可以灵活运用了。使用快捷键可以极大的提高开发速度,而且它更有助于开发者保持开发思路,如果你使用快 捷键非常熟练,往往在开发的过程中,不需要思考就可以实现几个视图、类的切换,否则使用鼠标时为了寻找按钮的那段停顿期,往往会让你的思路受到干扰,这也 可能是为什么那么多ThoughtWorker为快捷键乐此不疲的原因之一吧。

    自动化测试、持续集成是敏捷开发技术中的重中之重。在ThoughtWorks University的培训课程中我们会学习,利用JUnit编写单元测试,利用Selenium进行功能性测试,利用Ant编写运行自动化测试的脚本,利用Subversion进行代码的持续集成,
    使用Cruise(或Cruise Control)作为自动化构建的工具等课程。老师给我们传授这些知识的的 最佳方法也就是让我们实际在开发过程中演练这些技术和工具。其实这些课程展现了在ThoughtWorks的真实工作流程:我们在测试驱动开发的过程中通 常会使用测试框架(JUnit)先编写测试,在开发完一个简单的功能后,会运行测试脚本(Ant),在本地运行所有的测试以确保编写的代码没有对别的功能 有所破坏;然后会用版本控制工具 (Subversion)将代码提交到代码库中;代码库中还包括测试人员编写的Selenium测试脚本;这时自动化构建工具(Cruise)就会开始自 动运行所有的测试,如果失败会给团队亮出红灯,表示软件处于不可用的状态,这时团队的成员就会集中精力来解决错误,自动构建工具还可以自动生成可运行的软 件以供客户试用。总之,代码库中的软件始终要处于可运行的状态,这在某种程度上也保证了用户可以直接试用软件,从而提出有价值的回馈信息。在 ThoughtWorks中国分公司有很多关于持续集成的小故事,其中最有趣的是同事李晓告诉我的关于一个下午听那首经典的“Only You”的故事:李晓根据构建的情况开发出了一个构建结果自动提醒的语音程序,如果构建失败就会播放指定的歌曲和最后提交代码的开发者的名字,有一次某人 提交了一段代码使构建失败了,结果始终找不到错误的来源地,整整一个下午办公室都激荡着这首著名的歌曲和某人的大名,据他所说那个时候该团队空前的一致集 中精力找错误。在ThoughtWorks中跟这些很有创意的同事们一起工作,总是会有新的惊喜和收获。

    最后的测试──项目评估

    前五周的知识积累,使所有学员都迫不及待的希望在某个项目上灵活运用一下,这就是最后一周的实战内容──一个公司内部使用的项目这 个项目完全由学员自行开发,老师们扮演客户的角色,开发结束后会直接供公司内部使用或者由别的团队接管继续开发。在紧张的一周开发过程中,所有学员每天九 点到下午三点是实际的开发过程,下午三点到五点是向客户展示,询问意见,以及对当天团队情况进行总结和信息回馈的过程。每天学员中都会有人扮演 IM(Iteration Manager)负责管理开发的具体事宜,首席BA(Business Analyst业务分析员)负责所有BA事宜的决断,首席DEV(开发人员)管理开发团队,首席QA(测试人员)调空测试人员的任务。各个不同的领导者角 色每天都会在不同的学员中进行轮换,以满足绝大多数愿意尝试管理角色的学员都有机会尝试。整整一周的评估,真正地体验了什么叫“魔鬼客户”的难缠程度,也 许老师们的目的就是让我们体验一下大强度、高压力、多任务的工作环境。第一天,意料中的混乱,有人把未经测试的代码提交到代码库中去了,所以构建库对我们 展示了一整天晚霞般红通通的笑脸,在当天的展示阶段,我们战战兢兢的向脸上阴云密布的客户展示了惟一一个能拿得出手的开发功能。不过当天之后的总结和信息 反馈阶段,学员们一起努力提出了很多有效地解决方案,之后的每一天都会有很大的改观,最后我们成功的提交了七个完全复合客户需求的功能,老师们对我们的表 现也非常的满意。终于,我们成功的毕业了!!!



    总结
    其 实还有许多有趣的故事还记忆犹新,比如为了驱散每日中午的困顿,大家会把各个国家的游戏集合起来,每天中午都一起玩一个,我们称这种活动为“振奋精神”; 每天下课后都会有学员自己主持的技术介绍演讲,学员可自愿参加,切身体会一下当前又新又优秀的各种技术,从而更好地面对自己即将到来的工作。就这样思维活 跃的人走在了一起,迎面遇到的每一个困难都去努力解决,大家团结在一起体验了一次软件开发的盛宴,最后告别终究还是会来临,不过美好的记忆和所学的知识却 永远的伴随左右。仅以此文献给我ThoughtWorks University的各位好友,同时也希望本文对各位读者能有所启迪。

  • This is another article written by me published on the local IT magzine Programmers. Sorry my freinds in other countries, it is written in Chinese. It is about our stories in TWU. To be honesy(yeah, again and again), I miss you guys.

    这篇文章可能与程序员上的略有不同,因为后来L MM 帮我改得更好了,不过这是我的Blog 所以贴出来的自然是原文

    ThoughtWorks University 取经记

    四月份我加入了ThoughtWorks公司,由于是应届毕业生的缘故,紧接着就被派到印度班加罗尔分公司进行了六周的公司培训。六周的生活是紧张、繁忙而 又非常开心的,不但与敏捷开发方法进行了亲密接触也结识了许多聪明、勤奋富有激情的外国同事。在这六周的生活中,前两周主要是进行公司文化和敏捷开发思想 的培训,后三周就主要进行技能的培训,最后一周是给所有培训的ThoughtWorker一个项目,来评估整体培训的结果。培训这些内容的主要目的是让新 员工尽快的融入到公司文化中,成为公司的一份子;还有就是理解敏捷软件开发的原理并亲身体验真正的敏捷软件开发方法,从而体会到这种开发方式的种种好处; 最后的一个目的当然就是增强新员工的技术水平。本文会分为两部分,第一部分介绍ThoughtWorks对公司文化和敏捷开发思想的培训,第二部分介绍 ThoughtWorks针对具体的团队开发技能是如何进行培训的,全文中会穿插一些真实有趣的小故事以及我对相应培训的一些感想。

    公司文化的传承

    对ThoughtWorks有所了解的人都知道,公司的文化都是围绕人与人之间的平等、尊重和加强沟通这几个方面的。作为一个新员工,给你带来的最大感受就是公司自由平等的氛围和人与人之间和谐友好的关系。

    这些平等、自由的思想当然会渗透在培训课程的点点滴滴之中。第一天的课程中,我们就做了很多的游戏,其中有两个很有趣的游戏,第一个游戏是老师们给每个人发 了一份表格,上面写了二十多条内容,每一条内容会对应一位老师或学员,例如会有这样的内容“有一个人拥有iPhone”,“有一个人的体重小于50公斤 ”,或者“有一个人要坐超过二十小时的飞机才能来到班加罗尔”等等,这些问题每一个都是特别设计的,而你的任务就是要在五分钟之内将所有的内容与人对号入 座。游戏开始的时候,大家跑得跑,叫得叫,笑得笑,整个大厅沸腾了,好不热闹,最终有一两个学员将所有人对号入座,然后大家就集体将所有匹配的结果大声朗 读了出来。其实到底谁赢了游戏,并不重要,真正重要的是在这个过程中,大家增进了了解,进行了有效地沟通,如果你都不了解你的团队,那如何进行软件开发 呢?从这一个简单的游戏,我们所有学员和老师,就从陌生人向朋友迈进了一大步。第二个游戏叫做“人人都会犯错误”,传达的人人平等的理念更加强烈一些。游 戏规则类似于中国饭桌上经常玩的报数字(遇到含七的数字和七的倍数要说Pass),只不过我们加了一条,就是在你犯了错误后,要大声地说“YES”,同时 手脚并用的摆一个姿势,然后站到圈的末尾。结果在游戏的过程中一位印度裔的老师Reshema经常出错,长相可爱的老师Reshema再加上大声吼叫的 YES以及怪异的手脚并用姿势,把所有人逗的前俯后仰。这个游戏使我们明白了,犯错误是很正常的事情,你没有理由去责怪别人,ThoughtWorks也 是允许你犯错误的,关键是犯了错误你从中能学到什么,以及帮助别人怎么从错误中进步。

    其实公司的第一堂课根本与敏捷软件开发和技术无关,可能大家根本无发猜出是讲什么的,连所有的学员都很惊讶公司培训的第一堂课,竟然是告诉我们什么是公司认为 的歧视和不平等,在这一堂课中,老师会提出一些问题来让学员投票,让我们分辨什么是歧视和不平等,然后再给出公司的答案,如果大家有疑问可以充分的表达自 己的意见,然后再投票。从这第一堂课的内容就可以看到ThoughtWorks是何等的重视人与人之间的平等和尊重了。注重人与人的沟通也体现在公司文化 的各个方面,最简单的一个例子就是宿舍的安排,我本想着可能是不同分公司的员工会住在一起,没想到刚下飞机就得知自己会和一个澳大利亚的同事还有一个印度 的同事住在一间公寓里,这对于英语不是母语的中国人来说,也真的是捏了一把汗。但是仔细想想,这样的住宿方式,不但会加强不同学员之间的交流,而且可以更 好的了解不同区域的文化,了解你将来可能一起工作的同事,了解他们的想法和行为方式,这样才可能达到真正的尊重和平等。

    了解ThoughtWorks的人可能都知道,平等和尊重在公司的极致体现不能不说是那些公司的领导层了,每一期学员培训,Roy(不要说你不知道Roy是 谁啊)都会单独做一次演讲,其中的主要内容包括创建ThoughtWorks的原因和历史,公司经历过哪些困难以及他本人的一些传奇经历。Roy的演讲是 很有趣的,不过学员们提的问题更加有趣,我和我的舍友就提了一个“假如你被绑架了,你会怎么办?”的离奇问题。结果Roy的回答让人瞠目“其实我是被绑架 过的!”然后他就娓娓道来那一次班加罗尔分公司的ThoughtWorker是如何乔装成绑匪,然后在飞机场对Roy实行了一次“绑架”,之后Roy又爆 料出许多被ThoughtWorkers戏弄的故事。从这些Roy的小故事中,你可以发现公司的头头脑脑们,喜欢和员工打成一片,有的时候他们会上来拍你 的肩膀然后叫你的新外号,有的时候他们会跟你谈论他们最近的尴尬经历,甚至吃饭的时候他们也会被员工灌醉。可见平等和尊重的理念已经深深的植入 ThoughtWorks的文化精神之中。

    ThoughtWorks公司的平等和尊重还体现在公司的管理很透明,甚至包括财务收益、开销等信息都会公开的呈现在新员工的面前。印象中
    关于管 理很透明有两个小故事很深刻,其中之一就是第一周一门课程的内容就是将公司这几年的收益和开销完完整整的展现在所有员工的面前,包括总共有多少收入,总共 有多少支出,这些支出用在培训、新建分公司、股东收益等等方面的具体支出数目,并且在课程的最后每个学员还要扮演公司财务部门的角色,模拟体验一下公司财 务部门是如何进行资金运转和保证现金流的。第二个故事就是Roy在他的演讲中提起了2001-2003年公司曾经裁员的事情,原因就是当时IT产业大萧 条,公司处于窘境,Roy说那时是他最为困难的时期,直到现在都很内疚,仔细想想在绝大多数的公司中,这些内幕消息哪是一个刚进公司还不到十天的人可以接 触到的,但是ThoughtWorks确毫无保留的给我们展现在眼前。其实管理的透明在回国后,也时时刻刻都可以体验到,ThoughtWorks 北京分公司每月都会做一次月报,让全公司的同事都知道这个月我们分公司的经营状况。对于我们这些新员工,在短期内就对公司的各种状况有了一个整体的了解, 从而很快的建立起了一种强烈的主人翁精神。

    敏捷软件开发思想的传承


    对于前两周敏捷开发思想的培训是非常有趣的,几乎每节课都有互动的过程,每节课都会有生动的实例让你体验到什么是真正的敏捷软件开发,为什么要使用敏捷软件开发。

    在介绍整体培训的过程之前,首先介绍一下ThoughtWorks敏捷软件开发团队的构成。一般一个开发团队主要有以下几种角色:PM,Project Manager项目经理;BA,Business Analyst业务分析;DEV,Developer 开发人员;QA,Quality Analyst测试人员。PM对项目进行全局掌控(有的时候,还会有IM,Iteration Manager对具体的迭代开发进行掌控);BA,主要与客户进行沟通和业务分析,与开发人员进行交流,与测试人员对整体功能进行讨论等等;DEV,主要 就是开发应用程序,但同时也要协助业务分析员和测试人员进行工作;QA,主要对开发人员开发出的系统,进行全方位的测试,包括功能测试、性能测试等等。对 于团队整体的开发流程,是一个有序、小步、渐进的过程。ThoughtWorks对敏捷软件开发思想的培训也主要针对如何了解用户需求,团队共享代码,迭 代开发,总结与回顾。

    在软件开发的过程中,能够准确的理解用户的需求,将用户的需求转变为开 发团队理解的用例,是一件紧迫而重要的事情。但是,如何才算好的理解用户的需求呢?如何能让我们这些从没与客户打过交道的毕业生尽快的学会与客户沟通的方 法呢?这就是我个人非常喜欢ThoughtWorks University的一个方面,在敏捷软件开发的所有课程,包括对需求理解的课程,设计的非常精妙,不但能够让这些观念深深地扎根人心,而且能让你体会 到真正的软件开发其实就是应当这样做得。我们上过一堂用橡皮泥做电话的课程,老师们把大家分成许多小组,每个小组由3-4个学员和一位扮演客户的老师组 成,老师们扮演的客户是非常的苛刻的,我们的任务就是要做出让客户满意的电话来,每一次开发的过程只有十五分中,分三次开发完成一部完整的电话。在整个开 发的流程中,我们体会到客户的需求是随时改变的,当他们看到了原型系统,甚至可能推翻之前的所有需求,这时候作为一个开发人员或者业务分析人员,在你了解 客户的需求过程中,不但要求你具有能够充分理解客户需求的技巧,更需要你能启发客户思考一些它们没有想到的方面,从而少走一些弯路。在制造电话的过程中, 我们几个小组在第一个开发周期的行动,几乎都是闷头造电话,完全忘记了我们有一位客户坐在我们的桌字旁,当我们有疑问的时候,为什么不去直接找客户进行沟 通呢?老师向我们提出了这样的问题后,我们在后面两次的迭代中,和客户进行了频繁的沟通,最终做出了让客户满意的电话系统。下图就是我们做出的橡皮泥电话 系统之一,你看Reshema老师拿着电话,多么高兴。


    在有些人的眼中,ThoughtWorks是一群拿着卡片到处贴,到处走的奇怪人群组成的软件咨询公司。其实为什么使用卡片作为理解用户需求的主要机载体, 在我去TWU之前也很疑惑。后来,在一堂介绍如何使用卡片理解需求的课程中,终于了解到原来其中包含了这么多奥妙。首先卡片很小,这就迫使业务分析员不能 将太多的内容放在同一张卡中,由于一个迭代周期通常是两到三周,需要给用户展示一些能用的系统功能出来,这样就会引起整个团队思考许多有价值的问题,什么 是最紧要的?什么是系统的核心?我们要用多长时间来完成这些卡片上的内容?第一个迭代周期能完成多少卡片?我们的团队开发速度是多少?等等。其次,卡片在 卡片墙上是可移动的,因此它很灵活,就如下图所示,可以将卡片放置在不同的队列中,通常我们用“在分析中”、“在开发中”、“在测试中”、“结束”等一些 状态表示卡片所处的不同状态。这样,当所有团对人员,需要了解当前项目的进度状况时,只要站到卡片墙前,就可以一目了然,如果处理不同卡片的小组需要彼此 沟通,在卡片墙上,可以用最快的速度找到相应的人员,甚至,当你有疑惑的时候,卡片可以拿下来仔细研究,只要记得最后放回去就好。卡片的最后一个优点就是 对当前项目进行评估,举一个简单的例子,当一个团队的开发状态是绝大多数的卡片都集中在“在开发”的队列中,就表示当前开发团队处于业务分析员和测试人员 无事可干,但是开发人员又过于繁忙的不健康状态。什么原因导致的呢?可能是开发速度过慢或者是业务分析员写的卡片粒度过大,导致开发人员无法及时的完成。 由此,当我们站到一个团队的卡片墙之前,我们看到的不仅仅是一些简单的卡片,更是整个开发团队的开发状态的展示。一张张小小的卡片却包含了如此多的内容, 这真的是我们始料不及的。当然卡片并不是完美无缺的,对分布式团队开发就是卡片墙的致命弱点,但这些问题在ThoughtWorks的Mingle软件中 都得到了很好的解决,卡片对我们来说更是一种以用户为中心,以团队沟通为中心的开发思想,而不仅仅是一种开发方法。
    针 对眼前的需求,小步前进,不做过多的设计,也是敏捷软件开发的核心思想之一。ThoughtWorks University通过一个早上的摆积木课程(Lego Game)让我们充分的理解了过多设计的弊病。这次课程的整体任务是创造未来物种,类似于造电话课程,同样分为三个迭代周期,有一位老师作为客户伴随着我 们进行开发。这一次,老师们一下给了我们许多点数不同的需求,每个需求对应一张卡,每张卡上有不同的分数表示这张卡的难度,每次迭代有五分钟的讨论,需要 确定这次迭代都要完成哪些功能,有十分钟的设计,还有十五分钟的开发过程,每次迭代后大家要讨论哪些做得好,哪些做得不好的地方。第一次的迭代往往是犯错 误最多的地方,我所在的小组向客户许诺了总共加起来十分的卡片,在设计过程中又做了许多不必要的假想,过多的专注于给未来的需求留下余地,而将自己开发的 过程束缚住。最后仅仅搭起来了动物的头和身体,可是客户要求的是一个完整的动物,所以第一次迭代我们只有零分,客户非常的失望。ThoughtWorks 就是这样,通过学员的犯错误,让我们自己体会,然后通过讨论,让我们自己总结出具体的方法,老师们则是在旁边指引,这样的感受怎么能不深刻呢?经过讨论, 我们制订了自己的方针:少许诺,少设计,好好做核心模块。就这样,最后我们创造出了未来的一个物种(还有它的孩子)。

    迭代的过程也是ThoughtWorks进行敏捷过程培训的一个重要方面。还是继续我们的游戏旅程吧:这一次老师让我们分成三个小组,分别从培训大厅的一端 将气球搬运到另一端,每一组有两个人负责装运,两个人负责撑袋子,一个人负责搬运,哪一组能在最短的时间内,将最多的气球从一个口袋中运到另一侧的口袋中 就算胜利,如果过程中任何气球掉在路途中,则不可拾取。第一次的规则是只能运一次,整个过程给人的感觉就是搬运的人花了很多的时间,承担了过多的责任,而 其他的四名队员起不到任何的作用,只能边喊边焦心的等待。第二次的规则几乎与第一次一样,但搬运人可以多次的运输。结果第二次,我们不但出色的运输了所有 的气球,而且还比第一次所花的时间更少。玩完游戏的讨论过程中,我们逐渐的明白了,第一次运输就好比传统的瀑布式开发,开发人员承担了许多的压力,缺少沟 通和其他人员必要的帮助,闭门造车造出来的东西,往往并不是客户心目中想要的东西;而第二次运输就好比多次迭代的开发过程,开发人员得到更多的信息回馈以 及业务分析员和测试人员的帮助,因此能够开发出更好的软件产品。就这样,我们不但理解了迭代开发的原理,更通过亲身的体验明白了这样做是行之有效的。

    不得不提起的回馈信息

    加 入ThoughtWorks以来,发现回馈信息是公司非常注重的一个方面。在TWU的生活中,不但学员之间两周会互相给一次书面的回馈信息,每周需要对这 一周发生的小到食物好吃与否大到老师的培训方式等都要提供回馈信息,平时课堂上即使给出的回馈信息更是数不胜数了。由于我们中国学员的母语不是英语,因此 在前两周培训的过程中,我们有的时候跟不上老师们的语速。结果在第一周五的回顾课程中,不光中国学员,还有许多我们新认识的朋友帮我们提出了这个问题,讨 论的结果就是我们不但在墙上挂起了“说慢点!”的大幅标语,还发明了一个手势用于提醒老师讲话慢点。回馈信息其实确保了大家都在尽自己最大的努力去做好每 一个方面,同时也培养出一种公正公开的气氛,让我们都朝着自己所树立的目标前进。

    总结

    现在想想,公司的一系列生动的培训课程,不但让我们了解公司文化的本质,更重要的是让敏捷软件开发思想深深的扎在了我们心中,我们看到了原来软件开发的过程 可以这样的丰富多彩。TWU的洗礼其实只是带我们入门,不过这些课程在我们真正进入项目后,才会逐渐发挥出一步步深远的作用,例如我现在从事的项目,就时 常让我想起TWU的课程中老师说的方方面面,再结合当前的亲身体验,可谓是获益匪浅。希望本篇的内容也能够对读者有所启迪。

     

  • 来印度一个多月了,和大家基本上都混熟了。先后也去了不少地方,其中印象最深刻的要数Mysore Palace 和上周末去野外郊游了

     Mysore Palace 是班加罗尔附近,比较有名的皇宫,不知道为什么印度的皇帝搬了出去,风景不错,就是小了一点点。比起北京和西安的皇宫是小了很多,但是异国风情吗,还不错滴,只可惜不让在里面照相,我只能在外面狂拍照片,给你们秀一下吧

    这是我到印度第二周的事情了,在这里的生活是紧张而充实的,平时白天是没有多少时间的,除了上课,还要自己准备一些session。晚上呢,大家吃完饭,如果有homework,还要写写homework,还要学习一下project simulation 要求的技术。周末又要参加各种各样的活动,所以基本上没啥私人时间,所以请不要责怪我这个月没有更新很多Blog

     上周末大家玩的很开心,但是Xiaona 带的防晒霜实在太糟糕了,害的我现在脸还是红红的,555555,身上和脸上都在蜕皮。。。。。。

    我们玩了攀岩,独木舟,印度垒球还和大家一起游泳

    放出一些照片

    这是Jai 在攀岩,可惜就是太短暂了,不过很刺激 

    这是我的Coach 和Elena 在玩独木舟

    我们一直在湖边玩到晚上,趁机照下这美丽的傍晚景色

    还有很多事情值得纪念,我就在这里简单的说说吧

    第三周去了孤儿院

    照片中的小孩叫Christian,旁边是最受欢迎和技术不错的Canadian boy Matt。看到这些孩子,觉得自己真的是很幸运的,当得知ThoughtWorks 一直在资助这些孩子的时候,心里对公司也产生了一层崇高的敬意。

    这是去Mysore Palace 那一天去了Bangalure 附近一个有名的天然野生公园,那里有很多漂亮的鸟,当然最让我开心的是近距离接触鳄鱼,哇哈哈

    当然还有运动啦,那就是保龄球

    最后就是狂欢啦,嘿嘿,Dancing 啦

    好吧好吧,透漏一点课程中很有趣的部分,Lego Game,这个游戏让我充分的理解了迭代开发的重要性(Trainer 就喜欢算计我们。。。。。。)

    好啦,今天就写到这里吧,基本上也把这一个月的事情都塞到这篇文章里了。这边都十一点多了,北京那边都2点多了,回宿舍洗洗睡觉啦 

  • I'm in India - [心情/记事]

    2008-04-09

    今天总算可以说闲下来一些了,所以上来更新自己的Blog,自从四号来到了印度,就一直忙于认识其他的TWUer,倒时差,处理一些在印度生活的事宜和苦练英语口语中

    先谈谈对印度的整体印象吧,来之前,不知道是不是那帮中国Office 的故意吓我,说什么班加罗尔是牛车与宝马并行,咖喱everywhere。来了之后才发现被骗了,都快一个礼拜了,在大街上就没见什么牛车么,倒是蹦蹦蹦everywhere。都说中国的出租车司机很彪悍,那是你没倒印度来,你要是来了就会发现,印度的司机那才叫技术高超,马路上很少有红绿灯,司机开车狂飙,还能让一辆车和另一辆车的距离不到一米 ,人想在两辆车之间插进去,想都别想!我们出去吃饭,经常是过马路的时间比走路的时间还长,还是祖国的traffic 更好一些啊~~~~~

    班加罗尔是这样的一个城市,城市很大,交通堵塞,超过十层的楼房很少,商业还挺发达的,不过远没有中国的规模,感觉像是十几年前的西安,发展中的城市,但是有些乱。不过值得一提的是,这里的人很好,可能是印度教的原因吧,偷窃抢劫,很少发生,只要你对本地居民客气,他们一般都很客气,对你也很友好和热情,这一点在中国是很少可以看见的

    来的第一天,就被安排到一个三室一厅的房间,有厨房,洗衣间,还有三个洗手间,由于我的客气,把一间洗手间在卧室里面的房间让给了Raph~~~后悔呀~~~我咋就那么大肚呢(哈哈,开玩笑呢,其实Raph 最近正在帮我练习英语口语呢)。冰箱里天天有专门的housekeeper 给塞的满满的,衣服也帮我们洗。哎,生活实在太惬意了。

    这就是我的Dear Roomate Raphael  帅吧,长发的呦?中国MM 不要流口水呀!

    第二天,trainer Khali 和Reshma 带我们十几个人去班加罗尔旅游啦,哇哈哈,公费旅游呀,后来还去了班加罗尔的酒吧,见识了印度美女呀,就是不敢拍照片呀,因为trainer 说,要尊重人家呀!

    这里貌似是市政府

    这里是印度大大神的神庙,具体的名字忘记啦,叫Ka啥啥的 ,印度人名太难记啦,索性忘记算啦,还是往脑子里装更多英语单词和程序的东东吧。说到这里,奇怪的是这里的神庙都不允许拍照的,所以只能出来照一些小的啦,毕竟咱去过了,不能白去啊!

    后来去了班加罗尔的一个公园,这个公园好小呀,难道是这个城市最好的么?不知道呀不知道。比起西安的兴庆公园可差远了呀

    然后又去了Tipu Sultan's Palace 好小的Palace,简直和中国的Palace 不能比呀

    最后,公费去书店和酒吧,哇哈哈,这就是在酒吧外面呢,看到没,BARTON,好多酒吧类~~~

    奇怪的水烟,味道一点也不重,被他们逼的尝了一口

    现在我正在边写Blog ,边让我的roomate 听中文歌呢(反正他们根本看不懂我在干啥,是不是欺负他们了?我好邪恶哦,哇哈哈),哦,对了忘了说了Sanjay 是我另外一个dear  roomate ,是个很年轻的印度男孩 ,有前途呦

    后面几天的日子过的很快,shopping ,上课,这周据说trainer 要带我们去看电影和吃饭,估计又要去酒吧吧,呵呵,后面的故事慢慢告诉你们呦,my  dear  friends

     对了,忘了说了几件,重要的事情,印度的蚊子很凶猛,简直要吃人了,还好公寓有防护罩,印度消费很便宜,一天消费平均下来最多200 Rupys,也就是不到40人民币的样子吧, 生活很充实,印度英语超级难懂,可是我就不明白,为啥欧美人能听懂呢?好好加油练英语吧,我觉得现在,英语反而是最大的障碍了,技术反而成强项了......在中国office,技术菜菜,英语还不算差的呀,55555555

    好了,今天就写到这里啦,以后有空,再继续。

    下一篇要写完有关XMPP 的了,隔久了,就不能好好总结了