为什么写这篇文章?在大二暑假那段时间,我看了很多的学习经历和学习路线,这给了我巨大的打击,相比之下我发现自己过去学的东西不过冰山一角,于是我开始反思,并且在那段时间规划了自己的学习路线,一口气读完了《CSAPP》《Algorithm》《C++ Primer》三本书,收获颇丰。所以,我决定分享出自己过去两年的学习经历。
第一次接触编程是在高三,当时偶然发现挚友有一本《C++ Primer Plus》,于是便向他借过来看(未曾想一借就是借到了现在)。当时的我从未接触过编程,通过这本书入门实在过于艰难,一个include头文件的概念看了半天硬是看不懂,然后我干脆开始强记代码,周末回家用家里的电脑安装c-free输出了我的第一行HelloWorld,这大概就是我的编程启蒙了。
高三暑假开始在慕课网上学习C语言的基本变量和语法。因为我每天都要出去学车,中间等待的过程漫长又无聊,我就用手机下载了一个c模拟器做习题。在大热天敲水仙花之数和九九乘法表的情景令我至今难忘。
上了大学后,我在两位师兄的指导下开始学习51单片机,后来完成了实操顺利通过了飞卡实验室的考核。进入实验室后被分配到了硬件任务,但是我没有任何硬件基础,动手能力又差,根本做不出什么来;反观在软件这方面,对于仅仅只会用点51的我,看着K60教程前两页里面各种设置寄存器,设置中断向量表完全懵逼,加上没有去实验室实践,所以在很长的一段时间里都没有进展,时间就这么被我荒废了。
直到寒假留在学校,我第一次用自己写的程序让车子跑了起来,直接调库,底层代码什么的,以后再说吧。所谓万事开头难,成功开了头后我顿时就有了方向,开始学习摄像头的使用方法,接触相关的算法;开始在一个库下进行编程而不再只是创建空白工程,之后的日子就开始了我的调车之旅。在接下来的日子里我无数次的与C语言“亲密接触”,各种变量溢出,数组和指针,中断逻辑的BUG报错层出不穷,点亮了“熬夜调车”,“通宵调车”,“隔夜战车”等智能车界专属成就。虽然校赛由于电路板原因遗憾落选,但还是收获满满。如今的我们也可以做出属于自己的车了,此时离我第一次参观实验室,一脸震撼看着师兄手上那辆用电感和摄像头跑起来的小车已经一年了。
比赛结束后的大一暑假,由于有了一个学期的调试摄像头基础,师兄让我们接手了一个项目任务--用Kinect和OpenCV开发手语识别。我开始学习OpenCV,这也是我第一次在windows平台去做东西,下载了Visual Studio,学习配置环境,跟着网上的教程调了API,跑了跑处理图像的例程,最后找到一个寻找凸点的方法对手掌进行识别。但是后来我发现我的算法只能做到这,此时离手语的识别还有好长一段距离,而当时的我只会C语言语法,甚至不知道文件IO操作,也不知道标准库,除了单片机外的工程也没怎么见过,看着那些用C++,Python编写的深度学习,机器学习例程根本不知道如何复现,我又陷入了一段时间的迷茫。
如今回想起来是当时操之过急,很多基础的东西都没学好,仅靠那点知识储备难以去理解更深的东西了。这也是我看到不少人的现状,被鼓动着申报各种天花乱坠的项目,基础都没学好却想着要怎么完成各种智能功能,东拼西凑最后也没学下来多少东西。
暑假第二个月,由于需要参加电赛,于是我重新回顾了一下K60,有了一学期的实践经历,当我重新回顾底层代码的时候发现没有了以前看魔法书的感觉,于是我开始一边看K60的技术手册一边对比底层代码一步步验证自己的想法,通过阅读底层代码再次提升了c的功力,这时候我大概已经看懂了之前调用的那些底层库还有学会了查阅技术手册。
到了大二,学了第一个数据结构,利用链表写了一个贪吃蛇,算是体会到了数据结构的好处。然后开始学python,不得不说这门语言真的上手容易,刚学了没多久就派上用场。我尝试去帮部门写一个汇总报名表信息的小脚本,发现竟然很容易就写出来了。
之后第二年的智能车比赛又要开始了,我决定在赛题出来前沉下心把C语言系统的学一遍,于是我选择看《C语言程序设计现代方法》。这本书是实验室一个已经毕业的师兄推荐的,是我接触的第一本优质书,这本书重新让我学习了C语言的所有细节,数组,结构体,指针,全局变量,局部变量,堆栈,真正地让我打下了C的基础。然后我开始了解单片机的启动过程,如何加载烧入的程序,C语言的编译,链接,为了更好的学习这些东西,我开始阅读《程序员的自我修养》,这本书让我对编译,汇编,链接,堆和栈有了初步的认识,同时又了解到一些关于计算机系统线程与进程,内存页的内容。我意识到自己之前了解的东西过于局限,沉下心来看更多的书无疑是目前最需要的。
接下来的时间就是疫情被困在家,一次偶然的机会我被一个实验室的师兄拉进了Telegram的程序员技术资源分享群还有介绍了很多资源,随后我仿佛打开了新世界的大门,我开始接触CSDN外的社区,用上了Google,寻找各种文章,学习路线,学习资源,也是在这段时间我的视野开阔了很多。我开始规划后面的学习路线。在熟悉了C语言和学习了linux基本操作的背景下,我开始阅读《深入理解计算机系统》(又名csapp),这是一本对我影响特别深远的书,是我心目中的第一神书,配套着CMU15-213课程和七个课外lab,彻底刷新了我对计算机的认知,也让我爽了一把编程。利用汇编语言attack,写一个shell,编写malloc,还有编写一个web service和其它lab,可以说这段时间我把各种以前觉得很遥远很难的东西都玩了个遍,汇编语言,进程调度,算法,socket使用,熟悉了linux,vim和gdb的使用,收获巨大。
阅读这本CSAPP的过程让我体会到了几个习惯的甜头,学习书籍尽量选择国外优质书,尽量阅读英文版原文,不断实践敲代码。之后我开始阅读《Algorithm》《C++ Primer》,学习了算法,C++,在这期间我上了另外一本神书《SICP》的配套课程,函数式编程简直刷新了我的认知,我将这本书设置为以后一定要读完的目标,不过至今仍未有完成。
由于第二年的智能车比赛参加的是人工智能组,因此这段时间为了准备比赛我学习了Coursera上的deeplearning课程,用百度提供的Paddle框架参加了人工智能组的预选赛。有了前面打下的基础,理解起代码也快多了,花了一天把修改了YoloV3例程中的读取器将例程跑了下来,相比于之前手语识别时候的束手无策,我知道这段时间的路线是走对了。有趣的是我发现tensorflow,paddle深度学习框架所使用的编程模式其实就是《SICP》提到的函数式编程。
在家待了一个学期后回学校做比赛,创意组比赛的小车刚好就是在linux系统上跑,因为玩了一假期的linux所以很快就上手了,最后我们冲到了国赛,虽然最后留有遗憾,但我也算是在这次比赛中得到一次完整的深度学习开发经历,并且通过这次实践,我充分体会到了一学期沉淀后给我带来的好处,很多东西的理解,代码的逻辑都能让我清楚的感觉到自己和以前的不同。
花了两天时间终于写完了,现在当我再去回顾前两年的经历,我发现自己曾经浪费了不少时间,这个时间甚至有点大于我之前自己的预估,我做了以下反思:
前两年的大学感想给我感觉是上大学真的是一件非常爽的事情,大学前两年可能是人生唯两年可以不需要考虑很多现实问题,生存问题,又可以做任何自己想做的事情的一段时间了。你可以选择在宿舍躺两年,也可以选择在每天东奔西走各种开会,也可以选择每天坐在焊台前,坐在笔记本前,各种各样的生活方式。对于我自己而言,我觉得自己真的是在大学中运气非常好的人了,尝试了高中自己想做的事,最后找到了自己真的喜欢的事情,引用轮子哥的一句话来讲:
如果学习编程本身就可以让你觉得爽到浑身发抖的话,你就可以通过读计算机专业而获得成功。这种成功甚至不需要靠你的高收入,简直易如反掌,爽到不行啊。
什么样的人能通过读计算机专业而获得成功?
虽然没有经受过社会毒打的人不能妄下定论,但至少这种“意境”在大二的时候是体会到了。高中的时候一直无法理解为什么有人可以一整天都对着一样东西,那些学霸为什么可以一整天都对着课本,尝试过在对着一整天电脑后,我想这大概就是热爱?因为热爱,我愿意付出打游戏的时间;也只有热爱,我才愿意付出打游戏的时间。因此虽然在大学刚开始的前两年我跌跌撞撞,四处碰壁,走了不少弯路,但至少没有把时间虚度。
最后感谢所有在这两年帮助过我的朋友,师兄,师姐! 我个人收藏的资源: 计算机优质书单 豆瓣书单 Coursera上的优质课程 一篇技术路线 十年学编程 一篇感触很大的文章