如何提技术问题?

我在做什么?

你想要最终达成什么(目标)?你采用了什么样的路径来达成它(途径)?

Tip

有可能你的目标是不现实的,或者是假想出来的替代目标,换一个目标同样能解决你的困难,但是解决起来容易很多。也可能你的路径是有错误的。

例子:我希望调用接口 A 来加载目录 B 下的所有图片,供程序的其他组件使用。

预期结果

按照你的理解,你觉得代码或者软件配置应该引发什么行为?

例子:调用接口从目录下加载得到的图片数量和目录下的真实图片数量相等,有 14 张图片就应该得到 1 个长度为 14 的图片数据的向量。

实际结果

……(描述了预期结果,)但是实际结果是什么?你应该尽可能详细地说明情况,有图配文字是比较好的。

不要用预期结果的反面来描述实际结果,或者用实际结果的反面来描述预期结果。如果两者可以用反面描述的方式相互补充地话,那么就没有同时回答这两个问题的必要了。

Tip

反面描述比正面描述更加含糊,不利于被提问者理解问题。尤其是图片或日志文件中出现大量字符串时,按照反面排除的方法很难让被提问者找到出问题的字符串。即便图片中有划线、墨迹和画圈的标注信息,如果不明确描述,被提问者仍然可能错误理解标注的含义。

指代要明确。比如:计算结果为 1,是什么的计算结果为 1?如果有表达式的话,应该指出是第几张图中,第几行的表达式,其代码字符串为 g(f(expr), magic_number))。如果在循环中,要指出是在第几次迭代的时候出现了问题。

Note

不要说“如图,……”!图上的信息太多了,让人难以抓住重点。检查描述是否完整的方法之一是验证被提问者看不到图片时是否能理解问题。

例子:给接口传入一个放置了 14 张图片的目录,但是返回的向量长度只有 1(不要说返回的长度不为 14)。(提供相关图片。)

你凭什么认为实际的结果和你的描述相符?

你是怎么检查出实际结果的?你是怎么写调试代码的(如何打印或者显示)?此问题有没有稳定的复现方式?

信息要给全,不要用提问者的思路去帮被提问者过滤“你认为不重要”的信息。

例子:(提供相关图片和代码文件。)我在 xx 位置循环打印了 data.Adata.B 的值,从命令行输出中可以看出来每一行的输出分别是 data.Adata.Bdata.A 就是接口返回向量的长度,始终为 1。

我如何解释这个现象

这一节应该非常简要,甚至可以略过。不要把这一节变成提问的重点,更不要把提问变成甩锅和推卸责任(之后会演变为争吵)。

例子:我认为返回的向量长度为 1 是只读取到了 1 张图片数据,是接口的实现有错误。

被提问者的可能解释

例子:返回的向量长度表示张量的数目,并不是图片的数量。图片按照 NCHW 格式加载,第 0 个张量已经包含了所有图片的信息,它的第 0 维宽度为 14,刚好对应了文件夹下所有图片的数量。