近期由于各种事情一直困扰于我,我很头大。首先闻道有先后,术业有专攻。我始终认为每个人都是有自己的强项,即使起步不是该行业或者说是该岗位,当你处于该职位一定时期之后,势必能成为该岗位的专家。既当爹又当妈的真的不适合技术岗位,应该属管理。我实在闹不懂为什么会有让前后端混在一起的存在。翻遍各大网站查阅资料实在找不到一个可以说服我的理由。如果说有我觉得是对目光短浅这所谓的节约成本,经此而已。
闲话少说,步入正题。今天我想说的是从一个产品经理的角度来说开发前后端分离的事情。为什么要从产品经理的角度来说,设计一个功能的时候大致流程是这样的:
产品提出需求---设计介入设计出图---然后召集各端开发人员串讲需求---各端开发讨论并约定接口、数据、参数---各端开始开发---前后端集成---测试介入第一轮测试---产品验收--设计验收--测试最终测试--交付
从流程可以看出,产品在整个过程中从最初需求设计、跟踪开发和测试、验收产品等各个环节起着决定性的地位,也就是说,产品的功能和逻辑取决于产品经理对该产品的设计。如果前后端不分离,人员沟通起来费时费力不说很难达到最初产品设计的预期。前后端分离并非仅仅只是一种开发模式,而是一种架构模式(前后端分离架构)。并不是在撸代码的时候把前端和后端分开就是前后端分离了,需要区分前后端项目。前端项目与后端项目是两个项目,放在两个不同的服务器,需要独立部署,两个不同的工程,两个不同的代码库,不同的开发人员。好一点效果后端人员跟着产品经理和UI各种调整布局,但是绝大部分,我可以说99%的不分离都是利用各种框架而成。导致的结果就是按照设计稿,按照需求做不出来,对做不出来。即使做得出来,这位开发同仁绝逼会让你逼疯。
后期想跟新和维护就更难了,这种情况大多数出现在后台开发中,比如CRM、CMS中。因为做不出来,实现不了的结果就是产品跟着开发转,想办法去实现。而是用这则处于崩溃边缘。应为这些系统对应的工作大多是枯燥而繁杂的。一不小心出错,倒是就是各种撕逼踢皮球。这又是何必呢?
社科院工业经济研究所张金昌教授发表的一篇文章《管理智能化:理论创新与技术创新》,当我看到这篇文章的时候让我更加感到当前大多数企业嘴上说提高效率,而实际让后台管理处于开发容易使用难的地步。智能化管理都已经提上日程,企业中还是为难了后台管理者。这不是提效是凑合、是嘴上节约成本而实际在提高成本。
前后端分离有哪些优势呢?我摘录了一些,我觉着挺全面的
1、可以实现真正的前后端解耦,前端服务器使用nginx。前端/WEB服务器放的是css,js,图片等等一系列静态资源(甚至你还可以css,js,图片等资源放到特定的文件服务器,例如阿里云的oss,并使用cdn加速),前端服务器负责控制页面引用&跳转&路由,前端页面异步调用后端的接口,后端/应用服务器使用tomcat(把tomcat想象成一个数据提供者),加快整体响应速度。(这里需要使用一些前端工程化的框架比如nodejs,react,router,react,redux,webpack)
2、发现bug,可以快速定位是谁的问题,不会出现互相踢皮球的现象。页面逻辑,跳转错误,浏览器兼容性问题,脚本错误,页面样式等问题,全部由前端工程师来负责。接口数据出错,数据没有提交成功,应答超时等问题,全部由后端工程师来解决。双方互不干扰,前端与后端是相亲相爱的一家人
3、在大并发情况下,我可以同时水平扩展前后端服务器,比如淘宝的一个首页就需要2000+台前端服务器做集群来抗住日均多少亿+的日均pv。(去参加阿里的技术峰会,听他们说他们的web容器都是自己写的,就算他单实例抗10万http并发,2000台是2亿http并发,并且他们还可以根据预知洪峰来无限拓展,很恐怖,就一个首页。。。)
4、减少后端服务器的并发/负载压力。除了接口以外的其他所有http请求全部转移到前端nginx上,接口的请求调用tomcat,参考nginx反向代理tomcat。且除了第一次页面请求外,浏览器会大量调用本地缓存。
5、即使后端服务暂时超时或者宕机了,前端页面也会正常访问,只不过数据刷不出来而已。
6、也许你也需要有微信相关的轻应用,那样你的接口完全可以共用,如果也有app相关的服务,那么只要通过一些代码重构,也可以大量复用接口,提升效率。(多端应用)
7、页面显示的东西再多也不怕,因为是异步加载。
8、nginx支持页面热部署,不用重启服务器,前端升级更无缝。
9、增加代码的维护性&易读性(前后端耦在一起的代码读起来相当费劲)。
10、提升开发效率,因为可以前后端并行开发,而不是像以前的强依赖。
11、在nginx中部署证书,外网使用https访问,并且只开放443和80端口,其他端口一律关闭(防止黑客端口扫描),内网使用http,性能和安全都有保障。
12、前端大量的组件代码得以复用,组件化,提升开发效率,抽出来!
注意事项
1、在开需求会议的时候,前后端工程师必须全部参加,并且需要制定好接口文档,后端工程师要写好测试用例(2个维度),不要让前端工程师充当你的专职测试,推荐使用chrome的插件postman或soapui或jmeter,service层的测试用例拿junit写。ps:前端也可以玩单元测试吗?
2、上述的接口并不是java里的interface,说白了调用接口就是调用你controler里的方法。
3、加重了前端团队的工作量,减轻了后端团队的工作量,提高了性能和可扩展性。
4、我们需要一些前端的框架来解决类似于页面嵌套,分页,页面跳转控制等功能。(上面提到的那些前端框架)。
5、如果你的项目很小,或者是一个单纯的内网项目,那你大可放心,不用任何架构而言,但是如果你的项目是外网项目,呵呵哒。
6、 以前还有人在使用类似于velocity/freemarker等模板框架来生成静态页面,仁者见仁智者见智。
7、这篇文章主要的目的是说jsp在大型外网java web项目中被淘汰掉,可没说jsp可以完全不学,对于一些学生朋友来说,jsp/servlet等相关的java web基础还是要掌握牢的,不然你以为springmvc这种框架是基于什么来写的?
8、如果页面上有一些权限等等相关的校验,那么这些相关的数据也可以通过ajax从接口里拿。
9、对于既可以前端做也可以后端做的逻辑,我建议是放到前端,为什么?因为你的逻辑需要计算资源进行计算,如果放到后端去run逻辑,则会消耗带宽&内存&cpu等等计算资源,你要记住一点就是服务端的计算资源是有限的,而如果放到前端,使用的是客户端的计算资源,这样你的服务端负载就会下降(高并发场景)。类似于数据校验这种,前后端都需要做!
10、前端需要有机制应对后端请求超时以及后端服务宕机的情况,友好的展示给用户。
最后我真的希望从提效的角度出发,从一个产品经理的角度呼吁,后台开发请前后端分离。别凑合