本文转载自公众号“读芯术”(ID:AI_Discovery)
学习一种新的编程语言就像学一门新的语言。相信许多学习两门或多门语言的朋友都会认同,在双语或多语言间转换难免令人混淆。
例如,我的母语是英语,在学校里参加了沉浸式法语课程。这一方面使我的英法双语都达到了十分流利的水平,一方面也对我英语的使用造成了意想不到的效果。
很长一段时间中,我都会在许多单词末尾加上“E”,或是在数字后面加上美元符号(32$而不是$32),这些要求都只存在于法语当中,而非英语。经过一段时间的练习,我终于不再混淆,现在能够英法双语无缝切换了。
然而,这种情况又一次发生了——我试图从C#和Java 转换到Python。大学时,我所有的课程都围绕着C#这样严谨的编程语言展开。如今我准备进军数据科学,现在正在学习Python。
对于喜欢有条理有组织的事物的人来说,Python简直是一个噩梦。对我而言,分号、花括号和类型变量严重不足,就好像我正在学习一门新语言,而它与我的母语(C#)截然不同。
学习相似的编程语言(比如C#,Java和JavaScript)就像学习几种相似的语言。比如,因为我会法语,所以学习意大利语、葡萄牙语、西班牙语这些相似的语言也会比较容易。但我目前所掌握的语言却无助于学习编程语言(Python),因为它们在语义上完全不同,就像我会法语也无助于我学习冰岛语或普通话。
要想熟练掌握多种编程语言,你需要用到一些掌握多种自然语言时的基本知识和技巧。
首先学习静态类型和句法特定的语言。
几乎每篇标题为“我应该先学习哪种编程语言?”的文章都认为Python是最适合初学者的编程语言。我同意Python句法简单,结构灵活,适合入门,但却无法学到一些后期必要的编程基础知识。因此,我要提的建议似乎听起来很不合理:首先学习静态类型和句法特定的语言。
与其学习温和的入门级编程语言,不如学容错率极低的编程语言,一旦漏掉分号就会立马出错,一旦数据类型错误就会停止运行。
-
静态类型的语言
静态类型的语言(例如C#和Java)需要将数据类型分配给它们的变量。数据类型包括字符串、整数和布尔值等等。变量在初始化时必须与所分配的数据类型绑定,并且不能更改,否则运行前代码将会出错。
动态类型化的语言(例如Python)则无需在变量初始化时分配数据类型,而是在程序编译并运行后,再检查变量类型是否正确。
通过学习静态类型变量,学习者将对以后需要使用的数据类型有一个基本的了解。例如,JavaScript是一种简单易懂的编程语言,能轻松结合整数和字符串。
但如果不了解数据类型,就可能在程序出错时遇到问题。通过严格的学习和对数据类型的深入了解,就能在学习带变量的动态类型语言时省去不少麻烦,从而即时更改数据类型。此外,先学静态类型的语言有助于增强编码过程的逻辑性。
-
语法特定的语言
学习新的自然语言时,首先要学习字母,然后学习单词、句子结构、标点符号和语法。学习编程语言的过程也是类似的,因为每种语言都有特定的语法,必须使用它才能让代码正常工作。换句话说,每种编程语言都有特别的遣词造句、形成段落的方式。
有些语言(例如Java和C#)的语法非常具体,哪怕只少了一个分号(通常位于代码行末尾,类似于句子末尾的句号,放在句子的末尾以表示句子结束),都会导致无法运行。而有些语言(例如Python)则几乎没有硬性的语法规则。例如,与C#相比,Python中需要用到的分号和花括号都相对较少。
先学语法特定的编程语言有助于充分了解写代码时需要用到的结构,比如缩进结构、代码行必须以分号结尾、函数要加花括号等。这能使写出的代码更简单易懂,条理清晰,方便维护调试。而且,其还可以提供一个写代码的模板,方便在学习其他语法不那么严谨的编程语言时使用。
总之,先掌握严格的规则,将来定会收获回报。
熟练掌握第一语言
如果世界上每种语言都懂一点,却没有一种能说得流利,那你将会很难生存。既没有庞大的词汇量,也无法理解别人的话,甚至无法使用谷歌翻译与来自异国的人交流,最后只会使双方困惑不已。
编程语言也是如此。与其蜻蜓点水地学习很多种语言,却全都浅尝辄止,不如熟练掌握初学的那门语言,或是专攻一门。这并不是说任何人都必须先精通一种编程语言,然后才能开始学习另一种。但在尝试学习新语言之前,要对先一种语言的编程概念有深刻的了解。
为什么呢?学习一种语言的代码基础时,可以假设另一种语言大致相同。例如,每种编程语言中的if/else的作用都相同,唯一的不同就在于怎么表示它。例如,C#中的if / else必须位于花括号中,而Python中的if / else没有花括号,而是用冒号和缩进来分隔。但根本上说,if / else的句式在两种语言中的作用相同。
就像用母语说“你好”和“再见”一样。一旦理解了含义,明白了如何使用,就可以学会用多种不同的语言说“你好”和“再见”。这几个词在不同的语言中代表相同的含义,唯一的区别就是写法不同。
通过了解编程语言是单级还是多级、有无特定的变量命名法,或是否要求目标导向型结构,学习者可以更加熟练地掌握第一语言以及后来学习的其他语言。精通一种语言后,就能够越来越快地了解语言之间的细微差别。
编码不要带“口音”
用自然语言交流时,即使别人口音很重,通常我们也能理解。例如,虽然我说法语口音很重,但法国人也能听懂。这是因为我遵循了法语的惯例,所以即使句子结构弯弯绕绕或单词念错,他们也能理解我想要传达的内容。
要掌握一门新的编程语言,不能把它当作一门“已经会了的语言”来进行编码,否则很可能事与愿违,或者效率极低。
我就曾掉进过这样的陷阱。大学时我最出色的项目以Angular作为系统前端,我当时很熟悉JavaScript,我知道Angular与JavaScript相似,于是尝试套用JavaScript的方法,用Angular编码。
糟糕的是,这种“带口音”的编码成果欠佳,这可能是不了解Angular的规则所致。我的代码全部用Angular编写,但却带着浓重的JavaScript“口音”。不要和我犯一样的错——遵循新语言的规则,不要带“口音”编码。
只有使自己沉浸在新语言的环境中,强迫自己理解所有特殊规则,才能正确使用新语言进行编码。这样就能在掌握多种语言的同时不带“口音”。
例如,如果一个英语母语者决定速成五种新语言,最终他也许能说俄语、意大利语、斯瓦希里语、意第绪语和阿拉伯语,但出口都带着浓厚的英语口音和习惯。相反,如果去学习俄语讲话的习惯,那么俄语母语者就能听懂。其他语言也是如此。如果用典型的英语句式说斯瓦希里语,那肯尼亚人可能会听不懂。
花些时间阅读编程语言的文献,去感受某种语言的习惯。这不仅有助于掌握这门语言,也使你在团队项目中更有价值,让其他也会这门语言的人对你抱有期待。
最初你可能不得不强迫自己不带“口音”地编码,但当你能流畅切换两种语言之时,就是努力得到回报之日。
本文概述了我在学习多种编程语言过程中的一些窍门。这些小诀窍对我帮助很大,但为了尽善尽美,这里也要提出几个更常规的方法:
- 阅读相关语言的文献、阅读源代码、把用来做例子的代码用新语言写出来、列一份有关新语言的备忘录,通过这些方法让自己完全沉浸在所学语言的环境中。
- 利用各种资源(例如Youtube、Medium和StackOverflow)学习编码语言的教程。要更勇于尝试,换句话说,学习新的编程语言需要主动学习。
- 用所学语言把以前做过的项目再做一次(哪怕是特别简单的项目),并尽可能发挥它的用处。
- 参加黑客马拉松、卡格尔比赛等需要用到所学语言的编程比赛。
- 和熟知这门语言的人合作。我总是在搭档编程项目中受益匪浅。倾听他们在写代码时的思考过程,为了解编程语言的运作方式和原理提供许多启发。
我能给出的最好的建议是持之以恒。学习一门新的语言很难,编程语言也不例外。不要因为有点难学就放弃这门语言。所幸网上有很多资源可供使用,能让学习过程更轻松自然一些。
最重要的是,学习新语言时要尽可能利用手边的设备和工具。长此以往,不仅能帮助你更好地理解这门语言,也能让你成为更好的开发人员或数据科学家。