Wednesday, January 4th, 2012
tl;dr. (Too long, don’t read.)
2011年对我来说变化最大的事情(没有之一)是xxx(以后再来填空)。然后就是自己离开了工作四年的Mozilla。那就从这个开始说起吧~
离开Mozilla已经一个多月了,不过依然在订阅着Mozilla的planning、dev邮件列表,依然每天还在登入IRC上的#developers频道看有什么牛x的东西出现。本来想单独写Mozilla昨天今天明天的东西,后来想想不太愿意写了,简单说点,放到这篇2011的总结中,:)。
我喜欢昨天的Mozilla,一如最初加入的片刻,喜欢以前的CEO John Lilly,觉得他很酷,很有趣,很能读书,而以前的Mozilla是那个Code Rush延伸出来的Mozilla,是那个当年跟微软对抗的Mozilla,是那个聚集了一些高中天才少年发展至今的Mozilla,我贡献无多,倒是始终庆幸自己是火狐粉丝中最幸运的一位,可以近距离接触这些牛人,亲身触摸那段不长却永远铭刻的历史……记得有次Stuart来中国做活动,跟他聊天的时候,突然觉得他好像就是Code Rush纪录片里面那个牛x的高中生,就问他“Are you the middle high school student in the Code Rush?”,他很淡定“Yes, I am, glad that you know that.” ——What the fuxx,这难道不是天下最酷的事情吗~
Mozilla的今天,我不知道该怎么说,上个月几个有趣的事件也让大家开始唱衰Firefox,什么Google不再续签合同了,什么搜狗收购火狐中国了,什么360雇佣猎头给所有火狐中国员工打电话之类的——我也接到这个电话了,然后说已经离开火狐了,对方居然要我提供原来同事联系方式,我说不给,他说都走了无所谓了,我说去你妈的——其实,从Chrome出来一段时间之后,去做活动都会跟来的同学聊天问问他们究竟喜欢什么,如果你去接触85前的同学会发现他们还会依赖Firebug,会轮番使用火狐和Chrome,而如果去接触85后的同学,你会发现Firebug对于他们来说完全是陌生的,Web Inspector才是他们心中的神器,曾经跟一个89年的同学仔细讨论了一下Firebug和Web Inspector,始终无法说服他,呵呵。用我接触的几十位转到Chrome上的同学话说,“不思进取”,我说的好听点,“没有变化”。浏览器从93年到今天差不多小20年了,在这段时间里没有什么太大变化,“快”很重要,不过“变化”比快还要重要,因为人们用这个东西已经n年都是这个样子了……Firefox从4开始发生了很大的变化,在4准备期间,我一直觉得Firefox 4会取得很大的成功,结果证明也确实如此,当时甚至有很多人从Chrome切换回了Firefox,:)。后面其实是快速发布的问题,5、6基本是小功能,本来期望8会是个很大的发布,毕竟速度和内存问题稍有好转,结果也没有很特别,我觉得算是被快速发布拖累了,本可以谨慎一些的,虽然人家有做手机操作系统一周迭代发布的牛x案例,不过有很多问题其实是在快速发布计划之前就能想到的,本可以谨慎一些的。Chrome一些特性融合在一起“变化”的更协调、更整体,快、无缝升级、单独的扩展API层……Firefox从5开始“变化”的拖泥带水,每一个变化的特性浅尝辄止……
明天怎么样,我不知道,B2G是一个很有潜力的项目,万一未来OS去浏览器化的趋势真的到来,第三方浏览器确实很难在别人的平台上立足;但是当下过多的把重心放到Mobile而忽略桌面我不觉得是件明智的事情,因为桌面浏览器的体验远没有到尽头,Chrome的出现其实是一个新时代的开启,OS去浏览器化也不会马上就出现,应该继续为Firefox的核心用户群提供更卓越的体验。我也始终相信Mozilla不会那么轻易被打败,Kindle Fire上的Silk就证明浏览器不是那么好做的,Mozilla的技术没有那么容易消亡的……
就这样吧,还是没收住说了这么多,还得写点自己的总结呢。
这一年,很欣慰的是自己还写了很多代码的,从后端到前端,从结构到页面配色,做了一个完成度85%的项目。比较有意思的一些“实做”包括Newsfeed、Redis based Auto-Complete Service(包括前端jQuery的自动补全plugin),基本抄袭了一遍Quora,喜欢上了#3399CC,后来在Paul Rand那本小设计书上发现了#EB4924,现在把微博自定义模板都配成这两个颜色,后来瞎看了两周Topic Model和LDA(记得当时@yongsun也在看,偶尔还在微博上交流一下),然后花了一周时间在node.js上用CoffeeScript实现了一遍Gibbs Sampling的LDA方案把火狐社区的8000+篇问答进行自动分类,后来了解到LDA蛮依赖分词效果的,我分词偷懒只用ngram做的,所以效果一般,代码在这里。这一年也有一些有趣的东西出现,有少量抄袭,呵呵,Pinterest最早开始的时候就喜欢这个瀑布流,抄过来用在了火狐社区的扩展精选集页面中;找工作时候第一版简历没有用心,@chenqj说我简历太糙,外加几个公司完全没消息,正好Facebook刚揭秘Timeline,于是花了一晚上把自己简历用Facebook Timeline的形式做成了网页版,效果不错,:)。做了一套跟瀑布流有些差别类似杂志分块布局内容的原型,为此还在豆瓣上问Sophie推荐布局设计的书,被推荐去follow陆智昌,感觉话说两岔了,最后还是翻了两本排版设计原理之类的书(不过貌似很多人推崇陆智昌大师的封面设计,这个真不懂了);昨天看kejun的博客说新版豆瓣猜会是magazine-style的强交互,倒是非常期待看看体验怎么样——我自己瞎猜豆瓣新首页会是类似Facebook的Top News + Ticker的,回头看看猜中没。年底发现老外造了个词,Designeer,很喜欢,确定为自己努力的方向,:)
这一年,还很欣慰的是看了一些书。
可能这些书中对我影响最大的是《原本大学微言》,这个还是好友媳妇听了一个牛x大哥推荐之后转述给我的,“要看《大学》”,看得不是原文,而是南大师的讲解,有点相见恨晚,还会再看几遍,希望将来能够教给自己的孩子,重要的不是后面齐家治国的部分,而是中国古代思想中对自身的修为,内修之后才能外用,知止定静安虑得,内在的修炼不简单,2012还需努力。
Tuesday, October 18th, 2011
The role of semantic web at the Interface:
- Reasoning about human context
- Harvesting collective knowledge
Contexts worth reasoning about:
- Location: Geosemantics
- Identity: FOAF, PURLS, and beyond
- Community: socially constructed meaning
- Action: Services integration
Knowledge worth harvesting
- Collective Experience: stories, photos, reviews
- Collective Attention: useful links, articles, perspectives
- Collective Creation: semantic wikis, data commons
Inferences worth making: The Gigantic Join (composing and integrating data across applications).
Knowledge, Reasoning, Collective Intelligence:

Last word: if we want our technology to have world-changing impact, bring it to the interface
- get useful knowledge from all those intelligent people on the internet
- give the benefit of this knowledge to everyone
—-
from Tom Gruber (CTO and co-founder of Siri, inc)
Monday, October 10th, 2011
那天也不知道怎么就那么精神,大半夜的睡不着觉,拿着手机窝在丽江的一家小客栈中盯着微博看Apple发布会的直播,是否有iPhone5的消息不太关键,只是想看看发布会还会不会有乔爷的风格,或者乔爷会不会突然出现在发布会上。看完发布会草草睡去,没想到过了一天,乔爷去世了,心情特别沉痛,在微博上写道:
Jobs在我心目中是一位伟大的Mentor,教会我很多事情,会永远纪念他!
在假期中,不断的从网上微博上看到铺天盖地对乔爷的颂扬。直到今天看到Mozilla前任CEO John Lilly发文纪念乔爷,醍醐灌顶……插曲之,回京的飞机上,媳妇提醒我看前面那人的报纸,只见参考消息头版上偌大的字写着“中国呼唤乔布斯式的创新”,不禁唏嘘~
翻译John Lilly文章中的几段:
昨天在Twi上,Naval说:“我从来没有见过这位伟大的导师,我超级希望自己变成他那样。但是,他给我们的消息却是相反的,他要我们充满激情的做自己。”
我觉得,这就是了,这就是乔爷用一生传达的最重要的知识。不要尝试变成乔爷。不要尝试去变成任何人。
做自己,然后累死也要努力去把美妙的事情带到人世间。想清楚你想怎么去达成,用你自己的方法,用你自己的词汇,哪怕承受最大的辛苦、付出最多的努力、经历最长的时间。
我希望,乔爷最永存世间的知识不是关于科技或者管理或者媒体或者沟通,甚至不是设计——他在这些领域进行的工作当然不会消亡——我只是觉得这都不是最重要最核心的事情。
我希望人们真正领会的知识,从内心真正意思到的是——做自己,付出最多的努力,去给我们的世界带来重要并持久的影响。可能是技术领域,还可能是艺术、体育,或者是政府、社会公平——哪怕只是影响自己的家人和最亲近的朋友。
找到你最希望做的事情,然后努力的去做,每一天!
我永远都会想念乔爷,永远记得乔爷的那些故事、那些身影。
望他安息,此致敬礼!
Hey you, out there in the cold
Getting lonely, getting old
Can you feel me?
Hey you, standing in the aisles
With itchy feet and fading smiles
Can you feel me?
Hey you, don’t help them to bury the light
Don’t give in without a fight.
Hey you, out there on your own
Sitting naked by the phone
Would you touch me?
Hey you, with you ear against the wall
Waiting for someone to call out
Would you touch me?
Hey you, would you help me to carry the stone?
Open your heart, I’m coming home.
But it was only fantasy.
The wall was too high,
As you can see.
No matter how he tried,
He could not break free.
And the worms ate into his brain.
Hey you, standing in the road
always doing what you’re told,
Can you help me?
Hey you, out there beyond the wall,
Breaking bottles in the hall,
Can you help me?
Hey you, don’t tell me there’s no hope at all
Together we stand, divided we fall.
—— Pink Floyd
天佑我们华夏子孙!
Wednesday, July 20th, 2011
网上看到一篇博客讨论JavaScript是Web的汇编语言这个话题,看到JS诸神都发表了一些观点,争取了作者同意之后把原文翻译在这里,其实这篇博客是作者之前讨论的续轮,大家有兴趣的话,可以去看看第一篇。
===
一些朋友认为之前的文章”JavaScript是Web的汇编语言“简直是无稽之谈,我问了一些JavaScript的大牛们关于这个讨论的观点,包括 Brendan Eich (JavaScript的发明者),Douglas Crockford (JSON的发明者)和 Mike Shaver (Mozilla的技术VP)。在他们的授权下,列出我们的邮件讨论。
Mike Shaver:
我以前听过类似的比较,我认为基本上是正确的。尽管他忽略了对JS开发工程的大量投入,因为汇编语言是面向机器开发设计的,不包含对人友好的词法(尤其是现代汇编语言)。
Brendan Eich:
我几年前说过 “JS是Web的x86” [可能是在JSConf大会上],不过我不是原创。[今年,Nick Thompson在 Hacker News上也说过类似的话。]
关键是,JS正在变得越来越接近底层语言。 当然,他也有高级的工具类。
Shaver是对的,没有高级宏处理的汇编语言对于开发者来说不是很好,同样从安全角度来说也不是很好。JS却不是这样,所以,这个类比需要一些限定条件,否则,就很愚蠢了。
将高级函数编程、内存安全等特性同面向底层的工具类(例如,有类型数组、马上到来的ES.next扩展的类型数组、二进制数据等)融合在一起可以得到一个比汇编语言要高级强大很多的编程语言,当然,内存安全特性是首当其冲最突出的差别。
Douglas Crockford:
我认为这样说更贴切,就是JavaScript是Web的虚拟机。我们以前一直认为Java的虚拟机会是Web的虚拟机,事实证明,JavaScript才是。
同Java虚拟机的二级制码校对器相比,JavaScript的解析器能够更高效的保障代码的安全。JavaScript更好的保证了“书写一次,到处运行”的承诺,也许就是因为他在更高的级别上运行,避免了很多底层的边缘案例。之后的事情就都由图灵机来保证了。
有很多人都拒绝承认JavaScript全部正确的可能性,我以前就是这么认为的。不过现在我不断的被其中的卓越震惊。
Brendan Eich又说:
Doug关于源码打败二进制码的观点很不错。我的朋友 UC Irvine大学的Michael Franz教授很早以前展示了一段基于Java二进制码校对器的 O(n^4) 复杂度的程序(跑光了计算周期,拒绝服务)。使用压缩的源码,JS绝对更适合移植并且能够足够快的进行词法分析/解析。
使用源码级别的解释同样可以避免Java二进制码带来的蠢问题:如果Java的底层形式被冻结的话,Java的源码(高级部分)就无法向前演进,Java编程语言一直以来都害怕破坏对Java二进制码的兼容性。这很大程度上让内置类和范型变得一团糟——最后Sun还是打破了Java二进制码的兼容。
之前在Hacker News上,Nick Thompson说:
我不可否认的偏见:我花了两年的时间试图优雅的让JVM同JavaScript进行通信——在Netscape我们有很多人认为二进制码更适合作为移动代码的基础。但是Sun让这一切变得非常的困难,他们从头就把软件层次做的非常臃肿。他们不希望Java同任何其他语言进行合作,只允许被嵌入到其他软件中。他们使用解释型语言写了字符串处理部分的代码,而不愿意使用C!据我所知,Sun把Netscape当作替代Windows幻想中的唯一候选——Netscape为当时Java唯一的重要客户。当时任何尝试使用Java的开发者都得承受差不多的痛苦。
与此同时,Brendan在做着差不多需要10个工程师+3个客户服务才能完成的工作,开始关注网页作者的实际需求,例如,将JS代码融合到HTML中、快速读取,同浏览器其他部分集成,以及同其他的浏览器厂商一起将JS变为开放的标准。
所以,现在JS是Web的x86汇编语言——不够想象中的优雅,但是足够搞定工作(从这个角度来看,GWT是最滑稽的例子)。JS将是“差即是好”的经典案例,Java只是从下往上看比较不错而已。同样的,实际上JS可以非常牛x。谁想要取代他,那只能祝他好运了。
当然了,关键是,没有类比就是最完美的。JavaScript作为一个语言看上去当然不会像汇编语言。作为类比的话,我们可以看到:
- JavaScript是普适的(真正的书写一次,到处运行)
- 快!而且会变得更快!
- Javascript是Web编程语言最基础的底层语言。
- 你可以把他当作另外语言的目标语言。
这个话题经常会在Hacker News上出现。
- “我们现在拥有的JavaScript语言是客户端的汇编语言。我们无法轻易的改变他,但是我们可以在他基础上作出更好的工具。” —— jonnycat
===
后记:比较难翻,可能会有些词不达意,还希望大家多多批评。翻译这篇文章,其实想说非常支持作者的这个观点。首先,JS经历了这么多年,已经不再是以前那个被大家误解最多的语言,同时,JS的路依旧漫长,他的未来会非常的光明。JS当然有很多的bad parts或者smell很差等,不过,作为编译目标语言, JavaScript 重获新生(中文翻译)。
PS:关于“差即是好”(Worse is better)可以参看这里。
Wednesday, July 20th, 2011
翻译自Firefox Engineering主管Johnathon Nightingale的文章。
===
令我震惊的是,我们已经成功的进行了几个月的快速发布过程。我们快速的向前推进。一个新特性从实现并且进入mozilla-central分支到发布到用户手里只需要12-18周,不再是需要几个月甚至几年。这个过程能够给我们更好的敏捷性,从而带来更强的稳定性。每个发布周期的测试和稳定阶段可以覆盖更多的用户来帮助我们更早的发现和解决问题,保持我们在每次发布质量上的信心。
我希望能够描述清楚这个发布过程中很重要的一个环节,不过可能很多朋友不一定理解。每个独立的发布火车(新的发布过程采用火车模型,固定的“发车”时间,特性的发布取决于该特性是否赶上最近的火车发车时间)包括6周的开发时间加上12周的稳定时间:

新的开发成果不会直接发布到Aurora和Beta分支上。这些分支/渠道会关注在如何同我们的社区测试成员共同工作,发现和定位开发中带来的程序问题和Bug,从而解决这些问题。如上图所示,您能够看出我们的发布周期基本上是稳定的18个星期。
Aurora和Beta分支/渠道基本上完全关注于稳定性和测试,同时,很多的工程师也在同步的开始新的开发工作,所以,如果我们看更大的一张图表的话,下面是真正进行的过程:

在Aurora和Beta分支/渠道上经历的12周时间里,Mozilla开发社区并没有在闲着。他们会继续为后面的发布开发新的特性和bug fix。每六个星期,他们的工作会被选择性的合并到Aurora分支,继而合并到Beta分支上。观察上面的图表,您会发现很重要的一点,就是:
每六个星期就会有一个新版本的Firefox发布,而不是12周或者18周。
很多人都被这个情况惊到了,虽然这个过程从开始就被定义为这样的。在Firefox 4发布之后,我们承诺三个月之后发布下一个版本的Firefox,并且做到了,不过在那时,我相信很多人会认为我们进入了一个3个月的发布周期。实际上,我们需要三个月的原因是,Aurora和Beta分支/渠道上都是空白的,他们需要等待下一个发布才能让他们完全进入整个流程。下一个版本的Firefox已经在Beta分支,并且计划在6周之后发布。与此同时,下一个版本的Firefox也已经进入Beta,以此类推。
同时,我们也在仔细的研究整个流程;这是一个很大的变化,我们需要在过程中保持最大的灵活性,以应对环境的变化。我们可能会认为6周时间是一个错误的周期,例如,以前Firefox的稳定性发布周期一直维持在6-8周。我们也在密切关注这个周期对我们整个生态系统的影响,包括扩展、插件、第三方合作软件等。同时,我们同大的组织机构一起工作,来了解快速发布流程如何更好的融合到他们的软件开发系统中。
不管我们作出什么样的调整,很清楚的一点是快速发布本身是一个巨大的改进,能够帮助我们更快的对用户和互联网本身作出反应。每六个星期,我们都会有一个新版本的Firefox等待评估然后发布出去,除非发现任何不兼容的破坏。不再需要一年的时间去等待某个最新的特性,现在完全可以在Beta中使用最新的开发者ScratchPad工具,或者现在就可以在Aurora上获取到性能和内存的改进,或者在Nightly分支上看到平滑的标签页操作动画效果等等。快速发布已经给我们带来好处,而这才刚刚开始。