今天看码农周刊里有一篇文章介绍Borg,是关于大型企业资源管理的,里面提供了百度Matrix系统的InfoQ的视频链接。里面是百度Matrix团队的负责人做介绍,讲的是如何通过Matrix这个集群资源调度系统来管理几十万台服务器。当然了,大公司对服务器资源的利用率、错误的处理率、自动解决问题的要求确实很高,毕竟机子很多,从量上就有这个必要。看了这个,也让我拓宽了自己的视界。闲话少说,说一下个人的对于语言的面向对象观。
教科书书上通常都会提到面向对象的四大特性,多态性、封装性、继承性、抽象性。而我们开发中用得比较多的是多态性,解耦、组合。我们也知道,最开始的c是面向过程的。我相信很多人哪怕是会用C#、Java这种高级语言,他们写代码都还是面向过程的。所以面向过程是很好理解的,而且它是解决问题的一种方式,和面向对象相比,是没有孰优孰劣之分的。哪怕后来的软件开发提出了很多概念,比如面向方面、面向接口等,它们都有自己存在的理由。
正如当下机器学习比较热门,在那个曾经满天下都是c的年代,c++也很热门。计算机的不断发展,总会有新的问题出现,需要我们解决。c最开始是拿来写unix操作系统的,后来操作系统都差不多定型了,有了POSIX概念。人们在现实中尝试处理比如文档的编排工作,微软的word就是那个时候出现。人们尝试将软件伸向它所能解决的方方面面,各种实际的具体行业软件。在这些软件的开发中,发现面向过程开发起来太不方便了,于是c语言的发明者,也是c++的发明者,搞出了c++。我相信他必定是个哲学家,理解用计算机语言来为现实的问题对象建模(这里的对象非软件中的对象,可以通俗的理解为业务、东西)。后来vb这玩意儿也蹦出来了,尼玛,开发图形界面真是容易,面向对象真是太easy了。总之,这是对于软件开发的一场革命。而当下,很多行业软件都有成熟的解决方案。同时,一些新的问题油然而生,人工智能、数据挖掘。社会总是进步的,当技术提升到了一个层次,它所能解决的问题的难度也就跟着提升,这个进步是无穷止境的。
面向对象抽象了自然界万事万物的个体特性,使之在软件开发中跃然于纸上,提升了开发的效率,问题理解起来也容易。我觉得这合乎人的思维常识,学起来也容易。c++是静态语言,意思是说,某个类在运行时生成的对象,它的行为已经确定了,哪怕它活得再久,都不会有所改变。那么动态语言呢,对象在存活以后是可以增加或者删除自己的行为、属性,比如js.那么为何会出现动态和静态之分呢?很多人会很顺溜的使用这两种语言,但是未必会对它的出现有所思考。比方一个婴儿,最开始的时候他能有什么行为,什么属性呢?比如吃奶、撒尿,有体温、有触觉。那么这个婴儿他长大以后呢,他还找他妈妈吃奶么?正常人而言,他不会了,他会吃饭了。他的行为已经改变了,这个用静态语言是不能描述清楚的。所以我觉得动态语言的出现,是为了反映世界万物的变化性。这个世界所不能停止的就是变化。
那么静态语言的用武之地呢?我认为是很瞬时的事物,比如网站的订单,在某一刻产生,它的相关信息就确定了,在后期不会出现很多变化。静态语言擅长的是业务对象在后期不会出现大的变化的情况,这种在现实中很多。但是,业务对象在后期变化的更多。简而言之,用静态语言开发自然而然会提升复杂性。因为变化是必然的,需求不是确定的,那么你定义的对象在后期的行为属性的改变提升了其复杂性。复杂性只是变化的另一种表达。规避复杂性的一个措施就是解耦,注重代码的维护性、伸缩性、复用性。设计模式就是解耦的一种手段,而模式就是用的多、总结下来的比较通用的手段。同时,静态语言的简单明了性,使得多个开发人员同时开发,理解业务、理解工作提供了便利性,但是代价就是其隐藏的复杂性。各种开发手段都意图分摊开发的复杂性,比如TDD.基于测试,但是开发人员也花了时间来写测试,测试也有其复杂性。软件开发的复杂性在需求已有的情况下是恒定的,后期添加需求是不断的提升复杂性。所以不同的开发方式不过是分摊复杂性,减少因复杂性而带来的不必要的时间和精力的浪费。一个对象,当它代表一种事物,比如一个人,人是很复杂的,方方面面的,你很难用一个类来刻画她,很难描述清楚。似乎我说的这些,都在为动态语言献花,都在说静态语言是蹩脚而有失自然的。
那么动态语言呢,若是没有良好的定义,良好的规约,那么开发人员可以在任意的地方,为其动态的添加行为属性,那么维护不啻于一场灾难。曾经看过阮一峰的介绍Lisp的文章,说全世界会Lisp的不多,可能这门语言太学术、太有内涵了,尽管其开发效率高,有很多有意思的特性,学起来依然不容易,这门语言是何方神圣我也不了解。动态语言通常来说,开发的过程中,也会学习静态语言的特点,最开始就定义好行为属性,后期的改动也会考虑一些可维护性的举措。腾讯的soso地图js api我接触过,就是这种设计,有命名空间层级的概念,对象中也有相互组合的行为。动态语言无疑是优秀的,静态语言也有它的美好之处。
说到这里,有没有一种好的语言能够降低当下语言的复杂性,能尽可能真实的表示世间的万事万物呢。至少目前我了解的是没有,请恕我孤陋寡闻。语言在目前来说是死的,如果把它弄成活的,那应该是软件开发的第三次革命(第一次、第二次是面向过程和面向对象的出现)。怎么说呢?我认为是以动态语言为主体,加入自描述信息(稍后我会给出我的概念),对象在行为和属性的动态改变的时候,能有意识的认可或者阻止这个改变。自描述信息,可以理解为一个对象对于自身的自我认识,它知道自己能做什么,它知道自己不能做什么,它知道自己有哪些行为特征,它依赖于知识库(这个知识库所有对象共享),与其他的对象能够彼此通信、协作。好吧,这是一种有生命的语言,而我的描述也不尽全面。可以这么说,这种语言依赖于庞大的知识库,依据自描述信息来创建,从知识库中拿到自己需要的信息。这种语言的实现让我想到了搜索引擎,从知识库中拿自己的信息不就是检索么。而语言行为特征的判断让我想到了机器学习,前面说了,语言有能力认可或者阻止自身行为属性的改变。
看书、看博客决不能盲从,要结合自己的亲身体会来思考。“择其善者而从之,其不善者而改之”!这里,我写下了自己的思考,绝不是从别人的书上照抄过来,我也相信这些认识在以后会改变。最后,我认识到,我的这些想法在那些搞机器人的眼里只是起步,他们的研究早就跨过了我这个认识。那么,如果有这样一种活的语言,开发机器人,让机器人具备灵魂,也是迟早的事了。So,Keep Stupid!