前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码写了这么多年,还不知道该怎么提问?

代码写了这么多年,还不知道该怎么提问?

作者头像
公号:咻咻ing
发布2021-01-04 15:02:57
6620
发布2021-01-04 15:02:57
举报
文章被收录于专栏:公众号:咻咻ing公众号:咻咻ing

戳蓝字“咻咻ing”关注我哦!

作为一个程序猿,每天面对着我们的代码,总会遇到各种各样的问题。在像别人求助时,你是否遇到过:

  1. 别人总是get不到自己的问题点,或者别人不知道该怎么帮忙解决?
  2. 在GitHub开源项目中提的issue没人回答,或者莫名的问题被关闭了?
  3. 在各大程序猿论坛提问都石沉大海,或者回答的驴头不对马嘴?

本文就来讲讲如何对代码问题进行正确的提问,希望能帮助到你。

SSCCE原则

SSCCE是英文Short, Self Contained, Correct (Compilable), Example的单词首字母缩写,含义是:对问题的描述要言简意赅(short)自足(self-contained)确切(correct)的例子(example)

  • Short:最小化问题代码,把代码精简到只包含问题本身。
  • Self Contained:确保已经包含了所有的前置条件或者代码输入。
  • Correct:通过简单操作即可正确编译和运行。
  • Example:具有能够展示问题的示例。

言简意赅

在公共论坛比如stackoverflow或者google上面,如果你提问的问题代码有100行,那基本上很少有用户会认真看。如果超过了200行,已经没有用户会回答你的问题了。所以,你的提问代码要聚焦本身,去除任何多余的代码。

代码精简技巧

对于页面程序来说,如果页面上有40个按钮与问题毫无关系,则直接删掉它们。如果你删除它们,问题消失了,那就找到跟问题相关的那个按钮留下来,其他的都删除,只保留跟问题有关的按钮。

如果引起问题的是数组或着对象,每个对象可能有一百个字段,同样的,如果通过两个或三个字段就可以复现问题,那就仅保留这几个字段。

如果是页面布局问题,则删除所有的代码逻辑(如:JavaScript / Java方法等)。但是,如果是后端逻辑问题,又需要页面操作,那就把页面删除到最精简的版本。

为了让别人协助解决问题,你需要删除大量的代码。也许在你删除代码的过程中,问题就自己解决了。

定位问题

如果你能清楚的确定问题出在哪里的时候,你已经迈出了解决问题的重要一步。定位问题的过程本身就可以帮助解决问题。你可能会更仔细地查看每段代码的实现,重新梳理逻辑,反复确认,然后找出问题所在。

即使你找不到问题的原因,你仍然迈出了重要的一步:至少确定了问题相关的代码。

如果要精简的代码已经是问题的简要示例,则可以去请教别人了。如果不是,则要继续精简代码,并且能够包含和复现问题。

自足

重要的是要确保提供给别人的代码,通过复制,粘贴就可以成功编译和运行,这样别人才能快速的帮助解决问题,而不用花费大量的时间来调试代码。

这意味别人在复制,粘贴代码之后,可以自己运行和调试代码。别人可以根据示例来复现问题。

只有这样,别人才可能帮助你,试想,如果别人连问题都复现不了,该怎么帮助你呢?

如何编写前置条件

如果代码有对文件的IO操作,但问题却与输入/输出无关,则直接在代码中定义数据结构替换从文件IO中读取。

如果是文本类输入问题,请准备一个简短的示例,可以使用实际出现问题的文本。

如果该问题仅在负载下发生,请插入代码模拟该负载。

如果是仅在特定情况下发生的页面问题,请尽可能直接用代码复现问题,减少别人的操作。

但是,总有些问题无法在公开的论坛中包含示例,例如“数据库连接”等,但是很多时候,你只需要一些横向思考,即可找到替换你觉得无法替换的问题方法。

横向思考的一个例子是“图片”,代码的问题是跟读取本地图片有关,这似乎比较复杂。但一种技巧是使用网络上有链接的图片,该图片同样可以复现问题。这样就可以直接使用图片的链接,而不用上传图片资源。

正确

❝如果我能正确运行,那我为啥还要提问呢? ❞

这里的正确不单单是代码可以正确编译和运行的意思。正确(或可编译,尤其是与计算机源代码相关)是指确保代码示例符合公认的标准和协议。

为此,有必要:

  • 将示例代码中的行宽保持在62个字符以内。(但是不要删除行缩进!)代码阅读器通常大约72个字符就强制换行。有时候换行不会对示例代码造成任何问题,但大多数时候会造成问题,这意味着在按预期方式工作之前,必须重新合并或重建这些行。大多数代码/源代码编辑器将在编辑区域的顶部显示一列宽度。
  • 遵循命名约定。愿意提供帮助的大多数人都可以使用大小写字母以及代码注释的提示来理解代码,以期迅速发现问题。如果遵循这个约定,它将帮助他们做到这一点。
  • 确保示例代码正确。该示例代码可以直接编译运行,并且复现问题日志,以帮助解决需要解决的问题。

其他提示:

  • 将所有资源(CSS / JS / Java源代码,图片等)移动到同一目录下,以便于管理和查找。
  • 删除Java代码中的包依赖。
  • 将Java中的Public类降级为默认类。如果该代码在每个源代码文件中仅指定一个Public类,则将所有其他类降级为默认类。这样就可以在一个文件中包含所有类,而不用拆分多个代码文件。
  • 验证示例,一定要验证提供的示例代码是否正确。

示例

确保提问的代码可以复现问题!

你已经用该示例代码自测了几个小时,甚至几天。或者更长时间。

现在休息一下,站起来,运动运动或着散散步。

重启下编译器,或者重启下电脑。

现在打开出现问题的页面或程序,问题还在吗?

通常情况下,重启电脑可以解决99%的问题。

现在,如果问题仍然存在,请发布问题和代码示例。

互联网标准

当处理与互联网有关的大多数事情时,其中存在另一个“问题”。互联网以及与之相关的大多数事情都有些复杂。对于每个标准,都有两个替代项。对于每个规则,该规则至少有三个例外。

首先,浏览器不能正常展示的问题。我们不仅指的是IE和Netscape或旧的和新的浏览器之间的差异,例如,Macintosh的“ Internet Explorer 5”与Windows的“ Internet Explorer 5”显然是不同的浏览器。

Web开发的人们通常会惊讶地发现,他们在开发网页时遇到的问题而其他使用不同浏览器的人确没有这个问题。

所以,在代码提问时,还要尽可能详细的说明所使用的环境:

代码语言:javascript
复制
a. Linux 还是 Windows 或者 Mac

b. Linux 发行版。不要光说 Ubuntu,谁知道你用的是 12.04 还是 14.04?

c. x86 还是 ARM

d. 32-bit 还是 64-bit

e. 编译器版本,是系统自带还是自己编译安装

为什么要这样做?

就一个代码提问,为什么要做这么多的事情?

也许有人可以从你提供的描述中了解你的问题。但是可能是1000个人里面才有一个人能懂。

你确定已经在Google上搜索过这个问题,看过很多问题解答,看过API文档了吗?

如果浪费其他用户的时间,你可能会被论坛里的人指责。

论坛里面的人提了很多的建议。有的建议有用,有的没用,但是无论哪种,建议都是免费的。

回答者之所以这样做有多种原因,其中包括当他们可以将与所选领域相关的知识传授给正在学习的人时会感到愉悦。

不幸的是,如果有人要求提供基本教程中包含的信息,那么这很有力地表明,提问者并不想让别人去做他们应该自己做的工作,而是要学习。

如果有一段代码,而你希望由他人编写,完成或修复,则有很多方法可以实现。你只需花很少的钱,就可以通过许多基于Internet的外包公司完成(或完成)大多数IT工作。这正是这类公司的专长。

免费的论坛是供人们学习的。

话说回来:

假设你确实是真正的学习者,你维护了一个庞大而复杂的系统,并且偶尔会有无法预知的错误,并且你已经搜索了FAQ&Group,研究了手册或文档,但还没有找到问题的答案。

随时向论坛提问,也许这是一个你觉得能很快解决问题的误解。

最后

「并不是说每个问题都必须遵循SSCCE原则才能解决,也不是每个问题必须、强制有例子。」

但是,这将使人们更有可能提供帮助,因此将提升找到解决方案的机会。

觉得有帮助,欢迎长按扫码关注,一起成长

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咻咻ing 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSCCE原则
  • 言简意赅
    • 代码精简技巧
      • 定位问题
      • 自足
        • 如何编写前置条件
        • 正确
        • 示例
        • 互联网标准
        • 为什么要这样做?
        • 最后
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档