Glean 拾遗
日刊 /2026-09-16 / 提问的技术:先说清你已知什么,再问可回答的事实

提问的技术:先说清你已知什么,再问可回答的事实

原文 jvns.ca 收录 2026-09-16 06:00 阅读 13 min
AI 解读

Julia Evans 认为提问是一项可以练出来的工程技能,并把方法拆成可操作的几步:先陈述自己对主题的现有理解,再问『这样对吗』;把『SQL join 怎么工作』这类宽泛问题改写成答案明确的事实问题(例如 join N 与 M 两张表的时间复杂度是 O(NM) 还是 O(NlogN)+O(MlogM),MySQL 是否先排序 join 列)。她给出的实例包括:在 rkt-dev mailing list 上先写清 rkt 与 Docker 在磁盘上存容器镜像的差异,再问为什么这样设计;入职数据团队时给 Hadoop、Scalding、Hive、Impala、HDFS 等术语建了一份词典。文中还讨论了如何选人提问(对方答一题 5 分钟、能省自己 2 小时才划算;不必事事找最资深的人)以及提问者与回答者共同承担的责任。作者明确表示问『笨问题』无妨,也批评 ESR《提问的智慧》把全部成本压给提问者。适合正在 ramp-up 的一线工程师与需要跨团队取信息的人。

原文 13 分钟
原文 jvns.ca ↗
§ 1

Asking good questions is a super important skill when writing software. I’ve gotten way better at it over the years (to the extent that it’s something my coworkers comment on a lot). Here are a few guidelines that have worked well for me!

写软件时,会问好问题是极其重要的能力。 这些年我在这方面进步很多(以至于同事经常提起)。下面是一些对我很有效的准则!

§ 2

§ 3

I’m actually kind of a big believer in asking dumb questions or questions that aren’t “good”. I ask people kind of dumb questions all the time, questions that I could have answered with Google or by searching our codebase. I mostly try not to, but sometimes I do it anyway and I don’t think it’s the end of the world.

So this list of strategies isn’t about “here are all the things you have to do before asking a question, otherwise you are a bad person and should feel bad, but rather “here are some things that have helped me ask better questions and get the answers I want!”.

If someone is refusing to answer your questions unless they’re “good”, I wrote a different blog post for them to read: How to answer questions in a helpful way

其实我很赞成问一些蠢问题,或者算不上“好”的问题。我经常问别人有点蠢的问题,那些我本可以用 Google 或搜代码库找到答案的问题。我大多尽量不问,但有时还是会问,我觉得这也没什么大不了。

所以这份策略清单不是说“问问题之前你必须做完所有这些事,否则你就是个糟糕的人,应该感到愧疚”,而是说“这些方法帮我问出更好的问题,并得到我想要的答案!”

如果有人非等你问出“好”问题才肯回答,我另写了一篇博文给他们看: 《如何以有帮助的方式回答问题》

§ 4

Our goal is going to be to ask questions about technical concepts that are easy to answer. I often have somebody with me who has a bunch of knowledge that I’d like to know too, but they don’t always know exactly how to explain it to me in the best way.

If I ask a good series of questions, then I can help the person explain what they know to me efficiently and guide them to telling me the stuff I’m interested in knowing. So let’s talk about how to do that!

我们的目标是:针对技术概念提出容易回答的问题。我常常会遇到这样一个人,他有很多我也想知道的知识,但他不一定清楚怎样用最好的方式讲给我听。

如果我能问出一连串好问题,就能帮这个人高效地把他知道的东西讲给我,并引导他讲出我真正感兴趣的内容。下面就来谈谈怎么做!

§ 5

This is one of my favorite question-asking techniques! This kind of question basically takes the form

State what you understand about the subject so far

Ask “is that right?”

For example, I was talking to someone (a really excellent question asker) about networking recently! They stated “so, what I understand here is that there’s some chain of recursive dns servers…”. That was not correct! There is actually no chain of recursive DNS servers. (when you talk to a recursive DNS server there is only 1 recursive server involved) So them saying their understanding so far made it easy for us to clarify how it actually works.

这是我最喜欢的提问技巧之一!这类问题基本长这样:

先说出你目前对主题的理解

再问“这样对吗?”

比如,最近我和一个人(他特别会提问)聊网络。他说:“我理解这里有一串递归 DNS 服务器……”这并不对!实际上并不存在一串递归 DNS 服务器。(你和一个递归 DNS 服务器通信时,只涉及 1 台递归服务器。)他把自己的理解说出来,反而让我们很容易澄清真实情况是怎样的。

§ 6

I was interested in rkt a while back, and I didn’t understand why rkt took up so much more disk space than Docker when running containers.

“Why does rkt use more disk space than Docker” didn’t feel like the right question though – I understood more or less how the code worked, but I didn’t understand why they wrote the code that way. So I wrote this question to the rkt-dev mailing list: Why does rkt store container images differently from Docker?.

I

wrote down my understanding of how both rkt and Docker store containers on disk

came up with a few reasons I thought they might have designed it the way they did

and just asked “is my understanding right?”

The answer I got was super super helpful, exactly what I was looking for. It took me quite a while to formulate the question in a way that I was happy with, and I’m happy I took the time because it made me understand what was happening a lot better.

前一阵子我对 rkt 感兴趣,不明白为什么运行容器时 rkt 占用的磁盘空间比 Docker 多那么多。

但“为什么 rkt 比 Docker 占更多磁盘空间”感觉并不是一个对的问题——我大致理解代码是怎么工作的,但不理解他们为什么要把代码写成那样。于是我给 rkt-dev 邮件列表写了这个问题: 《为什么 rkt 存储容器镜像的方式和 Docker 不同?》

写下了自己对 rkt 和 Docker 在磁盘上如何存储容器的理解

列出我认为他们可能这样设计的几个原因

然后直接问“我的理解对吗?”

我得到的回答超级有帮助,正是我想找的。我花了挺久才把问题组织成让我满意的形式,但我很高兴花了这个时间,因为它让我更清楚地理解了到底发生了什么。

§ 7

Stating your understanding is not at all easy (it takes time to think about what you know and clarify your thoughts!!) but it works really well and it makes it a lot easier for the person you’re asking to help you.

说清自己的理解一点儿也不容易(需要花时间想清楚自己知道什么、理清思路!!),但它非常有效,也能让被你问的人更容易帮到你。

§ 8

A lot of the questions I have start out kind of vague, like “How do SQL joins work?”. That question isn’t awesome, because there are a lot of different parts of how joins work! How is the person even supposed to know what I’m interested in learning?

I like to ask questions where the answer is a straightforward fact. For example, in our SQL joins example, some questions with facts for answers might be:

What’s the time complexity of joining two tables of size N and M? Is it O(NM)? O(NlogN) + O(MlogM)?

Does MySQL always sort the join columns as a first step before doing the join?

I know that Hadoop sometimes does a “hash join” – is that a joining strategy that other database engines use too?

When I do a join between one indexed column and one unindexed column, do I need to sort the unindexed column?

When I ask super specific questions like this, the person I’m asking doesn’t always know the answer (which is fine!!) but at least they understand the kind of question I’m interested in – like, I’m obviously not interested in knowing how to use a join, I want to understand something about the implementation details and the algorithms.

我很多问题一开始都挺模糊,比如“SQL join 是怎么工作的?”。这个问题不太好,因为 join 的工作方式涉及很多不同部分!对方怎么知道我想了解哪一块?

我喜欢问答案是一个明确事实的问题。比如在 SQL join 这个例子里,一些以事实为答案的问题可以是:

连接两个大小分别为 N 和 M 的表,时间复杂度是多少?是 O(NM)?还是 O(NlogN) + O(MlogM)?

MySQL 在执行 join 前,是否总是先对 join 列排序?

我知道 Hadoop 有时会做“hash join”——其他数据库引擎也用这种连接策略吗?

当一个索引列和一个非索引列做 join 时,我需要先对非索引列排序吗?

当我问这种非常具体的问题时,对方不一定知道答案(这完全没关系!!),但至少他们明白我关心的是哪类问题——显然我不是想知道怎么用 join,而是想理解实现细节和算法。

§ 9

Often when someone is explaining something to me, they’ll say something that I don’t understand. For example, someone might be explaining something about databases to me and say “well, we use optimistic locking with MySQL, and so…”. I have no idea what “optimistic locking” is. So that would be a good time to ask! :)

Being able to stop someone and say “hey, what does that mean?” is a super important skill. I think of it as being one of the properties of a confident engineer and an awesome thing to grow into. I see a lot of senior engineers who frequently ask for clarifications – I think when you’re more confident in your skills, this gets easier.

The more I do this, the more comfortable I feel asking someone to clarify. in fact, if someone doesn’t ask me for clarifications when I’m explaining something, I worry that they’re not really listening!

This also creates space for the question answerer to admit when they’ve reached the end of their knowledge! Very frequently when I’m asking someone questions, I’ll ask something that they don’t know. People I ask are usually really good at saying “nope, I don’t know that!”

别人给我解释事情时,常常会说到我听不懂的内容。比如有人给我讲数据库,说“我们用 MySQL 做乐观锁,所以……”。我根本不知道“乐观锁”是什么。这就是提问的好时机! :)

能打断别人并问一句“这是什么意思?”是极其重要的能力。我认为这是自信工程师的特征之一,也是很值得成长的方向。我看到很多资深工程师经常要求澄清——我觉得当你对自己的技能更有信心时,这件事会变得更容易。

我做得越多,就越能自在地请别人解释清楚。事实上,如果我给别人讲解时对方从不要求澄清,我会担心他其实没有认真听!

这也能给回答问题的人留出空间,让他们承认自己知识的边界!我向别人提问时,经常会问到他们不知道的东西。我提问的人通常都很擅长说“不,这个我不知道!”

§ 10

When I started at my current job, I started on the data team. When I started looking at what my new job entailed, there were all these words! Hadoop, Scalding, Hive, Impala, HDFS, zoolander, and more. I had maybe heard of Hadoop before but I didn’t know what basically any of these words meant. Some of the words were internal projects, some of them were open source projects. So I started just by asking people to help me understand what each of the terms meant and the relationships between them. Some kinds of questions I might have asked:

Is HDFS a database? (no, it’s a distributed file system)

Does Scalding use Hadoop? (yes)

Does Hive use Scalding? (no)

I actually wrote a ‘dictionary’ of all the terms because there were so many of them, and understanding what all the terms meant really helped me orient myself and ask better questions later on.

我刚入职现在的公司时,在数据团队。刚开始了解新工作要做什么时,满眼都是词!Hadoop、Scalding、Hive、Impala、HDFS、zoolander 等等。Hadoop 我可能以前听过,但基本上这些词我都不懂。有些是内部项目,有些是开源项目。于是我从请别人帮我理解每个术语的含义、以及它们之间的关系开始。我可能会问这类问题:

HDFS 是数据库吗?(不是,它是分布式文件系统)

Scalding 使用 Hadoop 吗?(是)

Hive 使用 Scalding 吗?(否)

我其实还写了一份所有术语的“词典”,因为术语太多了;理解这些词的含义帮我理清了方向,也让我之后能问出更好的问题。

§ 11

When I was typing up those SQL questions above, I typed “how are sql joins implemented” into Google. I clicked some links, saw “oh, I see, sometimes there is sorting, sometimes there are hash joins, I’ve heard about those”, and then wrote down some more specific questions I had. Googling a little first helped me write slightly better questions!

That said, I think people sometimes harp too much on “never ask a question without Googling it first” – sometimes I’ll be at lunch with someone and I’ll be curious about their work, and I’ll ask them some kind of basic questions about it. This is totally fine!

But doing research is really useful, and it’s actually really fun to be able to do enough research to come up with a set of awesome questions.

我在整理上面那些 SQL 问题时,在 Google 里输入了“how are sql joins implemented”。点开几个链接,看到“哦,原来有时会排序,有时会用 hash join,我听说过这些”,然后写下更多具体问题。先搜一下,帮我问出了稍微更好的问题!

话虽如此,我觉得人们有时太强调“没 Google 过就别提问”——有时我和别人吃午饭,对他们的工作感到好奇,就会问一些基础问题。这完全没问题!

但做功课确实很有用,而且能做足够多的功课、想出一组好问题,本身也很有趣。

§ 12

I’m mostly talking here about asking your coworkers questions, since that’s where I spend most of my time.

Some calculations I try to make when asking my coworkers questions are:

is this a good time for this person? (if they’re in the middle of a stressful thing, probably not)

will asking them this question save me as much time as it takes them? (if I can ask a question that takes them 5 minutes to answer, and will save me 2 hours, that’s excellent :D)

How much time will it take them to answer my questions? If I have half an hour of questions to ask, I might want to schedule a block of time with them later, if I just have one quick question I can probably just ask it right now.

Is this person too senior for this question? I think it’s kind of easy to fall into the trap of asking the most experienced / knowledgeable person every question you have about a topic. But it’s often actually better to find someone who’s a little less knowledgeable – often they can actually answer most of your questions, it spreads the load around, and they get to showcase their knowledge (which is awesome).

I don’t always get this right, but it’s been helpful for me to think about these things.

这里主要说的是问同事问题,因为我大部分时间都在做这件事。

问同事问题时,我会试着盘算几件事:

现在对这个人来说是好时机吗?(如果他们正焦头烂额,那大概不是)

问这个问题替我省下的时间,是否值得他们花时间回答?(如果一个问题花他们 5 分钟回答,却能替我省下 2 小时,那太棒了 :D)

他们回答我的问题要花多少时间?如果我有半小时的问题要问,也许该之后约个时间段;如果只是一个快问快答,现在问大概就行。

这个人对于这个问题是不是太资深了?我觉得很容易掉进一个陷阱:一有问题就去问最有经验、最懂行的人。但通常更好的是找一个懂得稍微少一点的人——他们往往能回答你大部分问题,还能分摊负担,同时他们也有机会展示自己的知识(这很棒)。

我不总是能做对,但思考这些事情对我很有帮助。

§ 13

Also, I usually spend more time asking people who I’m closer to questions – there are people who I talk to almost every day, and I can generally ask them questions easily because they have a lot of context about what I’m working on and can easily give me a helpful answer.

另外,我通常更多地问那些和我更熟的人——有些人我几乎每天都会聊天,问他们问题一般很容易,因为他们很了解我在做什么,能轻松给出有帮助的回答。

§ 14

How to ask questions the smart way by ESR is a popular and pretty hostile document (it starts out poorly with statements like ‘We call people like this “losers”’, and doesn’t get much better). It’s also about asking questions to strangers on the internet. Asking strangers on the internet questions is a super useful skill and can get you really useful information, but it’s also the “hard mode” of asking questions. The person you’re talking to knows very little about your situation, so it helps to be proportionally more careful about stating what exactly you want to know. I think “How to ask questions the smart way” puts an extremely unreasonable burden on question-askers (it says that someone should exhaust every other possible option to get the information they want before asking a question otherwise they’re a “lazy sponge”), but the “How To Answer Questions in a Helpful Way” section is good.

ESR 写的《How to ask questions the smart way》是一份很流行但也相当有敌意的文档(开头就很糟,比如“我们管这种人叫‘失败者’”,后面也没好到哪去)。它讲的是向互联网陌生人提问。向陌生人提问是一项非常有用的技能,能带来很有价值的信息,但这也是提问的“困难模式”。和你对话的人对你的处境几乎一无所知,所以更需要相应地谨慎,明确说出你究竟想知道什么。我认为《How to ask questions the smart way》给提问者施加了极不合理的负担(它说提问之前应该穷尽其他所有获取信息的办法,否则就是“懒惰的海绵”),不过其中《How To Answer Questions in a Helpful Way》那一节写得不错。

§ 15

A more advanced form of question asking is asking questions to reveal hidden assumptions or knowledge. This kind of question actually has two purposes – first, to get the answers (there is probably information one person has that other people don’t!) but also to point out that there is some hidden information, and that sharing it is useful.

The “The Art of Asking Questions” section of the Etsy’s Debriefing Facilitation Guide is a really excellent introduction to this, in the context of discussing an incident that has happened. Here are a few of the questions from that guide:

“What things do you look for when you suspect this type of failure happened?”

“How did you judge that this situation was ‘normal?”

How did you know that the database was down?

How did you know that was the team you needed to page?

These kinds of questions (that seem pretty basic, but are not actually obvious) are especially powerful when someone who’s in a position of some authority asks them. I really like it when a manager / senior engineer asks a basic but important question like “how did you know the database was down?” because it creates space for less-senior people to ask the same kinds of questions later.

更进阶的提问方式,是通过提问揭示隐藏的假设或知识。这类问题其实有两个目的——第一是获得答案(某个人掌握的信息,其他人可能没有!),第二是指出这里存在隐藏信息,而分享它是有用的。

Etsy 的《Debriefing Facilitation Guide》中“The Art of Asking Questions”一节对此做了极好的介绍,背景是讨论已经发生的事件。以下是该指南中的几个问题:

“当你怀疑发生了这类故障时,你会留意哪些东西?”

“你如何判断当时的情况是‘正常’的?”

你怎么知道数据库挂了?

你怎么知道该呼叫的是那个团队?

这类问题(看似很基础,其实并不显然)在有一定权威的人提出时尤其有力。我很喜欢经理/资深工程师问“你怎么知道数据库挂了?”这种基础但重要的问题,因为这为资历较浅的人之后问同类问题创造了空间。

§ 16

One of my favorite parts of André Arko’s great How to Contribute to Open Source post is where he says

Now that you’ve read all the issues and pull requests, start to watch for questions that you can answer. It won’t take too long before you notice that someone is asking a question that’s been answered before, or that’s answered in the docs that you just read. Answer the questions you know how to answer.

If you’re ramping up on a new project, answering questions from people who are learning the stuff you just learned can be a really awesome way to solidify your knowledge. Whenever I answer a question about a new topic for the first time I always feel like “omg, what if I answer their question wrong, omg”. But usually I can answer their question correctly, and then I come away feeling awesome and like I understand the subject better!

André Arko 那篇很棒的《How to Contribute to Open Source》里,我最喜欢的一段是:

“既然你已经读完所有 issue 和 pull request,就开始留意你能回答的问题。用不了多久你就会发现,有人问的问题之前已经有人答过,或者答案就在你刚读过的文档里。回答你知道怎么回答的问题。”

如果你正在上手一个新项目,回答那些刚学你刚学会的东西的人的问题,是巩固知识的好方法。每次我第一次回答某个新话题的问题时,都会想“天哪,万一我答错了怎么办”。但通常我都能答对,然后离开时感觉超棒,也觉得自己对这个主题理解得更好了!

§ 17

Good questions can be a great contribution to a community! I asked a bunch of questions about CDNs a while back on twitter and wrote up the answers in CDNs aren’t just for caching. A lot of people told me they really liked that blog post, and I think that me asking those questions helped a lot of people, not just me.

A lot of people really like answering questions! I think it’s important to think of good questions as an awesome thing that you can do to add to the conversation, not just “ask good questions so that people are only a little annoyed instead of VERY annoyed”.

好问题可以是对社区的巨大贡献!前一阵我在 Twitter 上问了一堆关于 CDN 的问题,并把答案整理成了《CDNs aren’t just for caching》。很多人告诉我他们很喜欢那篇博文;我觉得我问的那些问题帮到了很多人,而不只是我自己。

很多人都很喜欢回答问题!我认为重要的是把好问题看作你能为对话增添的精彩内容,而不只是“问好问题,这样别人就只会有一点烦,而不是非常烦”。

§ 18

Thanks to Charity Majors for reminding me that I have something to say about asking questions, and to Jeff Fowler & Dan Puttick for talking about this with me!

感谢 Charity Majors 提醒我,关于提问我还有些话可说;也感谢 Jeff Fowler 和 Dan Puttick 和我讨论这个话题!

打开原文 ↗