java python go_闲话Python, Go, Java

简要介绍下笔者从业经历,2017年5月加入饿了么(Java),2019年6月加入字节跳动(Python & go),Python & go 还处于入门阶段,所以笔者的见解只能当闲话听听。

入职字节跳动一个多月了,现在每天在 python 和 go之间切换,偶尔也会用Java。线上服务是在往golang迁移,和饿了么一样Python已经被无情的抛弃了。

Python

这条「蟒蛇」语言的确足够简单,上手会非常快,业界的支持程度和使用率也是非常高,特别在机器学习,数据处理的领域。

但是我是在业务代码开发中使用Python,从我个人使用它的感觉而言,这个语言的自由明显是一把双刃剑,写代码时候节约的时间在后面debug的时候,都会还回去,甚至要付出更多,这种解释型语言不会给你的错误予以提醒,直到运行崩溃为止;另外在团队协作的时候,稍微不注意就有点不可控,别人的函数返回个啥,完全不知道,甚至要通过 print 的方式才能知道里面内容,使用这个语言需要团队里大家都能按规矩办事,如果所有人都图自己方便,后果将非常可怕。

饿了么早期是Python大厂,在2017年决定放弃Python,迁移Go,只不过这件事才刚起步,就被阿里收购,收购后当然要拥抱阿里集团技术体系,所以是将Python迁移Java,而这件事做的过程也是波折万分。加入字节跳动,发现字节跳动也在Python迁移Go。

放弃这个语言的最重要原因,还是效率。

如果你个人开发者或者是一个小APP,只用一台或者几台机器部署,效率不会当成第一要素;但是如果的服务部署在成千上万台机器上的时候,因语言效率而节约的成本就非常明显了。众所周知 Python并不是真正的多线程语言,存在全局的GIL导致同时只能有一个线程能运行,无论你拥有多么牛掰的多核CPU,一个时刻工作的只能有一个,其他核也只能空闲。

而放弃Python后,无论是使用Go或者Java都能节约掉2/3左右的机器。

Go

再来说说go语言吧,这个语言最近很热,很多后起之秀的互联网大厂都用了这个语言作为主要语言,包括三年上市的趣头条,字节跳动也在执行go语言化,很多知名的区块链项目也采用go语言。

Go的优势很多,语言层面原生对协程的支持,让它在效率上备受追捧;含着金钥匙出生的名门贵族,从一出生就备受瞩目!但是,当你使用它的时候,和Java比起来,还是会觉得这个语言不够完善。

首先包管理上踩过一些坑,早期我们使用 go vendor 管理依赖,把依赖的代码库到放到项目的vendor目录下,但是这会导致项目非常臃肿并且在协作中也容易出现代码冲突的情况。后来使用了 go mod 情况有所好转。go mod 的方式类似maven,把所有依赖的项目按照版本号放在一个本地仓库中,项目中使用go mod 文件来配置依赖的项目。

虽然go语言执行速度和编译速度都很快,但是,但是,go要编译它依赖的代码。我们在使用 Java的时候,依赖都是通过jar的方式集成到最后的发布包中,jar里面提供的是编译好的class文件,不需要再次编译。所以每次发布只需要编写我们项目的代码。但是 go 不是运行在虚拟机上的语言,它不存在类似 java class 这种状态,所以当项目大了以后,编译非常耗时。目前我开发的项目,编译一次要15分钟以上,在debug阶段真是非常痛苦。除非大家都把项目精简,模块直接合作通过rpc,一旦依赖变多,编译会成为让开发者难受的痛点。

目前它还不支持范型,它的作者们还在考虑给语言支持范型,在没有范型的go里,如果你要写支持各种类型的 min 函数,你要像如下动图一样:

go语言的已经开始规划方案要支持范型,但是听闻支持范型的版本可能无法兼容之前的版本,是不是让我联想到python2 -> python3,如果语言最后不能向下兼容,恐怕对于想使用新特性的开发者来说,真的是巨坑。

Java(喝杯咖啡,轻松一下)

Write Once,Run Everywhere!(刚提到Go语言里需要编译依赖非常耗时的事情,在Java里是不存在的,因为 class 这种字节码编译一次后,真的可以Run Eveywhere)

可以看下下面的统计数据,Java在后端开发领域应该是当之无愧的“王”。这个语言可以多年稳居第一,一定是有原因的。

首先我觉得它是最完整的语言,完整表现在它语言本身和社区, Go使用者痛点的范型,错误处理都相对完善;包管理Mava,Gradle等工具也是相当成熟;社区里,只要Java能做的事,终将都会被实现;并且这个语言迭代的也足够快,可以看下这个总结,关于 Java 各个版本支持的特性:Java各个版本特性​blog.csdn.net

Java 8 支持 lamda 表达式和 stream api 的时候,就让我觉得这个语言演化很大,似乎不像Java了,Java 10 居然还支持 var 局部变量类型推断,这岂不是要和Go站上一个台阶的节奏!从我个人的感受角度,Java 的确是在吸收各种语言的精华,记得第一次见stream api还是在swift 语言里,当时苹果发布swift的时候好奇就去自学了一点点,结果不久java 就支持了stream api;var局部变量类型推断,目测也是看了例如go之类的语言如此便捷的声明变量的方式后,自惭形秽搞出来的东西。

相比于 Go ,它只是在第三方框架层面支持了协程,如果只从调度效率和开销的角度而言,Java的协程实现不如Go,具体可以通过文章了解:https://blog.csdn.net/zdy0_2004/article/details/51323583?utm_source=blogxgwz0​blog.csdn.net

但是要说这个语言有什么特别不爽的地方,还真感觉不到;相比于 Python 它足够快,相比于Go它的语言更完善,即使从效率角度说,如果是 web 开发,它的效率也丝毫不差,因为大多数的 web 开发都是同步模型——即,需要即时反馈(用户点要立即相应),处理流程有上下文依赖的串行的状态下,而在这种同步模型中,并发所带来的效率提升,其实非常有限。

结论

当然,也没有什么结论,语言之争一直是程序员们非常喜欢津津乐道的话题,只是一点建议。

如果是在数据处理,机器学习等很多离线场景,感觉Python还是非常合适的,从协作上往往需要参与的人更少,语言自由的好处可以得到更好的发挥,并且业界也在这方面给予足够的支持;

如果是一些中间件系统,需要特别高的并发和吞吐,很多处理可以转化成异步方式,这里应该更合适用Go;

而业务系统,不管是线上服务,还是后台系统,都可以完全使用Java。这个领域需要一起参与的人很多,语言过于自由会提高沟通成本,啰嗦的语言本省是一种嘱咐,让你不会忽略细节;同时语言足够完整,各种生态的支持(例如用Spring Boot,就可以几行代码弄一个服务器出来)会让所有工作上手更快,大家可以把更多精力放在业务上;同时这个Java容易招人,业界人才储备足够,业务发展起来后,无论是解决复杂问题,还是需要大规模扩充人马,都可以非常迅速!

你可能感兴趣的:(java,python,go)