学 Java 还是 Go 语言?这事儿很简单!
相信很多学编程的同学都在纠结这个问题:学 Java 还是 Go 语言?
先给出省流结论,简单粗暴,就 4 个字:选 Java!
好,本期结束!
网上的讨论五花八门,有人说 Java 过时了,Go 才是未来;还有人因为自己或朋友学 Go 找到工作了就觉得 Go 真香,觉得学 Go 竞争更少、机会更多。
但是这些观点往往都比较主观片面,今天鱼皮会用一些 客观 的内容来帮大家选择语言,毕竟 只要做出了正确的决定,你的人生就会变得灿烂起来!
开始前先声明一下:肯定有朋友说,鱼皮你自己做 Java 项目教程、臭卖 Java 课的对吧?你当然劝大家学 Java 了。那有没有可能是因为 Java 确实比别的方向好,我才选择这个方向呢?当然我希望你可以带着这个想法继续看下去,如果下面的内容有不客观的地方,尽管来评论区骂我,毕竟我这期内容肯定会动某些人的蛋糕。当然,如果你觉得这期内容对你有收获,觉得有道理,也希望能点赞收藏三连支持一下~
推荐看本文对应的视频版:https://bilibili.com/video/BV1LXTrzCEi5
语言简介
咱们先简单了解一下这两门语言。
Java 是经典的老牌儿语言,它的特色是跨平台(一次编写,到处运行)。再加上生态好、性能也不低,所以很适合作为 企业项目开发的首选语言。而且 Java 不仅是安卓开发的主语言,也是大数据开发的首选语言之一。
Go 语言是新兴的语言,语法简洁,天然支持协程,很适用于开发后台、网络通讯框架等高并发应用,所以也是 云计算、云原生、区块链等前沿方向的主流语言。
市场需求对比
如果你学编程是为了找工作赚钱,那么 语言的选择很大程度取决于实际市场需求。
目前 Java 的岗位需求量远大于 Go,无论是看招聘网站的岗位数,还是看专业的 TIOBE 编程语言流行度排行,哪怕是看培训机构的广告也知道了,满屏幕的 Java 培训,Go 语言却寥寥无几。
为什么会这样呢?
因为 Java 本身的特性,再加上它出现得比较早,导致现在国内大多数后端都是用 Java 开发的,银行、金融、电商、教育、游戏、传统企业等几乎所有行业都在用。这些系统不会轻易重构,Java 的存量市场巨大。
反观 Go 语言,虽然 Docker 容器、K8S、云原生已经流行一段时间了,但国内使用 Go 语言开发的项目还是很少的,主要在新兴技术领域,岗位也主要集中在一二线城市的互联网大厂。虽说字节跳动、B 站等大厂选择 Go 作为主语言,但是大厂的坑位毕竟只有少数,放眼整个市场,用 Go 的公司实在太少了!
虽然 Go 性能更高,但绝大多数做业务的公司肯定还是用 Java。为什么?来换位思考一下,你现在就是公司老板,要招开发了。
首先会 Java 的人多,招聘更容易;现成的代码多,开发成本就更低;而且很多业务其实没必要追求那么高的性能,Java 这种成熟的编程语言已经能满足诉求了。
那为什么大厂在追求用 Go 来做后端呢?主要有几个原因:
大厂项目体量大,用 Go 单机并发更大,能降低成本,并且适应未来的云原生架构,便于业务变动时扩缩节点。
大厂能人和优秀团队很多,有研究的条件、时间和资源。
Go 发展迅猛,作为大厂,当然要追求国内技术的布道,抢占市场和人才。
但是啊,Java 的岗位需求量远大于 Go 这个趋势,近几年估计不会有什么变动。看到这儿肯定有朋友会说,Java 虽然需求量大,但竞争也激烈啊!没错,确实是这样,不着急,我们接着往下看。
生态对比
毫无疑问,Java 在国内的生态远远超过 Go,无论是技术框架、学习资源、项目教程、技术文章、GitHub 开源项目、社区交流、经验分享等等,目前都吊打 Go 语言。
这会导致什么问题呢?你遇到 Bug 的时候,Java 相关的解决方案一搜一大把,但是 Go 语言可能就要费点劲了。而且像 AI 这种新技术,Java 一般也会比 Go 更快地推出开发框架来帮助开发者。
学习难易度
从语法层面上来说,Java 和 Go 要学的内容都是差不多的,都是变量、数据结构、流程控制、异常处理那些所有编程语言都要学的东西。但是由于 Java 生态好,学习资源 极其丰富,各种学习路线、各种保姆级教程,遇到问题也很容易找到解决方案,所以相对更适合新手入门,起码你不用为搜资料、搜 Bug 发愁。反之,连培训机构都很少有 Go 语言的班。
当然,也正因为 Java 学习资源多,才导致这几年学 Java 的人数如雨后春笋般涌现,导致竞争比较激烈。不过对于很多学习能力不强的朋友来说,学 Java 起码你能学得动,有机会竞争,就像走大马路,虽然人多但是路宽;学 Go 语言可能就像走山路,虽然人少,但是走得慢、而且可能走着走着就迷路了,半途而废。
有些朋友别来跟我说什么 Go 语言也不难呀、我随随便便就学会了,那只能说明你很厉害。我当年也是这么想的,但做了这么多年编程知识分享,我发现真的真的 很多朋友的学习能力是没有那么强的。
未来发展趋势
从长远来看,我们其实很难预测到底未来 Go 语言会不会超越 Java、什么时候会超越 Java,毕竟 技术发展往往不是线性的,也很难说未来会不会出现一个更牛的编程语言,超越这两者。
但是我们可以结合语言适用的领域来看待它们的发展,比如从区块链的发展看 Go 语言的发展。怎么说呢,区块链这个概念从我大学时(17 年)那会儿就开始炒,炒到现在离普通人还是比较遥远;再加上国内这么多历史包袱(老的 Java 项目),Go 语言几年之内应该很难在 后端开发领域 动摇 Java 的地位。在我的印象中,这几年 Go 语言好像没有什么特别炸裂的消息,反而 Rust、鸿蒙的浪花感觉更大一些。
所以大家还是保持理性,也别被什么 “Go 语言才是未来” 之类的话冲昏了头脑。
我的建议
前面做了一通分析啊,我再来给大家总结一下,5 个不要:
1)如果你是为了快速就业,不要选 Go!
因为 Java 岗位需求量大,就业机会多,学习资源丰富,容易上手,薪资水平稳定,职业发展路径清晰。
2)如果你不是一本计算机专业的学生,不要选 Go!
因为 Go 的岗位主要集中在名企大厂,竞争激烈,无论是学历还是技术的门槛都更高。
3)如果你自学能力不强,或者对自己实力没有绝对自信,不要选 Go!
毕竟 Go 语言资源更少,我是真担心你浪费时间去找教程、去搜 Bug 怎么解决。
4)如果你没有特定的技术方向兴趣,不要选 Go!
除非你对云计算、区块链、分布式等 Go 语言有一席之地的领域特别感兴趣,否则还是建议从 Java 开始。
5)如果你是为了考研或者学习算法,不要选 Go!
国内考研或编程竞赛的算法机试可能不支持 Go 语言,C++ 和 Java 更保险。
当然,如果你成功通过了前面这几层过滤,想挑战一下更高的薪资,当然是可以选择 Go 语言并且冲击大厂的。不过,如果你要做后端开发的话,我有个更好的建议!
后端开发建议
Java 和 Go 目前主流的应用场景都是后端开发,对于后端开发来说,语言只是一个工具和基础,除了语言本身和对应的开发框架外,其他要学的后端开发技术都是通用的,比如数据库、缓存、队列、搜索引擎、Linux、分布式、高并发、设计模式、架构设计等等。
除了技术外,业务理解能力、项目开发经验、算法等计算机基础同样是程序员求职涨薪的关键,这些也是独立于编程语言的。所以比起纠结选什么编程语言、反复学习新的编程语言(像螃蟹一样横着走),为什么不先学习资源丰富的 Java 语言,来快速学习提升这些通用技能呢?技术的本质是解决问题,语言只是实现的手段。只要通用技能学得好,转什么语言都是横着走。
而且有一个很现实的求职现状是:Java 和 Go 后端是可以互相面试的。你 Java 学得好,依然可能通过 Go 语言的面试,因为在实际面试中,编程语言只占很小一部分比例。面试官更关注的是:
你的项目经验
对系统设计的理解
解决问题的能力
对后端通用技术的掌握程度
计算机基础和编程思想
对于简历上的项目来说,面试官关注的重点也 不是说你用了什么编程语言,而是要看你做出来的成果,运用哪些技术解决了问题,系统的性能怎么样等等。
不过如果你的项目和面试岗位的编程语言一致,肯定是加分的。想做到这点也很容易,等你学完 Java 和主流后端技术、做了 2 个项目后,如果你能力还不错、又想追求高薪,只需要花几天去学一遍 Go 的语法,再花 1 天利用 AI 把你的项目重构为 Go 语言,就可以去找 Go 语言的工作了,顶多再花点时间刷刷八股文,在 面试鸭 也都给大家整理好了,不是美滋滋?
说了那么多,但最后我还是相信那句话 “兴趣是最好的老师”,其实初学编程可以不用想那么多,喜欢什么、什么能学下去,那就先试试,学自己感兴趣的语言会更有动力,也更容易坚持下来。像我大一学习 C、C++、Python、Java、JavaScript、PHP 甚至是 C#,虽然走了弯路,但也培养了自己的兴趣、提升了知识广度吧。之后我在自学 Go 时过了一遍基础语法后就直接开工干项目,在实验室用 Go 开发区块链还出版了书籍,后面在字节跳动实习也用过 Go 语言,持续在实践中学习就好了。
总之,立即行动起来,才是最重要的。加油!
更多编程学习资源
学 Java 还是 Go 语言?这事儿很简单!的更多相关文章
- 手机APP开发:学JAVA转安卓APP开发是不是很容易?
成都亿合云商小编为您分享:Android开发是以Java语言为基础的,Android 虽然使用Java 语言作为开发工具,但是在实际开发中发现,还是与Java SDK 有一些不同的地方.Android ...
- Mac上安装配置Go语言,其实很简单(一)
下载Go语言可以去:Go语言中文网 安装及自己选择是否修改GOPATH 下载下来后双击安装就好,使用 go version 查看安装版本: 在Mac上安装完成后,会自动设置一些环境变量,使用 go e ...
- 在linux安装redis单机和集群后,如何在windows上使用redis客户端或者java代码访问错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。需要通过简单配置,完成允许外网访问。
这几天在学习在linux上搭建服务器的工作,可谓历经艰辛.可喜最后收获也不少. 这次是在linux上搭建redis服务器后从windows上缺无法访问,连接不上. 仔细回忆以前搭建nginx和ftp的 ...
- 用java调用.net的wcf其实还是很简单的
前些天和我们的一个邮件服务商对接,双方需要进行一些通讯,对方是java团队,而作为.net团队的我们,只能公布出去的是一个wcf的basicbinding,想不 到问题来了,对方不知道怎么去调用这 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- 从零开始学 Java - 我放弃了 .NET ?
这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...
- 从零开始学习 Java 系列之你为什么要学 Java?
全文大约[4000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货! 在正式开始本系列教程之前,壹哥希望先用一篇文章,来扫清你学习前的认知障碍.请坚定自己的学习信念,不要半途而废浪费时间,壹哥希 ...
- 从零开始学 Java - 搭建 Spring MVC 框架
没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...
- 从零开始学 Java - CentOS 下安装 Nginx
早上下起了暴雨 闹钟还未响起就听到雨滴哗啦啦击打窗户的声音,被吵醒了.起床上班,在楼下的十字路口,暴雨大到完全看不清对面,两个穿着雨衣的交警站在路口中间指挥着过往的车辆,大家都慌慌张张.急急忙忙的打着 ...
- 菜鸟学java开篇
从事it工作已有接近两年的时间了, 一直从事的是php的工作, 一直都想学java ,原因就不多说了, 毕竟优秀的php程序员,都会是一个其他方面的高手, 例如java ,并不是说java有多好,ph ...
随机推荐
- 使用Semantic Kernel框架和C#.NET 实现大模型Function Calling
最近研究Function Call,总结了一篇文章,分享给大家 一.GPT-4中实现函数调用功能 定义函数:首先,开发一个函数.例如,一个获取天气信息的函数可能如下: def get_current_ ...
- NumPy学习4
今天学习NumPy相关数组操作 NumPy 中包含了一些处理数组的常用方法,大致可分为以下几类:(1)数组变维操作(2)数组转置操作(3)修改数组维度操作(4)连接与分割数组操作 numpy_test ...
- 使用Avalonia/C#构建一个简易的跨平台MCP客户端
前言 前几天介绍了在C#中构建一个MCP客户端. 最近正在学习Avalonia,所以就想用Avalonia实现一个简易的跨平台MCP客户端.接入别人写的或者自己写的MCP服务器就可以利用AI做很多有意 ...
- Creo 4.0二次开发工具框架搭建
一.新建MFC DLL工程 二.配置项目属性 附加依赖项中输入:netapi32.lib;psapi.lib;mpr.lib;wsock32.lib;protk_dll_NU.lib;protk_d ...
- harbor
一篇带你了解私有仓库 Harbor 的搭建 一.Harbor简介 虽然Docker官方提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的. Harbo ...
- [每日算法 - 华为机试] leetcode680. 验证回文串 II
入口 力扣https://leetcode.cn/problems/valid-palindrome-ii/submissions/ 题目描述 给你一个字符串 s,最多 可以从中删除一个字符. 请你判 ...
- 继承中成员变量和成员方法的访问特点-java se进阶篇 day01
1.继承中成员变量的访问特点 1.成员变量重名 如图 父类中有age变量,子类中也有age变量,这时打印age,出现的是10还是20呢? 答:根据就近原则,出现的是20 2.使用父类成员变量--sup ...
- 一文速通Python并行计算:06 Python多线程编程-基于队列进行通信
一文速通 Python 并行计算:06 Python 多线程编程-基于队列进行通信 摘要: 队列是一种线性数据结构,支持先进先出(FIFO)操作,常用于解耦生产者和消费者.慢速生产-快速消费场景中,队 ...
- Java程序员的Go入门笔记
系列文章目录和关于我 0.背景 3年java开发背景(因此这篇文章的特点是:比较适合java程序员doge),业余时间有了解过一些go,如今主要技术栈是go,此篇主要结合go语言圣经和团队内go项目, ...
- Junit单元测试的maven设置
maven 官方文档: https://maven.apache.org/surefire/maven-surefire-plugin/usage.html maven是通过插件 maven-sure ...