Steve McConnell的博客帖子。详述了程序员产率相差10倍的来历。插草标 卖身推荐。引用一段:80年代中期,波音上了一坨重要项目。80枚程序员参与其中。项目不顺利,眼看要错过一坨不容错过的最后期限。为了保证该项目成功,波音调走了这80枚老大,请来一个人。于是这枚老大以一人之力,按时按量交割项目。
剩下的问题是:我们怎么才能培养出这种一击必杀的能力?
阅读全文>
发表于 @ 2008年03月28日 21:42:00|评论(loading...)|编辑
早上上班,听Software Engineering Radio对Joe Armstrong的访谈。Software Engineering Radio办得真不错。请来业界风云人物娱乐大众。访谈前主持人做了功课,提的问题颇为有趣,引得被采访着侃侃而谈。上期对Galen Hunt的访谈也挺精彩,把Singularity OS吹得比Singularity还有卖点。
Joe在谈到并发编程对程序员冲击时提到2006年的新闻:2010年Intel会推出32核的CPU Keifer。到时候,写惯顺序处理程序的程序员在老板面前抱怨性能问题时需要三思。因为老板到你机器上一看,保证怒从心头起,恶向胆边生:靠!你丫才用了3%的CPU cycle,也好意思说遇到性能问题!想来一枚对并发编程无所谓的程序员,听了这段话应该对并发编程兴趣大增吧?
除开便于跟踪状态出错地点外,我以前一直奇怪Erlang的变量只能赋值一次的原因。要说支持合理并发,进程间禁止共享数据,强化消息传递就行了。进程内还是可以支持私有状态嘛。结果Joe说Erlang变量赋值的规则是当年用Prolog时传承下来的风格,并没有特别的原阅读全文>
发表于 @ 2008年03月21日 02:03:00|评论(loading...)|编辑
接着八卦前先回答老大们直指灵魂的问题。不就是系统状态遍历的问题么?干嘛非得用什么时序逻辑、模型一类的形式化手段啊?搞得比陈凯歌还深沉。做人不能这么无耻不是?找个真正的程序员,放出手里的蝴蝶不就搞定了?
嗯,很多程序的确可以靠程序达人强大的自觉和天才的排错能力搞定。问题是,模型检验的对象是高并发复杂系统(比如说1020个状态),目标是绝对可靠地查出系统的错误,既不错杀三千,也不放过一个。这些系统失败时的代价也高昂。奔腾94年的FDIV错误花掉Intel至少5亿美元。偏偏我们对并发系统编程也没有什么特别有效的手段,不然大家也不至于对Heisenbug津津乐道了。我们在这种情况下怎么能全靠自己的直觉?何况直觉有时相当不可靠。在这篇让人崩溃的论文问世前,谁能想到在一个异步多进程拥有可靠网络的的分布系统中,哪怕一个出错的进程就能所有进程无法通过消息传递对一个值达成共识呢?当我们需要确保设计无错的时候,形式推理非常称手的工具。有些老大可能不知道,我们只所以能放心使用常用的数据结构和算法,多少也因为那些算法经过了严格的证明。当初Purely Functional Data St阅读全文>
发表于 @ 2008年03月18日 10:34:00|评论(loading...)|编辑
2007图灵奖和模型检验不知道长达半年的疯狂加班是否损害了自己的心理健康。回顾过去几个月,似乎除了工作嘛都没干。人仿佛颓了,觉得时光了无意义地飞逝,过去半年的泰半记忆好像盛夏阳光里的冰块,蒸发得不剩一丝水汽。幸好不是全无亮点,比如看到好朋友幸福无比地结婚。中学好友到家里盘桓月余,也是一大快事。Steve McConnell在Rapid Development里的案例分析里提到death march之后程序员往往大批离开。想不到这次亲自体会了一把,人生又完整了一点。过去几周一系列戏剧性的事件让我仔细思考了一下激励团队士气的问题,也算小小的收获。跑题了。本来想说什么来着?对了,图灵奖和模型检验。2007年的图灵奖授予Edmund M. Clarke, E. Allen Emerson, and Joseph Sifakis,表彰他们在模型验证方面做出的开创性贡献。前段时间白天忙项目,晚上改简和历准备面试,也就没有心情八卦。刘江老师在他的博客里做了详细介绍,在这里推荐一下。关于几位大牛,俺没有什么补充的,就八卦一下他们的研究方向:模型检验。模型检验是计算机科学理论与实践结阅读全文>
发表于 @ 2008年03月03日 11:00:00|评论(loading...)|编辑
更新:忘记加入对generic function的概述了。刚才补上。另外chenxiaoshun老大提了个很好的问题:generic function和function overloading有什么区别?区别就是,调用哪个generic function是在运行时决定的,同调用虚函数实现多态一致。而重载函数是在编译时确定的。补充的内容是:
Generic function就是用来解决这类多分派问题的。运行时调用generic function时,会根据该函数的*所有*参数决定分派对象。总的规则是越具体的类型占用越高的优先级。比如说foo(Number)比foo(Object)有更高的优先级,因为Number是Object的子类,比Object具体。另外,generic 函数里所有参数的分派权重一样,所谓的对称多分派。Groovy采用了不对称多分派。系统会先比较第一个参数。如果不能决定,再比较第二个。。。
两个半月前的旧闻。不过今天才稍有闲暇,抽空八卦。JavaScript 2, 也即ECMAScript 4(简称ES4)的官方综述出笼,Yahoo!的Douglas Cr阅读全文>
发表于 @ 2007年12月13日 13:48:00|评论(loading...)|编辑
前俩儿Java进程是咱内旮旯的IDE和测试服务器。IE上就一页面儿,运行咱正开发的WEB应用。FireFox上就Google Reader,供开小差用。照这玩儿法,多少内存也得玩儿残了。
阅读全文>
发表于 @ 2007年12月11日 04:21:00|评论(loading...)|编辑
最近奇忙。从早到晚工作。别说写博客,连读博客都 没有时间。虽然一直想八卦一下JavaScript那浓眉大眼的也背叛革命了这件大事,却抽不出空。不过看到这么精彩的代码,还是忍不住转载。起因是这样的:大家都熟悉fold函数,也就是Ruby里常用的inject()函数:给出起始值,把某个Collection里的值叠加上去。比如说,给出起始值0,累加数组[1, 2, 3, 4, 5]: [1, 2, 3, 4, 5].inject(0){|sum, n| sum = sum + n}有了fold,便有相反的unfold:把单个的对象映射到Collection上。比如说 10.unfold { |n| n-1 unless n == 1 }.inspect => [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]10.class.unfold(&:superclass).inspect => [Fixnum, Integer, Numeric, Object]它的实现也出奇地漂亮:通过递归把unfold调用改写为数组操作。颇有term re阅读全文>
发表于 @ 2007年11月08日 14:52:00|评论(loading...)|编辑
从LtU上看到的。这张图根据CTM的思路,勾画了不同编程范式的特性和联系。方框代表某种编程范式。箭头边的黑体字表示箭头上方编程范式的代表性语言。以“+”为前缀的斜体小字是一种编程范式过渡到另一种编程范式需要的语言特性。CTM从阳春版的核心语言(kernel language)开始,逐步解释语言不足之处,并由此加入新的语言特性,最后就得到了几乎完整的语言—Oz。这就是为什么Oz出现在多条分支的末端。对学习编程语言没有兴趣,又想了解不同编程范式的老大们,可以专攻Oz了。:-) 奇怪的是SQL居然在命令式语言分支的末端。作者大概是值Trans-SQL一类的语言吧。
阅读全文>
发表于 @ 2007年08月20日 23:10:00|评论(loading...)|编辑
通过Programming Redit,从这里看到的。Amazon.ca果然发飙了,Lisp In Small Pieces软皮本才3.95加元。对比一下amazon.com上同样的书,50美元。怪不得冲到amazon.ca排行榜的第二。顺便扫了一眼排行榜,看到那本龌龊的The Secret居然排名第7,和amazon.com上一样。看来在心想事成不劳而获这坨美梦面前,南北同心。这本The Secret一度在amazon.com上排行第一。用书网站上(嘿嘿,网站地址我就不给了。嫌我自虐得不够的老大可以自虐地去google)的话说,这本书包含了宇宙中一切快乐,财富,健康,爱情,等等的终极秘密。历史上的伟人们,远到柏拉图,近到爱因斯坦,都知晓这个秘密。他们的人生也因为这坨秘密而彻底改变。。。这坨秘密是什么嗫?就是所谓的吸引力定律(Law of Attractions)。简单说,就是这个世界因为你的思维而重组。调动自己的思维,向宇宙发送你的能量信息,你就可以予取予求乐。。。 算了,还是说回Lisp In Small Pieces。俺向来觉得,看书时觉得懂了不是真懂,因为做题时阅读全文>
发表于 @ 2007年08月09日 07:55:00|评论(loading...)|编辑