最近,著名游戏程序员、id Software 创始人之一John Carmack在采访中表示,程序员该当专心学好一门编程措辞。这倒让我感到有点惊异。虽然我个人非常赞许这条建议,但在如今的程序员圈子里,这种不雅观点是有争议的。
我猜,我便是大家所说的“老程序员”了。我的岁数不小了,生平都在从事编程事情,而且从步入社会之后就一贯在从事这项专业事情。有时,我以为自己是一名编程措辞爱好者,亲眼目睹了许多编程措辞的发展。回顾过去,这是一段激动民气的历史,我们会不由自主地得出一个(缺点的)结论:多节制几种编程措辞总没坏处。编程措辞的历史发展非常精彩,但如今的发展形势相比拟较平和。
在本文中我想回顾一下曾经的历史,总结履历教训,并看一看究竟哪种编程措辞才是最好的标准化措辞。

01
史前阶段(50年代~80年代)
随着打算硬件和打算机科学作为一门学科逐渐兴起,打算机编程(除了处理器本身的指令之外)也开始缓慢地发展。在最初的几十年里,编程措辞紧张是学术界的研究工具,还俘获了一小部分研究职员。程序员的选择很有限,紧张取决于领域。
业务编程利用COBOL,科学编程利用Fortran,还有一些其他措辞常日用于特定领域、研究或硬件。
对付大多数程序员来说,全体编程生涯或在很长一段韶光里,只需专心学习一门编程措辞。虽然有人对编程措辞的设计感兴趣,但彼时该领域还很稚嫩。只管涌现了一些很有趣的创新,但对付如何才能设计一种好的编程措辞,人们还没有很好的理解。
02
专业化(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 都是有趣而优雅的措辞,但由于捆绑到了专门的硬件和昂贵的工具,导致末了失落势。
03
成熟(90年代~2000年)
后来,互联网兴起。互联网对编程措辞的影响究竟有多大大概未可知,但无疑这是一个重大成分。良久以前,编程措辞是一个罕有之物,常日出身于研究实验室和大型商业公司;但如今彷佛任何一个人都可以开拓出自己的编程措辞。曾有一段韶光,PERL成为了盛行的通用措辞,涵盖了从系统管理到 Web 编程的方方面面。
后来,Python从科学研究措辞变成了大略易学的通用措辞,只管最初发展缓慢,但终极席卷了全体天下。据传,Netscape 的 Brandan Eich仅用了几天韶光就开拓出了JavaScript(作为一种功能十分有限的浏览器扩展措辞)。这不仅证明Eich是一个天才,也证明那个期间人们对编程措辞的设计有了很好的理解。
这一期间涌现了许多其他的编程措辞,个中最有名的是Java。这门措辞本身并没有特殊之处,但它供应的JVM是一个通用的运行时环境,实现了“编写一次,到处运行”,也便是说该措辞十分通用,不受特定硬件、操作系统、或目标环境的限定。严格来讲,早期的JVM并没有什么值得炫耀的,但它首创了措辞运行时及支配选项日益成熟的时期。
04
迅速发展(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是你的丢失……至此,编程措辞从线性发展进入了混乱的达尔文良好劣汰期间。
05
超标准化(2010年至今)
原以为,这个期间的人们会意识到某些编程措辞过于猖獗,无法持续发展。然而,实际情形并非如此,相反,情形涌现了意想不到的转变。在“云”打算时期,许多运用程序和做事的支配跨互联网上的大量分布式节点,利用哪种编程措辞彷佛已无关紧要。
程序员都在开拓互相交流的独立组件,又有什么必要纠结编程措辞呢?组件之间并不须要知道彼此是用哪种措辞编写的。如果程序员喜好用X措辞编写组件,那么就用这种措辞好了。谁在乎呀。
在不同机器上运行的组件也是如此,随着Docker的发布,容器得到了遍及,无论是在一台机器上运行的运用程序,还是通过编排软件在机器集群上协作运行的软件,都可以利用相同的范例轻松管理。
如今人们仍在开拓新的编程措辞,个中不乏出息无量且备受期待的措辞。有些是特定领域的(移动运用程序利用的Swift、Kotlin 和 Dart,以太坊智能合约利用的Solidity),而有些则比较通用,但每种措辞都得益于这几十年来积累的履历教训(面向云编程的Go,面向系统编程的Rust,以及JavaScript的超集TypeScript,等等)。
与此同时,编程天下达到了一个新的成熟度,我们不再追逐每一种新趋势,采取每一种新措辞。我们都发展了。
06
专心学好一门编程措辞
毫无疑问,有些编程措辞确实更为出色,而有些编程措辞则更适宜处理某些特定的用例。任何从事过编程一段韶光的人都清楚,学习一门新措辞一点也不难。大多数程序员只需一个下午,就可以轻松学习一门新措辞的根本知识,利用几天后就可以多或少地提高事情效率。新伎俩式员可以从任何一门主流编程措辞开始学习,并将学到的编程知识轻松地运用到其他措辞中。
然而,频繁变更编程措辞并非好事,缘故原由紧张有两个。首先,学习编程措辞有点像学下棋。你可以快速学习规则,但这并不虞味着你可以降服履历丰富的玩家。你须要学习策略,而这须要韶光和练习。这是一个由最佳实践、陷阱、优化技能,以及库、工具和社区组成的生态系统。
其次,编程虽大略,却随意马虎出错。纵然拥有常见的编程履历和最好的工具,将想法转换为打算机代码也不是一件直觉行为。无论程序员建立了若何的直觉,也必须经历反复利用、即时反馈和纠错的循环。每次改换编程措辞,你都须要付出代价。
以是,根据我的履历,编程措辞的选择很主要,但是一旦做出了选择,从长远来看,就该当坚持下去。
07
如何选择编程措辞
时至2022年,我们在选择编程措辞时,须要考虑以下几点。
首先,最关键的考虑成分是措辞的适用范围。如果是特定的领域,必须利用一些特定于领域的措辞,则最具普遍适用性的措辞是首选。值得光彩的是,自从Java提出“编写一次,到处运行”以来,运行时和支配便不再是问题,本钱和容许也不再是制约成分。时至今日,所有编程措辞、运行时以及各种工具基本都可以免费获取。
如果某种措辞不适宜某个分外的场合,只能说它的盛行度不足,没有遍及到所有人;要么是由于一些基本成分,导致该措辞确实不适宜该任务。
盛行度很主要,我们该当选择拥有强大的社区、丰富的信息来源、大量其他程序员可供互助或雇佣的措辞。任何不受欢迎的措辞都不值得选择。如果碰着分外情形,则选择会更困难。没有任何一种措辞能够适用于所有场景,但在空想情形下,通用的主流措辞该当足以应对大多数场景。
末了,我们选择的编程措辞该当优于大多数其他措辞。纵然在2022年,仍有一些糟糕的编程措辞,难以学习和利用,很随意马虎让程序员陷入困境。
鉴于上面的陈述,我认为实际上我们并没有太多选择。下面,就让我们来看看这些最佳编程措辞。
08
最佳编程措辞
JavaScript / TypeScript
编程措辞界的JavaScript就像人类互换时利用的英语一样。它是最盛行、最通用的编程措辞,适用于许多不同的场景(浏览器/前端、系统/后端、作为扩展措辞嵌入到许多环境中)。JavaScript的运行时(V8 / Node / Deno)非常高效,拥有许多出色的工具和弘大的社区。
TypeScript是JavaScript的超集,引入了强类型和标准工具,正在迅速发展成为JS编程的默认选择。
Rust
Rust拥有C/C++的所有功能,更易于利用,而且也没有太多陷阱。Rust的社区和生态系统非常强大且在不断发展,工具也很好用。如果你须要的功能Rust都供应了,那它绝对是不二之选。以前只能利用C或C++的场合,如今也可以选择Rust。
此外,Rust还在建立自己的WebAssembly通用措辞(WebAssembly可以说是终极版的“编写一次,到处运行”的运行时)。
09
强有力的竞争对手
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更得当。
10
名誉奖
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也算是一种通用编程措辞,但实际上在非系统管理之外,没有人利用它。
11
迟暮之年
PHP / 红宝石 / PERL
这些措辞也曾有过辉煌的岁月,紧张是作为网络“后端”措辞。无论你如何看待这些措辞,如今都不应该再在它们身上白花力气。它们都在走向灭亡。
Visual Basic / VBA
VB 改变了天下,但如今却被淘汰出局了,无论是作为通用措辞还是作为对其他程序的扩展。在迢遥的过去可以用VB实现的功能,如今都可以用其他当代措辞更出色地实现。
12
总结
我喜好编程措辞,而且永久对新措辞充满了好奇。但是,就目前而言,TypeScript是我心目中的C位,而在须要强大的功能和低级访问权限的情形下,Rust居第二。我相信,2022年险些所有程序员都与我有类似的意见。
10月好书
新
Rust实战
由浅入深先容Rust系统编程知识,涵盖数十个有趣的示例,简洁易懂,帮你理解Rust语法和Rust的实际利用,赠予示例源代码。
本书通过探索多种系统编程观点和技能引入Rust编程措辞,在深入探索打算机事情事理的同时,帮助读者理解Rust的所有权系统、Trait、包管理、缺点处理、条件编译等观点,并通过源自现实的示例来帮助读者理解Rust中的内存模型、文件操作、多线程、网络编程等内容。
C Primer Plus 第6版 中文版
大家喜好的编程措辞入门书最基本的哀求是“普通易懂”,这本近40年重版6次专门针对零根本读者的《C Primer Plus 中文版》就做到了这点。
作者在讲述每一个观点和方法的时候,都清晰地认识到读者是真正的“新人”,只管即便利用大略、普通的描述让这些内容更随意马虎被理解。
这本书完全而又详细地谈论了C措辞的根本特性,清晰地阐明了C措辞的基本观点和编程技巧,并且在之前版本上做了契合C11的更新升级。整体以简洁的代码示例帮助读者理解观点方法和加强读者的动手能力,外加章节末端的复习题和编程练习题,帮助读者巩固关键知识点的节制情形。
近40年以来,无数人以之入门C措辞,其有效性被广泛验证,豆瓣评分9.4!
C++ Primer Plus 第6版 中文版
本书同样是史蒂芬·普拉达的作品,因此帮助零根本读者完备入门C++的一本好书。只管C++与C有许多相似之处,但作者是完备为C++新人,乃至是编程新人而作这本书,完备不须要读者有任何C措辞方面的背景知识。
本书同样因此大略代码示例和图示来帮助读者理解C++根本观点与方法,同时会指出在这些观点和方法中随意马虎出错的情形,帮助读者轻松理解的同时避免踩坑,免走弯路。对示例中的关键内容,作者还会详细地作出阐明和剖析,让读者知道如何利用的同时更知道为什么要这样用,达到知其然更知其以是然的境界。
20余年的6次改版,本书依然是多数人入门C++的不二之选。
数学之美 第三版
数学能力一贯以来是多数程序员关注的点,而吴军博士这本《数学之美》系统地阐述了信息处理领域的技能和运用背后的数学事理,将繁芜的数学事理讲得普通易懂,大部分程序员都能轻易看懂,领略打算机和生活中的数学之美。
第三版在前两版的根本上新增了区块链、量子通信、人工智能的数学极限内容,并且险些将整体内容重写了一遍,让其普通易懂的同时又带有一定的深度,更适应当下的打算机环境。
当然本书并不是纯挚地向读者展示数学事理,更是通过里面的具体例子让读者学会新的思考问题的办法——如何化繁为简,如何利用数学去办理工程问题,如何跳出固有思维不断去创新。
浪潮之巅 第四版
作为打算机行业的从业者,理解科技行业的兴衰起落有助于我们把握科技时期发展趋势,从而更好地发展自我以适应未来。
本书第四版领悟了第三版和《硅谷之谜》的全部内容,并且新增了社交网络、无人驾驶等近四分之一的内容。吴军根据最新的行业发展状况,重新和更新了所有章节,整体容量是初版的两倍了。
通过认识IBM、思科、苹果、谷歌等IT巨子的发展进程,看吴军博士对其成败的客不雅观剖析,读者能够从他总结出来的信息家当发展规律中得到感悟,对行业,对自身职业会有全新的认识。程序员不单单是一份事情,更是一份发展性极强的职业,如何遇上一次浪潮,是有章可循的。
Python编程快速上手 第2版
Python作为本月排行榜的老大,势头正猛,更是成为职场中多数问题的优选办理方案。特殊是那些繁琐的重复性事情,人工手动处理实在是费时费力,专门去学习编程又本钱太高,利用Python工具快速处理便成了有效而大略的选择。
作为一本面向初学者的Python编程实用指南,本书能够让读者快速上手Python自动化,解放双手。本书前半部分是先容Python根本知识,后半部分是关注自动化任务。读者不用去过分关注Python的细节,就能够很快学会如何利用Python抓取Web信息、处理Excel电子表格、处理PDS和Word文档等常用的办公内容。
本书除了教会读者如何快速上手Python编程之外,还教会读者如何像真正的程序员那样精确地提出问题、寻求帮助,从而办理编程中碰着的问题。
打算之魂
吴军博士多年来就职于IT行业名企,积累了丰富的开拓履历,同时在长期职业生涯中,他口试了近千名精良的打算机科学家和工程师的候选人,对他们有比较全面的理解。以是他清楚地认识到不同层次的打算机工程师对同一个问题有着不同的思考办法,能给出不同的办理方法。
这本书便是他这么多年来履历的总结,让读者普遍明白一个道理:对打算机科学的节制程度,决定了他能走多远。他在书等分10个主题系统地讲解了打算机科学的精髓,详细剖析了每类题目不同层次工程师的思路和解决方法。读者通过阅读这些题目和剖析,可以比拟优化自己的解题思路,衡量自己的技能水平,从而做出针对性提升,以在职业道路上走得更快更远。
打算思维是所有程序员必须理解和节制的内容,只有这样才能真正把握打算机科学这门艺术,从而得到成功。