一.什么是全棧工程師?
簡單概括就是全能型的人才;比如說你一個人能夠把服務器搭建起來、能夠把數據庫建好、能夠寫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在嚴格意義上來說是動態類型的強類型編程語言。
指令式編程語言與函數式語言的區別
之前所有的傳統編程語言都是指令式編程語言,因為我們寫的代碼是怎么樣執行完全按照我們程序員編寫的指令來執行。但是函數式編程不是這樣執行的,函數式編程代碼的執行順序不是按照程序的先后順序執行的,它是理解了程序員的用意后進行執行,比如要讓計算機畫一棵樹,它就會畫一顆樹,但是具體畫樹的方法是由它來畫的,并不像之前按照程序員的的程序一步一步的去畫,相對函數式編程環境承擔的東西更多了,跟接近于人腦的思維方式在編程,所以學習函數式編程更簡單了,不需要學程序邏輯都可以做函數式編程。所以在函數式編程領域像計算機一樣去思考不是必須的。