前后端的划分,可以简单地理解为凡是运行在用户设备上的技术都可以称为前端技术( 比如 HTML / CSS / JS,甚至移动设备的 Obj-C / Swift );而后端的作用就是负责将这些东西封装在 HTTP 的数据包中然后通过网络传送到前端。当然除了这些前端文件,后端还有一个更重要的职能,即保存和提供用户数据,比如移动端常见的 JSON 就是目前最流行的在后端和前端之间传输的一个文件格式。
前端用于给用户展示信息,并且提交一些查询的信息,前端通过网络将需要查询信息发送给后端,后端进行编程逻辑处理,去数据库查询我们需要的信息,后端查询到需要的信息,又通过网络返回给前端,前端通过编程逻辑展示在我们面前。这就是一个完整的回路。
以 Web 端为例,在浏览器输入一个网址后,浏览器向服务器发送了一个 HTTP 请求;服务器通过一个 HTTP 响应,把显示这个网页所需要的资源传回给了浏览器。而需要在浏览器中执行的技术,HTML / CSS / Javascript 等就叫做前端;需要在服务器端执行的、通常我们看不到技术就叫做后端。静态的网站的内容都是些简单的静态网页直接存储在服务器上,可以非常容易地达到非常惊人的访问量。但是动态网站因为是动态的,也就是说每次用户访问一个页面,服务器要执行数据库查询,启动模板,执行业务逻辑到最终生成一个你所看到的网页,这一切都是动态即时生成的。
后端服务器
后端的任务实际上就是向前端提供需要显示网页和 APP 内容的数据,可能是 HTML,也可能是JSON 数据,也可以是音视频或者 PDF 文件。简单的来划分,一个服务器包含3个部分:
1、 HTTP 服务器
2、 应用服务器
3、 数据库
HTTP 服务器的唯一任务就是把需要返回给客户端的资源文件封装在 HTTP 数据包里,这个资源有可能是它后面的应用服务器动态生成的,也有可能是保存在硬盘上的静态文件。这是所有后端程序都必须有的,也是直接和我们的浏览器通信,返回给我们数据的程序。它的作用就是把它后面的编程语言生成的各种 HTML/CSS/Javascript,打包成一个 HTTP 请求,然后再封装到一个 TCP/IP 的数据包里发回给我们。而最常用的两个 HTTP 服务器叫做 Apach 和 Nginx。
应用服务器就是通常意义上所说的码农负责的部分。他们的职责就是生成前端需要的HTML/CSS/JS 交给浏览器。
前端语言
网页前端的编程语言,和需要掌握的相关知识:
- HTML/CSS ----->负责网页的页面样式和现实的内容
- JavaScript -----> 和上面的HTML/CSS一起使用,负责网页的点击交互等相应和逻辑运算
- CSS3 ----->是上面CSS的完善和升级,增加了很多好用的属性,比如动画等。
- HTML5 ----->上面HTML的完善和升级,增加了新的标签,统一了标准。
- jQuery ----->JavaScript最常用的开发框架,让JavaScript开发简单容易。
- AngularJS ----->google收购的一款优秀的前端JS框架,
- Node.js ----->Node.js是一个基于Chrome JavaScript运行时建立的平台,它是对Google V8引擎进行了封装,使得V8在非浏览器环境下运行得更好。
- Bootstrap-----> 是基于 HTML、CSS、JavaScript 的来自 前端开发框架,他来自Twitter,也是目前很受欢迎的的Web 开发框架。
- WebApp -----> 基于Web的系统和应用,简单理解,就是开发了一个像应用程序一样的网页,只需要在浏览器中打开页面,就会等于打开了一个app,现在很典型的WebApp于微信公众平台绑定,在关注的公众号页面里,打开这个公众号的网站,可以充值订餐等等,就是一款WebApp
移动端编程
- Android 主要编程语言Java,现在很多App会结合WebApp开发一款手机应用。
- iOS 主要编程语言:Objective-C,和苹果官方行推出的Swift编程语言。
后端
后端涉及的编程语言和知识点:
- PHP-----> 是一种通用开源脚本语言,主要适用于Web开发。主要实现服务器的逻辑,以及实现数据库的增删改查。
- JAVA -----> 一种可以撰写跨平台应用程序的面向对象的程序设计语言,可以看出,两大特点,跨平台,面向对象。引用很广泛,可以最为后端服务器开发语言,也是Android开发语言。
- Linux ----->一套免费使用和自由传播的类Unix操作系统,现在很多公司服务器,都使用的是linux操作系统,Linux一起良好的性能,丰富的免费软件资源,以及良好的稳定性,在服务器操作系统上,有不可撼动的地位。
- Python ----->是一种面向对象、解释型计算机程序设计语言,Python是代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。和php一样,大部分将其作为Web服务器开发。
- C ----->一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。很古老,很经典,很实用的语言。计算机专业和理工专业不可或缺的一门编程课程。优点是编译文件小,消耗小,执行速度极快。
- C++ ----->是在C语言的基础上开发的一种面向对象编程语言。
- Go ----->谷歌2009发布的第二款开源编程语言,Go编译的程序可以媲美C或C++代码的速度;所以是一个比较年轻的语言,可以被用于网络服务器、存储系统和数据库中。谷歌对该语言寄予厚望。
- C# ----->是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,C#看起来与Java有着惊人的相似,它是微软公司.NET windows网络框架的主角。
后端语言比较
1、 .net/java
庞大,复杂。但 Java 的优点就是适合处理特别大的数据量,如果你的项目会很快实现大爆发,需要处理海量的请求,那么 Java 是一个不错的选择。
2、 PHP
可以快速上手,相比其他语言,可以更快的为应用添加各种新功能。当然,可维护性就另当别论了。
3、 Ruby
非常接近自然语言,基本上即使不懂编程,也能看明白 70% 或 80%。04 年出现了一个用 Ruby 编写的 Web 开发框架 Ruby on Rails,当时的效果是非常震撼的,以前需要一个团队才能搞定的事情,使用 Ruby on Rails 后 1 个人就可以胜任了,所以 Ruby on Rails 在极短的时间内就成为了 Ruby 的代名词,也成为了新手学习 Web 开发的不二选择,但是 Ruby 语言也并非十全十美,快的同时,他的最大短板就是性能。Twitter 最早就是使用 Ruby on Rails 开发的,但是随着用户数的逐步增长,Twitter 的宕机开始变得非常频繁,后来他们迫不得已将整个系统从 Ruby 迁移到到了一个从 Java 派生出来的语言 Scala。
4、 node.js
简单来说,可以把 node.js 理解为跑在服务器上的 javascript,再直白一点,就是一个跑在服务器上的浏览器,因为 node.js 最早就是从 chrome 浏览器的Javascript 引擎 V8 中剥离出来的。相比 Ruby,Node.js 程序可以获得更高的并发性能,这在一些高并发的场景下(比如群聊,多人协作等)会很有优势。
5、 其它(python,closure 等)
6、无后端(leancloud)
无后端编程是最近的一个新趋势,但她并非说是真的没有后端,而只是把后端交给一些第三方的云平台,比如 Leancloud,Firebase 等。如果你开发一个手机 App,这样的好处就是你可以在早期没有后端程序员的情况下快速开工,像Leancloud 这样的云平台已经可以胜任大部分的应用场景,如果后期业务逻辑复杂之后再寻找合适的后端工程师迁移也不迟。
7、最强编程语言 Lisp
如果要评选一个最强的编程语言,该是哪个呢?答案就是Lisp。为什么是 Lisp?Lisp 的作者在很早以前就从数学的层面总结了一个完美的编程语言应该具备的 9 种能力,而 Lisp 就是为了配合他的这个理论而产生出来的语言。Hacker News 是由 YC 的创始人 Paul Graham 开发的,而 Paul Graham 本身就是一个 Lisp 程序员,他为了开发 Hacker News,专门发明了一种新语言叫做 Arc,但因为它是基于 Lisp 的,所以也被归为了 Lisp 的方言之一。
数据库
后端是需要去数据库查询需要的数据的,那么我们的任何引用,或者一个平台,都不可或缺的要去查询数据库的数据。比如,我们平常访问的大部分网站都是需要登录操作的,登录之后我们看到的就是只和自己相关的那部分内容。这些用户信息是保存在什么地方的呢?这就需要用到数据库。关于数据库,代表性的有两个:
1、MySQL
2、MongoDB
MySQL 是最常用的结构化数据库,也是大多数创业公司的选择。为什么是结构化的?就是说它的表的结构是固定的,比如我们常见的 User 表在 MySQL 中就是这样的:
id name email password
1 一元 y@modao.io $2a$10$ZxNhLyDTdagtUc...
2 产品集小妹 xiaomei@36kr.com $2a$10$zK7TnBXYYFz...
如果我们需要取得一条用户记录来检查他输入的密码是否正确,这时我们就需要使用 SQL,SQL 就是结构化查询语言。
简单来说,SQL 数据库保存的是结构化数据,NOSQL 数据库则可以保存非结构化数据。举个例子,还拿上面的用户表来举例,如果我们现在想要给产品集小妹增加一些额外的属性,比如她给某个产品点赞可以效果 x2,那么如果是 SQL 数据库,我们就需要给数据库增加一个新的字段来保存这个属性:
id name email x2
1 一元 y@modao.io false
2 产品集小妹 xiaomei@36kr.com true
但是如果是 MongoDB 这样的 NOSQL 数据库,我们就不需要给所有用户都增加一个x2的属性,只需要给产品集小妹单独增加就可以了,NOSQL 中保存到数据是如下这个样子的:
{id: ‘1’, name: ‘一元’, email: 'y@modao.io’, password: ‘…’}
{id: ‘1’, name: ‘产品集小妹’, email: 'xiaomei@36kr.com’, password: ‘…’, x2: true}
Cookie 和 Session
服务器要处理成千上万用户的请求,那么他是如何区分每个用户,并返回给每个用户他所需要的内容的 ?这就要涉及到 Cookie 和 Session。我们可以将 Cookie 理解为是服务器给每个用户分配的唯一 ID,这个 ID 由用户浏览器保存,而 Session 则是服务器为了维护这个会话在服务器端保存的与 cookie 对应的用户数据。
移动开发
移动端和浏览器的区别就在于,大部分 App,我们打开的一瞬间,就已经看到了它的界面,而不用再去向服务器来拿显示界面的 HTML 等文件。所以移动端,开发原生应用所运用到的技术(比如 Objective C,swift)就相当于前端的 HTML,只不过它是直接保存在应用本地的。这样就产生了一个问题:如何来获取应用数据?如果是网页应用,我们可以直接将数据包含在HTML 中一并反馈给浏览器;但是对于移动应用就需要有一个专门的协议来传送应用需要的数据,这就是 JSON。
移动应用的前端技术,目前来说主要有以下三种:
1、原生
2、混合式
3、 HTML5
HTML5 必经要经过浏览器这个中间层,所以在性能上多少会有些损失,所以如果你的应用对性能特别敏感,原生就会是比较好的选择;对于普通的性能要求没那么严格的应用来说,HTML5是完全可以满足的。而如果已经有了一个移动端的网站,这种情况下混合式就会是一个比较好的选择,它可以最大程度的利用已有的资源。如果说你是从头开发一个移动应用,并且这个应用对用户体验的要求也不是特别严格,那么 HTML5 就会是一个很好的选择,HTML5 移动应用比较显著的应用就是 Dailycost 。
如果说开发一个原生应用需要 4-6 周,那么同样功能的应用如果我们把其中的一部分用 HTML来实现,那么可能就只需要 3-4 周的时间,但是如果我们全部使用 HTML ,可能就只需要1-2 周。