• 就在昨天晚上,西安电子科技大学,ThoughtWorks校园行,迈出了第一步。

    2009年校园招聘,终于完成了招聘的各个环节,放松下来的几个人,闲散在校园中散步。我突发奇想,为什么不能给招来的学生在入职前做一些培训,因为我们开发中的很多东西,对学生来说,只是不知道而已,与其在加入公司后紧张的学习,不如在加入之前就了解这些东西,减缓一下入门门槛。

    在ThoughtWorks工作的一个好处就是,你有什么想法,就会得到别人的鼓励。于是,就有每年一次的毕业生入职前培训。因为我的主意和在其中的付出,这个培训有了一个属于我的名字——郑大晔校。

    转眼,第三批接受培训的人也已经开始入职了,在这个过程中,我们也积累了一些与学生们打交道的经验。ThoughtWorks作为一家有社会责任感的公司,既然可以帮助与自己签约的学生,为什么不能帮助那些在学校里的学生。于是,ThoughtWorks校园行提上了日程,我们的想法很简单,告诉学生们,怎样做好软件。

    经过多方接触和积极筹备,校园行终于在西电迈出了第一步。

    《公司是如何做软件的》,这是我们校园行的第一讲。这是我们精心选择的话题,对于大多数在校生而言,公司里如何做软件一直是一个神秘的事情,无论是拓展视野,还是未来的就业,这都是他们希望了解的。而站在我们的角度,学生们更多的是在“写程序”,而不是“做软件”。在公司里,做软件,要考虑的方面,远要比写一个程序多得多。在这个话题里,我们还与同学们分享了如何从一个学生成为一个好的程序员。

    这次活动的主讲人就是郑大晔校的第一批毕业生,崔力强。在别的公司,同年毕业的还在跟着老员工后面学习时,他们这批人已经成了我们各个项目组的主力,而小崔是其中佼佼者。当然,选择他作为主讲人,还因为西电是他的母校。

    这个在我们看来宣传做得很一般的活动,居然来了很多人,大大出乎了我们的意料。在演讲过程中,我看到了很多渴望知识的双眼,许多人非常认真的做着笔记,这让我相信,我们提供的内容对他们来说是有价值的。在后续的问答环节里,我之前的担心是没有足够的问题,但事实证明,这完全是多余的,同学们抛出了很多的问题。

    现在坐下来,在脑子里重温昨天的场景,我相信,把“如何做软件”送到学校里是一个正确的选择。这次活动对我们而言,更多的意义在于试水,它让我们有勇气把后续的活动提上日程。我们还有很多好东西,比如乐高游戏,Coding Kata,OO训练营等等,希望在未来的日子里,这些内容都会出现在我们的校园行里。

    ThoughtWorks校园行,西电只是第一站。在西安,我们已经开始联系其它的高校。成都的校园行,也在积极筹备之中。如果你在校园,如果你是老师,或是学生,希望我们走进你们的学校,欢迎与我们联系。

    我们愿意为改变一些东西,尽一些绵薄之力。

  • 果然是按照个人规律来的,我又参加了单数年的Agile China。

    其实,真正仔细听的只有两个人的session,吴军和Fred George。至于其它关于敏捷的讨论,好吧,我承认,我不是很感兴趣。

    刚看完吴军的《浪潮之巅》,于是,很敢兴趣他关于工程师的说法。在《浪潮之巅》里,他提到了五级工程师的说法,但是,书中并没有详述何为五级工程师,在敏捷中国上,他给出了答案:

    • 五级:能独立完成工程工作
    • 四级:能带领其他人一同完成更大的工作
    • 三级:能独立设计和实现产品
    • 二级:能设计和实现别人不能做出的产品
    • 一级:开创一个bussiness

    在我看来,这个标准是以做事的能力和取得的成就来衡量的。在书里,吴军给自己的定位是2.5级,而对比他给出的二级人物,Jeff Dean(云计算始祖)、Donald Knuth(Latex)等人,这已经是一个相当高的级别。

    吴军鼓励大家都去做一流的工程师,也给出了一些成为一流工程师的建议。会后,我问了他一个问题,在我看来,这个session里面的内容是如何成为一个三级工程师,那如何做到一二级呢?吴军笑了笑,这个还要看机缘,有没有机会和一二级的人物一起合作,在他们的点拨之下再进一步。

    这个答案有些宿命论的成分,但我也承认,如果没有见过高手,何谈成为高手。这也是很多中国程序员的悲哀,压根没有见过什么是高水平的程序员。从之前一些团队的合作过程中,我们让很多人知道了原来写程序也可以这样有趣,有人甚至抛弃了原来的管理身份,重回程序员的行列。

    这个session也让我看到了一些新的努力方向,但对我而言,也应该多想办法接触境界水平更高的人才行。

    Fred像个老顽童,09年的敏捷大会,我就听过他的session。这次,他又来了。我记不清是上次大会是他的演讲,还是事后的沟通,他这次的话题,我总觉得他曾经说过。只不过,坐在下面仔细听一遍,还是更新了我对很多问题的认识。

    在他看来,团队之间有各种各样的角色也是一种浪费,所以,在他的团队里面,只有一个角色Agile Developer,他们应该懂得如何客户打交道,懂得交付正确的软件。这确实是个挑战!

    在我的团队里面,我们试图减少开发人员与客户之间的距离,开发人员,即便是一个刚工作几个月的毕业生,一旦有问题,都会直接去找客户。我们也会让人承担不同的角色,程序员也要去做部署,也要做一些测试。但是,我们还是有不同的人挂着不同的名。

    Fred告诉了我们一个新词:anarchy。它告诉我们,我们需要程序员高度的自治,所有人都要有很强的能力,自己能做事。对于很多中国公司来说,太多的程序员习惯于被人管,而不习惯于自治。所以,这是一种挑战。

    无论是吴军还是Fred,他们的session讲的实际上都是一个自主程序员自己做事的故事。真正的改变是自发的,所谓的咨询师或是所谓的交流,能给予的帮助,是有限的。而这恰恰是很多公司实施敏捷欠缺的。

    高端对话里,有人说,如果一个lead不想改变,那就开了他。这种说法非常极端,但某种程度上,我们不得不承认,有时改变真的被某些人阻碍着。

  • 早上的Code Diff,项目组的所有人坐在一起过一遍上一个工作日写的代码。

    “这个测试为什么这么写?”我质疑了一段有文件读写的测试。
    “因为我要测文件读写。”这段代码的作者回答道。
    “你真的需要吗?文本内容相关的测试可以用字符串。”
    “真的需要,我真要测文本读写。”
    “好,下来一起看看。”

    Code Diff结束,我们坐在一起。他给我介绍了一下这段代码的作用:把文件的内容按行读成一组字符串。

    看着那段充满着各种异常处理的文件读写的Java代码。
    “嗯,确实是需要文件读写,这点我同意。”我说。
    我看到一丝放松从他脸上闪过。
    “不过,为什么要自己实现这个功能呢?”
    “啊?”他惊讶了一下。
    “为什么不用Guava库?”
    “Guava还支持这个?”
    我无奈的笑了一下,“是啊,Guava很强大的。”我给他找了Guava实现这个功能的API,展示了一小段代码。
    “哦,好吧,我回去改一下。”

    现代软件开发已然不同于那个纯手工打造的年代,写程序时,我们通常会使用一些程序库,但是,很多人对于程序库的使用仅限于别人已经在程序里面用到的用法,并不越雷池半步,所以,常常会有不少人累死累活写出来不稳定的代码去实现程序库里的现成功能。

    这已经不是我第一次在项目里面提到这个问题。前不久,有人辛辛苦苦用正则表达式实现出一段非常华丽的匹配,从URL中提取参数。直觉告诉我这么做是不对的,我们在用Spring MVC,既然Spring可以很好的提取这些参数,为什么我们要自己写。

    在直觉的驱动下,我研究了Spring MVC的部分实现,于是,PathMatcher浮出水面。采用PathMatcher之后,那些复杂到不是一下子能看懂的正则表达式烟消云散了。

    既然我们用到了程序库,那就真的用一下这个程序库吧!

  • 学生们去公司实习,发现有些公司已经开始敏捷了。学校在这方面完全没有任何的教导,你过来给学生们讲讲吧!我的大学老师如是说。老师既然开口了,我责无旁贷。

    儿童节晚上,我和几个同样对校园活动有兴趣的同事来到了学校。

    按照典型的TW活动风格,我们采用头脑风暴的方式收集了一下同学们最关心的问题。结果,原本老师是让我介绍敏捷的,而学生们真正关心的问题实际上是就业:

    • 企业需要怎样的人
    • 招聘的人会问哪些问题
    • 怎么写简历才能更好的吸引眼球
    • ThoughtWorks是一个怎样的公司
    • ⋯⋯

    从这些问题中便不难看出,同学们想问题还真的是很“学生”,这些问题无异于问老师,考试要考什么。老师会怎么回答呢?好好学习就是了。正常的公司都喜欢态度好能力强的。

    在毕业担心就业的那些人,应该问问自己,本来可以用来学习提高的时间都干了些什么。临阵磨枪,或许能撑住一时,但得有多好的运气才能长久。所谓提高,不一定是非要在本专业下多大功夫,但是至少得有一些拿得出手的本事吧!

    其实,学生们真正应该关心的问题是如何成为公司喜欢的人,俗称,有竞争力的人。

    以自己走过的路来看,想成为一个合格的程序员,最重要的是多写代码。对于学生而言,写代码之余,还能读些经典的书,向人学习,写写blog/文章,总结一下自己的想法,那就更好了。要是再能参与一些开源项目,关注一下软件行业的发展,那就太完美了。

    一句老话,要想人前显贵,必须背地里遭罪。

  • ThoughtWorks对社区活动的支持总是不遗余力,这一点在哪都一样,我参加过北京、西安、班加罗尔的社区活动,见识过芝加哥办公室为活动准备的大场地。

    今天,墨尔本,JavaScript之夜。

    听完了,留在脑子里的东西有两个:JQuery AddressJasmine

    JQuery Address,根据我对所讲的理解,它可以在保持页面不刷新的情况下,更新URL。这有什么用呢?

    今天早上和人讨论了SEO,其中一点是,URL是页面的一个很重要的标识,所以,不同的内容应该有不同的URL,但另一方面,不刷新页面,比如只用Ajax更新页面内容,对于用户体验来说又是非常重要的。好了,把这两点放在一起,通过JQuery Address,我们就可以在保证SEO的情况下,又给予用户良好的体验。

    本质上来说,这不是JQuery特有的,而是“#”带给我们的便利,之前读到过阮一峰的一篇文章《URL的井号》,如今我终于这是怎么回事了。

    Jasmine是一个JavaScript BDD框架。在这个Web页面越来越时尚的年代,作为一个开发人员,如果我们还在用最原始的方式写JavaScript的话,真会觉得脸上无光,更重要的是,会把自己累死。现在JavaScript也可以测试了,而且起点不低,直奔BDD而去。

    Jasmine已经有了很好的集成方式,比如和Ruby项目集成和Rails项目集成和Node.js集成,作为Java程序员,如果用Maven的话,也有集成方式。除此之外,它还有与Jquery的集成。还有人用phantomjs,这样,在不开启界面的情况下,就可以运行Jasmine。

    不白走一趟,这两个话题刚好是最近脑子里在想的话题,可以在项目里面尝试一下。听说下次有人讲页面上的MVC:backbones。多好的社区活动啊!