学弟学妹们经常问我一个类似的问题:一道编程题自己怎么想也写不出来,转而看看其他人的解答,感觉代码里没有用什么奇技淫巧,所有语句都能看明白,为什么换成自己就写不出来呢?换个说法就是:关键词、语法等我都熟悉了,这样我是不是就学会C语言了?如果是,为什么我写不出代码?如果不是,那到底学到什么程度才算学会?
我想大部分同学应该都看过金大侠的武侠小说,《笑傲江湖》中,华山派的基本招式是“白云出岫->有凤来仪 ->天绅倒悬->白虹贯日->苍松迎客->...”,但风清扬最初让令狐冲使出“白虹贯日->有凤来仪...”,令狐冲显得不知所措,他觉得这两招完全格格不入。经过风清扬指点后才明白,与人较量时出招是随机应变的,下一步出什么招是由对手出的招数决定,而不是由自己使的招数决定。
同理,写C语言什么时候用if、什么时候用switch是由问题决定的,随问题的改变而改变我们的代码;说汉语、英语还是日语,这是由听者决定的,而不是自己喜欢什么就只说什么。
但凡学有所成,一招一式都不是死板的。比如《笑傲江湖》中,风清扬传授令狐冲独孤九剑时说:“剑法要旨是在一个‘悟’字,决不在死记硬记。等到通晓了这九剑的剑意,则无所施而不可,便是将全部变化尽数忘记,也不相干,临敌之际,更是忘记得越干净彻底,越不受原来剑法的拘束。 ”无独有偶,《倚天屠龙记》中张三丰教张无忌太极剑时,也是让他将所学剑法忘得一干二净才算学成。
我又要唠叨“工具理论”了:我们学的知识、技术等,都只是一个工具。学会使用工具就是在恰当的情景下解决问题。比如榔头是个好工具,用来钉钉子很方便,但大部分人不会用它来代替抹布去擦桌子吧。这就是要做到“忘记”(不刻意去记住),学会了如何使用榔头,不用一天到晚都在心里挂念着它,需要钉钉子时就很自然地想到使用榔头。这时候你是真的学会了,你知道这个工具(技术)什么时候该用,什么时候不该用。用它来解决问题,犹如行云流水,顺畅自然。