最近十年,程式設計領域有什麼重大變化?

devstore發表於2016-08-16

如今各種智慧裝置層出不窮,程式設計培訓學校如雨後春筍般大量湧出,自然也為 IT 領域輸送了大批的程式設計人才。那麼,在這個網際網路/移動網際網路崛起的時代,程式設計領域發生了哪些變化,又取得了哪些重要進展呢?知乎各路大神給出了自己的見解,我們一起看下。

注:本文由DEV小編整理自知乎,本著分享的原則整理髮布,以下回答內容版權歸原作者所有。

@caoglish 作者分析的比較詳細全面,還給學生們提出了一些建議:

程式語言層出不窮,然而核心是萬變不離其宗。我個人看法覺得是以下幾個方面的變化比較明顯。

語言本身:

1. 工業標準

網頁標準有w3c控制,尤其是瀏覽器的開發,所有主流的瀏覽器都會自覺符合這個組織的標準,當然這些開發商本身就是這個組織的成員。所以新的HTML5,CSS3,ES6 javascript的新特性的得到順利推動,讓大部分主流瀏覽器都支援它,w3c功不可沒.

PHP有PHPFIG組織,雖然不是強制性的,但是很多新的框架和庫都自覺遵守這個組織的程式設計標準

Java, C語言都有各自的工業標準準則,來維護各自工業標準。

這個標準其實不是強制性的,雖然很多程式設計師在自己工作上,不遵守這些工業標準,但是要推出新的模組的話,不遵守這些工業標準的模組,是沒有人會去使用的。如今是不是面向標準程式設計,是體現一個程式設計師是否專業,一個模組是不是專業模組的一個重要指標。

2. 第三方模組走紅

各種語言的框架和庫,可能比自己的語言還出名,比如css的Bootstrap,javascript的jQuery;一個好的框架和庫甚至可以推動這個這個語言的發展,比如說PHP的Laravel框架,Javascript的jQuery.

模組化的發展,大大加快了開發的速度。很多人也願意開發各種框架和模組,不但可以鍛鍊自己的開發技能,也是一種展示自己的能力。

過去,程式設計師要成名,要開發出有用的軟體,比如說求伯君開發出了wps,牛;張曉龍開發出了foxmail,牛。

現在,程式設計師要成名,開發出一個大家都會用的框架和模組也行。比如Evan You開發的vue.js,玉伯開發的seajs。

3. 模組化程式設計和依賴管理

在2010前,依賴管理工具只是個很時髦的概念,大家習慣手動到庫的官方網站上下載後手動匯入到專案中。升級也是個麻煩事。所以一般大家也就下載一兩個必要的庫,其他都自己手寫完成。

如今,依賴管理工具已經是必備的了,大家不再手動匯入庫了;而且是能找到第三方模組的功能,就不再自己編寫了,統統用工具匯入專案;自己編寫的程式程式碼,能模組化的程式碼統統模組化,甚至是獨立出來,網上開源,然後使用依賴管理工具進行管理匯入到自己的專案中。

這樣好處也明顯:

· 程式碼量減少

· 加快開發速度

· 高度解耦

· 定位bug容易,改動影響小

· 寫單元測試容易

如今大家更加願意寫小模組,而不是重複造輪子了。

4. 框架使用

更願意先選一個合適的框架,再開始程式設計,而不是所有功能自己從頭開始寫了.

· javascript的框架多了,vue,react, backbone,angularjs等;

· css有bootstrap,fundation等;

· PHP有laravel,cakephp等

· C#有MVC

· Java有spring+hibernate+struts

框架要先選好,模組的話,等需要慢慢加就行了。

5. 測試程式碼

2006年,單元測試在開發過程中,重要性不是很大,可有可無,程式完成,功能能用就行。

如今的程式碼,沒有單元測試部分,這個工程就不能算完結。甚至是,測試驅動開發已經成為主流,先寫測試程式碼,然後開發。

測試程式碼的發展有不單單是單元測試部分。單元測試,整合測試,功能測試,效能測試,壓力測試等等,都在開發過程中佔了極大的位置。以前測試都是由專門的測試員進行人工測試,或者他們負責測試;如今單元測試和整合測試都是要開發者自己寫。

6. 跨裝置,跨平臺

Java提出的跨平臺,一次編譯到處執行的夢想,其實至今未很好的實現。但是如今這個跨裝置,跨平臺程式設計趨勢卻越來越明顯了。

跨裝置,主要是指桌面和手機,尤其是針對顯示器的最佳實踐是層出不窮,如今是響應式成為了主流。

跨平臺,出自於Java的一個概念,如今已經算普及了,尤其是JavaScript,桌面,手機,伺服器,瀏覽器,嵌入式都能看到javascript的身影,這大大歸功於JavaScript標準化的推廣。跨平臺過去是說一次編譯到處執行;如今是隻要這個平臺支援這個語言或標準,就能用。如今的跨平臺程式設計,更講究特性檢查這個功能,如果你這個平臺沒有這個特性,那麼就關閉這個有這個特性的功能,但其他功能還可以繼續使用。

今後,各種裝置層出不窮,VR頭盔,AR眼鏡,巨型螢幕,物聯網等等,跨平臺會有進一步的發展。

工程方面的:

1. 工具化

我覺得工具化非常突出了,凡是能工具完成的事情,絕對不手工完成。以下幾個方面都是可以找到相應工具,幫助開發者管理程式碼質量:

· 程式碼風格檢查

· 工業標準檢查

· 程式碼整理

· 程式碼複雜度檢查

· 單元測試覆蓋率檢查

· 依賴管理

· 壓縮程式碼

· 重複程式碼檢查

· 無用程式碼檢查

· 等等,

2. 工程化

工程化也是近年來最最突出的一個發展趨勢,過去只是選擇性的,現在是必須的。

工程化是以工具化為基礎的,沒有工具,那麼工程化也無從談起。

工程的核心就是流程自動化,又稱之為構建,這些包括了:程式碼質量檢測,程式碼壓縮,程式碼合併,程式碼優化,程式碼編譯,單元測試等等部分。構建就是把這些以工作流程的方式組合起來,然後用一個命令列執行這整個流程。它有點像批處理,但是是程式開發中使用的特殊批處理

在網頁程式設計的過程中,現在又流行“實時程式設計”,就是當你在儲存程式碼的時候,以上的構建流程就開始工作完成後自動重新整理瀏覽器,保證新程式碼效果立刻反應在瀏覽器上。

現在,你去github的專案庫中找軟體,首先翻看,是否有工程檔案,看看它的構建流程是什麼,就知道這個專案的專業程度和專案的質量了。

而自己,沒有一個配置一個工程化的流程系統,都不好意思說自己在做軟體工程。

3. 自動化

自動化是以工程化為基礎的,工程化本身就是一種流程自動化。而自動化有在工程化的過程中更進一步的自動化。

持續整合就是全自動化的一個終極體現。他的主要流程是:版本控制庫->構建->測試->報告.

持續整合有點像windows的定時任務,但是它是程式開發專用的定時任務。

持續整合的特點就是全自動,一個專案一次配置好了後,要求不變的話,就不用管了;然後開發者不斷把程式碼加入到版本控制庫裡就行了,每當庫有新程式碼時候,持續整合就會下載程式碼進行構建;當它完成構建和測試後,如果測試沒有通過,就會報告給你,然後你根據報告結果進行修改程式碼。所以你每次往版本庫加的新程式碼時候,持續整合就會全自動的幫你構建和測試程式碼,儘快的通知你程式碼的問題。這樣程式設計師就可以更加集中精力編寫功能程式碼和測試程式碼,而不用擔心新程式碼是否會影響到過去的程式碼了。

持續整合在多人一起開發的時候,更是有用,誰上傳的程式碼沒通過測試,能馬上知道。這樣保證多人專案在程式碼順利合併,體現“持續整合”的功效。

另外還有個持續部署,其實就是持續整合在測試成功後部署上產品伺服器上的流程。如今有些網站一天就要部署幾十次,有了持續部署後,部署多少次都毫無壓力。

工具化,工程化,自動化的關係挺有意思,前者是後者的基礎,而後者卻極大推動了前者的發展。它們是相互積極作用,相互推動了對方的發展,形成了一個很好的良性迴圈

其他方面:

1. 版本控制,git,github

版本控制在程式設計界中的地位是越來越重要了。在程式設計界中有個說法:沒有版本控制的專案,就等於沒有這個專案。

版本控制的工具很多過去有svn,如今git的強大,用的人也是越來越多,而它和github的相同作用下,對程式設計界的積極影響和積極推動,是令人無法忽視的。比如幾乎所有的依賴管理工具的庫下載源,都是和github繫結的, 就這一點來說,github的重要性在IT就不可估量。

而github上和git的方便管理,上傳,檢視,統計,bug報告等功能更是極大地推動了程式設計師之間的合作;github上的開源更是改變了開源軟體對世界的影響力。

github不是git的全部,git也不是版本控制的全部,本質上來說,github只是一個網站而已;然後github確實又是這個程式設計世界不可缺少的一個重要的模組,已經成為了一個不可或缺的組成部分了。甚至github已經跳出了程式設計界,成為了一個世界級的不可或缺的服務平臺了。然而github是2008年建立的,真正開始流行是在2012年的。在2015年google宣佈關閉自己的google code。可見github的影響力,以及在業界的重要程度了。

2. 生態圈意識

生態圈意識在業界是越來越強了,它應該和程式設計工具化和工程化有極大的關係。一個語言,框架或者庫的出現,人們用它們,不但是因為它們本身的強大,更是因為它們背後的生態圈。

比如說人們選一個javascript的框架,選react還是選ember.js,更多是看支援他們的生態圈如何,react是有facebook支援的,更有很多程式設計師為它開發相關工具和庫以及有很多文件教程。這樣react的生態圈就很大,會讓更多人願意選擇react作為第一開發框架。而ember.js相對來說生態圈小,選擇它的人可能就不會很多。

選語言也一樣,選javascript編寫爬蟲還是選php編寫爬蟲還是用python?更多的是看他們的生態系統了,python的爬蟲庫強大且豐富,所以更多人選用python編寫爬蟲。

一個新的語言出現,成熟與否,看的就是它的生態圈了,比如是否有測試框架,是否有mvc框架,成熟的時間庫,資料庫sdk等等,這些都是其必要的生態圈組成部分。

總結:

以上的這些現象和趨勢,其實都是相輔相成的,最終成了一種良性迴圈。這些現象和趨勢都會繼續發展下去,併成為以後新趨勢的基礎。所以這些特點都是非常重要的,而且應該成為每個程式設計師都應該知道的知識。

給學生們的一些建議:

我在讀程式設計專業的時候,這些東西大學都沒有教過,甚至在工作中,公司都沒有這些要求。大學主要教的是程式碼編寫,能編譯通過,能出正確結果就可以了。在工作中,程式碼能用,沒有明顯bug就行。

然而,在我個人工作實踐中,逐漸的體會到這些趨勢的重要性了,可維護性的高質量程式碼可以大大減少自己在維護中的難度和壓力。作為準備成為一個合格的開發人員,應該熟練掌握這些知識和技能。如果大學沒有教過,一定想辦法自己學習和提高。

補充:

1. WEB技術的桌面化和JavaScript的全棧化

JavaScript 近些年發展火熱,逐漸印證了一個Atwood法則:凡是可以用javascript實現的,最終都會用javascript實現

· Nodejs的出現,奠定了JavaScript走出瀏覽器,走向了伺服器端

· NW的出現和electron正式版釋出,JavaScript走向了桌面

· MongoDB的出現,JavaScript走向了資料庫

· Tessel的出現,走向了硬體和物聯網

如今一個全棧系統,從前端到資料庫,可以完全使用JavaScript一種語言。還有很多人正在致力於把JavaScript推向更多的領域中。

而Web技術(html+css+javascript)由於NW和Electron的出現,已經可以編寫桌面程式了。正是由於JS的優秀模組很多,以及HTML+CSS的介面容易編寫和掌控,糾錯工具豐富,很多人願意用Web技術進行開發。現在比較火的桌面工具有VS-Code編輯器和Atom編輯器。

總結一下:由於web技術的便利性,WEB技術涉及的領域也就越來越多,再也不是瀏覽器的專利了。

2. 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就可以用。

3. 語言之間的相互借鑑

語言之間的相互借鑑也越來越明顯了,比如:

· PHP5.0後支援了類,5.4 後支援了Trait,5.5後支援了生成器(Generator)

· Javascript ES6 支援了箭頭匿名函式,生成器(Generator),類(不是Prototype的類)

· C# 和 Java相互借鑑

· Coffee Script借鑑Python和Ruby

與其說是相互借鑑,不如說隨著語言的發展,一些語言概念逐漸成為了標配,如果沒有,就算是一個不完整的語言了。比如說類,匿名函式,常用資料結構等都成為了標配。

4. 語言解析器的工具化

語言解析器(Parser)在過去自是作為編譯器的一部分存在的。如今,它已經獨立出來作為一個模組或者工具來使用了,這個對於一個語言的生態有著很大的意義,促進了語言生態圈的良好發展。

獨立出來的解析器,可以用來編寫以下和語言有關的工具,這些工具都是用來優化程式碼質量的,提高編碼體驗的。

語法檢查,javascript的jshint用的就是javascript的一個直譯器,被javascript重新解釋一遍,把可能有問題的地方標記出來通知程式設計師,程式設計師可修改避免潛在錯誤。

程式碼最小化,程式碼重寫的一種形式,javascript的最小化專案(比如urglify),是把語法正確讀取後,進行最小化壓縮。把單詞變數轉換成單字母變數。甚至是if else轉換成?: 形式。

語法擾亂器,就是程式碼重寫的一種形式,讓程式碼無法閱讀,保護程式碼。

語法整理器,程式碼重新的一個形式,把無法閱讀的程式碼,轉換成可閱讀的程式碼,比如beautifier

語法高亮,一般用於程式碼編輯器和程式碼顯示元件的。

程式碼分析器, 把可用的程式碼部分進行掃描,列出程式碼相關資料,比如用了多少類,多少物件,多少變數,多少全域性變數等等

程式碼清理器,分析器的加強,清理不用的變數,不用的物件和,不用的函式等。

自動完成,一些IDE可以分析已經存在的變化和函式,以後在不斷的打字中可以智慧的自動完成。

程式碼追蹤,比如說某段程式碼被執行了幾次,程式報錯時候,函式被執行的順序,測試程式時候的程式碼覆蓋率等等

虛擬執行,javascript程式碼在一個保護區域內或環境執行,程式碼可以返回值,但不能影響非虛擬環境內的程式碼執行。比如說,程式碼裡面有全域性變數,但是虛擬執行後這個全域性變數只在虛擬環境內,非虛擬環境的沒有這個全域性變數。

5. 資料交換語言的發展

資料交換語言發展總體來說就是從XML主流逐漸發展到JSON主流的過程. 雖然xml現在應用還是非常廣泛,但是由於其複雜和標籤佔用空間大,逐漸被輕量級的JSON給代替了。尤其JSON與javascript天然相容,無需解析,直接使用。所以在很多網路技術中JSON是優先使用的。

而如今很多配置檔案也是用JSON實現的,比如Composer和node的配置檔案。

JSON的閱讀方式更符合程式設計師的閱讀習慣,格式化後的結構一目瞭然,容易理解。

JSON好處:

· 結構符合程式設計師閱讀習慣

· 檔案大小相對更小

· Javascript可以直接使用

· 在非JavaScript的腳步語言中,轉化成資料結構更容易

· 學習曲線很短

正是以上這些原因,使用JSON作為資料交換語言可以說在程式設計界裡,是大勢所趨了。

@王雷 作者主要從開源、敏捷開發、大資料,以及雲端計算等方面分析:

開源軟體、開源社群的發展大大減少了程式設計師的重複勞動。10年前,開源仍然是比較小眾的(還記得大明湖畔的sourceforge嗎?),但近幾年Github的出現,以及各大廠商開始擁抱開源以後,軟體開發變成了軟體拼裝,開源元件+業務邏輯的開發模式降低了產品研發的成本,讓很小的研發團隊就能駕馭超大型的軟體專案。

軟體開發變得無比敏捷。瀑布開發模型已然是歷史遺蹟,持續整合、持續交付、微服務、DevOps這些工程實踐,讓軟體的釋出速率提高了一個甚至數個數量級。

資料成為新的寶藏。網際網路的發展和智慧手機的普及讓人類累積了大量的資料,而這些資料的挖掘和探索,將會產生無法想象的價值。10年前, Google的GFS/MR/Bigtable三篇論文剛剛釋出, Hadoop專案也剛剛開始。今天,大資料專案已經成為網際網路公司的標配,走在前沿的企業開始在深度學習領域佈局。

雲端計算的普及。10年間,雲服務從一個雲裡霧裡的概念發展成為軟體產品交付的主要模式。AWS,Heroku, Saleforce,Slack這些公司的成功讓IaaS/PaaS/SaaS/CaaS(容器雲)的價值都得到了充分驗證。對於網際網路企業來說,開源降低了研發成本,而云服務進一步降低了運營成本,初創網際網路公司如雨後春筍,大眾創業成為可能。

程式執行正規化的變化。雖然現在大部分網際網路產品仍然遵循客戶端-伺服器的正規化。但是分散式的軟體產品已經初露端倪,區塊鏈、比特幣的出現不單是金融領域的創新,也可能預示著軟體產品從中心化走向分散化的一種趨勢。

軟體開發的民主化。軟體開發曾經是少數專業人員才能駕馭的黑魔法,如今,程式設計的門檻大大降低,很多人經過簡單培訓、自學就可以勝任開發工作。而今後,更多DSL的出現可能讓程式設計成為各個領域、各個職業的必備技能。

@馮子浩:感受最大的,應該是大部分人認為加班應該是開發的常態。

@jun lee:分工更細了。語言更多了。php火了。

@任逍遙:Python的出現和流行讓程式設計入門變得越來越容易;全世界範圍內,開始學習程式設計的年齡越來越小,學習程式設計的人也越來越多;未來,程式設計會像英語一樣成為每個人必備的技能,其門檻也會越來越低。

培訓班火了是真,加班更多了也是真……螢幕前的你看完後有何感想,歡迎評論區分享哦~

相關文章