作为谷歌-新加坡的高级软件工程师,我常常会收到“什么编程语言值得学习”一类的问题。到底该学什么呢?我的建议是,“随便”。
无论你是从 C++、Java、Python、JavaScript,还是其他语言起步,新语言的学习通常不会花费太多时间,也不应是你学习的首要关注点。
编程语言不过是一种达成目的的手段。因为在工作中,我们常常会根据需要在不同语言间切换。
在高中时,我的编程入门语言是 C++。而大学时,我又在 JavaScript 上投入了大量的精力。在微软工作时,常常需要使用 C#/.Net 和 TypeScript。而我在谷歌所负责的安卓相机应用又需要我学会 Java。在转而开发相机的计算摄影后,我写了许多生产的 C++以及原型相关的 Python 代码。
纵观我的编程生涯,新语言的学习成本从未高出预期。
在时间的长河中,人们构建了许许多多的编程语言,并根据其不同的使用方式进行分类,有的纯粹用于标记,如 HTML 和 XML;有的则完全以脚本形式服务,如 shell 和 bat 脚本;有的语言则是功能型的,等等,不一而足。
在不同“种类”的语言间切换可能会涉及到一定的学习成本,但如果你对某种语言有基本的了解,那么新语言的学习难度将大幅下降。
那话说回来,我们到底应该把精力放在哪里呢?
坦率来说,最重要的应还是训练自己解决问题的能力。
即使你是第一次接触这个问题,只要能将其解决,无论用什么语言,对你来说,都将是一种锻炼。
你大可放心学习各种新鲜技术,深入研究那些在你看起来很神奇的概念,尝试探索不同的流派,最后选择一项你真正喜欢的东西来进修。待你神功大成后就会发现万宗归一,所有的编程语言本质其实差不多。
那有什么具体点的建议吗?
下面,我将奉上为不同职业阶段的开发者们量身定做的两条攻略。
你可以先从一门自己想从事的技术开始,无论是网页设计、安卓或 iOS 移动端开发、游戏开发、其他类型的应用开发、机器学习模型训练,还是桌面应用构建,但重点是一定要选择一种,并开始学习其相关的语言。如果有时间,可以通过随手编写小程序来学习,不断探究计算机魔法背后的原理。
下一步,你可以开始挖掘语言中已被抽象为库的基础概念,如并发或多线程、数据库、图形渲染、图像处理、网络连接等等。要知道,无论是什么编程语言,要么是直接编译为汇编指令,要么就先编译为中间字节码,再编译为汇编指令供硬件执行。一旦你接受这个事实,就会发现各种语言其实并没有什么差别。
举个例子,“将数组中每个数值都增加一”,根据不同语法,处理方式也不一样。
在 Python 中:
y = [i + 1 for i in x]## orfor i in range(0, len(x)): x[i] = x[i] + 1
复制代码
在 JavaScript 中:
for (var i = 0; i < x.length; ++i) x[i]++;// Orvar y = x.map(val => ++val);// Orvar y = Array.from(x, val => ++val);
复制代码
在 Go 中:
for i:= range x { x[i]++}
复制代码
这些或复杂或简单的语法最终都会被编译为这些:
increment(int*, int): cmp w1, 0 ble .L1 mov x2, x0 add x1, x0, w1, sxtw 2.L3: ldr w0, [x2] add w0, w0, 1 str w0, [x2], 4 cmp x2, x1 bne .L3.L1: ret
复制代码
有趣的是,在这些例子中有的语言会复制数组,有的则不会。初学者可以先集中精力学习这类语言间的不同之处以及其对程序的影响。
同样,你可以先退一步,仔细考虑看看到底哪种类型的问题更能引发你的兴趣,哪些方法可以带你走向学习的新方向。
举例来说,在开发相机应用时,我曾有幸参与“夜间模式”的研究。这一功能需要程序可以捕捉一系列的图像,并通过一定方式将其稳定地合并,以确保最终图像曝光良好且噪音不高。这些操作的计算成本高昂,意味着程序的算法需要在资源有限的硬件上运算,且延迟不能超出预计。
这意味着,我需要重新复习 C++和图像处理概念等内容。这个挑战是非常有意思的,相对而言,花费在学习上的精力完全算不上是麻烦事。希望各位可以找到这样的方向,并开始你们学习的步伐。
最后的最后,不要再费心寻找什么 2022 年最值得学习的编程语言了,这一切都取决于你自己。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货