<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>梦想风暴</title>
  <link>http://dreamhead.blogbus.com</link>
  <description><![CDATA[一个小程序员的信口开河]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Mon, 23 Nov 2009 08:32:42 +0800</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/profile/8/9/0/6098/avatar_6098_96.jpg</url>
									<title>梦想风暴</title>
									<link>http://dreamhead.blogbus.com</link>
								</image>  <item>
   <title>启动翻译《Programming Scala》</title>
   <description><![CDATA[<p>这个周末开始翻译《<a href="http://www.pragprog.com/titles/vsscala/programming-scala" target="_blank">Programming Scala</a>》。<br /><br />大约一个月前，<a href="http://dear.blogbus.com/" target="_blank">小刀</a>问我，是不是有兴趣翻译书。什么书？有两本可以选择，重构的Ruby版和一本Scala的书。都是挺有趣的书，不过，相对来说，我更感兴趣Scala的书。<br /><br />个人而言，一直对程序设计语言有着偏好，对JVM上的语言更是有着很多关注，Java从语言本身上，表现力实在是有限。JVM上的资源非常丰富，所以，我对于JVM上语言最初的关注点就在于这些已有资源。当我了解到Groovy时，我对JVM语言的期望值发生了改变。Groovy告诉我们，Java也可以反过来利用新语言的资源，因为Groovy的类从字节码上是可以对应成Java的类，这样，对一些Java应用而言，在不大动干戈的情况，让一部分代码先&ldquo;富&rdquo;起来成为可能，简而言之，把Groovy当作语法更简单的Java用。</p>
<p>最近一年，我做了一些咨询工作，对于语言的认识又有了些新的看法，对于传统型的大团队，静态语言或许是个更好的选择。因为在这样的团队里面，成员的整体素质不是很高，开发习惯也不是特别好，动态语言对他们来说，实在有些勉为其难。我就是在这种情况下开始关注Scala的。<br /><br />除了与Java互操作和静态类型之外，<a href="http://www.scala-lang.org/" target="_blank">Scala</a>实际上还给我们提供了更多，尤其是函数式编程。随着多核时代的到来，函数式编程已经越来越多的关注。而我们也越来越多从函数式编程中发掘出一些广泛适用的编程法则，比如，编写无状态函数。Scala尝试着把面向对象和函数式编程整合起来，这是两种风格的整合，也是一种有益的尝试。对于普通开发人员而言，即便忽略函数式编程，仅仅把它视为简化代码一种方式也是好的。<br /><br />断断续续的了解了Scala，我一直想相对全面的认识一下Scala，除了做项目，翻译也是个不错的选择。当年学习Ruby时，就是通过翻译《<a href="http://code.google.com/p/rhgchs/" target="_blank">Ruby Hacking Guide</a>》了解Ruby的运行机理。想了一下，今年还没有好好学哪门语言，就把Scala当作我今年要系统学习的语言吧！<br /><br />我并没有太多的翻译经验，只是玩票一般参加过《<a href="http://www.douban.com/subject/4031959/" target="_blank">ThoughtWorks文集</a>》的翻译。好在还有小刀，作为<a href="http://www.infoq.com/cn/" target="_blank">InfoQ中文站</a>的编辑和几本书的译者，他的翻译经验堪称丰富。有他和背后的编辑，我的英语应该不会造成太大障碍。<br /><br />开了个Scala的头，今后，可以多一些关于Scala的讨论。</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/51970577.html</link>
   <author>dreamhead</author>
   <pubDate>Sun, 22 Nov 2009 23:06:10 +0800</pubDate>
  </item>
  <item>
   <title>勿以善小而不为</title>
   <description><![CDATA[<p>我要不要做单元测试呢？这是一个我被许多人问了许多遍的问题，通常，这个问题会出现在讨论TDD的时候，在提问者眼中：</p>
<ul>
<li>一眼就能看明白，不值得测</li>
<li>单元测试粒度太细</li>
<li>单元测试要写好多，耽误工作量</li>
<li>单元测试不稳定</li>
<li>人员能力有限，写不好单元测试</li>
</ul>
<p>正是因为这样的原因，在他们看来，系统测试也许是一个更好的选择。我不否认系统测试的重要性，但是，单元测试才是他们最应该做好的。<br /><br />程序员和程序员之间的差异很大程度上是由开发习惯决定的。Kent Beck曾自我评价，&ldquo;我不是什么伟大的程序员，我只是一个有着很多好习惯的程序员&rdquo;。单元测试就是一个好习惯。它等于要开发人员在编码的时候就要验证代码的正确性，而不是向后拖。软件开发最基本的一条规律是，越往后做，代价越大。正确性总要验证，那当然是越早验证越好。<br /><br />如果你做过单元测试，你就会发现，一旦开始考虑验证，很多之前不曾考虑过的问题就会浮出水面，比如，一些边界条件。单元测试给了我们一个更仔细的关注质量的机会。虽然我们不能说经过单元测试的代码就是100%的完美，但是，我们至少给出了力所能及的验证。而事实上，一旦到更高层面的验证，比如系统测试，比如测试人员的测试，这些所谓的细枝末节是很难覆盖到的。而这些地方又恰恰是很多开发人员认为简单的，不值得测的地方。一旦遗漏，就会成为产品的缺陷，随时可能爆发。<br /><br />有人曾给过我们这样一个数据，他们的产品中有15%的bug源自像变量赋值这样非常简单的错误。从这个数据可以看出，很多人还做好自以为很简单的事。程序员有自信是好事，但前提是要有自信的本事。单元测试给了开发人员一个一步一个脚印，踏踏实实走路的机会。当每个构造快都经过验证的之后，把它们组合在一起，我们只要验证他们之间组合就好了。这样的做法，每一步心里都是有底的。而现在的很多开发给人的感觉是在撞大运。<br /><br />时至今日，还有很多程序员把开发完成理解成&ldquo;编码完成&rdquo;。行百里者半九十，这句话就是给这样的程序员预备的。他们以为自己代码写到90%的时候，其实，后面还有一大半的验证工作等着他们。这些程序员只不过在用有另外一个名字&mdash;&mdash;比如集成&mdash;&mdash;的时间去做他们份内的工作，而某些愚笨的老板居然认为这是天经地义的，所以，他们会压缩编码时间，给后面的验证留下更长的时间，于是，开发人员的时间更紧张了，他们更倾向于前期少验证，一个恶性循环就此形成。<br /><br />对于很多人来说，单元测试有问题，但实际上，真正有问题的是代码。为什么测试不好做，因为代码的耦合太大了。为什么单元测试不稳定，因为设计不稳定。谈到这里，我得承认一点，想把这一切都做好，人是关键。不是所有人都能拆解好代码的，但这里真正的问题是，不是所有人都有意识去拆解代码的，那些代码里面的垃圾就是从这里产生的。很多自以为是建设者的人，实际上，是添乱的。<br /><br />或许你会说，<a href="http://www.infoq.com/cn/news/2009/02/spolsky-vs-uncle-bob" target="_blank">有很多高手都认为单元测试不是必要的</a>，确实如此，但你光看见贼吃肉了，那些高手个人能力超强，基础扎实，思维缜密，先跟人家比这些东西吧！对于软件开发人员来说，单元测试就是基本功，通过它，可以让人在很多方面得到很多锻炼。先把基本功打扎实再琢磨别的吧！</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/51441828.html</link>
   <author>dreamhead</author>
   <pubDate>Sun, 15 Nov 2009 21:48:57 +0800</pubDate>
  </item>
  <item>
   <title>我们很忙</title>
   <description><![CDATA[<p>软件开发似乎就应该是忙碌的，加班似乎也应该是常态。我听到最为痛心的一个说法是，每天都在加班，忙得连洗衣服的时间都没有。也是因为忙，忙得有没有时间学习、没有时间思考。所有一切都是因为忙。<br /><br />但是，我们都是怎么忙的呢？不妨看一些细节。<br /><br />软件开发中，最重要的过程应该是编码，但真正的编码有多长时间呢？在一个采用传统开发方式的团队中，会有一个最后集成阶段。因为前期做的验证不够充分，所以，要给后面留下很长的时间，用来做集成和测试，更有甚者，这个时间要比&ldquo;开发&rdquo;时间还长。这里的&ldquo;开发&rdquo;阶段只是在纯粹的编码。就这样，在计划中，很大的一段时间被砍掉了。<br /><br />即便是在&ldquo;开发&rdquo;阶段，就真正能坐在那里好好写代码吗？未必。在大企业里面，最浪费时间的是什么？开会。人多，沟通不畅，开会成了&ldquo;自然&rdquo;的选择，而且，往往是人越多，会就越多。事实上，很多企业的会都是非常低效，一开会就发散，通常一个会一两个小时就进去了。在《<a href="http://dreamhead.blogbus.com/logs/46834395.html" target="_blank">做好一件事</a>》中还提到矩阵式管理也会让人无法好好写代码。就这样，在团队开发中，又有一段时间被消耗掉了。<br /><br />即便真正开始写代码，又是怎么做的呢？对于历史悠久的产品而言，程序员需要面对大量的遗留代码，编译一次代码，都要用很长时间，这意味着，消除编译错误这样原本应该很简单的事情都要消耗大量的时间。于是，经常可以看到一个个程序员面无表情的在那里等待编译。遗留代码，通常也意味着欠了一屁股的技术债务，也就是说，为一个功能要遍地开花的改许多代码，这也很耗时。对于不编写单元测试的程序员，常用的验证手段就是调试器，因为人的参与，这个过程不能自动化，很是缓慢。好容易到了该提交代码了，因为文件很大，出现冲突的几率也增加了，处理冲突也是耗时的事。在个人开发中，时间就在不知不觉中流逝。<br /><br />我们很忙，因为忙而认为一切都是理所当然的。正如上面所列，很多时间实际上是在一环扣一环的低效中无谓消耗了，所以，每天不得不加班，让自己看上去很忙，以此换回内心的&ldquo;安宁&rdquo;。<br /><br />我们真的很忙吗？</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/50687566.html</link>
   <author>dreamhead</author>
   <pubDate>Sun, 08 Nov 2009 23:52:32 +0800</pubDate>
  </item>
  <item>
   <title>2009 Away Day</title>
   <description><![CDATA[<p>这是一篇欠帐，因为Away Day是上个周末的事情了。<br /><br />我很喜欢Away Day，因为：</p>
<ul>
<li>Away Day是放松，我们可以逃离办公室</li>
<li>Away Day是学习，有各种各样的session等着大家</li>
<li>Away Day是聚会，外国同事千里甚至万里迢迢来参加，出差在外的同事也会回来</li>
<li>Away Day是交流，不同人不同思想在一起碰撞</li>
<li>Away Day是&hellip;&hellip;</li>
</ul>
<p>遗憾的是，去年因为经济的原因，Away Day取消了，一年之后，当Away Day再次有机会重现江湖的时候，我充满了期待。不同于<a href="http://dreamhead.blogbus.com/logs/12247500.html" target="_blank">两年前在办公室里&ldquo;Away&rdquo;</a>，这次我们真正意义上的Away。<br /><br />Away Day中一个重要的安排当然是一大堆的session，这是一个非常好的学习机会。我的immersion同学<a href="http://olabini.com/" target="_blank">Ola Bini</a>这次来到中国，参加Away Day，他的session是关于下一代JVM，也就是JDK 7的一些发展和变化。对于经常关注业界新闻的人来说，语言层面上的东西没有太多新鲜的内容，倒是Ola对低层实现方面的一些讨论，让人可以更系统的了解JVM的发展。徐X一个关于Scala的session居然听不出和Scala有什么关系，实在是有些过份。徐X借着这次机会，表达了一些他对几种程序设计语言的喜爱，比如Smalltalk，Haskell等等。倒是结束之后，我和我们CTO麦罗聊了一会Scala，我建议他弄个Scala的项目，让大家感受一下。<br /><br />这次个人感觉收获最大的一个sesion来自我们的老大郭晓，他的主题是关于认知偏见的。我开玩笑的把这个session总结为，如何防止被忽悠以及忽悠别人。自从开始成为咨询师，我就开始对心理学感兴趣，这个session中所讲的东西，我可以很好的映射到我的咨询工作之中，所以，内心会产生出极大的共鸣。事实证明，这不是个别现像，我们后来玩杀人游戏的时候，这些内容左一次右一次的出现在我们面前，于是，杀人游戏又变成了这个session的延续。<br /><br />好久没有见到我们创始人Roy了，不过，一般情况下，Away Day他都会出现的，这次也不例外。更大的惊喜是，他的老母亲也出现在北京。我们几个同事在交流咨询经验的时候，Roy走了过来，加入了我们。我们把自己之前的一些工作告诉给他，饶有兴致的听完我们的介绍，他认为我们的工作很有趣，建议我们写一本书，把这些经验介绍出来，同时，也建议我们写一个介绍，发给其它办公室的ThoughtWorker，让有兴趣的人也加入到中国这边的咨询工作中来。<br /><br />Away Day的狂欢出现在我们盛大的Party。这些平时已经很能出彩的家伙还是能玩出更多花样。恶搞了很多人&ldquo;专业&rdquo;视频；一群新ThoughtWorker表演《唐伯虎点秋香》；把最喜闻乐见的pair拿出来展现反模式；让Sponsor和Sponsee体验默契；用十分钟创作一个小节目&hellip;&hellip;<br /><br />Away Day总是让人快乐的！</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/49770716.html</link>
   <author>dreamhead</author>
   <pubDate>Sat, 31 Oct 2009 22:43:12 +0800</pubDate>
  </item>
  <item>
   <title>管理问题？技术问题？</title>
   <description><![CDATA[<p>产品做大了，人多了，就要分组，有了分，自然还要有合。这是一个产品的两个团队，他们原有的工作习惯是，一旦有工作涉及到二者的接口，两边独立开发，等到完全开发完毕，双方&ldquo;一起&rdquo;把代码合入代码库。或许，单看两个团队，问题还不是特别明显。在整个产品中，开发团队有很多，类似的情况在底层团队和几乎所有其它团队之间都存在，而且每个团队都有自己的开发进度，由此，你可以想见，采用这种开发模式，协调各组之间的开发计划到底是一件多困难的事情了。<br /><br />为什么不能把接口部份先合入代码库，然后，两边一起分别完成各自的工作。经过调研发现，接口中有个双方共用的结构体，在这个结构体中添加一个新的字段，从上层调用者来说，没有任何问题，问题出现在底层。在实现中，会对比这个结构体的长度和从数据库读出内容的长度，在底层还没有实现这个功能时，数据库内容的长度和结构体的长度肯定是不一样的，而这个不一致会导致整个系统启动失败。这是双方不能独立工作的真正原因。<br /><br />上面的原因看上去很合理，但放到一起，却给人感觉那么奇怪。因为添加一个字段，导致系统无法启动，所以，两个组要把代码攒到最后一次性提交，所以，计划很难协调。<br /><br />为什么双方要依赖于同一个结构体呢？从直观的想法来看，两个部份用到是同样的结构，使用同一个结构体就无可厚非。但结果告诉我们，这样的做法是有问题的。一个改进方案是，上层代码做一层封装，把底层代码隔离开来，这样，上层团队就可以单独开发，不再依赖于底层团队的开发进度，之后，当二者都完成开发时，只要把这一层封装稍做修改，二者的工作己可以连接到一起。<br /><br />这是一个常见的手法。比如，Java项目经常会用到一些开源库，我们并不会让程序的所有部份都直接依赖于这个库，而是要做一层封装，这样，哪天我们打算换掉这个库的时候，只要改掉这层封装就可以了，其它部份完全不需要修改。<br /><br />设计的一个作用就是解耦。解耦一个表现就是要区分出内外。或许，在整个产品的范围内看来，他们都是&ldquo;内部&rdquo;，但是由于跨越了不同的团队，实际上，他们并不是&ldquo;自己人&rdquo;。所以，彼此分离才是一个正确的选择。这样一个设计上的改进，解开的不仅仅是代码之间的耦合，也是两个团队开发进度之间的耦合，二者不再需要等待对方，只要把自己的工作做好。唯一需要协调的点，就是最终的集成，但这个点并不影响团队的开发进度。<br /><br />初看起来，这是一个管理问题，但真正的问题其实是设计，而这只是一个例子。</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/48895827.html</link>
   <author>dreamhead</author>
   <pubDate>Wed, 21 Oct 2009 23:48:19 +0800</pubDate>
  </item>
  <item>
   <title>捏软柿子</title>
   <description><![CDATA[<p><strong>或许你不知道，那些在项目组里面耀武扬威的家伙，可能是客户眼中的软柿子。</strong></p>
<ul>
<li>有一个很大的项目，负责与客户接口的有三个人，大多数需求都是从一个人那里进来的，因为这个人是最好说话的。结果是，本来可以顺畅运行的项目，由于需求的暴增，导致不得不加班，一个原本运转正常的项目，怨声载道。</li>
<li>一个计划20个点的迭代，迭代结束后，待开发的点居然超过30个。这些需求都是从这个项目负责人那里直接走到待开发的状态，因为每个提需求的人告诉项目负责人的都是这个需求是很重要、很紧急的。结果是，项目组的进度并没有因需求的增加而加快，反而士气受到了打击。</li>
<li>有一个人很好的PM，总是把满足客户需求看作很重要的事，所以，他倾向于接受客户的所有要求。结果是，组内其他有经验的人据理力争，顶住了PM接受客户需求的倾向，项目组一直顺利运转。</li>
</ul>
<p><br />这些都是真真切切发生在我的身边，或是我亲历，或是对周边项目的所见所闻。<br /><br />客户是上帝，让客户高兴很重要。但让客户高兴，并不等于一味的接受客户所有的要求。事实上，你真的这么做了，客户不会领你的情。他会认为你接受他的要求是一件天经地义的事，所以，他会变本加厉的提出更多的东西。一旦成了客户眼中的软柿子，他就会不断的&ldquo;欺负&rdquo;。在第一个例子里面，其他两个人不那么好说话，于是，第三个人成了突破口。人都愿意做容易的事，所以，捏软柿子也就再正常不过了。<br /><br />或许很多人并不承认自己是&ldquo;软柿子&rdquo;，但当他们听到&ldquo;紧急&rdquo;、&ldquo;重要&rdquo;、&ldquo;有价值&rdquo;这样的词汇时，他们便迷失了方向，就像第二个例子里面那个负责人一样。但是客户为了强调重要性时，他肯定会这么说。只有剥离这些形容词，才能淘尽黄沙始见金。<br /><br />团队中的&ldquo;软柿子&rdquo;真正伤害的是团队。一般能够和客户打交道的，在团队中都会扮演比较重要的角色。因为他是团队和客户的接口，他在团队内部受到的置疑相对会少一些，所以，他一旦接受客户的要求，多半就意味团队接受了客户的要求。像上面最后一个例子中那样的情况，其实并不多见，这需要团队中有经验更丰富的人。<br /><br />如果你所在团队有个&ldquo;软柿子&rdquo;，你的生活肯定不好受。</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/48408290.html</link>
   <author>dreamhead</author>
   <pubDate>Wed, 14 Oct 2009 22:08:52 +0800</pubDate>
  </item>
  <item>
   <title>十一读书行</title>
   <description><![CDATA[<p>八天，最长的一次公共假期。回了趟家，幸好飞机上有书做伴，旅程才不显得那么漫长。<br /><br />书，是很沉的东西，所以，随身带的书轻薄为好。这次陪我回家的是《卓有成效的管理者》。<br /><br />这本书的英文名字是《The Effective Executive》。把Executvie译成&ldquo;管理者&rdquo;，虽不是错，却阻碍了我对这本书的接近，因为我从来不是管理者。其实，这本书是讲如何做事的。对我而言，Executive译成&ldquo;执行者&rdquo;或许更贴切一些。<br /><br />看一下这本书的目录：了解自己的时间用在哪里，考虑自己对外界的贡献，善于利用人的长处，懂得要事优先。这些内容对于非管理者，也是相当有价值的。对于许多自命不凡，却因为得不到赏识而郁闷的程序员来说，这本书会告诉你&ldquo;到底差啥&rdquo;。<br /><br />这本书很薄，一共不到200页，值得从头到尾读一下。如果没时间，抛开第六、七两章关于如何做决策的部份。如果还没时间，就读读第一章和最后一章，因为它们概括了书中的内容。如果还没时间，那真是活该忙死。<br /><br />回程的路上，在机场遇到了李开复的自传《世界因你不同》，买了一本，继续高空阅读。李开复的文章和书，我是读过好多，在我心目中，他一直是一个良师的形像，所以，很有兴趣了解一下他是如何成长的。<br /><br />从这本自传，我读到了，一个人的高度，很大程度上决定于他遇到了怎样的人。李开复之所以是现在的李开复，因为他一路上遇到了好多境界很高的人，包括他的父母、导师、在苹果、SGI、微软、Google的各位老板，甚至是帮他打官司的律师。想成长的更好，就要接触更多比自己优秀的人，不只是认识，而是真正的深入接触，比如一起工作。实在没有机会，就读读这些人写的东西吧！<br /><br />这个十一长假是真正意义上的不虚此&ldquo;行&rdquo;。</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/47978499.html</link>
   <author>dreamhead</author>
   <pubDate>Fri, 09 Oct 2009 22:53:02 +0800</pubDate>
  </item>
  <item>
   <title>没有困难，制造困难</title>
   <description><![CDATA[<p>有困难要上，没有困难制造困难也要上。相声中的段子在软件开发团队中真实的上演着！</p>
<p><strong>改进持续集成</strong></p>
<p>要敏捷，要做持续集成。于是，有人想，如果能够把一些常见的操作（比如编译）替大家做好，省去了每个项目组配置的工作量，那该多好啊！于是，投人投时间，就着CruiseControl改出来一个新版本。</p>
<p>事实是，得到了一个看上去很美的可配置环境，而很多使用这个环境的项目组压根没有一键式脚本，直接把代码提交到进去，交给服务器来处理，顺便说一下，这个持续集成环境几个小时才运行一次，也就是说，写一行代码，也许几个小时以后才知道是不是能够编译通过。持续集成完全起不到应有的作用。</p>
<p>其实，只要把一键式脚本写好，配置持续集成很简单。</p>
<p><strong>编写自动化测试工具</strong></p>
<p>自动化测试很重要。于是，有人想，应该有一个自动化测试工具用来编写自动化测试。于是，投人投时间，编写了一个强大的自动化工具，甚至拥有一个漂亮的IDE。</p>
<p>事实是，这个工具运行起来，基本上需要占据2G内存，而很多开发人员开发人员的机器只有512M内存；编写测试的语言算是一种DSL，很特定于领域，没有人知道怎么用好它；这个为编写测试而生的工具，居然没有常规的Assert，没有setUp和tearDown；开发人员很少愿意用这个工具。</p>
<p>其实，如果用脚本语言封装一下，很多现成的工具和框架都很可以使用。</p>
<p><strong>打造开发框架</strong></p>
<p>重用很重要。于是，有人想，应该构建一个统一的平台，让所有团队采用同样的机制去编写代码，减少开发和维护的工作量。于是，投人投时间，做出了一个开发框架，号称开发团队只要编写少量的代码就可以完成功能。</p>
<p>事实是，一些很适合用B/S结构的应用因为这个框架变成了C/S结构；这个框架采用二进制的格式作为通信协议，让通信过程变得神秘无比；放着许多现成稳定的服务端应用不用，自己编写了一个。</p>
<p>其实，就Web应用而言，太多现成的东西可用了。</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/47394994.html</link>
   <author>dreamhead</author>
   <pubDate>Wed, 30 Sep 2009 21:45:23 +0800</pubDate>
  </item>
  <item>
   <title>别急着敏捷</title>
   <description><![CDATA[<p>在敏捷中国2009上，有人问了这样一个问题，我们公司实行的是CMMI，我们在这个框架下敏捷呢？<br /><br />我们怎么敏捷呢？这是许多人曾经问过的问题。很多人之所以问出这个问题，多半是听说了敏捷的诸多好处，然后，心向往之，却不知从何入手。从愿望上讲，这是件好事，追求一些业界好的东西，但你真打算敏捷吗？<br /><br />大多数想做敏捷的人，都是因为对现状不满。但恐怕他们并没有仔细想过，现有开发过程中存在的问题是靠敏捷就能解决的吗？</p>
<ul>
<li>市场部门只是扔给开发团队一大堆需求和一个不切实际的deadline，不改变，敏捷也没辙。</li>
<li>进度压力大，团队成员没有时间和精力去学习和思考，不改变，敏捷也没辙。</li>
<li>只关注业务，忽略软件开发技能，不改变，敏捷也没辙。</li>
<li>只关注显式成本（比如硬件投入），忽视隐式成本（比如漫长的编译时间），不改变，敏捷也没辙。</li>
<li>只给开发团队压活，不给开发团队解忧，不改变，敏捷也没辙。</li>
<li>&hellip;&hellip;</li>
</ul>
<p>你看到了，前面我用了很多&ldquo;变&rdquo;。想真正敏捷起来，就要面临改变。</p>
<p>许多团队团队并没有意识到敏捷到底意味着什么，他们指望一成不变，添加几个敏捷实践，就把所有问题都解决了。越是积淀深厚的团队，这几乎就越是一件不可能的事情。<br /><br />采用一些敏捷实践，也许会让某些团队有一些进步，但我也了解过不少&ldquo;敏捷&rdquo;团队，因&ldquo;敏捷&rdquo;而痛苦万分，唯一让他们欣慰的是，抛弃了繁重的文档。目前关于敏捷，很多人看到都只是鼓舞人心的一面，也许<a href="http://dreamhead.blogbus.com/logs/45877851.html" target="_blank">敏捷的&ldquo;烟斗&rdquo;</a>才是最真实的一面。<br /><br />如果你认为你的团队一切正常，如果你没有准备好承受敏捷带来的改变，别急着敏捷！</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/47245799.html</link>
   <author>dreamhead</author>
   <pubDate>Sun, 27 Sep 2009 23:01:33 +0800</pubDate>
  </item>
  <item>
   <title>Hello，Noop</title>
   <description><![CDATA[<p><a href="http://code.google.com/p/noop/" target="_blank">Noop</a>是一门新的程序设计语言，更准确的说，它是一个实验，准备把一些优秀的工程实践集成到语言中，比如依赖注入、测试、代码可读性等等。不过，Noop实在太新了，新到很多东西还没有成型，也不要指望现在就用它来做些什么。但是，翻看一下Noop，还是发现一些有趣的东西。<br /><br />Noop采用构建系统是<a href="http://buildr.apache.org/" target="_blank">Buildr</a>，你可以把它理解成Ant或是Maven。Buildr是Apache的第一个Ruby项目，当然，它主要还是为Java系统服务。对很多项目而言，构建脚本会随着系统的发展逐渐增大，里面逐渐也会出现很多逻辑，换句话说，构建脚本也是程序。这个理念的实践者，对于Ruby项目，自然就是<a href="http://rake.rubyforge.org/" target="_blank">Rake</a>，而C/C++项目，可以选择<a href="http://www.scons.org/" target="_blank">SCons</a>，现在Java项目有了Buildr。Buildr内置的许多task，在项目不复杂的情况下，只要遵循约定，简单几行代码就可以把构建过程实现出来，充分体现了&ldquo;易者易为，难者可为&rdquo;的理念。它甚至还支持生成Eclipse和IntelliJ IDEA的工程文件，省去了自己手工配置的烦恼。<br /><br />Noop的主要开发语言是Scala。Scala近来的名头越来越响，<a href="http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming" target="_blank">Java之父James Gosling把它选做Java之外的第一选择</a>，<a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html" target="_blank">Twitter用Scala改写了一些后端服务</a>，<a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html" target="_blank">Groovy的创造者James Strachan甚至认为如果Scala早点可用，他就不会去写Groovy</a>。在编译器方面，Scala支持Parser Combinator，为人们提供了从零开始手工编写和用工具（像ANTLR和yacc）编写解析器之外的又一种选择。不过，Noop里面并没有运用Scala的这个方面能力，它用了<a href="http://www.antlr.org/" target="_blank">ANTLR</a>，这也让我们有机会见识Scala的另一优秀之处，在Java类里直接使用Scala类。<br /><br />具体看一下Ｎoop。打开src/main，里面有三个目录：</p>
<ul>
<li>antlr，ANTLR的语法文件</li>
<li>noop，用noop实现的标准库</li>
<li>scala，Noop语言的实现</li>
</ul>
<p>再来看看语言实现，scala/noop目录有几个包：</p>
<ul>
<li>grammer，调用ANTLR生成的类实现的解析器</li>
<li>interpreter，实现了一个基本的解析器</li>
<li>model，语言的基本模型</li>
<li>types，一些基本类型，可以理解为Noop的运行时。</li>
</ul>
<p>从现有的目录和代码，我们可以看到Noop还是非常简单的，它甚至不包含生成JVM字节码的部份，而且类型也是最基本的几个。<br /><br />最后，让我们实际运行一段Noop程序，在此之前，你需要安装Mercurial（也就是hg）和Buildr，对于Ubuntu而言：<br />&nbsp;&nbsp;&nbsp; sudo apt-get install hg<br />&nbsp;&nbsp;&nbsp; sudo env JAVA_HOME=$JAVA_HOME gem install buildr<br /><br />获得Noop的代码<br />&nbsp;&nbsp;&nbsp; hg clone https://noop.googlecode.com/hg/ noop<br /><br />clone成功之后，进入到noop目录，构建整个noop<br />&nbsp;&nbsp;&nbsp; buildr<br /><br />如果是第一次运行，可能它会用一段时间下载所需JAR文件，然后，才会执行编译，运行测试等任务。<br /><br />打包的命令是这样的：<br />&nbsp;&nbsp;&nbsp; buildr package<br /><br />有了生成的JAR包，我们可以运行Noop程序了，这里我们用了Noop提供了一个HelloWorld的例子程序，它位于examples/noop/helloworld/HelloWorld.noop。<br />&nbsp;&nbsp;&nbsp; java -jar target/noop-0.1.0-SNAPSHOT.jar HelloWorld examples/noop/helloworld src/main/noop/stdlib<br /><br />还是那句话，Noop实在太新了，包括目前的命令行都是那么粗糙，它甚至不能加载自己的标准库，需要指定对应的路径。</p>
<p>Ｎoop刚刚起步，对于希望了解语言实现的人，它可以当作一个起步的阶梯。</p><!--sp--><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://dreamhead.blogbus.com/logs/46834395.html</link>
   <author>dreamhead</author>
   <pubDate>Sun, 20 Sep 2009 21:54:40 +0800</pubDate>
  </item>
 </channel>
</rss>
