我是如何從Java轉(zhuǎn)型為Go區(qū)塊鏈工程師

我是如何從Java轉(zhuǎn)型為Go區(qū)塊鏈工程師

本文來自于一個比原鏈核心開發(fā)的陳述

前言

本人在加入比原鏈之前一直是做Java開發(fā)的窄刘,當(dāng)初看到Go還有點(diǎn)猶豫唇敞,還怕過不了面試,結(jié)果是否掌握一門語言的考量確實(shí)沒那么高析既,我順利入職比原鏈韩脑,并在半個月內(nèi)很快掌握Go并能夠進(jìn)行核心項(xiàng)目的開發(fā)。
Java語言在較大的成熟項(xiàng)目上具有優(yōu)勢见坑,但是在區(qū)塊鏈開發(fā)中確實(shí)會有很多短處嚷掠,比如在協(xié)程處理上,還有Java語言本身不夠靈活等等荞驴,當(dāng)然選擇使用Go主要是因?yàn)槠湓趨^(qū)塊鏈的流行程度不皆。

區(qū)塊鏈的流行語言

在區(qū)塊鏈公鏈的開發(fā)圈子里,我們找到了一些流行的編程語言熊楼,有C++霹娄、Golang、Python和最近新起的Rust等等鲫骗。

稍微對比較有名的項(xiàng)目采用的編程語言做個統(tǒng)計犬耻,如下圖:

老一代的公鏈,比如Bitcoin执泰,Litcoin一般使用C/C++較多(我們看看那個時間枕磁,當(dāng)時Go還沒起來呢),新一代的公鏈比如以太坊术吝,聯(lián)盟鏈翹楚超級賬本计济,開始較多使用Go語言,當(dāng)然我們看到Rust的發(fā)展勢頭也很猛排苍,近兩年的很多公鏈比如波卡沦寂,Grin都開始采用Rust語言開發(fā)了。

Go語言的優(yōu)勢

部署簡單

Go 編譯生成的是一個靜態(tài)可執(zhí)行文件淘衙,除了 glibc 外沒有其他外部依賴传藏。這讓部署變得異常方便:目標(biāo)機(jī)器上只需要一個基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具彤守,完全不需要操心應(yīng)用所需的各種包漩氨、庫的依賴關(guān)系,大大減輕了維護(hù)的負(fù)擔(dān)遗增〗芯可直接編譯成機(jī)器碼,不依賴其他庫做修,glibc的版本有一定要求霍狰,部署就是扔一個文件上去就完成了抡草。

性能優(yōu)秀

雖然不如 C 和 Java,但通常比原生 Python 應(yīng)用還是高一個數(shù)量級的蔗坯,適合編寫一些瓶頸業(yè)務(wù)康震。內(nèi)存占用也非常省。

并發(fā)性&通道

Goroutine 和 channel 使得編寫高并發(fā)的服務(wù)端軟件變得相當(dāng)容易宾濒,很多情況下完全不需要考慮鎖機(jī)制以及由此帶來的各種問題腿短。單個 Go 應(yīng)用也能有效的利用多個 CPU 核,并行執(zhí)行的性能好绘梦。

良好的語言設(shè)計

Go 非常簡單橘忱,且易于學(xué)習(xí)。從學(xué)術(shù)的角度講 Go 語言其實(shí)非常平庸卸奉,不支持許多高級的語言特性钝诚;但從工程的角度講,Go 的設(shè)計是非常優(yōu)秀的:規(guī)范足夠簡單靈活榄棵。正是由于 Go 的簡單性凝颇,任何的 Python、Elixir疹鳄、C++拧略、Scala 或者 Java 開發(fā)者皆可在一月內(nèi)組建成一個高效的 Go 團(tuán)隊。

標(biāo)準(zhǔn)庫&工具

Go目前已經(jīng)內(nèi)置了大量的庫瘪弓,特別是網(wǎng)絡(luò)庫非常強(qiáng)大辑鲤。更重要的是 Go 自帶完善的工具鏈,大大提高了團(tuán)隊協(xié)作的一致性杠茬。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風(fēng)格不一致的問題弛随。把編輯器配置成在編輯存檔的時候自動運(yùn)行 gofmt瓢喉,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼舀透。此外還有 gofix, govet 等非常有用的工具栓票。

團(tuán)隊牛逼

Go語言后面的支持者是Google,語言足夠在各種場景下得到檢驗(yàn)愕够,同時創(chuàng)始人還是C語言之父走贪,對后續(xù)的發(fā)展和創(chuàng)新可期。

Go成功的項(xiàng)目

Go語言在云時代得到了比較廣泛的應(yīng)用惑芭,特別是Docker和K8s這樣的殺手級產(chǎn)品的出現(xiàn)讓Go語言在工程界占有一席之地
除此之外Go語言還有非常多的成功運(yùn)行中的軟件:
nsq:bitly開源的消息隊列系統(tǒng)坠狡,性能非常高,目前他們每天處理數(shù)十億條的消息
packer:用來生成不同平臺的鏡像文件遂跟,例如VM逃沿、vbox婴渡、AWS等,作者是vagrant的作者
skynet:分布式調(diào)度框架
Doozer:分布式同步工具凯亮,類似ZooKeeper
Heka:mazila開源的日志處理系統(tǒng)
cbfs:couchbase開源的分布式文件系統(tǒng)
tsuru:開源的PAAS平臺边臼,和SAE實(shí)現(xiàn)的功能一模一樣
groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)
god:類似redis的緩存系統(tǒng),但是支持分布式和擴(kuò)展性
gor:網(wǎng)絡(luò)流量抓包和重放工具

生態(tài)卡位和隱性標(biāo)準(zhǔn)

除了打鐵還需自身硬之外假消,還有些機(jī)遇和運(yùn)勢柠并,讓區(qū)塊鏈選擇的了Go語言。我們來看區(qū)塊鏈2.0以來最成功的公鏈和聯(lián)盟鏈代表富拗,以太坊和超級賬本Fabric臼予,無一例外都選擇使用Go作為開發(fā)語言(雖然以太坊其實(shí)也有其他語言的客戶端版本,但進(jìn)入到Homestead階段以后媒峡,Go客戶端占據(jù)了主導(dǎo)地位)瘟栖,這兩大超級區(qū)塊鏈的影響力可不是一般項(xiàng)目可以比擬的,不僅在生態(tài)中占據(jù)了大的坑位谅阿,事實(shí)上還隱性的制定了區(qū)塊鏈的標(biāo)準(zhǔn)半哟,不論是公鏈中的智能合約,還是聯(lián)盟鏈的技術(shù)签餐,都繞不開以太坊和Fabric寓涨,那么對于一家想要做區(qū)塊鏈技術(shù)選型的公司來說,最快捷的實(shí)現(xiàn)是什么氯檐?自然是直接照搬這兩個項(xiàng)目的創(chuàng)新戒良,再捷徑一點(diǎn)就是直接拿開源代碼改,那么自然Go語言就成為后來者的首選冠摄,換種語言重新實(shí)現(xiàn)一遍難度也不小糯崎,而且如果選擇一些創(chuàng)新但不是非常成熟的語言還會缺失一些特定庫的支持從而導(dǎo)致項(xiàng)目無法開展。

很多人對以太坊的影響力毋庸置疑河泳,但實(shí)際上Fabric在企業(yè)區(qū)塊鏈部署上的影響力更不容小覷:

圖表來源《2019年全球企業(yè)區(qū)塊鏈基準(zhǔn)研究報告》

Hyperledger Fabric是已部署的企業(yè)區(qū)塊鏈網(wǎng)絡(luò)中使用最多的協(xié)議框架沃呢,超級賬本Hyperledger(其中Fabric作為旗艦協(xié)議)是集成商和軟件開發(fā)平臺最常支持的協(xié)議框架,比例達(dá)到了53%拆挥。
而在所有的區(qū)塊鏈技術(shù)書籍里面薄霜,有關(guān)超級賬本的書籍是賣的最為火爆這個事實(shí)也是側(cè)面印證了超級賬本Hyperledger的影響力。

比原鏈在Go語言中的實(shí)踐

在選型編程語言的過程中纸兔,考量了C惰瓜,C++, Java,但C/C++大項(xiàng)目維護(hù)難度大汉矿,而Java又略顯笨重崎坊,此時Go語言已經(jīng)在區(qū)塊鏈項(xiàng)目上大放異彩,也逐漸形成技術(shù)和人才的一個頭部效應(yīng)洲拇,那么順應(yīng)潮流進(jìn)行技術(shù)選型自然也會減少初始比原鏈項(xiàng)目遇到的阻力流强,當(dāng)然在逐漸開發(fā)過程中痹届,我們也感受到了選用Go語言帶來的便利和優(yōu)勢。

Go在區(qū)塊鏈上的一個Case

從技術(shù)上來說打月,區(qū)塊鏈節(jié)點(diǎn)是需要多模塊異步協(xié)同工作的队腐,所以Go語言并發(fā)性和通道就顯得非常有優(yōu)勢,我們看下面交易驗(yàn)證的例子:

func ValidateTxs(txs []*bc.Tx, block *bc.Block) []*ValidateTxResult {
    txSize := len(txs)
    //init the goroutine validate worker
    var wg sync.WaitGroup
    workCh := make(chan *validateTxWork, txSize)
    resultCh := make(chan *ValidateTxResult, txSize)
    closeCh := make(chan struct{})
    for i := 0; i <= validateWorkerNum && i < txSize; i++ {
        wg.Add(1)
        go validateTxWorker(workCh, resultCh, closeCh, &wg)
    }

    //sent the works
    for i, tx := range txs {
        workCh <- &validateTxWork{i: i, tx: tx, block: block}
    }

    //collect validate results
    results := make([]*ValidateTxResult, txSize)
    for i := 0; i < txSize; i++ {
        result := <-resultCh
        results[result.i] = result
    }

    close(closeCh)
    wg.Wait()
    close(workCh)
    close(resultCh)
    return results
}

我們使用Routine+Ch+WaitGroup在30行代碼之內(nèi)奏篙,就可以構(gòu)建一個并發(fā)的驗(yàn)證交易的功能柴淘,在高配置的服務(wù)器的情況下,可以跑出10萬以上的TPS秘通。

輕松變成Go語言大師

我當(dāng)初進(jìn)入比原之前也沒有做過Go語言開發(fā)为严,但都能夠很快上手,基本在半個月內(nèi)能夠參與核心代碼的開發(fā)和維護(hù)了(對于從C/C++/Java有經(jīng)驗(yàn)的開發(fā)者尤其快速)肺稀,這就是語言簡單對團(tuán)隊構(gòu)建帶來的好處第股。

統(tǒng)一的協(xié)作

從協(xié)作上來說,通過gofmt 自動排版 Go 代碼话原,能夠讓核心團(tuán)隊成員甚至社區(qū)開發(fā)者提交的代碼風(fēng)格的差異性降到最小夕吻,提升項(xiàng)目的整體質(zhì)量和可維護(hù)性。

小結(jié)

Go語言本身的特質(zhì)和優(yōu)勢為其做好了鋪墊繁仁,而以太坊和超級賬本兩個超級區(qū)塊鏈項(xiàng)目的加持也讓Go語言成為了很多區(qū)塊鏈項(xiàng)目的首選涉馅,比原鏈選用Go語言也充分體會到了其開發(fā)區(qū)塊鏈底層的優(yōu)勢,但是無需落入語言之爭的陷阱黄虱,講求實(shí)用主義才是做工程應(yīng)有之義稚矿,比原鏈核心項(xiàng)目是用Go語言完成,但是周邊的很多子項(xiàng)目也有用Java捻浦,Python或者JavaScript實(shí)現(xiàn)晤揣,畢竟生態(tài)的多樣性才是一個項(xiàng)目長久的根本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱灿,一起剝皮案震驚了整個濱河市昧识,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌母剥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形导,死亡現(xiàn)場離奇詭異环疼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)朵耕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門炫隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阎曹,你說我怎么就攤上這事伪阶∩烽荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵栅贴,是天一觀的道長斟湃。 經(jīng)常有香客問我,道長檐薯,這世上最難降的妖魔是什么凝赛? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮坛缕,結(jié)果婚禮上墓猎,老公的妹妹穿的比我還像新娘。我一直安慰自己赚楚,他們只是感情好毙沾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宠页,像睡著了一般左胞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勇皇,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天罩句,我揣著相機(jī)與錄音,去河邊找鬼敛摘。 笑死门烂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兄淫。 我是一名探鬼主播屯远,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捕虽!你這毒婦竟也來了慨丐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泄私,失蹤者是張志新(化名)和其女友劉穎房揭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晌端,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捅暴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咧纠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓬痒。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漆羔,靈堂內(nèi)的尸體忽然破棺而出梧奢,到底是詐尸還是另有隱情狱掂,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布亲轨,位于F島的核電站趋惨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓶埋。R本人自食惡果不足惜希柿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望养筒。 院中可真熱鬧曾撤,春花似錦、人聲如沸晕粪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巫湘。三九已至装悲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尚氛,已是汗流浹背诀诊。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阅嘶,地道東北人属瓣。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像讯柔,于是被迫代替她去往敵國和親抡蛙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 我們?yōu)橄MM快學(xué)習(xí)Hyperledger fabric 的java工程師上線了一門教程Fabric java 區(qū)塊...
    編程狂魔閱讀 3,482評論 0 2
  • 如果你關(guān)注區(qū)塊鏈技術(shù)長達(dá)幾個月魂迄,可能也會跟我一樣粗截,對沒完沒了的原理介紹、前景描繪捣炬、行業(yè)探討和鏈圈新聞產(chǎn)生了審美疲勞...
    yuyangray閱讀 760評論 0 4
  • 區(qū)塊鏈允許數(shù)據(jù)提供者和消費(fèi)者直接在單個開放系統(tǒng)中交易信息熊昌,而不是訂閱世界各地的數(shù)十個集中服務(wù),并編寫他們的軟件來與...
    編程狂魔閱讀 1,481評論 0 1
  • 我喜歡坐公交湿酸,特別是從始發(fā)站到終點(diǎn)站那種時間長的 坐在車上婿屹,望著窗外,世界是動的稿械,我是靜止的 或是想著近期工作上的...
    冬影閱讀 475評論 0 0
  • 生平第一次选泻,有了那么想要靠近的一個人冲粤,羨慕美莫,渴望页眯,向往… 是姥姥家那邊的一個小妹妹。 她很喜歡看書厢呵,我很喜歡的還有...
    貪吃少女怪物閱讀 134評論 0 2