1. 为何要转技术栈?
在这之前,我已有五六年的C/C++的开发经验,Java相关的知识还是在大学里学习过,工作以后就没再接触过相关的内容。那是什么原因促使我产生转技术栈的念头呢?
答案很简单,生活所迫。说的更全面一点,我个人其实也是有一股很强烈的好奇心,喜欢探索新领域,挑战自己把握不了的事情。
很多小伙伴可能会有疑问,C/C++不是收入更高吗?怎么转型的原因会是生活所迫?
这和公司分布、房产价格、户口有关。这里不做展开,感兴趣的小伙伴可以单独联系。
2. 迈出第一步
大概可以这么理解,百度、腾讯等做搜索和社交的公司内的开发职位大多数是以C、C++为主,总部集中在北京、深圳;阿里巴巴、蘑菇街等电商类公司内的开发职位大多数是以Java为主,总部集中在杭州。
做转型迈出第一步是非常困难的,这里包括圈子里的技术鄙视链,做C/C++的鄙视做Java的,很多人会不理解你为何会做此选择;另外没有Java领域的开发经验,几乎所有的头部公司尤其是大公司会明确say no。
但凡事皆有例外。比如在17年风头正盛的某公司,发展速度非常快,人员需求非常强烈,我更愿意相信是公司相信开发语言只是一种工具,重点看候选人基础是否扎实,人是否聪明,满足这些特质通过短时间学习可以很容易快速上手。
互联网圈子其实很小,我很快捕捉到了这个公司,约了某个晚上面试,一共三面,两轮技术一轮HR,面试过程围绕算法展开,需要伪代码实现,2个多小时全部搞定。这是至今为止我遇到的面试效率最高的一家。
3. 快速学习
先说结果:通过我的博客可以看出学习的过程和时间线,通过2个多月的学习,基本掌握了java里的一些基础知识、构建工具以及相关开源的集成、部署等系统,至此,可以看明白代码并完成第一次应用发布了。
这里的经验是带着一线实际运行的业务服务代码来看,一点点的扣,一点点的梳理。
我学习的服务代码框架是spingboot + redis + ehcache + mybatis, 编译工具是gradle,集成工具是Jenkins,发布系统是marathon。
开发工具也发生了变化,之前是通过notepad++或者vim,Java里会使用IDEA-IntelliJ。
这里面给我困惑最多的是注解,由于之前从未见过如此写法,一上来感觉有点懵逼,看了多篇注解的写法以及追踪进去查看注解的实现,才有了一些认识。
基础知识储备到一定阶段以后,开始尝试动手创建一个SpringBoot工程,有个整体的体感,对应的教程网上有很多,我原来收藏的链接现在无法访问了,就不贴了。
4. 小试牛刀
开始做第一个应用的小需求编码,需求的具体内容记不太清了,大致是一个写多读少的场景,用于保存一些信息。涉及到了分库分表的设计,以及基于mybatis的增删改查。
一路坎坎坷坷,遇到了各种编译不通过问题、打包问题、部署问题等等,此处的建议是一定要自己钻研(查看相关文档、分析运行原理),实在搞不定再借助Google,最后确实搞不定再选择求助身边同事。
发布过程一定是有多套环境及灰度策略的,除了造数据验证流程之外,还要密切关注应用的日志输出和监控大盘,持续至少30分钟。
虽然过程坎坷,搞到凌晨半夜才把服务发上去,但系统代码运行还是很稳的,没有遇到bug导致的回滚以及业务问题。
问题大致一览:
redis异常
…
Caused by: java.util.NoSuchElementException: Unable to validate object at
…
定位后发现是redis配置不对,uris少了个引号…
mybatis绑定异常
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.UserMapper.search
定位后发现
In src/main/resources your folder is named com.example (look at your system directory). Instead, you should have folder com and inside folder example then put your UserMapper.xml inside and run your app again.
即resources目录下定义了一个叫com.example的目录,而不是嵌套目录,com/example 🤦♂️
在idea里看起来是一样的,但是去到本地系统文件里看,实际上是建立了一个目录,名字叫这一串。
还有很多排查后的低级错误,这里就不一一列举了。
5. 深入浅出
重点学习了JVM、RPC框架(dubbo)、本地缓存ehcache以及Java里的高级特性的基础知识补充。
这个过程历时两个月,中间也看了一些技术书籍,这里重点推荐一下Doug Lea的《Java并发编程》,对于concurrent包、automic包,synchronized锁、AQS锁、CAS的实现,NIO等。
并发编程网 http://ifeve.com/doug-lea/
6. 更多选择
经过前两个阶段共四个多月的学习,Java的基础知识已经基本掌握了,也顺利的开发了几个线上的迭代需求并发布上线,对从开发到测试到上线完整的流程有了清晰的了解。这个过程是进步最快的过程,接下来就是多次迭代需求增强这种经验了。
经过半年的技术沉淀,基本对Java领域的开发轻车熟路了,基础、框架、工具、监控等有了通盘的认识,是时候检验一下自己的掌握程度了 -_-
按照公司规模从小到大的顺序,分别聊过工具类、金融类、综合类、出行类、电商类的多家公司,结果还不错,80%的企业都聊的蛮顺利,offer率也还不错,达成了5成以上。
经过一年多的转型,使自己有了更多的选择。
很多时候选择大于努力。
7. 后记
目前通过另一种技术工种进入大厂已有两年时间,对当前的状况非常满意,现在回头来看,对于之前转型的决定,要给过去的自己一个大大的赞。
当然不同的人有不同的背景和选择,个案仅供参考。
过程中如果有更多需要交流的,可以留言评论或者发邮件给我,我的邮箱swmabby@gmail.com
本文完。