C Programming Language

Practice #03: The Right Way to Ask Others for Help

# Basic Tutorial,  # Programming Language,  # C Programming Language

Last Updated: 2020-01-01


前置知识

在阅读本文档前,请先阅读本教程的整体介绍,详见 Introduction


前言

这是一个很有趣的话题。

很多初学者,甚至是一些有经验者,遇到无法解决的问题时向他人求助的方式都有些问题。如果求助的方式不当,那么你可能会给对方留下不好的印象,甚至是直接忽略掉你的后续的求助。

本文的目的是帮助那些对此毫无意识的读者了解应该用怎样的方式去求助会比较合适,多多少少能让你少走一些弯路。下文会简要介绍一些注意事项,并给出反面教材及其可能的改善方式。

其实本文不应当归类到 C 语言栏目下,但是考虑到国内绝大多数高校的计算机系都以 C 语言作为入门语言,我还是把这篇文章放在了这里,即便它跟 C 语言事实上毫无关联。


使用合适的表达方式

概述

这就是个常识性的问题了,在向他人求助时,注意自己的表达方式是很重要的。这是所有问题中最为严重的,一个没有礼貌、毫不客气的提问者,会给人留下最坏的印象。这么说可能有些抽象,看看下面几个例子就清楚了。

当然,若是熟人之间,根据熟悉程度会降低对礼貌客气表达的要求,正所谓熟人好说话嘛,这个还请读者自行把握,下面的例子都是基于双方互相完全不熟悉的前提的。

注意,本节中的改善仅限于表达方式,其他方面的问题并未改善,具体详见下文。

反例及改善 1

反例:“帮我看下这段程序问题在哪好吗,谢谢。”

改善:“ xxx (学长/老师/...) 你好/您好,我在编程时遇到了无法解决的困难,下面是我的代码,可否请您帮我看看问题出在哪?谢谢!”

错点:一点礼貌都没有,不用解释了吧?就我个人而言,但凡我今天心情稍微差一点点,这种消息我根本不会回复。

反例及改善 2

反例:“学长你好,我这段程序一运行就会崩溃,实在是找不到原因了,您有空时一定要帮我看一下,谢谢!”

改善:“学长你好,我这段程序一运行就会崩溃,实在是找不到原因了,可否请你在有空时帮我看一看问题出在哪?谢谢!”

错点:一定要帮你看一下?您哪位,您是我爸还是怎么的?这种消息我也多半不会回复。

反例及改善 3

反例:“学长你好,我这个作业题的代码跑出来答案总是不对,我试了很久都没能解决,可否请你有空时赶紧帮我看看,我很急,谢谢!”

改善:“学长你好,我这个作业题的代码跑出来答案总是不对,我试了很久都没能解决,可否请你在有空时帮我看看?明天就是作业的截止日期了,我实在是赶不及了,拜托你了,谢谢!”

错点:既然我与你互不熟悉,那你急不急和我有什么关系?这其实也是礼貌的问题,若是真的很急,你也只能旁敲侧击暗示对方。其实只要表达得体,对方也多半会体谅你,尽量稍早些帮你解决问题。


学会详细描述你的问题

概述

最令被求助者反感的事情之一就是在求助时不把自己的问题描述清楚。虽然对于初学者来说,有很多问题都不知道怎么表达合适,但是说得清不清楚是一回事、说不说是另一回事。

在求助时,一定要尽可能详细清晰地描述自己的问题是什么,尤其是你和被求助者之间没有那么熟悉的时候。若是熟人之间倒是问题不大,来来回回交流几句也就弄明白了,但若并非熟人,你又凭什么要求对方愿意为你付出额外的精力去搞清楚你到底想问什么呢?

举例来说,对于小规模的编程题,一般需要向被求助者提供如下信息,视情况提供其中的若干条:

  • 你写程序想要解决的问题是什么;

  • 你实现的具体代码的概括;(这看起来和第一条重复,事实上对于复杂的编程题来说这一步是必要的,只是初学者前期写的题目一般太过简单,所以这一条看起来才会缺乏意义)

  • 程序的输入和你所期望的输出;

  • 你实际的输入和输出;

  • 你对 BUG 的排查情况(如果不会排查可以忽略这一条);

举个例子:

  • 程序要求的是学生的平均成绩;

  • 先输入每个学生的成绩,然后去掉最大值和最小值,之后计算剩余值的平均数,最后输出;

  • 输入 61,77,78,79,93 ,输出 78

  • 给一个黑框截图,这非常有必要,因为有可能是你输入的格式和你写的 scanf 不匹配,而被求助者只有看到你的实际输入才能知道这一点;

  • 例如,排查过求最大值最小值的函数,确定没有错误;

反例及改善

反例:“学长你好,可以请你有空时帮我看下这段程序吗?我自己实在是解决不了,谢谢!”

可能的改善 1 :“学长你好,可以请你有空时帮我看下这段程序吗?我自己实在是解决不了。这个程序是输入五个数然后求最大值,但是我刚输入完五个数程序就崩溃了。谢谢!”

可能的改善 2 :“学长你好,可以请你有空时帮我看下这段程序吗?我自己实在是解决不了。这个程序是输入一个数组然后给数组升序排序,但是排序后的数组的顺序还是不对,而且会多出一个莫名其妙的数,比如输入的数组是 [1,4,7,6,4][1, 4, 7, 6, 4] ,但是排序结果却是 [1,4,4,1516970,6][1, 4, 4, 1516970, 6] 。谢谢!”

可能的改善 3 :“学长你好,可以请你有空时帮我看下这段程序吗?我自己实在是解决不了。这个是我们的结课大作业,模拟实现一个学生信息管理系统,我这个删除学生的功能可能有问题,删完之后输出所有学生,这个输出的结果就会很诡异,这个截图里就是其中一个结果不对的例子。谢谢!”

另外,如果是某个OJ上的在线编程题,最好在详细描述你的问题的同时,附上原题的链接或是题干的截图,这样方便别人帮你解答。


不要复制粘贴大段代码

问题描述

很多人在求助时喜欢直接把自己的代码复制粘贴发送一气呵成,如果代码很短倒还好,否则你这一坨代码发出去,立刻就会极大地降低对方帮助你的欲望,甚至若是代码风格还差,对方可能就要假装没空了。

这真的没什么好说的,我给你两张图你自己体会,分别是我在手机端和电脑端 QQ 上收到这种消息的截图:

你给我一个帮他看代码的理由??

另外,如果你需要对方帮你 DEBUG ,千万不要发送代码的截图或照片,这简直比发纯文本还要糟糕。你发张图片让人怎么帮你 DEBUG ?如果肉眼找不到错,让人家一个字一个字地把你的代码再敲一遍吗?那显然是不可能的,所以如果对方肉眼查不出来,多半就不会再理会你了。

改善措施

如果代码不是很短(大于 20 行),请不要直接发送纯文本信息。建议使用以下方式之一发送代码:

  1. 发送源文件。

无论是 QQ 还是邮箱都可以发送附件,不会刷屏,对方也能自由选择接收的时机,还省去了复制的麻烦。

但是注意,如果是多个源文件的程序,记得打好压缩包再发送,一次性向对方分别发送十几个源文件可能会导致你被拉黑。另外如果是一个工程,也要告知对方如何启动,不要让对方耗费额外的精力去寻找入口程序。

  1. 借助 Ubuntu Pastebin 网站的帮助。

Ubuntu Pastebin

这是一个用来帮助人们互相传递代码文本的网站,把你的代码上传后会生成一个链接,你只需要给别人发送一个链接即可,而且网站还提供了代码高亮,简单方便,非常好用。发送源文件基本上只能在电脑上接收,但是这个就不受此限制了。

它的一个缺点是贴上去的代码有时间限制,不过最长可以维持一年,应该足够应对所有情况了。它的另一个缺点是贴上去的代码是完全公开的,不能设置查阅密码之类的东西,不过只要你的程序不涉及什么保密事项,这也不会成为问题。

另外就是它不支持贴一个工程或是同时贴多个文件,只适合用于单文件程序。


不要用手机对电脑屏幕拍照

关于不要发送代码的截图或照片,前文已经提过了。但是有时你可能会需要给对方提供一些报错信息的截图、运行结果的截图、你电脑运行环境信息的截图之类的东西。

在这种情况下,请你按照字面意思,用电脑自带的或是 QQ 的截图工具,或是其它任何截图工具,截取窗口快照发给对方,如果需要录像就用录屏工具,千万不要用你的手机对着电脑屏幕拍照或录像然后发给对方!

除非确实有特殊原因无法截图,最好跟对方说明情况表达歉意,请尽全力避免使用拍照的方式。

我听过各种拍照而不截图的理由,包括但不限于电脑 QQ 没登录、电脑上没装 QQ 、懒得截图、等等,但这些并不重要,重要的是,你已经给对方留下了一个不太好的印象,降低了对方帮助你的欲望。因为根据常识,对着电子屏幕拍照,照片的清晰度通常都会很糟糕(更别说有的人还是俯视着/斜着拍的照片,我简直无语了),你不应该因为这些无聊的理由而给被求助者制造麻烦,除非因为某种原因你真的截不了图。


求助前先自己尝试解决问题

一言以蔽之,不要问能在一分钟以内百度到的问题,不要连做十几分钟的 debug 的尝试都没做就直接把出错的程序丢给别人,这会显得你非常懒惰,和你菜不菜是两回事。

如果百度了看不懂,可以在提问时附上你所查到的博客链接,并详细描述你是什么地方不懂。这可以表现出你的态度,避免使对方认为你非常懒惰,也可以让对方能够准确地为你解惑。


不要做伸手党

有时,当你向人求助后,对方可能只帮你解决了部分问题,但指明了解决剩余问题的道路。此时你应当先自己尝试一段时间,搞不定再说;如果你自己还没有经过任何努力就反复向对方追问、寻求更多帮助,只会令人感到反感。