注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

如果我来设计Maven  

2011-12-07 21:35:34|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Maven有三大死穴
  1. 不灵活。尽管Maven本身已经包罗万象拥有了很多功能,但想要增加点自定义的编译时干的事情,就很麻烦。你必须另外建立一个Maven插件项目,然后用Java写一坨插件代码,最后再到另一个项目中去引用那个插件项目,把插件的执行注入到构建的某个步骤中。哪怕你想干的事情只是简单的一句 echo yyy=$XXX > xxx.ini,你都得写个插件。
  2. 依赖的库难以修改。尽管Maven提供了开源的仓库,但你使用他们的方式却是下载二进制包,这实在太不给力,如果你发现别人的东西有bug要修复,那你改了之后那个依赖的库就有两个版本,一个是官方版本,一个是你的修改版本,你就得hack你本地的Maven库缓存让他用你的修改版本,一旦官方版本更新,你就又要蛋疼了。
  3. 太慢,除了依赖于网速要下载大量东西以外,本身执行速度也很慢。
这三大死穴都有更好的设计来解决。可是搞Java的人品味都有问题,所以搞出这么难用的东西。如果我来设计Maven,这三个问题都很好解决

  • 第一个问题只要不用xml格式做配置文件,而把配置文件格式换成某种图灵完备语言,用这种语言本身作为DSL即可. 比如maven的替代产品buildr、sbt的配置文件格式分别是JRuby、Scala。在buildr、sbt中如果想定制编译时操作,直接用那种语言写就得了。顺便插一句,尽管shell也是图灵完备语言,但太弱,所以make也有类似的问题。
  • 第二个问题其实这年头分布式版本管理系统已经解决得很好了。公共仓库和本地缓存应该都换成git或mercurial,不要傻逼兮兮的用什么HTTP。然后仓库里面要放源码,方便用户自己hack. 这区别就好像Debian和Gentoo的区别一样。(PS: 大家用Maven或者Debian的时候,发现别人写的代码有问题,自己改好了还得装孙子求着别人合并回主干啊,有木有有木有!!)(继续PS: 话说遇到Github上的项目就不用装孙子,俺自己Fork出来改改改改改,改好了给你丢个Pull Request,你爱接受不接受!!霸气有木有!!!)
  • 第三个问题分为两部分解决。
    1. 网速问题,改用git或mercurial的协议之后就可以大大改善了。
    2. 本身执行速度慢,这是因为Java加载速度太慢,加载类时的文件IO极为可观,此外再加上Java虚拟机JIT还有些开销。尽管对一个长久运行的进程来说启动慢一点没有关系,但对于构建管理这种一个进程只存活几秒钟的应用来说,启动慢就不能忍了。其实如果要用JVM语言做构建系统,不应该每次执行都启动一个Java进程,而应该做成守护进程,每次执行只启动一个客户端来戳一下守护进程。守护进程和客户端进程之间通讯协议用ssh就好了嘛。 守护进程用Scala或者Java编写,客户端就不用写了,用openssh就行。人家openssh是C写的,启动速度超快。
以上三个死穴,就是Maven的开发者自己听了,也得点头称是,而无法反驳。但对这糟糕设计的解读,则因人而异。在我看来,Maven处处违背“提供机制,而不是策略”的设计准则,藐视用户智商,把用户人为划分成插件开发者和普通用户,才是导致错误设计的内在原因。这种错误是路线错误,Maven选择了迎合白痴而得罪黑客,必将被世人唾弃。
  评论这张
 
阅读(1949)| 评论(6)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018