1
对于程序员来说,我们经常要学习一些技术知识。从入门级的c编码语言,数据结构与算法,到具体的某一项工业应用技术,不断学习知识是程序员必备的技能之一。技术知识学习的渠道,可以通过书籍,也可以通过文献,亦或通过技术大神的干货知识分享。
大家有没有发现这样一个现象,即使你看过了很多技术知识,你也不一定会成为这个技术的大神。而实际上,最后能成为技术大神的往往只是少数人。
我上大二那会儿,开始自学算法。学长们向我推荐了一些经典算法的书籍。在大二寒假,我就抱着厚厚的技术书,不知厌倦地开始啃起来了。寒假结束了,书终于被我看完了。但是我发现,似乎我对算法的应用并没有非常得心应手。于是,我又把算法书刷了一遍,还动手了写了一些程序代码。但是我发现依然没有掌握好算法。问题出在什么地方呢?
不知道你有没有和曾经的我有过类似的经历?花了很多时间,看了很多编程/技术书籍,还认真研读了大神们分享的技术干货,但最后发现还是没掌握编程/技术,更不用说成为编程大牛了?
成为一名编程/技术高手就这么难吗?
2
之所以你觉得这么难,一个重要的原因是你所接受的这些技术知识其实是隐性知识!
那什么是隐性知识呢?
隐性知识是相对显性知识而言的,它是由迈克尔·波兰尼(MichaelPolanyi)在年提出的概念。
显性知识,通常是以书面文字、图表和数学公式加以表述的知识,这些知识包括生活中一些的常识、新闻,数学中的公理公式等。隐性知识是无法用语言清晰表达的知识。这么说有点抽象,你可能不理解。
举个例子。
很多人都喜欢打篮球。你从网上或书店买了一本关于如何成为篮球高手的书籍,希望阅读后能成为篮球场上的高手。
于是,你照着书本的知识,完完整整、认认真真地进行研读。把打篮球的技术知识都熟记于心后,你上篮球场去打球。然而,你发现,你所学的这些篮球技术知识,并无法马上在篮球场上得到熟练运用。就算你把这本书从头到尾背得滚瓜烂熟,你依然打不过篮球场上的老手。简而言之,拥有篮球技术知识,并不会使你立马就会成为篮球高手。
“如何成为篮球高手“这是隐性知识。
不仅书上的知识无法让我们马上成为高手,而且就算你去请教那些篮球明星,他们给你了建议,也不会让你立马达成愿望。
而且,那些篮球打得好的人,绝大部分并没有读过一本和篮球相关的书。
这就是隐性知识的特点。知识通过学习都能懂,但是只是知道知识,哪怕倒背如流,也并无法让你成为高手/专家。
这是隐性知识与显性知识的最大区别。显性知识,通过学习,我们能很快掌握。比如小时候识字,生活常识,数据公理等。而隐性知识,除了学习知识外,还需要去实践才能真正掌握。
你要想成为篮球高手,除了学习技巧知识外,还必须去球场上不断地去运用这些技巧,在运用中不断理解这些知识,矫正自己的学习偏差,将技术通过实践沉淀到脑中。篮球名宿科比的一句名言:你见过凌晨四点的洛杉矶吗?说的就是高手来自于不断实践。
3
在IT领域,如何掌握一门技术知识成为技术大牛,这也是隐性知识。跟打篮球一样,要想成为牛人,不要光看书,或者光听课,要多撸代码,在实践中成长。
后来真正让我在算法上有成长的是参加了程序设计比赛。大三上学期,学院里成立了ACM程序设计小组。抱着好奇心,我加入了这个小组。于是,有小半年的时间基本上都在各种OJ、TopCoder上混。在这小半年里,不断地代码调试,反复阅读别人源码,撸官方文档,白天泡实验室,晚上回宿舍接着搞,碰到硬骨头时搞到凌晨两三点基本是常态。付出总是有回报的,经过那段时间的钻研,我发现编程技术有了成长,经常写出一段代码后不用编译,直接就能跑出正确结果。后来还参加了亚洲区的ACM比赛,拿了奖。再后来,进了实验室,接触了科研项目,进一步让我真正感觉到技术的用武之地,激发了更大的技术学习热情。
所以,你在某个夜晚苦熬一个知识点后,你不会觉得技术突飞猛进。要想学好技术,不是把知识都看懂理解就行了,而是要多动手写代码。通过不断在代码中犯错,调试,渐渐地你对学到的知识产生了新的实践理解,对常见的错误、技术的不足也会有自己的认知。这一过程常常会持续很长时间。等到你有足够的实践和认知积累,你自然也就掌握技术知识,成为技术大牛。
4
技术的学习壁垒并没有那么高,真正拉开一般程序员与牛人差距的是实践经验。实践经验是隐性知识,无法用语言清晰地表达出来,它是每个牛人在成功道路上总结的秘诀。
但牛人也不是不可赶超,一般程序员通过不断学习、增加实践经验也可成为牛人。
首先,要多看书。从原理上扫清知识盲区,做到能够基本理解书本上的代码和技术。对于重要的代码和技术,自己尝试写出程序模仿,加深理解。
其次,了解原理后,采取项目驱动式的学习方法,通过参与到实际项目中,发现问题,进而用技术来解决问题。项目的来源可以是开源社区,也可以是工业界。
开源社区。Github上有丰富的学习资源和开源项目。挑选合适自己的项目去学习,阅读项目的文档、例子、单元测试、源码,然后在理解的基础上,去发现项目的问题,通过代码改进项目。在工作/实习中提高你的技术能力。工业界的应用通常是解决用户、企业需求的项目,在这些项目里用技术去解决实际真正的问题,代码让人能读懂,程序高效可维护,被review的次数很少,这些都是技术能力的体现。通过技术解决用户的需求痛点,你会更了解到技术本身的优势和不足之处。用力啃好书,在用代码解决实际问题中成长,坚持下来,剩下的时间会帮你搞定。