课程指南首页
本栏收录了 2023 级问题求解程设部分的通用实验指南。
栏目精神
本栏继承自 2021 级问题求解程设部分的题解网站指南。
《问题求解》作为计算机拔尖班低年级的核心大课,旨在培养集理论素养、实践能力、思想高度于一身的未来计算机科学家,并同时为学生修读其他高年级课程 1 打下扎实基础。因此其训练难免繁重,其上手难免艰难。对于在大学之前没有接触过计算机领域的同学,更是如此。
为带来更好的《问题求解》修读体验,本栏将为大家提供重要的先期上手指导,并给出此后在计算机领域进一步深入学习的一些资源与建议。
本栏提供的指南主要聚焦于程设部分,对于理论部分也会有些许涉及。
重要提醒
学好英语
英语仍然是目前高等教育、科学技术领域的通用语言。在英语社区中得到的资料往往是最一手、全面的。英文教材和文档的撰写水平也往往高于对应的中文教材和文档。如果要阅读最前沿的学术论文,更是只有英文文献可供阅读。在计算机这个信息产出量极大的学科,学好英语更显得至关重要。
《问题求解》课程和本网站所提供的许多资源都面向英文使用者。我们并不要求你只阅读英文资料,但如果你所需要的资料没有中文版或中文版质量不佳,请不要排斥阅读英文版。当然,如果是一些比较周知的材料,那么阅读中文版往往会更快,但是请记住部分专业名词的英文表达。
如果你坚持阅读英文课本、查阅英文资料,那么无论你将来投身学术界还是工业界,在国内升学抑或留学深造,你都将大受裨益。
语言、文字是知识的媒介。如果你不会英语,你就自绝于世界上 50 亿以上人口的知识产出了。
学会解决问题
无论是学习《问题求解》还是在计算机领域继续学习,解决问题的能力将是重要的。
作为信息爆炸时代的学科,计算机学科的知识浩如烟海,细节不可计数。在学习计算机知识,进行计算机实践的过程中,你可能会遇到包括但不限于环境配置、运行报错、运行结果不符预期等各种问题。
幸运的是,你的前辈们也同样遇到了这些问题。他们借助信息时代的丰富工具为我们可能遇到的各种问题提供了完善的解决方案与经验,你需要学会妥善利用这些工具来解决问题。
如果把「学会在计算机领域解决问题」展开来讲将是个宏大的话题。因此我们简要总结了几点,权当抛砖引玉:
- 机器永远是对的。在 80、90 年代硬件 bug 也许还常见于终端用户/程序员的视野(这里的终端是指 end 而非 terminal)。但在 2023 年的当下已经少之又少,更不是我们这个阶段能够碰到的情况。因此,在程序在任何阶段出现问题时,请首先假定是自己的程序出现了 bug。注意:操作系统属于软件而不是机器。
- 框架/软件/文档通常是对的。你们将使用的框架/软件/文档都是经过大量测试以证明其正确性的。虽然还可能存在隐含的漏洞,但是与之相比你操作失误的可能性显然更大
(如果你是天才,当我没说)。因此,当你使用这些框架/软件/文档时,如果出现了问题,也请预先假设是自己的问题,并在尝试解决无果后再尝试向开发者提 issue 或向我们报告错误。(当然,我们自行开发的框架/软件/文档错误的概率更高一些) - 不要静态调试。除非在笔试的环境下,请不要仅盯着代码看来试图找到 bug,利用以下的技巧来在计算机本身的辅助下找到 bug。
- 利用程序日志。如果你在使用程序的时候出现了问题,请仔细观察该程序输出的日志。大部分情况下,程序日志本身就已经包含了问题描述。程序日志往往用英语写成,请不要把任何非中文报错当作乱码。在许多情况下,初学者连诸如
Permission Denied
,No such file or directory
和Command not found
这种极为常见的报错都不能理解。这是我们不希望看到的。 - 复现、跟踪、缩小和定位问题。在计算机中,寻找问题的一个关键方法是「跟着程序运行一次」(复现和跟踪)。计算机和计算机程序的本质是有限状态机。因此,如果能确实理解程序运行的过程,并理解程序运行过程中的状态,就可以找到出现问题(状态出现异常)的地方。做到这一点的方法有很多,最常用的是输出程序日志和使用跟踪器或调试器(GDB 等)。如果问题发生在你无法触及的地方(如 OJ),那么复现问题将变得有些困难,你需要自己生成测试数据。
- 学会使用大数据工具(搜索引擎/大语言模型)。这也许是 STFW (Search The Fucking Web) 的文雅和新潮点的说法。总而言之,当你看到程序输出了你不太懂的 Log,或在调试过程中遇到了不理解的技术细节,都可以上网搜索/向大语言模型提问,这往往能事半功倍。
- 学会提问。在你发现以上的方法都不好使以后,可以向周围的人提问。你提问的对象可以是你身边的大佬,也可以是助教老师,还可以是网络水友。但在提问过程中始终记住:解决你的问题并不是他们的义务。 世界上有很多好人,但希望大家不要过度消费他人的善意。请你在提问时给被提问者解决问题提供你力所能及的方便,也不要问自己没有尝试寻找过答案的问题。
过犹不及
我们鼓励同学们深挖课程中遇到的知识点和技能点,但请仅在学有余力的情况下探索课外知识。我们希望大家以完成课程任务为最优先,尤其是基础较为薄弱的同学。入门是循序渐进的事情,偶尔不求甚解并不丢人。
「过犹不及」的道理不仅在课程学习过程中使用,在程序设计时更是一项重要的设计思想(「不作过早优化」)。
计算机世界的海洋广阔无边,请在你没把握战胜暴风雨之前暂且在岸边巡弋,粗略风光。
遵守学术诚信
在完成任何《问题求解》课程的任务时,请务必遵守学术诚信,杜绝抄袭。
我们会积极利用各种人力、技术或社工手段检查大家的作业中是否存在抄袭。如果我们怀疑你的作业中存在抄袭现象,你将有一次申辩的机会,但我们保留无条件拒绝你的申辩的权力。在申辩中你需要清晰介绍自己任务的完成思路,并回答我们的提问。如果最终仍被我们认定为抄袭,按以下规定处罚:
- 第一次发现抄袭:本次作业记零分,程设部分得分 \(\times\ 0.8\)。
- 第二次发现抄袭:程设部分得分 \(\times\ 0.5\)。
- 第三次发现抄袭:程设部分记零分。
程设部分认定的抄袭次数和理论部分加在一起计算。
这个规则在此后的学期里可能会更改。
如果被抄袭者无法给出充足证据证明对抄袭作出了足够的防范或无法证明自己是被抄袭者,视同抄袭。
如果你不愿意服从助教团队的决定,可以进一步向任课老师或教务处申诉。
虽然我们不愿见到,但如果你已经铤而走险抄袭了或者动了抄袭的念头,我们希望你能主动和我们聊聊。
问求十一诫
这个表格引用和修改自 2021 级《问题求解》助教朱宇博写的 DO & DON'T。
DO | DON'T |
---|---|
遵守学术诚信,严禁抄袭 | Ctrl + C && Ctrl + V |
敢于提问,用聪明的方式提问 | |
对题目/测试数据有问题,遇到难以解决的困惑提问 | |
遇到问题先自己尝试解决 | |
规划好每项作业的时间 | |
充分理解题目意思再动手 | |
学习优秀的代码风格(如 IDE 内置的语法规范) | int mao ; |
理解自己写出来的代码 | |
自己设计用例测试程序 | |
对自己的眼睛好点 | |
写代码时注意代码的设计,最后和 STD 对比 |
-
《计算机系统基础》、《操作系统》、《形式语言与自动机》、《密码学原理》等 ↩