写给初学者:编程的本质

java8rt.jar源码-coderfun:《码农翻身》笔记 java8 rt.jar源码 coderfun 码农翻身笔记 1 计算机的世界你不懂 地址的动态重定位 多进程下为了解决内存地址覆盖的问题,需要记录每个程序的起始地址(基址寄存器),遇到与地址有关的指令,都要把地址加上基址寄存器的值,才是真实地址 分时系统 如果一个进程耗时很长,必须让出CPU去执行其他程序,CPU需要把时间分成一个个时间片,让操作系统调度处理 分块装入内存 很多程序都想进入内存,然而内存容量毕竟有限 时间局部性原理 如果访问了一个内存位置,很快还会再次访问,如果某数据被访问,很快还会再次被访问 空间局部性原理 如果访问了一个存储单元,很快附近的存储单元也可能被访问 页框 将程序分成一个个小块4KB,大部分时间只会运行几个页框 虚拟内存 可以给每个程序提供超级大的空间,只是这个空间是虚拟的,程序中的指令使用的就是这些虚拟地址,CPU的MMU再将它们映射到真实的物理内存地址,而程序本身浑然不觉,虚拟内存也要分块装入,每一块即页的大小和物理内存页框一样,方便映射 分段 每个程序都可以分为代码段,数据段,堆栈段,操作系统记录每个段的起始和结束地址,以及每个段的保护位,在段的内 立即下载

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

平方根的数学定义是这样的,对于一个数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

同济大学C++mooc第五、六讲参考答案 同济大学C++moooc第5、6讲 第五讲 第一题 随机产生10个30~100(包括30,100)的正整数,求它们的最大值、最小值、平均值,并显示整个数组的值和结果。 代码片. // #include<iostream> const int n = 10; using namespace std; int main() { int s[n],i,j,t,sum=0; for (i = 0; i < n; i++) 阅读详情

相关推荐

高光谱图像处理和分析软件(包含雷尼绍Renishaw wdf 文件导入解析功能)

是一款基于微软windows操作系统的多传感器成像工具,用于处理和分析高光谱图像。它是一个模块化的系统,由一个基本的引擎,一个图形用户界面,一个化学计量工具箱和可选的用户提供的模块组成。它支持最重要的光谱成像技术,如UV/Vis、红外、拉曼、太赫兹、光发射/吸收和质谱。除此之外,还允许用户将高光谱图像与物理属性图和传统高分辨率彩色照片合并在一起 链接:https://pan.baidu.com/s/1ruQ5YSh5_ZS9wx_V3Q5Oow 提取码:qdx0 ...

业余程序员小徐的博客 8073

编程的本质是什么?

如果对计算机本身进行抽象,那软件就会以机器代码或汇编语言的形式呈现。如果对计算处理逻辑进行抽象,那软件就会以非结构化的高级语言呈现,比如 Basic。如果对问题领域过程进行抽象,那软件就会以结构化的高级语言呈现,比如 C。如果对问题领域元素进行抽象,那软件就会以面向对象程序设计语言呈现,比如 Java。也就是说,

2201_75362610的博客 680

物理学建模及仿真平台Chrono安装

Chrono是一个基于物理学的建模和仿真基础设施,它是在C++中实现的独立于平台的开源设计。一个projectchrono库可以嵌入到一个软件项目中,例如在可变形地形上运行的轮式和履带式车辆、机器人、机械电子系统、顺应性机构和流体固体相互作用现象。系统可以由刚性和柔性/顺应性部件组成,并带有约束、电机和接触;部件可以具有三维形状,以便进行碰撞检测。然而安装还是出现了一些问题,所以在此总结。已经装好visual studio。

Already8888的博客 6501

编程的本质

程序的本质就是数据和函数,编程就是编写不同函数处理数据;对于函数加法,函数内部计算过程,函数的互相调用有了认识。

自己初始的学习过程 707

ASM磁盘通过rebalance迁移

一、实施要点: 1、数据迁移前,如果库不大,最好全库备份一次 2、进行数据平衡时,数据磁盘是添加到现有磁盘组,而不是重新建一个磁盘组 3、本次实施过程,服务器只有1张HBA卡,本次实施先取消原有的多路径,只保留旧有存储单路径,另一个FC口插上新存储的路径。待迁移完成后,再配置新存储的多路径 二、实施步骤 1.查询并配置ASM磁盘 [root@rac1 ~]# /sbin/scsi_id...

qq_40673916的博客 1374

VMware 虚拟机里连不上网的五种解决方案

在VMware虚拟机里的虚拟机系统连接不上网络 首先,注意查看适配器选项里的网络连接这两个网络连接是否存在,如果不存在可以重新装一下VM 如果存在,连不上网 解决办法一: 虚拟机设置里,找到“网络适配器”,右边的网络连接选择“NAT 模式”,如果不行的话再linux系统。还是不行的话接着看第二种解决方案。 解决方法二: 可能原因是VMware NET Service...

墨轩 18万+

一切编程语言的本质

C语言作为系统编程语言,本质上是硬件与应用间的抽象层。文章从底层硬件(字节、寄存器、指令)到C语言基本要素(类型、指针、函数),再到组合数据结构(数组、结构体、链表),最后到系统抽象(内存管理、文件、进程),揭示了计算机系统自底而上的构建逻辑。核心观点是:所有复杂系统都源于基本元素(内存、寄存器、指令)的递归组合,不同抽象层级间不存在"魔法",完全遵循显式的组合规则。这种分层理解方式有助于开发者建立清晰的系统认知框架。

ikarusuraki的博客 394

移远EC20模块USB模式切换的底层逻辑与驱动适配探秘

本文深入探讨了移远EC20模块USB模式切换的底层逻辑与驱动适配机制,详细解析了AT命令控制下的USB0与WWAN0模式差异。通过分析USB协议栈、内核驱动框架及网络子系统的交互,提供了模式切换的完整操作流程和常见问题解决方案,助力开发者优化4G通信模块在嵌入式设备中的稳定连接。

cc789的博客 845

码农翻身——写给初学者:编程的本质

俗话说,开卷有益, 前几天又翻了下《计算机程序的构造和解释》,看到一个采用牛顿法求平方根的例子,产生了点新的感想,和大家分享下。 平方根的数学定义是这样的,对于一个数x , 如果有另外一个数r,  r大于等于0 ,并且r 的平方等于x , 那 r 就是 x的平方根。 这个定义描述了平方根的一般性事实,但是这是一个声明性的描述,并没有告诉我们一个具体的计算过程。 假设我们要写一个程序,给定一个数...

u012510849的专栏 925

YOLOv11低照度增强主干网络PE-YOLO:原理与完整实现教程

编码器部分# 解码器部分self.dec_conv2 = nn.Conv2d(512, 128, 3, padding=1) # 跳跃连接self.dec_conv3 = nn.Conv2d(256, 64, 3, padding=1) # 跳跃连接self.dec_conv4 = nn.Conv2d(128, 32, 3, padding=1) # 跳跃连接# 编码路径# 解码路径(带跳跃连接)

FJN110的博客 727

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7434

写给初学者的Jetpack Compose教程,基础控件和布局

大家好,写给初学者的Jetpack Compose教程又更新了。准确来说,这才是本系列的第一篇文章。因为上篇文章只是个序篇,和大家聊一聊为什么我们要学习Compose。Compose的知识体系很庞大,因此这个系列教程可能我会写很多篇。当然我并不是什么Compose高手,目前我也是个初学者。本教程实质上就是我在自我学习Compose的同时,将这些学习记录分享给大家,希望大家可以零基础跟着我一起学习。Compose是一个用于替代Android View的全新声明式UI框架。既然是UI框架,因此我们第一篇文章就来

郭霖的专栏 5万+

2025华为OD面试手撕代码真题目录、八股文真题目录以及面试技巧

1. **华为OD面试技术面准备指南** 2. **华为OD面试技术面常见问题解答** 3. **华为OD面试技术面经验分享** 4. **华为OD面试技术面注意事项** 5. **华为OD面试技术面攻略** 6. **华为OD面试技术面模拟题目与解析** 7. **华为OD面试技术面知识点梳理** 8. **华为OD面试技术面常考**

算法大师! 3万+

写给初学者的Jetpack Compose教程,Modifier

其实在上一篇文章中,有个知识点一直在反复出现,但是我却一直没有讲解,那就是Modifier。之所以没有讲,是因为这个东西太重要了,需要单独用一篇文章来讲解才行。 只要你使用了Compose,那么就一定绕不开Modifier。甚至可以说,任何一个Composable函数都应该有一个Modifier参数才对,如果没有的话,那么就说明这个Composable函数写的有问题。 我在刚开始学习Compose的时候,对Modifier的用法和场景一直存在疑问。主要原因在于,一般Google提供的Composable

郭霖的专栏 4万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

写给初学者的Jetpack Compose教程,动画

大家好,写给初学者的Jetpack Compose教程又更新了。今天来讲一讲Compose动画方面的知识。其实我并不是很擅长写动画相关的内容,《第一行代码》整本书里面我都没有写过任何讲解动画的知识。当然书本静态纸张不容易表达动画的效果可能也是我没有写动画的原因之一。上面这3篇文章讲的都是基于Android View系统的属性动画。虽说属性动画最初的设计理念就是要脱离View的限定,围绕属性的概念重新打造。

郭霖的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

写给初学者的Jetpack Compose教程,Lazy Layout

大家好,写给初学者的Jetpack Compose教程又来了。经过前面4篇文章的学习,相信大家都已经成功入门了Compose编程。不仅了解了Compose的核心编程理念(声明式UI),而且已经可以使用Compose编写一些简单的小程序了。今天我们要学习的是Compose中必学的一个控件,Lazy Layout。这是一个什么样的控件呢?

郭霖的专栏 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

写给初学者的Jetpack Compose教程,Side Effect

官方文档对于Side Effect的定义描述还是比较抽象的,根据官方文档的说法,Side Effect指的就是,在一个Composable函数的内部发生了超出其作用域的状态变更。要怎么理解这句话呢?处理MainScreen逻辑...这段代码的核心诉求还是比较好理解的,就是在MyApp()这个Composable函数的内部,我们先调用Initialize()函数对mInit变量进行初始化,完成了初始化之后再在MainScreen()函数中开始处理主页面的逻辑。

郭霖的专栏 1万+

成长轨迹:写给编程初学者

本文面向的读者:刚接触计算机编程的朋友、学了一段时间的编程但是感觉仍然在门外排徊的朋友,通常这些朋友都没有足够编程的经验。本文假设读者是正真对计算机科学感兴趣而想要知其所以然的学,如果你学编程只是为了就业或者通过各种乱七八糟的考试,我仍然欢迎你,但是不保证我的观点一点适合你。PS:老师在集体面前讲的观点一般是针对后一种情况的朋友,与你面对面交流的观点一般才是你更应该考虑的。当然这个因学校而异、因老

暴龙之影 3349

写给4年前开始编程序的自己

最近在网上看到有人写了一篇关于《写给4年前没有开始做设计的自己》,突然也想写这样一篇文章。具体那篇文章的内容我并没有细读,防止自己的思路照着他的来。 首先,我先简单介绍下自己,好为后面的内容做一个铺垫。我今年23岁,内蒙古人,今年6月将于粤东地区韩山师范学院毕业,软件工程专业。 一、如果可以,你应该去学文学或者经济学、或者其他你喜欢的专业 这样的建议并不是因为计算机专业不好,或者不适

始终不够 3万+

python写给初学者的一封信

选择技术跟选择大学一样重要!如果选错了,只能祝君好运。因为大概率你将来不仅得不到自己喜欢的高薪工作,反而会弄得一团糟

吴秋霖的博客 1万+

写给所有人的编程思维

最近刚读了一本书《写给所有人的编程思维》,虽然本书书名这么起,但却是一本针对孩子的编程书。读完之后感觉还是很不错的,豆瓣上不少吐槽这本书就是讲皮毛,个人觉得这本书最大的功效就是两点:系统介绍和好奇心启发。十分推荐这本书。 下面是本书的一些介绍和目录分享,后台回复:“编程思维”,可得电子书,多...

994

写给初学者的Jetpack Compose教程,大屏设备适配

本文介绍了如何在Jetpack Compose中适配不同尺寸的Android设备,特别是大屏设备。随着Android 16系统将不再支持限制应用的横竖屏旋转,开发者需要更好地适配大屏设备。文章首先建议使用Android Studio中的可调整尺寸模拟器来测试不同设备类型的界面效果。接着,介绍了如何使用WindowSizeClass来获取设备的屏幕尺寸类型,并根据不同尺寸调整界面布局。最后,通过一个简单的Feed流界面示例,展示了如何利用LazyVerticalGrid在大屏设备上实现一行显示多条内容,从而提

郭霖的专栏 1万+

Python编程的真谛:超越语法,理解编程本质

Python语法是编程的起点,但真正的精髓在于理解编程的更广泛概念。编程风格、项目结构、函数式编程、算法分析和面向对象编程共同构成了编程的核心能力。这些技能不仅让你编写更好的代码,还培养了解决复杂问题的能力。编程是一种思维方式,赋予你创造和改变世界的能力。语法只是语言,逻辑、设计和问题解决才是编程的灵魂。超越Python语法,拥抱编程的本质,你将发现无限可能。写出好代码的第一步,不是敲键盘,而是学会思考。

朱雀随云记的博客 1324

编程是什么——写给编程的初学者

 编程是什么?作者:陈跃峰出自:http://blog.youkuaiyun.com/mailbomb        对于初学者来说,编程是一件很神秘的工作,使很多人对于这个工作充满了向往,但是编程工作不适合所有的人,现在就使没有学过程序的人对于编程有个基本的认识。       编程就如写文章!写文章,需要学习一种语言,例如汉语、英语等,编程也需要学习一种语言,例如Java、C等。成为一名作家或者使程序设

软件开发资料汇总 348
上一篇: 从混乱到混乱,业务逻辑搬家记
下一篇: 工作6年,半路出家到CTO
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值