• 2010-02-07

    成长在外

    有一天,和米高聊起了在外工作。因为工作的关系,我们已经有很长时间都没有坐在自己公司的办公室里面,好好写写代码了。在外面时间长了,心理是非常疲惫的。我早就表达过自己不喜欢在外工作

    凡事有利有弊,虽然不情愿,但在外工作的这段时间,确实也是我“被成长”的一段时间。

    参加工作的第一年,有一次,我出差到北京。刚到宾馆把东西放好,项目负责人就把我叫到了现场。
    项目负责人:你把程序装一下。
    我:什么程序?
    项目负责人:就是我们的程序。
    我:我没带。
    项目负责人:你干什么来了!

    当时,项目负责人的咆哮让我恨不得找个地缝钻进去。幸好,第二天来的同事把程序都带来了,没有造成太大的损失。从那时起,我开始知道什么叫责任。

    从2008年12月份至今,我以咨询师的身份在外工作了10个月。之前写过的《和客户一起学习》是我那段时间的学习总结。如果说在上海的工作让我更深刻的理解敏捷,开始关注人,那么在西安的工作,让我开始思考大团队的运作,关注人的成长。想到的很多内容,在blog上或多或少的体现了一些。

    在西安这段时间,因为工作的原因,我经常有机会接触到一些客户的领导。为了不在他们面前显得太白痴,我这个从来对管理不感冒的人开始读一些管理、系统化思考等方面的书。得益于这些内容的帮助,我不再以单纯的程序员角度看待问题,也可以更好的理解人们做出种种决定的原因。

    每个人内心都有一个舒适区。对我而言,公司就是个舒适区。坐在公司工作,我会感觉很放松。出门在外,离开了心中的舒适区,会有很多不适,内心而言,会很痛苦。正所谓“生于忧患”,痛苦逼迫我不断调整,适应这个新环境,一段时间下来,就不知不觉成长了。虽然可能学到的不是我预期,但回过头来看,很多东西是有益的。

    出门走走,呼吸一下外面的空气是有好处的,在外被成长也不全然那么糟糕。

  • 这个周末在办公室做了一个Mini CodeJam,不同的是,参与者是“预备役”ThoughtWorker——即将于今年加入公司的毕业生。

    我们这些“现役”ThoughtWorker分别扮演客户和教练的角色:客户雄心勃勃,也非常强硬,不断对开发团队提出自己的要求;教练只是告诉团队基本的开发过程,不过多干预,尽可能让团队展示他们自己的东西。

    不出所料,开发过程非常混乱。结果更糟糕,没有交付哪怕一个Story。

    能够通过我们层层面试,这些预备役每个人的个人能力都是很不错的,但是,把他们放到一张桌子上开始进行开发,客户不断在身边催促,他们就完全陷入混乱。

    团队冷静下来进行回顾的时候,总结了很多做得不足的地方:
    * 虽然经常在和客户“沟通”,却没有搞清楚客户要的到底是什么东西。
    * 迫于客户压力,给出了一个自己臆想的估计,客户的胃口一下子就掉了起来。
    * 当客户问及进度,团队盲目给出答复,致使客户失去对团队的信任。
    * 整个团队一开始就动手写代码,没有对要做的工作进行一个分解。
    * 彼此没有很好的沟通,代码集成起来很困难。
    * 开发人员低头写代码,没有人关心Story的验收条件。
    * 整个团队没有人有风险的意识,deadline行将来临,没有人关心。
    * ……

    结束之后,我问了大家一个问题:同样的时间,如果一个人做的话,是不是会有交付。我看到很多人在点头。一群个人能力很强的人组成一个团队,甚至还不如一个人。这是个很值得思考的问题。

    设计这样一个Mini CodeJam,目的并不在于交付,而是让这些“预备役”意识到专业软件开发和自娱自乐之间的差异,鼓励他们去更多的学习。

    只是,这个Mini CodeJam折射出来的问题在很多“专业”开发团队日复一日的上演着。

  • 最近几个月改行做了“教育”。

    实施敏捷,关键点还在于能力提升上,而重中之重是开发人员的能力。客户的开发人员在软件开发上大多只能看到眼皮底下的一亩三分地,所以,为了开拓这些开发人员的视野,我们决定把业界一些常见的编程理念介绍给他们,让他们知道,原来编程不仅仅是堆积代码。

    交流的第一要务就是了解自己交流的目标,《程序员修炼之道》里的那首WISDOM离合诗就是为此准备的。这是一群只有C经验的人,大多数工作经验只有两三年,有不少人甚至是工作后才开始学习编程的。如果上来就讲面向对象的知识,讲软件架构,很少有人能够接受,虽然不会当面骂我,但他们会觉得内容很虚,况且他们每个人都很忙,所以,提供的内容应该是让他们认为值得花些时间了解的。

    这是一个有趣的尝试。我需要把自己脑子关于编程的那些理念拆解开,看哪些部分适合他们的程度,然后,结合他们工作的具体内容,组织介绍材料。开始的时候,我不知道按照这样的要求有多少内容介绍。幸好频度只是每周一次,两个月下来,我介绍了诸如代码坏味道之长函数、头文件、基本的函数、开发者测试等内容。从反馈上来看,这些内容确实让他们看到了一些不一样的东西,而且大家感觉很实用。开发团队也以这些内容为基础,制订了一些新的编码规范

    这次活动基本上是在探索“从只知道完成功能的代码到能写出Clean Code that Works“的路该怎么走。事实上,这也是很多程序员欠缺的。我从一个毕业生到能写出自己相对满意的代码探索了三年,而真正成为一个自己觉得相对比较职业的程序员,却是进了ThoughtWorks之后的事了,补齐了自己在测试和工作习惯方面的一些缺失。经过这次的分解,我逐渐了解了这条路应该怎样走过来。现在想想,如果当初有人告诉我这些内容,或许在开发方面可以成长得稍微快一些。

    随着这次分解,我对分解又有了多一些的思考。比如,如果一个人要想真正的TDD,绝不仅仅是按照红——绿——重构节奏就够了。TDD需要开发人员有测试的思维,养成先写测试的习惯,了解软件设计,对代码有灵敏的嗅觉,可以嗅到坏味道,并进行重构。对于一些与遗留代码打交道的人,还需要了解,如何在遗留代码上进行开发。

    分解动作,给了我一个思考成长过程的机会。

  • 再见Thoughtorks!

    这是Derek,一个离开ThoughtWorks同事写的一篇blog。

    我俩同一天加入ThoughtWorks,我记得很清楚,那天是2007年5月8日,当时,办公室还在西安。正是因为同一天加入,我们最初有许多机会在一起交流:一起吃了到西安的第一顿晚餐,一起接受公司的入司教育,一起参加英语考试,一起找房子,一起打游戏,一起在ThoughtWorks成长。

    米高给他的评价是公司的程序员里最具诗人气质的一个。

    他给人的感觉永远是一副宠辱不惊的样子,他的文字如他的人一样。品味着他告别的文字,看着他自己总结在ThoughtWorks的成长,我不禁会回想自己一路走来的经历。我们之间有着一些相似的心路历程。最初的无知无畏,到随着经验增多而产生的诸多困惑。进入ThoughtWorks之前,累积了许多年的工作经验,在软件开发上有了属于自己的思考,总觉得软件不是那样做的,但应该是怎样做的呢?

    ThoughtWorks两年多的工作时间,我们逐渐走出了对做软件的困惑。在ThoughtWorks的收获,Derek的总结非常好:在ThoughtWorks的这段经历使我更关注问题本质、更注重解决方案的实效性,并且不轻易屈服于事物的表面现象而努力寻找并尝试改变。

    铁打的营盘,流水的兵,来来往往很多,只有获得真正的收获,才不枉走一遭。

  • 不知不觉,写blog六年了。趁着写这个第六年纪念篇的机会,我把之前的纪念篇全都翻了出来,回首一下六年走过的路。

    开始“信口开河”了
    一年百博
    梦想二年级
    三年blog
    300和4
    五年,在blogbus

    有了历史的东西很有趣,可以让人回顾,而回顾就会发现很多有趣的事情。

    开篇、第一年和第二年写在沈阳,第三年和第四年写在北京,第五年写在上海,而第六年,也就是现在,我则在西安。地点上的变化也多多少少反映了我最近几年的一个生活状态。之前,我很稳定,从三年开始了四处的漂泊,虽然第三年和第四年,我都在北京,却是在两个不同的公司,而第五年和第六年都是我出差在外的日子了。

    从一开始,我就不大相信自己可以坚持写下来,当一年一年走过来,我逐渐相信,blog已然成为生活的一部分。无他,习惯而已。我是个懒惰的人,一旦习惯,就会沿着这条路走下去。blog带给我很多:文字表达、朋友,机会、思考的习惯等等,因为这些好习惯,我“被成长”了许多。当然,也是因为懒惰,并不是所有有想法的东西,最终都成为了blog。

    偶尔回顾一下自己写的blog是件很有趣的事,看看曾经的思考,回味着当年的经历,虽然有时会觉得当年的自己很浅薄,但那毕竟是自己走过的路。也许再过几年,回头看今天的文字,也会有相同的感觉。

    做咨询,我知道了,不要轻易的对一件事说不可能。六年的blog经历告诉我,只要坚持就可以。坚持六年,我做到了我曾以为不可能的事情。继续!