创业公司更适合用 Go 语言

2020-07-09 00:00:00 语言 部署 的是 配置 心智

对于创业公司来说,人少资源少、产品又要求快速上线。选择合适的技术栈非常重要,本文就谈谈我们早期选择后端语言时的考量。

流行的后端语言,有 Java/Python/Ruby/PHP 等,首先排除的是 Python/Ruby,在明星创业公司里面,这两种语言用的贼多,比如我的老东家友盟是 Ruby 起家,知名论坛知乎是 Python 起家,那为啥要排除这哥俩呢?太小众了人难招。

于是 PHP 也被拿出来讨论,说实话这是我不愿意的一门语言,但是考虑到人好招人呀,3000 块钱招一个 PHP 码农还会写模版不香嘛。但是研究了PHP 半天后就放弃了,为啥?PHP 已经变得很复杂了!

现在的 PHP 已经堪比 Java 了还多了好多 Java 没有的功能,本来是希望PHP门槛低好招人,这么一来人是招到了却无法掌握 PHP 那有何用呢,岂不是很没面子?

然后就是 Java,说实话我们应该选 Java 的。因为我本身就是 Java 出身,写过 Android、 写过 Spring,还给 SpringBoot 写过好多入门文章。说不上大牛但是用起来必然没啥问题,但是毕竟是搞过的人,太了解 Spring 了,所以不用。

为啥呢?

Java 程序员工资高,虽然好招但是不好养。

另外,用 Spring 心智负担高,我觉得 Spring 的优点就是它的缺点,Spring 太面面俱到了。你能用到的功能 Spring 都可以通过 “简单的” 配置解决。这正是问题所在,干啥都要查文档、看文档做配置,对于老手来说经验多了配置起来很快,但是新手就难了。

一个很小的功能要阅读一篇很长的文档,了解这个功能的前前后后,然后写下两行配置。我觉得这是反人类的,我们是写代码的又不是写配置的,把自己搞成配置工程师不悲哀吗!另一个问题是,过一段时间我竟然忘记了那个配置的精妙之处。真不怨我不努力,打开 spring.io 你就知道啥是汪洋大海、啥是星斗满天。把 Spring 的文档都打印出来,感觉要把我们的办公室都塞满了。

关于 Java 的另一个问题是部署,Java 部署还要装容器,说实话我次知道 Java 部署还要装容器的时候是很惊讶的!你作为一个网络语言为啥不能自己跑呢?你知道 Tomcat 嘛?你知道 HotSpot 嘛?你知道 Servlet 嘛?全是心智负担,其实在开发端本来不应该关注这些的,但是你不了解你就不是一个成熟的Java工程师。

于是只能选 Go 了。

开发简单!


简单到一周学会就可以写线上代码。首先这是由于 Go 语言本身的设计,Go 语言在过去10年间几乎没有大的变化,从设计之初就秉承这样的设计理念 —— LESS is MORE!

所以无论你之前的用的是 C、Java 还是 PHP 都能够快速的上手 Go 语言。这给招人提供了广阔的空间。同样 Go 的生态也秉承了 LESS is MORE 的 Go 语言哲学,大部分的 Go 相关库都是开箱既用,只需要查阅少量的文档就可以使用了。

由于简单,心智负担少,开发也变得更快、更容易。比如实现一个 OAuth 系统,用 Java 我需要看一上午的文档再写 3-400 百行代码。但是用 Go 直接写下 500-600 行代码就搞定了,这就是没心智负担。如果遇到了小程序那种看起来像 OAuth 但是实际不是 OAuth 的接口,用 Spring 就要自定义一下,但是用 Go 还是原来那样——只关注业务逻辑自身,就是快。

部署简单

用 Java 真是苦呀!在创业公司开发就是运维,一个人要干三个人的活,用 Java 干不过来呀。但是用 Go 就简单了,本地打包一个二进制传到服务运行就好了没有虚拟机没有容器,这让我想起来曾经年轻的时候在一台破烂的服务器上部署 WordPress 的那个下午 —— 上传、解压、搞定。

如果你们公司用 Docker,那就更爽了,用 Docker 来部署 Go 应用是快的。并且容器技术 Docker 本身也是用 Go 写的,k8s 也是用 Go 写的。真的没见过比 Go 更容易部署的语言了。

跑得快!

Go 的性能在以上所有语言里都是快的。Python/Ruby/PHP 这都是动态语言系的,存在各种性能问题而且内存占用大。Java 是编译+解释的语言,虽然比上面那些都好,但是毕竟还要运行个JVM,一个空对象都要占用十几个字节,整体内存消耗必然也高,从而导致以上这些语言对服务器会有更高的要求。要配置更大的内存、更好的 CPU 才能达到 Go 的水平。

通常大公司都还会有专门的 JVM 调优的岗位,让 JVM 在某些场景下跑的更快。但是对于 Go 来说,跑得快是白送的,曾经听一个老司机说过,把 Ruby 换成 Go 之后,快到不好意思…

对于创业公司来说,初期要严格控制成本的,能节省的尽量节省,我们用一台 Go 服务器达到了原来两台 Python 服务器才能做到的事情,难道不香吗?

关于生态

肯定有人会出来说,Go 的生态不行呀,你搞个分布式试试。说实话 Go 搞分布式轮子确实没有 Java 造的好、造的多。但是对于创业公司来说,前期的重点在于快,快速出产品验证IDEA,如果产品成功,我们可以慢慢招人过渡到大型系统,而不是一开始就搞一个可能会用到的大型系统。

另外,Go 的生态虽然没有 Java 那么强盛但是也不弱,基本你能用到的都有成熟的解决方案,比如用 go-kit、go-micro 也是分分钟搭建分布式系统。

目前我们的后台系统跑了6、7个服务,全部是用 Go 写的,这些服务每天都会有新的发布,我们一次发布大概只需要不到10秒的时间。系统核心是一个基于 NATs 的高吞吐量的消息系统,Web 框架我们用的是 一个叫 Echo 的框架。

不过 Go 语言的框架都很快,没必要执着。我们的所有服务都是基于 API 的,没有使用模版渲染,前端调用 API 自己渲染。架构参考了一个叫 Drone 的开源项目,感觉它的架构很好值得学习。

对于创业公司来说,我觉得可以考虑 Go 了,其实大公司也很多用 Go 的了,比如知乎已经把很多原来的 Python 服务用 Go 重写了,知名二次元网站B站已经全部用 Go 了。招人门槛低、开发心智负担少、开发速度快、部署快难道这不是理想的语言吗?


相关文章