Mark24
选择编程语言的思考
选择编程语言的思考
语言是个工具。理论上他们是等价的,实际上选错了,你到达不了目标。
到底是坐拖拉机去拉萨,还是做高铁去。体验非常不同。
一、本质上资源决定语言选择
编程语言其实是分层的。如何理解这句话?首先编程语言的抽象程度不同,底层、高级负责的事情不同。灵活程度不同,决定了个人还是多人合作。使用的场景不同,比如嵌入式,Web 开发,游戏开发。总之每种语言特点是不同的。
你有多少人、多少时间、多少资源,平台,还有你要做什么。决定了你要选择何种编程语言。
语言是一种朴素的工具,工具能做和擅长做,这之间差距可能非常大。这种跨度是否可以被一个人有限的资源和时间填平,这将会影响结果是否成功。
如果底层的条件无法满足,项目必定失败。这是内因。
1.底层语言:
- C :简洁、灵活,容易实现解释器。他是实战派 的胜利者。从众多竞争者中被自然选择出来。从而成为事实标准。他是操作系统、底层库的语言。C 现在成了一种标准。所有厂商都会迎合和接受这个标准,来接入目前生态。
C 不适合开发原型。他适合学习、研究。因为灵活,所以对人要求非常高。需要非常有经验。
C 往往被当作一个优化性能的手段,来替换掉项目中有瓶颈的部分(往往是其他语言项目)。
C 完全取决于设计者的经验和学识,你需要在混乱没有标准的底层世界中,寻找自己的坐标,构建软件。总之,我觉得在想到这里再去构建软件,不容易。这是属于刀根火种的时代。了解和欣赏就可以了,现代的人们应该往上走。别浪费时间。
2.高级语言:
每种高级语言都为了不同目的设计,有的强调性能,有的强调灵活。
但是有约束语言的不可得三角(我总结的) :
- 功能
- 体积
- 速度
三者不可得,最多满足其二。所以所有语言都有达不到的短板。
有的语言为了安全性设计的极为繁琐。有的语言为了速度,兼容更少的系统。有的语言极富表现力,代价就是非常的缓慢。
总的来说,每种特点都有。
对于个人来说,个人拥有的时间、耐心、资源都极其有限。
选一个 表现力强的,构建原型。是非常合适的。 获得成功之后,再选择性能强的精耕细作。
我始终觉得,个人软件和大公司软件,使用的技术其实是不同的。各种定位也不应该相同。如果能够跳出来思考。选择什么,更像是资源约束下决定的。
动态语言是构建原型的首选。既是相比静态语言速度慢,对于 90% 的情况也足够了。况且现代动态语言也越来越快了。
JavaScript、Python、Ruby 都可以。在事情成功,发展壮大之前。你的程序应该很难够到现在的计算机硬件的天花板。
毕竟在他们刚出来的时候,应该还不如今天,依然有很多软件获得了成功。
后面也许省资源会考虑 Go,安全部分会考虑 Rust,企业的成熟可靠,用工性价比高,也许会选择 Java。
总的来说,这些前期都不需要考虑。
二、宏观和微观思考
1.本质上都一样
MacOS、Linux、Windows 在打包二进制的时候,只是 ELF 文件描述有点差异。
他们遵循的基本原理都一样。
不同语言,最终都直接或者间接的来自于 C。
所以不必有选择困难症,他们本质上是一样的。
遇到瓶颈,可以尝试用更高性能的语言替换掉。FFI 调用之类的。
遇到瓶颈是成功的。
2.生命周期
实际上大多数软件,没有办法被人看到。甚至都无法继续维护下去。被人看到是成功的,有一天要用别的语言替换掉心爱的语言重写,是成功的烦恼。
成功是少数。成功需要运气。大多数的软件被人偶尔执行。一旦写出来基本就不变了。一周后就被丢弃。一个月后就会被忘记。
聚光灯下从来是少数,二八定律永恒生效。
3.语言/技术也有生命周期
语言、框架、系统,都是有生命周期的。MacOS 每个大版本都不兼容。 Windows 也在组件淘汰。曾经叱咤风云的 smalltalk、VB、dolphin 今天只能留在维基百科和计算机历史故事里。
当年天才云集、如日中天的 Sun 公司,因为资金链断裂,倒闭之后,也只留下 Java 作为遗产。
工具发展是个动态的过程。
不必太完美主义,或者细节。一切都是动态的混沌。世界的进化有时候跟你也没什么关系。
程序的编写,更多是你一个人的事情。你熟悉就是最好的。
之于这些工具的宿命,可能维护者失业、去世、公司倒闭、裁员。某个技术就戛然而止。
所以一切不必较真,乐在其中更重要。
三、最终的选择
前期当然不应该人云亦云,甚至应该多多尝试。
最后选择一个喜欢的,能让你在三分钟热度内搞定的。
选择一个不混乱的,内部自洽和谐的。
选择一个对于你容易的、顺眼的、符合你思考方式的。
选择一个你喜欢的特点,胜过其他的。
选择一个成熟的,而不是时髦的,这会让你后面更顺畅一点。你没那多时间陪它们成功。
每个人的选择,都会是不同的。这很正常。每个人的思维习惯不同。但是他们本质上是一样的,最终会条条大路通罗马。
因为不可得三角,你一定会需要很多语言,帮助你实现目标。