如何学习一门程序语言
避免看到最后说我诓你,这篇其实应该是《我是如何学习一门程序语言的》。
对我而言,不同的语言,学习的方法似乎也不太一样。
最早的时候都是在学校里学的,比如 Fortran、C、C++、Java、OCaml 等。通过正式的课程去学习一门语言,方式会比较固定和统一,都是上课、做作业、以及编程作业。这种方式通常可以比较系统地了解语言各方面的特性,而实际实践还是要看各人的机遇和选择。所以有一些语言,上完课之后,却是很少再用了。
离开学校后,很多工作中再接触到的语言就属于自学了。总的说来有三点感触。
一是不要为了学习一门语言而学习。至少你知道自己在不远的将来有很大可能性会用再去学。因为学了一门语言而不去实践,除了对语言特性能有些了解,其实不会有什么用。因为很多东西肯定会忘掉。这有的时候和一门说话的语言一样。大学的时候觉得好玩学了日语和德语,然而从来没有真正的应用场景,所以都忘的差不多了。都不好意思跟别人说我学过。不过以后需要用的时候可能学起来还是比从头开始快些吧。
二是不同语言别人口中的学习的难度和你自己学起来觉得的难度会很不一样。原因就在于你已经熟悉掌握的语言其实是你的底子。比如一个已经熟悉 OO 编程的人,再学另一门 OO 语言就会相对轻松;一个已经熟悉函数式编程的人,再学习另一门函数式语言也会比从没接触过的人容易的多。
但这仅限于相对轻松。每门语言都还是有很多区别于同类语言的特性。还有很多语言,是综合了多个类型语言的特性,再做了不同的权衡。即使是看似语法很相近的语言,可能实际使用起来却又有很大的区别。一个众而周知的例子就是 C++ 和 Java。二者都是典型的 OO 语言,然而使用起来很多思维方式却是有着极大的差异。因此,学习一门语言很忌讳肤浅的觉得 “这个和我知道的 X 语言差不多”,然后想当然的在使用中套用一些 X 语言的思维。
三是因为工作时候学习语言通常都是边用边学。一方面,这比在学校时候能够学的更快,因为你有使用的场景,可以不断练习。而且周围很多高手可以讨论,还有别人的代码可以参考,更容易积累实战经验。而另一方面,直接上手没有系统学习很容易想当然,很容易以偏概全。这又必须在工作以外自己主动学习理论知识来弥补。
说几个我工作中学习语言的例子。
首先说 Scala。需要用 Scala 的时候,是一个别组的项目有特别紧的 Deadline,我因为一向比较 “手快” 且对业务逻辑比较熟,所以被借调过去帮忙。那时候我并没有学过 Scala,但是因为时间关系,必须立马上手。好在面向对象语言和函数式设计语言我都有比较好的底子。所以在已有代码库的基础上写一些新的函数,而不需要我去写架构代码,总的来说还是比较轻松的。