大三了#我的两年编程生活

前记:

为什么写这篇文章?在大二暑假那段时间,我看了很多的学习经历和学习路线,这给了我巨大的打击,相比之下我发现自己过去学的东西不过冰山一角,于是我开始反思,并且在那段时间规划了自己的学习路线,一口气读完了《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所以很快就上手了,最后我们冲到了国赛,虽然最后留有遗憾,但我也算是在这次比赛中得到一次完整的深度学习开发经历,并且通过这次实践,我充分体会到了一学期沉淀后给我带来的好处,很多东西的理解,代码的逻辑都能让我清楚的感觉到自己和以前的不同。

总结:

花了两天时间终于写完了,现在当我再去回顾前两年的经历,我发现自己曾经浪费了不少时间,这个时间甚至有点大于我之前自己的预估,我做了以下反思:

  • 养成优质书学习的习惯,一点是看书学习,在一开始我也是习惯在网上视频教程学习,二倍速学得快,但这种方式在一些比较需要琢磨的地方往往不如书籍介绍的详细,像学习CSAPP的时候后面的章节我基本都需要先过一遍书,因为和视频不同,看书比较慢但是节奏把握在自己手里,你可以随时看一句停下来思考一会。另外一点是看优质书学习,我现在习惯学习一种新东西之前先看有没有比较备受好评的相关书,先查看一些大牛推荐的书单,如果没有再到豆瓣上搜索查看评分和评价,因为阅读一本书花费的时间不短,所以我更倾向于是阅读之前就尽量挑选中优质的目标。最后一点是我前面提到的尽量阅读英文原版书,原因是因中文版的翻译有些地方会更难于理解,如鲁棒性,英文robust,第一感觉是鲁棒性是什么东西,查一查robust也就理解了。这里并不是意味着每本书都需要读英文版,像《C语言程序设计现代方法》我就读的中文版,但是在阅读《CSAPP》的时候我就发现有些地方中文理解起来甚至不如英语版来得快,因此当阅读到一些比较晦涩的中文时,切换到英文原版可能会有意想不到的收获。我个人的感觉是阅读中文版是提高了阅读速度,但是有时候会降低了理解速度;英文原版降低了阅读速度,但在一些关键的技术术语上理解起来却比中文好多了。很多人会觉得阅读英文原版很困难,对我来说确实很困难,但是英文原版的技术书相比于其他类型的英语书应该算是比较友好了,因为它并不使用复杂的语法,像我这种没什么词汇量,甚至不懂语法,四级也莫名奇妙混过去的人都能看得懂六七成,剩下的就留给google翻译了。
  • 系统的学习基础知识,就像是我大一暑假的那段时间,基础都没学好,做起项目事倍功半,毫无头绪,而反过来我在大二去做深度学习的时候,虽然说之前没接触到,但是还是可以慢慢摸索出来的不至于一点思路都没有。反思一下我大一甚至都没系统完整的学习过C语言,仅仅只是学习了前半部分。在我看来在,系统完整的学习一门语言是很重要的,操之过急没有任何好处,因为很多东西是需要通过系统的学习来搭建起来的,而当有了这层基础后再去看其他东西,很多事情自然水到渠成,比如在《CSAPP》中提到的计算机系统缓存机制中的cache hit,其实可以用来理解在deeplearning中提到过的当一个数据很大时候会出现降低速度的情况,这其实就是同一个原理。我个人非常反对只为了项目去速成一种东西,项目只是拿来实践磨练自己所学的东西,不否认一个项目确实可以在学习路线起引导作用,但这并不意味着通过速成学习。最后我推荐一篇文章,Teach yourself programming in ten years
  • 实践!最后一点是实践,在之前我都没有意识到实践的重要性,不管是观看教程视频还是看书,都会主动跳过那些习题,认为我看懂了听懂了就好,忽略掉了最重要的实践,这导致我在大一其实除了单片机外写的代码量极少。这里并不是说拿笔去做题,而是真正去敲那些习题,敲那些无法理解的代码,敲一些小项目,敲一敲贪吃蛇,敲一敲俄罗斯方块,敲一敲扫雷,敲完参考参考别人的思路,看看别人的代码写得多好自己写得多烂,思考多了敲多了,就有感觉了,还有最后一个实践小项目,来飞卡调车👍。

感想:

前两年的大学感想给我感觉是上大学真的是一件非常爽的事情,大学前两年可能是人生唯两年可以不需要考虑很多现实问题,生存问题,又可以做任何自己想做的事情的一段时间了。你可以选择在宿舍躺两年,也可以选择在每天东奔西走各种开会,也可以选择每天坐在焊台前,坐在笔记本前,各种各样的生活方式。对于我自己而言,我觉得自己真的是在大学中运气非常好的人了,尝试了高中自己想做的事,最后找到了自己真的喜欢的事情,引用轮子哥的一句话来讲

如果学习编程本身就可以让你觉得爽到浑身发抖的话,你就可以通过读计算机专业而获得成功。这种成功甚至不需要靠你的高收入,简直易如反掌,爽到不行啊。

什么样的人能通过读计算机专业而获得成功?

虽然没有经受过社会毒打的人不能妄下定论,但至少这种“意境”在大二的时候是体会到了。高中的时候一直无法理解为什么有人可以一整天都对着一样东西,那些学霸为什么可以一整天都对着课本,尝试过在对着一整天电脑后,我想这大概就是热爱?因为热爱,我愿意付出打游戏的时间;也只有热爱,我才愿意付出打游戏的时间。因此虽然在大学刚开始的前两年我跌跌撞撞,四处碰壁,走了不少弯路,但至少没有把时间虚度。

最后感谢所有在这两年帮助过我的朋友,师兄,师姐!
我个人收藏的资源:
计算机优质书单
豆瓣书单
Coursera上的优质课程
一篇技术路线
十年学编程
一篇感触很大的文章

评论

  1. 3周前
    2020-9-08 14:27:43

    未来可期。

  2. 可爱的路人
    3周前
    2020-9-08 23:42:25

    棒啊棒啊棒棒棒🍦

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇