|
InfoQ:你好,Alex。能向我們的讀者介紹一下你自己和目前正在從事的工作嗎?
Alex:大家好,我是董洵,目前是Trunk.ly網(wǎng)站的CTO,它是一個(gè)專門(mén)提供社會(huì)化書(shū)簽服務(wù)的站點(diǎn)。由于目前公司的主要員工只有兩人,因此,即便我是公司的CTO,我仍然會(huì)每天花很多時(shí)候編寫(xiě)代碼。就網(wǎng)站后端來(lái)講,目前主要做的是搜索;前端則進(jìn)行一些站點(diǎn)UI的設(shè)計(jì)和開(kāi)發(fā)。就像大多數(shù)創(chuàng)業(yè)公司一樣,我們非常關(guān)注我們的功能特點(diǎn)、站點(diǎn)流量,而且會(huì)經(jīng)常跟投資人打交道。至于架構(gòu)師這個(gè)頭銜,其實(shí)談不上,只不過(guò)做架構(gòu)是我們平常工作的一部分吧。在這之前,也曾經(jīng)用過(guò).NET之類的技術(shù)做過(guò)企業(yè)項(xiàng)目。
【編者注:如果想進(jìn)一步了解Alex,讀者可以訪問(wèn)他的個(gè)人站點(diǎn)以及《程序員》雜志對(duì)他的訪談。關(guān)于Trunk.ly域名的含義,@36氪上的這篇文章中有這樣一段描述:我問(wèn) @alexdong 為什么用 trunk.ly 這個(gè)域名,他說(shuō):“是個(gè)一語(yǔ)雙關(guān). 在航海時(shí)代,每個(gè)周游世界的人隨身要帶一個(gè)箱子,這個(gè)箱子就叫trunk。現(xiàn)在英聯(lián)邦國(guó)家仍然叫后備箱trunk。我們就是一個(gè)鏈接的百寶箱。”】
InfoQ:作為互聯(lián)網(wǎng)的創(chuàng)業(yè)者,在同行業(yè)中有哪些站點(diǎn)的架構(gòu)會(huì)引起你的注意,讓你覺(jué)得值得欽佩?
Alex:這一點(diǎn)怎么說(shuō)呢,像Google。就我個(gè)人講,我會(huì)花些時(shí)間(雖然我也沒(méi)有太多的空閑時(shí)間)去讀Google Research上發(fā)表的這些論文。像一些大的互聯(lián)網(wǎng)公司,比方說(shuō)Google、Yahoo和Amazon都有自己的research部門(mén),他們經(jīng)常會(huì)把自己解決某個(gè)問(wèn)題的經(jīng)驗(yàn)寫(xiě)成論文發(fā)表出來(lái)。對(duì)于一些架構(gòu)上的實(shí)際問(wèn)題,比方說(shuō)Timeline,這些公司會(huì)做一些科研實(shí)驗(yàn),比較各種實(shí)現(xiàn)方式的優(yōu)劣,最終把這些內(nèi)容總結(jié)成文。我會(huì)比較多的看這些論文,從中了解這些公司如何解決架構(gòu)中的某個(gè)問(wèn)題,以及這些問(wèn)題都有哪些解決方案,以及每種解決方案的好壞。從網(wǎng)站的架構(gòu)來(lái)說(shuō),我會(huì)比較關(guān)注這些內(nèi)容。除此之外,還有一些東西的架構(gòu)我也會(huì)比較關(guān)注,這也是我個(gè)人比較感興趣的方面。比如說(shuō)MongoDB、Linux或者是HyperTable,像這些新型的數(shù)據(jù)庫(kù)、應(yīng)用服務(wù)器等,我也花了不少時(shí)間去研究了解它們的架構(gòu)是如何演進(jìn)的。
就欽佩這個(gè)詞來(lái)講,可能有點(diǎn)不太準(zhǔn)確。在我看來(lái),它更多的是一種靜態(tài)的感覺(jué)。比方說(shuō),當(dāng)你看到大概有5年或10年歷史的一個(gè)架構(gòu),第一眼看上去可能會(huì)覺(jué)得“了不起,想得真是很全面。”,這時(shí)你會(huì)產(chǎn)生出一種欽佩的感覺(jué)。但對(duì)我來(lái)講,像MongoDB,在它還是1.0的時(shí)候,我就在自己的系統(tǒng)中用它們。更多的時(shí)候,我看到了它發(fā)展的軌跡。在這種情況下,說(shuō)欽佩可能不太合適。更多的一種感覺(jué)是他們做的這些事情很有意思,很有特點(diǎn)。這也是為什么我會(huì)在郵件中提到,相比起架構(gòu)本身,我會(huì)更關(guān)注架構(gòu)背后的人,覺(jué)得他們更有意思。通過(guò)這些,你可以看到,同樣一個(gè)問(wèn)題,由不同的人來(lái)解決,最后的解決方案會(huì)特別的不一樣,而且對(duì)應(yīng)于它的社區(qū),你會(huì)發(fā)現(xiàn)用這些解決方案的人也特別的不一樣。所以這些事情是最令我感興趣的。
InfoQ:是的,架構(gòu)本身也是動(dòng)態(tài)發(fā)展而來(lái)的。人本身有其自身的缺陷,很難設(shè)計(jì)出來(lái)一種面面俱到,一勞永逸的架構(gòu)。就架構(gòu)決策而言,應(yīng)該是架構(gòu)師在當(dāng)時(shí)環(huán)境所能做出的最好決策了。隨著時(shí)間的發(fā)展,周圍的環(huán)境也會(huì)發(fā)生變化,這時(shí)就需要他來(lái)根據(jù)環(huán)境進(jìn)行調(diào)整。
Alex:沒(méi)錯(cuò),這也是我覺(jué)得一位好的架構(gòu)師,他真正的價(jià)值不在于從第一天開(kāi)始就拿出一個(gè)藍(lán)圖,它有多漂亮、多干凈。我認(rèn)為好的架構(gòu)師首先應(yīng)該是知識(shí)面比較寬廣,需要清楚有哪些選擇,每個(gè)選擇在解決當(dāng)前問(wèn)題的同時(shí)還會(huì)帶來(lái)哪些影響,也就是每種解決方案好的一面和壞的一面。其次,當(dāng)遇到架構(gòu)上的問(wèn)題時(shí),能夠通盤(pán)的考慮,發(fā)現(xiàn)問(wèn)題的本質(zhì),進(jìn)而提出自己的解決辦法。比如像Linus,他實(shí)現(xiàn)的Git其實(shí)已經(jīng)融合了他對(duì)于分布式開(kāi)放源代碼項(xiàng)目的管理以及協(xié)作方式的思考和理念。
InfoQ:那么做架構(gòu)決策時(shí),就有點(diǎn)像權(quán)衡各方面的因素,從而使架構(gòu)達(dá)到一個(gè)比較好的狀態(tài)?
Alex:說(shuō)達(dá)到一個(gè)比較好的狀態(tài)可能有點(diǎn)欠妥。我可以舉一個(gè)反面的例子。我之所以說(shuō)它反面,并不是說(shuō)這個(gè)抉擇或決定本身不好,而是說(shuō)它有不可忽視或是很致命的缺點(diǎn)。像Python、Ruby和V8 Engine它們都使用了GIL(Global Interpreter Lock),它的問(wèn)題在于若是我用Python寫(xiě)一個(gè)計(jì)算密集型的多線程程序,它的性能可能會(huì)比不使用多線程還要差。這就是它的運(yùn)行環(huán)境或者說(shuō)編程語(yǔ)言本身設(shè)計(jì)理念中埋下的引子。像Python之所以用GIL,是因?yàn)閂an Rossum一開(kāi)始最主要的設(shè)計(jì)目標(biāo)是要非常容易的寫(xiě)C Extension,即寫(xiě)一個(gè)C模塊,在Python中可以很容易的去調(diào)用它。有了這個(gè)鎖之后,使得寫(xiě)C模塊變得非常的容易。假如沒(méi)有這種鎖,要想實(shí)現(xiàn)從C調(diào)用Python或是從Python調(diào)用C,就沒(méi)法做。在我看來(lái),這是Python為了實(shí)現(xiàn)這種設(shè)計(jì)目標(biāo)而不得不做出的極大犧牲。而這一點(diǎn),就目前看來(lái),其實(shí)還是非常致命的,對(duì)我們自己應(yīng)用的影響也很大。
我舉這個(gè)例子的原因在于,權(quán)衡這個(gè)詞在很多時(shí)候看上去很優(yōu)美,沒(méi)有負(fù)面感覺(jué)。可就對(duì)我個(gè)人來(lái)說(shuō),很多架構(gòu)的決定,包括我現(xiàn)在用的很多軟件,權(quán)衡這個(gè)詞實(shí)際上有著很大的負(fù)面感覺(jué),或者說(shuō)你接受它【架構(gòu)決策】時(shí)不得不承受很大的痛苦。而且很多時(shí)候是現(xiàn)實(shí)情況下不得不接受,或者說(shuō)是一種對(duì)現(xiàn)實(shí)的妥協(xié)。因?yàn)椋彤?dāng)前情況而言,面對(duì)各式各樣的約束條件,已經(jīng)沒(méi)有其他更好的選擇了。假設(shè)我有充足的時(shí)間和資源,我可能會(huì)要求做得更好。
InfoQ:的確,每種工具或架構(gòu)有其本身適應(yīng)的環(huán)境或者說(shuō)是前提條件。假設(shè)你當(dāng)前應(yīng)用的環(huán)境跟這個(gè)前提或環(huán)境有沖突時(shí),就會(huì)造成你剛才所說(shuō)的那種在應(yīng)用上非常痛苦的一面。
Alex:你說(shuō)得非常的準(zhǔn)確,就是這種感覺(jué)。每個(gè)架構(gòu)決策就會(huì)使架構(gòu)僵硬一點(diǎn),將你推向某個(gè)極端或某條路。當(dāng)然,實(shí)在不行的時(shí)候,我就會(huì)必須將某些東西扔掉。我們做Trunk.ly也是沿路扔了不少東西,而且每次也都是在實(shí)在沒(méi)有辦法不得不這樣做的情況下采取的這項(xiàng)行動(dòng)。
InfoQ:這些優(yōu)秀的架構(gòu)給你的工作帶來(lái)的怎樣的影響?
Alex:對(duì)于這個(gè)問(wèn)題,我想通過(guò)《設(shè)計(jì)模式》來(lái)談一談。我讀這本書(shū)大約是在8、9年前的事情了,當(dāng)時(shí)的第一感覺(jué)是,這些模式設(shè)計(jì)得真是不錯(cuò),真的很好。由于當(dāng)時(shí)我用C++/C#的機(jī)會(huì)比較多,在之后的幾年里,我都盡量地去使用它們。可后來(lái)我認(rèn)識(shí)到,這些模式其實(shí)是只是一種規(guī)則。我覺(jué)得最理想的,作為架構(gòu)師,你在讀這些規(guī)則或者是在用這些規(guī)則的時(shí)候,要知道這些規(guī)則之后的規(guī)則是什么。然后將這些背后的規(guī)則去用到自己的工作中,而不是單單生搬硬套,為用而用。
也就是說(shuō),我希望架構(gòu)師能夠理解這些規(guī)則之所以呈現(xiàn)在這個(gè)樣子的原因。一名優(yōu)秀的架構(gòu)師,當(dāng)然是要多看別人設(shè)計(jì)的架構(gòu),但是在看的同時(shí),需要了解到使其架構(gòu)成型的現(xiàn)實(shí)的限制和現(xiàn)實(shí)的原因。除去你看到的架構(gòu)本身,你需要看到一種動(dòng)態(tài)的架構(gòu),知道其背后的推理和它的思維。這樣,等遇到問(wèn)題時(shí),就可以應(yīng)用這些思維方式,而不是簡(jiǎn)單的應(yīng)用架構(gòu)。以Trunk.ly的后臺(tái)搜索引擎的存儲(chǔ)為例,到目前為止總共經(jīng)歷了4次大的變更,從最初的MySQL,到Sphinx,到Lucene和Solar,再到目前的HyperTable。每次修改都是因?yàn)槲覀冎牢覀冇龅搅四男﹩?wèn)題,又因?yàn)橹罉I(yè)界都有哪些解決方案,每個(gè)解決方案的優(yōu)缺點(diǎn)是什么,最后有針對(duì)性的進(jìn)行抉擇和行動(dòng)。我舉這個(gè)例子想說(shuō)明,正是因?yàn)槲谊P(guān)注業(yè)界目前的動(dòng)態(tài),以及每種解決方案的優(yōu)缺點(diǎn),這樣,當(dāng)我遇到問(wèn)題時(shí),我就能想得起來(lái)去用它們。而作為架構(gòu)師,是需要通過(guò)這種方式去建立起自己的工具箱,而不是單單讓自己的手中就握著個(gè)錘子。
InfoQ:前面你曾提到相比起架構(gòu)本身,你對(duì)于導(dǎo)致當(dāng)前架構(gòu)成型背后的人和故事更感興趣。能詳細(xì)談?wù)剢幔?/strong>
Alex:我覺(jué)得這是件挺有意思的事情。當(dāng)你做架構(gòu)做到某一天,就會(huì)遇到所謂“治理(Governance)”的挑戰(zhàn)。尤其對(duì)于開(kāi)源軟件,在這樣一種松散的組織結(jié)構(gòu),誰(shuí)也不能將自己的設(shè)計(jì)理念強(qiáng)迫別人接受的條件下,要保證設(shè)計(jì)目標(biāo)的達(dá)成、版本、特性不斷地推陳出新,這時(shí)所面臨的挑戰(zhàn)和協(xié)調(diào)的藝術(shù),要遠(yuǎn)比企業(yè)內(nèi)實(shí)現(xiàn)同樣目的要難得多。大部分的開(kāi)源軟件,到最后都會(huì)有一個(gè)所謂的“善意的獨(dú)裁者(benevolence dictator)”,他們來(lái)決定特別艱難的決定該如何做。但是,不同的人做“獨(dú)裁”決定的時(shí)候會(huì)特別的不一樣。
像Linux社區(qū),這個(gè)“獨(dú)裁者”會(huì)要求你在郵件中把自己的設(shè)計(jì)理念講得特別清楚,然后他會(huì)通過(guò)郵件來(lái)進(jìn)行討論。但像Python就不一樣,它一開(kāi)始就確定了一些理念。作為社區(qū),如果你要貢獻(xiàn)源代碼就必須承認(rèn)它們,否則就不會(huì)被接受。還有一些開(kāi)源軟件則采用了“不同意就fork”的道路,假設(shè)一兩年之后,他們覺(jué)得這些fork不錯(cuò),這些fork還有可能會(huì)重新被接受。比如Python社區(qū)就有幾個(gè)著名的fork,如pypy,它是用Python來(lái)寫(xiě)Python,現(xiàn)在的性能也越來(lái)越好了。
通過(guò)看這些開(kāi)源社區(qū)的意見(jiàn)領(lǐng)袖如何用“非強(qiáng)制”的手段來(lái)保證架構(gòu)的一致性,消除意見(jiàn)分歧,我覺(jué)得是一件特有意思的事情。這就類似在現(xiàn)場(chǎng)看一個(gè)直播,對(duì)我來(lái)講這比起架構(gòu)本身成為什么樣子要有意思得多。而且在這個(gè)過(guò)程中,你也可以了解這些軟件解決方案誕生的全過(guò)程,大家對(duì)于問(wèn)題/特性應(yīng)用場(chǎng)景的討論和投票,給你帶來(lái)一種參與感,這是特別過(guò)癮的一件事情。
InfoQ:剛才說(shuō)了那么多其他人的故事,現(xiàn)在是不是可以說(shuō)一下你們自己的故事?談?wù)凾runk.ly經(jīng)歷了幾個(gè)階段,每個(gè)階段都有哪些,未來(lái)它準(zhǔn)備朝什么方向發(fā)展?
Alex:做創(chuàng)業(yè)公司是有兩個(gè)階段的。第一個(gè)階段是摸索階段,在這個(gè)階段,我還不清楚我的商業(yè)模式是否行得通,不知道今天的用戶是否就是給我?guī)?lái)收益的那些用戶。這個(gè)階段是非常重要的,英文叫做“product/market fit”,在之前的所有架構(gòu)都不是為了架構(gòu)本身,也不是為了站點(diǎn)的Scale,而是為了能讓我盡快的去做實(shí)驗(yàn),更快地驗(yàn)證我的假設(shè)。
InfoQ:更像一個(gè)原型?
Alex:是的,但它不是那種可拋棄的原型,因?yàn)槲覜](méi)有這個(gè)奢侈去把它拋棄重頭再來(lái)。我們?cè)谌ツ?2月份Trunk.ly上線的時(shí)候,我們對(duì)其的定位是一個(gè)書(shū)簽服務(wù),但它是一種透明的書(shū)簽服務(wù)。跟傳統(tǒng)的delicious不一樣的是,你不需要顯式地給它去打標(biāo)簽,它會(huì)自動(dòng)收集你在Facebook、Twitter和Delicious上共享的鏈接,把它們弄進(jìn)去進(jìn)行全文檢索。這樣,當(dāng)你想找以前的鏈接時(shí),你可以通過(guò)我們的搜索引擎去找到它。所以,在第一階段時(shí),為了滿足這個(gè)商業(yè)目標(biāo),我們就拿Django和MySQL快速地把它給實(shí)現(xiàn)了。后來(lái)數(shù)據(jù)庫(kù)就有點(diǎn)頂不住了,于是就換成了MongoDB,同時(shí)有一部分功能就采用了異步的方式實(shí)現(xiàn)。
接下來(lái),我們發(fā)現(xiàn)之前的商業(yè)目標(biāo)雖然不錯(cuò),但是這個(gè)市場(chǎng)的價(jià)值并不是特別的大。然后,通過(guò)日志和分析用戶的行為特征,我們發(fā)現(xiàn)有些用戶經(jīng)常會(huì)去看別人共享了哪些鏈接,所以我們很快就增加一個(gè)Timeline的功能,這樣你在一個(gè)地方就能看到你關(guān)注的人每天都共享了哪些鏈接,這樣用戶就不用跑到每個(gè)人那里去看了。這個(gè)時(shí)候,關(guān)于網(wǎng)站的商業(yè)目標(biāo)和定位就有了一點(diǎn)點(diǎn)的變化。這個(gè)時(shí)候,我前面說(shuō)的那些網(wǎng)站的論文提供了一些幫助。而且,這個(gè)時(shí)候大概每周都有百分之二三十的用戶增長(zhǎng),比起原來(lái)要快多了。而且,很多人會(huì)邀請(qǐng)他的朋友來(lái)注冊(cè)Trunk.ly。你要是在Twitter上搜索trunkly,你會(huì)看到每天有四五十條這樣的信息,這就是我們的第二個(gè)階段。
第三個(gè)階段就是我們發(fā)現(xiàn)這個(gè)市場(chǎng)還是不夠大。因?yàn)椋氚裈runk.ly做成一個(gè)讓人們每天都來(lái)的地方,這樣做的市場(chǎng)開(kāi)銷特別大,而且不是每個(gè)人都有這樣的需要。所以,我們開(kāi)始著手做Social Search。與Google這樣把所有人的鏈接都搜索出來(lái)不同,我們的這個(gè)功能允許你搜你朋友的鏈接,這樣搜出來(lái)的結(jié)果相比起前者來(lái)講要更準(zhǔn)確,而且跟你的相關(guān)性更強(qiáng)。我自己在測(cè)試這個(gè)功能的時(shí)候,也經(jīng)常因此而“走神”,開(kāi)始訪問(wèn)起那些鏈接的內(nèi)容來(lái)。
在這個(gè)功能完成上線之后,我們還準(zhǔn)備做的一件事情是“Topic”,即允許用戶自己來(lái)建立自己的主題頁(yè)面和鏈接。我們相信,從廣告和利潤(rùn)分成來(lái)說(shuō),這對(duì)我們是一個(gè)非常大的市場(chǎng)。從我剛才說(shuō)的這些內(nèi)容,你可以看出Trunk.ly的整個(gè)發(fā)展過(guò)程。我們目前還處在“product/market fit”之前,我想如果一旦證明我們?cè)O(shè)想的商業(yè)模式是正確的話,可能架構(gòu)還要再變,到時(shí)候可能就會(huì)更Scalable一些,而且架構(gòu)挑戰(zhàn)也就不一樣了。
InfoQ:對(duì)于未來(lái)的互聯(lián)網(wǎng)架構(gòu)師,作為過(guò)來(lái)人,你有什么經(jīng)驗(yàn)之談是值得他們注意和避免的?
Alex:我想我上面講的內(nèi)容應(yīng)該已經(jīng)是我的經(jīng)驗(yàn)之談了。如果非要總結(jié)的話,那就是,視野放寬一點(diǎn),不要手里拿著榔頭就滿眼盡看到釘子;另一點(diǎn)就是好的架構(gòu)都需要一個(gè)過(guò)程,多關(guān)注一下架構(gòu)背后的事情。這就是我能想到的經(jīng)驗(yàn)之談,也不是什么非常了不起的道理。
InfoQ:非常感謝你能抽空接受我的采訪,謝謝!
Alex:不客氣。
it知識(shí)庫(kù):Trunk.ly CTO董洵談架構(gòu),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。