最近十年,程式設計領域有什麼重大變化?
如今各種智慧裝置層出不窮,程式設計培訓學校如雨後春筍般大量湧出,自然也為 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的出現和流行讓程式設計入門變得越來越容易;全世界範圍內,開始學習程式設計的年齡越來越小,學習程式設計的人也越來越多;未來,程式設計會像英語一樣成為每個人必備的技能,其門檻也會越來越低。
培訓班火了是真,加班更多了也是真……螢幕前的你看完後有何感想,歡迎評論區分享哦~
相關文章
- 雲端計算有什麼用?雲端計算的應用領域有多大?
- 程式設計領域裡有哪些是共通的地方?程式設計
- 程式化廣告還有未來麼?(4/5)——程式化領域變化的底層邏輯和反思
- 最近在看《領域驅動設計》,問一下智慧UI的準確定義是什麼?UI
- 為什麼結束了十年的程式設計生涯?程式設計
- 什麼是DDD領域驅動設計的統一語言?
- DDD領域驅動設計:領域事件事件
- 什麼是現代化程式設計?程式設計
- 程式設計師有什麼好當的?程式設計師
- 開放計算十年,改變了什麼,又顛覆了什麼?
- 什麼是雲端計算領域的 orphaned resources
- 智慧領域物件設計物件
- 現在的程式設計和二十年前有什麼不同?程式設計
- 什麼是人工智慧領域的強化學習人工智慧強化學習
- Linux下程式設計有什麼優勢Linux程式設計
- 領域驅動設計戰術模式--領域事件模式事件
- 戲說領域驅動設計(廿五)——領域事件事件
- python語言有什麼特點?python應用領域有哪些?Python
- 領域驅動設計戰術模式--領域服務模式
- 什麼是設計模式?為什麼要使用設計模式?有什麼好處?設計模式
- Python tkinter是什麼?GUI程式設計有哪些?PythonGUI程式設計
- 理解領域驅動設計
- MasaFramework -- 領域驅動設計Framework
- 領域驅動設計示例
- 為什麼要將區域性變數的作用域最小化?變數
- Java 17 與 Java 11 相比有什麼變化?Java
- 什麼是程式碼審計?程式碼審計有什麼好處?
- 領域驅動設計最佳實踐--程式碼篇
- Entity Farmework領域建模方式 3種程式設計方式程式設計
- 0基礎如何進入Java程式設計領域Java程式設計
- 程式設計師程式設計時喝什麼?程式設計師
- 程式設計師程式設計時喝什麼程式設計師
- Java二十年:它是如何永遠改變程式設計的。Java程式設計
- 自動化測試為什麼不適合用於遊戲領域?遊戲
- Linux的應用領域有什麼?Linux入門學習Linux
- 什麼是環境變數?python設定環境變數有什麼用?變數Python
- 領域驅動設計簡介
- 實現領域驅動設計