回顾Qt的发布历史,窥探大型开源商业项目的迭代周期

246 阅读7分钟

300px-Qt-history-logos_1995-2015.gif

近年来,中国的开源产业发展的如火如荼,不但每年的开源项目数量都在进行大量的增长,也逐渐获得了一些历史悠久的知名开源项目的话语权,但目前国内还少有开源项目的活跃时间能超过5年,一是因为我们起步很晚,早些年没有时间和精力放到开源事业上。二是许多开发人员对开源项目的维护认识还较为空白,组建一个成熟的社区需要时间。三是缺乏大型项目长期开发的迭代经验,许多项目的往往是推倒重来,而不是重构持续维护。当然还有许多较为深层的原因,这里不必多说,那么如何去让大型项目的平稳的迭代下去呢?不妨借鉴一下有着28年历史的Qt框架。

为什么我选择Qt进行介绍呢,一来是名誉一直很好,少有争议,不像Firefox、eclipse、mysql、MongoDB等其他开源产品或陷入停滞或惹上许多争议,至今几乎都是优秀桌面应用的最佳方案,不但在linux上不可替代,连微软的一些系统程序都使用了Qt。二来是项目周期确实足够长,时间是理想最大的挑战,它显然经受住了。最重要的是,他的商业化是最成功的,虽然也得益于它是最传统的软件模式,但也很值得参考,只有中国出现了成功的商业化开源项目,开源才能真正做出模样。

Qt的历史渊源

1988年,Haavard Nord(Trolltech 的CEO)受一家瑞典公司委托开发C++ GUI框架,这引起了他对C++ GUI 开发的兴趣。1990年,他和Eirik Chambe-Eng(Trolltech 的总裁)共同开发用于超声波图像的 C++ 数据库应用程序,这个程序需要能够在Unix、Macintosh和Windows上运行,当时没有框架可以参考,只能分别开发不同的几个程序。在挪威特隆赫姆的公园长椅上,他们构想出了这样一个跨平台的GUI框架,它能运行在不同的系统上,展现出相同的效果,却只需要写同样的代码,他们并不限于空想,而是马上开始动手,1991年,Haavard就开始编写最终成为Qt的类,并与 Eirik合作进行设计。

第二年(1992),Eirik提出了Signals & Slots(信号与槽)的概念,这几乎成了今天诸多UI框架的必备的通信方式,也一直是Qt的核心机制,当然这也并不是Eirik的首创,当时已经有一些工具包在使用类似的方式。

到第三年(1993)他们决定全职进行这项工作,Haavard 和 Eirik 开发了Qt第一个图形内核,并能够实现他们自己的小部件。年底,Haavard 建议他们一起创业,打造“世界上最好的 C++ GUI 框架”。

问题出在第四年(1994),两位年轻的程序员想要进入一个成熟的市场,首先这还是一个未完成的产品,其次找不到客户,没有经济来源让人感到担忧,万幸的是他们两人的妻子都有工作,这两年的时间完全靠她们工作的经济来源支持她们的丈夫。

4月份他们两人成立了公司Quasar Technologies,但请不要误以为这就是Qt的简写,因为Qt这个名字其实他们早就想好了,Qt的Q只是因为Q在Emacs字体中看起来很漂亮,而Ttoolkit的首字母,当然不能起个这样名字的公司了,所以注册公司的时候他们命名为Quasar Technologies

1995年4月,通过 Haavard 的一位大学教授联系,挪威公司 Metis 给了他们一份基于Qt开发软件的合同,还没做成,就有了合同,这无疑让人很兴奋,一个月后,他们就做成了第一个可用版本。

5月20日,Qt 0.90被上传到sunsite.unc.edu。6天后,他们又发布到了comp.os.linux.announce上。这是 Qt的首次公开发布。这个版本同时兼容X11和Linux,使用双重许可证,商业用途就用商业许可,同时开源版就用他们自己做的FreeQt许可证。

但和许多失败的创业之路一样,将近一年的时间里,没有一个人购买商业许可,但不同的是,一年之后奇迹降临了,1996年3月,欧洲航天局成为第2个Qt客户,一次购买了10个商业许可证,到此可以说,Qt大获成功,走出了自己的路。

Qt的发展脉络

1996年9月24日,Qt 1.0问世。可惜这个神奇的版本由于岁月变迁,如今已经完全丢失。到年底Qt 1.1发布时,已经有来自不同国家的8位客户购买了18个许可证,但这些版本已经都找不到了,如今官方能提供的最老版本是1.41,这是1998年10月2日发布的,它仅有2.5M,相比如今Qt 6.5.2这个1.2GB的庞然大物,它竟是如此的小巧。不要小看这2.5M,其中有1881个文件,74672行C++代码,1939行C代码与13391行头文件,如此的体量已经不算小了,但文档与用例仍然占大约一半的空间,分doc和html两种格式,能在早期就把文档做的这么齐全,想必也是Qt成功的一部分因素。

虽然现在最早只能找到Qt 1.41的包,但还是能找的许多岁月痕迹,在gitlab.linphone.org上我找到了从Qt 0.91Qt 6.0.0历代版本的更新说明文件,从这些文件,大致可以窥探到它的一些细节。

API变更记录的非常详细,例如:

QImage.scanline() => QImage.scanLine()
QColor:
    setRGB => setRgb
    getRGB => rgb
    setHSV => setHsv
    getHSV => hsv

其实这些变更即便不写在文档中,开发人员也可以说是无缝衔接,毕竟这样的小变化一看就懂,但他们仍然把它记录下来,这当然是一种好习惯,这样的记录无疑给未来的代码风格指明了方向。通过这种细节,也能观察到团队的早期就很注意代码的优美,并不是抛掉细节全力赶进度,早早的解决了不当名词,没有让它们成为历史问题,现在很多开源项目结构上就不合理,后面也愈发难改了,新人也不好参与进来。

对于大版本的更新,他们能通过大量的更新文档制造出“山雨欲来风满楼”的氛围,Qt 1.4显然就是一个巨大的更新,在这一个版本添加了一百多个新功能,为了拖动功能制作了许多新组件,同时做了大量的异步与委托,但这个版本并不突兀,在之前的Qt 1.39,他们花了3个月时间频繁的更新这个一个版本,发布了10个更新说明,要知道以往都是1个版本1个更新说明,在早期就能把更新都做的如此详实,相比如今许多大厂的APP更新说明往往就是一句话,背后不知道有多么混乱。

1999年6月,Qt 2.0发布,这个版本将FreeQt许可证换成了QPL许可证,同时与之前的1.x版本二进制不兼容,支持了win95,win98,x11等当时流行的操作系统,在随后发布的Qt 2.1就开始做性能改进,减少内存消耗的同时提升运行速度,这时候它的包大小在x11单个平台上就已有5.4 MB,相比最初卖出去的版本翻了一倍

未完待续,关注我看后续更新

参考