编程之路

转行当程序员也快一年了,这篇给自己的交代硬生生拖了半年,趁着没忘,赶紧写写。

大三前对编程的印象停留在初中用VB编猜数字游戏,但一直对编程抱有一定的好奇。
有数学和逻辑的魅力,又不会过于抽象,可以充分验证自己的想法,所需却不多,仅仅是一台电脑。
好奇心加上时间,我开始去学习编程相关的知识。

那,如何去学呢?可能是因为一直都是按部就班地学习,对基础这块就特别重视,
再加上搜索如何学习编程时,经常看到“程序=算法+数据结构”这话,就决定先从算法开始。想来真是初生牛犊不怕虎。
幸运的是,那段时间MOOC正好兴起,尤其以计算机相关的课程最多。

Algorithms, Part I

我第一门公开课是Algorithms, Part I,是用Java教学的。当时刚看完Head First Java,敲过书上的例子,就硬着头皮去学了。难度真心比较大,每周都会有Programming Assignment要完成并且评分。由于自己编程的经验比较少且是第一次上公开课,在开发环境的构建上就费了很大的功夫。多亏了课程资料及论坛上的帮助,一步步地啃了下来。Assignment经常看的一头雾水,就去研究说明里的提示和论坛上的CheckList,实在不会还去网上搜答案,看懂了自己再写一遍。这门课由于老师的PPT和附带的代码都非常非常精致(对,可以用精致来形容),每个Assignment都会合理地拆分成几个函数,再加上评分系统对代码的时间复杂度和空间复杂度有一定的要求,对我自身的代码习惯产生了很大的影响。我这样一个自学的人,代码习惯没有很差的话,我想都是这门课锻炼出来的。

Algorithms, Part II

I上完后就趁热打铁,上了Algorithms, Part II。II的难度果然上了一个层次,算法的原理也不那么容易理解了。其中好几个算法的推导部分都是囫囵吞枣,没有做到细致的理解。Assignment的难度也上升了,但是做起来反而轻松了些。大概是习惯了将大问题拆解成小问题的思考方式。独立完成了几个Assignment这点让我觉得有了进步。

The Hardware/Sofeware Interface

上这门课的主要原因其实是因为这门课太有名、太难了,经常看见各种评论对其的赞赏。
它的难度可以从选择的教材中看出——CSAPP
如果说Algorithms是啃下来的,那么这门课就是硬啃下来的。
其中印象最深的是二进制炸弹和缓冲区溢出攻击这两个作业,都来自CSAPP。
二进制炸弹是通过gdb看汇编代码,然后推测出其中的意思,输入密码来通关,类似解谜游戏。
缓冲区溢出是通过输入一段较长的字符串,来覆盖掉函数的参数、返回位置等等,来使程序不按照原本的流程走。
为什么说硬啃呢?因为在这门课之前,我完全不懂gdb,汇编语言,栈机制等知识。为了解题,就翻来覆去地看CSAPP汇编那章。
就是在这种折磨下,学到了计算机稍微底层的知识。

From Nand to Tetris, Part I

这门课也是相对比较底层的,讲的是从零开始构建一个计算机。Part I主要是从Nand门开始,搭建And门,Or门,接着搭建相关运算,然后是Bit、ALU,最终搭建一个CPU。
在看CSAPP时,就知道CPU是由三个部分构成的,ALU、寄存器、Program Counter。但具体是如何实现的却一头雾水。
学了之后才发现,最最简单的CPU构成,也是如下这种。
CPU
Part II迟迟没有开课,不过内容的话配套的书和程序都有了,有空了一定要补起来。

Introduction to Computer Networks

这门课的难度比较简单,内容以知识性的为主,实践的部分不是很多。
老师讲得很通俗易懂,而且会翻来覆去地讲,印象特别深刻。PPT上的动画也十分形象,对初学者很友好。
上了这门课,我终于把EthernetInternet分清楚了(不知为何以前总搞不清),也了解了一个个封包是如何在网络中传递的。

待续

由于时间和精力有限,像离散数学、编译原理、操作系统等知识还未来得及学习,只能边工作边补充了。

自己这一路走来,意外发现和Obtaining a Thorough CS Background Online的做法很相似,看了下课程清单,任重而道远,还须努力努力。