跳到主要内容

重写一个大型生产系统中去

我在谷歌的团队正在努力重建一个大型生产系统(几乎) 我说“几乎”,因为一个组件的系统——一个库图像格式之间的转换,在c++中工作得相当好,所以我们决定把它按原样但系统的其余部分是100%Go,而不仅仅是用C ++或其他语言封装现有模块这是一次有趣的体验,我想我会分享一些经验教训。

另外,Go语言有一个可爱的吉祥物..awwww!
为什么重写?

我们必须回答的第一个问题是为什么我们首先考虑改写当我们开始这个项目时,我们采用了现有的基于c++的系统,已开发的几年,我们的姐妹两个团队在谷歌这是一个很好的系统和它工作得非常好然而,它一直与截然不同的目标,不同的项目使用导致重要的吸积的事情随着时间的推移,很明显,对于我们来说,继续快速创新对于这个庞大的共享代码库来说将是极具挑战性的对于原始开发人员来说,这并不是一件好事 - 事实上,当某些设计决策变得僵化时,重新考虑它们变得更加困难,特别是当多个团队共享代码时。

在重写之前,我们意识到我们需要只有一小部分原始系统的功能——也许20%(或更少)的其他项目在做什么我们还在考虑对其核心逻辑进行一些根本性的更改,并希望以不会影响我们团队或使用代码的其他人的速度的方式试验新功能最后,与对任何大型共享代码库进行更改相关的认知负担是无法忍受的 - 几乎所有更改都需要触及开发人员未完全理解的大量代码,并更新对代码的其他用户造成不明后果的测试用例。

因此,我们决定分叉并从头开始重写我们做出的选择是采取一个初始生产力冲击在最初重写会成群结队地偿还当我们能够添加更多的功能它还使我们有机会重新思考我们系统的一些核心设计决策,这对于提高我们对其工作的理解非常有价值。

为什么去?

I'll admit that at first I was highly skeptical of using Go该生产系统直接位于用户与其内容之间的服务路径上,因此必须快速它还必须处理大量查询量,因此CPU和内存效率是关键去的依赖垃圾收集给我暂停(双关语. .考虑到Java开发人员在管理内存占用方面经历了多大的痛苦,har har har)另外,我不确定Go会如何支持我们想要在Google内部进行的开发我们的系统有很多依赖项,我想要的最后一件事是必须重新编译我们已经在C ++中使用的Go中的许多库最后,也仅仅是对未知的恐惧。

当我的整个态度改变 Michael Piatek(集团)的明星工程师给我最初的削减核心系统在去重写,不到一个星期的工作的结果与原来的基于c++的系统, 我实际上可以阅读代码,虽然我不知道去(还)# 1的好处我们从提供的轻量级的并发性 够程而不是数十个异步回调的混乱链遍布数十个源文件,系统的核心逻辑适合于几百行代码,都在同一个文件中你刚读它从上到下,它是有意义的。

迈克尔也做了这样的观察 Go是一种用于编写基于Web的服务的语言。 Its standard libraries provide all of the machinery you need for serving HTTP, processing URLs, dealing with sockets, doing crypto, processing dates and timestamps, doing compression与Python不同,Go是一种编译语言,因此非常快Go的模块化设计可以跨模块实现代码的美妙分解,并且它们之间具有明确的显式依赖关系其增量编译方法使得构建闪电快自动内存管理就意味着你永远不必担心释放内存(尽管通常警告基于语言应用)。

简洁

从句法上讲,Go非常简洁实际上,Go风格指南鼓励您尽可能简洁地编写代码起初这把我推到了墙上,因为我习惯使用长描述性变量名称并在尽可能多的行上传播表达式但是现在我很欣赏简洁的编码方法 阅读和理解 the code later much, much easier.

就我个人而言,我很喜欢编码我可以达到这一点,而不必编写一堆样板文件只是为了让编译器满意与C ++不同,我不必跨代头文件和.cc文件分割我的代码逻辑与Java不同,您不必编写编译器可以推断的任何内容,包括变量类型Go感觉很像像Python这样的精简脚本语言编码,但是你可以免费获得类型安全性。

我们的Go-based重写是121 Go源文件,总共约21K行代码(包括注释)将其与原始系统进行比较,原始系统是具有460K代码行的1400 C ++源文件(记得我说什么新系统实现新系统的功能的一个小子集,不过我确实觉得减少代码的大小是不成比例的功能降低。)

过渡时间呢?

学习围棋很容易来自类似C语言的背景There are no real surprises in the language; it pretty much makes sense标准库是 非常好的记录,还有很多 在线教程None of the engineers on the team have taken very long at all to come up to speed in the language; heck, even one of our interns picked it up in a couple of days.

总的来说,改写了约5个月,已经在生产运行我们还实施了3或4个主要的新功能 更久,更长 to implement in the original C++ based system, for the reasons described above我估计我们的团队的生产力已经提高了至少十倍通过移动到新代码库,并使用。

为什么不去?

关于围棋的一些事情,我并不是非常高兴,而且往往会不时地咬我。

首先,您需要“知道”您正在处理的变量是接口还是结构结构可以实现接口,当然,总之你倾向于把这些当作一回事但是当你处理一个结构时,你可能会通过引用传递,其中类型是 * MYSTRUCT,或者你可能正在传递值,其中类型只是 MYSTRUCT另一方面,如果你正在处理的东西是“只是”一个接口,你永远不会有一个指向它的指针 - 一个接口  a pointer in some sense你看时可以容易混淆的代码传递东西没有*记住,它可能会“指针”如果它是一个接口而不是结构。

Go的类型推断使得精益代码成为可能,但是如果它不明确的话,需要你挖掘一下以找出给定变量的类型是什么所以代码如下:
foo,酒吧:= someFunc(baz)
你真的很想知道什么 FOO酒吧实际上,如果你想添加一些新的代码来操作它们如果我能走出20世纪70年代并使用除vi以外的编辑器,也许我会在这方面从IDE获得一些帮助,但我坚决拒绝使用任何需要使用鼠标的工具来编辑代码。

最后,Go自由使用接口允许结构“偶然”实现接口您永远不必显式声明给定的结构实现了特定的接口,尽管在评论中提到它是一种很好的编码风格The problem with this is that it can be difficult to tell when you are reading a given segment of code whether the developer intended for their struct to implement the interface that they appear to be projecting onto it此外,如果您想重构接口,您必须手动或多或少地找到所有(未声明的)实现。

最重要的是我发现编码 真的,真的很有趣这是一件坏事,因为我们都知道“真正的”编程应该是与编译器和工具斗争的艰苦,痛苦的练习因此Go中的编程让我变得柔软有一天,我会发现自己身处八角形的戒指,身上带着一群汗流,背,肌肉发达的C ++程序员,只能把它弄得一团糟,而我只知道他们会和我擦地板那没关系,直到那时我才会继续拥抱我的毛茸茸的地鼠并跑步 gofmt自动调用我的代码。

ObDisclaimer:一切都在这篇文章中是我的个人意见,不代表我的雇主的观点。

评论

  1. Matt, have you tried the margo and gocode systems? I use GoSublime with Sublime Text, but am otherwise a Vim snob, and if I hadn't gotten used to using Sublime Text for Go, I believe from what I've read that I'd be using these插件将Sublime Text变成非常接近IDE的东西,我相信它们为Vim提供了基本相同的功能它们提供自动完成提示,指示变量和函数的类型当我试图找出未明确声明的东西的类型时,这对我非常有帮助。

    回复删除
    回复
    1. 获取Vim用户的提示:http://0value.com/my-Go-centric-Vim-setup

      删除
    2. 不,我没有尝试过 - 会检查出来!

      删除
    3. SublimeText2还有“复古”模式,它为用户提供了许多Vim键盘快捷键,包括命令,视觉和编辑模式。

      删除
  2. 如何安装在本地计算机上运行?

    回复删除
    回复
    1. 如果您有OS X,请尝试使用homebrew(http://brew.sh/)使用brew,所有更新都很简单最近升级从1.1.1 1.1.2通过酿造几乎同一天被释放出来了。

      删除
  3. http://golang.org/doc/install
    有一个OS X的安装程序,一个用于Windows的MSI软件包和用于Linux的tarball(大多数发行版都有Go存储库)。

    回复删除
  4. 当你在伯克利时,你回来了
    热衷于编写系统代码
    在Java中我记得听你说话
    关于你在这期间的好主意
    学位论文...

    回复删除
    回复
    1. 我曾经比现在更热衷于Java系统编程在某种程度上,这是因为语言和运行时库已经发展到Java中标准的处理方式非常复杂和冗长的程度笑话是你需要一个FactoryFactoryFactoryFactory来完成任何事情Java空间中出现了许多反模式,这有点令人难过从本质上讲,Java语言和运行时非常好运行时库得到的方式,太臃肿。

      删除
  5. 我们正在我们公司进行完全相同的重写,并且会有完全相同的说法除了我们决定 - 但不是完全一致 - 使用来自.NET land的完整变量名(没有缩写)问题是,我们发现自己仍然违反本公约,因为有时的实用性。

    接口类型的问题是我们仍然试图弄清楚. .有效的去建议结束单一方法接口的名称“呃”,但什么也没说为多个接口方法也许我们会在名字的末尾添加一个“我”?

    回复删除
    回复
    1. 链接方法名怎么样?
      In Go's standard library you find interfaces like the 'io.ReadWriteCloser' [ http://golang.org/pkg/io/#ReadWriteCloser ].
      当然,这只适用于较小的接口。

      删除
    2. You're right; if each interface had one method and you layered no more than two, this works, but even for us, "AccountLoaderUpdater" was a little much:)

      删除
    3. Hard to say what works for your team, and I may not understand the example, but that I might call that an accounts.Store, or somepkg.AccountStore if needed.

      在阅读代码时,它可能有所帮助,几乎总是通过指针处理具体对象所以它是* bufio.Writer,* bytes.Buffer等,但是io.Reader,crypto.Hash等。

      删除
  6. 嗨,

    关于你的问题,不知道类型的foo,bar in
    foo,bar:= someFunc(baz)

    我使用名为vim-godef的Vim插件它有点像ctags,但更好它让你跳转到定义在你的代码库以及来源所以你只是'gd'远离学习你的函数所需要的东西并返回。

    回复删除
    回复
    1. 是的,我有类似的vim插件,但如果我记得使用它该死的:-)

      删除
  7. 我们要做同样的事情在Twiitch(我的视频游戏公司),为我们的服务器端消息处理目前一切都是用相当精简的Java编写的,但性能优势可以直接转化为更大规模的服务器成本。

    阻止我直接进入的一件事是调试/ IDE支持。

    我知道你不喜欢使用一个编辑器和一个鼠标,每一个自己的,然而我们的程序员,包括我,仍然像一个调试器。

    我使用LiteIDE GDB的支持,很好(交互式调试、堆栈变量所有工作),但是我很好奇你的团队如何走近调试21日k线,我肯定你有错误没有被单元测试,所以你只是printf或做一些更多的互动吗?

    Shane.

    回复删除
    回复
    1. gdb适用于Go我也喜欢旧的“添加printf无处不在”的方法但我老了。

      删除
  8. “与Python不同,Go是一种编译语言,因此非常快”。

    使用当前的JIT和运行时优化,除了启动的不变价格之外,许多传统解释的程序非常接近本机编译的代码,特别是对于长期运行的程序,例如服务器有趣的是听到的一个设计师去谈论他所认为的“本地”代码在MSDN的频道9:http://www.youtube.com/watch?v=on5DeUyWDqI&t=3m30s

    回复删除
    回复
    1. You don't have to convince me of this; I spent a lot of time working on JIT compiler optimization for Java但是请检查,例如:http://ziutek.github.io/web_bench/

      删除
    2. 旧...

      检查:
      http://www.techempower.com/benchmarks/#section=data-r6&l=e80

      最好的祝福,
      DobrosławŻybort

      删除
  9. 我有点心烦意乱,谷歌不占用Scala编译后的代码几乎总是和Java一样快类型系统比Go好得多,并且能够比Go推断更多,并且对泛型有非常高级的支持Scala代码总是比Go更紧凑(大多数函数式语言都是如此)大多数特性在其他语言中只是作为图书馆在Scala中实现特别是Go频道可用作Scala中的Akka actor库然而,Go与Scala的Futures和Finagle库没有任何可比性,可用于异步I / O支持。

    If Google were to invest more resources in Scala, it can make developers world wide much more happier.

    我知道Go可能是对C ++ / Java的改进但它相比所有编程语言的研究在过去3年,产生了语言,像Haskell,毫升和Scala。

    就个人而言,20年前Go可能是一个不错的选择,但是现在,当Scala可以做得更好时,我只是不明白为什么我应该使用它。

    回复删除
    回复
    1. Scala没有解决Go旨在解决的所有问题它会导致更严重的的一些问题。

      背景资料:http://talks.golang.org/2012/splash.article

      删除
    2. Google工程师喜欢在不到一个下午的时间内编译和测试他们的代码。

      删除
    3. 我已经作为Scala开发人员工作了两年,并且必须说Scala编译器的缓慢是一个巨大的缺点。

      编译时的停顿甚至几个文件是足够长的时间来不断分散你从你想解决的问题我(主观上)从未觉得我在Scala中比在Java中更有效率。

      删除
    4. 实际上,Go的一个最重要的设计考虑因素是快速编译在大型项目中(就像我们在谷歌那样),这很重要。

      删除
    5. 我在eclipse IDE中使用Scala,它在不到3秒的时间内启动项目这是因为增量构建完整版本速度较慢项目的大小大约是几千行Scala + Java代码虽然这可能看起来不是很大,但Scala代码比Java更紧凑Scala编译器本身不到100K行代码。

      使用增量构建,我从未被慢速编译问题所困扰。

      Frankly, with Scala I have written 50-100 lines of code, equivalent to maybe 500 lines of Java code and it very often works on the first run! Because the type checker really is that good and catches 90% of your typical bugs, which makes you much more aware of the remaining 10% of the bugs与任何其他语言的代码相比,我在Scala中的代码质量非常高,除了可能是Haskell我已经编写了数千行Scala代码,几乎没有人报告任何错误。

      如果您将构建设置为执行增量编译,我只是没有看到任何理由切换到其他内容我看了去,他们只有一组有限的建在泛型和一个更复杂的比JVM GC,没有IDE支持(自动完成,后台编译等,错误类型时突出显示)和弱小的生态系统相比,Scala / Java我只是不明白使用Go可以获得什么好处。

      删除
    6. >背景资料:http://talks.golang.org/2012/splash.article

      我在这里没有找到任何关于scala的具体信息

      删除
    7. 所以如果你喜欢的话,继续使用Scala为了平衡你的意见,我很高兴谷歌不是Scala在很大程度上。

      删除
    8. 我我的名字是格雷格Sudderth,就以为我说因为匿名都不好玩!

      在我看来,人学会了程序C“ed”和nroff-ing编译器(想象C源0列有nroff代码),是一个巨大的进步得到它,我们曾经认为C编译器是一个大的宏汇编程序...生成更多程序集的更快的方法。

      我不去比较Haskell /毫升/ Scala,的比较起来,向下我正在看着,从集会,上升I can't write an OS in Java, or ML, or whatever, why would you? Even a custom language-specific-as-an-OS (think Lisp Machines) in the 80's...nope但是,我可以编写一个操作系统,我可以做我可能使用Java 1.4的所有实用程序编程,并且,它将以侧翼速度运行,没有很少可以驯服的恶魔...内存管理不善只有老定时器才能记住Purify之前的情况。

      From a guy that only knows a modicum of Python, the main comparative factor I'd use is "what libs does it have" and Python is going to win for sure, because its a well-loved and 20 year old language让我们看看go中会发生什么。

      速度,穿线,比C ++和STL更少的宗教信仰,以及涉及的巨大和讨厌的问题哇I can also bind over to another language, and use (e.g.) a lib like nanomsg, great! I think they got the whitespace all wrong but I am a AT&T flavored guy, not BSD哦:)

      G。

      删除
    9. >,但我可以写一个操作系统中去

      Go需要一个垃圾收集器您可以编写一个操作系统在Haskell / ML / Scala尽可能轻松地编写一个在走。

      http://stackoverflow.com/questions/6638080/is-there-os-written-in-haskell

      删除
    10. >所以如果你喜欢的话,继续使用Scala为了平衡你的意见,我很高兴谷歌不是Scala在很大程度上。

      我解释了为什么我认为Scala优于Go我不是简单地说“我喜欢它”如果你能解释为什么会有平衡优于Scala我看到了编译速度的优势,但是如果你有一个正确设置的增量编译开发环境,那么它在很大程度上被否定了。

      Is Scala/functional programming too hard? Or is it simply that people haven't tried it out or too afraid of switching paradigms and want to take smaller steps, like support for closures etc, but no advanced type system or curried functions?

      删除
    11. 哦,我的
      >我在Scala代码质量非常高,代码在任何其他语言相比,除了可能是Haskell。
      >我已经编写了数千行Scala代码,几乎没有人报告任何错误。
      所以你编写的代码没有错误,质量超高,你可能是这个星球上唯一的代码!
      我作为C#开发人员工作了5年,作为Scala开发人员工作了1年我现在是Scala开发人员,Go是我的爱好。
      在我日常工作构建时间要弄死我我听到观众的“增量构建”Oh really? Don't you use git? We use git, and each feature/bug is worked on in separate branchSo guess what happen when you switch branch? Incremental build fails, and starts from scratch这花了很多时间,太可怕了。
      那么我在Go中喜欢的是你可以阅读和理解其他开发人员的代码在scala中,每个开发人员都发明了自己的DSL,所以有很多$>#> - > ##> - 去猜猜这个文件意味着什么暗示也很棒,去弄清楚发生了什么元组很棒,但“results.map(_._ 1._2)”很糟糕。
      Scala是超级强大的但大国意味着巨大的责任它太容易在scala中编写代码,没有人能理解没有很多研究Scala is modern C++ - long compilation, a lot of power and very complicated哦,他们还插入XML内部语言Why? XML times are gone, JSON, YAML is leading为何选择XML?

      删除
    12. >你编写代码没有错误和超高品质,你可能地球上只有一个!

      是的,但我不是唯一的询问Haskell / Scala / ML的论坛,这是一个常态,而不是例外如果你在Scala中编写Java然后是,那么错误率将保持很高我刚刚在昨天写了一个60行程序(一个相当复杂的差异程序),它在第二次尝试时正确运行第一次尝试有一个错误,因为对拉链的误解
      适用于Scala地图。

      有一些haskell程序员将代码发布到hackage,甚至没有运行它们(只是编译)和几个使用频繁的Haskell库已经多年没有一个bug报告。

      删除
    13. Go和Scala的比较

      https://news.ycombinator.com/item?id=6333955

      删除
  10. 可能我们要找出服务,在时间吗?

    和非常有趣的在评论中看到两个工具开发联系,顺便说一句对于一个相对较新的工具链和一个老派编辑来说,这比我预期的要多得多。

    回复删除
  11. >此外,如果您想重构接口,您必须手动或多或少地找到所有(未声明的)实现。

    或者使用go - r:http://golang.org/cmd/gofmt/

    回复删除
    回复
    1. 我好奇的细节问题重构接口,部分是因为我从来没有在一个系统和马特的一样大。

      If the compiler can statically determine something doesn't satisfy a necessary interface, it seems like it often tells you; you get "[type] doesn't implement [interface]" if you pass a string to io.Copy() or do similar stunts.

      Was the problem here mainly that the compilation errors aren't a clean/usable way to find the implementors? Or is it mostly that some of the important type-interface relationships aren't checked until runtime (e.g., by a type assertion)? If the latter, is the issue one of "generic" types (collections, etc.) storing interface{} or is it something more app-specific?

      删除
    2. As a stand-in for real "X implements Y" declarations, you can always add various cheap statements that cause a compile-time interface-satisfaction check if there weren't such statements already--different phrasings I was playing with last night: http://play.golang.org/p/lUZtDdP5ia

      删除
  12. 为什么不Erlang呢?

    我们在Erlang中重写了一个Java系统代码大小10 x比用Java编写的更小、更具有可伸缩性。

    回复删除
    回复
    1. 因为谷歌的招聘实践支持年轻人去常春藤联盟大学,不称职的工程师谁听说过erlang唉,企业文化来自顶层,谷歌的顶端是两个非常傲慢,非常年轻的人。

      实际情况是,Go并不能提供Erlang所提供的功能(Scala也不会提供),但是时尚追随者的狂热者并不足以了解这一点。

      他们认为“它已经开始了,所以它是并行的!”

      Ever since the dotcom bubble, when every kid who wanted to be rich decided to be a CS major (without regard to any real interest in programming) our profession has deteriorated, good engineering practice is scoffed at and the mediocre run, like lemmings, after the latest fad.

      这就是为什么,例如,Rails如此受欢迎,并在它之后node.js后者,虽然是自己的惩罚这些平庸的程序员应该被困在地狱调航运糟糕的代码。

      去不是脏话. .但它的受欢迎程度不成比例的提供,是新的。

      删除
    2. 好主人,谷歌首席执行官已经40岁了,主席是58岁You'll have to judge for yourself whether they're "arrogant," but they're not young.

      The reality is that Go is an awesome systems programming language, and a lot of people don't like functional programming (even a lot of people who aren't "kid[s] who wanted to be rich without regard to any real interest in programming.") Scala, Erlang, etc对一些人来说很有帮助,但是成熟的想法,comptent人们使用Erlang和Scala和恨,是荒谬的。

      BTW how do you know Scala and Erlang are not "fads"? Scala is only 10 years old and Erlang has only been publicly available for 15 years.

      删除
    3. 我根据自己的需要使用Go和ErlangI prefer Erlang's design and I adore OTP, however I'll be the first to admit that learning to think in Erlang was significantly more challenging than learning to think in Go, the latter being very similar to almost every other imperative language I've already used另外,在资源使用方面Go非常令人惊讶(与我使用过的许多其他语言相比,使用非常少的CPU和内存,如Ruby和Java),而Erlang VM往往会使用相当多的RAM。

      删除
    4. 立刻# 1 re:“谷歌的招聘实践支持年轻人去常春藤联盟大学,“我甚至不知道从哪里开始你甚至意识到去的设计者是谁?

      删除
    5. Go中没有调度程序抢占与Erlang相比:(

      The lack of per-process heaps and garbage collection is also scaring me away from Go.

      删除
    6. 抢占即将到来请参阅https://codereview.appspot.com/10264044

      删除
  13. So, did you have problems with GC? It is really slow on our test project.

    回复删除
    回复
    1. 我们必须注意我们的程序中垃圾累积了多少以及GC暂停时的情况我不认为它比任何其他垃圾收集语言更糟糕,但我没有数据来支持它我只想说我们不感到任何疼痛。

      删除
  14. 有任何运动添加链接到FORTRAN库做数值的事情吗?

    回复删除
  15. 伙计,如果你学会了ctags照顾问题# 2的函数定义,甚至# 1:)去vim !

    回复删除
  16. 小错误:

    <记住我所说的新系统实现新系统功能的一小部分

    >记住我所说的新系统实现旧系统功能的一小部分

    回复删除
  17. 那么与C ++相比,Go系统的性能如何呢?

    回复删除
  18. 嗨马特,

    Do you have any pointer for healing mechanism of systems? It means that problem is reported and system heals by its own self.

    如果你有.. !!请提供任何指示!

    回复删除
  19. 我肯定是一个大的粉丝比C + +,但你得到多少好处的如果你做了同样的修改和变化范围相同,但是在c++中呢?

    Also, I think it's interesting that you say you need features that an IDE were built to help you with (type resolution), then say "but I won't because they require a mouse" and then say you need even more IDE features (finding types that conform to an interface - that's text editor rocket science but IDE bread and butter).

    一个好的IDE不需要比一个好的文本编辑器更多的鼠标使用,即使他们这样做,你也错过了你想要拥有的功能,因为自我约束Are you trying to be productive or to prove a point? Whatever inhibition you have, get over it and just use an IDE有很多vi和emacs绑定。

    或解释和证明我错了,当然。

    回复删除

发表评论

此博客的热门帖子

为什么我离开哈佛

我已经决定辞去我在哈佛大学的终身教职,留在谷歌Obviously this will be a big change in my career, and one that I have spent a tremendous amount of time mulling over the last few months.

我不应该让谣言传播我的举动的原因,我认为我应该非常直接地解释我的想法。

我首先要说的是,由于哈佛问题,我不会离开相反,我喜欢哈佛大学,会错过很多计算机科学系是绝对一流的,学生是教授希望与之合作的最佳人选这是一个梦幻般的环境,非常支持,并且有很多优秀的人才。 他们疯狂到足以让我任职我现在离开时感到内疚我加入了哈佛大学,因为它提供了一个机会,可以对一所重要学校的一个重要部门产生重大影响。我对八年前去那里的决定感到无比遗憾但是......

运行一个软件团队在谷歌

自从我离开学术界以来,我经常被问到谷歌的工作是什么样的我想从终身教授到软件工程师听起来像是一大步除了工作职位之外,我在新职位上比在哈佛大学工作的8年里更快乐,更富有成效,尽管在担任教授和运营软件团队之间存在很多相似之处。

我在Google西雅图办公室领导一个团队,负责移动网络性能领域的一系列项目(有关我团队工作的更多背景,请参阅我的 早些时候博客的主题)我们的一个项目是最近宣布的 数据压缩在Chrome移动代理支持我们还在工作 的PageSpeed一系列技术,特别是移动网络优化,以及一些我还不能谈论的其他很酷的东西。

我的正式职位名称只是“软件工程师”,这是Google最常见(和令人垂涎)的角色(我说“令人垂涎的......”
yabo88安卓
yabo88安卓 is a computer scientist and engineering manager at Google, where he works on ChromePrior to joining Google, he was a Professor of Computer Science at Harvard. 更多关于马特……