溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Quora開(kāi)發(fā)的主要技術(shù)有哪些

發(fā)布時(shí)間:2021-09-26 16:23:21 來(lái)源:億速云 閱讀:92 作者:iii 欄目:建站服務(wù)器

本篇內(nèi)容介紹了“Quora開(kāi)發(fā)的主要技術(shù)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

首先來(lái)看一下Quora網(wǎng)站開(kāi)發(fā)主要利用到的技術(shù):

Web層與CMS

HAProxy作為前端負(fù)載均衡服務(wù)器,反向代理服務(wù)器是Nginx,Nginx后面則是Pylons(Pylons + Paste),承擔(dān)動(dòng)態(tài)Web請(qǐng)求。

Webnode2與LiveNode這兩個(gè)內(nèi)部系統(tǒng)承擔(dān)創(chuàng)建、管理內(nèi)容的重任,Webnode2生成HTML、CSS與JavaScript,并且與LiveNode輕度耦合。LiveNode的作用用以顯示W(wǎng)eb頁(yè)面內(nèi)容。用Python、C++與JavaScript寫(xiě)的。特別提到用到了jQuery與Cython。LiveNode有可能開(kāi)源。

為什么用Python?

前面已經(jīng)提到了一些Python相關(guān)的技術(shù)組件。有意思的是從Facebook出來(lái)的團(tuán)隊(duì)居然用Python作為主要開(kāi)發(fā)語(yǔ)言。Quora對(duì)此有所解釋:Facebook選擇PHP也并非是最佳選擇,而是有歷史原因。Quora技術(shù)團(tuán)隊(duì)在考察了多個(gè)語(yǔ)言之后選擇的Python,當(dāng)然理由有一大堆,總體看來(lái),并非很激進(jìn)。

通信處理

后端通信使用的是Facebook開(kāi)源出來(lái)的Thrift,除了開(kāi)發(fā)接口簡(jiǎn)單之外,可能更為熟悉也是一個(gè)因素吧:)Comet服務(wù)器使用的是Tornado,用以處理Long polling以及Push 更新(不知道知乎用的什么?),Tornado是前FriendFeed技術(shù)團(tuán)隊(duì)開(kāi)源的產(chǎn)品。

實(shí)時(shí)搜索

因?yàn)镾phinx不能滿足實(shí)時(shí)性方面的要求,Quora啟用了自己開(kāi)發(fā)的搜索引擎,只使用了Thrift與Python Unicode庫(kù),此外沒(méi)有用別的。Quora的搜索比較特別,因?yàn)橐獙?duì)輸入內(nèi)容做關(guān)聯(lián)并且要做有效提示,所以需要提供更好的前綴索引(Prefix indexing)功能。

Quora搜索的實(shí)現(xiàn)還是挺有技術(shù)含量的,對(duì)后端的查詢請(qǐng)求壓力也不小(或許當(dāng)前的并發(fā)請(qǐng)求量還沒(méi)那么大)。對(duì)這個(gè)場(chǎng)景,做相關(guān)開(kāi)發(fā)的朋友不妨仔細(xì)研究一下。如果大體框架類似,那么決定最后生出的因素很可能是那些細(xì)節(jié)。

數(shù)據(jù)持久層

大量使用MySQL作為存儲(chǔ)方案,Memcached作Cache層。沒(méi)有使用當(dāng)前比較火爆的NoSQL相關(guān)產(chǎn)品。Quora這樣做有自己的理由,用戶量級(jí)沒(méi)有達(dá)到百萬(wàn)的SNS站點(diǎn)完全沒(méi)必要用NoSQL的東西?;蛟S以后Quora也會(huì)啟用。

創(chuàng)始人查理·奇弗(Charlie Cheever)與亞當(dāng)·德安杰洛(Adam D'Angelo)之前都在Facebook,所以,Quora的技術(shù)還真有不少Facebook的基因。Quora的團(tuán)隊(duì)規(guī)模并不大,做技術(shù)的估計(jì)十余人而已,這么緊湊的團(tuán)隊(duì)利用了這么多的技術(shù)與產(chǎn)品,可見(jiàn)很多人都是多面手了。這是國(guó)內(nèi)技術(shù)團(tuán)隊(duì)需要向國(guó)外同行學(xué)習(xí)的地方。

Quora 的技術(shù)管理經(jīng)驗(yàn):

Quora 的代碼質(zhì)量四項(xiàng)原則

1. 閱讀和理解代碼應(yīng)該是簡(jiǎn)單的 —— 開(kāi)發(fā)者讀代碼的時(shí)間遠(yuǎn)遠(yuǎn)大于寫(xiě)代碼的時(shí)間。因此Quora應(yīng)該盡量使代碼簡(jiǎn)潔易懂,盡管寫(xiě)出那樣的代碼可能會(huì)需要比原來(lái)更長(zhǎng)的時(shí)間。

2. 不同部分的代碼應(yīng)該有不同的質(zhì)量要求 —— 不同部分的代碼對(duì)于長(zhǎng)期開(kāi)發(fā)帶來(lái)的影響是不一樣的,因?yàn)樗鼈冇胁煌纳芷凇⒂绊懛秶?、被破壞的可能性、破壞后帶?lái)的后果大小,以及debug的難度??傮w來(lái)說(shuō),不同的代碼對(duì)于產(chǎn)品迭代的速度的影響是不同的,因此對(duì)所有代碼都一視同仁顯然不是最佳選擇。

3. 維護(hù)代碼質(zhì)量的成本是可以減少的 —— 開(kāi)發(fā)自動(dòng)化,更易用的開(kāi)發(fā)工具,更好的流程,以及更好的開(kāi)發(fā)者都能夠減少維護(hù)代碼質(zhì)量的成本。

4. 整個(gè)代碼庫(kù)應(yīng)有一致性 —— 整個(gè)代碼庫(kù)的一致性是很重要的,盡管這意味著某些局部代碼可能并沒(méi)有用最佳的方法去寫(xiě)。一個(gè)缺乏一致性的代碼庫(kù)會(huì)使閱讀,理解(參加第1點(diǎn)),后續(xù)功能添加,和使用自動(dòng)化工具來(lái)改進(jìn)代碼都更加困難。

接下來(lái),我將介紹一些在開(kāi)發(fā)過(guò)程中 Quora 遵循著四項(xiàng)原則的具體方法。

代碼提交后的互相審查(Code Review)

如果代碼庫(kù)中有代碼變動(dòng),Quora會(huì)從 6 方面來(lái)同行審查 —— 正確性(correctness)、代碼封裝(privacy)、 性能(performance)、架構(gòu)(architecture)、可重用性(reusability)、代碼風(fēng)格(style)。閱讀代碼是代碼審查中不可或缺的一環(huán),因此實(shí)施代碼審查制度對(duì)于增加代碼可讀性也無(wú)疑是有利的。

但不幸的是,代碼審查也會(huì)拖慢開(kāi)發(fā)進(jìn)程。例如代碼提交前的互相審查這個(gè)業(yè)界常規(guī),代碼在被提交到代碼庫(kù)之前必須由同伴審閱并由作者完成改進(jìn)。每輪審查可能會(huì)持續(xù)兩天,然后常常有兩到三輪審閱,這意味著代碼作者會(huì)經(jīng)常將浪費(fèi)大半個(gè)星期在代碼審閱的工作上。

在 Quora,Quora并不進(jìn)行代碼提交前的審查。即,代碼會(huì)先上線,然后才由某些同事來(lái)進(jìn)行審閱。為了讓你對(duì)Quora的工作規(guī)模有個(gè)概念,昨天Quora有48個(gè)開(kāi)發(fā)者總共進(jìn)行了 187 次代碼提交(commit)。Quora認(rèn)為代碼后審閱是一項(xiàng)很好的舉措,因?yàn)樗岄_(kāi)發(fā)者們從不必要的代碼審閱的牢籠中解放出來(lái),可以先去完成其它的工作。這樣,審閱者們也可以挑他們方便的時(shí)候來(lái)閱讀這些代碼,以免被別人催促著完成這項(xiàng)工作。Quora的流程希望Quora在一周內(nèi)完成代碼審閱工作就可以了,但Quora大多數(shù)都會(huì)在  1  至  2  天內(nèi)進(jìn)行審閱。這個(gè)“一周”的長(zhǎng)度是在仔細(xì)討論后定下的 —— 它既長(zhǎng)到足夠?qū)忛喺邆冏杂砂才艑忛啎r(shí)間,也短到可以及時(shí)阻止低質(zhì)量代碼可能帶來(lái)的,被其他人閱讀并使用的后果。實(shí)際操作中,Quora也考慮到了許多開(kāi)發(fā)者會(huì)有一個(gè)以“星期”為周期而安排的工作時(shí)間表。

Quora能實(shí)施代碼提交后審閱這項(xiàng)舉措,也是因?yàn)镼uora對(duì) Quora 的每個(gè)開(kāi)發(fā)者都加以信任,畢竟Quora只雇傭最好的開(kāi)發(fā)者,也給予了他們最好的工具和最用心的培訓(xùn)。這也促使Quora寫(xiě)下一些很好的測(cè)試來(lái)達(dá)到很高的代碼覆蓋率,這讓Quora在任何代碼審閱之前都可以自己檢閱代碼的正確性。除此以外,Quora使用 Phabricator 這個(gè)非常棒,配置自由度也相當(dāng)高的代碼審查工具。Quora對(duì) Phabricator 這個(gè)工具做了一些修改,讓它能更好的為Quora提交后審查的流程服務(wù)。例如,Quora寫(xiě)了一個(gè)命令行工具來(lái)幫助大家上線代碼并要求審閱。這個(gè)工具會(huì)讓開(kāi)發(fā)者在不對(duì)之前的提交進(jìn)行任何修改的同時(shí)讓 Phabricator 的 diff 能夠正確運(yùn)行。

說(shuō)了這么多,Quora對(duì)不同種類的改動(dòng)有著不同的審閱要求。如果新代碼有可能會(huì)造成嚴(yán)重的后果,并且修復(fù)起來(lái)很難的話,Quora會(huì)要求對(duì)它進(jìn)行提交前審查,而不是常規(guī)的提交后審查。比如:

1. 涉及與用戶隱私和匿名相關(guān)的代碼;
2. 涉及了與一個(gè)核心抽象類有關(guān)的代碼,因?yàn)楹芏嗥渌a可能基于它;
3. 涉及了可能會(huì)造成宕機(jī)的底層代碼;
提交前還是提交后要求審查,這也跟開(kāi)發(fā)者的謹(jǐn)慎程度有關(guān)。如果任何開(kāi)發(fā)者想要在提交代碼前要求代碼審查,以此來(lái)獲得一些建議或意見(jiàn)的話,他們完全有這么做的自由 —— 盡管這很少發(fā)生。

把代碼審閱發(fā)給正確的人

為了使代碼審查進(jìn)行得順利,新代碼應(yīng)該由對(duì)于這個(gè)改變有著充分的認(rèn)知的人來(lái)審查。如果代碼是由將會(huì)維護(hù)這些代碼的人負(fù)責(zé)那就更好了,顯然他們將會(huì)有很充分的理由和動(dòng)機(jī),來(lái)使代碼長(zhǎng)期的可用性達(dá)到最佳。

Quora寫(xiě)了一個(gè)簡(jiǎn)單的系統(tǒng),讓開(kāi)發(fā)者們可以簡(jiǎn)單地表名模塊/目錄級(jí)別的代碼歸屬,它們只需要在文件的開(kāi)頭加一個(gè)元標(biāo)簽就可以了。例如:

__reviewer__ = ‘vanessa, kornel’

如果有個(gè)提交(commit)會(huì)改變某個(gè)文件的話,這個(gè)系統(tǒng)會(huì)讀取這個(gè)標(biāo)簽,這個(gè)標(biāo)簽里標(biāo)明的開(kāi)發(fā)者會(huì)被自動(dòng)添加到這個(gè) commit 的審閱者名單里。除此以外,Quora也有其它的關(guān)于代碼審閱者的規(guī)則,例如對(duì)于所有設(shè)置了 A/B 測(cè)試的 commit,都會(huì)有一個(gè)數(shù)據(jù)分析師——如果原來(lái)沒(méi)有的話——被自動(dòng)加到審閱名單里。事實(shí)上,Quora的工具也可以很簡(jiǎn)單地添加其它的關(guān)于代碼審閱人的規(guī)則。例如,如果Quora想的話,可以把新雇員的所有 commit 都發(fā)送給他們的導(dǎo)師。

有一個(gè)智能的審閱分發(fā)系統(tǒng),把代碼審閱發(fā)送給正確的人,減少了開(kāi)發(fā)者們尋找代碼審閱者的煩惱,并確保能找到最適合的人來(lái)審閱每一份代碼。

測(cè)試

測(cè)試是開(kāi)發(fā)流程中很重要的一環(huán)。Quora寫(xiě)了很多單元測(cè)試、功能測(cè)試、UI 測(cè)試來(lái)達(dá)到高代碼覆蓋率。有一個(gè)完整的單元測(cè)試,可以讓開(kāi)發(fā)者快速平行地完成新代碼,而不必?fù)?dān)心破壞掉已有的功能。Quora花了很多時(shí)間來(lái)制作Quora的測(cè)試框架(基于 nosetests ),目標(biāo)是簡(jiǎn)單、快速、易用,使寫(xiě)測(cè)試的工作量盡可能低。

Quora也開(kāi)發(fā)了許多自動(dòng)化測(cè)試的工具。正如之前一篇探討Quora持續(xù)部署系統(tǒng)的文章所講的一樣,Quora所有的代碼在上線之前都在一個(gè)中心服務(wù)器上完成測(cè)試。這個(gè)測(cè)試服務(wù)器有著高并行的特性,因此即使跑完Quora所有的測(cè)試也只需要不到5分鐘。這么快速的系統(tǒng)就是為了鼓勵(lì)開(kāi)發(fā)者們盡可能多地寫(xiě)測(cè)試和進(jìn)行測(cè)試。Quora有一個(gè)叫“本地測(cè)試(test-local)”的工具,來(lái)自動(dòng)找到和執(zhí)行和新增代碼有關(guān)的測(cè)試。為了更好地使用這個(gè)工具,Quora的測(cè)試必須要模塊化(這也在一個(gè)測(cè)試失敗了的情況下,幫助開(kāi)發(fā)者們快速找到bug并修復(fù))。為了確保這個(gè)目的和一些其它的關(guān)于測(cè)試代碼的重要性質(zhì),Quora有一份描述測(cè)試代碼書(shū)寫(xiě)規(guī)范的共享文件。這些原則在代碼審閱時(shí)被嚴(yán)格執(zhí)行。

和代碼審閱類似,Quora對(duì)于不同種類的改動(dòng)有不同的測(cè)試標(biāo)準(zhǔn)。如果新改動(dòng)有可能帶來(lái)嚴(yán)重后果和修復(fù)成本的話,Quora會(huì)要求更高的代碼覆蓋率。

所有的這些加在一起,使Quora寫(xiě)測(cè)試的意義最大化,以此減少長(zhǎng)期的開(kāi)發(fā)成本。

代碼質(zhì)量指導(dǎo)

Quora非常熱衷于共享代碼質(zhì)量指導(dǎo),這幫助Quora:

1. 更好地培訓(xùn)新來(lái)的開(kāi)發(fā)者;
2. 更好地在整個(gè)團(tuán)隊(duì)里共享Quora的經(jīng)驗(yàn)和智慧;
3. 設(shè)立共同的標(biāo)準(zhǔn)來(lái)提高代碼庫(kù)的一致性;
4. 減少開(kāi)發(fā)和審閱環(huán)節(jié)的工作量。例如,在每個(gè)審閱中都討論一下每行代碼是80個(gè)還是100個(gè)字符是沒(méi)意義的。Quora可以就討論這個(gè)問(wèn)題一次,然后在所有今后的代碼中都使用這個(gè)標(biāo)準(zhǔn)。
除了每種語(yǔ)言自身的語(yǔ)句規(guī)范之外,Quora也有更抽象的一些代碼規(guī)范,例如關(guān)于如何寫(xiě)出好的測(cè)試或是如何架構(gòu)代碼模塊,來(lái)幫助減少代碼的閱讀時(shí)間。這些規(guī)范并不是一成不變的。在Quora逐漸對(duì)各種權(quán)衡有了更深的理解的過(guò)程中,Quora也會(huì)改變這些規(guī)范來(lái)達(dá)到利益最大化。Quora也有大型代碼重構(gòu)的工具(部分是諸如例如 codemod 之類的開(kāi)源工具,其它的是Quora自己開(kāi)發(fā)的),以在Quora改變了某項(xiàng)規(guī)范之后回過(guò)頭去重構(gòu)所有的舊代碼。

整頓舊代碼

一個(gè)快速前進(jìn)的團(tuán)隊(duì)會(huì)嘗試很多新事物,自然而然,它們之中某些很好,而某些則不盡如人意。因此,一個(gè)快速前進(jìn)的公司的代碼庫(kù)里肯定會(huì)有很多沉淀下來(lái)的糟粕,即那些實(shí)際上大家不再使用,卻留在那里使許多事情變得更復(fù)雜的代碼。清楚這些糟粕,保持代碼庫(kù)的簡(jiǎn)潔,也會(huì)提高開(kāi)發(fā)速度。
Quora定期組織“整頓周(Cleanup weeks)”來(lái)清除這些糟粕。在這些整頓周里,一些指定團(tuán)隊(duì)——有時(shí)也會(huì)是整個(gè)公司——把所有的時(shí)間都花在清楚那些不用的舊代碼上。這些定期活動(dòng)減少了大家在“常規(guī)工作”和“整頓工作”中切換所需花費(fèi)的時(shí)間和精力,也讓整頓舊代碼變得更為有趣,帶來(lái)更多的社交價(jià)值。

部分代碼比其它的更加容易整頓,當(dāng)然也有部分代碼,整頓起來(lái)會(huì)對(duì)開(kāi)發(fā)速度有極大的影響。為了最好地利用大家整頓舊代碼的時(shí)間,Quora會(huì)基于清除它們所需耗費(fèi)的時(shí)間,和清除后它們對(duì)開(kāi)發(fā)速度帶來(lái)的影響,對(duì)各個(gè)代碼模塊的整頓優(yōu)先級(jí)進(jìn)行排序。

代碼查錯(cuò)與優(yōu)化(Linting)

人們很容易低估偶爾不遵循代碼語(yǔ)言規(guī)范(例如代碼注釋或每行代碼的長(zhǎng)度)的后果,但這些后果是會(huì)疊加起來(lái)的。確實(shí),時(shí)時(shí)記得并遵循很多規(guī)范是很惱人的,特別是規(guī)范越來(lái)越多的時(shí)候。因此,Quora并不驚訝,很多開(kāi)發(fā)者并不準(zhǔn)備遵循這些規(guī)范。

Quora開(kāi)發(fā)了一個(gè)公司內(nèi)部代碼查錯(cuò)和優(yōu)化的工具,叫做 qlint,來(lái)減少達(dá)成這一目標(biāo)的工作量。Qlint 是基于 flake8 和 pylint開(kāi)發(fā)的智能小工具,能識(shí)別文本結(jié)構(gòu)和抽象語(yǔ)法樹(shù)(AST)。這個(gè)工具讓Quora未來(lái)往里面添加新的代碼規(guī)則變得很容易。例如,Quora規(guī)定在Python里所有private的變量都必須在變量名前加下劃線,因而Quora在 qlint 里加了這一條規(guī)則來(lái)查找所有不符合這一規(guī)范的代碼。

Quora把 qlint 整合進(jìn)了許多其它開(kāi)發(fā)工具,因此開(kāi)發(fā)者們不必特別來(lái)關(guān)注 qlint 指出的各項(xiàng)問(wèn)題。對(duì)于剛剛起步的開(kāi)發(fā)者們,Quora把 qlint 整合進(jìn)了最流行的一些編輯器,例如 Vim、Emacs 和 Sublime,并在開(kāi)發(fā)者違反了代碼規(guī)范的時(shí)候提供可視化的提示。Qlint 也整合在了提交代碼的流程里,并在任何人想要提交代碼的時(shí)候以一種互動(dòng)化的方式運(yùn)行。事實(shí)上,取決于 commit 具體違反了哪條規(guī)則,這個(gè)工具甚至可能阻止代碼部署。Quora也把Quora的代碼規(guī)范文檔整合在了這個(gè)工具里,因此開(kāi)發(fā)者每違反一條規(guī)則,qlint 都會(huì)給出一個(gè)鏈接指向文檔里的那個(gè)規(guī)則條目。Quora的 Phabricator 也被配置成使用qlint。這樣,由于所有的錯(cuò)誤都由 qlint 以可視化的方式指出了,代碼審閱變得更為簡(jiǎn)單。
所有這些改進(jìn)都提高了Quora代碼庫(kù)的一致性,并使Quora能夠以最小的成本提高代碼質(zhì)量。

“Quora開(kāi)發(fā)的主要技術(shù)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI