Skip to content

Beetl 开源那些事情4-开源10年总结

About 2586 wordsAbout 9 min

架构

2021-04-05

之前我写过 Beetl 开源那些事情 ,最早是 2014 年写的。每篇都会对开源有不同的感悟,今天这篇应该是这个系列结束之作。

第一篇,2014 年,Beetl 开源那些事情,感慨开源艰难,国外开源做比国内开源更容易得到信任

第二篇, 2015 年 Beetl 开源那些事情 2,建议开源不要给公司,自己独立自主,同时,也对小白很不爽

第三篇,2018 年 Beetl 开源那些事情 3,对国内开源的待遇感到不公平,同时也对开源有所总结,

第四篇,也就是这一篇,在人到中年的时候,总结一下开源 11 年的感触。

img

一转眼,Beetl 已经开源 11 年了,从早期托管到 sourceforge,到后来的 github,然后再到 gitee,如今 Beetl 已经演变成为模板类语言的天花板级别的实现了。无论其功能,性能,可定制性都是顶配的,是国外开源不能比的。每天 Beetl 的文档都会被打开 2000 次。独立访问用户上百人。这在现在动态页面不怎么流行的情况,这个浏览量还是非常高的

Beetl 之所以是模板语言的天花板实现,是因为它满足了几乎对所有模板引擎的需求,有些如下特性是国外模板语言不具备的

自定义定界符和占位符

​ 使得模板更适合特定文件,比如在 htlm 里可以定义 <!--# -> 作为定界符,再比如在代码生成 Java 文件模板里,可以定义 //# 和回车为定界符。避免了 freemaker 那种生成代码模板出现 xml 标签怪怪的感觉

脚本语法和 xml 标签语法同时支持,实际上 xml 标签会被翻译成相应的脚本语法,类 JS 语法非常容易学习。Freemaker 只有 XML 标签,Velocity 等只有脚本语法。

高性能执行引擎

​ Beetl 提出和借鉴了很多 Java 高性能编程方式(后来总结为我的 Java 系统性能优化书籍或者电子版)。比如,我在 JDK8 中看到的将浮点数转化成 String 用的性能技巧 FloatingDecimal.getBinaryToASCIIBuffer ,在 Beetl 中就早已经使用。可以查看我的书,里面提到了很多性能优化手段,都用在了 Beetl 里,或者我曾经的优化的 JD 的核心交易系统里。如下是一个性能测试汇总,或者直接运行 JMH 工程,你可以下载下来看看。

img

可定制的语法树。Beetl 可以定制语法实现,比如简单的占位符输出 ${},可以解释为文本输出,也可以像再 BeetlSQL 那样,解释为输出 "?" 从而防止 SQL 注入。 再比如 Beetl 在线引擎,http://ibeetl.com/beetlonline/ 运行了很多年从来没有意外过,那怕你输入如下代码也不会无限循环运行

while(true){
  
}

定制话的在线引擎会对 while 语法提供新的实现,只会执行固定的次数,这也是 Beetl 被很多开源平台用在在线模板或者脚本引擎的原因。 反观国内牛逼的 FastJSON,缺少定制,如果 Fastjson 在渲染成 JSON 的时候,提供 Interceptor 或者可定制的注解,那么他的功能必然比 Jackson 更强大。

这种定制设计影响了 BeetlSQL,比如你见到的 BeetlSQL 大部分注解和使用习惯都是可定制的,比如在 BeetlSQL 2 中,如下定义一个 BaseMapper

//BeetlSQL 2定义
public interface BaseMapper<T> {
   void insert(T entity);
}

insert 方法的实现需要在别的地方配置。但是,到了到了 BeetlSQL3,改成了如下

//BeetlSQL 3定义
public interface BaseMapper<T> {
    @AutoMapper(InsertAMI.class)
    void insert(T entity);
  }

这样,很容易定义 N 个方法,只要使用 @AutoMapper 标注一下此方法的实现类即可。这种技巧用到了 BeetlSQL 其他地方,如果你看别的 ORM 工具,你以为的需要特殊实现,在 BeetlSQL 中都很简单。比如想实现对脱敏数据的存取。

@Table(name="sys_user")
@Data
public static class UserData{
    @AutoID
    Integer id;
    @Base64
    String name;
}

你可以自定义个 Base64 注解,并再注解上申明其实现类即可

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
@Builder(Base64Convert.class) /
public static @interface Base64 {
}

Base64Convert 是此注解的实现类,实现 AttributeConvert 接口即可。

在 2000 年的最初 10 年,大家只希望开源具有完善的文档和充分的示例 。然而,如今不一样了,开源这 11 年,越来越意识到,把代码写的越好,开源本生的定制性越强,那么开源更容易被接受。开源也更容易发展 - 我最初写 Beetl 开源的时候,还有藏着掖着代码的想法,很龌蹉想法。

开源这 11 年,感觉变化还有

  • 开源使用者已经开始学会提出问题。以前提问甚至连个错误贴图都不会贴,现在不仅仅有贴图,还有红圈标注重点,甚至还有自己的见解。

  • 开源使用者已经能通过源码来解决使用问题,开源使用者甚至能贡献新的开源代码,一个普通程序员在多个开源项目里做贡献常见

  • 无论是高端人才,还是一个初中学历的就业者,对开源的贡献都是一样的大。

  • 开源作者得到了社会认可,相当于半个学历的提升了。比如,我作为普通院校本科生,这几年,有机会去更酷的公司,有机会给电子工业出版社写俩本书,以及能交往很多技术大牛,都是跟开源有关系的。我应该是国内唯一写俩个很好开源,出版过俩本很好书的人

  • 公司资助的开源越来越强大,这可能会扼杀个人开源独立性,但谁不羡慕,一边做开源,一边有公司支付薪水的日子。比如 API JSON 就被腾讯收编,Shard-JDBC 就被 JD 收编。我也多么希望我的开源也被收编:)

  • 公司开源得到了各种媒体的资源倾斜,媒体资源而以前更倾向于个人开源。

    开源 11 年,我也从青年变成中年,程序员的中年,感觉真的不是很好。如果时间能回到过去,我一定会对当时的我说,"别搞开源,别搞开源,别搞开源,去刷题,别在北京呆着,去杭州,别怕 996"。然而,没有如果,把一个开源从无做到优秀,做到仍然在坚持,耗费了太多的精力。这里有个大概的统计数据,以解决 Beetl&BeetlSQL 的用户的问题(算上官网论坛和 Gitee,Github,)至少解决了 2500 个用户提出的问题和建议。每个问题,都有可能是 1 小时,或者一天的时间的付出。 比起解决用户问题,编写文档和博客,和 Beetl&BeetSQL 代码编写,更是翻倍的时间耗费。如果把这些时间用在其他学习,我不会错过很多炫酷知识,以及更酷的公司。

​ 我当时的某个 HP 同事就有先见之明,同样无聊的他刷了很多算法题目。得以顺利进入更好的公司。现在已经是技术总裁。而我,只是个中年程序员。

​ 我之所以有点后悔,不仅仅是因为如今的中年程序员尴尬身份,而是因为刚碰到了失业。当初本来有更好的选择,但老同事三顾茅庐,又说公司有美国 AI 工程院士李飞飞作为董事长的背书,我想必然靠谱和有前景,谁愿意错过未来呢,厌倦了 CRUD 的我,觉定冒险试一试尚未 A 轮的创业公司。亢奋了一年多,结果是,当所有的 AI 支撑系统和业务实现都被我完成的很好情况下,却因为 AI 同事不给力,导致李飞飞决定暂时放弃中国业务。 这个公司有很多中年同事,都是熟人介绍,聘请过来打公司基础的,刚过完年,当天就得到了裁员通知,不得不说资本的力量是无情的。我对面的医学博士,非常聪明,在医学领域深更多年,也在裁员之列,之后他成天都失眠。 中年大叔们什么都没有做错,却被惨遭淘汰 。我在被裁员之前三个月还写了博客《中年程序员转》来调侃未来的自己。没想到这么快就实现了,今年被裁员的经历,整的我人生都不自信了。

开源 11 年,技术上炫酷的事情都做过,而且做的到很好,但暮然回首,事业一塌糊涂,甚至到了中年失业的状况。这一方面是 IT 行业本来变动就大,并没有一个行业能容你呆很长时间,比如电信没落,网络彩票不让搞,P2P 违法和金融 IT 投资下降等,另外一方面还是没有太多时间和精力学习炫酷技术,以此进入好的公司。 关于未来,前景不明,但对于我的开源 Beetl 和 BeetlSQL,我一定会坚持维护下去,在我规划中,至少还有 3 年的时间去完善剩下的功能和使用体验,我也找到一些志同道合的人一起维护。 希望 10 年以内,一提到模板引擎,都把 Beetl 作为技术选型之一,一提到数据库访问,能想到 BeetlSQL 也是备选工具之一。

(插图备注:科学家一直没搞明白猿人进化成人类的关键步奏,我从 996 得到启发,也许高强度劳动是关键)

知行合一