有一天,我在家工作的时候,我五岁的儿子拉米走过来问我: “妈妈,你在干什么? ”

“我在工作”,我回答。

他看着我的笔记本电脑屏幕,继续问道: “但是你在干什么呢? ”

我停顿了一下,开始思考这个问题。 我是一个网页开发者,我用 JavaScript 编程,但我该怎么向一个五岁的孩子解释呢?

“我为计算机写指令,计算机按我说的做,这就叫做编程”,我解释道,拉米看起来很困惑。

我继续说,“例如,我可以给计算机指令,把两个数字加起来,它会给我答案” ,于是我写了一个 2 + 2 的函数,然后在我的屏幕上给他看答案,他的眼睛亮了起来。

从那时起,我就开始思考什么是编程?编程背后究竟发生了什么?当我在 2017 年第一次开始在 freeCodeCamp 上学习编程时,我用的是网站内置的代码编辑器,可以直接看到结果,然而我并没有真正理解这背后的魔法。

于是我开始做一些研究,这些是我当时搜索时的一些词: 什么是计算机编程?什么是软件?什么是计算机编程? 在谷歌上有超过 6 亿个搜索结果,这有点像掉进一个兔子洞 —— 有点复杂,让人摸不着头脑。

我想把针对初学者的计算机编程和软件开发放在一起介绍,从计算机编程开始,然后学习计算机编程语言,然后我会谈到软件和软件开发,最后,我会谈谈计算机编程当前的趋势和未来。

如果您正在考虑进入编程领域,或者只是对学习编程感兴趣,这些将为您提供一个没有过多技术用语的概要介绍。

只有一件事需要注意:你可以使用「开发人员」和「程序员」这两个词来代表写代码的人。

什么是计算机编程?

illustration_input_output

在维基百科上,「计算机编程」的定义是:

计算机编程是设计和构建一个可执行的计算机程序,以完成特定计算结果的过程

但这究竟是什么意思呢?

计算机确实很强大,而且有潜力比人类更快地完成任务,但计算机本身并不聪明,它需要一个人写指令并告诉它该做什么。

编程就是写那些指令的过程,我们使用一种编程语言来实现这些指令的编写,这些指令被翻译成计算机能够读懂的格式,最后由计算机执行指令。

用编程来泡一杯茶

illustration_programming_tea

让我们以泡一杯茶为例。 如果你要给出如何泡一杯茶的指令,它看起来应该会是这样:

  1. 烧开一些水
  2. 将热水倒入装有茶袋的杯子里
  3. 让茶泡好
  4. 拿走茶袋
  5. 根据需要加入牛奶(和/或)糖

很简单,对吧?

通常我们理所当然地认为,人与人的交流不同于人与计算机的交流,人有先验知识和生活经验,他们可能知道在哪里找到茶,我们也假设他们知道牛奶是存放在冰箱里。

人有直觉,如果你找不到杯子,你可以去橱柜找一下,此外,我们还可以读懂其它人的非语言暗示,比如肢体语言。

当涉及到编程时,你必须有非常具体的步骤。继续以学习如何泡一杯茶为例,你可以用下面的伪代码编写指令:

  1. 去厨房
  2. 找到水壶
  3. 打开水壶盖
  4. 把水壶装满水
  5. 烧水
  6. 等它沸腾到100摄氏度
  7. 找一个杯子

诸如此类。

如果上面这些指令不够怎么办?您可能需要添加一些逻辑来描述所有的场景。例如第 2 步:找到水壶,嗯,是电水壶还是放在炉子上的水壶呢?这时你需要增加一个条件,如果这是一个电水壶,你就应该做 xyz,否则,就用放在炉子上的水壶去做 xyz。

即使你认为你已经解释了每一个可能的条件,并给出了非常具体的指令,仍然有一些事情是你可能无法预见的。你开始泡茶,结果出了问题,哦,不!水壶正在烧的时候,一下停止工作了。

发生什么了? 你的代码中有一个 bug! bug 是代码中可能导致意外结果的错误或缺陷。为了修复代码,您需要经历一个调试的过程,在这个过程中,您可以发现代码中的问题并解决它。

在这种情况下,您的指令中没有包括将水壶里的水加到超过0.8升,以淹没过加热器部件,水壶因为安全保护自动关掉了。

为了防止在运行程序后发生错误,开发人员要对他们的程序进行测试和单元测试单元测试是为部分代码编写测试的地方,测试要么失败,要么通过。

例如,您编写了一个函数,将两个数字相加: 1 + 1,然后编写了一个单元测试,测试预期输出为2,除非结果是2,否则所有的测试都会失败。

您会一直检查代码直到所有代码都运行正常,没有出现任何意外问题。因此,编程是一个非常细节的迭代过程,在这个过程中,您将不断地改进之前写的代码。

计算机如何理解你的代码?

illustration_low_high_languages

大多数程序员所写的代码都是一种高级编程语言,它们抽象程度更高,抽象意味着远离机器代码,更接近于文本化口语。

但是计算机不能理解基于文本的代码,它需要被编译(翻译)成机器代码。机器代码是一组指令,可以被计算机的中央处理器(CPU)理解,可以把中央处理器想象成计算机的大脑。而机器代码是由被称为二进制的1和0组成的。

例如,你可以用二进制这样编写“Hello World” :

01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100

如您所见,二进制文件对于人类来说很难阅读,因此我们不会使用机器代码进行编程!

编程语言到底是什么?

编程语言,既有像汇编语言这样的低级编程语言,也有像 JavaScript 这样的高级编程语言。

illustration_spoken_programming_lang

但究竟什么是编程语言呢? 我能想到的最好的类比是我们今天使用的口语,不同语言都表达了同样的意思,但是以不同的形式传达给另一个人,下面是用不同语言表达「你好」的意思:

英语: Hello

中文: 你好

法语: Bonjour

西班牙语: Hola

类似,不同的编程语言也是用不同的方式去表达相同的意思,下面是用三种不同的编程语言打印出 "Hello" 的语句:

JavaScript: alert(“Hello”);

Python: print(“Hello”)

Perl: print "Hello";

每种编程语言都有自己的语法。在英语中,我们有语法,这同样适用于编程语言 —— 它们都有自己的一套规则。

你怎么知道一种编程语言是不是一种编程语言?

这个问题看起来很奇怪,所有的代码都是用编程语言编写的吗?严格来说,不是。 例如,有一种误解,认为 HTML (超文本标记语言)是一种编程语言,但它实际上只是一种陈述性语言,根据维基百科的说法:

... 一种建立计算机程序构建结构和元素的一种风格,它表达了计算的逻辑,而没有描述其控制流程

换句话说,HTML 只是提供了网页的结构,并不能控制网站的行为和功能

您可以通过一种语言是否是图灵完备来确定它是否是一种编程语言。 图灵机是阿兰·图灵在1936年描述的一个假想机器。对于一门编程语言来说,满足图灵完备需要具备:

  1. 条件分支(我将在下面探讨)
  2. 具备对无限长纸带进行读写的能力,这实际上意味着能够在内存中存储数据

我不打算深入探讨这个话题,但如果你感兴趣,这里有一个比较有用的介绍视频

编程语言的基本原理是什么?

不同编程语言共同的特点是都有一些最基本的元素,包括变量、循环、条件语句、数据结构和算法,它们是大多数编程语言的构建组块。

什么是 for 循环?

For 循环在你需要重复执行一组指令时非常有用。例如,下午茶时间,你需要为你的客人泡五杯茶,为了泡一杯茶,你必须按照一系列的指令去完成,就像我之前的例子一样。

但要泡五杯茶,就要把指令写五遍,与其把指令写五遍,不如告诉计算机把同样的指令循环执行五遍,这一下就能让你的工作规模化。

下面是一个简单 for 循环的例子:

for (let i = 0; i < 5; i++) {
  console.log("泡一杯茶!");
}

//expected output: 
"泡一杯茶!"
"泡一杯茶!"
"泡一杯茶!"
"泡一杯茶!"
"泡一杯茶!"

什么是条件语句?

在 JavaScript 中,我们有 if... else 条件语句。当你希望根据一个条件执行不同的操作时,就可以使用它们。

回到我之前的例子,您询问用户是否需要在他们的茶里加牛奶,如果他们确实想要牛奶,那么就在茶里加牛奶,否则什么也不要做。

下面是使用 JavaScript 中 if... else 语句的一个例子:

if(milk == true) {
  // add milk
  } else {
  // don't add milk
}

什么是数据结构?

数据结构是一种组织数据的方式,以便有效地使用数据 ... 数据结构是创建强大、高效算法的基础。 -- 《数据结构从入门到高级课程 - 威廉.菲舍特》

可以在许多编程语言中找到常见的数据结构,如数组、对象、元组和联合。接下来以数组作为一个例子。

在 JavaScript 中,数组可以存储一系列数据,如数字和字符串(文本)。 我喜欢把饼干和我的茶搭配在一起,所以我要把它们放在数组里:

biscuits = [“shortbread”, “digestive”, “ginger nut”];

biscuits 存储在计算机的内存中,作为开发人员,你可以通过索引去获得特定的饼干,索引从0开始计算,索引就是饼干在数组 biscuits 中的位置,你可以使用方括号来引用它。

biscuits[0]; // “shortbread”
biscuits[1]; // “digestive”
biscuits[2]; // “ginger nut”

如果你想得到消化饼干(digestive),你可以访问它的索引位置: biscuits[1]。 因为我知道它存放在哪里,所以我很容易找到它。

请记住,数组的第一项是索引0,所以当你引用索引1时,它实际上是数组的第二项。

因此,数据结构是一种管理数据的方法,这包括存储和检索数据。如果数据被组织在一个数据结构中,那么执行算法会更有效率。

什么是算法?

算法是解决问题的一组特定指令,这是一个抽象的概念。这里有一个来自 TED 关于什么是算法? 的视频链接。

还记得我们之前写如何泡茶的指令吗?这本质上就是一种算法: 一组顺序指令

当我用 JavaScript 编写我的第一个函数时,我实际上是创建了我的第一个算法,函数是一种算法的实现。

就像在现实生活中一样,一个问题通常有多种解决方案。 比如说,你打算去一家你从未去过的咖啡馆,有几种方法可以到达你的目的地,有些路线花费的时间比其它路线长,但最终,它们都会把你带到同一个地方。 理想情况下,你要选择最快、最有效、最简单的路线。

同样的原则也适用于编程,解决一个编程问题通常有多种方法,程序员就是要努力去寻找最优雅、最有效的解决方案

开发人员通常不会在第一次尝试时就做得最好!就像我会为一篇文章写初稿一样,编程也是一样,我会多次重新起草一篇文章,在那里我可以改变结构、编辑、重写某些部分、删除不必要的句子。在编程中,我们会经历一个类似的过程,我们称之为代码重构

当前主要使用的编程语言有哪些? 有多少种?

关于互联网上编程语言的总数,似乎有一些争论,一些网站,如维基百科,列出了大约700种「所有值得注意的」当前和历史编程语言。 其他网站如 Tiobe 会跟踪和监测 250 种「最流行」的语言。

在 Github 上,2019年最流行的编程语言是 JavaScript:

来源:https://octoverse.github.com/#top-languages

为什么会有这么多的编程语言? 编程语言是如何进化的?

不同的编程语言被开发出来是为了满足不同的需求,从整个编程语言的历史中就可以看出来。请参考 O’Reilly 的这个图表,它描绘了从20世纪50年代到2004年的编程语言历史。

在20世纪50年代中期,FORTRAN 被创造出来解决复杂的数学、统计和科学问题。 Cobol 创建于1959年,目的是使企业更容易使用代码。有些语言则更适合进行统计分析,如 R (1976)。

从20世纪70年代开始,通用编程语言开始兴起,如 c,c++ ,c# 和 Java,正如你在上面的图表中看到的,最受欢迎的语言中,前10名都是通用语言。

创建于1995年的 JavaScript 是一种流行的网页开发语言,它赋予了网站交互性和生命力。

最近,我们看到了新语言的诞生,比如 Google 的 Go 语言,其目的是更有效地维护大型软件系统,未来我们可能会看到越来越多的编程语言被创造出来。

编译型与解释型编程语言

illustration_compiled_interpreted

随着你熟悉编程语言,您将碰到编译型解释型两类编程语言,它们有什么区别呢?

什么是编译型语言?

诸如 c、 c + + 和 Java 之类的编程语言都有一个「构建」过程,在这个过程中,您的代码被编译成对于计算机来说更可读的格式(机器语言)。

用两个不说同一种语言但需要在一起工作的人来作比喻可能会容易理解一些,约翰说英语,克洛伊说法语,克洛伊用法语写了一套制作巧克力蛋奶酥的说明,但是约翰看不懂,他们需要一个懂英语又懂法语的翻译,如果翻译人员能在约翰开始烹饪之前提前把说明翻译好,那就更简单了。

同样的,开发人员「说」 Java 或 Python 这样的编程语言,他们需要他们的代码被编译(翻译)到机器语言,以便计算机可以理解并执行它。

用编译型语言编写的程序对计算机来说更容易理解,因此运行速度也更快。

什么是解释型语言?

JavaScript,PHP,Python 都属于解释型编程语言,没有构建过程,代码也不需要编译,当您运行程序时,你的代码被逐行读取并解释执行。

回到我对克洛伊和约翰的类比,约翰写了一套关于如何做牧羊人馅饼的说明,翻译人员不会事先翻译约翰的说明,而是加入他们的烹饪过程,当克洛伊做饭时,翻译人员再将约翰的说明一条一条从英语翻译成法语,边翻译边做,也正因为如此,克洛伊需要更长的时间来准备和烹饪这顿饭。

因此,解释型语言通常比编译型语言慢,它们必须在运行时被翻译,以便计算机能够理解。

但随着JIT 实时编译器的出现,解释型语言正在变得越来越快和高效。

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

编程语言基本上做的事情差不多,它们只是以不同的方式向计算机表达同样的指令,一旦掌握了一门编程语言的概念和基本原理,学习另一门语言也就容易多了

您应该首先选择学习的编程语言取决于许多因素。例如,我想成为一名网页开发人员,所以我选择了 JavaScript 作为我的主要编程语言。其它与网页开发有关的语言你还可以学习 PHP 和 Ruby on Rails(译注:Ruby on Rails 是一个框架,这里应该指的是 Ruby 语言)。

如果你想成为一名数据科学家,那么 Python 是一个不错的选择,它被认为是大数据分析最好的语言之一。 我之前提到过 R,它也是数据科学家和统计学家广泛使用的另一种语言。

Python 是一种通用的编程语言,如果你想进入机器学习和人工智能领域,学习它也是非常有价值的。

如果你想成为一名软件工程师,那么 Java 可能是一个不错的选择,它是世界上最流行和最受欢迎的语言之一,它也是一种通用的语言,可以用来开发从小型到大型的企业软件。

所以,想一想你想在技术领域扮演什么样的角色,你想为什么样的公司工作。

选择一种编程语言也取决于你想要构建什么样的软件,这正好引导我们进入下一节。

什么是软件?

illustration_software_everywhere

你在一天中会和软件打多少次交道?

软件无处不在。它作为嵌入式系统集成到日常设备中,如微波炉、洗衣机、汽车、电视、儿童玩具和遥控器;还有更明显的就是计算机相关的设备,它们有应用程序或系统软件,如平板电脑、智能手机、笔记本电脑、台式电脑和像 Alexa 这样的家庭助理。

每个人平均下来每天与软件交互至少几十次,甚至更多,它已经是我们日常生活的一部分。

所有软件都是由开发人员编写的。软件天生敏捷,不断更新迭代。软件和硬件也是交织在一起的,想象一下你的手机如果没有应用程序和操作系统,本质上就是一块昂贵的砖头而以!软件赋予硬件生命,而硬件就是我们与软件互动的媒介。

大多数软件都是程序员用高级编程语言编写的。

什么是软件开发?

illustration_software_development

软件开发指的是从概念到开发,再到最后部署完成的所有内容。从构思一个想法到部署软件的整个过程,也称为软件的生命周期。

软件生命周期有几个阶段: 发现、设计、编程/创建、测试和部署/运行,还包括软件开发生态系统中的所有其它内容,例如维护、文档撰写和 bug 修复。

在这里我们就不详细讨论了,软件开发又是一个专门的主题了。

软件开发和计算机编程的最新趋势

人工智能与机器学习

illustration_machine_learning

近年来,你可能听说过人工智能和机器学习这样的术语,有时它们可以互换使用,但是它们是相同的吗?

当然不,它们不完全是一回事,机器学习就是机器通过经验进行学习,而人工智能是一个更广泛的概念,机器可以智能地执行任务,机器学习是人工智能的一个子集。

什么是人工智能?

我已经介绍了编程语言是如何工作的 —— 程序员编写一组指令供计算机执行。人工智能(AI)则是一个更广泛的概念,计算机可以模仿大脑的运作方式,训练机器像人一样「思考」。

最大的问题是: 你能在一台机器中复制人类的智能吗?能模仿人类学习、推理和感知的方式吗? 阿兰·图灵在他1950年的文章中也提出了这个问题:

机器能思考吗?

(计算机与智能,1950,阿兰·图灵著)

在图灵的文章中,他提出了「图灵测试」 ,在这个测试中,如果一个人不能区分人类和人工智能机器的应答,那么一台机器就会被归类为「智能机器」

70年过去了,人工智能开发者、学者、科学家和研究人员仍在试图回答这个问题,仍然在试图创造一台人工智能机器。我觉得我们还没到那一步,你试过与 Siri 或 Alexa 进行对话吗? 与这两种设备的对话仍然是很初级,然而我相信创造出「智能机器」只是个时间问题。

DeepMind 这样的公司正在机器是否具有智能这个领域研究,之前 Deepmind 的 AlphaGo 程序在围棋比赛中击败了职业选手,成为头条新闻,这对人工智能来说是一个巨大的里程碑。

什么是机器学习?

机器学习 ML是人工智能的一个子集,机器学习是一种不同的编程方式,这种观点认为,计算机有能力学习,而不需要明确的编程。亚瑟·塞缪尔(Arthur Samuel)在1959年的论文中首次提出了机器学习的概念:

无须专门编程,计算机就能根据经验自主学习

当我教我的儿子如何识别一只猫时,我会给他看一些猫的图片,我反复这样做,直到他能够认出一只猫,而不需要我的提示。

机器学习与此类似,你给计算机一百张猫的图像(输入),然后它会学习数据中的模式,通过不断重复去建立一个分类系统,如果你给计算机更多的猫和其他动物的图像,它应该能够识别图片中的动物是一只猫,还是不是一只猫,它基本上已经知道了猫应该是什么样子。

机器学习给计算机提供了数据和例子,反过来,它能够像婴儿和小孩一样自学。开发人员不再向计算机发送指令,而是计算机去按照机器学习算法去创建自己的指令集,机器学习算法是机器学习的一个子集,这个概念被称为深度学习

人工智能是我们人类正在研究的最具深远影响的东西之一,它甚至比火或电的影响更深远 -- Sundar Pichai,世界经济论坛,2020年1月)

这里引用了 Alphabet 公司首席执行官 Sundar Pichai 的话,总结了人工智能和机器学习的重要性。

计算机编程的未来是什么?

最后一部分是我对计算机编程未来的一点预测。

开发人员将继续创造新的编程语言,编程语言将变得更加抽象,因此,学习编程,对于每一个人来说都不是一件困难的事。

我相信,在中小学课程中,编程教育将会受到更大的重视,随着技术和软件日益融入我们的日常生活,对开发人员和程序员的需求只会增加,编程将变得无处不在

我们将看到机器学习和人工智能技术的不断发展和普及,以帮助软件开发过程中的开发人员。这包括自动化测试,检测和防止漏洞和代码缺陷(Bug)。

人工智能将彻底改变我们社会的方方面面,不仅仅是在编程和软件开发方面。例如,我们已经在人工智能和自动驾驶汽车领域看到了巨大的进步。

由埃隆·马斯克创立的特斯拉是世界上最大的自动驾驶汽车公司之一。 在人类驾驶员的监督下,特斯拉汽车现在可以自动变换车道,在高速公路上自动驾驶,自动泊车。特斯拉的目标是创造一个完全自动化的,无人驾驶的汽车,没有任何人的监督。

随着机器变得越来越智能,可能会达到机器超越人类智能的地步,这就是所谓的奇点。 现在看来,这完全像是一部科幻小说! 但是像雷·库兹韦尔这样的著名人物预测,具有人类水平智能的机器将在未来20年内问世。 库兹韦尔以准确预测技术将如何发展而闻名。 他写了一本关于这方面的书: 精神机器时代

那作为超级智能机器的结果,我们的社会将如何改变呢?

结语

illustration_ending_illustration

技术的影响和代码几乎涉及到我们生活的每一个部分,从我们的娱乐(如在线游戏,流媒体),到我们如何购物,再到我们选择吃什么,甚至我们如何约会!代码确实很重要,越来越多的工作正在变化,所有这些都要求人们至少对编程有一些基本的理解

然而,根据2019年全球开发者人口统计研究,世界上只有大约2390万开发者,也就是说,世界上只有0.3% 的人知道如何编程。正如之前所讨论的,我们对软件和技术的依赖正在加剧,根据美国劳工统计局的统计数据,从2018年到2028年,对软件工程师的需求预计将增长21%,因此,我们需要越来越多的开发人员。

如果你正在考虑成为一名开发人员,那就从今天开始吧。 这是一个令人难以置信、激动人心的时刻!

原文:What is Computer Programming? Defining Software Development.,作者:Phoebe Voong-Fadel