• 今年年初,我给自己定下的读书目标是30本,于今,时间过半,完成度是24本,下半年还要读完至少6本。与以往最大的不同是,今年的许多书读的是电子版。

    对电子阅读的兴趣始于一些阅读平台的兴起。而其中,购买方式的简化,让阅读更加简单。相比于最初的电子阅读器,如今这些阅读平台做得都很好,我们不再需要四处寻找图书的文件,再想办法复制到阅读器里,只要阅读平台买了书,然后,就可以同步到自己的阅读器中,即可开启自己的阅读之旅。

    现在主流的电子书阅读平台包括,多看字节社豆瓣阅读Kindle。在上半年读完的书里,刚好每个平台都有涉及,分别是:

    其中前三个,都有几个平台的客户端(包括iPhone、iPad和Android)。单纯从阅读器软件上看,多看和字节社做得都很好,豆瓣阅读则不是第一眼美女。但从结果上你看到,我目前在豆瓣阅读上读的书最多。豆瓣阅读一如豆瓣的其它产品,简单是其最大特点,相比于其它二者,它更可以让人心无旁骛地阅读。

    但从阅读的角度说,更好的选择应该是Kindle。这里说的不是Kindle软件,而是Kindle设备。无论是iPhone,还是iPad,抑或是其它Android设备,最大的问题就是能做的事太多了,容易让人分心。除此之外,相比各种pad,Kindle Paperwhite更轻薄,而相对手机,屏幕又很大,读起书来非常有感觉。加上今年Kindle的中国商店正式上市,选择一个Kindle Paperwhite专心读书是个很不错的选择。

    之所以在Kindle上半年读完的书并不多,只是因为时间尚短。个人现在的倾向是,以后在Kindle上读更多的书。

    相对而言,电子书的价格比纸书低很多,用几块钱买一本几十块的钱数还是能够承受得起的。而且,现在明显处于一个推广期,各个平台经常会有限免或特价的活动,比如,多看每天会有一本限免书,而Kindle则每天有本特价书。正是因为价格不高,我也就买了一些正版书籍,避免盗版,省去了找文件,拷文件的过程。

    目前而言,电子阅读平台上的内容还不够多,尤其是软件开发相关的图书数量有限。不过,随着电子书逐渐普及,这方面会逐渐得到改善的。

    当然,无论有怎样的平台,怎么便利的购买手段,排在第一位的考量永远应该是读书,否则,实体书那种只买不读的往日荣光又回复现于电子平台。

  • 不知道你是不是有这样的感觉,长时间工作在一个项目上,难免产生倦怠。还好,我们合作的不少客户会定期地挑出一个日子,给团队留下一个属于自己的空间,在那天我们可以抛开自己日常工作的代码,投入到自己的创新之中。也许你听说过Facebook有Hackathon,我以前参加过Innovation Day,而这次,我们叫Fedex Day。无论叫什么,它就是我们程序员的节日。

    既然是创新,我们当然会选择一个之前没有尝试过的方向。于是,这次我们项目组Fedex Day把目标定为推荐系统。这是我们一直想做,但没有机会动手的项目。因为我们是一个后台的项目组,保存用户数据,根据用户的一些购买信息,做出进一步推荐在这个大数据时代是一件顺理成章的事情。

    当然,因为只有一天的时间,做一个复杂的推荐系统是一件不可能的事情,所以,我们就选择了一个非常简单的应用,根据客户已经购买的品牌,为他推荐他可能感兴趣的品牌。

    如果你对推荐算法不熟悉,这可能会让你觉得是件有难度的问题,但实际上,具体做法极其简单。我们只要计算两个品牌的相似度即可,那相似度又从何而来呢?最简单的相似度算法是这样的:

      同时购买两个品牌的顾客数量(交集)/分别购买了两个品牌顾客的数量(并集)

    这样会得到一个0-1之间的小数,这个数越接近1,就说明两个品牌的相似度越高,反之则低。虽然它很简单,但它也有个自己的名字叫Jaccard index,或者Jaccard similarity coefficient。

    剩下的事情就很简单,把用户没有购买的品牌和用户已经购买的品牌一一计算相似度,然后,把相似度累加起来起来,然后,排个序把得分最高的几个推荐出来就好了。

    这次Fedex Day,除了应用本身,我们还想展示一下技术发展方向。所以,我们采用ThoughtWorks技术雷达上提到的内置容器、微服务架构等。其实,这么做也很简单,因为现在已经有很好的框架支持这些,它就是DropWizard,这是源自Yammer的一个项目,让你用更现代的风格编写Java应用。

    剩下的事情就是疯狂的编码了。好久没有这么爽快地编码了,六个人组成的项目组,开工之前,大家在白板前面,把任务做了一次划分,各自领了自己想做的一块功能,噼里啪啦地动手写起来。当夜幕降临,我们在音乐的伴奏之下写着代码,那种感觉,痛快。当我们历经千辛万苦,终于让整个系统运行起来时,那种成就的快感充斥在每个人的身上。

    我爱Fedex Day,虽然之后很疲惫,但这种能够激发团队创造力的活动,足以唤醒每个程序员初涉编程的那种热情。

  • 又到了一年的年底,我饶有兴致地翻看了一下之前几年的最后一篇blog。最初的几年里,我很喜欢在年底写写东西,无论是总结也好,回顾也罢。到后来,最后一篇blog则陷入了常规状态,按部就班,根本让人无法识别出这是一篇年末的blog。或许是因为年龄渐增的缘故,今天和明日的区别也不甚明显了。

    2012,如同以往一般,有喜有悲,没什么特别,即便我们经历了末日。

    也是因为年底的缘故,我最近和几个不同人聊起了计划。实际上,我个人是个计划性极差的人。但凡信誓旦旦地做计划,结果往往是到年底的时候,我都忘了原有的计划是怎样的了。

    如果说今年按计划做了些事,那就ThoughtWorks校园行了。以前我们也偶尔有到校园去做一些活动,今年最大的不同便是让校园活动常规化了。如今,一年下来了,西安、成都和北京三地的办公室都走进了校园,西安已经常规化了,成都的2013校园活动计划也已经出来了。

    我发起校园活动的初衷只是希望给想学习的同学一个机会,但现在看来,实际达到的效果远远超出了预期。不仅学生们有机会了解到更多现代软件开发的东西,我们也通过这样的活动给了自己的年轻同事一个锻炼自己公开演讲的机会。或许是校园活动的努力,今年校招的效果大大出乎了我们的意料,我们收到简历的数量直奔去年的3倍。现在想想年初在西安一次次地跑学校,也是个很有趣的经历。五六月份还在西安交大开了一门实习课程,让我体会到在大学教书的感觉。

    今年是ThoughtWorks第一次在武汉大规模校招,郑大晔校就这样开到了武汉。西安、成都、武汉,当年的冲动之举,如今已经变成了全国连锁。看来,我还真有搞教育事业的潜力。

    没有计划,但事还做了一些,值得一提的是,翻译了两本书,老马的DSL和《The Joy of Clojure》。DSL的翻译有些混乱,拖了很长时间,所以,我选择了独立完成《The Joy of Clojure》。按照预期的进度,这本书会在1月底交稿,以目前的进展来看,问题不大。选择翻译Clojure书,是因为我想了解为什么Lisp系语言那么神奇,现在看来,书是选对了,我开始慢慢理解一些东西了。

    还有一个拿得出手的东西是Moco。前前后后写了两个月,已经像一个正式的东西了,用户也有了几个。它也是我反思Java开发的一个作品。鉴于之前关注点太杂,我今年把思考放回了Java,于是,我看到了更多值得改进的地方。思考是一件很有乐趣的事情,希望明年可以更多地分享我对于Java开发的理解。

    又是一年了,还好不算虚度,继续前进。

  • 许多ThoughtWorker加入ThoughtWorks的原因之一是为了和Martin Fowler做同事,这样,聆听老马现场演讲或是与老马面对面交流的机会就多多了。加入ThoughtWorks五年了,阴差阳错,我还没有一次现场听老马演讲的机会。

    这次Martin Fowler中国行西安站,是我第一次现场听老马讲东西。

    一次性讲三个主题,这是我头一次见识这样的讲法,或许是老马实在货太多,一次一个怕人不过瘾吧!

    第一个主题是REST成熟度模型。这算不上一个新鲜话题,特别是,如果你读过《REST实战》的话。顺便说一下,这是本好书,其中的内容完全更新了我对REST浅薄的认识,如果你只是凭借Rails、Jersey之类的框架学习的REST,那这本书肯定会让你知道仅凭框架学习是远远不够的。我想这也是老马把这个话题拿出来讲的原因,毕竟,现在很多号称了解REST的人身上普遍存在的弊病。

    第二个主题是NoSQL的一致性。这个主题源自老马的新书《NoSQL Distilled》。NoSQL不算是新话题,但老马讲的东西对我来说,是全新的,至少我没有仔细想过这些东西。老马在这个主题谈到了NoSQL的分类,谈到了各种可能会带来问题的一致性问题,谈到CAP。谈到CAP,刚好最近InfoQ有一篇关于CAP的文章可以参考。

    因为对我来说,这是新鲜的主题,这也是我听得最认真仔细的。一如老马的书,他讲东西最大的有点是思路清晰。很多东西其实原本在脑子里有的,老马每每所做的工作就是把这些凌乱的东西整理出来,再有他讲出来,经常会有一种感觉,“对,就应该是这样。”他的这个能力还真不是一般人具备的。

    第三个主题是DSL。又是一个老马书的主题。这也是一个我非常熟悉的话题,原因嘛,一方面我个人一向对于语言有偏好,另一方面,因为我正在处理老马的DSL。好吧,这是我第一次在自己的blog上提及,我在翻译这本书。这本书是我们几个同事合作翻译的,现在初稿已经完成了,现在正在进行审校,由于参与者很多,统一风格是我们必须要做的,这就是我现在在做的事情。这本书实在太厚了,从头到尾读一遍都需要很长时间,更不要说字斟句酌地审校一遍了。

    难得有这样的机会,自然少不了提问的环节,一如很多大型活动,提问环节往往也是精彩和趣味并存的。从很多人的提问中,大家对DSL和移动开发都很感兴趣,但老马自称不了解移动开发,不多说。最有趣的是一个小伙,站起来激动半天,一句话都说不出来,好容易说出来,问老马Clean Code的事,老马说,那不是我的书。

    仅就内容而言,这次老马还是带来了一些干货,只是我稍存疑问的是,这样的活动放在大学里来做,学生们到底有多少人能听懂他在讲什么。

    无论如何,第一次听老马讲现场,有收获,挺好的。

  • 自从迈出了ThoughtWorks校园行的第一步,西电的校园活动就一次次进行下来,我们讲了如何写代码,讲了完整的开发过程,后续的一系列校园技术讲座也已经排上了日程。

    其实,单以效果而言,技术讲座所带来的影响是有限的,对于参加讲座的学生来说,除了知道很多新名词、新做法,多半也就是看个热闹。直接动手实践,才是一个更好的做法。

    感谢我们优秀的市场MM,她为我们打开了一片新天地。感谢西安交通大学软件学院的领导具备的卓越眼光,为他们的学生提供了一个接触外面世界的机会。

    于是,我们有了一个新的机会,在西安交通大学开设一门软件开发的课程。

    这门课,我们称之为“现代软件开发”,其目的就是为了告诉同学们,不同于传统方式的开发方法。其实,我们本可以叫敏捷软件开发方法,但我着实不喜欢这个名字,因为这已不是我追求的东西,我只想把一些好的东西告诉同学们,所以,选了一个不容易过时的名字。

    我们是这样设计的这门课,采用上下半场的方式运作。上半场,我们会介绍一些基本的开发方法,比如整洁代码,比如重构,比如自动化等等。而下半场,则完全是实践。我们选取了一个项目,按照我们的方式运作了一个项目,我们的同事会与同学们结对,让他们直接体会最原汁原味的ThoughtWorks开发方式。

    就在这个周末,这个系列课程终于迈出了第一步。

    第一次课基本上算是一个课程介绍,让为有兴趣选修这门课的同学了解这门课,以及我们的上课方式。我们讲了公司里如何做软件,还演示了结对开发和TDD。

    第二步就这样迈了出来,在接下来的一段时间里,虽然要牺牲一些业余时间,但这也是一个很好的尝试,让我们的课程更加系统化,也给了我们的同事一个很好的锻炼机会。

    我们的同事在课程的结尾送给同学们一句话,与其周末逛街打DOTA,还不如来写写代码。嗯,就是这样。