问问题前,最好自己要先有一个答案。

“问问题前,最好自己要先有一个答案。”这句话是很久之前一个同学跟我说的,
当时我们在讨论项目问题,一个由我主导的实验性质的校内网站项目。我对技术一无所知,但是满脑子都是天马行空的想法,讨论问题时也是心潮澎湃。他的这句话像一盆冷水泼在我火热的心上,我突然冷静下来,我意识到我并没有任何有价值的想法,只是在胡乱地提问。

当时我只觉得这句话很对,但并没有深刻领悟,就像明白很多道理,依旧过不好这一生,因为只是明白而已,没有亲身经历,就无法体会。

最近发生一些事却让我突然对这句话有了体会,即使我忘了是谁在什么时候对我说的。

前几天我在看一些 Java 代码,很基础的源代码。但是依旧让我这个新手看的十分混乱。然后我翻看一本 Java 数据结构的书,里面作者从无到有,一步一步简单实现了一个 ArrayList。看完书中的内容再回头看 jdk 中的 ArrayList,瞬间清晰了许多。

我仔细回顾这两次看源代码的经历,仿佛让我回到的学生时代,就像在上课前有没有预习的差别。没有预习的时候,上课只能跟着老师的思路走,漫无目的被牵着鼻子走,所获得的知识和思想也仅仅停留在表面,很容易随时间淡忘。有预习的时候,更多的是思想上的碰撞,看看哪些想法一样,哪些不一样,对那些不一样的地方,我们可以更加针对的深入思考。

工作当中也是一样,当我们遇到解决不了的问题时,在请教领导或同事之前,自己要有一些思路和想法,不能把问题直接推给别人。一是别人也很忙,从头缕一遍问题并找到解决方案要花费大量时间和精力;二是让别人知道你是一个负责任的人,即使无法解决问题也会积极思考。

对于决策层来说,他们需要的只是针对提议的决策,比如从两个方案中选一个方案。所以发现问题、梳理问题、设计问题解决方案这些工作就要下面的人来做。就像在饭馆点菜一样,如果直接把菜单递给对方,对方往往不知道点什么好,反而向对方提供两道招牌菜,让其从中选择,则会方便许多。

上面说的这些道理,我也仅仅是明白,生活和工作中还有很多地方做的不对不好,仍需努力。

数据库索引

当大家还是一个新人,在面试的时候都被问过什么是数据库索引,为什么要用数据库索引,索引是如何实现的等等一系列问题。
随便上网查一下就能得到上面一系列问题的答案。但是却总感觉对索引这个概念朦朦胧胧的,不是十分清晰和深刻,似乎没有抓住其中的实质。
就像我们虽然懂得很多道理,依旧过不好这一生一样,因为我们只是懂,并没有体会。

直到我看了一篇有关数据库的小文章之后,对索引大彻大悟。
现在让我们抛开所掌握的的数据库知识,如果让我们自己来实现一个数据库,应该怎样做呢。
首先我们知道数据需要保存在文件里。然后考虑为了方便读取,最好固定每条数据的长度,比如每条数据长800字节,那么第5条数据开始位置就在3200字节处。
现在我们要考虑查询的问题。我们根据主键查询数据,如果一条一条比对数据主键的话,查询的时间复杂度就是O(n),太慢太慢。
所以我们为了提高效率,如何来储存数据呢?树!我相信大家略懂数据结构和算法的话,对二叉树和B树都不陌生。B树每一层所存储的数据更多,所以可以减少硬盘读取次数,更加适合储存数据。
我这里就不细讲树的结构和特点了。
最后就要考虑这个问题了,我们刚刚根据主键建立的树,如果根据其他字段查找,又要遍历了。所以这时候我们可以用某个字段当做关键字建立一个树,储存其所在的物理位置。这便是索引了。
当然,数据库还应该有很多功能和特性,比如事务,表的连接,sql语言等等。我们这里就不继续讨论了。
我相信通过我引导的一步步走来,大家理解了索引的起源和初衷。就像看到一个小孩子一步步成长一样,一切都那么自然。不想突然去熟悉一个陌生人那般尴尬。至于索引的具体实现以及原理等等,大家可以查看其它文章,相信不再没有头绪。
知其然知其所以然。