最近人品爆发,图灵社区,InfoQ,51CTO相继对我做了采访,前两天我把InfoQ对我的采访张贴了出来,今天,图灵社区和51CTO对我的采访发布了(图灵的访谈 ,51CTO的访谈),我是一个有技术焦虑症的人,我的经历比较特殊,对大家来说可能也没有什么意思,这两个采都有一些重叠的部分,不过有些观点我想再加强一些,并放在这里和大家一起分享一下。
对于日新月异的新技术,你是什么态度?
遇到新技术我会去了解,但不会把很大的精力放在这些技术(如:NoSQL,Node.js,等)。这些技术尚不成熟,只需要跟得住就可以了。技术十年以上可能是一个门槛。有人说技术更新换代很快,我一点儿都不觉得是这样想。虽然有不成熟的技术不断地涌出,但是成熟的技术,比如Unix,40多年,C,40多年,C++,30多年,TCP/IP,20多年,Java也有将近20年了……,所以,如果你着眼成熟的技术,其实并不多。
我的观点是——要了解技术就一定需要了解整个计算机的技术历史发展和进化路线。(这个观点,我在《程序员练级攻略》和《C++的坑多吗?》中提到过多次了。)因为,你要朝着球运动的轨迹去,而不是朝着球的位置去,要知道球的运动轨迹,你就需要知道它历史上是怎么跑的。
如果要捋一个技术的脉络,70年代Unix的出现,是软件发展方面的一个里程碑,那个时期的C语言,也是语言方面的里程碑。(当时)所有的项目都在 Unix/C上,全世界人都在用这两样东西写软件。Linux跟随的是Unix, Windows下的开发也是 C/C++。这时候出现的C++很自然就被大家接受了,企业级的系统很自然就会迁移到这上面,C++虽然接过了C的接力棒,但是它的问题是它没有一个企业方面的架构,而且太随意了,否则也不会有今天的Java。C++和C非常接近,它只不过是C的一个扩展,长年没有一个企业架构的框架。而Java在被发明后,被IBM把企业架构这部分的需求接了过来,J2EE的出现让C/C++捉襟见肘了,在语言进化上,还有Python/Ruby,后面还有了.NET,但可惜的是这只局限在Windows平台上。这些就是企业级软件方面语言层面就是C -> C++ -> Java这条主干,操作系统是Unix -> Linux/Windows这条主干,软件开发中需要了解的网络知识就是Ethernet -> IP -> TCP/UDP 这条主干。另外一条脉络就是互联网方面的(HTML/CSS/JS/LAMP…)。我是一个有技术忧虑症的人,这几条软件开发的主线一定不能放弃。
另外,从架构上来说,我们可以看到,
从单机的年代,到C/S架构(界面,业务逻辑,数据SQL都在Client上,只有数据库服库在S上)
再到B/S结构(用浏览器来充当Client,但是传统的ASP/PHP/JSP/Perl/CGI这样的编程也都把界面,业务逻辑,和SQL都放在一起),但是B/S已经把这些东西放到了Web Server上,
再到后来的中间件,把业务逻辑再抽出一层,放到一个叫App Server上,经典的三层结构。
然后再到分布式结构,业务层分布式,数据层分布式。
再到今天的云架构——全部移到服务器。
我们可以看到技术的变迁都一直再把东西往后端移,前端只剩一个浏览器或是一个手机。通过这个你可以看到整个技术发展的趋势。所以,如果你了解了这些变迁,了解了这些变迁过程“不断填坑”的过程,你将会对技术有很强的把握。
另外,我听到有很多人说,一些技术不适用,一些技术太学院派,但对我来说,无论是应用还是学术,我都会看,知识不愁多。何必搞应用的和搞学术的分开阵营,都是知识,学就好了。
技术的发展要根植于历史,而不是未来。不要和我描述这个技术的未来会多么美好(InfoQ 的 ArchSummit大会上有一个微软来的人把Node.js说得跟仙女一样,然后给了一个Hello World),我承认你用一些新的技术可以实现很多花哨的东西。但是,我认为技术都是承前的,只有承前的才会常青。所以说“某某(技术)要火”这样的话是没有意义的,等它火了、应用多了,规模大了,再说。有些人说:“不学C/C++也是没有问题的”,我对此的回应是:如果连技术主干都可以不学的话,还有什么其他的好学呢?这些是计算机发展的根、脉络、祖师爷,这样的东西怎么可以不学呢?
另外,我们要去了解整个计算机文化,我觉得计算机文化源起于Unix/C这条线上(注意,我说的是文化不是技术)。我也写过很多与Unix文化相关的文章,大家可以看看我写的“Unix传奇(尤其是下篇)”。
可是在应用环境中,对新技术的需求是很高的,你觉得在教育领域计算机科学的侧重应该是什么样的?
学校教的大部分都是知识密集型的技术,但是社会上的企业大部分都是劳动密集型的。什么是劳动密集型的企业呢?麦当劳炸薯条就是劳动密集型的工作,用不到学校教授的那些知识。如果有一天你不炸薯条了,而要去做更大更专业的东西,学校里的知识就会派上用场。有人说一个语言、一个技术,能解决问题能用就行了,我不这样认为。我觉得你应该至少要知道这些演变和进化的过程。而如果你要解决一些业务和技术难题,就需要抓住某种技术很深入地学习,当成艺术一样来学习。
我在“软件开发‘三重门’”里说过,第一重门是业务功能,在这重门里,的确是会编程就可以了;第二重门是业务性能,在这一重门里,技术的基础就很管用了,比如:操作系统的文件管理,进程调度,内存管理,网络的七层模型,TCP/UCPUDP的协议,语言用法、编译和类库的实现,数据结构,算法等等就非常关键了;第三重门是业务智能,在这一重门里,你会发现很多东西都很学院派了,比如,搜索算法,推荐算法,预测,统计,机器学习,图像识别,分布式架构和算法,等等,你需要读很多计算机学院派的论文。
总之,这主要看你职业生涯的背景了,如果你整天被当作劳动力来使用,你用到的技术就比较浅,比较实用,但是如果你做一些知识密集型的工作,你就需要用心来搞搞研究,就会发现你需要理论上的知识。比如说,我之前做过的跨国库存调配,需要知道最短路径的算法,而我现在在亚马逊做的库存预测系统,数据挖掘的那些东西都需要很强的数学建模、算法、数据挖掘的功底。
我觉得真正的高手都来自知识密集型的学院派。他们更强的是,可以把那些理论的基础知识应用到现在的业务上来。但很可惜,我们国内今天的教育并没有很好地把那些学院派的理论知识和现实的业务问题很好地接合起来。比如说一些哈希表或二叉树的数据结构,如果我们的学校在讲述这些知识的时候能够接合实际的业务问题,效果会非常不错,如:设计一个IP地址和地理位置的查询系统,设计一个分布式的NoSQL的数据库,或是设计一个地理位置的检索应用等等。在学习操作系统的时候,如果老师可以带学生做一个手机或嵌入式操作系统,或是研究一下Unix System V或是Linux的源码的话,会更有意思。在学习网络知识的时候,能带学生重点学一下以太网和TCP/IP的特性,并调优,如果能做一个网络上的pub /sub的消息系统或是做一个像Nginx一样的web server,那会更好。如果在学图形学的过程中能带领学生实践一个作图工具或是一个游戏引擎,那会更有意思。