[背景音:咖啡馆环境音,键盘敲击声]
Alex: 嘿,Sam!好久不见,最近在搞什么?
Sam: Alex!正好想找你聊聊。我最近在用 Claude Code,就是 Anthropic 出的那个命令行工具。你知道吗?用着用着,我突然想起了咱们以前讨论过的 Smalltalk...
Alex: 当然记得!那个"代码即数据,数据即代码"的老古董?等等,你不会是想...
Sam: 哈哈,你猜对了一半。你知道Smalltalk最革命性的地方是什么吗?
Alex: 消息传递?对象导向?
Sam: 不,是它彻底抹平了源代码和运行时的边界。在Smalltalk里,你不是在"编写"程序,而是在"雕塑"一个活着的系统。代码是数据,数据是代码,更重要的是——编程环境本身也是可以被编程的数据。
Alex: 这和Claude Code有什么关系?
Sam: 来,我给你演示一下 Claude Code。但我要分两种模式给你看,你才能理解这种"一切皆数据"的理念如何在AI时代重生。
Alex: 两种模式?
Sam: 对,先看第一种,默认模式,需要用户确认每一步。[键盘声] 看,我现在输入:"帮我分析一下当前目录下所有 Python 文件的代码复杂度"。
$ claude "帮我分析一下当前目录下所有 Python 文件的代码复杂度"
Claude: 我来帮您分析 Python 文件的代码复杂度。首先让我搜索一下有哪些文件。
工具调用: Bash
命令: find . -name "*.py" | head -5
是否执行?[Y/n]: y
输出:
./main.py
./utils/helper.py
./utils/parser.py
./models/user.py
./models/product.py
Claude: 找到了 Python 文件。现在我需要安装代码复杂度分析工具。
工具调用: Bash
命令: pip install radon
是否执行?[Y/n]: y
输出:
Successfully installed radon-5.1.0
Claude: 很好,现在执行复杂度分析。
工具调用: Bash
命令: radon cc . -s
是否执行?[Y/n]: y
输出:
main.py
F 15:0 process_data - B (7)
F 45:0 validate_input - A (3)
...
Alex: 这就是普通的对话式交互啊,一问一答。
Sam: 对,现在看第二种模式 - 开启 bypass permission,不需要用户确认。
$ claude --bypass-permission "帮我分析一下当前目录下所有 Python 文件的代码复杂度"
正在搜索 Python 文件...
$ find . -name "*.py" | wc -l
15
检查工具...
$ which radon
radon not found
安装分析工具...
$ pip install radon
Successfully installed radon-5.1.0
执行分析...
$ radon cc . -s
main.py
F 15:0 process_data - B (7)
F 45:0 validate_input - A (3)
...
分析完成。发现 3 个高复杂度函数需要重构。
Alex: 哇,这次是一气呵成,没有停顿!
Sam: 注意看区别了吗?第二种模式里,Claude Code 就像在表演独角戏。它不是在和你对话,而是基于上一步的输出(stdout)来决定下一步做什么。
Alex: [若有所思] 等等,这让我想起了Smalltalk的workspace...
Sam: Exactly! 在Smalltalk里,你在workspace里写的每一行代码都是即时执行的,输出立即可见,然后你基于这个输出继续编写。Claude Code在bypass模式下做的是同样的事——每一步的输出成为下一步的输入。
Alex: 所以你是说每一步之间...
Sam: 对!每两步之间,实际上是这样的流程:
步骤1: find 命令
↓ (stdout: 文件列表)
LLM 分析输出,生成下一步参数
↓
步骤2: 检查 radon 是否存在
↓ (stdout: command not found)
LLM 分析输出,生成下一步参数
↓
步骤3: pip install radon
↓ (stdout: 安装成功)
LLM 分析输出,生成下一步参数
↓
步骤4: radon cc 执行分析
Alex: 所以本质上是 generate_params_by_llm() 在串联整个流程?
Sam: Exactly!这就是Smalltalk开发模式的精髓——没有源代码和编译产物的区别。在传统开发中,你写源代码,编译成二进制,然后运行。但在Smalltalk里,你直接操作的就是运行中的对象。
Alex: 而在Claude Code里...
Sam: 在Claude Code里,LLM的提示词是文本,输出是文本,更关键的是——生成下一步提示词的规则也是文本!这完美对应了"一切皆数据"的理念。现在,如果我们把这个过程固化下来,去掉 LLM 调用,直接写成脚本会怎样?
#!/bin/bash
# analyze_complexity.sh - Claude Code 生成过程的固化版本
# 步骤1: 搜索文件(原本由 LLM 决定的参数)
file_count=$(find . -name "*.py" | wc -l)
echo "找到 $file_count 个 Python 文件"
# 步骤2: 检查工具(原本由 LLM 根据步骤1输出决定)
if ! command -v radon &> /dev/null; then
echo "安装分析工具..."
pip install radon
fi
# 步骤3: 执行分析(原本由 LLM 根据步骤2输出决定)
radon cc . -sAlex: [恍然大悟] 原来如此!Claude Code 不是在回答问题,而是在编写并执行一个程序!
Sam: 更准确地说,不管你问什么问题,Claude Code 都在做两件事:
- 给你答案
- 把制作这个答案的程序也写出来了
这就是Smalltalk式的开发——你不是在"使用"工具,而是在"塑造"工具。每次交互都在改变系统本身。
Alex: 所以当我问"帮我分析代码复杂度"时,我其实是在无意识地让 Claude Code 生成了一个"代码复杂度分析软件"?
Sam: Bingo!而且最妙的是,你根本不需要说"生成xxx软件"这样的提示词。你只是在正常提问,软件就自然生成了。
Alex: 等等,你是说... [咖啡杯放下的声音] 用户以为自己在对话,实际上是在无意识地编写程序?
Sam: Exactly!而且这让我想到一个更深层的问题。想象一下,如果 Claude Code 能记住你之前的操作会怎样?
Alex: 你是说像这样?
Sam: 对,假设有这样的场景:
理想场景(目前Claude Code还做不到):
$ claude "再分析一次代码复杂度"
系统:检测到您刚才执行过类似操作,直接使用已安装的工具...
$ radon cc . -s --json > complexity_report.json
$ python -c "
import json
with open('complexity_report.json') as f:
data = json.load(f)
# 生成可视化报告...
"
Alex: 哇,如果它能记住并优化流程,还加了 JSON 输出和可视化,那就太强了!
Sam: 这就引出了我的想法。虽然 Claude Code 现在还是无状态的,每次都要重新开始,但它展示了一个可能性——AI 在实时生成程序。那如果我们把这个模式推广,再加上"记忆"能力呢?
Alex: 推广到哪里?
Sam: 想想看,现在 AI 和软件结合主要有两种模式。我画个图你就明白了:[纸笔声]
模式1:嫁接式 AI(Grafted AI)
┌─────────────────────────────┐
│ 传统应用(功能固定) │
│ ┌──────┐ ┌──────┐ ┌──────┐│
│ │功能A │ │功能B │ │功能C ││
│ └──────┘ └──────┘ └──────┘│
│ │
│ ┌─────────────────────┐ │
│ │ 💬 AI助手(后加的) │ │ ← 像贴膏药
│ └─────────────────────┘ │
└─────────────────────────────┘
问题:两个世界,互不理解
案例:Notion AI、Office Copilot、Adobe Firefly
Alex: 对,Notion AI、Office Copilot 都是这样,在原有界面上硬加个对话框。
Sam: 体验如何?
Alex: 挺割裂的。我在 AI 对话框里完成了任务,但不知道对应按钮在哪。用按钮操作时,AI 又不知道我做了什么。就像左手不知道右手在干嘛。
Sam: 那第二种模式呢:
模式2:对话式 AI(Conversational AI)
┌─────────────────────────────┐
│ 纯对话界面 │
│ ┌─────────────────────┐ │
│ │ │ │
│ │ 💬 ChatGPT │ │
│ │ │ │
│ └─────────────────────┘ │
│ │
│ 用户:"创建表格" │
│ AI:"好的,这是表格..." │
└─────────────────────────────┘
问题:效率低,缺少直观性
案例:ChatGPT、Claude、Gemini、Perplexity
Alex: 这个也有问题,什么都要打字描述,明明点个按钮更快。而且生成的东西没地方放,只能复制粘贴。
Sam: Exactly!所以我在想第三种模式——进化式 AI。不是把 AI 嫁接到应用上,也不是让应用变成纯对话,而是让应用从对话中自然生长出来。想象这样一个场景...[翻页声]
场景:一个自由职业者需要管理财务
传统方式:
1. 下载一个记账 App
2. 学习这个 App 的界面和概念
3. 强迫自己适应它的流程
4. 发现不合适,换另一个 App
5. 重新学习...
新方式:打开一个空白界面,只有一个对话框
Alex: 空白界面?那怎么用?
Sam: 看着,这就是魔法开始的地方:
Day 1: 纯对话
用户: "记一下,今天客户A付了5000块项目款"
系统: "已记录:收入5000元,来源:客户A,类型:项目款"
用户: "还有,午饭花了45"
系统: "已记录:支出45元,类型:餐饮"
Day 3: 系统注意到模式
用户: "客户B付了3000"
系统: "已记录。我注意到您经常记录客户付款,需要我创建一个快捷方式吗?"
[显示一个简单表单雏形]
Day 7: 界面开始生成
用户打开应用,看到:
- 对话框依然在最显眼的位置
- 但旁边出现了"快速记账"按钮
- 点击后是系统根据历史对话生成的表单
Day 30: 应用成型
[完整的个性化财务管理界面]
- 专门的客户收款管理(因为用户经常记录)
- 简化的支出记录(因为用户只记录金额和大类)
- 月度收支对比(系统发现用户月底会问"这个月赚了多少")
- 对话框依然保留,处理所有特殊需求
Alex: 等等,所以界面是根据使用习惯"长"出来的?
Sam: 对!这就是我说的 GrowBlank —— 从空白成长为应用。不是预先设计,而是使用中进化。
Sam: 没错!这解决了软件开发的核心悖论。你知道为什么那么多项目失败吗?
Alex: 需求不清?
Sam: 不只是不清,是根本不可能清楚!我给你讲个真事。上个月我们公司要做个内部工具,产品经理写了 30 页需求文档。你猜怎么着?
Alex: 上线后全改了?
Sam: 都没等到上线!开发到一半,业务部门说:"这不是我们要的。"你知道最讽刺的是什么吗?他们也说不清要什么,只能说:"等我用了才知道。"
Alex: 啊,经典的"我不知道我要什么,但我知道这不是"综合征。
Sam: 对!但 GrowBlank 模式下,这不是 bug,是 feature!用户不需要提前知道自己要什么,他们只需要开始使用。系统会从使用中学习并适应。
Alex: 等等,我想到个问题。[椅子挪动声] 如果每次都是 AI 生成,怎么保证一致性?比如今天生成个蓝色按钮,明天会不会变成红色?
Sam: 好问题!让我用个简单的比喻。你知道为什么你每天起床还认识自己的房间吗?
Alex: 因为东西都在固定的位置?
Sam: 对,但更深层的原因是——你的房间是持续存在的,不是每天重新生成的。GrowBlank 也是这个原理。
Alex: 怎么做到的?
Sam: 这就回到了Smalltalk的核心理念。还记得它的 "image" 概念吗?不是图片,而是整个运行系统的完整快照,包括所有对象、状态、甚至正在执行的代码。
Alex: 就像... 虚拟机的快照?
Sam: 不,比虚拟机快照更深刻。虚拟机快照只是保存了内存状态,但Smalltalk的image保存的是整个世界——包括你的代码、数据、正在debug的断点、甚至你上次写了一半的方法。
Alex: 所以源代码在哪里?
Sam: 这就是关键——没有独立的源代码文件!源代码就存在于image里,作为对象的一部分。你修改一个方法,就是在修改一个活着的对象。这就是为什么Smalltalk的程序不是"启动"的,而是"继续"的。
Alex: 等等,这意味着...
Sam: 对!编程环境(IDE)、你的程序、甚至编译器,都是同一个image里的对象。你可以在运行时修改IDE的行为,可以调试调试器本身,可以给编译器打补丁。一切都是活的、可塑的数据。
Alex: 这和GUI有什么关系?
Sam: GUI本身不就是代码吗?一个按钮、一个窗口、一个菜单——在Smalltalk里,这些都是对象,都是数据,都可以被即时修改。你可以右键点击任何UI元素,直接修改它的代码,立即看到效果。没有"编译-运行-测试"的循环,只有持续的雕塑。
Alex: 所以GrowBlank借鉴了这个思想?
Sam: Exactly!看这个例子:
// 用户第一次说"记录支出"时,系统生成并保存了这个组件
const ExpenseForm = {
id: "form_expense_001",
version: 3, // 已经进化了3次
// 组件DNA:定义外观和行为
schema: {
amount: { type: "number", required: true },
category: {
type: "select",
options: ["餐饮", "交通", "购物", "其他"]
}
},
// 进化历史
evolution: [
"创建基础表单",
"添加分类字段",
"智能预设选项"
],
// 用户偏好
preferences: {
color: "blue",
position: "top-right",
hotkey: "Cmd+E"
}
}Alex: 哦!所以每个组件都是一个持久化的"活物",有记忆、会成长,但不会突变?
Sam: Exactly!这就是Smalltalk开发模式在AI时代的重生。在Smalltalk里,你可以inspect任何对象,修改它的属性,立即看到变化。在GrowBlank里,用户通过自然语言做同样的事:"把那个表单的按钮改成绿色",系统就会更新 preferences,这个改变会永久保存。
Alex: 所以用户在不知不觉中...
Sam: 在进行Smalltalk式的开发!他们在操作活着的对象,塑造运行中的系统,只是用自然语言代替了Smalltalk的消息传递语法。
Alex: 嗯... [思考] 但这不会导致过度定制吗?每个用户都有自己独特的应用,没法标准化,没法培训新员工...
Sam: 这恰恰是传统思维的误区!为什么一定要标准化?我问你,你用的 VS Code 配置和我的一样吗?
Alex: 当然不一样,我有自己的插件、快捷键、主题...
Sam: 那影响你们团队协作了吗?
Alex: ...没有。反而每个人都很高效,因为工具适合自己的习惯。
Sam: Bingo!GrowBlank 的哲学是:标准化数据,个性化界面。团队共享同一套数据模型,但每个人可以有自己的交互方式。
Alex: 有意思... 让我想想实际场景。[喝咖啡声] 比如说,一个创业公司,从零开始用 GrowBlank?
Sam: 好例子!我来模拟一下这个过程。第一天,创始人 Alice 坐在电脑前:
Alice: 记录一下,今天见了投资人 John,他对我们的产品很感兴趣
系统: 已记录会议笔记。需要设置后续提醒吗?
Alice: 好的,一周后提醒我跟进
[系统后台生成了一个简单的 CRM 种子]
Alex: 等等,系统怎么知道要往 CRM 方向进化?
Sam: 它不需要知道!它只是响应使用模式。继续看:
Day 3:
Alice: 显示所有投资人联系记录
系统: 找到 1 条记录:
- John (上次联系:2天前)
建议:是否要添加更多字段来追踪?比如投资阶段、金额范围?
Alice: 好主意,添加这些
[CRM 数据模型进化:添加了新字段]
Day 10:
Alice: 我需要跟踪每个投资人的状态
系统: 基于您的使用模式,我生成了一个看板视图:
[初次接触] → [跟进中] → [尽调] → [条款谈判] → [已完成]
需要调整阶段名称吗?
[CRM 获得了看板功能]
Alex: 妙啊,这就是个渐进式的 no-code 平台啊!
Sam: 不,比 no-code 更进一步。No-code 你还得"设计",拖拽组件,设置属性。GrowBlank 是 no-design,你只管用。
Alex: 但是等一下,[激动] 如果 Alice 雇了一个销售 Bob,Bob 的使用习惯和 Alice 不同怎么办?
Sam: 这个问题问得好!让我先给你看个简单的例子。你用过 Google Docs 的多人协作吧?
Alex: 用过,多个人可以同时编辑文档。
Sam: 对,但 Google Docs 只是让多人编辑同一个文档。GrowBlank 更进一步——多人共同进化同一个应用。我来演示一下:
场景:Bob 刚加入公司
Bob 第一天:
Bob: 显示所有客户
系统: 找到 3 个投资人记录(Alice 之前录入的)
Bob: 不对,我要看销售线索,不是投资人
系统: 理解了。您需要区分"投资人"和"销售线索"。
建议创建两个独立模块:
- 融资管理(Alice 主要使用)
- 销售管理(您将主要使用)
这样设置可以吗?
Bob: 好的
[系统开始分化:同一个应用内出现两条进化路径]
Alex: 哦,所以不是强行合并,而是允许分化?
Sam: 对!就像细胞分化一样。继续看 Bob 的使用:
Bob 继续使用:
Bob: 我需要批量导入潜在客户
系统: 正在为您生成批量导入功能...
[5分钟后,Alice 那边]
系统通知 Alice: Bob 刚刚触发了"批量导入"功能的生成。
这个功能也可能对您的融资模块有用。
要查看并采用吗?
Alice: 让我看看... 嗯,确实有用,我也要用来导入投资人名单
Alex: 所以功能可以跨模块"传播"?
Sam: Exactly!这就是集体进化。每个人的创新都可能惠及他人,但不是强制的。系统会识别哪些模式是个人的,哪些是通用的:
系统的模式识别:
- Bob 喜欢用键盘快捷键 → 个人偏好,只影响 Bob 的界面
- Bob 创建的"跟进提醒"功能 → 通用功能,推荐给全团队
- Alice 的投资人阶段划分 → 领域特定,只在融资模块使用
- 両人都需要的导出报表 → 提取为公共功能
Alex: [兴奋地站起来] 等等,我想到一个更大胆的想法!如果系统能跨公司学习呢?
Sam: 有意思!我们可以只分享"进化路径"而不分享具体数据。想象一下,每个公司的应用进化就像是走迷宫,我们不需要知道迷宫长什么样(具体数据),只需要知道大家都是怎么走的(使用模式)。
Alex: 哦!就像 Waze 导航,不需要知道每辆车里坐的是谁,只需要知道车流模式。
Sam: 完美的类比!系统会分析匿名化的进化路径,发现通用模式。比如:80%的公司在前5天会添加分类系统,70%在2周后需要高级视图,90%在1个月后需要数据分析功能。
Alex: 所以新公司加入时,系统可以基于这些模式提供建议?
Sam: 对,但不是强制的模板。系统会说:"基于847家类似公司的经验,这些功能的采用率很高..."但每个公司还是会根据实际使用自然进化。
Alex: 这简直是应用开发的 GitHub!不对,比 GitHub 更进一步,因为它是活的,会进化的!
Sam: 而且解决了开源的一个大问题:你 clone 了别人的代码却改不动,因为你不理解设计决策。但在 GrowBlank 里,你 clone 的是进化路径,然后继续你自己的进化。
Alex: [坐下,深呼吸] OK,让我冷静一下。这个愿景很美好,但技术挑战呢?
Sam: 确实有挑战。最大的是意图理解的准确性。看这个例子:
用户: 把昨天的数据删了
系统需要理解:
1. "昨天"是指哪个时区的昨天?
2. "数据"是指哪些数据?全部还是特定类型?
3. "删了"是真删除还是标记删除?
4. 用户权限是否允许?
Alex: 对,自然语言的歧义性。
Sam: 我们的解决方案是渐进式确认。第一次遇到歧义,系统会询问。但它会记住你的偏好:
第一次:
用户: 删除旧数据
系统: 请确认:"旧数据"是指:
A) 30天前的数据
B) 上个版本的数据
C) 其他?
用户: A
第二次:
用户: 清理旧数据
系统: 基于您的习惯,准备删除30天前的数据(共1,234条)。确认?
第N次:
用户: 常规清理
系统: [直接执行30天数据清理]
Alex: 所以系统不只是学习功能,还学习用户的语言习惯?
Sam: 对!每个用户/团队会逐渐形成自己的"方言"。比如在某个团队里,"跑一下"就是指运行测试套件,在另一个团队可能是指部署到测试环境。
Alex: 这让我想到一个有趣的问题。如果每个人的应用都不同,那技能和创新如何共享?
Sam: 这就引出了技能市场的概念!还记得Smalltalk的Parcels吗?你可以把一组对象打包,分享给其他人。GrowBlank里的技能就像是AI时代的Parcels——不只是代码,而是包含了使用模式、进化历史、用户偏好的完整"生命体"。
Alex: 所以分享的不只是功能...
Sam: 而是整个进化路径!就像Smalltalk社区分享的不只是类库,而是解决问题的完整思路和交互方式。用户可以选择多种分享方式 - 从开源免费到付费订阅,甚至企业定制。最棒的是,这个市场是自然形成的,由用户需求驱动。
Alex: 等等,这不就变成了... 每个人都可以是软件供应商?
Sam: Bingo!这就是去中心化的软件经济。看看完整的生态:
GrowBlank Skills Market 首页
🔥 热门技能
├── 智能日程安排 (by Sarah) - 10K+ 安装
├── 客户跟进自动化 (by TechCorp) - 8K+ 安装
└── 财务报表生成器 (by 金融老王) - 5K+ 安装
💡 场景解决方案
├── "初创公司工具包" (15个技能组合) - $29/月
├── "销售团队必备" (8个技能组合) - $19/月
└── "个人效率提升" (6个技能组合) - $9/月
🎯 定制你的 GrowBlank
搜索技能:[_______________]
或描述需求:"我需要管理客户投诉..."
Alex: [画图] 让我理理... 所以整个生态系统是这样的:
个人进化 → 团队进化 → 公司进化 → 行业模式 → 技能市场
↑ ↓
└──────────────────────────────────────────────┘
(循环反馈)
Sam: 完美!而且每一层都在让下一次进化更快。新用户不是从零开始,而是站在巨人的肩膀上。
Alex: 但是... [皱眉] 这会不会造成同质化?最后大家的应用都长得一样?
Sam: 恰恰相反!生物进化告诉我们,即使从同一个祖先开始,在不同环境下也会进化出完全不同的形态。达尔文雀,你知道吧?
Alex: 同一种雀,在不同岛屿进化出不同的喙?
Sam: 对!GrowBlank 也一样。即使从同一个模板开始,不同公司的独特需求会驱动应用向不同方向进化。
电商公司 → 进化出强大的库存管理
咨询公司 → 进化出复杂的时间追踪
媒体公司 → 进化出内容工作流
Alex: 而且这些特化的部分又可以回到技能市场...
Sam: 形成良性循环!创新在边缘产生,然后传播到整体。
Alex: [看表] 哇,不知不觉聊了两个小时了。这个想法真的可能改变软件行业!
Sam: 你知道最让我兴奋的是什么吗?如果进化方向错了怎么办?
Alex: 对啊,系统误解了用户意图,朝错误方向进化?
Sam: 这就是为什么要保留"回滚"和"分支"能力,就像Git一样:
进化树:
主干:当前稳定版本
├── 实验分支A:尝试新的交互方式
├── 实验分支B:探索不同的数据组织
└── 用户可随时切换、合并或放弃
Alex: 所以失败变成了可恢复的小实验?
Sam: 对!而且每次"失败"都是学习。用户和系统互相学习,共同进化,像共生体一样。
Alex: [收拾东西] 好了,我得走了。但在我走之前,一句话总结 GrowBlank?
Sam: 从使用中生长,而非从规划中构建。
Alex: 精辟!我的版本是:每个人都值得拥有为自己量身定制的软件。
Sam: 哈哈,都对!这就是 GrowBlank——让软件民主化,让每个人都成为自己软件的设计师,只是他们不需要知道自己在设计。
Alex: 期待看到它改变世界。下次咱们用 GrowBlank 来组织聚会?
Sam: 哈哈,到时候它可能已经进化出完美的聚会组织功能了!
Alex: [起身准备离开] 或者它会进化出"取消聚会"功能,因为发现我们都更喜欢在家写代码。
Sam: [笑] 那也是一种进化!适者生存嘛。
Alex: 说真的,Sam,今天这个对话让我重新思考了很多东西。不只是软件开发,而是我们和工具的关系。
Sam: 怎么说?
Alex: 我们一直在讨论让软件适应人,但其实... 人和软件是在共同进化的,对吧?就像你说的共生体。
Sam: [若有所思] 你说得对。也许真正的革命不是"无代码"或"AI编程",而是打破创造者和使用者的界限。
Alex: 每个人既是用户,也是设计师,还是程序员,只是自己不知道。
Sam: 这才是真正的民主化。不是让每个人都学会编程,而是让编程消失在使用中。
Alex: [握手] 期待看到这个未来。
Sam: 未来?也许已经开始了。从我们用 Claude Code 的那一刻起。
Alex: [停下脚步] 你知道吗,Sam?今天你让我理解了一件事。
Sam: 什么?
Alex: Smalltalk不是失败了,它只是来得太早了。它需要的不是更好的虚拟机或更快的硬件,而是一个能理解人类意图的伙伴——AI。
Sam: [微笑] 对。Smalltalk给了我们"一切皆对象",但忘了最重要的对象——人类自己。现在有了LLM,人类的意图、想法、甚至困惑,都变成了可计算的"数据"。
Alex: 源代码是文本,输出是文本,提示词是文本,甚至GUI也是文本描述的结构...
Sam: 一切皆数据,数据皆可塑。这就是Smalltalk梦想的世界,只是用自然语言代替了消息传递。
Alex: 从Smalltalk到Claude Code,再到GrowBlank... 软件开发终于要回归它该有的样子了。
Sam: 什么样子?
Alex: 像玩泥巴一样自然。
[咖啡馆环境音渐弱,两人的脚步声渐远]
在这次对话中,我们看到了一条清晰的进化路线:
Smalltalk(1970s)
- 一切皆对象
- 没有源代码/产物的区别
- Image-based开发
- 实时反馈的编程环境
Claude Code(2024)
- 输入输出皆文本
- 提示词即程序
- 对话即编程
- AI理解人类意图
GrowBlank(未来)
- 使用即开发
- 进化代替设计
- 个性化的活系统
- 人机共生的创造
Smalltalk的理念没有过时,它只是在等待合适的技术条件。当AI能够理解自然语言,当一切都可以用文本表达,当系统可以从使用中学习——Smalltalk梦想的"活的软件"终于成为可能。
"从使用中生长,而非从规划中构建。"
—— 一次关于软件进化的咖啡馆对话