岁月如歌

用开放的心态,打造专业的人生。

发布 SeaJS 0.8.0 – 海纳百川、有容乃大

with 13 comments

Eric Raymond 在 《大教堂与集市》 中谈到 Linux 的成功是否依赖 Linus 个人的独特天才时表示:

我不这样想,我承认 Linus 是一个极好的黑客(我们有多少人能够做出一个完整的高质量的操作系统内核?),但是 Linux 并不是一个令人敬畏的概念上的飞跃,Linus 不是(至少还不曾是)象 Richard Stallman 或 James Gosling 一样的创新天才。在我看来,Linus 更象一个工程天才,具有避免错误和开发失败的第六感觉,掌握了发现从 A 点到 B 点代价最小的路径的决窍。确实,Linux 的整体设计受益于这个特质,并反映出 Linus 的本质上保守和简化设计的方法。

在前端类库的开发领域,每个公司到达一定规模时,为了更好地满足业务需求,都面临着两种抉择:

  1. 效仿 YAHOO 或 Google, 从基础功能到复杂组件,全新构建,甚至打造出品牌,比如 YUI 和 Closure.
  2. 尽量采用业界流行的成熟类库,当部分通用组件找不到合适的开源类库时,才动手改进或全新研发,比如 Facebook, Twitter, Amazon, Quora 等等。


第一条路是大教堂式的开发模式,从头到尾构建出一个全新类库,是很多前端工程师心中蠢蠢欲动的梦,充满着诱惑。

第二条路平淡无奇,我们从第一次接触类库开始,在日常工作中本就是这么做的。当我们逐步熟悉 jQuery, YUI, MooTools 等类库中的一个或者全部时,我们的内心里会渐渐充满着指责的冲动和改进的欲望:“为什么 jQuery 的 this 需要 $(this) ?”, “为什么 YAHOO.util.Dom 不支持链式操作?”,“为什么 MooTools 要污染原生对象?” 随着时间的流逝,当这些质疑逐步变多时,我们和自己最初选择的心爱的类库,会开始变得像七年之痒的夫妻一样,开始忘了当初的心动,开始看不到对方的好,想起来的全是对方的不是,是一次次让人懊丧的冲突。于是这个社会上,离婚的、找小三的,层出不穷。然而,我相信社会更期待,有更多的夫妻能挺过七年之痒。过去了,会有另一番风景,海阔天空。

对于前端工程师来说,与一个类库相爱,经历的经常是一年或五年之痒。与现实相比,我们与类库的关系,很幸运的是并不是夫妻关系,而更像一场场恋爱。在恋爱过程中,多选择多尝试并没有错。在这旅途中,特别是如果经过了多次恋爱的,最容易被诱惑着去走第一条路:按照自己的想法,全新创造一个自己心中完美的类库。

选择第一条路,也没有什么错。作为程序员,把一件事情做得更好、更专业,更完美、优秀,乃至无可挑剔,这本就应该是一个优秀程序员应有的心态。但是,我们在追求完美的时候,经常忘却了方向。

前端类库要解决什么问题?jQuery 真的满足不了工作需求吗?YUI 真的会没落吗?Ext 的性能真的会导致用户都不愿意驻留页面?我们中的大部分人都在公司工作,公司愿意为全新开发一个类库买单吗?我们究竟怎样选择,才能用最小的成本,给公司带来最大价值?

更悲剧的是,忘却了方向,导致的迷路,经常会使得我们很难走远。抱怨一个人,经常是因为我们还不够了解对方。比如,我们可能会抱怨 jQuery 的插件良莠不齐,但我们是否真的有花心思去精心筛选?ExtJS 的 Grid 有性能问题,我们有无深入去社区寻求答案?甚至去分析源码,提出自己的解决方案?我们有没有真正的 dive into ? 而不是一发现不好,稍加研究后,就转而寻找其他组件或者自造轮子?

在《大教堂和集市》里有一句话:

好程序员知道该写什么,伟大的程序员知道该重写(和重用)什么。

我们进步缓慢,经常并不是因为我们写过的代码太少,而是因为我们仔细阅读和思考过的代码不足。阅读他人的代码,深入去了解体会,真实去使用,我们才能真正知晓“该重写(和重用)什么”,才有可能成为“伟大的程序员”。

像 YAHOO 或 Google 一样,走第一条路,是需要相当的技术积累和公司的强烈业务需求。对于大部分特别是国内公司来说,无论是从公司,还是从前端工程师自身的技能积累来说,第一条路仅是一条看起来很美的路。当然,路没有对错,我相信坚持,依旧会有春天。

KISSY 是我在淘宝发起的新一代前端类库,这是奔跑在第一条路上的大教堂式的梦。这个梦还远没有完结,Taobao UED 前端架构组的成员们,还在持续努力和奋斗着。

但在第一条路上踟蹰或奔跑着的兄弟们,我们不能忘记《大教堂和集市》里还有一句话:

“计划好抛弃,无论如何,你会的。”(Fred Brooks,《神秘的人月》第11章)

或者换句话说,你常常在第一次实现一个解决方案之后才能理解问题所在,第二次你也许才足够清楚怎样做好它,因此如果你想做好,准备好推翻重来至少一次。

我无法确定自己是否已经“足够清楚怎样做好它”,但这篇博客开头部分,Linus 避免错误和开发失败的第六感觉,Linus 寻求最小代价路径的诀窍,如梦魇一般纠缠触动着我。

经历了近三个月的思考、交流和尝试,于是有了这篇博客,有了 SeaJS:

世界上有很多聪明人,很多事情已经做得非常棒。有太多更需要投入的地方,的确不应该在别人已经做得很好的地方浪费时间了。

SeaJS 的理念是海纳百川,有容乃大!

SeaJS 站点:http://seajs.com/(欢迎访问、下载试用和交流反馈)

在 SeaJS 的世界里,将尽量避免重复劳动。我们会尝试在整个 JavaScript 社区,筛选出一批品质优良的开源类库和框架。在这些精选模块的基础上,针对不同的应用场景,总结出最佳实践。

在伟人的肩膀上,我们的视野更加辽阔。

梦,并不遥远。路,就在脚下。

Advertisements

Written by lifesinger

April 5, 2011 at 19:33

Posted in Articles

13 Responses

Subscribe to comments with RSS.

  1. 这是一个新的YUI Loader么?

    catge

    April 6, 2011 at 10:17

  2. module.js里加载js的方式,fetch这个function里看到 uri + ‘.js’,如果我的模块uri是/to/user.php呢?

    既然module.uri有预先处理uri,肯定考虑过这种情况,不知道最初设计时是怎么设想的,分享下?

    Macji

    April 6, 2011 at 23:18

    • 后缀不为 js 的模块文件,还真没考虑过。我想想是否需要支持以及如何支持。感谢小虎反馈。

      lifesinger

      April 7, 2011 at 09:10

  3. 玉伯叔。我做了个在线压缩的 js 的,现在集成了 uglifyjs 和 yui 和 closure ,你还有比较好的js压缩器推荐一下吗?争取把他打造成世界上最牛XX的。

    风吟

    April 27, 2011 at 16:48

    • 哇,成“叔”了-.-

      js 压缩工具,你收集的三种已经是最牛逼的了,还有一个 jsmin. 其他的,想不起来-.-

      lifesinger

      April 27, 2011 at 17:11

      • jsmin 是js大婶的道格拉斯的吧,但是我觉得基于正则表达式的压缩都是不靠谱的,不管了~~~那我的 scriptcode.info 算是成了。你就是叔嘛。。你是我的偶像呀。以你的为目标的。

        风吟

        April 30, 2011 at 08:01

  4. 非常认可“尽量避免重复劳动,在需要投入的地方,不在别人已经做得很好的地方浪费时间”~
    悲剧的是看到无数开发者风尘仆仆的投入到第一条路中…
    不可否认,第一条路是有助于提升开发着的技术能力,但代价太大,其实“仔细阅读和思考别人的代码”也是学习的好办法。
    集众家之所长为我所用,才是应该推崇的。

    这个文章让我想到了一首诗:
    终日寻春不见春,盲鞋踏破岭头云。
    归来偶把梅花嗅,春在枝头已十分。
    还有王国维的人生三境界。

    期待SeaJS能给所有开发者提供一种不一样的思路和解决方案。

    青青思念

    May 9, 2011 at 12:59

  5. 抛开技术问题,为什么很多情况下在不断的重复造轮子呢?这些重复的轮子用来干嘛呢?是不是用来满足业务的需求?业务的需求真这么复杂吗?我觉得不是业务的需求太复杂,而是太简单。但是却导致了大量复杂的开发,这些复杂的开发进而导致不断的重构,相当于强制性的把业务逻辑推向复杂的边缘。

    YSjia

    May 11, 2011 at 10:56

  6. 建立一个JS开放平台吧。。。

    祁杰

    May 18, 2011 at 03:51

  7. 从KISSY诞生的那一刻就预见到了他黯然消失的那一天

    自己做个类库,不能只是简单的模仿必须有自己的思想,没有独立思想的类库,就是没有行尸走肉

    SeaJs应该会有更好的未来吧,因为他不是一个开拓者,而是一个整合者

    richard

    July 11, 2011 at 15:53

  8. 玉伯这篇博文真的是一个很好的沉淀,写的很棒,很深入人心,重复造车轮确实没有意义。利用好车轮走的更远也许会更好。最近开始关注commonjs的东西,准备好好看看seajs

    qbaty

    August 3, 2011 at 23:46

  9. 在使用的过程中出现很多的问题,为什么插件不需要模块化也能成功完成按需加载并能成功运行。是不是插件不一定需要模块化的么?能给我讲一下子么?谢谢

    lovejs

    August 29, 2011 at 14:45

  10. […] 其他:https://lifesinger.wordpress.com/2011/04/05/seajs-080-released/ https://lifesinger.wordpress.com/2011/07/20/the-dream-of-carpenter/ 2011 08 31 Uncategorized Comments(0) « 通用按钮儿 […]

    Boom.js Release

    August 31, 2011 at 23:16


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s