您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 开发技术 > 正文

C 语言为什么不会过时?

发表于:2020-09-04 作者:工控自动化专家 来源:今日头条

评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节,街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!” 这个在心理学上有个专业的名字:叫做 “二逼” 现象!

那我为啥还要做这个挨骂的事呢?作为《C 语言点滴》《drop of knowledge of C++》书籍的作者,《C 语言新思维,第二版》的译者(赵岩老师),我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。因为他们有深深的担忧,万一 C 语言就像 Fortran 那样过时了怎么办?

先上一个表,这个就是著名的 TIOBE 语言排行榜。目前它是一个最权威的一个语言流行度的排行榜。

就在 5 月,时隔 5 年,C 语言再次领先 Java,荣登 TIOBE 编程语言排行榜第一!

排名前十的分别是

  • C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL 和 R。

有没有发现亮点?没错, 第一易主了,C 语言反超了 Java 。要知道,C 语言上次第一还是在 5 年前,是什么原因让其 “东山再起” 了呢?

时隔五年,C 语言重回榜首。

据 TIOBE CEO Paul Jansen 的猜测,“这听起来可能很不可思议,但是某些编程语言确实可以从这种情况中受益。"嵌入式语言(C 和 C++ 等)越来越流行,因为它们被用于医疗设备软件中。

对所有的编程语言,他们的最后的目的其实就是两种:提高硬件的运行效率和提高程序员的开发效率。

遗憾的是,这两点是不可能并存的!你只能选一样。在提高硬件的运行效率这一方面,C 语言没有竞争者!举个简单的例子,实现一个列表,C 语言用数组 int a [3],经过编译以后变成了(基地址+偏移量)的方式。对于计算机来说,没有运算比加法更快,没有任何一种方法比(基地址+偏移量)的存取方法更快。

C 语言已经把硬件的运行效率压缩到了极致。这种设计思想带来的问题就是易用性和安全性的缺失。例如,你不能在数组中混合保存不同的类型,否则编译器没有办法计算正确的偏移量。同时 C 语言对于错误的偏移量也不闻不问,这就是 C 语言中臭名昭著的越界问题。

C 语言自诩的 “相信程序员” 都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。C 语言只关心程序飞的高不高,不关心程序猿飞的累不累。就是这样!

现在来看看那些非 C 的语言,他们的长处都在于提高程序员的开发效率上。或者支持动态的列表,或者支持安全的列表。但是加入任何的中间层,加入任何的安全检验,它不可能比(基地址+偏移量+无检验)的方式更快。这个世界上不存在 “开发容易,运行快” 的语言,开发容易毕竟来源于对底层的一层一层又一层的包装。

现在回答两个最普遍的问题:硬件这么便宜了,有必要让软件更快吗?有这种疑问的人大部分都是网吧的固定客户,他们理解的计算机只在电脑城,他们理解的计算只是游戏和播放硬盘中的小电影。不要玩个游戏开个挂就乐得不行不行的,别忘了还有全实景仿真,还有 3D 渲染,还有自动驾驶。

人在开车的时候,每秒要收集 60 个不同的物体,然后根据这 60 个物体的不同组合和反映来做 20 个最重要的决定。然后从这 20 多个决定中选一个执行。所以就算用上最快的硬件,自动驾驶现在还不敢说能像人那样开车。就算是自动驾驶成功了,下一步还要自动飞行呢?因为我们老早就预言了:你咋不上天呢!

所以说:计算速度永远是不够的!因为新的应用会越来越复杂,越来也实时。对了!我还忘了一个更重要的限制:计算的能耗!NASA 飞行器上的 CPU 最多就是 32 位的,说出来你可能不信,国际空间站上没有一个 CPU 是 64 位的,我猜一个最主要的原因是航天员不爱看硬盘小电影吧。

另外一个流行的疑问是:我可以发明一种同样快的语言,但是没有 C 语言那么多的坑。想法是可以的,而且还真巧有这个语言,真巧它的名字叫 D 语言,真巧没有太多的人用!这是因为一个基本的事实。现在有太多,太多太多的 C 代码,他们大部分都在正常工作,就像 Linux, Window, MacOS,Unix,Vxworks。你没有看错,这些操作系统的内核都是 C,我虽然不确定 C 在 Window 中所占的比例,但是我相信微软的人不会傻到用 C# 去全部改写一个操作系统的内核。你想让这些人去用你的全新的语言,这就不是 “有点” 很傻,很天真了!

而且有些代码,我们根本就不能改!NASA 一个简单的 5 个 CPU 飞控软件编写完毕后,要进行一种 “全覆盖” 测试。如果 CPU A 坏了会发生什么?如果 CPU A,B 坏了呢?如果 CPU A,C 坏了呢。。。。?如果你愿意,你可以做个简单的数学组合。测试完毕后,别说重写,就算加个注释都不行。因为主管 payload 的大妈会非常严肃的质问你,为什么你上报的东西数量增加了,但是质量没有增加?你需要和她详细的解释:硬件和软件是不同的,硬件是那种摸起来硬硬的东西,但是软件不是那种摸起来软软的东西。看着大妈鄙夷的眼神,这个时候你会非常后悔自己手欠加入的哪一行注释。你还别不当真,这个是 NASA 的真实故事。

那为什么 C 语言还下降这么多呢?很简单,有些任务本身就不是 C 语言的。我上学的时候还用 C 语言编过窗口界面呢?然后很快微软的人就推出了 MFC,就是一大堆宏把底层的 C windowAPI 包装了起来。

再后来这个技术也过时了。因为微软的人认识到,带有窗口的应用程序说到底不是 C 语言的本职工作,再这么一层一层包下去就有露馅的危险,于是他们发明了一个全新的语言 C# 来负责这个任务。

Java 也是这样,突出网络,易用,安全,跨平台。无论是 Java, c# 还是 python, 他们都有意避开提高硬件的运行效率这个问题,因为这个问题上没办法和 C 竞争,也无法撼动 Linux, Unix,GNU tool 这些已有 C 代码的位置。剩下的就只是提高程序员的开发效率上大作文章。这对 C 语言是好事,把自己不善长的东西去掉,让自己跑的更快!

伴随着嵌入和实时系统的兴起,AI,机器人,自动驾驶等。这些都是 C 语言的核心应用,而且在这种应用上面,C 语言没有竞争者。所以我感觉 C 语言会稳定在自己核心的应用中,并开始逐步回升。

最后说点闲话,C++ 不会淘汰 C 语言。有了对象后你会发现再简朴的对象也耗费资源,而且有了对象以后,总是不由自主的去想继承这个事,一但继承实现了,你会发现继承带来的麻烦远超过你的想象。Java 的发明人 James 被问到如果可以从新设计 Java 语言的话,第一个要做什么事?他说:“去掉对象”!作为一个已婚,有两个孩子的程序猿,我感同身受。如果大家感兴趣,我可以再写一个博客,聊聊 C++ 和 C 的真实区别所在。

如果你看到这里,还什么都没记住。那就只记住一点:没人能预测未来。

如果再有人对你说 C 语言已经过时了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。

02、为什么 C 仍占据统治地位?

于一种计算机行业的技术来说尤其如此。自 1972 年诞生以来,C 语言一直保持生龙活虎的状态,时至今日它仍然是我们用来搭建软件世界的基础建筑材料之一。

但有时一种技术能够长期存在,只是因为人们还没有来得及发明新的东西来取代它而已。在过去的几十年里,出现了许多其他语言 —— 其中一些明确地被设计用于挑战 C 的主导地位,有些语言试图凭借自己的人气慢慢瓦解 C 语言的统治地位。

为 C 需要被替换掉的观点争辩是简单的。编程语言研究和软件开发实践都暗示了如何比 C 更好地去做事。但历经数十年的研究和开发,C 语言的地位却依旧稳固。很少有其他语言能够在性能、裸机兼容性或通用性等方面击败它。不过,2018 年 C 是如何与那些明星编程语言竞争的呢,其中细节仍值得一看。

C vs. C ++

当然了,C 最常被拿来与 C ++ 进行比较,正如其名称本身所暗示的那样,C++ 作为对 C 语言的扩展而被创建出来。C ++ 和 C 之间的差异可以概括为 C++ 更加广泛(褒)或更加宽泛(贬),具体取决于这个问题你是问的 C 还是 C++ 程序员。(笑)

虽然 C ++ 的语法等方面仍然是类 C 的,但它提供了许多在原生的 C 中本不可用的非常实用的功能:命名空间(namespace),模板(template),异常(exception),自动内存管理(automatic memory management)等等。需要顶级性能的项目,例如涉及数据库,机器学习系统的项目通常是用 C ++ 编写的,以便项目能尽可能地榨取以及利用到每一点性能。

此外,与 C 相比,C ++ 在持续地更加积极地扩展。即将推出的 C ++ 20 会带来更多功能供开发者享用,包括模块,协同程序,同步库,以及概念,这些使模板更易于使用。C standard 的最新版本只进行了少量更新,并侧重于保持向后兼容性。

事实上,C ++ 中的所有附加功能同样也可能成为累赘。而且是很大的累赘。您使用的 C ++ 专属功能越多,引入的复杂度就越高,对结果的修正就越困难。将自己局限于仅一个 C ++ 子集的开发人员可以避免许多开发中严重的坑和额外负担。但是有些团队想要从根儿上防范 C ++ 的过度复杂性。坚持使用 C 能迫使开发人员将自己局限于一个子集。例如,Linux 内核开发团队就直接避开了 C ++。

选 C 而不选 C++ 对您 —— 以及任何将会维护你代码的开发人员 —— 来说都是可行的,通过采用强制简约主义来避免与 C ++ 的复杂性纠缠。当然,C ++ 拥有丰富的高级功能,这是有它自己的道理的。但如果极简主义更适合当前和未来的项目 —— 以及负责项目的团队 —— 那么还是选 C 更明智一些。

C vs. Java

几十年了,Java 仍然是企业软件开发的主力军之一 —— 并且也是宽泛而言的开发的主力军之一。许多最重要的企业软件项目都是用 Java 编写的 —— 包括绝大多数 Apache Software Foundation 项目 —— 而 Java 仍然是开发企业级需求项目的可行语言。

Java 的语法从 C 和 C ++ 中借鉴了很多东西。但是,与 C 不同的是,Java 默认情况下不会编译为本机代码。相反,Java 运行时环境,JVM,JIT(实时)编译 Java 代码以在目标环境中运行。在适当的情况下,JIT 编译后的 Java 代码可以接近甚至超过 C 的性能。

Java 背后的 “一次编写,随处运行” 的理念也允许 Java 程序在目标架构上进行相对较少的调整即可运行。相比之下,虽然 C 已被移植到许多架构中,但任何给定的 C 程序仍可能需要重新量身定做才能在,打个比方,Windows 与 Linux,两种不同的 os 之间正常运行。

这种可移植性和强大性能的结合,以及庞大的软件库和框架组成的生态,使 Java 成为构建企业应用程序的首选语言。

Java 输给 C 的地方是一个 Java 从未打算竞争的领域:靠近底层结构运行,或直接与硬件打交道。C 代码被编译成机器代码,由进程直接执行。Java 被编译成字节码,这是一种随后会被 JVM 解释器转换为机器代码的中间代码。此外,尽管 Java 的自动内存管理在大多数情况下都是个优点,但 C 更适合于必须充分利用有限内存资源的情况。

也就是说,在某些方面,Java 在速度方面可以接近于 C。JVM 的 JIT 引擎在运行时根据程序行为优化例程,允许进行许多类型的优化,而这些优化是在未提前编译的 C 中无法实现的。虽然 Java 运行时自动执行内存管理,但一些较新的应用程序可以解决这个问题。例如,Apache Spark 部分地通过使用绕过 JVM 的自定义内存管理代码来优化内存中处理。

C vs. C#和.Net

在推出近二十年后,C#和.Net 框架仍然是企业软件世界的主要组成部分。有人说 C#和.Net 是微软对 Java 的回应 —— 一个托管代码编译器系统和通用运行库 ——C 和 Java 之间的许多种对比也适用于 C 和 C#或.Net 之间。

与 Java(以及某种程度上来说 Python 也是如此)一样,.Net 提供跨各种平台的可移植性和庞大的集成软件生态系统。考虑到.Net 世界中有多少面向企业的开发,这些都是不小的优势。当您使用 C#或任何其他.Net 语言开发程序时,您可以使用为.Net 运行时编写的大量工具和库。

.NET 另一个类似 Java 的优势是 JIT 优化。C#和.Net 程序可以按照 C 语言提前编译,但它们主要由.Net 运行时进行即时编译,并使用运行时信息进行优化。JIT 编译允许对无法在 C 中执行的运行着的.Net 程序进行各种就地优化。

与 C 一样,C#和.Net 提供各种直接访问内存的机制。堆,栈和非托管系统内存都可以通过.Net API 和对象访问。开发人员可以使用.Net 中的 unsafe 模式来实现更高的性能。

但这些都不是没有代价的。托管对象和 unsafe 对象不能被任意交换,并且它们之间的编组会降低性能。因此,要最大化.Net 应用程序的性能需要将托管和非托管对象之间的变动保持在最低限度。

如果您无法承担托管与非托管内存之间变动造成的性能损失,或者.Net 运行时对于目标环境(例如,内核空间)来说是一个糟糕的选择,或者可能根本不可用,那么 C 就是你所需要的。与 C#和.Net 不同,C 被默认可以解锁对内存的访问权。

C vs. Go

Go 的语法很大程度上借鉴了 C—— 花括号作为定界符,语句以分号结束,等等。精通 C 的开发人员通常可以毫不费力地直接使用 Go,甚至算上 Go 的独有功能,如命名空间和包管理,对开发人员来说也并不困难。

代码可读性是 Go 的指导设计目标之一:让开发人员可以轻松掌握任何 Go 项目,并在短时间内熟练掌握代码库。C 代码库可能很难理解,因为它们很容易聚集大量专属于某个项目或某个团队的宏和和 #ifdef。Go 的语法及其内置的代码格式以及项目管理工具旨在避免这种结构性问题。

Go 还提供了诸如 goroutine 和 channel 之类的附加功能,用于处理并发性和组件之间的消息传递的语言级别的工具。C 需要开发者手动完成或由外部库提供,但 Go 提供了开箱即用的这些功能,使得构建需要这些功能的软件变得更加容易。

Go 与 C 最深层次的不同之处在于内存管理方面。默认情况下,Go 的对象会被自动管理并自动进行回收。对于大多数编程工作来说,这非常方便。但这也意味着任何需要确定性处理内存的程序都会更难编写。

Go 确实包含了用于绕过 Go 的某些类型处理安全性的 unsafe 包,例如使用 Pointer 类型读取和写入任意内存。但 unsafe 会附带一个 warning 说用它编写的程序 “可能是不可移植的,并且不受 Go 1 兼容性指南的保护。”

Go 非常适合构建命令行实用程序和网络服务等,因为这些很少用到太过细致的操作。但是,如果是低级设备驱动程序,内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务,那么就最好用 C 来创建。

C vs. Rust

在某些方面,Rust 是对 C 和 C ++ 创建的内存管理难题的回应,也是对这两种语言的许多其他缺点的回应。Rust 编译为本机机器代码,因此就性能而言,它被认为与 C 相当。但默认情况下,内存安全才是 Rust 的主要卖点。

Rust 的语法和编译规则可帮助开发人员避免常见的内存管理错误。如果程序有一个不符合 Rust 语法的内存管理问题,它就不会被编译。刚接触这种语言的新手,特别是以前用 C 语言的开发者,由于 C 语言为这类 bug 提供了充足的容错空间,所以他们接触 Rust 的第一步是学习如何安抚编译器。但 Rust 的支持者认为,这种短期的痛苦有一个长期的回报:更安全的,不会减缓速度的代码。

Rust 还通过其工具改进了 C 语言。默认情况下,项目和组件管理是 Rust 提供的工具链的一部分,与 Go 相同。有一种默认的,推荐的方法来管理包,组织项目文件夹,以及处理 C 需要单独处理的其他许多事情,每个项目和团队以不同的方式处理它们。

然而,在 Rust 中被吹捧为优势的东西对于 C 开发者来说可能并没有太大吸引力。Rust 的编译时安全功能无法禁用,因此即使是最小的 Rust 程序也必须符合 Rust 的内存安全限制。默认情况下,C 可能不太安全,但在必要时它更灵活,更宽容。

另一个可能的缺点是 Rust 语言的大小。即使考虑到标准库,C 的功能也相对较少。Rust 功能集非常庞大并且还在不断增长。与 C ++ 一样,较大的 Rust 功能集意味着更强大的功能,但也意味着更高的复杂度。C 是一种较小的语言,但更容易在头脑中进行建模,因此可能更适合那些对 Rust 来说太小,不值得大动干戈的项目。

C vs. Python

当今,每当谈论软件开发时,Python 似乎总是能出现在对话中。毕竟,Python 是 “对所有项目的第二佳语言”,毫无疑问是最通用的语言之一,拥有数千个第三方库。

Python 强调的,以及它与 C 最不同的地方,是有利于开发速度而不是执行速度。一个可能需要一个小时才能用另一种语言写出来的程序 —— 比如 C—— 可能用 Python 几分钟内就能写好。另一方面,该程序在 C 中执行可能需要几秒钟,但需要一分钟才能在 Python 中运行完。(一个很好的经验法则:Python 程序通常比它们对应的 C 语言程序运行速度慢一个数量级。)但是对于现代硬件上的许多工作,Python 已经足够快了,这是它如今广泛应用的一个重要原因。

另一个主要区别是内存管理。Python 程序完全由 Python 运行时进行内存管理,因此开发人员不必担心分配和释放内存的细节。但同样,开发人员的轻松也是以运行时性能为代价的。编写 C 程序需要严格关注内存管理,但生成的程序通常是纯机器速度的黄金标准。

但是,在二者的血脉中,Python 和 C 共享一个深层的关系:Python 运行时参考是用 C 语言编写的。这允许 Python 程序包装用 C 和 C ++ 编写的库。第三方库的 Python 生态系统的很多重要模块,例如机器学习方面的库,其核心是 C 代码。

如果开发速度比执行速度更重要,并且如果程序的大多数高性能部分可以被隔离到独立组件中(而不是遍布整个代码),那么纯 Python 或 Python 和 C 库的混合使得会是比单独使用 C 更好的选择。否则的话,C 仍然是老大。

03、C 语言为何值得去学

1. 嵌入式领域,C 语言依然是首选语言,嵌入式并没有因为其他上层语言的发展而没落,现在嵌入式依然还在其自身的领域展现强大的生命力。手机,电视机,机顶盒,空气净化器等等电子产品都是其领域范畴,从长远看短时间内不可能被消失。而且智能机器人的崛起,C 语言的使用频率又开始加大了。

2. 操作系统内核代码还是 C 语言为主打,就语言的灵活性以及执行的效率来看 C 语言还是最合适的语言,而且在系统层次的代码,C 语言还是首选语言。而且现在很多流行语言的底层绝大部分的 C 语言构建完成。从这个层面讲 C 语言是永远不会过时的,顶多算是应用范围变窄,但其作用依然强大。

3. C 语言的职位比例相对应用级语言是低了点,但是整个软件行业在发展,绝对的 C 语言编程职位并没有减少。而且对于有志于成为架构师层次的程序员来说,C 语言还是必修课,构建软件框架还是需要对底层有所了解。

退一步来讲,即使觉得 C 语言方面的职位比例低一些,不好找工作,可以先从 C 语言入手,把自己的知识体系建立起来,编程语言属于工具范畴,熟悉一种工具的使用,很容易触类旁通,切换到别的语言也相对轻松些,而且给整个职业生涯起了个好头,打好了基础为更上一层楼做足准备。

C 语言之所以流行这么年,生命力这么旺盛和本身鲜明的高效,方便灵活挂钩。即使在上层语言使用概率变低,并不妨碍在系统级别继续发挥作用。任何一种语言都有其存在的社会价值所在。C 语言还是值得作为入门语言深刻的学习。

4.C/C++ 程序员的收入没有受到影响,依据 100offer 的后台数据显现,现在经过 100offer 入职的程序员年薪最高达 47W,最低 22.4W,C/C++ 程序员的收入与其它编程语言的岗位相比并没有呈现下风。随着 C/C++ 逐步变成某些特定公司和特定项目所需的语言后,高级 C/C++ 程序员的收入也会更具有竞争性。

知乎红人 vczh 说:「我在上大学的时分简直就只学习 C/C++,后来实习的时分去了微软,成果到了那里才知道,那个组是不必 C/C++ 的,怎么办?凭借着 C++ 带给我的富裕的功底,我准时完结了老板给我的 "两个星期内学会 C# 和 WCF 基础知识" 的作业,顺畅开端作业。」

当然,这只是 vczh 的个人经历,不具有普遍性,但不可否认的是 C/C++ 仍具有不可代替性。某家创业公司 CTO 在接受采访时表示:「即使有许多人唱衰 C/C++,但在今世,仍有许多许多项目的目标渠道暂时只供给 C/C++ 编译器的支撑,仅从这一点而言,C/C++ 是不可能完全消逝的。」

从应用范畴来说,C/C++ 适用于高性能计算、嵌入式体系、开发服务器软件、游戏、实时体系、网络通信等,短期内能完全代替 C/C++ 的语言并不存在,所以依然具有很强的竞争性。

04、除了 C,需要掌握多种语言吗?

想要掌握多种编程语言的 9 个理由

  1. 能用多种方式来解决同样的问题,掌握不同的编程语言意味着拥有更多的选择。毕竟,当你只有锤子时,一切看起来都像是钉子。
  2. 更有竞争力,拥有更多的就业机会。学习第二门编程语言,有时能加倍工作机会的数量。然而,这取决于你学习的语言种类。但无论怎么说,你将会有更多的合适机会,从而增加求职能力。
  3. 表明你具备学习新语言的能力。潜在的雇主会认为你并非是死板或者惯守成规的人。
  4. 学习是很有趣的。学习新的事物会让你的头脑保持兴奋。这将有助于你在新领域的成长和提高。
  5. 紧跟当前的技术发展趋势。了解哪个行业在独领风骚,就可以永远站在潮流的尖端,你的技能便不会过时。
  6. 这将提醒你为什么应该热爱你的 “主” 语言,或者如何将事情做得更好。有时候,只有尝试过新语言,才会知道主语言是何等的优秀。你会更加欣赏自己最爱的语言。与此同时,新语言可能会有一些惊人的特性,让你深觉相见恨晚。
  7. 有助于成为一个更加优秀的程序猿。学习新的语言,有助于提高在所有语言之间通用的技能,例如:设计和架构算法,或处理不同的数据结构。
  8. 针对工作选择最佳的工具。尺有所短寸有所长 - 有的语言更善于处理某些特定方面的事情。掌握了多种语言,你可以在工作中选用最佳的工具
  9. 表明你的学习能力强。没有任何事情比掌握第二语言更能证明你的学习能力。

不想掌握多种编程语言的 9 个理由

  1. 掌握一种语言更容易。通常,集中精力和全心投入才能精通某一事物。如果不断地在多种语言之间进行切换,那么真正精通一门语言的概率就会降低。掌握一种语言也有助于你集中精力。
  2. 大多数人只需要一份工作,大部分公司只使用一种语言。在你被录用后,掌握多种语言不一定会有所帮助。有时候,只要掌握项目所用的语言就够了。
  3. 总有一些东西值得学习;有时候,这意味着要更深入地学习一种语言。
  4. 大多数情况下,专家能提更高的薪资要求,因为人们更愿意为专家支付更多的薪水。John Sonmez 在其视频《 I’m Not Sure I Want To Be A Specialist》中谈到为什么多面手并不总是最好的。
  5. 即便仅掌握一种语言,仍然可以被认为是一个伟大的开发者。是否是伟大的开发者与你掌握多少种语言无关。关键在于你创造的是什么。因为只涉及一种语言,所以你可以花更多的时间进行创造。
  6. 你只需要学习有限的软件开发工具。大多数语言只有为数不多的一些工具。切换语言往往意味着要切换工具。只掌握一种语言,你就可以更快地掌握相关的工具。这将有助于提高工作效率。
  7. 更易于定位自己的市场。因为只掌握一种语言,基本上你只会朝这个方向安顿下来(即使不是出于自己的选择)。
  8. 你可以凭借任何一种语言解决大多数软件问题。不管有多少人告诉你,大多数语言可以用于解决任何问题。如果解决问题是你的主要目标(本应当是),掌握更多的语言并不一定有助于实现这个目标。
  9. 深入理解一件事比表面了解十件事更好。

这并非是一个非黑即白的问题。和其他问题一样,最好的解决办法是取中间值:总有一片灰色地带。如果你是一个初学者,那么学习一种语言,并将其应用到前十多个项目中会比较容易。但此之后,建议你成为一个「T 形」软件开发者。

什么是「T 形」软件开发者?

所谓「T 形」软件开发者在某一个特定的区域拥有很深的造诣,而且是一种语言的专家,T 字母中的垂直线代表了这一点;此外,他们会继续广泛学习另一种技能,T 字母中的水平线代表了这一点。

那么,这与软件开发,特别是编程语言的学习,有什么关系呢?我的建议是精通一种编程语言,这将成为你以后的生计,并用于解决大部分问题。你应该尽你所能掌握这门语言。在此基础上,可以学习最适合工作的第二种语言或技能。

T 形软件开发者是一个多面手,精通于某一领域。

在成为 T 形开发者的历程中,你将灵活地掌握多种语言,同时具备某个领域专家的优点。

应该掌握哪种编程语言?

一个常见的问题是,应当学习哪种语言。或者说,假如你是初学者,应当首先学习哪种语言。通常,我会选择有一定历史的语言作为主要语言。这种语言应当用于多个行业,并且有广泛的使用群体和大量的开发工具。符合这些标准的语言包括但不限于:C、C++、Java、JavaScript、C#、Python、Go 等等。

TIOBE 软件基于这些标准持续跟踪软件语言的流行性,并编入索引中。你可以点击 TIOBE Index 查看完整的编程语言列表。索引会每月更新,前 20 名中的大多数语言都是不错的选择。未来 10 年,这些语言还会流行吗?我不确定。不过至少在未来几年内还是很可能保持流行的,我想,这对任何准备着手的项目都是够用的。

说实话,关于是否需要掌握更多的语言,其实并没有绝对正确或错误的答案,不谈需求选语言都是耍流氓,最后的决定还是取决于你的需求。