写点什么

程序原本(七):像大师们一样思考

2020 年 2 月 16 日

程序原本(七):像大师们一样思考

编者按:本文节选自周爱民著《程序原本》一书中的部分章节。


算盘用了几千年,谁问过“算盘为什么能算东西”?算珠、进位、栏,这些东西是不是基本的存储结构?用算盘的“我们”,是不是计算单元?珠算表是不是运算规则?那些珠子表达出来的“0~9”的排列,是不是输入输出的界面?


“我们+算盘”就是一个完整的计算系统。这样的计算系统的完整性,图灵用了一个假想加以说明。图灵不过是用一个假想描述了一个事实,而这个事实“看起来”能被机器实现。于是,我们的计算机时代就开始了。


图灵是否证明过“大笨象吃意大利面条为什么是一个完备的计算机系统”呢?不,最初等的问题,往往最难于证明。往往,他的证明过程,或应用过程,只是触发了一个想象。


对计算机根本问题的思考,许多会追溯到哲学思想层面。IOPD 和 PDIO 的问题、“算法 + 数据结构 = 程序”的问题等,就属于这一类。还有一些会追溯到人类行为学、语言学等层面,例如语言、语法、语义,以及像有没有语用这样的问题。大多数时候,真正推动计算机发展的,不是对具体问题的推理求解,而是对问题本身的抽象。在 Dijkstra 的叙述中,抽象更像是终极武器。按照 Brooks 的观点:


数据的表现形式(数据结构,抽象的结果之一)是编程的根本。


而按照 Dijkstra 的引述:


引用未解释过的名词阐述公理或定理和作用于未解析过的操作数的(命了名的)运算两者之间有着某种平行的相似性。


无论如何,我们“做一个计算机”,原始的目的不外两个:其一是“让它计算数学”,其二是“让它像人一样思考”。请注意,我的确是说“计算数学(即算数)”。数学是人类的理论学科,“怎么算”以及算的内容等,都是由我们自己设定的。而计算机的能力,只是计算“数学”这个它未知的对象而已。事实上,我们现在讲的“命令式”、“函数式”或“说明式”,只是我们为计算机设定的“最基础的运算方式”。在这个“运算系统”中,“数学”并不是最初设定的。


命令式如何计算,函数式如何计算……诸如此类的问题了解清楚了,我们对这类语言也就了解了。至于什么高阶函数(higher-order function)、克里化(Currying)、延续(Continuation)或发生-迭代器(Generator-Iterator)之类,那已经是具体语言的表象,而非“这一类语言”的本质。举例来说,JavaScript 1.5 还没有实现过“生成器对象”(Generator Object),但并没有人否认它是函数式语言。反过来说,“Generator Object”原本就不是函数式语言的必备要素。


LISP 表达了函数式语言的全部“必备要素”,然而 LISP 七个原子运算也只是针对 LIST 这个结构抽象来说的。对于一个“(顺序的)表”,这七个原子运算是必需的,而对于另一个“(关系的)表”就未必如此了。所以某些原子运算,也不必放在函数式的必备要素中。像 LUA 这样的函数式语言实现方法的出现,也证明了这一点。1


1 LISP 的基础数据结构是索引数组(表,LIST),而 LUA 的基础数据结构是关联数组(表,MAP)。


那么函数式还剩什么?


要真正理解函数式的秘密,是要一个语言一个语言地学习下去吗?是要一种运算法一种运算法地学习下去吗?我们听完人家说“延续”,于是就开始了解延续,而没有去追问延续为什么出现在函数式里面,或它是不是函数式的必备要素,又或是函数式运算系统的自身的“问题”。我们正是迷失于种种语言和概念的表象,而最终没能像大师一样去思考“计算机不过是大笨象吃意大利面条”这样的抽象层面的问题。


我们要改变的是思想,我们要增强的是能力。大多数人只是增强能力,而不改变思想。这就是我们大多数人不是大师的原因。


图书简介https://www.ituring.com.cn/book/2429



相关阅读


程序原本(一):应用开发基础


程序原本(二):应用开发技术


程序原本(三):开发视角下的工程问题


程序原本(四):系统的基础部件


程序原本(五):海量数据运算中公开的秘术


程序原本(六):继承与混合,略谈系 统的构建方式


2020 年 2 月 16 日 14:001248

评论

发布
暂无评论
发现更多内容

LeetCode题解:剑指 Offer 40. 最小的k个数,二叉堆,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

年前成功拿下35K+16薪美团Java架构师Offer!考点、面试题分享送给明年金三银四的你

Java架构追梦

Java 架构 面试 美团 offer

云原生时代跨语言间微服务的打法

Damon

Kubernetes 微服务框架

一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务

刘悦的技术博客

django python3.x 异步 异步任务

架构师训练营第六周总结

Geek_xq

京东城市时空数据引擎JUST亮相中国数据库技术大会(附PPT链接)

京东科技开发者

数据库 nosql

生产环境全链路压测建设历程 22:FAQ 1&2

数列科技杨德华

全链路压测 七日更

架构师训练营 1 期第 13 周:数据应用(二) - 作业

灵霄

极客大学架构师训练营

太平金科助力“开局之战”顺利启动,博睿数据“A+N”一体化解决方案全力护航

博睿数据

APM npm AIOPS

花火交易所APP开发|花火交易所软件系统开发

开發I852946OIIO

系统开发

也谈“中年焦虑”

程序员架构进阶

方法论 职业规划 中年危机

Devil Fruit恶魔果实APP系统软件开发

开發I852946OIIO

系统开发

咨询师的诱惑

escray

面经 大龄程序员 面试经历 101次面试

网易有道 iOS二面经验分享

iOSer

ios 面试题 网易 大厂面试 iOS面试

互联网寒冬下,程序员如何化解危机?答案全在这份阿里Java知识地图里

比伯

Java 编程 程序员 面试 计算机

架构师训练营 1 期第 11 周:安全稳定 - 作业

灵霄

极客大学架构师训练营

架构师训练营 1 期第 12 周:数据应用(一) - 作业

灵霄

极客大学架构师训练营

即构低延迟直播产品L3,打造更优质的实时互动体验

ZEGO即构

公安大数据可视化指挥决策平台建设,智慧警务系统开发

WX13823153201

推陈出新,一步到位,智慧水务这么用效率翻倍

一只数据鲸鱼

物联网 数据采集 智慧城市 组态软件 智慧水务

大数据ETL批量调度,这几款工具都需要去掌握了解

会飞的鱼

大数据处理 kettle 运维自动化 海豚调度 ETL算法

简明设计模式—创建型

2970

golang 设计模式

IDEA插件:多线程文件下载插件开发

Silently9527

Java 多线程 idea插件 文件传输

智慧公安情报研判大数据系统分析平台搭建

t13823115967

智慧公安

AI技术在音视频领域的发展

anyRTC开发者

人工智能 ios android AI WebRTC

架构师训练营第六周作业

Geek_xq

京东将上线社区团购“京喜拼拼”:社区团购是否是一次泡沫大战

石头IT视角

Go 并发基础

Damon

go Go web

智慧警务平台搭建,大数据时代下的警务模式

t13823115967

智慧警务大数据系统开发

博睿数据支持腾讯云函数监控,Serverless时代已来临

博睿数据

Serverless APM 监控

数字资产钱包系统开发及介绍

系统开发咨询:I76-883I-5I52 邓森

4月17日 HarmonyOS 开发者日·上海站

4月17日 HarmonyOS 开发者日·上海站

程序原本(七):像大师们一样思考-InfoQ