[编程开发] java太卷了,要不要转go啊?

[复制链接]
CHUNLAN789 发表于 2023-10-3 19:57:45|来自:中国 | 显示全部楼层 |阅读模式
java太卷了,要不要转go啊?
全部回复5 显示全部楼层
zke 发表于 2023-10-3 19:58:44|来自:中国 | 显示全部楼层
谢邀。
一、要不要转 Go?

我之前在携程旅行网写 Java,现在在字节跳动做 Go 开发,Golang 目前的岗位相比较 Java、C/C++ 等岗位来说,不算多,但也不算少,国内一些做云原生相关的公司大量招 Go 开发,例如字节跳动、七牛云、UCloud,腾讯和美团一些业务线也开始往 Go 迁移。
如果你想转 Go 是因为兴趣,那么可以一试。但是,如果是因为觉得 Java 太难太卷、学不好或者学不通透,进而转 Go,这行不通。战术的勤快掩盖不了战略上的懒惰。
目前很多 Go 岗位都接收其他语言转 Go,如 Java 转 Go。但是实际面试的时候,对 Go 语言本身的知识点考察并不多甚至并不考察 Go 知识点本身,反而对其他基本功要求比较多。很多同学找不到工作,并不是因为 Go 本身学的不好,而是其他技能点不够强。
举两个例子。
在利用 Java 做一个管理系统,前端通过 HTTP 接口与后端 Java SSM 框架交互,到了 Go 当中,可能 SSM 框架换成 Gin + Gorm,HTTP 协议还是原来的协议,对 HTTP 协议技能点和数据库的知识点要求并不比 Java 少。
Java 服务与服务之间通信可能会使用 RPC,RPC 这一套东西在 TCP 通信的基础上加上重连重试协议封装等功能,实现了远程过程调用,到 Go 中还会这一套东西,用好,仍然需要良好的网络编程理论。
所以,在 Java 中学不好的,卷不过别人的,不要指望换一个赛道,就可以卷得过别人了。且目前中国的互联网行业趋于稳定阶段,已经过了大肆扩张大肆招人的阶段,而每年的新的计算机专业的同学毕业一茬接一茬,各种通过自学、培训班进入编程领域的,供大于求,所以打铁还需自身硬,努力提高技术功底、技术经验才是正道,而不是换赛道。
二、如何学习 Go?

如果你对 Go 比较感兴趣,那么可以这么学。
2.1 学习Go 语言常用语法和机理

假设你是一个 Go 新人,建议先系统地把 Go 的常用语法特性和内置库先过一遍,推荐《Go 程序设计语言》,或者看看许式伟老师的《Go 语言编程》(链接来自网络,喜欢的请购买正版哦)。
Go 程序设计语言》  
链接:https://pan.baidu.com/s/1m_JPCJn1k_b3kjpS7HtW0g  提取码:nid4   
Go 语言编程》  
链接:https://pan.baidu.com/s/1NWoGpZ_MVzKHEJtVdz4IuA 提取码:wu7v

当你有一定基础之后,可以看看雨痕大佬的《Go 语言学习笔记》和 《Go 专家编程》进行查漏补缺和提升。
Go 语言学习笔记》  
链接:https://pan.baidu.com/s/1FXdjZfjY3LdrL57plcMi0Q  提取码:fw93
   《Go 专家编程
  链接:https://pan.baidu.com/s/1_AH1VwP0HCQuoBqS5mY6fQ  提取码:2lep
Go 的并发模型相比较 Java 或者操作系统支持的并发原语要简单需要,基本就是 goroutine 和 channel 的结合使用,这块对于高性能高并发 Go 服务是常用的技术点,推荐阅读《Go 并发编程实战》一书:
《Go 并发编程实战》  
链接:https://pan.baidu.com/s/1bekXSdFJsMHUKykVjq7fnQ  提取码:p4ex
国外有一本《Distributed Computing with Go》(Go 分布式计算)。
网上有同学分享出来相关电子书:
链接: https://pan.baidu.com/s/1hLm2Re6LNJdeNEyq1_vTUg 密码: thgs
2.2 阅读优秀开源 Go 项目

多阅读一些优秀开源 Go 项目,可以快速地学习高手如何使用 Go,积累经验,指导自己的 Go 编程。
1 高性能 Web Server——Gin
https://github.com/gin-gonic/gin
Gin 是一个非常非常常用的 Go 开源项目,在很多公司内部,凡是涉及到使用 HTTP 接口与前端交互的系统,基本都会使用这个框架,或者改进版的 Gin。
2 Go  数据库操作层——Gorm
https://github.com/go-gorm/gorm
同样的道理,这是目前国内 Go 语言编写操作数据库使用做的 Go 语言版本 ORM,在 Java 中使用 MyBatis 操作数据库,在 Go 中大多数项目使用 Gorm 操作数据库。
3 tinode
这是一个开源的即时通讯软件,既然是即时通讯软件,学习的时候基本上无任何业务负担,可以专注地学习程序逻辑本身。
服务端代码(使用 Go 开发)地址:
tinode/chat
搭建出来的服务部分截图:








4 斗鱼直播的朱庇特
项目官网:Jupiter
项目源码地址:douyu/jupiter
通过这个项目,你可以学习到如何使用 Go 开发:

  • 支持 HTTP 请求
  • 支持 RPC 请求、RPC 实现
  • 服务注册与发现
  • 长短任务设计
  • 负载均衡
  • 指标采集/链路追踪/日志埋点
  • 慢响应拦截
  • 熔断限流
  • 接入各种消息中间件(如 Kafka、RocketMQ 等)
  • 接入各种缓存服务(如 Redis)
  • 其他功能
三、为什么一些大厂会选择 Go 语言?

个人使用 Go 快三年多了,Go 语言的学习和上手成本比较低,且性能不错,适用于大厂快速的业务迭代发展。总结起来,性能不错,快速上手,适合业务快速迭代
下面举一些 Go 语法的例子。
在使用其他语言,如 Java,我就在想,既然代码行末尾必须都要以分号结束,那为啥编译器不直接代劳此事?从编译原理的角度来说,大多数代码行末尾的分号都是没有任何作用的。我相信,不少同学有因为忘记在某些代码行的结尾写上分号而导致代码无法编译通过的经历。
另外一个情形就是很多同学在写 switch - case 语句的时候,有时候因为忘记在特定的 case 语句之后写上 break 语句,从而导致程序执行时出现非预期的行为,这个问题也同样困扰着学习编程的新人们。
一对大括号中的第一个大括号是否要单独放在一行;if/for 等执行体只有一条语句时,是否应该使用一对大括号包裹起来,这类问题在开发者之间争论了几十年,并且将继续在后来者那里争论下去,就算是像《代码大全》这样经典的书籍也花了好几页去讨论这两种代码风格哪种好,更不用说各个公司为了统一编码风格而制定的各种代码规范和 lint 检查规则了。
  1. //到底哪种风格好呢?
  2. //风格1
  3. void DoTest() {
  4. }
  5. //风格2
  6. void DoTest()
  7. {
  8. }
  9. //风格1
  10. if (success) {
  11.     printf("success");
  12. }
  13. //风格2
  14. if (success)
  15.     printf("success");
复制代码
继往开来,Go 语言大刀阔斧地去除了一些其他语言中看起来不是很必要的功能,这些功能的去除让 Go 的风格变得统一、简洁,在 Go 项目中,大家不会再为上文中提到的几个风格问题而争论了。
让我们来看一下 Go 语言相对于其他语言所做的一些改动,欢迎读者在评论区补充:
1. 每一行语句的结尾不再强行要求加上分号
  1. fmt.Println("hello world") //末尾不建议加;
复制代码
2. 一对大括号的第一个不能单独占一行
  1. //错误的语法
  2. func DoTest()
  3. {
  4. }
  5. //正确的语法
  6. func DoTest() {
  7. }
复制代码
3. if/for 等语句体只有一行时也必须使用一对大括号包裹起来
  1. //正确的语法
  2. if success {
  3.     printf("success")
  4. }
  5. //错误的语法
  6. if (success)
  7.     printf("success")
复制代码
4. if/for 等条件不再需要括号
  1. //正确的语法
  2. for i := 1; i < 10; i++ {
  3.     fmt.Println(i)
  4. }
  5. //错误的语法,for语句不需要括号
  6. for (i := 1; i < 10; i++) {
  7.    fmt.Println(i)
  8. }
复制代码
5. 只有 for 循环,不再支持 while 和 do - while 循环
  1. //支持的语法
  2. for i := 1; i < 10; i++ {
  3.     fmt.Println(i)
  4. }
  5. //不支持的语法
  6. while i < 100 {
  7.     fmt.Println(i)
  8.     i++
  9. }
复制代码
6. switch - case 语句默认加了 break 语句
  1. switch i {
  2. case 0:
  3.      fmt.Println(0)
  4. case 1:
  5.      fmt.Println(1)
  6. case 2:
  7.      fmt.Println(2)
  8. default:
  9. }
  10. //相当于
  11. switch i {
  12. case 0:
  13.      fmt.Println(0)
  14.      break
  15. case 1:
  16.      fmt.Println(1)
  17.      break
  18. case 2:
  19.      fmt.Println(2)
  20.      break
  21. default:
  22. }
复制代码
如果你真的想执行完一个 case 接着执行下一个 case,只要使用 fallthrough 关键字就可以了:
  1. switch i {
  2. case 0:
  3.      fmt.Println(0)
  4.      fallthrough
  5. case 1:
  6.      fmt.Println(1)
  7. case 2:
  8.      fmt.Println(2)
  9. default:
  10. }
复制代码
7. 自增自减运算符只支持后缀形式,不支持前缀形式
  1. i := 0
  2. i++ //可以编译通过
  3. ++i //无法通过编译
复制代码
8. 不支持条件运算符(? :)
  1. b := 9
  2. a := (b > 0 ? true : false) //这一行无法通过编译
复制代码
9. 给一个结构体多个字段设置值时,最后一个字段也必须以逗号结束
  1. type StandardResp struct {
  2.     Code  int32
  3.     Msg   string
  4.     Data  interface{}
  5. }
  6. c.JSON(http.StatusOK, commonHttp.StandardResp{
  7.       Code: 1000,
  8.       Msg:  "token error",
  9.       Data: nil, //注意这里nil之后有一个逗号,这在其他语法中必须没有逗号
  10.   })
复制代码
以上列举了 Go 精简后的一些语法要素,精简后的语法,让编程初学者更容易记忆与上手。
极少的语法元素,让 Go 简单易学,字节的大多数同学都是入职后两周内学习的 Go,然后开始着手业务开发。
综上所述,我给出我的结论,正因为 Go 语言简单易学、不容易出错、功能完备性良好且执行效率高,特别适合字节这样有超多超快的业务线产品迭代。当然,Go 语言想入门容易,想学好成为高手并不容易,很多从其他语言转到 Go 开发的同学,若不刻意勤加练习,想写出地道、高效的 Go-Style 风格的代码也不是一件很容易的事情。
四、Go 职位内推

最后,再次说一下,字节跳动常年大量招人,如果你也想来字节做 Go 开发, 我可以帮你内推,内推链接:
https://job.toutiao.com/s/MsK6h49

相关阅读

加入字节跳动 455 天,谈一谈我的感受
原创不易,有帮助的请点赞和关注  @张小方 ~
tyzyf 发表于 2023-10-3 19:59:31|来自:中国 | 显示全部楼层
Java太卷了转go,转完了就登上人生巅峰了吗?看看今年算法岗的哀鸿遍野吧!
我想问的是,目前你Java学得到底怎么样了?是不是仅限于会个Spring和mybatis,会个crud?
很多Java相关的技术栈都掌握不?有没有进行深挖呢?
最初级的工程师,无非是根据业务需求写CRUD,会用个Spring和MyBatis而已,但随着往资深工程师和架构师方向的进阶,有一些技术栈就不可避免的必须掌握了。
这里所说的掌握,不仅仅是停留在只会使用而已,应该是包括其内部原理和核心源码的范畴。
由浅及深包括这些领域:Java、MySQL、Redis、ES、Kafka、Netty、Dubbo、ClickHouse、Doris。
MySQL:90%的项目挑战,都是出现在数据库上。因此,搞定主流数据库的运行机制和实现原理是必不可少的。
需要掌握:索引、事务、锁机制、日志、主从备份、高可用、故障排查等。
推荐书籍:《MySQL技术内幕》、《高性能MySQL》
Redis:关系型数据库的强力补充,性能优化利器。
需要掌握:Redis Cluster、主从同步、持久化机制、LRU、线程模型、缓存穿透雪崩等。
推荐书籍:《Redis设计与实现》、《Redis核心原理与实践》
ES:MySQL不能无限建索引,这样会导致写数据的性能变得很差。于是,所有后端工程师都知道,多样化查询走ES。
需要掌握:调优策略、事务日志、索引段、核心参数、路由策略、执行偏好、故障检测等。
推荐书籍:《ElasticSearch权威指南》、《ElasticSearch实战》
Kafka:异步、消峰、解耦,微服务时代不可缺少的利器。
需要掌握:生产者和消费者核心参数、同步副本认定原理、日志文件格式、日志清理策略、控制器原理、再均衡策略、事务等。
推荐书籍:《Kafka权威指南》、《深入理解Kafka:核心设计与实现原理》
Netty:高性能的Java NIO框架,想自研RPC框架的朋友必学。
需要掌握:核心组件、线程模型、内存管理实现、服务启动核心源码、accept、read、write事件核心源码等。
推荐书籍:《Netty权威指南(第二版)》、《Netty原理剖析与实战》
Dubbo:阿里梁飞开发的高性能RPC框架,默认的dubbo协议集成了Netty 4.0。
需要掌握:主要模块,SPI思想,服务暴露和服务调用核心源码。
推荐书籍:《深度剖析Apache Dubbo核心技术内幕》
ClickHouse:MPP列式存储数据库,适用于即席查询场景。大小表性能极佳,缺点是不适合两大表场景。
需要掌握:MergeTree存储结构、MergeTree系列表引擎、副本协同原理、跳数索引、数据字典及字典表、数据分区原理等。
推荐书籍:《ClickHouse原理解析与应用实践》
Doris:百度开源的基于 MPP 架构的高性能、实时的分析型数据库,跟ClickHouse有些功能趋同,但适合两大表场景。
需要掌握:数据模型、Tablet & Partition、索引、物化视图、Bucket Shuffle Join和Colocation Join原理、Runtime Filter、SQLCache & PartitionCache等。
推荐书籍:官方文档

此外,下面是我总结出来的基于后端技术栈的面试资料,能够涵盖面试中至少80%的问题。
经典面试资料篇幅不长,基础好的同学在20天左右突击期即可全部记忆掌握。
基础一般的同学,因该面试资料有些深度,建议以长线方式循序渐进地进行学习,预计两个月左右可在技术深度和广度上产生质变。
另外,现在行业内卷比较严重,所以建议大家早日把leetcode刷起来,最好的方式是未雨绸缪,一天抽时间刷一两道题。
下面这套刷题笔记是谷歌无人车部门技术大神高畅(changgyhub)和阿里霜神(halfrost)整理的,每题都是追求极致的 runtime beats 100%。
谷歌、阿里技术大神的Leetcode刷题笔记



磨刀不误砍柴工,有了工具利器后,往往能达到事半功倍的效果。
行业的未来依然是星辰大海,想象力有多大,天地就有多广阔。
最后祝愿大家都能成为offer收割机,早日实现年薪百万的小目标。
mianyang0831 发表于 2023-10-3 20:00:24|来自:中国 | 显示全部楼层
30以上的技术“老人”,还是尽量避开go和rust这样的大热门,一片红海啊,go和rust更多是为年轻人准备的,用来给他们重复造新轮子。
程序员如何能提高自己的编程水平?一代技术人有一代人要去折腾的东西,就像上一个10年有java和php这样的东西可以给程序员“折腾”一样,后来的开发者得有新东西可以去“玩”。但是后来者多半也不会老老实实沿用老一代java或php开发者沉淀的优秀技术遗产,而是会“选择性无视”,然后另起独灶,自己造轮子玩。
这有点像唐诗、宋词、元曲、明清小说、自媒体的玩法,一代一个高峰,每一代的“形式”与“花样”都与前一代大不一样,后来者要实现超越和创新就一定会另辟蹊径,用新的“形式”和“玩法”打败传统。
对技术“老人”来说,并不是说不去学新技术,而是说比起折腾新技术,技术“老人”其实是在和时间赛跑,更紧迫的任务是赶紧用自己熟悉的技术栈尽快实现自身的商业化,找到适合自身生存和发展的业务赛道,然后选择和那些能折腾、更激进的技术新人合作,形成优势互补。
承认“后生可畏”并不丢人,后浪推倒前浪,一代“踩”在一代肩膀上,这是技术发展的规律..
对编程语言的一些思考
abars 发表于 2023-10-3 20:00:34|来自:中国 | 显示全部楼层
其实可以的。选择大于努力,找到适合自己的语言。Go的特性我不多说,我就分享一个我实际遇到的现象。
我校招毕业之后,进了腾讯,腾讯里面C++大佬很多,我被认为是不错的后辈,但也是跟着前辈们冲,有时候看到一些厉害的前辈,乐观估计没有五年很难达到他们的地步。
后来,因为项目需要,转了Go,我不像其他大佬留恋C++,很快就上手,入门,深究,并学习了Golang优秀源码ETCD,自此之后,我在团队的位置越来越好,后面去了外企,字节,更后面回了腾讯另一个团队,都恰好参与向Go的技术栈转移,后两个团队完全是带领状态。
可以说,因为转型Golang,我趁机抹平了至少五年的语言研究差,并趁机崛起,形成了自己的核心价值,Go语言专家。
我想JAVA也很多大佬,如果想弯道超车,倒是不妨试试Go,这是个拥抱变化的时代,何苦老赛道陪跑~
pbk8495 发表于 2023-10-3 20:01:12|来自:中国 | 显示全部楼层
Java太卷了,我要转Go
Go不赚钱,我要转算法
算法太难,我要转XXX
就业有风险,转行需谨慎

最近很多读者问我:计算机视觉工资高,我要不要转过去。。。
其实我读硕士的时候,学的就是计算机视觉(图形图像学),当年这个专业基本找不到工作。
实验室厉害的同学都选择了互联网或者国企公务员,只有极少几个同学拿着其他人一半不到的薪资一直坚守这个行业,5年后计算机视觉开始爆炸发展,现在这几个同学都是巨佬了。
从众必死、找到自己才有出路!
为什么这么说?你看到的热门,别人也都看到了,一窝蜂冲过去你的优势是什么?如果没优势如何能分到一杯羹而不是饿死?
但不断发掘自己的兴趣和热爱,一旦找到这样的事业,就算短期没有物质激励也能坚持,这种坚持恰恰是长期主义的另一种诠释,一旦积累到一定程度就能厚积薄发。
哪怕你热爱的岗位和行业一直不温不火,相比别人你也会获得竞争优势,而一旦火了,你就是巨佬。
哪怕你真的要转行,也别硬转!

强转灰飞烟灭!

一条可行、靠谱的路线是,比如题主想转Go,那就要自学Go的基本语法,再多看看Go的学习视频,推荐一个很好的入门Go的资源给大家:
作者:茹姐;链接:https://www.zhihu.com/question/317359847/answer/640380263;来源:知乎
这个基础视频是一个Go资深工程师录制的。

https://www.bilibili.com/video/BV1k4411G7yy学习Go语言建议还是系统的学习,先从基本语法开始。
step1:基础阶段:
先看看这个,是Golang基础的,虽然是英文版,但是说的简单明了。
https://golangbot.com/learn-golang-series/
然后配合练习代码:
https://github.com/GoesToEleven/GolangTraining

中文版的可以看看这套,是我在上一家公司写的go的入门级教程《Go语言入门指南》,在github上还有配套代码:
https://www.chaindesk.cn/witbook/13

step2:web阶段
可以直接看https://astaxie.gitbooks.io/build-web-application-with-golang/
配合练习内容:
https://github.com/GoesToEleven/golang-web-dev

或者看看我写的web教程《GoWeb开发实战(Beego框架实现项目)》:
https://www.chaindesk.cn/witbook/17

step3:框架和项目
老司机带你飞系列:
https://github.com/happyer/distributed-computing

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则