`
ender
  • 浏览: 42767 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

抽象: 程序员必备的能力

阅读更多

抽象指的是从纷繁复杂的事物中提炼本质的过程,是一个具体到概念的过程, 例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。

在软件业,抽象能力的重要性怎么说都不为过,因为软件开发是一个高度复杂的智力活动,程序员经常需要面对、处理异常复杂的业务和逻辑,如果你不具备强大的 抽象能力,无法把具体变成概念,进而驾驭概念进行思考, 你就很难降低问题的复杂度,从而陷入泥潭,无法自拔。 无论你学会了多么强大的程序语言,你的编程能力也很难有质的提高。

当然抽象不仅仅是软件开发的独有概念,在别的领域可以看到更多,例如帝国经常提的“三. 个. 代. 表”,“和. 谐”(当然现在已经变成贬义词了),“中. 国. 梦” ,就是把 把执政理念和民众(或者利益集团)的诉求进行抽象,虽然实施的不怎么样。

在自然科学领域,抽象的例子更多,开普勒定律和万有引力就是很典型的例子。

在16世纪很多人开始相信哥白尼提出的日心说,但一直搞不清楚围绕太阳的行星到底是怎么运动的,轨道是什么样子,著名天文学家开普勒仔细的研究了他的老师 --杰出的观测家--第谷留下的大量天文观测数据以后, 提炼出了著名的开普勒三定律, 第一次给出了天体运行规律的解释:

1. 所有行星分别是在大小不同的椭圆轨道上运行
2. 在同样的时间里行星向径在轨道平面上所扫过的面积相等
3. 行星公转周期的平方与它同太阳距离的立方成正比

下图展示了第一定律和第二定律

开普勒三定律从大量的数据中提炼出数学规律, 无疑是非常伟大的发现和抽象, 但这不是最终本质,当然也不是最终的抽象。

行星运动的本质是万有引力定律。

相比于开普勒定律,天才的牛顿所做的抽象向前迈进了一大步,万有引力几乎覆盖了所有大质量物体之间互相吸引和运动的规律, 即简单又优美, 配合牛顿(和莱布尼茨)发明的微积分,可以很容易推导开普勒定律

F=G\frac{m_1m_2}{r^2}

如果再加上牛顿力学三定律,尤其是F=ma , 整个经典物理学的架子就建起来了,后人所有的工作只是在这座大厦上进行一些装修工作,直到爱因斯坦相对论的出现,才建立一座更宏伟的大厦。

插曲:据说爱因斯坦在评价一个研究时,会用美和丑来作为判断标准,有人拿研究成果让爱因斯坦看, 爱因斯坦不说成果的好与坏,反而说“这东西多丑陋啊”, “这东西真漂亮”。

其实一个抽象的东西形式优美,结构简单,很有可能是正确的,很可能抓住了事物的本质。

相反如果连形式都丑陋不堪,十有八九不是好的成果。 以此作为标准,万有引力定律无疑是漂亮的,正确的,当然爱因斯坦的E=mc2 更加漂亮和简单。

 

抽象的例子在软件业更是数不胜数:

Unix 把所有的设备都抽象成文件的概念,把程序之间的交互用抽象为“管道”。

Andorid 把一个移动应用程序抽象成Activity , Intent, Service,Provider。

Struts 把Web application的行为抽象成MVC 。

......

稍微注意一下就会发现,抽象层次越高,接口的语意就越模糊,适用的范围就越广,到最后就会变成数学模型或者概念:

数学模型和算法

我认为把纷杂的事物抽象到数学层面是最高的抽象,也许会有人会说哲学层面才是:-) ,但到数学层面已经非常难了。尤其是重大的科学发现,身后必然有数学的影子。

牛顿当年为了描述天体的轨道和运动,特别创立了新的数学表示: 微积分

麦克斯韦使用一组方程对电场和磁场行为进行描述

当年爱因斯坦脑海中已经有了广义相对论,但苦于找不到合适的数学形式来藐视,他特别花了几年的时间来学习非欧几何和张量分析,最后才得以成功。

海森堡用矩阵理论来解释量子力学

。。。。

回到软件行业,程序员在开发过程中, 也许能把一个实际的业务问题抽象成数学模型,或者抽象成特定的算法,这样会让程序实现变得非常简单和有趣。

我在之前的公司有幸遇到过一次,把针对税务领域的一个Credit, Debit等概念抽象为在一个二维坐标下点的运动, 问题一下子简化了很多,实现简单,并且非常安全可靠。

但是抽象成数学模型和算法通常是可遇而不可求的, 这种情况下,我通常会退而求其次,会试图抽象成若干个正交的概念,来降低复杂度。

正交

“正交”在数学上指的是线性无关,最常见的例子就是坐标系下的x 轴和y轴,对于一个点来讲,它的x值的变化不会影响到y,  y值得变化不会影响到x ,即x和y是正交的。

正交的威力在于互不影响,扩展方便,单用一个坐标轴可以表示一个直线上的所有的点, 再加一个y 轴就能表示平面上的所有的点, 再加一个z轴 3维空间中的所有点都能表示出来了!

我们人类的大脑在思考问题的时候是有容量限制的, 难以同时驾驭太多负责的概念, 如果我们的软件系统也能做成x,y,z 坐标这样,就带来了无与伦比的好处,你在处理x轴相关的事情时,不用考虑其他的y和z 相关的东西,因为你知道他们不会受到影响, 这样问题的复杂度就从3维一下子下降到1维!更容易把握了。

如果单单x 轴仍然很复杂,你要做的就是再次分解成更小的概念,保证正交即可。

接口

如果你说了,我的整个系统还没法抽象成正交的概念, 那只好再退一步,在局部使用接口。

在著名的《设计模式》一书中,其实在反复强调一点: 发现变化并且封装变化,针对接口编程而不是实现编程。 很多人看书是只关注具体的模式,而忽略了模式的本质目的。

我们在开发的过程中要保持一种敏锐的感觉,发现可能的变化并且封装起来,只提供一个精心定义的接口让外界调用。这样你在接口后面所做的任何变化,外边就不受影响了。

例如在JDK中Iterator 就是一个很好的抽象, 它将集合本身和集合的遍历分开。 Stream 抽象也不错,封装了对文件和网络操作,只是使用起来稍显麻烦。

其实 一组定义良好的接口一定是正交的,不然的话接口之间的依赖就会让实现非常麻烦。

总结

说到底,软件设计和开发就是把现实中的问题映射的计算机的语言实现,但现实问题太复杂,细节太多,而且在不断的变化过程中,一般人很难同时对这么的细节进行思考 ,这时候就需要抽象。

我们只有从纷繁复杂的现象中抽取事物的本质,从具体事物提炼出正交的概念,才能驾驭这些概念,才能在一个低复杂度的世界中进行思考。

抽象能力的高低,很大程度上反映了一个程序员的能力。

1
0
分享到:
评论

相关推荐

    1800个程序员必备词汇-开发必备-适用前后端-编程词汇-1800词40页高清完整版-带音标-右侧下载前可预览.pdf

    这份资料名为"1800个程序员必备词汇-开发必备-适用前后端-编程词汇-1800词40页高清完整版-带音标-右侧下载前可预览.pdf",是一份专为程序员设计的英语词汇手册,包含了大约1800个在软件开发中常用的词汇,并附带音标...

    程序员 必备 面试题 Accp 5.0 S2

    【程序员必备面试题Accp 5.0 S2】是一个针对程序员面试准备的资源集合,主要涵盖Java语言的相关知识。这个压缩包包含了多个文档,详细列出了不同领域的Java面试问题,帮助程序员提升技能并顺利通过面试。以下是这些...

    程序员必备手册,绿色无毒,小巧方便

    《程序员必备手册》是一份专为程序员设计的实用参考资料,其特点是绿色无毒、小巧方便,便于程序员在日常工作中快速查阅和学习。手册涵盖了C语言和C++的基础知识,是编程初学者和经验丰富的开发者不可或缺的工具。 ...

    疯狂Java:突破程序员基本功的16课2

    这些基础知识是任何程序员必备的,理解它们能够帮助开发者编写出结构清晰、逻辑严谨的代码。 接着,书中将详细讲解类与对象,这是面向对象编程的核心。读者将学习如何定义类,创建对象,理解类与对象之间的关系,...

    Java程序员必备面试题

    面试中,深入理解这些概念及其应用场景至关重要,因为它们反映了程序员对Java基础知识的掌握程度,以及在实际开发中的问题解决能力。例如,了解哪种数据结构适合哪种操作(ArrayList vs LinkedList),理解面向接口...

    Java程序员必备知识点

    ### Java程序员必备知识点 在IT领域,特别是软件开发行业中,Java作为一门强大的、广泛应用的编程语言,对于开发者来说掌握其核心知识点至关重要。本文将详细解析Java程序员必须掌握的关键知识点,包括数据结构、...

    java程序员必备——比较全的Java面试题

    【Java程序员必备——比较全的Java面试题】 Java编程语言作为全球最受欢迎的开发语言之一,其面试题库广泛且深入,涵盖了基础语法、面向对象、集合框架、多线程、网络编程、I/O流、数据库操作、设计模式等多个方面...

    初级程序员必备面试题.rar

    这份“初级程序员必备面试题.rar”资源,包含了针对初学者和求职者的Java基础面试题目,旨在帮助他们巩固知识,顺利通过面试。以下是这些面试题所涉及的一些核心Java知识点: 1. **Java语法基础**:面试题可能涵盖...

    葵花宝典 程序员必备的面试题目

    【程序员面试题目】是程序员在求职过程中需要面对的重要环节,这些题目旨在测试候选人的技术实力、问题解决能力以及对编程语言的理解。以下是基于题目描述和部分内容的一些关键知识点的详细解释: 1. **面向对象的...

    C++高级程序员必备教程

    面向对象编程是C++的核心,通过定义类来抽象数据和行为,实现代码的复用和模块化。继承允许创建派生类,从而扩展或修改基类的功能;多态则提供了不同类型的对象可以对同一消息做出不同响应的能力,增强了程序的灵活...

    Java 基础核心总结,初级程序员必备,面试必考

    - **类**:是具有相同属性和行为的对象的抽象描述。 - **对象**:类的一个实例。 - **构造方法**:用于初始化新创建的对象。 #### 继承 - Java中的继承机制允许一个类继承另一个类的属性和方法。 - 关键字`extends`...

    JAVA程序员常用英语.pdf

    JAVA程序员常用英语是Java程序员必备的英语知识,涵盖了Java语言的基本概念、编程术语、常用单词和短语等内容。以下是Java常用英语知识点总结: 一、基本概念 * abstract:抽象 * array:数组 * arithmetic:算法 ...

    java面试题-后端程序员必备-框架-大厂面试准备.docx

    Java 后端程序员在面试中可能会遇到的问题涵盖了多个核心领域,包括面向对象编程的基本原则、数据类型、类和对象的封装、多态性、字符串处理、异常处理、集合...同时,项目经验和问题解决能力也是面试官关注的重点。

    2006年上半年程序员试题

    7. **问题解决能力**:试题往往包含一些实际问题的模拟,测试程序员分析问题、抽象问题、设计解决方案的能力。这是评价程序员综合素质的重要指标。 通过这份2006年的试题,我们可以看到当时的编程行业更注重基础...

    统计思维——程序员数学只概率统计

    在当今的数据驱动时代,概率统计已经成为程序员和计算机科学专业学生的必备技能之一。《统计思维:程序员数学之概率统计》一书由Allen B. Downey撰写,旨在通过编程的方式教授概率统计的基本概念和技术。不同于传统...

    高薪程序员必备刷题软件-atoms-uboot:原子uboot

    《高薪程序员必备刷题软件——atoms-uboot:原子级理解与实战》 在IT行业中,不断提升自己的技能是获取高薪的关键。特别是在系统开发领域,深入理解和掌握基础工具至关重要。"atoms-uboot"是一个专门为程序员设计的...

    程序员历年真题(200405-201011)

    2. **算法与数据结构**:理解和运用常见的排序算法(如冒泡排序、快速排序、归并排序)和查找算法(如线性查找、二分查找),以及链表、栈、队列、树(如二叉树、平衡树)和图等基本数据结构,是程序员必备的技能。...

    做好程序员的要求

    8. **培养解决问题的能力**:面对复杂多变的问题情境时,具备快速定位问题根源、寻找解决方案的能力是程序员必备素质之一。 - **举例**:遇到程序运行异常时,通过调试工具逐步排查可能存在的问题点。 #### 九、...

    狂人C-程序员入门必备

    本书《狂人C-程序员入门必备》的定位非常清晰,它不仅仅面向初学者,也针对有基础的程序员,旨在解决中国C语言教育中存在的常见问题,并以通俗易懂的方式引导读者掌握C语言编程。 首先,C语言被描述为一种强大、...

    像程序员一样思考pdf

    编程领域日新月异,保持学习热情和自我更新的能力是程序员必备的素质。书中提到了一些学习资源和社区,以帮助读者持续提升自己。 总之,《像程序员一样思考》是一本全面介绍程序员思维方式和工作方法的书籍,无论你...

Global site tag (gtag.js) - Google Analytics