哎,我想换个技术栈了,怎么办?
工作几年,想换技术方向?
有读者在微信问我:轩辕,我想从C++换成Java方向,有什么建议吗?
看到这个问题,我还是有资格回答的,我也经历过和他一样的疑惑,想着可能不少人工作几年后都想过更换技术方向的问题,就干脆写篇文章来分享下我的看法。
先说说我的技术经历吧。
熟悉我的读者估计知道,我在学校里就是学C/C++技术栈出道,走上程序员这条不归路的。
不过可能和你们想的C++还不太一样,我一开始学的是Windows平台上的开发,玩的是Visual C++、MFC、WFC···微软那一套玩意儿,手捧的是《Windows核心编程》、《深入VC++详解》等等书籍,琢磨的是窗口消息、界面绘制、完成端口这些技术。
那时候也不知道啥叫客户端开发,啥叫服务端开发,更不知道Windows开发和Linux开发的区别,没这个概念,也没人告诉过我。
在学校里面还好,待在实验室做做项目开发,待在自己的舒适区,勉强还能应付遇到的问题。
但临近毕业,开始发现:怎么招C/C++开发的比Java少那么多?而且还大部分还是Linux上的C/C++开发?
Java?我不懂啊!
Linux?我也不懂啊!
这是对我的技术栈第一次产生质疑。
不过运气好,得益于大学几年对Windows内核琢磨的比较多,校招顺利去了某度做安全软件底层驱动开发,没怎么为找工作发愁。
开始工作后,接触到的技术深度和广度一下就开阔了,尤其是工作中开始接触到其他技术栈的同事,前端的、Java的、Linux C++的、PHP的各种都有。
我对自己的技术栈第二次产生质疑是进入某度的第二年。在那年秋季的晋升期间,一位长我几岁的技术大牛前辈晋升失败了,一起吃饭的时候,另一位同事劝他说:看开点,在某度,T7基本上是做端上技术的天花板,那些技术委员会的评委是看不起咱们这些做端上开发的···
他们口中说的端指的是客户端,包括Windows、Android、iOS乃至前端。
技术委员会的人要么是来自搜索系的算法大牛,要么是Linux服务器开发高级架构师,在他们眼中,玩端上开发的确实要low一些吧。
当然,上面都是当时的我们几个人自我揣测,并不代表某度是实际情况哈。
但当时刚入职场,对我的冲击还是挺大的,强如前辈这样的大牛都这样,我就更···所以,彼时,我就告诉自己:一定找机会完成技术转型,毕竟Windows开发已经是夕阳产业了(仅代表个人观点)
后来从北京去了上海,同一个部门transfer过去的,趁此机会,我开始调整了我的技术方向,在新的岗位上,开始拓展自己的技术领域,接触了更多Linux、Java等等。
再后来回到成都,我要重新找工作,跟我毕业那会儿情况差不多,还是Java、PHP的天下,有C++的也基本上是Linux。
后来面了一圈儿,拿到了3个Offer,2个是Windows上的开发,这个我最熟,经验最丰富,工资和我在上海相差无几,差不多算平薪回来。
但我了解到这两家公司能够接触到的技术面对我日后的发展并无太大帮助。而第三家,不仅是Linux C++,还涉及到海量数据分析、存储、架构设计等等,这些都是我能学到的新东西。但第三家公司依据我当时的能力,在Linux平台开发经验尚浅,开出的工资差不多只有原来在上海的一半。
纠结再三,我还是选择了第三家,加上女朋友也鼓励我,我也就没有后顾之忧了。我相信自己的学习能力,一时工资的损失,换取更长远的发展。
后来的经历证明,我的选择是正确的。得益于对Windows操作系统的学习经历,很快就对Linux操作系统有了比较系统深入的学习和理解,后来发现,没我想象那么神秘,编程讲究的是算法、设计和思想,操作系统只是一个落地的平台,切换起来很快的。
操作系统核心就那些东西:
进程线程模型 内存管理 系统调用 中断与异常 同步与异步 I/O模型 网络协议栈 文件系统 驱动设备 ···
这些东西,换了平台,思想都是相通的。
从大厂一下进入小厂,多少心里是有一些落差的。
不过随着技术能力的见长,工资回报也相应的得到了体现,一年多以后,工资赶上甚至超过了之前在上海的水平,我又成功从小厂去了大厂。
再后来,编程语言也从C++切到了Java和Python,有了开发平台切换的经历,语言的切换就更加轻松一些。
掌握一门编程语言,第一步是学语法,无外乎就是这些:
数据类型 输入输出 循环处理 分支处理 函数 类和对象 ···
学完语法,接着了解这门语言的工作原理,是编译成机器指令的,还是用中间字节码虚拟机执行的,还是脚本解释执行的。在我学Java的过程中,就会去对比Java和C++程序的堆和栈的工作方式的区别、函数调用参数传递的区别、面向对象实现的区别、反射实现的原理、垃圾回收的原理等等,在对比中学习,有了C++的基础,再看JVM的实现,确实是一种享受。
语言学的差不多,接着就是接触各种主流框架和库,Spring、SpringMVC、SpringBoot、MyBatis、Django、Flask···
再接着,就是学习行业主流的第三方组件的使用:MySQL、Redis、ElasticSearch、CEPH、MongoDB、Nginx···而这些,与语言无关。
结语
说了这么多,我对切换技术栈的看法是什么呢?
首先,在技术方向选择上,尽量选择就业岗位多的方向,少选狭窄的细分领域,当然不是说细分领域不好,毕竟每个领域都需要有人去做,只是相对来说,更通用的技术栈,你就业的选择面也会宽广许多。
其次,真要切换起来,没你想象那么难。
工作时间越久,接触的技术越多,越来越觉得,
开发平台重要吗?重要。
编程语言重要吗?重要。
它们是重要,但没那么重要,平台和语言属于知识的范畴,可以通过短期的学习补上,更重要的是技术思想、算法、架构、设计模式、学习能力等这些东西,是跨越平台、跨越语言的,需要长年累月的积累才能形成。
所以,不用担心切换技术栈后一切从0开始,你曾经积累的那些知识和能力都会成为你学习新的技术栈上的助推剂。
最后,保持一颗学习进取的心,一颗勇于探索的心,一颗喜欢折腾的心,认准了,干就完事!