为什么要造轮子 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
luckyzhe
V2EX    程序员

为什么要造轮子

  luckyzhe 2015-07-08 11:49:39 +08:00 4620 次点击
这是一个创建于 3835 天前的主题,其中的信息可能已经有所发展或是发生改变。

作者 Lee Byron | 由 Nextoffer 翻译

前几天在 React-Europe 大会上,我分享了一个我花了三年多时间的项目 - GraphQL.

会议结束后,不少参会者问我:

Facebook 是怎么做到一直保持产出这些“反思当前最佳实践”的新技术的? 

既然这是 React 大会,那么就让我们从 React 开始讲起吧。


Photo: Rasmus Andersson

两年前

两年前我们开源 React 的时候,这一直是被 Javascript 社区取笑的对象;甚至 Facebook 内部(包括我自己)都不认为这是一个好想法。Jordan Walke 的执着和理想主义最终还是对大家产生了影响。最早我们以为他疯了,不过他的确是个疯子,但他也确实发现了一些什么。现在,我们看到 React 已经改变了我们在各种平台上「造」东西的方式。Adam Ernst 借鉴了 Jordan 的一些想法,然后「造」了 ComponentKit for iOS. 当然,我们自己的 iOS 组刚接触她的时候也是充满了猜疑;但再一次,ComponentKit 很大程度地改变了我们「造」iOS 程序的方式。

React 和 ComponentKit 都是 Facebook 内部个人自主发起的项目。事实上当时这些项目的方向和工程师团队原有的开发方式都是相反的。React 直接挑战我们当时非常看好的一些 JS 框架。其实刚开始开发 ComponentKit 的时候我们内部就已经「造」并且在使用了的一些 iOS UI 框架。

其他的工具并没有问题,也不差(话说回来他们其实很赞)但他们也不是完美的。 

他们各自都有着利弊权衡,都有自己的优势和劣势。只有在一个自由开发环境的情况下,工程师才能去「造」一些他们认为更高效帮助他们完成工作的工具。

工程师的冒险文化

在 Facebook,我们不仅仅让,更是鼓励,工程师做这些好玩的“实验”。其实这些项目还是存在一定风险的,而且也不是很吸引人,也常常失败(需要改)。然后你会发现像 React, ComponentKit, HHVM, GraphQL, Immutable.js, Flow, Pop, 和 AsyncDisplayKit 这样的“实验”。这些都是值得去冒的险。对于像 Facebook 这样拥有强大的工程团队的公司来说,其中一个优势是可以充分地让工程师们去尝试这些实验,而不是盯着 scrum 或者为了公司的短期业绩来工作。

上面提到的每一个项目都遇到过非常强烈的反对。有些人(有时候甚至是我)会想让一些项目早些承认失败。然而他们并没有停止。Facebook 不仅有很好的工程师管理哲学,而且有非常棒的管理层 - 他们知道相信工程师们的重要性。就算项目遇到了同事的反对,就算也未知项目的价值所在,就算还有更重要的事情可以去做,Facebook 的管理层信任他们的工程师去冒一些值得冒的险,同时专注在他们相信能够产生影响的领域。

我的小组 - Product Infrastructure,和大多数的 Facebook 小组一样都有相同的哲学:工程师对世界的影响不止于公司的产品。上面提到的开源项目都有着很强的社区,每个开源都对整个互联网/软件行业有着深刻的影响。开源不仅仅是一个公益理想化的东西,她还是我们如何学习和展示我们的工作启发的影响的重要组成部分。

健康的开源环境在招聘环节也是非常有利的。一些我面试过的求职者对我说,他们对 Facebook 的关注是因为看到了 React, AsyncDisplayKit, Pop, 这些项目;并且想参与到这些项目中去。这些项目吸引了非常聪明的人才进来,从而自然地产生一个良性循环。

Success is not found in isolation

随着项目变得越来越有意思,她的潜力被更多的人看到,团队组建 - 然后一个雪球效应自然地推进了一整个项目。在 Facebook,工程师做着与自己职份外的项目并不罕见;或者从一个小组调到其他小组都非常常见;而这样的文化让这个雪球可以滚起来。这也意味着每个项目后面有许多无名功臣。

在这里我想点名一些(远远少于全部成员)早期为 GraphQL 做出贡献的人:Nick Schrock, Daniel Schafer, 和我自己。

  • Beau Hartshorne 是 GraphQL 不可缺少的催化剂。他准确定位并指明了问题所在,找到了对的人,而且激发了我们去找解决问题的方案。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 DannDavid Renie 是两位推动第一版 GraphQL 的 iOS 工程师。是他们做了非常大量的工作把 GraphQL 整合进 News Feed. 他们也协助建立了一些我们一直沿用到今天的非常重要的基础设施。

  • Rasmus Andersson 用全新视角想象到一种不一样的方式在移动应用中传输数据;而这种方式成为了我们 Android SDK 的基础。他的一些想法还激发了 Relay - 用 GraphQL「造」web 端应用的工具。

  • 另外两位 GraphQL 组早期成员,Nathaniel Roman and Charles Ma, 帮助开发了 GraphQL 客户端工具。

  • Scott Wolchok 一手组织和改善了 GraphQL 的 iOS 和其他跨平台的客户端工具的数据模型。他的严谨的思路启发了我们去研究最新 cross-cutting 的进展。

到今天,已经有一个成熟的小组专门支持和投入到 GraphQL, 服务器,客户端工具,和 Facebook 的类型系统。

我们的使命

正是因为我们对持续产出长期价值的专注,让 Facebook 能够一直「造」出一些“反思当前最佳实践”的技术,且在业内引起不小的影响。我们敢去试错;我们相信工程师能去做正确的事。当一些“实验”看起来有点儿意思的时候,充满想法和聪明的人会自发地聚到一起来实现这个“实验”。 

在 Facebook, 我们的职责不仅仅是「造」Facebook,还是让世界变得更加的开放和连接。而我们这个 Product Infrastructure 小组通过开源这些工具来帮助我们完成这个使命。

原文链接 on Medium

*本文已获得作者翻译和传播许可

*转载请注明原文链接以及译文链接

8 条回复    2015-07-29 16:45:00 +08:00
Feiox
    1
Feiox  
   2015-07-08 13:49:52 +08:00   2
这个世界因为这些工程师而更美好。
几乎所有的新技术在开始时总有大量唱衰的声音,也有些新技术慢慢被更好的技术替换掉。但,计算机技术发展史与人类科学史比起来还是太短,所以,就这样玩下去吧,明天会更好。
wezzard
    2
wezzard  
   2015-07-08 14:01:58 +08:00
因篇文章了 upvote 帖子的按
beimenjun
    3
beimenjun  
PRO
   2015-07-08 14:13:23 +08:00
不是不推荐全文转载嘛?
itommy
    4
itommy  
   2015-07-08 14:28:15 +08:00
@wezzard 我发现 Facebook 的工程师非常善于写这种激动人心的文章,真的是骨子里的工程师文化
windyboy
    5
windyboy  
   2015-07-08 16:50:05 +08:00
不错
luckyzhe
    6
luckyzhe  
OP
   2015-07-08 18:03:35 +08:00
@beimenjun 是我们自己翻译的啦~☆(。)诚意一百分~
beimenjun
    7
beimenjun  
PRO
   2015-07-26 14:40:50 +08:00
@luckyzhe 翻译辛苦了
luckyzhe
    8
luckyzhe  
OP
   2015-07-29 16:45:00 +08:00
@beimenjun 我会替你转达给我们棒棒哒翻译大神的
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5386 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 59ms UTC 03:21 PVG 11:21 LAX 19:21 JFK 22:21
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86