数据结构应该教会我们什么?

前言

数据结构作为大学计算机相关专业的最基础的课程之一,我相信很多软件开发的从业者都能够列举一些具体的数据结构,比如栈、链表,树,图等。

但它对我们实际的开发过程有什么用呢?可能很多人都会说,没有太大用处,数据结构中学的东西,工作中基本都用不到。

之所以有这样结论,在笔者看来,是因为我们只学会了数据结构交给的我们的术,而没有学会其背后更本质的道。

我们的现状

在很多的软件开发过程中,说实话,数据结构并不是一门必须要掌握的技能,因为很多的软件开发,并不需要什么高深的技术,直接想到哪儿,写到哪儿,错了就改,然后功能就实现了,看起来也没有什么问题。

特别对于现在的动态类型语言来说,编写代码更加的容易了,不需要关心类型,随心所欲写就行了,只要不报错,只要看起来实现了我们想要的东西,就OK了,极大的降低了写代码的门槛。

但作为一个有追求的工程师,我想很多人还是不想就这样的,因为这样,即便工作十年,也只是熟练度的提升,多掌握了几个语言,本质并没有变化。

那怎样才能在本质上有所改变呢?

数据结构的本质

笔者认为,要要在本质上所有改变,我们需要首先理解数据结构的本质,它的道,然后不断的思考而训练。

数据结构的本质不应该是栈、链表这些具体的东西,它的本质应该是抽象和重组,如何通过结构化的思维抽象现实世界,将它们变成一个一个独立的基本单元,然后通过重组,然后组成一个高效的系统。

数据结构应该教会我们通过结构化思维进行抽象和重组的能力。

每当我们拿到一个需求,我们应该在全面理解的这个需求的情况下,进行合理的抽象,将其抽象成若干个相互独立而又相互关联的数据结构,然后组合起来,加上一些方法调用的交互,最终实现需求。

注意,我们这里没有使用面向对象进行说明,因为对象只是抽象的呈现一种方式。

越复杂的系统,抽象越发重要,良好的抽象能够化繁为简,让整个系统的行为更容易预测,更容易维护。一个经过良好抽象的系统和一个没有抽象的系统,维护起来,不是一倍两倍的差距,而是十倍百倍和能与不能的差距。

如何做好抽象

对同一个东西,水平不同的人能够不同的抽象,他们的差别是数量级的。最差的就是没有抽象,靠蛮力;最好的就是抽象合理,不多不少,简洁优雅。

对于高水平的来看,前者一团乱麻,不知所云,后者是一首优美的诗,简洁优雅。

抽象需要透过事物的表面看本质,即便表现完全不一样的东西,其本质可能是一样的。

抽象能力的获取都没有捷径,我们只能在遇到任何需求和事物的时候,多一层思考,不断的实践和应用。

当然在思考的核心之后,我们可以多看看优秀开源软件的设计,看他们的如何思考和解决问题的(注意不是浮于表面,而是要理解为什么),站在巨人的肩膀上肯定比自己从零探索快很多。

获得的好处

软件开发的核心是管理复杂度,当我们有了足够好的抽象之后,单元之间的就能够更容易的组合起来,单元与单元之前形成一个有机的整体,带来的结果是就复杂度的简化,更清晰的逻辑,更好的代码可维护性。

其次是对个人的,当一个人具备这样的能力时,无论技术上还是非技术上,他的成长会更快,能够获取更多更本质的东西,能够从更底层的维度看一个系统、一个产品、甚至人生。