<commit_before>---
layout: post
title: 基于 GitHub 的敏捷学习方法之道与术
categories: [思考]
tags: [学习, GitHub, 成长, 敏捷, 知识]
published: True

---

> 「持续行动，持续反思，持续进步。」—— via. 敏捷学习宣言

## 前言

### 对时间的敬畏

> 需要好多年才能懂得，最好不是去震惊世界，而是要像易卜生所说的，生活在世界上。

我们都一样，渴望着建树功勋、改变世界，可是伴随着年岁的增长，却发现想要实现的梦想依然那么遥远，而时间却依然残酷得流逝着，不会仅仅因为「你」而发生丝毫的改变。如《奇特的一生》当中所言，我对时间始终充满着敬畏之心，最好的方式也不过是奢求时间能够跟自己做朋友，伴随着我这也许注定朴实无华的一生，共同成长。

在我们的一生所能做的事情里边儿，睡眠占去 1/3，此生只剩 2/3，除去非做不可的[基本生活维护成本](http://blog.jimmylv.info/2015-09-05-periodically-anxiety/#title0)过后，剩下的时间要么选择浪费而荒度此生，要么选择目标而奋力向前，让这一生不留遗憾。Follow your heart，你需要找到一些愿意为其付诸终身的「目标」，以这样的姿态「生活在这世界上」。

### 敏捷与个人成长

就像软件开发一样，一个人的成长也应该要有自己的方法论。人的一生若是顺风顺水一成不变的话，那未免太无趣了，正是由于世界的未知在等着我们去探索，不一样的经历才会让人感到惊喜和有趣。想做的事情永远都不会嫌多，就像柳比歇夫最开始是研究生物学的，却在科学的道路上越走越远，进而研究起了数学、物理、哲学，甚至于美学，而更关键的是，他在每一方面都做出了很大贡献并且留下了诸多著作。

时间充当着 Product Owner 的角色在不断着向你提出各种各样的需求，敏捷当中最重要的一大前提就是「拥抱变化」，而在「[记录时间这件小事儿](https://github.com/JimmyLv/jimmylv.github.io/issues/85)」里面我提到的 GTD 流程便可以用于处理这源源不断的需求，即收集、整理、执行、回顾，对应到敏捷当中的几大会议显然也可以由个人完成，自己就是自己的 IM & PM，当然也是 BA & Dev & QA。（当然不用担心人格分裂，😂）

## 实践之术

> 我都没想到写着写着怎么就把开头写成了鸡汤文，`[捂脸](./wechat/emoji.jpg)`。但是咧，如果说前面的讲的是「道」，那么接下来就会具体到基于 GitHub 的「术」，即各种实践。

首先呢，让我们从需求出发，从市面上来寻找一款符合敏捷的学习软件，别想了，当然是没有的。对于一名程序猿来说，**最理想的答案其实就是 GitHub**，作为全球最大的程序猿~~交友~~网站，GitHub 本身以及围绕 GitHub 的各种插件使得其项目管理能力其实远比你所能想象的厉害得多。

* 收集：需求无时无刻，无处不在，anywhere anytime
* 整理：as BA 即分析，Elaboration & Estimation & IPM => 确定 MVP & Efforts
* 执行：as Dev & QA，Developing & Testing & Review/Sign-Off
* 回顾：Retrospection，Introspection，持续反思，持续进步…

### 通过 GitHub Issues 收集需求

首先你可以给自己建一个 GitHub 仓库作为主页，比如我的 [JimmyLv/jimmylv.github.io: Agile Learning based on GitHub issues](https://github.com/JimmyLv/jimmylv.github.io) 其实最开始就是从[个人博客](http://blog.jimmylv.info/)的主仓库发展而来。那么，如何快速得收纳自己的想法呢？以解决问题为导向，当然就是有什么需求就直接给自己的 repo 建一个 issue 作为 Story Card，然后了却这个需求的最终形态就是 close 掉这个 Issue，比如我要写这篇文章就始于这个 issue：[基于 GitHub 的敏捷学习方法总结 · Issue #36 · JimmyLv/jimmylv.github.io](https://github.com/JimmyLv/jimmylv.github.io/issues/36)。

![GitHub README](//o7mw3gkkh.qnssl.com/images/2016/1480841415310.png)

#### GitHub issues 的进阶用法

与此同时，新建 issue 还有更高级的用法，也就是通过 [ISSUE_TEMPLATE](https://help.github.com/articles/creating-an-issue-template-for-your-repository/) 这样一个模板来新建某个 issue，从而更快地定位问题所在和解析自己的想法，最主要的是能够输出更具体的 TODOs，即下一步行动的具体内容，这个还会在后面详细解释的。

![New issue](//o7mw3gkkh.qnssl.com/images/2017/03/1489125677512.png)

- issue 和 issue 之间是可以通过 `#` 相互连接的，甚至可以跨仓库，被 reference 的 issue 也会出现在另外一边的 issue 里面；
- 而通过 `#!` 符号是可以在 comments 里面直接新建一个 issue 的，这在思维爆炸的时候来得特别爽快；
- 你还可以随意艾特你的小伙伴们 @linesh-simplicity @Yaowenjie ，互相监督、互相学习或者给出 Constructive Feedback 之类的，😂；
- 更甚至于，若是在 Intellij 里面关联了 GitHub，就可以在 git commit 信息里面直接看到你所要关联的 issues 列表了。

这种方式仿佛学习中的大脑，神经网络被连通了的感觉。

![Intellij & Issues](//o7mw3gkkh.qnssl.com/images/2016/1480844039076.png)

#### 移动端的解决方案

而在移动端则可以通过 [GitDo](http://gitdo.io/) 这个 App 来轻松新建和管理自己的 Issues，没错，就是有人把 GitHub issues 做成了一个 Todos 类 App，还做得很漂亮功能很完善。只可惜不知道这软件最近为啥被下降了，伤感，我就又重新把滴答清单（TickTick）作为自己的万能收集箱了，之后再把比较重要的、需要进一步追踪的事项添加到 GitHub issues 里面来。

![GitDo](https://cloud.githubusercontent.com/assets/4997466/20562832/b1916908-b1c0-11e6-9961-cb5d65ab893a.png)

### 整理你的 GitHub Issues

大胆地把 issues 作为你的个人需求列表吧，需要解决的问题可以大到做一个开源项目，或者小到读一本书、写一篇文章。对于比较大的需求，你还可以将其转化为 Epic 然后把拆分过后的小 issues 们加入到这个列表里面来。

![Epic](//o7mw3gkkh.qnssl.com/images/2016/1480845918534.png)

而 GitHub (with [ZenHub](https://www.zenhub.com/)) 强大的 issues 管理能力绝对会让你的迭代工作变得井井有条，使用 GitHub 新出的 [Projects](https://github.com/JimmyLv/jimmylv.github.io/projects/1) 特性或者使用 ZenHub 的 [Boards](https://github.com/JimmyLv/jimmylv.github.io/issues/100#boards?repos=13273392) 应该就可以让你瞬间有了日常敏捷工作的感觉了吧！

![ZenHub piepline](//o7mw3gkkh.qnssl.com/images/2016/1480844770670.png)

### 计划与执行具体任务

#### 制定迭代计划

首先呢，让我们来新建一个 [Milestone](https://github.com/JimmyLv/jimmylv.github.io/milestones?state=open) 来制定计划，也就是决定在一个 Iteration 里面你需要完成哪些 issues。在这里我所制定的阶段性计划周期为一个月，当然你也可以勤快一点以 2 周作为一个 Iteration，享受一下自己的计划要完不成了这个 Milestone 就要废了，没法向「时间」这个一生的朋友交付所有需求的快感吧，🙂

![Milestone](https://cloud.githubusercontent.com/assets/4997466/20562662/b6ccb2e8-b1bf-11e6-9702-755d137ab570.png)

当然咯，一般我会在月初做计划的时候给自己准备专门的时间来做 Elaboration，把 Backlog 里面的卡拖到 Rethink/Plan 这一列，然后经过分析和详细输出 TODOs 以及所对应的估点 points 之后便可以将其拖到 Ready For Todo 了，一般我给自己估的点数就是完成这件事情所需要的时间，一小时即对应一个 point。

![Iteration](//o7mw3gkkh.qnssl.com/images/2016/1480845577392.png)
<commit_msg>Fixed one wording<commit_after>---
layout: post
title: 基于 GitHub 的敏捷学习方法之道与术
categories: [思考]
tags: [学习, GitHub, 成长, 敏捷, 知识]
published: True

---

> 「持续行动，持续反思，持续进步。」—— via. 敏捷学习宣言

## 前言

### 对时间的敬畏

> 需要好多年才能懂得，最好不是去震惊世界，而是要像易卜生所说的，生活在世界上。

我们都一样，渴望着建树功勋、改变世界，可是伴随着年岁的增长，却发现想要实现的梦想依然那么遥远，而时间却依然残酷得流逝着，不会仅仅因为「你」而发生丝毫的改变。如《奇特的一生》当中所言，我对时间始终充满着敬畏之心，最好的方式也不过是奢求时间能够跟自己做朋友，伴随着我这也许注定朴实无华的一生，共同成长。

在我们的一生所能做的事情里边儿，睡眠占去 1/3，此生只剩 2/3，除去非做不可的[基本生活维护成本](http://blog.jimmylv.info/2015-09-05-periodically-anxiety/#title0)过后，剩下的时间要么选择浪费而荒度此生，要么选择目标而奋力向前，让这一生不留遗憾。Follow your heart，你需要找到一些愿意为其付诸终身的「目标」，以这样的姿态「生活在这世界上」。

### 敏捷与个人成长

就像软件开发一样，一个人的成长也应该要有自己的方法论。人的一生若是顺风顺水一成不变的话，那未免太无趣了，正是由于世界的未知在等着我们去探索，不一样的经历才会让人感到惊喜和有趣。想做的事情永远都不会嫌多，就像柳比歇夫最开始是研究生物学的，却在科学的道路上越走越远，进而研究起了数学、物理、哲学，甚至于美学，而更关键的是，他在每一方面都做出了很大贡献并且留下了诸多著作。

时间充当着 Product Owner 的角色在不断着向你提出各种各样的需求，敏捷当中最重要的一大前提就是「拥抱变化」，而在「[记录时间这件小事儿](https://github.com/JimmyLv/jimmylv.github.io/issues/85)」里面我提到的 GTD 流程便可以用于处理这源源不断的需求，即收集、整理、执行、回顾，对应到敏捷当中的几大会议显然也可以由个人完成，自己就是自己的 IM & PM，当然也是 BA & Dev & QA。（当然不用担心人格分裂，😂）

## 实践之术

> 我都没想到写着写着怎么就把开头写成了鸡汤文，`[捂脸](./wechat/emoji.jpg)`。但是咧，如果说前面的讲的是「道」，那么接下来就会具体到基于 GitHub 的「术」，即各种实践。

首先呢，让我们从需求出发，从市面上来寻找一款符合敏捷的学习软件，别想了，当然是没有的。对于一名程序猿来说，**最理想的答案其实就是 GitHub**，作为全球最大的程序猿~~交友~~网站，GitHub 本身以及围绕 GitHub 的各种插件使得其项目管理能力其实远比你所能想象的厉害得多。

* 收集：需求无时无刻，无处不在，anywhere anytime
* 整理：as BA 即分析，Elaboration & Estimation & IPM => 确定 MVP & Efforts
* 执行：as Dev & QA，Developing & Testing & Review/Sign-Off
* 回顾：Retrospection，Introspection，持续反思，持续进步…

### 通过 GitHub Issues 收集需求

首先你可以给自己建一个 GitHub 仓库作为主页，比如我的 [JimmyLv/jimmylv.github.io: Agile Learning based on GitHub issues](https://github.com/JimmyLv/jimmylv.github.io) 其实最开始就是从[个人博客](http://blog.jimmylv.info/)的主仓库发展而来。那么，如何快速得收纳自己的想法呢？以解决问题为导向，当然就是有什么需求就直接给自己的 repo 建一个 issue 作为 Story Card，然后了却这个需求的最终形态就是 close 掉这个 Issue，比如我要写这篇文章就始于这个 issue：[基于 GitHub 的敏捷学习方法总结 · Issue #36 · JimmyLv/jimmylv.github.io](https://github.com/JimmyLv/jimmylv.github.io/issues/36)。

![GitHub README](//o7mw3gkkh.qnssl.com/images/2016/1480841415310.png)

#### GitHub issues 的进阶用法

与此同时，新建 issue 还有更高级的用法，也就是通过 [ISSUE_TEMPLATE](https://help.github.com/articles/creating-an-issue-template-for-your-repository/) 这样一个模板来新建某个 issue，从而更快地定位问题所在和解析自己的想法，最主要的是能够输出更具体的 TODOs，即下一步行动的具体内容，这个还会在后面详细解释的。

![New issue](//o7mw3gkkh.qnssl.com/images/2017/03/1489125677512.png)

- issue 和 issue 之间是可以通过 `#` 相互连接的，甚至可以跨仓库，被 reference 的 issue 也会出现在另外一边的 issue 里面；
- 而通过 `#!` 符号是可以在 comments 里面直接新建一个 issue 的，这在思维爆炸的时候来得特别爽快；
- 你还可以随意艾特你的小伙伴们 @linesh-simplicity @Yaowenjie ，互相监督、互相学习或者给出 Constructive Feedback 之类的，😂；
- 更甚至于，若是在 Intellij 里面关联了 GitHub，就可以在 git commit 信息里面直接看到你所要关联的 issues 列表了。

这种方式仿佛学习中的大脑，神经网络被连通了的感觉。

![Intellij & Issues](//o7mw3gkkh.qnssl.com/images/2016/1480844039076.png)

#### 移动端的解决方案

而在移动端则可以通过 [GitDo](http://gitdo.io/) 这个 App 来轻松新建和管理自己的 Issues，没错，就是有人把 GitHub issues 做成了一个 Todos 类 App，还做得很漂亮功能很完善。只可惜不知道这软件最近为啥被下架了，伤感，我就又重新把滴答清单（TickTick）作为自己的万能收集箱了，之后再把比较重要的、需要进一步追踪的事项添加到 GitHub issues 里面来。

![GitDo](https://cloud.githubusercontent.com/assets/4997466/20562832/b1916908-b1c0-11e6-9961-cb5d65ab893a.png)

### 整理你的 GitHub Issues

大胆地把 issues 作为你的个人需求列表吧，需要解决的问题可以大到做一个开源项目，或者小到读一本书、写一篇文章。对于比较大的需求，你还可以将其转化为 Epic 然后把拆分过后的小 issues 们加入到这个列表里面来。

![Epic](//o7mw3gkkh.qnssl.com/images/2016/1480845918534.png)

而 GitHub (with [ZenHub](https://www.zenhub.com/)) 强大的 issues 管理能力绝对会让你的迭代工作变得井井有条，使用 GitHub 新出的 [Projects](https://github.com/JimmyLv/jimmylv.github.io/projects/1) 特性或者使用 ZenHub 的 [Boards](https://github.com/JimmyLv/jimmylv.github.io/issues/100#boards?repos=13273392) 应该就可以让你瞬间有了日常敏捷工作的感觉了吧！

![ZenHub piepline](//o7mw3gkkh.qnssl.com/images/2016/1480844770670.png)

### 计划与执行具体任务

#### 制定迭代计划

首先呢，让我们来新建一个 [Milestone](https://github.com/JimmyLv/jimmylv.github.io/milestones?state=open) 来制定计划，也就是决定在一个 Iteration 里面你需要完成哪些 issues。在这里我所制定的阶段性计划周期为一个月，当然你也可以勤快一点以 2 周作为一个 Iteration，享受一下自己的计划要完不成了这个 Milestone 就要废了，没法向「时间」这个一生的朋友交付所有需求的快感吧，🙂

![Milestone](https://cloud.githubusercontent.com/assets/4997466/20562662/b6ccb2e8-b1bf-11e6-9702-755d137ab570.png)

当然咯，一般我会在月初做计划的时候给自己准备专门的时间来做 Elaboration，把 Backlog 里面的卡拖到 Rethink/Plan 这一列，然后经过分析和详细输出 TODOs 以及所对应的估点 points 之后便可以将其拖到 Ready For Todo 了，一般我给自己估的点数就是完成这件事情所需要的时间，一小时即对应一个 point。

![Iteration](//o7mw3gkkh.qnssl.com/images/2016/1480845577392.png)

{'fraction_non_alphanumeric': 0.1297585886722377, 'fraction_numerical': 0.0510677808727948, 'mean_word_length': 7.837948717948718, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 11, 'https://': 20, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2140205', 'n_tokens_mistral': 6362, 'n_tokens_neox': 6662, 'n_words': 450}