逃课这些事

这些专业课

从初中开始,我就经常逃课。初中逃课和梁聊天,高中逃课去网吧。我想,大学可能会少逃很多,因为学的是计算机了。学喜欢学的科目,不会逃课了吧。结果事与愿违,我从大一到大三以来,逃课频度逐年上升。

我对专业课的期待是比较高的,因为我就是冲着这个专业来的。目前上过多专业课也不少了,总的来说有两个特点:

  1. 课程难度低,甚至可以说是上成水课;
  2. 老师把简单的东西讲的很枯燥,枯燥之后就给人很复杂的感觉。

这两点综合起来就是计算机又枯燥又复杂,而实际上学到的东西是又简单又无聊。引发问题的原因主要又有两个:

  1. 课程资料过时,落后;
  2. 老师不负责任。

课程资料落后是很明显的。

 

先随便吐槽两门

先说信息系统导论这大一开的课程。导论这种东西首先就没有技术含量,没有技术含量的东西就应该用先进的甚至可以是未来科技来吸引人。讲些N年前的电脑有多大有什么用呢?谁在乎以前的电脑是两层楼的大小还是30吨重呢?我想知道的是,再过若干年,在我们有生之年,我们将会有机会乘坐无人驾驶汽车,在虚拟现实设备中游戏,在3D投影技术下开会。而创造这科幻电影里面的世界的工作,很大一部分是由我们专业的人来完成的。导论就应该讲些比我还敢想的东西。

再说数据结构。这个老师懂得多,但是没责任心,感觉就是你们不怎么认真学,我也不怎么认真讲。本来课本里面内容挺丰富,但是他这么一搞,最后我就不去上他的课了。使用清华的教材,我是不喜欢的。我觉得这些教材都是考研党使用的,无论最后是否考研,本科哪能一上来就用考研的思路去学知识?我想用麻省理工算法导论公开课那个老头子说的话来作为真正有趣的数据结构课的开场:“想成为一个优秀的程序员,你可以花费十年时间去不停敲代码换来;也可以敲三年代码,然后学一年算法来完成。”我还想通过12306买火车票的那个服务器上面的程序来说明数据结构的伟大,我还想用电子表能追赢超级计算机的例子来说明时间复杂度的美妙。但是这个老师就是把一门神奇的课搞的很枯燥。

 

计算机组成原理

最后是计算机组成原理,这篇文章的重点之一就是吐槽这门课,所以我得多写几段。这是这个学期的课。这门课老师很激情,不错,可惜老师也没明白为什么我们要学组成原理。老师也很厉害,为军工企业写过武器上的程序,知道各种老式大型机的插槽接口,会画硬件设计图搞电路设计,但是不知道我们为什么要学这门课。不仅如此,还不知道为什么要选这么一本旧的发黄的课本。

为什么我这么武断的说老师也不明白我们为什么学这门课,难道我比老师还懂得多吗?事实上,老师比我会的技术更深,而且经验丰富,不仅如此,讲课还很有激情很有特色。但是为什么我们要这么激情的去用过时的课本学习?我对这个问题百思不得其解,如果有知道的,请留言告诉我,我是真诚的想知道。我在网上查了很久,很少有人在讨论为什么我们要学习计算机组成原理这个话题,倒是不少人喜欢推荐我们用的这本课本,原因是考研就用这本。

我在知乎上终于找到一个说课本不好的人,他不仅勇敢地指出这一点,而且给我们提供了他觉得更好的一本书,我也没多想就把他推荐的那本书下载下来了。在我看这本新书之前,我得说说我以前是怎么看组成原理的。我觉得组成原理可以让人知道硬件大概是怎么工作起来的,可以轻松看到mp3, mp4, 电子词典,个人电脑,手机这些设备的共同点,然后得到一种满足感,或者是一种征服感,一种豁然开朗感。当我看了这本网友推荐的新书的第一章之后,我几乎欣喜若狂,因为我发现作者提出了一种我还没想到的观点,他不仅说的有道理,启发了我,而且给我动力去学好这门课。

首先,这本新书不像我们学校用的那本旧书,告诉我们神奇的ISA接口,EISA接口或者“先进”的CD-ROM驱动器。新书开篇就拆解了一本ipad,然后指着这些小零件们说,这就是cpu,这就是ram,这是emmc。

其次,新书不会很奇怪的告诉你各种总线的区别。因为内存和独立网卡还有独立声卡应该以何种姿势抢占和cpu通讯的线路的时代已经远离我们,我们更需要关心的是在8核手机或者平板上,程序是如何多线程运行的,那些流水线是如何被切成几部分的,他们对cpi有何影响,如何写程序才能把多核运算的衔接缝隙缩小。

新书选用的指令集系统是MIPS,学术界一边倒的不约而同用来研究的一种结构。最新的64bit arm v8处理器与mips的相似度超过了与arm v7的相似度。同时在很多地方都用Intel 酷睿 i7 处理器来进行对比,以更接近生活。

那么我们为什么要学习组成原理?我认为新书给出了具有时代特色的答案。

  1. 首先计算机硬件性能遵循摩尔定律发展,而近年来出现了多核处理器,云计算时代逐渐到来,计算机集群进行并行计算的技术变得更为重要;
  2. 让程序员完全忽略硬件结构就能写出高性能的程序的时代还没有到来,今天以及很长一段时间内,我们仍然需要对多核,多线程,流水线等原理有一定了解,才能写出发挥机器性能的程序;
  3. 我们还需要科学衡量硬件性能的方法,需要科学衡量软件在特定硬件环境下的性能,需要知道一些编译器的工作原理,知道什么样的编译器在什么样的硬件条件下更适合工作。

虽然只看了新书开头部分的一点,但是我觉得,选择一本正确的教材,是非常非常重要的事情。就像在算法竞赛上,《挑战》也是一本正确的书,这扯远了。

 

逃课是一种谦虚

我很多课没去上。最近我越来越想鼓起勇气把英语也逃了。不知道会不会有人这么想,你这课也不上,那课也不上,你这么牛逼吗?有一点基础就可以骄傲吗?

我觉得正好相反。

我有一种强迫症,就是如果我不知道去做一件事其意义何在,我就完全不想去做。

我至今没想明白为什么大学开学要军训一个月,所以我在还没上大学就在贴吧查好了如何逃军训的方法,换来了一段对我来说有意义的多的电视台编辑部生活。

我曾经没想明白为什么程序员要学高数,我就差点挂了科。后来我学习机器学习的时候,我终于明白为什么要学习高数了,我在维基百科上复习了用到的高数知识,知道了为什么高数里面用来求梯度的方法可以用在人工智能上让计算机变得更聪明智能。虽然这貌似是一个反例,但是仔细想来,还是利大于弊。

我想不明白为什么要学过时的组成原理和汇编语言?为什么我们学组成原理而不是计算机体系结构?虽然我曾经自学过汇编语言,学这些知识比较轻松,但是我仍然花了很大精力去探索为什么我们需要这些知识。知道为什么,让我能够非常明确的做出不上什么课,自学什么书本的决定。

所以,逃课不是一件轻松的事情,而是经过查资料和思考的结果,是经过权衡利弊的认真的谦虚的积极向上的决定。我并不觉得出勤率代表学习积极度或者学生的求知欲强度。

最后,我希望教育制度在未来大大发展,不要让求知若渴的学生还要浪费那么多精力和喜欢点名签到的老师斗智斗勇。