抽象:程序员必备的能力

人工智能都可以写代码了,程序员怎么做才能不被时代淘汰? 随着技术的发展,人工智能在我们生活中扮演着越来越重要的角色。管理、维修以及监视等需要人力的工作在联网设备中都逐渐转向自动化运行。越来越多的企业乃至编程人员,开始利用AI辅助软件开发流程——软件开发人员能够利用AI工具,编写并审查代码、检测bug、测试软件甚至优化开发项目。在这个时代,如果你没有过硬的本领,不仅会面临着与他人的激烈竞争,而且在不久的将来,还有可能被人工智能抢走工作。 不久的将来,我们的工作和生活将会迎来一场新的技术革命。物联网、数据分析、以及人工智能这三大技术之间的合作将会在世界上创造出一个 阅读详情

2015年大热的动画片《动脑特工队》中描述了这么一个场景, 冰棒带领乐乐和忧忧抄近路去乘坐思维列车,所谓的“近路”就是穿过抽象思维的房间,在这个房间里, 他们先是变成了变成3D的块,就像计算机图形学里展示的那样: 

0?wx_fmt=jpeg

0?wx_fmt=jpeg

然后变成平面的图形

0?wx_fmt=jpeg

最后只剩下一些线条了 !

0?wx_fmt=jpeg

真是非常生动的展示了人类做抽象活动的过程。 


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

无论你学会了多么强大的程序语言,你的编程能力也很难有质的提高。


当然抽象不仅仅是软件开发的独有概念,在别的领域可以看到更多,例如帝国经常提的“三. 个. 代. 表”,“和. 谐”(当然现在已经变成贬义词了),“中. 国. 梦” ,就是把执政理念和民众的诉求进行抽象,当然实施的效果如何就留给大家评说了。


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


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


1. 所有行星分别是在大小不同的椭圆轨道上运行

2. 在同样的时间里行星向径在轨道平面上所扫过的面积相等

3. 行星公转周期的平方与它同太阳距离的立方成正比

0?wx_fmt=jpeg

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


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


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

0?wx_fmt=png

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


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


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


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


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


文件是对I/O的抽象; 

虚拟存储器是对物理存储器的抽象;

 进程是对一个正在运行的程序的抽象;

 我们再增加一个新的抽象:虚拟机, 他提供了对整个计算机(包括操作系统,处理器,程序)的抽象。


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

...... 

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

数学模型和算法

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


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


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


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


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

。。。。


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


我在之前的公司有幸遇到过一次,把针对税务领域的一个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 抽象也不错,封装了对文件和网络操作,只是使用起来稍显麻烦。


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


总结

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


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


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

0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

基于deepseek+dify+达梦实现自然语言查询数据库 自然语言查询数据库信息 阅读详情

相关推荐

COMSOL相场法模拟枝晶生长:溶质偏析模型搭建全流程

凝固过程中枝晶形貌与溶质偏析直接决定铸件微观组织与力学性能,是材料加工领域长期关注的核心问题。相场法凭借弥散界面描述天然处理拓扑演化,成为模拟枝晶生长的主流数值方法,而通用有限元平台COMSOL为自定义偏微分方程求解提供了高度灵活的实现路径。从热力学驱动、界面各向异性到溶质再分配,模型需准确耦合相场方程与浓度扩散方程,才能在二元合金凝固模拟中还原真实枝晶尖端速度、二次臂形貌及界面富集行为。围绕溶质偏析这一关键变量,建模过程涉及无量纲化参数标定、反溶质截留项配置、分离式求解器与网格各向异性控制等核心细节。该方

weixin_30402231的博客 308

程序员关键能力之一——抽象

激光与金鱼有什么共同之处? ——它们都不会唱歌。 “横看成岭侧成峰”,苏轼的这句诗是对“抽象”的最好隐喻。对同一个事物,你看待它的视角不同,就会呈现不同的面貌。每一个视角,代表该事物某一个维度的抽象。如果你觉得这个“抽象”的概念很“抽象”,我以汽车为例子来进行说明。 一辆汽车,在汽车厂里制...

chuanzunpi2758的博客 358

13个GNS3 3.0.5 appliances设备模板镜像合集:IOSv/L2,IOU L2/L3,以及IOS-XE

13个GNS3 appliances设备模板:IOSv/L2,IOU L2/L3,以及IOS-XE合集

haierccc的博客 1072

浅谈C# 抽象类和抽象方法

抽象类和抽象方法是面向对象编程中实现代码重用和多态性的重要工具。抽象类是一种不能被实例化的类,它通常包含至少一个抽象方法。抽象方法是一种没有实现体的方法,它必须在派生类中被重写和实现。

a876106354的博客 813

ArcGIS Pro中协同区位熵方法在商业选址分析中的应用

本文详细介绍了如何利用ArcGIS Pro中的协同区位熵方法进行科学的商业选址分析。该方法通过量化目标客户与竞争对手在空间上的关联程度,精准识别市场空白区与竞争红海,帮助决策者从“凭感觉”转向“用数据说话”,有效提升选址成功率和投资回报。

weixin_29214559的博客 359

PTA-浙大版 《Python程序设计》 第三章编程题目及答案

博主第一次写优快云的博客,所以排版上可能有些不尽人意,代码部分均为自己的思路,可能复杂或者考虑欠妥,欢迎大家一起讨论~ 第一题:大于身高的平均值 这里用了np数组求得平均数,当然for循环累加也是可以的 import numpy as np data = input().split() data = list(map(int,data)) avg = np.mean(data) for i in data: if i > avg: print(i,end = '

Legendwqs的博客 1万+

第1章 对象导论

第1章 对象导论      “我们之所以将自然办分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来......除非赞成这个协定中规定的有关语言信息的组织和分类,否则我们根本无法交谈。”

pasken的专栏 793

汇川AM系列PLC玩转CNC:手把手教你用File模式读取G代码文件(附避坑指南)

本文详细介绍了如何使用汇川AM系列PLC的File模式读取G代码文件,涵盖从CAD设计到PLC配置的全流程。特别针对路径格式、文件类型等常见问题提供避坑指南,帮助工程师快速实现CNC加工的自动化控制。

weixin_33582311的博客 406

【C++面向对象编程】四大基本特性之四:抽象

在C++面向对象编程中,抽象(Abstraction)是四大基本特性(封装、继承、多态、抽象)之一,它允许我们关注对象的高层逻辑,而隐藏复杂的实现细节。抽象通过定义抽象类和接口来实现,这些类和接口只暴露必要的操作,而将具体的实现细节隐藏起来。

byte轻骑兵的技术小窝 2549

从理论到实践:笛卡尔空间阻抗控制的实现挑战与变体解析

本文深入探讨了笛卡尔空间阻抗控制的核心原理、工程实现中的五大挑战及经典变体实战解析。通过详细的数学建模和实际案例分析,揭示了阻抗控制在工业机器人、医疗设备等领域的应用价值,特别是在力感知精度、动力学模型校准和实时计算等方面的关键技术突破。

weixin_30952535的博客 449

2.数字芯片时序正确的前提—Max-transition

芯片物理设计中最基本的Max-transition检查

weixin_43868998的博客 5426

抽象类程序设计

1.了解抽象类的概念、特征、作用 2.掌握抽象类的使用 3.掌握向上转型的用法

m0_67339008的博客 443

(3万字深度解析)Kaggle《房价预测:高级回归技巧》详解复现攻略

在这篇教程式文章中,我们从零开始完成了 Kaggle《房价预测:高级回归技巧》比赛的复现工作,涵盖了数据预处理、特征工程、模型训练、调优、解释和融合的完整流程。深入理解数据:阅读数据描述,结合常识对每个特征作出合理处理(如缺失值填充’None’表示无此设施 、异常值剔除 等)。对目标和偏态特征进行对数变换,使分布更平滑,从而更好满足模型假设并提升准确度。特征工程:我们创造了总面积、总浴室等新特征,整合信息提高模型可学习性。

qq_38334677的博客 1771

程序员必备的思维能力:抽象思维

若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇抽象思维是我们工程师最重要的思维能力。因为软件技术 本质上就是一门抽象的艺术。我们的工作是存思维...

我的新书《代码精进之路:从码农到工匠》 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

抽象: 程序员必备的能力

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

Be yourself and Beyond yourself 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

优秀程序员必备的四项能力

来自:码海前言 一个优秀的程序员具备挺多特质的,比如好奇心,学习能力等,但在我看来一个优秀的程序员必须具备四项核心能力,哪四项,先卖个关子,程序员最喜欢说的话是「Talk is Chea...

架构师小秘圈 492

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

程序员应该具备的能力

1. 编程语言能力 不用多说,作为合格的计算机程序员,精通一门语言是必须的。这种精通,不是说看了一本编程宝典,抄了几个程序就能说精通的,要靠长时间的积累。 2.编码能力 我曾经看很多程序员写的代码,在同一个jsp或者java源文件里,出现了三种以上的对方法的命名方式,有下划线间隔的,有全大写的,有拼音首字母的。就 像一个菜市场,杂乱无比,估计10天后,他自己都无法看的...

weixin_30851867的博客 82

从一个面试题看程序员的几项基本功

点击上方蓝字设为星标下面开始今天的学习~前言一个优秀的程序员具备挺多特质的,比如好奇心,学习能力等,但在我看来一个优秀的程序员必须具备几项核心能力,哪几项,先卖个关子,程序员最喜欢说的话...

zandaoguang的博客 344

架构师必备核心能力:抽象能力

架构的核心是管理复杂度,架构师的核心能力是抽象能力。什么是抽象能力?抽象能力就是一种化繁为简的能力。何为化繁为简?就是把一种复杂的事情变得简单的能力,比如通过打比喻让别人很容易听明白你说的意思就是一种抽象能力。如何锻炼抽象能力?我觉得有三种方法:第一种是用归纳法找共性,从多个问题中找到共同的问题提炼通用解决方案,去其糟粕取其精华。第二种通过演绎法找关系,从多个问题中找关系,把多个问题串成一个问题,系统化解决问题!第三种是通过归纳法找特性。

无休居士的博客 1086

六石编程学:略谈抽象能力

  离开抽象能力,人是无法生活的。比如说,人就是一种抽象的概念。现代数学的抽象更是到了难以想象的地步。   同样的,要搞好软件,也必须有抽象能力。现实是,大多数人抽象能力很差,甚至不会抽象。这方面应该有意识的学习才对。那么抽象能力有哪些方面呢? 分类能力   这个是相似中找区别。吾近来研究标点压缩,很快就提出了一级压缩、二级压缩的概念。 统一能力   统一能力,就是我们通常据说的抽象能力。就是一些相似的东西,找出共性,抽象出一个虚类。比如说,标点压缩就是调整坐标,于是吾抽象出调整坐标的概念:一级压缩,

柳鲲鹏 839
上一篇: Javascript:一个屌丝的逆袭
下一篇: 15年编程生涯,资深架构师总结的7条经验
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值