聊聊初創公司的后端語言選型(小眾語言)

jopen 8年前發布 | 21K 次閱讀 Python Go語言 Ruby

在創業公司初創伊始,如何選擇合適的技術類型決定了如何進行合理的業務支撐方向。如果你在讀這篇文章之前,更傾向于選擇Java/C#/PHP技術棧,我覺得對于你而言,這篇文章其實對你幫助不大。因為對你而言,這些技術棧意味著更加方便招人,更方便的故障處理資料等等。但是對于一個初創公司選擇合理的小眾語言技術棧而言,我想這篇文章對你也許有一些幫助。

在文章開始之前,我覺得有必要描述一下所謂的小眾語言,這里我在最初進行技術選型時,考察了包括:

  • Python: 你可能在接觸爬蟲、大數據分析等等方面聽過Python的大名,大家都知道Pythonist都習慣說的一句話就是:人生苦短,我用Python。
  • Ruby: 你如果做過Web框架,你遇到最多的是很多人都會提到RoR框架。用過之后只有一個驚嘆了。
  • JavaScript(Nodejs): 有沒有聽過JavaScript全棧工程師?有沒有聽過JavaScript全棧工程師?有沒有聽過JavaScript全棧工程師?
  • Golang: 簡單粗暴的語言,也許你見過很多人跟你吹噓,Golang是下一代的云計算開發語言。

其他語言太過于小眾,考慮到更多的社區支持等等功能,目前不在考慮的范疇內。

小眾語言的劣勢

正所謂知己知彼百戰不殆,在了解一個技術選型之前,最好是研究這些語言的缺點,因為事實上,你最后感覺這個技術選型不適合你的時候,根本的原因是這些劣勢影響了你。

在上面提到的幾個語言中,Python、Ruby、JavaScript是動態語言。關于動態語言的爭議最大的地方是:動態語言到底是否合適進行大型項目。事實上,在某些階段,多人合作,并且大家水平語言不同時,這個時非常大的問題:團隊更多的時間要確保動態語言的準確性上。對于保證一個項目的高可用、低錯誤率時,由于語言的動態特性,對程序開發時的單元測試和后期集成測試的要求更高。由于變量在運行時才會賦予類型含義,因此也很難在靜態檢測過程中發現問題。這樣對測試人員的壓力也會更大,當然如果你沒有合適的測試人員時,這個時候通常會變成,你只測試了理想情況下的成功失敗情況,而對特別異常情況缺少預估。

Python、Ruby語法對程序員而言最大的成本在于需要重新學習一門新的語言。這個學習成本、時間成本通常對初創公司而言通常是支付不起的,哪怕像這些比較容易學習的動態語言而言。另外一個值得一提的是,無論是Python還是Ruby,從長遠看,如果你后續有較大的用戶增長又需要保證用戶體驗時,Python、Ruby的執行效率和吞吐量會有較大的影響。

Python最大的問題是可能和程序員入門的語言差距較大:用4個空格表述程序縮進。這意味著,程序員直接從網上尋找解決方案(拷貝代碼)時成本更高,因為很有可能他需要手工進行代碼格式化,這樣有可能造成程序邏輯的改變。另外一個不得不提的是一些Python庫看似好用,實際上或多或少有有一些坑,這對新手而言,往往是致命的。對應的,Ruby語言本身時不存在這些問題的。然而Ruby最大的問題是,如果選擇RoR框架作為初始的Web框架時,如果沒有一個熟悉RoR框架的人,那么學習RoR框架的成本是特別高的:因為對于一個通用型框架而言,你可能需要更多的特殊場景定制,這可能需要做大量的猴子補丁,這需要對框架有一個比較全面的認識。

JavaScript(后面統一用Nodejs代稱)則借住Nodejs實現了高性能和較大吞吐量。而且從語言層面上,JavaScript對很多程序員并不陌生。然而,在過去的很長時間,真正熟練掌握JavaScript的都是前端工程師,這是一個尷尬的問題。對后端工程師而言,Nodejs需要不同的技術棧,而且大概沒有公司希望一個完全沒有任何后端經驗的前端工程師去接手后端項目的開發的。Nodejs是一個年輕的語言,年輕必然會伴隨一些問題,比如,庫比較少。一些必要的庫需要慢慢尋找。事實上,我也不得不吐槽,可能是開發者水平問題,導致很多npm提供的包,往往或多或少存在一些比較惱人的BUG,這些BUG可能會在你開發過程中,正常運行中出現,而你卻不得不干掉它。對于這種東西,很多時候更快的處理方式是快速的進行修復,然而當你的程序員不具備這種能力的時候,提一個issue到開發者,由開發者進行修復,并且需要等待版本更新到npm源中。很多時候這個過程都是比較尷尬的,尤其是你選擇了一個開發者并不是特別活躍的包。

Golang是一個編譯型語言,語法簡單,似乎一切看起來都是那么的美好。事實上Golang本身還是處于在Google開發維護的階段,本質上雖然語言完全開源了,但是卻不是一個完全社區維護的語言。換句話說,是Google會決定Golang未來的走向。不過好在第三方包都是由社區來驅動的,這樣還是提供了更多的可定制性。另外一個比較煩惱的是Golang本身的包管理機制,事實上,這是完全不存在的。別告訴我你覺得go get完全足夠了,那只是因為你還沒有遇到依賴導致break的問題而已。不過從現在看起碼Google意思到自己的問題,也正在努力改變吧。從前面一個問題也能看出,Golang目前是一個年輕的語言,年輕必然會伴隨一些問題,比如,庫比較少。雖然你可以利用cgo去橋接一些現有的C/C++庫到Golang程序中,但是這部分的代碼維護,涉及到GC的優化處理等各個方面,對開發者的要求其實本身不低。另外一個大家都會抓住講的就是GC問題,在高并發環境下GC的影響從1.5開始下降了很多,但是GC并不像Java一樣更加可控,很多時候還是需要進行代碼層面控制。

上面所有的小眾語言面臨共同的問題,招人。沒錯,找到一個合適的小眾語言工程師是一個痛苦的事情。雖然你可以通過語言的高開發效率去節省人力,但是當你出現人手緊缺的時候,去找一個合適的人替補就變成了一件昂貴的事情。通常你需要從現有的人員中培養則更加靠譜。(慶幸的是,我可以驕傲的說,經過培養后,哪怕我們的移動開發工程師也可以hold住我們現在的后端部分需求。)

如何選擇合適的技術棧

這是一個復雜的問題。選擇合適的技術棧,你需要覆蓋上面我提到的所有的劣勢問題。比如說,你選擇了Nodejs,你就要考慮,你可以hold住所有的難點,你可以修正開源包的問題,甚至你可以解決現在沒有包的難題,OK,那么你選擇這個語言本身是沒有任何問題的。

我在綜合考慮之后,選擇的技術棧比較簡單:Python和Golang。其實選擇的原因很簡單, 這兩種語言我更熟悉 。沒錯,只是這個是第一個理由。為什么會有2個技術棧,這個其實與我們現有的業務狀態和未來發展的思考有關,這個會在后面進行一下介紹。

還有一個問題,我在上上段中提到的問題,厚臉皮的說一下, Python和Golang語言中的絕大部分問題目前都可以自己解決 ,這也是另外一個理由。

接下來,人員培養方面,上面提到的小眾語言大多培訓容易,以現在產品發展節奏和產品演進速度, 我們的人員培養成本目前是可以承受的

使用Python的原因,是 開發更快,從而快速試錯 。利用現有的Web框架,搭配合適的數據庫,我們可以在1-2周內實現一個完整產品的上線,快速試錯。我們針對Python制訂了一系列的標準,用于規范代碼的格式,保證代碼的強壯度。這個可以參考下我之前關于代碼風格要求的文章。

使用Golang的原因, 在于大型長期穩定運行項目的考量 。事實上,我在前面也提到了,在目前的開發過程中,Python在多人協作過程中個人編碼風格、工程性上要更弱、無法控制的內存泄漏等等問題,如果需要長期穩定運行,我更傾向于選擇可以進行編譯的編譯型語言, 通過靜待檢查+動態測試方式,更好的保證程序的強壯型

結語

上面啰里八嗦說了那么多,只是想告誡大家,對小眾語言而言,選擇的機會成本是特別高的。如果你只是驗證試錯,或者你只是想卷一筆錢就跑,小眾語言的高開發效率是絕對可以滿足你的。但是從一個大型工程的角度,你需要通盤考慮小眾語言的劣勢,選擇一個合適的語言作為你的技術棧。

來自: http://ipfans.github.io/2016/01/startup-architecture-language/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!