當前位置:
首頁 > 科技 > 看Github上的開發者是如何更換編程語言的?

看Github上的開發者是如何更換編程語言的?

作者丨Waren Long

翻譯丨Vincent

你是否曾經想過嘗試換一門語言進行開發,從而挑戰一下自己。本文作者分析了GitHub上面的用戶,從而得到了用戶切換開發語言的相關信息。

你是否曾經一邊掙扎於項目的混亂,一邊思考著:「我可以用這門語言來做,但是為什麼不嘗試換一門語言,看看會不會更有趣呢?」。埃里克·伯恩哈德森 曾在博客中寫過一篇很好的文章:「為什麼我們從語言X換成語言Y」的特徵向量,他根據所有與語言變化相關的谷歌查詢做了一個情形分析表。然而,當我讀到它的時候,我忍不住想知道,真正跨行成功的人的比例是多少。因此,越來越多的人開始深入了解這一想法,並了解在GitHub用戶中語言的流行程度是如何變化的。

可用數據集

多虧了數據檢索管道,source可以將數據集開放給用戶,其中包含每年每位GitHub用戶使用不同編程語言編寫的代碼的位元組數。在一些圖中,它是:

450萬GitHub用戶

393種不同的語言

總共10TB的源碼

如果你想知道這些存儲庫和語言的細節,我建議你可以看看Vadim Markovtsev的博客文章:Spaces or Tabs。

為了更好的理解接下來將會發生什麼,我發現如果用甘特圖的形式將開發語言的使用歷史以可視化的形式進行展示,效果很不錯。

注意,顏色表示每種語言的源碼的比例。我們可以從這個圖中推導出一些信息:

用戶最喜歡的語言是Scala,而且只鍾情於它。

用戶嘗試了了Go語言,但沒堅持多久。

他們用Java運行了一個重要的項目,但是他們寧願在Scala中編寫代碼。使用Java可能是完成單個項目的一個約束。

當然,從這張圖中可能會推導出在2014年用戶開始從Java切換到Markdown。我們希望避免去比較那些沒有可比性的語言。這就是為什麼我們將重點放在25個主要編程語言的樣本上。實際上是22個,因為我們沒有關於Lisp、Kotlin和Cobol這三門語言的數據。

量化

你肯定會同意,GitHub的「Hello world」庫並不真正算作是切換到另一種語言。因此,我們決定對數據集中的貢獻值進行量化,以減少干擾。出於這個原因,我們在下面的小節中展示了GitHub每個位元組大小的貢獻的分布。

按大小分配GitHub貢獻

正如我們所看到的,它的尾巴很長,大部分的貢獻都是很小的。為了近似分布,我們使用了核密度估計,也就是圖中的橙色曲線。最後,通過將曲線下的面積劃分成10個相等的部分來得到量化。從0開始編號。

在對數據集進行過濾和量化之後,我們可以繼續構建自己的轉移矩陣。

最小費用流問題

對於每一個GitHub用戶,我們聚合年度的矢量;我們將稱它們為反應器,其中每個393個元素代表著當年對應的語言編碼的位元組數。在規範化之後,這些反應堆就像直方圖一樣,我們需要相互比較。

在PyEMD中提供了一種優雅的方法,在編碼和計算時間上都是有效的,它提供了一個Python包裝器,用於「地球搬運工」的距離,它對「Numpy」友好。這個距離度量——比用於直方圖比較的歐氏距離要好的多——特別有趣,因為它是基於線性規劃(LP)。事實上,它可以被看作是以下交通問題的解決方案,where

運輸問題,供應和需求

我們可以看到,每隔幾年,位元組數要麼被看作是「供給」,要麼是「需求」。

讓我們在這裡稍微講一下。首先,邊的「成本」被設為1,以使我們無偏見。其次,為了減少我們的問題到經典的流量最小化公式,我們必須在兩部分圖的兩邊加上一個人工的源和水槽,以確保流體的守恆。這不是一個臨界點,斯坦福CS97SI的最後一張幻燈片描述了這個轉變。

轉移矩陣

以下是為特定的GitHub用戶計算連續兩年之間的轉移矩陣的核心代碼。我們使用的主要功能是emd_with_flow,它由PyEMD包提供。

def get_transition_matrix_emd(user, year):

# lang2keep is the list of the 22 programming languages we kept

# stairvalue() is the step function that comes from quantization

# Build user s reactors for year and year+1

reactors = zeros((len(lang2keep),2), order= f )

for ind, code_in_lang in enumerate(dataset[user]):

lang = code_in_lang[0]

if lang in lang2keep:

for y, qtt_coded_year in code_in_lang[1]:

if y == year:

reactors[lang2keep.index(lang),0] = stairvalue(qtt_coded_year)

elif y == year+1:

reactors[lang2keep.index(lang),1] = stairvalue(qtt_coded_year)

if (sum(reactors[:,0]) == 0) or (sum(reactors[:,1]) == 0):

# no transition to consider

P = zeros((len(lang2keep), len(lang2keep)))

return P

else:

# Normalization of reactors

for i in [0, 1]:

reactors[:,i] = [j/sum(reactors[:,i]) for j in reactors[:,i]]

# compute the Earth Mover s distance between the 2 reactors thanks to the emd_with_flow function

distance = np.ones((len(lang2keep), len(lang2keep)))

dist, P = emd_with_flow(reactors[:,0], reactors[:,1], distance)

P = np.asarray(P)

return P

使用Python計算轉移矩陣的函數

最後,在對用戶和過去16年(我們將考慮每年的轉移)的流矩陣求和之後,我們得到了最終的轉移矩陣。現在讓我們將它與埃里克根據Google查詢編譯的情形分析表進行比較。下面的圖是使用埃里克的腳本繪製的。

與埃里克的表相比,我們在轉移矩陣的主對角線上有一些元素。稍後我們將看到如何利用這些元素。然而,儘管我們使用的數據集是不同的,但是我們還是注意到有很多的相似點,並且感知到相同的語言概要。與埃里克的表相比,我們在過渡矩陣的主對角線上有一些元素。稍後我們將看到如何利用它。然而,儘管我們使用的數據集是不同的,我們注意到許多相關的相似點。

GitHub的「語言排行榜」

既然我們有了流矩陣,我們就可以知道哪種語言是最受歡迎的,哪一種最不受歡迎。還可以在表示的圖上計算中心度量,例如特徵向量的中心。事實上,這些措施傳達了語言的相對流行程度,在某種程度上也就是反應了人們使用一種語言編碼然後會轉換成另一種語言的可能性。我們將採用計算特徵向量中心的方法。如果你需要進一步的解釋,可以閱讀Vadim在他的博客文章中關於GitHub的貢獻圖表的PageRank分析。

我們的流矩陣包含嚴格的正元素,這是使其不可約的充分條件;總有一種方法可以從任何給定的語言中獲得所有其他語言。因此,根據perron-fro定理,我們正在尋找最偉大的特徵值及其對應的特徵向量。

我們可以使用冪次迭代演算法來找到最主要的特徵向量。然而,除了不可約外,矩陣還需要是隨機的和非周期的。

當移除主對角並使行規格化時,我們的流矩陣就變成了隨機的。最大的特徵值現在等於1。

最後,為了使我們的矩陣不受周期和條件的限制,拉里和謝爾蓋在1998年引入了一個著名的技巧。在斯坦福的CS246中有很好的解釋,但是為了縮短它,它主要包括用以下公式更新我們的流動矩陣:

where,

β被稱為隨機遊走因子,被設為0.85

N是語言的數量

冪迭代

在這些步驟之後,我們的良好條件流矩陣包含了在語言之間切換的可能性,我們可以繼續進行冪次迭代。該演算法由以下矩陣乘法組成,直到收斂到主特徵向量:

在下面的代碼中,您將找到返回所需要的主導特徵向量的代碼。

def power_iteration(A, nb_iterations=100, beta=0.85):

u = np.reshape(u, (len(lang2keep), 1))

A = A * beta + ((1 - beta) / len(lang2keep)) * np.ones((len(lang2keep), len(lang2keep)))

for _ in range(nb_iterations):

u_next = np.dot(A,u)

u_next_norm = sum(u_next)

u = u_next / u_next_norm

return u

power_iteration(transition_matrix)

冪迭代演算法,Python。

GitHub上面最受歡迎的開發語言

終於!這是獎勵:我們的馬爾可夫鏈的平穩分布。這個概率分布是獨立於初始分布的。它給出了語言之間隨機切換過程的穩定性的信息。因此,無論目前的語言有多流行,假設的未來靜止狀態不變。以下是我們在GitHub上使用的22種語言的流行度排名:

根據centrality measure 在GitHub上,語言的受歡迎程度

Python(16.1%)似乎是最吸引人的語言,緊隨其後的是Java(15.3%)。這尤其有趣,因為GitHub上只有11.3%的源代碼是用Python編寫的。

在埃里克的排名中,Go是最大的贏家,16.4%。由於Erik基於Google查詢的方法,似乎圍繞Go的熱門話題,讓人們在博客中明確地表示,如果他們想要使用這種語言,那麼就需要花一點時間來生成在GitHub上有效編寫的項目。

此外,C(9.2%)的表現與埃里克的14.3%的評分是一致的,儘管這是由於在GitHub上用C編碼的項目數量。

儘管在GitHub上的代碼行數比Ruby多10倍,但它們的靜態分布是相同的。

Go(3.2%)出現在第9位,這在很大程度上是值得尊敬的,因為在GitHub上託管的項目中有一小部分(0.9%)。例如,相同比例的項目是用Perl編寫的,但是這種語言並沒有真正激起激情(2%的流行)。

堅持使用一種語言

如果我們在應用冪次迭代之前保留了轉換矩陣的主對角線,我們得到的結果會略有不同。它主要減少了高級語言的流行,同時也提高了小語種的知名度。事實上,似乎有理由相信,那些把時間花在掌握其他語言的開發人員身上的開發人員,往往會堅持他們的觀點,而不像那些受歡迎的人。

在剩下的文章中,我們將考慮我們的第一個特徵向量的表示。

回到轉移矩陣

埃里克的轉移矩陣是排序的,因此最流行的語言出現在底部。我們用同樣的順序來比較它們:

這是我們的矩陣,獨立排序:

source的有序轉換矩陣,原始順序

在最流行的5種語言(Java、C、C++、PHP、Ruby)中編寫代碼的開發人員最有可能用approx切換到Python。平均22%的幾率。

此外,根據埃里克的矩陣,人們從Ojective-C轉換到Swift和返回的可能性更大——24%和19%。

類似地,一個Visual Basic開發人員有更多的機會(24%)轉移到C#,而Erik在這個轉換過程中幾乎肯定會有92%的機會。

最重要的是,Scala的用戶更願意使用Scala,分別是22、29和40%。

使用數字和統計環境的人,如Fortran(36%),Matlab(33%)或R(40%)最可能轉向Python,與Erik的矩陣相反,這是C語言的未來語言。

我在埃里克的研究結果中發現了一個共同點,那就是Go吸引了那些放棄研究Rust的人。

過去的16年

正如我們前面提到的,在對轉換矩陣進行求和之前,我們現在考慮特定的年份,並研究這些年矩陣是怎樣的。他們是否表達相同的語言資料?自2000年初以來,它是如何演變的?以下是來自不同時間軸的4個矩陣的樣本:

轉變矩陣的時間演化

最後,隨著時間的推移,這些矩陣的演化似乎是仿射的,我們每年都觀察同一種語言。因此,為了突出這個語言概要文件的時間線,我們將冪迭代應用到每個矩陣。在過去的16年里,我們的平均分配是固定的,但是現在我們看它的時間順序。在堆棧區域圖中給出了一系列的主要特徵向量的序列。

在過去的16年里,語言的平穩分布

每個帶的厚度對應於佔主導特徵向量的值。這些帶按我們之前計算過的平均受歡迎程度排序。

前兩種語言,Python和Java具有相同的配置文件。他們已經取代C的位置已經15年了。事實上,前三層的聚合給出了一個直的。

2008年,當Java或Ruby等語言開始快速增長時,C++的吸引力顯著下降。然而,自這一時期以來,它一直保持著它的受歡迎程度。

我絕對支持Erik的結論:Perl正在消亡。

蘋果在2014年的WWDC大會上展示了Swift,而該公司本應取代Obj-C。因此,在此事件之後,Obj-C的採用應該開始減少,但是這兩種語言的總和應該保持不變。看看這個數字,這個假設是正確的。

從2007年開始,Ruby似乎已經有了6年的榮耀。這也許可以用web框架Ruby on Rails(RoR)的發布來解釋,當蘋果宣布將在10月份發布Mac OS X v10.5「Leopard」時,它達到了一個里程碑。

至於Go,它的受歡迎程度相對較低。然而,這一動態顯然是積極的。

變化

在發表這篇文章後,我看見有的讀者在語言冗長性方面有些偏見。任何事情都是公平的:全球量化方案可能會給像Java這樣的冗長的語言帶來優勢,而比如像Haskell這樣的濃縮的語言可能就沒有。我分別對每種語言進行了量化,並重新運行了其餘部分的分析。正如在下面的表格中所看到的,沒有什麼真正的變化;Ruby和C++交換了位置,但是它們的級別非常接近。最後看起來完全一樣。

結論

把埃里克的情形分析表看作是語言分布問題的二階導數,而我們的流轉換就像一階導數一樣,這更合適。也就是說,首先你先要Google查詢,然後試著編寫一個OSS項目,最後導致了語言的分布變化。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

如何在17天之內收穫70份工作面試
人工智慧衝擊下的十大高危行業,你中了嗎?
ES8都有哪些新特性,你還在用ES6嗎?
學習DevOps的熱門原則

TAG:CSDN |

您可能感興趣

iPhoneX的用戶,有必要更換iPhoneXs嗎?
從iPhone更換成Android手機之後,你有哪些不同的體驗?
從iPhone更換成Android手機之後,你有怎樣的不同體驗?
現在在用iPhone6s,有必要更換到iPhoneX嗎?
現在使用的是iPhone6sPlus,那麼現在更換iPhoneX合理嗎?
當年從Android更換成iPhone之後,你有哪些不同的體驗?
iFixit:更換屏幕令 iPhone「變磚」的原因,被我們找到了
將免費為「鼓包」的 Apple Watch 2 更換電池,這次蘋果的做法你滿意嗎?
蘋果新機即將發布,正在使用iPhone6s/iPhone6sp的你是否考慮更換?
MacBook Air的電池更容易更換,但你不能在家裡更換
微軟將更換你的Surface Pro 4,如果它受到「Flickergate」的影響
kindle 更換字體,終於等到你!
下一代 iPhone 或將更換為 USB-C 介面,還有新款 iPod touch?
iPhone 電池顯示「維修」,如何判斷是否要更換電池?
從iPhone更換成Android手機之後,原來世界那麼大!
年底之前,記得去蘋果Apple Store更換iPhone的電池
你的Surface Pro 4閃屏了嗎?可免費更換
谷歌「看圖說話」應用程序Google Lens更換新LOGO
手把手教你如何更換iPhone 6S的電池,送給iPhone 6S的忠實粉!
如果Nike x Sean Wotherspoon更換目標,這雙霸氣十足的LeBron 15會更吸引你嗎?