小课堂week16 编程范式巡礼第一季 三大基石
编程范式巡礼第一季 三大基石
最近迷上了一些哲史类书籍,回望过去、放眼未来,往往沉浸在其思维之美中无法自拔。计算机编程是一门非常年轻的学科,沉淀不足也是年轻的一个侧面,在编程领域,有足够思想深度的作品并不多。这本书的作者老冒我觉得就是一个有深度的人。这周开始,给大家讲一下他的好书《冒号课堂》。
编程范式是什么?
在年底的各大媒体的展望中,我发现编程能力已经悄悄然占据了比较重要的位置,被认为是一种影响未来的能力。编程从宏观上讲就是操作计算机工作的方法,而从微观上讲是寻求一种机制,将指定的输入转换为指定的输出。
但是为什么编程能力是难练成的呢?我觉得最大的问题大于人和计算机的思维方式是不同的,人的思维追求简单,而计算机的思维追求复杂。在这之间有一个巨大的鸿沟,其难点是使用人的思维来翻译计算机思维。
编程范式就是这种翻译方法,它是程序王国的世界观和方法论,也许是破解编程这门学科的钥匙。
命令范式
我们需要从最古老的范式开始,也是编程世界的第一性原理。
其世界观是:程序是由若干行动指令组成的有序列表。其方法论是:用变量来存储数据,用语句来执行指令。
这个是由目前计算机的起源,也就是冯·诺依曼机的设计来决定的,也是所有计算机技术的基础。机器语言就是这样设计的,也就是说这是计算机唯一可以直接理解的东西。
那是不是可以有其他的机器语言呢?理论上当然是可以的,在早期也是存在的,但是都未有流行。在命令范式中有一个非常重要的推论:
任何程序都可以用顺序、选择和循环3种基本控制结构来表示。
这也是我们目前绝大多数语言的实现方式,是日常最为常见的编程方法。下面是一个范例:
function getData(col){var results=[];for(var i =0; i < n ; i++){if(col[i]&&col[i].data){results.push(col[i].data);}}return results;
}
大家可以试一下用语言把这段代码进行一下解释,我也找不少同事做过实验,就算是资深程序员解读的也不完全相同,这也说明了命令范式和人的思维方式有所不同,会不太容易理解,如何解决,就需要新的范式了。
函数范式
上面的那段代码,到底是哪里不容易理解?应该来说是细节的描述过多,因为人的思维喜欢简单,而细节是复杂的。所以我们需要一种不一样的描述方法。
命令式编程是行动导向的,算法是显性而目标是隐性的;声明式编程是目标驱动的,目前是显性而算法是隐性的。
命令式编程有几种不同的流派,其中函数范式是现在最为流行的。
在函数范式中,函数是程序的核心,是头等公民。
这个说法还是过于抽象,我们从上面的例子出发。这段代码中,最让人难以理解的应该是for..下面的这段内容,也就是循环段落。在命令范式的三大结构中,我们会发现唯有循环结构是人在日常表达中不会使用的,这也是计算机复杂性的最重要表现。在声明式编程的世界观里,我们就需要把这段代码藏起来。
但是如果只是采用命令范式中"语句+变量"的表达方式,大概能改进成如下代码,是好了一点,但是还是挺让人费解的。
function getData(col){var results=[];doSelect();return results;
}function doSelect(){results = loop(f-> { if(col[i]&&col[i].data){results.push(col[i].data);}}); }
}
这个时候,我们就需要对范式进行一下改进了。其实只是一个小改动,扩展一下"变量"的语义:
语句+变量 --> 语句+变量/函数
我想这个也是函数范式名称的由来,这么做的效果立竿见影,"变量"复杂了,那么"语句"就能变的简单而且通用。我们可以把上面这段代码改进为如下:
function getData(col){return col.filter(item=>item&&item.data).map(item=>item.data);
}
是不是可读性一下子强了很多,改变只是源于一个小小的思维上的转变。以此为基础,发展出了许许多多强大的方法和工具,给码农们提供了强大的支持。读到这里,我其实是有点感动的,这就是思维的力量。
对象范式
让我们继续,函数范式把程序的可理解性提升了一截,那思维探索就停止了么,当然不会。
命令范式的代码在理解性方面还有其他的问题么?有!
和日常的语言相比,程序的表示总是让人觉得有些别扭。以第一行代码为例。
function getData(col)
我们直接读是"获取数据 列",挺奇怪的吧。举一个日常表达的例子会更形象点,程序的表达类似这样:
吃 牛 草
看出问题了吧,就是缺少主语。我们日常的表达中,主语是个不可缺少的内容,但是在计算机语言中偏偏就没有。那这句话如何表达才能清晰呢,挺简单的,换下顺序增加主语就可以。
牛 吃 草
在程序世界里,给主语起了个名字,叫Object,基于此,诞生了对象范式。这里有一个非常混淆的地方,就是Object并不是主语的意思,而且意思恰恰相反。我觉得这也是对象范式这个概念,始终让大家非常困惑的一个原因。这里只是给一个简单化的理解方法。
语言表达的改进,带来的不仅仅是理解的提升,更大的改变是可以将我们理解正常世界的方法用在理解计算机世界之上,这个化学反应是巨大的。这里举一个简单的例子,就是信息压缩。
牛 吃 草
牛 喝 水
这两句话,我们自然会想到一个压缩的方法:
牛 {吃();喝水();
}
进一步,又出现了一种新动物,我们又会想到一种压缩:
羊 {吃();喝水();
}
-->
哺乳动物 {吃();喝水();
}
这就是OO中的封装和继承的由来,追求的是简单,源于日常理解世界的方法。为什么现在对象范式这么流行,我觉得重要的原因是其更符合日常思维,更具有易用性。
小结
今天主要是介绍了《冒号课堂》中讲到的最为基础的三个范式,从一个小小的改动开始,撬动了一个大大的世界,编程领域博大精深,这只是入门,后面还有更好玩、更有趣的范式等着我们,下次再继续探索。
前几天听到Google的人工智能专家李飞飞的演讲,讲到传统的学习,是用人认识知识,然后再让机器学习,但是机器学习不一样,是把认知知识这一层省掉了,直接让机器进行学习。这是一种思维上的大跃进,说实话我还不能完全理解,但有点可以确定的是,思维上的提升已经刻不容缓,加油。
转载于:https://www.cnblogs.com/dt-zhw/p/6349085.html
小课堂week16 编程范式巡礼第一季 三大基石相关推荐
- 今天不小心跳着看了黑镜第一季三集
着重看了第二集,觉得挺不错的.动漫散文我服虫师,电视剧散文形式的我服黑镜. 下面是转载知乎的见解,感同身受,写完我就要去看论文了,我现在还是底层社会的人.唉,多努力吧. 作者:陛帝 链接:https: ...
- 青少年python编程课_青少年之Python编程课程安排第一季
第一章 开启Python之旅 1.你将了解什么是Python 2.在电脑上安装并简单使用Python 3.开始通过Python与计算机进行交流(编程) 第二章 变量 1.什么是变量 2.变 ...
- 安卓期末作品小项目_每日一个财务小知识——洞悉洞晰财务报告第一季
财务报告 洞悉洞晰财务报告 目录 01/账务报告概述 02/资产负债表 03/利润表 04/现金流量表 05/所有者权益变动表 06/附注 一.财务报告概述 (一)财务报告及其目标 财务报告是指企业对 ...
- 潇洒学校老师小课堂:数控车床上螺纹加工的三大问题和解决方法
数控车床上螺纹加工的三大问题和解决方法: 在螺纹车削过程中,经常会因螺纹刀具磨损,崩刀而需重新装刀对刀,装刀对刀的好坏直接影响车削螺纹的精度,特别是螺纹的修复车削,需二次装夹二次对刀,制约了数控车床加 ...
- pyqt5 getsavefilename 默认文件名_经Jerry编程小课堂之python如何安装PyQt5和QT Designer...
小伙伴们大家好,欢迎来到经Jerry编程小课堂,有没有很想我呢?嘿嘿嘿,我也很想你们啊!想死你们了,亲!嘤嘤嘤! 哈哈,话不多说,转入正题,今天我们聊一聊如何安装python的图形界面模块PyQt5以 ...
- 视频教程-微信小程序从入门基础(第一季)-PHP
微信小程序从入门基础(第一季) 多年一线互联网开发实战以及培训经验,对php开发,linux运维架构有丰富的经验,善于分析问题,解决问题. lampol ¥117.00 立即订阅 扫码下载「CSDN程 ...
- 冒号课堂 编程范式与OOP思想
上篇:编程范式与编程语言 第1课 开班导言 第2课 重要范式 第3课 常用范式 第4课 重温范式 第5课 语言小谈 第6课 语言简评 下篇:抽象机制与对象范式 第7课 抽象封装 第8课 抽象接口 第9 ...
- 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...
- 小程序突然报module is not defined_【第一季完】(字幕+讲解)小谢尔顿S1E22 Meemaw#39;s two boyfriends...
大家好,我是阅片无数的雅思托福教书狗阿噗.每天坚持跟我一起做几分钟无字幕英语剧练习,听力口语能力会神速进步哦❤️. 如未观看无字幕版本,请先去[第一季完](无字幕)小谢尔顿S1E22 Meemaw's ...
最新文章
- Redis 性能问题分析(好文推荐)
- python水印_用python来给图片加水印
- 创建虚拟机以及安装Linux操作系统
- Github排序(转载)
- UVA 10624 Super Number
- Linux内核:网络过滤器简介与示例代码
- 黑客松Demo: Kata 的下一代镜像系统
- eclipse主题彻底美化——你还在用白底黑字的编辑器吗?
- acs880变频器静态辨识_ACS880变频器PID控制参数设置 -
- oracle中同义词作用,Oracle同义词创建及其作用
- 用树莓派实现宽带多次拨号,带宽叠加
- Win8笔记本不能正常关机或重启
- ecshop 添加手机号码验证唯一性(手机版)
- 多功能聊天室 第一次迭代总结与第二次迭代计划
- DevExtreme UI框架在可视化应用程序Nvisual中的实践应用
- android recyclerView Binary XML file line #7: Error inflating class android.support.v7.widget.Recycl
- Kafka(二):生产者
- paperwhite3翻页_亚马逊Kindle Paperwhite第二代评论-以及新的Kindle软件更新
- 考研数学:罗尔定理的推论
- 卡罗拉 (COROLLA) - 油箱盖
热门文章
- 字节跳动周末发2倍加班费,员工晒出税后工资,网友:怀疑你是日薪
- 论中职学校计算机教学,浅析中职学校计算机教学论文
- 已经解决Xmind8在MAC系统中卡顿
- 空间里相片批量导入u盘_三种导入电话号码的方法!第一种快捷,第二种安全...
- weex 一个传说级巨坑-- 2018最新版weex踩坑指南(weex navigator 多界面跳转)
- 【爬虫】四、基础爬虫方法实战
- Fikker 站长缓存的授权期内但显示授权过期问题
- 家用投影仪选购,家用投影仪推荐
- vs2010安装后找不到运行程序
- iPhone密码忘记