坂本龙马曾经对土佐勤王党成员桧垣直治说:“今后在室内乱打乱斗的情况会多起来。我喜欢小太刀,小太刀灵活,比太刀实用〔当时流行太刀〕。”之后直治带了小太刀再见龙马,他却掏出来一柄手枪:“这个比小太刀更具威力。”坂本龙马拜胜海舟为师后,直治带了枪再见龙马,这次龙马掏出的是一部《万国公法》(一本国际法方面的书):“手枪只能杀伤敌人,此书可以振兴日本!”西乡隆盛曾对坂本龙马说:“你前天所说的和今天所说的不一样,这样你怎么能取信于我呢。你作为天下名士必须有坚定的信念!”坂本说:“不是这样的。孔子说过,君子从时。时间在推移,社会形势在天天变化。因此,顺应时代潮流才是君子之道!西乡,你一旦决定一件事之后,就想贯彻始终。但这么做,将来你会落后于时代的。”

上面这段话,摘自维基百科关于“坂本龙马”的条目。这段话给我很大的震撼:那可是明治维新时代啊!只有思想家才有这样的见识和洞察力。可为什么说起他?因为在跟群内的朋友聊最近发生的“格斗狂人20秒KO太极高手”的事情。我提到,李连杰的经典电影《精武门》里面的高手船越跟陈真有过一段精彩的对话:

船越:中国人的武功是强调个人的修为,而不注重实战。

陈真:技击的目标是讲求击倒对方。

船越:你完全错了,年轻人我告诉你,要击倒对方最好的方法就是用手~枪。练武的目标是要将人的体能推到最高极限。

这段话,是影片的精彩之笔。然后朋友告诉我,这来源于坂本龙马,遂查询到坂本龙马的资料。

铺陈了这么多,我到底要说什么?其实很简单:人要与时俱进,顺应时代潮流。

这对于技术也是一样的道理。即不要固守既有的东西,不要永远抓着一个东西不放,仅仅因为你过去对它很熟悉。对于Windows开发、.Net、C++语言,我也持这个态度 – 它们过时了,已经不能代表产业的潮流。当然,这并不是说它们没用,而是说,当你有机会做选择的时候,可能在大部分场合都不会选择它们。因为总有更佳的方案可以替代。

我以为整个产业的重点,早已从单机模式转向移动设备及其相关联的互联网服务上。而且还会有进一步的发展和转移,比如智能设备。

微软公司没有抓住机会并顺应这一潮流,这是它们丧掉信息技术浪潮之巅的根本原因。它在Internet刚兴起的时候就错过一次,而且连带着缺乏革新的C++一起衰落了。要知道,多年以来Windows上核心的开发技术,都是以C++为主的,要使用Visual C++工具包。程序员里面,能熟练使用C/C++开发的,那真的是有相当不错技术功底的。在“程序员鄙视链”中,位于顶层。不是因为语言太难学 – 这是一部分因素,核心原因是因为缺乏高度抽象、优秀的封装,开发者不得不亲自对OS的API接口进行操作,学习操作系统底层的设计、准确理解各种重要概念、精确操作各种进程、线程、同步接口等等。这些东西不是朝夕之功,需要很长时间的积累。

Web时代来临,单机操作系统的重要性大大下降。因为信息需求的本质,是要传播。这个时候,单机就成了生产力工具了。

Web就是OS。你可以根据这个论断,映射一下:

应用程序 – 网站;操作协议 – HTTP;文件系统 – 数据库/分布式;打开网站 – DNS;检索信息 – 搜索引擎;这种类比有一大串。

Web开发迅速改进、革新,发展速度比起传统单机软件开发模式,感觉快了10倍。10多年前的网站开发还很原始简陋,现在你再看看?翻天覆地。而你再看看Windows单机软件的开发,甚至连画个图片按钮都得自己从头来,这什么年代了?这充分反应了社会需求。

移动互联网兴起10年,人类真正实现了“信息在指尖”的梦想。Web其实是跟着移动开发一起进步的,并未衰落。因为移动设备后面,可全是一套套的Web技术在支撑服务啊。它们是互补融合的。

而在这些一套套的技术里面,C++已经给逼到了墙角,基本没什么位置了。或者从另外一个角度说,C/C++已经变成基础工具构件,专门用于系统、其它工具的开发。比如用C/C++实现其它语言的引擎。但是具体的应用级工作,大半退位给其它选项。你会用C++去开发web应用么?除非去开发服务器扩展,否则不会。因为那是自寻烦恼,系统的瓶颈是I/O,不是CPU,用脚本性能足够好了,而且开发速度快得多,维护也容易的多。

另外,语言之争,已经演化为社区之争。典型表现就是分发系统。各种流行的脚本语言,都有自己设定的打包分发系统。如PHP的Composer,Javascript的npm,Python的pip等等。社区设定标准,只要符合标准就可以上传分发,下载使用。这种模式下,开发跟搭积木无异,要什么功能?直接找个实现的最好的包,拿来用就是了。除非你觉得不满意,无法满足自己的需求,想重搞一个。否则没理由重新发明轮子。你告诉我C++的代码咋分发?一套C++ Class发过来,连编译都无法跨平台。在语言实现上,Python/PHP/JS这类语言有天然的优势。这种开发效率,比C++快了N倍。

过去,C++开发有个比较强的需求:客户端。操作高效、使用流畅的客户端还是有它的应用场景的。但这个需求在减弱。

一是移动端、Web端在侵蚀,对Windows客户端需求不再那么强烈了。笔记本、台式机厂商的日子比较难过。

二是其它语言特别是用Html5/JS/CSS技术实现的客户端,日益成熟。早晚会吞噬C++ UI开发的大部分市场。早期的HTML界面实现很弱,缺陷很多,特别是性能。但是基于高效的V8 JS引擎、webkit引擎内核技术的新开发模式,已经脱胎换骨。因为并不调用什么IE接口,没有那么多跨进程的COM调用消耗,所以性能好得多。

三是实现效果大相径庭。基于新一代CSS技术的UI,效果绚丽,个性化突出,这些完全是C++ UI开发望尘莫及的。C++想实现出来?累死你。而且这也不是业务逻辑,做它又觉得亏。

眼下多语言竞争、分割应用需求是大趋势,每个语言占据各自的山头,再向外延伸。PHP专注于WEB开发、Java做后端应用、Python做网络、数据分析、JS做前端应用,如此等等。这种条块分割,也逼着你要多学点不同的编程语言了。

对C++熟悉的人,优点是基础好,缺点是思维往往被微软那一套模式束缚了,学的越是好,摆脱起来越是难。但是如果确实摆脱了,功力又确实比只会脚本的深。出个什么状况,可以一口气扎进去,翻看源代码,追踪系统调用,彻底理解并解决问题。遇到脚本的性能瓶颈,用C/C++做个扩展模块,性能如飞。

所以各位如果碰见好的C++开发,尽量别错过,拉进来,让他转型。技术水平上有很大把握优于直接从脚本开发入行的人。

只会C++开发的朋友,也关注点新发展吧,坚守没有意义。顺应时代潮流才是君子之道。