本文最初發(fā)表于 Towards Data Science 博客,經(jīng)原作者 Rhea Moutafis 授權(quán),InfoQ 中文站翻譯并分享。
Python 是我的謀生工具,我很喜歡它。盡管我對這門語言有一些批評的地方,但我還是強烈推薦給任何開始從事數(shù)據(jù)科學的人。反正在這個領(lǐng)域中,比較有經(jīng)驗的人往往都是 Python 的布道師。
然而,這并不意味著你不能時不時地挑戰(zhàn)你所在領(lǐng)域的極限,例如探索不同的編程范式或新的編程語言。
Python 的競爭對手名單很長: Rust 、 Go 、 Scala 、Haskell、 Julia 、Swift、C++、JAVA 和 R 都可以在其中找到條目。在如此擁擠的領(lǐng)域里,JavaScript 和 TypeScript 沒有得到那么多的認可,這是可以理解的。
但這并不意味著 TypeScript 不是通用編程領(lǐng)域的主流。然而,在數(shù)據(jù)科學家群體中,它似乎從來就沒有特別受歡迎過。
你可能會得出這樣的結(jié)論,TypeScript 可能不是數(shù)據(jù)科學的理想選擇。但不要急著下結(jié)論。盡管它可能不適合數(shù)據(jù)科學的每一部分,但在某些領(lǐng)域上,它比 Python 有明顯的優(yōu)勢。
如果你碰巧在這些領(lǐng)域之一工作的話,那么值得給 TypeScript 一個機會。如果你不這么做的話,誰知道你的下一步會在哪里呢?這個領(lǐng)域發(fā)展得如此之快。如果你能將眼光放遠一些,你就有了競爭優(yōu)勢。
TypeScript:是一種 JavaScript,但類型安全
大約十年前,Microsoft 的軟件工程師注意到,JavaScript 已經(jīng)不能滿足他們所有的需求了。一方面,該語言發(fā)展迅速,并增加了非常有趣的新特性。另一方面,管道中的任何功能都不能解決一個根本性的問題:JavaScript 對于小型程序來說非常棒,但用它來編寫整個應用程序卻一團糟。
解決這一問題有幾種可能性:例如,可以使用不同的編程語言,或者使用更好的語法重新設(shè)計 JavaScript。Microsoft 的開發(fā)團隊采取了一種不同的方法:他們通過擴展 JavaScript 創(chuàng)建了 TypeScript。通過這種方式,他們能夠利用 JavaScript 的所有新特性,同時擺脫了那些不適合大型項目的東西。
與 Python 類似,JavaScript 是在運行時編譯的,這意味著你需要運行代碼來調(diào)試它。另一方面,TypeScript 是編譯的。這提供了額外的安全層,因為程序員在執(zhí)行時間之前就可以獲得關(guān)于可能存在的 Bug 信息。對于 Python 或 JavaScript 這樣的非編譯語言,一旦意識到代碼的行為與預期不符,定位 Bug 可能會非常耗時。
然而,JavaScript 和 TypeScript 之間的關(guān)鍵區(qū)別在于類型檢查器。在編譯時,每個 TypeScript 程序都會檢查數(shù)據(jù)類型是否彼此一致。
手動做這些事可能聽起來微不足道。但是,當你在項目中使用數(shù)千行代碼時,你就會感謝上帝賜予你這一切。
還有一些其他不同之處,例如,TypeScript 有匿名函數(shù)和異步函數(shù)。匿名函數(shù)是函數(shù)式編程的一個關(guān)鍵特性,它可以使程序在大數(shù)據(jù)負載下更加高效。
當你需要并行執(zhí)行多個操作時,或者在處理不應中斷后臺進程的 I/O 操作時,異步編程非常有用。異步編程在 Python 和 JavaScript 中是可能實現(xiàn)的,但在 TypeScript 中,異步編程是內(nèi)置在內(nèi)核中的。
TypeScript 是 JavaScript 的超集
TypeScript 是如何流行起來的
如果你討厭 JavaScript 中不斷發(fā)生的不合邏輯但又滑稽可笑的、令人抓狂的時刻,那么,我有一個壞消息告訴你:你在 TypeScript 中也會看到所有這些東西。
但是,這些語法上的小問題,并不是程序員如此熱愛 TypeScript 的原因。更確切地說,這可以歸結(jié)為這樣一個想法:你需要一個很棒的產(chǎn)品(JavaScript),并添加更棒的東西(靜態(tài)類型)。
當然,我并不是說 JavaScript 總是很棒,或者靜態(tài)類型總是最好的處理方式。但是,對于構(gòu)建大型 Microsoft 風格的應用程序來說,這似乎非常好用。
話雖如此,TypeScript 仍然只擁有 JavaScript 的一小部分人氣。這可以歸結(jié)為發(fā)行時間的原因:TypeScript 發(fā)行有八年了,而 JavaScript 的發(fā)行時間是它的三倍!Python 在這一領(lǐng)域中,也是一款有著三十年發(fā)行歷史的老古董。
盡管它很年輕,但在某些領(lǐng)域中,TypeScript 是不可避免的。這就增加了它的受歡迎程度。例如,當 google 在 2016 年宣布 Angular.js 將與 TypeScript 一起使用時,TypeScript 在 StackOverflow 上的標簽數(shù)量呈爆炸式激增。
與 Python 和 JavaScript 的吸引力相比,TypeScript 只占一小部分。不過,在某些領(lǐng)域,TypeScript 是不可避免的。
TypeScript 在什么地方比 Python 更有優(yōu)勢
JavaScript 之所以在當時很受歡迎,是因為它可以在任何地方運行。你可以在服務(wù)器、瀏覽器或你喜歡的任何地方來運行它。你只需編譯一次,它就可以在任何地方工作。當它第一次出現(xiàn)時,簡直就像是魔法一樣。
由于它是基于 JavaScript 構(gòu)建的,所以 TypeScript 也繼承了這種魔法。Python 也是如此!當然,Python 的實現(xiàn)方式略有不同,因為它使用的是解釋器而不是虛擬機。但這并不能改變這樣一個事實:就一次編寫到處運行這方面,TypeScript 和 Python 是可以相提并論的。
像泛型和靜態(tài)類型這樣的特性使得在 TypeScript 中進行函數(shù)式編程比在 Python 中更容易。這可能是一個優(yōu)勢。因為由于數(shù)據(jù)科學、并行編程、異步編程等領(lǐng)域的發(fā)展,對函數(shù)式代碼的需求正在增長。
另一方面,Python 也在添加越來越多的函數(shù)式編程特性。當涉及到數(shù)據(jù)科學、機器學習等方面,Python 處于前沿地位。
這就剩下并行編程和異步編程了。盡管這兩種編程語言都可以完成這兩種工作,但是有一個很大的不同:在 Python 中,你需要使用特定的庫來完成任務(wù)。而在 TypeScript 中,所有的庫都是與內(nèi)核異步的。由于后者在默認情況下功能更多,因此進行并行編程更容易一些。
換句話說,如果你是從事異步進程和并行計算的 Python 開發(fā)人員,那么你可能會想嘗試一下 TypeScript。
TypeScript 適合數(shù)據(jù)科學嗎?
許多數(shù)據(jù)科學家都在處理異步和并行進程。你可能已經(jīng)在考慮使用 TypeScript 而不是 Python 來編寫下一個項目。不過,這究竟是不是一個好主意,還要取決于許多其他因素。
首先,TypeScript 并沒有一種簡單明了的方式進行列表推導。例如,當處理大型數(shù)據(jù)時,這可能會令人感到沮喪。
其次,TypeScript 中并沒有原生矩陣運算。Python 中有 NumPy,以及許多其他工具,這些工具使 Python 變得更容易。因此,如果你的項目有大量的線性代數(shù),你可能不會想用 TypeScript。
再次,如果你對 JavaScript 不是很熟悉的話,你幾乎肯定會有一些困惑。因為 TypeScript 就是基于 JavaScript 構(gòu)建的,前者繼承了后者的所有特性——所有好的、壞的和令人抓狂的特性。不過,說實話,遇到這些現(xiàn)象也會很有趣……
最后,你還需要考慮到編程并不是一種單獨的職業(yè)。在數(shù)據(jù)科學領(lǐng)域中,有一個龐大的 Python 社區(qū),它能為你提供支持和建議。但在目前,TypeScript 在數(shù)據(jù)科學家中并沒有那么流行。因此,你可能無法在 StackOverflow 和其他地方找到對你的問題有幫助的答案。
也就是說,如果你要開始一個沒有太多大數(shù)據(jù)和矩陣運算的小項目,那么無論如何你都可以嘗試一下 TypeScript。特別是當它涉及到并行或異步編程時。
底線:清楚在何處使用你的工具
并不是每項任務(wù)都有一種語言。當然,有些語言比其他語言更為有趣,或更為直觀。當然,熱愛你的工具是很重要的,因為這會讓你在困難的時候繼續(xù)前進。因此,從一種很受歡迎的編程語言(如 TypeScript 或 Python)開始,并不是一個壞主意。
但歸根結(jié)底,你不應該像信奉宗教信仰一樣只信奉一種編程語言。編程語言只不過是一種工具。至于哪種工具最適合你,主要取決于你想用它做什么。
目前,對數(shù)據(jù)科學領(lǐng)域來說,Python 是巨大的存在。但是,在一個快速發(fā)展的領(lǐng)域,你需要把眼光放遠一些。隨著任務(wù)的改變,你的工具也會隨之改變。
另一方面,TypeScript 有一個圍繞前端 Web、后端節(jié)點和移動開發(fā)的活躍社區(qū)。有趣的是,這些領(lǐng)域與數(shù)據(jù)科學的交叉比人們想象的要高。特別是,Node 在數(shù)據(jù)科學家中越來越受到關(guān)注。
當然,這并不意味著你應該一次涉足十幾種編程語言。真正精通一門編程語言有著巨大的價值。但從長遠來看,對其他語言和技術(shù)的好奇心將有助于你保持領(lǐng)先地位。
所以,當你想嘗試新事物的時候,不要猶豫!那為什么還不去嘗試 TypeScript 呢?
作者介紹:
Rhea Moutafis,正在攻讀暗物質(zhì)物理學博士學位。熱愛藝術(shù)、音樂及美好事物。
原文鏈接:
https://towardsdatascience.com/why-developers-love-typescript-every-bit-as-much-as-python-687d075cfb5e