../

译 What have you tried?

Matt Gemmell 所写的 What have you tried?

作为一名开发人员,有技术问题要去问其他开发人员(通过论坛、邮件、讨论或是当面咨询),你最好事先思考过这个问题:“你试过了什么?”。

我所指的不一定是软件开发员,然而正因为那是我的专长、我最熟悉的一件事,才驱使我写了这篇文章。我很(遗憾地)确信,我所说的也适用于你所在的领域,不管在哪。

重要的是,在软件开发世界里有一种毛病;一种病态。这种不寻常的毛病不太会是踏入这个领域之后才染上的(比如染灰色头发、对咖啡因上瘾和道德败坏),而是新手在来之前就已经有了。

我先澄清一点:我所说的“新手”并不代表毕业生或其他年轻人。有些人认为这种毛病是现代西方教育系统的产物,情况在以前也许更好些。孰是孰非我没有资格来定论,况且我的重点也不在这里。我所讨论的毛病不仅发生在年轻人身上,也发生在年长者身上。

当然,这种毛病是一种错误的解决问题的办法。下面的一个例子真实地引用自一个网上论坛:

1) Can we establish http connection in application.

if so, i need that code.

I checked NSURLconnection. I cannot intergrate that code.

2) I want to display a image from the website

Can anybody please provide me the code?

If anybody having sample program please give me.

问题出在哪?答案不在于英语水平(有理由相信英语不是这个人的母语,但只要意思表达清楚了,这也没有关系——他也表达清楚了)。答案也不在于标点和语法,只要没有阻碍理解,那些东西在上下文里也不太重要。

问题出在这个人解决问题的技巧是去要答案。不是去要如何接近结果的建议,也不是要可查阅的资料或例子的链接——而是仅仅要代码,现成的,拿来即用的。这不是在解决问题,而软件工程都是在解决问题。

有趣的是上述例子并不算太坏;在问题里找得到一处闪光点,并可肯定这个人“检查了 NSURLConnection”。那样提升了稍许信心,因为想要实现 HTTP 连接,NSURLConnection 的确是 Cocoa 里适合来学习的一个类。但是,貌似“检查”是我们这位朋友做的所有努力了——他们“不能集成代码”,因而就放弃了。

这是一类我们经常看得到的问题(不是实现 HTTP 连接的问题)。有一整群所谓的开发人员,他们解决问题的第一种或最后一种手段就是想从别处,通常是网上论坛或其他求助渠道,轻松地要到完整的答案。他们的目的和我们一样——得到解决问题的代码,也许能用来给客户。这个目的既合理也很正常。

不正常的是,不愿意(我在犹豫是否要用没能力——因为归根结底,只要你付出足够的用心和努力,没有什么事情是真正从本质上来说是难的)通过自学、踏实肯干和反复改进直至达到某些满意的结果。这样的过程转而会更好地让你迎接下一次的挑战,迟早你会发现:

  • 你对很多问题的答案已经有把握、有信心;
  • 通过对已有知识的推广和开展针对性的研究,你已经具备相当的能力来应对不熟悉的问题。

这不是软件工程的戏法;这完全是学习任何事的过程

这并不是在高等教育学校里相传的秘密,事情就是这样:你一开始对某方面缺少理解,并且要解决那个方面的问题。踏实的、可持续的方法就是加深你的理解。这样做:

  1. 想出一个一旦有正确答案后将加深你在某方面理解的问题,然后:
  2. 试着回答它

注意上述第二步。声称要到完整的答案就在某种程度上做到了这一步,这种说法是懒惰和学术不诚实,并可能使你被认为不值得被帮助。毕竟,为什么其他人应该干你的活?

我个人遇到过很多人,透露出他们不愿意去学习、研究或尝试。我这几年发布了许多代码,并且在我所属平台的开源社区里出镜率很高。因为开源贡献者被视为自由老师,那意味着我收到过很多要这要那的邮件。我也在任何允许的时间里提供帮助。

自从 Mac OS X 发布起,我帮助了差不多几百个想入门 Cocoa 的人。我也不用模板回复——我单独回复每封邮件。每个关于代码的具体问题(包括但不仅限于我写的代码)、书籍推荐、对编程入门整体上的建议;在这方面我尽到了我的职责,我真的认为这一种职责。在任何程度上可以做一些事情的人应该去帮助那些想做相同事情的人;那无疑是一个根本的事实和每个人的愿望。

但是这就是生活,没有原理是不考虑特定现实而产生的。帮助也许在大多数情况下是免费的,但那并不意味着不去考虑成本和效益。我的效益也许来源于一股暖流,而不是冰冷的金钱,但是如果你浪费我的时间,那么你似乎没有那些真正想学习的人有价值。

秘密:愿意和渴望学习是真正的敲门砖。

而不是能力;我们掌握某项技能的先天和后天的能力都不一样。一些(可能是大多数)技能可以熟能生巧,而另一些不能——仅仅因为他们看起来对某一学科的某一方面有困难,从而评判他们整个学科的能力是不对的。但是如果你想要别人花时间和精力(尤其当他们是无偿奉献的时候),那么你最好自己争取。

争取不是说要给老师钱,也不是说成功完成你的任务——而是指拼命尝试。尝试是我所讨论的那类开发者所不愿做的。所以,我们很多人自然会忽略他们。问题就解决了,对吗?

不愿自己努力解决问题的滋生会产生巨大的间接作用。能够提供帮助的人不再经常来聊天室、论坛或者检查邮件。“信噪比很糟”,他们说到,附上一些理由。受挫的人是真正的(我指的是善意的、愿意学习的人,而正好初识某个领域)的开发者,他们自然会在某些地方提出合理的问题。这些人会因为人们会从花的精力多少来判断谁是懒惰的浪费时间的人,从而降低了得到有意义的指导的可能。

这件事很糟糕,却非常值得关注——因为逻辑上,对新兴的和/或正经历着快速普及的平台来说,这种现象最为常见。那里真正有经验的人较少,平均水平较低,但求助的数量较高,并且懒惰的、兔死狗烹的人混杂比例较高。这就是 iPhone,Android 等等。

所以,如果你准备问一个技术问题,我想我会先对你说:“好样的!”你问问题,那意味着你想学习,你离成功近了一步。那很棒,我向你致敬。

但先等等。你是否考虑过——真的考虑过——你准备问什么?现在是不是提问的好时机,或者你能不能先向前再迈进一步,那样也许会让你形成更清晰的问题(好事),也许你就没必要问问题了(可能更好)?

花几分钟看看这几点:

  • 你有没有把问题分解得足够细以问一些具体的问题?软件工程的问题你差不多可以分为两类:(1) 可以被继续分解的问题,(2) 你已经知道如何做、如何单独查找的问题。
  • 你的问题是不是那种肯定已经有一些示例代码或文档的标准问题?世上没有一套 GUI 工具包的教程不告诉你如何在屏幕上显示窗口。没有一种编程语言不告诉你如何从文件里读取内容。扫一眼文档,或进行快速搜索。如果你的问题是那样的简单,答案也许离你不远。你可以找到!
  • 网上搜一下。我知道这是不假思考的建议,但照我说的做。如果你搜不到好的结果,你需要缩小范围。如果你只是对 ruby 的 if 语句感兴趣,不要只搜“if 语句”;要搜“ruby if 语句”。那样也许能找到一个更针对你所用的语言和技术的网站。拿 Cocoa 来说,这是 CocoaBuilder 的档案表。其他人也许已经问过你——也许是一百个其他人。
  • 不管是谁写了你用的语言、框架、API 或其它东西,他们也写了示例代码;真的,他们写了。这就是为了帮助你独立应对不同的任务,也许一些代码可以帮你完成部分工作。你只要花几分钟来看这些代码,至少今后需要时可以方便地拿来用。
  • 使用你的 IDE 在线或内置的参考文档。Xcode 有一个文档浏览器。诸如 Eclipse 会给你关于 Java 类的文档。PHP.net 会满足你 PHP 脚本的需求。查找你所涉及的权威参考。你几乎每次都会找到某些有用的东西

好,你经历了上述几个步骤并至少尝试了几点。我终于可以祝贺你了。无论你是否解决了你的问题(很好),现在大家都乐意帮助你。

当我问你“你试过了什么”,你可以自信地说你试了上面所有的东西,并且你可以告诉我你找到的任何有用的东西,或者你可以诚实地说你已经山穷水尽了。我现在准备帮助你,因为我知道你想学习,你愿意付出,并且我教你。

那是很关键的认识。当你被问及“你试过了什么”的时候,并不意味着“让我看你写的代码,否则滚开”。你所做的至少在帮你自己——而且尝试是重要的事情

不仅仅为了避免鄙视,某些人愿意无偿地用宝贵的时间来帮你,而是真的为了你自己的发展。积累足够次数后,你真正必须问的问题会开始减少。你也会成为帮助其他人(包括我)的人,这是多赢的局面。

所以下次你考虑要问问题时,你最好准备好一个有说服力的答案来回答“你试过了什么”。

如果你回答“不是很多”,记住我的话:你被问的下一个问题将会是“那么为什么我要帮你?”。