原文见 http://bartoszmilewski.com/20...

我打算为程序猿们写一本讲范畴论的书已经有一段时间了。注意,受众不是计算机科学家,而是程序猿——是工程师,而不是科学家。这听起来挺疯狂,我也有些诚惶诚恐,但是我无法容忍科学与工程之间存在着巨大的鸿沟,更何况我自身的工作也是经常需要我在这两个世界中穿梭。不过,要解释一些东西,总让我感觉非常窘迫。我非常敬仰 Richard Feynman(理查德·费恩曼),在讲授知识方面他是深入浅出的大师。我不是 Feynman,但我会尽力。我从发布这篇序言开始,激励读者学习范畴论,希望能引发一些讨论并得到一些反馈意见。

下面我要用几段文字让你相信,这本书是写给你的。根本没必要担心它是几乎会耗尽你所有的业余时间的一门最抽象的数学。

我的乐观来自一些观察。首先,范畴论是相当有用的编程思想宝藏。Haskell 程序猿们已经涉足此境很久了,其中的一些思想正慢慢的渗入其他语言,只是这一过程是非常缓慢而已,我们需要使之加速。

其次,有许多种数学,它们面向不同受众。你可能不喜欢代数学,但这并不意味这你无法喜欢范畴论。我会向你展示,范畴论非常适合程序猿的思维。因为范畴论处理的对象不是计算细节,而是结构。它处理的是使程序可复合的结构。

复合是范畴论的精髓,它也是范畴论自身定义的一部分。我会证明编程的本质是『复合』。我们一直都在组合一些东西,这种行为从很久以前一群伟大的工程师提出子程序的时代就开始了。很久以前,结构化编程原理掀起了编程的革命,它立足于代码级别的复合。伴随面向对象编程而来的则是对象的复合。函数式编程不仅仅设计函数的复合与代数数据结构,它还提供了对并发计算的支持,这是其他编程范式难以实现的。

第三,我有秘密武器,一把庖丁之刀,我要用它将数学大卸八块使之成为程序猿的美味佳肴。如果你是数学家,你不得不大胆假设,小心求证,严格的构造你的定理,然后产生令外人难以卒读的论文与专著。我是训练有素的物理学家,在物理学中,我们使用着并不正规的推理来取得令人激动的发现。数学家们嘲笑伟大的物理学家 P. A. M. Dirac 为求解一些微分方程而提出的狄拉克 δ 函数,但是当他们发现了一个叫做广义函数论的新的数学分支时,他们就不笑了,因为广义函数论只是对 Dirac 观点的一种形式化描述。

当然,采用不严肃的论证方式很容易产生谬论。因此在这本书中凡是遇到不正式的论证时我会尽力确定其背后存在着相应的实际数学理论。我床头有一本被我翻的破破烂烂的 Saunders Mac Lane 写的《Category Theory for the Working Mathematician》。

译注:Category Theory for the Working Mathematician,可翻译为『面向一线数学家的范畴论』?

由于这本书是写给程序猿的范畴论,因此我将会用计算机程序代码展现范畴论的主要概念。你可能会担心函数式语言会比传统的命令式语言更接近数学,并认为前者为此已经提供了更多的抽象能力,所以想当然的认为只有学习了 Haskell 方能将范畴论的能量作用于现实,或者认为范畴论在函数式编程范式之外没有什么用处,这些看法并不正确。我会提供大量的 C++ 的例子,只不过你得容忍一些丑陋的语法,需要在繁琐的代码中探寻清晰的模式,并且在更高层抽象的场合不得不做一些复制与粘贴的工作,不过这也正是大部分 C++ 程序员经常干的事。

不过,你也无法脱离 Haskell 的羁绊。虽然没有必要成为一名 Haskell 程序猿,但你需要将 Haskell 作为一种草图性的语言,用于描述那些 C++ 示例的实现思想。这也正是我当初开始学习 Haskell 的所用的方法。Haskell 简洁扼要的语法与强大的类型系统,对于理解与实现 C++ 模板、数据结构与算法非常有帮助。当然,我不可能要求读者事先以已经了解 Haskell,我会逐步介绍 Haskell 的知识,并且会对我所用到的那部分 Haskell 代码给出详细的解释。

如果你是一名有经验的程序员,可能会自问:即使不懂范畴论与函数式方法,我也照样写代码,似乎没什么必要学习它们。的确如此,不过你无法阻止正在侵入命令式语言的那股沉稳的函数式潮流。即使是 Java,面向对象编程的坚固堡垒,也拱手请来了 Lambda。C++ 也正在大踏步前进,现在每隔三五年就发布一个新标准,它正在尝试赶上这个正在变化的世界。这一切都在为一场变革而准备,这种变革,用我们物理学家的术语可称为相变。如果你持续的烧水,它最终会沸腾。我们现在正处于青蛙的位置,必须决定是在升温的水中继续游动,还是开始作出其他抉择。

驱动编程范式产生巨大变革的力量之一是多核革命。主流的编程范式——面向对象编程已经难以胜任并发与并行计算领域,它只会造成危险且充满 bug 的设计。数据隐藏,是面向对象的基本前提,一旦对象被共享且被修改,就会造成数据竞争。将数据与互斥锁组合起来看似是个不错的解决方案,但不幸的是,互斥锁不能组合,并且一旦在数据竞争中出现死锁,程序非常难以调试。

对于非并发计算,软件系统日益递增的复杂度也正在炙烤着命令式编程范式。简而言之,副作用正在失去控制。有副作用的函数很便捷又易于编写。原则上,有副作用的函数所产生的影响可在函数名以及注释中予以标明。一个叫做 SetPasswordWriteFile 的函数显然在修改某种状态并产生副作用,对此我们已经非常习惯且不以为然。只有当我们开始将这些有副作用的函数层层组装到一起,事情才开始变得棘手。副作用本身并不坏,但是将它们塞到一个大尺度视图中,我们很难再看清它们,它们便脱离了我们的掌控。完全与副作用打交道的命令式编程范式才是元凶。

硬件的变化与软件复杂度的增长都在迫使我们重新思考编程的根本思想。正如欧洲最宏伟的哥特式大教堂的建造者那样,我们正在面对着原料与结构的限制而磨砺着我们的技艺。法国的博韦有一座未完工的哥特式教堂,它就是人类与限制作斗争的见证。这座教堂的设计企图在高度与采光方面击败所有的教堂,但是建造中却出现了一系列的崩塌。当时不得不用钢梁木柱临时做成支撑架构来阻止崩塌,但于事无补,因为很多东西在设计上就是错的。从现代的视角来看,博韦教堂是个奇迹,其相当多的一部分哥特式结构已经成功的建造了出来,这在那个没有现代材料科学、计算机建模、有限元分析甚至没有普通的数学与物理的时代显得有些不可思议。我期望我们的后代也会敬佩我们在构建复杂的操作系统、网络服务器以及互联网架构中展现出来的技术。毫不客气的说,他们理应如此,因为我们是在脆弱的理论基础上完成的这一切。但是,如果我们想继续前进,那么就必须修正现有的理论基础。

下一篇 -> 范畴:复合的本质

译 写给程序猿的范畴论 · 序相关推荐

  1. 写给程序猿的把妹指南

    写给程序猿的把妹指南:概述篇 每个女人都是一套系统 每个女人,都是一套复杂的系统,只不过,这套系统不是由程序员创造的,而是由大自然进化而成的.大部分程序猿不太懂得如何泡妞,是因为你不熟悉女人这套系统, ...

  2. 写给程序猿的把妹指南:概述篇

    每个女人都是一套系统 每个女人,都是一套复杂的系统,只不过,这套系统不是由程序员创造的,而是由大自然进化而成的.大部分程序猿不太懂得如何泡妞,是因为你不熟悉女人这套系统,也没人教过你如何学习这套系统. ...

  3. 写给程序猿们的交互设计

    转自 http://blog.jobbole.com/39985/ 英文原文:medium.com ,编译:36kr 编者按:看到此文时恍惚回到自己学习网页的时候,那时候只知有编程,不知有设计.各个论 ...

  4. 《28岁未成年》--- 写给程序猿

    前段时间看了这场电影,之前没有听说过任何相关内容,完全是冲着名字去的. 这部电影具体怎么样就不评价了 毕竟一千个人眼中有一千个哈姆雷特,咳,但可能其中600个都有点磕碜,不过王大陆还是很帅气的. 虽然 ...

  5. 程序猿的节日:1024,今天祝愿全球所有程序猿们、IT精英们节日快乐!——我在上海写代码

    程序猿的节日:1024,作为程序猿,祝全球所有程序猿们.IT精英们节日快乐!--我在上海写代码 ​ 程序猿的节日: 祝愿全天下程序猿们.IT精英们节日快乐!今天是属于我们的节日,该狂欢的时候,就不要吝 ...

  6. 幸福村站——成都传智播客程序猿写出你的烧烤代码

    又是一个阳光明媚,风和日丽之天,假设作为程序猿的你还在键盘上苦苦的想着下一串代码该怎么写的话,那你就弱爆了.俗语说得好,学习要劳逸结合,写代码更是须要清晰的思维,在传智播客Java基础班开班一个月后, ...

  7. 菜鸟、普通、老鸟程序猿如何写奇数判断?--位操作符妙用

    背景: 在进行程序开发时,经常需要通过判断一个整数是奇数还是偶数,来实现一些特殊的效果和功能,例如,让表格的奇数行显示一种背景颜色,偶数行显示另一种背景颜色.那么该如何判断一个整数是奇数还是偶数呢? ...

  8. 写 Python 到底用什么编辑器好?鹅厂程序猿吵翻了

    不管你是 Python 新手还是老鸟,肯定纠结过一个问题:到底用什么编辑器写 Python 代码好? 今天,他二哥在调研了数十位鹅厂程序猿后,给你一个答案.

  9. 用程序猿思维、程序设计师思维两种方式写求斐波那契数列的方法。

    //用Java实现斐波那契数列(Fibonacci) public class Test {public int f(int n)//n代表第几个数字.程序返回它相应的值{return n>2? ...

最新文章

  1. vps建网站python_VPS配置python web环境真吐血
  2. Day 5: GruntJS——重复乏味的工作总会有人做(反正我不做)
  3. C语言 求sin(x)的近似值
  4. 软件外包项目管理3点体会
  5. c++设置一个二维字符组初值_6.8 C++字符数组
  6. Struts2 + Hibernate + Spring 以及javaweb模块问题解决(1)
  7. L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT
  8. 环球电子公司将为新的Virgin TV 360平台提供语音遥控器
  9. 鼠标测试软件m,[论坛]魔技无线激光鼠标测试心得(二)
  10. 简单的酒店管理系统(纯属练手)
  11. 从k-\epsilon到k-\omega
  12. mac ps安装 服务器无响应,Mac程序无响应?六个方法教你如何退出无响应的程序...
  13. LA4043 KM算法
  14. Pulling is not possible because you have unmerged files
  15. 支持3d android 模拟器,3D太空模拟器
  16. 个人java后端详细学习路线(0→1)
  17. 漫画:经典谷歌面试题“扔鸡蛋”,看看你会做吗?
  18. 基于matlab的低秩结构重构算法仿真实现,对比ALM,IT,APG,ADMM
  19. MC30P6280晟矽微原厂是一款性能好低功耗8位OTP+IO型MCU
  20. 2019年广东工业大学腾讯杯新生程序设计竞赛(同步赛)

热门文章

  1. cd命令的各种使用方法
  2. 长沙理工大学计算机网络试题,长沙理工大学考试试卷(计算机网络)祥解.doc
  3. 判断季节,是春夏秋冬哪一个季节
  4. 保存google背景图片的方法
  5. 社交的本质究竟是什么?
  6. (已更新)电子合同小程序源码下载,主打线上合约签订系统
  7. 《孤尽班T31-05-技术架构选型笔记》
  8. 江西省工艺美术师陈海清老师*
  9. 裸眼立体(自由立体)显示原理与器件制作
  10. 从程序员到项目经理(二):升职之辨