001 | 编程到底是什么——从做饭理解算法难度⭐ |预计阅读8 分钟 |前置无专栏开篇 |下一篇[002 为什么 Python 是新手第一语言]1. 这篇文章解决什么问题编程这个词被过度神化了。电影里黑客手指翻飞、屏幕上绿字滚动给人一种错觉——编程是天才的专属技能。它不是。编程的本质是用一套精确的指令让计算机帮你解决问题。这篇用做饭这条人人都懂的线索帮你建立算法思维——这是编程世界唯一的硬通货。读完这篇你不需要会写任何代码但你会理解程序员到底在干什么。2. 从做饭理解算法的本质2.1 番茄炒蛋的两种写法假设你要教一个完全不会做饭的机器人做番茄炒蛋。你会怎么说普通人写菜谱准备两个番茄、三个鸡蛋。先把鸡蛋打散番茄切块。锅里倒油先炒鸡蛋盛出来。再炒番茄最后把鸡蛋倒回去一起炒。加盐出锅。这对机器人来说是一场灾难——打散是什么动作打到什么程度切块是切多大先炒鸡蛋炒几秒火开多大机器人会在第一个步骤就卡住。程序员需要这样写# 这不是真正的代码是算法——精确到每一步的指令序列步骤1:准备食材-取番茄2个每个约150克-取鸡蛋3个每个约55克-取食用油15毫升-取食用盐2克 步骤2:处理鸡蛋-将3个鸡蛋打入碗中-用筷子沿顺时针方向搅拌60圈-判断条件蛋液颜色均匀、无明显的蛋清块 → 停止搅拌 步骤3:处理番茄-将2个番茄分别切成约3厘米的块状共约16块 步骤4:炒鸡蛋-将锅放置于灶上开中火约600瓦-倒入10毫升食用油-等待30秒判断油面出现细微波纹 → 油温合适-倒入蛋液用锅铲快速翻动-等待约40秒判断蛋液全部凝固成块呈金黄色 → 盛出备用 步骤5:炒番茄-倒入剩余5毫升食用油-倒入番茄块-翻炒约90秒判断番茄皮开始脱落、汤汁变红 → 番茄熟了 步骤6:混合调味-将鸡蛋倒回锅中与番茄混合-加入2克盐-翻动10次使得盐均匀分布 步骤7:出锅-关火-将成品装入盘中这就是算法——一组精确的、有限的、无歧义的操作步骤。把这个菜谱交给机器人它不需要任何烹饪天赋只需要忠实地执行每一步。2.2 编程 算法 数据编程算法 操作步骤数据 操作对象顺序执行条件判断循环重复输入 番茄鸡蛋油盐输出 一盘番茄炒蛋图 2-1编程的两大核心要素。红色 编程本体蓝色 算法怎么操作橙色 数据操作什么。任何程序都离不开这两个要素——算法定义步骤数据提供原材料。用做饭的类比来翻译编程术语做饭编程说明菜谱程序完整的指令集合每一步操作语句单条指令食材数据 / 变量被操作的对象“如果蛋液不均匀就继续搅拌”条件判断if根据状态决定下一步“翻炒 10 次”循环for重复执行某个操作判断蛋液是否均匀布尔表达式结果是是或否的判断3. 算法的五大特征计算机科学中对算法有严格定义——它必须具备以下五个特征算法有穷性 步骤有限 不能是死循环确定性 每步含义唯一 没有歧义可行性 每步都能执行 不是空中楼阁输入 有零个或多个输入输出 至少有一个输出图 3-1算法的五大特征。红色 算法根节点蓝色 五个必备特征。缺一条就不是合格的算法。用做饭的例子对照特征是否满足说明有穷性✅7 个步骤做完就结束不会永远做下去确定性✅切 3 厘米的块比切块确定搅拌 60 圈比打散确定可行性✅每一步都是普通人能执行的操作有输入✅番茄、鸡蛋、油、盐有输出✅一盘番茄炒蛋现在回头看普通菜谱为什么不满足算法的定义——它缺了确定性。切块是切多大炒一会儿是多久模糊的指令对计算机无效。4. 从做饭到编程三条核心思维4.1 分解思维大问题拆成小步骤你不会一口气做完一盘菜——你把它拆成了备料→处理→烹饪→装盘。编程一模一样。写一个计算全班同学平均分的程序要先拆成1. 获取全班成绩数据 2. 把所有成绩加起来 3. 数一下有多少个成绩 4. 用总成绩 ÷ 人数 5. 输出结果每一次拆分都让问题变得更简单。拆到最后每一步都小到可以用一行代码表达。4.2 抽象思维忽略无关细节做饭时你不需要知道鸡蛋的分子结构、铁锅的金属晶体排列、火焰的等离子体物理。你只需要知道中火加热 30 秒 → 油温合适。编程也一样。你不需要知道 Python 解释器怎么把代码翻译成机器指令、CPU 怎么调度寄存器——你只需要知道print(hello)会在屏幕上输出 “hello”。抽象 屏蔽底层复杂度只暴露必要的接口。4.3 容错思维考虑所有意外情况菜谱里通常不会写如果鸡蛋掉地上怎么办。但程序中必须考虑用户输入了负数怎么办分数 -5数据为空怎么办全班没有一个人参加考试类型错了怎么办用户输入了 abc 而不是数字正常菜谱和机器人菜谱的区别就是普通程序和生产级程序的区别——后者会为所有意外情况准备预案。5. 一个完整的算法执行示例我们来手算一道加法——不是用算术直觉而是严格模拟计算机的逐条执行问题计算 25 37计算机的算法比人类笨但比人类快一亿倍步骤 1取第一个数 25存入 A 号抽屉 → A 25 步骤 2取第二个数 37存入 B 号抽屉 → B 37 步骤 3取出 A 的值25 步骤 4取出 B 的值37 步骤 5计算 A B 25 37 62 步骤 6将结果 62 存入 C 号抽屉 → C 62 步骤 7输出 C 号抽屉的内容62A25B37取出 A25取出 B37计算 253762C62输出 62图 5-12537 在计算机中的执行步骤。橙色 存储数据变量赋值蓝色 取出数据绿色 计算操作紫色 最终输出。关键认知人类算 2537 是瞬间的直觉计算机算 2537 需要 7 步机械操作。但这一套机械操作可以复制到任何数字上——你给 19827364289107它同样 7 步搞定速度是每秒十亿次。计算机不聪明但极其忠诚、极其快。你的工作是给它写菜谱。6. 总结与自测三个核心认知编程不是写代码编程是写菜谱。代码只是菜谱的文字形式。真正的能力是把问题拆成精确的无歧义步骤——这个能力与编程语言无关。算法 精确步骤的序列。必须具备有穷性、确定性、可行性、输入、输出五个特征。模糊的指令对计算机无效。计算机的特长是笨但快——一秒钟能执行十亿次取出、比较、计算、存回这种简单操作。你的价值在于让它笨而有序地工作。自测题Q1以下哪条指令是计算机能执行的算法A. “把菜炒熟”B. “大火炒 90 秒直至番茄皮开始脱落”C. “加热至口感适中”Q2算法五大特征中有穷性指的是什么A. 算法最终必须停下来不能是无限循环B. 算法的每一步都必须能执行C. 算法可以没有输入但必须有输出答案见文末下一篇预告[002 为什么 Python 是新手第一语言]——全球有 600 多种编程语言为什么 Python 统治了初学者市场它的设计哲学是什么自测答案Q1 → B有时间、有温度、有判断标准——精确且无歧义 | Q2 → A有穷性 步骤有限不能永远运行下去本文是《Python 全栈精通从算法基石到工程实战》专栏第 001 篇。参考来源Donald Knuth “The Art of Computer Programming”, MIT 6.0001 Introduction to CS and Programming版权声明CC 4.0 BY-SA