成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

作為一名Java程序員,我為什么不在生產(chǎn)項(xiàng)目中轉(zhuǎn)向Go

開(kāi)發(fā) 后端
那么問(wèn)題來(lái)了,業(yè)余時(shí)間好學(xué)是一回事,真正要將一個(gè)新東西運(yùn)用到生產(chǎn)中則是另一回事。JavaScript的開(kāi)發(fā)者可以義無(wú)反顧地選擇Node.js,但是對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),在下一個(gè)大項(xiàng)目里究竟是該選擇Go,還是Java呢?

自Google在2009年發(fā)布Go語(yǔ)言的第一個(gè)正式版之后,這門語(yǔ)言就以出色的語(yǔ)言特性受到大家的追捧,尤其是在需要高并發(fā)的場(chǎng)景下,大家都會(huì)想到是不是該用Go。隨后,在國(guó)內(nèi)涌現(xiàn)出了一批以七牛為代表的使用Go作為主要語(yǔ)言的團(tuán)隊(duì),而許世偉大神本人也在各種場(chǎng)合下極力推動(dòng)Go在國(guó)內(nèi)的發(fā)展,于是在這種大環(huán)境下,中國(guó)的Go開(kāi)發(fā)者群體逐漸超越了其他地區(qū)

那么問(wèn)題來(lái)了,業(yè)余時(shí)間好學(xué)是一回事,真正要將一個(gè)新東西運(yùn)用到生產(chǎn)中則是另一回事。JavaScript的開(kāi)發(fā)者可以義無(wú)反顧地選擇Node.js,但是對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),在下一個(gè)大項(xiàng)目里究竟是該選擇Go,還是Java呢?

鄭重聲明:本文并不是來(lái)探討Go或者Java誰(shuí)是更好的語(yǔ)言,每種語(yǔ)言都有自己的設(shè)計(jì)哲學(xué)和適用場(chǎng)景,今天主要是在探討實(shí)際工程中的選擇和權(quán)衡的問(wèn)題,所以請(qǐng)不要上綱上線。 

語(yǔ)言本身

首先,需要說(shuō)明一下,作為一個(gè)技術(shù)決策者,在進(jìn)行技術(shù)選型時(shí)并不能單方面地根據(jù)語(yǔ)言本身的特點(diǎn)直接下結(jié)論。實(shí)際情況下,大多數(shù)人會(huì)使用一系列的框 架、庫(kù)及工具,簡(jiǎn)而言之就是會(huì)考慮很多周邊生態(tài)環(huán)境的因素,同時(shí)還要結(jié)合公司的特點(diǎn)、各種歷史問(wèn)題和實(shí)際客觀因素等等一系列的考慮點(diǎn)綜合下來(lái)才能完成決 策。所以,接下來(lái)我們先從語(yǔ)言開(kāi)始,一步一步來(lái)分析下在你的項(xiàng)目中選擇Go是否合適。

Go在高并發(fā)編程方面無(wú)疑是出眾的,通過(guò)goroutine從語(yǔ)言層面支持了協(xié)程,這是Java等語(yǔ)言所無(wú)法比擬的,這也是大多數(shù)人在面對(duì)高并發(fā)場(chǎng)景選擇Go的重要原因之一。雖然Java有Kilim之類的框架,但沒(méi)有語(yǔ)言層的支持始終稍遜一籌。

除此之外,Go的其他語(yǔ)法也很有趣,比如多返回值,在一定程度上為開(kāi)發(fā)者帶來(lái)了一定的便利性。試想,為了返回兩到三個(gè)值,不得不封裝一個(gè)對(duì)象,或者抹去業(yè)務(wù)名稱使用MapList等集合類,高級(jí)一點(diǎn)用Apache的PairTriple,雖然可行,但始終不如Go的實(shí)現(xiàn)來(lái)得優(yōu)雅。在此之上,Go也統(tǒng)一了異常的返回方式,不用再去糾結(jié)是通過(guò)拋異常還是錯(cuò)誤碼來(lái)判斷是否成功,多返回值的最后一個(gè)是Error就行了。 

Go在語(yǔ)言的原生類型中支持了常用的一些結(jié)構(gòu),比如mapslice,而其他語(yǔ)言中它們更多是存在于庫(kù)中,這也體現(xiàn)了這門語(yǔ)言是從實(shí)踐角度出發(fā)的特點(diǎn),既然人人都需要,為什么不在語(yǔ)言層面支持它呢。函數(shù)作為一等公民出現(xiàn)在了Go語(yǔ)言里,不過(guò)Java在最近的Java 8中也有了Lambda表達(dá)式,也算是有進(jìn)步了。

其他的一些特性,則屬于錦上添花型的,比如不定參數(shù),早在2004年的Java 1.5中就對(duì)varargs有支持了;多重賦值在Ruby中也有出現(xiàn),但除了多返回值賦值,以及讓你在變量交換值時(shí)少寫一個(gè)中間變量,讓代碼更美觀一些之外,其他的作用著實(shí)不是怎么明顯。

說(shuō)了這么多Go的優(yōu)點(diǎn),當(dāng)然它也有一些問(wèn)題,比如GC,說(shuō)到它,Java不得不露出潔白的牙齒,雖然在大堆GC上G1還有些不盡如人意,但Java的GC已經(jīng)發(fā)展了很多年,各種策略也比較成熟,CMS或G1足以應(yīng)付大多數(shù)場(chǎng)景,實(shí)在有要求還能用Azul Zing JVM。不過(guò)從最新的Go 1.5的消息來(lái)看,Go的GC實(shí)現(xiàn)有了很大地提升,順便一提的是GOMAXPROCS默認(rèn)也從1變成了CPU核數(shù),看來(lái)官方對(duì)Go在多核的利用方面更有信心了。

許世偉在《Go 語(yǔ)言編程》的前言中預(yù)言未來(lái)10年,Go會(huì)取代Java,位居編程榜之首,當(dāng)時(shí)是2012年,為了看看2009年TIOBE年度編程語(yǔ)言如今的排名,筆者在撰寫本文時(shí)特意去TIOBE看了下,最近的2015年8月排行榜,Java以19.274%位居榜首,Go已經(jīng)跌出了前50,這不禁讓人有些意外。

但總體上來(lái)說(shuō),筆者認(rèn)為Go在語(yǔ)言層面的表現(xiàn)還是相當(dāng)出色的,解決了一些編程中的痛點(diǎn),學(xué)習(xí)曲線也能夠接受,特別是對(duì)于那些有C/C++背景的人,會(huì)感覺(jué)十分親切。

工程問(wèn)題

一個(gè)人寫代碼時(shí)可以很隨性,想怎么寫就怎么寫,但當(dāng)一個(gè)人變成一個(gè)團(tuán)隊(duì)后,這種隨性或者說(shuō)隨便就會(huì)帶來(lái)很多問(wèn)題,于是就誕生了編碼規(guī)范這玩意兒,大廠基本都有自己的編碼規(guī)范,比如Google就有針對(duì)不下十種編程語(yǔ)言的規(guī)范。團(tuán)隊(duì)內(nèi)約定一套編碼規(guī)范能夠很大程度上地確保代碼的風(fēng)格,降低閱讀溝通的成本。Go內(nèi)置了一套編碼規(guī)范,違反了該規(guī)范代碼就無(wú)法編譯通過(guò),可以說(shuō)只要你是寫Go的,那你的代碼就不會(huì)太難看,當(dāng)然Go也沒(méi)有把所有東西就強(qiáng)制死,還有一些推薦的規(guī)范可以通過(guò)gofmt進(jìn)行格式化,但這步不是必須的。

雖然Go自己解決了這個(gè)問(wèn)題,但并不能說(shuō)Java在這方面是空白,Java發(fā)展至今周邊工具無(wú)數(shù),并不缺成熟的代碼靜態(tài)分析工具,比如CheckStylePMDFindBugs, 它們不僅能掃描編碼規(guī)范的問(wèn)題,甚至還能掃描代碼中潛在的問(wèn)題并給出解決方案,并且使用方便,在Java開(kāi)發(fā)者社區(qū)中有很高地接受度,應(yīng)該說(shuō)大多數(shù)靠譜地 開(kāi)發(fā)者都會(huì)使用這些工具。除此之外,一些大廠也有自己的強(qiáng)制手段,比如百度內(nèi)部也有很多語(yǔ)言的編碼規(guī)范,而且大部分情況下如果沒(méi)有通過(guò)編碼規(guī)范的掃描,你 是無(wú)法提交代碼的;還有一些公司會(huì)在持續(xù)集成過(guò)程中加入代碼掃描,有FindBugs高優(yōu)先級(jí)的問(wèn)題時(shí)必須修復(fù)才能進(jìn)入下一個(gè)階段。所以說(shuō)Go在這個(gè)問(wèn)題 上的優(yōu)勢(shì)并不明顯,或者說(shuō)在一個(gè)成熟的環(huán)境下,這只是合格而已。

這里需要強(qiáng)調(diào)筆者的一個(gè)觀點(diǎn):

Go在語(yǔ)言本身和發(fā)行包中融入了很多最佳實(shí)踐,正是這些前人的經(jīng)驗(yàn)才讓它看起來(lái)如此優(yōu)秀。拿這么個(gè)海陸空混編特種部隊(duì)去和Java、C、Ruby這些語(yǔ)言本身做對(duì)比,顯得不太公平,所以本文在考慮問(wèn)題時(shí)都會(huì)結(jié)合語(yǔ)言及其生態(tài)圈中的成員,畢竟這才更接近真實(shí)的情況。

Go本身對(duì)項(xiàng)目結(jié)構(gòu)有一套約定,代碼放哪里,測(cè)試文件如何命名,編譯打包后的結(jié)果輸出到哪個(gè)目錄,甚至還有go cover這種統(tǒng)計(jì)測(cè)試覆蓋率的命令行,開(kāi)發(fā)者不用在這些問(wèn)題上太過(guò)糾結(jié),再一次體現(xiàn)了Go注重工程實(shí)踐的特點(diǎn)。回過(guò)頭來(lái),Java方面,MavenGradle都是注重于工程生命周期管理的工具,而且Maven更是歷史悠久,被廣泛用于各種項(xiàng)目之中。以Maven為例,不僅能夠?qū)崿F(xiàn)上述所有功能,還有很強(qiáng)的插件擴(kuò)展能力,這里需要的只是一次性維護(hù)好pom.xml文件就行了,由于Maven的使用群很大,網(wǎng)上有大量的范例,甚至還有很多生成工程的工具和模板,所以使用成本并不高。

這里還要衍生出一個(gè)話題,就是依賴管理,在開(kāi)發(fā)代碼時(shí),勢(shì)必需要依賴很多外部的東西,Go可以直接import遠(yuǎn)程的內(nèi)容,這個(gè)特性很有創(chuàng)意,但并不能很好地解決版本的問(wèn)題,在MavenGradle里,我們可以直接指定各個(gè)依賴項(xiàng)甚至是插件的版本,工具會(huì)自動(dòng)從倉(cāng)庫(kù)中下載它們。如果需要同時(shí)在同一個(gè)系統(tǒng)的不同模塊里依賴同一個(gè)庫(kù)的不同版本,我們還能夠通過(guò)OSGi這種略顯復(fù)雜的手段來(lái)實(shí)現(xiàn),在模塊化方面,Jagsaw雖然被一延再延,但估計(jì)有望納入Java 9,這個(gè)特性也會(huì)解決不少問(wèn)題。而根據(jù)Golang實(shí)踐群中大家的討論,似乎godepgbgvt都不盡如人意,在這點(diǎn)上看來(lái)Go還有一段路要走。

綜上所述,Go在工程方面的確有不少亮點(diǎn),吸納了很多最佳實(shí)踐,甚至可以說(shuō)用Go之后更容易寫出規(guī)范的代碼,有好的項(xiàng)目結(jié)構(gòu),但與生態(tài)圈完備的Java相比,Go并不占優(yōu)勢(shì),因?yàn)樽罱K代碼的質(zhì)量還是由人決定的,雙方都不缺好的工具,所以這方面的特點(diǎn)并不能影響技術(shù)選型的決策。

#p#

開(kāi)發(fā)實(shí)踐

Talk is cheap. Show me the code.

下面進(jìn)入編碼環(huán)節(jié),先從Go引以為傲的并發(fā)開(kāi)始,《Go語(yǔ)言編程》的前言中有這樣一段代碼:

  1. func run(arg string) {    // ...} 
  2. func main() {    go run("test")    ...} 

書中與之對(duì)比的Java代碼有12行,而且還是線程,不是協(xié)程,對(duì)比很明顯,但那是在2012年的時(shí)候,時(shí)至今日,Java已經(jīng)發(fā)展到了Java 8,3年了,看看如今的Java代碼會(huì)是什么樣的:

public class ThreadDemo {
    public static void main(String[] args) {
        String str = "test"; // 為了和原先的Java版本對(duì)照,說(shuō)明能傳參進(jìn)入線程內(nèi),在外聲明了一個(gè)字符串,其實(shí)可以直接寫在Lambda里
        new Thread(() -> { /* do sth. with str */ }).start();
    }
}

不是協(xié)程仍是硬傷,但有了Lambda表達(dá)式,代碼短了不少。不過(guò)話又說(shuō)回來(lái),這樣的比較并沒(méi)有太多意義,所以各位Go粉也不用站出來(lái)說(shuō)Go也支持閉包,Go的版本也能精簡(jiǎn)。我們比的不是誰(shuí)寫的短,在Java實(shí)踐中,大多數(shù)時(shí)候大家會(huì)選擇線程池,而不是自己new一個(gè)Thread對(duì)象,Doug Lea大神的Java并發(fā)包非常的好用,而且很靠譜。另外,并發(fā)中處理的內(nèi)容才是關(guān)鍵,新啟一個(gè)線程或者協(xié)程才是萬(wàn)里長(zhǎng)城,如果其中的業(yè)務(wù)邏輯有10個(gè)分支,還要多次訪問(wèn)數(shù)據(jù)庫(kù)并調(diào)用遠(yuǎn)程服務(wù),那無(wú)論用什么語(yǔ)言都白搭。所以在業(yè)務(wù)邏輯復(fù)雜的情況下,語(yǔ)言的差異并不會(huì)太明顯,至少在Java和Go的對(duì)比下不明顯,至于其他更高階、表達(dá)力更強(qiáng)的語(yǔ)言(比如Common Lisp),大家就要拼智商了。

還有一些情況中,由于客觀因素制約,完全就無(wú)法使用Go,比如現(xiàn)在如火如荼的互聯(lián)網(wǎng)金融系統(tǒng)里,與銀行對(duì)接的系統(tǒng)幾乎沒(méi)有選擇,都是Java實(shí)現(xiàn) 的,因?yàn)橛械你y行只會(huì)給Jar包啊……給Jar包啊……Jar包啊……如果是個(gè)so文件,也許還能用cgo應(yīng)付一下,面對(duì)一個(gè)Jar你讓Go該何去何從?

拋開(kāi)這些讓人心煩的問(wèn)題,讓我們?cè)賮?lái)看看現(xiàn)在比較常見(jiàn)的如何實(shí)現(xiàn)REST服務(wù)。說(shuō)到這里,就一定要祭出國(guó)人出品的Beego框架。一個(gè)最簡(jiǎn)單的REST服務(wù)可以是這樣的:

package main

import (
    "github.com/astaxie/beego"
)

type MainController struct {
    beego.Controller
}

func (this *MainController) Get() {
    this.Ctx.WriteString("hello world!")
}

func main() {
    beego.Router("/", &MainController{})
    beego.Run()
}

既然Go方面,我們使用了一套框架,那么Java方面,我們一樣也選擇一個(gè)成熟的框架,Spring在Java EE方面基本可以算是事實(shí)標(biāo)準(zhǔn),而Spring Boot更是大大提升了Spring項(xiàng)目的開(kāi)發(fā)效率,看看同樣實(shí)現(xiàn)一個(gè)REST服務(wù),在SpringBoot里是怎么做的。

首先,到start.spring.io根據(jù)需要生成項(xiàng)目骨架(其 實(shí)完全可以方便地自己通過(guò)Maven手工配置依賴或者是用CLI工具來(lái)創(chuàng)建),為了后續(xù)的演示,這里我會(huì)選上“Web”、“Actuator”和 “Remote Shell”,其實(shí)就是多了兩個(gè)Maven的依賴,下文運(yùn)維部分會(huì)提到,然后隨便找個(gè)順手的IDE打開(kāi)工程,敲入如下代碼就行了(import、包和類定 義的部分基本都是IDE生成的)。

package demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
    @RequestMapping("/")
    public String sayHello() {
        return "hello world!";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

運(yùn)行這段代碼會(huì)自動(dòng)啟動(dòng)內(nèi)置Tomcat容器,訪問(wèn)http://localhost:8080/就能看到輸出了。因?yàn)槠鋵?shí)就是Spring,所以可以毫無(wú)壓力地與其他各種框架設(shè)施組合,也沒(méi)有太多學(xué)習(xí)成本。

可見(jiàn)兩者在實(shí)現(xiàn)REST服務(wù)方面,并沒(méi)有太大的差別,加之上文提到的業(yè)務(wù)邏輯問(wèn)題,只要運(yùn)用恰當(dāng)?shù)墓ぞ撸?strong>兩種語(yǔ)言之間并不會(huì)產(chǎn)生質(zhì)的差異。

Beego中的ORM支持MySQL、PostgreSQL和Sqlite3,而在Java里Hibernate和myBatis這樣的ORM工具 幾乎能通吃大多數(shù)常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù),且相當(dāng)成熟,社區(qū)配備了各種自動(dòng)生成工具來(lái)簡(jiǎn)化使用,行業(yè)里還有JPA這樣的公認(rèn)標(biāo)準(zhǔn)。縱觀Go的ORM工具,大家還是在探討,究竟哪個(gè)才好用呢?切到NoSQL方面,雙方都有大量的驅(qū)動(dòng)可以使用,比如MongoDBRedis都有詳盡的驅(qū)動(dòng)列表,MongoDB還沒(méi)有官方驅(qū)動(dòng),但有社區(qū)維護(hù)的mgo,算是打成平手吧。再大一點(diǎn),像用到Hadoop、Spark和Storm的場(chǎng)景下,似乎Java的出鏡率更高,或者是直接通過(guò)Streaming方式就解決了,此處也就不再展開(kāi)了。

雖然說(shuō)了這么多問(wèn)題,但如果真的遇到了大流量、高并發(fā)的場(chǎng)景,需要從頭開(kāi)始開(kāi)發(fā)用來(lái)處理這些問(wèn)題的基礎(chǔ)設(shè)施時(shí),Go還是不錯(cuò)的選擇。比如,七牛這樣 的云服務(wù)提供商,又或者是BFE(Baidu Front End,號(hào)稱可能是全世界流量最大的Go語(yǔ)言集群 ,在2015年的Velocity大會(huì)上留下了它的身影——圖1圖2)這樣的硬貨,請(qǐng)不要糾結(jié)。

運(yùn)維

寫完代碼只是萬(wàn)里長(zhǎng)征的一小步,后面還有一大堆的事情等著你去解決,比如怎么把寫完的代碼編譯、打包、發(fā)布上線。編譯打包就不說(shuō)了,Go的命令行工具go build就 能直接把你的代碼連同它的所有依賴一起打成一個(gè)可執(zhí)行文件。至于部署,大家都稱贊Go的部署沒(méi)有依賴(除了對(duì)glibc的版本有要求,不考慮需要cgo的 情況),直接把可執(zhí)行文件往那里一扔就好了,非常方便。Go內(nèi)置了強(qiáng)大的HTTP支持,不需要其他Web服務(wù)器來(lái)做支撐就能獲得不錯(cuò)的性能。

再來(lái)看看Java,按照常理,一般都會(huì)使用Maven或者Gradle來(lái)處理編譯、打包,甚至是發(fā)布,仍舊以Maven為例,mvn package就能完成編譯和打包。可以選擇Jar包,如果是Web項(xiàng)目部署到容器里的話可以是War包,也可以將各種資源打包到一起放到壓縮包(zip、tar等等)里,這個(gè)步驟并不復(fù)雜。

接下來(lái)的部署環(huán)節(jié),大家就有話要說(shuō)了,“Write Once, Run Anywhere”這曾是Java的宣傳語(yǔ),但正是這句話一直被大家詬病,其實(shí)如果代碼中不使用平臺(tái)特定的內(nèi)容(比如避免綁定在WebLogic上),不使用某個(gè)特定版本JDK的內(nèi)部類(比如com.sun里 的東西,這種做法本來(lái)就不推薦),Java的代碼還是能夠做到編譯后在任何地方都能運(yùn)行的,事實(shí)上現(xiàn)在絕大部分情況下,大家也都是這么做的,看看廣大的 Java庫(kù)都是發(fā)布Jar到Maven倉(cāng)庫(kù)的,也沒(méi)誰(shuí)讓你直接拉源碼來(lái)編譯。在不同的環(huán)境下,只需要部署了對(duì)應(yīng)的JDK就好了(一般放到裝機(jī)模板里,或者 直接拿安裝包部署一下就好了),至于是什么操作系統(tǒng)其實(shí)并不重要。

延續(xù)上文REST服務(wù)的例子,Java的Web項(xiàng)目一般都會(huì)部署到容器里,比如Tomcat或者Jetty,當(dāng)然也有用商業(yè)容器的(很多銀行就是用 的WebLogic),所以大家就都認(rèn)為部署Java程序需要先有容器,這其實(shí)是幾年前的事情了,后來(lái)刮起了一股內(nèi)嵌容器的風(fēng)潮,Tomcat和 Jetty都可以嵌入到你的程序里,再也不用為有沒(méi)有容器而煩惱了。Spring Boot索性把這件事變得更簡(jiǎn)單了,mvn package后,一句話就能搞定內(nèi)置Tomcat的啟動(dòng)、完成各種部署,然后一切就變成下面這樣(假設(shè)最后生成的Jar包名為demo.jar):

java -jar demo.jar

在Spring Boot 1.3里,還能通過(guò)調(diào)整Maven Plugin的配置,讓Jar可以直接執(zhí)行(不要小看這么一個(gè)變化,它可以大大提升可運(yùn)維性):

./demo.jar

所以說(shuō)Java程序難部署其實(shí)也是歷史,現(xiàn)在的Java程序部署早已是另一番光景。兩者的編譯、打包、部署環(huán)節(jié)完全可以打成平手。筆者認(rèn)為有些方面 Java反而更勝一籌,比如Java基本就不用操心交叉編譯的問(wèn)題;Go的庫(kù)在發(fā)布時(shí)推薦直接發(fā)布源碼而非二進(jìn)制包,遇到天朝特有的網(wǎng)絡(luò)無(wú)法訪問(wèn)的情況, 編譯個(gè)東西還要自備梯子……至于和Nginx等等的配合,更是大家都很方便,就不再贅述了。

完成了部署,接下來(lái)的日志和監(jiān)控,都是很常規(guī)的問(wèn)題,日志各自有對(duì)應(yīng)的庫(kù),而監(jiān)控都是依賴專業(yè)的監(jiān)控平臺(tái),自己做好信息輸出就好了,請(qǐng)容我再秀一下 Spring Boot的RemoteShell終端監(jiān)控,除了常規(guī)的HTTP方式輸出JSON信息(自帶了健康檢查、儀表數(shù)據(jù)、Dump、請(qǐng)求跟蹤等一系列REST輸 出),還自帶了這么個(gè)類似top的高大上的玩意兒,ssh -p 2000 user@localhost后執(zhí)行dashboard可以看到這個(gè)實(shí)時(shí)更新的界面。

總結(jié)

說(shuō)了這么多,來(lái)總結(jié)下全文的觀點(diǎn)——雖然Go在語(yǔ)言上表現(xiàn)的很出色,也融入了很多最佳實(shí)踐,但是結(jié)合多方考慮,在很多情況下它并不會(huì)比Java帶來(lái)更多價(jià)值,甚至還不一定能做的比Java好,因此作為一個(gè)Java程序員,我不會(huì)在自己的生產(chǎn)項(xiàng)目中轉(zhuǎn)向Go。

此外,除了本文重點(diǎn)討論的那些問(wèn)題,還有更現(xiàn)實(shí)的問(wèn)題擺在那里,比如團(tuán)隊(duì)轉(zhuǎn)型成本和招聘的成本,千萬(wàn)不要小看招聘,對(duì)于管理者而言,招聘也是工作中 的重要內(nèi)容,試想一下,是招個(gè)有經(jīng)驗(yàn)的Go程序員容易,還是招一個(gè)有經(jīng)驗(yàn)的Java程序員容易,就算能招到一個(gè)會(huì)Go的正式員工,你能招到一個(gè)會(huì)Go的外 包么,特別是在團(tuán)隊(duì)急需補(bǔ)充新鮮血液時(shí),結(jié)果是顯而易見(jiàn)的。

但這一切都不妨礙大家來(lái)學(xué)習(xí)Go,本文開(kāi)頭就已經(jīng)表達(dá)過(guò)這一觀點(diǎn),業(yè)余時(shí)間學(xué)習(xí)Go和在生產(chǎn)項(xiàng)目中不用Go并不沖突,Go還是有很多值得學(xué)習(xí)和借鑒的地方,而且誰(shuí)也說(shuō)不準(zhǔn)哪天你就真遇上了適合用Go的項(xiàng)目呢。

責(zé)任編輯:王雪燕 來(lái)源: 博客園
相關(guān)推薦

2023-12-05 18:22:12

Go程序員Zig

2012-12-12 09:52:18

程序員

2014-12-26 10:13:41

程序員

2019-11-18 10:06:44

程序員CDN靜態(tài)資源

2010-10-28 13:21:47

2015-05-15 10:39:44

Java 冠軍程序員?

2019-11-20 10:12:32

程序員 東漢崗位

2021-03-12 16:17:37

程序員 女性主義兩性 價(jià)值觀

2021-02-21 13:49:48

Java程序員開(kāi)發(fā)

2013-02-22 10:21:06

2011-11-09 13:52:04

程序員

2009-11-04 11:54:33

程序員職業(yè)水準(zhǔn)

2019-01-28 11:54:28

程序員技能溝通

2011-04-11 17:41:35

C++程序員

2021-01-03 10:30:54

編程程序員

2018-01-02 14:40:58

程序員年齡時(shí)間

2015-06-04 11:31:36

程序員12周內(nèi)

2015-07-28 10:39:34

程序員知識(shí)

2017-09-21 09:44:00

編程程序員軟件開(kāi)發(fā)

2021-06-30 10:48:30

VueReact前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91免费看片| 天天操天天射综合 | 丁香婷婷久久久综合精品国产 | 日韩欧美在 | 国产网站在线免费观看 | 中文字幕精品一区二区三区精品 | 超碰97免费在线 | 伊人精品久久久久77777 | av一级久久| 综合精品 | 中文字幕第49页 | 99久久精品国产一区二区三区 | 亚洲男女激情 | 午夜小视频免费观看 | 98久久| 日韩精品四区 | 日韩国产精品一区二区三区 | 日韩av一区二区在线观看 | av黄色在线观看 | 黄色一级毛片免费看 | 久久精品无码一区二区三区 | 欧美精品一区二区在线观看 | 日韩成人国产 | 午夜影视免费片在线观看 | 精品国产一区二区三区性色 | av天天操 | 精品一区久久 | 婷婷桃色网 | 在线免费看91 | 久久免费看 | 亚洲精品电影在线观看 | 丁香综合 | 欧美亚洲视频 | 久久综合99 | 亚洲精品视频在线看 | 日韩欧美国产成人一区二区 | 成人在线视频免费观看 | 中文字幕国产高清 | 九色视频网 | www.久| 国产精品一区二区久久久久 |