发布于 2026-01-06 8 阅读
0

选择编程语言

选择编程语言

概括

我最近在BigThink网站上发现了两个关于“每个人都应该掌握的五种编程语言”的视频。您可以通过以下链接找到这两个视频:

第一段视频中, Perl语言的创建者、计算机程序员拉里·沃尔首先提出了一个非常重要的观点。他认为,这个问题的答案很大程度上取决于时代背景和语境。几年前行之有效的方法,在现在或未来未必适用。随后,他列出了他认为每个人都应该掌握的五种编程语言,具体如下:

  • Javascript
  • Java
  • 哈斯克尔
  • C
  • Perl

第二个视频中,计算机程序员比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup,C++编程语言的设计者和实现者)开篇就发表了一番掷地有声的言论。比雅尼说:

“如果只会一种语言,就不应该自称为专业人士。”

在视频的剩余部分,比雅恩直奔主题,提名了以下5种他认为你应该掌握的计算机编程语言:

  • C++
  • Java
  • Python
  • 函数式编程语言(没有具体说明任何内容)
  • 高性能计算编程语言(未作具体说明)

如果您想发表意见,我创建了一个调查问卷,您可以提名您最喜欢的 5 种编程语言。此调查纯属娱乐,允许匿名参与。您提交选择后即可立即看到当前结果。如果您感兴趣,请点击此处访问调查问卷

下一节我将详细介绍“了解”一门编程语言的含义。

编辑(2018-03-21)- 修正了函数式编程部分中关于副作用的不准确解释


“了解”编程语言

我认为有必要提供一些背景信息,并阐述我对“掌握”一门编程语言的理解。这只是我个人的观点,因此我的想法并非绝对正确,也并非适用于所有编程语言。

下面我列出一些我认为是“掌握”编程语言的基石概念:

  • 螺母和螺栓

我所说的“基础”,指的是编程语言运行的核心特性和机制。这些特性与使用库和框架无关,而是语言最纯粹的形式。更具体地说,我指的是编译、类型系统、内存管理、结构、循环、求值机制、变量、作用域和闭包等等。这些“基础”是编程语言的基石,只有牢牢掌握如何使用和应用这些基石,才能有效地使用这门语言。这是每个人学习一门新语言的起点,也是我认为最容易的部分。有些人可能觉得,一旦掌握了“基础”,就等于掌握了这门语言。但对我来说,这仅仅是开始,只是冰山一角。

  • 图书馆

大多数编程语言都自带一套核心库。这些库是可重用的代码片段,可以共享、采用、扩展并应用于各种编程问题。通常,可供选择的库有成百上千个。第三方和开源项目的兴起使得这种情况尤为普遍。要了解与某种编程语言相关的所有库是不可能的,但熟悉尽可能多的库仍然是一个好习惯。这需要大量的时间和精力。

  • 框架

我经常听到“库”和“框架”这两个词被混用。然而,在我看来,框架的含义远比简单的库要广泛得多。框架通常是为了简化跨应用架构多层级的开发而创建的。库可以轻松地添加、删除或替换,而框架则是架构的固有组成部分,难以移除或更改。框架规模庞大,需要投入更多时间才能完全理解和应用。而且通常情况下,当你刚刚掌握一个框架时,新的框架就会出现并取而代之,你又不得不从头开始。

  • 设计

高效编程很大程度上取决于高效设计。而编程语言的设计往往决定了我们如何使用该语言设计系统。好的设计是系统长期“有效”与最终失败的关键区别。一种在一种编程语言中有效的设计未必适用于另一种编程语言。再次强调,只有通过时间和经验的积累,才能确定哪些设计有效,哪些设计无效。此外,不同的编程语言会涌现出不同的设计模式。这很大程度上是因为某些编程语言本质上是命令式的,而另一些则是函数式的。正如我之前提到的,每种编程语言都有其局限性。例如,令许多人失望的是,Go 编程语言目前不支持“泛型”。因此,使用 Go 语言时,需要采用与 C#/Java(支持泛型)不同的设计。在为现实世界设计程序时,总需要权衡取舍,而每种编程语言的权衡取舍都不尽相同。

  • 应用与实践

每种编程语言都有其自身的一套良好和不良实践。了解这些都至关重要。每种语言也都有一些细微的差别和“陷阱”,需要加以注意。正是这种实践经验才能真正决定你是否掌握一门编程语言。只有通过不断地使用编程语言并将其应用于实际场景,才能真正理解这门语言的精髓。

正如大家所见(我相信很多人都知道),学习一门编程语言并非易事。对我而言,随着时间的推移,编写越来越复杂的程序变得越来越难。但学习一门新的编程语言时,还存在一个有趣的“小”问题,那就是时间。时间无法缩短,经验也无法缩短。要“掌握”一门编程语言,需要投入大量时间去积累足够的经验,才能精通这门语言。我拥有大约15年的编程经验,曾使用过C++、Java、C#、JavaScript和SQL。我可以坦诚地说,我仍然觉得自己没有“掌握”这些语言。但这正是编程的魅力所在:不断学习,不断进步。

下一节我将深入探讨一些我认为你应该了解的编程语言。不过,从本节的内容来看,你可能已经察觉到我的暗示:我认为一个人不可能“精通”五种编程语言。但我仍然认为我们应该尝试,因为这能让我们成为更好的思考者,从而成为更优秀的程序员。


我认为你应该了解的 6 种编程语言

看完“Big Think”的视频后,我开始思考:对于任何从事编程或对编程感兴趣的人来说,我认为最应该掌握的五种编程语言是什么?仔细思考后,我决定推荐六种。

在回答这个价值百万美元的问题之前,我想先介绍一下我的工作背景,因为这确实会影响我的选择。过去15年里,我主要在三大行业工作过:金融服务(银行和保险)、医疗服务以及在线游戏(博彩)和体育博彩行业(我目前仍在从事这方面的工作)。我负责设计和构建的应用始终涉及系统的三个主要方面,具体如下:

  • 数据库

如果没有某种形式的长期持久数据存储,就无法构建应用程序。经验告诉我,应用程序会不断更迭,但数据却永存。它是系统中唯一一种往往比其他所有东西都更长久的软件资产。

  • 前端

有数据的地方,就需要能够轻松地查看、存储、检索和管理这些数据。因此,我发现数据库和前端应用程序之间通常存在“一对多”的关系。我的意思是,每个数据库都可能有多个应用程序与之交互。我构建过的前端应用程序类型涉及使用多种不同的编程语言。例如,我通常会使用一套语言来构建原生应用程序,而使用另一套语言来构建 Web 应用程序。

  • 后端

我很少需要创建简单的 CRUD(创建、读取、更新和删除)应用程序。通常情况下,系统内部不同流程的运行都由业务规则来规范。有些业务规则非常复杂,需要创建多种不同的领域模型,并涉及与数据库和服务(例如 API)的集成。我经常需要通过 API 公开领域模型。同样,某些编程语言在这方面比其他语言更胜一筹。

基于我的背景和经验,我列出了我认为值得了解或学习的六种编程语言。以下排名不分先后:

1. Javascript

如今感觉 JavaScript 无处不在,事实也的确如此。它不再局限于客户端开发,而是发展成为一种可以用于服务器端的语言。只需浏览一下招聘网站和各种博客,就能意识到 JavaScript 将会长期存在。这总是让我想起阿特伍德定律

“任何可以用JavaScript编写的应用程序,最终都会用JavaScript编写。”

事实上,几乎所有工作都需要具备一定的 JavaScript 知识。JavaScript 语言本身很容易上手,但随着学习的深入,它也会变得越来越复杂。JavaScript 语言充满了微妙的差别,即使是最有经验的 JavaScript 开发人员也可能被这些差别所迷惑。

对我来说,掌握 JavaScript 与掌握一种可以轻松转译成 JavaScript 的语言密不可分。如果你正在构建一个大型 JavaScript 代码库并希望提高可维护性,那么学习这样一种语言就很有必要了。我个人比较喜欢TypeScript,它是 JavaScript 的超集。此外,还有其他一些 JavaScript 的替代方案,例如:

  • CoffeeScript ——CoffeeScript 是一种可以转译成 JavaScript 的编程语言。它添加了受 Ruby、Python 和 Haskell 启发而来的语法糖,旨在增强 JavaScript 的简洁性和可读性。

  • Elm ——Elm 是一种领域特定编程语言,用于以声明式方式创建基于 Web 浏览器的图形用户界面。Elm 采用纯函数式编程,其开发重点在于可用性、性能和健壮性。

还有一个名为Flow的类型检查器,可以与 JavaScript 一起使用。不过目前来看,它的普及程度远不及 TypeScript。

2. 面向对象编程(OOP)语言

大学时,我主修分布式计算,主要编程语言是Java。虽然我也用C++和一种不太常见的编程语言Eiffel写过不少代码,但Java始终是我的最爱。学习Java确实让我能够轻松适应其他编程语言。要说我对Java编程语言唯一不满的地方,那就是“已检查异常”。而且,无论它们在技术上有什么优点,你都无法改变我的看法。

我最终把大部分时间都花在了 C# 编程语言上。十多年来,我一直把 C# 作为我的主要开发语言。对我来说,C# 最大的缺点是它从来都不是开源的,也不是跨平台的。但值得庆幸的是,近年来这种情况已经发生了改变,我现在很愉快地在 Linux 操作系统上开发 C# 应用程序。奇怪的是,最近 JavaScript 语言发生了如此大的变化,以至于我编写 JavaScript 代码时,常常感觉就像在编写 C# 代码一样。例如,最近 JavaScript 添加了 async/await 特性后,我立刻感到如鱼得水,因为我多年来一直在使用非常类似的模式在 C# 中编写多线程异步程序。不过我必须承认,我并不喜欢在 JavaScript 语言中引入“面向类”的概念。

所以,你觉得应该学 C#、Java 还是 C++ 等等呢?我个人觉得其实没那么重要,但选一种就好。就像Bjarne Stroustrup在上面的视频里提到的那样,这些都是一类语言,掌握其中一种就能帮助你更好地理解其他语言。从我的个人经历来看,我一开始学的是 Java 和 C++,但最终主要用的是 JavaScript 和 C#。

3. Python

Python已经存在很长时间了。它有时被称为脚本语言,但我更愿意称它为通用编程语言。最近,大约在2017/2018年,它获得了广泛的应用。谈到数据科学,Python几乎是绕不开的话题。当然,R语言也是不错的选择,但就目前而言,我的首选是Python。我主要是一名Python业余程序员,还没有在任何生产环境中使用过它。但这并不意味着我认为它只是一门业余语言。恰恰相反。只需浏览一下招聘网站或一些趋势统计数据,就能发现Python显然是许多人的首选。随着机器学习和人工智能的兴起,Python似乎也成为了这些领域的热门选择。

4. SQL(结构化查询语言)

是的,SQL 是一种语言。更准确地说,SQL 是一种更接近人类语言的第四代编程语言 (4GL)。我有时会想,SQL 是不是世界上应用最广泛的编程语言。SQL 无处不在,在我所有的工作经历中,我从未遇到过不用 SQL 的情况。无论是 MSSQL、Postgres、MySQL 还是 Oracle,SQL 都以某种形式存在。当然,SQL 不像现在流行的 NoSQL 技术那样光鲜亮丽,但它在未来很长一段时间内仍将占据一席之地。有趣的是,NoSQL 数据库Couchbase使用的是N1QL(发音为“nickel”)查询语言。N1QL 的有趣之处在于它几乎完全符合 SQL ANSI-92 标准。甚至像NoSqlBooster这样的工具也允许用户在 MongoDB 数据库上编写 SQL 查询。

5. BASH

BASH 是一种脚本语言,而且是图灵完备的。就像我之前选择学习的其他编程语言一样,BASH 之所以能入选,是因为它拥有庞大的用户群体和活跃的社区。对我来说,能否成为 Linux 之王或大神,关键就在于是否会用 BASH 编程。当然,会用 VIM 编辑器也很重要 ;)

此外,Linux 是服务器计算领域迄今为止使用最广泛的操作系统。因此,我认为尽可能多地掌握 Linux 知识是明智之举,因为你迟早都会用到它。学习 BASH 脚本是掌握 Linux 的重要组成部分。了解 BASH 还能帮助你编写可重复使用的自动化任务,这些任务可以共享并供多人使用。因此,除了作为系统管理员的得力工具外,我认为它也是一款非常有价值的 DevOps 工具。

每当我写关于Linux的文章时,总会想起下面这张图片:

linux-cloud

6. 函数式编程语言

我没有使用纯函数式(或接近纯函数式)编程语言开发软件的经验。因此,我无法根据经验提出任何建议。然而,在缺乏经验的情况下,我转向数据来辅助我的决策。过去一年,我一直密切关注函数式编程语言。根据我的经验,以下三种函数式编程语言似乎总是最受关注:

  • Haskell - Haskell 是一种标准化的、通用的纯函数式编程语言,具有非严格语义和强静态类型。

  • Scala ——Scala 是一种通用编程语言,支持函数式编程和强大的静态类型系统。Scala 的设计理念是简洁,其许多设计决策旨在解决人们对 Java 的批评。

  • F# - F# 是一种强类型、多范式编程语言,它包含了函数式、命令式和面向对象的编程方法。

我怀疑函数式编程在不久的将来会成为必备的编程技能。我这么说的原因是,编写并发和并行程序的需求日益增长。这种需求是由微处理器物理架构的变革驱动的。简而言之,作为程序员,我们过去只需要担心编写能在单核处理器上运行的程序。直到几年前,情况都是如此。如果我们需要更快的速度,我们会提高处理器的速度。近年来,处理器行业在提供更高处理速度方面已经达到了极限。因此,处理器架构发生了变化,每个处理器提供 2 个、4 个甚至更多核心,以帮助程序更快地运行。但是程序并没有运行得更快,因为没有人拥有能够有效利用额外核心来编写真正并发且无副作用的程序的编程语言(稍后会详细介绍)。除了使用函数式编程语言的人之外,没有人能做到这一点。事实证明,函数式编程语言非常适合多核、多线程和分布式系统领域。人们经常听到使用函数式编程的最大优势之一是消除“副作用”。“副作用”指的是代码访问或更改了超出其作用域的数据(例如变量)的状态。在多线程环境下,副作用带来的问题会更加严重。另一个与并行计算相关的重要概念是阿姆达尔定律。要解释阿姆达尔定律需要专门撰写一篇文章,因此我不会在此赘述。不过,我推荐您阅读一篇关于阿姆达尔定律的精彩解释,链接在此。值得一的是,像 Go、Rust、Java 和 C# 这样的编程语言现在也内置了并发功能(编写并发程序的能力),而且我相信随着时间的推移,这方面只会越来越好。

我鼓励所有编程新手和经验丰富的人都花时间学习函数式编程语言。这至少能帮助你更好地思考如何编写没有副作用的程序。此外,函数式编程范式也正在被许多流行的语言所吸收,例如 Java 和 C#。

在函数式编程语言中,Scala 最吸引我。在我看来,它是函数式编程领域一颗冉冉升起的新星。

以上就是我对你应该学习的编程语言的一些思考。下一节我将总结本文,并介绍一些我认为同样重要的编程语言,它们中的任何一种都可以轻松替代我之前提到的那些。


结论

以我的经验来看,没有哪一种编程语言可以包揽一切。我学习编程语言大多是出于完成特定工作所需的必要性,力求以最简便的方式完成任务。我提到的这些编程语言绝非最流行的语言,但它们都拥有庞大的社区、丰富的文档和学习资料,以及大量的就业机会。

最后,我想提一下我很想尝试的几种编程语言。它们中的任何一种都可以轻松替代我在前面章节中讨论的编程语言。它们列如下:

  • Rust ——Rust 是一种由 Mozilla Research 赞助的系统编程语言,它被描述为一种“安全、并发、实用的语言”,支持函数式和命令式-过程式编程范式。

  • Go - Go 是 Google 于 2009 年创建的一种编程语言。它是一种编译型、静态类型语言,继承了 Algol 和 C 的传统,并添加了垃圾回收、有限的结构类型、内存安全特性和 CSP 风格的并发编程特性。

  • Kotlin - Kotlin 是一种静态类型编程语言,它运行在 Java 虚拟机上,也可以编译成 JavaScript 源代码或使用 LLVM 编译器基础架构。

我怀疑接下来我会探索ScalaKotlin,作为我潜在的“下一项技能”。

别忘了,如果您想发表意见,可以通过这个链接访问我正在进行的趣味调查。


文章来源:https://dev.to/drminnaar/choosing-a-programming-language-493h