Category Archives: web

Web应用开发架构的演变

拓荒时期,1995~1998

彼时开发主要以CS模式占主导地位,每一个产品的Client端和Server端的通信都是私有的二进制协议或者基于某种文本描述的协议,例如SOAP( 1998 ),XML-RPC,或者DCOM,CORBA类似远程过程调用框架。其中远程过程调用的概念出现的非常早,而且这一概念一直延续到今天,目前看来大家在分布式系统中更倾向于这种通信方式,比如facebook的Thrift。Google的ProtocolBuffer和Apache的Avro更像一种数据打包方案。Java语言从一开始就集成了对CORBA的支持和对RPC的支持——RMI。拉回web开发来说,1994年网景浏览器发布(基于http 0.9 1991年发布),给大家无限可能的想象,把整个世界装在一个浏览器窗口,而http协议本身在1996年才完成了1.0的草案。那时候BS模式的开发绝对是超级激进的方式,绝大多数的网站都是以展现静态内容为主,没有web应用( Web Application )的概念,website这个词使用了很长一段时间。老程序员们对当年手写一个静态页面100块的价格应该比较能感受到技术的价值。接下来,CGI( Common Gateway Interface )方案登上web后台的开发舞台,作为web后台开发的基础,这种架构一直延续到今天,并引发很多响应的变种Fast-CGI,WSGI,Rack,其本质就是在server端设置一些环境变量然后启动相应的脚本解析器执行内嵌的脚本,然后输出到浏览器端,好处是传统程序员擅长并且非常容易接受这种转变模式。

这个时候后端的代码呈现出来的特征很像后期jQuery繁荣时的一样,以页面为业务组织单位,哪里需要动态内容就插入脚本标签,html标签和业务脚本代码完全混在一起。

这个阶段一些奠定web基石的基础性软件apache http server ( 1995 ),PHP ( 1995 ),Perl 5 ( 1995 ),Java( 1995 )发展繁荣,搭配mysql作为后端数据库的web站点呈现爆发式的增长。

J2EE的统治时期,1999~2005

经历了web开发的无序混乱的拓荒时期,大家对BS这种模式已经不再有怀疑,但对能做到什么程度,是CS模式的部分补充还是将会慢慢的占据统治地位,这个时期是不存在大规模的现代意义上面对终端用户的的互联网业务的。广大开发者和企业一方面对BS的模式感到兴奋,一方面都在翘首盼望着一个杀手级企业应用开发框架来证明BS架构才是未来。1999年底,J2EE横空出世,2是跟随Java的大版本号Java 1.2,从这个版本开始,Sun一口气推出了J2SE,J2EE,J2ME三大平台,野心很大,也很有前瞻性,有这样的观点——Android也不过是J2ME的在一个移动平台的『借尸还魂』。当时最引人瞩目的无疑是J2EE平台。它的出现让整个企业级开发市场沸腾了,规范覆盖了企业级开发需要的方方面面,老程序员应该对当时Sun官方给出的几个示范应用,PetStore,Duke银行应该还有印象。

J2EE

J2EE规范把大量的底层支撑功能从业务实现层剥离到容器实现层,容器提供商负责事务,ORM,RPC调用,线程池管理,数据库连接池管理,服务实例池管理,消息队列各种『脏活累活』,程序员只管负责实现业务逻辑。蓝图很美好,队友很给力,Tomcat( 1999 ),Weblogic ( 1999 ),Websphere ( 1999 ),全世界的程序员都很兴奋,一时间,所有的企业级应用都在往J2EE平台上转,考虑到那个时候几乎没有多少面向终端用户的软件业务,可以说J2EE是整个软件开发世界当之无愧的王者。在一片叫好声中,也有一些负面的反馈,EJB体系过于复杂,学习曲线陡峭,我记得当时自己花了很长时间去理解EJB的Home接口,Local接口,Remote接口,什么时候应该用stateful Bean,什么时候应该用stateless Bean。至于前端基本奠定了Java bean + html的server渲染模式,跟CGI倒也差别不大。早期的软件开发世界,以一人之力撼动真个业界的现象一再出现,在J2EE开发领域,一个澳大利亚的程序员,Rod Johnson,今天说起来是个传奇了——Spring的创造者。他在2002出版的一本书在整个Java社区引起了巨大的共鸣,大家受够了EJB的复杂性,却苦于找不到更好的解决方案。

Expert One-on-One J2EE Design and Development

然而,这本书其实是『名不副实』的,它基本抛弃了所以的曾经J2EE鼓励的开发实践,他从一个普通程序员的角度,循序渐进的指出应该如何友好的去构建一个系统,正确的面向对象设计实践。直到今天,这本书对于软件开发来说仍然具有相当的指导意义,我自己是常看常新。2004的他的另一本书再次受到了社区的追捧,JavaEye组织的翻译也很好。但就我认识而言,这本书的深度远不及一本书,它没有涉及过多的思考过程,而是机械的告诉怎么做是对的。

Expert One-on-One J2EE Development without EJB

今天看来,结果就是,Spring社区已经一统Java server端的开发,想想还是很震撼,仅凭一己之力。

互联网繁荣期 2005~至今

2005年影响web开发世界最大的就是Ruby on Rails开发框架横空出世,又是一己之力,一个丹麦的程序员,一个24小时汽车拉力赛的世界冠军,当然也是我的偶像。

David Heinemeier Hansson 

他给我最大的启示就是一个程序员要有自己的思想,通过学习,实践的过程来求证,人云亦云最要不得。Rails给Ruby带来了2006的Tiobe的年度编程语言荣誉。一门新兴的语言依托一个强大的框架,直接在互联网开发领域占有一席之地。

我们就简单列一下流行的互联网服务搭建在Rails上,不出名的就不赘言了。

Twitter, GitHub, Shopify, Airbnb, Twitch, SoundCloud, Hulu, Zendesk, Square, Highrise, Basecamp

2005年Python领域的Django web框架也发布了,如今基于Python stack的互联网服务也很多很多了,Dropbox,Instagram,Pinterest,国内的豆瓣。

这个时候一个特点就是『快』,互联网红利完全体现在快这个字上,新兴的业务永远Beta快速发布,甚至Alpha发布,传统的企业级开发模式显然是跟不上这个节奏的。

这个阶段的开发框架大都遵循着『约定大于配置』的简单观念,放弃大部分不必要的灵活性,一个重要的结构烙印深深地刻在这些框架身上,遵循简单的Model-View-Controller架构,搭配框架内置的tool chain,一个命令就可以产生良好的应用主体代码框架,然后再遵循着框架约定,填入业务代码。

MVC

2006年有两件不能不提的以后会影响整个web开发的事是,

  1. 微软在2006年提出了异步请求的概念,并把它的实现加入到了IE 7之中,这就是我们今天熟知的XMLHttpRequest。之所以叫XML是因为它首先作为一个ActiveX控件被Outlook团队开发出来用来从server获取xml格式数据,然后IE 团队就直接拿过来使用了。
  2. 2006年jQuery发布,jQuery影响有多大,想想很多很多的人提请标准委员会浏览器直接内置jQuery实现便得窥一二。好吧,也是一个人,John Resig。可能更年轻的前端开发者已经不太知道大神的地位了,我记得现在流行的前端框架的开发者当时是非常兴奋的在twitter上发布说『John关注我们了,对,就是那个John』。

在2009年之前,这一段时期的web开发,已经有相当多的开发量从后端转移到了浏览器端的javascript的开发,javascript已经不再被当做玩具语言了,早期的时候,甚至浏览器可以配置是否禁止javascript,你可以想象是多么的可有可无。这个时期的代码体现在『绚』和『乱』上,各种绚丽的效果,大家都很兴奋头一次看到这么绚的UI交互效果,大量的jQuery plugin被开发出来。乱,就跟当初server端的代码一样,各种业务逻辑与dom操作混在一起。一些大的互联网公司封装了一些今天看来很重的js的前端框架,其核心思想就是要用开发传统桌面程序的方式来开发web程序,YUI和ExtJS ( 2007 )是其中的代表。

2009的时候,一个新的运行时平台,一个今天异常繁荣的社区出现了,nodejs平台,node社区,还是一个人,Ryan Dahl,他基于Google开源的javascript引擎V8实现了大部分的javascript类库,可不严格的类比于jdk之于JVM。在javascript发展历史上,这是极其决定性的一步。有了这一步,大家才开始考虑要有依赖管理,modular开发,面向对象,异步,同步,这也反过来极大的推动了javascript语言规范的发展,今天再看ES2015语言规范,跟当初的javascript已经完全不是一个样子了。

nodejs平台推出以后,有些技术的先行者就开始考虑能否用开发后端的工程化方式来开发前端,开发完成后,依赖一些构建工具来打包压缩所有的js引入页面。server端只作为api提供json格式的数据,整个应用架构看起来像下面这样子,

API

2009发布的backbone在当时绝对是让人瞠目结舌的,在此之后,更进一步,为了解决双向绑定,局部动态更新的dom操作效率的问题,提出了Virtual Dom和MVVM的方案,然后架构演变成下面这个样子,

MVVM

这样架构的一个潜在问题在于,前端代码的膨胀越来越厉害,即使经过了压缩,于是又有一些聪明人想结合传统的server端渲染技术,在server端引入js运行时来生成静态html代替原来完全在浏览器端用javascript来构建整个前端,这就是所谓的server端渲染技术。

ServerRendering

前端开发架构演变之快,实在是一日千里,单单拎出来前端部分,你看最近几年冒出来多少来势汹汹的前端开发框架backbone,ember,angular,react,vue,再包括各种先进的依赖管理,构建工具体系bower,grunt,gulp,webpack,然而其思想是统一的,工程化,模块化,组件化前端开发。

这样的开发方式,好与不好,见仁见智,对于大团队合作开发必然是有优势的,在我看来,有一点始终是需要提醒自己的,

不是所有的公司都是google和facebook

在软件开发领域,有一句著名的准则,

organizations which design systems … are constrained to produce designs which are copies of the communication structures.

直白来说,软件系统的划分基本上复制了开发这个系统的组织划分。

所以对于小的开发组织,创业公司,才用这种方式要慎之又慎,基本上要求每个成员都是多面手和熟手,不然每个项目面临下面的沟通方式,必然难以为继。

Conway

今天前端开发再不是传统意义上我们所称的『前端』——切一些图,写一些css和简单的javascript了。如今看来,其出现和繁荣可归于两个主要的原因,

  1. 移动互联网的迅速崛起,在移动端,用户需要更快速的响应,更丰富的交互体验,传统的单一请求响应方式,不足以满足这种需求。前端的开发复杂度急剧增大,必须有一种有效的工程化开发方式来指导和构建。
  2. node社区的急速繁荣,这得益于以下原因,
    1. javascript天生就是为web开发准备的,各大浏览器断无可能再发展另一种语言。
    2. Google V8 引擎提供了一个高效的运行时环境,使得基于javascript的server端开发成为可行的途径,V8之于javascript如JVM之于java。
    3. javascript基于回调的机制使其在IO敏感的应用领域表现出更好的并发性,而IO敏感正是绝大多数应用的瓶颈所在,只有极少数的应用需要大量的运算,对CPU有很高的要求。

天下大势,合久必分,分久必合,IT技术领域,不外如是。我们常常会看到当年一些被认为落伍的观念『借尸还魂』,以一种新的姿态,新的概念出现,加之其背后往往有强大的厂商推动,一些开发人员就会鼓掌叫好,跟随学习。这些都值得我们重新审视,从桌面应用到web应用,从J2EE到Rails,从web到native app,从native app到hyprid app,技术历程,一路走来,如果我们能够多一些梳理和反思,少一些狂热与追捧,也许我们便更可能看清自己的技术之路。