今天有一位朋友私信我聊了好久,大致意思就是他可以完全听得懂我的C语言讲义,完全看得懂我在里面写的所有历程,看得懂《算法与数据结构》书上的所有内容,就是遇到自己写程序的时候却不知道从何入手。
结束这段对话之后,我不禁想到了之前的一位同事。此君可谓下知主流单片机,上懂DSP,FPGA,聊起来头头是道,但是每次交付的任务全部都是信心满满开头,半途而废结尾。
后来有一次项目问题比较大,他情绪低落,我去找他聊天时,他告诉我,他从大学开始就看各种单片机视频,网络上面的资料更是塞满了一个500G的硬盘,聊到开发板的时候,更是如数家珍,堆满了一整个橱柜,什么乐创的,野火的,原子的,百问的,黑金的都有。
我问他:“这些开发板的视频和资料你都看过了吗?”
他说:“都看过了,现在我们主要用的STM32我看了不知道多少遍,这两天项目要用,每天晚上回去都看。”
我又深层的问了他:“上面的代码你都自己敲过?”
他回想了下说:“这些代码不就设置几个寄存器吗?这还要敲,能看懂就行。”
以上对话我到现在还是记忆犹新,作为一个工程师,他技术的菜确实是有别人来替你买单的,不至于饭碗不保。但是对于一个学习知识的“学生”,他的态度确是注定他在后续职场的平庸。
别人写的代码你都看得懂,能代表你自己就能写代码吗?
每种知识的学习虽然看着南辕北辙,比如学英语就该多背单词,多用英语沟通。学习高考数学就应该多做题目多练习,搞懂每个错题。这些不同类型的知识学习起来可能看上去都不一样,但是仔细分析下,它们的过程都是一样的。这个过程分为三个层次
看别人怎么做;
临摹别人做;
自己开始动手上。
我们平时在课上学习知识的时候,就是看老师怎么做这个过程。做书后面联系的时候,这个过程就是临摹书上的内容。而后续的大量题目的练习就是自己开始动手上的过程。我们可以发现,这三个过程中最占据你知识学习过程比重的就是自己开始动手上这个过程。
学习编程的过程也一样,首先看着书上和视频,接着自己模仿书上或者视频中的代码开始临摹,最后就应该自己去写代码多多练习。
上面这三个过程中,前两个非常简单,你可以很悠闲地看着别人的视频和资料,然后暂停视频或者打开讲义,照着上面的代码一顿临摹,最后编译一下,如果成功就此PASS,如果有错误,警告,或者运行的结果不正常,就再和原文相对比,找出问题就此PASS。往复此操作,好了,这一块单片机我已经学会了。
处于这两个层次的学习,是让人很快乐的一件事情,快乐的根源是让自己以为自己没有浪费时间在学习,徜徉在知识的海洋中。看到那些老师讲的,不禁默默暗喜“看吧,果然和我想的一样,原来这么简单”。其实这种学习的过程只不过是一种欺骗自己的安慰剂,在多巴胺的作用下,你以为自己能力提升了,快乐了,但是再多的多巴胺也抵抗不了记忆曲线。尤其是那些连代码都懒得敲动的学习,和看网剧,肥皂剧别无二致。
真正让你可以实实在在将视频或者讲义中的知识,技能雕刻在你脑皮层的神经元细胞上面的,正是这个第三步。迈出第三步是非常需要勇气的,迈出它,即意味着你走出整个看剧的舒适区。当你学会单片机的定时器,让你用它自己写一个数字时钟时,第一次你肯定半天都敲不出一个字母,哪怕你花了一周写出了让你沾沾自喜的代码时,一点击编译,二十年的老血都会吐出,错误的数量比你代码的行数都要多。
但是,就像金庸写的九阳神功秘籍一样,“他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足。”只要你能坚持下来,将这些错误一一改正,同时将这些功能一一调试好,那么神功自可成。
此时,你的神功虽成,但还只是凭借着你的硬头皮硬生生扛过来的,我相信每个字母必定都充满着尴尬。接着你该怎么办呢?当然继续练,事实证明,即使是同一种神功,修炼的时间是会决定修炼者的水平的。这其中最好的例子当然还是金庸老爷子小说里面的岳不群和林平之这一对翁婿(母女),老岳修炼的时间比小林子长久的多,因此其辟邪剑法肯定是在平之之上的。所以说,一旦当你可以写出自己第一个程序之后,你就应该趁热打铁,继续去写程序,直到你将自己键盘上所有按键都敲得油光满面,那就差不多算是入门了,接下来就是不断地被真实的项目所打磨。
当然在你自己修炼自己编程能力的时候,借鉴别人优秀的代码肯定是必不可少的,乔布斯老爷子说过“好的艺术家抄袭,伟大的艺术家窃取。”Good artists copy; great artists steal.”,我们虽然成为不了伟大的艺术家,但是至少也要争取成为一个好的艺术家。
所以这个过程中一定要借鉴别人优秀的代码,吃透,理解,整理,接下来就是你自己的了。这就好比嵩山大会时,岳林珊在思过崖习得其余四派失传剑法,借此吊打四大派,由此可见借鉴的意义所在。