编者按:原文作者Jenkov是一位丹麦资深开发人员,从事软件开发已有十多年。常有读者咨询他,“怎么才能成为一位专家级的开发人员?”(这个“专 家”不是头衔,应是指硬实力,“成为专家”和“被视为专家”是两码事)。所以他在下文中给出了相关建议。另外,他也提醒到,这些建议因人而异、因所用技术而异,并非适合所有人。
什么是“专家”?成为“专家”需要多长时间?
在我开始讨论如何成为一名专家之前,我们一起来花上30秒时间,看看专家的定义,还有成为专家需要多长时间?
在使用某一技能三个月后,你还不是专家,即便使用时间是三年,你还不是。马尔科姆·格莱德威尔在《异类》一书中指出,成为一名真正的专家,需要 10000小时。10000小时!如果一天用10小时,每天都学习,则大概需要3年时间。如果一天5小时,一年学习200天,则大概需要10年时间。10 年!
根据这一说法,我想起来,我曾在有3年开发经验时,自认为是一个专家级或高级开发人员。如今,在2010年我已有约10年经验,我已经知道,自己已经掌握多少东西,还有多少东西尚未知晓。现在,我已觉得自己不再是一名专家了。
此外,在过去10年当中,这一行业(Java企业级开发)已经发生了翻天覆地的变化,所以我过去掌握的技能,已不再“风光”。所以,即便你是专家,你可能也会发现自己正在过时,不得不重头开始。
还有一件事:你不可能是全才(即:各个领域的专家)。这也就是说,你或许在某一技能上比张三优秀,但张三在另一技能上或许比你优秀。你不可能在任何方 面都比别人优秀或比不上别人。你总是能从他人身上学到东西。(更不能因为别人使用的技术和你不同而去攻击他人,只要别人不是一无是处,你就可以从他们那里 学到很多东西。正所谓,“三人行必有我师”。这也是《成为一名优秀程序员所需要知道的那些事》之一)。我曾经遇到过一些开发人员,他们总以为自己在全方面都比他人优秀似的,即便事实并非如此。
事实上,这通常就是区分新手的一种方法。不管是在线上还是线下,新手总是相信自己知道一切,并会至始至终地争辩。他们的争辩相当绝对,比如“这个总是 比那个要好”,或“这就是解决事情的唯一方法”等。专家则几乎不会那样做。他们知道,一切事情取决于具体情况(也就是“具体情况,具体分析”),开发人员 所掌握的技能,公司所选择的工具,公司政策,个人喜好等等。没有经验的开发人员(和普通人)一般都认为“世界是非白即黑”。而专家知道,世界还充满了灰色 区域,甚至还有其他大量颜色和色调。
如何成为一名专家
对于大多数你需要学习的技能,这里有四个步骤,以助你成为一名专家。在大多数情况下,你可以按照顺序完成如下步骤,也可以从上至下重复如下步骤:
1. 学习技能;
2. 实践技能;
3. 讨论技能;
4. 传授技能;
学习技能
在你掌握一门技能之前,你必须先学习相关理论。你可以通过书籍和教程,或课程教育,或综合前面这些方法来学习理论。
实践技能
一旦你掌握了技能相关理论,你需要在现实中运用该技能。通过实践,你会知道你所学的理论,哪些地方正确,哪些地方有误。当然了,你在大学中所学到的理论,通常在现实中并不奏效,或者根本不适合你所处的环境。
讨论技能
一旦你使用技能已有很长一段时间,并且发现自己能解决很多需要该技能的问题,那这时候你应该和其他经验人士讨论它了。讨论使用该技能的最佳方法,技能 相关理论的局限是什么,还可以增加什么东西等等。简而言之,讨论如何进一步推动该技能。(比如一个API,如何优化/改进它等。)
传授技能
向他人传授技能,无疑是完善自身技能的一种好办法。可能有很多事情只顾着做了,但并未考虑为什么要那样做。因为必须(向他人)解释你的方法,这会迫使你自己重新思索“为什么要做”和“做了什么”。
此外,你的技能上或许有些边边角角事从来都不需要掌握的。(比如,Web服务规范的边边角角)。因为要传授自己的技能,这迫使你也要掌握这些空白了,这会让你更上一层楼。