若是把當前TIOBE編程語言排行榜的前十拿出來,與十年前的前十作以比對,就會發現這兩份名單徹底相同!css
惟一的不一樣在於:其中Visual Basic、PHP和Perl與同爲十大熱門卻更現代的C#、Python和JavaScript交換了位置。在這十年間Objective-C確曾進入過十大熱門語言,甚至還攀升到了前三的位置,不過在蘋果宣佈用Swift代替Objective-C以後,它便很快銷聲匿跡了。html
根據這些狀況,咱們能夠得出結論:編程語言並沒有實質性變化,並且將來十年也不會出現什麼新的大型編程語言。 前端
編程語言排行榜2016年8月 TOP 20 榜單node
不過事實並不盡然,編程語言的真正變化在於:爲了競爭存活,前十大熱門編程語言都借鑑了其餘語言的功能,做爲新功能引入。因爲十大熱門語言的代碼庫都很龐大,使用者更願意在該語言中實現變動,而不是換用新的編程語言。 編程語言內核是萬變不離其宗。我我的見解是如下幾個方面的變化比較明顯程序員
語言自己數據庫
工業標準編程
網頁標準有 W3C 控制,尤爲是瀏覽器的開發,全部主流的瀏覽器都會自覺符合這個組織的標準,固然這些開發商自己就是這個組織的成員。因此新的 HTML五、CSS三、ES6 JavaScript 的新特性獲得順利推進,讓大部分主流瀏覽器都支持它,W3C 功不可沒。瀏覽器
PHP 有 PHPFIG 組織,雖然不是強制性的,可是不少新的框架和庫都自覺遵照這個組織的編程標準。服務器
Java、C 語言都有各自的工業標準準則,來維護各自工業標準。網絡
工業標準其實不是強制性的,雖然不少程序員在本身工做上不遵照這些工業標準,可是要推出新的模塊的話,不遵照這些工業標準的模塊,是沒有人會去使用的。現在,是否是面向標準編程,這是體現一個程序員是否專業、一個模塊是否是專業模塊的一個重要指標。
第三方模塊走紅
各類語言的框架和庫,可能比本身的語言還出名,好比 CSS 的 Bootstrap、JavaScript 的 jQuery;一個好的框架和庫甚至能夠推進這個語言的發展,好比 PHP 的 Laravel 框架、JavaScript 的 jQuery。
模塊化的發展,大大加快了開發的速度。不少人也願意開發各類框架和模塊,不但能夠鍛鍊本身的開發技能,也是一種展現本身的能力。
過去,程序員要成名,要開發出有用的軟件,好比求伯君開發出了 WPS,牛;張小龍開發出了 Foxmail,牛。
如今,程序員要成名,能夠開發出一個你們都會用的框架和模塊。好比 Evan You 開發的 Vue.js,玉伯開發的 SeaJs。
模塊化編程和依賴管理
在 2010 年前,依賴管理工具只是個很時髦的概念,你們都習慣到庫的官方網站下載庫後手動導入到項目中。升級也比較麻煩。因此,程序員通常是下載一兩個必要的庫,其餘的庫都本身手寫完成。
現在,依賴管理工具已是必備的了,你們再也不手動導入庫了;能找到第三方模塊的功能,就再也不本身編寫了,所有用工具導入項目;本身編寫的程序代碼,能模塊化的代碼都模塊化,甚至是獨立出來,網上開源,而後使用依賴管理工具進行管理導入到本身的項目中。
這樣作的優勢很明顯:
代碼量減小;
加快開發速度;
高度解耦;
定位 bug 容易,改動影響小;
寫單元測試容易。
現在你們更加願意編寫小模塊,而不是重複造輪子了。
框架使用
如今通常會先選一個合適的框架,再開始編程,而不是全部功能徹底靠本身從頭開始編寫。
JavaScript 的框架多了,如Vue、React、Backbone、AngularJs 等;
CSS 有 Bootstrap、Fundation 等;
PHP 有 Laravel、CakePHP 等;
C#有 MVC;
Java 有 Spring+Hibernate+struts。
框架要先選好,模塊在須要的時候慢慢加就好了。
測試代碼
2006 年,單元測試在開發過程當中,重要性不是很大,無關緊要,只要程序完成,功能能用就行。
現在的代碼,若是沒有單元測試部分,這個工程就不能算完結。甚至是,測試驅動開發已經成爲主流,先寫測試代碼,而後再開發。
測試代碼的發展不只僅是單元測試這部分。單元測試、集成測試、功能測試、性能測試、壓力測試等,都在開發過程當中佔了重要的位置。之前測試都是由專門的測試員進行人工測試,或者由他們負責測試;現在單元測試和集成測試都是要開發者本身編寫。
跨設備,跨平臺
Java 提出的跨平臺,一次編譯處處運行的夢想,其實至今未很好實現。可是,現在跨設備、跨平臺編程趨勢是愈來愈明顯了。
跨設備,主要是指跨桌面和手機,尤爲是針對顯示器的最佳實踐是層出不窮,現在響應式成爲了主流。
跨平臺,出自於Java 的一個概念,現在已經普及了,桌面、手機、服務器、瀏覽器、嵌入式都能看到 JavaScript 的身影,這大大歸功於 JavaScript 標準化的推廣。跨平臺過去是指一次編譯處處運行,現在是指只要這個平臺支持這個語言或標準,就能用。現在的跨平臺編程,更講究特性檢查這個功能,若是你的平臺沒有這個特性,那麼就關閉特性檢查功能,但其餘功能還能夠繼續使用。
從此,各類設備層出不窮,VR 頭盔、AR 眼鏡、巨型屏幕、物聯網等,跨平臺會有進一步的發展。
工程方面
工具化
編程語言工具化現在很是突出了,凡是工具能完成的事情,絕對不手工完成。從如下幾個方面均可以找到相應工具,幫助開發者管理代碼質量。
代碼風格檢查;
工業標準檢查;
代碼整理;
代碼複雜度檢查;
單元測試覆蓋率檢查;
依賴管理;
壓縮代碼;
重複代碼檢查;
無用代碼檢查。
工程化
工程化是近年來最突出的一個發展趨勢,過去只是選擇性的,如今是必須的。工程化是以工具化爲基礎的,沒有工具,那麼工程化也無從談起。工程的核心就是流程自動化,又稱爲構建,這些包括了:代碼質量檢測、代碼壓縮、代碼合併、代碼優化、代碼編譯、單元測試等部分。構建就是把這些部分以工做流程的方式組合起來,而後用一個命令行運行整個流程。它有點像批處理,可是是程序開發中使用的特殊批處理。
網頁編程如今又流行「實時編程」,就是當你在保存代碼的時候,以上的構建流程工做完成後會自動刷新瀏覽器,保證新代碼效果馬上反映在瀏覽器上。如今,在 GitHub 項目庫中找軟件,首先查看是否有工程文件,看看它的構建流程是什麼,就知道這個項目的專業程度和項目質量了。若是沒有配置一個工程化的流程系統,都很差意思說本身在作軟件工程。
自動化
自動化是以工程化爲基礎的,工程化自己就是一種流程自動化,而自動化又在工程化的過程當中更進一步自動化。
持續集成是全自動化的一個終極體現,主要流程是:版本控制庫—構建—測試—報告。持續集成有點像 Windows 的定時任務,但它是程序開發專用的定時任務。
持續集成的特色就是全自動,一個項目一次配置好,要求不變的話,就不用管了;而後開發者不斷把代碼加入到版本控制庫裏就能夠了,每當庫有新代碼時候,持續集成就會下載代碼進行構建;當它完成構建和測試後,若是測試沒有經過,就會返回報告,而後根據報告結果修改代碼。
因此每次往版本庫添加新代碼,持續集成就會全自動地幫你構建和測試代碼,儘快通知代碼的問題。這樣,程序員就能夠更加集中精力編寫功能代碼和測試代碼,而不用擔憂新代碼是否會影響過去的代碼。
在多人一塊兒開發的時候,持續集成更有用,誰上傳的代碼沒有經過測試,能立刻知道。這樣能夠保證多人項目的代碼順利合併,體現「持續集成」的功效。
另外還有持續部署,其實就是持續集成在測試成功後部署上產品服務器的流程。現在有些網站一天就要部署幾十次,有了持續部署後,部署多少次都毫無壓力。
工具化、工程化以及自動化的關係頗有意思,前者是後者的基礎,然後者又極大推進了前者的發展。它們相互積極做用,相互推進了對方的發展,這造成了一個很好的良性循環。
其餘方面
版本控制,Git、GitHub
版本控制在編程界中的地位是愈來愈重要了。在編程界中有個說法:沒有版本控制的項目,就等於沒有這個項目。
版本控制的工具過去有 SVN,現在是 Git 。 Git 很強大,用的人也是愈來愈多,它和 GitHub 共同對編程界的積極影響和積極推進,這是使人沒法忽視的。好比幾乎全部的依賴管理工具的庫下載源,都是和 GitHub 綁定的, 就這一點來講,GitHub 的重要性在 IT 界就不可估量。
GitHub 和 Git 的方便管理、上傳、查看、統計、bug 報告等功能更是極大地推進了程序員之間的合做;GitHub 上的開源更是改變了開源軟件對世界的影響力。
GitHub 不是 Git 的所有,Git 也不是版本控制的所有。本質上來講,GitHub 只是一個網站而已;但 GitHub 確實又是這個編程世界不可缺乏的一個重要模塊,已經成爲了一個不可或缺的組成部分。甚至, GitHub 已經跳出了編程界,成爲了一個世界級的不可或缺的服務平臺。
然而 GitHub 是 2008 年創建的,真正開始流行是在 2012 年。在 2015 年, Google 宣佈關閉本身的 Google Code,可見 GitHub 的影響力,以及其在業界的重要程度了。
生態圈意識
生態圈意識在業界是愈來愈強了,它應該和編程工具化和工程化有極大的關係。一門語言、框架或者庫出現後,人們應用它們,不僅是由於它們自己的強大,更是由於它們背後的生態圈。
舉個例子,人們選擇一個 JavaScript 的框架,是選 React 仍是選 Ember.js,更可能是看支持它們的生態圈如何。React 是有 Facebook 支持的,有不少程序員爲它開發相關工具和庫以及有不少文檔教程,這樣 React 的生態圈就很大,會讓更多人願意選擇 React 做爲第一開發框架。而 Ember.js 相對來講生態圈小,選擇它的人可能就不會不少。
選擇語言也同樣。選用 JavaScript 編寫爬蟲,仍是選 PHP 或者 Python?更多的是看它們的生態系統了,Python 的爬蟲庫強大且豐富,因此更多人選用 Python 編寫爬蟲。
一門新的語言是否成熟,看的就是它的生態圈,好比是否有測試框架、 MVC 框架,是否有成熟的時間庫、數據庫 SDK 等,這些都是其必要的生態圈組成部分。
WEB 技術的桌面化和 JavaScript 的全棧化
JavaScript 近些年發展火熱,逐漸印證了Atwood定律:凡是能夠用 JavaScript 實現的,最終都會用 JavaScript 實現。
Node.js 的出現,奠基了JavaScript 走出瀏覽器,走向了服務器端;
NW 的出現和 electron 正式版發佈,JavaScript 走向了桌面;
MongoDB 的出現,JavaScript 走向了數據庫;
Tessel 的出現,走向了硬件和物聯網。
現在一個全棧系統,從前端到數據庫,能夠徹底使用 JavaScript 一種語言。還有不少人正在致力於把 JavaScript 推向更多的領域中。
而 Web 技術(html+css+JavaScript)因爲 NW 和 Electron 的出現,已經能夠編寫桌面程序了。正是因爲 JS 的優秀模塊不少,以及 HTML+CSS 的界面容易編寫和掌控,糾錯工具豐富,不少人願意用 Web技術進行開發。如今比較火的桌面工具備 VS-Code 編輯器和 Atom 編輯器。
因爲 Web 技術的便利性,Web 技術涉及的領域也就愈來愈多,不再是瀏覽器的專利了。
Web API 的全面發展
Web API 雖然歷史悠久,可是真正使其推廣流行的應該是 Twitter,然後移動設備的普及使其獲得更大發展和普及。移動設備若是沒有 Web API 基本就不能工做。Web API 的普及,也使得網絡服務之間相互連通,造成一個更大的服務網絡。總之,現在的 Web API 已是不可或缺的存在了。
Web API 更可能是一種服務,或是一種數據交換模式。只要語言帶有 HTTP 的網絡訪問功能,就都能使用。提供 Web API 的公司,發佈 Web API 後,通常也會同時發佈一些經常使用語言的 SDK,方便語言開發人員快速上手;可是若是語言比較小衆,沒有提供相應的 SDK 也沒有關係,編寫一段 HTTP 的請求,也能夠交換數據。
從編程的角度來概括一下 Web API 特色就是:
容易編寫,就是一個函數,無需界面;
語言無關性,不管 Web API 是哪一門語言編寫的,幾乎任何語言都能調用;
訪問性好,只要網絡能訪問,Web API 就能夠用。
語言之間的相互借鑑
語言之間的相互借鑑也愈來愈明顯了,好比:
PHP 5.0 後支持了類,5.4 後支持了 Trait,5.5 後支持了生成器(Generator);
JavaScript ES 6 支持了箭頭匿名函數、生成器(Generator)、類(不是 Prototype 的類);
C# 和 Java 相互借鑑;
Coffee Script 借鑑 Python 和 Ruby。
與其說是相互借鑑,不如說隨着語言的發展,一些語言概念逐漸成爲了標配,若是沒有,就不算是完整的語言了,好比說類、匿名函數、經常使用數據結構等都成爲了標配。
語言解析器的工具化
語言解析器(Parser)在過去是做爲編譯器的一部分存在的。現在,它已經獨立出來做爲一個模塊或者工具使用了。這對於語言的生態有着很大的意義,促進了語言生態圈的良好發展。
獨立出來的解析器,能夠用來編寫如下和語言有關的工具,這些工具都是用來優化代碼質量、提升編碼體驗的。
語法檢查,JavaScript 的 JSHint 用的就是 JavaScript 的一個解釋器,被 JavaScript 從新解釋一遍,把可能有問題的地方標記出來通知程序員,程序員可修改避免潛在錯誤。
代碼最小化,代碼重寫的一種形式,JavaScript 的最小化項目(好比 Urglify),是把語法正確讀取後,進行最小化壓縮。把單詞變量轉換成單字母變量,甚至是 if else 轉換成?: 形式。
語法擾亂器,就是代碼重寫的一種形式,讓代碼沒法閱讀,保護代碼。
語法整理器,代碼從新的一個形式,把沒法閱讀的代碼轉換成可閱讀的代碼,好比 beautifier。
語法高亮,通常用於代碼編輯器和代碼顯示組件的。
代碼分析器,把可用的代碼部分進行掃描,列出代碼相關數據,好比用了多少類、多少對象、多少變量、多少全局變量等。
代碼清理器,分析器的增強,清理不用的變量、不用的對象、不用的函數等。
自動完成,一些 IDE 能夠分析已經存在的變化和函數,之後在不斷的打字中能夠智能自動完成。
代碼追蹤,好比說某段代碼被執行了幾回、程序報錯時候函數被執行的順序、測試程序時候的代碼覆蓋率等。
虛擬執行,JavaScript 代碼在一個保護區域內或環境執行,代碼能夠返回值,但不能影響非虛擬環境內的代碼執行。好比說,代碼裏面有全局變量,可是虛擬執行後這個全局變量只在虛擬環境內,非虛擬環境裏沒有這個全局變量。
數據交換語言的發展
數據交換語言發展,整體來講就是從 XML 主流逐漸發展到 JSON 主流的過程。雖然 XML 如今應用仍是很是普遍,可是因爲其複雜性和標籤佔用空間大,逐漸被輕量級的 JSON 給代替了。另外,JSON 與 JavaScript 自然兼容,無需解析,直接使用,因此在不少網絡技術中 JSON 是優先使用的。
而現在不少配置文件也是用 JSON 實現的,好比 Composer 和 node 的配置文件。
JSON 的閱讀方式更符合程序員的閱讀習慣,格式化後的結構一目瞭然,容易理解。
JSON 有以下優勢:
結構符合程序員閱讀習慣;
文件大小相對更小;
JavaScript 能夠直接使用;
在非 JavaScript 的腳步語言中,轉化成數據結構更容易;
學習曲線很短。
正是以上這些緣由,能夠說在編程界裏,使用 JSON 做爲數據交換語言是大勢所趨了。
總結
以上所列的現象和趨勢,其實都是相輔相成的,最終行成了一種良性循環。這些現象和趨勢都會繼續發展下去,併成爲之後新趨勢的基礎。這些特色很是重要,應該成爲每一個程序員都應該知道的知識。
一些建議
我在讀編程專業的時候,大學沒有教過這些知識,甚至在工做中也沒有了解趨勢的要求。大學主要學編寫代碼,能編譯經過、出正確結果就能夠了。程序員在工做中,要求代碼能用,沒有明顯 bug 就行。
然而,在我我的工做實踐中,逐漸體會到這些趨勢的重要性,編寫可維護的高質量代碼能夠大大減小本身在維護中的難度和壓力。每個準備或者想要成爲合格的開發人員的人,都應該熟練掌握這些知識和技能,若是大學沒有教過、之前沒有想過,必定要想辦法本身去學習和提升。