上大一时有个同学这么跟我说:
哥们,我都想好了,下面我列了个单子就学下去了: C, C++, C#, Java, J++, J#, javascript, PHP, HTML, css, python, Visual Basic,Win32的汇编,……,你觉得怎么样。
我和周围小伙伴简直都惊呆了,我连写Hello World都不太利索啊,这人简直太厉害了。
然而几年以后我看到庄子说了这么一句话:
以有限的生命去追随无限的东西,吃枣药丸!
醍醐灌顶。
知识技能是无穷无尽的,这就好像全国各地的小吃摊一样,只要你肯投入,吃到死也吃不完。这个道理相信所有人都懂。但为啥一到自己要学的时候就想这也学那也学,学到最后貌似还是没把事情办成?
学习是有成本的
老一辈总是这么教导,”学好数理化,走遍天下都不怕“。又或者,总是觉得“艺多不压身”,多学点总是没坏处。大道理还算对,但是有个关键点估计大部分人都不怎么考虑——学习的投入成本。
学习的投入是惊人的,尤其是极度改变思维方式的学习。一个普通人到熟知微积分、非欧几何,可能需要巨大的时间和资源来扭转自己的脑子,使其变成总是习惯用绝对的逻辑思考;学习艺术设计就完全反过来,脑筋要为感觉让路,感觉说high就得high;而学习计算机就更加奇葩——一边得照顾着机器,得精确、严谨,而另外一边得就让人爽,用户使用流畅,数据看起来符合心理预期。
你说说这个得多难学。
学习成本很大的一块是时间。
孔子这样说过:
学习了却不过脑子,就会犯二;而成天瞎想却不学习,就会挂科!
深以为然。
时间都被学习挤占了,就没有功夫思考了。思考什么呢?比如
学习的产出是有限的
即便学到了,任何知识技能都只能在特定条件下才能发挥作用。举个例子,你计算机再棒,把你扔一个没电的村子里,你学的东西有啥用?嗯,有点极端,再说几个靠谱点的例子:
- 学了REST和围绕REST的一坨工具,却发现业务中压根就不是正常的CRUD,也不好定义那个“资源”
- 学了Hadoop,Spark,Flink,想做数据分析,结果发现公司里就两台机器,几百万行数据
- 学了高大炫酷的微软技术,想写个界面却发现世界已经被移动终端占领了,是app、Web和微信的天下
- 搞明白了操作系统调度的种种细节,其大部分企业用不着这门手艺,需要这门手艺的不招你
- ……
所以,我在读个书之前,会读摘要和推荐文字,就是要以最小的代价弄明白这个东西对我有用没用。永远不要用“炫酷”来给自己要学的东西排序。性价比才是第一位的。
有人可能会问,“我会的东西不懂,就得多学打好基础”。我是赞同的。在这个阶段,还谈不上能够计较得失的时候。但是,这个阶段,最重要的不是“多学”,而是“巧学”,因为——
要学的东西可能会缩水
这一点在IT圈尤其明显。IT圈犹如江湖,各大门派纷争不休。各家都要推广自己的技术、产品、规范、框架、标准、文化。围绕这些形成了所谓的技术圈,以及带来的巨大的市场。
但是切记,巨头们争他们的,我们过我们的。没有皇帝命莫操皇帝心。争斗中有成功者(如H5),有失败者(如Flash)。而成功的也不一定能长时间挺下去(比如IE)。
我经历了经历了Win32 API, MFC, COM, ATL, 几代.Net的历程,最后连我自己都烦了,因为学的东西还没用到就过时了。刚学会Swift,新版本一发布就不兼容,得重学;还没来得及开发一个赚钱的App,大家开始都投入到了微信小程序的开发……真心赶不上节奏。
既然学什么都不稳固,那么就学两类东西:
- 马上能上手用起来的
- 可能长久有效的东西,可以跟一辈子的
前者大家都懂,自己的工作需求被老板扔过来,怎么做的快、灵活、高效就怎么来。如果技术有得选,选择容易学、概念清楚简单、不过于装的技术。这也是为什么很多业务场景脚本语言(比如python和js)和松散的约定(比如html)更吃香的地方——学了用,用完了就完了,不纠结。
而对于第二类
什么东西学的不吃亏
无数的牛人在不断的踩坑中总结了大量的经验。有些经验是超越了技术的自然规律——即,不管技术怎么变,抽象如何增加,也无法彻底隐藏/抽象的东西。了解它们,基本上就可以吃透大部分的技术出现的动机和工作原理;
- 存储 - 即数据写入/查询。不管干什么,总是要把数据用某种格式存到某个地方。不同存法有快有慢,有的便于写,有的便于查。有的在磁盘上工作的好,有的更利于SSD。以此为中心有数据结构、文件系统、B树、LSM、Cache、SQL、索引等主题。
- 任务调度 - 人类之所以能站在生物链的顶端,是因为人能够组织起来协调完成任务。计算机干活也类似,那么怎么调度几个核心协同工作是很重要的内容。围绕这个主题,有了进程、线程、协程、事件触发、并行/并发等内容。
- 分布式的一致 - 即A和B是两个分离的东西,A告诉B一件事,那么如何保证A说的和B听到的就是一摸一样。如果保证不了,又怎么做取舍。这个是现代分布式系统立足的基础。围绕这个问题衍生了网络、通讯协议和一致性协议等等。如果你接触的东西和分布式有关(比如Web,移动),那么必须非常细致的理解怎么做能达到一个什么样的一致。
- 状态机 - 计算机的经典思考方式。编程语言编译需要、网络通讯需要、甚至是常规业务也大量需要(比如一个人先答题,答了题才能拿券,拿了券下单才能优惠,优惠发生了才能发通知——一组状态切换)。
- 安全 - 计算机天然的状态是开放的。所有的约束都是在开放的基础上追加上去的。那么在一个系统中一条数据是怎么在可接受的代价内无法轻易被恶意第三方获取/篡改?基于这个中心,有对称/非对称加密,SSL协议,加Salt,Token编码,ACL管理,CSRF,注入等话题。
而这些,在后续的文章里,都会按照主题分期讨论。
那什么是不那么有价值的东西呢?对比一下SQL和JPA,前者非常有价值。而后者却相对不那么有用。SQL存在了数十年,成为这个星球上主流存储的访问语言,几乎涵盖了各种你能想得到的场景;而后者仅仅是一种编程语言下的一个框架下的一种特定用法,业务稍一复杂就无法解决问题。如果真要在二者之间分配时间,我猜应该是9:1。
结论
其实,学习是一门投资。而对待投资,就要
- 算计投入产出
- 不要被别人牵着鼻子走,学能用得上的
- 找到有长期价值的学习目标。
最后记得,不要忘记庄孙两位老夫子的话,用有限的生命去思考那些最有价值的东西吧。
PS
那个大一的哥们怎么样了?他之后回了老家做了小生意,有车有房,去了老婆,生了娃,还办了个厂。生活滋润幸福美满,真人生赢家。至于这个语言,那个语言什么,不提也罢。