音乐家会十几种乐器很牛,程序员会十几种编程语言是不是也很牛?
早先看到有人能玩很多种乐器感到很神奇,因为我自己只学钢琴这一件乐器就够费劲了。后来开始自学编程,又看到有人会十几种编程语言,同样让我觉得很神奇,就像当年看到有人会十几种乐器一样。
随着学习的深入,我自己也慢慢上手了多种计算机编程语言。C、C++、Java、MATLAB、汇编、Bash、Python、HTML/CSS/Javascript……林林总总也快有十种语言了。
自学编程的经历让我返回头来理解了为什么有人能通过自学掌握多种乐器。因为编程和演奏乐器的本质是一样的,都属于“技能”(Skill)的范畴,而技能类知识的共性是:
Use it, or lose it.
要么用它,要么失去它。编程语言要在使用中学习和掌握。比如学习DSP(数字信号处理)要用到MATLAB,虽然老师会说“不限编程语言”,但确实用MATLAB是最省心的,在完成课业的过程中随用随学,课上完了,MATLAB也跟着学得大差不差了。
与之类似,学计算机体系结构要用到汇编,学Linux要用到shell脚本编程,某种意义上说,编程更像是为了达成某个特定目的顺带学会的,学编程并不是目的本身。如果仅仅是为了编程而去学编程,那恐怕永远都不可能“精通”哪怕是一门语言。以C++的入门书《C++ Primer》为例:
为了方便让大家感受“知识的厚度”,我特意放了一枚一元硬币作参照物。《C++ Primer》作为学习C++的经典读物,虽然作者谦逊地称其为“Primer”(“初级读物”、“识字课本”),但厚度已经超过了八百页。很难想象如果是“Advance”读本那该有多厚,这么厚的书读完都费劲,更遑论熟练掌握乃至灵活运用了。
这和学乐器的情况很相似。钢琴小提琴这类乐器发展了几百年,和C++编程语言一样,都是博大精深。要想“精通”哪怕是其中一种,都要花费一辈子的心血。有人专门问过郎朗,是否有学过别的乐器,他表示学琴太费时间,别的根本没空学:
如果给自己的定位就是“学”工具,那当然很难理解为什么有人能靠自学掌握那么多种乐器或者编程语言,因为每种工具想“精通”都特别耗时(所谓“一万小时定律”)。但如果定位不是“学”工具,而是“用”工具,情况就会很不一样了。
观察那些会十多种乐器的神人,往往都是制作人、指挥家、作曲家,他们都有一个共性:乐器是创作或表达的工具而不是目的本身。就拿题主举的Stevie Wonder为例,虽然他可以演奏多种乐器,但单拎出其中一件,他一定不是演得最牛的那个。不过这不重要,重要的是整张专辑达到他的预设效果就行了,他不需要也没必要成为每件乐器的演奏大师。
Stevie Wonder这种人就好像是音乐领域的全栈工程师,他学乐器、用乐器是为了完成自我表达而不是吹毛求疵地掌握每一个细节,因此就会学得特别有效率,可以在短时间内掌握多种乐器。
好的全栈工程师就像音乐大师一样,关注的是产品最终实现,会根据产品需求自发地生长出技术栈。外行看到会惊叹“哇,他怎么这么牛,会这么多语言”,但内行会看技术指标。满足需求是第一位的,至于用什么语言,who cares?
那些以学工具本身为目的的人其实挺可悲的。他们虽然花了很多时间学工具,但不知道用工具做些什么,于是只能到劳动力市场把自己卖掉,让别人代替自己决定该做些什么。这真的是纯粹意义的“工具人”,资本家把他们当工具,工具人当然也只能做“打工人”。
工具类技能大多有“二八”效应,学个两成就能应付八成的使用场景,再继续学下去就边际效益递减了。
最终的落脚点还是在应用上。想想自己的任务是什么,学会将任务拆解,用不同的工具去处理不同的子任务,在使用中学习,你就会同时掌握很多种工具了。