阿拉丁和灯

Thoughts, stories and ideas.



程序员快速学习的方法


曾经看到一片文章:如何在3年的时间内成为顶级的Coder。这篇文章无疑有标题党的嫌疑。但是,在3年时间内成为顶级的Coder并非不可能,实际上,我认为努力加上方法得当的话,是很有可能的。这其中非常重要的一点,是要有快速高效的学习方法。下面说说我对这方面的思考和总结。

路线图

要想成为顶级的Coder,先要问什么样的人才能称为顶级的Coder?我对这个问题的回答如下:

  1. 基础要扎实
    基础扎实的程序员,对于新的技术有更好的理解力。因为很多时候,新技术的挑战在于其所要求的背景知识。比如举个例子,有两样貌似不相关的技术:MapReduce,异步编程的Promise概念,理解起来有一定的难度。但是实际上,这两个概念实际上都以一个技术为基础:函数式编程。真正理解了函数式编程,对于MapReduce和基于Promise的异步编程,都会更容易理解。那么什么是重要的基础知识?我认为是操作系统,数据结构,算法。举个例子,递归的概念是编程当中的一个基本概念,在很多地方都有应用。我在面试别人的时候,经常出的一道题是用递归和非递归两种方法实现斐波那契数列的计算。至少有三分之一的候选人答不出这道非常基本的题目。

  2. 知识面要广
    技术的发展一日千里,不与时俱进是非常危险的。危险是两方面的,一方面是对自己,另一方面是对项目。对自己就不用说了。对项目实际上也有危险,因为现在很多新的技术能够极大地减低开发的难度,提升开发的效率。如果一个人的知识面狭窄,陈旧,还会抱着以前的偏见,使用过时陈旧的技术,会降低开发的效率,拉长开发周期,并且降低代码的质量。

  3. 代码质量高
    对代码的质量是否有很高的要求,是区分程序员的一个重要标志。好的代码要完成三个目标:
    a 实现功能
    b 错误处理
    c 表达意图
    是否能清晰地意识到这三个目标,并且做到,是区分菜鸟程序员和顶级程序员的标志。所有程序员都能意识到a,大多数也都能意识到b,但能做到并做好的就不多了,能意识到c,并且能在做到a和b的同时,做好c的,就是一个好的程序员。除此之外,顶级的程序员对代码的整洁性也往往有要求,对于初级程序员来说,这方面的要求看起来有点形式主义,但顶级程序员知道,这绝对不是形式主义。

  4. 开发素养好
    程序的根本目的是满足业务需求。业务需求包括功能性和非功能性的。非功能性的比如吞吐量,可靠性,可管理性,等等。
    对于技术的追求,在实现项目的时候,必须以满足业务需求为前提。是业务需求主导了技术的选择,而不是相反。我把这归结为程序员的开发素养。真正素养好的程序员,不是出于炫技的目的去选择一项技术,而是出于项目的功能性和非功能性的需求,选择最合适的技术。

可以看到,上面这四个方向有各自具体的含义。要成为顶级的Coder,就要朝这四个方向努力。并且,要结合自身的情况,将这四个方向的要求具体化,确定自己在这些方面需要学习的东西。有了目标和计划,是提升的第一步。

快速学习的方法

目标有了,如何做到?关键在于快速学习的方法和学习的资源。

学习资源

搜索引擎
这个不用多说废话了,搜索引擎是我们的外脑,要用好它。我只想说两点,第一,用谷歌!不知道有多少次,用百度和bing.com搜索一个问题的答案,不得要领,一上谷歌就解决了。为了用谷歌,VPN是必备的,找到一个好用可靠的,经过时间检验的VPN,必要的话花一点钱。这会节省我们大量的时间。第二,掌握一些搜索的技巧,比如下面会讲到的,如何快速搜索一些特定类型的资料。又比如,想要搜索某个特定网站上的东西,比如stackoverflow.com上的,可以用 site: stackoverflow.com 这样的语法。这方面的技巧不要多,掌握一些主要的,关键时候用好它,就行了。

Alternativeto.net
这个网站列出了很多的技术和软件,然后对每个技术或者软件,会列出它的替代选择。技术之间的比较很难客观和全面。用互相可替代的程度作为一个变通的对技术进行相互比较的方法,实在是一个聪明的做法。在初步接触到一个领域的某项技术或者框架的时候,可以上这个网站看看,快速地了解这个领域还有哪些众所周知的更好的替代选择,是一个避免走弯路的好办法。

CheatSheet, 101, 架构图
英文里CheatSheet就是考试时候的小抄。这实际上是个好东西,小抄要做得好,就要用最小的篇幅把最有价值的东西写上去。这个实际上非常有助于快速了解一项技术。举个例子,对于Java程序员,想要快速了解Ruby这门语言,可以上网搜索"Ruby cheatsheet",可以得到很多的“小抄”,其中这份看上去就是一个非常不错的快速参考:Ruby Language Quickref.pdf (http://www.digilife.be/quickreferences/qrc/ruby%20language%20quickref.pdf)。搜索"Ruby 101", 也是类似的作用,101在英语里是初级概要知识的意思。对于软件,如果想快速了解其结构,可以搜索"xxx architecture",搜索架构图和架构介绍,也是起到快速获得关键信息的作用。

PluralSight.com
视频教学网站实际上是衡量一项技术的非常重要的一个指标。以技术的普及程度而言,lynda.com上的技术普及程度是最高的,基本上在lynda.com上有课程的技术,都是普及程度非常高的技术,比如Java, Ruby等。pluralsight.com的课程对应的技术,普及程度次之,但也是非常高的。如果一项技术在pluralsight上有对应的课程,基本可以说明这项技术已经成为主流,在项目中应用它不会有太大的风险。

除了lynda.com, pluralsight.com之外,coursera.org也是一个非常不错的免费的在线视频教学网站。与lynda.com和pluralsight.com不同的是,coursera.org是类似于大学里提供的课程,课题选择更多偏向于一个主题课程,而不是一项特别具体的技术,当然具体的技术也有,但常常会放在一个更大的背景下讲。比如Scala语言的发明人Martin Oderski,在coursera.org上就有关于Scala语言的课程,但课程是讲Functional programming language,顺带着讲Scala的。

所有的视频网站里面,我最推荐PluralSight.com。拿这个网站的口号来说,Courses for Hardcore programmers。里面的课程结构合理,对于程序员普遍都有的背景知识,不会过多废话,讲得东西都是你最想了解和最需要了解的。相比之下,lynda.com里面的编程类的课程,废话比较多,有些对于程序员来说常识性的东西都花了很多时间来讲,这个跟Lynda.com面向的是全社会的人员有很大关系。

PluralSight.com包含了两千多门课程,其中大部分质量不错。PluralSight的课程评分用五分制。一般来说,达到4.5分的课程质量就不错了。4.6-4.8的课程,可以说是很优秀的课程。两千多门课程里面,高质量的课程也很多,覆盖了各项主流技术。为了给大家一些直观的印象,这里列出一些我看过的非常不错的课程,供参考:

Topic 推荐指数 说明
Distributed version control system 5 讲解了Git的基础,本质,理解本质之后再理解Git不同于传统代码管理工具的一些特点,就事半功倍了
Docker deep dive 5 介绍Docker以及背后的容器技术,Docker的常用命令
Bootstrap 5 讲解Bootstrap。Bootstrap是一个非常优秀的前端展示框架,使用非常广泛,同时也是一个框架功能设计的经典案例。
AngularJS 5 前端MVC框架AngularJS。讲得不错
Functional program with Java 8 5 讲解Java 8中的Lamda表达式,更重要的是,讲解了函数式编程的思维方式,以及常见应用场景
Defensive coding 5 写出高质量代码的必修课
Dependency injection on ramp 5 什么是Dependency injection,要想了解Spring框架的本质,这篇课程强烈推荐



View or Post Comments