写给初学者:编程的本质

article/2025/9/21 14:57:46

俗话说,开卷有益, 前几天又翻了下《计算机程序的构造和解释》,看到一个采用牛顿法求平方根的例子,产生了点新的感想,和大家分享下。

平方根的数学定义是这样的,对于一个数x , 如果有另外一个数r,  r大于等于0 ,并且r 的平方等于x , 那 r 就是 x的平方根。

这个定义描述了平方根的一般性事实,但是这是一个声明性的描述,并没有告诉我们一个具体的计算过程。 假设我们要写一个程序,给定一个数x , 怎么求得它的平方根呢?

初学者可能会觉得, 我可以写个这样的程序啊:

square_root( x ){

    找到一个r ,确保 r的平方等于 x

    返回r

}

但是这个函数一点用都没有,只不过把原来的问题给重新描述了一遍而已。

如果有一个这样的编程语言,程序员会非常高兴: 我们可以用声明性的方式来写程序了!只需要告诉计算机说,找到一个r ,使得r的平方等于输入x 即可。

但是在当前的计算机体系下面, 这是绝对不可能的,计算机是个笨家伙,它只能按照人类的告诉他的指令一步步的工作, 它突出的优势只是运行得比较快而已。

程序员必须要告诉计算机到底该怎么做,怎么去找到那个r, 第一步怎么做,第二步怎么做。。。。。什么时候结束。

针对于求平方根的例子, 程序员需要找到一个算法,然后把这个算法的步骤和计算过程用计算机语言描述出来,形成计算机指令。

这个计算过程大概长这个样子:

先猜测r = 1 , 判断r 的平方和x 是不是非常接近(例如相差0.0001)

如果不接近,让 r = (r+x/r) / 2, 继续判断r的平方 与 x 是不是非常接近

如果不接近, 继续让 r = (r+x/r)/2 。。。。。

对于 x =2 , 其计算过程如下:

0?wx_fmt=png

很明显,这是一个逐渐逼近的过程,计算的次数越多,越逼近真正的平方根。

改写为编程语言描述:

0?wx_fmt=png

请暂停阅读10秒钟, 仔细体会上述的计算过程,它和之前声明性描述有什么区别。

一个描述平方根是什么, 另外一个描述求平方根计算机具体怎么做。

无论多么复杂的程序,无论的前端之王javascript , 还是后端的java ,无论是面向过程的还是面向对象的,最终的做的同样的事情:把用户描述的需求(通常是声明式的)变成计算机可以理解,可以运算的步骤。

“是什么” 和 “怎么做”之间有着巨大的鸿沟,这个鸿沟就需要程序员的大脑去填补。 求平方根是个非常单纯的例子,已经有数学家们想好了具体的计算办法, 程序员翻译一下,变成计算机语言就行。

现实中这样的好事儿是不多的, 比如说你们公司要搞个社交化的促销: 用户连续x天转发某个活动到朋友圈就可以获得奖品, 转发的有效时间是早上9点至晚上10点, 同一天转发多次只算一次。

在实现上你首先得记录用户什么时间转发的,然后对转发时间排个序,过滤掉那些无效的转发,计算这些用户的转发时间没有连续性, 连续的天数到了指定的数值没有。 ---  这就不存在现成的算法,程序员需要自己想出计算的步骤,然后用代码实现。

可以看出,这不需要高深的数学知识,就是找到一个合适的算法和数据结构来描述它,这是编程最最基本的能力。

对于小白来说, 通过自学和培训,可能很快学会一个语言的使用, 可是基本能力不加强,早晚要吃亏的。最突出的表现是给他一个很简单的业务,他花了很长时间才写出一个漏洞百出的版本。

随着业务越来越复杂,一个领域的问题会和其他领域的问题交织纠缠在一起,让复杂度大大增加,简单的一个或几个算法和数据结构是搞不定的,  这时候必须得用一些辅助的手段才能解决,比如使用封装、分层、模式、分布式等等, 这是属于另外一个维度的设计能力了, 这种能力和编程语言都没有关系。

初学者完全可以先学会编程语言和框架,先具备工作能力,然后必须加强数据结构和算法的训练,随着经验的积累,慢慢地扩展到设计和架构层面。

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华》

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


码农翻身

用故事讲述技术

0.jpeg


http://chatgpt.dhexx.cn/article/mPYbvmfQ.shtml

相关文章

码农翻身全年文章精华

在码农翻身公众号写了一年多, 最大的体会就是:原创真心不易! 每天思考的最大问题就是: 下一篇文章写啥? 在大家的支持和鼓励下,还是坚持了下来, 回头看看走过的路,这一年过得还算…

如何还原保存的训练模型

训练模型的还原 之前把训练模型存盘,实际上保存的是模型里所有变量当前运行的值。这相当于是训练模型的快照,把保存的时间点的所有变量都变成存盘文件保存起来。如果要还原这个模型,我们需要从存盘的模型中把所有变量的值读取出来&#xff0…

VisionPro 9.5中的工具调用和工具组(ToolBlock)调用

VisionPro是Cognex的机器视觉算法软件,通常的做法是使用VS做二次开发。 这里主要分享VisionPro中通过ToolBlock实现一个视觉检测,以及通过调用单个Tool实现一个视觉检测。 最终实现一个硬币数量检测以及坐标位置输出的应用: 使用ToolBlock的…

未能找到任何适合于指定的区域性或非特定区域性的资源

未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“WindowsFormsDemo.UnifiedConfigListControl.resources”正确嵌入或链接到程序集“设备配置助手”,或者确保所有需要的附属程序集都可加载并已进行了完全签名 之前写过一篇这个问题&…

超强Video深度学习开源工具集,来了!

01 导读 广大人工智能算法工程师,有没有感觉到近几年AI程序员数量激增,公司新来的程序员也可以轻松实现图像分类、目标检测等基本深度学习任务,资深算法工程师岗位如何自保?广大内容平台的后台开发者,视频理解&a…

opencv上设置摄像头曝光参数的经验

实际应用中我们需要调整摄像头的参数比如曝光,由于opencv的后端是一般编译是支撑多种插件,详细信息请参考OpenCV: Video I/O with OpenCV Overview,这里引用里面的图: 对于VideoCaputure,后端有ffmpge,V4L&…

VS 配置 openCV 、Python 、Pytorch

VS 配置 openCV 和 Python 1、VS配置opencv1.1 系统环境PATH增加1.2 复制到Sysmtem32下1.3 配置项目1.3.1 包含目录添加1.3.2 库目录添加1.3.3 附加属性依赖项 2、VS配置Python2.1 复制include和libs文件夹复制到vs项目路径下面2.2将你需要调用的python脚本也存放在该目录下面2…

做机器视觉哪个软件好?

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 机器人视觉有接触,但是不多,这里我推荐一下一个详细介绍的视觉软件。 在构建机器视觉系统时,开发人员可以选择众多知名公司的商用软件…

康耐视Visionpro脚本编写教程一

theme: github ​本文已参与「新人创作礼」活动,一起开启掘金创作之路。 康耐视visionpro脚本编写 visionpro目前来说在工业中的应用时非常的广泛的,而且作为苹果手机厂指定的视觉厂家来说,他的实力是毋庸置疑的。 康耐视VisionPro的优势&…

visionpro联合c#二次开发二

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 本次康耐视联合C#文档是最后一篇visionpro与C#联合的文章,后续我们将开始c#与halcon的编写或者vidi的文章。 首先我们定义所需要的变量 //定义作业CogToolBlock job;//定义作业VPP的路径string p…

Visionpro联合c#二次开发

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 本文已参与「新人创作礼」活动,一起开启掘金创作之路。 本次文章将会在最近半个月一直出关于康耐视的软件的应用的介绍,前期先是vp, 后续如果大家有兴趣,也会…

Segmentation-Based Deep-Learning Approach for Surface-Defect Detection-论文阅读笔记

Segmentation-Based Deep-Learning Approach for Surface-Defect Detection 基于分割的表面缺陷深度学习检测方法 //2022.7.20下午12:49开始阅读笔记 论文速览 文中提出了一个基于分割的两阶段的表面缺陷检测方法。第一阶段包括在缺陷的像素级标签上训练的分割网络&…

论文阅读:Segmentation-Based Deep-Learning Approach for Surface-Defect Detection

PDF\CODE 基于深度学习分割的表面缺陷检测 Domen Tabernik(domen.tabernik@fri.uni-lj.si); Samo Šela; Jure Skvar; Danijel Skoaj(danijel.skocaj@fri.uni-lj.si) part of Springer Nature 2019 摘要:基于机器学习的表面缺陷自动检测已经成为一个有趣且有发展…

Segmentation-based deep-learning approach for surface-defectdetection(基于分割的表面缺陷深度学习检测方法)

论文地址:https://arxiv.org/abs/1903.08536v3 摘要 基于机器学习的表面异常自动检测已经成为一个有趣且有前途的研究领域,对视觉检测的应用领域有着非常直接的影响。深度学习方法已经成为完成这项任务最合适的方法。它们允许检查系统学习通过简单地显示…

康耐视Designer,VisionPro和ViDi匹配版本兼容-关于外观缺陷检测中肯的建议与评价

海康visionmaster-颜色区分任意选 ​康耐视VisionPro传统检测对缺陷类检测很差,差到不能用。单靠康耐视VisionPro深度学习VIDI,据视觉人粉丝很多大厂反馈,现场项目落地的可能性降低不低于20%。 缺陷检测建议:多软件融合使用&#…

veni vidi vici密钥我的生日ACIGS解密_25人在同一天生日!男女比例又是多少?阳光新生大数据来了!...

2020年 阳光学院共迎来了3884名 活力四射、意气风发的 本科生小萌新 阳光招办带你 一起解密 新生大数据~ 准备好了吗? GO! 2020级普本新生2489人, 专升本新生1395人, 他们分别来自五湖四海,快来找找老乡吧~ 世界那么大,还是遇见你~ 相聚是一种妙不可言的缘分~ 2020级阳光…

vidi深度学习图像处理软件2.1

有需要这个软件的,请加我的QQ7299789 VIDI 提供了第一款基于工业图像分析的深度学习软件。VIDI Suite基于最先进的机器学习算法,是一款优化可靠的可现场测试的软件解决方案。它可以完成检测与分类的编程中不可能完成的挑战。这为不少具有挑…

Insight ViDi系列相机 FTP存图

一、测试说明 标题发现问题:使用In-Sight Vision Suite这个软件设置FTP存图,不能像In-Sight Explorer一样,设置各本地路径就可以直接存图。 相机软件:In-Sight Vision Suite(22.3.0) 电脑本地IP&#xff1…

康耐视深度学习ViDi界面介绍-选项菜单

海康机器视觉Visionmaster-距离与角度测量 选项菜单 Workspace ----------- 程序操作的菜单项 Tool ------------------- 工具操作的菜单项 Database ------------ 数据库操作的菜单项 View ------------------ 特征标注操作的菜单项 Plugins --------------- 插件信息显示菜单…

深度学习康耐视ViDi如何添加工具

在建立好一个Workspace后,会出现一个 图标 点击该图标的加号,即可显示可用的工具。 点击需要添加的工具,即可完成工具的添加