没有 bug 的程序员不是好程序员——原因很简单,说明他就写过个 Hello World。解决技术问题也和解决我们生活中的问题一样,每个人有自己的一套诀窍(或者至少是习惯),很难说哪种方式是最管用的。江湖门派各异,各有各的独门秘诀,只要不是旁门左道练得走火入魔,总也是各有其妙的。
在网络这个江湖里,有人看的是热闹,“暗哥和 summer 又撕架了哎,大家快来看”;有人看的是招式,“Vue.js 派大师兄今天用了一招袖里乾坤,轻巧地躲过了 React 派的掌门人的降龙十八掌”;少部分人能看出这些招式乱欲迷人眼背后不变的门道,“说到底,前端同盟底下这些帮派这些年闹得这么风风火火,不还是后端同盟或说是整个武林往些年经历的这些套数,再往大点说,不就是印证了整个宇宙分分合合的规律吗”。
在代码码头,有很多刚入行的搬砖码农,他们还没机会加入任何帮派,别说看出门道,就连看出招式都是很困难的。他们通过看书看网上的教程,了解了一些搬砖基本的知识和姿势,于是就照着一天天弯着腰搬砖。
我敬你是一条好汉才告诉你,不要等你搬砖砸了脚才知道抬起头看看,怎样在这个代码江湖求助于人。
什么时候需要寻求帮助
一等聪明的是神人,还没砸到脚就在观察别人怎样搬可以不砸到脚;二等聪明的是高人,搬砖砸了脚,流了血,知道找郎中包扎完问一句伙伴“我哪里搬错了”;三等聪明的是好汉,搬砖砸了脚,流了血,自己胡乱包扎一下止住血就算完事了,一点都不痛,真的;四等聪明的就是死人了,因为他们早晚被自己砸死。
好汉,我知道你可能很不以为然——我一条好汉还能不知道什么时候需要寻求帮助吗?
是啊,因为你觉得自己是好汉嘛!
《道德经》中说“明白四达,能无知乎”,说的是没了知乎,你还能明白四达吗你说你明白四达,但你做得到承认自己一无所知吗?同样,你说你是条好汉,但你做得到承认自己需要帮助了吗?
码农们在碰到 bug 的时候还不知道去解决的,想必大多也活不到看到本文的时候。
大多数情况下,我们可能更接近好汉思维,碰到 bug 能修的修一修,不能修的绕一绕——这不,KPI 就有了嘛!好汉自以为很聪明地赚到了搬砖费,但高人知道,相比搬砖经验而言,这点初级搬砖费这是小钱。
高人有较好的解决问题的习惯,懂得寻找正确的答案,以及从答案中归纳出更泛化的规律——这通常是在他们跻身搬砖行业之前就养成的良好思维习惯。
至于神人,微妙玄通,深不可识,不在本文的探讨范围内。
本文剩余部分将详细介绍如何让好汉成长成为高人。
为什么良好的提问方式至关重要
上文介绍了自认好汉不愿寻求帮助的情况,现在要说的是另外一种极端——伸手党。
作为姨恰辞(ECharts)派刚收入门的弟子,笔者羡辙要来吐吐苦水。
“姨恰辞某某功能要怎么实现啊?”
“姨为什么报错啊,我哪里错了嘛?”
“姨怎么不听使唤了,我让她……呀,快跟你姨说呀,在线等!”
亲,不如把客服小妹包邮带走吧~
我能理解大家想快点解决问题的心理,但是如果错误的解决方式换来是的迅速得到的正确解答,不仅仅是增加客服工作量的问题,危害更大的是鼓励了这种错误的提问方式,很多新入行的码农以后就会把这认作是正确的提问方式,以至于影响了整个业界的问答效率,更严重地说,是思维模式。
伸手党伸出手的时候,就应该人人把这手打回去!
我一开始使用 StackOverflow,不知道怎么提问,被无情地 vote down 甚至关闭问题后,首先觉得这个社区好冷漠,我知道我问的方式不大好,但你回答一下怎么了?你明明知道答案的呀!
后来,我慢慢玩转了 StackOverflow,碰到和曾经的我一样写得不太合适的问题,我就热情地回答了,并且告诉题主,你这样的提问方式不太好哦。后来,有经验值很高的人给我留言,面对这样问题,最好的方式就是把问题关闭,让题主吃一堑长一智。我突然理解了当初觉得是冷漠的这种行为,事实上也正是当初被关闭的问题,才让我真正去研究了 StackOverflow 的提问风格,后来才能更高效地提出问题。说得更大一点,也正是这种无情地关闭问题的行为,才使得 StackOverflow 成为一个高质量的社区,甚至改变了整个业界的提问方式。
所以,下次你的提问没人理睬的时候,请一定不要把我们看成冷漠的人——我们只是在强化这一规则,只有良好的提问方式,才能得到良好的回答。
那么,接下来,我就来讲讲我对良好的提问方式的想法。当然,请务必铭记,这只是一家之言,甚至算不上是姨恰辞派的功夫,但希望这些招式能够给你带来一些启发。
你需要的帮助未必只能来自他人
伸手党不敢伸手了,那应该怎么办呢?
Tip 1:找到核心问题
伸手党:这还不简单,我就是想知道为什么会有 bug A 啊!
羡辙:那么你先问一下自己,A 是由什么引起的?
伸手党:我要知道,还问你干嘛?
羡辙:就像医生看病一样,能看到的是症状,隐藏在背后的是症源,如果只治标不治本,常常连怎么治标都不知道,因为症状实在太多了。但是如果能多问几个为什么,找到症源,那么别人碰到过的可能性就会大大提升。
Tip 1.1:跟踪依赖项
就像报错的路径常常是一个栈,你也可以跟踪进错误的地方,看看究竟
a.x
报的错是不是由于a
是undefined
引起的。Tip 1.2:控制变量
尝试不同的环境下,bug 是否会复现,从而找到真正引起 bug 的症源。
Tip 1.3:最小化复现问题
用最少最简单的代码重新复现出你的问题,这不仅仅是对下一部的提问有用,常常自己写到一半就意识到哪里出错了!
在这一步中,很多问题都可以自己解决掉。切记心急和懒癌,再说一遍,我们不是要解决 bug 本身,更是要从中学会一套绝世武功!
你需要的帮助未必只是解决问题
做到以上的步骤,如果你的问题还没有解决,那么,你可以向别人提问了。
Tip 2:问谷歌
第一个询问的人一定是谷歌,是的,即使我是姨恰辞派的,我还是要公正地说,问谷歌。
虽然这一点似乎大家都知道,但是还是会有很多人,一碰到问题,直接就去提问。
你觉得问一个重复的问题对你来说快多了,对别人来说,最多把以前在别的地方回答过的问题再复制过来,也没什么成本嘛。其实大错特错!
第一,你降低了自己的提问效率,因为要提出一个高质量的问题,你一定需要好好编辑你的问题;第二,你浪费了别人的工作量,回答你问题的人可能也不知道已经有别人回答过一个类似的问题了,又重新给你写一遍,以 StackOverflow 的回答看,大部分人还会写了代码自己运行了再来回答的,你好意思么!第三,你损害了社区的和谐,你别觉得我危言耸听,只有每个人对自己的提问和回答负责,才有一个健康的社区。
Tip 2.1:尽可能用英语
学渣:中文看起来方便,而且那么多中国程序员,我大中华人才济济,为什么要用洋鬼子的话?
羡辙:改革开放是决定当代中国命运的关键抉择,是发展中国特色社会主义,实现中华民族伟大复兴的必经之路;只有社会主义才能救中国,只有改革开放才能发展中国,改革开放是我国的强国之路,是国家发展进步的活力源泉,我们要毫不动摇地坚持改革开放。另外,请不要用狭隘的民族主义观点来掩饰你英语不好的事实。
学渣:我英语不好。
羡辙:你一直不用,当然不好了。搜索的时候也就输点关键字,你甚至连语法都不用管。
Tip 2.2:练习使用更精准的描述
问谷歌或是大部分现有搜索工具的一个难点在于,我们常常很难描述问题。(所以推荐算法将作为一种补充,在海量信息的时代帮助我们获取对自己更有用的信息。)
如果是报的错,那复制错误信息通常还是能把我们引向正确的去处的,但是如果是某个功能性的问题,我们常常很难用文字表达清楚。
这里之所以说“练习”,就是因为这是一种慢慢养成的技能。一方面,这涉及到英语的问题,如何找到更恰当的词;另外一方面,也是情景相关的,描述这个问题需要用什么词更恰当。好在谷歌对于近义词会有容忍,找到问题的同时,你也学会了更地道的表述方法。
Tip 3:在正确的地方提问
通常来说,具体的技术性问题就在 StackOverflow 问,这本不是什么有争议的问题,问题在于不应该在什么地方提问。
Tip 3.1:不要在 GitHub issue 提问
GitHub issue 不是用来答疑解惑的!GitHub issue 不是用来答疑解惑的!GitHub issue 不是用来答疑解惑的!
自从关注姨恰辞项目后,我的时间线就没消停过。喂,我都说三遍了呀!
issue 是用来报告 bug 和提 feature 等的,对于你的技术性问题,应该去 StackOverflow 问。
Tip 3.2:不要在 QQ 群提问
我也被拉进过几个所谓技术交流群,经常有人会吼一句某某问题怎么解决,然后群里常活跃的那么几个人讨论起来。再大的群,碰到过你的问题的也毕竟是少数,而且你这么吼一句,又怎么描述得清楚问题呢?
更重要的是,不管结果有没有得到你想要的答案,这都不是一个好的提问方式。原因在于,我们要的不仅仅是解决 bug 本身,而是养成一个良好的提问和学习习惯,尤其对于初学者,千万不要尝到点甜头,依赖这样的形式。
Tip 3.3:不要轻易给项目开发者发邮件
尤其是比较热门的项目,开发者都很忙的,要是每个使用者都发邮件来问,你还指望不指望这项目更新了?
如果你实在要给开发者发邮件,或者是一个比较小众的项目,估计除了作者没什么人知道,那么可以在 StackOverflow 上提问后给作者复制链接,或者至少在 jsfiddle.net 等在线代码平台放上你的代码。千万别搞个压缩包发邮件,别说我怕病毒,就算我不怕,我都懒得点下载键,甚至有的居然还要我配环境!
好了,由于篇幅问题,今天就先介绍到这里了。在下一期中,我将会介绍对于问题本身该如何保证高质量。
各位大侠晚安~