解决问题的方法
(这是笔者为学生会网络部的宣讲活动准备的演讲稿)
神妙非凡的康德揭示了人类理性的分析能力与综合能力,解决了先天综合判断是如何可能的问题。而作为生活在便利的网络社会的现代人,掌握利用互联网解决问题的技艺能极大提高我们的办事效率与学习能力。
我们可能会遇到的问题有很多,如:
- 如何用C语言写一个图书馆管理系统?
- 湖北师范大学的作息时间是怎样的?上一任校长是谁?
- 拉链的工作原理是什么?
- 为什么我的电脑开不了机?
- 为什么我的程序跑不起来?
如何解决编程问题?
编程语言学习者常常遇到各种超出他们能力之外的问题,有一些是对语言缺乏了解产生的语法问题,一些仅仅是将main写成mian或是少写一个括号导致的编译器报错,而更复杂则是编译器无法感知的逻辑问题。那么要解决编程问题,首先是对问题本身有充分的认识。
- 查看报错信息。编译器给出的报错信息往往蕴含着解决办法,然而令人遗憾的是现如今大部分的编译器的输出结果只有英文信息,编程人员可以借助翻译软件阅读报错信息。一些简单的错误通常在这一步就能被排查出来,像是将main写成mian,或是缺少括号、分号之类的。
- 网络搜索。如果无法理解报错信息,且检查代码没有发现错误原因,则需要考虑求助于强大的网络搜索引擎(web search engine)了。推荐如下几款搜索引擎:
- Google——目前最强大的搜索引擎(国内无法访问)
- Bing——微软开发的一款搜索引擎(国内可用)
- DuckDuckGo——注重隐私保护的搜索引擎(国内无法访问)
- 向编程高手求助。
随着近些年AI技术的爆炸式增长,AI的实用性急剧增加,合理地利用AI解决问题不失为一种方便快捷的手段。国外有ChatGPT、Claude、Gemini,国内有通义千问、文心一言、讯飞星火,我们的选择很多。向AI请教需要详细地描述你的问题。
如何使用搜索引擎?
你需要准备的有:
- 一台能访问互联网的设备(手机、电脑、服务器等)
- 浏览器软件(Chrome、Edge、360浏览器等)
- 一个明确的问题
搜索引擎操作的精髓是关键词输入与信息提取。你不能以向人求助的方式向搜索引擎求助。
- “我在开发Qt程序,有没有人知道怎么导入第三方库啊?”是坏的;“Qt Creator 导入 第三方库”是好的
- “请问您知道我们学校几点熄灯吗?”是坏的;“湖北师范大学 熄灯时间”是好的
(演示一下)
也就是说,要想让搜索引擎真正地检索你的问题,最好以多个关键词的形式提问。你得花功夫鉴别哪些词是真正与问题相关的,哪些只是修饰。
同时我们应该避免过于具体的搜索语句,向着一般化的方向提问,比如不应该搜索“C语言 创建 26维 指针”而因该搜索“C语言 创建 n维 指针”。
很多时候,一次搜索并不能解决问题,但是能提供许多有用信息,方便对搜索语句进行补充与更新,再次搜索就离答案更近了一步。想Windows C程序的光标移动操作,通常搜索会告诉你有个头文件叫做conio.h的库文件,之后要做的就是进而学习conio.h的用法了。
如何向人提问?
- 提问前的准备
- 在提问之前,应该尽可能自己先尝试解决问题
- 学会使用搜索引擎,阅读手册和FAQ
- 了解你所在社区的文化和规范
- 提问的基本原则
- 清晰、简洁、有针对性
- 描述问题时要详细,但不要啰嗦
- 展示你已经做过的努力和尝试
- 态度要尊重,不要理所当然地期待别人帮助
- 提问的具体技巧
- 使用有意义的、描述性的标题
- 详细描述问题的症状
- 说明你的运行环境(操作系统、软件版本等)
- 提供重现问题的完整步骤
- 展示你已经尝试的解决方案
- 贴出相关的错误信息和日志
- 如何写一个好的问题
- 使用清晰的语言
- 提供足够的背景信息
- 避免主观臆断
- 尊重他人的时间
- 准备接受可能并不喜欢的答案
- 应该避免的行为
- 不要在不恰当的地方提问
- 不要重复提问
- 不要发送私人邮件询问公共问题
- 不要用简单的"是/否"问题浪费专家时间
- 避免使用不恰当的语气
- 接收和使用答案
- 仔细阅读给出的建议
- 对帮助你的人表示感谢
- 如果问题解决,告知社区
- 学习和改进,而不是一味索取
- 后续行动
- 自己尝试解决问题
- 如果成功,分享解决方案
- 成为社区的贡献者,而不仅仅是消费者
正例:
- 问题描述清楚
- 标题:"Windows 10 上安装 Python 后,运行 pip install 提示 'SSL Certificate Error'"
- 问题描述:
我在 Windows 10 上安装了 Python 3.10,试图用 pip 安装 requests 时遇到以下错误:
ERROR: Could not fetch URL https://pypi.org/simple/requests/: There was a problem confirming the SSL certificate...- 运行环境: Windows 10, Python 3.10, pip 22.3.1
- 尝试的解决方法:
- 更新 pip (
python -m pip install --upgrade pip) - 添加
--trusted-host参数运行命令
- 更新 pip (
- 效果: 问题依然存在。 优点:
- 标题描述问题具体,吸引相关领域的人关注。
- 提供了操作环境和具体的错误信息。
- 展示了已尝试的解决方法,表明提问者有主动解决问题的态度。
- 尊重他人的时间和感受
- 提问:
"请问我在配置 Kubernetes 集群时,kubectl get nodes显示的是空的,可能是什么问题?" - 补充说明:
- 我按照官方文档配置了 kubeadm,但在初始化后发现无法查看节点。
- 运行
kubeadm init的输出如下:[某段输出日志] - 尝试的解决方法: 查阅了以下链接:[官方文档链接] 和 [某论坛讨论链接],但没能解决问题。 优点:
- 提问者尊重回答者的时间,提供必要的上下文。
- 语气谦逊,态度尊重。
- 提问:
反例:
- 问题描述模糊
- 标题:“Python 报错了怎么办?”
- 正文:
“我运行 Python 的时候报错了,怎么解决?” 缺点: - 没有具体描述问题场景和错误信息,读者无法判断具体情况。
- 缺乏尝试的痕迹,显得提问者不够努力。
- 态度不友好
- 提问:
“这软件真烂,怎么老是报错?你们快点告诉我怎么解决!” 缺点: - 用词强硬,没有表现出尊重。
- 缺乏细节,让回答者无法快速理解问题。
- 提问:
- 反复催促
- 提问后追加:
- “怎么没人回复?很简单的问题啊!”
- “还没人解决吗?这社区真不行!” 缺点:
- 表现出不耐烦,容易冒犯回答者。
- 缺乏尊重社区规则和他人时间的态度。
- 提问后追加:
- 没有上下文
- 提问:
“程序运行的时候崩溃了,有人知道怎么修吗?” 缺点: - 缺乏运行环境、具体的错误信息或日志。
- 没有提到程序的类型或使用的工具。
- 提问:
解决问题的一般方法
著名哲学家勒内·笛卡尔将研究问题的方法分为四个步骤:
- 永远不接受任何我自己不清楚的真理,就是说要尽量避免鲁莽和偏见,只能是根据自己的判断非常清楚和确定,没有任何值得怀疑的地方的真理。就是说只要没有经过自己切身体会的问题,不管有什么权威的结论,都可以怀疑。这就是著名的“怀疑一切”理论。例如亚里士多德曾下结论说,女人比男人少两颗牙齿。但事实并非如此。
- 可以将要研究的复杂问题,尽量分解为多个比较简单的小问题,一个一个地分开解决。
- 将这些小问题从简单到复杂排列,先从容易解决的问题着手。
- 将所有问题解决后,再综合起来检验,看是否完全,是否将问题彻底解决了。
比如说你想使用C语言写一个贪吃蛇程序,那么可以将其拆分为以下几个小问题:
- 程序如何以非阻塞的方式监听用户输入?
- 如何绘制游戏界面?
- 地图如何存储?
- 蛇何以存在?
- 如何实现光标的坐标转移?
- 如何实现碰撞检测?
- 障碍物(如果有)与食物应该如何生成?
- 是否应该有一个得分排行榜?如何实现? TODO:找一个更好的例子