我们应该先学习哪种语言

程序员专属-极客T恤

大多数人学习编程的计划开始于某一天的深夜谷歌搜索。

搜索的内容通常类似于“学习__”(自行脑补空格)

但是他们是怎样决定搜索哪种语言的呢?

“在硅谷他们总是对 Java 开玩笑。我想我应该学习 Java”

或者

Haskell。现在是如此之热。Haskell。

或者

Go 语言的地鼠 logo 真 tm 可爱。 

然后我们剩下的人可能会搜索:

我应该先学习哪种编程语言?

几乎没有问题会普遍到要用信息图表来展示。

但下图列举了一堆这样的问题:

我们应该先学习哪种语言0

图片来源

决定你的第一个编程语言是一个有趣的过程,有点像 “你属于昆汀·塔伦蒂诺的哪个角色?”的人格测验。

但是,在你以小孩玩泥巴的心态跑去学习 Ruby 之前,给你提个醒:这个赌注相当高。

它可能会耗费你上百个小时去练习,但你远远不会胜任你第一个编程语言。

因此,你要考虑以下因素:

  • 语言的就业市场
  • 语言的长期前景
  • 语言的学习难度
  • 你在学习期间能构建什么样的项目(并且与朋友分享,让你保持动力)

每年都会产生新的编程语言,和这些编程语言的新学术论文,以及新的网络漫画。

不信你看上个月的这篇佳作:

我们应该先学习哪种语言1

当你选择第一个编程语言时,选项有很多。为了进一步缩小选择,这里是过去 12 年来最常见的,与学习编程有关的谷歌搜索: 我们应该先学习哪种语言2

Java 起起伏伏。

Python 逐渐上升为最受欢迎的选择。

但是躲在下面是一个小火车头,在过去几年的流行度慢慢地上升。而这个小火车头就是 JavaScript。

在谈论这些编程语言之前,我先澄清:

  • 我并不是要论证任何一种语言在客观上比任何其他语言好
  • 我认为开发者们最终不应该只学习一种语言
  • 我要论证的是应该先学好一门语言。你应该已经从标题中颠倒的文字猜出来了,这门语言就是 JavaScript。

那就正式开始吧,首先我们来探索一下目前学校教授编程的方法。

计算机科学 101

我们应该先学习哪种语言3

大学一直是以计算机科学的名义来教授编程的,而计算机科学通常被看做是数学的延伸,或者是电气工程学位的周边学科。

当然,你可能已经听说了:

“计算机科学教育远远不能像学习画笔和颜料可以使人成为一个专业画家那样,使人成为一个专业的编程者。”- Eric S. Raymond

截止到 2016 年,很多大学仍然把编程当成计算机科学,把计算机科学当成数学。

结果是许多入门级的编程课程专注于低层次的抽象语言,如 C,或聚焦于数学编程的语言,如 MATLAB。

而系主任通常会指着编程语言的年度排行榜,如 TIOBE指数,或者来源于 IEEE 的结果(如下图),坚持保留这些课程。

我们应该先学习哪种语言4

大多数这些排行榜就跟10年前几乎一模一样。

但近几年还是发生了一些变化,甚至在学术届。

在 2014 年,Python 超过 Java 成为美国顶尖的计算机科学课程最流行的教学语言 。

我们应该先学习哪种语言5

并且另一改变也即将… 最终… 发生。

因为如果你看看从业人员实际使用的编程语言,你会发现它的画面是酱婶的:

我们应该先学习哪种语言6

JavaScript 是目前最受欢迎的语言,Stack Overflow 在 2016 年的调查显示,调查的回应者中有 49,397 的开发者使用 JavaScript。

超过一半的开发者使用 JavaScript。 它对前端 web 开发非常重要,而且在后端开发中的使用程度也日益增长。在游戏开发和物联网等领域的使用也迅速扩张。

JavaScript 在招聘信息中被提到的次数也超过了除 Java 以外的其他编程语言:

我们应该先学习哪种语言7

数据来源于世界上最大的招聘信息收集者,Indeed.com

我们建立关于 JavaScript 课程的开源社区(Free Code Camp)绝非偶然。在过去的两年里,超过 5,000 个人使用 Free Code Camp 找到他们的第一份工作。

我并不是因为教 JavaScript 才宣传它。我教 JavaScript 是因为 JavaScript 是开发者找到第一份工作的最佳之路。

但是 JavaScript 适合你么?它值得成为你第一个编程语言么?让我们来探究一下前面提到的因素。

因素 #1:就业市场

如果你学习编程纯粹出于求知欲,那么请跳过这个因素。但是如果你像大多数学习编程的人一样,想利用这个技能找到一份工作,那么这是一个重要的考虑因素。

就像我之前提到的,Java 在招聘公告上提到的次数超过其他编程语言。JavaScript 紧随其后,排名第二。

但关于 JavaScript 的一个事实是:尽管 JavaScript 已经存在了 20 多年,它只在最近几年才被当作真正的工具,如 Netflix,Walmart,和 PayPal 等公司愿意用 JavaScript 构建整个应用程序。

因此,很多公司开始雇佣 JavaScript 开发者,但是在就业市场中这样的开发者很少。

我们应该先学习哪种语言8

数据来源:Indeed.com

对每一个公开的 Java 职位,有 2.7 个 Java 开发者竞争。PHP 和 iOS 就业竞争同样激烈。

但是对于每一个公开的 JavaScript 职位,仅有 0.6 个 JavaScript 开发者。对于具有 JavaScript 技能的开发者来说,这是一个卖方市场。

因素 #2: 长期远景

平均一个 JavaScript 项目收到的 pull request 是 Java,Python,或 Ruby 项目的两倍。而在这一点上,JavaScript 比其他的编程语言增长的更快。

我们应该先学习哪种语言9

数据来源:GitHub 2016 10月的调查情况

JavaScript 的生态系统也得益于公司的大量投资资金和工程人才,如谷歌,微软,脸谱,和 Netflix 公司。

例如:TypeScript(一种 JavaScript 的静态类型的超集)已经有超过 100 个开源贡献者,他们中很多人是微软和谷歌的员工。

很难在 Java 上发现这种公司间的合作。通过收购 Sun Microsystems 拥有 Java 的 Oracle 公司经常起诉试图扩展 Java 的公司。

因素 #3: 学习难度

我们应该先学习哪种语言10

图片来源:XKCD 的滑稽漫画。

大多数程序员都会同意高级脚本语言相对易学。JavaScript就属于这一类,就像 Python,Ruby。

尽管大学仍然把 Java,C++ 作为第一类语言用来教学,但它们显然学习难度更高。

因素 #4: 你可以使用学习的语言创建的工程

这才是 JavaScript 的最大亮点。JavaScript 能运行在任何一个有浏览器的设备上,就需要一个浏览器。基本上你可以用 JavaScript 构建任何东西,并能随时随地分享。

由于 JavaScript 的普及,Stack Overflow 的创始人 Jeff Atwood 创造了他目前著名的法则:

任何可以用 JavaScript 编写的应用,最终都会使用 JavaScript 编写。

而且随着时间的发展,Atwood 法则越来越有说服力。

Java曾经一样承诺过在任何地方运行。你也许记得 Java Applets。Oracle 已经在今年早些时候正式地停掉了它们。

Python 也遭受了同样的问题:

“我如何才能给我的朋友这个游戏呢?更好的是,是否有一种方法可以让我把这个放在我的手机上,这样我可以给学校的孩子们展示,而不需要他们安装呢?唔…”——James Hague 在 《让 Python 退休成为教学语言》中写到。

相比之下,这里有构建在浏览器里的应用程序,它们由开源社区的成员在 CodePen 上创建。您在浏览器中就能点击并且使用这些应用程序:

我们应该先学习哪种语言11

1970 年代风格的 Simon game

我们应该先学习哪种语言12

Conway’s Game of Life

我们应该先学习哪种语言13

Star Wars-themed Wikipedia Search

A roguelike dungeon crawler game

先学好一门语言。再学习第二个语言

如果你不停地从一种语言跳到另外一种语言,你不会走的太远。

为了打破这种限制,你需要学好第一个语言。这样你的第二种语言会更加容易。

接下来,你就能学习更多语言,从而接触更多方面的知识,成为一个更全面的开发者:

  • C 是学习计算机实际管理内存方式的绝佳语言,并在高性能计算方面极为有用。
  • C++ 因为游戏开发而伟大。
  • Python 在科学和统计方面棒呆了。
  • 如果你想在大型科技公司工作,Java 很重要。

但是首先你得学习 JavaScript。

Ok,现在我要去尝试那些不可能 —— 我要试着预料评论部分的可能出现的异议。

异议 #1: 但是 JavaScript 不是很慢么?

在大多数实践意义上,JavaScript 是和其他高性能语言一样快的语言。

在数量级上,JavaScript (Node.js) 比起 Python,Ruby,PHP 不知道快到哪里去了。

而且它几乎与高性能语言如 C++,java,Go 一样快。

这里有最近最全面的综合的跨语言平台的基准值:

异议 #2: 但是 JavaScript 不是静态类型

跟 Python,Ruby 一样,JavaScript 是动态类型的语言,这样会很方便。但你可能会陷入困境。在这里我想把examplearray认为数组。设置它的值,然后检查其长度 - 含义是它包含元素的数目。

exampleArray = [1, 2]-> [1, 2]exampleArray.length-> 2

但是随后我不小心把它指定为字符串。

exampleArray = text-> textexampleArray.length-> 4

这些错误会在动态类型语言中的一直存在。大多数开发人员只是通过检查到位,以防止这些错误,并且相应地编写测试。

如果你一定要在第一个编程语言中包含静态类型,那么我仍然推荐优先学习 JavaScript。合影你就可以很快地学会 TypeScript。

“Typescript 有一个学习曲线,但是如果你已经了解 JavaScript,那么 TypeScript 的学习曲线会非常平滑。” —— Alex Ewerlöf 在 TypeScript 写到。

异议 #3: 但我真的想做一个移动 app

但是我仍然建议优先学习 JavaScript。

  1. JavaScript 具有开发本地移动应用 app 功能的工具,如 Angular CordovaReact Native
  2. 为了让你的移动应用程序实实在在做任何有趣的东西,它可能会需要一个适当的后端,需建立一个合适的 Web 开发框架,像 Node.js + express.js。

而且,值得指出的是,移动应用开发的最好的日子可能即将到来。

对于初学者,开发者中几乎一半的工作是 web 开发,和使用移动 app 的人们一样多。相比之下,只有 8% 的工作涉及移动应用程序开发。

49,525 人的职业,统计数据基于 2016 Stack Overflow 的调查响应人数。

“只有一个应用程序”的宏伟愿景并没有通过。相反,大部分智能手机的拥有者已经停止下载新的 app。

当然,他们仍然使用 App。通常是脸谱,谷歌地图,还有其他的。大部分对移动 app 开发者的需求集中在一些大的雇主。

那些移动开发工作的前景很难预测。多方面的发展,维护和部署移动应用程序使用 JavaScript 更容易。这样的公司如脸谱和谷歌都在大力投资使用 JavaScript 开发更好的工具。

截至 2016,几乎所有的开发都是 Web 开发。每一个接触的大平台都是“网络”。在下一个设备的浪潮中,你会在家里交谈时,汽车可以接孩子放学 - 网络将会把他们链接在一起。

而这就是 JavaScript 的意义。

异议 #4: 难道 JavaScript 不是只用 10 天的玩具语言么?

JavaScript 有一个诡异的历史。

毫无疑问,你会听到人们以 JavaScript 开玩笑的代价。

同样,人们对 C++ 既爱又恨。尽管存在这种恨,但就像 JavaScript 一样,C++ 成功了,而且现在到处都在使用它。

所以,如果有人因为你在学习 JavaScript 而不是“本周精英语言”而嘲笑你,你只需要记住创造 C++ 的那个人一句名言:

“只有两种编程语言:一种是被人骂的,一种是没人用的。” — Bjarne Stroustrup