程序员,你真的会提问吗?
提问是软件开发的一个不可避免的环节,各种思想火花地碰撞往往能产生奇妙的结果,但是作为一名傲娇霸气君临天下的程序员,你是否真的思考和总结过自己的提问方式呢?如何去问一个让双方都满意的好问题并最大程度的得到回复呢?毕竟人生苦短,谁也不愿意为一个烂问题浪费大把好时光。
需要发起这个问题吗?
提问之前,请先扣心自问下如下事项:
- 仔细思考过遇到的问题吗?
- 单凭自身的能力已经无法解决了吗?
- 搜索引擎和社区里有人提过类似的问题吗?
- 我有合适的提问人吗?
- 做好了提问前的准备材料吗?
对于各种凌乱的技术问题,程序员中,女程序员以为男程序员,什么都会;男程序员中,一般程序员以为技术好的程序员,什么都会;技术好的程序员,每次都在网上苦苦找答案......
提问前的准备
提出好的问题是你提升的第一步,提问就跟写程序一样,要有语境,要有上下文,要有条理,要有断点调试,而不是一来就要求被问人必须给出答案,毕竟谁也不曾欠谁的,帮你是热心,不帮你是本分。
- 确认自己无法独立解决,已经做过很多尝试 :遇到问题不要急着问别人,解决问题的独立性一定要培养出来,在时间允许的情况下先看看自己能否应付而非偷懒,一方面可以锻炼分析问题和解决问题的能力,另一方面,一旦问题解决了,问题就不是问题,而是经验和知识库。如果有条件,请记录下来,可以避免其他人在你的问题上犯同样的错误,知识作为财富是可以被散播和继承的。
- 搜索引擎没有找到满意答案 :现在互联网环境总体来说已经非常开放了,诸多的技术资料和各类问答网站都可以利用,想碰到一个别人没碰到的问题,已经非常困难了,此外也不存在什么问题是一眼就可以看出答案的(如果有,只能说明这个问题太粗浅或者太常见,更没有咨询求助的必要了),你提出的问题初衷应该是对这些问题的答案并不满意,解决不了当下的问题。另外,不要排斥英文阅读,结合语境语义地阅读其实只要看关键字就好,各种翻译软件也随时可查,要知道你的问题可能早已经被人解决只是并非用中文来表述,所以请多多使用google和stackoverflow等知识搜索引擎,会有很多意外之喜。
- 找对要咨询的目标人选 :如果做了努力依然不能解决,或者客观条件不允许你自己解决了,那么首先要选择提问对象,确保他是你所知道的最佳解决人选,并且对你的问题会感兴趣,所以选择一般的建议顺序是:同事 > 社区 > 软件作者(github私信),一定要在解决问题的时长,质量,响应速度上做到均衡,毕竟没有人会时刻准备着为你提供各种无私的服务。
- 用最干练和扼要的语言来提问 :多用清晰的短句来作为你遇到的问题的发问标题,如果无法总结,那就贴出你的关键代码和报错日志,不要让被问人在梳理你的问题本意上浪费过多时间。
至关重要的正文
一篇提问的内容如同一篇好的破案报告一样,既要有客观详实的叙述,也要求有尝试方案的记录,这是对问题的起码尊重,如果连你自己对问题的表达的不清晰全面,怎么能指望被问人从中发现更多有价值的思路。
- 不要先入为主地固守自己的方法:切记不要一上来就强调自己的每一步操作都是对的,为何结果不对,这种是极其不负责任的做法。想想既然你都有如此的主见,为何还需要来咨询他人,另外你确定这样做不会把提问人带进沟里?子还曰过"三人行,必有我师焉",虚心求教,放低姿态,是对他人与问题的起码尊重。
- 提供你的运行上下文 :程序的运行都会依赖自身所处的执行环境以及对应的各种配置项参数,这些通常包括有:操作系统、数据库、浏览器、框架等相关软件及其版本号等等,参考下自己公司用来记录bug的报告(如jira,issue list等),通常测试系统在报告一个问题时都会有非常规范的叙述模板,一般包括:出错表现、运行环境、错误日志等多要素,所以尽可能地按照这些来要点组织你的提问语言和线索。
- 问题是否可以重现,怎样重现 :请尽可能地详细地复现出错步骤,找出问题复现的一般规律,通常解决问题的关键点其实就是某一段小代码或者某个配置项不对,复现的过程中会逐步减少出错的范围,这会极大的节省调试时间,同时也能激起各种解决问题的灵感。
- 描述下之前使用过的解决方式:把你的自己之前用过的方式都简明扼要地记录下,可以是日志、程序中的try catch信息、出错截图等,这个有点类似排除法,一来避免求助人在同样的操作上浪费时间,二来也是对求助人的尊重,说明自己至少是尝试过解决而非直接上来乞讨答案。
尽量清楚地描述问题
- 善于利用编辑器:有良好的排版可以提高可读性,减少阅读成本,如果条件允许请多用协作调试平台和代码片断分享工具,尽可能地让被问人和你接触到的代码环境保持一致(如果是站点发问咨询也可以额附上代码片断和github公有库地址),真实环境下的实时调试会比口若悬河地文字描述效果好的多;
- 实时跟进和完善你的提问内容:一个复杂的问题往往不是一步到位解决,而是通过一个个片断的持续改进与更新来最终完成,所以每当解决一个关键点时,请及时同步你的进度信息,持续优化与集成,而不是把问题甩出去后就与我无关,等着拿成果就行,毕竟作为当事人没人比你需要更对这件事的整体进度负责。
- 就事论事,不要附加负面情绪:很多时候我们遇到的问题往往自己也无法避免,比如选用了不熟悉的语言,框架,不成熟的技术选型等,这种情况下往往会有各种槽点和不服想倾述,但请记住这些东西你自行消化或者找个地方写篇长文批判下都行,但是不要带到你的提问内容中,因为这些信息对解决问题没有任何实质性的帮助,同时会带来不少负面的情绪。既然已经跳到坑里了,首先应该想到的是怎么尽快跳出来并且确保以后不再掉进来,而非一直在抱怨是谁挖的坑。
写在最后
提问是门学问,请认真对待,在提问的过程中不断提升归纳问题,分析问题的能力,不断提升自我才是最终目的,一个好的提问会跟好的回答同样精彩,同时别忘了给每一个帮你解答过的人说声谢谢。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。