欢迎来到程序化思维的世界!

你好!欢迎踏入计算机科学旅程中最重要的一个章节。你有没有试过面对一项艰巨的任务——例如打扫整个屋子或撰写一篇两千字的论文——而感到不知所措?程序化思维(Thinking Procedurally)就像是一项“超能力”,能帮助你摆脱焦虑,直接开始行动。在本章中,我们将学习如何将大问题拆解成计算机能够理解的小步骤。如果起初觉得有些抽象也不用担心,只要看看生活中的实际例子,你很快就能豁然开朗!

快速回顾:什么是计算思维(Computational Thinking)?
在深入探讨之前,请记住,计算思维并不是要你“像计算机一样”思考;而是要以一种能让我们“明确告诉”计算机该做什么的方式来思考。程序化思维正是这一套工具箱中的关键组成部分。


1. 识别问题的组成部分

解决任何大型问题的第一步就是识别其组成部分,这通常被称为分解(Decomposition)。我们不再将问题看作一团混乱的“大杂烩”,而是找出构成问题的各个独立部分。

现实生活中的例子:策划生日派对
如果你的“问题”是“筹办派对”,那么组成部分可能包括:
1. 宾客名单
2. 食物与饮料
3. 音乐/娱乐
4. 场地(位置)

在计算机科学中,我们也做同样的事情。如果你被要求为应用程序设计一个登录系统,你首先要识别其组成部分:获取用户名、核对密码,以及处理“忘记密码”的请求。

你知道吗?
将问题拆解可以让分工变得更加容易。在现实工作中,一位程序员可以负责“登录”组件,而另一位可以同时负责“用户个人资料”组件!

重点提示: 永远从提问开始,“这个问题是由哪些较小的部分组成的?”


2. 识别解决方案的组成部分

一旦你知道了问题的组成部分,就可以开始构建解决方案。问题中的每一个组件,都需要对应的解决方案来应对。

你可以将这视为“如何做”阶段。如果问题的组件是“我们需要知道谁会出席派对”,那么解决方案的组件就是“建立一个网上 RSVP 回复表格”。

当你为计算机程序识别解决方案组件时,你要找的是:
数据结构(Data structures)(我们要如何存储信息?)
输入(Inputs)(用户需要输入什么?)
输出(Outputs)(屏幕上应该显示什么?)
处理过程(Processes)(幕后会进行什么运算或检查?)

常见错误:
不要试图一次解决所有问题!如果你尝试一次写完整个解决方案的代码,你很可能会遇到难以发现的错误(bugs)。请专注于每次只处理一个解决方案组件。


3. 确定步骤的顺序

计算机虽然运算速度极快,但它们其实很“笨”——它们会严格地按照你写下的顺序执行指令,哪怕这个顺序毫无逻辑!程序化思维涉及精确地决定每一个步骤应该在什么时候发生。

“穿鞋与穿袜”原则
想象一下,如果你编写了一个穿衣程序:
步骤 1:穿上鞋子。
步骤 2:穿上袜子。
你虽然识别了正确的组成部分,但因为顺序错了,结果会是一场灾难!在程序设计中,这种顺序被称为序列(Sequence)

步骤逻辑:
在确定顺序时,请问自己:
1. 先决条件(Pre-conditions):步骤 B 是否需要在步骤 A 完成后获取信息才能开始?(例如:在用户输入密码之前,你无法检查密码是否正确)。
2. 依赖关系(Dependencies):哪些部分是独立的,哪些部分又依赖于其他部分?

重点提示: 解决方案不仅仅是一份清单,它是一系列经过精心编排的序列


4. 识别子程序(Sub-procedures)

随着解决方案越来越庞大,我们会使用子程序。子程序是一个包含在主程序中,能执行特定任务的独立“小程序”。

为什么要使用子程序?
可重用性(Reusability):如果你写好了一个完美的“计算税款”子程序,你可以在程序的不同部分使用它 100 次,而无需重写代码。
可读性(Readability):阅读写着“执行登录(Perform Login)”的程序,要比阅读在主界面中间夹杂 50 行混乱代码的程序容易得多。
测试(Testing):你可以测试一个小小的子程序,确保它运作完美后,再将它整合到其余代码中。

记忆辅助:电视遥控器
想想电视遥控器。当你按下“音量增加”按钮时,你并不需要关心内部的电子元件是如何运作的,你只需要“呼叫”VolumeUp 这个子程序。遥控器的设计者将“控制电视”这个问题拆解成了无数个可重用的小型子程序(即按钮)。

快速回顾栏

程序化思维:将问题拆解并按顺序排列步骤。
分解(Decomposition):将大问题拆解为更小、更易于处理的组件。
序列(Sequence):指令执行的具体顺序。
子程序(Sub-procedure):执行特定任务并可透过名称“呼叫”的代码小区块。


总结清单

在继续学习之前,请确保你对以下四点充满信心:
1. 我能否观察一项任务并列出问题的不同组成部分?(例如:计算器需要接收数字、选择运算符,并显示结果)。
2. 我能否识别解决方案的组成部分?(例如:使用变量 \(x\) 来存储第一个数字)。
3. 我能否将这些步骤按逻辑顺序排列?(例如:先输入,再处理,最后输出)。
4. 我能否看出哪里可以使用子程序?(例如:每当用户按下按钮时就会被调用的“保存文件”常式)。

做得好!程序化思维是所有优秀程序设计的基石。请继续透过观察日常生活中的任务(例如制作三明治或过马路)并尝试识别其组成部分及所需的正确执行顺序来进行练习吧!