讨论一下学习编程的方法
2015年3月2日

今天是我跟大学在校刚刚学开发的朋友们说几句心里话,如果你已经是个成手的开发者了,那下面我说的内容可以都显得比较明显正常了。 核心点就是,把用书本串知识点改变到用 github 上的开源项目来串起知识点。

看书学习有它的短板

上学的时候,学习的目的是考试,考试就是按书上的内容考,所以看书学习挺正常。但是搞开发最终的目的是做成东西,目的不一样,手段当然也不一样了。我自己学开发的时候的经历就是,书上的内容一般会太多太细,很多知识点学了之后才发现自己的开发水平不够,所能做成的项目难度低,所以根本用不上大部分知识点。用不上那就是慢慢都忘了呗,可惜了!

有时候新手其实选书直接选得,不能说错,但是是有问题的,比如我刚学的时候,目标是成为一个 Linux 开发者,而不是 Linux 管理员。但是我选的书是 《鸟哥的 Linux 私房菜》,这本书其实是面向 Linux 系统管理员的。developer 和 system admin 其实是两份完全不同的工作。所以可想而知这本书里面很多内容其实是不适合我。后来我又找到了 《 The Linux Command Line 》 这本书。这个对路了,就是面向开发者的,但是全书四五百页,一下子都学吗?作为初学者的我其实也很难对内容有所取舍。

所以我也不是直接说就不要看书了,只是说看书要选合适的,比如我学习 http 的基础知识,看 《 http 下午茶 》 这本书就觉得很适合: 第一,它的定位是准确的,不是要把你培养成 http 专家,而只是互联网开发者需要的那些常用知识;第二,就是它比较薄,顺便说一句吧,如果你是初学者,但是你发现你在啃很大部头的书,恭喜你,你走错路了。

总之我的建议,大学生要实现一个思维转换了。不要以章节号,页码,和最后的考试大纲来串知识点了,而是要碎片式的学习,在动手中学习,我写过一篇博客 Learn by Making 讨论过这个话题。但是如果内容太零散也是很难掌握的,所以怎样做到碎而不散呢?答案就是今天要说的,用做开源项目的方式来串起看似零散的知识点。

github 是新的学习基地

今天主要讨论一下具体手段,看看用那些工具和资源来进行,以开源项目为糖葫芦竹签的,新型的互联网上的学习。

首先要先建立项目。举个例子,你要学习 web 开发,那你就可以自己建立一个纯粹以学习和跟他人共同学习为目的的小项目。规划一下,内容可以先不涉及后端代码,这样也自然少了服务器搭建的工作。

项目要达成的目标务必要最简单和有意思,比如你看到 http://www.codecademy.com/skills/make-a-website 这里达成的效果不错,所以你也很想达成相同的效果。那就可以定下项目名,比如叫 XiaoMingBlog 然后开始动手了。

issue 和 wiki

动手直接写代码,放到 github 上。遇到不会的问题时候就去开一个 github issue,例如 https://github.com/happypeter/onestep/issues/582 。比如你可能会开的一个 issue 是 《 如何设置图片尺寸和居中 》。这样一个 issue 开在这里,你就可以去 google 了,找到了相关资源就贴到这里,内容可能是 stackoverflow 的一个回复,可能是博客文章,或者 github 上人家的一个类似项目中现成的代码。issue 这里代码可以贴出来很好看的。但是也有可能是一本书,一套课程,但是这个时候再去学习这本可能比较厚的书就会有选择的能力了:凡是对我动手没帮助的东西都是可以忽略的。

issue 这里好就好在这是一个公开讨论的场所,你也可以邀请你的朋友来参加讨论,比如 @happypeter , any good idea? 。 issue 的最终命运是会被关闭的,因为里面讨论的内容很多备选答案是会最终放弃的,最佳答案只有一个。

所以 issue 中总结出来的精华部分最终就凝结在代码中了。比较适合总结成文字的,就放到 wiki 之中。有些知识点其实也不是这个项目特有的,是一些通用的内容,我会放到 edocs 项目中。