当前位置: 首页 > 科技观察

一位国外老程序员的反思:C、Python、Java不能兼得,专心学一门编程语言就好!

时间:2023-03-12 18:11:43 科技观察

近日,著名游戏程序员、idSoftware创始人之一约翰·卡马克在接受采访时表示,程序员应该专心学习一门编程语言。这让我有点吃惊。虽然我个人完全同意这个建议,但它在当今的程序员圈子中是一个有争议的观点。我想我就是大家所说的“老程序员”。我已经足够大了,可以用我的一生来编程,并且从我进入社会以来就一直在专业地做这件事。有时候,我觉得自己像一个见证了很多编程语言发展的编程语言爱好者。回顾过去,这是一段激动人心的历史,我们不禁得出(错误的)结论:多了解几种编程语言永远不会有坏处。编程语言的历史发展很精彩,但今天的发展形势比较平静。在本文中我想回顾过去的历史,总结经验教训,看看哪种编程语言是最好的标准化语言。史前阶段(50年代-80年代)计算机编程(除了处理器本身的指令)也随着计算硬件和计算机科学作为一门学科的逐渐兴起而开始慢慢发展。在最初的几十年里,编程语言主要是学术界的研究对象,俘获了一小部分研究人员。程序员的选择有限,而且主要取决于领域。商业编程使用COBOL,科学编程使用Fortran,还有一些其他语言通常用于特定领域、研究或硬件。对于大多数程序员来说,他们只需要在整个编程生涯或很长一段时间内专注于学习一种编程语言。虽然人们对编程语言设计很感兴趣,但该领域在当时才刚刚起步。尽管有一些有趣的创新,但对于设计一种好的编程语言需要什么,人们还没有很好的理解。专业化(80s-90s)随着计算机硬件数量的增加及其用途的多样化,编程语言的数量也开始增长,编程语言的选择成为热门话题。人们开始对编程语言进行分类。我们可以根据程序员的类型和他们渴望达到的专业水平来判断程序员会选择哪种语言。个人计算机编程爱好者使用日益流行的BASIC。它是一种荒谬、原始的编程语言,被广泛使用并指导着一代程序员(包括我自己)。Pascal引入了结构化编程并产生了巨大的影响(Pascal与Turbo-Pascal和Delphi拥有一个繁荣的社区,但最终消亡了)。C起源于UNIX,成为系统编程语言。C++成为C的继承者,并从Smalltalk借用了面向对象编程作为专业应用程序和服务开发人员的语言。最终VisualBasic(与BASIC无关)普及了“可视化编程”,满足了应用程序开发(随着Windows的出现而迅速增长)的需要,成为大众的首选。但人们普遍认为,VB程序员是领域专家的兼职编程工作,而C和C++是“专业”程序员。现阶段人们对编程语言的设计还没有很好的理解,导致很多流行的编程语言在很多方面都不够理想。C语言简单而强大,但熟练掌握难度大,容易出错的地方太多。C++的本意是好的,但最终设计得很糟糕,使用起来也不舒服。VisualBasic既有趣又简单,但有点像个笑话,对于当时的技术来说不够优雅或高效。Smalltalk和LISP都是有趣而优雅的语言,但由于绑定到专用硬件和昂贵的工具而失去了市场。成熟之后(90年代到2000年),互联网应运而生。互联网对编程语言的影响到底有多大可能不得而知,但这肯定是一个很大的因素。很久以前,编程语言是稀罕物,通常诞生于研究实验室和大型商业公司;但今天似乎任何人都可以开发自己的编程语言。曾经有一段时间,PERL是流行的通用语言,涵盖从系统管理到Web编程的所有内容。后来,Python从一门科研语言变成了一门简单易学的通用语言,虽然一开始发展缓慢,但最终风靡全球。据传Netscape的BrandanEich在短短几天内开发了JavaScript(作为浏览器扩展的一种非常有限的语言)。这不仅证明了艾希是个天才,也证明了当时的人们对程序设计语言的设计有很好的理解。这一时期还涌现出了很多其他的编程语言,其中最著名的就是Java。语言本身并没有什么特别之处,但是它提供的JVM是一个通用的运行时环境,实现了“一次编写,随处运行”,这意味着该语言非常通用,独立于具体的硬件、操作系统或限制的目标环境。严格来说,早期的JVM并没有什么值得吹嘘的,但它开创了一个语言运行时和部署选项日趋成熟的时代。快速发展(2000-2010)自从JVM以来,编程语言开始朝着有趣的方向快速发展。由Self语言(Smalltalk的后继者,虽然优秀但非常失败)衍生出来的即时编译器(JIT)得到进一步研究,导致Java的HotSpot诞生,微软推出.NETCLR对抗Java。.NET更进一步,使用CLR(CommonLanguageRuntime,通用语言运行时)作为多语言通用运行时,而不仅仅是C#。事后看来,这是一个分水岭时刻:编程语言的选择变得无关紧要。这可能不是微软做出这个选择的主要原因(他们还在努力继续支持当时非常流行的VisualBasic,和C#),再加上微软那段时间的封闭许可,最终CLR没能成为最流行流行的操作环境。但在后千禧年的第一个十年里,编程语言的数量和普及率都在增长。另一方面,程序员的数量也呈爆炸式增长。随着对软件需求的快速增长以及工具和知识的可用性,全世界有数百万人成为了程序员。这些程序员也是人,他们渴望强烈的群体认同感。正如普通人对运动队有强烈和非理性的看法一样,程序员在编程语言选择方面也开始偏袒一方。许多程序员被迫选择一些新的、独特的、特殊的编程语言。比如,有人宣称函数式编程为王,Ruby优于Python,Scala将彻底改变数据科学,Clojure是你的损失……至此,编程语言从开始进入了一个混沌的达尔文适者生存时期线性发展。Hypernormalization(2010年至今)本应是人们意识到某些编程语言太疯狂而无法维持的时代。然而,事实并非如此,事态反而发生了意想不到的变化。在“云”计算时代,许多应用程序和服务部署在互联网上大量的分布式节点上,使用哪种编程语言似乎无关紧要。程序员都在开发相互通信的独立组件,那么何必费心编程语言呢?组件不需要知道彼此是用哪种语言编写的。如果程序员喜欢用X语言编写组件,那么就使用这种语言。谁在乎。运行在不同机器上的组件也是如此。随着Docker的发布,容器越来越受欢迎。无论是单机运行的应用,还是通过编排软件协同运行在集群机器上的软件,都一样可以使用。易于管理的示例。新的编程语言今天仍在开发中,其中不乏有很多有前途和备受期待的语言。有些是特定领域的(Swift、Kotlin和Dart用于移动应用程序,Solidity用于以太坊智能合约),而另一些则更通用,但每种语言都受益于数十年的经验教训(用于云编程的Go,用于系统编程的Rust,TypeScript,JavaScript的超集等)。与此同时,编程世界已经达到了一个新的成熟水平,我们不再追逐每一种新趋势和采用每一种新语言。我们都长大了。专注于学习一门编程语言毫无疑问,有些编程语言确实更好,有些编程语言更适合处理某些用例。任何编程过一段时间的人都知道,学习一门新语言一点也不难。大多数程序员可以在一个下午轻松学习一门新语言的基础知识,并在使用几天后或多或少地提高工作效率。新手程序员可以从任何一种主流编程语言开始学习,并轻松地将学到的编程知识应用到其他语言中。然而,频繁更换编程语言并不是一件好事,主要有两个原因。首先,学习编程语言有点像学习下棋。您可以快速学习规则,但这并不意味着您可以击败经验丰富的玩家。你需要学习策略,这需要时间和练习。它是一个包含最佳实践、陷阱、优化技术以及库、工具和社区的生态系统。其次,编程简单但容易出错。即使拥有共同的编程经验和最好的工具,将想法转化为计算机代码也不是一种直觉行为。程序员培养出的任何直觉都必须经历反复使用、即时反馈和纠错的循环。每次切换编程语言时,您都会付出代价。所以,根据我的经验,编程语言的选择固然重要,但一旦做出选择,就应该长期坚持下去。如何选择编程语言到2022年,我们在选择编程语言时,需要考虑以下几点。首先,最关键的考虑是语言的范围。如果它是特定领域的,并且必须使用某种特定领域的语言,则首选最通用的语言。值得庆幸的是,由于Java的“一次编写,到处运行”方法,运行时和部署不再是问题,成本和许可也不再是问题。今天,几乎所有的编程语言、运行时和各种工具都可以免费获得。如果一种语言不适合特定的场合,只能说它还不够普及,无法普及;或者因为一些基本因素,语言确实不适合这个任务。受欢迎程度很重要,我们应该选择一种具有强大社区、丰富信息来源以及大量其他程序员可以合作或雇用的语言。任何不流行的语言都不值得选择。如果遇到特殊情况,选择会比较困难。没有一种语言适用于所有场景,但理想情况下,一种通用的主流语言应该足以应对大多数场景。最后,我们选择的编程语言应该胜过大多数其他语言。即使到了2022年,仍然有一些可怕的编程语言难以学习和使用,很容易让程序员陷入困境。鉴于上述陈述,我认为我们实际上没有太多选择。下面,让我们来看看这些最好的编程语言。最佳编程语言JavaScript/TypeScript编程语言JavaScript就像人类交流中的英语。它是最流行和通用的编程语言,适用于许多不同的场景(浏览器/前端,系统/后端,作为扩展语言嵌入到许多环境中)。JavaScript的运行时(V8/Node/Deno)非常高效,有很多很棒的工具和庞大的社区。TypeScript是JavaScript的超集,它引入了强类型和标准工具,正在迅速发展成为JS编程的默认选择。Rust具有C/C++的所有特性,更易于使用,并且没有那么多的陷阱。Rust社区和生态系统强大且不断发展,工具也很棒。如果Rust提供了您需要的所有功能,那它绝对是最佳选择。在以前只能使用C或C++的地方,现在可以选择Rust。此外,Rust也在为WebAssembly构建自己的通用语言(WebAssembly可以说是终极的“一次编写,随处运行”运行时)。强大的竞争对手Python我已经使用Python20多年了,但不幸的是,到了2022年,Python仍然不是一种真正的通用编程语言。原因之一是Python的效率仍然很低,无法在许多注重性能的情况下使用。另一个原因是它未能进入主流的面向用户的环境,例如网络浏览器或手机。尽管如此,Python仍然是一种很棒的编程语言,并且在数据工程/数据科学/机器学习方面占有重要地位,因此如果您在这些领域工作,Python绝对是一种需要了解和喜爱的语言。就目前而言,Python可能会继续发展成为数据科学的通用语言,但它可能不会突破这一领域。GoGo是一种非常适合“云”编程的语言。Go语言优雅、易学易用,拥有优秀的社区、生态系统和工具。它在云原生领域的核心产品中被广泛使用,因此会长期发展。不幸的是,Go不具备普遍适用性,基本上不能在Internet服务器之外使用。此外,由于Go的设计选择,它在C/C++世界中表现不佳。Go很好,但如果非要做出选择的话,Go能做的一切Rust都可以做,而且随着时间的推移,Go可能会被主流的系统编程语言所取代。C#/JavaC#及其生态系统非常出色,您可以用它做很多事情。Java各方面都不如C#,所以我不明白为什么会有人喜欢它,但是Java确实很受欢迎。C#被广泛使用,不仅作为一种系统和“业务”语言,现在还扩展到移动应用程序和浏览器。强大的运行时,伟大的生态系统。但是,除非您需要C#的一些定制运行时和工具功能,否则C#在短期内很难与JavaScript和Rust竞争。C/C++根据林迪效应,C和C++将在未来几十年继续流行。如果你已经是这两种语言的专家,那你当然不用为找工作发愁了。如果有这方面的需求,花时间学习两者也是不错的选择。否则,Rust是更好的选择。HonourableMentionSwift/Kotlin/Dart这几种语言在特定领域都有自己的一席之地。如果您需要移动UI编程,这些都是不错的选择。但是JavaScript的适用性比较普遍,移动端开发也是适用的,所以我们应该选择JavaScript。LISP(Racket/Clojure)LISP很特别,即使您的日常工作没有这样的需求,您也应该学习它。Racket是一种最先进的、非常复杂的语言(实际上它是一种语言构建工具包)。据说Clojure很强大,因为它以JVM为目标并且可以使用Java库。但我不清楚这有多大卖点。Haskell/F#/Scala函数式语言很重要。在某些情况下,它们是更好的选择。Haskell是函数式编程的代表。F#具有更好的通用性,因为它运行在CLR上并且可以使用.NET库。Scala不是纯函数式的,而是非常通用的,运行在JVM上。Julia/R/MATLABJulia非常适合数学领域。R和MATLAB都有它们擅长的特定情况。然而,在以Python为主导的数据工程领域,这些编程语言恐怕难以生存。PowerShell如果您喜欢shell编程,PowerShell是迄今为止最好的选择。它适用于所有操作系统,因此我们没有理由使用任何其他shell。PowerShell也是一种通用编程语言,但实际上没有人在系统管理之外使用它。PHP/Ruby/PERL等语言晚年也有过辉煌,主要作为web“后端”语言。不管您对这些语言有何看法,是时候停止在它们身上浪费精力了。他们都快死了。VisualBasic/VBAVB改变了世界,但现在已退出游戏,无论是作为通用语言还是作为其他程序的扩展。在遥远的过去可以用VB实现的功能在今天用其他现代语言可以更好地实现。总结我热爱编程语言,总是对新的充满好奇。但是,就目前而言,TypeScript是我心目中的C点,当您需要强大的功能和低级访问时,Rust排在第二位。相信2022年几乎所有的程序员都和我有类似的看法。