惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
S
Secure Thoughts
A
Arctic Wolf
V
Vulnerabilities – Threatpost
S
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
L
Lohrmann on Cybersecurity
Schneier on Security
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Scott Helme
Scott Helme
L
LINUX DO - 最新话题
L
LangChain Blog
量子位
T
Threatpost
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
W
WeLiveSecurity
Last Week in AI
Last Week in AI
美团技术团队
The GitHub Blog
The GitHub Blog
The Last Watchdog
The Last Watchdog
C
CERT Recently Published Vulnerability Notes
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LINUX DO - 热门话题
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Troy Hunt's Blog
Webroot Blog
Webroot Blog
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
V2EX - 技术
V2EX - 技术
雷峰网
雷峰网
Security Latest
Security Latest
小众软件
小众软件
J
Java Code Geeks
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Spread Privacy
Spread Privacy
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
The Blog of Author Tim Ferriss
M
MIT News - Artificial intelligence

Kaffa.im

Kaffa.im - 寻找数据源头 Kaffa.im - 玩魔方 Kaffa.im - AI 在常见病上取代医生 Kaffa.im - 上 NextCloud,一站搞定个人数据同步 在 Windows 上 Bose SoundLink 音箱声音自动停止问题的解决 Kaffa.im - 交易的实质——浪随风向 Kaffa.im - 新手学电脑从入门到精通 Kaffa.im - 数字化转型之路(从数字化到数智化) Kaffa.im - 机器人简史 Kaffa.im - 安卓Frida逆向与协议分析 Kaffa.im - 数学的惊奇 Kaffa.im - 牌局心理学 Kaffa.im - Python计算机视觉实战 Kaffa.im - ALaunch v1.0 发布 Kaffa.im - Windows 音频设备控制之旅 Kaffa.im - 结构性优势 Kaffa.im - 尤瓦尔·赫拉利-真假信息与连接 Kaffa.im - 小狗钱钱 Kaffa.im - 短视频编导全能手 Kaffa.im - 爆品创新:新时代爆品打造法 Kaffa.im - 如何阅读一本书 Kaffa.im - 冰血暴第一季 Kaffa.im - 冰血暴第二季 Kaffa.im - 冰血暴第三季 Kaffa.im - 冰血暴第四季 Kaffa.im - 冰血暴第五季 Kaffa.im - 思维迭代的26个卓越方法 Kaffa.im - 再度唤醒世界:赖特诗选 Kaffa.im - 中国量化投资 Kaffa.im - Clojure Recipes Kaffa.im - 文案卖货 Kaffa.im - 印象派与东亚美术 Kaffa.im - 深入实战vue开发 Racket Programming the Fun Way Kaffa.im - 我们为什么爱喝酒 Kaffa.im - 雅余的自省《独立博客自省问卷15题》 Kaffa.im - 2024年第41-42周周报 莫名解决局域网内 macOS 与 Windows 不能互访的问题 Kaffa.im - 2024年第39-40周周报 Kaffa.im - 2024年第37-38周周报 Kaffa.im - Money Focused Freestyle 给网站增加了 DIŸgöd 的 follow(Description 方式) Kaffa.im - 给网站增加了 DIŸgöd 的 follow Kaffa.im - 2024年第35-36周周报 Kaffa.im - 记录盒马鲜生好吃的烘培和好喝的啤酒 Kaffa.im - 边水往事 Kaffa.im - 事件流实战 Kaffa.im - 神经漫游者 Kaffa.im - 重启蒙娜丽莎 Kaffa.im - 零伯爵 Kaffa.im - TypeScript编程 Kaffa.im - 唯有书籍——读书、藏书及与书有关的一切 Kaffa.im - 福佳白啤 Kaffa.im - 2024年第33-34周周报 Kaffa.im - 安全意识、记一次MySQL勒索 Kaffa.im - 2024年第31-32周周报 Kaffa.im - 关于遗产代码维护 Kaffa.im - Rust项目开发实战 Kaffa.im - 抖音盒子:短视频与直播带货从入门到精通 Kaffa.im - 浮华与金戈(中世纪上) Kaffa.im - Rust系统编程 Kaffa.im - 大话机器智能 Kaffa.im - 为什么伟大不能被计划——对创意、创新和创造的自由探索 Kaffa.im - 电解质水平替、该不该喝酒及智商堪忧 Kaffa.im - AI融入生活的两点想法 Kaffa.im - 2024年第29-30周周报 Kaffa.im - 2024年第27-28周周报 Kaffa.im - 别丧了,一点也不酷 Kaffa.im - 心智的本质 Kaffa.im - 宽客人生 Kaffa.im - 工作一年拉开差距:问题解决 Kaffa.im - 工作一年拉开差距:逻辑思考 Kaffa.im - Svelte和Sapper实战 Kaffa.im - The Digital Factory Kaffa.im - 游世与自然生活——庄子评传 Kaffa.im - 工作的原理·发现问题篇 Kaffa.im - 工作的原理·解决问题篇 Kaffa.im - DB Service Kaffa.im - 2024年第26周周报 Kaffa.im - 「KN.phoenix」终极笔记软件需求 Kaffa.im - ALaunch v0.9 发布 当我们 Build in Public 时,我们谈些什么 Kaffa.im - 2024年第25周周报 Kaffa.im - 给网站增加最近评论功能 Kaffa.im - 2024年第24周周报 Kaffa.im - [翻译]此网站是个人的 Kaffa.im - [翻译]制作自己的独立网站 Kaffa.im - [翻译]制作自己的独立网站 Kaffa.im - 2024年第23周周报 清除 Microsoft Edge 自动跳转 https 的缓存 参加 AWS 讲 AIGC 活动 Kaffa.im - 2024年第22周周报 Kaffa.im - 2024年第21周周报 Kaffa.im - 2024年第20周周报 Kaffa.im - 营销管理 Kaffa.im - 所有旅生,AI的一图定位来了 Kaffa.im - 2024年第19周周报 Kaffa.im - 2024年第18周周报 Kaffa.im - 年轻只是爱构建
Kaffa.im - 《黑客与画家》中累加器引发的思考
Kaffa · 2024-07-25 · via Kaffa.im

本篇是关于《黑客与画家》中 Paul 用累加器作为例子营销 Lisp,第一次读他的书时,还看不太懂,多年后我大约能理解一点了。我想就此问题本身和此问题的外延讨论一番,当然,你也看到本文的成熟度为 3 / 5,说明随着我对技术的理解,后续会持续修订。

了解本篇探讨的内容时,需先了解一点背景。Paul Graham 因创办 Y Combinator (创业公司孵化器)而成为美国“创业教父”。在他的随笔集《黑客与画家》中举了一个例子,用 lisp 编写累加器来说明 lisp 语言能力。怎么理解这个累加器,其实每个人都见过,基本上可等于计算器上的那个 M+ 键在计算机软件中的实现。其次,Lisp 是一门如此久远而特别的编程语言,用 Paul Graham 《On Lisp》一书中的话来说,就是 lisp 是一种可编程的编程语言。

这里的可编程,也类似编程语言中的 Lambda(常以希腊字母 λ 表示)以及宏代表的元编程能力,Ruby 语言的作者特别描述了这块,Y Combinator Y 也许也有此意义。

累加器问题本身

Paul 提出一个类似编程问题:写一个函数,它能够生成累加器,即这个函数接受一个参数 n,然后返回另一个函数,后者接受参数 i,然后返回 n 增加了 i 后的值。就是说,写一个能生成函数的函数。

Common Lisp 的实现为:

(defun foo(n)
  (lambda (i) (incf n i)))

调用方式和结果可以是:

(setq acc (foo 2))
(print (funcall acc 6)) ; 8
(print (funcall acc 7)) ; 15

并且举出了 Ruby、Perl、Smarttalk、JavaScript 的实现,并列举了 Fortran、C、C++、Java、Visual Basic 似乎无法实现或优雅的实现。

特别的,Paul 强调了 Python 貌似比 Perl 优雅,但实现起来由于 lambda 支持的局限,也未能有类似实现。

从逻辑上,似乎是仅针对 Python 语言设计的一个偏好来对比它,未免显得不公。Python 的实现更函数式一点,也是表达了 Guido 对 Python 语言设计的取舍,弱化的 lambda。Lisp 其实算是函数式的鼻祖,但上面的累加函数反而不够满足,它对相同的输入,返回不同的值,因为它不够内聚,对外依赖初始值这个外部状态,不利于没有上下文时去理解程序,且 lambda 内部引用了 n 还修改了 n 的值,就好比你有一个钱包,当你第一次放了 10 块钱进去后,你发现它同时拿走了你上衣口袋的 8 块钱,第二次放了 10 块钱进去时,它又拿走了 7 块。(这个函数的实现上和学院教授的软件质量是对立的,这样的巧妙实现也许在内核级别或高度优化场景需要,但在应用软件上是完全不需要的。按现在软件质量看,它实现得非常野生,这样的能力只在能懂且能控制的人的设计中有用。对较大规模软件工程,就是灾难。)

如果某语言可以比较视觉优雅实现这个函数,则该语言函数须是一等公民(可以作为返回值),其次在闭包作用域实现上借鉴了 lisp。

让我来扩充现代语言的实现,比如 ES 的语法糖:

const foo = n => i => n + i;

Rust 显得格外严谨也显得强约束,其次整数类型 i32 还需要仔细斟酌:

fn foo(n: i32) -> Box<dyn Fn(i32) -> i32> {
    Box::new(move |i| n + i)
}

其实,能优雅实现的不只 lisp 和 lisp 方言、ruby 等,连前辈 tcl 都优雅:

proc foo {n} {
    return [lambda {i} {expr {$n} + $i}]
}

唯独 Python 的实现要丑陋一点,原因是 lambda 匿名函数的不支持 return,要不,支持象牙符后的 Python,以下代码也确实合理:

def foo(n):
    return lambda i : return (n := n + i)

但现在,较恰当的实现如下,nonlocal 在内部作用域捕获外部 n,也是合理的,从代码清晰性上说,python 更甚一筹:

def foo(n):
    def bar(i):
        nonlocal n
        return (n := n + i)
    return bar

第二个实现,属于老油条代码,这个程序员至少理解引用:

def foo(n):
    s = [n]
    def bar(i):
        s[0] += i
        return s[0]
    return bar

但这种属于一种 hack 方式绕过语法的不支持,不深入研究一下 Python 特性无法一下看懂。

累加器问题外延

累加器问题外延其实是技术竞争优势,对强抽象表达的编程语言带来的软件质量,这属于高智商的智力游戏。

事出一个精通 lisp 的人选择使用 lisp 开发商业应用,并利用 lisp 语言优势快速开发了 Web 程序。

这一切都是开创性的,我非常理解这个过程,这意味着没有轮子,大部分需要自己造。

所有的编程都是开拓性的,而不是使用已有的成熟方案,lisp 正是这种 10X 程序员的秘密武器。

然后,这个创业过程还胜出了,这其中发挥作用的,我看到的,是真正的批判性思维,和基于事实逻辑和编程实力。

它提到的 lisp 的表达和抽象能力能帮助他以更少的代码击败那些 java 公司。

或许在他那个时代是这样的吧,lisp 是他的秘密武器,人才市场中,lisp 看似人少,但创业团队 10 人以下就够,且懂 lisp 的都是精英,你在 lisp 圈子中很容易找到这 10 个懂 lisp 的人。

我非常喜欢“拒绝平庸”、“书呆子的复仇”两章,也喜欢 lisp,但这个语言放在国内用于创业,基本是失败了一半。

一是找不到真正理解 lisp 的精英用它来配合现有基础设施开发商业应用,二是这个年代开发技术,特别是编程语言技术的差异,已经无法构成竞争优势。

但没关系,这不妨碍它成为书呆子的快乐。

c++ 一直在,perl 之后 java 崛起了,然后 ror 颠覆了 web 领域编程范式,然后是 go,也许 rust 之后,再没有像样的颠覆者了,dojo 可认为只是在某领域的优化,尤其是看到 ror 在 rust 中的实现 loco 时,似乎编程语言走向了终结。

总的感觉

即使 lisp 在语言能力上顶级的,但并不意味着 lisp 和商业成功之间有强关联性,而是使用 lisp 的背后的人的思维能力导致的。

用中国话说就是“艺高人胆大”,选择了少有人走到路,路还走通了,只不过这个艺,并不仅仅指 Paul 精通 lisp,而是指他习得的思维方式与精神。

思考方式和背后的精神;前者能给特立独行的创业者在混沌的商业环境之中获得优势分,后者确保思考方式。

至于技术能力和思考能力,那可以在事上练就。