本文的视点都是从我的认知、视点来讲的,与实际的gui发展史并不一定契合。

微软这两天开源了Visual Studio Code,看了一下介绍,是基于Electron项目,下面是Electron项目的地址:

https://github.com/atom/electron

官方对这玩艺儿的说明是Build cross platform desktop apps with web technologies,联想到最近这些开源的ui解决方案越来越火,不禁让人想回忆一下我从上学以来接触到的那些gui编程虽然现在已经只和黑窗口打交道了

大多数的码农在大学里的入门课可能都是C或者C艹,这两门语言一般不会直接拿来写网站,或者GUI程序,所以即使按照学校的课程套路一两年学习下来,也很难编写出什么看得见摸得着的,至少像自己平常在使用的桌面应用那样的程序。这样也就造成了学习的成就感下降什么的,或许这是很多计算机科班出身的人大二的时候就觉得这个学科没意思?的原因吧。

当然我是在胡扯。

这只是我个人的想法,当年我觉得学习了一年写代码然而我写的代码还是没有颜色就是非常地low。所以我就开始在课余时间物色怎么着能写一些带颜色的程序。然后首先接触的就是MFC。然而MFC这东西,学过的人都懂,语法丑陋难懂写起来像吃屎,也就是因为微软自己的Ribbon库一开始只有MFC可以直接拿来用所以我觉得有些人才会勉强吃屎去学这种东西。当然了,也有一部分历史原因在。在看了半个月MFC但是发现我还是什么都不会写之后,我就毅然决然地开始找一个更好用的界面库,然后就分别调研了java的swing,还有C++派的Qt。

Qt在那个时候赢得了我的心,不过那时候的考虑还是很年轻。只是因为觉得java很慢,很low另外还有java程序员工资低。Qt原生应用性能非常不错,而且不是很难看,至少说明设计这套sdk的人的审美没什么大问题,程序跑起来一让人感觉逼格满满的。最重要的是,官方文档做得详尽,几乎所有的函数都有调用样例(顺带一提,在Qt之后我就再没有见过比Qt的工程师写的更好的文档,这些家伙还是挺厉害的);并且demo也很丰富,几乎覆盖了gui编程的方方面面拿起来就能抄你说爽不爽,拼巴拼巴就是一个自己的程序了,分分种写出一个记事本。说来也挺有意思,那个时候北理的一位同学经常和我交流,他们的课程更偏重于实际项目,所以我总会有一种他什么时候都走在我前面的错觉,比如我还在上数据结构和算法的课,天天为了这个排序怎么实现那个堆为什么是那样的意思而焦头烂额的时候,他就已经在向我炫耀自己写的记事本程序了。所以那段时间我真是很忧桑,天天在怎么办怎么办的忧虑中度过。然后才促使我去学gui编程。

至少Qt解决了我那个时候的烦恼,学习qt的时候接触到qt里的界面元素可以用qss来修改样式,而qss的概念是脱胎于网页设计里的css。所以在Qt之后我就去看网页设计了233,还买了一本厚厚的css入门经典,现在回想起来,又不是css3的时代,个css就能讲解那么一厚本书,老外也真是“厉害”。这个厉害当然是贬义,后来为了学习其它乱七八糟的东西我又看了很多老外的技术类书籍,但是总感觉这些做技术的为了骗稿费还真是能多废话就有多废话,为了解明白一点技术原理能连着举出三个完全不贴切的例子。当然了还是硬着头皮啃下来了,那个时代国人写的技术类书籍并不多,有也是谭浩强之流的误人子弟的垃圾语言教学书。GUI和网页都学了一些皮毛之后,我大致对两种类型的编程区别有了一些认识。GUI编程和网页编程的显示部分其实都是一种XML,GUI可能就是纯粹的XML定义,而网页是特化的一种xml->html,这点上其实区别不大,但是逻辑层差别就大了,网页上前端都是拿js或者js库来编写动态逻辑,但是GUI程序则是完全不同的语言,可能是C++,也可能是java。

那时候我在电脑上装了一个网易有道的词典,我一直比较纳闷他们的经常变化的本地GUI是怎么实现的,然后一次偶然的机会,我觉得他们的广告实在是太烦人,在网上搜索一番发现了去广告方法,然后照做的过程中发现他们的代码目录竟然是一堆js代码,我甚至能直接看得到所有向服务器发送请求的ajax代码。这点着实刷新了我的三观。这也是我自己印象中的第一次看到有人直接用网页编程的技术来写一个桌面GUI程序。

那之后一直到RIA时代之前,网页编程和GUI编程都没有什么大变化。到了RIA时代,突然来了三家竞争对手宣称要占领这个市场,Adobe的flash,微软的silverlight,Java方的Javafx,那个时候Adobe还搞出一个Adobe Air,能够让flash程序直接运行在windows等桌面平台的本地,让程序可以跨越浏览器的限制而运行,不只是跑在浏览器里的web程序,这一瞬间就让web编程的触角伸到了桌面领域。这之后风生水起的Adobe几乎快成为了RIA的事实标准,甚至百度在百度贴吧里的漂亮的图表和投票也都是用的Adobe的插件来完成。

然后没过多久,RIA的概念就陨落了,Adobe虽然打败了另外两家巨头,但是却被多家巨头围剿,这些巨头制定了新的标准,并且让浏览器强制更新来支持这个标准,借此来驱赶他们认为的“效率低下,漏洞多的flash插件”。这个标准就是html5。当然了,他们说的也是事实,不过这件事情本身也并不是那么厚道,Adobe虽然后来也开始拥抱html5,但我觉得那些从RIA时代走过来的人心里肯定也不怎么舒服。所以你再牛逼还是架不住巨头围剿,少年得志的时候,大佬们就直接用下一代标准掐死你。

同时桌面GUI编程也在发展,Qt推出了5.0的Qt Quick,用QML(一种类css语言)和js来写界面,那个时候我并不理解,原生的性能那么好,为了降低写Qt程序的门槛而引入这些东西有什么意义。但是现在看来,做Qt的这些人还挺有前瞻性,虽然并没有什么毛用。因为Qt这两年的境遇也稍微有点尴尬,虽然在linux界混得风生水起,也被用来做一些超大型的桌面GUI软件,而且还在嵌入式领域有不俗的表现,但从Qt的社区、还有QQ群的活跃度来讲,毫无疑问,Qt在走下坡路,整个GUI编程界都在走下坡路。当然,gui编程界后来做的Xml+其它简单易懂的脚本的编程方式非常的靠谱。

我说他走下坡路又是为什么呢?是因为桌面GUI的领域在被那些web技术栈蚕食着吧。就算Qt Quick再怎么好用,也还是不如web原生的html、css和js简单。

反观开源界,js的本地解释效率变高还不是因为google的V8以后各种直接用web三贱客来做本地应用的方案就越来越多了。以前的网易有道并没有公开过自己的方案,但他们的思路和后来这些用web技术栈来写桌面程序的思路不谋而合。

然后就是Atom这类编辑器的诞生。这还没有完,因为现在写一个gui门槛是如此地低(褒义),我觉得未来的几年间,类似的应用会如雨后春笋一般出现。

你看,visual studio code不就来了。