我是如何学习git的–谈谈互联网时代的学习方式

我是10年初开始和朋友一起做一个项目的时候开始使用git来作为我们的代码仓库进行远程合作的。当时主要是先看了一下维基百科等了解了一下基本的概念,和svn的区别等。记得当时joelonsoftware刚好有些文章介绍git这样的分布式的代码仓库,Joel当时也是刚开始学习了解Git,Mercurial这样的分布式代码仓库,写了些文章。一开始因为要在自己的vps上建git bare仓库作为合作的主仓库,朋友在git方面比较有经验,跟他了解了一下使用git的合作编程的常用的流程。在自己服务器上搭了个git bare仓库。后来又在github和bitbucket上有更多的基于git基础上团队协作,不断积累自己对git的理解和实际操作经验。实际经验积累的比较多了以后,发现有一些写的比较好的能够清晰掌握git概念模型的文章如阮一峰写的几篇,再找出自己多年的笔记,做了个整体的总结,算是把git的比较清晰的概念模型建立起来了。

整个学习掌握git的过程,我没有去上什么培训班,没有专门找什么老师来教我,也没有去找什么所谓的教科书,甚至没有怎么专门的学习git。除了一开始大概集中看了下git的基本概念和介绍,和最后做了个整体的回顾总结,从没有花大块的时间专门去学git,都是在实际工作过程中逐渐的积累自己的经验和理解。

试想如果还是以传统的学校课堂的方式去学习,要等到什么时候才会有git的标准教材出来?等到有git的标准教材出来,有git课堂出来,恐怕也是git快过时的时候了,就好像以前我们在学校里总是在学习已经过时的东西一样。其实即使有了标准的教科书了,教你的老师就一定有大量的实际经验吗?缺乏大量的实际经验的“老师”,真的理解他所教的内容吗?大量的技术的涌现,你在学习这些新的技术的时候,还没有教科书,你如何学习?很多人脱离了学校学习环境后面对生活中需要学习的大量的知识,似乎总是手足无措,要回到学校课堂式的那种学习才感觉好像抓住了一根拐杖似的。

这里我试着以学习git为例,试着跟大家探索自学的方式。其实我相信很多人在学习这些新技术时,都大致采取类似的方式,不管是有意识还是无意识。但我想通过学习git这个具体的例子,展示一下这个自学过程的最基本的一些步骤,并对其过程从几个方面做个分析,帮助大家形成对于自学的更为理性的认识和理解,可以在以后的学习中更系统有效的运用这些方法。

首先是通过维基百科或者官方网站这样的站点区获得初步的概念和理解。这里如果是在学习自己感兴趣领域的人,基本上很快就能领会基本的概念是怎么回事,就可以通过动手实践去积累具体的经验了。

我们知道文字阅读是比较消耗时间的。很多时候我们读了大段的文字,还是不清楚作者所指。这对作者的文字表达其实是有比较高的要求的。如果初期发现的材料质量不高(对于比较新的技术,这是经常会碰到的事情),那么与其花太多的时间阅读材料,不如尽早的去接触实物去实际操作,可以省去很多的时间。这时一般都是找些很快就能够上手的实例或者项目,完成一些简单的操作,对一些基本的概念建立起感性认识。比如git是分布式的代码仓库。对这个分布式的理解,可以很快的通过一些具体的操作获得真实的感受。这样的感性的经验是需要你在实践中去不断积累的。而你要获得对于某个领域的知识的理解,你就需要从多个方面多个层次去不断积累感性的经验。

通过网上查询或者参与网上社区,基本就可以找到当前比较好的学习资料。这些好的学习资料,恐怕很多学校里的老师都不知晓。如果是比较新的技术,暂时还缺乏好的文档或者教程,也没有关系,并不阻碍自己的不断学习进步。在实际工作中不断的解决问题,不断从网上找到片段式的好的信息或者答案(比如stackoverflow就是编程领域一个很好的资源,只要查到的是stackoverflow上的信息,尤其是很多人点赞的,应该是相当不错的资源)。

实际经验和好的资料积累到一定阶段,就可以进行整体的回顾和总结。可以自己快速的提炼出整体的知识。积累到什么程度时可以进行整体的回顾和总结了,你是可以感觉得到的。在那个时候,只要投入不多的时间做个回顾,你就可以获得整体上的理解,靠这个整体的理解和融会贯通,你不再需要更多的记忆就可以快速的运用知识在各种场合里。

在整个过程中,如果我需要弄清楚某一个概念,我就去找概念性的资源。如果我需要更多的实践,我就在实践中去积累。这是很灵活的学习,不浪费时间的学习。所以这里对自我的感觉是至关重要的。我们必须能够清楚的感知自己是处在哪一个学习的阶段,在每一个阶段需要什么样的知识,是概念性的还是实践性的感性的知识。什么时候需要通过比较长的时间去点滴的积累,什么时候需要在短时间内大量的投入快速取得整体的突破。并且知道在互联网上哪里有你需要的合适的资源。比如知道维基百科可以是很可靠的基本概念的资源。Stackoverflow是获得具体的点滴的实践知识的优秀的资源。互联网已经提供了比较快的获得各种资源的方式,如果可以很好的自我感知,就可以快速灵活恰当的去利用互联网的资源,快速的学习。

这样的学习方式,依靠自己的感知,利用丰富的互联网资源进行快速高效自由的学习。

最后自己总结出来的知识,包括那些在学习过程中收集的好的资料和信息以及多个层面多个角度的理解,是可以和大家进行分享的。如果有好的分享这些整理过的来自学习实践的活的知识的社区,那又成为其他学习者的可以利用的优秀的学习资源。并且这样的知识是活的知识,是随着人们的学习进展和不断的贡献得到不断的更新不断改进提高的知识,而不像传统的教材,难以更新或者更新极慢。同时这样的知识是立体的,可以有丰富的示例,项目,问题,博客,视频等等(比如这个学习领域软件编程或者关于教育)。

上面总结的这个基于兴趣的自学,大家可以看到其实是非常简单的。其要点主要是基于兴趣,在生活和工作中不断积累,感知,和积累到一定阶段后的总结。很多人总是感觉脱离学校后的自学很茫然无从下手,其实只是因为学校学习带给人们的错误学习观念太深了,一旦脱离就感觉诚惶诚恐失去依靠。我们需要不断通过自学实践去摆脱那些错误的学习观念,恢复自己其实在孩童时期就有的天然的学习能力。大家需要明确的知道:基于兴趣的自学才是真正的学习!抓住以上的要点,如果再有好的网络工具,帮助大家在生活工作中及时收集积累好的资料和个人领悟,人们可以很方便的进行基于兴趣的自学。

下面我们来看看,和传统的学校学习比较,这样的基于兴趣的自学除了兴趣驱动外,有什么特征。

第一:逐层次逐点的学习

从来不需要传统学校学习那样的大块的专门时间的学习。任何学科,都可以逐层次的逐个点的慢慢的积累,这样就可以时刻和实践结合,利用互联网,不断的去积累。不光传统学校那样呆在一个封闭的环境里连续学习十几年是完全没有必要的,就是连续学习一年甚至一个月都是没有必要的。最多几天(比如学习生物),就应该可以完成一个层次的学习。

利用互联网进行逐层逐点的学习,需要注意对所找到的材料的价值的判断。如果当前找到的资料比较费解,花很长的时间所获得的收获也很少,那很可能是资料的质量不太高。那就大胆的先放着。尤其当你可以通过实践去增进对其的理解的,或者你暂时的工作并不需要对其的大量的运用和深度的掌握的时候。(这些应该是绝大多数的情况。)你是有着多种的方式去增进你对该领域知识的理解的,并不是一定要专攻教科书,毕其功于一役。很多时候,你甚至是依靠在比较长的时间段里的偶尔冒出的灵感或领悟来不断增进你的理解。

其实在我学习git的过程中,早就发现网上有免费的git书,但当时觉得质量不够好,至少阅读比较费时间,涉及的细节太多。所以只是暂时收藏了放着,等到以后需要的时候才去具体的阅读。很多资料都是这样的,碰到了但是暂时不太适合你当前的知识程度,就可以先收集起来,标注一下,等到以后需要的时候再去集中阅读。

对于git的学习,我自然不敢说我现在就全部学透彻了。要学透彻了,恐怕就要看源码了。以我以前做过硬件的经验来看,只有到硬件那个层面,才算真的清楚什么是什么。但是即使不算对git的知识全部透彻了,我想这样的知识状态并没有什么问题。知道自己哪些还不清楚,时刻等待着机会能够去更深入的了解,而不用受限于传统学校教育的观念,似乎学习就必须一次打破砂锅问到底,追根问底才行。其实以我们的现在的科学知识所达到的深度,难道就已经对这个世界知根知底了吗?在新的实践中,我们会不断发现过去理论的局限性,发现必须在更深的层面去重新认识和理解。所以,大家在学习中就放心的浅尝则止,不求甚解吧。暂时放下书本是没有关系的,人的认识一定是要和实践结合的,根据实践的经验去反思总结来逐步增加自己对世界的认识。其实我们个人对所处社会和文化的认识,不也是在大量实际经验的基础上进行反思总结的结果吗?

更何况人的一生需要学习的东西很多,你完全应该根据自己当前的兴趣和需求等去感觉要在当前的这个知识领域深入多少。自学的关键就是要去把握当前自己的学习需求和相关理解力跟当前资源或项目之间平衡。比如说软件编程就是一个很大的学习领域,过去我根据自己的兴趣主要专注的在软件工程,对象化编程,数据库设计等方面,对算法和性能相对关注的比较少。但近几年,随着在软件工程等领域的知识的逐渐成熟,自然更多的开始关心算法和性能等方面。但是我其他一些朋友,可能从一开始就更关注在算法和性能方面。如果你喜欢某一个领域,希望自己在这个领域能够有杰出的能力,你必然需要学习很多的东西。如何结合自己的兴趣和实际的境遇去平衡自己的学习,逐层的推进自己的知识和技能,就是你所需要的重要的能力。

第二:时刻与实践的结合。

当然也正是因为可以逐层逐点的学习,才有可能时刻不脱离实践。对事物形成理解力是很重要的。学习就是去建立那种理解力。要形成理解力,你就需要足够的空间和时间。需要大量的实践去获得感性的体验和认识。需要在一段比较长的时间里去从各个层面各个角度去丰富你对这个领域的理解。需要不断的回到这个知识领域。这些,只有在生活中的自学才能够帮你做到。

因为时刻与实践的结合跟上面的逐层次逐点的学习是相辅相成的,我们这里不再多讲。

需要说明的是我们并不是要完全否定学校学习的方式,我们只是在找各种情况下的最快的达到学习目的的方法。当然学校学习过于僵化,并且在绝大多数情况下是极其浪费时间的学习方式。更大的问题是这种僵化的学习方式往往变成人们观念里的唯一的学习方式,而使人丧生了自我感知的能力,这直接导致人们学习能力的丧失。

当然取决于你的能力和实际的情况,你可能会一上来就花很多时间把git完全搞清楚。如果你觉得那样你学得更快,没有问题。如上所述,我们并不是要否定其他的学习方式,只是说大家应该清楚其它的选择,以及知道何时应该用其他的方法更快速的前进。只要不是只有一种学习方法,只要你能够基于兴趣去学习,不断的去感知,去利用各种资源快速的学习,那就是好的。

我想澄清这些后,大家可以摆脱传统学校学习观念的束缚,认识到其实平时在使用的自学的方式就是真正的学习,即使自己以前只是潜意识的松散的(甚至抱着负疚感的,好像自己不是在真正学习一样)在运用,从而开始真正自由的学习。

以上讲的还只是对于一个具体的技术的学习。这些对于很多程序员来说,因为他们平时需要大量的学习新的知识,所以多少都会有些自学的经验。另外,对于学习敏捷编程这样的比较大块的东西,实际上也是完全可以通过互联网来自学的。

我在2003年读研究生上软件工程这门课的时候,当时的教材主要介绍的还是CMMI类的软件工程方法,因为我对软件工程很感兴趣,就在网上自己找相关的资料信息,接触到了敏捷编程。那时候敏捷编程刚提出来没有几年,许多人都不知道。但是通过我的查询阅读,以及不断的扩展性查询相关的知识,不光对敏捷编程运动里的人物和他们的许多文章有阅读,还把interactive computing, Christopher Alexander等都挖出来了,是个不断思考不断阅读的过程,对敏捷编程发展的整体的状况,背景,来源,具体实践等等都弄得比较清楚,结合自己长期对软件的兴趣去思考,自然能够比较深的理解其本质的含义。此后多年来在软件工程领域的实践,经历了各种不同的项目和不同的软件环境,在十多年的时间里把自己对于敏捷编程的原则和具体实施有了很深的理解有全面的把握和整体的感觉。而且这些学习,实际上是跟我对软件本质的兴趣是一致的,是和更广阔的人文学习不可分割的,甚至是和管理的经验息息相关的。缺乏这些方面的兴趣,是很难深入的理解敏捷编程的。

这里重复一下,敏捷编程的学习,我没有上任何敏捷编程的课,没有接受任何敏捷编程的培训,完全是通过互联网上的学习和实际工作的积累,不断的感觉和总结,才形成了自己的知识。我相信自己在敏捷编程方面的知识可以超过任何一个敏捷培训师。最后加上这句不是为了自夸,而是为了说明基于兴趣的自学才是真正的学习之道。而互联网资源的丰富,已经使得这种基于兴趣的自学可以自由自然的开展。在不久的未来,这也必然成为大众主流的学习方式。

同时大家也可以从敏捷编程的学习看到,一个知识领域是跟其他相当广泛的领域的知识和理解相关的。缺乏其他领域的广泛学习,敏捷也是无法去深入的。传统的学校学习是无法囊括这样的学习的。但是互联网时代的学习可以为这样的学习提供合适的工具,让其显现出来。

为了帮助大家更好的看清楚过去和未来之间的联系,我们可以再比较一下这种基于兴趣的自学和传统学校式学习的区别。我们看到基于兴趣的自学基本上是一种连续性的学习,而传统学校式学习有着严重的断裂,太多的我们过去学习的东西已经接不上了。比如我们在学校里花费这么多时间学习的教科书上的内容,都已经尘封在久远的记忆里去了。我现在仍然在生活中学习许多的医学知识,过去大学里学习的很多生物的知识能够起到一个很好的底子,我也经常上网去查找某器官或者组织的解剖图或者比较底层的系统的知识来帮助自己对实践中积累的知识有更好的理解。不过目前的互联网数字化进程的程度,还不能找到生物方面比较丰富的数字化的内容. 而要去找以前的教材已经是不太可能或者过于麻烦了。但我相信随着数字化进程的深入,不久一定会有很多更好的系统的生物知识(可以是图片甚至三维动画)在网上可以很快的找到。每个人需要的时候就可以找到某一张解剖图或某一个层面的系统知识进行学习,结合自己的实践经验形成自己的对于整体知识的理解。也就是说即使对于生物或者医学这样的领域知识,也是可以利用互联网结合自己的生活来进行逐层次逐点的学习。

所以我相信,未来一定是这样的学习。旧的基于学校课堂的学习模式早已经不适用于我们这个时代了。大量新知识的涌现,呼唤新的学习方式。大家只要广泛的参与到自学中去,不断总结自己的经验,并设计相应的软件工具帮助自己和他人的自学,我们就可以逐渐的创造出未来的主流的学习方式。

希望在以后大家想要学习某个知识时,不是首先想到去进什么学校,上什么课,或者找某某老师来讲学。而是首先动起手来,找到合适的资源和项目,开始在这个领域的知识积累。

附上git学习的WikiNotehttp://91biji.com/wiki/index.cgi/Git

This entry was posted in Speeches, Usage Demo. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


eight − 3 =

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>