很多同学都问过我一个问题: 老师我ARM裸机学到什么程度才可以继续学下一部分?或者是类似疑问的另一种表达: 我第一部分看很久了但是又觉得没有完全掌握,我能接着学第二部分吗?还是应该继续死磕第一部分?


      在此建议,大家一定不要抱着必须学完学好彻底掌握前面的才继续学习后面的这种想法。这种想法本质上是一种完美主义,或者说理想主义,实际并不可取。


      首先是因为不好客观评估。因为什么叫彻底掌握,什么叫学好了,其实本来就没有标准,更没有对应的考核机制,所以大多数人所谓的“学好了”或者“还没学好”完全是个人主观意识,实际没意义。


      其次是因为这种思路不符合学习规律。人本身学习新东西,对一个新知识和技能的掌握就应该是一个螺旋上升的过程,而不是线性堆叠的,所以试图在完全不学习后面的情况下把前面的彻底学懂根本不符合客观规律。简单类比一下,如果你非要小学一年级期末考试全科100分才去上二年级,那你可能几十岁了还在小学阶段没毕业!


      所以说不要试图“彻底掌握”前面,再去学习后面课程,这种方法并不可取。那应该怎么办呢?


     答案是多轮学习,螺旋上升。


      譬如你学习嵌入式linux核心课程,可以第一遍先学习第1部分ARM裸机和第4部分C语言高级专题。这两部分顺序无所谓,因为本质上他们并没有严格的依赖关系,不管你先学哪个都可以,如果是我可能更喜欢两部分交叠来学,这样可以换换口味。


      然后两部分过一遍后,不管掌握多少,就继续去学习后面课程,譬如后面可以去学第3部分linux应用编程和网络编程。这部分学习时就需要用到C语言,所以就会考察到你第4部分学的好不好够不够。这时如果你发现你的某部分C语言知识点没学好导致你应用编程有困难,你就再插播一段返回去把前面C语言的相应部分学一遍。  


      这时候学起来会更有目标,也会学的更加深刻。一个是因为你本来就学过一遍整体了,所以学第二遍时看某部分的课程也更容易理解。另一个是因为你本来就是为了学习应用编程需要用到某个知识点才找回来的,你是带着目的和需求来学习的,你不得不解决问题,而你解决了问题自然就学的更深,理解的更深了。


       当然你接下来也可以学习uboot移植和系统移植部分,这个既要用到C高级,又要用到ARM裸机,所以更需要经常返回去看。道理和思路方法是一样的。


      这就是我更推荐的学习方法,简单说就是先过一遍有一定理解和整体认识,然后再继续学习,在用中去学,前后部分在学习中结合起来互相印证,互相帮助理解。达到前后贯通,真正举一反三的目的。