原文: How to Learn Programming – The Guide I Wish I Had When I Started Learning to Code
仅仅只是想到学习编程这个概念就让人畏惧,代码非常神秘,仿佛是一种与机器交流而不是让人去理解的技术。
大多数人采用的学习编程的方式是挑一个流行的编程语言,然后一头扎进去。具体的表现形式可以是选一门线上的编程课程、教学项目,或者随机购买一个编程话题相关的书籍。
极少的准开发者会从一个路线图开始,路线图相当于编码世界的一张鸟瞰图,梳理了一些相关的编程概念、语言以及几乎 100% 的开发者每天都会使用的工具。
在这篇文章中,我将提出一种路线图。我梳理出来了专业开发者用来编写代码、合作和创建专业项目的 14 个步骤(每一个步骤探讨了一个关键的概念、语言或者工具)。
我精心挑选出来的这 14 个步骤是基于我长达 20 年的个人学习代码的经历。
我花了这么长时间才使自己在开发的时候感觉自在,一部分原因是我曾经只专注于具体的话题,而没有从更广阔的角度来看整个编码世界。
本文的每一个步骤所讨论的“代码重点”是你开始编程之旅起码要知道的概念。
我想在正式开始之前最后强调一点,你肯定不会因为这篇文章成为编程专家,这篇文章的本意也并非如此。这篇文章的目的是为了让你知道有这些内容,以及这些内容背后的运行逻辑,给你继续前行打下基础。
给初级开发者的 14 步路线图
熟悉计算机系统结构和数据基础
了解编程语言的运作
理解互联网的运作
练习基本的命令行
使用 Vim 来培养你的文本编辑器技能
学习一点 HTML
处理一些 CSS
由 JavaScript 开始编程
使用 Python 继续编程
进一步了解 Java
使用 Git 跟踪代码
使用数据库和 SQL 存储数据
阅读 Web 框架和 MVC
玩转包管理工具
话不多说,让我们开始吧!
1) 熟悉计算机系统结构和数据基础
现代编程语言美妙的原因之一是在创建精美的应用的时候,它们帮助我们免去幕后繁琐的硬件细节。(大部分情况是这样)
这种能力被称为抽象——使用高级工具(这里指编程语言)的能力,可以简化理解、缩小所需掌握技能范围。
但这并不意味着了解机器本身一无是处。至少可以帮助你在工作场所和同事畅谈高CPU和内存使用率。
以下是计算机基础的基本知识:
计算机最重要的部分位于微芯片(也称为集成电路)。
微芯片依靠晶体管的电子元件来发挥作用。晶体管是微小的电子开关,在给定时间内处于关(0)或者开(1)的状态。单个微芯片嵌入了上百万甚至术十亿的晶体管。
大部分现代计算机有一个叫做**中央处理器(CPU)**的微芯片。你可以把这个当作计算机的大脑。它处理大部分数字运算和逻辑任务。
每一个 CPU 有一个指令集,是供 CPU 理解的二进制(0 和 1)指令的合集。幸运的是,作为软件开发人员,我们并不需要担心自己不理解这些指令,这就是抽象的力量。
如果说 CPU 是大脑的逻辑中心的话,那么我们还需要一个存储器来短期或长期地存储记忆。
计算机拥有随机存取存储器(RAM) 作为“工作存储器“(或者叫做短期存储器)来存储程序运行时使用的信息。
RAM 是由一组内存地址组成,可用于存储数据位。在像C语言这样的历史久远的计算机语言中,程序员确实可以使用指针来直接处理内存地址,但是这在现代语言中很少见了。
最后这个组件你肯定熟悉——硬盘驱动。硬盘相当于人类大脑的长期记忆。硬盘是存储数据的内部和外部设备,即便关机了,这些数据仍然存在。
在我们正式介绍编程语言细节之前,让我们花点时间了解一下数据,数据这个词到底代表了什么?
从表面来看,我们会想到文本文件、图像、视频、电子邮件、文件和文件夹。这些都是我们每天在计算机上创建和存储的高级数据结构。
但位于底层的计算机芯片(CPU 或者 RAM 芯片)并不知道什么是“图片”或者“视频”。
从芯片的角度来看,这些数据结构被作为一长串 0 和 1 存储了起来,这些 0 和 1 被称为位。
位通常以一组八位的形式存储,称为一个字节。 一个字节就是一个简单的八位序列,例如 00000001、 01100110 或 00001111。这样表示信息的方法被称为 二进制表示法。
2) 了解编程语言的运作
在上一章节,我们提到了大部分计算机以依赖于 CPU,CPU 可以理解一串特定的 0 和 1。
因此,理论上我们可以编写一串由 0 和 1 组成的代码告诉 CPU 要做什么。以二进制形式编写的指令被称为机器码。
写这样的代码听上去相当可怕,反正我没试过,因为我使用高级编程语言如:JavaScript、Python 和 Java。
高级编程语言提供一组人类可以读取的关键字、声明和语法规则,使得人们可以更加容易地学习、改 bug 和使用。
编程语言提供一座桥梁连接人类大脑和计算机大脑(CPU)。
我们编写的代码最终会转换为 CPU 理解的二进制指令(机器码)。
根据你选择的语言,我们可以认为你的代码要么被编译,要么被解释为可以被CPU执行的机器码。大多数编程语言都包含一个编译器或者解释器来执行这个翻译步骤。
举几个例子——JavaScript 和 Python 是解释型语言,然而 Java 是编译型语言。一个语言是否为编译型或者解释型语言(或者两者结合)会对开发者的编写便利性、处理错误的方法和程序的性能造成影响。这里我们不赘述。
3) 理解互联网的运作
不论你渴望开发什么类型的程序,你都会遇到计算机之间相互交流的场景,这个场景就发生在互联网。
互联网是一个连接了全球计算机的集合。也可以被认为是一个全球性的网络。互联网内部的每一台计算机都遵循特定的规则来达成彼此间交流,对于计算机来说,“交流”就是交换数据。
如我们在之前章节介绍的那样,所有数据类型(网页、图像、视频、电子邮件等)都可以被 0 和 1 来表示。
因此,你可以把互联网当作一个巨大的计算机集合,这些计算机之间相互传输 0 和 1,数据以 0 和 1 的形式存储,互联网就是一个数字对话媒介。
如果互联网是一个巨大的对话场所,那让我们来定义一下对话的参与者。
首先,让我们引入一个类比:大部分人类的对话需要至少两个参与者。一个发起对话,一个回应对话,假设这两个人都在场并且有空。
而从互联网的角度来看,发起对话的计算机被称为客户端,回应或者应答对话的计算机被称为服务器。
假设你打开了浏览器,并且搜索了 “www.google.com” 。 在这个场景内,你的浏览器就是客户端,更宽泛地讲,你可以把你正在使用的计算机当作客户端。
再抽象一点,你就是客户端,因为你开启了对话。是你在搜索框输入了 “www.google.com” ,并点击了回车键,你的电脑才向某台谷歌的计算器发出对话请求。
谷歌的计算机就被称为服务器。它通过发送被请求的数据,并且在数据在你的浏览器显示来回应。然后嗒哒!你眼前出现谷歌的网页。所有互联网数据传输都使用这种客户端/服务器关系。
4) 练习基本的命令行
乍一看,命令行可能让人生畏。命令行往往出现在电影的画面里,在黑色的屏幕上滚动着让人无法理解的文字、数字和符号,人们往往把它和邪恶的黑客或者天才技术伙伴联系到一起。
骑士不需要多么天才的头脑就能够理解并且使用命令行。命令行可以执行我们习惯用鼠标勾选点击的一些日常任务。
主要的区别在于,命令行主要通过键盘来输入,一旦你掌握了它,可以大大提高效率。
你可以使用命令行来浏览文件夹、列出文件夹内容、创建新的文件夹、复制和移动文件、删除文件、执行程序等等。输入命令行的窗口被称为终端。
让我们来通过一个基础的导航命令行教程来了解如何使用命令行。
当你打开终端的时候,你首先会冒出一个问题“我在哪儿”? 我们可以使用 pwd 命令行(打印正在工作的目录(Print Working Directory))来解决这个问题。 这个命令行会打印出你当前所在文件夹位于整个文件系统的位置。
动起手来:
如何使用命令行
如果你是 Mac 用户,打开终端应用,它本质上是一个 Unix 命令行终端。
如果你使用非 GUI(图形用户界面)的操作系统,例如 Linux 或 Unix,则在默认情况下,启动计算机就是命令行。如果你的 Linux 或者 Unix 系统有 GUI,你需要手动打开终端。
在提示符下,输入pwd并按下回车,命令行会打印出你当前所处的文件夹的路径。
默认情况下,打开命令行时激活的文件夹是登陆用户的主目录。如果你想从别的位置开始,可以自定义。
方便起见,可以使用波浪号~字符来表示主目录。我们将在接下来的几个示例中使用它。
现在我们知道我们在哪儿了,就可以使用 ls 命令来列出当前目录的内容。 ls 命令代表了“清单(list)”。
输入ls并点击回车, 当前目录名下的所有内容(文件和副目录)都会显示在屏幕上。
输入ls -al重新运行上面的命令,并点击回车。你会得到更多有关当前目录的信息,包括文件大小、修改时间和文件权限。
上面命令中的连字符-使得我们可以通过添加小标来改变命令行为。在上述例子中我们添加了-a标记来显示目录所有内容(包括隐藏文件),同时-l标记显示文件其他信息。
然后我们通过mkdir命令来创建新文件夹,这个命令是 “Make Directory”(创建目录)。我们将创建一个叫做 “testdir” 的目录。
输入mkdir testdir并点击回车,然后输入ls并点击回车,你将在清单中看到你新创建的目录。
要一次性创造嵌套目录,可以使用-p标记来创建整个目录链,如:mkdir -p directory1/directory2/directory3。
如果只在一个固定位置使用命令行的话,用处不大,所以我们接下来将学习如何在文件系统的不同目录间切换。我们可以通过cd命令来实现,它代表了 “Change Directory”(更改目录)。
首先,输入cd testdir然后点击回车。再输入pwd 并点击回车。注意此时的输出告诉我们正在 “testdir” 目录内。我们进入了这个目录!
输入cd ..点击回车,..告诉命令行回到父目录。
再输入pwd点击回车。注意此时的输出告诉你我们回到了原目录,我们回去了!
接下来我们将学习如何在当前目录创建全新的空文件。
输入touch newfile1.txt并点击回车。你可以使用ls来检查新文件是否已经创建。
接下来我们使用cp命令来将文件从一个文件夹复制到另一个文件夹。
输入cp newfile1.txt testdir并点击回车。使用ls和ls testdir检查这个新文件是否还在当前文件夹,以及是否被复制到了 “testdir” 目录。
我们也可以使用mv命令来移动文件。
输入touch newfile2.txt点击回车创建新的文件。
然后输入mv newfile2.txt testdir点击回车将文件移动到 “testdir” 文件夹。
使用ls和ls testdir来检查文件是否已经移动到 “testdir” 文件夹(该文件应该已不存在于原始目录,因为它被 移动了 而并非复制)。
mv也可以用来重命名文件。
输入touch newfile3.txt点击回车来创建一个新文件。然后输入 mv newfile3.txt cheese.txt点击回车来更新文件名。使用ls检查文件是否被重命名。
最后我们可以使用rm命令来删除文件。
输入rm cheese.txt点击回车删除文件。使用ls检查文件是否被删除了。
输入rm -rf testdir点击回车来删除 “testdir” 目录及名下文件。使用ls目录是否被删除。
注意我们必须使用-rf标记来删除目录。这样才可以彻底清空文件夹。
5) 使用 Vim 来培养你的文本编辑器技能
我们已经学习了命令行的基本知识,并且练习了如果不使用鼠标来控制文件。
虽然我们已经知道如何使用命令行创建、复制、移动、重命名以及删除文件,但是我们还不知道如果使用终端来编辑文本内容。
使用终端来编辑文件非常重要,因为计算机代码就是存储在有组织的文件中的文本。
我们当然可以使用一些华丽的文本编辑器如微软的 word(或者更适合于代码的编辑器如 Sublime 或 Atom)来编写我们的代码,但这不是必须的。我们已经使用终端来运行命令行了,显然终端是最方便编辑代码的地方。
有优秀的文本编辑器,但是我推荐你通过 Vim 来打基础。
Vim 是最早的一批编辑器,并且经受住了时间的考验。Vim 代表 “VI i**Mproved”,因为它由Vi**发展而来的。
如上文所述,Vim 是可以直接在终端运行的编辑器,所以我们不需要额外打开一个窗口并使用鼠标来操作。Vim 提供一组命令行和模式使得我们可以直接使用键盘来创建和编辑文本。
Vim 有一定的学习曲线,但是只要稍微练习,你整个程序员职业生涯都会受益。
许多系统都预装了Vim,若要检查你的计算机是否安装了 Vim,可以使用命令vim -v。
如果终端打开了 Vim 并且显示了版本,你就可以开始使用了。如果没有,就需要手动安装(注意你可以通过输入:!q并点击回车来退出 Vim)。更多安装 Vim 的信息,可以查看 https://vim.org。
我认为学习 Vim 最快速简单的方法是使用内置的 VimTutor。运行前请确认系统已安装 Vim,打开命令行输入vimtutor点击回车。
这个教程已经非常棒了,所以这里就不再赘述,现在打开你的 VimTutor 开始学习吧!我们下一章节见!
如果完成了 VimTutor 之后你还有精力学习更多内容的话,欢迎查看 7 个大幅提升效率的 Vim 命令。
6) 学习一点 HTML
你可以将 HTML(HyperText Markup Language(超文本标记语言)的缩写)视为网页的骨骼。它通过指定应该显示的元素及显示的顺序来确定页面的结构。
你浏览过的所有页面都和 HTML 多少有点关系。每当你浏览一个网页,托管网页的服务器就会传输一些 HTML 到达你的浏览器。浏览器读取这些 HTML 并展示出来。
大多数网页包含一组相当标准的内容,包括标题、文本内容、图像链接、导航链接、页眉和页脚等等。所有这些信息都存储为 HTML,定义页面的结构。
需要注意的是 HTML 实际上并不是一种编程语言,虽然我们常常称它为 “HTML 代码”。
在后面的文章我们将看到其他编程语言具备行为,如执行一系列指令。HTML 并不做任何事。我们不运行或执行 HTML,HTML 就在那儿等着被发送给浏览器,再显示在用户端。
事实上,HTML 基本上只是数据。它是定义网页应该是什么样子的数据,仅此而已。
如何编写 HTML 呢?HTML 使用一组标签(基本是一组标记)对应可以标记网页的元素。标签使用尖括号标记。
比方说,title(标题) 标签写作
A bunch of random text content.
。每一个 HTML 元素都有一个起始标签和一个结束标签。起始标签是由一组尖括号和标签名组成:
结束标签和起始标签类似,只是多了一个正斜杠,来表示这是结束标签。
两个尖括号之间的任意文本就是要在网页上显示的内容。
让我们认识一下最常见的几个标签。 首先是标签,定义了 HTML 页面的开始。对应的 标签(注意正斜杠)定义 HTML 页面的结束。 两个标签之间的任意内容都属于页面。
第二个要介绍的是
标签。它定义了浏览器读取页面需要的额外信息。这里的大部分内容都不会展现给用户。对应的标签定义了 HEAD 部分的结束。在上文中提到了
接下来是
A bunch of random text content.
上面简单的 HTML 代码块展现了一个包含一个标题和一个段落的网页。
从这个例子我们可以看出 HTML 标签可以相互嵌套。也就是 HTML 标签可以放置在其他标签内部。
HTML 提供了一系列标签供用户使用,我们不会逐一讲解,我只列举了一部分:
: 开启新一行的段落
: 页面标题(heading)通常用作页面标题(title)
: 段落标题(heading)通常用作段落标题(title)
: 一个图片