原文:http://www.mikeash.com/getting_answers.html

作者:mike@mikeash.com

译者:今天早上起床,有幸读到这篇文章,觉得它是我们在这个世界上的基本生存技能之一。内容虽然是程序员相关技术问题,但同样适用于我们的日常生活。所以,决定用自己的碎片时间,将其翻译成中文。当然,自己的翻译水平有限,这里主要是同大家分享。

我常去几个和程序员相关的聊天论坛,在那里,有不少人因为无法得到他们想要的答案而陷入困境,他们要么得到的是一些没有什么帮助的答案,要么沉浸在一堆废话中。但实际上,一些事情是有助于得到有价值的答案的。这篇文章将给出10个例子,以确保你提出的问题能够被快速有效的回答。

接下来的内容你可能不会感兴趣,如果着急了,请直接跳到指南

你的任何意见或建议,我都欢迎你在这里留言。

在寻觅答案上,以前就有人写过相关文章,但他们忍受着问题所带来的痛苦。我的目标是避开这些问题,使你,一个寻觅答案的人而不是回答问题的人,在某些事情上可以直接受益。

如何聪明的提问写得很有贵族气息,特别是如果你因为在提问方面需要帮助而感到侮辱。如果有人告诉你文件名作为提问的方向,那意味着这个人认为你提的问题是一个愚蠢的问题,这样的帮助又有谁需要呢?

帮助吸血鬼:监视指南虽好,但它是从另外一个角度来写的。的确,它对于没事并回答很多问题的人来说很有用,并且还帮助他们应对有名气的“吸血鬼”,但对于正在提问的人来说并没有什么帮助。

我还发现另外一个指南,在IRC上获得帮助。它对于这个话题来说的确是一个方便的伴侣,尽管它更多的面向IRC规矩中的细节,在实际问题的针对性上要弱一些。

因此我将“寻觅”这篇文章呈现在你面前。它的目的就是为你的提问寻觅答案,仅此而已。像如何在提问时客套或什么时候该读这篇文章的无聊之类,我不会提及。这篇文章会向你展示10个基本方法,以帮助你提高找到答案的几率和质量。如果你找到的答案是让你漫天地读使用手册,那你的寻觅之旅就失败了,因为那比没有答案好不了多少。而任何建议,只要帮助你解决了问题,那你的寻觅之旅就是成功了。除此之外的其它所有因素都是其次。

在这个指南中你会发现明显存在IRC和MAC风格,但在任何上下文中,对于任何话题,这都是存在的。

提问者和回答者将通过例子来阐明原则,以帮助我们理解。提问者和回答者模拟对话向我们展示为了快速获得答案的正确和错误的方法。这些对话虽然是虚构的,但它们种的每一个都是直接从我所遇见的各种情况中挑选出来的。

1. 说清楚是什么不能工作

你可能认为这个问题是显而易见的,其实则不然。许多人会问一般性问题或者是他们认为稍微简单并且相关的问题,而不是直接说出具体什么不能工作。如果你认为这是一个一般性问题,你可以将这个问题摆出来,但一定要告诉人们到底是什么不能工作了。

[译者]:这类情况我在工作中其实也见得很多。有很多人,特别是那些有一定工作经验的人,他们似乎不喜欢直接说出问题本身,而是将问题进行抽象或者是根据自己的经验和知识,将具体问题转化为一般性问题后来问别人。当然,这体现出了这个人的概括能力,但请把这个概括能力放到问题解决之后,而不是问题解决之前。

糟糕的提问

题问:我该如何在10.4上编译一个APP,使其能够在10.3上工作?

回答:安装SDK,例如:…

提问:有其它方法吗?

回答:我不明白你指的是什么?

提问:呃,我的App在10.3上启动时崩溃了。

好的提问

提问:我的APP在10.3上崩溃了,但在10.4上工作正常,我该如何发现问题呢?这是否是我在构建中的问题?

回答:你的构建应该不会有问题,你很有可能链接了在10.3上不存在的东西,在崩溃发生后,看一下Console输出,看里面到底发生了什么?

什么地方出错了?“我的APP在10.3上启动时崩溃了”,但她在在几轮提问中都没有被提及。虽然回答者提到了SDK,但这是无效的,因为提问者已经知道了关于SDK的信息。提问者失去了时间,它将回答者引入歧途而不是一开始就说出问题所在。

通过直接切入问题之所在,提问者就理解从回答者那里得到了答案。

2. 把每件事情都摆出来

让别人去摸找信息是在浪费你的时间。尽可能把你原始问题中的背景信息都拿出来。

糟糕的提问

提问:我该如何追加字符串

回答:使用stringByAppendString:

提问:呃,我不想创建一个新的对象

回答:那么使用NSMutableString和appendString

提问:但是,我用的是C语言,不是Object-C

回答:你为什么不直接说?

提问:我如果使用CFString会怎么样呢?

回答:呃,使用CFStringAppend

提问:但那没有用,我需要追加一个char*

回答:去你的…

好的提问

提问:我如何将一个char*追加到CFString上?我找到的东西只能在CFMutableString上起作用。

回答:这是你的唯一选择,你将不得不创建一个可变的拷贝,然后再使用CFStringAppendCString。

不充分的问题说明不会为你节省任何时间(无论如何,你最终都会说出全部内容),并且这会使得其他人不怎么可能回复你,现在如此,将来也是这样。

你可能害怕说得过多,别那样。过于充分的说明远比不充分的说明要好得多,因为对于某个人来说,他会更容易忽略额外的细节,而不是问你没有出现的东西。当你犹豫时,你可以这样说:“我不确定我要说的是否和这有关,但是我…”

3.张贴你的代码

当然,这个方法不适合于大的,概念性的提问,但对于除此之外的其他事请却是必不可少的。永远不要只描述你的一般性问题,而不把问题后面的代码张贴出来,因为代码很重要,并且将每一件事情翻译成英文往往会使其变得面目全非。

糟糕的提问

提问:当我从UTF-8数据中创建一个NSString对象时,失败了,为什么?

回答:张贴你的代码。

提问:我并不认为那是代码的问题。

回答:去他的。

糟糕的提问2

提问:如果我将NSMatric降为子类,屏幕上就什么也不显示,但直接使用NSMatrix是可以的,为什么?

回答:我怎么知道你是怎么搞的。

糟糕的提问3

提问:我用UTF-8数据创建NSString对象失败,为什么呢?

回答:张贴你的代码。

提问:我现在拿不出代码,但是我做了类似于char * utf8str = …;[utf8str stringWithUTF8String]

回答:你不能向一个char * 发送消息,并且也不存在没有参数的stringWithUTF8String方法,再试试别的…

…第二天…

提问:我知道是怎么回事了,我实际上使用的是stringWithCString。

回答:无语

好的提问

提问:当我从UTF-8数据创建一个NSString对象时失败了,为什么?我用的方法是 char * utf8str = …; [NSString stringWithCString:utf8str]

回答:原因在stringWithCString,它不能处理utf-8数据,你得用stringWithUTF8String

虽然要求提供代码耗费时间和精力,但是通过它,你可以立即加速答案的获取速度。如果你不确定那些代码是否与问题相关,那就直接张贴出来好了。一定不能通过复述或记忆的方式将代码敲出来。如果那样的话,即便你的愿望是好的,你也可能引入一些微妙的或者是显而易见的错误进来,然后,那些正在与你交流的人就会朝着一个完全不是你所期望的方向去解决问题。

(在网上的实时聊天过程中,不要忘记使用粘贴设施。如果你的代码有多行,直接将代码粘贴到话题讨论中是粗鲁的行为)

4. 提前调研

虽然,当你遇到问题时,盯着一两个朋友讨论是一个不错的主意,但向陌生人寻求帮助是你的最后手段。在向陌生人提问时,要做足功课,尝试自己解决问题。通过提出更加有用的信息,这会帮助你找到答案。关于要讨论的问题,你知道得越多,就越有机会获取你所要的。

糟糕的提问

提问:我该如何创建一个线程?

回答:rtfm!

好的提问

提问:我阅读了NSThread的文档,我该如何在调用一个方法时传入一个int参数呢?

回答:创建一个带有NSNumber的方法,然后通过它来调用其它方法并传入int值。

在一个版本中,提问者没有得到任何有用的东西;在第二个版本中,提问者得到的答案要有用得多,因为提问者在问这个问题之前阅读过相关的话题。

提问者还做了一件漂亮的事情,就详细说明了他做了什么调研。你几乎不会得到类似于 rtfm的回复,如果你告诉每个人你所阅读过的好的手册。

5. 不要停下来

一旦你问了第一个问题,你的工作不要停下来。当面对一条不熟悉的建议时,你要先研究它,然后再提问。即便将陌生的词汇输入Google也会得到很多帮助。

糟糕的提问

提问:我如何得到一个目录列表?

回答:用NSFManager。

提问:什么是NSFManager?

回答:rtfm!

好的提问

提问:我如何得到一个目录列表?

回答:用NSFManager。

....提问者将NSFManager输入到Google...

提问:好的,谢谢。....有没有什么办法只让其结果返回以"tty"开头的名称?

回答:你可以先获得整个结果,然后再使用NSPredicate...

研究你的后续问题以及你原来的问题会让你得到更多有用的回复。

6. 做事后调查

我打赌你看到这一条来了。在你得到回答并离开后,你应该尽可能多的研究,然后再回来问关于问题的建议。

糟糕的提问

提问:我如何得到一个目录列表?

回答:用NSFManager。

...提问者离开片刻...

提问:我该如何使用NSFManager?

回答:rtfm!

好的提问

提问:我如何得到一个目录列表?

回答:用NSFManager。

...提问者离开...第二天...

提问: 当我用NSFManager列出"/"下面的内容时,我得到的是“Applications"而不是我在Finder里面看到的被翻译过的名称。为什么是这样子,我该如何做得像Finder那样呢?

回答:本地化的名称不在文件系统中,但你可以用...

像以前一样,你做的研究会让你得到更好的答案。

寻觅[Getting Answers]的更多相关文章

  1. RTNETLINK answers: File exists错误解决方法

    >一.写在前面: 因为是我刚学习linux好多问题需要解决,bolg仅作为记录自己的在技术这条道路上的点点滴滴. 二.事件起因: 最近因为女友的原因消沉的好长时间,在马哥那里的课程的结束到现在已 ...

  2. HDU3038 How Many Answers Are Wrong[带权并查集]

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  3. HDU 3038 How Many Answers Are Wrong(带权并查集)

    传送门 Description TT and FF are ... friends. Uh... very very good friends -________-b FF is a bad boy, ...

  4. poj 1888 Crossword Answers 模拟题

    Crossword Answers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 869   Accepted: 405 D ...

  5. linux下RTNETLINK answers: File exists的解决方案

    重启网卡时 出现 :RTNETLINK answers: File exists  提示 以下是网卡出来错误的解决方法: 第一种: 和 NetworkManager 服务有冲突,这个好解决,直接关闭 ...

  6. hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. 101+ Manual and Automation Software Testing Interview Questions and Answers

    101+ Manual and Automation Software Testing Interview Questions and Answers http://www.softwaretesti ...

  8. HDU 3038 How Many Answers Are Wrong (并查集)

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  9. UNIX command Questions Answers asked in Interview

    UNIX or Linux operating system has become default Server operating system and for whichever programm ...

随机推荐

  1. iOS-即时通讯-环信

    下载地址:http://www.easemob.com/downloads SDK目录讲解 1.从官网下载下来的包分为如下四部分: 环信iOS SDK 开发使用 环信iOS release note ...

  2. BCP 数据的导入和导出

    BCP 命令的参数很多,使用 -h 查看帮助信息,注意:参数是区分大小写的 使用BCP命令导出和导入数据常用的参数如下 bcp {[[database_name.][schema_name]].{ta ...

  3. SSIS Design6:利用数据流

    数据流利用内存来缓冲数据,并在内存中处理数据转换,由于内存的访问速度是非常快的,所以SSIS数据流转换性能是非常高效的.SSIS Engine将数据分批加载到内存中,当Data Flow将一批新的数据 ...

  4. LINQ系列:Linq to Object分组操作符

    分组是指根据一个特定的值将序列中的值或元素进行分组.LINQ只包含一个分组操作符:GroupBy. GroupBy 1>. 原型定义 public static IQueryable<IG ...

  5. jQuery源码分析系列(34) : Ajax - 预处理jsonp

    上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处 ...

  6. 一起学微软Power BI系列-官方文档-入门指南(5)探索数据奥秘

    我们几篇系列文章中,我们介绍了官方入门文档与获取数据等基本知识.今天继续给大家另外一个重点,探索数据奥秘.有了数据源,有了模型,下一步就是如何解析数据了.解析数据的过程需要很多综合技能,不仅仅是需要掌 ...

  7. ES6 - Note2:解构赋值

    ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...

  8. iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇

    前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...

  9. Spring 4 + Reactor Integration Example--转

    原文地址:http://www.concretepage.com/spring-4/spring-4-reactor-integration-example Reactor is a framewor ...

  10. objective-c 语法快速过(7)编译器特性ARC

    ARC(是编译器特性) ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内 ...