面向入门的开发环境打造
环境搭建是个老生常谈的话题,网上各类教程五花八门,大多只是停留在“能用”的程度,知其然不知所以然。结果要么停留在上古时期,要么重度依赖某些集成套装所构筑的复杂体系,懵懵懂懂之下,不少刚入坑的新朋友在这其中也有些迷失。即便到了大三大四,连命令行都还不了解的都大有人在。
计算机世界就像一座大山,个人的力量不可能穷尽它的所有。若对此没有一个基本印象,很容易绕在山脚下的细枝末节中徘徊。你不是第一个来到这个山头的人,前人已挖好许多好走的山路,通过它你可以快速了解一下这座山的大体构造。熟悉以后,再更深入地去探险也成为可能,乃至于走出一条属于你自己的不寻常山路。
几年的编程学习,给我带来一点很深的体会,计算机入门的障碍,更多在于缺少一个统一、稳定、靠谱的编程学习环境。 一个好的开发环境,不仅仅是一个趁手的编程工具,更是你在计算机大山中披荆斩棘的瑞士军刀的存在。
核心思想及其 权衡
在明确具体步骤之前,先明确一个核心的目标和预期,然后根据实际情况去接近它们。一个稳定、靠谱的编程学习环境,从抽象的角度来看,大致需要满足这三点:
- 友好的命令行界面(Command-Line Interface)
- 好用的文本编辑器(Text Editor)
- 适合计算机学习的 Linux 操作系统
接下来展开说说它们的重要性。
命令行界面(Command-Line Interface)
CLI 对于大多数新人而言,想必会比较陌生,目前我们接触的计算机都是冯·诺依曼体系结构,始终离不开如图的五大部分。其中,输入、输出设备是机器与外界的交互渠道。
计算机发展至今,输入、输出设备越来越多样,比如键盘、触控板、屏幕、打印机、音频输入输出、网络等等,对应在内部需要通过一些特定的程序,去处理用户通过输入设备传入的操作,通过输出设备给用户反馈结果。负责与外界交互的部分又称作界面(Interface,也叫“接口”)。
最为常见的界面,便是以显示器为主的输出设备、以鼠标和触屏为主的输入设备,对应的图形用户界面(Graphical User Interface,简称GUI)。GUI 具有贴合 直觉的优势,但需要考虑的输入输出设备等因素众多,实现也较复杂,并且设计语言随着时代发展一直在变,没有一个统一的标准。
在各种各样的输入输出设备之间,有一组输入输出贯穿了整个冯诺依曼结构计算机世界的始终,那就是 — 标准输入输出(Standard Input/Output),与此对应的输入输出设备,叫做终端。关于终端,这里不详细展开介绍,有兴趣详细了解的话,可以阅读 这篇介绍终端发展历史的博文。
基于标准输入输出实现的操作界面,也叫做命令行界面(Command-Line Interface,简称 CLI)。它的优点是简洁且富有表达力,不足的是,使用 CLI 的初期需要一些学习成本和记忆的负担。
GUI贴近直觉的特性,尤其适合简单直观的一次性任务。当任务变得庞大、固定或重复,GUI 表达力的局限性就开始体现出来。CLI 的简洁与强表达力带来的好处,可以盖过了它本身的学习成本,但是一般人们习惯进入 GUI 的舒适圈之后,很难体会到这一点,就比较难走出来。
文本编辑器(Text Editor)
人类编写的代码通常展示成文本的形式,文本编辑器也是写代码的一个重要工具。在介绍文本和文本编辑器之前,首先需要明确计算机存储的 数据 (Data)、文件系统 (File System)和 文件(File)的概念差异。
数据 (Data) 在计算机载体中,以二进制位(bit)的状态来表示。一般以字节(byte)为单位去组织存取的过程(1 byte = 8 bits)。一段数据也是由若干个 byte 组合而成,针对文本类型数据,计算机会按照文本的编码规则(如 ascii,utf-8 等)将其编码成对应的二进制状态,以供内部存储和处理。
底层的存储器一般会以包含固定数量的 byte 的逻辑块(Logical Block)为单位组织数据,但它存取都很不灵活。为了抹平底层的差异,操作系统工程师设计了文件系统的概念。文件系统在用户视角提供了文件和目录的抽象概念。用户在使用时,无须关心底层如何实现,只需要知道目录和文件名,就能通过操作系统提供的 API 访问到对应的文件数据。
文本编辑器便是专门处理这样文本类型数据的工具,它可以为你提供文本处理,以及保存和读取文件的功能。代码在计算机的视角都是文本,不同语言的代码文件的差别,只是文件命名后缀的差异不同 (.c
, .cpp
, .py
, .java
, .js
...)。写代码,大部分时候写的也是这样的文本数据。
理论上来说,任意一个文本编辑器都可以编写代码,差别在于各自体验与效率的不同。然而人的力量是有限的,因为不同的语言规则不同,提升阅读和编写体验便成了一个关键的因素。为了减轻大脑的负担,减少出 错的概率,就产生了类似针对代码的不同元素着色,行号显示等等的辅助功能,如图:
除了行号与高亮这些基本能力外,一个好用的编辑器可能还有关键字提示、自动补全、语法检查等等功能,具体需要你慢慢探索和体会。
Linux 操作系统
关于 Linux 的重要性,此前 @Bintou 老师开的帖子 学习Linux为什么重要 已有详细讨论。
总的来说,Linux 的重要性主要在于以下几点:
- Linux 系统本身作为开源程序,是一个可以避免流于纸上谈兵,直接深入研究操作系统原理的系统;
- Linux 由程序员为程序员打造,在 CLI 方面的生态相对更完善,有利于学习;
- 通过 Linux 可以接触到许多优秀的开源软件,感受黑客文化与 Unix 社群文化的熏陶,以及开源社区的开发模式,即使未来投身于其它领域的开发,其中也会带来不少积极的影响;
- 在商业视角,Linux 基本主导了服务器于云计算的市场,开源模式正逐渐主导整个软件业,即使庞大如微软,也在拥抱 Linux 为代表的开源社区体系。功利地说,即使仅面向未来的就业,Linux 也是无法避开学习的一项技能。