玩转 Stack Overflow 之提问篇

Posted 韦宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 Stack Overflow 之提问篇相关的知识,希望对你有一定的参考价值。

Stack Overflow是世界上最大的编程类问答网站, 大多数程序员或多或少和它有所接触: 即使你从来没有在它上面提问或回答过, 别忘了, 在搜索很多技术问题的时候, 结果的第一页往往就有几条链接到Stack Overflow的问题。

 

很 多人对于Stack Overflow的第一印象是: 很多编程问题都能在上面找到专业的答案, 太牛了。 但当问题没有找到合适答案, 而去上面提新问题的时候, 可能有人会发现自己的问题被残忍的 downvote,甚至被关闭、最后被删除。更有甚者, 发现自己被禁言了, 不允许再问问题。 这是Stack Overflow的另一面: 在一定程度上它对新手是很不友好的。

 

我 个人是Stack Overflow的活跃用户(这个(http://stackoverflow.com/users/1009479/yu-hao)就是我), 目前 reputation 超过 80K, 参与过很多的关闭/删除问题的投票(关闭问题需要5个rep超过3K的用户投票 , 删除问题需要3个或更多rep超过10K的用户投票 )。写这篇文章, 是为了分享一下我的经验, 讲讲如何有效的在Stack Overflow上问问题。

 

可以问什么样的主题

 

大 家都知道 Stack Overflow是编程类的问答社区, 但还真有人把它当成通用的问答社区了, 问些完全无关的问题。 其实, Stack Overflow 是有一系列兄弟网站的(目前已经有100+), 统称 Stack Exchange, 涵盖很多主题, 比如数学、物理、化学等科学类, 服务器管理、Latex、数据库等计算机类, 中文、俄文、日文等语言类, 详细的列表看这里, 不要让好问题问错地方哦。

 

允许的主题包括: 具体的编程问题、软件算法相关、通常只有程序员用的软件工具相关等。

 

有 些主题是比较容易弄错的, 比如一般的电脑操作问题, 应该去Super User(热门的 Linux/Unix, 和Ubuntu还有独立的站点), 专业的服务器问题, 应该去Server Fault。这些都不属于编程类的问题, 尽管不少程序员的日常工作也有涉及(想一想“怎么修电脑?”属于编程问题么)。 再举个例子, 同样是编辑器, Vim/Emacs/Atom相关的问题是可以的,因为基本只有程序员会用这些工具, 而 Word/记事本相关的一般就不可以。

 

什么样的问题应该避免问

 

编程相关还不够, Stack Overflow 要求问题必须是 「practical, answerable questions based on actual problems that you face」

 

这 是什么意思呢? 首先, 开放式的问题是不允许的,比如“你为什么喜欢php?”, 隔壁Quora会是更合适的对象。 其次, 问题应该不需要很长的篇幅来回答, 如果一个问题期待的回答足够写一本书, 那很可能会被关闭的。 各种寻求资源的问题应该避免,如 “要完成某某工作, 有什么Python的库可以用”, 或者“学习C++应该选择哪本书?”等, 因为答案会主观, 也容易吸引广告。 最后, 问题不要基于凭空的假设,要基于实际的难题。

 

需 要注意的是,你很可能见过一些违反上面规定的问题还在,而且浏览量很大, 尤其是一些寻求资源的问题, 和非编程相关的计算机问题等。 这是什么原因呢? 原来,早期的Stack Overflow的规则还比较松,也没有Super User之类的站点。 这些问题往往是08/09年问的,大多数现在已经被关闭了。

 

上面的规则如果遵守, 你的问题应该问对地方了。 下面继续说说内容上具体需要注意的。

 

直入主题

 

Stack Overflow不是论坛, 它的目标是希望成为编程类问答的一个超级数据库, 所以每个问题都不止是为了帮助提问者本人, 更重要的是希望将来能够帮助到每一个遇到同样问题的人。

 

所 以, 和问题无关的内容都被认为是一种噪音, 包括: 打招呼(比如 Hi, Hello, Good afternoon, Dear Coders等), 表示感谢(比如 Thanks, Any help would be appreciated等), 没必要的背景(比如 I’m a newbie in C#等), 你的签名 等。

 

可 能有人会不理解为什么这样规定, 尤其是不要表示感谢这点。 Stack Overflow社区的理由是, 对愿意阅读并尝试解答你问题的人来说, 最好的表达感谢的方式是upvote有帮助的回答, 以及选择其中一个作为答案。 每一句和问题无关的内容都增加了额外的阅读时间, 而一个问题可能会被大量的人阅读。 更多的相关讨论可以参见这里(http://meta.stackexchange.com/q/2950/224257)和这里(http: //meta.stackexchange.com/q/2950/224257)。

 

同样道理, 当有人回答你的问题之后, 也不要去添加无用的评论, 比如单纯的表达感谢的话, “+1”, 或者闲聊等。 评论的唯一用处是用来澄清疑问。

 

英语

 

作为一个英语社区, 不论提问、回答还是在评论中和别人互动, 都是要用英语的。

 

除 非英语水平真的很糟糕, 语法其实并不是最需要担心的,因为并不需要做到完美。Stack Overflow是允许自由的编辑其他人的问题/回答的(编辑者如果rep不到2K,需要经过评审才会生效)。 有很多人会热情的对问题进行编辑的, 包括修复可能的语法错误。 我想说的一点是, 要尽可能的保证单词拼写是正确的。 即使对英语不够好的人来说, 这也只需要多花一点时间检查就可以做到, 但它代表着对阅读你问题的人的尊重。 甚至很多英语母语的人在拼写上也不注意, 会把I’m 写成im, 把 want to写成 wanna之类的非正式英语, 这些都会降低问题被回答的概率。

 

内容

 

在发问题之前, 问自己几个问题:

 

  1. 你做过足够的研究么? 有的人连入门指南都没读上10分钟就去提问, 问的问题能有多少价值呢?

     

  2. 你尝试过搜索么? 至少要试过Google和站内搜索, 很可能相同的问题已经有答案了

     

  3. 你 试过debug么? 把你的想法或调试过程写在问题里,否则很可能会看到几条评论“Have you tried anything?”或“We don’t do your homework”之后问题就被downvote得惨不忍睹了。 因为大多数人是拒绝回答没有努力尝试的提问者的。

 

标签: 一个问题可以加1~5个标签, 大多数问题是和某种具体的编程语言相关的, 这个语言的标签通常是必须的, 否则相关语言的关注者们很可能根本见不到问题。

 

起一个好标题: 一般来说, 标题应该尽量用简介的语言描述具体的问题。 比如 C# number confusion就是个反例, 如果改成 Why does using float instead of int give me different results when all of my inputs are integers? 就要具体多了。

 

提供代码

 

对于编程类问题,的确有问题不需要代码也能表达清楚的, 但大多数问题都需要代码才能清晰的表达。“我声明了一个变量, 调用了几个函数, 然后它的值就变了, 为什么呢?” 这样的问题, 鬼才知道答案。

 

提供代码要注意: 不要贴截图, 难道你要回答者去照着截图敲键盘复现你的问题? 也不要只贴站外的链接, 如果站外链接能够提供一些额外的方便功能, 也要在贴代码的基础上附上该链接。

 

对于提供什么样的代码, Stack Overflow给出了一个可参考的标准: MCVE, 即Minimal, Complete, and Verifiable example

 

  • Minimal: 最小的, 也就是尽可能的去掉和问题无关的部分。 如果你贴了一个几百行的代码, 很少有人愿意花时间去仔细看。 构造最小化例子的过程本身也是debug的过程。

     

  • Complete: 完整的, 一个简单的判断是:别人看到问题, 可以通过复制你提供的代码复现出问题吗?

     

  • Verifiable: 可验证, 描述问题尽可能具体, “the code doesn’t work”这样的描述就很不好。 如果编译不过, 要加上编译错误信息; 如果运行报错, 也同样要加上具体的错误信息; 如果结果和你的预期不一致, 要说清楚你的预期结果是什么, 为什么会这样想。

 

格式

 

Stack Overflow的编辑器是Markdown格式的, 如果你还不熟悉, 建议去学一下, 因为Markdown真的是一个只要10分钟就可以学会的语言。

 

大多数的格式问题都是出在贴代码的地方, 如果你发现你的代码是普通文本, 而没有语法高亮等功能, 那你很可能是格式搞错了。 最方便的方法就是选择所有代码, 然后按键盘Ctrl + K 即可。

 

交流

 

有可能你的问题几分钟内就会有人回答, 也有可能有人对问题有疑问, 在评论中要求你解释。 可以评论@他们解释, 如果问题确实不够清晰, 编辑你的问题吧。 最后, 如果你自己发现了解答方法, 而还没人给出, 那就自己回答自己的问题吧。 自问自答是被鼓励的行为。

 

结语

 

看 完上面我的唠叨, 是不是也感觉到Stack Overflow对新手的不友好了呢? 但这是保持高质量内容的代价之一, 必须有一定的机制让低质量的问题不会泛滥, 才会有更多的人愿意花时间回答好的问题。 希望大家都能得到自己问题的答案, 有机会再讲讲如何回答问题。

 

 

以上是关于玩转 Stack Overflow 之提问篇的主要内容,如果未能解决你的问题,请参考以下文章

Error 0xC00000FD: Stack overflow 之 更改堆栈保留大小

如何实现类似于 Stack Overflow 上的“相关问题”功能?

通过Stack Overflow趋势工具看JavaScript框架

取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言

实测 ChatGPT 编程效果被其发现,这波我先站队 Stack Overflow

玩转JS系列之代码加载篇