体验报告.md 4.4 KB

体验报告

老师原本的要求是每两天阅读一篇各自专业的文献,体会坚持做一件事的感觉,体验量变到质变的过程,课上做了补充,即使不读文献,坚持做一件事情,把自己的真实体验写进报告里也是可以的.因此,我选择了一个比较功利的任务:每天坚持做leetcode上的至少一道题目.为了能在做题的过程中学到更多的东西,我决定采用之前没有接触过的go语言来完成题目.

万事开头难.但是只要上手去做,就会发现事情没有自己想象的那么困难.上本科的时候,我的编程基础其实是比较薄弱的.一开始对编程还充满兴趣,但是到了后面的实践课程,进行大型的程序设计的时候,我就开始偷懒,直接采用了老师提供的例程.结果自己也只是一直处在入门的阶段,没有真正的进步.开始做题的前两天,一边做题一边学习go的语法.go语言的语法跟c是很相似的,所以入门倒是没有遇到很大障碍.为了让自己学习的过程更加顺利,我决定按难度分类,以简单到中等再到困难的顺序,先完成前两百道题目.完成的时候尽量先形成自己的解答,再参考其他人的答案.

学习语法并入门的这两三天,我做的很顺利,虽然由于对新语言不大熟练,完成一道简单的题目可能要花费三四十分钟,但是不那么陡峭的学习曲线让我对接下来的日子充满了信心.那几天,一天会抽出时间做三四道题,只想尽快地把进度往前赶,好进入下一阶段的学习.

然而接下来的学习很快进入了瓶颈.完成了大概十道简单难度的题目以后,我想试着挑战一下中等难度的题目.第一题也看似简单:将两个以链表形式存储的数字相加,把和存储在新的链表里.直接把链表转换成字符串,结果溢出了;每一位数字逐个相加,结果不对,发现忘记了进位;加上了进位的逻辑,还是不对...就这样折腾了一个半小时.最后忍不住看了答案,一下子没能看懂,这不啻是对我的一记当头棒喝,原本满满的自信,变成了满腹的怀疑.没办法,不会做的题目,背也得给它背下来.于是硬着头皮,一行一行地分析,终于把逻辑给弄明白了,再按照这个逻辑把之前代码里的错误修正.之后的几天,遇到的问题有难有易,但是自己渐渐地摆正了心态:不会的题目,耐着性子把答案搞懂,消化理解.原本以为每道题目都有一个简单优美的最佳答案,但是事实并非如此.不是每个问题都有漂亮的解答,也会有特别复杂的边界条件,看起来很"脏"的解法.要写好程序,就必须把其中的逻辑理清,弄明白每个语句的用途,来不得半点敷衍.

难题一个接着一个出现:动态规划,各种数据结构,复杂的边界条件,时间空间复杂度...自己却对这些概念一无所知.这时候我开始反省:机械的啃题目是不行的,出现新的问题才去了解,相当于亡羊补牢,而且知识点也不全面.要想提高自己做题目的效率,必须更进一步地学习理论知识.于是,网购了一本厚厚的<算法>第四版,从头开始看这本书,只求把自己的基础补上来.这时候我意识到了自主学习的重要性:自主学习并不是意味着辛苦劳累,相反,它更像一种主动弥补缺陷,寻求知识的行为,也只有自主自觉,才会对知识抱着一种渴求的态度,学习的时候才会更专注,更用心.

就这样一路学着算法,一边做着题目,有时候实验室任务比较多,就只做一道题目,清闲的时候,兴趣一上来,也会一整天都思考算法,不会觉得倦怠.转变就是这样慢慢发生的.从一开始一道简单的十几行代码的题目都要思考半个小时,到后来上百行的答案全靠自己思考完成,我能切实的体会到自己水平的不断提高.更重要的是,从一开始的退缩畏难,到现在主动寻求挑战,我培养出了自己对编程的兴趣.困难总是会有的,但是也不是绝对不能克服的.每天只要有一点点进步,最终就能取得让自己也惊叹的成果.

从开始做题到今天,一个多月的时间里,自己在leetcode上已经完成了将近一百道题目.一本七百多页的算法书,也被我啃了大半了.这些也许不是很大的成就,但对于我来说,已经是很可喜的进步了.可能就像老话说的那样,成功是一种习惯,只要培养出良好的习惯,坚持不懈,风雨无阻地去做同一件事情,就能更进一步,变成更加优秀的自己.