看了《IT学生解惑真经》一书,里面有很多东西,不但值得在校的大学生看,也值得刚工作不久的 IT 码农们看。下面就从书中挑了一些好段子,供大家欣赏。想要看所有的文章,请在本文最后寻找链接并下载即可详看,不过注意,文章版权都属于原作者。
看了左飞老师的《大学计算机课程学习路线》一文,才真正发现大学中散乱无章的课程,原来是老师提的三条学习线路。下面就文中的部分内容摘抄整理如下:
最开始的第一门课应该是“C 语言程序设计”,这基本上属于你日后一切学习的开始,简单说这门课程的主要目的和内容就是介绍一种计算机语言的语法内容,之后的课程会分为三条线。
第一条线的第一门课程是“数据结构与算法”。这很简单,一些有了语言基础之后,为了更好的使用语言去解决问题,就必须学习结构知识和算法。“数据结构与算法”的后续课程是什么?答案应该是《编译原理》。很奇怪吧?课程就是这样设计的,其实这个路线也不是我发明的,国外大学的 CS Course 的体系也是这么设计的。编译原理说白了就是介绍编译器如何工作的,是让计算机理解计算机语言的一种方法和理论。这个工作过程之中蕴含了大量的算法,而且是非常复杂的算法,很多人甚至认为编译原理是计算机专业本科阶段最难的一门课程。主要就是因为这里面的算法太复杂,当然也会用到很多结构,树可能是用得最多的。当然,这就是相当于是数据结构与算法课程的一个后续性课程,类似一道附加题。 最近听一个学生说有些学校本科已经取消这门课了,我想应该是较少一部分学校的做法吧。不过,中国的学习并不太重视这门课倒是真的。一般课程设置就是一个学期左右的课时。但是一般的国外学校这门课都要学上 1 年,甚至两年之久。这条线路到编译这里就应该是终点了。
下面我们来谈谈大学计算机课程学习的第二条路线,为了更好地探究计算机系统的研究机制,在学习了 C 语言之后,下面一门需要学习的课程是“汇编语言和微机接口技术”,这门课程包含两部分的内容,一部分就是汇编语言,汇编是一种更底层的语言(相对于 C 而言),说白了它就是一种 “用助记符描述的机器语言”。很多人刚学汇编的时候都觉得很复杂,因为它跟硬件紧密相关,就是那些个寄存器也够初学者糊涂一阵子的。这门课程的另外一部分内容是微机接口技术,目前国内高校这部分内容都是基于 80X86 系列芯片的。已经可以看到这门课其实涉及到了很多硬件的知识,其实还不止,关于 I/O 控制,寄存器,中断,这门课里都有体现的。接下来要学习的内容就是《计算机组成原理与体系结构》,这门课程还是比较深的一门课程,在汇编和接口之后安排这门课程是比较好的。接下来的一门课程是《计算机操作系统》,如果外行听起来可能觉得这个课应该是学如何使用操作系统的吧,就像“WindowsXP 速成”?非也!这门课程是讲 OS 是如何设计的,或者说是如何实现一个 O S (当然做要比说起来难多了)。之所以这门课程被安排在组原之后 ,那是因为这反映了一种自底向上的学习路线。操作系统当然是在计算机系统之上来搭建的。像调度啊、虚拟内存啊这些问题都是由操作系统来控制的。
最后一条路线属于应用型的,也就是说当你学完了基本的原理之后,一方面为了日后更好的工作,另一方面如果从事研究工作也可择其一而继续深入探究,那么最好总之要上升到一定应用层面的东西。在你有了一定的 C 基础之后,学校可能会开一些面向对象程序设计方面的课程,可能是 C++或者 Java,因为面向对象的语言在实际开发中正广泛的被使用。无论是 C++还是 Java,跟 C 来说本质上都是语言,只不过他们多了一些 OOP 方面的特性。接下来的一门课程应该是 “数据库系统”,这门课不是教你怎么使用 SQL SERVER 或者 DB2 的,学校里的课程远没这么前沿。数据库系统这门课依然偏重更多理论,尽管数据库相比于组原和 OS 来说已经是上层建筑了。这门课讲的多是些数据库系统设计方面的原则,例如如何解决关系问题或者 SQL 语言等等。再之后可能会学的课程是“计算机网络”,这门课里会更加系统的向你介绍网络方面的知识,TCP、UDP,HTTP 这些名词会粉末登场。注意这门课一般不是教授你如何布网的,例如如何配置路由器这种东西一般是 CCNA 里面的内容了。这门课里讲的更多的是上层原理与协议。
以上就是一般的大学计算机课程学习的几条路线。他们彼此联系,共同作用。注意我这里讲的内容不是给你推荐学习方向,而是告诉你大学里会学什么,之间联系如何。这些东西你都得学,既然学就要学好。
其中,有一篇肖舸老师的《修炼编程的内功》值得一看, 他指出,修炼编程的内功,是学习抽象能力和描述能力,与语言无关。下面摘抄一些文中的经典段子:
一个计算机专业的师姐就考我,问我编程是什么?
我当时想了一下,很郑重地回答她,我的理解,编程就是拆解任务,把一个任务,拆解成很细很细的步骤,一步步教计算机去做。计算机很笨的,举个例子,我们说早上起来去上课,是个人都知道做什么,但是它不知道,因此,我们要告诉它:
起床--穿衣--拿饭盒--去食堂--买早饭--吃饭--洗饭盒--回宿舍--放饭盒--拿书--出门--如果人都走完,要记得锁门--去教室--推门--找到自己的座位--走过去--坐下来--等待上课--上课 。
说到这里,我突然自己有点明悟了,编程,就是把复杂的问题简单化,简化到每个动作都是 1+1=2 那么简单,然后计算机照做就好了。这就是我理解编程的真谛。我师姐听到了,也若有所悟,这个话题就没有再说了。
我们来分析一下计算机的特点,准确的讲,目前我们这个社会的计算技术,还很原始,说它是计算机,正确,它确实只能计算,说它是电脑,太抬举它了,它不可能有思考能力。
在冯诺依曼体系架构中,计算设备就是具有一定计算能力,有能力和外界做出 IO 互动 ,并且能高速重复动作的这么一种设备,这可能和大家在教科书里面学到的不太一样啊,不过 ,我是这么理解的。
我想说的,其实很简单,编程序,就是拆解问题,但讲究个拆解的技巧和方法,以前人做过的,别做,尽量用,没有的,做过一次,尽量保留下来,供下次使用,就这么简单。
那,这和本文的题目“修炼编程的内功”有啥关系呢?
当然有关系了,什么叫编程的内功?我的理解,就是对这个世界的抽象化理解能力以及描述能力。一个工作,能迅速从中提炼出下次可以重复的套路,并且能以一定的规则,就是计算机语言规范,描述出来,拥有这两个能力,就能保证遇到任何问题,都有办法写出程序来。
所以,大家学校中学了很多数学,语言,算法,数据结构,甚至编译原理,操作系统,其实这些统统是工具,不是写程序的目的。
写程序,就是遇到需求,能迅速抽象,理解其共性,并能以清晰的语言描述出来。上述学科,不是帮助提升你的抽象能力,就是帮助提升你的描述能力,大家看是不是这个道理?
所以,我在带徒弟的时候,有时候喜欢说一句话,其实作为程序员,学习一点语文有好处,因为最能培养描述能力的,其实还是语文。英语不算啊,英语虽然也是一门语言,但中国的教育,一般是能看懂,很少从一个英文文学家的角度培养学生用英文的描述能力。只有我们的语文课,这不但是教语言,而且通过无数次造句和作文,在教大家描述问题的组织能力,这个能力在写程序的时候,很有用。
这个时候,话题就出来了。中国的语文,先是甲骨文,然后古文,然后白话文,大家发现没有,总体是越来越简单,这是发展的趋势。为什么呢?因为大家觉得,语文就是让人懂的,太深奥的东东,不太适合普及,就没有生命力,反而越简单的东东,普及越快。
因此,请大家注意,写程序时拆解,是把问题简单化,不是说把一个问题描述得晦涩难懂,才叫本事。真正的程序高手,都是简化问题的大师。
当然,从这个话题,我们是不是可以得出一个结论,其实写程序的方法本身,编程的内功本身,其实是没有什么语言特性的,C、C++、Java、PHP、Python。。。是不是都用的同一种方法在做事情?
因此,我这里提出,修炼编程的内功,是学习抽象能力和描述能力,与语言无关,换而言之,从任何一门语言入门,都可以修炼到内功的极致,关键看你用不用心。