Java还是C++,C++还是Python,人工智能还是大数据,深度还是广度……
经常逛技术论坛或在技术群里唠嗑的小伙伴,对以上的选择题应该都不陌生了,出题者往往也是新入行的小伙伴们。作为一个老鸟,很惭愧我没有足够的智慧去做这样的选择题,尤其是在对提问者的背景和基础完全不了解的情况下。那么技术路线的选择,真的有那么重要吗?
在着笔此文时,我忍不住回忆了下,大约十年前,技术圈里颇有名气的孟言先生关于技术路线选择的文章:《 技术路线的选择重要但不具有决定性 》。如今看来,我仍然同意孟先生的观点,就是技术路线虽然重要,但是不具有决定性,具有决定性的是个人 独特的个性知识经验组合 。而这个知识经验组合在我看来,就是某方面的技术实力 + 行业知识 + 业务能力 + 前瞻视野。
这么说来,技术路线是可以盲选的吗?倒也不是,只是它对你是否能够成长为大牛起的作用没有那么关键而已。接下来我将结合自己的技术经历,来聊聊这个话题。
我在学校里学编程时,首先入坑微软技术路线,折腾最多的就是VC++、.NET那套工具。毕业后,也自然就找了这方面的工作,一直在这个路线上走了五年。期间,我曾经对软件破解、系统内核驱动开发感兴趣,也花了不少的时间去理解尽可能底层的东西。而当我的一些同事因为在用Linux系统而沾沾自喜的时候,我心想Linux不就那几个命令吗,你们知道一段代码反汇编后是怎样的吗,知道参数入栈顺序吗,知道C++虚函数表是怎么存放的吗,知道一个结构体的内存如何对齐的吗,知道应用层到内核层调用是怎么实现的吗,知道Intel三卷本是什么内容吗,知道操作系统系统启动的具体流程吗……。可见,当年的我对自己深入底层的学习方式还是蛮自豪的。
然而,一次工作的变换,让我偶然地从Windows开发转向了Linux服务器运维开发。这家公司是搞云平台的,我的主要任务就是使用各种虚拟化技术搭建私有云,比如进行OpenStack、VSphere、XenServer等集群系统的自动化部署。从事云计算,需要对计算、存储、网络都有一定程度的理解,才能搭建出一套可用的系统。这样,我从原来网关具体是什么都不知道的情况下(虽然之前也进行过网络编程),变成了公司里对网络技术原理理解比较好的少数人之一。因为我需要写代码去自动配置交换机、自动划分VLAN、自动化安装服务器操作系统和部署其上应用,这些工作任务都要求我必须理解透一些相关技术。虽然在这之前,我对网络上软件领域各个方向的牛人都挺了解,时常苦闷于自己的视野早早超越了自己的能力,但转向Linux服务端后,我又感觉自己的视野才被真正打开,原来还有这么多有趣的技术内容,我之前是一无所知的。因此,即便这是我服务过的在福利方面最抠门的公司,我仍然要呆到合同满期才考虑换工作,我要在这里完成彻底的技术转型。
从这家云计算公司离职后,我刚开始是想继续找云计算系统研发方面的工作,但因为回到大南宁,这类坑位很少,而且我当时认为云技术是大厂玩的技术,小企业打打闹闹没有多少前景,还是转到应用层研发吧,毕竟自己也比较缺应用服务开发方面的经验。这样一来,我工作的内容就从云平台系统研发变成了如何使用云平台提供的产品组件进行应用系统架构和开发,直至今日。
有时我在想,如果职业生涯可以重来的话,我会怎么选择呢?首先,我觉得我不会在微软系技术上花费那么多时间,反正不会是五年,可能三年左右就好了。我也不会想着特别深入地去理解C++的一些东西,而是遵循一些最佳实践,用不到的淫技就先搁一边,然后早点学习Java。大四的时候,我就收集了Java的相关学习资料,当时听说Java跟C#差不多,而我在用C#,所以就觉得学习Java是多余的。然而Java生态繁茂,有很多技术思想都值得去学习,我却因为自己的无知错过了,直到今天,项目需要使用Spring Cloud,我才真正认真地去接触Java方面的一些技术。内核相关技术呢,我倒不后悔花时间去学习,当然如果能结合应用场景去学习,可能会有更好的效果。现如今,内核相关技术我也忘了很多,但这句歌词还是比较能表达我的心情,就是“我爱你不后悔,也尊重故事的结尾”。
所有人都想走捷径,然而哪里有那么多捷径可走,我的反思未必适合你,也许你一直走微软系技术路线,他日成为技术专家、技术大神,一样迎娶白富美走上人生巅峰,谁知道呢。关于少走弯路这个话题,我又想到了当年刘未鹏的一篇文章《你应该如何学习C++》,这篇文章是他在南京大学读书时候发表的,而评论里有不少业界知名的技术人参与,非常精彩,其中还是前面提到过的孟言先生的评论当属最精彩。八卦下,未鹏兄入职微软亚洲研究院后移居西雅图,目前很少网上发声了。孟言的评论如下:
myan: 我曾经问过一个美国大学的教授,是一项国际大学生编程大赛的主席,那些编程大赛的题目究竟对实际软件开发有什么用?他说,其实他们也知道不太有用,但是第一只有这个形式的东西搞比赛容易操作,真正有用的东西没法比赛,第二,重要的是选手参与这个比赛的过程,要想取得最好的成绩,往往要花几年时间,做几千题,几千道跟实际软件开发没太多关系的题。最后证明,在这个大赛中取得好成绩的,以后在工作中大多数也能取得好成绩。你说这个弯子绕的大不大,这个时间花得冤不冤? 最后,其实这些话是写给你的,也是写给我自己的。10年前的这个时候,正好是我已经熟练掌握了C,开始雄心勃勃地向C++主峰发起进攻的时候。今天如果能够让我年轻10岁,回到大学里重新选择,我可能不会选择深入研究C++,而是把C学透了,就去研究OS、Compiler、TCP/IP。但是当年我看不到这些,只能看到C++。我后悔吗?不太后悔。人只能在一种局限性与另一种局限性之中选择,走了那条路,今天就会后悔别的事情。如今我对IT这个产业链有所了解之后,更觉得世界之大,岂是一人一时所能逆料。所以全局最优是可望不可及的,个人所能做的,只是追求局部最优而已,然后让命运的大浪把你送上高峰或者拍入深渊。比如,你以为出国读书,一定是好?你以为被一流大公司高薪聘请,一定是妙?你以为你在学生阶段写出一个软件,搞得天下闻名,万人敬仰,就一定有好结局?真的不一定啊。但是不一定,是不是我们就可以吊儿郎当,游手好闲?当然不是。全局最优不可期盼,但局部最优一定要努力争取,要按照自己定的路线去踏踏实实的努力,取得尽可能好的成果。所以,你要想做个好的语言律师,就踏踏实实下功夫去做吧,没什么不对的。还是那句话,下足功夫,练出一副好身板,比什么都重要。如果说后悔,我从不后悔技术路线的选择,只是后悔那时候下得功夫还是不够,还是拿出太多的时间去看电视,吃烧烤了。
我倾向于同意孟言的观点,我们都不是先知,有些弯路不可避免,而有些你认为的捷径,到头来可能会让你跌入更深的坑,最终会延迟你到达目的地的时间。
那么回到年轻人如何选择技术路线的问题,其实还是很难回答,答案也因人而异。比如你喜欢弄图像界面,看到效果心里美滋滋的,那你可能适合做前端,容易有成就感,相反的,你可能适合做后端开发,又或许,你什么都不适合。那C++、Python、Java又如何选择呢?我觉得你先接触到的项目用什么就先学什么,而且在我们的职业生涯中,换开发语言也是常有的事。如果你是自学,没有项目做,那你随便了,可以都学习一下,然后根据自己喜好去选择进行更深入学习的方向。至于捷径,我只想说,也许用心、脚踏实地就是最好的捷径。
微信扫码,进入【技术人成长】社群逛逛。