程序是一份需要准确执行的步骤
人听到“整理一下清单”会猜你的意思,计算机则需要具体规则:读取哪些任务,按什么顺序,遇到什么情况怎么处理。源代码就是人用编程语言表达这些规则的文本。
AI 可以帮你写代码,但它也可能误解你省略的信息。把目标拆成输入、处理和输出,是一种不依赖语言的编程思考方式。
输入:一组商品价格。处理:找出不超过预算的商品。输出:一个符合条件的列表。
带走这一点 · 先说清输入和期待的结果,再讨论用什么代码实现。
为什么有很多编程语言
JavaScript 常用于网页交互,Python 常用于脚本和数据处理,SQL 用于表达数据库查询。它们的生态和运行环境不同,也有许多重叠用途。
选语言不是比较谁最高级,而是看产物在哪里运行、现有项目用了什么、有哪些现成工具。对已有项目,让 AI 先读项目再决定如何修改,通常比随意换语言更省事。
如果需求是改变网页按钮的行为,首先要了解页面已有的前端代码,而不是立刻新建一套不相干的 Python 工程。
带走这一点 · 语言是实现选择,目标和运行环境应当先明确。
变量、条件与循环:名字、分支和重复
变量给数据一个可引用的名字,例如 budget 代表预算。决定走哪条分支,例如 price <= budget。把同一套处理应用到多个对象,例如逐个检查列表中的价格。
这三个零件常常一起出现:拿到每个商品的价格,比较预算,满足条件就收进结果。读不懂全部语法时,也可以先找“数据叫什么、在哪做判断、重复处理哪些东西”。
预算是 30,价格列表是 12、35、20。逐个判断“价格不大于预算”,得到 12 和 20。把预算改成 40,结果也会改变。
带走这一点 · 代码的行为可以用具体输入来推演,不必靠猜。
单步执行一段小程序
先猜结果,再让程序逐个比较价格。修改预算,看看变量如何影响条件和输出。
budget = 25 prices = [12, 35, 20, 48, 8] for each price in prices: if price <= budget: keep(price)
输出: []
这里执行固定的筛选算法,展示真实计算结果,不运行任意用户代码。
编程心得:先组合逻辑,再表达成语法
可以先把编程理解为逻辑的组合:给数据起名字,用条件选择动作,用循环重复处理,再把一段步骤交给函数。所谓“变量腾挪”,就是读取、传递、转换数据,管理状态如何随操作变化;关键是每一步之后,哪些值变了、哪些没变。
先用人话推演“输入 → 判断与处理 → 输出”,再把步骤翻译成语言的语法。同一套筛选思路可以用 JavaScript 或 Python 表达,语法不熟时可以查;但语言也有类型规则、执行方式、并发模型和生态差异,不能只替换几个符号就认为行为相同。
先准备空结果 → 依次读取 12、35、20 → 与预算 20 比较 → 满足“不大于”就加入结果 → 输出 [12, 20]。空列表、恰好等于预算、全部超预算,也都可以先在纸上推演。
带走这一点 · 先练习拆解规则与跟踪数据变化,再用语法把逻辑写准确。
函数与数据结构:给处理命名,把信息组织起来
把一段处理封装成有名字的工具,可以接收输入并返回结果。数组是一组有顺序的数据;对象或字典把名称映射到值;树表达层级关系。
选择结构会影响后续操作。清单适合用数组装任务,每个任务再用对象记录 id、标题和完成。稳定的 id 能帮助程序知道你要修改哪一条。
任务可以表示为 { id: 7, title: '练习添加', done: false }。完成函数只需找到 id 为 7 的任务,修改 done,再更新界面。
带走这一点 · 让 AI 说明数据长什么样,往往比先解释每行语法更容易理解程序。
高内聚、低耦合:内部专心,外部约定清楚
是一组有明确职责的代码,可以由函数、文件或一组文件组成。是让紧密相关的工作聚在一起:筛选模块负责预算规则,保存模块负责读写与保存错误处理。判断边界时,可以问“这些代码是否经常因为同一类需求而一起改变”。
是减少模块对彼此内部细节的依赖:页面调用“保存结果”,不直接决定存储格式,也不伸手修改保存模块里的变量。模块通过明确的合作;仍然存在依赖,只是依赖更少、更清楚,改内部实现时更容易控制影响范围。
如果页面点击、批量处理、定时报表里都各自写了预算判断和存储细节,改一条规则就要到处找。把筛选、保存各集中到一个模块,调用方只传入数据并处理返回结果,修改位置就更容易定位。
带走这一点 · 高内聚看模块内部的职责是否相关,低耦合看模块之间依赖了多少内部细节。
像乐高积木一样组合:接口匹配,才能复用
乐高积木能反复组合,靠的是清楚的形状和匹配的连接点。代码也一样:一个筛选函数只接收价格列表与预算、返回合格价格,不偷偷读取网页按钮或全局变量,就更容易同时服务于网页选购和每日报表。职责清楚、依赖少,能用的场景通常也更多。
“连接点”还包括输入类型、输出含义、错误处理和是否异步。把本地保存换成云端保存,只有这些对外约定仍成立,调用方才可能少改。云端的等待与失败也要被接口表达;高内聚、低耦合不能保证任意模块随意替换。
模块化也不是把代码切得越碎越好。先围绕真实职责和变化划边界,出现重复需求后再提取公共部分;如果两个场景的规则不同,不必为了复用塞进一堆特殊开关。清楚的一小段代码,也可以是一块好积木。
selectWithinBudget(prices, budget) 在网页中筛选商品,在报表中筛选采购记录。两边都接受“不大于预算”这条规则,就可以共享同一个函数;页面怎么显示、报表怎么排版,则各自处理。
带走这一点 · 让模块做好一件事,用清楚的输入输出连接它,再验证新场景是否接受同一套规则。
积木工作台:一次修改,会影响哪里?
同一个需求,比较职责混杂与按职责分工两种组织方式。块内的小零件表示内部工作,块间的连线表示调用约定。
职责混在每个入口里
每处都复制判断、直接操作存储;规则与存储细节散落在三处。
按职责拼成积木
相关工作在块内聚合,块间只通过约定调用。筛选不需要知道怎样保存。
接收操作 · 调用模块 · 呈现结果
items → Promise<SaveResult>编码数据 · 执行写入 · 报告保存错误
prices + budget → prices比较预算 · 保留合格项 · 返回列表
在这组示例里:混杂方案要改三处存储代码;分工方案集中改保存模块。前提是输入、结果、错误和异步约定保持一致,调用方已能处理等待与失败。
[12, 35, 20]预算: 20selectWithinBudgetprice ≤ budget[12, 20]网页选购这里统一使用 ≤。只替换输入与使用场景,筛选函数保持同一个;显示方式由各自的调用方决定。
试过两种修改,并切到每日报表后,即完成这次观察。
图中影响范围是预设架构示意,复用区执行真实筛选;不会保存数据或请求云服务,也不代表真实项目的修改成本。
代码怎样才能跑起来
源代码需要合适的执行工具。编译会把代码转换成另一种形式;解释器和运行时负责执行代码。实际工具经常混合这些技术,不能简单理解成两种互不相容的语言类别。
是输入文字命令的界面。命令会在一个工作目录里执行,所以“在哪个文件夹运行”很重要。启动命令报错时,保留完整错误和执行位置,才能帮助定位。
在本项目的 web 文件夹运行 npm run dev,会按项目配置启动开发服务器。把相同命令放在没有这个项目配置的目录里,结果可能完全不同。
带走这一点 · 运行问题至少提供:系统、项目目录、命令和完整错误。
现代编程:组合现有工具,管理每次修改
库是别人写好的可复用功能,是项目所需的这些库和工具。安装依赖使代码能找到它们;差异也可能改变行为,所以项目通常会记录依赖及其版本。
可以记录修改历史,帮助比较和恢复版本。让 AI 一次完成一个可验证的小改动,保留可用版本,遇到问题时就有清楚的回退点。
想给清单加删除功能:先确认现有代码和依赖,保存当前版本,修改一处功能,再验证添加、完成等旧功能仍然正常。
带走这一点 · AI 写完不等于任务完成。运行、检查差异和验证结果仍然属于编程。
预算为 20,规则是“保留价格不大于预算的商品”。价格 12、35、20 中应该留下哪些?
先选一个答案,再看解释。
让 AI 给清单增加“完成”和“恢复未完成”,把按钮的行为说完整。
先自己想,再按需打开提示。越往后,描述越完整,验收也越明确。
带着本章的背景去问 AI。拓展是选学,不影响继续阅读。
用整理书包解释变量、条件、循环和函数,每次讲一个。
参考答案,可以改成你的版本
我正在从零学习计算机与 AI 编程。本章学过: 编程:认识变量、条件、循环、函数与数据结构;理解语言、运行环境和依赖的不同职责;把模糊想法改写成明确的动作和结果;用高内聚、低耦合划分模块,理解像积木一样复用的前提 用整理书包解释变量、条件、循环和函数,每次讲一个。 请先确认我的理解,一次解释一个小问题,用具体例子并说明比喻的局限。讲完问一道情境题,根据我的回答继续。区分事实、推测和不确定内容;推荐可操作的验证方式。如果涉及具体工具,先确认版本,不要编造功能和资料。
完成这一章
标记各节已读,完成下方列出的必学活动后,即可记录本章完成。随时可以直接阅读下一章。
继续查阅原始资料
正文是入门解释;下面的官方资料供你继续核对和深入。
MDN · JavaScript GuideMDN · JavaScript modulesMicrosoft Learn · Architectural principles一台电脑已经能执行步骤。下一章,我们让两台电脑开始交流。