我们整天说着前台(前端)、后台(后端)。到底什么才是后台?
前台,后台
前台(前端)后台(后端),在英语中即:Front-End,Back-End。广义上的前端包括客户端(PC、Android、IOS等),现在有个说法叫:大前端。后台即通常意义上的Server。没错,就是在互联网诞生之初即存在的C/S架构。服务的提供方称为Server,一般是一个偏中心化的服务集群。客户端Client为用户接入服务的控制重点。C/S架构有明显的主次之分,这与后来产生各类种子(BT、电驴)下载技术的P2P对等网络相对应。在P2P网络中不区分C或S,每个节点既是C也是S,这便是对等(Peer)网络。
言归正传,后台一词描述的还是Server这一概念,不过由于网络规模的增大,数据量的攀升,Server的后台架构也变得越来越复杂,分层越来越多,早已不是简单Server一词能够囊括的了。
大学的时候,我看到腾讯招聘后台工程师,技能要求是C ,心中满是狐疑。后台开发和C 有什么关系?需要澄清一点。这里的后台开发指的就是Linux上的C 编程。很多人(比如我以前)对后台开发存在误解。通常人们谈到前端后台时,马上就联想到web后台,然后java、php和各种web框架横飞的既视感。
白马非马
其实任何语言都能做后台,web开发属于后台开发的范畴,但后台开发却不只有web开发。两者应该是包含与被包含的关系。提到后台,通信是永远的主题。通常我们谈到Python的Django,PHP的Think PHP、Yii框架所涉及到的开发知识,都是聚焦于展现和逻辑。而屏蔽了底层通信的细节,这是框架之利。但也削弱了开发者对于后台达到一切尽在掌握的一些可能性。
从网络协议的角度分析,web后台聚焦的是 HTTP。web后台可以看作是一个后台架构中最靠前的东西,它解析了HTTP请求,然后层层转发给了后面整个分布式系统的许多组件,并调用他们的服务。套用腾讯内部经常说的三层架构模型,这一层可被称之为『接入层』。这个三层架构并非是TCP那种网络分层,而是一个比较有年头的架构分层。所有后端系统大抵可以抽象成接入层、业务逻辑层和数据存储层。当然时至今日这个三层模型也已经不能概括全部的企业级后端架构了,然而它却依然有它的代表性。
回说接入层,C 语言进行接入层的实现,一般就是通过 CGI了,CGI这被教科书都写进历史的技术,相信很多人都不齿为用。但其实不管是 Java的Servlet,C#的 WCF,或是 Python的 WSGI,Ruby的 Rack多多少少都是受CGI影响而演化而来。行远自迩,学习了解CGI,其实也不算是浪费时间。关于CGI可以阅读:
万法归宗:CGI
当然这些还不是接入层的全部,只是微观上的,编程语言级别的接入层。其实HTTP协议的使用、HTTP API接口的设计实现(比如Restful,也可以不是)以及以Apache/Nginx 代表的Web Server的具体应用,也都算是接入层的一部分。
除了HTTP,企业内部主机之间绝大部分是自定义协议,而这些协议多半是在TCP 或 UDP之上实现应用层协议。这个层面上来说C 后台关注的是socket编程,由于C 本身并没有官方的Socket通信的库,其实这里使用的一般也就是Linux C语言的网络编程。C和C 各自的拥趸们,争与不争,它们就在那里。
大同不同
编程语言很重要,一门语言通常意味着的是一个技术栈,比如C 的技术架构的后台和Java的后台,相信绝不仅仅是语言的不同,各种组件以及编程范式都有很大差别。但时代发展到如今,编程语言之间的差异性却又不那么重要了。在当今规模的大型网络的架构中,绝不仅仅是通过某门语言自身的特效就能解决性能瓶颈的,对于架构的演进,逐渐趋于大同。
与前端技术的百花齐放不同,后端技术显得相对落寞,甚至不乏炒冷饭的嫌疑。在Web Service逐渐式微之后,各式RPC又被炒了起来。在豪情万丈的 CORBA在新世纪由于J2EE的出现而逐渐雪藏多年之后,Facebook推出的 RPC框架 Thrift与 CORBA相比又是何其相似。当然,炒冷饭本身不是目的,不管黑猫白猫,能抓老鼠的就是好猫。旧技术在不停推陈出新后确实能焕发出新的生命力。谈到RPC就不得不提这篇旧文了:
那些年我们追过的RPC
时光荏苒,新概念层出不穷。不管是偏向于Web层的概念 Restful API还是相对繁重的分布式概念的 SOA,都在趋向于接口的解耦和服务化,通过组合不同服务即可快速搭建出新业务。回想起WS(Web Service),让人唏嘘。理论上讲 WS属于 SOA,但最终走向衰落。到底是 WS生不逢时,还是新时代服务化的概念在因为弥补了 WS的缺点才得以焕发新生?这样的问题没有答案。“This is a Question”。唯一可以肯定的是,后台技术在润物无声中不停的发展,进步。
后台是什么?后台开发工程师的技能树是什么呢?这其实是一个具有时效性的问题,在不同时代有不同的解答。最初web开发、数据库CURD便是后台开发工程师的主要工作。后来各种开源组件起飞,从NoSQL到MQ,从RPC到微服务,再到和运维工作融合的容器化等等。后台工程师的技能要求在不断演化。
而在这篇文章初版发表的若干年后,由于笔者入职百度,参与广告业务的开发。对于后台开发的含义又有了新的理解。在这期间,极度弱化『后台』这一词汇了。后台开发鲜有提及。当然后台并不会消失,而是进一步精细,按照在线和离线,或者工程和策略来区分了。这则又是另外一个话题了,和所处的垂直业务领域有关,也和最近几年人工智能大数据的发展有关。总之,后台的概念会不停翻新,永远不变的是变化本身。关于这一阶段的理解总结后续会有《何谓后台?》的续集。