为什么学编程要学会抄代码?

8 minute read

最近有位小伙伴要迎来算法考试了,因为本来不是计算机相关的专业,对编程还不够熟悉。即便在图书馆借阅了一本算法设计的书,还是感到数据结构基础不太踏实。当时我给她的学习建议是先做一些自己能够做的事情,比如抄代码。

10e0e30fa00d5ea3e293d2cba530942d

外行可能不懂,但一些同行的朋友你们可能要嘲讽了:编程这事,和练字是有区别的。练字训练的是肌肉记忆,而编程训练的是大脑,训练的是思维方式,千万不能教别人做这些类似抄写、背诵、默写等这样的傻事,费力不讨好。再来看看我文章的标题“为什么学编程要,学会抄代码?“

在我读大学的时候,其实我也想过,抄代码真的没意思,又不能理解,最后还不是写不出来。而到了期末实验的考试,那时候发生了一件事真的颠覆了我的想法。当时我们学习的也是数据结构与算法 C++ 版的,这门课不仅是我们计算机学院的同学在上,没想到经济管理学院的同学也在上。也还记得第一堂实验课的时候,老师说,你们都是计算机学院的,考试不用怕!经管学院的同学也在上,她们还不怎么接触电脑呢。

结果,,,老师你不讲武德!最后考试居然是快排!虽然当时能够理解快排的思想,但代码不是很熟悉、不怎么记得。所以在机考的时候就一点点调试,忘不了那个酸爽。奇怪的是,经管的那些大部分同学反而做得比我们学院的快。因为那时是老师检查一个,就打一个分,然后让这位同学离开。陆陆续续有好几个同学都走了,只剩下我和几个同学傻 fufu 地在调试。我就好奇地问老师,她们是都不会做就走了吗。老师笑了笑,别看她们不懂编程,她们会背代码,考试的时候就一个个地敲出来的。这心情就像——17张牌你能秒我?你能秒杀我?17张牌你今天能把我 lbw 秒了,我当场就把这个电脑屏幕吃掉!

img

现在仔细想来,不管是背代码、抄代码,也是需要掌握时机、掌握方法论的。经管学院的同学因为熟悉编程,单纯凭借理解来“推导”代码,肯定比不上计算机专业的同学,而她们运用了自己擅长的、能做的,背代码。不可否认,在应试教育中,这种模式是值得认可的,从解决问题角度,这种方式是最快速有效的。

思考过这个问题,也对我在最近练习力扣刷题中没有感到迷茫。计算机专业,连二分查找都写不出来,其实也是因为好几年没有经过算法练习。第一遍不会做跟着题解抄,第二遍有点印象写了大部分再看看完善,第三遍得心应手了,并且能够灵活计算中间值和边界条件。在之后遇到更加复杂困难的问题时,也能够耐心地去看题解、将答案多敲几遍来理解推导过程。而不是像刷题评论的一样,一直处于这样的心理状态:

image-20211130230026136

所以在真正开始学习的时候,你会深深地感觉到自己的无知,尤其是在面对最能划分编程能力的算法和数据结构中。而学习的本质是什么?是通过听说读写、思考研究和实践,最终获得知识的过程。能够让你加深对问题的理解,才是有效的。

明白了这个之后,还需要认识到自己对编程的理解到底怎样。如果从来没有接触过编程,那么一个字一个字地抄代码,快速熟悉代码,就能在实践中加深对问题的理解。如果已经有编程经历了,遇到复杂问题可能会浮躁,学不进去,而一个字一个字地抄代码,将阅读速度降下来,将躁动的心平静下来,能够去思考问题的边界、代码所表达的含义。

这还不够。当你做到了会抄代码,你还需要思考编程的本质是什么。程序的执行过程是抽象的,它是不可见的,而代码的编写是需要精细化、具象化的。不是像你想象中的开车或者游泳一样,你一打方向盘就能转弯,腿一蹬就能往前游。假如你是开车转弯,你是要思考的是往哪个方向转,转多少度,手握在哪个位置才能转动,是需要一只手还是两只手转向才能及时。平时我们如果真这么边想边开车,可能都要出交通事故了。

所以,还不能抄代码。想要学会编程,你得理解思想,你得将理论用代码实现出来。这个过程是非常难的。书中的知识,有了小学语文基础就能看懂,我也能给你画图形象化地表述。但你也只能理解大概的意思,还是无法写出代码。那么怎么办?通过大量的练习,来掌握写代码的思路。比如见过几个可以运行的 c 程序代码,你知道要运行需要有 main 函数,要输出需要有 print 函数。

这么一说,好像又很简单了。知道每句代码是什么意思就会编程,了?我现在不想转弯,我想转向了,那你还能知道怎么“编程”了吗?别着急,你已经开始会了。

我们开始学习编程,往往也是从看得见和摸得着的东西开始的。如果现在没有任何办法,感到学习异常困难,可以先尝试抄代码;如果有了编程的感觉,尝试自己去改动代码。在随后学习了分而治之的算法思想后,我们会将复杂问题划分为小问题,一个个解决,将每一处你能够做到的地方完成,时间累积下来。也许某一天,你开始学会编程,开始慢慢理解,抄代码对自己的编程提高,到底是否有用。

333593177eac0cda8b0924e77b1b1a2e