我对前后端分离的态度是指技术架构的分离,而不是“职位”的分离。可以打开招聘网站看看“前端工程师”的要求:熟悉HTML、CSS、JavaScript熟悉一种前端框架,Angularjs、ReactJS熟悉webpack等打包工具;深入剖析git、svn等版本控制工具以上需求,一个不懂“软件工程”基础理论的人能看懂“前端框架”吗?他能了解模块化和工程化吗?一个不懂HTTP协议,分不清WebServer、浏览器、Session、Cookie的人能写前端吗?一个不懂“队列”、“栈”、“链表”的人能写出程序吗?从这些角度来看,世界上只有“软件工程师”这个职业,只是每个人的工作重点不同而已。技术已经发展到可以解决更复杂和更困难的问题;这意味着更大的工作量和新的工作岗位。因此,新岗位不能通过简单的“分工”一概而论。为什么要有专业的前端就像数据库的出现就是为了“数据全民共享”的问题;URI的出现就是为了解决“统一资源标识”的问题,每一种技术的出现都有其契机。前端也不例外。我个人理解它出现的核心问题是解决前端组件化或者工程化。整个B/S系统的工作原理可以用一句话概括。浏览器与服务器交互获取HTML、CSS、JavaScript或图片(视频),在浏览器中渲染HTML和CSS,执行JavaScript。服务器端只是生成以上三个元素;更准确地说-生成HTML。仔细想想是一件很意外的事情——原来我们“发明”的各种框架和语言都是为了“方便”生成HTML(囧)。从B/S系统的演进史来看,我把它分为两个阶段,第一个阶段——动态页面HTML代码混合某种脚本语言。“不用说太多,你我想做什么你都知道”,正上方代码摘自“世界上最好的个人博客——wordpress”。为了简化页面中的逻辑,它下了很大的功夫,比如将很多函数抽离到单独的PHP文件中,在页面部分直接调用这些函数。这个阶段基本上属于互联网的初级发展阶段。如果每个人都能使用“数据库”,做出“漂亮的特效”,那就太好了。第二阶段——结构化阶段(我不喜欢用MV$这个词,现在不用了,需要结合上下文才能理解它的意思)。混合HTML和脚本的味道很不舒服。修改代码时,往往牵一发而动全身。所以在第二阶段,我们尝试从代码中去除HTML并引入模板。为了证明PHP是世界上最好的语言,我还是选择一个PHP项目来说明问题(OpenCart)。这段代码剥离了很多业务逻辑,基本上是根据传入模板的数据来渲染界面,但是代码还是很“乱”。(我特意找了一个很“现实”的代码告诉大家:即使我们用模板,也只是“把逻辑尽量剥离”——谁的视图代码没有用过if之类的判断?)这个阶段就是我们现在使用的主流技术,不管你是哪种程序员,不需要“模板”,不需要“MVC”,都不好意思开始写B/S程序。这时候“结构化”更多体现在后端,比如华丽的数据访问封装(ORM之类),各种牛逼的组件容器(Spring之类),我们还有很多Ready-to-使用“库”(apachecommons、JDK标准库)、范围广泛的模板引擎(Freemarker、Velocity、Thymeleaf)。这些工具帮助我们更轻松地组织代码,让代码更容易被重用和修改。不完整的“结构化”但是这种“结构化”并没有给前端带来任何帮助。前端面临的主要问题大家还在一次又一次重写CSS,缺乏框架;HTML所能表达的东西的粒度太细了。比如我要一个文本框,首先要定义form,定义几个外部元素(比如div)来修饰文本框,最后定义inputtype="text"/;第一个问题基本上是通过Bootstrap之类的CSSFramework解决的,第二个问题永远是“大问题”。我们还缺乏将HTML组件化的技术手段。如果你仔细看上面的截图,你会发现我用红框标记的部分。这是一个非常典型的问题。我们根据不同的数据设置不同的css。我们对HTML的控制是直接应用到标签上,而不是一个一个地应用到组件上,这使得HTML无法被重用。前端的出现解决了HTML粒度的问题很多人从后端的角度努力尝试过,GWT、JSF、Asp.netWebForm;ExtJS,前端角度的YUI,但是这些努力收效甚微。原因我认为是“做得太多”,无论是哪种方式都试图隐藏太多的复杂性,GWT是一个典型的“JavaScriptisallevil”;JSF坚持“所见即所得”;WebForm完全无视“设计者”的感受,让你告别HTML;ExtJS和YUI都是“组件”。过度简化会使问题变得复杂,框架必须暴露必要的细节。目前的前端定义了一个更抽象的标签来代替HTML。比如Reactjs的jsx,Vue的Component,Angular的componentdirectives,都大大提高了HTML的抽象粒度和代码复用程度。这些框架都向用户暴露了必要的细节(没有一个声称要告别HTML、JavaScript;一切都是组件),并在“页面”层面明确区分“组件化”的范围——所有页面渲染的逻辑都放在前后端代码只提供数据(再次强调,这里的前后端只是指技术架构的变化,而不是工作职责的变化)。现在开始学习软件领域的很多新技术,要解决的核心问题就是复用,这似乎是整个领域的“魔咒”。经过多年的发展,我们已经从非结构化走向结构化,从混乱走向模块化、组件化。我们使用UML、软件工程、设计模式、面向对象以及各种华丽的技术,试图让我们的代码更容易维护,更容易修改——而其背后的动机是通过重用来节省成本。HTML抽象的细粒度带来的直接问题是不能复用,比如“列表页”,所有表格的长度都差不多,唯一的变化就是不同的列有不同的数据源,但是很难复用我们想办法可以把这张表“封装”起来。再比如“表单页面”,也是比较尴尬的情况。我们的HTML结构类似,但没有办法封装它。我觉得这是前端能给我们带来的最大的改变。【本文为专栏作家“行森”原创文章,转载请联系作者获得授权】点此阅读更多本作者好文
