简要介绍下笔者从业经历,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容易招人,业界人才储备足够,业务发展起来后,无论是解决复杂问题,还是需要大规模扩充人马,都可以非常迅速!

go语言和java比_闲话Python, Go, Java相关推荐

  1. python和c和java难度_浅谈:Java和C语言各自的学习难度

    许多初学者在编程入门之前,都会在编程语言的选择上犹豫不决.一般来讲,Java和C语言是编程小白最青睐的两种编程语言.那么,Java和C语言哪个学习难度更大呢?虽然两者的区别挺大的,但是学习难度上并不能 ...

  2. python保存代码需要删除头部信息吗_用python删除java文件头上版权信息的方法

    在使用他人代码时,为不保留文件头部版权信息,需要一个个删掉,费时费力, 写了个脚本,简单清除掉目录下所有的文件的头部版权信息.# -*- coding: utf8 -*- ''''' 删除java文件 ...

  3. 广州python平均薪资_爬取广州的python和Java薪资,为什么Python 高于Java(有代码)...

    标签: 小编不知道这个是不是属于那个啥,要看的赶紧看,说不定小编的号要被封了. 用python爬取了某某某直聘网站,直聘Python和Java的招聘信息,比较了两个方向的发展前(钱)途 ,主要是本科生 ...

  4. java min 函数的使用方法_【Python】Java程序员学习Python(五)— 函数的定义和使用...

    不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍, ...

  5. 排序算法python实现_用Python,Java和C / C ++实现的选择排序算法

    排序算法python实现 The Selection Sort Algorithm sorts the elements of an array. In this article, we shall ...

  6. python比java容易学_是不是Python比Java更容易学,更容易就业?

    首先,从编程语言本身的语法结构,Java语言更为困难.对初学者来说,学习Java语言的时间成本较高,并且由于Java语言本身有一个相对高度的抽象,你必须想很多实验需要形成自己的Java编程思想完成.J ...

  7. 有python基础学习java简单吗_【Python】Java程序员学习Python(三)— 基础入门

    一闪一闪亮晶晶,满天都是小星星,挂在天上放光明,好像许多小眼睛.不要问我为什么喜欢这首歌,我不会告诉你是因为有人用口琴吹给我听. 一.Python学习文档与资料 一般来说文档的资料总是最权威,最全面的 ...

  8. oracle java 并发_【转】JAVA并发教程(ORACLE官网资料)

    本文是Oracle官方的Java并发相关的教程,感谢并发编程网的翻译和投递. 计算机的使用者一直以为他们的计算机可以同时做很多事情.他们认为当其他的应用程序在下载文件,管理打印队列或者缓冲音频的时候他 ...

  9. python比java简单好学-是不是Python比Java更容易学,更容易就业?

    这是一个非常有意思的问题,作为一名IT从业者,同时也是一名教育工作者,我来回答一下. 首先,从编程语言自身的语法结构来看,Java语言要更难一些,对于初学者来说,学习Java语言的时间成本要更高一些, ...

最新文章

  1. java修炼手册3.8_Java修炼手册
  2. 公司电脑监控软件_公司电脑监控软件,如何限制公司电脑网络游戏
  3. 3 计算机组成原理第三章 存储系统 主存简单模型及寻址 半导体寄存器 存储器分类 主存与CPU连接 双口RAM和多模块寄存器
  4. OC 观察者模式(通知中心,KVO)
  5. 香橼做空跟谁学发第三枪 跟谁学股价盘后下跌1.37%
  6. 封装性的基本使用练习1
  7. object picker 微信小程序_第三天学习微信小程序开发总结
  8. 【日常水题-bfs】马的遍历
  9. php psd图层重命名,ps批量修改图层名字的脚本(附批量替换方法)
  10. ActiveMQ之Topic
  11. VS中javascript注释快捷键
  12. 黑苹果10.15.7安装comfast永存,CF-811AC驱动方法
  13. 通过IMAP方式迁移U-Mail邮件到Exchange 2013之Exchange 2007 升级到Exchange 2013!
  14. CodeForces - 1538G Gift Set (二分)
  15. 零基础怎么系统学习大数据?
  16. 很傻很天真的问题: 什么是语法糖!
  17. Socks5代理Socks5 Proxy
  18. centos7下安装forever_CentOS7 安装和部分设置参考
  19. 计算机office比赛,Office智慧丨“点亮未来”
  20. NC235254 晾衣服

热门文章

  1. eclipse常用窗口和功能总结
  2. openssl数字证书常见格式与协议介绍
  3. [Vue.js]实战 -- 电商项目(四)
  4. 【前端笔试算法题】之小偷分赃题
  5. panda 函数笔记(merge\DataFrame用法\DataFrame.plot)
  6. ssr Android简书,react服务端渲染ssr
  7. Dart 7-Day
  8. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
  9. html设置json请求头,当我想在zf2客户端代码中使用“application/json”时,接受请求标头是“text/html,application/xhtm ...(etc)”...
  10. datagridview 纵向 横向 合并单元格_每日一Excel技巧(熟能生巧):带公式的单元格,快速批量复制、填充...