一.什么是全栈工程师?
简单概括就是全能型的人才;比如说你一个人能够把服务器搭建起来、能够把数据库建好、能够写Web程序连接数据库,不管是用JAVA还是PHP或者别的语言。如java使用JDBC、PHP使用PDO、Node.js使用Node.js的MySQL扩展等。不管用什么方式把服务器搭好、服务器数据库连接好、写Web程序、包括我们的网页客户端+ios客户端和Android客户端,一个人能够把一个APP做起来做上线,那么你就可以认为自己是一个全栈工程师了。
栈是什么?
堆栈的栈。堆栈:比如说你把一摞书摞在桌子上,那么在内存中表现的数据结构我们称它为一个栈,再把一本新的书放上去就会越摞越高,越后面放的书越在上面,越早放的书越在下面,这就叫栈。如果要拿出从上面拿起,越后放的书反而越先拿;所以栈这种数据结构的特点就是先进后出,后进先出。
混合APP开发模式
与用户交互的前端技术分为两类:一类是客户端程序,另一类是网页端程序;如果写网页端程序就要学习HTML、CSS和JS;如果要写客户端程序就要学习ios和Android;把这两者结合起来就是混合APP开发模式。
全栈工程师的特点是通往架构师之路,我们知道做技术的最高端,站在金字塔顶端的人是架构师。如果要做架构师全栈工程师就是起点,因为全栈工程师所有的技术环节都知道。
二.编程语言的发展历史
编程语言的特点:可以控制我们的指令、进行内存的分配、可以执行我们的程序逻辑。(HTML和CSS没有这个能力所以不算编程语言,能够承载逻辑的才是编程语言)
机器语言
最原始、最底层的编程语言就是机器语言,机器语言是直接跟硬件电路相关的,比如说CPU有很多帧口数,我们通过电路指令给它每个帧口数通电是高电位还是低电位(是1还是0),它会给我们返回运算结果。CPU就是通过这种硬件电路来工作的,这种硬件电路就是近机器语言(0101二进制这种类型)。这种就属于硬件编程,也属于机器语言编程。
汇编语言
比机器语言高级点就是汇编语言,汇编语言是直接通过我们的英文单词给我们的机器下指令,汇编语言会经过编译器解析之后直接生成机器码。
高级语言
比汇编语言更高级的语言我们统称为高级语言,高级语言是从C语言开始起步的,C、C++、Java包括现在的JS、Ruby、Python、go等。
高级语言又有分类,一般编程语言在10年至20年之间都会有一次大的变革。比如说从1946年第一台计算机的硬件编码到50年代末期的汇编语言才流行起来,到60年代末期C语言就诞生了,我们都知道C语言和UNIX操作系统同时诞生的,C语言和汇编语言比起来就属于高级语言了,因为代码有复用性了,写好的代码可以在很多台机器上面都可以编译。而汇编是不可以的,汇编针对每一台机器CPU指令都不同,都要重新写。但是C语言就可以一处编写,到处编译。在不同的机器上编译就会翻译成不同的机器码以供使用。C语言称之为结构化的编程语言,就是因为C语言有了函数,函数可以调用函数,函数之间可以传递参数有返回值,这样的话代码看起来更清晰能够有模块化了。其中最重要的一点就是可以抽象,可以把一个大型的项目切得很小对项目进行划分。然后随着项目越来越大,C语言的抽象程度还是不够,因此比C语言更加抽象的面向对象语言C++出现了。所以面向对象是比C语言更高级的抽象。面向对象的核心就是抽象。
面向对象的语言从80年代末期到90年代初期很火,尤其在1993年Java语言诞生后面向对象非常非常火,一直持续到2005年左右。现在我们知道面向对象语言也慢慢被淘汰了。面向对象也表现了很多弊端,比如说在Java编程语言里面很多东西都要求标准化、规范化要写接口。
Java打败C++
同样是面向对象语言我们知道很长一段时间Java打败了当时最强的语言C++,因为C语言和C++有个很大的弊端就是它有指针,指针需要人为去管理还要管理内存的分配和释放,这样很容易出BUG,指针操作不当会产生很严重的后果,还可能产生内存泄漏。而Java有了JVM实现了真正意义上的跨平台(一处编译,到处运行),还通过内存回收机制,通过一定基数来帮我们管理内存,这样程序员不用手动去管理内存程序员的工作量和犯错的几率就减少了。Java就是精简版的C++,而且不用人为去管理内存和指针了,这就是Java打败C++的原因。
随着时代的发展,面向对象的语言后来被曝出了很多毛病,比如说Java很长一段时间差点被淘汰了,如果不是Android使用Java的话,Java可能之前就已经走向末路了。原因是Java这样的面向对象的语言在做大型软件工程的时候Java可以帮助我们高度抽象,抽象理论上说是由好处的,但是由于Java为我们提供了很多的规范,而编程的时候我们都去遵守这些规范,而且有大量的配置文件我们要去配置,所以大家觉得很不方便。因为Java希望我们所有程序员写的代码都是一致的,希望我们都按照一个标准规范来走,这种思想是好的但是这样导致了一个结果,就是在大的项目架构设计的时候我们要预先设计好所有的接口,然后让所有的程序员去实现这些接口,程序员去实现这些接口自然程序就能对接,多人合作就能很顺利,这是好事情同时又造成一个弊端,很多Java的反对者认为Java是反人类的。因为软件都还没做出来,你怎么可能知道我需要哪些接口、需要定义哪些抽象类、抽象层方法呢?这不是反人类的吗?(因为一个全新的、之前没有人做过的开发项目,不可能实现在项目开始之前就能定义好这个项目有哪些数据结构、表要留哪些字段、要留哪些接口、定义好哪些基类和抽象类等然后再给其他程序员去用,除非同样的系统之前做过很多遍,才有可能实现)
PHP打败Java
我们知道很长一段时间Java被PHP打败了,到现在为止全球有80%的网站是用PHP写的。那么Java之前那么强还很安全,还给程序员省了很多力,为什么会被PHP打败呢?原因就是Java过度标准化,要求大量的预先设计(导致项目还没有开始、需求都还不确定但是要设计好所有的接口和规范、基类和抽象类、建好数据库、布置好模板等这种是很不实际的事情)。PHP不要求为预先设计非常灵活,可以面向对象编程也可以不面向对象编程,比如说前期开发的时候哪怕是过程化的写法,只是代码不好看,后期可以再把面向过程的代码变成面向对象,还可以把多个PHP文件整合成一个单入口, 代码完成后发现有几个类都有共同的方法,可以再写一个接口让这些类同时再实现这个接口,这就是一个不断开发重构、开发重构过程,重构的时候代码就越来越漂亮越来越完善,这样重构到最后Java是完全部面向对象,PHP也可以会是完全面向对象,Java是MVC,PHP也可以是MVC。只不过在开发的过程中PHP会很灵活。开发了之后确定了最后的需求再来一步一步的完善。这就是为什么PHP做项目很快很灵活的原因,也是现在很多创业型项目IOS和Android的APP服务器端都是用PHP做的。
三.函数式编程语言
我们说编程语言10~20年都会有一个大的变革,那么PHP其实也是一门面向对象的语言,JS是基于对象的语言。而现在最流行的编程语言就是函数式编程语言,从2006年以后Ruby是日本人开发的,在美国发扬光大以后,把所有的传统编程语言都打败了,因为在服务器开发领域的话函数式编程语言的优势非常大,函数式编程语言就是解决了面向对象编程语言的弊端(之前提到的预先设计、Java的反人类做法)。函数式编程语言有很多,比如现在谷歌最新的编程语言go语言,Java8、PHP7等都支持函数式编程语言的一部分特性(其中Java8已经支持函数式编程语言的80%了)。函数式编程语言是现在的主流,它不需要我们提前设计好接口、设计好基类。因为函数式编程如果两个类中都有一个共同的方法,它会自动生成这个方法的接口。
编程语言的动态类型、静态类型、强类型和弱类型的区分
强类型通常就是静态类型,但是动态类型不一定就是弱类型。强类型就是存储在内存中的数据类型是限定的,不同地方使用时需要进行强制数据类型转换,动态类型就是在声明一个变量时不需要使用特定的关键字进行数据类型限定,比如将一个数字类型和一个字符串类型的数据进行运算时,如果有需要进行数据类型转换后才能进行运算的就是强类型,如果不需要转换就能直接进行运算的就是弱类型,所以PHP就是弱类型编程语言,而JS在严格意义上来说是动态类型的强类型编程语言。
指令式编程语言与函数式语言的区别
之前所有的传统编程语言都是指令式编程语言,因为我们写的代码是怎么样执行完全按照我们程序员编写的指令来执行。但是函数式编程不是这样执行的,函数式编程代码的执行顺序不是按照程序的先后顺序执行的,它是理解了程序员的用意后进行执行,比如要让计算机画一棵树,它就会画一颗树,但是具体画树的方法是由它来画的,并不像之前按照程序员的的程序一步一步的去画,相对函数式编程环境承担的东西更多了,跟接近于人脑的思维方式在编程,所以学习函数式编程更简单了,不需要学程序逻辑都可以做函数式编程。所以在函数式编程领域像计算机一样去思考不是必须的。
网友评论