结束 Java、Python 之战,如何学习所有编程语言?
【编者按】编程语言之争不胜良久,从古老的 C 到 Java、Python、PHP 以及一些新兴语言,在数百种编程语言之间,排名本身已然打得火热,而许多开发者亦会争论于哪一种是最好的编程语言,哪一个是该入手的语言,没有休止。本文作者提出了一个核心观点 —— 编程语言的目的在于表达程序员的想法,由此展开了关于掌握所有编程语言的技巧分享。
“我应该从哪种编程语言开始学?”
许多初学者在开始学习编程时都会问上面这个问题。
“哪种编程语言最好?”
开发人员在获得实际的开发经验后会提出这个问题。
这种关于编程语言的问题可能会引起无休止的争论,而且你永远都得不到正确的答案。
相反,我想分享的是 —— 如何掌握学习一门新编程语言的技巧。我认为这个问题更重要。
对于熟练的程序员来说,学习新的编程应该很容易。对他们来说,仅通过三两天,甚至几个小时的学习就能用一种新的编程语言编写代码。更熟练的程序员只需看一眼手册,然后通过完成手头的任务来学习语言编程语言。
掌握学习“所有语言”的技能并不需要天赋,它需要掌握编程语言的核心知识并去实践。
当然,我们不需要学习所有种类的语言,但是学习更多的编程语言可以帮助我们接到任何任务时可以选择合适的编程语言。
如果编程语言是汽车……
世界上有成千上万种编程语言,其中只有大约 20 种被广泛应用于 IT 行业。
如果我们稍微挖掘一下,就会发现所有语言都有一些共同的特征。
以汽车为例,世界上有各种各样的汽车。有些车体积小,动力强劲;有些车体积大,速度慢。不同品牌的汽车的驾驶体验各不相同。
如果一个人知道如何开车,那么他就可以开这个品牌的大多数车,甚至是其他品牌的新车。
为什么?因为不同的汽车有许多共同之处,它们基本上都是由发动机和轮胎构成的。汽车的设计目的都是一样的: 把你送到目的地。
编程语言的目的是:表达程序员的想法。
为什么会有如此多的编程语言?
在计算机世界中,编程语言扮演着两种角色:
程序员用它们给机器下命令,告诉它们我们需要什么,得到我们想要的结果。
向其他程序员传达想法,分享我们的经验和愿景。
所以代码不仅是给程序员,也是给机器的“信息” 。这就涉及到编程语言设计和实现中的权衡。
这么多编程语言的主要原因如下:
硬件和计算理论不断发展。一般来说,随着硬件和计算机理论的发展,编程语言设计得更容易使用,表达能力更强。
计算机的应用领域非常广泛,相应的领域语言也应运而生。
不同的程序员有不同的设计方法和理念。
语言有不同种类的语法或特征,但本质上它们在形式上是相同的,它们都是图灵完备性语言。这意味着:所有的语言都可以用来实现任意的算法。
编程语言的基础
几乎每一种编程语言都包含这些元素,它们实际上都是关于“抽象”的:
数据类型和数据抽象
控制流和控制的抽象
低层次的抽象
特定领域的补充和抽象
我们能够掌握所有编程语言的原因是:语言的概念是有限的,下面列举出 15 个常用概念。
程序
面向对象
指针
递归
异常
静态类型
动态类型
类型推断
函数
垃圾回收
Continuation
宏和元编程
和设计原则一样,编程语言的概念往往是不变的。
语言设计师们互相借鉴思想和概念,用不同的实现方式来使用它们。所以有时候我们可能会说 PL_ C 是 PL_ A 和 PL_ B的儿子,PL 家谱是这样的:
理解这些概念不仅能帮助我们更快地学习一门语言,还能帮助我们写出更好的代码。例如,函数式编程语言与面向对象程序设计语言有着不同的编码风格和范式,如果你不理解它们之间的区别,那么在实践中,代码的“坏味道”将无法避免。
关注语言概念,而不是语法
如果我们想学习语言概念,该如何学习呢?
为了充分理解编程语言的概念,我们需要回答下面这些问题。
为什么要发明这个概念,需要解决什么目标问题,有什么好处和缺点,甚至它是如何实现的。
让我们以 GC (垃圾回收器)为例,第一个问题应该是什么是 GC?
在 Google 上快速搜索一下,我们就会重定向到 Wikipedia GC 页面。GC 是为了解决内存管理问题而发明的,它可以减少程序中的内存错误,我们不需要手动管理内存,因此用 GC 编写代码会更容易。
因为要分配和释放内存需要需要额外的代码,因此使用 GC 将会影响性能。当你使用 GC 编程语言时,请关注 GC 对性能的影响。
在一些实践之后,我们需要知道 GC 是如何工作的,它使用了什么算法?GC 实现有很多种,各有什么优缺点。
当你学习一门新的语言时,这是一个学习新的语言概念的好机会。
例如,如果 Ruby 是你学习的第一个面向对象语言,那么你就可以通过它来研究面向对象优缺点。当你学习另一种面向对象编程语言时,对加深对面向对象的理解就非常有帮助。
实现或创建一种编程语言
不要害怕,解释器和编译器只是一种特殊的程序。他们的输入就是你的代码,输出就是运行你的代码或者把代码编译成字节码或者二进制码。
实现或创建一种编程语言可以帮助你克服对编程语言深深的恐惧。这是学习所有编程语言的另一个秘密。
来源:f.hatena.ne.jp
如果编程语言的语法不复杂,那么实现一种语言工作量就不大。检查一下这个项目: 做一个 Lisp,任何语言都可以用来实现一个 Lisp。Lisp/Scheme 具有简洁的语法,易于解析,并广泛用于编程语言教学。
8cc 是一个 C 编程语言的编译器,如果你想编写一个编译器,这是一个很好的参考。
阅读编程语言实现的好书对你的学习也很有用:
《编程语言的本质》 是一本教科书,有许多种译本。
《编程语言语用学》也是一本不错的学习编程语言的知理论书籍。
学习一门新的编程语言的步骤
以“学习编程语言的概念”为目标,如果你遵循以下步骤,你的效率将大大提高:
了解这门语言的设计理念和一般语言特性
例如,如果你想学习 Ruby,那么让我们首先找到 Ruby 的特殊之处。
Ruby 是专注于简洁和生产率的一个动态的开源编程语言。它的语法非常简洁,易于阅读和编码。
嗯,让我们深入挖掘一下: http://www.ruby-lang.org/en/about/
在你开始学习之前,试着总结一下你希望理解的主要特征:
注重简单和生产力,代码很容易阅读。
需要有解释器。如果包含 GC(垃圾回收器),这意味着性能对于某些任务来说可能是个问题。
一切皆对象。它是一种带有面向对象的语言,甚至是“纯面向对象的”。
灵活性。我们甚至可以重新定义语言的许多部分。
了解语言最重要的特性,包括它的优点和缺点。当你开始使用这种新语言编写代码时,这将对你很有帮助,它为你提供了学习的路线图。
通过教程或书籍学习语法和实践
你需要掌握语言的基本部分,包括语法、基本 IO、调试工具、单元测试工具等。
如果你是一个新手,试着找一些权威的书籍。比如编程语言创造者写的书,或者在亚马逊上搜索带有该语言名称的书,可以找到评分很高的书。
请记住,在你还不是专家的时候,你最好自己编写代码,不要只懂复制代码。通过 exercism.io 来练习新的语言,有人会免费审查你的代码并给你一些建议,这很赞。
如果你是一个语言专家,只要找到这种语言的一些简单指南,甚至是这种语言的一些示例代码,就足够了。看看 learnxinyminutes.com。
用新语言阅读和编写更多代码
是时候用新的语言去编写一个项目了,以便更好地掌握相关的生态系统、工具或者图书馆的知识。你可以从一个简单的开始,比如一个猜数字的游戏,或者一个简单的书店系统,或者一个待办事项应用程序。初学者可以从 Github 上找到很多类似的项目。
了解更多语言实现的细节
你并不需要了解每种语言的技术细节。正如我在《成为一个程序员》中所说的,一个有抱负的程序员会对他们的语言的细节和实现感兴趣。有时,因为我们对语言实现细节了解不够多,很容易产生 Bug。
如何选择你的第一种编程语言?
根据目标和周围环境选择你的第一种编程语言:
你是否有一个特定的语言导师或者你需要在学校学习一门编程语言?
如果老师告诉你要学习 C语言还要做练习。这是一个很好学习 C 语言的机会。因为你有导师 (你的老师)和同学,在他们的帮助下学习编程语言就比较容易。
你的目标是什么?
如果你想构建一个 Web 应用程序,学习 JavaScript / Python / Ruby 是可以的。如果你想构建游戏,一个合适的选择是 C++。如果你的目标是处理数据,那么 Python/R 是一个不错的选择。如果你想创建一个 Android 应用程序,Java / Kotlin 就很适合你。
只要选择你选择的领域中最常用的语言。如果你不知道,请向有经验的开发人员寻求帮助。
你想申请一份需要特定语言的工作吗?
如果是这种情况,你需要学习上面列出的编程语言。
不要花太多时间选择第一种编程语言。快速进入入门,在你积累了更多的经验之后,如果你不喜欢或者你的工作领域发生了变化,转到另一个领域并不困难。
哪种编程语言是最好的?
这也取决于你所在的领域,每种语言都有各自的优缺点。没有适合所有任务的编程语言。如果它存在,我们只需要学习这一个,对不对?别忘了没有银弹。
因为程序员的口味各不相同,这就导致了几乎每个程序员都有自己偏爱的编程语言。有些人声称他们最喜欢的语言是最好的(心理学中的选择一致性原则)。请不要被他们愚弄。
就个人品味而言,我最喜欢的语言包括 C/Ruby/Lua/OCaml,我用它们开发起来效率很高。这可能并不适合你,你应该尝试不同的语言,从中找到你最喜欢的。
有人说,除非你了解 5 种以上的编程语言,否则不要说自己很懂。
K.lee Wikimedia
正如我在上面所说的那样,你不应该追求学习更多编程语言,你应该尝试从多个编程语言中提取通用的概念和设计原则。
如果你在日常工作中使用面向过程的编程语言,为什么不去学一门面向对象的语言呢?如果你使用的是动态类型的语言,为什么不学一门静态类型的语言呢?
以上这些是我对选择新的编程语言的一些建议。
原文:How To Learn All Programming Languages, YES! ALL!
链接:https://medium.com/swlh/how-to-learn-all-programming-languages-yes-all-c1d8651a9dab
译者:明明如月,知名互联网公司 Java 高级开发工程师,CSDN 博客专家。
本文为 CSDN 翻译,转载请注明来源出处。