道路的编号

在新加坡,发现一个有趣的现象:在一个人口只有4百多万,面积只有720平方公里的地方,邮政编码居然多达6位,而且看起来还用不像中国的200030这样空荡荡的样子。比如:

Orchard Hotel Singapore
442 Orchard Road
Singapore 238879

这一百万种可能性等于每720平方米就有一个邮政编码。这是不是有点多了?后来一打听才知道,新加坡把每一个幢建筑都编了一个号码。在新加坡的GPS或者Google Maps上,只要输入238879,就可以唯一的表示一个目的地了。

与此相似的美国道路也有这种感觉。有一次从西雅图打车去如下地址:

15600 NE24th St

出租车司机一路狂奔,直接拉到。我说,你怎么知道一万六千多号怎么找?他说很简单呀,15600就是地156路和24街的交界口。西雅图从1道往西,一路遍号过去,到156道,158,159, 160,161, 162这样编过去,只要知道了门牌号,就知道了在哪个街和那条路附近了。同样的2400, 156 Ave也是同样的位置。

P.S. 今年的月饼节,就在新加坡过了。没有月亮。

高速公路编号的学问

道路的标号是一门有趣的学问,把繁杂的物理世界变成井然有序的数字,需要花一点心思。顺便把中国和美国解决同样的问题的方法比较一下。

主干道的编号

中国刚刚诞生的高速公路体系在编号上面,和美国50年代开始修建的艾森豪威尔高速体系基本上是一致的。奇数表示南北方向,比如上海附近的G15(沈海高速), G25(长深高速),洛阳附近的G55(二广高速)等,偶数表示东西方向,比如上海附近的G40(沪陕高速), G50(沪渝高速), G60(沪昆高速)等。美国一样,西雅图那里的东西的I-90,南北的I-5;旧金山那里东西的I-80和南北的I-5等等。。。总体说来,本着5结尾就是南北骨干,0结尾就是东西骨干的方式,中美一致。中国特色的是从北京开出来的几条一位数字的放射线,比如G1京哈, G2京沪 – G7京乌的7条线。

和主干道相连的高速

考虑到和主干线相交的地区干线,中国采纳了和美国不同的编号方式。中国使用四位编号,和主干线相交的环线,在主干线后面加一个0(好似一个环的样子),然后再加一个数字编号。比如上海的郊环线(A30)就因此编成了G1501,过了杭州湾跨海大桥以后,在宁波画了第二个圈,就是G1502。G25在南京画的一个圈就是G2501等等。如果是和主干线平行,第三位就是一个1,好像一条线。比如G15在经过山东时候的G1511,在宁波附近的G1512。。。

美国则所有的主干线的支线都用3位数表示,后两位是主干道的编号,第一位如果是偶数,表示平行线,就是沿着这个枝杈还可以回到主干线的那种,如果第一位是奇数,就是垂直线,离开了就再也回不来的意思。比如在硅谷,主要的高速全是80结尾,比如I-80, I-380, I-280, I-680, I-880. I-80是从西海岸的旧金山到东海岸的新泽西一条笔直的跨越北美大陆的高速,也是那么多n80的命名之源。I-280, I-680, I-880组成了一组围绕湾区有重新回到I-80的旁接线。在洛杉矶,因为城市里面交错着I-10和I-5两条大路,结果就有了和I-10垂直的I-110, I-710(都是南北线),和它平行的I-210(东西向),还有和I-5这条南北线垂直的I-105(东西),和平行的I-405(南北)。

和老系统兼容

中国和美国除了新生的高速公路体系,都有一套已有的国道体系。美国的就是US开头,比如硅谷形成依赖的US-101,以及被称为美国的母亲路的US-66(《汽车总动员》所描述的那条)。中国则是国道,比如上海到西藏的318国道,上海到新疆的312国道等。

两套数字编号系统,很容易发生标号的混乱。中国避免这种问题的方法是采用了不同的位数。一位,两位,四位数字,就给新的高速公路体系,而三位数字,留给了老的国道。

美国则用另外的办法。他们的US国道体系是两位到三位之间,顺序增加,而高速公路体系也是两位到三位之间。如何在一个命名空间里面和平共处呢?为了分开,新的高速体系从东南角,就是圣地亚哥开始,向北,向东逐渐增加,而老的系统从东南角开始,向南,向西逐渐增加。这样保证了在一个区域,不会有两条名字相同,却属于不同体系的道路。比如硅谷的US-101和I-80和稍远一点的I-5,就一大一小。为了避免在美国中部(东西的中部,和南北方向的中部),都会编到5左右,他们的新高速彻底跳掉了50号和60号以及之间的编号。这下大家就不会碰到了。比如在亚利桑那州里面,碰在一起的两条路分别是US-66和I-40。

出口编号

除了大的编号以外,中国的新的高速公路体系的出口开始采用了里程编号体系,就是从开始处的公里数的整数命名这一段上的出口,比如从北京出发,在上海段的203出口就到上海了,也就是1203公里的地方(超过1000,只取后三位)。美国的高速也大抵如此,却没有全国的规范。

虽然韩寒对于编号的必要性进行了有理有据的质疑,我依然喜欢新的全国编号系统。开在延安路高架上,看到G60,好似前方就是昆明,到了G15的交界口,左转是海口,右转是沈阳。编号的统一,的确为全国的出行提供了方便。当然,我这里讨论的仅仅是编号。如果考虑到出行的成本,那又是另外一篇文章了。比如上上个月,从洛杉矶两个人飞到Las Vegas,机票要300多美元,如果开车过去,5个小时,30块钱美金油钱就到了,没有任何路上的费用。之后我们一口气开了2000多公里,经过大峡谷,Sedona,凤凰城,墨西哥边境,到圣地亚哥,再回到洛杉矶,就是200美元。油便宜和路便宜当然是一个重要的因素。在上海,去一趟南通回来,油加过路费就已经六七百块钱了。。。

我们不喜欢注释

今天下午的乐高,讨论了代码规范中注释的部分。做为实用主义者,我们不喜欢过多的注释。“让代码的速度跟得上思考的速度”是我们一直提倡和追求的,也就是代码要写得入如注释般清晰,简洁,让人可以如读英文文章一样的读代码,而不是读注释。

我们干掉了所有PHPDoc才认识的东西,就是/** @param这样的东西,,另外注释统一了用两个斜杠(//),而不用斜杠星号(/*…*/),以强化就算有,也要短到一行的意思。

当我们强调注释或者文档的时候,或许是在解决错误的问题。越长的注释,就意味着越过期的注释。

我们反对过度文档,而尽量用最简洁的代码来取代它。与其在注释上花功夫,不如在函数和变量的命名上多推敲,花时间多做重构,把分层和封装做好,把抽象做好。

“没有比提高一个没有必要的事情的效率更没有效率的事情了。”一次一次在开发过程中被验证。

说到底,写代码如同写文章,有十几种不同的写法,无非在“推”和“敲”两个都不错的字中寻求最佳的那一个,或者在一个恶心的A和一个恶心的B之间徘徊,绞尽脑汁寻找一个不是那么恶心的C。说到底,没有绝对的对和错,只有合适与不合适。一群人,在一起磨合出来一种共同的思路,才是有力量的开发团队,否则只是乌合之众。

IMG_0071
2010年9月的一次乐高日

后注:看看我们刚刚做好的一个页面

Blog的头8年

要不是我的好心读者提醒,我都忘了今天是我写blog的八周年纪念日。从2002年9月11日到2010年9月11日这2922天中间,我总共写了2805篇英文blog,338篇中文blog,合计3143篇,平均每天1.08篇文章,可以说,在过去的八年里面,我还是坚持了每天一篇文章的频度。在8年前写第一篇blog的时候,真的没有想到写blog,会占据我生命的十分之一的时间。既然是第九年的第一篇blog,总要总结些什么,才对得起这特殊的日子。

写blog的意义

写blog的意义,远不不仅仅是分享,而在于自省。记录是为了更好的观察和思考。我们以为自己知道,或者以为自己想清楚了,若非用语言清晰的表达出来,远不及自己想象的那样。所以有了blog,写的过程是思考的过程。在文章写完,点击发布按钮之前的那一刻,blog的作用其实已经达到了。关于这点,可以参照以前和阮一峰的对话

每天不超过一篇

一件事情可以坚持每天做,连续八年,要说是挺不容易的,尤其对于绝大多数东西都没有常性的我。要说其中的秘诀,可能源于一个早期的原则:绝不在一天写超过一篇blog。这个原则看似和绝大多数人相反,它可以保证自己有一个小小的想写的文章的队列,不至于轻易断掉。所谓要想长流,必要用细水。这条自己的规矩在6年前废除了,但在初期的两年,对于养成一个习惯非常重要。唐诗(或者twitter)对于字数的限制,反而促进了创造是同样的道理。

上海

blog的8年,是上海巨变的八年,也是中国社会发生深刻变革的八年。我很高兴可以从一个普通人的视角,记录上海这个城市的生活,希望过了一个世纪以后,就算从报纸上已经看不到的细节可以在无数blogger的记录上找到。我从来不敢说我在记录中国,因为按照盲人摸象的道理,我仅仅对于上海徐家汇到浦东一线的一小部分有所涉及,我也仅仅认识这个城市几十万分之一的人。与其通过自己摸到的象腿揣测大象也必然像柱子,不如认真的记录这条腿是什么样子的。也只有一个个数据点的真实,才有可能在合适的时间,拼出完整的图景。这种记录方法,和美国现代艺术馆里面《Here is New York》展览中,用无数的业余摄像机记录911时间的方法类似。

中国和世界

在过去的8年里,Wangjianshuo’s blog这个英文的blog忠实的通过记录日常小事的方式,帮助了一些希望了解中国的老外。其中,34412篇对于我写的东西的回复,像上万个人热情的老师教育着一个学生,就是我。可以想见一个人在一字不落的阅读了针对自己观点的三万多条回复之后会在对这个世界的认知上有什么样的影响。这个blog也记录了十几次的美国之旅,以及每次的感想,如何从表面上了解这个不同与中国的社会,到和从政治到普通美国人的上百次聊天中慢慢了解到的更深的东西。经历这件事情之所以宝贵,是因为它只可体验呢,无法传递,却可记录。

盲人摸象和小马过河

如果用两个成语来形容我在这八年和几万对着交互的过程中学到的东西,基本上就是这两个成语。用心的体会这两个成语,可以让我们更加安静和坦然的面对观点的不一致。我们必须接受这个世界对于任何一个问题,都有可能有超过一种相互相反的正确答案的事实。或许,我们仅仅看到了同一个事物的不同部分,或者对同一事物的相同部分有不同的衡量标准而已。一个事物,可以同时是柱子也是扇子,既深又浅。。。

未来

最近的一年,是写blog最累的一年。当生活的重心因为逸凡而偏向日常的琐事,当百姓网的业务不可避免的越来越复杂,或许没有前些年的心境来弯下腰来,观察蚂蚁并且饶有兴致的写写东西,脑子里的思绪,也越来越难于用blog来梳理,但blog作为我自己成为一个更好的自己的工具,依然非常的有效。我希望在我写blog第十年的时候,可以有一个小小的几个人的庆祝仪式,然后迈入我写blog的第二个十年。

在这里感谢阅读我的blog的各位,还有留言的各位。

如果我有时间,我会写更短的代码

eBay的代码量已经比Windows+Linux更多了。从我看来,这绝不是一种恭维,而是彻彻底底的技术人员的失败。从代码的角度,越短的代码,就越有力量。

Mark Twin曾经在给一个朋友的信中说道:

我亲爱的朋友,如果我有更多的时间, 我就能给你写更短的信了。

文字是这样,代码更是这样。

有了面向对象的方式和一些简单的设计模式加一些重构,代码可以变得非常的简单,明了,易读,却依然保持灵活和强大。在百姓网,我们曾经把2000行代码重构为250行(迷你朝歌),然后又把另外几千行代码重构为250行(迷你荆州)。我觉得250行代码是一个神奇的数量,很多的功能模块,就算用PHP这样并不是完全面向对象的语言,也应该控制在250行之内。我个人的编程习惯和目标是,把每个函数控制在7行代码之内,把函数的数量控制到最小,用最短的代码完成功能。我个人用的简化代码最有效的方式,就是写一段代码,彻底删掉,重写,然后再删掉。在如此十几遍之后所得到的代码,通常比第一次要好得多。

百姓网在过去的一年里面,每周四下午的乐高日,就是定期的重新审视已经写好的代码,并且进行重构的固定时间。取名为乐高,寓意就是,我们希望产生的代码就像乐高的小积木块一样,足够小,足够灵活,却可以以此组合成各种东西。我们的代码,就应该是那些小乐高的积木。

乐高日每次重构竞赛的优胜者,会得到一个乐高积木。我们发的第一块是乐高最经典的红色3001号模块,然后是3002,3003。。。希望我们的代码可以像乐高一样经典。

对于小和短的追求,是为什么百姓网的每个技术人员的第一周一定可以在250行代码之内,一个小时之中,把百姓网的基本功能完成一遍的原因。

为了更好的代码,每天上线前,产品的所有人员(10个人)都会收到所有代码总行数邮件。代码量的增加,对于我们来说不是件好事。我们用拉锯战的方式在功能增加的同时,把代码量牢牢地卡在原地,并且不断减少。我们希望有一天,网站运营的PHP代码会被压缩到5000行之内。

就像对于代码的数量的追求一样,我们追求代码的质量,我们追求最实用的解决方案(我们是彻彻底底的实用主义者,希望用最小的代价解决问题),我们也追求网站的速度,内容的质量。。。技术人员,就应该有些技术人员的样子。毕竟,无论做什么,都要有些追求的。。。

baixing.in.sand.jpg
百姓网在威海海滩。沙滩上的字是:weihai.baixing.com

百姓网在威海

公司这次出游经过集体投票,选在了海滨城市威海。这里是全体参加的同事的合影。

数一数,在过去的几年中,我们已经一起去过了龙王山,青岛,柬埔寨,宁海,嵊泗,厦门,成都,三亚,各个小团队出差也已经分头去过美国的旧金山,加拿大的多伦多,荷兰的阿姆斯特丹了。这就是作为精干的小团队的一员的好处。百姓网要做一个轻公司,每个人都真正可以施展才华的公司。

对了,如果现在投简历过来(我们有从实习生,助理程序员到架构师的职位),或许可以赶上百姓网的下一次出游,初步计划是游轮往韩国,日本方向进发。希望那艘大船上面有你。