学习计算机底层知识:兴趣和方法的重要性

[b]一、兴趣的产生[/b]
我在前段日子关注了一阵子号称与同类数据源框架产品执行效率快几十倍的BoneCP,也粗略的看了下其源码实现。其内部核心是采用了JDK5.0新增的并发框架来实现的。之后顺藤摸瓜的学习了下java.util.concurrent包中的内容,期间看了不少PDF资料,初步有了大致的了解,也就是说只停留了在API使用层面上。对这个并发框架的内部实现原理理解的不是很透彻,因为看懂源码也仅仅是在API内部看懂了,并不见得能够挖掘出它的本质。个人感觉今后若还以这样的方式学习新潮技术,路只会越走越窄。因此萌生了学习计算机底层知识的浓厚兴趣。
[b]二、方法的运用[/b]
[b]1.背景[/b]
介绍这些方法之前,先看看它们是在什么背景或情景下产生出来并运用的。
我本人没有正式地系统学习过计算机底层知识的经历,诸如:操作系统、数据结构、编译原理等基础性科目,但是这些科目我零零散散地都有自学补习过,苦于基础知识晦涩难懂,并且也是自学的,所以都没有坚持下来,各个科目都是浮于表面的理解,没有过太深入性的思考。
时光荏苒,做程序员已然有四年的光景了,至今不能确切了解,换句话说,不能够在脑海里画出一幅图:我编写的程序代码在计算机中是怎样地处理和执行。为此我感到有些惶恐,有些无助,有些不安。我居然对计算机是那么的不了解,根本就对计算机内部的处理流程没有一个正确的认知,也可以说就脑子就没这个弦。不过我仍然操纵着计算机,重复着编写重复性的代码工作,貌似还有来道趣的。当我知道要去深入学习计算机底层知识开始,我就认为那些行为仅供自娱自乐罢了。
为什么说是自娱自乐?自己按照着框架开发者给出的文档,告诉你有他们提供了哪些功能,你按照文档上面一步一步地跟着做下去,就知道怎么使用了,这难道不是在自娱自乐么?先抛开了解框架的设计思想和读懂源码不说,主要关注的是这个框架是用到了什么底层知识。比如说Struts框架,他底层就是用到了HTTP协议。为了给我这四年的程序员生涯,以及以后,多少要有个交待,至少我要能知道计算机是怎么执行我写的代码。目的虽然是很简单的,不过确实能引出很多思路来,就看敢不敢去尝试,兴趣就是为达到既定目标的加速剂。
[b]2.书籍[/b]
在写这篇博文之前,我已经自学一段时间了。阅读的书籍有两本:
(1)《深入理解计算机系统(第二版)》
这本书是以程序员角度来讲述计算机操作系统的知识点,覆盖面很全,侧重于编程层面。译者也是很用心的翻译,除了我遇到了不懂的知识点之外,至少我读到的前三章还未发现晦涩难懂的词句。
(2)《汇编语言(第二版)》(王爽老师编著的)。
这本书被网上很多朋友推荐,也确实不错,颠覆了以往此类书籍的编排方式;而且书中内容讲的也是明明白白,看的过程中不会遇到太大的阻碍。一些关于计算机系统的基础概念我都是从这本书中理解到的。
[b]3.方法[/b]
[b][color=red](1)交叉阅读[/color][/b]
我一开始是直接读《深入二》,读到第三章的时候我就读不下去了,因为里面出现的许多概念我都是很模糊的,只能以“逻辑角度”去理解书中的内容,而不是从“物理(本质)角度”去理解的;再往下读的话不但效果不好,而且担心会绕弯路。我采取的方法就是先把这些概念搞清楚,搞透彻,能够在脑海当中形成“第一印象”,再继续前进。
正好我在网上搜索有关计算机底层基础概念的相关内容时,发现了被很多人推荐去看的《汇编二》。下了一个电子版,慢慢细读起来。这时“进程”切换到了《汇编二》。恩,果然没错。这种方法起到了应有的作用,解决了我在《深入二》中遇到的大部分疑问,《汇编二》看到一定程度后,“进程”切换回《深入二》,如此反复交叉阅读,效果还是蛮不错的。一边能学习计算机系统,一边还能学习汇编语言。这两本书在某些知识点上还是相通的,所以说交叉着看不会事倍功半的。
[color=red][b](2)屏蔽不相关的知识点[/b][/color]
在看《汇编二》这本书中,我理解了王爽老师为啥提倡“屏蔽知识”这个方法,它有效地提高了学习者在某一个知识点时的专注力,不会被其它知识点所干扰。
也就是说在关注一个知识点的同时,肯定会引起连带的其它知识点;我们以理解遇到的知识点为目的,去学习其它知识点。要分清主次,切忌盲目学习,以免造成走弯路。我在学习的过程中利用了这个方法,起到了很好的效果。
[color=red][b](3)练习题背后的深入思考[/b][/color]
这两本书每章每节后面都有大量的练习题或思考题,供我们去理解并运用先前学到的知识点。每道题都是有针对性的,也不是很难。实在不会做也没关系,基本上都是有答案的。但是,请记住,做之前一点要思考一阵子!越不思考就越不会思考。
做完题目之后,还要进行一番深入思考。我思考的方向是这样的:这道题目用到的知识点为什么就能形成一道题(读着有点拗口,多读几遍就能理解了)。
自己想想通过这道题目它考察了什么知识点?为什么这个知识点能这样用?为什么自己想不到这个知识点?还能不能将这个知识点扩深一下,换到其它问题当中去呢?多问问为什么,做题才有意义。只知道做题而不知道出题者的本意,这是在自寻死路(淡定~冷静~,这是出自一位悲情人物经常说的一句台词- -)。
[color=red][b](4)以笔记的形式记录自己的思考[/b][/color]
时常做笔记,生搬硬套把书上内容搬到笔记上,不叫做笔记。哪怕把那段话用自己理解的方式变化一下都要有效果。笔记的内容主要是对某个概念或某个结论表达出自己理解后的文字,通过这种理解又能引申出什么知识点来,多记录这样的内容会很有益的。技术博客怎么写出来的,就是靠平时一点一滴的积攒形成的。
另外把不懂的概念也记录下来,日后有空余时间了在回过头去查阅相关的资料,以免漏掉了这个知识点。
[b]4.感悟[/b]
我个人认为网上一些大牛们常说的“要构建属于自己的知识体系结构”云云的话,我是这样理解的:[b]一个知识点引发了另外一个或者是多个知识点,将这些知识点有效地组织起来,形成一种“体系结构”,并且这些知识点互相之间存在着必然的一种 “联系”,各条道路都会是相通的,只是之间的 “路径”不同罢了[/b]。因为是自学的,身边也没有老师指导,自己在学习的过程中,思考出的一些想法不敢保证有多准确的,但是敢保证不会偏离实际太多。
[b]三、结束语[/b]
兴趣和方法虽然在表面上是不相干的两个概念,但是在某种情景下,却产生着必然的内在联系。毫无一丝兴趣,再好的方法也是个花瓶;没有好的方法,就是再有浓厚的兴趣,也是举步维艰,直到兴趣全无,停止了前进。自学之路,苦多甜少,只要挺过一段必定会出现的困难期(瓶颈期),后面则会畅通无阻(我认为就该进入麻木期了)。现在对我来说,还未遇上那个未知的瓶颈,虽然这段期间出现很多很多的基础概念,都不是很理解,甚至是见都没见到过,其实这些都是小问题,通过网络搜索都可以查得到,搞得明明白白。知识体系结构慢慢的连接并形成起来,同时关注纵向的发展,也时常要记得横向的扩深(AOP思想?)。

你可能感兴趣的:(Programmer,框架,数据结构,网络应用,AOP,编程)