乐者为王

Do one thing, and do it well.

追逐时髦的技术

英文原文:https://www.nemil.com/musings/shinyandnew.html

有关当前最好的框架或编程语言的争论经常发生在Web开发中。就这点而言,Scribd的联合创始人Jared Friedman在2015年写了一篇文章推荐创业公司使用Node.js代替Rails。

他提出几个关键点:

  • Rails很慢。
  • 黑客学院的毕业生都在使用Rails,贬低了它对高级工程师的价值,并减少了它的未来前景。
  • 创业公司应该使用那些前瞻性工程师今后将使用的技术,以保证它们的应用不过时。
  • 在Scribd,过去几年里它们已经从Prototype转换到jQuery,再到CoffeeScript,再到Angular,再到React。

Node.js是创业公司的绝佳选择,但它饱受批评的两个部分令我担忧。首先,一名创业公司的工程师应该了解什么技术将会在几年后流行,以保证它们的技术栈不过时。第二,杰出的软件工程师将被时髦的技术栈吸引到创业公司,而不是有趣的技术问题。在过去我还听到过更恶劣的传闻,创业公司的开发者拒绝接受使用ES5 JavaScript编程的工作(那时CoffeeScript刚出来),Mongo发布不久工程师就执意在生产环境下使用Mongo替代Postgres,渴望用最新的前端框架不断重构项目。

我担心有些程序员(和他们的雇主)有这种倾向,即把注意力放在转换技术栈到最新上。他们主要基于框架选择公司,力求在工作中使用最新而不是最好的工具。他们把时间花在新的库和框架上,而不是提高他们的核心技术能力。我们把他们称为技术栈追逐者——他们奋力追求在创业公司的技术栈中使用那些对核心输出(用户重视的软件功能、开发团队的生产力)提升有限的新技术(或者他们自己喜欢的技术)。

“时髦的”Web开发

很同情那些在Hacker News上的时髦的Web或移动应用开发者。作为在2012年的全栈创业公司的开发者,你正在构建后端使用Ruby/Rails,前端使用Backbone/CoffeeScript/Underscore的网站,同时使用Capistrano(或相关的Python类似物)部署你的应用。到2013年,你已经将后端转换到Node/Express/Mongo,前端为Grunt/Ember。在2014年,你已经彻底切换到MEAN技术栈,但在尝试过Koa以后考虑转移到Go(在Express核心贡献者告别Node.js转向Go以后)。在2015年,你在后端使用Express/Go,前端使用Gulp/ES2015/React,使用React Native代替原生移动语言,并且慢慢地将系统转换为使用Docker的微服务。很快,你将会被转换到Phoenix,如果Angular 2是正确的选择也会转换过去——甚至可能创造一个Go可以工作在Android上以及开源Swift可以适合你的技术栈的世界。(我显然是夸大效果,尽管这是HN头条新闻流行什么的一个合理表示。)

有几个原因表明这可能是合理的。时髦的Web工程师需要“时尚”才能获得未来的工作或合同。雇主使用框架或语言作为过滤器,而不是测试批判性思维和技能。雇主没有意识到有实力的开发者如果有正确的支持,可以在几个星期,通常是几天内成为许多语言或者框架的专家。有时趋势是无法阻止的:Swift正在取代Objective-C,世界正在转向更薄、更小的单体后端和更重、反应更灵敏的前端。通常,转变有着巨大的优势:生产力大幅上升,或者新的用户功能突然变得可能。然而,所有的变化都不会导致早期到中期的公司不采用就死,而为了乐趣或业余项目学习技术和认为它是生产环境的关键是迥然不同的。

我们可以用创业公司的时髦的Web或移动开发者与我们的计算机科学家作为对比。我的一个朋友是一家顶级科技公司的计算机神经学家——跟几乎所有从事技术工作的人一样,他的世界每隔几个月就会被重塑——得益于计算能力、脑成像和深度学习算法的快速发展。基本的编程工具其实变化不大。公平地说,只有C++从 11转换到14引起了一些焦虑。还有分布式计算系统、键/值存储和其它外部服务,但这些都是使用稳定的API构建的。他的大部分时间都花在单个DSL中的架构和算法上,而不是重写功能相似的代码或者快速学习提供有争议的好处和改变的库。

选择工具

人们可能会建议创业公司选择时髦的技术栈,因为它是招聘杰出的工程师的关键工具。我自己的观察是,杰出的工程师注重其它的东西。到目前为止,最重要的是提供有趣的问题去解决——有趣的人与他们合作。吸引力和强大的使命感是吸引优秀人才(工程师或者其他)的其它途径。

我并不是在抱怨技术发展太快,也不是说我们都应该用汇编语言或者C++或者Ruby编程。软件工程师清楚他们的目标——我们的领域以令人目眩的速度发展,但对于我们拥有的影响力这都是值得的,因为有10亿人上网。我认为你需要有能力快速地学会新的框架、语言或库(如何完成它的Ask HN)——依靠周围那些经验丰富的工程师,你的目标应该是尽快地具有生产力。除此之外,你应该深刻理解多种语言,而不仅仅是一种(但是同样的态度,不应盲目地扩展到框架或者轻量级的DSL)。

对于创业公司而言,Paul Graham在2013年被问到关于理想的语言:“我的意思是,我们有的创业公司在用PHP编写代码——这让我有点担心,但这并不像其它事情那么让我担心。”GitHub的技术主管Sam Lambert在最近的一次采访中谈到,他在2013年被GitHub的CTO面试时,对GitHub的技术栈是Rails、C和Bash脚本感到惊讶:“随着面试的继续,我发现他们实际上是一群非常务实的黑客,他们只钻研Ruby和C,使用更稳定的技术栈以便花时间工作在更有趣的事情上,而不是追逐最新最酷炫的技术。”GitHub的方法在我看来是Web和移动开发者的合理的平衡:广泛地探索工具,然后务实地选择解决你所面临的问题的工具(YAGNI适用于更多的地方,而不仅仅是面向用户的功能开发)。

令我担心的是,某些开发者,特别是在职业生涯早期的开发者,可能会以为创业公司的工程师不是问题解决者或计算机科学家,而是一个荣誉查找表——他们的任务是每隔几个月记住一个新的DSL——只能获得有限的好处。这使我们这些早期的工程师贬值——构建人们想要的东西,从事有趣的技术问题,快速交付代码。

无论如何,要在额外的时间里广泛地实践。如果好处是压倒性的,则切换生产环境中的语言/框架,但要考虑是哪些好处。警惕那些追求新技术却不考虑它对团队的预期优势的人。花时间学习概念和解决有趣的技术或用户问题。如果你有正确的应用边界,并选择你有现成生产力的框架,一旦你这样做了,你将具有一定的灵活性,但需要足够坚持才能达到产品与市场的匹配和超越。

任何一天打开Hacker News,你都能看到有帖子诱惑你使用某个框架、语言、类库或者服务去贡献和构建应用(包括一些像Mongo这样有大笔现金的公司,因此在它们的平台后面有营销预算)。有些工具拥有改变游戏规则的能力,其余的只有一些关键的不同功能,但是它们都需要时间才能成为专家。有些工具会大声宣告它们才是未来,并且嘲笑你所学到的东西——但是它们需要你的技能和意识与现有的技术真正地竞争。你会如何选择?

Comments