• 2015-11-29 更新:完善『工具-文档工具』,增加『工具-国际化』,调整『引擎』。
  • 2016-01-19 更新:增加培训类型和层层递进的培训进程。调整技能树。

这半年的时间我一直在带团队。

从4年前创业开始,我就了解到每个人的兴趣点,学习方式,工作方式和追求终究是不同的。作为 CTO 或者技术 Leader,你可以制定整个公司的技术架构,但无法影响每个人固有的思路。每个人都有自己的短板和长处,每个人都有自己的擅长点和禁区。有些人死守自己的领域不放,有些人则不知该如何成长。如果不能从最根本的层面去改变开发者,那么整个公司的技术方向最终一定会在每个开发者 小小翅膀的扇动 下偏离初始目标。

我从心理学、社会学和工程学中寻找方法,旁观这一切,参加这一切,推动这一切,改变这一切。有小成功,有大失败。我现在知道,对我的团队而言,深入了解每个人的特点和兴趣,根据具体情况制定每一个人(或一组人)的培训计划和成长线路,才是目前最适合我的方法。

但我一直觉得缺少一个工具,这个工具需要让整个团队知道自己应该如何努力,他们能通过这个工具找到自己的位置,并以当前位置作为一个起始点,向一个最近的目标奔去,顺着知识的脉络奔向一个个更远的目标,就如拿下一个个城池。在这个过程中,他们收获希望,得到成长,找到方向。

现在,这个工具已经基本成型了,我会不断改进它。

[TOC]

1. 目标

客户端技能树是包含了一整套客户端程序员的技术发展方向和知识点的树状信息点。根据目前的团队情况,受限于我自己的能力,技能树仅仅是面向 手机游戏客户端程序员 的。

我们使用客户端技能树这个工具来达成如下目标:

1.1 职级确定

  1. 在入职时根据技能树的掌握点来判断能力级别,确定职级。
  2. 指导职级提升。

1.2 持续培训

让程序员明确自己的学习目标,并有一套完整的培训系统来保证程序员能力的持续提升。

1.3 熟悉开发框架和工具

每个人对现有的开发框架的理解程度并不相同,我使用技能树来规范每一个知识点。确保每一个人对重要的知识点的理解达到相同的程度。

1.4 兴(ji)趣(xue)培养

若没有兴趣,程序员不可能持续提高自己的能力,也不可能持续高强度的产出。

2. 维度

2.1 兴趣组

根据程序员自己的兴趣和特点分配兴趣组。兴趣组是与项目组平行的单位,一个人同时只能处于一个兴趣组,但允许根据自己的兴趣调整兴趣组。调整兴趣组之前,必须对前兴趣组中得到的技能进行评估。

2.2 技能点

技能树上包含的所有技能点,都可以被选择。一旦选择了一个方向的技能点,就必须将与这个技术点关联的同一树枝的所有技能点修炼到 熟悉 级别才能去往其他树枝。

2.3 成长链

技能点的起始选择决定了成长链。兴趣组的选择决定了成长链。程序员个人能力的高低影响了成长链。

2.4 技能掌握程度

我把对技能点的掌握情况分成下面5个级别:

  1. 知道
    听说过这门技术的名称,知道相关概念;
  2. 了解
    知道这个技术是如何工作的,知道具体流程,没有进行过完整的操作,或仅进行过部分测试;
  3. 熟悉
    可以使用这门技术制作出完整的产品;
  4. 掌握
    了解技术的每个细节,被问到这门技术时,可以使用简洁的语言概述其梗概,陈述其优缺点(5分钟);也可以使用复杂的语言描述其细节(1小时);
  5. 精通
    知道这门技术是如何被实现出来的,了解这门技术的所有周边技术。

技能树质量核准基于学习者的知识掌握程度。学习者在自己选择的成长链中,对于每个知识点都应该至少达到 熟悉 程度,对于重要的知识点必须达到 掌握 程度。对于 精通 这个级别,很难有一个确切的范畴,必须在 掌握 的基础上不断深挖。不要轻言 精通 ,你 掌握 得越多,就发现自己 知道 得越少。与我而言,精通的技能有3、4个吧,比如 吃饭饭,睡觉觉,打豆豆 (我不是豆豆)。

当然,如果你 正在找工作 ,在简历上可以稍稍夸张一点,比如这个:

  • 精通汇编、C/C++、Linux网络编程、JAVA EE
  • 精通Perl、Bash、Python等脚本语言
  • 精通Windows驱动开发、单片机开发
  • 精通网站开发、HTML、CSS3、JavaScript、PHP
  • 精通游戏开发、cocos2d-x、Unity
  • 精通 App 开发、iOS开发、安卓开发。

2.5 程序员水平分级

What Level Programmer Are You? 这文章将程序员的级别分成了10个级别(神不是一个级别,而是个信仰)。对于程序员来说,应该了解自己处于什么级别。

  • Level 1,阅读和键入
  • Level 2,脚本小子
  • Level 3,图书管理员
  • Level 4,“对象.方法”实践者
  • Level 5,多范式实践者
  • Level 6,初级构架师
  • Level 7,资深构架师
  • Level 8,诠释者
  • Level 9,函数式编程者
  • Level 10,面向语言设计师
  • 神级,计算机科学家

在我看来,大部分程序员都处于 Level 3 图书管理员 级别,也就是 “API 程序员” 的级别。糟糕的是许多人认为这是最终级别。多数程序员无法升级并不是因为本身的能力问题,而是看待问题的方式: 优秀的程序员和一般的程序员差别在哪?

上面文章的中文翻译:程序员水平分级,你属于哪一级?

3. 方法

我设计了一套完善的方法支持技能树的实施。

3.1 质量控制系统

要保证每个开发者对技能点的理解都达到相同的高度,必须严格确保技能点的实施质量,以及培训的质量。设计中有这样几个级别来控制质量:

name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
digraph qualitycontrol {

graph[label="质量控制与级别提升"]
gatekeeper[label="守门员\n(Gatekeeper)",shape="tripleoctagon"]
collaborator[label="合作者\n(Collaborator)",shape="doubleoctagon"]
executor[label="执行者\n(Executor)",shape="octagon"]
student[label="学习者\n(Student)",shape="circle"]

gatekeeper -> collaborator[label="把关"]
collaborator -> executor[label="指定"]
executor -> student[label="培训和执行"]

student -> executor -> collaborator -> gatekeeper[style="dashed",taillabel="提升"]
}

Graphviz chart draft_1-qualitycontrol-0.png

3.1.1 守门员(Gatekeeper)

守门员是培训质量和代码质量的最终把关者,整个技能树的实施质量取决于守门员的能力。整个系统设置 1~3 个守门员。

3.1.2 合作者(Collaborator)

在技能树繁茂的枝叶(知识领域)中,不是所有的人都能对整个体系完整深入地进行了解。在团队的所有的程序员中,总有人对某些枝叶特别熟悉,这些人就是合作者。

合作者是某个领域的专家,他们需要根据技能树中的枝叶制定这个领域的培训计划,需要审核具体领域实施过程的代码,并保证代码的质量,保证培训计划的完整深入。

3.1.3 执行者(Executor)

执行者可以是合作者,也可以由合作者来指定。执行者负责具体的代码编写和培训授课。合作者负责执行者的培训计划的质量。合作者是执行者的导师,执行者是合作者的接班人。

在技能树的实施过程中,执行者负责具体的培训授课,以及具体技能点的质量监控,是整个技能树实施中的 最大受益者 ,是整个技能树实施过程中 成长最快的人

3.1.4 学习者(Student)

在一个技能点的实施过程中,学习者需要面对培训做出反馈,将培训中学习到的知识用于工作中。学习者是整个技能树实施的 最直接的受益者

学习者的身份不是绝对的。在某个知识领域的学习者,可能是另一个知识领域的执行者、合作者,甚至守门员。这取决于学习者的 成长链

3.2 培训和执行

技能掌握和 Level 提升需要完善的培训计划和强大的执行力。培训计划的制定流程如下:

  1. 守门员确定合作者的知识领域;
  2. 合作者基于现有项目选择开始点;
  3. 合作者选择执行者,共同制定详细的培训文案和计划;
  4. 在执行开始之前,使用培训来统一执行标准,由执行者进行培训;
  5. 在执行阶段,执行者、合作者需要通过 Code review 和其他方式确保执行效果;
  6. 合作者确定该领域培训成功,总结会议;
  7. 进入该知识领域中的下一个技能点,继续上述流程。

对于技能点的知识领域的选择,必须遵循以下三个原则:

  1. 尽量在现有正在进行的项目中选择培训内容,确定计划起始点。现有项目的框架、功能、公用库、流程等等都可以起始点;
  2. 若1不满足,则应考虑现有项目的开发方向,基于现有项目的升级版本确定计划的起始点;
  3. 若2不满足,则起始点选择必须基于可实际操作的项目,不允许空中楼阁,不允许只谈方法没有实战;不允许试验性的无意义项目;所有选择的项目必须有实际意义;选择的项目,要么可以直接作为一个新项目的起点,要么可以 作为旧项目升级的方向。

3.3 培训类型

技能树的培训分为三类:

3.3.1 所有开发者都需要掌握的

例如 markdown 和 sphinx 这类培训。这类技能非常简单和容易掌握,而且在今后的工作甚至生活中,可以为每个开发者带来好处。这类培训会安排详细的练习;

3.3.2 所有人都需要了解,但不需要完全掌握的

程序员分为两种,一种喜欢偷懒,偏爱使用各种工具或者自己开发工具偷懒,另一种则喜欢实现功能,按部就班地开发。

cmake 这类培训就是能让这两种程序员都达到自己目的的培训。

对于第一种程序员,听完课程之后就会自行去搜索更深的信息,进行了解;而对于第二种程序员,培训需要达到的效果是他在下次看到 CMakeLists.txt 的时候不发怵,碰到 CMake 错误的时候能知道怎么找到相关信息解决即可。这类培训不会安排练习,或者安排不强制的练习。

3.3.3 所有开发者都要严格熟悉的

这就是和项目的开发流程、开发框架相关的内容。对于这些内容,许多开发者并不熟悉,由于没有统一的培训,程序员们完全是按照自己的本能在开发,这导致了代码风格不统一,代码质量不一致,重复早轮子等许多问题。这部分的培训,是和 入职培训 类似的内容,目的就在于解决上面提到的问题。

lerna 框架的系列培训,就属于这类培训。这类培训会严格安排联系并检查,保证学习者对这些内容的完全掌握。

3.4 层层递进的培训进程

当学习者的水平并不在同一个层级的时候,技能树培训系统只能进行 “浅尝即止” 的培训。只有将所有学习者的水平都拉高到平均值之后,才可能进行更深入的内容培训。到那个时候,培训不应该是 “大锅饭” 式的,而是可能多个主题同时开讲。到那个时候,每个学习者也都会了解了自己的特点,确定了自己的成长链,并安排好了自己的成长方向。

3.5 现有范例

在 HTML5 Game 项目中,我对上面的执行流程做了一次完整的实践。

  1. 作为守门员/合作者/执行者,面对大家对 git 操作不熟悉,对 Code Review 流程不理解的现状,我制定了这样的培训计划:在开发 HTML5 Game 这个实际项目时,学习使用 Git Flow 流程以及严格执行 Code Review;
  2. 在 HTML5 Game 项目开发组会议中,培训 Git Flow 流程,规定每个 Feature 若有2个以上的开发者,每次推送提交必须互相 Review ,推送到 develop 分支则必须给我 Review ;
  3. 在实际的开发阶段,严格按照 Git Flow 和 Code Review 流程执行;
  4. 执行期间碰到的问题,在每次项目会议上进行补充培训。

这个实践的结果是成功的,所有人都能感到代码质量的提升。有一位成员中途转到了其他项目,他主动在转到的项目中推广了这套流程。这说明学习者们对这套流程是认同的,对流程整体是清晰的。

4. 技能树

这个技能树的完成度为 87.53% 。主干不会有太大变化了, 需要补充的是枝叶。

技能树是 SVG 图像,若无法显示请换用 Chrome/Firefox/Safari

在查看 SVG 大图的条件下,部分技能点是拥有链接的(手型指针)。

查看大图

Game Client Skill Tree

(全文完)

留言

2015-11-13
次访问