操练驱动学习:程序员如何高效学习新的编程语言

作为程序员或自动化测试工程师,如果您打算学习一门新的编程语言,那么找一本书,搭好开发环境,运行书中的例子来学习的效果究竟好不好呢?通过一年的实践,我发现了一种比这更好的方法。这种方法就是用各种不同的方式、不断地反复做同一个或不同的编程操练题目(code kata)。


比如bjdp.org在2014年1月10日在首信公司做的那个编程操练题目FizzBuzz,我本人半年之内已经反复做了不下20次。对于这同一个操练题目FizBuzz,我每一次操练的目的都会有所不同。


比如刚开始操练的时候,我练这个题目的主要目的是练习如何做测试先行的测试驱动开发;

后来就用此题目操练如何用验收测试驱动开发ATDD的框架FitNesse来开发;

随着学习ATDD的工具的不断深入,我又用这个题目操练ATDD的另两个框架Cucumber和Robot Framework;

我原本是Java程序员,等我开始学习C#的时候,我就用这个题目来练习C#;

等我开始学习设计模式时,我又用这个题目练习重构到责任链设计模式(Chain of Responsibility Design Pattern);

我把我操练的录屏放到网上,征求匠友的意见,有匠友反映,我做重构的步子太大,测试运行的不够频繁,于是我又开始重做这个题目,想尽办法把重构的步子迈得小一些,测试运行得多一些;

接下来我打算学习PHP,我将会使用这个题目来学习PHP。


我个人觉得这种方法之所以比照着书运行代码要好,是因为这种方法能让你真正地动脑筋,自己不断想出解决方法,并不断与以前的方法加以比较。你会更主动,更灵活,更能体悟出各种方法之间微妙的差异。书本固然重要,但不具备上述好处。


有匠友问:“不断做编程操练题目,这个的确很重要。那么编程操练是不是就要不断地做出东西来?”


我已经做了近一年的编程操练,个人体会编程操练的价值不在于做出东西,而是在做东西的过程中尝试各种方法来悟道。很多时候,我会用不同的方法、工具和编程语言反复做同一个编程操练的题目,每次做完的结果我并不太在意,但是做的过程中,我几乎每写一行代码就会往本地git库里提交一次(哪怕编译还未通过。当然我只有当编译和测试都运行通过后,才会push到远程的git库里),以保存操练的过程,便于我回顾开发过程和回退到旧版本的代码。


有匠友说:“编程操练是高見。不過現在我做項目, 加班到無日無天。”


我觉得作为一个对自己的未来负责任的程序员,即使再忙,也需要在无天无日的加班中,挤出时间来练兵。就好比打仗,如果一直不断地打下去,那就成了“巴丹死亡行军”了。军队除了打仗,更需要休整和练兵。程序员也如此。


有匠友问:“学习一门新语言,需不需要以一本书为主线,结合具体的题目学习呢?” 


我个人认为,还是以编程操练的题目为主线,遇到问题时再找编程语言和设计模式的书来读,会更快和更好一些。因为读书不需要读这本书的全部内容,只要让编程操练题目中的测试运行通过并达到了操练的目的(如重构到设计模式、练习了某种工具)就好了,所以会更快。更好的道理前面已经谈到了。


根据我自身的实践,以编程操练为主线,遇到问题再到书里找答案,直到编程操练测试通过和重构完成,用这种方法,我用一个月学会了C#,又用一个月学会了C++,现在计划再用一个月学会PHP(当然,这一个月大量时间还要干别的事情,学习编程语言需要挤时间)。虽然这时还达不到精通的水平,但是对付编程操练,我学到的内容就已经足够应付了。以后再随着做更多其他的编程操练,来深入学习这些编程语言。


而反观我以前通过读书来学习C++,因为20年的工作中从不使用C++,所以我用断断续续地看书来学习C++的方法,学了10多年还是没学会。现如今通过编程操练,在1个月内就把一个C++的编程操练题目的测试运行通过,并重构到Flyweight设计模式,这给了我极大的鼓舞。


对于我来说,只有你用这门新的编程语言,让一个编程操练的测试运行通过,并重构到整洁的代码或设计模式,这才叫学会了这门新语言。



操练驱动学习:程序员如何高效学习新的编程语言_第1张图片

你可能感兴趣的:(编程操练)