当我刚开始从事 Web 开发时,没有前端或后端之类的东西。
原因很简单,当时服务器端代码就是一切:接受浏览器请求、实现业务逻辑、访问数据库、用 JSP 生成 HTML,然后发送给浏览器。
即使后来Javascript在浏览器端增加了一些AJAX效果,那也只是锦上添花而已,没人敢贸然行事,因为页面的HTML主要还是采用所谓“模板集”的方式生成的:美工生成HTML模板,程序员利用JSP、Velocity、FreeMaker等技术添加动态内容,仅此而已。
当时最流行的图片是这样的:
在最初的J2EE体系中,表现层不仅仅是运行在浏览器中的页面,还包括用Java编写的桌面,但是Java在桌面上竞争力不够,没有发展起来。
每个程序员都是所谓的“全栈”工程师,不仅要掌握 HTML、JavaScript 和 CSS,还要实现业务逻辑、编写代码来访问数据库。到了部署的时候,把所有代码打包成 WAR 包,扔到 Tomcat 指定的目录中,测试一下有没有问题,然后就收工了!
不缺钱的公司会把程序部署到WebLogic、Websphere等应用服务器上,也会使用高级的EJB。
生活虽然看上去“简单”“舒服”,但其实需要满足那些多变、不合逻辑的业务要求,艰辛的本质并没有改变。
1.前后端分离
随着人们对浏览器页面的可视化、交互功能的要求越来越高,“基于模板”的方式渐渐不能满足要求,所谓的展现层也慢慢迁移到了浏览器端,并且出现了大量的Angular、ReactJS等框架,将前后端割裂开来!
后端工程师只负责提供接口和数据,专注于业务逻辑的实现,前端获取数据并展示在浏览器上,各司其职。
像Java这样的语言非常适合实现复杂的业务逻辑,特别是一些MIS系统,税务、电力、烟草、金融、通信等行业软件,所以剥掉表现层,只做后端是比较合适的。
但如果只是为了实现业务逻辑的话,后端就不需要那么多技术了,搞定SSH/SSM就行了。
2.后端技术
互联网特别是移动互联网兴起之后,海量的用户涌入,一个小小的War包部署在单机上肯定支撑不住,必须要分布式。
原来单机的Tomcat要变成Tomcat集群,前面加一个Web服务器做请求负载均衡,不仅如此,还得考虑状态问题和会话一致性。
(注:参见文章《新手科普:分布式和集群》)
随着业务越来越复杂,我们不得不把一些业务放在一台机器(或集群),其他业务放在另一台机器(或集群)。虽然系统的计算和处理能力已经大大增强,但是这些系统之间的通信却成了一个令人头疼的问题。消息队列(MQ)、RPC框架(如Dubbo)应运而生。为了提高通信效率,各种序列化工具(如Protobuf)也相继问世。
如果单个数据库已经无法支撑工作负载,那么我们需要将数据库的读写操作分开。如果这仍然不起作用,那么我们需要将数据库拆分成单独的表,并将原始数据库垂直或水平切分。然而,无论我们如何切分,都会使应用程序访问变得非常麻烦,因为数据需要跨数据库进行连接/排序,并且需要事务。为了解决这个问题,已经创建了各种“数据访问中间件”工具和产品。
为了最大化性能,缓存肯定是不可缺少的。你可以本地做缓存(比如Ehcache),也可以分布式缓存(比如Redis)。如何做数据分片、数据迁移、故障转移又是另一个超级大话题。
互联网用户喜欢上传图片、文件,因此需要一个要求高可用、高可靠的分布式文件系统(例如FastDFS)。
随着数据量的增加,自然就会出现搜索的需求,需要创建一个支持全文索引的搜索引擎(如Elasticsearch、Solr)。
森林里有各种各样的鸟,所以我们必须考虑安全性,数据加密/解密,签名,证书,防止SQL注入,XSS/CSRF和其他攻击。
3.“大后端”
上面提到了,这么多系统都是分布的,每次上线,运维同事都说:协调这么多系统,好累啊。
我们要做好持续集成,能够做到自动化部署和测试(其实前端也一样)。后来出现了一个革命性的技术docker,可以保持开发、测试、生产环境一致。系统原来只是把代码部署在环境上(如Ngnix、JVM、Tomcat、MySQL等),现在代码和环境都打包在一起了,运维工作一下子就简化了。
企业自己购买服务器成本高,维护麻烦,很难灵活增长。所以企业可以弄几台虚拟服务器,硬盘、内存可以动态扩容(因为是虚拟的),流量大的时候多用一些,流量小的时候就释放一些,按需分配,很方便。这就是云计算的一个场景。
随着时间的流逝,公司和系统收集的数据越来越多,数据已经堆积成一座大山,难道我们就只能把它丢在那里,浪费硬盘空间吗?
有些人惊讶地发现,嘿,我们可以用这些数据做些事情,比如仔细分析数据,预测用户的购买/阅读/浏览习惯,并向他推荐一些东西。
但数据量太大,用传统方法可能要几天甚至几个月才能出结果,等到出结果时已经太迟了。所以我们必须使用分布式技术,把计算分散到各个电脑上,再把结果汇总到一起。时势造英雄,Hadoop 及其生态系统应运而生。
我以前听说过大前端这个概念,把移动端和 Web 端都归为“前端”。我在这里会创造一个术语“大后端”,将所有发生在服务器端、用户无法直接访问的事情都包括在内。
4.如何学好后端?
现在不管是前端还是后端,技术领域数不胜数,细分的都很严重。所以我觉得真正的全栈工程师根本就不存在,因为一个人的精力是有限的,不可能搞定那么多技术领域。太难了。
我认为,培训机构所说的“全栈”,就是指前端与后端还纠缠在一起,还未彻底分离时的“全栈”工程师。
那么问题来了,后端那么多东西,该怎么去学习呢?
我以前写过一篇文章叫《上天还是下地》,讲的是学习的广度和深度,在这里也适用。
如果你挖的更深,你可以成为某个技术领域的专家,比如搜索专家、安全专家、分布式文件专家等等。无论哪个领域,重点不是学会如何使用某种工具、框架,而是确保你能用自己的知识和技术解决这个领域的顶尖问题。
向广度发展,需要对各个技术领域都了解,能够针对某一类需求选择合适的软件和技术架构,将需求转化成合适的技术组件,并以合适的方式将这些组件连接、部署、运行,这也需要不断学习,不断积累经验。
最后我们以一幅漫画来结束吧!
如果你想在程序员的职业生涯中取得更高的成就,C/C++ 是一门既能强化思维能力,又能打下扎实编程基础的编程语言。如果你想做软件开发,成为核心程序员,那么就应该学习 C/C++。笔者有一个千人 C/C++ 编程群(Q艇索:C 语言编程学习聚集地(无言建立))。如果你觉得自学 C/C++ 有难度,有兴趣学习或者了解 C/C++ 编程的朋友可以进来交流。
C/C++高级工程师学习路线图: