Teaser Image

mindwind

十日画一水,五日画一石




程序员所处的这个技术行业,技术的变化很快,已经超过了我们的学习速度。所以程序员们多多少少都有些技能焦虑症,看着新技术此起彼伏,难免不忧虑。

从开始学习程序,到工作十来年,不断地学过很多技能,而也有不少技能已经被淘汰在时间的旅程中。有时不免幻想要是学会什么屠龙之技,从此高枕无忧,该多好?但终究只是幻想,哪里又有什么屠龙之技呢。现有的技能终将会过时,然后就开始想技能的本质是什么?不停学习技能又是为了什么?

技能

技能,是为了从事某项工作或活动所需要学习的专门知识与训练的成果。比如,熟练掌握一门外语或编程语言,都需要一段不短的时间来进行学习和练习,最终成为你习得的一种工具,然后你就能用这门工具来做一些其他有价值的事情。

就以编程这门技能来说,为了掌握这样一种技能,你先要问自己需要用这样的技能来做什么?也许你想给自己建个个人网站,也许你只是想要解决工作上的一个问题,但面临的却是一门新的编程语言。这样的目标是非常具体的,你需要用新学习的技能(工具)来解决当下面临的问题。这样的目标更适合采用深度路线学习方式(这里借用了算法里的深度查找概念,另外对应的一种是广度查找)。

因为一门主流编程语言及其周边的生态是非常庞大的,为了解决一个非常具体的问题,采用深度查找方式学习特定的问题解决办法是一种捷径。这属于痛点驱动式方法,让你快速排除障碍,解决问题。而非先拿一本该语言的书来,从头读到尾。一般技术书籍的组织方式都是按主题的相关性来编排的,系统体系性很强,却不是按你解决问题需要知道的内容来组织的。所以,技术书籍更适合于在你解决问题的过程用来参考,而非直接用于学习。完整的读技术书籍能增长你的知识,但却无法习得技能,编程这样的技能还需要大量的练习。

反过来,另一种情况,面临一种新兴技术。比如,近来火热的人工智能与机器学习,你不是需要解决一个具体问题,而是对这类新兴技术方向做评估、判断和决策。那么学习的方式又完全不同,这时采用广度路线学习更合适。

《软技能》一书的作者曾在书中分享过他的一个十步学习法:

  1. 了解全局
  2. 确定范围
  3. 定义目标
  4. 寻找资源
  5. 学习计划
  6. 筛选资源
  7. 开始学习,浅尝辄止
  8. 动手操作,边玩边学
  9. 全面掌握,学以致用
  10. 乐为人师,融汇贯通

这个方法和我自己在实践中养成的习惯基本一致。在深度路线学习中,对全局、范围、目标的定向更聚焦,因此寻找,筛选的资源会更窄,学习计划的迭代期更短。很快就走完了前 6 步,并进入动手实践反复迭代的过程中,直到把问题解决。

而在广度路线的学习中,前 6 步会花去大量的时间,因为这时你面临的问题其实是对新技术领域边界的探索。这就像以前玩《魔兽》游戏中,先去把地图全开了,看清楚了全貌。后面再进军时就能选择最优路径,避免了瞎摸索。这个类比中不太恰当的是,游戏中开地图实际挺简单的,但现实的技术领域中,地图全开基本是不太现实的,一是地图实在太大,二是地图本身也在演变中。只能说尽可能在前期的探索中,所开的地图范围覆盖更广的需要去解决的问题领域。

早年从 Basic 语言开始走深度路线学习,后来又切换到 C 从深度到广度都走了一程,再后来为了做一些 C/S 架构的项目学了 Delphi/Object Pascal,解决了项目问题。B/S 架构开始兴起,又开始写起了 JSP,然后走到了 Java 上来。经过了如此多艰辛的学习路线,曾经掌握过不少技能,但如今除了 Java 其他的都淘汰的差不多了。我相信未来即使 Java 相关的技能也终将过时,那么未来还能剩下什么?

能力

在汉语中容易把能力和技能混为一谈,在英语中,技能对应的词是 Skill,而能力对应的是 Ability。如果说技能是你习得的一种工具,那么能力就是你运用工具的思考和行为方式,它是你做成一件事并取得成果的品质。

程序员爱说自己是手艺人,靠手艺总能吃口饭。五百年前,鞋匠也是手艺人,但进入工业革命后,制鞋基本就由机器取代了。制鞋是一门技能,它的过时用了几百年时间,但程序技能的过时周期却要短得多,每几年你的程序技能实际就大幅更新换代了。

Java 语言已有二十多年历史了,语言本身也更新了多代了,而围绕语言的生态更不知换代了多少次了,而且新的东西还在不断的冒出。这也是程序员焦心的地方,我们既怕更新的太快 —— 自己学不过来,也怕更新的太慢 —— 生命力衰退,指不定哪天就退出了历史舞台,让自己过往的学习投资全部作废。

对程序员来说,技能是消耗品,能力才是伴随技能新陈代谢,更新换代的固定资产。如何识别一个程序员的能力呢?招聘面试时,有人喜欢问这个特性知道不?那个特性了解吗?这种算法能写一个不?即使都知道也能写出来,但这仅仅能说明掌握了某些知识,连是否具备合适的技能都判断不了。进一步通过更细节的历史工作与项目经验,可以得到一些技能的间接证明和能力的模糊感觉,但对能力的判定,特定时间内的面试手段非常有限。

更容易识别能力的方式其实是公开的可跟踪记录,比如,曾在《测定程序员的代码基因》一文中提过一种公开可跟踪记录 —— GitHub 的代码简历,就能证明你的代码能力。另外,之所以鼓励程序员都应该写写技术博客,这也算是一种公开可跟踪记录,记录了你在成长的不同阶段面临的问题,你的思考和行为方式,这就是能力成长记录。当然,如果这些都没有,那么职位(title)也算一种吧,业界也是认的,不过仅限于中高层。

程序员能够写程序,只能算是技能过关吧,而能写好程序,才算具备了程序员的基本能力。而架构师,如其名,架构显然不是一种技能,而是一种能力,综合应用多种技能的能力。架构师也许不像在工程师阶段写大量代码,但实际是需要具备代码能力的,但仅此一项能力远远不足。在我自己的经验中,至少还需要沟通、管理和领导能力。所以,虽然挂着架构师的 title 好几年了,但实际对架构师的本质也就是最近一年多才领悟到。

从领悟到做到,还有一段长长的路要走。当旧日的技能都已过时,沉淀下来的能力,将助你开发新的技能,而一切能力与技能之母,又叫元能力,自当是学习能力。

虽有俗语说:技多不压身,但实际很多技能是有保养成本的,编程技能就是一种,特别是和特定技术有关的编程技能。当时代发展,技能过时,除了既往不恋,我们还能做什么呢?

把技能比作工具,我想喻作剑。金庸老爷子笔下有一“剑魔”,一生用剑经历「利剑无意」,「软剑无常」,「重剑无锋」,「木剑无俦」,「无剑无招」,最终剑已埋冢,人却求败。

此刻瞬间

有时候,这里写下的文字,就是另一种意义的「冢」。


写点文字,画点画儿,记录成长瞬间。
微信公众号「瞬息之间」,既然遇见,不如一起成长。