软件技术的转变常常是解决了某些痛点,本文来聊聊C/S架构的应用向B/S架构转变时相关的痛点。
其实这儿痛点很多,界面是其中之一。
C/S程序是网络通讯时代来临后,数据多机分发时,客户端程序界面依赖操作系统的图形API进行开发。C/S架构的客户端程序界面往往是用控件组成的界面,若干控件拼在一起,就像活字印刷是由一个一个的铅字块拼成一整页印刷面。
这里的痛点是界面和控制代码耦合在一起,同时不同控件的显示形式相互分离,若要改变界面的整体风格,那要将相关的所有控件都修改一遍。
转换为B/S架构后,客户端程序运行于浏览器这样的容器中。浏览器的实现给出了层叠样式表(CSS)的规范接口,同时控制交给解释型脚本语言Javascript()等,这样界面迎来了新纪元:用若干个“层”重叠后形成最后的界面渲染。这个理念和PS的图层概念相类似,先进的理念往往会在多个地方开花结果。早期幻灯机的幻灯片是一张一张被写了字的薄膜叠放在灯光下,反射在屏幕上呈现叠加后的结果,而Javascript负责躲在叠加后的层下面进行业务控制。
以后若在操作系统级别也采用类似的理念,比如GNOME支持CSS规范,同时也支持某种解释型语言(最好别再选择Javascript这种弱数据类型脚本语言的),整个程序可以用HTML来描述,操作系统的桌面本身是个浏览器容器,也就是说浏览器下沉到操作系统里了。如此,一次编写好的程序,或许就可以在各种异构的操作系统上运行,只要各个操作系统遵循相同的规范。
插个话题,谷歌的Chrome浏览器的内核的API成就了NodeJS,这应该是一个不错的预示,使浏览器沉入操作系统被预示为某种可能。从这个角度来说,国内那些浏览器厂商,开发的浏览器都只是个皮毛。拿人家的源代码过来改改,除了劫持用户信息和添加发放广告的模块等等之外,更实际的事情都做不来。至少我是没看到国内浏览器厂商哪家能将自己的浏览器的所有API都能梳理出来,然后搞一个NodeJS这样的东东出来。
当前MVC架构理念做软件的尽人皆知,其实当这 MVC中的V,也就是View被超然独立出来以后,这View本身就是一篇值得做的文章,特别是CSS规范不断发展并深入人心同时网络应用越来越被广泛需求的时候,构建View也就成了软件工程中重要的一环,它也有自己框架,常常被称为MVVM。
MVC:
当View渐渐要宣布独立之后,常常演变为:
成这个样子之后,View就可以跟下面两个兄弟相隔一个网络的距离,甚至有些单机程序,为了一些避不开的好处,它会假装一下自己也有网络,在单机的环境里虚拟一个网络出来迎合MVC的需要。
当View被彻底重视之后,它自己本身又演化成这个样子:
基于上面的描述,我给出的全栈建议是这样的:
- MVC的M和C,当前大多是用Java来写。我认为,除了Java的出生好,它是继承着C和C++踩过的坑而来。在我们国家的这正是各大高校的古典派计算机教授们的修炼路线,因而底蕴深厚。撇去这个不说,我认为Java用来写服务端程序,很得益于Spring这样的IoC框架,这个框架将面向对象理论之外的粗活打扫得干干净净,甚至在干了这些粗活同时,还衍生出很多巧劲十足的绝活。如此,SpringMVC这个架构扛起了MC的一大片天。若一个新生语言还没有孕生出自己IoC框架,一般我是懒得去看的。至于MC中的M,我还是看好Hibernate。
- 独立出的V,基于CSS和Javascript的话,我推荐用TypeScript书写的Angular2,原因是这儿有一个@angular/cli脚手架,简化或者说规则化了前端的开发,让单元测试这些工具有用武之地。Angular2优化了数据变更的触发机制,我认为现在Angular采用数据变化的侦测机制,是Javascript能做到的极致,即便有什么其它框架,只要它也要做相同的工作,无论被构建出的形式有什么不同,要做的事儿也无外乎那个样子,如此,怎么做也就未必有什么新意了。所以是否要选择Vue,还是Angular,可能仅仅是兴趣问题,而不是技术的问题。但从工程角度来说,我还是推荐使用Angular。
- 至于Android的V,它也是要MVVM的,因为ViewModel的价值在于数据双向绑定,显然Android不会撇下这个好处不要的,唯一不同的是,它是用Java来来实现MVVM的。
这是我的一个全栈推荐。当然,其中任何一块都有各种选择,比如后端你可以用Nodejs、Python、PHP等等来替换Java。前端的框架手段更多,琳琅满目。总之,你若从整体上明白这前前后后的划分,就好像有了佛祖在胸中坐着了,选择什么语言,选择什么框架,那就只是酒肉穿肠过。但愿你不要挑食,什么语言都能吃得下,那才是最好的。
特别的,最近出了大牛,叫kotlin。这个语言是java弟弟,他们共用JVM这个娘亲 。因为这个原因,它可以作为后端MC的开发,也被用作Android的开发语言,更神奇的是它可以作为Javascript的开发语言,这语言似乎能让你用一招就成为武林高手,这确实不可不察。唯一的缺点是它暂时没能写Angular,或许以后会有的。