为什么程序员会有最喜欢与最讨厌的编程语言?(earthly)


Stack Overflow的2020年调查结果对“最恐惧的编程语言”和“最喜欢的编程语言”进行了排名。这两个排名都来自这个问题:
在过去的一年中,您完成了哪些编程,脚本和标记语言的广泛开发工作,并且在接下来的一年中又要进行哪些工作?(如果您既使用了该语言,又想继续使用该语言,请选中该行中的两个框。)
前15种可怕的编程语言:
VBA,Objective-C,Perl,Assembly,C,PHP,Ruby,C ++,Java,R,Haskell,Scala,HTML,Shell和SQL。
最受欢迎的15种编程语言:
Rust,TypeScript,Python,Kotlin,Go,Julia,Dart,C#,Swift,JavaScript,SQL,Shell,HTML,Scala和Haskell。
 
旧代码总是最糟糕的
旧代码是最糟糕的。在经过三年多的积极开发的代码库中,想找到我一个文件,很难跟踪。现实世界中的代码会不断发展以适应其特定领域,并且随着这种行为的发展,它变得更加复杂且难以理解。原因很简单,我首先从乔尔·斯波斯基(Joel Spolsky)听说过。

认为旧代码是一团糟的原因是由于基本的编程基本法则:阅读代码比编写代码难。乔尔·斯波斯基(Joel Spolsky)

我们称其为乔尔定律。在此前提下会有很多事情发生。为什么大多数开发人员认为他们继承的代码是一团糟,并想将其扔掉并重新开始?
这是因为从认知上讲,扔掉它至少比理解代码库所付出的辛苦工作要少,为什么许多重写注定要失败?因为使代码看起来凌乱的大部分原因都是至关重要的,因此随着时间的推移而进行的改进很少。如果没有简化它们的计划,您将回到起点。
在编写代码时很容易理解代码。您正在执行它,并在运行时对其进行完善,但是,在事后阅读代码就很难理解代码。代码本质上也是复杂的,这种复杂性也导致痛苦的代码质量问题。这可能就是为什么PR积压的问题持续存在的原因吗?PR评论是一种只读活动,如果您尚不具备代码当时工作模型,那么旧很难做得很好。
如果许多现实世界的代码被不公平地认为是一团糟,那么编程语言是否也会被不公平地判断?如果您在最喜欢语言Go中构建新事物,但必须维护庞大的20年历史C ++代码库,您能否对它们进行公平排名?
 
棕色和绿色语言
对于2016年已经进入排行榜前20名的语言,现在更可能使已经将其用作维护工作的语言,我们称它们为棕色语言;2016年未进入前20名的语言更有可能用于新项目中。我们将这些称为绿色语言。
棕色语言:您更可能在现有软件维护中使用的语言列表:Java,C,C ++,C#,Python,PHP,JavaScript,Swift,Perl,Ruby,Assembly,R,Objective-C,SQL
绿色语言:您更可能在新项目(即绿色项目)中使用的语言:Go,Rust,TypeScript,Kotlin,Julia,Dart,Scala和Haskell
现在我们可以回答这个问题:人们是喜欢还是害怕他们所陈述的语言,还是只是在害怕遗留代码?
将棕色和绿色语言与前面最喜欢和害怕的语言两个调查结果合并后,发现:

  • 在最害怕的语言中几乎都是棕色语言。
  • 在最喜欢的语言中有54%是绿色。

人格中的另一个缺陷是每个人都想要建造而没有人想要维护。―库尔特·冯内古特(Kurt Vonnegut)

没有人喜欢维护别人的代码。而且,由于乔尔定律:阅读现实世界很难编写代码。构建新事物很有趣,而使用新语言的频率更高。
 
编程语言炒作的生命周期
喜爱的编程语言被大量使用,这导致代码维护,这又使人们不喜欢它们,从而导致人们寻找更绿色的牧场并尝试更新的牧场语。流行的框架也可能遵循此生命周期。

Ruby是2007年最热门的语言,尽管今天它确实有更多竞争,但Ruby是比那时更好的语言。然而现在,它令人恐惧。在我看来,部分差异在于现在人们需要维护14年的Rails应用程序。这使得Ruby的趣味性不如所有新项目。因此,请注意Rust和Kotlin以及Julia和Go:您最终也会失去光环。
 
黑客新闻网友讨论
我认为Go当前处于蜜月期,人们会在10年后讨厌它。但是即使Rust是一门传统语言,Rust也将继续受到人们的喜爱,Ruby可以通过最少的仪式快速而轻松地做事。随着时间的推移,这种特性使PHP和Perl进入了“恐惧”类别;另一方面,Rust已针对维护进行了优化,Rust API很难被滥用,所有内容都受到约束并非常明确地指定。文档和测试与您的代码保持内联。您确切地知道一段代码可以做什么和不能做什么
 
我见过的大多数语言都以易于学习而闻名,随后也因维护麻烦而赢得声誉:perl,ruby,python,php,javascript等。这可能是选择效果而不是语言功能。较简单的语言会成比例地吸引较弱的程序员。
 
“学习困难”是上下文中的重要因素,例如,如果您已经了解Perl或PHP,则Python或Ruby可能相对容易学习。我发现Haskell很难学习。随后,PureScript非常简单。随着时间的流逝,广泛共享的知识和概念会发生变化,它们将影响采用的便利性。
 
我每天都用Python编程。Racket可能是Python之后我最了解的语言,然后可能是Groovy。我接触过R,C,C ++,D,Java,Common Lisp等,由于我的熟悉程度,我发现采用新语言更容易。尽管Rust具有我习惯于使用其他编程语言的所有构造,但我发现Rust是我在最近的记忆中最难学习的一种。文档很棒,书很棒,Cargo的工具很棒,但是在阅读了本书的前15章之后,我努力编写了一种具有任何复杂性的程序。当然,我可以轻松地向我的项目中添加依赖,但是要弄清楚库中所有内容引发的错误会花费很多工作。与同一时间其他编程语言相比,使我对Rust的适应需要更长的时间。这并不是说这是一种不好的语言。我记得有一天,在调试完一个Python问题之后,我最终感到自己是一个愚蠢的逻辑错误,我大喊:“我希望我知道一种编程语言,可以让我摆脱自己的束缚”。我想...或更确切地说,我希望Rust对于我来说是长期的语言。
 
Rust不比C ++更“难以学习”或“难以入门”。C ++当然是一种具有大量传统的语言,足以合理地称其为“棕色”。Go是一种完全不同的语言,与Java作为最接近的“棕色”对应语言相比,它也许是最好的。
 
我不同意,进行良好维护的事情与学习难度和是否入行的难度都相关。易于学习的东西往往很容易入手,但最终却通过框架或编码标准增加了难度,因为存在复杂的项目,这既增加了学习的难度,又使他们难以接受。具体来说,维护代码时需要像最初创建代码的人一样思考。您的想法与他们越一致,就越容易维护。转变为像他们一样思考的行为是学习和入职。
 
在使用了多个大型golang代码库后,其冗长的工作变得很乏味。它不能很好地适用于IDE。错误处理总是一团糟,这里列出了Java没有的许多问题。例如无法实现Java中字符串链接操作someString.trim().toUpper().endsWith(“ ...”))。不要让我开始使用所谓的快速编译时间。解析速度很快,但是链接速度却非常慢。修改和重新运行单元测试一次需要花费几秒钟的时间来重新链接。在Java中,因为没有链接,所以眨眼之间就可以了。
 
我认为这有点不对劲。编程语言通常分为两类:

  1. 它们是由一个或两个怪人设计的,因此包含一些重要的指导原则和许多可疑的想法,这些想法不可避免地又回到了大型项目中;
  2. 它们是由一个委员会设计的,该委员会试图制作能够解决所有可能问题的最终通用语言,从而导致一本无人阅读的400页规格的语言陷入窘境。

大多数主流语言做了一些尝试,以满足软件在规模上要求; 例如,OO显然使软件更易于维护,因此大多数语言至少部分支持它。但是,如果您使用的是C ++之类的语言,则很明显,添加了许多功能只是因为它们很酷或表达能力增强(例如,运算符重载),而不考虑长期的可维护性。甚至像“隐含的'this'之类的世俗事物一样,显然也对可读性有害,但显然具有好处。
 
当Ruby成为“热门”产品时,它带来了很多新东西,而新开发人员现在已经把这些东西视为理所当然。如果您使用typescript甚至C#启动一个新项目,那么您将获得使Ruby在2006年变得很棒的所有东西。当我向新的开发人员介绍Ruby时,我唯一要支持的就是它是一种设计精美,表达能力强的语言,当然任何新手都可以用它的缺点来说服我:性能中等,没有类型定义,并且语言中没有事件I / O。我确实害怕无法在Ruby中启动新项目的那一天,仅仅是因为我要招聘的人员变成了一个讨厌为Ruby工作的人。
 
看到Ruby被列为一种可怕的语言,这实在令人痛心。我认为,实际上令人恐惧的是Rails,而PM迫使其在2010年代所做的可怕,糟糕,无用的事情。我现在是Python开发人员,但我仍然想念用Ruby编写代码的难易程度。我发现它是一种轻松,直观的活动,我希望它用于除笨拙,可伸缩性差/计划不足的Web应用程序之外的其他用途。
 
我认为Kotlin和TypeScript将继续受到人们的喜爱;他们以简单且精心策划的方式解决了真正的痛点,我认为Scala会令人恐惧,我认为Haskell仍然会被爱和恐惧。最有趣的问题是Go和Rust。我的直觉是,我认为Go会像Ruby:一开始就很不错,但是随着项目越来越大,它变得越来越笨拙。我确实发现对小型Go文件进行黑客入侵是一件令人愉快的事情,但会害怕加入具有数百万行Go代码的项目。Rust可能会被视为未来的C ++,以难以维护的代码库大而笨拙而闻名。或者,它可能会被誉为未来更好的C ++,以使笨拙的代码难以维护,使它们更易于维护和令人愉悦地工作而闻名。
 
banq: 程序员易于掌握与代码易于维护是两件完全不同事情,以前设计语言的人大概没有意识这点,期待以后新语言设计意识到这两个方面的区别,并提出好的解决方案,只有找出问题根源,就能解决问题,最大问题是无法找到真正问题根源。