虽然这个问题问的是怎么更好的学习C语言,但是我忽然想到一个认识的人,让我想到了导致初学者永远走不出“初学者”阶段的常见误区。
那是我刚上大学时的一个同班同学,来自中国最一线的城市,家庭条件很好,这一点从他平时配置的电子设备等就能看出来——配置超高的电脑、最新潮的游戏机、最新潮的手机等,这些东西对于二十年前大学生来说即使拥有一样已经是很不错的了。
虽然他的条件很好,但是他的性格有些孤僻,周围没什么朋友。我是一个每天早出晚归泡在图书馆的人,自然也和他没什么交集。直到大一下学期开始学习C语言,在某一节上机课上他主动坐到了我旁边,对我说“听说你编程挺好的?”我抬头看向他,说“咳,咱们都是学生,能有多好啊,就是喜欢学而已。有兴趣的话以后大家可以一起讨论问题。”他听后很高兴,从那时候开始每次上机课他几乎都坐我旁边,我们也一起从C语言定义一个变量开始一直学完了C语言的基本语法。
学过C语言的人都知道,C语言在语法期的时候会有很多有意思的小问题,比如阶乘、非波那契数列、质数问题、输出金字塔/心形、水仙花数、冒泡排序等。这些小问题都是初学者在还没有足够知识研究复杂问题前,为了熟悉使用C语言的基本语法而做为练习用的。在初期我们经常讨论有不同的方法/语法解决这些问题,也会傻乎乎的比较谁的更快。很快大一就结束了,从大二开始进入很多专业基础课和专业课的学习,这些专业基础课和专业课初期看来和C语言好像脱离了关系,甚至以度让学生们觉得和它们以为的编程脱离了关系,因为大部分时间都在学习很多枯燥乏味的理论知识,像是模电、数电、微机原理、汇编语言、操作系统、计算机网络、编译原理、数据库等,软件项目管理、网页/站设计、Jave、.net、UML等……这些专业基础课或专业课大部分都很枯燥,很多人都会不耐烦,学不下去,觉得这些和自己理想中的“编程之路”越来越远,然后开始怀疑学校的课程老旧和现实脱轨(当然也确实有点),这样以后一定会把自己耽误了。所以就开始不好好学习课程的内容,转而去想办法“自学”自己觉得是正道的东西。
我的那个同学就是这类同学的一个典型,他开始天天跟我抱怨“你说咱们天天学的那些有什么用,纯粹浪费时间”。我劝他说“我们可能还处于一叶障目,不见泰山的状态吧。可能我们的课程确实比较枯燥,但是认真学校去应该是有用的。”但是他不听,认为自己要“拯救”自己,结果就是:
……
就这样我们毕业了,毕业后我们少有联系,偶尔的一些寒暄中他还在说着C语言那些稀奇古怪的问题,还在用自己根本不足的知识去试图理解着高几个层面的很多问题。就像大一刚学C语言的的时候,我们傻傻的讨论递归的过程到底是什么样的,讨论能用char的时候不用int更省空间,讨论能用一行写完的程序不用三行的做法多么高级……现在回头看,会觉得当年的我们多么的懵懂有趣。然而如果很多年过去了你一直还都处在这个水平线上看问题,那真的就不有趣了。
可能有的人会说,为什么我不提醒我的同学走出误区。你们可知我说了多少次,根本没用。每次他落下课程了,他问我问题时我根本没法用他现有的知识给他解释清楚,我就跟他说:“你得把这几本书的知识补上才行,你看不起咱们的课本你自己买别的书也行,总之你得把知识掌握了。”可是结果就是他买了很多很好的书,但是一本都看不进去,总是想着能通过捷径获取到别人好几倍时间获取到的知识。这就是问题的关键,他不是不知道自己该学什么,他是真的“懒”,总是给自己找“舒适区”,然后不敢走出去。当大脑有了对学会某一东西的计划后,大脑会给人一种你马上就要掌握了的“满足感”,然后人们就容易活在这种“满足感”不愿意付出实践。等真的到开始实践的时候,发现“好难……”然后就托下去了。
所以我的观点就是,学习C语言根本谈不上什么方法不方法,只要你不懒就行,学习C语言最好的办法就是尽早完成并脱离对C语言语法的学习阶段,进入正式的对专业科学知识的学习。脱离了计算机科学(或其它能用到C语言的科学)知识,C语言是最没用的语言。