编程本质的一些想法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

 
这几年各种新的技术井喷一样的涌现出来。身处这样一个时代的我们,难免就有一种拔剑四顾,心下茫然的感觉。在某一方面的做到精专已属不易,全才似不可能,那么究竟又该何去何从?这篇文章目的是探讨编程过程中一些本质的东西,已期对大家的学习有所帮助。

个人以为,从编程这一职业诞生开始一直至今,其本质就没有改变过。对概念的抽象对逻辑的描述始终都是编程过程中最核心的东西。

程序为解决某一问题而存在。而问题可拆分成某些概念和逻辑关系。而结构化程序设计和面向对象程序设计不过是对概念和逻辑进行表达的不同方式。而程序中逻辑关系的复杂程度随程序的规模而增加。

程序的本质不是各种技巧。就算你把Effective C++,More Effective C++中的每一条款都应用到了你的C++程序中,如果没有对逻辑关系的良好组织,你的程序也可能糟不可言。可能高耦合低内聚,可能不可扩充───。

上面这段文字提到了四个概念,他们分别是:问题、概念、逻辑和技巧。

我来举个例子来说明这四个概念都代表些什么。

现在假设我们需要根据已知的一个文件名产生一个临时文件名。如果输入为prog.dat,mydir,hello.,oops.tmp,end.dat那么相应的输出为

prog.dat=>prog.tmp

mydir=> mydir.tmp

hello.=>hello.tmp

oops.tmp=>oops.xxx

end.dat=>end.tmp

(这里使用了The C++ Standard Library中第11章的例子)

什么都不做的程序是不存在的,程序总要解决客观世界中的某些问题。这里的问题就是要为一个已知的文件名产生相应的临时文件名。

解决这个问题时涉及的概念主要有两个:字符串和扩展名。扩展名可以用字符串进行表示。

解决这个问题的逻辑之一可用下面的伪代码来表述:

if(输入文件名没有扩展名)

{

  用输入文件名、'.'号和"tmp"生成临时文件名;

}

else

{

  得到输入文件名的扩展名;

  

  if(扩展名为空)

  {

    用输入文件名和"tmp"生成临时文件名;

  }

  else if(扩展名为"tmp")

  {

    把"tmp"替换为"xxx";

  }

  else

  {

    把文件名'.'以后的部分替换为"tmp";

  }

}

当然你还可以有其他的实现逻辑,而这种逻辑总是可以独立于语言、操作系统的。

至于你是用C++标准库、还是MFC的Cstring类或者.net中的相应类或者不依靠类库自己用某种语言来表述这种逻辑那就是技巧。

上面虽然是个小例子,但我认为完成任何程序:从上层应用直到底层驱动,都会涉及到这四个概念。

上面所说编程时必须的四个要素中,我个人认为逻辑和概念是编程中更本质的东西,直接的原因是他们在更大的程度上决定着程序的质量。不要忘了评价软件质量的几个指标:

健壮性、可重用性、易扩充性、容错性等。

 

而这些指标并不是你选择了某个语言或者某个框架他们就达到了。而要通过对解决的问题的逻辑进行提炼和精化才可能达到。不要说这是系统分析的责任,程序每一部分都有自己要解决的问题,怎么可能每一部分程序质量的保证都是系统分析的责任。

 

此外当你要把原来用软件实现的功能换做用硬件来实现的时候,这点就分外的明显--软件其实就是一组逻辑关系。

 

但眼下主流意识形态似乎并不认同这点,各种招聘广告可为明证。

下面是一个招聘软件工程师的广告:

1. BS degree or above in computer science.
2. At least 2 years of driver development experience.
3. Experience in C, C++, windows SDK/DDK or Linux system development.
4. Familiar with computer networking or telecommunication 802.3, 802.11, TCP/IP protocol is a plus.
5. Familiar with embedded system design.
6. Familiar with Bluetooth is a plus.

 

如果把编程与磨刀砍柴做类比的化,那么

当某个人熟悉某种语言、某个框架、某个IDE、某个协议某个开发包的时候我们可以认为这个人拥有一把较锋利的柴刀。但这和这个人最终擅不擅长砍柴并没有必然的关系。夫欲善其事,必先利其器。但利其器了未必就会善其事。所以说上面的广告一定程度上相当于想找一个会砍柴的人,但看人的时候却更注重他有没有一把锋利的刀子。(更可悲的是挣扎在生存边缘的我们,纵然不愿却也不得不迎合这种要求)

 

未避免矫枉过正,这里要强调一点,不是说基本技能不重要,没有对语言、框架、IDE的一定认识,根本就产生不了有用的程序。但当我们执迷于对不同语言、框架、IDE的优缺点进行比较的时候,不要忘了他们并不对程序的健壮性、可重用性、易扩充性、容错性等最终衡量程序优劣的诸多方面起决定作用。起决定作用的是你对概念的定义方式和对各种复杂逻辑关系的描述方式。

 

语言是什么?语言是逻辑的载体和描述的工具。当你试图表述逻辑关系的时候大多语言应该是满足这一要求的,要不然他早被淘汰了。框架是什么?框架是对逻辑和概念的一种封装。框架把某一领域通用的概念和逻辑封装起来,进而使程序员不必做一些重复性的工作。而实际上对这个领域的这些通用概念并不只有这么一种表述方式,也就是说并不只有一种逻辑表述。你选择某个框架的同时也就意味这你从n种方式中选择了一种,舍弃了其他。没有那个框架是完美的,选择的同时自然也就继承了这种不完美。所以善用他们,他们很重要,但不会再重要了。

 

当我意识到这点时,我发现虽然编程许久,但在对逻辑表述方面的能力却没有寸进,因为把90%以上的时间都投在了技巧的提升上了。Jeffrey Richter和Matt Pietrek两位堪称Windows编程界中的技巧大师。可我现在敢说即使你把《Windows核心编程》、《Programming Server-Side Application for Micorsoft Windows 2000》还有MSDN杂志的Under the Hood专栏倒背如流,你可能还是写不出高质量的程序。这些东西是必须的,但远不是全部。

 

林锐写过一本《高质量C++/C编程指南》,此书在网上流传甚广,我想原因有二:一是此书对C/C++语言中的容易造成模糊的地方进行了详细说明(真的很有用);二是林锐笔法不错。但也正因其流传甚广,我觉得在这里必须指出,此书严重的文不对题。按照书中所说那些就能设计出高质量的C/C++程序么?那些都是编程所需要的技巧,不过是告诉你怎么能磨出一把锋利的刀而已。如果读过此书的人都把这些技巧和高质量的程序相等价,那么学习时恐怕就难免会误入歧途了。

编程外功-1-从实战开始 由此可见,程序就和英语一样,甚至比英语还简单,因为程序有固定的规则,不会像英语一样有俚语等不规则的用法。但不用害怕,我们不需要成为C++语言的专家,正如我们之前所讲,他只是一个我们控制电脑的翻译,我们只要掌握基础的规则,达到我们目的即可。我们会从号称最难的编程语言C++开始学习,有一个段子是这么说的,一年精通,三年熟悉,五年了解,十年用过!自动驾驶领域90%的代码是C++写的,其中一个原因是C++代码的运行速度非常快,当然C++还有很多优秀的特性,我们会逐渐熟悉它。读万卷书,不如行万里路,让我们现在开始! 阅读详情

相关推荐

编程原本.[美]Alexander Stepanov(带详细书签).pdf

本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系。书中把理论的规程、基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者。 第1章 基础 1 1.1 理念范畴:实体,类别,类属 1 1.2 值 2 1.3 对象 4 1.4 过程 6 1.5 规范类型 7 1.6 规范过程 8 1.7 概念 10 1.8 总结 14 第2章 变换及其轨道 15 2.1 变换 15 2.2 轨道 18 2.3 碰撞点 21 2.4 轨道规模的度量 27 2.5 动作 28 2.6 总结 29 第3章 可结合运算 31 3.1 可结合性 31 3.2 计算乘幂 32 3.3 程序变换 35 3.4 处理特殊情况的过程 40 3.5 参数化算法 43 3.6 线性递归 44 3.7 累积过程 47 3.8 总结 48 第4章 线性序 49 4.1 关系的分类 49 4.2 全序和弱序 51 4.3 按序选取 52 4.4 自然全序 62 4.5 派生过程组 63 4.6 按序选取过程的扩展 63 4.7 总结 64 第5章 有序代数结构 65 5.1 基本代数结构 65 5.2 有序代数结构 70 5.3 求余 72 5.4 最大公因子 76 5.5 广义gcd 79 5.6 Steingcd 81 5.7 商 82 5.8 负量的商和余数 84 5.9 概念及其模型 87 5.10 计算机整数类型 88 5.11 结论 89 第6章 迭代器 91 6.1 可读性 91 6.2 迭代器 92 6.3 范围 94 6.4 可读范围 97 6.5 递增的范围 106 6.6 前向迭代器 108 6.7 索引迭代器 113 6.8 双向迭代器 114 6.9 随机访问迭代器 115 6.10 总结 117 第7章 坐标结构 119 7.1 二叉坐标 119 7.2 双向二叉坐标 123 7.3 坐标结构 129 7.4 同构,等价和有序 129 7.5 总结 137 第8章 后继可变的坐标 139 8.1 链接迭代器 139 8.2 链接重整 140 8.3 链接重整的应用 147 8.4 链接的二叉坐标 151 8.5 结论 155 第9章 拷贝 157 9.1 可写性 157 9.2 基于位置的拷贝 159 9.3 基于谓词的拷贝 166 9.4 范围的交换 174 9.5 总结 178 第10章 重整 179 10.1 置换 179 10.2 重整 182 10.3 反转算法 184 10.4 轮换算法 188 10.5 算法选择 196 10.6 总结 200 第11章 划分和归并 201 11.1 划分 201 11.2 平衡的归约 207 11.3 归并 212 11.4 总结 218 第12章 复合对象 219 12.1 简单复合对象 219 12.2 动态序列 227 12.3 基础类型 233 12.4 总结 236 跋 237 附录 A 数学表示 241 附录B 程序设计语言 243 参考文献 253 索引 257

编程本质

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

自己初始的学习过程 702

Elements of Programming(编程本质)

Elements of Programming Elements of Programming

编程本质是什么?

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

2201_75362610的博客 673

编程本质是什么

Hello 大家好,我是MC小超,今天和大家聊一聊编程本质是什么 用一句话来解释,编程就是和电脑对话,用电脑听得懂的语言,告诉它我想让它做的事。 当我们嘤嘤学语,我们的父母教给我们的是汉语,也就是中国的语言。在成长的过程中,我们用汉语来沟通,但随着年龄的增长 ,我们开始接触英语、日语等其他国家的语言。我们通过不用的“语言形式”和他人沟通,以此来完成我们的目的。 语言有很多种,包括汉语、英语、法语、韩语等,尽管输出的形式不同 ,但可以达到同样的目的。同样,我们也可以通过”语

2201_76023648的博客 374

编程编程语言本质

Programming is about ideas,languages are just a way to express them. https://thzt.github.io 转载于:https://www.cnblogs.com/feng9exe/p/10590685.html

diaoju3333的博客 186

程序的本质个人感悟

经过一年多的自学编程,我发现,编程本质就是: 对问题的一种解决方案。 这种解决方案中,包括, 逻辑架构和数据处理 逻辑架构越好,则扩展性越强,可读性越好, 逻辑架构越混乱,则扩展性和可读性越差。 还有程序的编写离不开数据的处理, 选择合适的数据结构或者方案,来处理数据会事半功倍 编程本质并不是编程,而是对客观世界的一种实现, 它是一种工具,利用该工具可以创造出无限的可能 你可以把自己想象成是一名建筑师,在建造一个很漂亮的 房子 也可以把自己当成一个生态创造者,正在构建一个虚拟且 真实的生态圈,这个生态圈

深耕java的博客 218

我所理解的编程

2015.12.4 编程所做的事情,就是把你的想法用机器能识别的语言组织好,并展现到屏幕上。 语言是工具,机器是工具,一切都是工具,在一定程度上,你的想法也是,是为了实现另一个想法的工具。 所以,你可能会说,最顶点的想法那么不是工具了吧? 我想也不是,目前为止,人类所做的任何事情都没有合理的解释。 为什么这么做?保护环境,环境没有要求你这么做。 推动社会和科技的进步,只不过是某些人的一...

weixin_30721077的博客 64

一篇写给从未编程过的人的入门教程

平时工作之余,很多蚂蚁技术同学也乐于分享技术心得和经验感悟,我们会不定期精选其中的优秀文章,分享给大家。 不少同学对于编程感到好奇,但一看到厚厚的教程就打退堂鼓,我就曾经被问过:“外行需要多长时间才能学会这玩意儿呀?”这个问题不知道该如何回答,因为我并不认同“外行”这个词。我始终认为,在编程这件事情上,每个人都是内行,每个人也都是外行。 学会编程没有你想象中的那么复杂。 编程是什么? 编程,说得简单一点,就是通过一系列逻辑将你想做的事情或者想描述的物体表达清楚,然后让它展现出来,或者运动起来。.

2万+

编程思想与以人为本-编程本质

编程是把需求打碎然后按照编程思想的指导进行重组的过程; 编程本质:按照编程思想的指导,将需求拆分然后重装成模型,进一步转化成程序的过程; 需求到程序需要三次转化过程:1)想法转化成需求文档;2)需求文档转化为程序模型;3)程序模型转化为程序; 三个转化过程,人的世界观、方法论都起到至关重要的作用; 总之:拆分-(构建-)-组装; 就和机器的拆分和组装一样; ...

diaoju3333的博客 159

使用python验证想法

python可以避免去思考一些细节, 专注于逻辑的实现; 能够快速验证; 专注于要解决的问题, 这样在实现的时候能够发现问题的关键点是什么; 确定不同情况下的行为具体是什么 例如: 求C(m, n)组合枚举, 关键点是区分 空集 和 包含空集的几何 C(m, n) m C(m, 0) 得到一个包含空集的集合 例如 判定 菱形拼接相交的问题: 关键点是: 准确

liyong748的专栏 616

编程为什么有趣

编程就是一个自我复制的过程。具体来说,就是把自己的意志复制为一颗种子。而这颗种子具有在广袤的土地上生长的潜力。 转载于:https://www.cnblogs.com/Ticraft/p/4285235.html...

weixin_30647065的博客 64

学会思考,而不只是编程

https://kb.cnblogs.com/page/572854/ 英文原文:Don't learn to code. Learn to think   中国人常说“授之以鱼不如授之以渔”。如果说教授编程是授之以鱼,那么教授计算机科学就是授之以渔。为什么说学习计算机科学比学会编程要重要得多?来听听Yevgeniy Brikman的解释。   现如今,似乎每个人都在学习编程:Bill...

伏虎游侠的博客 533

多年之后所想

表达自己的想法和意见,这是我们找到同类的最好方法。

sunlongtu的专栏 373

计算机编程

计算机编程,到底怎么才算计算机编程呢?这个问题一直困惑着我,它是让我们用计算机来编程,那到底是我在编程还是计算机来编程.现在的计算机编程主要的工作还得靠咱自己.从整体设计,使用方法,语言指令.都得咱自己来,不过咱的脑子本来就不行,怕是不行啊.所以想来想去,这计算机编程,就应该让它自各来编程,就好像请人来做事,你总不能让咱自己什么都来干吧.所以,咱就想培养这么一个计算机才,甚至是一群,让他们来做现在

autotyx的专栏 620

一起学编程(3--组织与表达)

利用计算机的目的是为了解决这个问题。我们能够将程序看做是解决这个问题的过程和结果的描写叙述。这跟我们用流程和规范来指导做事并无本质的差别,并且更为简单。因此我们希望计算机有一天能理解我们的自然语言,这样,我们利用自然语言就能够与计算机交流,并指挥计算机做事。但不管是自然语言还是现有的编程语言,都须要计算机能够理解。这样的理解与和他人进行交流时的理解也是一致的。因此怎样清晰地,准确的对要做的事情...

weixin_34061042的博客 113

读《大道至简》第六章有感

语言只是工具,就像在第一章中提到的那句话“成天讨论这门语言好,或者那门语言坏的人,甚至是可悲的。”语言是用来实现我们想法的工具,仅此而已。 万变不离其宗,程序=算法+语言,是编程的本源定义,是从事代码相关的任何工作,最终仍旧会落足于这样的一条规则。 方法是实践积累到一定程度提出的,模式是一种方法,模式需要一定的编程经验 才能理解,理解过程也需要编程经验,理解对象也需...

weixin_30606669的博客 89
上一篇: C编程修养
下一篇: 递归程序设计的公式化方法
mentat
博客等级 码龄25年 86粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值