大学四年学习过程和方法小结

               

大学四年,是堕落、觉醒、弥补、选择的四年。从刚刚跨入大学校门时,那个对一切都无知、对一切都好奇、对一切都轻信、对生活充满小说般幻想的小孩,到而今逐渐学会张开眼睛看世界,四年的生活像梦一般的离奇迅速。四年里,无数次感觉自己像是重新投胎作了人,今是昨非,生活和思想可以用“剧变”形容,但逝去的时间、健康,逝去的生命却永不会再来。而今大学毕业快一年了,这一年来上课,看书,与别人交谈,一些想法慢慢觉得有必要记下来,所以找这个时间把大学学习的历程和方法总结一下,用这些文字来埋掉大学的四年。

 

大学四年的学习路线

进入大学的时候,只知道电脑是用来聊QQ的。当时一片空白,对大学开的课程,像电路原理,高等数学这些,做起题目来很有意思,但不能理解为什么到大学还需要研究这些“深闺绣花鸟”的东西。然而自己又不会学习,不知道有google,不知道有百度。既不愿上课也不会学习,考试勉强及格,技术没有入门。那个时候,在旧图书馆有两本杂志,《电脑爱好者》和《计算机应用文摘》,一路的看,不懂的就猜,好不容易知道了磁盘文件、文件夹、注册表、组策略、批处理脚本、wscript脚本、IP地址、进程、驱动器、浏览器等等这些基本的概念。测试了system32目录下所有可执行文件的作用。

大二开学,那时刚结束C语言课程,两个问题让我很迷茫:在C语言教材上,命令行参数和文件操作算是高级的部分了,可是,现实生活中使用的QQIE等等那些界面好看的软件是怎么编写出来的呢?另外,在整本教材中只使用了stdio.h, stdlib.h, math.h,在我们当时使用的那本非常好的教材中还使用了conio.hgraphics.h这几个头文件,这仍然只是TC2中一小部分的头文件,其它头文件是做什么用的呢?因为这两个问题,我打印了TC2中所有的头文件,在TC2的帮助文件中找到了每个函数的用法,并且知道了很多TC2定义的全局变量(stdin, stdout, _ctype[], _argc,_argv),学到了很多精简的代码的写法(fgetc, assert这些宏的定义),了解了函数调用方式的差别(__cdecl, stdcall),知道原来还有far指针和near指针,写程序测试了每个函数,对dos.hbios.h这些头文件中提供的函数的强大功能虽不能理解但觉得非常神奇并知道了有段地址和偏移量这两种东西。并使用graphics.h中的接口写了一个图形界面的窗口演示程序。这是自己程序设计的开端。

TC2的学习是个好的开始,但当时学的并不彻底,如中断服务程序,动态链接这些主题。不彻底有两个原因:一是学习途径非常狭窄,不懂的东西几乎都是靠猜的,二是对于感觉上困难的主题的惧怕和回避。第二个原因尤其严重,那些问题一直拖了两年多做毕业设计的时候才彻底解决,那时候才发现自己觉得惧怕的东西,也只是自己觉得惧怕而已。

大二上学期,20063月底,东东带着我进了W01F工作室。W01F工作室给了我第二次生命。我幸运地认识了很多很好的人。似乎当时正在上C++的课,我向C++老师写邮件请教技术,庞老师建议我学习windows编程,并给我发来一份MFC程序的代码,我之前从来没有听说过windows编程,更是被MFC代码里那些奇怪的宏和注释吓坏了,windows编程的学习也就没有开始。

20065月初,小蔡跟我说了ACM做题目的事情,我上acm.jlu.edu.cn网站上看了一下1000这个题目,这个题目是个示范性的,题目下面附有答案代码,有这么一行C++代码:while(cin>>a>>b)cout<<a+b<<endl;。这行代码让我非常震惊和惭愧,我从来没有写过while(cin >> a >> b)这样的代码,从来没有想过代码可以这么写。这种优美、简洁、健壮的代码让我很沮丧,加之可怕的MFC代码,从来没有听说过的windows编程,TC2遗留下来的问题,一连串的东西让我一点信心都没有了,有种万念俱灰的感觉。

随后,自己开始试着做JOJ上的题目,很快我就后悔自己没有早开始了。做JOJ题目尽管很痛苦,但这是会上瘾的。那个时候,自己对算法的理解还只是在排序、查找那些东西上面,当时觉得快速排序就是一个非常复杂非常大的算法了。如果要写一个快排,我一定会去翻书琢磨一阵子。因此,在那个时候做题目,真正体会到什么是“绞尽脑汁”,大脑干了,枯了,近乎疯狂,不能再接受任何的脑力任务。可是尽管那样痛苦,对于问题解决却也没有丝毫的裨益,还是一直在原地打转转,现在看来,那是在犯傻,是顽固不化的表现,因为知识的欠缺想不出来问题而跟自己过不去。即使把题目做出来了,也是硬编码凑出来的,做完题目后,永远都不想再看那题目了,更不用说做完题目后总结一下有什么收获,那时候除了头疼,没有任何收获。我对未知算法的恐惧和Wrong Answer的恐惧使我提交一个题目的时候总是战战兢兢,现在想想,那个时候的我,只有碰运气的细胞,还没有长出来思考的细胞。

20066月,工作室C/C++小组写了一个图形界面的计算器。我们这边的几个同学实现高精度算法,商学院的师兄小欧写图形界面,这中间向wuxi师兄请教过几次设计模式方面的问题。代码很快写出来了,但是最简单的测试都不能通过,所有代码都被我收藏起来,这个计算器后来也没有再提了。当时临近期末考试,我那个时候没有复习,而整天都在看《C++编程思想》第一卷。

20067月,这是放暑假的时间,我们帮助其他校区的几个同学写一个程序,需要简单的图形界面封装,我那时仍对MFC怀有极大的恐惧,但我向组里的其他成员说我会MFC,图形界面不用担心。我们用了一个月左右的时间把程序写好了。我很庆幸我当时收藏了小欧师兄为计算器写的那个图形界面的MFC代码,我把那个代码调试了很多遍,又看了些MSDN,把我们需要的那个图形界面写了出来。当时也就是用到了DDX,DDV两种机制,用到了CFileDialog类,还有遍历控件中所有子控件以及隐藏/折叠窗口的技术,但是为了这些东西,学了很长时间。很幸运当时小组的其他人,赵亮、小蔡、永亮,他们完成了绝大部分任务。

20068月初,小蔡、赵亮和我,我们三个人都觉得应该把MFC好好地学一学了,我们决定买一本《深入浅出MFC》。82号,我们三个人骑着自行车去了北门旁边的学人书店、前进大街上的前进书店,然后又去了卫星书店,都没有找到这本书,后来我们去桂林路,在学人书店总店买到了一本。那天还下着小雨。这本书让我非常激动,书中讲授技术的方法,分析技术的思路,让我如获至宝,我平时很辛苦总结的经验在这本书里都只是小儿科,这是本授人以渔的极好的书。后来我们小组内人手一本,这本书中所讲的实用的技术我觉得并不注目,真正讲实用技术的话MSDN才是权威,这本书的价值在于书中分析技术的思路,这是无形的,无价的。

20069月,那时候wuxi师兄准备考研,很少有机会看到他。我们自己决定用一个月时间搞定MFC技术。结果那是一个不切实际的愿望。那个时候,我们开了windows程序设计这门专业选修课。这门课让我心里极不平衡。我在学习MFC的时候了解到的那些windows程序设计的知识,都是通过很痛苦的调试和看MSDN得到的,而现在,老师把所有的东西都在课堂上讲了出来,原来我之前当作宝贝一样的东西只是一些基础知识。我很羡慕那些按部就班学习非常好的同学。我开始怀疑我们之前学习MFC的意义,怀疑我们集体去学习那些学生本来就缺乏的知识和经验的意义。因为就MFC来说,一个从没有上过大学的人进公司培训几个月后绝对写的比我们快,比我们好,比我们专业的多。这种技术只是表象,就像小蔡经常问我的,我们上大学的意义在哪里?像MFC这种技术,像软件工程,等等,我觉得,在学生时期是不值得把时间浪费在那些“江湖经验”上的。我们的精力是很宝贵的资源,对于那些已经有人摸索出来的东西,我们不值得去做二次摸索,我们应该广泛的学习,而只思考那些真正值得思考的东西。

随后,写了一个windows下打字测速的程序,12月份,配置了一次IPCop防火墙。对IpCop防火墙的配置做的非常差,但这次对计算机网络有了比以往更多的认识。(说到这里,我研究生期间才第一次听胡亮老师讲课,他的课堂上是经验的大宝库。擅长用一句话概括一样技术。这是其他任何课堂上都没有过的。高屋建瓴的经验,而不是技术细节,是他讲课最精彩的地方。)

072月份的那个寒假,读了TAOCP第一卷的数学部分,于是放弃了找工作的打算,准备考研。

大三下学期,在我的感觉上这是整个大学最有意思的一学期。计算机专业四年的精华,操作系统、编译原理、数据库、软件工程,这些课程,都在这学期开课了。操作系统是我最最喜欢的一门课。这学期,做了一次软件工程的作业,那一次自己是写了一个棋谱管理软件。编译原理的实验课,是写代码实现一门微型语言的词法分析和语法分析。这个学期,能把代码能力提到讲课上来,是我最兴奋的,既不耽误考试,也学到了技术。软件工程和很多代码技巧都得到了锻炼。剩下的时间自己在准备考研。

200710月,在十一以及随后的一个星期里,熟悉了winsocketwinpcap编程,这个时候,强烈感觉到算法其实才是最重要的,在07年上半年的那个棋谱管理程序,以及编译原理实验课上,以及复杂的windows程序设计比如进程、线程、TLSAPIHOOK这些东西,代码只是表象,真正重要的东西是隐藏在它们后面的操作系统、计算机网络的知识。如果没有学过操作系统中的进程协作和通信,是很难理解一个多线程代码的,如果没有学过计算机网络,也是很难理解socket的那些模型的。一旦学习了它们,多线程、socket这些,不用学自然就会用了。而这一些,操作系统、计算机网络,它们都可以归结到算法里面。算法就是处理一件事的方法。给我们一件事情,我们先考虑怎么解决它,然后用代码把自己的意思告诉计算机就可以了。这个过程分两段:前半段是,接到一个问题,我们如何去解决它;后半段是,我们如何用代码来表达我们的意思,告诉计算机我们想怎样来解决这个问题。后半段,这是代码实现能力,目的就是把程序员想做的,变成计算机要做的。前半段,这是算法能力,目的就是解决问题。

0710月份后,一直在准备考研。到082月那个寒假,考完研究生后,准备毕业设计的东西。这段时间是大学最轻松的时间,把大学那些自己感到恐惧的技术都鼓起勇气翻出来看一看。毕设题目是做一个反汇编程序,当时花了很长时间去网上找开源代码,就是没有找到nasm,可见那个时候眼界是太窄太窄了。

087月,四年大学结束了。

 

如果能够有恒,技术不会像现在这样零散,这样肤浅。如果在百无聊赖的时候没有堕落,眼睛就不会近视。如果也能“善养吾浩然之气”,境况也不会像现在这样被动应付,捉襟见肘。所幸的是,能在大学尽早遇到W01F,能有像dawn,wuxi,xing等这样好的师兄们的照顾。能有很多同级的兄弟姐妹们的信任和支持。W01F,给了我第二次生命。

 

对于方法,我常做些总结,但我自己本身也没有很好地执行,更不能说会别人有用。像小蔡说的那样,只要勤奋,总能找到正确的路。以下是对四年以来学习的一些方法性总结:

 

一:“学而不思则罔,思而不学则殆”。

对我个人而言,思考总是很简单的事情。质量如何先不去管它,至少它可以随时随地,天马行空,想开始就开始,想停就停,若小有结果,则手之舞之,足之蹈之,发博客之,写日记之,兴奋不能自已;没有结果,顶多就是头疼一会儿,假以时日,或能有新的发现,或者也就淡忘了。学习则不然。学习需要接触新的东西,将它们按自己的阅历加以解释,去接受、理解、评判、比较新的想法,这是一项很累人的活。在学习过程中需要不断地克服自己的惰性,正视自己的短处,揭开自己闭塞的伤疤,清除自己思想中的尘污。学习是一场战斗——与自我的战斗。我自己一直,甚至在意识到这一点后,仍然惧怕学习,惧怕改变。于是,缺乏输入的思考对于自己,就像蜗牛的壳,作为一个软体动物自己躲在里面,整日翻来覆去地感花咏物,无病呻吟。

这是我的情况。我的大学过的混乱不堪,遗憾地错过了很多牛人,错过了很好的老师,错过了本该珍惜的机会,因此“独学而无友,则孤陋而寡闻”。然而从我大学开始懂事到现在,就我所见过的人里面,很少人会主动地理性操控自己的学习过程。大多数人更倾向于记忆知识,一些人会找机会运用知识,几个人会在这个过程中发现知识、学习新的知识、联系并拓展知识。学与思是两个端点,我们很多人重此轻彼,而我们又经常陷入依靠自己的本能直觉来学习知识和解决问题的境地。如果我们能有在学与思之间进行转换的意识,那么在适当的时机进行这种转换,应该是非常有好处的。

《劝学篇》名言:“吾尝终日而思矣,不如须臾之所学也,吾尝跂而望矣,不如登高之博见也”。“君子生非异也,善假于物也”。有一次我问我研究生导师,“怎样才能站在巨人的肩膀上?”,导师说,“你得先爬到巨人的肩膀上。”。我现在觉得技术分为两类:一类是不会但是不难的技术,一类是不会但是很难的技术。对于不会但是很难的技术,是需要长时间去关注、思考、积累、厚积薄发的。也只有这种不会但是很难的需要长时间思考和积累的东西,才能区分计算机专业和非计算机专业。

 

二:猛火煮,慢火温。

高中时有一本很畅销的英语复习资料《高考英语必备》,在这本资料的附录部分记载了很多非常优秀的学生的学习经验以及对这本资料的评价。有一位学生在他的的评价中说了这样一句话:高速度高难度出人才。

“高速度高难度出人才”,这是对那些天才少年们适用的。对于他们,我望尘莫及。不过我觉得在学习一样新东西的时候是应该保持高速度的。因为自己以前不了解新技术,所以思考无益,学习新的技术,一开始就是疯狂的记忆。让自己保持像临场考试那样的紧张,不断地复述自己读到的每一个新名词,把书翻到前面去查找它的定义,把定义抄到这个地方来,复述的时候,敏感地抓住每一个形近或意近的名词,用笔把它们记下来。然后再把书翻到前面去查找它们的定义,把它们的定义也一股脑儿抄下来,一遍一遍地默读这些定义,体会它们的表述方式上的差别,就像广度搜索一样,这个过程一圈一圈地扩散,直到自己累了或者感觉再扩散下去索然无味了或者想到一本可供参考的资料却不在手边,略微休息调整一下继续往下读。

这里再说一个例子。一是大学时候的考试,平时不上课的人很多,到了期末考试的前两个星期左右,所有人都开始复习了。经历大学考试的人都有体会,这两个星期,才是考试的黄金时期。大多数人,都是平时不学习,然后在这两个星期里通过紧张的复习而免于挂科的,甚至不少人会在考试中拿到高分。人在临近考试的那两个星期所表现出来的接受能力是非常惊人的。所以,如果能在学期开始的两个星期就保持临近考试的那两个星期的学习状态,这样一顿猛火煮上半个月后,再用整个一学期的时间再消化,对知识的掌握就会非常透彻了。

 

三:问题队列。

在猛火煮的从阶段,会有一大堆问题,在平时,也会时常冒出一些莫名其妙的问题,这些问题都是财富。所以,应该给自己建立一个问题队列,当目前正在集中精力解决的问题还没有完成时又产生了一个新问题,就把它加到队列里去。解决完一个问题时,整理问题队列,这个时候会发现,可能有些问题已经不知不觉地解决了,删掉那些不用care的问题,找出优先级最高的那个问题去解决。

平时会有很多讨论班,网上也有很多技术论坛,把问题分享到那些地方,把答案记在自己博客上。尤其是在讨论班上,我觉得分享问题比分享答案更有意义。

四:0-1学习。

很喜欢二进制的单纯,0表示什么都没有,1表示什么都具备了。0-1学习,一方面是在学技术时,先假设现在这门技术还没有出世,现在把这门技术试图解决的问题交给自己去解决,自己将会采用什么样的思路,将会如何去分析这个问题,然后把自己分析问题的思路和这门技术比较一下,找出不足,以求进步。另一方面,我觉得应该尽量用自己的语言来解释技术。比如学习一个难以理解的算法,背下来,这是最坏的方法,背下来的东西迟早会连影子都忘掉的,这个时候,最好是把这个算法从提出到证明的整个思路整理一下,找出自己最熟悉的那个点,尽量去在自己已经掌握的知识中寻找呼应,最后理想的目标就是利用自己已经熟悉掌握的知识把这个算法重新推导一遍,这样,既锻炼了思路,又学习了算法,即使有一天可能把这个算法忘了,只要对这个思路有印象,就有可能重构出这个算法。

0-1学习是的最大好处是可以从最原始的问题状态去探究问题的解,这样一来可以真正冶炼自己的思维,二来可以更多地发现反面的不成功的思路。反面教材在学习过程中是有重大的意义的。举个例子,我们中学时期每次语文考试都有诗歌赏析,但是最大的弊端就是所选篇章都是名篇,诗歌赏析中重“赏”轻“析”,“析”的也都是一些套话,如什么“托物言志,既形象又生动,寓情于景,情景交融”这一类的话语,我们在赏析的时候只关注这首诗歌好在什么地方,而从不分析它有什么瑕疵,更要命的是,总是把它好的那些地方抽象到一般的原理,拔高到美学的层次上,这种急功近利的抽象使所有的诗歌只有共性被我们看到。长此以往,答案的丰富多彩被扼杀了。直到现在,给我看一首诗,别人不说好,我不敢说好,别人说不好,我就真从中发出了别人所说的不好。这种单纯的、理想的、象牙塔式的教学堵塞了学生的七窍。《算法导论》中的习题都是没有答案的,我在看《算法导论》的过程中就有这种很坏的习惯:10分钟能解决的题目我会去解决;一看明显没有思路的题目,我会惊惶失措,连尝试的勇气都没有。

 

五:不断动笔,在读书的时候让笔忙起来。

这是在无聊的时候,或者在不想看书的时候能让自己把书看进去的最快的方法。当自己心情开始滑向消沉,开始放纵的时候,深吸一口气,翻开一本书,拿上一支笔,从第一个字看起,接下来看第二个字,然后第三个字,第四个字,……,第一行,第二行,……。如果书上说1+12,就在纸上计算一下是不是1+1等于2,应该这样来理解这种行为:如果它很简单,那么做完它就是不费任何力气的,为什么不做;如果它很复杂,那么去做一下它是很值得的,为什么不做。慢慢地,就会发现自己已经进入状态了。

 

六:多做练习。

刘未鹏的博客给了我无限的启发。这里引用他的博客里的一段话:

“本质上,练习并不产生新能力。然而练习最重要的一个作用注是将外显记忆转化为内隐记忆。用大白话来说就是将平时需要用脑子去想(参与)的东西转化为内在的习惯。”

再引用《组合数学》教材上的一句话:“你解决的问题越多,解决下一个问题的可能性就越大”。

 

 

最后,也是最最重要的,那就是执行。一个故事,说白居易去问一位禅师修道的原理,听完禅师叙述后,白居士认为那是耳熟能详的东西,禅师告诫他说:“三岁孩儿亦道得,八十老人行不得”。在我看来,人的学习过程就像小时候玩的注射器,理论的活塞拔起来了,要不断地实践去弥补这个差距。任何人加以思索都能讲出一堆掷地有声的方法论,然而,如何去践行这些方法,在这个过程中不断地反省、自我否定、升华,这是一个人一生也做不完、做不好的事情。

 

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43668159/article/details/87636718