Python编程轻松进阶
上QQ阅读APP看书,第一时间看更新

当在线搜索和linter都不能解决问题时,可以尝试在网上寻求编程帮助。不过,你需要了解有效寻求建议的礼仪。当经验丰富的软件开发人员愿意无偿回答你的问题时,最好能有效地利用他们的时间。

向陌生人寻求编程帮助应当总是最后一个选择,因为你发布的问题可能几小时甚至几天后才会得到回复。更快的方式是搜索是否有其他人已经在网上问过你遇到的问题,了解他们得到的答案。在线文档和搜索引擎的目的就是减少人工回答的工作量。

当你用尽浑身解数,只能寻求人工帮助解答你的编程问题时,请避免以下常见错误。

·先询问是否可以提问,而非直接提出问题。

·拐弯抹角而非直截了当地提问。

·在不适合的论坛或网站上提出问题。

·帖子名称或者邮件主题不够具体,比如“我有一个问题”或“求助”这样的主题。

·只说程序不能正常工作,但不解释预期的正确行为是什么。

·不提供完整的错误信息。

·不分享代码。

·分享的代码格式不好。

·不说明你已经尝试过的方案。

·不提供操作系统或者版本信息。

·让人帮你写程序。

这份“避坑”清单中不能做的事情并非仅是出于礼仪考虑,更重要的是,这些习惯会阻碍帮忙者助你一臂之力。帮助你的人首先要运行代码并尝试重现问题,因此需要许多关于代码、计算机和程序意图的信息。但现实中,提供过少的信息往往比提供过多的信息更常见。接下来的几小节将探讨如何避免这些常见的错误。我将假设你把问题发布在一个在线论坛上。此外,对于给个人发送邮件或把问题群发到邮件列表的情况,下面列出的建议同样适用。

如果你在线下找人求助,问他“我可以问你一个问题吗”不失为一个快速确认他是否有空的方式。但在互联网论坛上,帮助你的人可能要等到有空时才会回复。既然可能要在几小时后才能得到回复,你最好第一次发帖时就写上所有可能需要的信息。如果没能得到回复,那么可以把问题复制到别的论坛再发一次。

在阐述问题时,你会下意识地认为别人听得懂你在说什么,但编程是一个非常宽泛的领域,别人有可能在你所遇到的问题的具体领域中缺乏经验,所以用实际问题的形式陈述问题是很有必要的。虽然以“我想要……”或者“这个代码不行啊”开头的句子也可以含糊地说明你的问题,但请务必包含明确的问题,也就是以问号结尾的问句,否则可能无法清楚地表达自己的意图。

在JavaScript论坛上问Python问题,或者在网络安全邮件组问算法问题很可能让你白忙一场。通常情况下,邮件组和互联网论坛有常见问题列表(FAQ)文档或者描述页面,来说明哪些主题适合在该站点进行讨论。例如,python-dev邮件组是关于Python语言设计特性的,而不是寻求常规Python帮助的邮件组。如果不确定你的问题该到哪里提问,可以参考Python官网的Help页面。

在互联网论坛发求助帖的好处在于可供其他遇到相同问题的程序员搜索。确保问题的标题具备概述性,这样可以让搜索引擎更容易收录。像“帮帮忙”或者“怎么不行啊”这种普通的标题就太模糊了。通过邮件提问时,一个有意义的主题也会让帮忙者扫一眼就知道问题是什么。

“为什么我的程序不能工作”,这个问句忽略了关键细节——你希望程序做什么。对帮助你的人而言,这并不总是显而易见的,因为他们不清楚你的目的。哪怕你的问题是“我为什么会得到这个错误”,都更能让人明白你的最终目的。在某些情况下,帮忙者可能会告诉你是否需要另辟蹊径,或者应该放弃这个问题,而不是在这个问题上浪费时间。

务必复制并粘贴包括回溯信息在内的所有错误信息。如果只是描述你的错误,比如“我遇到了一个越界错误”,并不能提供足够的细节让帮忙者找到错误原因。同时,你需要说明这个错误是经常出现的,还是偶然出现的。如果确定了错误发生的具体情境,也要一并告之。

除了完整的错误信息和回溯信息,也要提供程序的完整源代码,以便帮忙者在自己的计算机上运行你的程序,并通过调试工具检查到底出了什么问题。务必提供一个最小、完整、可复现(简写为MCR,是minimum、complete、reproducible三个单词的首字母)的样例,保证它能复现你遇到的错误。MCR这个术语来自于技术问答社区Stack Overflow,你可以在那里找到关于MCR的详细说明。“最小”意味着样例在能复现错误的前提下尽可能简短;“完整”意味着样例包含复现问题需要的一切元素;“可复现”意味着样例能够可靠地复现你描述的问题。

如果是单文件程序,在确保格式正确的前提下(这一点会在下一节讨论),直接发给帮忙者即可。

Stack Overflow和归档答案

Stack Overflow是一个流行的编程问答网站,很多新人刚使用它时会感觉沮丧甚至恐惧。Stack Overflow的版主常常会无情地关闭不符合其严格规定的问题。但如此严格的管理也不无道理。

Stack Overflow的目的不是解答问题,而是将编程问题和对应答案归档。所以,Stack Overflow希望问题是具体、独特的,而非基于个人观点的。为了让使用搜索引擎的用户容易找到,问题需要有详细的说明。知名的XKCD漫画“Wisdom of the Ancients”(古人的智慧)的创作灵感就是来源于Stack Overflow出现之前的编程世界。几十个同质化问题不仅会让回答问题的专家志愿者重复劳动,也会让搜索的人对多个结果感到困惑。问题应该有客观、具体的答案,而“什么是最好的编程语言”则是见仁见智的,会引起不必要的争执。(当然,众所周知,Python才是最好的语言。)

当你寻求帮助时,问题却被迅速关闭,这不免会令人觉得尴尬和难过。我的建议是,首先仔细阅读本章和Stack Overflow的“How do I ask a good question?”指引;其次,如果害怕提出愚蠢的问题,随便起个假名就好。Stack Overflow并不要求用户使用真实姓名。如果你希望提问时不用那么严肃紧张,可以考虑把问题发布到Reddit的Python相关页面上,那里对问题的容忍度要高一些。不过在提交问题之前,还是务必先阅读那里的发帖指引。

分享代码的目的是让帮忙者可以运行代码并重现错误。他们不是只要拿到代码就行,而是希望代码经过了良好的格式化。请确保让帮忙者能够容易地复制代码并照此运行。如果要在邮件中粘贴源代码,请注意很多邮件客户端可能会删除缩进符,导致代码看起来像是这样:

def knuts(self, value):
if not isinstance(value, int) or value < 0:
raise WizCoinException('knuts attr must be a positive int')
self._knuts = value

帮忙者不仅要浪费很多时间为每一行重新插入缩进符,而且也不清楚每行的缩进位置是否正确。为了确保你的代码格式正确,请把代码复制并粘贴到“剪切板”网站2,比如Pastebin和GitHub Gist。它们可以将你的代码存储为简短的公共链接,分享这个链接比使用文件附件更容易。

2 这类网站的英文叫作pastebin,源于第一个此类网站的名字。——译者注

如果你要把代码发布到网站上,确保使用网站的文本框所提供的格式化功能。通常使用4个空格缩进可以确保这行使用更易阅读的等宽代码字体3。除此之外,使用反引号将文本包裹起来也有同样的效果。这类网站通常会提供一个讲解如何进行格式化的页面。不利用这些技巧可能会破坏你的代码格式,代码会全部挤在一行,就像下面这样:

3 字符宽度相同的字体。——译者注

def knuts(self, value):if not isinstance(value, int) or value < 0:raise
WizCoinException('knuts attr must be a positive int') self._knuts = value

此外,不要通过发送截图或者对着屏幕拍摄的照片来分享代码。没人能从图片中复制代码,而且图片中的代码也经常难以辨认。

发布问题时,告诉帮忙者你已经尝试了哪些方法以及结果,以免让他浪费时间重试。同时,这样做也能表明你不是“伸手党”,而是已经做了努力。

此外,这些信息可以确保你是在寻求帮助,而不是直接要求别人帮你写程序。遗憾的是,常常有计算机科学专业的学生要求网上的陌生人帮他们做作业,或是创业者要求别人为他们免费创建一个“简单的App”。编程求助论坛可不是为了这种目的设立的。

计算机的具体设置可能会对程序运行和错误的产生有影响。为了确保帮助你的人能够在他们的计算机上重现问题,请提供你所用计算机的以下信息。

·操作系统和版本,如“Windows 10专业版”或者“macOS Catalina”。

·运行程序的Python版本,如“Python 3.7”或者“Python 3.6.6”。

·程序使用的所有第三方模块及其版本,如“Django 2.1.1”。

可以通过运行pip list来查看已安装的第三方模块的版本。通常,也可以通过模块的__version__属性查看。以下是一个交互式shell示例:

>>> import django
>>> django.__version__
'2.1.1'

这些信息很可能并无必要,但为了减少反复沟通,务必在最初的帖子中就提供这些信息。