一位“老程序员”的反思:C、Python、Java 不可兼得,专心学好一门编程语言就行!...

5f6aa5b833caa9fe683496c6d10e0d39.gif

摘要:大多数程序员在其职业生涯中,接触到的编程语言不止一种,但主要掌握并运用的多数只有一门。那么在数量繁多、适用领域各不相同的编程语言中,哪一门更适合你来学习呢?“老程序员”Eleanor Berger 总结了这些年来他对各种编程语言的看法及其发展历程,接下来就让我们一睹他心目中的最佳编程语言是什么。

原文链接:https://devtails.xyz/@adam/switching-to-c-over-modern-programming-languages

声明:本文为 CSDN 翻译,未经授权,禁止转载。


作者 | Eleanor Berger

译者 | 弯月

出品 | CSDN(ID:CSDNnews)

最近,著名游戏程序员、id Software 创始人之一John Carmack在采访中表示,程序员应该专心学好一门编程语言。这倒让我感到有点惊讶。虽然我个人非常赞同这条建议,但在如今的程序员圈子里,这种观点是有争议的。

我猜,我就是大家所说的“老程序员”了。我的岁数不小了,一生都在从事编程工作,而且从步入社会之后就一直在从事这项专业工作。有时,我觉得自己是一名编程语言爱好者,亲眼目睹了许多编程语言的发展。回顾过去,这是一段激动人心的历史,我们会不由自主地得出一个(错误的)结论:多掌握几种编程语言总没坏处。编程语言的历史发展非常精彩,但如今的发展形势相对比较平和。

在本文中我想回顾一下曾经的历史,总结经验教训,并看一看究竟哪种编程语言才是最好的标准化语言。

d104e56c21e81172e54bb4e8d295cc14.jpeg

2e8cef81a701dee636a69074ff9236c8.png

史前阶段(50年代~80年代)

随着计算硬件和计算机科学作为一门学科逐渐兴起,计算机编程(除了处理器本身的指令之外)也开始缓慢地发展。在最初的几十年里,编程语言主要是学术界的研究对象,还俘获了一小部分研究人员。程序员的选择很有限,主要取决于领域。

业务编程使用COBOL,科学编程使用Fortran,还有一些其他语言通常用于特定领域、研究或硬件。

对于大多数程序员来说,整个编程生涯或在很长一段时间里,只需专心学习一门编程语言。虽然有人对编程语言的设计感兴趣,但彼时该领域还很稚嫩。尽管出现了一些很有趣的创新,但对于如何才能设计一种好的编程语言,人们还没有很好的理解。

fbab5036bc4df000ebb81385bac48b00.png

专业化(80年代~90年代)

随着计算机硬件数量的增加以及用途的日益多样化,编程语言的数量也开始增长,编程语言的选择变成了一个流行的话题。人们开始对编程语言进行分门别类。我们可以通过程序员的种类以及他们渴望达到的专业水平,判断他们会选择哪种语言。个人计算机编程爱好者使用越来越流行的BASIC。这是一种很荒诞、很原始的编程语言,却被广泛使用并成为了一代程序员(包括我自己)的引路人。Pascal引入了结构化编程,并产生了巨大的影响(Pascal与Turbo-Pascal 和 Delphi 建立了一个蓬勃发展的社区,但最终消失了)。

起源于UNIX的C成为了系统编程语言。C++成为了C的后继者,并借鉴了Smalltalk的面向对象编程,成为了专业应用程序和服务开发人员的语言。最终 Visual Basic(与BASIC毫无关系)普及了“可视化编程”,满足了应用程序开发的需求(随着 Windows 的出现而迅速增长),并成为大众的首选。但人们普遍认为,VB程序员是领域专家兼职编程工作,而C和C++才是“专业”的编程人员。

这个阶段,人们仍然没有很好地理解编程语言的设计,导致许多流行的编程语言很多方面的设计都不太理想。C语言简单而强大,但很难熟练掌握,有可能出错的地方太多。C++的意图虽好,但最终的设计不佳,而且使用感不好。Visual Basic既有趣又简单,但有点儿戏,在当时的技术条件下,优雅与效率都不达标。Smalltalk 和 LISP 都是有趣而优雅的语言,但由于捆绑到了专门的硬件和昂贵的工具,导致最后失势。

2d5629c90c08c217f07e37b5ce18577c.png

成熟(90年代~2000年)

后来,互联网兴起。互联网对编程语言的影响究竟有多大也许未可知,但无疑这是一个重大因素。很久以前,编程语言是一个稀有之物,通常诞生于研究实验室和大型商业公司;但如今似乎任何一个人都可以开发出自己的编程语言。曾有一段时间,PERL成为了流行的通用语言,涵盖了从系统管理到 Web 编程的方方面面。后来,Python从科学研究语言变成了简单易学的通用语言,尽管最初发展缓慢,但最终席卷了整个世界。据传,Netscape 的 Brandan Eich仅用了几天时间就开发出了JavaScript(作为一种功能十分有限的浏览器扩展语言)。这不仅证明Eich是一个天才,也证明那个时期人们对编程语言的设计有了很好的理解。

这一时期出现了许多其他的编程语言,其中最有名的是Java。这门语言本身并没有特别之处,但它提供的JVM是一个通用的运行时环境,实现了“编写一次,到处运行”,也就是说该语言十分通用,不受特定硬件、操作系统、或目标环境的限制。严格来讲,早期的JVM并没有什么值得炫耀的,但它开创了语言运行时及部署选项日益成熟的时代。

2ef8a51a98c37e2c106f97d6608e1418.png

迅速发展(2000年~2010年)

自JVM以后,编程语言就开始朝着一个有趣的方向迅速发展。源自Self语言(Smalltalk的后继者,虽然优秀但非常失败)的即时编译器(JIT)得到了更深入的研究,从而诞生了Java的HotSpot,而微软为了对抗Java推出了.NET CLR。.NET则更进一步,将 CLR(Common Language Runtime,公共语言运行时)作为了多语言的通用运行时,而不仅仅是C#。事后看来,这是一个分水岭:编程语言的选择变得无关紧要。这可能不是微软做出这个选择的主要原因(当时他们仍在努力继续支持流行度非常高的Visual Basic,还有C#),再加上那段时间微软的封闭式许可,最终CLR未能成为最受欢迎的运行环境。但在千禧年之后的第一个十年中,编程语言的数量越来越多,而且无处不在。

另一方面,程序员的数量也出现了爆炸式增长。随着软件的需求快速增长,以及工具和知识的普及,全世界数百万人都变成了程序员。这些程序员也是人类,他们渴望强烈的群体认同。就像普通人对体育运动团体有着强烈而非理性的看法一样,程序员也开始在编程语言的选择问题上站队。许多程序员迫不得已选择某种新兴、独特、特殊的编程语言。例如,有人声称函数式编程才是王道、Ruby比Python好、Scala将彻底改变数据科学、不选Clojure是你的损失……至此,编程语言从线性发展进入了混乱的达尔文优胜劣汰时期。

4a0f5c3ff52592a4c4fb01417f11cea1.png

超标准化(2010年至今)

原以为,这个时期的人们会意识到某些编程语言过于疯狂,无法持续发展。然而,实际情况并非如此,相反,情况出现了意想不到的转变。在“云”计算时代,许多应用程序和服务的部署跨互联网上的大量分布式节点,使用哪种编程语言似乎已无关紧要。程序员都在开发互相交流的独立组件,又有什么必要纠结编程语言呢?组件之间并不需要知道彼此是用哪种语言编写的。如果程序员喜欢用X语言编写组件,那么就用这种语言好了。谁在乎呀。

在不同机器上运行的组件也是如此,随着Docker的发布,容器得到了普及,无论是在一台机器上运行的应用程序,还是通过编排软件在机器集群上协作运行的软件,都可以使用相同的范例轻松管理。

如今人们仍在开发新的编程语言,其中不乏前途无量且备受期待的语言。有些是特定领域的(移动应用程序使用的Swift、Kotlin 和 Dart,以太坊智能合约使用的Solidity),而有些则比较通用,但每种语言都得益于这几十年来积累的经验教训(面向云编程的Go,面向系统编程的Rust,以及JavaScript的超集TypeScript,等等)。

与此同时,编程世界达到了一个新的成熟度,我们不再追逐每一种新趋势,采用每一种新语言。我们都成长了。

dd58690469e4a50cf920ce4a962560cd.png

专心学好一门编程语言

毫无疑问,有些编程语言确实更为出色,而有些编程语言则更适合处理某些特定的用例。任何从事过编程一段时间的人都清楚,学习一门新语言一点也不难。大多数程序员只需一个下午,就可以轻松学习一门新语言的基础知识,使用几天后就可以多或少地提高工作效率。新手程序员可以从任何一门主流编程语言开始学习,并将学到的编程知识轻松地应用到其他语言中。

然而,频繁变更编程语言并非好事,原因主要有两个。首先,学习编程语言有点像学下棋。你可以快速学习规则,但这并不意味着你可以战胜经验丰富的玩家。你需要学习策略,而这需要时间和练习。这是一个由最佳实践、陷阱、优化技术,以及库、工具和社区组成的生态系统。其次,编程虽简单,却容易出错。即使拥有常见的编程经验和最好的工具,将想法转换为计算机代码也不是一件直觉行为。无论程序员建立了怎样的直觉,也必须经历反复使用、即时反馈和纠错的循环。每次更换编程语言,你都需要付出代价。所以,根据我的经验,编程语言的选择很重要,但是一旦做出了选择,从长远来看,就应该坚持下去。

570f78698c497e41ebe4c39f6e0459ca.png

如何选择编程语言

时至2022年,我们在选择编程语言时,需要考虑以下几点。

首先,最关键的考虑因素是语言的适用范围。如果是特定的领域,必须使用一些特定于领域的语言,则最具普遍适用性的语言是首选。值得庆幸的是,自从Java提出“编写一次,到处运行”以来,运行时和部署便不再是问题,成本和许可也不再是制约因素。时至今日,所有编程语言、运行时以及各种工具基本都可以免费获取。如果某种语言不适合某个特殊的场合,只能说它的流行度不够,没有普及到所有人;要么是因为一些基本因素,导致该语言确实不适合该任务。

流行度很重要,我们应该选择拥有强大的社区、丰富的信息来源、大量其他程序员可供合作或雇佣的语言。任何不受欢迎的语言都不值得选择。如果遇到特殊情况,则选择会更困难。没有任何一种语言能够适用于所有场景,但在理想情况下,通用的主流语言应该足以应对大多数场景。

最后,我们选择的编程语言应该优于大多数其他语言。即使在2022年,仍有一些糟糕的编程语言,难以学习和使用,很容易让程序员陷入困境。

鉴于上面的陈述,我认为实际上我们并没有太多选择。下面,就让我们来看看这些最佳编程语言。

417dcd1afab6cb4dff60fbc624759b0e.png

最佳编程语言

JavaScript / TypeScript

编程语言界的JavaScript就像人类交流时使用的英语一样。它是最流行、最通用的编程语言,适用于许多不同的场景(浏览器/前端、系统/后端、作为扩展语言嵌入到许多环境中)。JavaScript的运行时(V8 / Node / Deno)非常高效,拥有许多出色的工具和庞大的社区。

TypeScript是JavaScript的超集,引入了强类型和标准工具,正在迅速发展成为JS编程的默认选择。

Rust

Rust拥有C/C++的所有功能,更易于使用,而且也没有太多陷阱。Rust的社区和生态系统非常强大且在不断发展,工具也很好用。如果你需要的功能Rust都提供了,那它绝对是不二之选。以前只能使用C或C++的场合,如今也可以选择Rust。此外,Rust还在建立自己的WebAssembly通用语言(WebAssembly可以说是终极版的“编写一次,到处运行”的运行时)。

704fc34c9617404779ce5bf422dc41a7.png

强有力的竞争对手

Python

我使用Python已经超过20年了,可惜时至2022年,Python依然算不上真正的通用编程语言。原因之一是,Python仍然非常低效,很多注重性能的场合都无法采用Python。还有一个原因是,它未能进入主流的面向用户环境,比如网络浏览器或手机。尽管如此,Python仍不失为一种出色的编程语言,而且在数据工程/数据科学/机器学习中占据了重要位置,所以如果你从事这些领域的工作,那么Python绝对是一门值得了解和热爱的语言。就目前的情况来看,Python很可能会作为数据科学的通用语言继续发展下去,但可能无法突破这个领域。

Go

Go是一种非常适合“云”编程的语言。Go语言优雅、易于学习和使用,拥有出色的社区、生态系统和工具。它被广泛应用于云原生领域的核心产品,因此它会长期发展下去。不幸的是,Go并没有普遍的适用性,基本无法用于互联网服务器之外的环境。此外,由于Go设计上的选择,它在C/C++世界中表现不佳。Go固然好,但如果必须做出选择,凡是Go能实现的功能Rust都可以实现,随着时间的推移,Go有可能会被主流系统编程语言取代。

C#/Java

C#及其生态系统非常出色,你可以用它实现很多功能。Java的各个方面都比不上C#,所以我不理解为什么有人会喜欢它,但Java确实很流行。C#的应用很广泛,不仅是一种系统和“商业”语言,现在更是延伸到了移动应用程序和浏览器。强大的运行时,伟大的生态系统。但是,除非你需要C#的一些量身定制的运行时和工具的功能,否则在短期内C#很难与JavaScript和Rust竞争。

C/C++

根据林迪效应,C和C++在未来几十年内将继续流行下去。如果你已是这两种语言的专家,肯定不愁找工作。如果有这方面的需求,则花时间学习二者也是不错的选择。否则,选择Rust更合适。

a10e303c2e69a4a4133015f1e13cfc06.png

荣誉奖

Swift / Kotlin / Dart

这几种语言在特定领域占有一席之地。如果需要移动UI编程,则这些是不错的选择。但JavaScript的适用性更普遍,而且也同样适用于移动开发,因此我们更应该选择JavaScript。

LISP(Racket / Clojure)

LISP很特别,即使日常工作没有这种需求,也应该学习一下。Racket 是最先进的、非常复杂的语言(实际上它是一种语言构建工具包)。据传,Clojure的功能很强大,因为它的目标是JVM,可以使用 Java 库。但我不清楚这个卖点有多大作用。

Haskell / F# / Scala

函数式语言很重要。在某些情况下,它们是更优的选择。Haskell是函数式编程的代表。F#具有更好的普遍适用性,因为它的运行平台是CLR,并且可以使用 .NET 库。Scala不是纯粹的函数式,但非常通用,并且在 JVM 上运行。

Julia / R / MATLAB

Julia非常适合数学领域。R和MATLAB都有各自擅长的特定场合。不过,在Python主导的数据工程领域,这些编程语言恐怕很难幸存下来。

PowerShell

如果你从事shell编程,那么PowerShell是迄今为止最好的选择。它适用于所有操作系统,所以我们没有理由使用任何其他 shell。PowerShell也算是一种通用编程语言,但实际上在非系统管理之外,没有人使用它。

1b9b1036468a89e14d01ca24d80e6523.png

迟暮之年

PHP / 红宝石 / PERL

这些语言也曾有过辉煌的岁月,主要是作为网络“后端”语言。无论你如何看待这些语言,如今都不应该再在它们身上白花力气。它们都在走向灭亡。

Visual Basic / VBA

VB 改变了世界,但如今却被淘汰出局了,无论是作为通用语言还是作为对其他程序的扩展。在遥远的过去可以用VB实现的功能,如今都可以用其他现代语言更出色地实现。

a94607e910cdd90f5e3b0516974d19bd.png

总结

我喜欢编程语言,而且永远对新语言充满了好奇。但是,就目前而言,TypeScript是我心目中的C位,而在需要强大的功能和低级访问权限的情况下,Rust居第二。我相信,2022年几乎所有程序员都与我有类似的看法。

7eb442ce3bc2ce230256e520cc771472.gif

往期推荐

关于“算力”,这篇文章值得一看

面向对象分析与设计的底层逻辑

热搜!华为 30 岁以下员工仅占 28%,网友:35 岁危机呢?

中国信通院魏博锴:云原生混部标准解读

5e6f66d6758fb7833b3f50e85f10d815.gif

点分享

73efc42ae250c12c9519f192f93f7ea0.gif

点收藏

ec50c61cef6528672e388b2f6951fc9c.gif

点点赞

1861d7e6386325c96637ae24d52f15bc.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高效使用Java构建工具|Maven篇|云效工程师指北

简介:高效使用Java构建工具|Maven篇。众所周知,当前最主流的Java构建工具为Maven/Gradle/Bazel,针对每一个工具,我将分别从日常工作中常见的场景问题切入,例如依赖管理、构建加速、灵活开发、高效迁移等&am…

布局云与边缘之后,Akamai 为何加码安全领域

作者 | 宋慧 出品 | CSDN 云计算 随着云的深入和普及,云上的安全也变得愈加重要。CSDN 系列技术直播栏目《大咖来了》就曾重点讨论 云上安全的攻防之道 ,以及云原生的安全发展。 最近,发明 CDN 技术的资深技术厂商 Akamai,继增强…

Dubbo-go 服务代理模型

简介:HSF 是阿里集团 RPC/服务治理 领域的标杆,Go 语言又因为其高并发,云原生的特性,拥有广阔的发展前景和实践场景,服务代理模型只是一种落地场景,除此之外,还有更多的应用场景值得我们在研发的…

探索AI视觉技术新应用,夸克扫描王首推“离线模式”端侧AI算法提升隐私安全

手机扫描正在超越传统扫描仪,给大学生和职场人带来更高效、更便捷的信息服务体验。 在基于手机相机功能的搜索行为中,大学生的学习场景占比超过一半。 手机扫描的“离线模式”,让夸克成为第一个将扫描AI算法上端的App。 各大高校开学在即&…

作业帮云原生降本增效实践之路

简介:目前,作业帮已经和阿里云有一个关于 AEP 的 tair 方案的结合,在新的一年希望我们有更大规模的落地。文章里讲得比较多的是关于降本做的一些技术改进,其实在降本增效这里面还有很大一块工作量是运营,成本运营我们也…

基于 Serverless 打造如 Windows 体验的个人专属家庭网盘

简介:虽然现在市面上有些网盘产品, 如果免费试用,或多或少都存在一些问题, 可以参考文章《2020 国内还能用的网盘推荐》。本文旨在使用较低成本打造一个 “个人专享的、无任何限速的、如 Windows 体验的私有云盘”。 作者 | 西流…

Apsara Stack 技术百科 | 数字化业务系统安全工程

简介:数字化平台已经与我们生活紧密结合,其用户规模庞大,一旦系统出现故障,势必会造成一定生活的不便。比如疫情时代,健康码已经成为人们出门必备的条件,一旦提供健康码服务平台出现故障,出行将…

支撑百万级传感器的延时队列

文/升哲科技 刘鹏 摘要:本文主要描述升哲科技在打造物联智慧城市平台过程中关于如何实现延时队列服务的技术选型经验、延时队列服务的架构设计以及延时队列的底层细节实现原理。 背景 升哲科技是一家物联网与人工智能领域的国家高新技术企业、独角兽企业。 要打…

深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统

简介:阿里云 Kubernetes 可观测性是一套针对 Kubernetes 集群开发的一站式可观测性产品。基于 Kubernetes 集群下的指标、应用链路、日志和事件,阿里云 Kubernetes 可观测性旨在为 IT 开发运维人员提供整体的可观测性方案。 作者:李煌东、炎…

系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术

简介:已有的应用若想使用RDMA技术改造成本高,那么有没有一种技术是不做任何改造就可以享受RDMA带来的性能优势? 文/龙蜥社区高性能网络SIG 引言 Shared Memory Communication over RDMA (SMC-R) 是一种基于 RDMA 技术、兼容 socket 接口的内…

技术引领未来, IDC TechScape中国数据安全发展路线图首发

2022年8月26日,IDC 2022 CSO全球网络安全峰会(中国站)在上海隆重开幕,会上首次发布《IDC TechScape:中国数据安全发展路线图,2022》。报告认为,帮助用户构建全方位数据安全治理体系将成为大趋势…

DataV 3D 平面地图 2.0 焕新上线

简介:DataV3月,3D平面地图2.0现已上线~ 3D 平面地图 2.0 现已上线~ 让我们来看看更新了哪些功能吧! 01 交互升级,省市区自由下钻 自带行政区域数据,无需配置: 甚至,可以通过「蓝图编辑器」实…

PolarDB-X 发布 2.1.0 版本,Paxos 开源

简介:2022年4月1号,PolarDB-X 正式开源X-Paxos,基于原生MySQL存储节点,提供Paxos三副本共识协议,可以做到金融级数据库的高可用和容灾能力,做到RPO0的生产级别可用性,可以满足同城三机房、两地三…

828成首个B2B企业节,华为联合3万生态伙伴助力中小企业数字化转型

中小企业既是市场的主体,也是保就业的主力军。截至2021年末,中小企业在全国企业中数量占比已超过99%,并贡献了80%的就业机会。 为助力中小企业创新发展,8月28日,华为联合3万家生态伙伴,共同发起了全国首个…

阿里云贾扬清:数据湖正成为企业数据应用创新标配

简介:全球数据湖峰会开幕 数字经济蓬勃发展的今天,越来越多的用户已经从“上好云”,走到了“用好云”的这个阶段。如果说在“上好云这个阶段,大多数用户关心的是如何在成本上获得更好的回报。那么在上好云这个阶段,更…

强强联手,NVIDIA 与 Ampere Computing 重磅推出云原生服务器平台

随着 5G、元宇宙的兴起,云游戏再一次迎来爆发。据 IDC 与中国信息通信研究院联合发布的《全球云游戏产业深度观察及趋势研判(2022年)》显示,2021年,中国地区云游戏市场收入已达 40.6 亿元,同比增长 93.3%。…

有了这款工具,定位线上问题事半功倍|云效工程师指北

简介:有了这款工具,定位线上问题事半功倍,程序员在日常工作中经常会遇到一些线上问题需要排查,本文的主人公程序员小张也不例外。但排查的过程却时常令他困扰不已。让我们一起看看他遇到了哪些问题,又是怎么解决的。 …

云原生时代如何用 Prometheus 实现性能压测可观测-Metrics 篇

简介:可观测性包括 Metrics、Traces、Logs3 个维度。可观测能力帮助我们在复杂的分布式系统中快速排查、定位问题,是分布式系统中必不可少的运维工具。 作者:拂衣 什么是性能压测可观测 可观测性包括 Metrics、Traces、Logs3 个维度。可观测…

基于 KubeVela 的机器学习实践

简介:本文主要介绍如何使用 KubeVela 的 AI 插件,来帮助工程师更便捷地完成模型训练及模型服务。 作者:KubeVela 社区 在机器学习浪潮迸发的当下,AI 工程师除了需要训练、调试自己的模型之外,还需要将模型进行部署上…

Gartner发布2022年云平台服务技术成熟度曲线,iPaaS、低代码将达到成熟期

Gartner 2022年云平台服务技术成熟度曲线显示,集成平台即服务(iPaaS)和低代码应用平台(LCAP)技术将在不到两年的时间内达到生产成熟期(Plateau of Productivity)。 编辑 | 宋慧 供稿 | Gartner…