学习多种编程语言的益处
语言塑造思维。
“精通一种编程语言”是流传甚广的编程箴言。 这忠告诚然很值得听取, 学习多种编程语言也有独特的益处。 修习武学的人,在选定主兵器之前,也是要研习和通晓多种兵器的优劣的。
学会使用新编程语言的成本没有想象中“需要跨越鸿沟”的那么大。 对于熟悉至少两种编程语言, 具备至少一年软件开发的人来说, 学习新的编程语言并非难事。编程语言之间有着令人惊奇却又意料之中的相似性,这些都使得学习成本降低了不少。学习新语言有一种“滚雪球效应”, 熟悉的编程语言越多, 越不会对语言有畏惧感和不必要的偏见, 越倾向于更快地熟悉更多的语言,可以很快上手。对于多数语言来说,并不需要深入掌握和精通, 能够从中汲取到有益的理念应用到主编程语言,灵活使用辅语言解决开发中的支线任务,也是好的。
掌握的编程武器越多, 在计算设备上的自由度越大。会七国语言的人明显比只会说汉语的人“帅气”。学习多种语言可以扩展思维视角,解决问题时可产生更多的可选项。比如做文件处理的临时任务时,同时会Shell, Python 和 Java 的开发者比起仅会 Java 的开发者,就倾向于使用Shell 或 Python 更快速地解决问题。尽管戴多只表的人有时苦恼 “选择过多导致的困惑”, 这并不是选择过多导致的问题,而是尚没有准备好去应对 “多选择的世界”。 “多选择的世界” 会比 “单选择的世界” 更好, 只要学会如何去适应和选择。
从相反的角度来说, 由于人的精力有限, 学习语言多而杂, 则会走向杂而不精的极端。 因此, 在多语言的广度和深度选择上有一个平衡点。一般应尽量先深度掌握两种左右的主编程语言, 再根据兴趣和需要去研习其它语言。
学习新语言可以成为一种乐趣。 C 是一种小巧、简洁、实用、强大的高级语言,特别适合于系统编程和嵌入式编程,至今依然充满魅力; Java 通过语言级的约束来尽可能帮助程序员写规范的代码,并提供 JVM 的抽象, 特别适合于构建跨平台服务端应用程序 ; Python 语法简洁,表达能力强大,具有脚本语言的便捷性,同时具备很多实用的开发模块,是深受很多开发者喜爱的编程语言; Perl 则自由,松散,具有广泛的用途和自由主义精神,更受传统黑客青睐;Scala 支持多范式,更多高级语言特性和内置并发特性,具备足够的挑战性; Lisp 基于数学原理,具有强大的抽象表达能力,适合用于算法探索,原型开发, 容易生成Lisp代码,具备“代码即是数据”的特性; AWK 提供了类似 “规则-行为” 的引擎功能,将编程逻辑表达为一系列规则的组合,独具特色; Shell 本身并不强大, 但它能够调用很多现成工具集,因其简洁有效的粘合能力,成为类Unix系统上不可忽视的辅助语言。
多关注语言本身的特性和精髓。如文章 《少编码,多思考 》 所说,人们容易混淆 “精通语言” 与 “精通应用框架” 之间的区别。很多开发人员只是熟练掌握了应用框架的使用, 而对编程语言及其语言特性知之不多。 比如,很多 Java 程序员可能更熟练 iBatis, Spring 等开发框架的使用,而对 JVM 理解不深, 而 JVM 却是 Java 语言的基础。
实际项目开发中往往需要多种编程语言和范式的组合。 在我所参与过的系统和项目中, Java 用于服务端软件的开发, Javascript 用于浏览器端软件的开发, Python 用于测试和运维,在物理机上部署远程调用命令,C用于高性能模块,Shell 用于 Linux 服务器系统管理。 过程式语言适合实现细节,应该隐藏在系统最底层;函数式语言适合复用和扩展,组合功能;对象式语言适合建模,通过包装函数式实现而建立领域层;声明式语言更可读易理解,应该最接近于客户端,适合写API。
好学的程序员应该掌握至少三种编程语言,一种是主语言, 比如 Java / Javascript , 一种是辅语言, 我选择 python / Scala, 还有一种是 SQL / Shell 。 主语言用于大型软件项目开发中, 一般没得选; 辅语言用于处理各种常见的编程任务或者进行技术探索; Shell 可以用于处理各种琐碎的工作。
PS: 由此看来, 除了使用汉语, 有必要也把英语学好。