原文链接:https://blog.usejournal.com/on-choosing-programming-languages-8281c6f370b2
很有可能以经典的“我想写这么长时间”来开始这篇文章,但事实是,这个星球上几乎每个软件开发人员都这样做; 在他们的职业生涯中多次。选择编程语言的问题与编程语言本身一样古老,即使我知道如何,我也不会涵盖整个主题。我想在这里实现的只是传达一种看待问题的非传统方式。
在我们讨论之前,有一些善意的提醒。我已经这样做了20年了,我可能听起来有点愤世嫉俗。我完全清楚有些人会对这个主题敏感,所以,如果我的意见惹恼你,请相信我并不是反对你。
好吧,经过我的一番提醒你还是决定听听我放什么狗屁,那就让我们一起来探讨这个问题。
更好语言的神话
关于编程语言比较的所有讨论的核心是更好的编程语言的想法。这本身并不是问题 – 毕竟,如果你着手改进某些东西,那么你的定义意味着要做出更好的东西。编程语言也不例外。
当需要将他们的辛勤工作的结果转化为重要的市场份额时,问题就出现了。不幸的是,销售洗涤剂和销售编程语言之间没有实际区别。你经历了同样的动作,你发现了一个与众不同的因素 – 无论是真实的还是想象的 – 你吹捧它,你偶尔会说或暗示竞争对手不喜欢的东西,影响你的听众。这里有一些例子,听起来很熟悉吗?
1.可扩展的
2.防止错误的
3.易于理解的
4.优秀人员的
5.实用编程语言
这些努力的最终结果是,从很小的时候就开始牢牢地掌握了一种更好的编程语言。因此,我们中的许多人都深信这种编程语言之间存在根本差异的想法,然后我们每次必须评估我们所爱的或被鄙视的语言时,都会有意识地和无意识地使用它们。
我知道这听起来有点刺耳,但从某种意义上说,它在机械方面的作用方式与某些人相信人类之间的巨大差异的方式相同。不是种族,宗教或国籍,而是涉及编程语言家族,静态与动态类型,记忆管理等。一旦你相信存在天生的差异,并且你对更好的东西有了先入之见,那么你将把它们应用于确认偏见你所看到的一切。
但问题是,编程语言就像人类一样,他们在共享的开放领域竞争。存在差异,但它们不是天生的,它们是语境的,在事物的宏观模式中,人们几乎无法分辨出对错。您处理的所有语言都是完整的,它们基本上都将一个状态转换为另一个状态,因此具有相同的工具:数据结构,条件,操作和内存遍历机制。
所有编程语言都在进行持续的军备竞赛并使用相同的共享资源。他们不断地变形并互相借用。因此,编程语言之间的差异与洗涤剂品牌之间存在差异一样多。这主要是关于在情感上吸引你的重要事项。稍后会详细介绍。
客观测量的神话
为了消除营销噪音,我们大多数人都转向数据。这是我们自问的同一个老问题:“我如何根据客观测量做出更好的决策?”
“数据”的风格通常包括“X公司使用什么?”,“科学研究说什么?”,最终,“使用语言X的开发人员支付多少费用?”。所有非常好的问题,但没有一个与语言本身的质量有关。
“X公司使用的是什么”,天文数字与公司的成功关系不大。财务,公司文化,商业机会,流程管理和人才获取占公司成功的99.99%。他们使用哪种语言主要是早期创始人偏好的意外。Google – > Java,Facebook – > PHP,优步 – > Node / Go,语言选择与公司成功之间几乎没有任何一致性。此外,没有大牌开头的语言被认为是优秀的,Haskell,Rust等。难道你不觉得有点奇怪吗?你应该。
“科学研究说什么?”也是误导。首先,为了进行充分的比较,没有明显或甚至方便的方法来测量编程语言。因此,人们会深入研究各种简化方法来研究问题,测量诸如“虫密度”,复杂性等等,这是一个例子。其次,程序员在解释统计数据方面非常糟糕。你知道尼采曾经说过“当你长时间凝视深渊时,深渊开始盯着你看”。所以人们开始对静态打字的破坏承诺和类似的点击咬胡说八道。
这是一个经典的例子,请看下面的bug密度系数表,并比较PHP与JavaScript:

大多数人会关注0.10
PHP和0.03
JavaScript,并得出结论认为PHP的错误率是JavaScript的3倍。这似乎是一个明显的结论。但问题的真相是,PHP开发人员提交99.90%
了正确的代码,JavaScript开发人员提交99.97%
了正确的代码。不再那么激烈了不是吗?
请注意我是如何说“PHP开发人员提交”,而不是“PHP语言提交”?这是因为研究编程语言而不考虑使用它们的人是一个坚果壳中的阴茎测量竞赛。你不能接受Closure代码,主要由具有5 – 10年经验的Java资深人士编写,并将其与JavaScript进行比较,其中超过一半的开发人员将jQuery作为他们的第一个“语言”,然后从中得出任何合理的结论。你最终得到的只是一部便宜的戏剧。
这让我们了解了这个咆哮的要点。
人格类型,实际上
这是人们在谈论编程语言时很少接触的领域。而且我活得越多,我就越开始相信这实际上是冰山的水下部分。技术人员因为对于理解人类而无视这种奇怪的自豪感而臭名昭着,所以让我把一个非常基本的结构融入其中。
可能每个人都知道内向和外向的类型?我们都在某个时候接受了测试,并且知道我们自己的类型。人们通常不知道的是,内向者和外向者不是二元期权。这是一个连续统一体。例如,我处于规模的中间位置,并且可以根据环境以及在测试时我感觉到的充电程度而降落在任何一侧。
像外向与内向一样,人格类型还有其他方面。有很多系统试图将这些维度混合并匹配到描述个性的特征中。其中一个叫做Myers-Briggs Personality Types System。但还有其他一些,例如五因素模型,OCEAN,标准模型等。有一些非常有趣的个性方面会影响您的决策和偏好。我会谈谈他们中的几个
实践与摘要 - 这是更广泛的维度之一。基本上,由此得出谁是专注于具体细节的人之间的线是什么谁在可能的领域工作,专注于大局的思维和,人们可能是什么。当涉及到编程语言时,这将引发两种类型的偏好:有些人希望在一个代码中看到一个容易理解的故事,基本上,它在代码的作用方面是多么可读; 其他人将专注于抽象,接口和数据流模式。想想Python或JavaScript与Java。
Uninhibited vs Controlled - 描述人们如何看待秩序。有些人更有创造力,需要自由快速行动,轻松改变事物。其他需要结构刚性,他们需要在自己的鞋子中牢固地用螺栓固定才能有效。这里的经典例子是静态和动态类型; 或功能与命令式语言。
正如您所看到的,在决策制定方面,我们都有不同的看法。简单来说,可以说从实际和不受约束到抽象和控制都有一个渐变。结果,对一个人感觉合适的上下文(语言/工具集)可能会对另一个人感到完全错误。但是因为我们软件开发人员不习惯于在感受和情感方面进行思考,所以我们更倾向于将它们提升到语言特征领域,为这些特征自我赋值,然后从这种自我辩论的角度证明我们的选择是合理的。
集团动力
关于我们人类的有趣之处在于,我们都希望被爱和适应。而最简单的方法就是属于一群志同道合的人。结果,这些群体通常围绕相同的“价值”形成,这些“价值”源于流行的人格特质。
从历史上看,编程语言来自学术界,为了论证,我们可以将其标记为抽象和控制; 因为这些人过去常常每天处理科学,数学和方程式。随着软件工程成为一种专业并可供更广泛的受众使用,这些团体朝着更加务实和不受约束的方向发展。人们可以通过编程语言的流行来跟踪这种变化。
ASM – > C – > C ++ – > Java – > Ruby / Python – > JavaScript
发生这种情况的原因是人格特征在人口中不均匀分布。卓越的抽象思维技能实际上很少见,而且大多数人都会更实际地思考。对于秩序感也是如此,大多数人更喜欢接受混乱,而不是试图将所有东西分类为结构和类别,并尝试以这种方式控制不确定性。
结果,我们都能感知到由不均匀分布的特征驱动的语言流行度与我们自己的个性类型之间的差距。我们中的一些人更灵活,更具多角色,适合大多数环境; 或者只是属于流行的类型。但是,有些更严格,需要更好的工具/个性。由于我们消费的营销材料,并不总是如此明显。因此,我们陷入了同伴的压力,并试图在自己中寻找问题,而不是试图了解不匹配背后的原因。
结论
我认为如果你想要的话,选择编程语言可能是一个理性的和分析性的决定。但是,人们应该以类似的方式看待这个决定,选择他们想要为之工作的公司。忘记语言和技术,看看人们,社区,你将要合作。你点击它们吗?你可以成为其中之一吗?它真的适合你的个性吗?
请记住,营销材料是你的敌人。通常,语言的作者会试图从他们语言的技术特征中推断出价值。这不是价值观的工作方式。价值观只能来自文化,文化源于个性。
最后,您作为软件工程师的有效性将取决于您是否融入与语言相关的社区文化,而不是语言所具有的功能。
毕竟,作为软件开发人员的大部分时间实际上并没有编写代码。大部分时间都用于计算事物的工作原理以及如何在代码中表达。这是您需要最大程度减少摩擦的部分。这部分取决于你如何理解世界,这主要是由你的个性类型驱动的。
PS:案例研究
我觉得让你挂在这里只是一个想法是不公平的。所以,我会尝试用自己作为一个例子来证明这一点。在我20年的职业生涯中,我用十几种语言专业地工作; 有些人比其他人工作得更好,其中很多都可以通过我的个性特征来解释。
嗨,我是尼古拉,这是我的个性特征:
我是一个全方位的人:49%外向,51%内向
我有点创造性:60%不羁,40%控制
我完全抽象:50%实用,50%抽象
我喜欢变化:90%司机和10%的抵抗人员
我从C开始,并不是特别喜欢它。我觉得缺乏抽象和结构来正确表达我的代码背后的含义。我转向C ++,喜欢上课,无法忍受凌乱的类型系统。
然后我转向Java,喜欢一致的抽象和类型系统。不喜欢缺乏实用性。感觉太慢而且僵硬。最糟糕的是,我不喜欢社区在思考的抽象方面太过分了。如果不涉及5种软件设计模式,就无法打喷嚏。
然后我转到Python和PHP。热爱实用社区。讨厌缺乏一致的类型系统,并且普遍关注良好的抽象。人们可以这样做,但良好的软件设计不在社区/语言DNA中。
所以我转向Ruby,这也很实用,但语言也有一个坚实和一致的类型系统; 虽然是动态的。社区围绕着从Java / Smalltalk中获取最佳功能的想法,使其更加平易近人和实用。Ruby是我十年来最喜欢的语言。我最终离开了两个原因。我渴望改变,语言落后,我发现很难融入围绕Rails形成的白人中产阶级美国式社区。
然后我转到了一个全职的JavaScript环境,这让我渴望变化和多样化多年。感谢ES6,它结构合理,一致,实用。关于JavaScript的一个很棒的事情是,由于大量的人使用它,语言和工具被大量优化以解决现实生活中的问题。我错过了良好的抽象和软件设计。
最终我发现自己使用TypeScript(实际上我更喜欢Flow,但不幸的是,事情已经死了)。我发现它既实用 – 感谢JavaScript骨骼 – 并且由于固体类型系统而抽象。TypeScript仍然具有足够的灵活性,可以轻松解决现实生活中的问题,并且它具有足够的类型来满足我对疯狂控制的需求。最后,由于JavaScript生态系统,我可以享受技术变革的疯狂步伐。
TypeScript非常接近我的大部分框,但我知道它不一定是TypeScript。任何语言都在快速变化的环境中,提供了良好的实用性和抽象平衡,并允许我编写简单灵活的代码。斯威夫特很棒。Go也很整洁。重要的是,这是我自己的个性偏好,对于其他人来说,这可能是一个不同的设置,这也很好。
我希望这将澄清我试图表达的观点。
