最近十年,編程領域有什麼重要進展?

最近十年,軟體測試領域有什麼重要進展?
最近十年,運維領域有什麼重要進展?


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

語言本身:
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就行。

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

===============
2016-08-08 更新
又想到幾個發展,這裡更新一下

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代碼在一個保護區域內或環境執行,代碼可以返回值,但不能影響非虛擬環境內的代碼執行。比如說,代碼裡面有全局變數,但是虛擬執行後這個全局變數只在虛擬環境內,非虛擬環境的沒有這個全局變數。

關於這點,我回答過下面的問題。
用 JavaScript 寫成的 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的出現可能讓編程成為各個領域、各個職業的必備技能。

-------------------分割線-------------------
歡迎程序員關注我的微信公眾賬號:codergroup
針對程序員群體,每周推送一次,大家一起學習進步可好?

http://weixin.qq.com/r/njq-p8vEHZZirY-E92_M (二維碼自動識別)


十年前我剛入行做PHP,那時PHP5剛出不久,我的第一個項目是基於OSCommerce的電商項目,如果讓現在的程序員看一眼它的代碼,他們一定會覺得很神奇,「嗟乎,這也行?!」,沒有Class只有function,大量的global,沒人覺得把HTML和PHP寫在一起有什麼不好,元編程就是把代碼存進資料庫,然後動態取出來eval。那時主流還是PHP4,世面所有的基於PHP的CMS都沒有Class。PHP5引入了OO,在WEB後台開發社區,是一個不小里程碑,在那個時候,PHP就等於web開發。從那以後PHP作為應用最廣的Web後台,一直在積極吸收其他社區的經驗Ruby,Javascript,各種functional語言,到現在的PHP7,已經走過了很長很長的路。

大概十年前Firefox 2.0出現了,幾年以後Chrome出現了。十年前調試Javascript主要靠運氣,因為根本沒有調試工具,好在那時候Javascript程序普遍都很小,JS還被認為是一個Web應用的輔助語言。十年來這種語言已經成為Web社區無可爭議的主力語言。現在的普通JS程序動輒幾萬行,可能有著所有界面應用開發里最好用的調試工具:Chrome瀏覽器和它的developer tools。十年前主流的瀏覽器是IE6,只是一個瀏覽器,今天的瀏覽器是一個平台,重要性不亞於操作系統本身。

十年前Web開發沒有Information Architect,沒有User Experience,沒有Emotional/Flat/Material... Design,那時叫網頁設計,設計的主要工具是Photoshop,那時有個工種叫切圖。十年後,行業對高端Web開發人員都需要有IA的常識,UX的知識,Design的修養。十年前沒有前端,前端就是切圖的那個人,十年後,不僅有了前端,還有了全棧,而那些切圖的人好像都不見了。十年前只有網站和網頁,十年後一切都成了Application,而application概念在十年前專指你從windows開始菜單能打開的那些。

十年前國內很少人知道Ruby和ROR,但大概八年前Ruby和ROR橫掃了Web開發社區,雖然目前Ruby仍然不是一種大眾語言,但無論是語言本身的設計還是ROR對Web開發實踐的革新,都具有深遠的影響。Ruby社區貢獻的自動化工具鏈,大量地被移植到其他語言平台上。如果要說這十年內對整個編程界影響最大的語言,我認為是Ruby,雖然它在市場上佔有並不大。

十年前測試主要是人工的集成,單元測試在大多數開發團隊里還只是道聽途說的概念,更不要說Continuous Integration。經過十年,單元測試的實踐已經深入人心。測試本身已經是一個單獨的產業,各種工具,服務被創造出來,現在的軟體,從操作系統到mobile app的質量,比十年前的產品已經不可同日而語。

十年前博客還方興未艾,Youtube還只是一個玩具。十年里博客已經是數字生活的常態,WordPress的安裝覆蓋全世界,Youtube不再是一個網站,而是地球上史無前例的多媒體平台。十年前學編程主要看書,十年後的今天,學任何技術都能找到優質的在線免費內容,自我教育只受限於意願而不是金錢。

大概十年前,Git第一個版本剛剛出來,國內還幾乎沒有人知道,那時大多數團隊不用版本控制,少數用的也是svn。十年前我因為一次錯誤的svn up犯下職業生涯的第一個錯誤,起因是因為svn創建分支的龐大開銷面前我想偷一下懶,八年前我開始用Git,發現原來分支可以這麼簡單,想起丹年的svn,很有感嘆。十年前github還沒出生,現在人人都有github帳號。

十年前中小企業架設網站的唯一選擇是虛擬主機,當時新網一個很爛的虛擬主機一年賣幾千塊。十年後的今天,絕大部分的中小企業業務已經遷移進某個雲里。懂點技術的人可以在十分鐘內完成主機購買到網站上線的操作。十年前面對資料庫編程就是mysql,十年後互聯網上你能找到一堆成熟的的DBaaS服務。十年前教科書上還在大講特講三層結構,十年後的今天,一切都是服務,服務,服務。面向服務而架構,面向服務開發,面向服務來部署,硬體是服務,軟體也是服務。

十年前我第一次換手機,從西門子換諾基亞,十年後兩個產品線都不存在了。
十年前國內一線城市應屆程序員起薪2-3k遍地都是,十年後,北上廣一線畢業生碼農起薪5-6k起,不過我可能還是太保守,據說8-10k了。
十年前CN域名是對個人開放的,一直到十年後的今天,CN域名仍然是壟斷國企。
十年前看Google搜出來的結果你發現自己英文不夠好,十年後你發現自己英文夠好了,卻發現Google上不去了;十年前我把舊的程序員雜誌翻來覆去地看,十年後我在網上試圖說服新生代程序員買把好梯子,不要貪便宜(http://jump.im/i6)。
十年前開發就是開發,把東西做出來,十年後,這個行業里湧進來來了Extreme Programming, Agile,Scrum,Product Manager,Advocate,Growth hacker ...;十年前沒多少人願意當程序員,老成的中國畢業生都在考公務員,十年後女人在知乎上問怎麼嫁給程序員這樣的問題了,老成的當年的中國畢業生老了。


continuous integration (持續集成) 和 continuous deployment (持續部署)。
因為這幾年web 開發 和 mobile 開發的流行,engineering productivity 的改進是最讓我感動的變化。

06年的時候,大家最常說的句式是: 今年10月份我們要發布年度新版本。
所以一般步驟是這樣的:
往前推半個月,9月份中旬,是封閉測試期,誰都不讓加代碼了,開發的童鞋隨時待命改bug。
再往前半個月,9月初,要開始凍結feature了,決定什麼功能保留,什麼功能留給下個版本。
再往前一個月,8月份,碼農拚命寫代碼。
再往前若干個月,全體一邊代碼,一邊吹牛。
。。。。
往後半個月,發布成功,大家可以開開心心休假一個月,再回來幹活。
因為這些原因,那個時候,一個項目一般動輒十來個人。

而今天,再也沒有年度新版本的說法了(microsoft, adobe 等少數傳統軟體公司除外)。
大部分優秀的互聯網公司能夠在24小時內部署剛完成測試的功能。
個別優秀的如 Quora 可以每天部署50多次代碼到production server。
很多剛check in的代碼如果能夠通過所有的 unit test 和 code review,就可以直接部署到伺服器上。
再加上 dogfood 等概念的成熟,大家對於測試的界限越來越模糊。
相應的, 一個項目需要的人也越來越少,
whatsapp 被facebook剛買的時候只有35個工程師,但是支持了4.5億用戶;
今天whatsapp 有9億用戶,但是還是只有50個工程師;
instagram 被收購時只有13個員工,6個工程師,但是有3千萬用戶。
quip 支持各個平台 (web, mac, win, android, 各種watch),但是只有13個工程師。

=====
update: aug. 6. 感覺被哪個大v翻牌了,沉了那麼久的回答又起來了。

評論里有些不同意的聲音,一部分認為是歸功於aws的雲計算,另外一部分認為這個僅限於互聯網或者移動互聯網。這兩個不同意的聲音我都不同意,我認為engineering productivity的關鍵是:

Anything that you do more than twice has to be automated.

13年的時候我去一個instagram founder的talk,他當時分享了他們創業的時候為什麼用這麼少的人可以支持這麼多的用戶。他說了一個policy:

如果一個工作手動做要2小時,但是寫程序完成它要5小時,那麼還是要選擇寫程序來完成它。因為很可能,過不了多久, 你又要手動做一次。

aws 只是省了 it 管理人員,並沒有省軟體開發的人員。IT 管理人員從來也不是一個軟體公司的主要人力。持續集成和持續部署也並不僅僅局限於互聯網行業,他們的本質是把一些要重複做的事情自動化了,是可以應用在所有軟體行業的。

從這個角度來看,今天的測試驅動開發,它提升效率的根本就是把測試用例變得可復用和可擴展。當代碼變得更複雜時,測試用例可以很好地讓開發速度穩定持續下去,而不是擔心各種潛在的bug。
至於app store 的dogfood,伺服器的快速部署,這些都是這些事情自動化以後的表面現象。


[1] Continuous Deployment at Quora
[2] Why WhatsApp Only Needs 50 Engineers for Its 900M Users
[3] Do The Simple Thing First: The Engineering Behind Instagram
[4] React with C++: Building the Quip Mac and Windows Apps


我想來上張這個圖:

http://gallium.inria.fr/~scherer/drafts/talk-epitech-nov13.pdf


十年前 Github 和 Stack Overflow 都還不存在。


樓上都是互聯網碼農,作為硬體狗也來摻和一下:)

  • 移動端/嵌入式

十年前,低性能低功耗的ARM在大眾領域還默默無聞。但隨著2007年iPhone的發布引領的智能機狂潮,ARM在這十年內迅速發展,幾乎壟斷了智能手機的CPU。此為硬體的大背景。

十年前你下載一個手機應用,要登錄wap版的網頁,然後要在一個長長的列表裡找到自己手機對應的型號下載才能用(冷門的手機還找不到)。十年後,只剩下兩大一小三個平台,由此也催生了手機應用開發這個行業,君不見iOS/Android程序員已經可以量產了。同時網頁開發越來越強調mobile friendly,HTML5等對移動端友好的標準逐漸普及。

ARM的崛起另一方面順便也借勢整合了嵌入式行業,十年前還是滿大街的51單片機以及各種相互不兼容要寫彙編代碼的DSP,現如今相當多的工控機晶元都已經是ARM核心了,DSP甚至GPU上都恨不得掛幾個ARM核才爽。開發起來有ARM完整的工具鏈也是大大地方便了程序員,再也不用每開發一個新的晶元去重新搞一遍工具鏈了。。

還是托ARM的福,編程的門檻從未如此之低。幾十美元的Raspberry Pi買回來接上鍵盤顯示器就是一台可以跑Linux的電腦了。好事(tu)者(hao)甚至可以買幾十個Raspberry Pi組一台超算-&>Build your own supercomputer out of Raspberry Pi boards

  • PC端

十年前大概是Intel 奔騰系列CPU的巔峰,也是末路,Core系列剛剛登場(Core 雙核發佈於2006年),」多核「 這個概念開始普及,從此CPU的核數一路狂奔。十年前雙核CPU僅僅存在於高端電腦里,現在隨便一個手機都有不下四個核。(當然性能不是單純靠核數比的)

多核CPU的出現也影響了編程模型,充分利用多核帶來的並行性提升性能成了很多程序員的目標。OpenMP這種並行編程模型從小眾走向普及。

這十年也是GPGPU興起的十年,越來越多的人開始研究GPU編程模型,並且把GPU塞到超算里增加並行性。

  • 再說硬體開發本身

FPGA的普及讓硬體prototyping 變得比以前容易多了,當然也帶來了FPGA vs ASIC之爭。

十年前(當然其實現在也是)的主力硬體開發語言是Verilog/VHDL,但近些年開始有一些用高等語言進行硬體開發的嘗試,比如CHDL,以及Berkeley開發的Chisel。 (此處歡迎補充)

最後說我自己。

十年前我做過的最接近編程的事兒還是做Flash (寫個按鈕什麼的還是要腳本的哈哈),然而現在Flash都已經黯然退出歷史舞台了。。

暫時想到這麼多,歡迎補充:)


正好有篇介紹組件開發歷史的PPT,直接拿過來了。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
十年前,談到編程,人們最熟悉的是這些:

C++ Builder是由Borland公司推出的一款可視化集成開發工具。C++ Builder具有快速的可視化開發環境:只要簡單地把控制項(Component)拖到窗體(Form)上,定義一下它的屬性,設置一下它的外觀,就可以快速地建立應用程序界面。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
這些:

Delphi是一個集成開發環境(IDE),使用由傳統Pascal語言發展而來的Object Pascal進行開發,以圖形用戶界面為開發環境,透過IDE、VCL工具與編譯器,配合連結資料庫的功能,構成一個以面向對象程序設計為中心的應用程序開發工具。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
還有這些:

Visual Basic是一種由 微軟公司開發的結構化的、模塊化的、面向對象的、包含協助開發環境的事件驅動為機制的可視化程序設計語言。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
後來有了這些:

Windows Forms 是微軟的.NET開發框架的圖形用戶界面部分,通過將現有的Windows API(Win32 API),封裝為託管代碼,提供了對Windows本地(native)組件的訪問方式。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
和這些:WebForm是微軟開發的一款產品,它將用戶的請求和響應都封裝為控制項。讓開發者認為自己是在操作一個windows界面,極大地提高了開發效率。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
而如今,火的是這些:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
這些:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
這真是,年年歲歲花相似,歲歲年年人不同啊。 _(:зゝ∠)_


難道不是門檻降低了嗎?


軟體大分工越來越徹底了,以前人們使用的都是統一的解決方案,對於架構的設計也非常簡單,最多也就是資料庫伺服器,應用伺服器,web伺服器。

但是現在大部分系統都引入了十個甚至更多的組件/模塊,十年前很難想像Zoo keeper 這麼簡單的功能還要出一個專門的軟體?此外我們還有專門傳輸日誌的軟體,專門做調度的軟體,專門存Key Value的資料庫等等。


1.當年做Unix,Linux,Windows,VxWorks的同學,好多轉行做iOS和Android了。

2.當年姥姥不疼,爺爺不愛的Object-C突然紅了,而且很紅。

3.當年爆紅的Borland的開發工具(Delphi,C++ Builder,J Builder等)已經完蛋了,市場被VS和Eclipse搶光了。

4.當年覺得將來編程會越來越簡單,現在才發現只是軟體越來越簡單而已(PC變手機),編程不會。

5.當年覺得CPU性能過剩,寫代碼不用考慮太多性能問題。現在發現只是PC性能過剩,手機性能還是差啊,為了讓App跑得流暢點,要花好多時間優化代碼。

6.當年以為計算機專業的,沒有其他的行業知識會很難找工作,現在發現任何行業都招計算機專業的人。

7.當年以為,軟體這東西像寫小說,寫著寫著就沒什麼可寫了。現在發現,軟體這東西,像拍電影,拍了再多次還可以拍續集。

8.當年以為只要學會了編程, 找三兩個同學一起就能做出幾個高大上的軟體出來。現在看著那些不懂編程的人想著找個程序員就能做個牛逼閃閃的App只能呵呵了。


化「整」為「零」,然後「零」 到 「整」的整體體系理論的完善和實現。也就是說,面向「零」的開發會越來越簡單,而面向「整」的開發門檻會越來越高。


1,web技術不斷發展,並已經成為主流。
2,關係型資料庫已經衰落了。
3,大數據處理正在興起。

編程上的一個變化是因為多核處理器的興起,編程語言需要更好的利用並發以提高性能。就是相對高級的支持。

運行環境也變化了。小型機逐漸退出,大規模的基於PC伺服器的集群正在成為主流。

技術背後的知識越來越多,越來越深奧。技術提供的工具越來越多,越來越簡單。
——
說說關係型資料庫的事

之前很早的時候,90年代到2003年左右吧。那個時候所謂的設計,主要就指的是資料庫設計。所有的設計文檔裡面都要描述資料庫結構。

若干種編程工具,比如powerbuilder,delphi都是圍繞著資料庫,提供了大量的工具。而且十分的流行。

有一種資料庫設計軟體powerdesigner,很流行,而且很貴,反盜版做的很好,我們公司就收到過電話。

存儲過程十分的流行。因為軟體總是以資料庫為核心的,沒有可能換資料庫。

編程那個時候,主要解決界面的問題。業務全在資料庫里,數據在表裡,邏輯在存儲過程里。

現在資料庫,很多時候僅僅是存一些數據而已,沒有那麼嚴格了。既不需要事務,也不太需要遵循嚴格的範式。所以nosql才得以流行。

現在關係型資料庫依然流行,但是已經沒有往日的風采了。很多的系統開發再也不是把關係型資料庫作為核心了。


functional programming paradigm的回歸。 Clojure, Erlang, C++11, Java8 等等。 幾乎所有的語言都要加上functional language 的特性。 雖然軟體行業從來都是一個跟隨潮流的世界,但是依然認為functional language的回歸是提高軟體行業生產力和降低成本的一個好事。


感受最大的,應該是大部分人認為加班應該是開發的常態


Web技術正在不斷成長,主要體現在以下幾個方面:

1、JavaScript的全棧能力大幅提高;

2、Web正在走向桌面化;

3、Web已經開始工程化、模塊化開發;

4、雲服務愈演愈烈。

回想十年前,桌面軟體開發有c++ builder、vb、delphi這些強大的可視化集成開發工具,微軟也不停的在VS上大把加力,推出WPF、webform等。

Web技術發展到現在,從jquery到angular,從angular到react、vue,從es5到es6,從npm到yarn,從bootstrap到material UI,正處於一個極快的更新迭代階段。

但是,Web至今還沒有出現一款強大的,可以類比Webform的可視化集成開發工具。

http://gospely.com 帶來了第一步嘗試。

Gospel首先推出了網站的在線可視化開發工具:

在這款產品中,開發者可以可視化拖拽組件,然後可視化設置樣式、屬性、組件樹、動畫特效等,極大的加快了開發效率。

網站的可視化開發工具是Gospel走的第一步,未來Gospel將集成類比VS的可視化開發功能,用JS生成JS。

除了可視化開發外,Gospel還有基礎的IDE功能,後端基於docker技術,為每一個項目分配了一個容器供開發者使用,開發者還可以自選環境進行多語言開發。

大家一直關注編程本身的進展,卻忽視了編程工具的進展。

Gospel的目標旨在用機器取代低端編程工作,解放前後端開發者的生產力,推動HTML5系統級應用生態的發展。

http://gospely.com

Gospel希望成為推動Web編程領域發展的中堅力量。


個人感受:

隨著High Order Function開始廣泛的應用,Declarative Programming和Procedure Programming之間的界限在模糊。High Order Function的的廣泛支持和應用極大的提升了編程的靈活性。對於我個人來說,更驚喜的地方在於c++中std::function的速度甚至還要略微超出了傳統的函數指針。


十年前我在折騰 gForge,現在在折騰 GitLab。


編程領域最大的變化其實是並行計算的普遍性,伺服器端軟體的越來越多,處理能力的爆炸,用句大數據的說法,從前是金子一樣的數據白白流走,現在是垃圾桶都要翻三遍。


從遊戲行業來說,應該是(入門級)門檻越來越低了,只要你有錢有閑(不愁吃喝),一個人坐家裡就能做出來一個二十年前一個團隊才能做出來的東西


推薦閱讀:

用小猿搜題、學習寶這類產品是否真能搜到題?
為什麼圖片反覆壓縮後會普遍會變綠而不是其他顏色?
怎麼勸大四室友不要考計算機研?
特效化妝在計算機影視特效如此發達的今天是否是雞肋?
太空梭的機載計算機有什麼特點?

TAG:互聯網 | 編程 | 計算機 |