對(duì)創(chuàng)業(yè)公司技術(shù)選擇的一些思考

737044467.jpg

在過去四年多的時(shí)間里我有四分之三的時(shí)間都是呆在創(chuàng)業(yè)公司,其中有一年的時(shí)間在ThoughtWorks度過。中途有一次機(jī)會(huì)進(jìn)入大公司,但是考慮再三還是放棄了。轉(zhuǎn)而加入了一個(gè)創(chuàng)業(yè)公司。就這幾年在創(chuàng)業(yè)公司做技術(shù)的經(jīng)歷,來談一下創(chuàng)業(yè)公司的技術(shù)選擇。

我第一個(gè)加入的創(chuàng)業(yè)公司是一個(gè)非常小的團(tuán)隊(duì),人數(shù)最多的時(shí)候也就二十多個(gè)人(公司總?cè)藬?shù))。后端團(tuán)隊(duì)從兩個(gè)人發(fā)展到后來的六個(gè)人,已經(jīng)是初具規(guī)模的團(tuán)隊(duì)了。公司主要做過三個(gè)大的項(xiàng)目:1. 新浪微博爬蟲,2. 基于Web的社交網(wǎng)站,3. 即時(shí)通訊工具。

新浪微博爬蟲是用Java實(shí)現(xiàn)的,關(guān)于這個(gè)項(xiàng)目有一段歷史。一開始這個(gè)項(xiàng)目是用PHP+MySQL寫的,參與項(xiàng)目的一共是三個(gè)人。但是寫著寫著,就發(fā)現(xiàn)越來越搞不動(dòng)了。不僅性能上不行,而且代碼量大了開發(fā)效率也不行了。三個(gè)人也都比較頭疼。項(xiàng)目也進(jìn)入了一種比較尷尬的局面。好在這時(shí)招進(jìn)來一個(gè)大牛。關(guān)于這個(gè)大牛后邊詳細(xì)介紹。這個(gè)大牛進(jìn)來之后,把原有的技術(shù)替換為Java+MongoDB。最后項(xiàng)目不僅效率上有很大的提升,而且原來三個(gè)人做的事情,現(xiàn)在剩下這位大牛自己搞,最終憑借一己之力完成了這個(gè)項(xiàng)目。

我們來分析一下這次技術(shù)棧的變更。從結(jié)果上看肯定是成功的(我們排除人的技術(shù)水品的因素,單純分析技術(shù))。原來三個(gè)人做的事情,現(xiàn)在一個(gè)人接管;項(xiàng)目順利交付,并且性能也有大幅提升。

Java和PHP哪個(gè)更好?就這個(gè)使用場景來說肯定是Java更合適。因?yàn)樾枰罅空{(diào)用微博API,我們可以利用Java的線程技術(shù)實(shí)現(xiàn)并發(fā)和異步編程。
MongoDB從始至今都是整體比較多的技術(shù)。一方面大家癡迷于它的性能,以及易用性,另一方面大家又被它的不穩(wěn)定性所困擾。好多公司都在MongoDB上載過跟頭。而且Mobgodb也對(duì)內(nèi)存也是非常貪婪的。但是在我們的項(xiàng)目中用mobgodb給我們帶來的好處也遠(yuǎn)大于它的弊端。項(xiàng)目整體性能的提升一部分原因要得益于MongoDB。所以說這次項(xiàng)目選型是很成功的。

Web項(xiàng)目我們用的技術(shù)是:Java + Nutz + MongoDB。
幾年之前那可是SSH的天下,而且Nutz框架我在進(jìn)入這家公司之前根本沒有聽說過。但是使用了之后,立馬被它的易用性和簡潔性吸引。首先學(xué)習(xí)成本很小,SSH這套框架不說別的,光是配置也夠你學(xué)幾天了,而Nutz幾乎是零成本的,而且注解設(shè)計(jì)的也非常容易理解。還有相信大家也被SSH各種依賴搞瘋過吧,而Nutz引入一個(gè)jar就可以了。一個(gè)jar包就包含了MVC,IOC,AOP等這些功能,不必強(qiáng)制依賴第三方j(luò)ar,絕對(duì)是一個(gè)小而美的框架。

仍然是MongoDB。對(duì)于創(chuàng)業(yè)公司來說選擇MongoDB絕對(duì)是一個(gè)非常明智的選擇。首先你真的不用可以的關(guān)系性能問題;其次入門非常簡,學(xué)習(xí)曲線較低;再者如果你的業(yè)務(wù)真的井噴了,那么MongoDB也能夠通過分布式的架構(gòu)來handle。還有最重要的一點(diǎn)是弱Schema,你不用操心Model改變數(shù)據(jù)庫升級(jí)的事兒了,并且版本升級(jí)并不是一件簡單的事情。

我們用這套架構(gòu)做了很多Web項(xiàng)目,效率高,體驗(yàn)好。這一套技術(shù)無疑也是一次成功的選擇。

再接下來我們開始做一個(gè)IM聊天工具。在這個(gè)項(xiàng)目上我們引入了Scala和Akka。在項(xiàng)目只有一個(gè)人(就是前邊提到的大牛)了解這套技術(shù)這套技術(shù)的前提下,引入這套全新的技術(shù)其實(shí)風(fēng)險(xiǎn)還是比較大的。但是這套技術(shù)其實(shí)是非常適合我們的業(yè)務(wù)的。最終項(xiàng)目還是如期的完成了,但是過程中也有被技術(shù)折騰的欲哭無淚的時(shí)候,不過有這個(gè)大牛作堅(jiān)實(shí)的后盾,好多技術(shù)難題都伴隨這他一個(gè)個(gè)通宵搞定了。

個(gè)人感覺,這次技術(shù)選型對(duì)一個(gè)創(chuàng)業(yè)公司來說有些激進(jìn)了。

那我們現(xiàn)在回顧一下,這個(gè)公司在技術(shù)選擇一直是比較合理,沒有犯過錯(cuò)誤的。雖然最后選擇的技術(shù)過于新潮,但是無疑這套技術(shù)是非常適合當(dāng)時(shí)業(yè)務(wù)的。終于該說一下我們公司技術(shù)負(fù)責(zé)人,他從小開始編程,在未成年時(shí)就混進(jìn)了外包公司(因?yàn)橹挥型獍靖乙闯赡耆耍?,到后來成了華為最年輕的架構(gòu)師。他非常聰明也非常努力經(jīng)常是連著熬幾個(gè)夜項(xiàng)目就出來了。而且他的技術(shù)品味也非常高。像SSH這個(gè)又笨又傻東西是他怎么會(huì)選呢。相比之下Nutz這種小而美的框架對(duì)他來說才是非常性感的。Akka,Scala雖然我認(rèn)為是一個(gè)激進(jìn)的選擇,但是對(duì)于他來說肯定是在可控范圍內(nèi),因?yàn)楹枚嚯y題經(jīng)過他一夜補(bǔ)眠就搞定了。

對(duì)于這個(gè)公司的技術(shù)選擇:1. 小而美,不隨大流。2. 激進(jìn)但可控。選擇一些非主流的技術(shù)(比如Akka,Scala,在2012年國內(nèi)市面上很少有這兩項(xiàng)經(jīng)驗(yàn)的人),畢竟會(huì)導(dǎo)致項(xiàng)目后續(xù)招人上的困難,但是有一個(gè)最基本的保障是,技術(shù)負(fù)責(zé)人技術(shù)足夠扎實(shí),在這關(guān)鍵時(shí)刻以一敵三,同時(shí)引進(jìn)新的技術(shù)后也在不遺余力的培養(yǎng)團(tuán)隊(duì)成員。

第二家創(chuàng)業(yè)公司使用的也是Scala技術(shù)棧:Play Framework + Reactive Mongo + MongoDB,也算是一套比較新潮的技術(shù)。當(dāng)然也是這些技術(shù)吸引我進(jìn)入這家公司。進(jìn)入一家公司之前你總是會(huì)抱著一些美好的期望,這種期望往往會(huì)在你第一時(shí)間看到項(xiàng)目代碼時(shí)隨之破滅。Scala是一門很powerful的語言,當(dāng)然當(dāng)你用的不體面是,它只能比Java更具有破壞力。入職的前兩天當(dāng)我看完了需求文檔,嘗試梳理代碼邏輯的時(shí)候,那時(shí)我恐怕遇到了前半生最困難的一件事情。邏輯遍布在各個(gè)地方,而且每段邏輯都沒有嚴(yán)格的邊界劃分。就像在一堆打散的積木中,試圖找到一個(gè)汽車的模型。

在這家公司Scala這套技術(shù)棧不僅沒有起到提升效率,快速開發(fā)的作用,反而成了團(tuán)隊(duì)的拖油瓶,絆腳石。因?yàn)榇藭r(shí)技術(shù)已經(jīng)像一匹脫韁了的野馬,不僅不會(huì)再聽從你的訓(xùn)令,反而會(huì)拖著你瞎跑。所以當(dāng)我熟悉了業(yè)務(wù)和項(xiàng)目基本信息后,就著手開始了項(xiàng)目重構(gòu),當(dāng)然這也是技術(shù)負(fù)責(zé)人最希望作的一件事情。

對(duì)于這家公司的技術(shù)選擇:盲目激進(jìn),不自量力。這家公司的技術(shù)負(fù)責(zé)人是一位Android工程師,對(duì)后端開發(fā)經(jīng)驗(yàn)不足。首先自己涉足的是一塊沒有接觸過的領(lǐng)域,用大流技術(shù)才是最穩(wěn)妥的做法。而且具備Android經(jīng)驗(yàn),選擇Java技術(shù)棧至少?zèng)]有新語言學(xué)習(xí)成本(當(dāng)然選擇了Java也不肯定比現(xiàn)狀好,只是少了一項(xiàng)技術(shù)難題)。再者招人容易,像Java,PHP什么的程序員遍地抓(但是大流意味著水平參差不齊,創(chuàng)業(yè)公司還是先解決有和沒有的問題吧)。如果有幸招到一位不錯(cuò)的程序員,也可以彌補(bǔ)自己后端經(jīng)驗(yàn)缺乏的短板。但Scala就不是這樣了,除非自己有熟人或者熟人能介紹,否則招到的幾率很小很小。大多數(shù)使用Scala的公司其實(shí)都是有自己培養(yǎng)成員的打算的。但顯然對(duì)于這家公司來說自己培養(yǎng)是不現(xiàn)實(shí)的。

第三家公司也就是我現(xiàn)在的公司,是做海外電商的。在這里技術(shù)用到的技術(shù)也是多種多樣:Python,Ruby,Java。每個(gè)公司的技術(shù)背后都隱藏著很多故事。這里的故事避開不講了,只說一下結(jié)果:后端服務(wù)一開始時(shí)是由一個(gè)技術(shù)非常不錯(cuò)的人用Python來寫的,他是一個(gè)Pythoner。后來由幾個(gè)Java背景的工程師接管。Java程序員深受著分層架構(gòu)的毒害,以至于在項(xiàng)目里也搞起了Dao,Service這些東西。原本很清爽的代碼被搞得非常臃腫。而且既然分層了,也沒有把每層的邏輯隔離好,各層的職責(zé)相互滲透。同事們也是抱怨連天。

再有就是Ruby,我剛進(jìn)來就被分到了這個(gè)Ruby項(xiàng)目上。剛看代碼的第一天我就隱約感覺到這是一個(gè)Java程序員寫的代碼。最明顯的標(biāo)識(shí)就是:變量搭配邏輯控制和循環(huán)使用,超大方法。雖然項(xiàng)目實(shí)現(xiàn)的不好,但是由于業(yè)務(wù)邏輯簡單,還沒有到那種不可收拾的地步。

由于深深受到動(dòng)態(tài)語言的打擊,在做新的系統(tǒng)的時(shí)候,團(tuán)隊(duì)又用回Java。這個(gè)項(xiàng)目我是從頭到尾一直負(fù)責(zé)的。現(xiàn)在在這個(gè)項(xiàng)目上用到的技術(shù)有:Spring Boot,JOOQ,F(xiàn)lyway,MySQL。之前數(shù)據(jù)訪問用的是MyBatis,后來被替換為JOOQ。MyBatis算是一個(gè)相對(duì)輕量的框架,但是還是感覺還是模板代碼,有點(diǎn)死板。用JOOQ可以很好的解決這個(gè)問題,你不用再專門的搞一個(gè)mapper,讓數(shù)據(jù)庫操作更直接。這個(gè)項(xiàng)目作了還不到半年的時(shí)間,到目前為止,至少從開發(fā)體驗(yàn)上來說還是很不錯(cuò)的。

對(duì)于這件公司的技術(shù)選擇:探索中前進(jìn)。剛剛開始團(tuán)隊(duì)嘗試了一些動(dòng)態(tài)語言Python,Ruby。隨著項(xiàng)目的不斷發(fā)展,代碼的可維護(hù)性和性能等問題日漸嚴(yán)重。時(shí)是團(tuán)隊(duì)又選擇了大多數(shù)人都比較熟悉的Java。這對(duì)團(tuán)隊(duì)來說是一次成長的過程,都說動(dòng)態(tài)語言好,適合創(chuàng)業(yè)公司作快速迭代開發(fā),但是自己的團(tuán)隊(duì)基因不合適,那選擇一個(gè)大家都熟悉的語言才是性價(jià)比最高的。并且現(xiàn)在的Java也不像原來那樣笨拙了,開發(fā)效率比Ruby,Python也差不了多少。

總結(jié)一下,一個(gè)創(chuàng)業(yè)公司應(yīng)該怎樣選擇自己的技術(shù)呢?下邊分幾個(gè)階段來說一下。
創(chuàng)業(yè)之初,這個(gè)階段公司作技術(shù)的可能就一兩個(gè)人,這時(shí)公司迫在眉睫的是開發(fā)出第一個(gè)產(chǎn)品原型。這個(gè)階段一定要用自己選擇最擅長的技術(shù),快速的把產(chǎn)品原型開發(fā)出來。Ruby也好,Java也罷,先把有沒有的問題解決。要知道這會(huì)兒少一次查文檔的時(shí)間就少幾分鐘加班的時(shí)間。

起步階段,這個(gè)階段是公司業(yè)務(wù)的快速發(fā)展階段。這個(gè)階段開發(fā)的任務(wù)通常要比第一個(gè)階段還要重,不過公司在這個(gè)時(shí)候已經(jīng)拿到一筆錢了,可以快速的擴(kuò)建開發(fā)團(tuán)隊(duì)。這個(gè)階段的技術(shù)選擇:對(duì)于核心業(yè)務(wù)的選擇也傾向于使用主流的技術(shù)。一方面是這些技術(shù)足夠成熟穩(wěn)定,另一方面招人相對(duì)容易。對(duì)于一些非核心的業(yè)務(wù)可以嘗試一些新的技術(shù),為后續(xù)做一些經(jīng)驗(yàn)儲(chǔ)備。

再后來的階段我還沒有經(jīng)歷,等有機(jī)會(huì)再作補(bǔ)充吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,036評(píng)論 25 709
  • 娃娃有魂魄,匠人自恭謙. 在深圳特區(qū),鳳凰山下,堅(jiān)守著這么一批年輕人,他們技?jí)喝毡荆涃u全球。 在深圳寶安區(qū)福永鎮(zhèn)...
    a359ca894daf閱讀 1,355評(píng)論 1 1
  • 花果山,水簾洞 如果時(shí)光可以倒流,那么我希望回到那個(gè)放蕩不羈的瘋狂年代,讓我重新拾起當(dāng)年少年的熱血,讓我再一次認(rèn)認(rèn)...
    弓長宇晗閱讀 632評(píng)論 0 3

友情鏈接更多精彩內(nèi)容