為什么要造輪子?
前幾天在 React-Europe 大會(huì)上,我分享了一個(gè)我花了三年多時(shí)間的項(xiàng)目 - GraphQL.
會(huì)議結(jié)束后,不少參會(huì)者問(wèn)我:
Facebook 是怎么做到一直保持產(chǎn)出這些“反思當(dāng)前***實(shí)踐”的新技術(shù)的?
既然這是 React 大會(huì),那么就讓我們從 React 開(kāi)始講起吧。
兩年前
兩年前我們開(kāi)源 React 的時(shí)候,這一直是被 JavaScript 社區(qū)取笑的對(duì)象;甚至 Facebook 內(nèi)部(包括我自己)都不認(rèn)為這是一個(gè)好想法。Jordan Walke 的執(zhí)著和理想主義最終還是對(duì)大家產(chǎn)生了影響。最早我們以為他瘋了,不過(guò)他的確是個(gè)瘋子,但他也確實(shí)發(fā)現(xiàn)了一些什么。現(xiàn)在,我們看到 React 已經(jīng)改變了我們?cè)诟鞣N平臺(tái)上「造」東西的方式。Adam Ernst 借鑒了 Jordan 的一些想法,然后「造」了 ComponentKit for iOS. 當(dāng)然,我們自己的 iOS 組剛接觸她的時(shí)候也是充滿(mǎn)了猜疑;但再一次,ComponentKit 很大程度地改變了我們「造」iOS 程序的方式。
React 和 ComponentKit 都是 Facebook 內(nèi)部個(gè)人自主發(fā)起的項(xiàng)目。事實(shí)上當(dāng)時(shí)這些項(xiàng)目的方向和工程師團(tuán)隊(duì)原有的開(kāi)發(fā)方式都是相反的。React 直接挑戰(zhàn)我們當(dāng)時(shí)非常看好的一些 JS 框架。其實(shí)剛開(kāi)始開(kāi)發(fā) ComponentKit 的時(shí)候我們內(nèi)部就已經(jīng)「造」并且在使用了的一些 iOS UI 框架。
其他的工具并沒(méi)有問(wèn)題,也不差(話(huà)說(shuō)回來(lái)他們其實(shí)很贊)但他們也不是***的。
他們各自都有著利弊權(quán)衡,都有自己的優(yōu)勢(shì)和劣勢(shì)。只有在一個(gè)自由開(kāi)發(fā)環(huán)境的情況下,工程師才能去「造」一些他們認(rèn)為更高效幫助他們完成工作的工具。
工程師的冒險(xiǎn)文化
在 Facebook,我們不僅僅讓?zhuān)枪膭?lì),工程師做這些好玩的“實(shí)驗(yàn)”。其實(shí)這些項(xiàng)目還是存在一定風(fēng)險(xiǎn)的,而且也不是很吸引人,也常常失?。ㄐ枰模H缓竽銜?huì)發(fā)現(xiàn)像 React, ComponentKit, HHVM, GraphQL, Immutable.js, Flow, Pop, 和 AsyncDisplayKit 這樣的“實(shí)驗(yàn)”。這些都是值得去冒的險(xiǎn)。對(duì)于像 Facebook 這樣擁有強(qiáng)大的工程團(tuán)隊(duì)的公司來(lái)說(shuō),其中一個(gè)優(yōu)勢(shì)是可以充分地讓工程師們?nèi)L試這些實(shí)驗(yàn),而不是盯著 scrum 或者為了公司的短期業(yè)績(jī)來(lái)工作。
上面提到的每一個(gè)項(xiàng)目都遇到過(guò)非常強(qiáng)烈的反對(duì)。有些人(有時(shí)候甚至是我)會(huì)想讓一些項(xiàng)目早些承認(rèn)失敗。然而他們并沒(méi)有停止。Facebook 不僅有很好的工程師管理哲學(xué),而且有非常棒的管理層 - 他們知道相信工程師們的重要性。就算項(xiàng)目遇到了同事的反對(duì),就算也未知項(xiàng)目的價(jià)值所在,就算還有更重要的事情可以去做,F(xiàn)acebook 的管理層信任他們的工程師去冒一些值得冒的險(xiǎn),同時(shí)專(zhuān)注在他們相信能夠產(chǎn)生影響的領(lǐng)域。
我的小組 - Product Infrastructure, 和大多數(shù)的 Facebook 小組一樣都有相同的哲學(xué):工程師對(duì)世界的影響不止于公司的產(chǎn)品。上面提到的開(kāi)源項(xiàng)目都有著很強(qiáng)的社區(qū),每個(gè)開(kāi)源都對(duì)整個(gè)互聯(lián)網(wǎng)/軟件行業(yè)有著深刻的影響。開(kāi)源不僅僅是一個(gè)公益理想化的東西,她還是我們?nèi)绾螌W(xué)習(xí)和展示我們的工作啟發(fā)的影響的重要組成部分。
健康的開(kāi)源環(huán)境在招聘環(huán)節(jié)也是非常有利的。一些我面試過(guò)的求職者對(duì)我說(shuō),他們對(duì) Facebook 的關(guān)注是因?yàn)榭吹搅?React, AsyncDisplayKit, Pop, 這些項(xiàng)目;并且想?yún)⑴c到這些項(xiàng)目中去。這些項(xiàng)目吸引了非常聰明的人才進(jìn)來(lái),從而自然地產(chǎn)生一個(gè)良性循環(huán)。
Success is not found in isolation
隨著項(xiàng)目變得越來(lái)越有意思,她的潛力被更多的人看到,團(tuán)隊(duì)組建 - 然后一個(gè)雪球效應(yīng)自然地推進(jìn)了一整個(gè)項(xiàng)目。在 Facebook,工程師做著與自己職份外的項(xiàng)目并不罕見(jiàn);或者從一個(gè)小組調(diào)到其他小組都非常常見(jiàn);而這樣的文化讓這個(gè)雪球可以滾起來(lái)。這也意味著每個(gè)項(xiàng)目后面有許多無(wú)名功臣。
在這里我想點(diǎn)名一些(遠(yuǎn)遠(yuǎn)少于全部成員)早期為 GraphQL 做出貢獻(xiàn)的人:Nick Schrock, Daniel Schafer, 和我自己。
Beau Hartshorne 是 GraphQL 不可缺少的催化劑。他準(zhǔn)確定位并指明了問(wèn)題所在,找到了對(duì)的人,而且激發(fā)了我們?nèi)フ医鉀Q問(wèn)題的方案。Sometimes it’s hard to see the forest through the trees, and Beau’s a rare person who is always looking at the forest.
Jonathan Dann 和 David Renie 是兩位推動(dòng)***版 GraphQL 的 iOS 工程師。是他們做了非常大量的工作把 GraphQL 整合進(jìn) News Feed. 他們也協(xié)助建立了一些我們一直沿用到今天的非常重要的基礎(chǔ)設(shè)施。
Rasmus Andersson 用全新視角想象到一種不一樣的方式在移動(dòng)應(yīng)用中傳輸數(shù)據(jù);而這種方式成為了我們 Android SDK 的基礎(chǔ)。他的一些想法還激發(fā)了 Relay - 用 GraphQL「造」web 端應(yīng)用的工具。
另外兩位 GraphQL 組早期成員,Nathaniel Roman and Charles Ma, 幫助開(kāi)發(fā)了 GraphQL 客戶(hù)端工具。
Scott Wolchok 一手組織和改善了 GraphQL 的 iOS 和其他跨平臺(tái)的客戶(hù)端工具的數(shù)據(jù)模型。他的嚴(yán)謹(jǐn)?shù)乃悸穯l(fā)了我們?nèi)パ芯?** cross-cutting 的進(jìn)展。
到今天,已經(jīng)有一個(gè)成熟的小組專(zhuān)門(mén)支持和投入到 GraphQL, 服務(wù)器,客戶(hù)端工具,和 Facebook 的類(lèi)型系統(tǒng)。
我們的使命
正是因?yàn)槲覀儗?duì)持續(xù)產(chǎn)出長(zhǎng)期價(jià)值的專(zhuān)注,讓 Facebook 能夠一直「造」出一些“反思當(dāng)前***實(shí)踐”的技術(shù),且在業(yè)內(nèi)引起不小的影響。我們敢去試錯(cuò);我們相信工程師能去做正確的事。當(dāng)一些“實(shí)驗(yàn)”看起來(lái)有點(diǎn)兒意思的時(shí)候,充滿(mǎn)想法和聰明的人會(huì)自發(fā)地聚到一起來(lái)實(shí)現(xiàn)這個(gè)“實(shí)驗(yàn)”。
在 Facebook, 我們的職責(zé)不僅僅是「造」Facebook,還是讓世界變得更加的開(kāi)放和連接。而我們這個(gè) Product Infrastructure 小組通過(guò)開(kāi)源這些工具來(lái)幫助我們完成這個(gè)使命。