有些初入职场或还在学校的同学总问,到底我该选哪个技术方向?我现在该学哪门语言?你觉得未来 Java 的发展趋势如何?这些问题的本质其实都是技术的投资决策问题,也即现在我该把时间精力花在哪个方向上,未来的受益才可能***?
这个问题并不好回答,因为这个问题的本质和“我现在应该投资哪只股票?”一样。没有人能回答好这个问题,回答这类问题***的方式,我觉得就是从投资的出发点而非终点来选择一条路径。至于这样选择的一条路径是否能获得很好的未来收益,这个是没法预测的。但选择技术方向和选择股票不同的是,只要你在一个路径上持续努力、学习和进步,可以保障能和「大盘」持平而不至于有亏损,但是否能取得远超「大盘」的收益,其实是看运气的。
选择语言
现在选择技术方向,从某种意义上讲就是选择语言。虽然有一些大牛的说法是,语言并不重要,必要的时候可以在各种语言间自由切换。但实际情况是,能做到自由切换的前提是你得对一门语言掌握到通透之后,再学习其他语言才可能触类旁通。
计算机的程序语言虽然很多,但种类其实有限。2017 TIBOE 程序语言排行榜上的前三位:Java、C、C++,本质上其实是一类语言。但大部分人只能选择去熟悉并通透一种,因为围绕这些语言背后都有庞大的生态圈。要做到通透,只熟悉语言本身是远远不够的,其实是要熟悉整个生态圈。而三门语言中最年轻的 Java 都有二十多年历史了,足够你耗费数年时光去熟悉其整个生态圈,而且目前其生态圈还处在不断扩展状态,显示出一种蓬勃的生命力。
所以,若是我自己要如何选语言?我会选择那些显示出有蓬勃生命力的语言,但其实十多年前我只是凑巧选到了 Java,它就像是被潮水推到我脚边的漂流瓶,顺手捡了起来。没想到居然蓬勃的发展了十多年,还没见衰退迹象。那时的 Java 刚诞生不过七八年,和今天的 Go 语言很像。Go 语言在排行榜上的位置蹿升的很快,而且在云计算时代的基础设施上大放异彩,号称是:易用性要超越 PHP,而性能要超越 Java。
那么在 Java 之前我学的是什么?是 Visual Basic、ASP 和 Delphi/Object Pascal。我想今天不少年轻的程序员未必听过这些语言了。但神奇的是,在 TIBOE 的排行榜上 VB 加了个 .NET 排名尚在世界最广泛的 Web 语言 PHP 和 Javascript 之上。而 15 年前我用的 Delphi/Object Pascal 居然也仅次于 Javascript 之后,远高于 Go,Objective-C,力压 Swift。
这些老牌语言还值得学吗?当然不值得了,因为早已进入暮年,没了蓬勃的生命力。但为什么排名还这么高?因为它们也曾经有过蓬勃生命力的热血青春。留下了大量的软件和程序遗产,至今还没能退出历史的舞台吧。
美国作家纳西姆·塔勒布(《黑天鹅》《反脆弱》等畅销书作者)说:“信息或者想法的预期寿命,和它的现有寿命成正比。” 那么编程语言以及由它编写的所有程序和软件系统,本质就是信息了。所以,存活的时间够长的语言,可以预期,它未来也还可能存活这么长时间。这一点在 Delphi 上已经得到了体现,进入二十一世纪后,这种编写 C/S 架构的语言,居然还存活了这么久。
选择回报
选择技术方向,选择语言,都是一种投资。我们为此感到焦虑的原因在于,技术变化那么快,就怕自己选了一个方向,投了几年的时间精力,***却被技术迭代的浪潮拍在了沙滩上。
按上面塔勒布的说法,越年轻的语言和方向,风险越高。一个今年刚出现的新方向、新语言,你怎么知道它能在明年幸存下来?所以,考虑回报的确定性和更低的风险,你应该选择有一定历史的方向或语言,也许不能带来超额的回报,但能带来稳定的回报,让你现在这个行业里立稳脚跟。在此基础上,再去关注新潮流、新方向或新技术,观察它们的可持续性。
投资箴言:高风险未必带来高回报。在选择职业方向的路上,你甚至没法像投资一样去分散投资来控制风险,所以选择确定性的回报,要比抱着赌一把的心态更可取。看看当前的市场需求是什么,最需要什么?长期需要什么?
比如,今天,技术的热潮在人工智能、机器学习。这是市场最需要的,所以市场给的价格也是***的。所以,我应该投入这里么?先别头脑发热,看看自己的基础,能否翻越门槛,及时上得了车吗?世纪之初,互联网时代的到临,网络的爆发,你会写个 HTML 就能月薪上万 —— 上万,似乎不多啊,但那时北京房价均价也才 5K+ 啊。2010 年左右,移动互联网兴起,一年经验的移动开发者的平均待遇达到了五到十年 Java 开发的水平。如今,你只会 HTML 基本找不到工作,你有五年移动开发经验相比五年 Java 开发经验的同学,薪资待遇也相差不多了。
关于技术,有一句流行的话:技术总是短期被高估,但长期被低估。不妨投入到一些可能在长期被低估的技术上,而不是被技术潮流的短期波动所左右。今天,在人工智能领域获得超额回报的***专家,实际在数十年前在其被低估时就进入了,数十年的持续投入,在今天迎来了人工智能的「牛市」才有所谓的超额回报。
技术的选择,都是赚取长期回报,短期的波动放在长期来看终将被抵消掉,成为时代的一朵小浪花。
选择行业
搞清楚了语言、技术方向和回报的关系后,***做出选择的立足点通常会落在行业上。
当你问别人该选什么语言时,有人会告诉你,你应该学习 Javascript,互联网 Web 时代的通用语言,到了移动互联网时代依然通用,而且现阶段生命力旺盛的就像再年轻十岁的 Java。也有人告诉你也许从 Python 开始更合适,语法简单,上手容易。还有人告诉你,现在啊学 Java 找工作最容易,平均工资也高。有各种各样的说法充斥在你的耳边,让你犹豫不决,左右为难。
一个问题就像一把锁上的锁头,李笑来说:开锁的钥匙通常不会就插在锁上,别在锁头上找钥匙。那样,这个问题也就不是问题了,太容易就解开了,不是吗?所以,选择什么语言通常不在于语言本身的特性。
选语言,就是选职业,选职业首先选行业。先想想自己想从事哪个行业的软件开发,再看看这个行业的现状如何?行业的平均增速如何?和其他行业相比如何?这个行业里***的公司相比行业平均增速又如何?那么,再看看这些***的公司都用些什么样的技术栈和语言,如果你想进入这样的公司,那就很简单了,就选择学这样的技术和语言。
这样选择是不是太功利了?选择不是应该看兴趣么?注意,这里选择的前提可不是发展什么业余爱好,而是获得安身立命的本领,获得竞争的相对优势。兴趣,就是这件事里有些吸引你的东西,让你觉这是“很好玩”的事。但有个通常说法是,一旦把兴趣变成了职业也就失去了兴趣。因为,职业里面还有很多“不好玩的”事。兴趣能轻松驱动你做到前 50%,但按二八原则,要进入前 20%,兴趣就不够了。兴趣给你的奖励是“好玩”,但继续往前走就会遇到很多“不好玩”的事,这是一种前进的障碍,这时功利,就是给予你越过障碍所经历的痛苦的补偿。
...
想想你为什么要选择学习一门编程语言,学习编程的一部分是学习语言的语法结构,但更大的一部分 —— 耗时更久且更让你头痛的部分 —— 是学习如何像一个程序员一样解决问题。
有时这样的选择确实很难,因为我们缺乏足够的信息来做出***选择。赫伯特·西蒙说:当你无法获得决策所需的所有信息时,不要追求“***决策”,而要追求“满意决策”。定下自己的满意标准,找到一个符合满意标准的折中方案,就开始行动吧。
停留在原地纠结,什么也不会改变。
【本文是51CTO专栏作者胡峰的原创文章,转载请联系作者本人获取授权】