Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
文轉自硅星人(ID:guixingren123)
作者:光譜
1999 年上線的 SourceForge,因為免費一度是世界上最受歡迎的開源軟件代碼托管網站。然而 Google 擔心它一家獨大,上線了自家的代碼托管網站 Google Code。
2005 年,Linux 的締造者 Linus Torvalds 對現有的代碼托管工具效率不滿意,便自己做了一個名叫 Git 的版本控制工具。Git 頗具革命性,允許大量開發者同時為源代碼貢獻新代碼,彼此間并不影響,最重要的在于它是開源的。
三個來自舊金山的年輕人認為 Git 的潛力巨大,在 2008 年正式推出了 GitHub,一個基于 Git 的代碼托管網站。他們沒想到,GitHub 后來擊敗了元老 SourceForge 和背景強大的 Google Code,成為了全世界最受歡迎的代碼托管網站。
Google 的開源代碼經理 Chris DiBona 對 GitHub 給予高度評價:
2008 年 4 月 10 日,GitHub 正式上線。
今天,GitHub 終于10 歲了!
去年 5 月底,GitHub 完成了第 1 億個 pull request(PR 合并請求)命令。截至今天,GitHub 上已經擁有超過 8000 萬個 repo(代碼倉庫),活躍用戶達到 2700 萬人,超過 150 萬家公司和機構進駐。
由于程序員群體里缺少女性,擁有高純度男性用戶的 GitHub,也被戲稱為全球最大的同性交友網站……
GitHub repo 按照語言劃分的男女用戶比例,最上面的綠色是確認的女用戶(2014 年數據)
“10 年前的今天,GitHub 正式上線。最一開始,我們只有一個特別簡單的目標:連接所有的開發者,讓他們用 Git 更輕松地進行項目協作,”聯合創始人 Chris Wanstrath 在博客里寫道,“10 年過去了,我們作為公司,作為平臺都有了很大的變化,但 GitHub 存在的意義從未改變。”
作為對十周年的紀念,GitHub 團隊并沒有選擇回顧公司歷史,而是整理了在他們眼中過去 10 年間的幾大里程碑事件。這很 GitHub——這份光榮,其實不止屬于平臺自己,更屬于那些為了讓這個世界變得更好,通過 Git、GitHub,用 JS、Python 和各種語言貢獻代碼的人們。
以下,就是這些曾在計算機業界和 GitHub 的發展中創造歷史的事件。
20080403: Rails 轉移至 GitHub
Ruby on Rails (Rails),是一個用 Ruby 語言編寫的開源 web 應用框架。它提高了開發復雜網頁的效率,是計算機界最受歡迎的開源項目之一。2008 年 4 月,Rails 做出了表率,將版本控制從 SVN 換成了 Git,并成為第一個進駐 GitHub 的大型開源項目。
當時,GitHub 還處在內測階段,沒有正式上線。GitHub 本身就是用 Rails 寫的,這件事為 GitHub 帶來了不小的影響力。
20090103:比特幣誕生
2009 年誕生后,比特幣于 2010 年正式開源,并托管在了 GitHub 上。比特幣是世界上第一個去中心化的數字貨幣,它的誕生和開源更是引發了一場同時波及金融和科技,甚至更多行業的革命。
至今,比特幣項目接受了超過 500 名用戶貢獻的代碼。比特幣的底層技術“區塊鏈”被廣泛視為下一個革命性的計算機技術,比特幣項目已經被 fork (代碼庫復制)逾 1.8 萬次,大量的區塊鏈、數字貨幣項目在 GitHub 上開源,其中很多都來自比特幣源代碼。
20090521:Node.js 發布
你可能聽說過網絡開發分前端后端之說,前端管網頁呈現,后端管數據輸出。然而這兩者不是孤立的,前端開發也會涉及到確保后端數據能夠正確呈現出來,所以大量采用 JavaScript (JS) 語言的前端人士需要學習后端 PHP、Ruby 之類的后端語言,很麻煩。
Node.js 的主要意義是讓前端用 JS 即可完成前端需要的大量開發任務,開發適配多種操作系統的復雜服務器端應用。簡單來說,它同時把前端和后端工程師從各自不熟悉的領域內解放了出來。2009 年 5 月底,Node.js 正式在 GitHub 上發布,收到了不少前端和后端人士的追捧,被認為是未來趨勢。
2014 年,Node.js 主要貢獻者對這個項目的官方管理公司不滿,于是自立門戶,fork 原版代碼做了一個社區驅動而不是公司化運營的替代品,名叫 io.js。這個項目一度比 Node.js 更受歡迎,但后來 Node.js 在開源治理上有了改善,兩個項目再次合并。
在整個過程中,GitHub 的開放機制確保了社區擁有自主權力,不必服從于開源項目的所有者。在必要的時候,fork 是一種力量,也是一種態度。
20101126:Rails Girls 第一次線下聚會
2010 年,一群用 Rails 做開發的女程序員在芬蘭赫爾辛基舉辦了第一次線下聚會。
三年后,他們專為女性和 LGBTQ 人士開設了一個夏令營 Rails Girls Summer of Code。這個開源培訓項目幫助開源社區改善了性別多樣性,為解決女性在科技行業內受到的結構性歧視做出了貢獻。
20110101:Travis CI 持續集成的第一個 PR
持續集成 (CI) 從像 GitHub 這樣的代碼庫里按照頻率提取最新的代碼,自動構建項目并進行測試。持續集成并不能消除 bug,而是讓它們非常容易發現和改正。比如下面這個 build passing 就是持續集成工具顯示的,它的大概意思是當前版本測試通過,沒有出現 bug。
而 Travis CI 是最受歡迎的,開源的持續集成工具。2011 年元旦那天,它完成了第一個 PR。Travis CI 和 GitHub 的整合,讓代碼投入生產環境的整個過程變得更高效了
20120101:JS 成為 GitHub 第一大語言
最一開始是一種網頁腳本語言,JS 和 HTML、CSS 并列網頁開發三大語言。被 JS 坑過的程序員經常諷刺它是一種不完整的語言,有一個很古老的段子:寫 C 的看不起寫 C++ 的,寫 C++ 的看不寫 Java 的,寫 Java 的看不起寫 JS 的,寫 JS 的看不起美工,周末大家都在加班,美工帶著女朋友旅游去了。
然而編程語言的鄙視鏈,總是和受歡迎程度相反。從 2012 年開始,JS 超越了 Ruby、Java 和 Python,成為了 GitHub 上最受歡迎的語言,直至今天仍霸占王座。
2013:GitHub 用戶破百萬
開源社區的發展使 GitHub 獲得了驚人的增速,在用戶數和 repo 數上實現了兩座里程碑:2013 年,用戶數突破了 100 萬;同年 12 月,GitHub 的 repo 總數超過了 1000 萬,其中超過一半是當年創建的,僅 11 月就增加了 100 萬個。
別光看數字多,這一年里增加的 repo 質量也很不錯:白宮的 Project Open Data、Docker 等等。亞馬遜 AWS、Facebook、Google、微軟、Twitter、Netflix 等知名公司也上傳了自家的項目。
20140609:Docker 1.0 發布
被視為革命性技術的開源容器引擎 Docker,2013 年在 GitHub 上創建了 repo,一年時間里下載量超過 275 萬份。2014 年,Docker 1.0 終于正式發布了。
像 Docker 和 Kubernetes (K8S) 這樣的開源項目開啟了一場容器化運動。開發、投產和運維的難度降低,小型公司不再需要花費精力在基礎架構上,可以更專注于核心業務開發。
20140721:Django Girls 第一次線下聚會
交友平臺不是開玩笑……GitHub 的程序員社交特性使得很多開發者通過它實現了線下聚會。它讓程序員們更容易結識彼此,而這對于女生尤為重要。
2014 年德國柏林,Django 女性開發者第一次在線下舉辦聚會,她們的組織仍在為改善性別多樣性而努力著。
20140723:微軟開源 .NET
雖然隨著移動互聯網的快速發展,沒跟上時代的 .NET 已經走向衰落,微軟向開源社區示好,仍然被視為開源業界的一個歷史性事件。微軟創立了一個開源行動,然后把所有的開源代碼包括 .NET 都在 GitHub 上開源。數千名工程師也讓微軟成為了 GitHub 上最為活躍的公司。
.NET 的開源帶起了一波節奏,隨后越來越多的大公司遷移到了 GitHub,放棄了自己的代碼托管網站或過時的代碼庫。
2015:虛幻引擎 4 免費和大量游戲相關開源
2015 年 3 月 2 日,虛幻引擎 4 完全免費了。Epic Games 放出了百分之百的 C++ 原始代碼,雖然獨立開發者想要開發 AAA 級別大作還是需要資金,但至少現在他們手上的虛幻引擎 4 和大廠手里的沒有任何區別。
Epic Games 對社區的恩惠得到了報答。在虛幻引擎最近一次 4.19 版本發布,包含了 128 個來自社區的貢獻。
除了虛幻引擎,還有不少游戲引擎、庫和游戲代碼在 2015 年上了 GitHub,比如《毀滅戰士》和《波斯王子》。最有趣的應該是 2048,它的開源帶來了上百款類似的消除游戲……總的來說是件好事。
20150922:GitHub Classroom 發布
除了工業界,學術界,包括大學和高中也可以利用 GitHub 進行教育了。GitHub Classroom 改進了編程課代碼管理、分發和作業收集。看上去是在做慈善,其實此舉很聰明:GitHub 普及要從娃娃抓起,盡管它已經碾壓了其它一切競爭對手。
20151203:蘋果開源 Swift
蘋果的新編程語言 Swift 具有函數式編程和面向對象編程的諸多特性,也兼容蘋果平臺之前的開發語言 C、Objective-C,也是一個強類型語言而非腳本語言,也很注重安全性……對于蘋果開發者而言,Swift 是件大好事,而有什么比 Swift 開源更讓人大快人心呢?
如果說微軟帶起了一波節奏,那么蘋果 Swift 編程語言的開源才真的讓其它科技公司都信服。老大哥都開源了,我們還有什么理由不跟隨呢?
20160709:阿波羅 11 號代碼開源
60 年代的程序員也有幽默感,不信就去 GitHub 上看看阿波羅 11 號的代碼。比如這個:臨時代碼一直用到了月球上。
你可能會感興趣,50 年前的程序員和代碼是什么樣的?隆重向你介紹阿波羅 11 號計算機系統工程師,MIT 的 Margaret Hamilton:
阿波羅 11 號代碼開源地址:https://github.com/chrislgarry/Apollo-11
2017:Python 進駐 GitHub
Python 因數據科學和深度學習的爆發重新開始受到關注,在 2015 年它成為了 GitHub 上第三受歡迎的語言,2017 年升至第二。當各大公司和人工智能專家開始倡導“人工智能普及化”(democratize AI) 時,Python 也終于來到了 GitHub。
這使得 Python 在 GitHub 上的流行越發勢不可擋,使用 Python 語言的新 repo 數量,環比增長達到了 70%。
20170215:TensorFlow 1.0 發布
革命性的深度學習庫,就連非專業人士都聽說過 TF——主要可能因為 AlphaGo 擊敗了李世乭和柯潔。2016 年,TensorFlow 成為了整個 GitHub 上 fork 最多的項目。
除了 TF,Caffe2、DeepSpeech 等大量深度學習工具也都相繼開源。使用這些工具,研究者可以創建面向不同領域的深度學習模型,包括并不限于電子游戲、弈類游戲、音樂、繪畫、醫療、金融等等,帶來新的技術范式和商業模式,顯著改善人們的生活。
20180410:十周年,再出發
在 2017 年,用戶提交了超過 2.9 萬億條代碼,GitHub 也合并的 PR 終于突破了 1 億。2018 年,GitHub 用戶總量達到 2700 萬,項目總數超過了 8000 萬。
人工智能、區塊鏈、量子計算……許多全新的計算機技術和全新的計算范式已經或正在趕來,代碼和數據在某種程度上已經取代了石油,成為了人類的新血液。
在這樣的大背景下,GitHub 太重要了,但它也面臨著和 10 年前 SourceForge 等前輩相同的命運:全世界的開源代碼都在這里,過度的中心化會否增加風險?在享受 GitHub 帶來便利的同時,越來越多人都會多一個心眼——代碼上傳之后,本地還是不要 rm 留個底吧。
最后,給一些 GitHub 整理的資料。首先,按照 PR 統計的受歡迎語言,JS、Python、Java、Ruby、PHP:
熱門關鍵字,機器學習、游戲、iOS、API、博客、網站、深度學習、Ardiono:
fork 最多的項目,TF、Bootstrap、gitignore;貢獻者最多的項目,VSCode、React Native、NPM:
review 最多的項目,DefinitelyTyped、K8S、Homebrew;討論最多的 repo,K8S、Origin、CMSSW
注冊用戶最多的國家:中國排第二
內容已獲獨家授權,如需轉載請聯系硅星人(ID:guixingren123)。
itHub 托管了大量的軟件代碼,
成為了開源繁榮的注腳。
它被稱為全球最大同性交友網站……
陪伴我們已經走過 10 年時間
本文作者:光譜
1999 年上線的 SourceForge,因為免費一度是世界上最受歡迎的開源軟件代碼托管網站。然而 Google 擔心它一家獨大,上線了自家的代碼托管網站 Google Code。
2005 年,Linux 的締造者 Linus Torvalds 對現有的代碼托管工具效率不滿意,便自己做了一個名叫 Git 的版本控制工具。Git 頗具革命性,允許大量開發者同時為源代碼貢獻新代碼,彼此間并不影響,最重要的在于它是開源的。
三個來自舊金山的年輕人認為 Git 的潛力巨大,在 2008 年正式推出了 GitHub,一個基于 Git 的代碼托管網站。他們沒想到,GitHub 后來擊敗了元老 SourceForge 和背景強大的 Google Code,成為了全世界最受歡迎的代碼托管網站。
Google 的開源代碼經理 Chris DiBona 對 GitHub 給予高度評價:
2008 年 4 月 10 日,GitHub 正式上線。
今天,GitHub 終于10 歲了!
去年 5 月底,GitHub 完成了第 1 億個 pull request(PR 合并請求)命令。截至今天,GitHub 上已經擁有超過 8000 萬個 repo(代碼倉庫),活躍用戶達到 2700 萬人,超過 150 萬家公司和機構進駐。
由于程序員群體里缺少女性,擁有高純度男性用戶的 GitHub,也被戲稱為全球最大的同性交友網站……
GitHub repo 按照語言劃分的男女用戶比例,最上面的綠色是確認的女用戶(2014 年數據)
“10 年前的今天,GitHub 正式上線。最一開始,我們只有一個特別簡單的目標:連接所有的開發者,讓他們用 Git 更輕松地進行項目協作,”聯合創始人 Chris Wanstrath 在博客里寫道,“10 年過去了,我們作為公司,作為平臺都有了很大的變化,但 GitHub 存在的意義從未改變。”
作為對十周年的紀念,GitHub 團隊并沒有選擇回顧公司歷史,而是整理了在他們眼中過去 10 年間的幾大里程碑事件。這很 GitHub——這份光榮,其實不止屬于平臺自己,更屬于那些為了讓這個世界變得更好,通過 Git、GitHub,用 JS、Python 和各種語言貢獻代碼的人們。
以下,就是這些曾在計算機業界和 GitHub 的發展中創造歷史的事件。
20080403: Rails 轉移至 GitHub
Ruby on Rails (Rails),是一個用 Ruby 語言編寫的開源 web 應用框架。它提高了開發復雜網頁的效率,是計算機界最受歡迎的開源項目之一。2008 年 4 月,Rails 做出了表率,將版本控制從 SVN 換成了 Git,并成為第一個進駐 GitHub 的大型開源項目。
當時,GitHub 還處在內測階段,沒有正式上線。GitHub 本身就是用 Rails 寫的,這件事為 GitHub 帶來了不小的影響力。
20090103:比特幣誕生
2009 年誕生后,比特幣于 2010 年正式開源,并托管在了 GitHub 上。比特幣是世界上第一個去中心化的數字貨幣,它的誕生和開源更是引發了一場同時波及金融和科技,甚至更多行業的革命。
至今,比特幣項目接受了超過 500 名用戶貢獻的代碼。比特幣的底層技術“區塊鏈”被廣泛視為下一個革命性的計算機技術,比特幣項目已經被 fork (代碼庫復制)逾 1.8 萬次,大量的區塊鏈、數字貨幣項目在 GitHub 上開源,其中很多都來自比特幣源代碼。
20090521:Node.js 發布
你可能聽說過網絡開發分前端后端之說,前端管網頁呈現,后端管數據輸出。然而這兩者不是孤立的,前端開發也會涉及到確保后端數據能夠正確呈現出來,所以大量采用 JavaScript (JS) 語言的前端人士需要學習后端 PHP、Ruby 之類的后端語言,很麻煩。
Node.js 的主要意義是讓前端用 JS 即可完成前端需要的大量開發任務,開發適配多種操作系統的復雜服務器端應用。簡單來說,它同時把前端和后端工程師從各自不熟悉的領域內解放了出來。2009 年 5 月底,Node.js 正式在 GitHub 上發布,收到了不少前端和后端人士的追捧,被認為是未來趨勢。
2014 年,Node.js 主要貢獻者對這個項目的官方管理公司不滿,于是自立門戶,fork 原版代碼做了一個社區驅動而不是公司化運營的替代品,名叫 io.js。這個項目一度比 Node.js 更受歡迎,但后來 Node.js 在開源治理上有了改善,兩個項目再次合并。
在整個過程中,GitHub 的開放機制確保了社區擁有自主權力,不必服從于開源項目的所有者。在必要的時候,fork 是一種力量,也是一種態度。
20101126:Rails Girls 第一次線下聚會
2010 年,一群用 Rails 做開發的女程序員在芬蘭赫爾辛基舉辦了第一次線下聚會。
三年后,他們專為女性和 LGBTQ 人士開設了一個夏令營 Rails Girls Summer of Code。這個開源培訓項目幫助開源社區改善了性別多樣性,為解決女性在科技行業內受到的結構性歧視做出了貢獻。
20110101:Travis CI 持續集成的第一個 PR
持續集成 (CI) 從像 GitHub 這樣的代碼庫里按照頻率提取最新的代碼,自動構建項目并進行測試。持續集成并不能消除 bug,而是讓它們非常容易發現和改正。比如下面這個 build passing 就是持續集成工具顯示的,它的大概意思是當前版本測試通過,沒有出現 bug。
而 Travis CI 是最受歡迎的,開源的持續集成工具。2011 年元旦那天,它完成了第一個 PR。Travis CI 和 GitHub 的整合,讓代碼投入生產環境的整個過程變得更高效了
20120101:JS 成為 GitHub 第一大語言
最一開始是一種網頁腳本語言,JS 和 HTML、CSS 并列網頁開發三大語言。被 JS 坑過的程序員經常諷刺它是一種不完整的語言,有一個很古老的段子:寫 C 的看不起寫 C++ 的,寫 C++ 的看不寫 Java 的,寫 Java 的看不起寫 JS 的,寫 JS 的看不起美工,周末大家都在加班,美工帶著女朋友旅游去了。
然而編程語言的鄙視鏈,總是和受歡迎程度相反。從 2012 年開始,JS 超越了 Ruby、Java 和 Python,成為了 GitHub 上最受歡迎的語言,直至今天仍霸占王座。
2013:GitHub 用戶破百萬
開源社區的發展使 GitHub 獲得了驚人的增速,在用戶數和 repo 數上實現了兩座里程碑:2013 年,用戶數突破了 100 萬;同年 12 月,GitHub 的 repo 總數超過了 1000 萬,其中超過一半是當年創建的,僅 11 月就增加了 100 萬個。
別光看數字多,這一年里增加的 repo 質量也很不錯:白宮的 Project Open Data、Docker 等等。亞馬遜 AWS、Facebook、Google、微軟、Twitter、Netflix 等知名公司也上傳了自家的項目。
20140609:Docker 1.0 發布
被視為革命性技術的開源容器引擎 Docker,2013 年在 GitHub 上創建了 repo,一年時間里下載量超過 275 萬份。2014 年,Docker 1.0 終于正式發布了。
像 Docker 和 Kubernetes (K8S) 這樣的開源項目開啟了一場容器化運動。開發、投產和運維的難度降低,小型公司不再需要花費精力在基礎架構上,可以更專注于核心業務開發。
20140721:Django Girls 第一次線下聚會
交友平臺不是開玩笑……GitHub 的程序員社交特性使得很多開發者通過它實現了線下聚會。它讓程序員們更容易結識彼此,而這對于女生尤為重要。
2014 年德國柏林,Django 女性開發者第一次在線下舉辦聚會,她們的組織仍在為改善性別多樣性而努力著。
20140723:微軟開源 .NET
雖然隨著移動互聯網的快速發展,沒跟上時代的 .NET 已經走向衰落,微軟向開源社區示好,仍然被視為開源業界的一個歷史性事件。微軟創立了一個開源行動,然后把所有的開源代碼包括 .NET 都在 GitHub 上開源。數千名工程師也讓微軟成為了 GitHub 上最為活躍的公司。
.NET 的開源帶起了一波節奏,隨后越來越多的大公司遷移到了 GitHub,放棄了自己的代碼托管網站或過時的代碼庫。
2015:虛幻引擎 4 免費和大量游戲相關開源
2015 年 3 月 2 日,虛幻引擎 4 完全免費了。Epic Games 放出了百分之百的 C++ 原始代碼,雖然獨立開發者想要開發 AAA 級別大作還是需要資金,但至少現在他們手上的虛幻引擎 4 和大廠手里的沒有任何區別。
Epic Games 對社區的恩惠得到了報答。在虛幻引擎最近一次 4.19 版本發布,包含了 128 個來自社區的貢獻。
除了虛幻引擎,還有不少游戲引擎、庫和游戲代碼在 2015 年上了 GitHub,比如《毀滅戰士》和《波斯王子》。最有趣的應該是 2048,它的開源帶來了上百款類似的消除游戲……總的來說是件好事。
20150922:GitHub Classroom 發布
除了工業界,學術界,包括大學和高中也可以利用 GitHub 進行教育了。GitHub Classroom 改進了編程課代碼管理、分發和作業收集。看上去是在做慈善,其實此舉很聰明:GitHub 普及要從娃娃抓起,盡管它已經碾壓了其它一切競爭對手。
20151203:蘋果開源 Swift
蘋果的新編程語言 Swift 具有函數式編程和面向對象編程的諸多特性,也兼容蘋果平臺之前的開發語言 C、Objective-C,也是一個強類型語言而非腳本語言,也很注重安全性……對于蘋果開發者而言,Swift 是件大好事,而有什么比 Swift 開源更讓人大快人心呢?
如果說微軟帶起了一波節奏,那么蘋果 Swift 編程語言的開源才真的讓其它科技公司都信服。老大哥都開源了,我們還有什么理由不跟隨呢?
20160709:阿波羅 11 號代碼開源
60 年代的程序員也有幽默感,不信就去 GitHub 上看看阿波羅 11 號的代碼。比如這個:臨時代碼一直用到了月球上。
你可能會感興趣,50 年前的程序員和代碼是什么樣的?隆重向你介紹阿波羅 11 號計算機系統工程師,MIT 的 Margaret Hamilton:
阿波羅 11 號代碼開源地址:https://github.com/chrislgarry/Apollo-11
2017:Python 進駐 GitHub
Python 因數據科學和深度學習的爆發重新開始受到關注,在 2015 年它成為了 GitHub 上第三受歡迎的語言,2017 年升至第二。當各大公司和人工智能專家開始倡導“人工智能普及化”(democratize AI) 時,Python 也終于來到了 GitHub。
這使得 Python 在 GitHub 上的流行越發勢不可擋,使用 Python 語言的新 repo 數量,環比增長達到了 70%。
20170215:TensorFlow 1.0 發布
革命性的深度學習庫,就連非專業人士都聽說過 TF——主要可能因為 AlphaGo 擊敗了李世乭和柯潔。2016 年,TensorFlow 成為了整個 GitHub 上 fork 最多的項目。
除了 TF,Caffe2、DeepSpeech 等大量深度學習工具也都相繼開源。使用這些工具,研究者可以創建面向不同領域的深度學習模型,包括并不限于電子游戲、弈類游戲、音樂、繪畫、醫療、金融等等,帶來新的技術范式和商業模式,顯著改善人們的生活。
20180410:十周年,再出發
在 2017 年,用戶提交了超過 2.9 萬億條代碼,GitHub 也合并的 PR 終于突破了 1 億。2018 年,GitHub 用戶總量達到 2700 萬,項目總數超過了 8000 萬。
人工智能、區塊鏈、量子計算……許多全新的計算機技術和全新的計算范式已經或正在趕來,代碼和數據在某種程度上已經取代了石油,成為了人類的新血液。
在這樣的大背景下,GitHub 太重要了,但它也面臨著和 10 年前 SourceForge 等前輩相同的命運:全世界的開源代碼都在這里,過度的中心化會否增加風險?在享受 GitHub 帶來便利的同時,越來越多人都會多一個心眼——代碼上傳之后,本地還是不要 rm 留個底吧。
最后,給一些 GitHub 整理的資料。首先,按照 PR 統計的受歡迎語言,JS、Python、Java、Ruby、PHP:
熱門關鍵字,機器學習、游戲、iOS、API、博客、網站、深度學習、Ardiono:
fork 最多的項目,TF、Bootstrap、gitignore;貢獻者最多的項目,VSCode、React Native、NPM:
review 最多的項目,DefinitelyTyped、K8S、Homebrew;討論最多的 repo,K8S、Origin、CMSSW
注冊用戶最多的國家:中國排第二
如今,Javascript 模塊化規范非常方便、自然,但這個新規范僅執行了2年,就在 4 年前,js 的模塊化還停留在運行時支持,10 年前,通過后端模版定義、注釋定義模塊依賴。對經歷過來的人來說,歷史的模塊化方式還停留在腦海中,反而新上手的同學會更快接受現代的模塊化規范。
但為什么要了解 Javascript 模塊化發展的歷史呢?因為凡事都有兩面性,了解 Javascript 模塊化規范,有利于我們思考出更好的模塊化方案,縱觀歷史,從 1999 年開始,模塊化方案最多維持兩年,就出現了新的替代方案,比原有的模塊化更清晰、強壯,我們不能被現代模塊化方式限制住思維,因為現在的 ES2015 模塊化方案距離發布也僅僅過了兩年。
直接定義依賴 (1999): 由于當時 js 文件非常簡單,模塊化方式非常簡單粗暴 —— 通過全局方法定義、引用模塊。這種定義方式與現在的 commonjs 非常神似,區別是 commonjs 以文件作為模塊,而這種方法可以在任何文件中定義模塊,模塊不與文件關聯。
閉包模塊化模式 (2003): 用閉包方式解決了變量污染問題,閉包內返回模塊對象,只需對外暴露一個全局變量。
模版依賴定義 (2006): 這時候開始流行后端模版語法,通過后端語法聚合 js 文件,從而實現依賴加載,說實話,現在 go 語言等模版語法也很流行這種方式,寫后端代碼的時候不覺得,回頭看看,還是掛在可維護性上。
注釋依賴定義 (2006): 幾乎和模版依賴定義同時出現,與 1999 年方案不同的,不僅僅是模塊定義方式,而是終于以文件為單位定義模塊了,通過 lazyjs 加載文件,同時讀取文件注釋,繼續遞歸加載剩下的文件。
外部依賴定義 (2007): 這種定義方式在 cocos2d-js 開發中普遍使用,其核心思想是將依賴抽出單獨文件定義,這種方式不利于項目管理,畢竟依賴抽到代碼之外,我是不是得兩頭找呢?所以才有通過 webpack 打包為一個文件的方式暴力替換為 commonjs 的方式出現。
Sandbox模式 (2009): 這種模塊化方式很簡單,暴力,將所有模塊塞到一個 sanbox 變量中,硬傷是無法解決明明沖突問題,畢竟都塞到一個 sandbox 對象里,而 Sandbox 對象也需要定義在全局,存在被覆蓋的風險。模塊化需要保證全局變量盡量干凈,目前為止的模塊化方案都沒有很好的做到這一點。
依賴注入 (2009): 就是大家熟知的 angular1.0,依賴注入的思想現在已廣泛運用在 react、vue 等流行框架中。但依賴注入和解決模塊化問題還差得遠。
CommonJS (2009): 真正解決模塊化問題,從 node 端逐漸發力到前端,前端需要使用構建工具模擬。
Amd (2009): 都是同一時期的產物,這個方案主要解決前端動態加載依賴,相比 commonJs,體積更小,按需加載。
Umd (2011): 兼容了 CommonJS 與 Amd,其核心思想是,如果在 commonjs 環境(存在 module.exports,不存在 define),將函數執行結果交給 module.exports 實現 Commonjs,否則用 Amd 環境的 define,實現 Amd。
Labeled Modules (2012): 和 Commonjs 很像了,沒什么硬傷,但生不逢時,碰上 Commonjs 與 Amd,那只有被人遺忘的份了。
YModules (2013): 既然都出了 Commonjs Amd,文章還列出了此方案,一定有其獨到之處。其核心思想在于使用 provide 取代 return,可以控制模塊結束時機,處理異步結果;拿到第二個參數 module,修改其他模塊的定義(雖然很有拓展性,但用在項目里是個攪屎棍)。
ES2015 Modules (2015): 就是我們現在的模塊化方案,還沒有被瀏覽器實現,大部分項目已通過 babel 或 typescript 提前體驗。
從語言層面到文件層面的模塊化
從 1999 年開始,模塊化探索都是基于語言層面的優化,真正的革命從 2009 年 CommonJS 的引入開始,前端開始大量使用預編譯。
這篇文章所提供的模塊化歷史的方案都是邏輯模塊化,從 CommonJS 方案開始前端把服務端的解決方案搬過來之后,算是看到標準物理與邏輯統一的模塊化。但之后前端工程不得不引入模塊化構建這一步。正是這一步給前端開發無疑帶來了諸多的不便,尤其是現在我們開發過程中經常為了優化這個工具帶了很多額外的成本。
從 CommonJS 之前其實都只是封裝,并沒有一套模塊化規范,這個就有些像類與包的概念。我在10年左右用的最多的還是 YUI2,YUI2 是用 namespace 來做模塊化的,但有很多問題沒有解決,比如多版本共存,因此后來 YUI3 出來了。
YUI().use('node', 'event', function (Y) { // The Node and Event modules are loaded and ready to use. // Your code goes here! });
YUI3 的 sandbox 像極了差不多同時出現的 AMD 規范,但早期 yahoo 在前端圈的影響力還是很大的,而 requirejs 到 2011 年才誕生,因此圈子不是用著 YUI 要不就自己封裝一套 sandbox,內部使用 jQuery。
為什么模塊化方案這么晚才成型,可能早期應用的復雜度都在后端,前端都是非常簡單邏輯。后來 Ajax 火了之后,web app 概念的開始流行,前端的復雜度也呈指數級上漲,到今天幾乎和后端接近一個量級。工程發展到一定階段,要出現的必然會出現。
前端三劍客的模塊化展望
從 js 模塊化發展史,我們還看到了 css html 模塊化方面的嚴重落后,如今依賴編譯工具的模塊化增強在未來會被標準所替代。
原生支持的模塊化,解決 html 與 css 模塊化問題正是以后的方向。
再回到 JS 模塊化這個主題,開頭也說到是為了構建 scope,實則提供了業務規范標準的輸入輸出的方式。但文章中的 JS 的模塊化還不等于前端工程的模塊化,Web 界面是由 HTML、CSS 和 JS 三種語言實現,不論是 CommonJS 還是 AMD 包括之后的方案都無法解決 CSS 與 HTML 模塊化的問題。
對于 CSS 本身它就是 global scope,因此開發樣式可以說是喜憂參半。近幾年也涌現把 HTML、CSS 和 JS 合并作模塊化的方案,其中 react/css-modules 和 vue 都為人熟知。當然,這一點還是非常依賴于 webpack/rollup 等構建工具,讓我們意識到在 browser 端還有很多本質的問題需要推進。
對于 css 模塊化,目前不依賴預編譯的方式是 styled-component,通過 js 動態創建 class。而目前 css 也引入了與 js 通信的機制 與 原生變量支持。未來 css 模塊化也很可能是運行時的,所以目前比較看好 styled-component 的方向。
對于 html 模塊化,小尤最近爆出與 chrome 小組調研 html Modules,如果 html 得到了瀏覽器,編輯器的模塊化支持,未來可能會取代 jsx 成為最強大的模塊化、模板語言。
對于 js 模塊化,最近出現的 <script type="module"> 方式,雖然還沒有得到瀏覽器原生支持,但也是我比較看好的未來趨勢,這樣就連 webpack 的拆包都不需要了,直接把源代碼傳到服務器,配合 http2.0 完美拋開預編譯的枷鎖。
上述三中方案都不依賴預編譯,分別實現了 html、css、js 模塊化,相信這就是未來。
模塊化標準推進速度仍然緩慢
2015 年提出的標準,在 17 年依然沒有得到實現,即便在 nodejs 端。
這幾年 TC39 對語言終于重視起來了,慢慢有動作了,但針對模塊標準制定的速度,與落實都非常緩慢,與 javascript 越來越流行的趨勢逐漸脫節。nodejs 至今也沒有實現 ES2015 模塊化規范,所有 jser 都處在構建工具的陰影下。
Http 2.0 對 js 模塊化的推動
js 模塊化定義的再美好,瀏覽器端的支持粒度永遠是瓶頸,http 2.0 正是考慮到了這個因素,大力支持了 ES 2015 模塊化規范。
幸運的是,模塊化構建將來可能不再需要。隨著 HTTP/2 流行起來,請求和響應可以并行,一次連接允許多個請求,對于前端來說宣告不再需要在開發和上線時再做編譯這個動作。
幾年前,模塊化幾乎是每個流行庫必造的輪子(YUI、Dojo、Angular),大牛們自己爽的同時其實造成了社區的分裂,很難積累。有了 ES2015 Modules 之后,JS 開發者終于可以像 Java 開始者十年前一樣使用一致的方式愉快的互相引用模塊。
不過 ES2015 Modules 也只是解決了開發的問題,由于瀏覽器的特殊性,還是要經過繁瑣打包的過程,等 Import,Export 和 HTTP 2.0 被主流瀏覽器支持,那時候才是徹底的模塊化。
Http 2.0 后就不需要構建工具了嗎?
看到大家基本都提到了 HTTP/2,對這項技術解決前端模塊化及資源打包等工程問題抱有非常大的期待。很多人也認為 HTTP/2 普及后,基本就沒有 Webpack 什么事情了。
不過 Webpack 作者 @sokra 在他的文章 webpack & HTTP/2 里提到了一個新的 Webpack 插件 AggressiveSplittingPlugin。簡單的說,這款插件就是為了充分利用 HTTP/2 的文件緩存能力,將你的業務代碼自動拆分成若干個數十 KB 的小文件。后續若其中任意一個文件發生變化,可以保證其他的小 chunck 不需要重新下載。
可見,即使不斷的有新技術出現,也依然需要配套的工具來將前端工程問題解決方案推向極致。
模塊化是大型項目的銀彈嗎?
只要遵循了最新模塊化規范,就可以使項目具有最好的可維護性嗎? Js 模塊化的目的是支持前端日益上升的復雜度,但絕不是唯一的解決方案。
分析下 JavaScript 為什么沒有模塊化,為什么又需要模塊化:這個 95 年被設計出來的時候,語言的開發者根本沒有想到它會如此的大放異彩,也沒有將它設計成一種模塊化語言。按照文中的說法,99 年也就是 4 年后開始出現了模塊化的需求。如果只有幾行代碼用模塊化是扯,初始的 web 開發業務邏輯都寫在 server 端,js 的作用小之又小。而現在 spa 都出現了,幾乎所有的渲染邏輯都在前端,如果還是沒有模塊化的組織,開發過程會越來越難,維護也是更痛苦。
本文中已經詳細說明了模塊化的發展和優劣,這里不準備做過多的贅述。但還有一個問題需要我們去關注,那就是在模塊化之后還有一個模塊間耦合的問題,如果模塊間耦合度大也會降低代碼的可重用性或者說復用性。所以也出現了降低耦合的觀察者模式或者發布/訂閱模式。這對于提升代碼重用,復用性和避免單點故障等都很重要。說到這里,還想順便提一下最近流行起來的響應式編程(RxJS),響應式編程中有一個很核心的概念就是 observable,也就是 Rx 中的流(stream)。它可以被 subscribe,其實也就是觀察者設計模式。
未來前端復雜度不斷增加已成定論,隨著后端成熟,自然會將焦點轉移到前端領域,而且服務化、用戶體驗越來越重要,前端體驗早不是當初能看就行,任何網頁的異常、視覺的差異,或文案的模糊,都會導致用戶流失,支付中斷。前端對公司營收的影響,漸漸與后端服務宕機同等嚴重,所以前端會越來越重,異常監控,性能檢測,工具鏈,可視化等等都是這幾年大家逐漸重視起來的。
我們早已不能將 javascript 早期玩具性質的模塊化方案用于現代越來越重要的系統中,前端界必然出現同等重量級的模塊化管理方案,感謝 TC39 制定的 ES2015 模塊化規范,我們已經離不開它,哪怕所有人必須使用 babel。
話說回來,標準推進的太慢,我們還是把編譯工具當作常態,抱著哪怕支持了 ES2015 所有特性,babel 依然還有用的心態,將預編譯進行到底。一句話,模塊化仍在路上。js 模塊化的矛頭已經對準了 css 與 html,這兩位元老也該向前衛的 js 學習學習了。
未來 css、html 的模塊化會自立門戶,還是賦予 js 更強的能力,讓兩者的模塊化依附于 js 的能力呢?目前 html 有自立門戶的苗頭(htmlModules),而 css 遲遲沒有改變,社區出現的 styled-component 已經用 js 將 css 模塊化得很好了,最新 css 規范也支持了與 js 的變量通信,難道希望依附于 js 嗎?這里希望得到大家更廣泛的討論。
我也認同,畢竟壓縮、混淆、md5、或者利用 nonce 屬性對 script 標簽加密,都離不開本地構建工具。
據說 http2 的優化中,有個最佳文件大小與數量的比例,那么還是脫離不了構建工具,前端未來會越來越復雜,同時也越來越美好。
至此,對于 javascript 模塊化討論已接近尾聲,對其優缺點也基本達成了一致。前端復雜度不斷提高,促使著模塊化的改進,代理(瀏覽器、node) 的支持程度,與前端特殊性(流量、緩存)可能前端永遠也離不開構建工具,新的標準會讓這些工作做的更好,同時取代、增強部分特征,前端的未來是更加美好的,復雜度也更高。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。