当前位置: 首页 > 科技观察

程序员如何提出好问题

时间:2023-03-20 18:49:28 科技观察

提出好的问题是编写软件时非常重要的技能。多年来,我在这方面取得了一些成功。以下是我使用并发现很棒的一些指南!起初,我实际上一直坚信要问愚蠢或“糟糕”的问题。我一直在问人们一些愚蠢的问题,这些问题完全是用谷歌搜索或搜索代码库来解决的。大多数时候我不想自己去寻找,但有时我还是自己去寻找,并不觉得它像世界末日那么可怕。所以本文列出的策略并不是“提问前你必须做的一切”,而是“帮助你提出更好的问题并得到我想要的答案的几个要点!”。什么是好问题?我们的目标是提出有关技术概念的易于回答的问题。有时,我会遇到一些知识渊博的人,他们是我想了解的人,但他们并不总是知道如何以最好的方式解释它。有一套好的问题可以帮助回答者有效地向我解释他们所知道的,并引导他们告诉我什么是我感兴趣的。那么我们该怎么做呢?说出你知道的这是我最喜欢的提问技巧之一!问题格式基本上是这样的:陈述到目前为止你对这个话题的理解问“是这样吗?”例如,我最近正在和某人(一个很好的问题提问者)谈论网络!他们说“所以,我的理解是存在某种递归dns服务器链……”。这不是真的!实际上没有DNS服务器的递归链。(当你谈论递归DNS服务器时,只涉及一个递归服务器。)因此他们陈述了他们目前的理解,因此我们可以阐明它实际上是如何工作的。我对rkt很感兴趣,但是我不明白为什么rkt在运行容器时比Docker占用更多的磁盘空间。虽然“为什么rkt使用的磁盘空间比Docker多”似乎不是一个正确的问题——我很清楚代码是如何工作的,但我不明白他们为什么那样写。所以我向rkt-dev邮件列表写了这个问题:WhydoesrktstorecontainerimagesdifferentlythanDocker?我:写下我对rkt和Docker如何将容器存储在磁盘上的理解,以及我认为它们可能按照他们的方式设计的几个原因问“我的理解正确吗?”我得到的答案超级超级有帮助,正是我想要的。我花了很长时间以一种我满意的方式来表述这个问题,我很高兴我花时间因为它让我更好地理解了。澄清你的理解并不容易(思考你所知道的并澄清你的想法需要时间),但它可以非常有效,让你要帮助的人更容易想出一个具体的答案。问问题的答案是事实我有很多问题一开始有点模糊,比如“连接查询JOIN如何在SQL中工作?”。这不是一个很好的问题,因为连接查询的工作方式有很多不同的部分!那么对方怎么知道我有兴趣学什么呢?我喜欢问那种答案是直截了当的事实的问题。例如,在SQL连接查询示例中,一些事实性问题的答案可能是:连接大小为N和M的两个表的时间复杂度是多少?是O(NM)吗?或者O(NlogN)+O(MlogM)?MySQL是否总是在执行连接查询之前首先对连接列进行排序?我知道Hadoop有时会执行“散列连接”——这是其他数据库引擎也使用的连接策略吗?当我在索引列和非索引列之间进行连接时,是否需要对非索引列进行排序?当我问这样超级具体的问题时,被问者并不总是知道答案,但至少他们明白我感兴趣的问题是什么样的——显然我不想知道如何使用连接查询,我只是想了解一些实现细节和算法。对你不明白的事情诚实很多时候,当有人向我解释一些事情时,他们说了一些我不明白的话。例如,也许有人正在向我解释一些关于数据库的事情并说“好吧,我们使用MySQL的乐观锁定,所以......”。等等,我不知道什么是“乐观锁定”。所以这就引出了问题!:)阻止某人继续并询问“嘿,那是什么意思?”是一项超级重要的技能。我认为这是一个自信的工程师的特质之一,开发它是非常有益的。我看到很多高级工程师经常要求澄清他或她不明白的地方——我认为当你对自己的技能更有信心时,事情会更容易。我越这样做,当我要求别人澄清时感觉就越自然。事实上,如果有人在我解释时不要求澄清,我更担心他们没有真正在听!这也为答题者在超出其知识范围时提供了承认的余地!很多时候,当我问别人一个问题时,如果我问的是他们不知道的事情。我问的人通常很擅长说“不,我不知道!”识别您不理解的术语当我开始目前的工??作时,我首先去了数据团队。当我看我的新工作需要什么时,有这些要求!Hadoop、Scalding、Hive、Impala、HDFS、zoolander等。我以前可能听说过Hadoop,但我基本上对这些词的含义一头雾水。其中一些是内部项目,一些是开源项目。因此,我首先寻求帮助以了解每个术语的含义以及它们之间的关系。我可能会问的一些问题是:HDFS是数据库吗?(不是,是分布式文件系统)Scalding用的是Hadoop吗?(是的)Hive是否使用Scalding?(不)我实际上编了一本所有术语的“词典”,因为有这么多术语并且理解它们意味着真正帮助我定位自己以便以后提出更好的问题。做一些研究当我输入上面的SQL问题时,我在Google搜索框中输入了“如何实现SQL连接”。我点击了一些链接,看到了类似“哦,我明白了,有时是排序,有时是散列连接,我以前听说过”之类的内容,然后写下了我遇到的一个更具体的问题。先用谷歌搜索帮助我写出更好的问题!也就是说,我认为人们有时对“没有谷歌搜索就不要问问题”的原则过于苛刻-有时当我和某人共进午餐并且我对他们的工作感到好奇时,我只是相关的基本问题会被问到。这是完全正常的!但是做研究是非常有用的,做足够的研究来提出一堆很棒的问题真的很有趣。决定向谁提问在这里我主要是在谈论向你的同事提问,因为这是我大部分时间求助于他们的地方。我在询问同事时想到的一些问题是:现在是提问的好时机吗?(如果他们忙于处理紧迫的事情,那么可能不是一个好时机)通过询问他们需要多长时间回答问题是否可以节省我尽可能多的时间?(如果我问一个问题,他们需要5分钟来回答,这将为我节省2个小时,太棒了:D)他们需要多少时间来回答我的问题?如果我有一个半小时的问题,那么我可能会安排在以后的时间,如果我只是有一个快速的问题,那么我很有可能现在就问。这个人对这个问题来说太先进了吗?我认为向最有经验/知识渊博的人提出每个问题是一个容易陷入的陷阱,而且每个问题都针对不同的主题。但其实还是找知识稍微少一点的人比较好——通常他们可以回答大部分问题,分散负担,还可以展示自己的知识(笑)。我并不总是把这些事情做好,但它确实帮助我思考它们。另外,我通常会多问离问题较近的人——我几乎每天都与之交谈的人,而且我一般更倾向于提问,因为他们更了解我的工作背景,所以给我一个有用的回答。《How to ask questions the smart way by ESR》是一个受欢迎且充满敌意的文件(它的开场白很糟糕,就像“我们称这样的人为‘失败者’”)。关于如何在互联网上向陌生人提问的内容。在互联网上向陌生人提问是一项超级有用的技能,可以让你获得真正有用??的信息,但它也是一种“困难模式”问题。由于与您交谈的人对您的情况知之甚少,因此最好更仔细地说明您到底想知道什么。我不是ESR文档的粉丝,但它确实说明了一些有用的内容。这篇文章的“如何以有用的方式回答问题”部分非常好。提问以揭示不明显的内容一种更高级的提问形式是提问以揭示隐藏的假设或知识。这种问题其实有两个目的——***,得到答案(可能是这个人知道别人不知道的信息),同时也指出这里有一些隐藏的信息,对分享它。Etsy的“DebriefingFacilitationGuide”中的“TheArtofAskingQuestions”部分在讨论发生的事情的背景下是一个很好的介绍。以下是从该指南中摘录的几个问题:“当您怀疑出现此类故障时,您会寻找什么?”“你怎么知道这是‘正常’的?”你怎么知道数据库崩溃了?你怎么知道那是你需要传呼的团队?像这样的问题(看起来很基本,但实际上并不明显)在被权威人士问到时特别有力量。我特别希望看到经理/高级工程师提出一些基本但重要的问题,比如“你怎么知道数据库崩溃了?”因为它为不太先进的人创造了空间,让他们以后再问同样的问题。回答问题我非常感谢AndréArko的“如何为开源做出贡献”的一部分现在您已经阅读了所有要点并提出了拉取请求,开始查看您可以回答的问题。如果这个问题以前已经回答过,或者你刚刚阅读的文档可以回答它,那么你很快就会发现这一点。回答您知道如何回答的问题。如果您正在攀登一个新项目,回答正在学习您刚刚完成的项目的人的问题可能是巩固您的知识的好方法。每当我第一次回答一个新话题的问题时,我总是有一种“天哪,如果我答错了怎么办,天哪”的感觉。但通常我都能正确回答他们的问题,然后我感觉很棒,好像我更理解这个话题了!问题也是巨大的贡献好的问题可以为社区做出巨大的贡献!我回答了一些关于CDN的问题,并在CDNsarenotjustforcaching上写下了答案。很多人告诉我他们真的很喜欢这篇博文,我认为提出这些问题帮助了很多人,而不仅仅是我自己。很多人说他们喜欢回答问题!我认为,重要的是要将好问题视为你可以做的一件了不起的事情,并将其带入对话,而不是仅仅想“提出好问题,这样人们只会有点恼火,而不是非常恼火”。