作为一个高大上的码农,你肯定用到过 StackOverflow,必须的。会有人否定这个断言么?那他恐怕不是真正的码农,或者说还没入门。StackOverflow 对于码农的重要性,基本就和诸葛亮对刘备的重要性差不多,它上知 Java 下知 MySQL,中间懂得各种算法。只要你拥有与它沟通的技巧,它几乎可以回答你遇到的任何技术问题。
不过,很多码农对它的体验也就仅限于此了。查询一下,找到问题,然后把里边的代码复制粘贴到自己的 IDE 里,然后接着调试代码。万一没有找到符合的条目,就只好去其他地方问。其实你本来还可以做更多,比如主动去 StackOverflow 提问,去回答其他人的问题。这样才能在里面谈笑风生,充分体会到 StackOverflow 的乐趣。
有人要问了,我在 StackOverflow 找到答案,解决了我写代码时候遇到的问题不就行了,回答问题是那些大牛的事情,我何必浪费这个时间呢?对于这种论点,虽然我写这篇文章的时候很想说它是错的,但是理智告诉我,这样做也没有错,如果非要让每个人都在 StackOverflow 上做贡献,恐怕 StackOverflow 就不好玩了。
不过,在 StackOverflow 上积极贡献自己的问题和答案还是有好处的,主要是练习英语、练习技术和扩展视野三方面。
- 首先,StackOverflow 是一个英语社区,不管提问、评论还是回答,都得用英语把自己想说的话说清楚,这个过程可以锻炼英语读写能力;
- 其次,技术方面,在 Stackoverflow 上会遇到各种千奇百怪的问题,比你在工作中遇到的多得多,这可以锻炼你快速识别和解决问题的能力;
- 最后,在 StackOverflow 的问答中会不断冒出一些新技术,有利于扩展知识面。比如我在尝试回答一个 Grails 问题的时候,碰巧提问者用到了一个分布式缓存的插件,我为了回答这个问题,先花了三四个小时阅读这个插件的文档才能开始调代码,最后问题答对了,也学到了新知识。
所以,我还是坚持认为,用一些业余时间在 StackOverflow 上贡献自己的问答是有利于国内码农的成长的。
要这么做,首先你得有个账号,这是显而易见的。但是,关于注册账号、查找问题、提问、给出自己的回答、积分规则、获得徽章的条件等等入门知识,在 StackOverflow 上都有介绍,我就不说了。具体内容你可以去 http://stackoverflow.com/tour 自己看,花不了多少时间。
这就好比你要去参加一个 party,首先你得有邀请函,还要了解这个 party 的主题,费用是 AA 还是有人赞助了,哪些人能去 VIP 包间,这些都是基本的条件。但是,除了这些以外,还有一些很重要的礼仪或惯例之类的 “潜规则”,比如穿着要求、当地习俗、禁忌事项什么的。要不然你一身西装革履去了,发现里边全是大裤衩子和拖鞋,到时候没人搭理你也是正常的;要是不小心违背了一些禁忌,保不齐被人一顿胖揍就更惨了。
其实,StackOverflow 就可以看作是程序员的一个大 party,而咱这篇文章主要就是聊聊里边一些潜规则的东西。当然了,这里只是老码农我自己的体会。兄弟水平有限,也许会有说的不对的地方,或者对某些人不适用的观点。本着言者无罪的原则,你自己判断就好。觉得哪句话对就照着做,觉得不对就当没看见呗。如果你看完了有不同意见非要提出来也可以,不过我反正是不会采纳的。
言归正传。首先我要说的是,不要把挣积分作为参加这个 party 的目的。StackOverflow 的 reputation 机制是它的一个核心,你在里面能做哪些事都和这个数字有关系。虽然我承认 reputation 很重要,但是我还是要说,reputation 是身外之物,它只是你在上面提高水平之后自然产生的副产品。
如果你就是只关注积分,那我教你两个歪招,后面的内容你就不用看了:一、多注册几个马甲,给自己所有的问答点赞,分分钟几百积分到手;二、提问题也是有积分的,多提一些门槛低的弱问题,比如 “JS 里的 == 和 === 有什么不同?”,然后选择一个正确答案也能快速得积分。两招配合使用,积分上万不是梦!再见!
好了,接着和其他同学聊。我是很不赞同那种趴在 StackOverflow 上刷题使劲挣积分的做法的,这样把 StackOverflow 功利化了。因为这样抢的都是自己拿手的简单题,全是在做熟练工,花了很多时间也没什么提高。我们的教育环境里很悲哀的一点就是题海战术,孩子们从小就是通过大量练习熟练掌握了一些没用的技能,到工作了以后还是会不自觉地照着这个套路来,多可悲!就算你花5年时间刷一万题得了7万积分又怎样?有的牛人一个回答分分钟就得到八千多个赞8万多积分我会乱说?
我觉得正确的心态是像比尔盖茨看他的银行存款余额一样看待 reputation,多点少点都无所谓。把注意力和时间集中到你感兴趣的技术领域,回答一些能对你有启发的问题。遇到自己不理解的内容,可以积极和提问者及其他回答者探讨交流,这样的收获才是最大的。
其次,就是用代码说话。Linus 说过:Talk is cheap. Show me the code. 这句话其实也是 StackOverflow 的社区文化精髓。不管是提问还是回答,尽量把代码贴进去,一段代码能抵几千字。有些新手看到一个问题觉得很简单,不假思索地就按自己的直觉回答了,然后就期待着积分蹭蹭地涨,可等了半天发现别人全点了“没有帮助”,最后不但积分没涨反而拿了一堆负分滚粗,还奇怪这是咋回事呢?
我的看法是这样的:如果问题里有代码,就不要泛泛而谈,把代码调通了再来总结,这样才会对提问者有帮助。否则,如果光是问 “NoSQL到底好在哪里?” 这种空泛的问题,或者不调代码只回答 ”因为 CSS 3D transformation 和 IE9 以下版本不兼容“ 这样的空话,他不拿负分谁拿负分?实际上,StackOverflow 里边的那些下箭头就是为这样的同学量身定制的。
通过这个过程,能锻炼严谨的思维习惯,改掉空谈的毛病。比如在生活中,问对问题和听懂问题其实都是一门大学问。时间长了你会发现,其实写代码和做人的道理很多地方是相通的。具体怎么相通呢?各人会有各人的体会,这里就不多说了。
第三,尽量写规范化的地道英语。首先不要有太低级的语法错误、单词拼写错误等,让其他人理解起来很费力,这样就像在 party 里喝醉了酒胡言乱语一样,是不尊重他人的行为;再有就是逻辑表达清晰,让别人能明白你的思路,不要前言不搭后语;最后,不要有人身攻击、种族歧视等绝对忌讳的语言,也要注意别在文字中不自觉地流露出这方面的暗示,比如“这都什么年代了,还有人用 JSP?”,这样等于说用 JSP 的人土老帽,肯定会被愤怒的 JSP 专家们集体打负分的。
如果英语水平比较初级,怎么办?也不必因此而裹足不前,大胆尝试嘛!一开始可以模仿,找几个类似的问题或答案,把其中的文字复制下来保留论述句子结构,然后把里面的一些单词替换为自己的关键词。改完之后要多看几遍,不通顺或者逻辑上有矛盾的地方要认真改过来。通过这个过程,也有利于逐步提高自己的英语阅读和表达能力。
第四,这里给新手提个醒,你问了问题,也有别人给你解答了,一定要记得标记正确答案,最好在评论里告诉回答者结果并表示感谢。这样是给回答者付出心血的应有回报,自己也能得到积分。有的人在 StackOverflow 上呆了好几个月,问了几十个问题,自己的积分还是个位数,有经验的玩家就不愿意回答这种人的问题了。很显然,他们都是看了答案就拿走用,从来不给标记或点赞的。地球人都知道,看贴回帖是一种美德。点个正确答案的标记又不会怀孕,举手之劳而已,何必省这点事呢?这种行为太损人品,绝对要避免。
如果对方给出的代码你拿来不好用,也不一定是人家给的答案不对,有可能是你没用好。这时可以在评论里给对方提供进一步的反馈,并可以利用 @ 通知对方。比如功能实现了但是会冒出异常,就把异常信息给对方,有必要的话再一并提供你的开发环境配置,让对方可以评估不同环境下的差异,并在你反馈的基础上进一步完善答案。
第五,回答问题的时候,对于表达不清或过于宽泛的问题,不要急着回答。如果提问者是菜鸟,也不要直接就给人家的问题点负分下箭头,最好先在评论中问他一些具体问题,或者要求他贴出代码,帮助他完善自己的问题,等确定自己搞清楚问题了再给出你的答案。StackOverflow 的评论区也有很多精华,特别是那些点赞数很高的,往往是对答案或问题不可或缺的补充信息。
此外,对于有助于完善问题或解答的其他评论和答案,也可以点赞支持。因为,恰如其分地对其他人的问答和评论进行评价,有助于让高质量的问答获得更多关注,这也是你对社区的一种贡献。
好了,就说这么多吧。最后我还要强调一点,就是上面我说的这些其实都是浮云,大部分是废话,重要的还是你亲自去尝试。看别人讲多少道理,都不如自己亲身的体验和领悟。在网络社区里,新手犯一些错误也没什么关系,只要自己积极参与,用心总结提高,就能得到很多收获。预祝你在 StackOverflow 玩得高兴!