提问的正确姿势

平时做任何事情,常常会遇到很多各种各样的问题,尤其我们工科学生,到处都有「实际与理论不符的情况」,所以大家平时也都习惯相互提问请教。

嘛,有问题就问当然是好事,总比明知有问题还一直憋着不说或者根本意识不到自己问题,自以为没有问题的强。

但是有时候问题问着问着就变得比较奇怪了,也很让人无奈。。。随意感受一下~

  • 你们把这个报错给我解决了。 ( 好的,大爷。Σ(  ̄□ ̄||) )
  • 你看我这个程序怎么运行不了? ( 因为玄学 )
  • 你看我这几个线都接对了的,都检查没问题,它就是工作不了要短路? (哦,原来你线接对了啊,哦原来这里是故意不接的,哦原来这里是故意接反的啊,原来是我看错了啊)
  • Java 要怎么写? (这个很简单啊,拿起笔,跟我来,j... a... v... a,好,写完啦)
  • 我想弄个卖东西的网站,像淘宝那种,该怎么建? ( 蛤?淘宝。。。是哪种??)
  • 写网页要怎么学? ( 这个问题问的好,这个要先…… 以下省略两百万字。)
  • Java 好还是 C# 好? ( 。。。。。。 Java 小三,C# 碧池!PHP 是世界上最好的语言! )
  • 学长,我们这个专业要怎么赚大钱? ( ?!! ヽ(`Д´)ノ (╯°口°)╯(┴—┴ 我特喵的要是知道那我还会在这里?! )

。。。

缓一口。

(TL;DR 总结在文末,下文主要是各种原因分析,懒得看分析的小伙伴可以直接跳去看总结

上面说的只是一小部分,我们平时遇到的基本上都是这种,不回答又不好,想回答也不知道怎么回答,于是生活就处处充满了无奈。

首先,大家积极提问请教肯定是件好事,这种情况下提问的人肯定都是想寻求帮助,获取他人的帮助,但是考虑到这种情况的结果,这种提问方式并不能达到让别人帮忙的目的。本篇文章就是为了解决这种情况。

# 目的是获得帮助

我们的目的是获得别人的帮助,那么从目的反推,别人需要有什么条件才能够帮住到你?

  1. 有技术能力
  2. 有方便的时间
  3. 明白你说的意思
  4. 愿意帮你

这四个是基本条件,同时达成,别人也不一定会帮你,但是任缺一个,别人肯定帮不到你。

有技术能力这点,在于平时你对那个人的观察和评价,还有你对技术难度的正确认知;而对技术难度的认知,又得来自于你对技术本身了解的多少。。。MD 好绕啊,不说了。

有时间这点也没什么好说的,人家本身正在忙没空的情况下,你总不应该强求人家非要先做你的事吧。

剩下的两点也就是关键了,如何让别人明白你的意思如何让别人愿意帮你


先说较为简单点的后一个。

# 为什么有人愿意帮你?

某某同学: 当然是出于好心啦。

没错,是出于好心。除非是和你在一条船上,不帮则死的那种合作,否则 没人有义务帮你,只是出于好心的善意,就算是朋友,也只是可能为了相互增加人情以后好办事,并不代表朋友就有义务帮你做事帮你解决问题。

所以,不要把别人的帮助当作理所当然。

这里说的包括两种人,大爷和你大爷。前一种人请人帮忙就跟发号施令一样随意指使;后一种人是一旦别人稍微有点没照顾到,就会满脸怨愤的“你明明会的,你凭什么不做”的表情(自行脑补,我是见得多了)。

这样随意践踏别人的善意的行为,只会让他人不再对你露出善意。

# 大部分很简单的小问题都是可以直接搜索到解决办法的,这样的问题就不要再麻烦别人了!

你不会自己 Google 吗?

这里就不讨论“为何要感谢别人的帮助”这种废话了(虽然确实有人不懂这个),总之,这里的结论是:

# 放低你的姿态,感恩别人的帮助,不要让人寒了心。

顺便说一句,放低姿态,不等于就把别人捧到天上去,不等于就把自己摆在乞讨者的位置。

经常有人在 QQ 群啊、微信群啊、各种论坛等公共社区到处乱吼,“啊,救命啊,我的代码 xxxx ”,“跪求 xxxx 办法”,“有没有 大佬 / 大牛 / 大神 能帮我做 xxxx”。

尊严是自己争取换来的,不是跪着求别人给的。社区本身是一个对等的地方,大家都是用对等的身份在交谈,没有说别人的身份就一定比你尊贵,你也没有必要把自己看得多么低贱。

“大牛”、“大神”一类的称呼也是完全不合适的,假如群里有人知道这个问题并且他回答了,那岂不是他在公开场合承认自己是某某大牛啦,然后呢?等着被撕逼?你当这是网红训练群啊!

并且这类交流的建立靠的就是比较对等的身份,假如你真的就很低贱,对方真的就有那么高贵牛逼,那你本身也失去了和对方交流的资格,因为身份的差异悬殊太大,对话完全达不到一个层级上。

就像硬件层的东西不能拿到软件层上,链路层的东西不能直接接到应用层上。一切应该是以相对对等,没有巨大信息跨度为基础。

既然上面说了大家帮忙靠的是善意,那么什么样的人更容易获得别人的善意呢?是平时每天都在浪、遇到问题就知道找人要的伸手党;还是时刻都刻苦努力、却没找到要点而无法解决问题的人呢?

很明显是后者,我们都拒绝伸手党,都喜欢刻苦努力的人。因此,当你提问时不小心说出自己经过的努力后,会有更多的好心人来帮助你。

我们想看到的,也是你到底有多想解决这个问题,我们想看到的,是你为这个问题自己努力过思考过。看到问问题的人这么努力,我们才会想,这样我如果帮助了你,我会觉得自己花时间帮忙是值得的(其实我觉得本质是牵涉到相互贡献与潜在贡献的问题,有自我努力,只寻求他人指点并希望自己亲自完成问题的人,比起直接伸手要他人代替自身做完事情的人,更容易获得别人愿意帮助的心情)。所以,这里的结论是:

# 附上你的努力,展现你的思考。


现在来说说上文里剩下的另一个关键词。

# 别人为什么不明白你的意思?

某某同学: 当然是你说的不够清晰啦~

这时候我们通常就简单的归结为表述不够清晰、你说的我不听不懂,那么,具体的原因呢?

  • 对话不在一个频道。你说东,他说西,自然无法有效交流。
  • 内容情况复杂,简单几句话无法描述清楚,容易让人产生误解。
  • 说话逻辑混乱,不易于理解。

简单归纳了下原因,那么现在再针对这些原因,想些解决的办法~

要保证大家在同一个频道上,首先是要有定义确定这个频道,对我们来说也就是先要 描述清问题所处的完整背景环境、具体场景,详细的列举问题发生时运行的环境(配置、系统、硬件等),如果环境描述不完整,也可能就会漏掉了某些关键的引发点;提供可复现问题的步骤,以便别人可以同步你的场景直接调试问题寻找解决办法。

如果是觉得自己语言能力不强,表达能力十分有限,找不到什么好的形容词,那么就应该避开自己的劣势,尽量少用一些形容词,多去描述客观事实,应该 按时间顺序描述你操作的过程、采取的措施、反应的现象,说客观的东西,而不是主观的东西。

提供的信息必须精准有效,即使内容情况再复杂,也应该减小到最小出错环境,或者尝试分解问题,很多大问题都能分解为数个小问题。相对于大篇幅的问题,大部分人更愿意回答看起来小巧问题,因为这给人不会占用她们太多时间的感觉。

如果你问的是代码的话,顺便说一句:

Talk is cheap. Show me the code.

既然问程序,那就应该 把代码附上。喂,你把代码粘到 QQ 群里干嘛!附上代码的目的是方便别人阅读帮你寻找问题、方便别人调试代码帮你寻找方法,所以不要再干直接把代码粘到 QQ 里和粘到论坛回复框里(指直接回复一串代码而不通过论坛提供的代码框)的蠢事了!

所以我们给别人看的代码必须有以下几点要求:

  • 方便阅读 (排版缩进美观,行号正确,关键字有高亮。)
  • 方便运行 (难道我还要在自己电脑上给你配个环境?)
  • 方便修改 (给你找问题的,不能修改那你告诉我怎么调试?)

前端代码很方便,codepen | jsbin | JSFiddle在线代码平台 都是很好的展示地方。

对于不能在线运行的代码,简单的,可以通过 GitHub 来放出工程,复杂的,直接放出能跑的 Docker Image

# 不要直接发文件!

为了理清说话逻辑,我们在提问之前应该先 整理好自己的思路,通过合理的逻辑顺序展开问题的发展;既然是要让别人听懂,那么说话的时候就该站在对方的角度思考,想想不了解情况时,如果我听到别人这样讲,能听懂吗?如果不能,那么还差哪里没有表述清楚?经过这样说服自己能够听懂后,再把刚才的话阐述给对方,效果会好很多,至少不再是一种折磨。

现在再来谈谈怎样理清自己的思路。

我的办法是目的驱动逻辑,就是根据目的反过来思考怎么讲。这里提供一个我的思考模板:

  1. 想要达成什么目的或者效果?
  2. 一步步的操作步骤过程是怎样的?
  3. 遇到了什么困难或者产生了什么问题?
  4. 期望获取什么样的帮助?

根据上面这些提示要思考问题,通常就能将问题讲清楚了。

在客观事实情况描述清楚之后,可以 附上自己的猜测,并且我们也更鼓励提问者提问时附上合理的自己的猜想,因为这也能表明你有自己的思考而不是单纯的伸手党(参见上文前一段落)。

比如,不要问“为什么会 xxx?”,而是问“xxx 的原因是不是因为 xxxx?”;

不要问 “这个是什么?”,而是问“这个是用来 xxx 的吗?”;

不要问“井盖为什么是圆的?”,而是问“圆型的井盖比起方形的是不是有哪些好处?”;

注意,这些猜想得是合理推测的,不要天马行空的乱说,那样只会让别人觉得你是在说着好玩而不是在认真提问。


最后来总结下~

# 提问的正确姿势指北

首先 思考分析问题,再搜索方案尝试自我解决,很多小问题到这里就够了。实在不能解决再去寻求指点。

  1. 找到合适的地点和对象
  • 有技术
  • 有时间
  • 姿态对等
  1. 清晰准确的表述问题背景
  • 大环境 (配置、系统、硬件等)
  • 运行环境 (语言、库、版本)
  1. 描述需要达到的目的和效果
  • 客观,不要加自我感情
  • 详细、准确、有逻辑
  1. 说明自身操作的过程
  • 操作步骤
  • 附上代码 - 在线代码平台
  • 项目工程 - GitHub
  • 可运行环境 - Docker
  1. 表明所遇到的困难和问题
  • 客观表达,不要加自我感情
  • 任未解决的问题
  • 对问题的猜测
  1. 展示你的努力
  • 采取过的措施
  • 付出的行动
  1. 阐述期望获取的帮助和指点
  • 注意是指点,不要想着别人直接帮你完成任务
  1. 简单表达谢意
  • 礼貌将会增加你得到有用答案的机会
  • 简单的感谢就好,别人的帮助是出于善意而不是为了你的感谢
  1. 做好笔记
  • 你可能还会遇到
  1. 帮助他人
  • 传达善意,回馈帮助过你的社区

# 参考资料

其实这几篇文章我在开头就想推介给大家,但是我知道太长了你们肯定懒得看~

推介以下文章从上到下依次阅读。

代码江湖救急(上)

代码江湖救急(下)

如何向开源社区提问题

提问的智慧