編程語言層出不窮纽哥,然而內(nèi)核是萬變不離其宗。我個人看法覺得是以下幾個方面的變化比較明顯栖秕。
語言本身:
1. 工業(yè)標(biāo)準(zhǔn)
網(wǎng)頁標(biāo)準(zhǔn)有 W3C 控制春塌,尤其是瀏覽器的開發(fā),所有主流的瀏覽器都會自覺符合這個組織的標(biāo)準(zhǔn),當(dāng)然這些開發(fā)商本身就是這個組織的成員只壳。所以新的 HTML5俏拱,CSS3,ES6 JavaScript 的新特性的得到順利推動吼句,讓大部分主流瀏覽器都支持它彰触,W3C 功不可沒。
PHP 有 PHPFIG 組織命辖,雖然不是強制性的况毅,但是很多新的框架和庫都自覺遵守這個組織的編程標(biāo)準(zhǔn)。
Java, C 語言都有各自的工業(yè)標(biāo)準(zhǔn)準(zhǔn)則尔艇,來維護各自工業(yè)標(biāo)準(zhǔn)尔许。
這個標(biāo)準(zhǔn)其實不是強制性的,雖然很多程序員在自己工作上终娃,不遵守這些工業(yè)標(biāo)準(zhǔn)味廊,但是要推出新的模塊的話,不遵守這些工業(yè)標(biāo)準(zhǔn)的模塊棠耕,是沒有人會去使用的余佛。如今是不是面向標(biāo)準(zhǔn)編程,是體現(xiàn)一個程序員是否專業(yè)窍荧,一個模塊是不是專業(yè)模塊的一個重要指標(biāo)辉巡。
2.第三方模塊走紅
各種語言的框架和庫,可能比自己的語言還出名蕊退,比如 CSS 的 Bootstrap郊楣,JavaScript 的 jQuery;一個好的框架和庫甚至可以推動這個這個語言的發(fā)展瓤荔,比如說 PHP 的 Laravel 框架净蚤,JavaScript 的 jQuery.
模塊化的發(fā)展,大大加快了開發(fā)的速度输硝。很多人也愿意開發(fā)各種框架和模塊今瀑,不但可以鍛煉自己的開發(fā)技能,也是一種展示自己的能力点把。
過去橘荠,程序員要成名,要開發(fā)出有用的軟件愉粤,比如說求伯君開發(fā)出了 WPS砾医,牛;張曉龍開發(fā)出了 Foxmail衣厘,牛如蚜。
現(xiàn)在压恒,程序員要成名,開發(fā)出一個大家都會用的框架和模塊也行错邦。比如 Evan You 開發(fā)的 Vue.js,玉伯開發(fā)的 SeaJs探赫。
3.模塊化編程和依賴管理
在 2010 前,依賴管理工具只是個很時髦的概念撬呢,大家習(xí)慣手動到庫的官方網(wǎng)站上下載后手動導(dǎo)入到項目中伦吠。升級也是個麻煩事。所以一般大家也就下載一兩個必要的庫魂拦,其他都自己手寫完成毛仪。
如今,依賴管理工具已經(jīng)是必備的了芯勘,大家不再手動導(dǎo)入庫了箱靴;而且是能找到第三方模塊的功能,就不再自己編寫了荷愕,統(tǒng)統(tǒng)用工具導(dǎo)入項目衡怀;自己編寫的程序代碼,能模塊化的代碼統(tǒng)統(tǒng)模塊化安疗,甚至是獨立出來抛杨,網(wǎng)上開源,然后使用依賴管理工具進行管理導(dǎo)入到自己的項目中荐类。
這樣好處也明顯:
代碼量減少
加快開發(fā)速度
高度解耦
定位 bug 容易怖现,改動影響小
寫單元測試容易
如今大家更加愿意寫小模塊,而不是重復(fù)造輪子了掉冶。
4. 框架使用
更愿意先選一個合適的框架真竖,再開始編程,而不是所有功能自己從頭開始寫了.
JavaScript 的框架多了厌小,Vue,React战秋, Backbone璧亚,AngularJs 等;
CSS 有 Bootstrap,F(xiàn)undation 等脂信;
PHP 有 Laravel癣蟋,CakePHP 等
C#有 MVC
Java 有 Spring+Hibernate+struts
框架要先選好,模塊的話狰闪,等需要慢慢加就行了疯搅。
5. 測試代碼
2006 年,單元測試在開發(fā)過程中埋泵,重要性不是很大幔欧,可有可無罪治,程序完成,功能能用就行礁蔗。
如今的代碼觉义,沒有單元測試部分,這個工程就不能算完結(jié)浴井。甚至是晒骇,測試驅(qū)動開發(fā)已經(jīng)成為主流,先寫測試代碼磺浙,然后開發(fā)洪囤。
測試代碼的發(fā)展有不單單是單元測試部分。單元測試撕氧,集成測試箍鼓,功能測試,性能測試呵曹,壓力測試等等款咖,都在開發(fā)過程中占了極大的位置。以前測試都是由專門的測試員進行人工測試奄喂,或者他們負(fù)責(zé)測試铐殃;如今單元測試和集成測試都是要開發(fā)者自己寫。
6.跨設(shè)備跨新,跨平臺
Java 提出的跨平臺富腊,一次編譯到處運行的夢想,其實至今未很好的實現(xiàn)域帐。但是如今這個跨設(shè)備赘被,跨平臺編程趨勢卻越來越明顯了。
跨設(shè)備肖揣,主要是指桌面和手機民假,尤其是針對顯示器的最佳實踐是層出不窮,如今是響應(yīng)式成為了主流龙优。
跨平臺羊异,出自于 Java 的一個概念,如今已經(jīng)算普及了彤断,尤其是 JavaScript野舶,桌面,手機宰衙,服務(wù)器平道,瀏覽器,嵌入式都能看到 JavaScript 的身影供炼,這大大歸功于 JavaScript 標(biāo)準(zhǔn)化的推廣一屋【酱跨平臺過去是說一次編譯到處運行;如今是只要這個平臺支持這個語言或標(biāo)準(zhǔn)陆淀,就能用考余。如今的跨平臺編程,更講究特性檢查這個功能轧苫,如果你這個平臺沒有這個特性楚堤,那么就關(guān)閉這個有這個特性的功能,但其他功能還可以繼續(xù)使用含懊。
今后身冬,各種設(shè)備層出不窮,VR 頭盔岔乔,AR 眼鏡酥筝,巨型屏幕,物聯(lián)網(wǎng)等等雏门,跨平臺會有進一步的發(fā)展嘿歌。
工程方面的:
1.工具化
我覺得工具化非常突出了,凡是能工具完成的事情茁影,絕對不手工完成宙帝。以下幾個方面都是可以找到相應(yīng)工具,幫助開發(fā)者管理代碼質(zhì)量
代碼風(fēng)格檢查
工業(yè)標(biāo)準(zhǔn)檢查
代碼整理
代碼復(fù)雜度檢查
單元測試覆蓋率檢查
依賴管理
壓縮代碼
重復(fù)代碼檢查
無用代碼檢查
等等募闲,
2. 工程化
工程化也是近年來最最突出的一個發(fā)展趨勢步脓,過去只是選擇性的,現(xiàn)在是必須的浩螺。
工程化是以工具化為基礎(chǔ)的靴患,沒有工具,那么工程化也無從談起要出。
工程的核心就是流程自動化鸳君,又稱之為構(gòu)建,這些包括了:代碼質(zhì)量檢測厨幻,代碼壓縮相嵌,代碼合并,代碼優(yōu)化况脆,代碼編譯,單元測試等等部分批糟。構(gòu)建就是把這些以工作流程的方式組合起來格了,然后用一個命令行運行這整個流程。它有點像批處理徽鼎,但是是程序開發(fā)中使用的特殊批處理
在網(wǎng)頁編程的過程中盛末,現(xiàn)在又流行“實時編程”弹惦,就是當(dāng)你在保存代碼的時候,以上的構(gòu)建流程就開始工作完成后自動刷新瀏覽器悄但,保證新代碼效果立刻反應(yīng)在瀏覽器上棠隐。
現(xiàn)在,你去 GitHub 的項目庫中找軟件檐嚣,首先翻看助泽,是否有工程文件,看看它的構(gòu)建流程是什么嚎京,就知道這個項目的專業(yè)程度和項目的質(zhì)量了
而自己嗡贺,沒有一個配置一個工程化的流程系統(tǒng),都不好意思說自己在做軟件工程鞍帝。
3. 自動化
自動化是以工程化為基礎(chǔ)的诫睬,工程化本身就是一種流程自動化。而自動化有在工程化的過程中更進一步的自動化帕涌。
持續(xù)集成就是全自動化的一個終極體現(xiàn)摄凡。他的主要流程是:版本控制庫 ->構(gòu)建 ->測試 ->報告.
持續(xù)集成有點像 Windows 的定時任務(wù),但是它是程序開發(fā)專用的定時任務(wù)蚓曼。
持續(xù)集成的特點就是全自動亲澡,一個項目一次配置好了后,要求不變的話辟躏,就不用管了谷扣;然后開發(fā)者不斷把代碼加入到版本控制庫里就行了,每當(dāng)庫有新代碼時候捎琐,持續(xù)集成就會下載代碼進行構(gòu)建会涎;當(dāng)它完成構(gòu)建和測試后,如果測試沒有通過瑞凑,就會報告給你末秃,然后你根據(jù)報告結(jié)果進行修改代碼。所以你每次往版本庫加的新代碼時候籽御,持續(xù)集成就會全自動的幫你構(gòu)建和測試代碼练慕,盡快的通知你代碼的問題。這樣程序員就可以更加集中精力編寫功能代碼和測試代碼技掏,而不用擔(dān)心新代碼是否會影響到過去的代碼了铃将。
持續(xù)集成在多人一起開發(fā)的時候,更是有用哑梳,誰上傳的代碼沒通過測試劲阎,能馬上知道。這樣保證多人項目在代碼順利合并鸠真,體現(xiàn)“持續(xù)集成”的功效悯仙。
另外還有個持續(xù)部署龄毡,其實就是持續(xù)集成在測試成功后部署上產(chǎn)品服務(wù)器上的流程。如今有些網(wǎng)站一天就要部署幾十次锡垄,有了持續(xù)部署后沦零,部署多少次都毫無壓力。
工具化货岭,工程化路操,自動化的關(guān)系挺有意思,前者是后者的基礎(chǔ)茴她,而后者卻極大推動了前者的發(fā)展寻拂。它們是相互積極作用,相互推動了對方的發(fā)展丈牢,形成了一個很好的良性循環(huán)
其他方面:
1. 版本控制祭钉,Git,GitHub
版本控制在編程界中的地位是越來越重要了己沛。在編程界中有個說法:沒有版本控制的項目慌核,就等于沒有這個項目。
版本控制的工具很多過去有 SVN申尼,如今 Git 的強大垮卓,用的人也是越來越多,而它和 GitHub 的相同作用下师幕,對編程界的積極影響和積極推動粟按,是令人無法忽視的。比如幾乎所有的依賴管理工具的庫下載源霹粥,都是和 GitHub 綁定的灭将, 就這一點來說,GitHub 的重要性在 IT 就不可估量后控。
而 GitHub 上和 Git 的方便管理庙曙,上傳,查看浩淘,統(tǒng)計捌朴,bug 報告等功能更是極大地推動了程序員之間的合作;GitHub 上的開源更是改變了開源軟件對世界的影響力张抄。
GitHub 不是 Git 的全部砂蔽,Git 也不是版本控制的全部,本質(zhì)上來說署惯,GitHub 只是一個網(wǎng)站而已察皇;然后 GitHub?確實又是這個編程世界不可缺少的一個重要的模塊,已經(jīng)成為了一個不可或缺的組成部分了泽台。甚至 GitHub 已經(jīng)跳出了編程界什荣,成為了一個世界級的不可或缺的服務(wù)平臺了。然而 GitHub?是 2008 年建立的怀酷,真正開始流行是在 2012 年的稻爬。在 2015 年 Google 宣布關(guān)閉自己的 Google Code⊥梢溃可見 GitHub 的影響力桅锄,以及在業(yè)界的重要程度了。
2.生態(tài)圈意識
生態(tài)圈意識在業(yè)界是越來越強了样眠,它應(yīng)該和編程工具化和工程化有極大的關(guān)系友瘤。一個語言,框架或者庫的出現(xiàn)檐束,人們用它們辫秧,不但是因為它們本身的強大,更是因為它們背后的生態(tài)圈被丧。
比如說人們選一個 JavaScript 的框架盟戏,選 React 還是選 Ember.js,更多是看支持他們的生態(tài)圈如何甥桂,React 是有 Facebook 支持的柿究,更有很多程序員為它開發(fā)相關(guān)工具和庫以及有很多文檔教程。這樣 React 的生態(tài)圈就很大黄选,會讓更多人愿意選擇 React 作為第一開發(fā)框架蝇摸。而 Ember.js 相對來說生態(tài)圈小,選擇它的人可能就不會很多办陷。
選語言也一樣貌夕,選 JavaScript 編寫爬蟲還是選 PHP 編寫爬蟲還是用 Python?更多的是看他們的生態(tài)系統(tǒng)了懂诗,Python 的爬蟲庫強大且豐富蜂嗽,所以更多人選用 Python 編寫爬蟲。
一個新的語言出現(xiàn)殃恒,成熟與否植旧,看的就是它的生態(tài)圈了,比如是否有測試框架离唐,是否有 MVC 框架病附,成熟的時間庫,數(shù)據(jù)庫 SDK 等等亥鬓,這些都是其必要的生態(tài)圈組成部分完沪。
總結(jié):
以上的這些現(xiàn)象和趨勢,其實都是相輔相成的,最終成了一種良性循環(huán)覆积。這些現(xiàn)象和趨勢都會繼續(xù)發(fā)展下去听皿,并成為以后新趨勢的基礎(chǔ)。所以這些特點都是非常重要的宽档,而且應(yīng)該成為每個程序員都應(yīng)該知道的知識尉姨。
給學(xué)生們的一些建議:
我在讀編程專業(yè)的時候,這些東西大學(xué)都沒有教過吗冤,甚至在工作中又厉,公司都沒有這些要求。大學(xué)主要教的是代碼編寫椎瘟,能編譯通過覆致,能出正確結(jié)果就可以了。在工作中肺蔚,代碼能用煌妈,沒有明顯 bug 就行。
然而婆排,在我個人工作實踐中声旺,逐漸的體會到這些趨勢的重要性了,可維護性的高質(zhì)量代碼可以大大減少自己在維護中的難度和壓力段只。作為準(zhǔn)備成為一個合格的開發(fā)人員腮猖,應(yīng)該熟練掌握這些知識和技能。如果大學(xué)沒有教過赞枕,一定想辦法自己學(xué)習(xí)和提高澈缺。
又想到幾個發(fā)展,這里更新一下
1. WEB 技術(shù)的桌面化和 JavaScript 的全椏簧簦化
JavaScript 近些年發(fā)展火熱姐赡,逐漸印證了一個 Atwood 法則:凡是可以用 JavaScript 實現(xiàn)的,最終都會用 JavaScript 實現(xiàn)
Nodejs 的出現(xiàn)柠掂,奠定了 JavaScript 走出瀏覽器惭聂,走向了服務(wù)器端
NW 的出現(xiàn)和 electron 正式版發(fā)布杂抽,JavaScript 走向了桌面
MongoDB 的出現(xiàn),JavaScript 走向了數(shù)據(jù)庫
Tessel 的出現(xiàn),走向了硬件和物聯(lián)網(wǎng)
如今一個全棧系統(tǒng)苍苞,從前端到數(shù)據(jù)庫摩幔,可以完全使用 JavaScript 一種語言川陆。還有很多人正在致力于把 JavaScript 推向更多的領(lǐng)域中督暂。
而 Web 技術(shù)(html+css+JavaScript)由于 NW 和 Electron 的出現(xiàn),已經(jīng)可以編寫桌面程序了皇拣。正是由于 JS 的優(yōu)秀模塊很多严蓖,以及 HTML+CSS 的界面容易編寫和掌控,糾錯工具豐富,很多人愿意用 WEB 技術(shù)進行開發(fā)】藕現(xiàn)在比較火的桌面工具有 VS-Code 編輯器和 Atom 編輯器毫深。
總結(jié)一下:由于 WEB 技術(shù)的便利性,WEB 技術(shù)涉及的領(lǐng)域也就越來越多杭措,再也不是瀏覽器的專利了费什。
2. Web API 的全面發(fā)展
Web API 雖然歷史悠久,但是真正使其推廣流行的應(yīng)該是 Twitter手素,而后移動設(shè)備的普及使其得到更大發(fā)展和普及。移動設(shè)備如果沒有 Web API 基本就不能工作了瘩蚪。Web API 的普及泉懦,也使得網(wǎng)絡(luò)服務(wù)之間相互連通,形成一個更大的服務(wù)網(wǎng)絡(luò)疹瘦”懒ǎ總之,如今的 Web API 已經(jīng)是不可或缺的存在了言沐。
Web API 更多的是一種服務(wù)邓嘹,或是一種數(shù)據(jù)交換模式。只要語言帶有 HTTP 的網(wǎng)絡(luò)訪問功能险胰,就都能使用汹押。提供 Web API 的公司,發(fā)布 Web API 后起便,一般也會同時發(fā)布一些常用語言的 SDK棚贾,方便相應(yīng)語言開發(fā)人員快速上手;但是如果語言比較小眾榆综,沒有提供相應(yīng)的 SDK 也沒有關(guān)系妙痹,編寫一段 HTTP 的請求,也是可以交換數(shù)據(jù)鼻疮。
從編程的角度來歸納一下 Web API 特點就是:
容易編寫怯伊,就是個函數(shù),無需界面
語言無關(guān)性判沟,無論 Web API 是個語言編寫耿芹,幾乎任何語言都能調(diào)用
訪問性好,無論在哪水评,只要網(wǎng)絡(luò)能訪問猩系,Web API 就可以用。
3. 語言之間的相互借鑒
語言之間的相互借鑒也越來越明顯了中燥,比如:
PHP5.0 后支持了類寇甸,5.4 后支持了 Trait,5.5 后支持了生成器(Generator)
JavaScript ES6 支持了箭頭匿名函數(shù),生成器(Generator)拿霉,類(不是 Prototype 的類)
C# 和 Java 相互借鑒
Coffee Script 借鑒 Python 和 Ruby
與其說是相互借鑒吟秩,不如說隨著語言的發(fā)展,一些語言概念逐漸成為了標(biāo)配绽淘,如果沒有涵防,就算是一個不完整的語言了。比如說類沪铭,匿名函數(shù)壮池,常用數(shù)據(jù)結(jié)構(gòu)等都成為了標(biāo)配。
4. 語言解析器的工具化
語言解析器(Parser)在過去自是作為編譯器的一部分存在的杀怠。如今椰憋,它已經(jīng)獨立出來作為一個模塊或者工具來使用了,這個對于一個語言的生態(tài)有著很大的意義赔退,促進了語言生態(tài)圈的良好發(fā)展橙依。
獨立出來的解析器,可以用來編寫以下和語言有關(guān)的工具硕旗,這些工具都是用來優(yōu)化代碼質(zhì)量的窗骑,提高編碼體驗的。
語法檢查漆枚,JavaScript 的 JSHint 用的就是 JavaScript 的一個解釋器创译,被 JavaScript 重新解釋一遍,把可能有問題的地方標(biāo)記出來通知程序員浪读,程序員可修改避免潛在錯誤昔榴。
代碼最小化,代碼重寫的一種形式碘橘,JavaScript 的最小化項目(比如 Urglify)互订,是把語法正確讀取后,進行最小化壓縮痘拆。把單詞變量轉(zhuǎn)換成單字母變量仰禽。甚至是 if else 轉(zhuǎn)換成?: 形式。
語法擾亂器纺蛆,就是代碼重寫的一種形式吐葵,讓代碼無法閱讀,保護代碼桥氏。
語法整理器温峭,代碼重新的一個形式,把無法閱讀的代碼字支,轉(zhuǎn)換成可閱讀的代碼凤藏,比如 beautifier奸忽。
語法高亮,一般用于代碼編輯器和代碼顯示組件的揖庄。
代碼分析器, 把可用的代碼部分進行掃描栗菜,列出代碼相關(guān)數(shù)據(jù),比如用了多少類蹄梢,多少對象疙筹,多少變量,多少全局變量等等
代碼清理器禁炒,分析器的加強而咆,清理不用的變量,不用的對象和齐苛,不用的函數(shù)等翘盖。
自動完成,一些 IDE 可以分析已經(jīng)存在的變化和函數(shù)凹蜂,以后在不斷的打字中可以智能的自動完成。
代碼追蹤阁危,比如說某段代碼被執(zhí)行了幾次玛痊,程序報錯時候,函數(shù)被執(zhí)行的順序狂打,測試程序時候的代碼覆蓋率等等
虛擬執(zhí)行擂煞,JavaScript 代碼在一個保護區(qū)域內(nèi)或環(huán)境執(zhí)行,代碼可以返回值趴乡,但不能影響非虛擬環(huán)境內(nèi)的代碼執(zhí)行对省。比如說,代碼里面有全局變量晾捏,但是虛擬執(zhí)行后這個全局變量只在虛擬環(huán)境內(nèi)蒿涎,非虛擬環(huán)境的沒有這個全局變量。
關(guān)于這點惦辛,我回答過下面的問題劳秋。
用 JavaScript 寫成的 JavaScript 解釋器,意義是什么胖齐? - 知乎用戶的回答
5. 數(shù)據(jù)交換語言的發(fā)展
數(shù)據(jù)交換語言發(fā)展總體來說就是從 XML 主流逐漸發(fā)展到 JSON 主流的過程. 雖然 XML 現(xiàn)在應(yīng)用還是非常廣泛玻淑,但是由于其復(fù)雜和標(biāo)簽占用空間大,逐漸被輕量級的 JSON 給代替了呀伙。尤其 JSON 與 JavaScript 天然兼容补履,無需解析,直接使用剿另。所以在很多網(wǎng)絡(luò)技術(shù)中 JSON 是優(yōu)先使用的箫锤。
而如今很多配置文件也是用 JSON 實現(xiàn)的贬蛙,比如 Composer 和 node 的配置文件。
JSON 的閱讀方式更符合程序員的閱讀習(xí)慣麻汰,格式化后的結(jié)構(gòu)一目了然速客,容易理解。
JSON 好處:
結(jié)構(gòu)符合程序員閱讀習(xí)慣
文件大小相對更小
JavaScript 可以直接使用
在非 JavaScript 的腳步語言中五鲫,轉(zhuǎn)化成數(shù)據(jù)結(jié)構(gòu)更容易
學(xué)習(xí)曲線很短
正是以上這些原因溺职,使用 JSON 作為數(shù)據(jù)交換語言可以說在編程界里,是大勢所趨了位喂。