• 2010-08-09

    旁观茶餐会

    之前咨询过的一个团队,有一个叫茶餐会的活动,顾名思义,大家坐在一起喝茶、吃饭、聊天。实际上,就是让团队里面说得算的人聚到一起,讨论一下团队遇到的问题。在我们还在咨询的时候,这个活动让我们有机会和各位领导做近距离的沟通,解决了在敏捷实施过程中遇到的问题。

    出乎我意料的是,我们离开后,他们把这个活动坚持了下来。得知我在,他们邀请我一起参加。时隔几个月,我也想了解一下我们咨询的成果,于是,我参加了这次茶餐会。

    老朋友见面寒暄一番是无可避免的。我给大家介绍了自己这几个月四处云游的经历,而他们则向我展示了工作成果。让我印象颇深的一点是,遥想当初,为了搭建CI,负责人四处找机器,如今鸟枪换炮,新的数据中心建立起来了,数千个CPU可用于CI,并发性得到了大幅度提升。

    当然,这些人坐在一起不是为了自我表扬的,大家开始讨论起问题,因为我和他们曾经在一起很长时间,所以,他们也不见外,不避讳的把问题摆了出来。只是这次,我不再是咨询师,而是一个旁观者。

    大多数人已经认识到诸如单元测试这些实践的益处,当初我带的一个团队,因为坚持了做好基础,和整个代码合在一起之后,错误极少。不过,团队的压力依然巨大,在压力面前,很多人还是会倾向于走回老路。

    无论如何,代码的基础在提高,却把另外一个问题暴露出来:需求分析。对测试的回溯会发现,很多问题是由于几方理解不一致造成的。团队里总有人抱怨需求不清晰,做需求的人也冤,原来就是这么做的。大家在一起讨论发现,原来之所以可以这么做,是原来团队的成员经验丰富,经过一次搬迁,原有团队的很多成员离开了,现在团队的成员经验要浅得多,那些潜经验消失了。

    人,人,还是人,人总是不够,怎么算都不够,需求分析的缺人,开发的缺人,支持的缺人。他们饶有兴致的问我,你们怎么做估计呢?实事求是。我看见了一丝无奈闪过,我知道,他们总要“挑战一下”。

    还是人,在讨论的过程中,有人表现极强的防御心理。无论别人给出什么样建议,他都会列举出无数的理由,说这么做会有怎样怎样的问题,总而言之,就是我还按照原来的路来走。这种情形,我在咨询过程中,见过很多了。其实,这样的人本身都会很有想法,在团队里面也有很大的影响力,一旦能够改变,会是巨大的推动力。

    作为旁观者,我乐得欣赏这样的讨论,大家开诚布公的把问题摆在台面上讨论,一起讨论解决方案,这样的团队是有希望的。

  • 启动翻译《Programming Scala》
    翻译《Programming Scala》


    《Programming Scala》离开我的视线已经有很长一段时间了。在即将遗忘自己曾经翻译过一本书之际,它出版了。出版社给了它起了个中文名字,叫做《Scala程序设计》。

    无论如何,它是第一本正式出版的Scala中文书籍,希望对大家了解Scala有所帮助。顺便附上自己写的译者序,分享一些心得。

    写代码的层次

    初涉代码之时,我的关注点在于实现功能。初窥门径的我,不了解语言,不熟悉常见的编码技巧。那时,只要代码能够跑出想要的效果,我便欣喜若狂,无暇顾及其他。

    积累一定经验之后,对于编写代码,我越来越有感觉,实现一个功能不再高不可攀。我开始了解在工程中编写代码,如何在一个系统而不仅仅是一个局部处理问题,如何解决各种bug,更重要的是,从中汲取教训,在编码中避免这些问题。

    读一些软件开发的书,了解一下外面的世界,我知道了,除了自娱自乐外,代码应该是为明天而写。有个说法,对程序员最严厉的惩罚,就是让他维护自己编写的代码。于是,我开始尝试编写干净代码:短小的函数,清晰的结构……所做的一切无非就是让自己明天的日子好过一些。

    历经磨练,代码逐渐干净,窃喜之际,我见到了Ruby。孤陋寡闻的我第一次听到了代码的表现力。原来代码不仅仅可以写得让开发人员容易理解,也可以让业务人员看懂。事实上,更容易懂的代码常常也意味着更容易维护。许多人关注的DSL,背后就是对于表现力的追求。

    Scala就是Java平台上追求表现力的探索。

    我是通过Java开始真正理解软件开发的,所以,对Java这个平台有一种难以割舍的情结。初见Scala,我看到的是,一个几乎不舍弃任何Java的优点,又能拥有更好表现力的“Java”。当有机会系统地了解这门语言时,我欣然接受了。

    翻译向来是一件费力不讨好的事。认真准备的考试不见得能拿到满分,尽最大的努力,做最坏的打算。于我,只希望这个译本得到的评价不是太糟糕就好。

    感谢我的合作者,李剑,你给我这样的机会,让我知道,我居然还可以做翻译,你的认真让我受益良多。感谢本书的原作者Venkat Subramaniam,和你讨论让我们对Scala有了更深刻的理解。

    最后,感谢我的父母,你们教会我踏实做人,支持着我沿着软件开发这条路一直走下去。

    郑 晔
    2010年4月18日于成都

  • 西班牙,从欧洲冠军升级成了世界冠军,章鱼帝压倒了未来哥,四年盼一次的世界杯结束了。

    出发的日子是6月11日,世界杯开赛的日子,这就注定了不能很完整的欣赏这次世界杯。

    一直以为在国内熬夜看世界杯是很痛苦的事情,跑到了地球的另一端,时间刚好颠倒过来,可以在白天欣赏世界杯。熬夜看球至少还有得看,白天时间固然好,但实际上,那个时间大多数情况下是在上班,所以,连看的机会都没有。

    真正有机会完整欣赏的阶段,只有八强赛和最后的决赛,因为是在周末。

    有机会看的时候,还是不错的,宾馆的电视很大,赶上ESPN的转播,还有高清频道。几个同事坐在一起,天南海北的胡扯,对场上的比赛品头论足。

    除了比赛,世界杯还有氛围。据说,北京办公室在世界杯期间展开了竞猜,不少人因此吃到了好多冰淇淋。而我们这些飘在外面的,就只有比赛了。

    所幸,赶上的比赛还算有看头,总有一些精彩:诡异的巴西糊里糊涂的输给了荷兰,乌拉圭和加纳加时最后一分钟的天堂地狱转换,年轻的德国水银泻地的进攻击退了马大帅的阿根廷,西班牙最后时刻击退巴拉圭,三四名跌宕起伏的打进五个球。至于决赛,还算不错,只是功利心让精彩程度打了折扣。

    从2008年的欧洲杯开始,舍弃了劳尔的西班牙走上了巴萨的路线,于是他们转运了。到了这次世界杯,巴萨的痕迹更重了,算上要成巴萨人的比利亚和出身巴萨的小法,最多的时候,除了门将和边后卫,场上会有8个巴萨人。近些年巴萨的强大和西甲的繁荣支撑出这支西班牙。

    2010给了世界一个新的冠军,2014年巴西,希望到时候,我可以更完整的欣赏。

  • 在做的这个项目是为一个遗留系统提供Web Service,从技术上来说并不复杂。说起来就是接到请求,然后调用一下已有代码。

    让这个项目有难度的是后面庞大的遗留系统。整个系统大概已经有十多年的历史了,已有codebase里面大量运用的JDBC可见一斑。真正要搞清楚如何把接收过来的请求对应到现有的代码上并不是那么容易的。虽然我们很快就把主体代码完成了,但随着项目的进展,对系统的不断发掘,一些遗漏的点就会不断显现出来。

    客户有一个对系统比较了解的人和我们一起工作,但事实证明,他也不可能对每一个细节都了如指掌,更重要的是,他也有别的工作,不可能与我们时时刻刻在一起工作,这也在很大程度上增加了我们工作的难度。所以,我们更多的时候,要靠自己发掘问题,然后,和他确认我们的理解。他很忙,找到他人是件很困难的事情,与我们约时间,他很少有准时到的。原来,在忙碌的甲方问题上,国内国外都一样。

    虽然我们是在用敏捷的方式进行开发,但是,客户并没有以敏捷的方式与我们衔接。比如,挂在Story Wall上的卡大多数都处于Ready for QA的状态。客户的QA从我刚刚到这边的时候就说要加入,两个星期过去了,QA的人除了standup和showcase之外,就只和我们真正坐在一起不到两个小时。每次我们的PM和客户提起这个问题,他们总会抛出各种各样的理由,证明问题不在他们身上。原来,在自保的问题上,国内国外都一样。

    行将发布之际,我们解决了主要问题,要扫一些边角。于是,和我们的技术接口人进行讨论,他看到我们的开发速度比较快,于是,做出了一个有神来之笔的决定,让我们开发另外一个需求。是的,另外一个需求,不只是简单的修补。和客户讨论完,我们有些晕,怎么就又冒出个这么大的需求。于是,我们赶紧拉来了我们的PM和另外的同事一起讨论。冷静下来之后,我们明确了一个方向,要和这个接口人仔细讨论一下,不盲目承诺。事实证明,他也确实没有想明白,第二天,见到我们,还没有等我们把精心准备的问题抛给他,他自己就说,他和别人开会讨论了一下,这个需求确实不该放到我们这里来做。原来,在天马行空的问题上,国内国外都一样。

    说来说去,这种企业级项目,人总是一个问题。

  • 又住了两个星期的宾馆。不同于之前,这是我第一次在国外工作。

    由于有12个小时的时差,初来乍到时,每天上午还能坚持,一到下午,整个人就完全不在状态了。为了不公然在客户现场睡觉,我只能选择以咖啡坚持,即便如此,也经常神游天外。在先期到来的冰云和米高强迫下,我按照当地的时间进行作息,用了几天,我逐渐适应了当地的时间,但是每天下午开始工作之前喝咖啡的习惯保留了下来。

    这次出来实现的第一个愿望是买到了iPad。我对iPad的需求很简单,不要让我旅途太无聊。来之前听说iPad买了200万,真的到了自己去买才知道这东西到底有多火。来的第一天,我就直奔苹果专卖店,得到的答复是没有了。第二天再去,只有3G版64G的。事不过三,当我开始绝望,准备在网上预订的时候,第三次拜访专卖店,刚好赶上一批新货,于是,我拿到了自己的iPad。

    在这边客户现场工作有一个不错的方式,只要每周工作40小时即可,换句话说,如果每天工作10小时,一周只要工作4天就好了,此外,公司每周都可以提供回家的机票。所以,很多在客户这边工作的人都会选择这种工作方式,周五飞回家,与家人共度周末,然后周日再飞回来,许多人因此攒了很多飞行的积分。

    因为有这样的政策,在冰云的同学的帮助下,我第一个周末就“回了趟家”——去了趟公司总部,刚好总部在那个周末举办了一个野餐会。在ThoughtWorks工作时间稍微长一点,就会发现,经常会在不同的地方遇到熟人,总部自然更不例外。之前曾经遇到的一些故人又相见了,大家免不了寒暄一番。

    野餐在户外,为了证明自己到过总部,我专程拜访了一下周末无人的总部办公室。ThoughtWorks的办公室总是相似的,一进去就会感到这是公司。宽畅的空间,大大的圆桌,随处可见的白板、技术书籍以及各种小玩意。行政人员的工作区里插着有办公室国家的国旗。总部办公室的面积很大,大约有一层半,北京办公室是半层。据说和北京一样,总部也经常承办一些技术活动,所以,有一个很大的空间专门布置成了开放的会场。

    办公室所在的大厦是一座摩天大厦,这个办公室在20多层,站在窗边,可以看出去很远。作为导游的冰云,还带着我到顶层——80层转了一圈,坐电梯坐出了飞机的感觉。只可惜当时那里正在举办一个聚会,我们只是匆匆看了一下。

    初来乍到,新鲜的感觉还不错。