如何学习一门新的编程语言?
公众号/ AI 前线
作者 | Karl Broman
译者 | 谢丽
统计学家及其他数据科学家应该精通多门编程语言,使用最合适的语言解决手头的问题,比如,性能要求高的场景用 C++,交互式数据分析和图表用 R,操作数据文件用 Python 或 Ruby。
长期以来,我一直主张,统计学家(及其他数据科学家)应该精通多门编程语言。15 年前,我说过这样一句话,“性能要求高的场景用 C,交互式数据分析和图表用 R,操作数据文件用 Perl。”现在,我会用 C++ 替换 C,用 Python 或 Ruby 替换 Perl,但基本思想保持不变:使用最合适的语言解决手头的问题。
多说几句
很久以前我编写了 Perl 教程。我还计划编写 C 和 R 的教程,但是一直都抽不出时间,只是编写了资源页(参见 C 简介和 R 简介)。
我编写的 Perl 代码非常糟糕:“只读”,把数据文件从一种格式转换为另一种格式的一次性脚本。我更喜欢 Ruby,但我编写 Ruby 代码时需要大量地借助谷歌搜索。Python 更流行,因此,我向你推荐这门语言。(但是,我真得不喜欢处理 Python 中的正则表达式,而那好像又是我希望从那种语言获得的主要东西,因此,我坚持使用 Ruby 操作数据文件。)近来,考虑到全新的 tidyverse 开发,对于数据文件操作,单独使用 R 语言就可以解决。
然而,有时候,还是有问题需要你拿出看家本领。对于许多问题,我编写的最干净的 R 代码在速度上也比不上最凌乱的 C 或 C++ 代码。因此,为了能够完全地自给自足,我认为,你会希望自己有能力切换到更低级、更高效(计算,而不是编写代码)的语言。Julia 是许多人都提倡的方式,让一门语言既简单,又有很好的可读性,同时运行速度还快。但是,我仍然认为需要切换语言(性能要求高的场景用 C++,交互式数据分析和图表用 R,而对于数据文件处理,我还是倾向于切换到 Ruby)
有一段时间,Pjotr Prins 让我编写 D 代码,他现在还是这个主张。不用说,我曾经很高兴从 C 切换到 C++,从.C() 切换到 Rcpp. html 和 CSS。也许,我们还得加上 JavaScript 或者其他可以编译成 JavaScript 的语言。(我喜欢 CoffeeScript;事实上,CoffeeScript 可能是我当下最喜欢的语言。)
对我来说,还有 SQL 和 MongoDB。数据科学家需要习惯于访问规范的数据库。
现在,我正在努力学习 PureScript,但是我发现进展缓慢,因此,我绕道学了点 Haskell,以便对“纯粹的函数式语言”有个基本的了解。但是,我计划稍后再回到 PureScript。
无论如何,我还是得唠叨几句:我觉得,最好是学习多门编程语言,至于如何学习,我根据自己的学习经验提了一些可能有用的建议:
- 留出大量周期性的时间块;
- 买一本书,或者买下所有的书;
- 心里要有具体的目标 / 应用;
- 开发一个脚本,加上注释,说明你学到的关键语言特性;
- 强迫自己使用新技能。
学习一门新的编程语言需要投入时间并定期实践。真得,你需要 2 到 4 小时的时间块,如果你一个周不接触这门语言,那么就得花 30 分钟才能回到正轨。(你之前正在做什么?学到了什么?下一步想学什么?)为了回到正轨,你需要大量的几个小时,然后才能取得一点进步。
我建议找一本好书跟着学。实际上,我往往会买下所有的书。但你至少需要一本或两本。至于哪一本,那就看个人喜好了。我正在找给有编程经验的人写的书。但是,那本书是否适合我,主要取决于它使用了什么类型的例子。然后是写作风格和阐述质量。
例如,对于 Ruby,许多人推荐《Ruby 编程》,但就我个人而言,我觉得这本书的例子和主题顺序不大适合我。我更喜欢《Eloquent Ruby》,然后是《The Well-Grounded Rubyist》。
通常,我会从查找 O’Reilly 的出版物入手;它们一贯是好书。但实际上,我最喜欢的书是其他出版商出版的:(在我看来)对于一门特定语言,最好的书不是来自 O’Reilly。
如果你真想在学习一门编程语言时取得进步,那么你不能局限于书中的例子和练习,而是要开始创造性地使用这门语言解决自己的问题。也许你有一个特别不规范的数据文件需要解析整理。或者,你想要编写一个 Web 应用,提供本地公交时刻表。我喜欢慢慢地理解这门语言及其特性,然后利用它做一些实际的、真实的东西。
重要建议:在学习过程中,开发点脚本,加上注释及其他备注,说明你学到的各种语言特性。
首先,你需要记录设置各种语言工具(编译器 / 解释器、库,诸如此类)的详细信息以及如何保持最新。(这类事情乏味、痛苦,但很关键。因此,一旦你搞清楚了,就需要记录下来,以后就不用再做一次这样的事。)对此,你可以看下我的 GitHub 库 ProgrammingNotes,其中有各种备注。
但最重要的是,你需要一个可以快速浏览或搜索的非正式脚本,因为你会忘记下面这样的东西:
- 这门语言的函数如何定义?
- 用什么标记注释?
- 如何串接两个向量?
- 如何查找向量里的一个元素?
- 列表理解的语法是什么?
这些都在你买的书里,但是,在自己编写的简短备注里找东西要简单许多。例如,我做过一些:Python、 Ruby 和 JavaScript/CoffeeScript。
最后,如果你真想把一门新编程语言加入自己的工具箱,你就需要在现实生活中强迫自己使用它。
有一天你会说,“我应该使用 Ruby 来做。算了,用 Perl 我 15 分钟就做完了,而用 Ruby 我得花两个小时。”但是,你必须强迫自己使用这门新语言。短期来看,换回你熟悉的语言最容易,但是,如果你想要在一门新语言上取得进步,你就需要在日常实践中使用它,那并不简单,但会越来越简单。
最终,你的脑子里将会有 4 门或 5 门语言,不管哪种语言,你都会记不得如何定义一个函数。那时,你就酷毙了。
查看英文原文:
http://kbroman.org/blog/2018/03/16/learning-a-new-programming-language/