編程語(yǔ)言層出不窮,然而內(nèi)核是萬(wàn)變不離其宗。我個(gè)人看法覺(jué)得是以下幾個(gè)方面的變化比較明顯。
01語(yǔ)言本身
1. 工業(yè)標(biāo)準(zhǔn)
網(wǎng)頁(yè)標(biāo)準(zhǔn)有 W3C 控制,尤其是瀏覽器的開(kāi)發(fā),所有主流的瀏覽器都會(huì)自覺(jué)符合這個(gè)組織的標(biāo)準(zhǔn),當(dāng)然這些開(kāi)發(fā)商本身就是這個(gè)組織的成員。所以新的 HTML5,CSS3,ES6 的新特性的得到順利推動(dòng),讓大部分主流瀏覽器都支持它,W3C 功不可沒(méi)。
PHP 有 組織,雖然不是強(qiáng)制性的,但是很多新的框架和庫(kù)都自覺(jué)遵守這個(gè)組織的編程標(biāo)準(zhǔn)。
Java, C 語(yǔ)言都有各自的工業(yè)標(biāo)準(zhǔn)準(zhǔn)則,來(lái)維護(hù)各自工業(yè)標(biāo)準(zhǔn)。
這個(gè)標(biāo)準(zhǔn)其實(shí)不是強(qiáng)制性的,雖然很多程序員在自己工作上,不遵守這些工業(yè)標(biāo)準(zhǔn),但是要推出新的模塊的話,不遵守這些工業(yè)標(biāo)準(zhǔn)的模塊,是沒(méi)有人會(huì)去使用的。如今是不是面向標(biāo)準(zhǔn)編程,是體現(xiàn)一個(gè)程序員是否專業(yè),一個(gè)模塊是不是專業(yè)模塊的一個(gè)重要指標(biāo)。
2.第三方模塊走紅
各種語(yǔ)言的框架和庫(kù),可能比自己的語(yǔ)言還出名,比如 CSS 的 , 的 ;一個(gè)好的框架和庫(kù)甚至可以推動(dòng)這個(gè)這個(gè)語(yǔ)言的發(fā)展,比如說(shuō) PHP 的 框架, 的 .
模塊化的發(fā)展,大大加快了開(kāi)發(fā)的速度。很多人也愿意開(kāi)發(fā)各種框架和模塊,不但可以鍛煉自己的開(kāi)發(fā)技能,也是一種展示自己的能力。
過(guò)去,程序員要成名,要開(kāi)發(fā)出有用的軟件,比如說(shuō)求伯君開(kāi)發(fā)出了 WPS,牛;張曉龍開(kāi)發(fā)出了 ,牛。
現(xiàn)在,程序員要成名,開(kāi)發(fā)出一個(gè)大家都會(huì)用的框架和模塊也行。比如 Evan You 開(kāi)發(fā)的 Vue.js,玉伯開(kāi)發(fā)的 SeaJs。
3.模塊化編程和依賴管理
在 2010 前,依賴管理工具只是個(gè)很時(shí)髦的概念,大家習(xí)慣手動(dòng)到庫(kù)的官方網(wǎng)站上下載后手動(dòng)導(dǎo)入到項(xiàng)目中。升級(jí)也是個(gè)麻煩事。所以一般大家也就下載一兩個(gè)必要的庫(kù),其他都自己手寫(xiě)完成。
如今,依賴管理工具已經(jīng)是必備的了,大家不再手動(dòng)導(dǎo)入庫(kù)了;而且是能找到第三方模塊的功能,就不再自己編寫(xiě)了,統(tǒng)統(tǒng)用工具導(dǎo)入項(xiàng)目;自己編寫(xiě)的程序代碼,能模塊化的代碼統(tǒng)統(tǒng)模塊化,甚至是獨(dú)立出來(lái),網(wǎng)上開(kāi)源,然后使用依賴管理工具進(jìn)行管理導(dǎo)入到自己的項(xiàng)目中。
這樣好處也明顯:
如今大家更加愿意寫(xiě)小模塊,而不是重復(fù)造輪子了。
4. 框架使用
更愿意先選一個(gè)合適的框架,再開(kāi)始編程,而不是所有功能自己從頭開(kāi)始寫(xiě)了。
的框架多了,Vue,React, , 等;
CSS 有 , 等;
PHP 有 , 等
C#有 MVC
Java 有 ++
框架要先選好,模塊的話,等需要慢慢加就行了。
5. 測(cè)試代碼
2007 年,單元測(cè)試在開(kāi)發(fā)過(guò)程中,重要性不是很大,可有可無(wú),程序完成,功能能用就行。
如今的代碼,沒(méi)有單元測(cè)試部分,這個(gè)工程就不能算完結(jié)。甚至是,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)已經(jīng)成為主流,先寫(xiě)測(cè)試代碼,然后開(kāi)發(fā)。
測(cè)試代碼的發(fā)展有不單單是單元測(cè)試部分。單元測(cè)試,集成測(cè)試,功能測(cè)試,性能測(cè)試,壓力測(cè)試等等,都在開(kāi)發(fā)過(guò)程中占了極大的位置。以前測(cè)試都是由專門的測(cè)試員進(jìn)行人工測(cè)試,或者他們負(fù)責(zé)測(cè)試;如今單元測(cè)試和集成測(cè)試都是要開(kāi)發(fā)者自己寫(xiě)。
6.跨設(shè)備,跨平臺(tái)
Java 提出的跨平臺(tái),一次編譯到處運(yùn)行的夢(mèng)想,其實(shí)至今未很好的實(shí)現(xiàn)。但是如今這個(gè)跨設(shè)備,跨平臺(tái)編程趨勢(shì)卻越來(lái)越明顯了。
跨設(shè)備,主要是指桌面和手機(jī),尤其是針對(duì)顯示器的最佳實(shí)踐是層出不窮,如今是響應(yīng)式成為了主流。
跨平臺(tái),出自于 Java 的一個(gè)概念,如今已經(jīng)算普及了,尤其是 ,桌面,手機(jī),服務(wù)器,瀏覽器,嵌入式都能看到 的身影,這大大歸功于 標(biāo)準(zhǔn)化的推廣。跨平臺(tái)過(guò)去是說(shuō)一次編譯到處運(yùn)行;如今是只要這個(gè)平臺(tái)支持這個(gè)語(yǔ)言或標(biāo)準(zhǔn),就能用。如今的跨平臺(tái)編程,更講究特性檢查這個(gè)功能,如果你這個(gè) 平臺(tái)沒(méi)有這個(gè)特性,那么就關(guān)閉這個(gè)有這個(gè)特性的功能,但其他功能還可以繼續(xù)使用。
今后,各種設(shè)備層出不窮,VR 頭盔,AR 眼鏡,巨型屏幕,物聯(lián)網(wǎng)等等,跨平臺(tái)會(huì)有進(jìn)一步的發(fā)展。
02工程方面的
1.工具化
我覺(jué)得工具化非常突出了,凡是能工具完成的事情,絕對(duì)不手工完成。以下幾個(gè)方面都是可以找到相應(yīng)工具,幫助開(kāi)發(fā)者管理代碼質(zhì)量
等等,
2. 工程化
工程化也是近年來(lái)最最突出的一個(gè)發(fā)展趨勢(shì),過(guò)去只是選擇性的,現(xiàn)在是必須的。
工程化是以工具化為基礎(chǔ)的,沒(méi)有工具,那么工程化也無(wú)從談起。
工程的核心就是流程自動(dòng)化,又稱之為構(gòu)建,這些包括了:代碼質(zhì)量檢測(cè),代碼壓縮,代碼合并,代碼優(yōu)化,代碼編譯,單元測(cè)試等等部分。構(gòu)建就是把這些以工作流程的方式組合起來(lái),然后用一個(gè)命令行運(yùn)行這整個(gè)流程。它有點(diǎn)像批處理,但是是程序開(kāi)發(fā)中使用的特殊批處理
在網(wǎng)頁(yè)編程的過(guò)程中,現(xiàn)在又流行“實(shí)時(shí)編程”,就是當(dāng)你在保存代碼的時(shí)候,以上的構(gòu)建流程就開(kāi)始工作完成后自動(dòng)刷新瀏覽器,保證新代碼效果立刻反應(yīng)在瀏覽器上。
現(xiàn)在,你去 的項(xiàng)目庫(kù)中找軟件,首先翻看,是否有工程文件,看看它的構(gòu)建流程是什么,就知道這個(gè)項(xiàng)目的專業(yè)程度和項(xiàng)目的質(zhì)量了
而自己,沒(méi)有一個(gè)配置一個(gè)工程化的流程系統(tǒng),都不好意思說(shuō)自己在做軟件工程。
3. 自動(dòng)化
自動(dòng)化是以工程化為基礎(chǔ)的,工程化本身就是一種流程自動(dòng)化。而自動(dòng)化有在工程化的過(guò)程中更進(jìn)一步的自動(dòng)化。
持續(xù)集成就是全自動(dòng)化的一個(gè)終極體現(xiàn)。他的主要流程是:版本控制庫(kù) ->構(gòu)建 ->測(cè)試 ->報(bào)告.
持續(xù)集成有點(diǎn)像 的定時(shí)任務(wù),但是它是程序開(kāi)發(fā)專用的定時(shí)任務(wù)。
持續(xù)集成的特點(diǎn)就是全自動(dòng),一個(gè)項(xiàng)目一次配置好了后,要求不變的話,就不用管了;然后開(kāi)發(fā)者不斷把代碼加入到版本控制庫(kù)里就行了標(biāo)準(zhǔn)c語(yǔ)言寫(xiě)通訊錄,每當(dāng)庫(kù)有新代碼時(shí) 候,持續(xù)集成就會(huì)下載代碼進(jìn)行構(gòu)建;當(dāng)它完成構(gòu)建和測(cè)試后,如果測(cè)試沒(méi)有通過(guò),就會(huì)報(bào)告給你,然后你根據(jù)報(bào)告結(jié)果進(jìn)行修改代碼。所以你每次往版本庫(kù)加的新 代碼時(shí)候,持續(xù)集成就會(huì)全自動(dòng)的幫你構(gòu)建和測(cè)試代碼,盡快的通知你代碼的問(wèn)題。這樣程序員就可以更加集中精力編寫(xiě)功能代碼和測(cè)試代碼,而不用擔(dān)心新代碼是 否會(huì)影響到過(guò)去的代碼了。
持續(xù)集成在多人一起開(kāi)發(fā)的時(shí)候,更是有用,誰(shuí)上傳的代碼沒(méi)通過(guò)測(cè)試,能馬上知道。這樣保證多人項(xiàng)目在代碼順利合并,體現(xiàn)“持續(xù)集成”的功效。
另外還有個(gè)持續(xù)部署,其實(shí)就是持續(xù)集成在測(cè)試成功后部署上產(chǎn)品服務(wù)器上的流程。如今有些網(wǎng)站一天就要部署幾十次,有了持續(xù)部署后,部署多少次都毫無(wú)壓力。
工具化,工程化,自動(dòng)化的關(guān)系挺有意思,前者是后者的基礎(chǔ),而后者卻極大推動(dòng)了前者的發(fā)展。它們是相互積極作用,相互推動(dòng)了對(duì)方的發(fā)展,形成了一個(gè)很好的良性循環(huán)
03其他方面
1. 版本控制,Git,
版本控制在編程界中的地位是越來(lái)越重要了。在編程界中有個(gè)說(shuō)法:沒(méi)有版本控制的項(xiàng)目,就等于沒(méi)有這個(gè)項(xiàng)目。
版本控制的工具很多過(guò)去有 SVN,如今 Git 的強(qiáng)大,用的人也是越來(lái)越多,而它和 的相同作用下,對(duì)編程界的積極影響和積極推動(dòng),是令人無(wú)法忽視的。比如幾乎所有的依賴管理工具的庫(kù)下載源,都是和 綁定的, 就這一點(diǎn)來(lái)說(shuō), 的重要性在 IT 就不可估量。
而 上和 Git 的方便管理,上傳,查看,統(tǒng)計(jì),bug 報(bào)告等功能更是極大地推動(dòng)了程序員之間的合作; 上的開(kāi)源更是改變了開(kāi)源軟件對(duì)世界的影響力。
不是 Git 的全部,Git 也不是版本控制的全部,本質(zhì)上來(lái)說(shuō), 只是一個(gè)網(wǎng)站而已;然后 確實(shí)又是這個(gè)編程世界不可缺少的一個(gè)重要的模塊,已經(jīng)成為了一個(gè)不可或缺的組成部分了。甚至 已經(jīng)跳出了編程界,成為了一個(gè)世界級(jí)的不可或缺的服務(wù)平臺(tái)了。然而 是 2008 年建立的,真正開(kāi)始流行是在 2012 年的。在 2015 年 宣布關(guān)閉自己的 Code。可見(jiàn) 的影響力,以及在業(yè)界的重要程度了。
2.生態(tài)圈意識(shí)
生態(tài)圈意識(shí)在業(yè)界是越來(lái)越強(qiáng)了,它應(yīng)該和編程工具化和工程化有極大的關(guān)系。一個(gè)語(yǔ)言,框架或者庫(kù)的出現(xiàn),人們用它們,不但是因?yàn)樗鼈儽旧淼膹?qiáng)大,更是因?yàn)樗鼈儽澈蟮纳鷳B(tài)圈。
比如說(shuō)人們選一個(gè) 的框架,選 React 還是選 Ember.js,更多是看支持他們的生態(tài)圈如何,React 是有 支持的,更有很多程序員為它開(kāi)發(fā)相關(guān)工具和庫(kù)以及有很多文檔教程。這樣 React 的生態(tài)圈就很大,會(huì)讓更多人愿意選擇 React 作為第一開(kāi)發(fā)框架。而 Ember.js 相對(duì)來(lái)說(shuō)生態(tài)圈小,選擇它的人可能就不會(huì)很多。
選語(yǔ)言也一樣,選 編寫(xiě)爬蟲(chóng)還是選 PHP 編寫(xiě)爬蟲(chóng)還是用 ?更多的是看他們的生態(tài)系統(tǒng)了, 的爬蟲(chóng)庫(kù)強(qiáng)大且豐富,所以更多人選用 編寫(xiě)爬蟲(chóng)。
一個(gè)新的語(yǔ)言出現(xiàn),成熟與否,看的就是它的生態(tài)圈了,比如是否有測(cè)試框架,是否有 MVC 框架,成熟的時(shí)間庫(kù),數(shù)據(jù)庫(kù) SDK 等等,這些都是其必要的生態(tài)圈組成部分。
04總結(jié)
以上的這些現(xiàn)象和趨勢(shì),其實(shí)都是相輔相成的,最終成了一種良性循環(huán)。這些現(xiàn)象和趨勢(shì)都會(huì)繼續(xù)發(fā)展下去,并成為以后新趨勢(shì)的基礎(chǔ)。所以這些特點(diǎn)都是非常重要的,而且應(yīng)該成為每個(gè)程序員都應(yīng)該知道的知識(shí)。
05一些建議
我在讀編程專業(yè)的時(shí)候,這些東西大學(xué)都沒(méi)有教過(guò),甚至在工作中,公司都沒(méi)有這些要求。大學(xué)主要教的是代碼編寫(xiě),能編譯通過(guò),能出正確結(jié)果就可以了。在工作中,代碼能用,沒(méi)有明顯 bug 就行。
然而,在我個(gè)人工作實(shí)踐中,逐漸的體會(huì)到這些趨勢(shì)的重要性了,可維護(hù)性的高質(zhì)量代碼可以大大減少自己在維護(hù)中的難度和壓力。作為準(zhǔn)備成為一個(gè)合格的開(kāi)發(fā)人員,應(yīng)該熟練掌握這些知識(shí)和技能。如果大學(xué)沒(méi)有教過(guò),一定想辦法自己學(xué)習(xí)和提高。
又想到幾個(gè)發(fā)展,這里更新一下
1. WEB 技術(shù)的桌面化和 的全棧化
近些年發(fā)展火熱,逐漸印證了一個(gè) 法則:凡是可以用 實(shí)現(xiàn)的,最終都會(huì)用 實(shí)現(xiàn)
的出現(xiàn),奠定了 走出瀏覽器,走向了服務(wù)器端
NW 的出現(xiàn)和 正式版發(fā)布, 走向了桌面
的出現(xiàn), 走向了數(shù)據(jù)庫(kù)
的出現(xiàn),走向了硬件和物聯(lián)網(wǎng)
如今一個(gè)全棧系統(tǒng),從前端到數(shù)據(jù)庫(kù),可以完全使用 一種語(yǔ)言。還有很多人正在致力于把 推向更多的領(lǐng)域中。
而 Web 技術(shù)(html+css+)由于 NW 和 的出現(xiàn),已經(jīng)可以編寫(xiě)桌面程序了。正是由于 JS 的優(yōu)秀模塊很多,以及 HTML+CSS 的界面容易編寫(xiě)和掌控,糾錯(cuò)工具豐富,很多人愿意用 WEB 技術(shù)進(jìn)行開(kāi)發(fā)。現(xiàn)在比較火的桌面工具有 VS-Code 編輯器和 Atom 編輯器。
總結(jié)一下:由于 WEB 技術(shù)的便利性,WEB 技術(shù)涉及的領(lǐng)域也就越來(lái)越多,再也不是瀏覽器的專利了。
2. Web API 的全面發(fā)展
Web API 雖然歷史悠久,但是真正使其推廣流行的應(yīng)該是 ,而后移動(dòng)設(shè)備的普及使其得到更大發(fā)展和普及。移動(dòng)設(shè)備如果沒(méi)有 Web API 基本就不能工作了。Web API 的普及,也使得網(wǎng)絡(luò)服務(wù)之間相互連通,形成一個(gè)更大的服務(wù)網(wǎng)絡(luò)。總之,如今的 Web API 已經(jīng)是不可或缺的存在了。
Web API 更多的是一種服務(wù),或是一種數(shù)據(jù)交換模式。只要語(yǔ)言帶有 HTTP 的網(wǎng)絡(luò)訪問(wèn)功能,就都能使用。提供 Web API 的公司,發(fā)布 Web API 后,一般也會(huì)同時(shí)發(fā)布一些常用語(yǔ)言的 SDK,方便相應(yīng)語(yǔ)言開(kāi)發(fā)人員快速上手;但是如果語(yǔ)言比較小眾,沒(méi)有提供相應(yīng)的 SDK 也沒(méi)有關(guān)系,編寫(xiě)一段 HTTP 的請(qǐng)求,也是可以交換數(shù)據(jù)。
從編程的角度來(lái)歸納一下 Web API 特點(diǎn)就是:
容易編寫(xiě),就是個(gè)函數(shù),無(wú)需界面
語(yǔ)言無(wú)關(guān)性,無(wú)論 Web API 是個(gè)語(yǔ)言編寫(xiě),幾乎任何語(yǔ)言都能調(diào)用
訪問(wèn)性好,無(wú)論在哪,只要網(wǎng)絡(luò)能訪問(wèn),Web API 就可以用。
3. 語(yǔ)言之間的相互借鑒
語(yǔ)言之間的相互借鑒也越來(lái)越明顯了,比如:
PHP5.0 后支持了類,5.4 后支持了 Trait,5.5 后支持了生成器()
ES6 支持了箭頭匿名函數(shù),生成器(),類(不是 的類)
C# 和 Java 相互借鑒
借鑒 和 Ruby
與其說(shuō)是相互借鑒,不如說(shuō)隨著語(yǔ)言的發(fā)展,一些語(yǔ)言概念逐漸成為了標(biāo)配,如果沒(méi)有,就算是一個(gè)不完整的語(yǔ)言了。比如說(shuō)類,匿名函數(shù),常用數(shù)據(jù)結(jié)構(gòu)等都成為了標(biāo)配。
4. 語(yǔ)言解析器的工具化
語(yǔ)言解析器()在過(guò)去自是作為編譯器的一部分存在的。如今,它已經(jīng)獨(dú)立出來(lái)作為一個(gè)模塊或者工具來(lái)使用了,這個(gè)對(duì)于一個(gè)語(yǔ)言的生態(tài)有著很大的意義,促進(jìn)了語(yǔ)言生態(tài)圈的良好發(fā)展。
獨(dú)立出來(lái)的解析器,可以用來(lái)編寫(xiě)以下和語(yǔ)言有關(guān)的工具,這些工具都是用來(lái)優(yōu)化代碼質(zhì)量的,提高編碼體驗(yàn)的。
語(yǔ)法檢查標(biāo)準(zhǔn)c語(yǔ)言寫(xiě)通訊錄, 的 用的就是 的一個(gè)解釋器,被 重新解釋一遍,把可能有問(wèn)題的地方標(biāo)記出來(lái)通知程序員,程序員可修改避免潛在錯(cuò)誤。
代碼最小化,代碼重寫(xiě)的一種形式, 的最小化項(xiàng)目(比如 ),是把語(yǔ)法正確讀取后,進(jìn)行最小化壓縮。把單詞變量轉(zhuǎn)換成單字母變量。甚至是 if else 轉(zhuǎn)換成?: 形式。
語(yǔ)法擾亂器,就是代碼重寫(xiě)的一種形式,讓代碼無(wú)法閱讀,保護(hù)代碼。
語(yǔ)法整理器,代碼重新的一個(gè)形式,把無(wú)法閱讀的代碼,轉(zhuǎn)換成可閱讀的代碼,比如 。
語(yǔ)法高亮,一般用于代碼編輯器和代碼顯示組件的。
代碼分析器, 把可用的代碼部分進(jìn)行掃描,列出代碼相關(guān)數(shù)據(jù),比如用了多少類,多少對(duì)象,多少變量,多少全局變量等等
代碼清理器,分析器的加強(qiáng),清理不用的變量,不用的對(duì)象和,不用的函數(shù)等。
自動(dòng)完成,一些 IDE 可以分析已經(jīng)存在的變化和函數(shù),以后在不斷的打字中可以智能的自動(dòng)完成。
代碼追蹤,比如說(shuō)某段代碼被執(zhí)行了幾次,程序報(bào)錯(cuò)時(shí)候,函數(shù)被執(zhí)行的順序,測(cè)試程序時(shí)候的代碼覆蓋率等等
虛擬執(zhí)行, 代碼在一個(gè)保護(hù)區(qū)域內(nèi)或環(huán)境執(zhí)行,代碼可以返回值,但不能影響非虛擬環(huán)境內(nèi)的代碼執(zhí)行。比如說(shuō),代碼里面有全局變量,但是虛擬執(zhí)行后這個(gè)全局變量只在虛擬環(huán)境內(nèi),非虛擬環(huán)境的沒(méi)有這個(gè)全局變量。
5. 數(shù)據(jù)交換語(yǔ)言的發(fā)展
數(shù)據(jù)交換語(yǔ)言發(fā)展總體來(lái)說(shuō)就是從 XML 主流逐漸發(fā)展到 JSON 主流的過(guò)程. 雖然 XML 現(xiàn)在應(yīng)用還是非常廣泛,但是由于其復(fù)雜和標(biāo)簽占用空間大,逐漸被輕量級(jí)的 JSON 給代替了。尤其 JSON 與 天然兼容,無(wú)需解析,直接使用。所以在很多網(wǎng)絡(luò)技術(shù)中 JSON 是優(yōu)先使用的。
而如今很多配置文件也是用 JSON 實(shí)現(xiàn)的,比如 和 node 的配置文件。
JSON 的閱讀方式更符合程序員的閱讀習(xí)慣,格式化后的結(jié)構(gòu)一目了然,容易理解。
JSON 好處:
正是以上這些原因,使用 JSON 作為數(shù)據(jù)交換語(yǔ)言可以說(shuō)在編程界里,是大勢(shì)所趨了。