虽然说语言学得好,Bug 修到老。但是行走技术江湖,学习多门语言防身,依然是每个奋战在一线程序员的必备功课。
那么,编程语言究竟应该怎么学?这个问题大概比“救女友还是救老妈?”更值得关心,毕竟一门编程语言会一直伴随你,在你身处代码前线之中,帮忙提刀挽弓,冲锋陷阵。
为此,我们采访了一些程序员,获得了一些问题。
我是初学者,应该先学哪门语言,从哪门入手比较好?
我比较懒,学哪门语言可以毕生通用?
学习哪一门语言更容易获得大厂面试机会?
大厂面试上机时,用哪门语言更方便?
我是后端工程师,有必要学习一门前端语言么?
学习一门语言,应该具体深入到什么程度?
新语言层出不穷,要不要每一个都掌握?
关于编程语言,来自 Airbnb 的技术经理,朱赟博士在她的极客时间专栏文章“编程语言漫谈”中给出了如下的建议。
*** ***
很多时候工程师们争论的问题,不再是对和错、是与否的问题,而是每个人的观点应用到相关的场景中的时候带来的优劣比较。也就是说,是不是把合适的技术用到了正确的场景中。平衡是我们在这个阶段要着重考虑的,这种平衡有时候是时间复杂度,有时候是空间复杂度。
1、初学者不要纠结“先学哪种语言”,这种时间花得很不值得,还不如随便挑一个语言,跳进去游几圈试试。对于工程师来说,学习第一门编程语言只是万里长征的第一步,只要你还在这个领域,就不可能只学一种语言,只会一种语言的工程师根本就不能称之为工程师。
2、如果你不能用一种编程语言的基本特性写出好代码,那换成另外一种语言也无济于事,你会写出同样差的代码。比如,你的 Java 代码写得很糟糕,那么换成 Go、Ruby,你的代码也会一样糟糕,甚至更差。
所以,基本掌握了一门语言的功能和语法特性之后,要去做实践和练习,能写生产代码了,再回过头来去看编程语言的本质,了解这门编程语言的设计原理,能力边界和高级功能,这样有助于你更快更好掌握其他编程语言。
3、很多人觉得不要用脚本语言入门,我觉得不一定,尤其现在就着人工智能浪潮搞机器学习的人,用 Python 入门就很好。另外,脚本语言在面试中绝对占优势。平时工作中我对 Ruby、Python、C++、和 Java 的熟练程度差不多,但是面试中使用 Ruby 或者 Python 答题,写代码的时间估计是那两者的一半。
关于更多的面试语言详情,可以参考我之前的专栏文章“硅谷面试:那些你应该知道的事儿”。如果让我推荐一门脚本语言,那就是 Python,关于 Pythond 的历史和语言特性,可以参考池老师之前写过的“人生苦短,我用 Python”一文。
4、后端工程师要熟练掌握一门前端语言,前端工程师也要熟练掌握一门后端语言。倒不是为了提倡全栈或多个能力储备,而是两者的编程思维模式很不一样。知己知彼,在架构设计和解决具体问题时,才会有更精确的判断。另外,现在大前端的概念也比较流行,也就是大前端工程师能够同时掌握 Web 编程语言、iOS 和 Android 编程语言,原生技术(iOS 和 Android)和 Web 的配合会越来越紧密。
5、SQL 是一门非常非常重要并且应该熟练掌握的语言(虽然它不能被称为程序语言),我在这里用了两个非常,因为很多工程师有些过于轻视 SQL 了,并为此付出了惨重的代价。
如果你平时的编程工作涉及到业务功能,而不是纯粹的技术架构,一定会使用到数据库。SQL 就是数据的语言,通过它你可以和数据建立连接和沟通。如果你的数据访问模式写得很差,轻则代码性能一塌糊涂,重则引发 Bug,而涉及数据的问题,Bug 等级都比较高,后果可能很严重。
(关于 SQL,可以参考朱赟专栏文章“每个工程师都应该了解的:数据库知识”。)
6、无论使用什么语言,工程师都应该能够基于这种语言搭建测试框架,写好测试代码和写业务代码一样重要,甚至更重要。工作后你会发现,可能有时候我们只花五分钟写了一个程序,而为其写一个差不多能够覆盖所有功能路径的测试用例集却花了一个小时。
(关于测试,可以参考朱赟专栏文章“每个工程师都应该了解的:A/B 测试”。)
7、最后的,也是最重要的是:在任何时候都要用并发的、分布式的思维去看待你的程序。因为竞争条件或者并发中的不确定因素(比如调用顺序)导致的 Bug,仅仅理解语言的基本特性,根本不能解释。每种语言都有自己的并发编程模式(比如 Go 的 Goroutine,Java 的 ForkJoinPool,Swift 的 Swift Grand Central Dispatch 等)。学习每一种语言,都应该去深入了解它的并发模型,在这个多核的时代,不懂并发的程序员不可能是个好工程师。
最近几年我主要使用 Ruby 和 Java 编程,这两门语言的优缺点就不在这里说了,网上有很多类似的观点。如果你还不知道应该学习哪一门编程语言,那么就从 Java 开始吧。
(关于 Java,后面朱赟会更新一篇“Java 开发的中常见问题”专栏文章。)
编程语言,你看它是山,它就是山;看它是水,它就是水。你可以把它当做一门简单的编程语言,有语法,有特性,也有优缺点,但这样的语言也可以复杂到去实现和解释各种计算模型和理论。一门编程语言到底能做什么,完全和工程师怎么去用,在什么场景中用息息相关。
*** ***
本文为“编程语言漫谈”节选,文章首发于朱赟在极客时间 App 上开设的独家专栏《朱赟的技术管理课》。