函数式编程作为一种编程范式,其根源可以追溯到 20 世纪 30 年代,当时数学家们正在探索计算理论的基础。1936 年,阿隆佐·丘奇提出了 λ 演算(Lambda Calculus),这是一种形式系统,用于表达函数抽象、函数应用以及变量绑定。丘奇的 λ 演算为函数式编程奠定了理论基础。
同年,艾伦·图灵提出了图灵机的概念,这是一种理论上的计算模型,能够模拟任何计算机算法的逻辑工作流程。图灵机与 λ 演算在理论上被证明是等价的,即它们具有相同的计算能力。这一发现不仅推动了计算理论的发展,也为后续的编程语言设计提供了理论支持。
如今,函数式编程因其易于理解和维护的特点,以及处理并发问题的能力,开始受到越来越多的关注。许多现代编程语言要么本身就是函数式语言,要么至少提供了一些函数式编程的支持。
针对希望在日常工作中利用函数式编程解决问题的程序员,知名软件匠人 Robert C. Martin(简称 Bob 大叔)撰写了一本新书——《函数式设计:原则、模式与实践》。这本书的标题也致敬了他的经典著作《敏捷软件开发:原则、模式与实践》,旨在帮助程序员理解如何使用函数式编程语言来完成实际任务,而不是深入探讨 Monads、Monoids、Functors 等理论概念。这些理论虽然非常重要,但在大多数情况下已经融入了常见的语言、代码库和框架之中。
CSDN《新程序员》即将采访 Robert C. Martin,向 Bob 大叔讨教最卓越成效的编程技巧,同时询问他对于当今 AI 编程革命的最新观点。在此,CSDN 面向所有开发者征集“你最想问 Robert C. Martin(Bob 大叔)的 1 个问题”,欢迎各位程序员们留言提出自己最为关心的问题!
所有的函数式编程实际上都是 λ 演算。
——《函数式设计》,Robert C. Martin
“Bob 大叔”是谁?
Robert C. Martin 被誉为世界著名编程大师,虽然他现在很欢迎大家叫他“Bob 大叔”(Uncle Bob),但这个绰号的由来却让人哭笑不得。
1988 年,Martin 在伊利诺伊州的一家初创公司上班,当时办公室里有个叫“Billy”的人,是个烦人精,很喜欢给别人取绰号,甚至给办公室里的每个人都取了个绰号。
Billy 给 Martin 取的绰号就叫做“Bob 大叔”,非常无厘头,没人知道他取这个绰号的缘由。随着一天天过去,这个绰号越叫越熟,这个人开始只用“Bob 大叔”称呼 Martin。
后来,Martin 离开了这家公司。所幸的是,他发现当时没有其他人叫他“Bob 大叔”,便自以为可以永远摆脱这个称号了。
结果,某天 Martin 发现,在新公司的会议上,有人看到他并大叫了一句“Bob 大叔!”,把他吓了一跳。一问才发现,原来他自己曾经把 Usenet(这是互联网早期的一款讨论组应用,四十多年前还没有浏览器,程序员们就在这上面交流想法)上的签名设置成了“Bob 大叔”,后面放了一整年没管,这也导致他一年以来的电子邮件签名全都沿用了“Bob 大叔”这个绰号。
随后,Martin 把“Bob 大叔”从电子邮件的签名中删掉,但新公司的人却都开始管他叫“Bob 大叔”。从那一刻开始,他发现自己永远摆脱不了这个绰号了 —— 而且他也发现这个绰号意外的还不错,可以占人便宜。毕竟,谁不想当世界上所有程序员的叔叔呢?
敏捷开发的“活化石”
Bob 大叔是敏捷开发和设计模式的先驱,他从 1970 年开始从事软件专业工作,从事相关工作超过 50 年。知名的“SOLID 五大原则”,即面向对象编程领域的五个设计原则,便出自他的手笔。他在 21 世纪早期提出了 SOLID 五个首字母缩写,便于记忆:
- Single Responsibility Principle(单一功能原则)
- Open/Closed Principle(开闭原则)
- Liskov Substitution Principle(里氏替换原则)
- Interface Segregation Principle(接口隔离原则)
- Dependency Inversion Principle(依赖反转原则)
除此之外,他也是“敏捷宣言”的联合签署人、“敏捷联盟”的首任主席、C++ Report 杂志前主编。他发表了大量有影响力的文章,并经常受邀在许多国际软件大会上发表演讲。
后来,Bob 大叔还用自己的绰号创立了 Uncle Bob Consulting 有限责任公司,并与儿子 Micah Martin 共同创立了 Clean Coders 有限责任公司。他还是 Clean Code、Clean Architecture 和 The Clean Coder 等多本畅销书籍的作者。
71 岁了,还在网上坚持和人对线?
Bob 大叔从来都不是理论派,他和我们熟悉的 Linux 之父林纳斯·托瓦兹一样,混迹各种互联网早期的开发者社区,还都特别擅长在网上和人“唇枪舌战”。
五年前,Bob 大叔现身开发者博客平台 Hashnode,并挑选了一个良辰吉日,发了个帖子,题为《我就是 Robert Martin(也就是你们熟知的 Bob 大叔),你可以问我任何问题》,并欢迎开发者在下面直接开始对他提问,可谓是非常豪迈。
本次 CSDN 采访将会募集广大开发者社区的提问,如果你不知道该问 Bob 大叔哪些问题,不妨来看看五年前的开发者们是怎么做的:
开发者:当前软件工程的哪些趋势被高估了?自 1970 年以来,软件工程的哪些实践发生了根本性的变化?
Bob 大叔:目前是微服务。自 1970 年以来有什么改变?那毫无疑问是敏捷。敏捷意味着承认在软件开发中纪律比仪式更重要。
开发者:你对 Node.js 有什么看法?
Bob 大叔:我不怎么写 JavaScript 代码。我从未使用过 node。我希望可以跳过整个 JavaScript 代码,改用 Clojurescript,嘿嘿。
开发者:怎么看待 Reddit 上那些针对你的网络黑子?
Bob 大叔:我不逛 Reddit,我知道有些人因为这样或那样的原因不喜欢我。但这没关系,因为我相信思想市场理论,如果他们的想法最终被证明更好,那他们就是对的。
还有一些人不喜欢我,是因为我是保守派和共和党人,因为我投票给川普。但这没关系,因为我相信思想市场理论,如果我的政治观点是错误的,那么它就会失败。
与此同时,我已经当了 48 年的程序员,很少有人能连续 48 年编程。这种经验水平让我处于某种权威地位。我还是个相当不错的作家,这很有帮助。不管怎样,互联网上足够的空间容纳我们所有人。
开发者:程序员要学多少语言?
Bob 大叔:每个程序员都应该了解多种语言。Dave Thomas 和 Andy Hunt 曾经说过(在《程序员修炼之道》中):“每年学习一种新语言。” 这是个很好的建议。
每个程序员都应该了解一种基于 C 的语言,如 C、Go、Java、C# 或 C++。
每个程序员都应该了解一种函数式语言,如 Clojure 或 F#。
每个程序员都应该了解一种基于堆栈的语言,如 Forth。
每个程序员都应该了解一种逻辑语言,如 prolog。
每个程序员都应该了解 LISP。
这仅仅是个开始。
开发者:我知道你离开了 C++ 标准委员会。有鉴于此,您如何看待 Rust 的生命周期和所有权?以及总体而言,Rust 及其在编程语言领域的未来?
Bob 大叔:我从未被邀请加入 C++ 标准委员会。如果有人邀请我,我一定会拒绝。我讨厌官僚主义。我不想为小小的语言特性斤斤计较。我只想写代码。
我对 Rust 一无所知。也许有一天我会去研究一下,但我还有很多其他事情要做。
开发者:您认为计算机科学教育对于软件工程师来说怎么样?它是完全无用的,还是您认为它有一定的价值?
Bob 大叔:这取决于学校。在一些学校,完全有可能不写一行代码就能获得计算机科学硕士学位。这简直是荒谬的。另一方面,有些学校在让你的手指敲击键盘方面做得相当不错。但总体而言,我认为计算机科学学位不是必需的,甚至不值得花钱。软件是一门可以通过良好的计划在工作中学习的行业。
开发者:在大部分 Clean Coders 的视频中,你邀请我们走进你的生活,仿佛是在自家客厅里,你总不忘先为我们上一堂生动的科学课,然后才转入正题。这是否意味着,作为一名软件工程师,你暗示我们可以拥有这样一种生活方式,既充实又自在?
Bob 大叔:没有什么刻意的安排,也没有任何暗示。你所看到的,就是我真实的生活状态。
我没有接受过正规教育,没有大学文凭。1970 年,当我 18 岁的时候,就开始了我的编程之旅。我接触过 COBOL、PL1、FORTRAN 和汇编语言,一路走来,我从未后悔。
如今,48 年后,这些年的积累让我拥有了安逸的生活条件。但在职业生涯的初期,我过着捉襟见肘的日子。
随着经验的增长,我的收入也相应提高,但与此同时,家庭的责任和开支也随之增加。确保财务状况稳定,成了我长达三十多年的挑战。
我尝试创办了自己的企业,一度雇用了许多人。但请不要相信那些说创业是快速致富捷径的人。事实往往并非如此,大多数时候,这条路充满艰辛。最终,我的企业没能幸免于失败的命运,留下的是一笔沉重的债务。
现在,到了人生的暮年,我本可以稍稍放松,享受生活。但我并不打算这样做。我热爱我的工作,而且我做得非常出色,从中获得了巨大的满足感。
我只希望你们每个人都能像我一样,找到属于自己的幸福,无论是在家庭生活,还是在职业生涯中,都能体验到作为丈夫、父亲和程序员的快乐。
向 Bob 大叔提出你的疑问!
2019 年的时候,大模型时代还未开始,ChatGPT 与 GitHub Copilot 没成为程序员的标配,我们也就无法得知 Martin 对此的最新看法。如今,编程范式出现了巨大变化,对话大师的机会就在眼前,请将你所关心的问题在评论中留下来,CSDN 将精选向 Robert C.Martin 提问!
提问方式:在评论中发出即可,最好详实、具体、有针对性。