坦白的講,在一幫python用戶面前講為什么放棄python轉(zhuǎn)而用go其實(shí)是一件壓力蠻大的事情,語言之爭(zhēng)就跟vim和emacs之爭(zhēng)一樣,是
成都創(chuàng)新互聯(lián)公司專注于東明網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供東明營(yíng)銷型網(wǎng)站建設(shè),東明網(wǎng)站制作、東明網(wǎng)頁(yè)設(shè)計(jì)、東明網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造東明網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供東明網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
一個(gè)永恒的無解話題,稍微不注意就可能導(dǎo)致粉絲強(qiáng)烈地反擊。所以我只會(huì)從我們項(xiàng)目實(shí)際情況出發(fā),來講講為什么我最終選擇了go。
為什么放棄python
首先,我其實(shí)得說說為什么我們會(huì)選擇python。在我加入企業(yè)快盤團(tuán)隊(duì)之前,整個(gè)項(xiàng)目包括更早的金山快盤都是采用python進(jìn)行開發(fā)的。至于為
什么這么選擇,當(dāng)時(shí)的架構(gòu)師蔥頭告訴我,主要是因?yàn)閜ython上手簡(jiǎn)單,開發(fā)迅速。對(duì)于團(tuán)隊(duì)里面大部分完全沒服務(wù)端開發(fā)經(jīng)驗(yàn)的同學(xué)來說,python真
的是一個(gè)很好的選擇。
python的簡(jiǎn)單高效,我是深有體會(huì)的。當(dāng)時(shí)私有云項(xiàng)目也就幾個(gè)程序員,但是我們要服務(wù)多家大型企業(yè),進(jìn)行定制化的開發(fā),多虧了python,我們才能快速出活。后來企業(yè)快盤掛掉之后,我們啟動(dòng)輕辦公項(xiàng)目,自然也使用python進(jìn)行了原始版本的構(gòu)建。
python雖然很強(qiáng)大,但我們?cè)谑褂玫臅r(shí)候也碰到了一些問題,主要由如下幾個(gè)方面:
動(dòng)態(tài)語言
python是一門動(dòng)態(tài)強(qiáng)類型語言。但是,仍然可能出現(xiàn)int + string這樣的運(yùn)行時(shí)錯(cuò)誤,因?yàn)閷?duì)于一個(gè)變量,在寫代碼的時(shí)候,我們有時(shí)候很容易就忘記這個(gè)變量到底是啥類型的了。
在python里面,可以允許同名函數(shù)的出現(xiàn),后一個(gè)函數(shù)會(huì)覆蓋前一個(gè)函數(shù),有一次我們系統(tǒng)一個(gè)很嚴(yán)重的錯(cuò)誤就是因?yàn)檫@個(gè)導(dǎo)致的。
上面說到的這些,靜態(tài)語言在編譯的時(shí)候就能幫我們檢測(cè)出來,而不需要等到運(yùn)行時(shí)出問題才知道。雖然我們有很完善的測(cè)試用例,但總有case遺漏的情況。所以每次出現(xiàn)運(yùn)行時(shí)錯(cuò)誤,我心里都想著如果能在編譯的時(shí)候就發(fā)現(xiàn)該多好。
性能
其實(shí)這個(gè)一直是很多人吐槽python的地方,但python有它適合干的事情,硬是要用python進(jìn)行一些高性能模塊的開發(fā),那也有點(diǎn)難為它了。
python的GIL導(dǎo)致無法真正的多線程,大家可能會(huì)說我用多進(jìn)程不就完了。但如果一些計(jì)算需要涉及到多進(jìn)程交互,進(jìn)程之間的通訊開銷也是不得不考慮的。
無狀態(tài)的分布式處理使用多進(jìn)程很方便,譬如處理http請(qǐng)求,我們就是在nginx后面掛載了200多個(gè)django server來處理http的,但這么多個(gè)進(jìn)程自然導(dǎo)致整體機(jī)器負(fù)載偏高。
但即使我們使用了多個(gè)django進(jìn)程來處理http請(qǐng)求,對(duì)于一些超大量請(qǐng)求,python仍然處理不過來。所以我們使用openresty,將高頻次的http請(qǐng)求使用lua來實(shí)現(xiàn)??蛇@樣又導(dǎo)致使用兩種開發(fā)語言,而且一些邏輯還得寫兩份不同的代碼。
同步網(wǎng)絡(luò)模型
django的網(wǎng)絡(luò)是同步阻塞的,也就是說,如果我們需要訪問外部的一個(gè)服務(wù),在等待結(jié)果返回這段時(shí)間,django不能處理任何其他的邏輯(當(dāng)然,多線程的除外)。如果訪問外部服務(wù)需要很長(zhǎng)時(shí)間,那就意味著我們的整個(gè)服務(wù)幾乎在很長(zhǎng)一段時(shí)間完全不可用。
為了解決這個(gè)問題,我們只能不斷的多開django進(jìn)程,同時(shí)需要保證所有服務(wù)都能快速的處理響應(yīng),但想想這其實(shí)是一件很不靠譜的事情。
異步網(wǎng)絡(luò)模型
tornado的網(wǎng)絡(luò)模型是異步的,這意味著它不會(huì)出現(xiàn)django那樣因?yàn)橥獠糠?wù)不可用導(dǎo)致這個(gè)服務(wù)無法響應(yīng)的問題。話說,比起django,我可是非常喜歡tornado的,小巧簡(jiǎn)單,以前還寫過幾篇深入剖析tornado的文章了。
雖然tornado是異步的,但是python的mysql庫(kù)都不支持異步,這也就意味著如果我們?cè)趖ornado里面訪問數(shù)據(jù)庫(kù),我們?nèi)匀豢赡苊媾R因?yàn)閿?shù)據(jù)庫(kù)問題造成的整個(gè)服務(wù)不可用。
其實(shí)異步模型最大的問題在于代碼邏輯的割裂,因?yàn)槭鞘录|發(fā)的,所以我們都是通過callback進(jìn)行相關(guān)處理,于是代碼里面就經(jīng)常出現(xiàn)干一件事情,傳一個(gè)callback,然后callback里面又傳callback的情況,這樣的結(jié)果就是整個(gè)代碼邏輯非?;靵y。
python沒有原生的協(xié)程支持,雖然可以通過gevent,greenlet這種的上patch方式來支持協(xié)程,但畢竟更改了python源碼。另
外,python的yield也可以進(jìn)行簡(jiǎn)單的協(xié)程模擬,但畢竟不能跨堆棧,局限性很大,不知道3.x的版本有沒有改進(jìn)。
開發(fā)運(yùn)維部署
當(dāng)我第一次使用python開發(fā)項(xiàng)目,我是沒成功安裝上項(xiàng)目需要的包的,光安裝成功mysql庫(kù)就弄了很久。后來,是一位同事將他整個(gè)python目錄打包給我用,我才能正常的將項(xiàng)目跑起來。話說,現(xiàn)在有了docker,是多么讓人幸福的一件事情。
而部署python服務(wù)的時(shí)候,我們需要在服務(wù)器上面安裝一堆的包,光是這一點(diǎn)就讓人很麻煩,雖然可以通過puppet,salt這些自動(dòng)化工具解決部署問題,但相比而言,靜態(tài)編譯語言只用扔一個(gè)二進(jìn)制文件,可就方便太多了。
代碼失控
python非常靈活簡(jiǎn)單,寫c幾十行代碼才能搞定的功能,python一行代碼沒準(zhǔn)就能解決。但是太簡(jiǎn)單,反而導(dǎo)致很多同學(xué)無法對(duì)代碼進(jìn)行深層次的思
考,對(duì)整個(gè)架構(gòu)進(jìn)行細(xì)致的考量。來了一個(gè)需求,啪啪啪,鍵盤敲完開速實(shí)現(xiàn),結(jié)果就是代碼越來越混亂,最終導(dǎo)致了整個(gè)項(xiàng)目代碼失控。
雖然這也有我們自身的原因,譬如沒好的代碼review機(jī)制,沒有好的項(xiàng)目規(guī)范,但個(gè)人感覺,如果一個(gè)程序員沒經(jīng)過良好的編碼訓(xùn)練,用python很容易就寫出爛的代碼,因?yàn)樘杂闪恕?/p>
當(dāng)然,我這里并不是說用python無法進(jìn)行大型項(xiàng)目的開發(fā),豆瓣,dropbox都是很好的例子,只是在我們項(xiàng)目中,我們的python代碼失控了。
上面提到的都是我們?cè)趯?shí)際項(xiàng)目中使用python遇到的問題,雖然最終都解決了,但是讓我愈發(fā)的覺得,隨著項(xiàng)目復(fù)雜度的增大,流量性能壓力的增大,python并不是一個(gè)很好的選擇。
為什么選擇go
說完了python,現(xiàn)在來說說為什么我們選擇go。其實(shí)除了python,我們也有其他的選擇,java,php,lua(openresty),但最終我們選擇了go。
雖然java和php都是最好的編程語言(大家都這么爭(zhēng)的),但我更傾向一門更簡(jiǎn)單的語言。而openresty,雖然性能強(qiáng)悍,但lua仍然是動(dòng)
態(tài)語言,也會(huì)碰到前面說的動(dòng)態(tài)語言一些問題。最后,前金山許式偉用的go,前快盤架構(gòu)師蔥頭也用的go,所以我們很自然地選擇了go。
go并不是完美,一堆值得我們吐槽的地方。
error,好吧,如果有語言潔癖的同學(xué)可能真的受不了go的語法,尤其是約定的最后一個(gè)返回值是error。項(xiàng)目里面經(jīng)常會(huì)充斥這樣的代碼:
if _, err := w.Write(data1); err != nil {
returun err
}
if _, err := w.Write(data2); err != nil {
returun err
}
難怪有個(gè)梗是對(duì)于一個(gè)需求,java的程序員在寫配置的時(shí)候,go程序員已經(jīng)寫了大部分代碼,但是當(dāng)java的程序員寫完的時(shí)候,go程序員還在寫err != nil。
這方面,errors-are-values倒是推薦了一個(gè)不錯(cuò)的解決方案。
包管理,go的包管理太弱了,只有一個(gè)go
get,也就是如果不小心更新了一個(gè)外部庫(kù),很有可能就導(dǎo)致現(xiàn)有的代碼編譯不過了。雖然已經(jīng)有很多開源方案,譬如godep以及現(xiàn)在才出來的gb等,但畢
竟不是官方的。貌似google也是通過vendor機(jī)制來管理第三方庫(kù)的。希望go 1.5或者之后的版本能好好處理下這個(gè)問題。
GC,java的GC發(fā)展20年了,go才這么點(diǎn)時(shí)間,gc鐵定不完善。所以我們?nèi)匀徊荒茈S心所欲的寫代碼,不然在大請(qǐng)求量下面gc可能會(huì)卡頓整個(gè)服務(wù)。所以有時(shí)候,該用對(duì)象池,內(nèi)存池的一定要用,雖然代碼丑了點(diǎn),但好歹性能上去了。
泛型,雖然go有inteface,但泛型的缺失會(huì)讓我們?cè)趯?shí)現(xiàn)一個(gè)功能的時(shí)候?qū)懘罅康闹貜?fù)代碼,譬如int32和int64類型的sort,我們
得為分別寫兩套代碼,好冗余。go 1.4之后有了go
generate的支持,但這種的仍然需要自己根據(jù)go的AST庫(kù)來手動(dòng)寫相關(guān)的parser,難度也挺大的。雖然也有很多開源的generate實(shí)現(xiàn),
但畢竟不是官方的。
當(dāng)然還有很多值得吐槽的地方,就不一一列舉了,但是go仍舊有它的優(yōu)勢(shì)。
靜態(tài)語言,強(qiáng)類型。靜態(tài)編譯能幫我們檢查出來大量的錯(cuò)誤,go的強(qiáng)類型甚至變態(tài)到不支持隱式的類型轉(zhuǎn)換。雖然寫代碼感覺很別扭,但減少了犯錯(cuò)的可能。
gofmt,應(yīng)該這是我知道的第一個(gè)官方提供統(tǒng)一格式化代碼工具的語言了。有了gofmt,大家的代碼長(zhǎng)一個(gè)樣了,也就沒有花括號(hào)到底放到結(jié)尾還是新開一行這種蛋疼的代碼風(fēng)格討論了。因?yàn)榇蠹业拇a風(fēng)格一樣,所以看go的代碼很容易。
天生的并行支持,因?yàn)間oroutine以及channel,用go寫分布式應(yīng)用,寫并發(fā)程序異常的容易。沒有了蛋疼的callback導(dǎo)致的代碼邏輯割裂,代碼邏輯都是順序的。
性能,go的性能可能趕不上c,c++以及openresty,但真的也挺強(qiáng)悍的。在我們的項(xiàng)目中,現(xiàn)在單機(jī)就部署了一個(gè)go的進(jìn)程,就完全能夠勝任以前200個(gè)python進(jìn)程干的事情,而且CPU和MEM占用更低。
運(yùn)維部署,直接編譯成二進(jìn)制,扔到服務(wù)器上面就成,比python需要安裝一堆的環(huán)境那是簡(jiǎn)單的太多了。當(dāng)然,如果有cgo,我們也需要將對(duì)應(yīng)的動(dòng)態(tài)庫(kù)給扔過去。
開發(fā)效率,雖然go是靜態(tài)語言,但我個(gè)人感覺開發(fā)效率真的挺高,直覺上面跟python不相上下。對(duì)于我個(gè)人來說,最好的例子就是我用go快速開
發(fā)了非常多的開源組件,譬如ledisdb,go-mysql等,而這些最開始的版本都是在很短的時(shí)間里面完成的。對(duì)于我們項(xiàng)目來說,我們也是用go在一
個(gè)月就重構(gòu)完成了第一個(gè)版本,并發(fā)布。
目前在國(guó)內(nèi)是無法登錄Dropbox,需要借助代理訪問??梢赃x擇類似Dropbox的軟件
在功能上 和Dropbox比較類似的是堅(jiān)果云。
同步功能
當(dāng)你手機(jī)拍攝了照片想存到電腦里要怎么做?
傳統(tǒng)點(diǎn)就是手機(jī)用數(shù)據(jù)線連接電腦,找到照片復(fù)制到電腦。
有點(diǎn)科技感的可能是把手機(jī)用微信文件傳輸助手發(fā)到電腦上,電腦上另存為??瓷先o線了,但是其中還有點(diǎn)開電腦微信、掃碼登錄、另存為選擇路徑等步驟。
體驗(yàn)最好的操作是打開堅(jiān)果云App,上傳照片,手機(jī)上傳成功的那一刻電腦端彈出提示,IMG.XXX已經(jīng)同步完成。照片已經(jīng)在電腦里了。
這就是同步功能,一個(gè)設(shè)備文件變動(dòng),多個(gè)設(shè)備同步變動(dòng)。
2.歷史版本
對(duì)于很多設(shè)計(jì)師、文案等職業(yè)來說,工作文件是不可能一稿過的,領(lǐng)導(dǎo)必然有各種修改意見。
每次辛苦修改完還要另存為重新加上版本號(hào),最后完稿的文件才10MB,背后的歷史版本達(dá)到幾百M(fèi)B??删退闶峭瓿闪?,這些歷史版本也不敢刪,誰知道明天老板想什么?
如果你用堅(jiān)果云同步這份文件,你的每次保存堅(jiān)果云都會(huì)自動(dòng)同步,同時(shí),將之前的版本保存在云端,支持下載任一版本和比較版本。歷史版本不限制數(shù)量,保存一定時(shí)間內(nèi)所有的歷史版本。你盡管修改。
3.增量同步
Dropbox Professional版本才有的功能,他們叫智能同步。堅(jiān)果云無論付費(fèi)免費(fèi),所有用戶都可以使用。
增量同步通能就是,假如你Word文件大小為10MB,已同步到堅(jiān)果云。你打開Word修改了一個(gè)字。一般網(wǎng)盤軟件因?yàn)槲募兓藭?huì)將這10MB的文件重新完整上傳,增量同步則是只上傳因?yàn)樾薷倪@一個(gè)字而發(fā)生變動(dòng)的數(shù)據(jù),可能也就幾KB吧。
如果你想進(jìn)入軟件和互聯(lián)網(wǎng)行業(yè), 恭喜, 這是個(gè)好行業(yè), 薪水很高, 也不需靠關(guān)系, 一切靠實(shí)力說話
目前對(duì)吃香的IT 行業(yè)top榜給你參考一下:
1、Java開發(fā)
隨著現(xiàn)代經(jīng)濟(jì)和科技的發(fā)展,中國(guó)Java編程開發(fā)語言行業(yè)已經(jīng)步入了一個(gè)高速發(fā)展的時(shí)代。
大家有目共睹了Java編程語言發(fā)展的迅猛,每年的Java人才缺口人數(shù)都高達(dá)百萬以上,而且隨著行業(yè)發(fā)展,Java技術(shù)服務(wù)市場(chǎng)需求空缺會(huì)越來越大。精通Java技術(shù),將擁有更多的就業(yè)選擇。
2、python
python的發(fā)展可以用飛速來形容了,目前業(yè)內(nèi)幾乎所有大中型互聯(lián)網(wǎng)企業(yè)都在使用Python,如:Youtube、Dropbox、BT、Quora(中國(guó)知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團(tuán)等。
政府報(bào)告中多次提及到的人工智能,就是用Python語言編寫的。目前,浙江、北京以及另外幾個(gè)省市已經(jīng)確定將把Python編程基礎(chǔ)納入信息技術(shù)的課程。
python有哪些優(yōu)勢(shì)呢?
簡(jiǎn)單易學(xué)、高層語言、免費(fèi)開源、可移植性強(qiáng)、豐富的庫(kù)、面向?qū)ο?、可擴(kuò)展性、可嵌入型、規(guī)范的代碼等,這些都是Python的優(yōu)勢(shì)所在。
Python是解釋語言,程序?qū)懫饋矸浅7奖悖议_發(fā)生態(tài)成熟,有很多現(xiàn)有庫(kù)可以用。
3、大數(shù)據(jù)
經(jīng)過六年沉淀,中國(guó)的大數(shù)據(jù)行業(yè)也迎來了新的發(fā)展期,勢(shì)頭迅猛。幾乎所有人的生活和工作都離不開大數(shù)據(jù)。
4、人工智能
隨著5G時(shí)代的到來,人工智能正逐步滲透進(jìn)人們生活的方方面面,人工智能已經(jīng)成為對(duì)人類生活方式產(chǎn)生最大影響的行業(yè),也是各企業(yè)爭(zhēng)搶的熱點(diǎn)。
大方向上來說,目前人工智能已經(jīng)在各行各業(yè)得到了廣泛的應(yīng)用,從硬件到軟件,部分成型的產(chǎn)品已經(jīng)面世;未來還將逐漸滲透到工作、學(xué)習(xí)和生活中的每一個(gè)場(chǎng)景。人工智能將改變商業(yè)格局,人工智能專業(yè)人員預(yù)計(jì)將獲得 30 萬至 50 萬美元的薪水。
5、HTML5大前端
游戲化、場(chǎng)景化、跨屏互動(dòng)HTML5技術(shù)滿足了廣告主對(duì)移動(dòng)營(yíng)銷的大部分需求,從形式到功用、到傳播。
6、網(wǎng)絡(luò)安全
隨著信息化的快速發(fā)展,網(wǎng)絡(luò)/信息安全問題更加突出,對(duì)網(wǎng)絡(luò)/信息安全人才建設(shè)不斷提出新的要求,再加上近幾年國(guó)家對(duì)網(wǎng)絡(luò)安全問題的重視,網(wǎng)絡(luò)安全/信息安全專業(yè)就業(yè)前景非常廣闊。
7、Unity游戲開發(fā)
作為專業(yè)游戲引擎,Unity游戲開發(fā)技術(shù)在近幾年網(wǎng)絡(luò)游戲大熱的環(huán)境下,大受歡迎。
8、云計(jì)算
目前,云服務(wù)器正在全球范圍內(nèi)逐步取代傳統(tǒng)服務(wù)器,云計(jì)算和云服務(wù)器的發(fā)展也使中國(guó)成為全球服務(wù)器大國(guó)。
9、全鏈路UI/UE設(shè)計(jì)
隨著人們對(duì)互聯(lián)網(wǎng)產(chǎn)品用戶體驗(yàn)度的提升,以及對(duì)外觀審美的提高,各大企業(yè)對(duì)UI設(shè)計(jì)師的需求不斷提升。
10、物聯(lián)網(wǎng)
5G融入智能物聯(lián)網(wǎng)技術(shù),進(jìn)入萬物互聯(lián)時(shí)代,物聯(lián)網(wǎng)風(fēng)暴席卷全球,BAT、谷歌、移動(dòng)、聯(lián)通等等世界互聯(lián)網(wǎng)巨頭紛紛搶占這一高地。
11、互聯(lián)網(wǎng)營(yíng)銷
全民營(yíng)銷時(shí)代,營(yíng)銷無處不在,內(nèi)容營(yíng)銷與事件營(yíng)銷顯現(xiàn)出巨大優(yōu)勢(shì),成為任何企業(yè)都非??粗氐闹攸c(diǎn)。
12、GO語言開發(fā)
作為區(qū)塊鏈熱門編程語言,Go語言目前已成為政策重點(diǎn)扶持對(duì)象。京東、小米、美團(tuán)、滴滴、新浪、網(wǎng)易等等企業(yè)應(yīng)用層出不窮。
說了這么多職業(yè)方向, 你會(huì)發(fā)現(xiàn), 絕大多數(shù)都要求懂一定的技術(shù),對(duì)于想學(xué)習(xí)什么,就要看你自己的興趣,以及工作城市對(duì)于崗位薪資的要求,可以參考這些選擇學(xué)習(xí)的方向。希望我的回答對(duì)你有多幫助。
可以的。Go語言作為一種全新的編程語言,它具有強(qiáng)大的數(shù)據(jù)處理能力,并支持各種數(shù)據(jù)庫(kù)的調(diào)用、快速處理和分析大量數(shù)據(jù),因此go語言是開發(fā)大數(shù)據(jù)腳本的首選之一。