精华内容
下载资源
问答
  • 服务器后端的编程语言

    万次阅读 2018-04-17 09:20:31
    对于那些需要web服务的初创公司里的大型新项目,我会选择何种后端编程语言呢?在客户端侧有CSS、html和 JavaScript (包括CoffeeScript和TypeScript这类衍生语言)可供选择。而对于存储,我曾经用过 MySQL 和 Redis ...

    写的很棒,转载过来和大家分享!



    本文为 csdn cedricliang 编纂翻译,如有转载,请于原文篇头出标明译者及原文出处,以示尊重!

    翻译:cedricliang

    原文:http://blog.csdn.net/cedricliang/article/details/48437437

    对于那些需要web服务的初创公司里的大型新项目,我会选择何种后端编程语言呢?在客户端侧有CSS、html和JavaScript(包括CoffeeScript和TypeScript这类衍生语言)可供选择。而对于存储,我曾经用过MySQLRedis,这也基本够用了。但是选择服务器端的语言却没那么容易。我曾经使用了好长时间的PHP,因为在我刚开始编程时候,它最简单,成本也最低。但是时过境迁,现在的我不用再担心昂贵的服务器托管费用了。尽管我对web项目的经验没那么多,但我还是想分享自己的一些看法。

    定义:后端与安全性

    事先声明一下:我只讨论后端。所谓的后端,指的是处理服务器请求的数据接入层。它需要肩负着处理很多请求(大于100请求每秒)和快速处理请求(平均处理时间小于300ms)的职责。而那些可以被提前计算,或者是不需要直接展示给客户端的繁重计算的工作,则并不适合用后端进行处理。这些工作可以通过其他的语言通过另外的方式实现。后端也并不直接处理对用户的展现,这是前端应该做的。但是后端开发者,应该对如何给前端提供数据有着清晰的认知。我所见过最清晰的方式就是在前后端之间使用纯Restful API进行交互。

    后端语言也应该很容易校验前端发来的数据,方便的连接数据库,以及从文件系统保存或是获取文件。

    在接下来的篇幅中,我会描述语言的安全性。但这并不意味着你不能用不安全的语言写出安全的代码,而是不同语言编译器能够保证你的代码不出现某些特定的bug。举例而言,C的编译器并不进行边界检查,因此它是一种非常不安全的语言。而那些可以被自动工具检查出来的错误包括:

    • 语法错误
    • 读越界
    • 内存溢出(C/C++并不检查,但在java中几乎不可能)
    • 未被使用的变量
    • 类型问题:这个问题略微有些模棱两可,因为在每种语言你都能写出强类型的代码。但是在一些语言中,类型更为常见。有些语言同样也使用类型系统来发现错误。举例而言,php从这个意义上来说十分不安全。连123=="123ab"都可以为true。 Python稍微安全一点,但你却可以随意的返回值。Java相比之下安全多了。Haskel从这个层面来说更加安全,因为它的强类型系统会拒绝执行任何无意义的表达式,同时也不会进行任何形式的强制转换。

    在程序的运行时,也有一些错误会被发现。而在不同的语言中,对这种运行时错误的处理完全不同。举例来说,C和C++会默默的失败。(就像这个链接里说的) 这当然是很不好的。相比C/C++对越界错误的忽略,Rust则会发出明显的提示。(之前的heartbleed是一个典型的例子,可以看看这篇文章

    当然了,所有这些问题都可以通过良好的测试来发现。但是,能够被自动化的过程越多,当你测试不那么充分的时候,可能发生的意外也就越少。

    Java

    Java是跑在Java虚拟机的面向对象的语言。对于商业网站而言,java是使用最广泛的语言。为什么呢?

    上述是Java的优点,那么它的缺点呢:

    • 非常笨拙的语法。为了完成一个功能,你可能要打很多字。。当然自动补全是必不可少的,但是要打的东西还是不少。代码越多,维护起来成本越高。
    • 要把一个工具跑起来难度很高
    • 那些被设计用来扩展的super-abstract结构,事实上可能永远不会被用到。
    • 因为没有指针的存在,Java不能访问越界的数组,所以比C/C++安全一些。那些烦恼你的内存溢出也几乎不存在了。但是付出的代价就是,语法更加的复杂,而且你如果一不小心,就会掉入Java中得不安全的陷阱。
    • 速度和内存使用量:Java在速度上并不突出,而在内存使用上则是相当的多。但是这并没给它的大范围使用带来太多的问题。感兴趣的可以看看这篇文章

    对于Java还可以参考以下文章:

    Javascript: Node.js

    Node.js自从2009年发布一下,使用十分广泛。Node.js具有异步,事件驱动以及可扩展的特性。Node.js应用是由JavaScript开发的,因此它具有JavaScript的所有优点:

    • 享受到了JavaScript V8引擎的好处
    • 灵活而轻量级的语法
    • 跟Java一样,JavaScript出现在1995年。所以语言本身发展历史很长,相对稳定。 

    还有什么要补充的?

    • Node很快,而且可扩展。(参考 Performance Comparison Between Node.js and Java EE
    • JavaScript不太安全。即使很小的语法错误也只会在执行的时候暴露出来。因此单元测试十分重要。
    • Node.js被LinkedIn,Yahoo!, Uber, Paypal使用
    • 有很多人从Node.js转向了Go 1 2 3

    参考:

    Go

    Go是由Google开发的,静态类型的编译语言。它直到2009年才出现,十分短暂。

    • Go提供了那些你进行web开发需要的基本工具 
    • 有不错的教程和一些web开发的材料
    • 有一些任务在Go语言中超过预期的复杂,比如排序,详见link
    • Go有一些跟其他语言完全不同的diffuser,比如如果你想声明一个public方法,那这个方法的第一个字母一定要是大写的。还有未被使用的变量会导致编译错误。

    参考:

    C

    C#是由微软开发的具有静态类型的编译语言。但是它却有很多动态特性。 它出现在2000年。而针对web开发的框架ASP.NET直到2002年才发布。

    C#的生态系统包括:

    我对C#/ASP.NET的理解并不深入,因此无法更详尽的分析它的优略。

    Python

    python是现在在用的最古老的语言之一。它最早出现于1991年。Python是具有动态的类型,面向对象的解释性语言。而且它具有函数编程的特性。 
    尽管我曾经在很多项目中使用过Python,但并不包括web项目。因此那些重要的工具和框架可能会被遗漏:

    我认为Python最主要的优势在于代码容易撰写,而且可读性很高。我对Python显然是有偏爱的,而且我坚信很多人和我有着同样的观点。

    PHP

    PHP是动态类型的服务器端语言,它在1995年被推出。

    PHP最大的优势是学习门槛低。它基本可以在任何地方被执行,托管和非常简单。Wikipedia使用的就是PHP,所以很明显使用PHP来创建可用的大型网站是可行的。 
    这里写图片描述

    Hack

    Hack是由Facebook在2014年开发的编程语言。它是PHP的变体。它与PHP最主要的不同在于:

    • 函数参数和返回值是指定类型的
    • Hack并不完全支持PHP的一些特性source,比如goto、可变变量、字符串自增,这有时候也挺好的。

    参考:

    Rust

    Rust是很安全的语言,但是对于它在生产环境的使用,仍有疑虑。

    参考:

    其他

    Ruby with Rails: 我知道它应用广泛,但是我对Ruby的了解并不充分。Ruby的语法与Python类似。

    参考

    结论

    仔细想来,对我来说以下的语言更适合我做后端:

    • Go:很快,而且是编译型的
    • node.js: 很好的可扩展性
    • Python: 这是我最了解的语言。除此之外,它有非常清晰的语法,很好的社区开发的变法风格,以及易读性。

    对我来说不适合的语言:

    • PHP: 因为语言的不一致,导致建立稳定的后端没那么简单。
    • C#: 这个语言太以微软为中心了
    • Java:语法有点拖沓,成本高。

    其他语言可能也是很好的选择,只是我知之甚少。我对rust在后端使用的可行性非常好奇。Hack语言非常年轻,让我们对它未来的发展拭目以待。

    原文链接:http://martin-thoma.com/languages-for-back-ends/#tocAnchor-1-11

    展开全文
  • 详细后端开发知识讲解

    万次阅读 多人点赞 2018-05-15 16:13:07
    前言本片文章面向后端开发,讲述后端在进行开发时所使用的WEB服务器的工作流程,正所谓知根知底,WEB服务器后端开发人员日常用于调试WEB程序和与前端通讯的一种方式!WEB服务器最为强大的地方是能够执行WEB程序,...

    一. 前言

    本片文章面向后端开发,讲述后端在进行开发时所使用的WEB服务器的工作流程,正所谓知根知底,WEB服务器是后端开发人员日常用于调试WEB程序和与前端通讯的一种方式!

    WEB服务器最为强大的地方是能够执行WEB程序,其WEB程序的编程语言并没有明确的规定,因为只要你所使用的服务器支持这样的程序就可以了!

    WEB服务器更像是一个平台,在此平台上编写软件我们称其为WEB编程,注:WEB编程下有许多规范比如CGI,FastCGI等等,这个是要看服务器的支持范围!

    不同服务器所使用的规范不同,比如JSP服务器只能运行由JAVA EE编写的WEB程序,不能用于运行像C/C++、Python等编程语言编写而成的WEB程序!

    通常情况下的WEB服务器所使用的编程规范均为CGI编程、只能运行CGI规范的程序,除了一些例外的WEB服务器,比如JSP服务器!

    二. CGI规范,WEB服务器执行过程

    什么是CGI规范?

    CGI是Common Gateway Interface的缩写,其意义为公用网关接口,意思可以理解为:在WEB服务器上运行一个程序或脚本,并且WEB服务器要将脚本执行结果返回给浏览器(客户端)!

    规范从何而谈?

    规范的意思是,无论你使用任何语言编写,都必须使用输出函数(cout,printf,print)输出HTML格式的数据信息,WEB服务器根据这些信息传递给浏览器,浏览器HTML树并将其显示到浏览器当中,即为一个WEB页面!

    更加深层次的来说其实,无论你使用什么语言编写,只要在WEB服务器中的配置文件中,使其支持CGI编程,然后将你编译完成的二进制可执行文件后缀名改为.cgi,最后前端页面在使用get或post方法请求这个WEB程序,WEB服务器会自动执行这个程序并将其结果送回给浏览器(TCP/IP协议)!

    实际执行是由操作系统来完成的,只是WEB服务器将程序中打印输出的字符信息给重定向到WEB服务器当中了,即WEB服务器在调用你的CGI程序时会使用一条操作系统都有的命令,重定向:

    >>

    printf或cout等打印函数的底层实现过程是将数据写入到显存中,根据要打印字符的位置并把位置写入到显存下,GPU会根据显存数据在屏幕点亮像素点中对应的二极管(RGB),一般字符字体都是由操作系统来完成的,因为字体的不同,笔画也就不同!printf会把要打印的字符数据转交给操作系统,在从用户态到内核态之间的转换,在到显存,且也要考虑编码的问题,因为不同的编码对应不同的数据,printf只会移交ASCII(最底层是没有字符这个概念的只有二进制码,而二进制码可以转换成ASCII码)码,操作系统需要根据当前程序使用的编码,并将ASCII码转换成当前编码要输出的字符,并且操作系统也要考虑屏幕分辨率,比较分辨率的不同像素点占用就不同!

    其当服务器在执行CGI程序时,也可以不用把程序后缀改为.CGI,你可以在配置文件中增加支持的扩展后缀名:.exe、.py、.c、.elff(ARM可执行文件/Linux可执行文件,Linux就是为ARM设计的)

    注意如果你配置成源文件的格式需要WEB服务器的支持,比如apache服务器,仅支持py文件,apache服务器会自动编译.py文件并执行!

    如果是在Linux或MAC系统下需要设置目录权限:

    chown -R 555 //所有访问权限

    如何接受从服务器传递来的信息?

    当我们前端页面向WEB服务器发送一个请求时(get/post)会有一个传参,里面包含着请求数据,比如:

    https://www.zzhblog.cn/c.cgi/?utm_source=csdnbar

    其意思为,请求www.zzhblog.cn服务器下的c.cgi程序,并向其传递一个参数,参数名为:utm_source,参数数据为:csdnbar

    也有这样的:

    https://www.zzhblog.cn/?utm_source=csdnbar

    没有请求的程序名,其实是WEB服务器后台给隐藏掉了,你可以在自己的WEB后台中配置默认文件,即输入网站地址而无需指定文件名,访问即返回默认文件!

    或者隐藏请求文件名,WEB服务器会把这些信息放到报文头了,浏览器接受到之后会自动隐藏!

    那么我们要怎样得到传递来的信息呢?这里就需要使用CGI提供的模块了,CGI提供了C/C++版的模块和Python等的模块,使用这些模块里的Get方法可以轻而易举的获取后台服务器传递过来的信息,然后在对这些数据进行处理,并把处理结果重定向给WEB服务器,最后WEB服务器将结构返回给浏览器,注意结果必须以HTML格式返回!

    整个执行过程都是经过HTTP协议格式规范来的!

    不过目前有的WEB服务器已经开发出自己的WEB服务器编程语言,也就是说该WEB服务器只能运行指定运行编译的程序,并且该语言下提供了很多较为方便的模块,可以调用直接读取一些相关数据,和处理数据的模块!

    关于C/C++方面的WEB程序开发

    C/C++编写WEB程序开发效率实在是非常之低,因为通常情况下我们做WEB服务器处理,一般都是对字符的解析,而C/C++传递过来的GET或POST数据是一个完整的URL和报文,需要C/C++自己去解析这些数据,不像其他编程语言已经为其解析完成,拿过来直接处理即可,而且C/C++对字符处理方面库支持本身就很差,需要开发人员手动编写字符处理库,所以这也是为什么大家不愿意使用C/C++做WEB服务器开发,因为要写很多代码,即使是由CGI模块的支持,但CGI模块只能用于获取WEB服务器传递过来的数据!

    再则,C/C++本身就是一个不是易学,且要考虑内存泄漏问题的一个编程语言,现在很多编程语言会自动帮你释放不用且丢失的内存,解决内存泄漏,也就是托管式代码平台,经典的有:.net

    C/C++WEB服务器开发效率与其他编程语言对比

    C/C++需要编写很多代码来完成某个任何,极其降低后端开发效率,但是也提高个人编程能力,现在很多编程语言都提供了很多模块,来完成某些任何,甚至可以说不是编程语言,是脚本,专门调用C/C++写的代码,比如Python!

    由于Python简单,模块多,可以简单调用模块处理许多复杂模块,所以很收后端开发人员的欢迎!

    有的时候没有CGI模块,WEB服务器在开发文档中会告诉你,参数会存放在哪儿,哪个临时文件中,或直接利用C/C++传参的方式传递:

    a.out aaa aaa

    a.out代码:

    int main(int x,int *a[]){
    }

    这是最经典的方式,x代表参数数量,a代表参数!

    a一般是个数组指针,指向每个参数!

    for(int i = 0;i < x;++i){
    printf("%s",*a[i]);
    }

    CGI与FastCGI

    CGI程序只能被请求一次,也就是说一次只能执行一个客户端发来的请求,假如说有一百个客户端同时请求这个程序,那么该程序要一个一个的执行!

    FastCGI就是CGI的升级版,该规范可以同时以多线程的方法来执行CGI程序,一百个客户端同时请求CGI程序时,服务器就会同时执行一百个CGI程序来处理这些客户端,可以在WEB服务器的配置文件中修改选择对应的CGI和FastCGI方法,WEB服务器会根据这些方法来做对应的规范!

    执行效率与算法

    在前端把数据传递到后端以后,后端要着手处理这个数据,就拿搜索引擎为例子:当我们在搜索引擎中输入相关数据时,要知道,在庞大的万维网平台中,网页资源几乎数不胜数,每天都会要上亿的新网页诞生。

    搜索引擎中有一个叫蜘蛛的模块,用于将这些数据爬下来,也就是网络爬虫,保存到服务器本地上,假设你的搜索引擎服务器中有数百亿条数据,并且网页路径和域名,网页名在数据库里存储好的,那么当用户在浏览器里输入某个关键字时,就会找到海量的相同数据,那么后端人员要做的是将这些数据以热度并排名按从大到小的方式出现在搜索页面的下拉框里,供用户挑选,那么此时就考虑到算法的要求了,倘若算法太复杂,那么后端执行个一两分钟才返回结果那么用户体验是不是就很差?

     

    三. HTTP协议规范

    这里不做详细介绍,因为博主之前有写过对HTTP/HTTPS协议规范的详细介绍,所以这里简明摘要!

    HTTPS之所以叫HTTPS是因为在使用TCP协议加密时通过SSL算法进行加密,HTTPS传输过程比HTTP要更加耗时!

    其次使用HTTPS握手过程需要证书验证,所以WEB服务器方也必须支持SSL协议!

    在浩荡的互联网中,就像开车一样,当我们开一辆货车运载资源时,难免会遇上堵车,那么此时就需要交通法则,来规定我们怎样传输,从而避免网络堵塞的情况,同时也要避免两辆车互相撞在一起导致数据丢失,发生丢包的状况,所以HTTP协议规范用语规定互联网中应该怎样传输数据,比如HTTP协议规范确定使用TCP协议来传递数据,防止因为网络拥堵或堵塞导致丢包的现象,实则上路线的选择是由猫(调制转换器)来决定的,猫会根据当前连接的线路状况来确定最优的传输路线,而TCP只是规定怎样来完成这次的传输,传输路线是由猫来完成的,以及收,收到之后猫会把数据发送给网卡,网卡解析数据在发送给上层,也就是形成了网络七层的概念!

    以上的APDU、PPDU即为封装,因为上层需要把自己的数据封装到一个包里,然后发给下层,下层在把这个数据拆开翻译意思,在根据意思添加自己的报文格式进去,即形成了APDU、PPDU包格式!

    假如我要向IP为1.0.0的地方发送一个A的字符,那么需要填写IP地址和数据段信息,然后发送给传输层,传输层在把这个数据拆开分析其意思,然后在进行格式转换,压缩,确定传输方式,在传送给下一层,这样做的方法是为了确保不同的数据结果格式上的歧义问题(表示层以后的层格式是统一的,所以需要表示层来统一格式),然后在到物理层在转换成BIT的电路信号方式确定最优路线发送到指定路由下,路由器接收到之后呢,在一步一步按照前面的步骤拆包,一步一步分析包,最终发送到电脑上的指定程序下!

    其实像应用服务器,是没有七层这么个概念的,实则上就三层,应用层选择好路径,数据和方法,表示层分析数据和方法,并对这些格式进行压缩,加密然后传递给传输层,传输层在拆开确定方法,修改报文格式,增加新的包头,直接发送给物理层,由猫直接发送出去,在TCP协议中无需经过HTTP协议,HTTP协议只在WWW开头的万维网域名下有效!

     

    相关连接:HTTP/HTTPS协议原理HTTP/HTTPS协议原理HTTP协议层开发

    展开全文
  • 柠檬哥作为一个普通大学、非计算机专业,自学后端技术进入腾讯做后端开发工作,我自己也是非科班自学计算机成功转行软件开发(有想听柠檬哥转行之路经历的吗,可以留言告诉我,人多就写写),体会过当初想学又不知从...

    本文已收录于Githubhttps://github.com/imcoderlemon/CodeClass
    内含原创干货文章,千本计算机电子书,3本LeetCode题解,各类编程资源


    大家好,我是柠檬

    柠檬哥作为一个普通大学、非计算机专业,自学后端技术进入腾讯做后端开发工作,我自己也是非科班自学计算机成功转行软件开发(有想听柠檬哥转行之路经历的吗,可以留言告诉我,人多就写写),体会过当初想学又不知从何学起的迷茫,还好最后摸索出了一条正确学习的路线。

    思来想去,学习方向和路线很重要。比起具体的技术细节,可复制的经验、清晰的学习路线,是大部分人更加需要的东西

    朝着正确的方向努力否则只会离目标越来越远,不是吗?

    只顾着写各种技术,不告诉大家这个知识点在后端技术图谱的什么位置,有点盲人摸象不知全貌的感觉,很多在我看来大家都懂的内容,其实只是我以为,信息差是客观存在的,抹平信息差是分享的价值所在。

    所以这一期文章柠檬哥足足花了半个月时间,整理了一张后端技术学习路线思维导图,来和你聊聊:

    要成为一个符合 BAT、TMD 大厂要求的后端技术工程师,到底需要学哪些技术?后端技术学习路线是怎样的?

    学习路线

    话不多说,直接上刚画完的后端技术学习路线思维导图框架:

    在这里插入图片描述

    图中的每一个节点都可以点开,我都做了细分,在后面章节逐个展开介绍。

    后端技术学堂开课半年以来,写了 30+ 篇原创文章,内容有Linux、数据库、算法、架构、微服务、甚至中间还写了一个系列的Golang基础教程,真算得上是天马行空,这就是才华横溢吧(狗头)。

    历史文章都在后端知识体系范畴内,你甚至可以对照下我历史文章分享的内容,都可以在我今天整理的这张学习路线图中找到相应的位置,后续更新的文章我也会归类到其中,方便大家归纳复习。

    计算机基础

    不管是后端开发还是前端开发,说到底我们所有的软件开发都是在计算上编写程序,虽然对于大部分人来说,真正开始写代码的时候很少会让你去解决计算机底层的问题,不接触不代表不重要,计算机基础是最重要的。

    后端开发工作中经常用到 Java、C++、Python、Golang 这些语言称为高级编程语言,称为高级是它们接近我们日常交流的自然语言,离计算机底层远,但所有的高级语言最终都会转化成汇编->计算机指令->控制流操控计算机硬件,所以学习计算机构成和工作原理、操作系统这些基础知识,能够加深我们队高级语言的理解。

    那我们一直说的计算机基础到时是什么?计算机科学技术 CS(Computer Science)作为一门专业课程,就和其他工科课程一样有自己的理论体系,如果你是计算机专业的同学不用我来教该学什么,计算机专业大学四年学校教的那些就是基础,别小看你在学校学的那些看起来没啥用的课程。我这有一份中中科大的计算机技术本科主要课程结构安排

    一流大学的计算机专业要学什么可以对照着看下,从学科数学理论基础、计算机体系结构、软件工程方法等等维度展开。

    那如果你不是计算机相关专业的想转行,也不要被吓到了,毕竟这是人家四年时间的学习内容,本科的培养目标不仅仅是培养出一个软件工程师,本科学习还是面向硕士博士的基础培养,注意是计算机科学专业,名字里有个词叫「科学」,我这篇文章要说的 BAT 公司后台软件开发,可以认为是「工学」方向,更多的是服务于工程开发。

    如果只是面向后台开发和工作面试,或者你是非计算机专业想转行,社畜没有太多时间去学习大学那些理论课程,那帮我把计算机基础的范围缩小到下面这 4 门专业课:计算机组成原理、计算机网路、操作系统、数据结构

    计算机组成原理

    这门课程让你了解计算机的组成和工作原理,要学习的内容包括:

    • 数据在计算机中的表示和运算(柠檬说:计算机不识数,只认得高低电平,所以数据在计算机内部都用二进制的0和1表示)
    • 存储系统(柠檬说:数据和程序指令都要存储下来,学习计算机的存储层次,内存、外存、高速缓存、虚拟存储技术)
    • 指令系统(柠檬说:写的代码最终都要被翻译成计算机指令,指令格式和寻址方式有多种,控制器来控制指令执行)
    • 中央处理器(也就是 CPU 计算机的大脑,主要构成是运算器和控制器)
    • 总线(柠檬说:计算机的血管动脉,连接计算机各功能组件,用来传输数据、地址信号、控制信号)
    • 输入输出系统(柠檬说:Input/Output 也叫 IO 系统,连接和管理各种外部设备比如键盘、显示器等等)

    计算机网络

    世界上第一台通用计算机「ENIAC」于 1946 被发明出来,如其名字一样仅仅是用于计算,在后来计算机越来越多,如果没有网络每台计算机都将成为一个孤岛,也不会有现在互联网的繁荣,「计算机网络」这门课程的学习路线非常清晰,就是围绕着如何让地理位置上不同的计算机连接起来,并高效可靠的交换数据信息,实现人在家中做,天下事尽知。

    计算机网络有分层次,根据各层属性和特点,分为:

    • 物理层
    • 数据链路层
    • 网络层
    • 传输层
    • 应用层

    这个层次划分从上到下就是一个网络数据包的接收路径,反之就是发送路径。既然要交换信息肯定得商量一套通用的协议,就像我们和老外交流,要么他们学中文要么我们学英文,反正得统一出一个标准语言出来,这在计算机网络中称之为「通信协议」。如上述的网络分层,每层都有各自适配的协议,所以计算机网络的学习基本就是围绕着分层协议的学习。

    操作系统

    操作系统也是一种软件。你熟悉的微软Windos操作系统,后台开发熟悉的各种发行版的 Linux 系统,都是通过软件的形式安装在计算机上。

    只不过这个软件和我们平常接触的应用程序软件不同,它比较特殊,因为它向下和计算机硬件(就是我们在计算机组成原理中学习的那些硬件)打交道,向上给其他应用程序和用户提供通用的交互的接口,说白了操作系统就是个中介和管家的角色。它帮我们做了下面这些事情:

    • 进程管理(柠檬说:你写的程序运行起来才能干活,运行起来的程序称为进程,进程是资源的最小单位)
    • 内存管理(柠檬说:计算机内存又贵又少,动不动又要来个高并发,内存管理大有学问)
    • 文件管理(柠檬说:计算机中的资料和信息需要通过文件系统来保存、管理)
    • 输入输出管理(柠檬说:各种外部设备如何接入计算机和接入之后又如何管理)

    数据结构

    数据结构大家最熟悉,即使毫无计算机基础或是想转行计算机,第一个遇到的就是数据结构,因为面试刷的算法题本质上就是对各种数据结构的运用。所以单纯对面试功利的角度来说,数据结构也是必须要掌握的计算机基础,数据结构要学到:

    • 线性表(链表、数组、循环链表)
    • 栈和队列
    • 树和各种二叉树(二叉排序树、平衡二叉树、哈夫曼树、B树、B+树、Trie树)
    • 图(图的存储结构、BFS、DFS、最短路径、最小生成树、拓扑排序、关键路径)
    • 查找算法(二分查找、B树查找、HASH表、KMP字符串模式匹配)
    • 排序算法(插入排序、冒泡排序、归并排序、基数排序、堆排序)
    • 贪心算法
    • 位运算
    • 分治算法
    • 动态规划

    好了,计算机基础四大专业课已经大概过了一遍,当然这是我给没有计算机基础同学的实用主义建议,等你学完这四门课程也只能够说入门计算机了,不过这已经比很多人厉害了。如果想真正的了解计算机这门学科,可以等学完了这 4 门基础课程之后,再花写时间挑一些上面培养方案中的课程去学习,做一个知识体系完备的计算机软件后端开发工程师。

    Linux

    在后台开发领域,你所能接触到的后端服务不敢说 100%,至少也有 90% 以上是运行在 Linux 系统之上,因为它开源、便利、功能强大,需要学习以下技术点:

    Linux系统使用

    所以如果你想走后端开发这条路线,我建议你趁早使用 Linux ,越早越好。可以是在个人 PC 上装 Linux 虚拟机,或者装个双系统,我在大学就是这么玩的,那时候云服务器还没现在这么普及,现在我觉得买个 Linux 云服务器最方便,如果是学生还有教育优惠也不贵。

    有了Linux系统之后干嘛呢?把它作为你的常用系统,经常登录进去对照着「鸟哥的 Linux 私房菜」从头到尾操作一遍,ok,Linux的基础操作你就掌握了。

    Linux 高级编程

    Linux「高级编程」的意思是比上面的 Linux 基础操作更深入一个层次。

    学会了 Linux 的使用还不算是一个真正的开发人员,使用系统是成为开发者最基本要求,会操作Linux 就像使用 Windows 系统一样,只不过是学习成本的问题,如果这个世界没有 Window 系统,你女朋友花点时间也能掌握 Linux 系统基本操作。

    要想进阶成为后端开发人员,就要懂得如何使用 Linux 系统提供的各种系统API(系统调用接口)进行编程开发,程序员用你写的代码来控制系统,普通用户只会用鼠标操纵。这个阶段需要学习:

    • Unix 系统实现 Linux、基本系统数据类型

    • 文件操作函数: openread close write dup fcntl ioctl stat chmod access chdir

    • 系统编程接口的基本特性和高级特性

    • Linux进程环境、如何创建进程、线程,程序的存储空间分配、环境变量

    • 进程组、会话以及任务控制、进程优先级和调度

    • 动态库和静态库

    • 进程间通信:管道和FIFO、消息队列、信号量、共享内存、内存映射

    • 套接字和网络编程

    总之,这一阶段需要学习的是在 Linux 环境下的高级编程技巧,通过对这些内容的学习也能让你更深入的理解 Linux 系统是如何工作和运行的,并且真正的踏入 Linux 系统编程大门。

    网络编程

    网络编程是通过网络套接字 socket 方式实现的通信,所以也属于进程间通信 IPC(Inter-Process Communication)。

    由于现在的后台服务基于服务端/客户端模型,两者之间基于网络通信,你在家用手机点个外卖的服务请求,也是通过网络通信发给某团的后台服务器,所以后台服务开发,说到底还是网络编程,以及建立在网络编程数据之上的应用层开发。

    网络编程学什么:

    • 什么是socket套接字
    • 套接字选项
    • TCP/UDP 套接字编程
    • Unix domain 协议和编程
    • 原始套接字编程
    • IO多路复用:select 、poll、epoll、kqueue
    • 序列化技术
    • 零拷贝技术
    • 开源网络库:muduo、libevent

    学完以上内容你大概可以写一个类似QQ一样的网络聊天小工具。

    不在在工作中,都有成熟的网络框架或网络通信库,大公司比如鹅厂大部分是自研网络通信框架,小公司用开源项目,这让很多后台开发人员不必关心底层的网络通信细节,除了部分基础架构的开发同学,大部分后台开发同学工作都是在做业务系统的开发。

    但了解底层网络编程原理,是后台开发人员的核心能力,这点对于 C/C++ 后台开发程序员尤为重要。它能拔高你看问题的高度,不了解底层原理,就像是在黑盒编程一样,出了问题无从下手排查。

    学完了以上内容,基本是具备了从事后台开发的基础能力,也能开发出一个简单的后台服务器了。

    数据库

    除非是单纯的转发路由类后台服务,一般来说后台开发的web服务器后台程序,后台服务程序说白了就是个死循环:

    接收客户端数据包 -> 处理数据包 -> 业务逻辑处理 -> 保存必要的数据 -> 回复响应数据给客户端

    这其中会伴随对各种数据的处理,比如电商系统会处理订单数据、用户数据,游戏后台会处理角色数据和装备数据等等,有数据就会涉及到存储系统,数据一般都存储到数据库。

    主要学习 2 大类数据库:

    关系型数据库是指采用了关系模型来组织数据的数据库,简单理解就是二维表格模型。

    非关系型数据库一般指的是 key-value 形式存储数据的 NoSQL 数据库,数据和键值是简单的映射关系。

    关系型数据库

    非关系型数据库

    • redis 基本操作和使用
    • redis 设计与实现原理
    • MongoDB
    • levelDB
    • memcache
    • HBase
    • CKV+ 腾讯自研

    后台开发服务还需要学会解决三高问题:高并发、高可用、高性能。

    高并发

    利用到目前为止学习的内容,我们的开发的后台服务器应付一些小并发场景绰绰有余,但是随着互联网应用业务量的上涨,对后台服务端的请求数剧增,高并发需求随之而来,高并发指的就是高 TPS 和高 QPS

    • TPS (Transactions Per Second)每秒事务数
    • QPS(Query Per Second)每秒查询数等。

    对于高并发服务必须改变传统的单进程模型,才能处理的过来如此海量的请求。

    多进程

    对于高并发的服务请求,由于后台服务一般都是 IO 密集型应用,IO 密集型应用就是大部分 CPU 时间用在网络 IO 上,相对的是 CPU 密集型应用大部分时间花在数据计算上。

    大多数的后台服务程序都是 IO 密集型的应用,网络 IO 的时候 CPU 等待白白浪费时间, 这就告诉我们 CPU 的潜力还没有完全发挥,所以当一个进程的处理能力达到上限,我们可以多创建几个进程,这就是多进程模型。

    多线程

    多线程与多进程类似,实际在Linux系统中线程是由轻量级的进程 LWP(Light-weight process)实现,多线程方式实现的后台服务相对于多进程更加轻量,因为多线程是在同一个进程内部实现。

    不过多线程也会带来新的问题,比如全局数据竞争和同步问题,引入线程锁还要防止死锁的发生。

    协程

    那什么是协程呢?协程 Coroutines 是一种比线程更加轻量级的微线程。类比一个进程可以拥有多个线程,一个线程也可以拥有多个协程,因此协程又称微线程和纤程。可以粗略的把协程理解成子程序调用,每个子程序都可以在一个单独的协程内执行。

    异步回调

    所谓异步回调就是,服务端发起 IO 请求的线程不等网络 IO 线程操作完成,就继续执行随后的代码,一般请求线程需要先注册一个回调函数,当IO 完成之后网络IO线程通过调用之前注册的回调函数来通知发起 IO 请求的线程,这样发起请求的线程就不会阻塞住等待结果,提高了服务处理性能。

    关于这一小节内容可参考柠檬哥之前的文章 图解:高并发服务框架-进程线程协程

    高性能

    按以上服务模型可以提高服务本身处理能力,高性能后台服务往往还会利用多种技术、从多个维度优化提高性能。比如采用CDN(Content Delivery Network)内容分发网络,存储和分发使用户就近获取内容,缩短响应时间;采用池化技术,避免频繁的资源分配与回收;采用服务集群,横向扩展服务能力;采用缓存技术,热点数据加入缓存,减少数据库访问。

    • CND 内容分发技术
    • 池化技术:数据库连接池,线程池
    • 集群化
    • 缓存技术

    高可用

    高可用即保证服务的稳定性,不出现重大问题或宕机,常见的解决高可用思路是冗余和负载均衡。冗余的意思就是多部署几台服务器,当其中一台挂掉另外一台能顶上。通过负载均衡技术实现对流量的动态调配,不至于出现大量流量冲击某台机器出现请求不均匀,软件负载均衡技术可以通过DNS、Nginx、LVS等技术实现。这里主要学习的技术有:

    • 负载均衡技术,软硬件负载均衡
    • 限流隔离降级技术
    • 应用层容灾,资源隔离熔断
    • 异地多活

    设计模式

    设计模式代表着软件开发的一种最佳实践。已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计,当设计大规模软件时遵循必要的设计模式能让写出的代码更加健壮和可扩展

    设计模式 6 大原则:

    • 开闭原则:对扩展开放,对修改关闭,多使用抽象类和接口。
    • 里氏替换原则:基类可以被子类替换,使用抽象类继承,不使用具体类继承。
    • 依赖倒转原则:要依赖于抽象,不要依赖于具体,针对接口编程,不针对实现编程。
    • 接口隔离原则:使用多个隔离的接口,比使用单个接口好,建立最小的接口。
    • 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用,通过中间类建立联系。
    • 合成复用原则:尽量使用合成/聚合,而不是使用继承。

    常见设计模式分类

    • 工厂模式
    • 单例模式
    • 建造者模式
    • 适配器模式
    • 桥接模式
    • 过滤器模式
    • 装饰器模式
    • 外观模式
    • 享元模式
    • 代理模式
    • 责任链模式
    • 解释器模式
    • 迭代器模式
    • 观察者模式

    分布式

    为什么会出现分布式?随着业务的体量不断增长,单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。

    分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。

    分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议。这里需要学习的内容包括:

    • 分布式一致性算法:PAXOS、Raft、Zab
    • 分布式事务:2PC、3PC、TCC
    • 分布式唯一 ID 生成:雪花算法、UUID、淘宝 TDDL SEQUENCE方案、美团 Leaf
    • 一致性HASH算法
    • 扩展性设计,设计可扩展的软件架构
    • 分布式文件系统:HDFS、FastDFS
    • 微服务架构设计,服务注册、服务发现、服务路由

    安全

    本质上后台服务在网络上运行,需要和各种网络环境交互,在正常情况下能够工作,但互联网中有很多针对后台服务的恶意攻击,因此网络安全也是后台开发工程师需要学习的内容。这里主要包括:

    • web安全:CSRF、SQL注入、XSS
    • DDos防范
    • 加解密算法:对称加密、哈希算法、非对称加密
    • 网络隔离:内外网分离、跳板机
    • 授权认证算法:OAuth2.0、OIDC、2FA、单点登录SSO

    监控与统计

    后台服务运行我们如何了解其运行状态和健康度?如果只是开发小玩具监控和统计大可不必,只需记录本地日志即可,对于成熟的大型后台服务系统,监控、统计、追踪必不可少,无监控,不运营

    开源的监控软件有:Prometheus、Zabbix、Open-Falcon。

    追踪系统也非常重要,特别是目前微服务化,一次服务请求需要经历多个不同的微服务处理,给分布式追踪带来新的挑战,主要包含以下三个方面:

    • 通过收集日志(Logging),记录程序的调试信息或错误信息,对系统和各个服务的运行状态进行监控
    • 通过收集量度(Metrics),比如累加量,对系统和各个服务的性能进行监控
    • 通过分布式追踪(Tracing ),追踪服务请求是如何在各个分布的组件中进行处理的细节

    业界也有一些成熟的开源软件用于监控与追踪:SkyWalking、Pinpoint、Zipkin、CAT大众点评开源。不过大公司一般都有自研的一套监控与追踪系统,比如腾讯内部就有多套自研监控与调用链追踪系统。

    搜索引擎

    我们讨论的是全文搜索引擎,什么是全文搜索引擎?

    全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

    数据分为结构化数据与非结构化数据

    像数据库表这种的数据是结构化数据;而对于像HTML、XML、文档这样不定长度且无固定格式的数据我们称之为非结构化数据。非结构化数据也称为全文数据,对非结构化数据的搜索可以用全文检索的方式,

    目前两大主流的全文搜索引擎「Solr」和「Elasticsearch」都是基于 Lucene 建立。搜索引擎需要学习的内容:

    • 搜索引擎原理,搜索引擎利用倒排索引技术来实现对全文数据的高效检索。

    • Lucene,Apache Lucene 是一个开源的全文搜索引擎工具包。

    • Elasticsearch 原理与使用

    • Solr 原理与使用

    大数据

    大数据,又称为巨量资料,指的是在传统数据处理应用软件不足以处理的大或复杂的数据集的术语。随着后台服务用户数增加和数据的积累,产生海量有待挖掘价值的数据,分析利用这些数据可以反馈线上决策,优化运营策略,产生数据价值。

    海量数据也可以定义为来自各种来源的大量非结构化或结构化数据。

    在软件开发领域的大数据概念自 20 世纪 90 年代的数据仓库开始,对于大数据的处理也导致各种海量数据的统计和处理技术发展。

    主要包含以下的技术点需要学习:数据存储、离线分析、流式计算。

    • 大数据存储:Hadoop 框架,HDFS、HBase、YARN 架构、Apache Kudu
    • 离线分析:Hive、MapReduce、Spark
    • 流式计算:Flink、Storm、Kafka Stream、Spark Streaming

    虚拟化

    虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。

    虚拟化的好处

    • 灵活性:在同一硬件上同时运行多个操作系统
    • 敏捷性:移动操作系统的方式与将文件或图片从一台物理服务器移动到另一台物理服务器的方式相同。
    • 容错:当物理服务器出现故障时,管理软件会自动将实例迁移到可用服务器,甚至无感知物理硬件故障。
    • 降低成本:您不再需要过多的物理服务器,操作和维护所需的费用也随之减少。

    常见的虚拟化技术:KVM、Xen、OpenVZ、Docker

    虽然对于大多数后台服务程序来说, 很多服务都是部署在 Docker 容器里,但 Docker 共用了底层系统的 kernel,所有容器共用一部分的运行库,因此隔离性相比 KVM 之类的虚拟化技术差一点,KVM 与 Docker 有各自的使用场景,未来很长一段时间是共存状态。

    OpenStack 管理 VM(Virtual Machine)虚拟机的工具;Kubernetes 简称 K8s ,是管理 container 容器的工具。

    中间件

    在后端开发中你可能经常听说到「中间件」这个词,那什么是中间件?看下Wiki上的定义:

    中间件技术创建在对应用软件部分常用功能的抽象上,将常用且重要的过程调用、分布式组件、消息队列、事务、安全、链接器、商业流程、网络并发、HTTP 服务器、Web Service 等功能集于一身或者分别在不同品牌的不同产品中分别完成。

    中国科学院软件所研究员仲萃豪把中间件定义为「平台+通信」。这个定义限定了只有用于分布式系统中的此类软件才能被称为中间件,同时此定义也把中间件与实际应用的应用软件区分开来。

    大白话来说,中间件就是把分布式系统中一些通用功能的抽象出来提供服务的一类软件统称。它屏蔽掉了底层操作系统的复杂性,向上提供一个统一的开发环境,降低了软件系统开发的复杂度,由于中间件是介于操作系统和应用软件之间,为应用软件提供服务功能的软件,由于介于两种软件之间,所以称为中间件

    常见的的开源中间件有下面几种,组合起来就能搭建一个完整的分布式后台服务系统:

    • web server 中间件,Nginx、OpenResty、Tomcat…
    • 缓存中间件,服务端缓存包括 Redis、Memcached…
    • 消息队列中间件,Kafka、RabbitMQ、ActiveMQ…
    • RPC框架,Tars、Dubbo、gRPC、Thrift
    • 数据库中间件,Sharding jdbc
    • 日志系统中间件,ELK B指的是一套解决方案,是 Elasticsearch、Logstash 、 Kibana、Beats 是这 4 种软件产品的首字母缩写。
    • 配置中心中间件,Apollo、zookeeper统一配置管理
    • API网关,开源项目有 Tyk、kong、zuul、orange…

    版本控制

    大型软件项目的代码量巨大,如何有效组织和管理源码和版本,于是产生了版本控制系统。版本控制系统就是我们常说的SVN 或 Git,用来追踪、维护源码、文件以及配置文件等等的改动,并且提供控制这些改动控制权的程序。

    常见的版本控制系统分为两大类:集中式版本控制和分布式版本控制。作为后端开发工程师,版本控制系统的使用也是必须掌握的基础技能,不过这些系统一般都是边使用边熟悉,刚开始熟悉一些常用操作就好

    • 常见的有集中式版本控制系统,代表是SVN;
    • 分布式版本控制系统,代表是Git

    工具

    一些和后端开发或者说软件开发相关的工具推荐,主要是编辑器和 IDE。

    编辑器

    在 Linux 下开发肯定离不开 Vim 或者 Emacs,这两个都是常用的编辑器,已经形成了两大爱好者阵营。特别是 Vim 编辑器,学习成本有点高,配合上各种插件和配置,有些 Vim 爱好者已经把它当成 IDE 来用了,一旦掌握可以大幅提升工作效率,值得你去学习。

    当然除了 Vim 如果是文字编辑工作,比如写 README 文档或者写技术博客,那么强烈推荐学习下 Markdown 语法,这是一种种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,注重内容本身不用过多的调整排版。Markdown 编辑器推荐 Typora 、有道云笔记 Markdown 编辑器、VSCode Markdown插件。

    IDE

    编辑器作为小工程还可以胜任,不过后端开发工作中,一般都是大型的软件工程项目,所以不大可能用编辑器来管理,这时候就需要学习使用专业的集成开发工具。

    集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。

    磨刀不误砍柴工,挑一把趁手的兵器再去编程世界遨游。各语言 IDE 五花八门,推荐 JetBrains 系列和 VS Code ,JetBrains 产品包括各语言开发的一系列的 IDE,特别是Java 的Intellij IDEA 口碑非常不错,部分对应的产品系列如下。

    • CLion - 跨平台的C/C++ IDE 开发工具,支持C++11 、C++14、libc++以及Boost。
    • GoLand - Go语言的集成开发环境。
    • IntelliJ IDEA - 2001年发布。一套智能的 Java 集成开发环境,特别专注与强调程序师的开发撰写效率提升。
    • PhpStorm - PHP IDE开发工具。
    • PyCharm - 一款结合了Django框架的Python IDE开发工具。
    • AppCode - Swift 和 Objective-C IDE开发工具。

    Visual Studio Code(简称VS Code)是一个由微软开发,同时支持Windows 、 Linux和macOS等操作系统的免费代码编辑器,它支持测试,并内置了Git 版本控制功能,同时也具有开发环境功能,例如代码补全(类似于 IntelliSense)、代码片段和代码重构等。该编辑器支持用户个性化配置,例如改变主题颜色、键盘快捷方式等各种属性和参数,同时还在编辑器中内置了扩展程序管理的功能。

    在2019年的 Stack Overflow 组织的开发者调研中,VS Code被认为是最受开发者欢迎的开发环境。

    测试

    软件工程师不仅要写代码,还要做测试,软件测试和软件开发是相伴相生,测试能让保证我们写出代码更加健壮和可维护。

    TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,根据测试代码确定需要编写什么产品代码。需要掌握和了解以下测试技术和方法。

    • 单元测试
    • 压力测试
    • 全链路测试
    • A/B 测试,灰度发布,蓝绿部署

    学习顺序

    总结下,后端技术学习的内容还是很多的,不可能一蹴而就。

    这篇文章能看到这里的同学,如果是初学者,可能就想问直接问我从哪里开始学习?那我就不卖关子,如果你不知道从哪开始学,对于学习路线各个节点,我就按个人的学习经验并结合认识的大厂高 P 给的建议,给你把以上技术路线学习优先级做个排序,你照着学就行,排序规则:

    星级越高,排名越靠前,重要程度越高,优先安排时间学习。

    计算机基础 5星

    Linux 5 星

    数据库 5 星

    设计模式 5 星

    工具 5 星

    中间件 4 星

    分布式 4 星

    高并发、高可用、高性能 4 星

    搜索引擎 4 星

    测试 3 星

    监控与统计 3 星

    虚拟化 3 星

    安全 3 星

    大数据 3 星

    语言的困惑

    细心的读者应该发现了,到目前为止本文讨论的后端技术学习路线内容,并没有提及特定编程语言,不提及并不是说不重要,语言是很多技术的前置知识。打个比方来说,编程语言是砖瓦,高大上的项目都是一砖一瓦堆砌而成。

    其实你在学习上述技术点的过程中,会自然而然的接触到各种编程语言的中间件或是开源项目,不管用什么语言做后端服务开发,都是没有问题的,并且都不有很多优秀的开源框架可以借鉴学习,关键是要有清晰的学习路线,主流的后端开发语言包括 Java、C++、PHP、Python、Go ,那学哪个呢?

    如果你是在校的学生,时间充足,我建议可以都可以尝试下,不试过怎么知道不合适?然后结合自己偏爱和未来打算从事的岗位方向选择一门语言深入学习;

    如果你是职场社畜,那就要适应团队,产品业务需要用什么语言开发那就学哪个。万变不离其宗,后端技术的知识都是相通的,不要被特定语言所束缚,这些通用的后端技术掌握后,剩下的就只是编程语言学习,很快啊,很快的。

    结语

    这篇文章我从月初开始整理内容、绘制思维导图,真真是肝了半个月之久。创作过程中,我把自己从初级开发人员到现在高级工程师,这些年学习的技术都在脑子里过了一遍。

    说来惭愧有些我画在导图上的技术我也只是懂点皮毛,但整个后端技术栈的学习路线和方向是没问题的,我都画出来了,大家参考着学习和查漏补缺,在技术上我也需要继续精进学习,咱们共勉。

    学习路线和高清路线大图我会放在我的 Github 项目上,这篇文章只是个开始,也不是最终版,我会持续在 Github 更新和完善本文内容,我这个项目的地址是:

    https://github.com/imcoderlemon/CodeClass

    点击文末「阅读原文」链接直达 Github 项目主页,记得点个 star 这样我更新了内容你就能收到通知。

    公众号后台回复「路线图」获取后端技术学习路线高清思维导图

    这篇文章没写之前我就预感会很长,写到这里已经 1 万多字了。

    对于每个技术点还可以展开聊聊我是如何学习的,那样就太长了,柠檬哥作为一个普通大学、非计算机科班人员,通过自学后端技术,进入鹅厂做软件开发,我的后端技术学习经验或许能给你一点借鉴。

    我可以给大家分享下细分技术领域的学习路线,比如计算机基础学习路线、数据库学习路线、分布式技术学习路线、高并发技术学习路线…如果大家想看的话就点 「在看」给我点动力,攒够 50 个在看,就再写写具体的学习路线。顺便做个调查你最想看柠檬哥分享哪方面的学习路线。

    原文查看获取高清思维导图

    本文已收录于Githubhttps://github.com/imcoderlemon/CodeClass
    内含原创干货文章,千本计算机电子书,3本LeetCode题解,各类编程资源

    文章每周持续更新,我们下期见!

    展开全文
  • 服务器系统对比、数据库对比、后台开发语言对比

    服务器系统对比:

    这里写图片描述

    服务器的高性能主要体现在cpu高速计算能力,强大的I/O外部数据吞吐能力等方面,主要为客户机提供WEB应用、数据库、流媒体服务。为确保服务器长时间的稳定运行,企业是否选择了一个适合自身需要的操作系统无疑是至关重要的。现在对几大主流的服务器操作系统进行对比分析,没有最好的系统,只有最适合的系统。

    Windows系统

    windows服务器操作系统我们都比较熟悉,它是Microsoft公司开发的,Microsoft是全球最大的操作系统开发商。Windows系统在局域网配置中是最常见的,但由于它对服务器的硬件要求较高,且稳定性不是很好,作为WEB服务器使用时,巨大的内核通讯量不是windows可以承受的,所以微软的服务器操作系统一般只是用在中、低档服务器中。当然Windows系统也有自己的优点,windows在PC时代已经家喻户晓,在易用性方面,没有人比Windows做的更好,相比其他服务器系统来说,极大的降低了使用者的学习成本,这也是Windows系统经久不衰的原因之一。常见的WindowsServer系统有windows server 2003、windows server 2008、windows server 2012等。

    Linux系统

    Linux服务器操作系统是在Posix和Unix的基础上开发出来的,支持多用户、多任务、多线程、多CPU。最大的特点就是开源,开源就是所有人,包括相关企业,政什么的,开发人员共同监督,在这样的监督之下,一套成熟的方案几乎很少出现漏洞。基于这种平台的开发和使用不需要用户支付任何版权费用,是很多创业者的基石,也是一些保密机构对服务器操作系统采购的首选。另外,Linux还有一套完整的权限机制,没有相关权限,想要对系统造成破坏根本无从下手,安全性和稳定性相对较高,受到中、高级开发人员的青睐。也正是因为Linux的安全性和稳定性,国内外很多保密机构服务器操作系统采购的首选,这类操作系统主要应用于中、高档服务器中。

    Unix系统

    Unix服务器操作系统由AT&T公司和SCO公司共同推出,主要支持大型的文件系统服务、数据服务等应用。功能强大。这种网络操作系统稳定和安全性能非常好,但由于它多数是以命令方式来进行操作的,不容易掌握,特别是初级用户。正因如此,小型局域网基本不使用Unix作为网络操作系统,UNIX一般用于大型的网站或大型的企、事业局域网中。因其体系结构不够合理,UNIX的市场占有率呈下降趋势。Unix在一些人眼中属于高端操作系统,因为很多的服务器商生产的高端产品只支持Unix操作系统。

    NetWare系统

    NetWare服务器操作系统相对来说使用的不是很多,多数人不是特别的熟悉,因为它在市场中的份额是比较局限的,在一些特定行业和事业单位中,NetWare优秀的批处理功能和安全、稳定的系统性能也有很大的生存空间。NetWare操作系统兼容DOS命令,其应用环境与DOS相似,具有相当丰富的应用软件支持,技术完善、可靠,以对网络硬件的要求较低而受到一些设备比较落后的中、小型企业,特别是学校的青睐。而且NetWare服务器对无盘站和游戏的支持较好,常用于教学网和游戏厅。这种操作系统有市场占有率呈下降趋势。

    数据库对比

    这里写图片描述

    现在的数据库以关系数据库为主流,各大数据库也在开发面向对象的关系型数据库,把高级程序设计语言和数据库实现无缝连接,以发挥各自的优缺点。高级程序设计语言善于描述复杂的过程,而数据库有着强大的管理功能和可操作性,我们现在的数据库是以表为基本的存储单元(描述一个对象),但现在的发展越来越快,对数据的复杂性也越来越大。

    Oracle

    Oracle是甲骨文公司的一款关系数据库管理系统。到目前仍在数据库市场上占有主要份额。能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。 Oracle数据库是一种大型数据库系统,一般应用于商业,政府部门,它的功能很强大,能够处理大批量的数据,在网络方面也用的非常多。不过,一般的中小型企业都比较喜欢用mysql, SQLserver等数据库系统,它的操作很简单,功能也非常齐全。只是比较Oracle数据库而言,在处理大量数据方面有些不如。

    MySQL

    MySQL是一个小型关系型数据库管理系统,是开源的,MySQL服务器是一个快速的、可靠的和易于使用的数据库服务器。MySQL服务器工作在客户/服务器或嵌入系统中。有大量的MySQL软件可以使用。MySQL是多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass- deployed)的软件中去。开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年, Sun又被Oracle收购。对于MySQL的前途,没有任何人抱乐观的态度。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

    SQL Server

    SQL Server是由微软开发的数据库管理系统,是Web上最流行的用于存储数据的数据库,它已广泛用于电子商务、银行、保险、电力等与数据库有关的行业。只能在windows上运行,C/S结构,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据库。并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。SQL Server 提供了众多的Web和电子商务功能,如对XML和Internet标准的丰富支持,通过Web对数据进行轻松安全的访问,具有强大的、灵活的、基于Web的和安全的应用程序管理等。而且,由于其易操作性及其友好的操作界面,深受广大用户的喜爱。

    DB2

    能在所有主流平台上运行(包括windows)。DB2就是IBM开发的一种大型关系型数据库平台。它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据,最适于海量数据。DB2在企业级的应用最为广泛,在全球大型企业中,有很高的时长份额。具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境。数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点或数据库节点性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。性能较高适用于数据仓库和在线事物处理。跨平台,多层结构,支持ODBC,JDBC等客户。操作简单,同时提供GUI和命令行,在windowsNT和unix下操作相同。在巨型企业得到广泛的应用,向下兼容性好。风险小。

    Sybase

    美国Sybase公司研制的一种关系型数据库系统,是一种典型的UNIX或WindowsNT平台上客户机/服务器环境下的大型数据库系统。 Sybase提供了一套应用程序编程接口和库,可以与非Sybase数据源及服务器集成,允许在多个数据库之间复制数据,适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。性能较高,支持Sun、IBM、HP、Compaq和Veritas的集群设备的特性,实现高可用性。性能接近于SQL Server,但在UNIX平台下的并发性要优与 SQL Server。适应于安全性要求极高的系统。具有较好的并行性,速度快,对巨量数据无明显影响,但是技术实现复杂,需要程序支持,伸缩性有限。使用命令行操作,对数据库管理人员要求较高。同时提供GUI和命令行。但GUI较差,常常无法及时状态。

    除以上介绍之外,还有一些不常用的数据库,比如:Informix、PostgreSQL、Access、FoxPro等。

    后台开发语言

    这里写图片描述

    目前一般公司的后台用的开发语言大概有以下几种:java,python,php,asp.net,c++,rubyon rails 等。国内的大公司偏业务的一般都用 Java 做后台开发比如淘宝,网易,美团等. Python国内一般是一些体量不是这么大的公司使用,例如豆瓣,知乎等。其实,各种语言都有优缺点,没有哪一种是绝对好的。各公司也不是单单只使用一种后台语言,都是结合起来开发的。同公司用不同后台开发语言也有各自的原因。比如,要看需求是重展现还是重业务逻辑,重展现就用php等,重业务逻辑就用Python等,也有原因是由于技术积累,比如腾讯一直主要用C++。

    Java

    Java比较成熟:1995年就已出现。对于商业网站而言,Java是使用最广泛的语言,性能好,适合大中项目,跨平台,安全性高,稳定可靠,运行效率高(尤其是JIT的出现之后差距更大了),不容易犯错(强类型、预编译、必须拦截异常等等),能有效的提高复用度,提升性能和吞吐能力,能规避安全问题。但是开发复杂,开发和发布的效率相对较低,维护成本高,开发人员费用高。Java的生态系统非常成熟(IDE、框架等)。

    PHP

    灵活,上手快,易修改,发布快捷,环境好部署。容易犯错,行效率不高,缺乏全局缓存。由于PHP是运行在服务器端的脚本,可以运行在UNIX、LINUX、WINDOWS、Mac OS、Android等平台。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。PHP最大的优势是学习门槛低。它基本可以在任何地方被执行,托管和非常简单。

    ASP.NET

    微软公司推出的新一代脚本语言。ASP.NET基于.NET Framework的Web开发平台,不但吸收了ASP以前版本的最大优点并参照Java、VB语言的开发优势加入了许多新的特色,同时也修正了以前的ASP版本的。跨语言, 中小型项目上性能好,开发快,适合windows平台,维护成本低。代码逻辑混乱,难于管理,代码的可重用性差。ASP.NET具备开发网站应用程序的一切解决方案,包括验证、缓存、状态管理、调试和部署等全部功能。在代码撰写方面特色是将页面逻辑和业务逻辑分开,它分离程序代码与显示的内容,让丰富多彩的网页更容易撰写。同时使程序代码看起来更洁净、更简单。

    Python

    简单易学,开发快,语言简洁,易于维护,开源,可移植,可扩展。速度慢,格式强制,容易犯错。用Python可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。

    Node.js

    Node.js自从2009年发布一下,使用十分广泛。Node.js具有异步,事件驱动以及可扩展的特性。Node.js应用是由JavaScript开发的,因此它具有JavaScript的所有优点:享受到了JavaScript V8引擎的好处,灵活而轻量级的语法,跟Java一样,JavaScript出现在1995年。所以语言本身发展历史很长,相对稳定。 Node.JS逐渐发展成一个成熟的开发平台,吸引了许多开发者。有许多大型高流量网站都采用Node.JS进行开发,此外,开发人员还可以使用它来开发一些快速移动Web框架。

    除以上介绍之外,还有其他一些后台开发语言,比如:C++、C#、C、Go、Ruby等。

    展开全文
  • 语言对比 语言 版本 TIOBE排名 垃圾回收 类型系统 性能 Web后端 非Web后端 特性 Java 14 2 是 中 Python 3.8 3 是 动态 中 C++ 17 4 高 不适合 Node.js 14 7* 是 动态 中 PHP 7.4 8...
  • 漫谈Go语言后端开发

    万次阅读 2019-02-14 21:47:08
    为什么使用Go语言后端开发? 简单高效:几乎所有主流的编程语言如Java、C++、PHP、Python、JavaScript等等都是可以用于服务端开发的,Go语言作为后起之秀,在语言层面具有语法简洁、执行效率高(底层语言)的...
  •  因为是第一次真正接触后端开发,从编码到部署服务器到上线,所以做个笔记,也供和我一样的开发小白一些参考。 一、前期工作:开发环境与工具:  1. 编程语言:Java #笔者还没学PHP,只想到了Java.  2. (后端)...
  • 聊聊开发中经历的几种后端语言

    千次阅读 2019-03-13 22:21:27
    前言 谈这个话题,没有任何语言之争,只是个人开发的经历。有时候的开发语言的选择也只是趋势的选择,
  • python适合后端开发,因为Python是一种计算机程序设计语言,既可用于前端也可用于后端开发,在Python中编写后端可以简化为编写各个模块,其间的连接随后由前端部分中的用户操作确定和控制。Python是一种计算机程序...
  • 【游戏后端】游戏服务器开发的一些建议(转载)

    万次阅读 多人点赞 2016-08-15 21:04:12
    摘要: 本文作为游戏服务器开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器开发的基本要点,第三部分服务端架构,介绍架构设计中的一些...
  • 摘要: 本文作为游戏服务器开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器开发的基本要点,第三部分服务端架构,介绍架构设计中的一些...
  • 一文看懂Web后端开发

    千次阅读 多人点赞 2021-03-20 23:53:34
    后端开发(Back-End Development,也称服务端开发、服务器端开发等)是创建完整可运行的Web应用服务端程序(服务端程序和资源合称为后端,即在服务器上运行的、不涉及用户界面的部分)的过程,是Web应用程序开发的一...
  • 后端开发入门

    千次阅读 2019-03-27 21:57:05
    因为课程需要我们做一个项目,没有要求是什么程序,我们小组暂定商议为一个安卓程序,又鉴于我没有学过安卓开发,又感受到后台开发的内容自己基本没有接触到过,所以自告奋勇来写后端的内容,这个教程主要参考了b站...
  • 后端开发中常用的语言

    千次阅读 2021-07-03 09:14:54
    由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。目前,C 语言是最广泛使用的系统程序设计语言。大多数先进的软件都是使用 C 语言实现的。 C++ 是 C 语言...
  • 稍加修改就可以运用到企业开发中,整个项目的开发模式为前后端分离的模式,即 Spring Boot 提供后端接口,前端页面通过 Ajax 异步调用接口的方式与后端服务器进行交互并将数据填充至页面中,这也是目前企业开发中...
  • 前端开发与后端开发的区别是什么?在实际开发过程中,前端开发人员精通JS能熟练应用JQuery,懂CSS能熟练运用这些知识,进行交互效果的开发;后端开发人员会写Java代码SQL语句,能做简单的数据库设计会Spring和iBatis...
  • Java是最快的服务器端Web应用开发语言 看一看Oracle持续地推动Java无处不在,从“物联网”到其它领域,这并不是简单的炒作。至少一组数字使 Java 成为服务器端 Web 框架的性能竞赛的佼佼者。但仅仅是性能上的优势就...
  •  个人理解:web服务器本身没有处理后端语言的功能,只是对前端请求...但是web服务器可以和解析后端语言的程序进行交互,这样web服务器就可以执行相应的后端语言(即后端程序)。  如:nginx服务器(一个web服...
  • Java后端开发前景大吗?

    千次阅读 2020-11-16 09:25:04
    因为受疫情影响,大环境下经济发展不景气,求职这个“副本”的过关难度,以肉眼可见速度提升了! 与很多行业裁员情况严重相比,相反,IT互联网行业受到...Java开发工程师就业前景有多好? 1、Java程序员市场需求缺口大 Ja
  • 最近开始接触后端开发,原本在Python跟Java之间徘徊,之所以不选择其他语言,主要是这两个语言都有点基础,尤其是Java用了几年,用起来个跟顺手些,虽然Java也一年多没用了,不过接触几天之后,感觉就又都回来了。...
  • web后端开发学习路线My previous article described how you can get into frontend development. It also discussed how the front end can be a place filled with landmines – step in the wrong place and you'...
  • 什么是后端开发

    千次阅读 2018-11-19 10:58:54
    软件应用程序就像冰山一样。用户看到的只是应用程序的一部分——在大多数...在Web开发的篇章中,我们主要讨论Web开发,因为它涉及与最终用户的直接互动——我们可以称之为“前端Web开发”。 在大多数应用中,非用...
  • golang实现一个博客的后端服务器 一、简介 这篇文章写的是一个简单博客后端的实现过程,完整代码在github上。 我在这次项目中负责的部分是 利用swagger editor生成api文档 服务端部署 完成user和article的全部功能 ...
  • Web后端开发入门(1)

    万次阅读 多人点赞 2018-07-10 20:23:48
    Web概述: 在英语中web表示网页的意思,它用于表示Internet主机上供外界访问的资源。Internet上供外界访问的Web资源分为: 1....动态Web应用的实现手段: 静态web开发技术有html,常用动态web开发...
  • C++后端开发路线必读书籍

    千次阅读 2020-09-02 14:59:19
    C++后端开发路线:(总共分了四个大项,每个大项之间是可以同步进行的) 语言工具方面: 必读: 1.《C++ primer》(感到吃力的话可以先看《C++ primer plus》,找时间再把《C++ primer》看一遍)这本不用介绍了吧...
  • JAVA后端开发浅谈

    千次阅读 多人点赞 2020-02-28 16:00:40
    两个阵营的开发基本上都是各自围绕着各自的开发语言(php/Java),选取最为兼容合适的框架结构和数据库,然后进行服务器端的开发。以下附上PHP和Java语言的区别介绍和原文链接: 《php和java的区别有哪些》 php中文...
  • Java后端开发框架

    万次阅读 多人点赞 2019-09-09 15:31:22
    Java web开发框架了解 ...后端–对外提供(类)RESTful风格的API—数据库交互-- web应用服务器(tomcat)-- Spring 技术栈开发 交互–HTTP协议通信-- JSON格式–RESTful 风格 java web开发框架的变迁 ...
  • 后端开发发展学习路线

    千次阅读 2020-03-09 18:14:58
    ## 1、什么是后端开发 后端开发是一种不涉及创建生成用户界面的开发。这可能包括后端Web开发,可能也涉及编写API,创建库或和没有用户界面或甚至科学编程系统的系统组件一起工作。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,093
精华内容 36,837
关键字:

服务器后端开发语言