【程序人生】前端、后端、全栈工程师,分别是什么?又有什么区别?
一、前端开发
1. 开发网页上的内容展示和与用户的交互。
- 内容展示:网页上看到的图片、文字、视频、数字等信息
- 用户交互:用户在网页上通过点击按钮、输入文字等动作,对网站提供数据输入,然后前端对用户的输入进行响应,比如更新页面上的内容——举个更具体的例子,就是点赞后、页面对你的点赞动作做出响应就是在后台数据库把点赞量+1并在页面上显示点赞+1后的点赞量;
2. 基础技术:HTML控制页面内容、CSS视觉效果、JAVASCRIPT用户交互
- HTML——超文本标记语言,由众多标签组合而成
- CSS——用来指定每个HTML标签以什么样的外观和风格展示(长宽、位置、颜色、居中/分散、字体、显示属性等等)
- JAVASCRIPT——网页与用户交互、与后端交互,真正部分的编程
3. 但是写程序的时候,大家都不会重复造轮子,而是调用现成的library来实现一些常见功能、让开发更加高效。对于前端Javascript而言,React、Vue是目前比较流行的library
- React:实现与用户的交互逻辑和事件响应,页面上几乎全部的HTML代码都可以通过React来生成(这种在浏览器端生成HTML代码进行渲染的方式叫做Client-side Rendering,与之相反的是Server-side Rendering由网站的前端服务器生成好后,再发给浏览器)
- 前端服务器:其编程逻辑可以通过任何编程语言实现,比如java、JavaScript、Python、php甚至是Scheme
- Vue:国内用的比较多,B站就是
二、后端开发
相当一部分的后端开发工作就是开发数据访问服务,使得前端可以调用后端服务,对数据进行增、删、查、改(CRUD——Create Read Update Delete)
比如在网站进行注册的时候,前端就会调用后端,把用户信息写入数据库。一个后端服务器是不局限于只被前端调用的,还可以被mobile app调用、被其他后端服务调用
前端往往需要通过调用后端服务来完成对用户请求的响应,后端服务需要通过查询数据库来完成对前端请求的响应。因此,前后端的共性就是,通过调用一个比自己更靠后的服务来对前方的客户请求进行响应
- 后端工程师工作范畴:设计后端服务的API、设计后端服务的架构图、设计后端服务的数据库、写代码实现后端服务的业务逻辑。
- 同时需要保证设计后端服务的highly available——就是访问量很大的时候也不会宕机、并对客户请求的响应时间短、吞吐量高,单位时间内能够处理的请求数量多。如果要从头搭建一个新的后端服务,那么整个过程需要进行大量的系统设计,也就是后端工程师面试时会考到的System Design,做System Design非常考察平时的知识积累
后端工程师的技术和工具
- 后端服务器:后端服务器和前端服务器一样,也可以由任何一种编程语言实现,只要能把正确的数据返回给调用者即可,主流的编程语言也有各自流行的Web Framework,也就是现成的轮子,在框架上快速实现一个后端服务。
- 基于Java的Spring Boot和Dropwizard
- 基于Javascript的Express
- 基于Python的Flask
- gRPC远程调用框架支持用Java、Python、C++和Go等语言来开发
一个公司没有你很熟悉的语言和框架,照样能投,对公司来说会其中一部分就够了,很多东西都是再工作里面学的。而且两周内上手一门新的编程语言是一名职业程序员的基本素养。
- 数据库:除了开发后维护后端服务器,后端工程师还会花大量时间在数据库上,不管是为你的后端服务创建数据库,还是为数据库的性能调优,或者是分析里面的数据,目前最常用的数据库就是关系型数据库。比如在工业界广泛被使用的MySQL和PostgreSQL
如何设计一个关系型数据库,如何使用SQL query来访问数据,以及如何依靠index来为数据查询加速,可以在数据库课程中学习。
非关系型数据库No-SQL也开始用的越来越多:比如基于Json文档的MongoDB、比如基于LSM tree的LevelDB。这些数据库在某些特定的情况下可能会比关系型数据库更适合业务需求
数据库往往是一个后端系统的性能瓶颈,也就是最慢的一环。因此后端工程师在进行系统设计时会用很多办法来使得后端的性能、比如响应时间,尽量少被数据库拖后腿。比如使用MemCached这种缓存系统来加速后端读取数据的速度,比如用Kafka把数据写入异步化,提升后端写入数据的性能
- 后端开发的其他重要环节,比如性能监视、DevOps
三、全栈开发
自己构建和部署一个完整的、可以工作的Web App。独立编写前后端代码、配置服务器、还能设计数据库
无论那种岗位,都要考算法,因此都要刷题
四、Bonus
这里其实要说明一下,即使是全栈,也最好要有一门拿得出手的比较深入的具体方向,不然只能沦为api工程师。
国内的很多程序员,其实也会一些跨端的技术,比如说,我是 iOS 开发方向的,也认识不少 iOS开发,会 Go、Cpp、JS,与 iOS 开发密切相关的 ruby其实也是很多iOS开发回去学的。
但是写了一段时间,比如说三五年,就需要找到一个自己去深入研究的方向了,因为人的精力是有限的。这个时候,就需要去权衡自己的方向了,没有必要过于求全。就比如说我自己,是一个 iOS开发,在前端技术栈上走的是,React->ReactNative->Rax路线,Flutter也会一点;在后端技术栈上走的是Node.js以及Flask。但是我要是面试,还是会自称 iOS开发。
主要问题还是个人的精力有限,比如说我在iOS的方向上,主要是研究APM,这里面就牵扯到了很多很深入的知识,网络的相关知识要看,不然网络优化就搞不明白;操作系统的知识要看,不然OOM的问题就搞不明吧;甚至还要了解一些硬件方向的知识,不然就搞不明白如何节约电量。
如果你是在校生,学好四大基石很重要:os 计算机组成原理 数据结构与算法,计算机网络。如果你是急于转行找工作的,时间紧迫的,你那学好一门语言基础,掌握一门框架,掌握常用算法,选择一门数据库。其他的不要贪,时间不允许,以后你可以工作中逐渐深入。
老人对萌新的建议:不要一上来就想着憋个大,要整个多么牛逼的东西。如果你真的很牛逼,那这句话你可以略过。 二.技术只是解决问题的工具,你可以深耕技术,但职场发展光技术是不够的。注意目前有些卖课的,打着什么级别的课程,不要管,你学好自己的。三.碰到起着焦虑的标题,比如这个你不掌握就被淘汰,面试官看不起的,建议直接拉黑屏蔽。卖焦虑,是目前卖课商家捆绑销售的常规手段。
最后,希望你们都从编程中一直找到自己的快乐