(转)从工具的奴隶到工具的主人 - 王垠

2023-05-16

我们每个人都是工具的奴隶。随着我们的学习,我们不断的加深自己对工具的认识,从而从它们里面解脱出来。现在我就来说一下我作为各种工具的奴隶,以及逐渐摆脱它们的“思想控制”的历史吧。

 
当我高中毕业进入大学计算机系的时候,辅导员对我们说:“你们不要只学书本知识,也要多见识一下业界的动态,比如去电脑城看看人家怎么装机。”当然他说我们要多动手,多长见识,这是对的。不过如果成天就研究怎么“装机”,研究哪种主板配哪种 CPU 之类的东西,你恐怕以后就只有去电脑城卖电脑了。
 
本科的时候,我经常发现一些同学不来上数学课。后来却发现他们在宿舍自己写程序,对 MFC 之类的东西津津乐道,引以为豪。当然会用 MFC 没有什么不好,可是如果你完全沉迷于这些东西,恐怕就完全局限于 Windows 的一些表面现象了。
 
所以我在大学的时候就开始折腾 Linux,因为它貌似让我能够“深入”到计算机内部。那个时候,书店里只有一本 Linux 的书,封面非常简陋。这是一本非常古老的书,它教的是怎样得到 Slackware Linux,然后把它从二三十张软盘装到电脑上。总之,我就是这样开始使用 Linux 的。后来我就走火入魔了,有时候上课居然在看 GCC 的内部结构文档。后来我又开始折腾 TeX,把 TeXbook 都看了两遍,恁是用它写了我的本科毕业论文。
 
后来进了清华,因为不满意有人嘲笑我用 Linux 这种“像 DOS 的东西”,以及国内网站都对 Windows 和 IE 进行“优化”的情况,就写了个“完全用 Linux 工作”。确实,会 Linux 的人现在更容易找到工作,更容易被人当成高手。但是那些工具同样的奴役了我,经常以一些雕虫小技而自豪,让我看不到如何才能设计出新的,更好的东西。当它们的设计改变的时候,我就会像奴隶一样被牵着鼻子走。
 
这也许就是为什么我在清华的图书馆发现 《SICP》 的时候如此的欣喜。那本书是崭新的,后面的借书记录几乎是空白的。这些看似简单的东西教会我的,却比那些大部头和各种 HOWTO 教会我的更多,因为它们教会我的是 WHY,而不只是 HOW。当时我就发现,虽然自认为是一个“资深”的研究生,学过那么多种程序语言,各种系统工具甚至内核实现,可是相对于 SICP 的认识深度,我其实几乎完全不会写程序!在第三章,SICP 教会了我如何实现一个面向对象系统。这是我第一次感觉到自己真正的在开始认识和控制自己所用的工具。
 
因为通常人们认为 Scheme 不是一个“实用”的语言,没有很多“库”可以用,效率也不高,而 Common Lisp 是“工业标准”,再加上 Paul Graham 文章的怂恿,所以我就开始了解 Common Lisp。在那段时间,我看了 Paul Graham 的 《On Lisp》 和 Peter Norvig 的 《Paradigms of Artificial Intelligence Programming》。怎么说呢?当时我以为自己学到很多,可是现在看来,它们教会我的并没有 《SICP》 的东西那么精髓和深刻。开头以为一山还有一山高,最后回头望去,其实复杂的东西并不比简单的好。现在当我再看 Paul Graham 和 Peter Norvig 的文章,就觉得相当幼稚了,而且有很大的宗教成分。
 
进入 Cornell 之后,因为 Cornell 的程序语言课是用 SML 的,我才真正的开始学习“静态类型”的函数式语言。之前在清华的时候,有个同学建议我试试 ML 和 Haskell,可是因为我对 Lisp 的执着,把他的话当成了耳边风。当然现在用上 SML 就免不了发现 ML 的类型系统的一些挠人的问题,所以我就开始了解 Haskell,并且由于它看似优美的设计,我把“终极语言”的希望寄托于它。我开始着迷一些像 monads, type class, lazy evaluation 一类的东西,看 Simon Peyton Jones 的一些关于函数式语言编译器的书。以至于走火入魔,对其它一切“常规”语言都持鄙视态度,看到什么都说“那只不过是个 monad”。虽然有些语言被鄙视是合理的,有些却是被错怪了的。后来我也发现 monad, type class, lazy evaluation 这些东西其实并不是什么包治百病的灵丹妙药。
 
但是我很不喜欢 Cornell 的压抑气氛,所以最后决定离开。在不知何去何从的时候,我发了一封 email 给曾经给过我 fellowship 的 IU 教授 Doug Hofstadter (《GEB》的作者)。我说我不知道该怎么办,后悔来了 Cornell,我现在对函数式语言感兴趣。他跟我说,IU 的 Dan Friedman 就是做函数式语言的啊,你跟他联系一下,就说是我介绍你来的。我开头看过一点 The Little Schemer,跟小人书似的,所以还以为 Friedman 是个年轻小伙。当我联系上 Friedman 的时候,他貌似早就认识我了一样。他说当年你的申请材料非常 impressive,可惜你最后没有选择我们。你要知道,世界上最重要的不是名气,而是找到赏识你,能够跟你融洽共事的人。你的材料都还在,我会请委员会重新考虑你的申请。IU 的名气实在不大,而 Friedman 实在是太谦虚了,所以连跟他打电话都没有明确表态想来 IU,只是说“我考虑一下……”这就是我怎么进入 IU 的。
 
Friedman 的教学真的有一手。虽然每个人对他看法不同,但是有几个最重要的地方他的指点是帮了我大忙的。有人可能想象不到,在 Scheme 这种动态类型语言的“老槽”,其实有人对“静态类型系统”的理解如此深刻。也就是在 Friedman 的指点下,我发现类型推导系统不过是一种“抽象解释”,而各种所谓的“typing rule”,不过是抽象解释器里面的分支语句。我后来就通过这个“直觉”,再加上 Friedman 的逻辑语言 miniKanren 里面对逻辑变量和 unification 的实现,做出了一个 Hindley-Milner 类型推导系统(HM 系统),也就是 ML 和 Haskell 的类型系统。虽然我在 Cornell 的课程作业里实现过一个 HM 系统,但是直到 Friedman 的提点,我才明白了它“为什么”是那个样子,以至于达到更加优美的实现。后来经他一句话点拨,我又写出了一个 lazy evaluation 的解释器(也就是 Haskell 的语义),才发现原来 SPJ 的书里所谓的“graph reduction”,不过就是如此简单的思想。只不过在 SPJ 的书里,细节掩盖了本质。后来我在之前的 HM 系统之上做了一个非常小的改动,就实现了 type class 的功能,并且比 Haskell 的实现更加灵活。所以,就此我基本上掌握了 ML 和 Haskell 的理论精髓。
 
可是类型系统却貌似一个无止境的东西。在 ML 的系统之上,还有 System F,Fw, MLF,Martin Lof Type Theory,CIC,…… 怎么没完没了?我一直觉得这些东西过度复杂,有那个必要吗?直到 Amal Ahmed 来到 IU,我才相信了自己的感觉。然而,这却是以一种“反面”的方式达到的。
 
Amal 是著名的 Andrew Appel (“虎书”的作者)的学生,在类型系统和编译器的逻辑验证方面做过很多工作。可是她比较让人受不了,她总是显得好像自己是这里唯一懂得类型的人,而其他人都是类型白痴。她不时的提到跟 Bob Harper, Benjamin Pierce 等类型大牛一起合作的事情。如果你问她什么问题,她经常会回答你:“Bob Harper 说……”她提到一个术语的时候总是把它说得无比神奇,把它的提出者的名字叫得异常响亮。有一次她上课给我们讲 System F,我问她,为什么这个系统有两个“binder”,貌似太复杂了,为什么不能只用一个?她没有正面回答,而是嘲讽似的说:“不是你说可以就可以的。它就是这个样子的。”后来我却发现其实有另外一个系统,它只有一个 binder,而且设计得更加简洁。后来我又在课程的 mailing list 问了一个问题,质疑一个编译器验证方面的概念。本来是纯粹的学术讨论,却发现这封 email 根本没有发到全班同学信箱里,被 Amal 给 moderate 掉了!
 
看到这种种诡异的行为,我才意识到原来学术界存在各种“帮派”。即使一些人的理论完全被更简单的理论超越,他们也会为“自己人”的理论说话,让你搞不清到底什么好,什么不好。所以后来我对一些类型系统,以及 Hoare Logic 一类的“程序逻辑”产生了怀疑。我的课程 project 报告,就是指出 Hoare Logic 和 Separation Logic 所能完成的功能,其实用“符号执行”或者 “model checking” 就能完成。而这些程序逻辑所做的事情,不过是把程序翻译成了等价的逻辑表达式而已。到时候你要得知这些逻辑表达式的真伪,又必须经过一个类似程序分析的过程,所以这些逻辑只不过让你白走了一些弯路。当 Amal 听完我的报告,勉强的笑着说:“你告诉了我们这个结论,可是你能用它来做什么呢?”我才发现原来透彻的看法,并不一定能带来认同。人们都太喜欢“发明”东西,却不喜欢“归并”和“简化”东西。
 
可是这类型系统的迷雾却始终没有散去,像一座大山压在我头上。我不满意 Haskell 和 ML 的类型系统,又觉得 System F 等过于复杂。可是由于它们的“理论性”和它们创造者的“权威”,我不敢断定自己的看法就不是偏颇的。对付疑惑和恐惧的办法就是面对它们,看透它们,消灭它们。于是,我利用一个 independent study 的时间,独立实现了一个类型系统。我试图让它极度的简单,却又“包罗万象”。经过一番努力,这个类型系统“涵盖”了 System F, MLF 以及另外一些类似系统的推导功能,却不直接“实现”他们。后来我就开始试图让它涵盖一种非常强大的类型系统,叫做 intersection types。这种类型系统的研究已经进行了 20 多年,它不需要程序员写任何类型标记,却可以给任何“停机”的程序以类型。著名的 Benjamin Pierce 当年的博士论文,就是有关 intersection types 的。没几天,我就对自己的系统稍作改动,让它涵盖了一种最强大的 intersection type 系统(System I)的所有功能。然而我却很快发现这个系统是不能实用的,因为它在进行类型推导的时候相当于是在运行这个程序,这样类型推导的计算复杂度就会跟这个程序一样。这肯定是完全不能接受的。后来我才发现,原来已经有人指出了 System I 的这个问题。但是由于我事先实现了这个系统,所以我直接的看到了这个结论,而不需要通过繁琐的证明。
 
所以,我对类型推导的探索就这样到达了一个终点。我的类型系统是如此的简单,以至于我看到了类型推导的本质,而不需要记住复杂的符号和推理规则。 我的系统在去掉了 intersection type 之后,仍然比 System F 和 MLF 都要强大。 我也看到了 Hindley-Milner 系统里面的一个严重问题,它导致了这几十年来很多对于相关类型系统的研究,其实是在解决一个根本不存在的问题。而自动定理证明的研究者们,却直接的“绕过”了这个问题。这也就是我为什么开始对自动定理证明开始感兴趣。
 
后来对自动定理证明, Partial Evaluation 和 supercompilation 的探索,让我看到那些看似高深的 Martin Lof Type Theory, Linear Logic 等概念,其实不过也就是用不同的说法来重复相同的话题。具体的内容我现在还不想谈,但是我清楚的看到在“形式化”的美丽外衣下,其实有很多等价的,重复的,无聊的东西。与其继续“钻研”它们,反复的叨咕差不多的内容,还不如用它们的“精髓”来做点有用的事情。
 
所以到现在,我已经基本上摆脱了几乎所有程序语言,编译器,类型系统,操作系统,逻辑推理系统给我设置的思维障碍。它们对我来说不再是什么神物,它们的设计者对我来说也不再是高不可攀的权威。我很开心,经过这段漫长的探索,让我自己的思想得到了解放,翻身成为了这些工具的主人。虽然我看到某些理论工具的研究恐怕早就已经到达路的尽头,然而它们里面隐含的美却是无价和永恒的。这种美让我对这个世界的许多其它方面有了焕然一新的看法。一个工具的价值不在于它自己,而在于你如何利用它创造出对人有益的东西,以及如何让更多的人掌握它。这就是我打算现在去做的。
 
原文:http://blog.sina.com.cn/s/blog_5d90e82f01018x95.html

转载于:https://www.cnblogs.com/congbo/articles/2643612.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(转)从工具的奴隶到工具的主人 - 王垠 的相关文章

  • 前端间隔查询的两种方法:Debounce和Throttle

    Debounce 中文名 xff1a 防抖 在开始操作了之后 xff0c 那么只有在一段 delay 时间段后不再有操作了 xff0c 才执行操作 Throttle 中文名 xff1a 节流 在开始操作之后 xff0c 在 delay ms
  • tcpdump指定IP和端口抓包

    如下指定抓www baidu com 并且80端口的包 保存到test cap 可以在Windows下面用wireshark打开 tcpdump 39 port 80 and host www baidu com 39 w test cap
  • codevs4438 YJQ Runs Upstairs

    Description 学校科技楼一共有 N 层 而神犇YJQ每天都在科技楼 N 楼的机房写代码 这天 他准备从科技楼 1 楼爬到 N 楼 有个 M 连接不同楼层的楼梯 爬每个楼梯需要一定的体力值 楼梯一定是从低处通往高处的 但是由于楼房的
  • linux下如何查看服务器的硬件配置信息

    性能测试时一定要确定测试环境和的硬件配置 软件版本配置 xff0c 保证和线上一致 xff0c 才更接近真实环境 那么linux下如何查看服务器的硬件配置信息 xff1f xff1f 一 查看cpu信息 1 所有信息 lscpu root
  • 转:如何查找别人论文(计算机类文献)中实验的代码?

    最近看计算机类文献 xff0c 想看看别人论文中实验是如何做出来的 xff0c 请问如何查找别人论文中实验的代码 1 如果这论文很老 xff0c 论文里的算法在该领域有举足轻重的地位 那么网上很可能有工具包 例如我做的机器学习方向 xff0
  • Pytorch-属性统计

    引言 本篇介绍Pytorch属性统计的几种方式 统计属性 求值或位置 normmean sumprodmax min argmin argmaxkthvalue topk norm norm 与 normalize norm指的是范数 xf
  • 高性能异步爬虫

    背景 其实爬虫的本质就是client发请求批量获取server的响应数据 xff0c 如果我们有多个url待爬取 xff0c 只用一个线程且采用串行的方式执行 xff0c 那只能等待爬取一个结束后才能继续下一个 xff0c 效率会非常低 需
  • [operator]deepin 卸载自带搜狗输入法后,输入法消失

    解决这个问题我先是升级了官方的im config套件 xff0c 升级后发现并没有什么用 xff0c 然后使用以下方式 xff0c 做个记录 命令行操作 删除搜狗的残留文件 cd config rm rf SogouPY users rm
  • DPK

    一 概念 dpk文件是Delphi的包文件 xff0c 有dpk文件的组件安装比较方便 一般来说 xff0c 支持不同版本Delphi的组件会有不同的dpk文件 xff0c 一般以7结尾的dpk文件是支持Delphi 7的 如果没有支持De
  • TCP/IP协议栈概述及各层包头分析

    一 摘要 对之前几篇博文涉及到的网络通信协议进行分析 xff0c 概述出TCP IP的协议栈模型 xff0c 最后根据实例对各层包头进行分析 二 标准TCP IP协议栈模型 标准TCP IP协议是用于计算机通信的一组协议 xff0c 通常被
  • 2范数和F范数的区别

    2范数和F范数是不同的 2范数表示矩阵或向量的最大奇异值 xff0c max svd X 而 F范数表示矩阵所有元素平方和的开方根 sqrt x i j X x i j 2 转载于 https www cnblogs com yinwei
  • 网络钩子webhook

    网页开发中的网络钩子是一种通过自定义回调函数来增加或更改网页表现的方法 webhook 发布订阅模式 xff0c 与api不同的是 xff0c webhook无需发送请求即可收到监听地址发布的消息 主要用途 xff1a 更新客户端
  • free -g 说明

    free g 说明 xff1a free g 43 buffers cache 说明 xff1a buffer 写缓存 xff0c 表示脏数据写入磁盘之前缓存一段时间 xff0c 可以释放 sync命令可以把buffer强制写入硬盘 cac
  • Google Drive 里的文件下载的方法

    Google Drive 里并不提供创建直接下载链接的选项 xff0c 但是可以通过小小的更改链接形式就能把分享的内容保存到本地 例如 xff0c 一份通过 Google Drive 分享的文件链接形式为 xff1a https drive
  • 关于虚拟机VMware Tools安装中出现的无法自动安装VMCI驱动程序的问题

    问题 解决方法 根据配置文件信息找到所在的虚拟机位置 找到后缀名为vmx的文件 xff0c 右键打开方式中选择使用记事本打开 选择左上角编辑中的查找功能输入图中的查找内容后 xff0c 点击查找下一个 将其原先的TRUE值改为false即可
  • 人脸识别概念杂记

    Gabor特征 xff1a 通过Gabor变换获取的特征 Gabor变换 xff1a 是在20世纪40年代有Gabor提出的一种利用高斯函数作为窗口函数的加窗傅里叶变换 Gabor变换可以有效的获取空间和方向等视觉信息 xff0c 使得原始

随机推荐

  • 大麦盒子(domybox)无法进入系统解决方案!【简单几步】

    大麦无法进入系统解决方案 xff01 简单几步 前提准备 xff1a 电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由器下的网络 xff01 前提准备 xff1a 电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个
  • 常见开发语言擅长领域

    Python xff1a 机器学习 xff0c 数据科学还有Web开发 JavaScript xff1a Web开发 xff08 前端和后端 xff09 和游戏开发 Java xff1a 移动Android应用程序开发 xff0c 企业应用
  • H3C 维护命令

    一 xff1a 基础维护命令 1 dis version 查看版本 2 dis cu 显示实时配置 3 dis this 显示当前视图下的配置 4 dis interface 显示接口 5 dis mac address 显示mac地址表
  • ROS下利用realsense采集RGBD图像合成点云

    摘要 xff1a 在ROS kinetic下 xff0c 利用realsense D435深度相机采集校准的RGBD图片 xff0c 合成点云 xff0c 在rviz中查看点云 xff0c 最后保存成pcd文件 一 各种bug 代码编译成功
  • SQL在工作中遇到的问题

    多表查询的用法区别varchar类型的时间比大小 多表查询的用法区别 一般对于两张表的查询习惯用 select from a b where a id 61 b id 最近发现也可以使用 select from a inner join b
  • 剑指offer

    目录 第2章 面试需要的基础知识 2 3 数据结构 2 3 1 数组 xff1a 二维数组中的查找 2 3 2 字符串 xff1a 替换空格 2 3 3 链表 xff1a 从尾到头打印链表 2 3 4 树 xff1a 重建二叉树 2 3 5
  • js阻止冒泡事件发生(react)

    其实就两个函数 event MouseEvent event preventDefault span class token punctuation span span class token punctuation span span c
  • 机器学习与深度学习核心知识点总结

    来源 SIGAI 数学 1 列举常用的最优化方法 梯度下降法 牛顿法 xff0c 拟牛顿法 坐标下降法 梯度下降法的改进型如AdaDelta xff0c AdaGrad xff0c Adam xff0
  • H3C STA>PC的数据转发

    转载于 https www cnblogs com fanweisheng p 11574797 html
  • etcd查看集群信息

    查看集群服务端口地址列表 etcdctl endpoints 61 https 192 168 1 65 2379 ca file 61 etc kubernetes ssl ca pem cert file 61 etc etcd ssl
  • Win10提示无法创建新的分区也找不到现有的分区解法

    原文链接 xff1a https www pconline com cn win10 1126 11261093 html 1 格式化整个硬盘 xff0c 重新分区 如果你的硬盘上没有重要数据的话 xff0c 到了分区这一步时 xff0c
  • 数据融合(data fusion)原理与方法

    数据融合 xff08 data fusion xff09 原理与方法 数据融合 xff08 data fusion xff09 最早被应用于军事领域 现在数据融合的主要应用领域有 xff1a 多源影像复合 机器人和智能仪器系统 战场和无人驾
  • 单目运算符-双目运算符-三目运算符

    1 单目运算符 xff1a 只对一个变量进行操作 a 43 43 xff1b 2 双目运算符 xff1a 对两个变量进行操作 xff1b a 61 1 b 61 3 c 61 a 43 b 就是双目运算符 xff1b 3 三目运算符 xff
  • finereport9.0破解版|finereport10.0破解并发数|finereport授权注册|FineBI5.0破解lic

    nereport9 0破解版 finereport10 0破解并发数 finereport授权注册 FineBI5 0破解lic 联系QQ 563471794 详细解密finereport9 0破解版中的报表执行过程 在报表开发工具Fine
  • 单片机或者cpu是多少位的,指的是地址总线还是数据总线(比如32位和64位的cpu)...

    一般来说 CPU的位宽指的是数据总线的宽度 这个你可以这么推想 xff1a CPU的地址总线宽度决定了寻址范围 xff0c 数据总线决定了单次能取出的数据的长度 决定CPU的性能的话 xff0c 数据总线和地址总线谁更能决定这个性能呢 xf
  • snmp v3 参数_SNMPv3 配置及snmpwalk命令信息获取

    snmp v3安全级别有三种 xff0c 分别为noAuthNoPriv 不认证也不加密 authNoPriv 认证但是不加密 authPriv 既认证又加密 一 SNMPv3配置代码 xff1a snmp server contact z
  • CRC16位校验

    之前有跟第三方通讯合作 xff0c 应为CRC表码问题导致校验出结果不一致 xff0c 纠结了很久 xff0c 最后直接采用CRC计算方式校验才解决 两种方式贴 xff0c 自行对比 CRC校验计算方法 private ushort CRC
  • 计算机关机界面卡住,win7关机卡死在正在关机界面

    虽然win7系统已经停止了更新 xff0c 但是相信还有不少的网友在使用这个系统 xff0c 我们在使用Win764位系统的时候 xff0c 难免会碰到一些故障 xff0c 最近就有用户出现了关不了机的情况 xff0c 那么该怎么办呢 xf
  • 前端异步请求async/await,axios的错误用法

    request为包装后的axios请求 1 直接return请求 xff0c 得到promise xff0c 获取不到返回值 xff0c const tmp 61 async 61 gt return request method 34 p
  • (转)从工具的奴隶到工具的主人 - 王垠

    我们每个人都是工具的奴隶 随着我们的学习 xff0c 我们不断的加深自己对工具的认识 xff0c 从而从它们里面解脱出来 现在我就来说一下我作为各种工具的奴隶 xff0c 以及逐渐摆脱它们的 思想控制 的历史吧 当我高中毕业进入大学计算机系