前言: 一年前(2019.07)看了几个 Linux 和 Vim 配置视频,被 UP 主行云流水的操作和高度定制化的配置打动了,也想玩玩 Linux 。从 Windows 应用商店下载了个 Ubuntu 便不知所措,于是上知乎提问:在Windows系统上安装了Linux子系统Ubuntu,如何入门? 没有得到满意答案。大四一学年下来,因为各种机缘(项目、比赛、微软推出WSL2),算是“入门”了 Linux ,常用命令/工具比如 dockersshnpm 等等。笔者想借此文回答一下一年前自己的提问。

本文纲要:

  • “蠢”在:没有目标,谈何“入门”?
    • 为什么学习 Linux ?深入 OS ?服务器管理?
    • 经验之谈:工具的学习必须结合实践
  • 新手:卸载IDE(VS, PyCharm)拥抱命令行
  • 大四这一年我是缘何使用并学习 Linux 的
    • KDD CUP2020 :租了一台远程 CPU
    • HUAWEI DAI2020 :使用 docker
    • WSL2 :这是小白学习 Linux 最好的时代
    • 其他正在进行的项目与高手指点…

“蠢”在:没有目标,谈何“入门”?

很喜欢知乎的这个高赞问答:编程新手如何提高编程能力? - 牛岱的回答 - 知乎,链接:

  • https://www.zhihu/question/27574436/answer/745280697

“计算机的学习最好应该是自顶向下,而非自底向上(如理论物理)。” 作者的论证极其精彩,我不再赘述。其核心思想,我完全认同,并深有体会(大一大二没意识到这个道理,走了不少弯路,浪费了不少时间)。

对于 Linux 也是同理。

为什么学习 Linux ?深入 OS ?服务器管理?

如果要学习 Linux ,就要问自己:学习目标是什么?如何才算“学会了”?连标准都没有,哪里有“学会了”可说?

幸运的是,自己没有把时间浪费在 Linux 培训课程上。大四伊始,在 B 站上收藏了两门课,并用三个月时间学完了,笔记记录于 CSDN:

  • 操作系统:清华大学,向勇、陈渝
  • 数据结构:浙江大学,陈越、何钦铭

这两门课对我在 CS 路上的启发都极大,算是我从 野路子自学 改正到 系统理解 CS 的正道上的标志了。《操作系统(概论)》中,除了介绍操作系统历史外,几乎没有专门讲解 Linux 的地方,但是却改变了我对 Linux 的看法。

操作系统说白了也是一套软件,只不过这个软件直接与硬件对接,并且负责管理其他软件作为其他软件的容器为其分配计算资源。Linux 的优势在于:开源、精简、天生适合网络编程。

因此,我大概总结出两条学习 Linux 的理由:

  • 深入理解操作系统,如进程调度的软件算法、文件系统实现
  • 网络编程,服务端管理

前者在我看来有一定门槛,目前我也没有去阅读 Linux 源码,不便多发言;后者,不建议单独学习理论,而建议在需要时(或者现在就租个 Linux 服务器,很便宜),玩玩 ssh ,配置 vimzsh ,边用边学,完全来得及,很简单。

经验之谈:工具的学习必须结合实践

Linux 是操作系统,是软件,是管理计算机硬件与软件的工具;编程语言也是工具,是实现开发者的需求的工具。前文提到“边用边学完全来得及”,是源自笔者的亲身体会:笔者专程学习过太多遍相同内容,却都无疾而终了。

以前端(html/css)为例。

笔者第一次准备系统学习前端,是大一刚入学。在二手书店买了两本二手非知名中文书,以为有毅力就能啃完,并且把技能都留在脑子里。

事实证明,没有压力,没有需求,人是引发不出毅力的。且这两本书写的很差,整本书都像是知识点的罗列,前后内容不连贯,没有一个项目来复现。最后的结果就是,书没读玩,技能一点都没学会。

大二假期,我又想学习前端。在 B 站上找了个网课(某培训班资料)。恕我直言,这位老师可能很博学,但是教学手段实在是不高明。同样,没有完整的项目给人复现,没有循序渐进的知识树,搭建在学生脑海里。知识不成体系,实在是令人感到无奈。

最后,在看到老师对着 Chrome 调试台里的几层方块讲什么是 margin 、什么是 padding 、什么是 border 时,我实在是厌倦了填鸭式教学,关闭了课程,从此再也没点开过。

如果现在让我为一个网页设计爱好者安排前端入门课,我可能会如下设置学习路径:

  • 你眼中的网页是什么结构?而你的浏览器,一个容错率为 0 的机器人,该如何理解描述这种结构的代码由这个问题,引出 DOM 树这种 html 数据结构。此外,便不再赘述 html 中各类标签,让学习者在实践过程中自行根据需求检索、记忆、学习。
  • css?可以自己在 codepen 上复现几个小项目。每一句话都要理解其意义。由浅入深地复现项目,css 将无师自通。
  • JavaScript?理解面向对象吗?理解指针吗?传入的参数,是值还是对象,能搞懂吗?建议从其他语言比如 C++ 入手,先将编程基础思想搞懂;接下来才可专注于 JS 的特性,进行学习。最后,再跟着某些以动手实践为主网课,用一个框架(如 Vue)开发一款产品试试。
  • 对框架的持续学习必然引发对原理的思考。此时,学习者完全可以自主地关注框架的生态、社区与新品动向。学习并理解 JavaScript 编译原理也就是顺水推舟之事了。

新手:卸载IDE(VS, PyCharm)拥抱命令行

有位朋友的观点我很认同:“高度封装的工具剥夺了新手思考的机会, VS Code 作为文本编辑器适于老师教学,而非集成开发环境 IDE 。”

比如说做菜。想象一下,如果一个朋友,每道菜都是购买的现成的料包;每次只需要把洗好的菜配合现成的料包翻炒,出锅,你能说他会做菜吗?他明白这道菜的分别来自哪些调料吗?明白如何配比吗?

IDE 越来越笨重,也是同样的问题。我刚弃用 PyCharm (集成开发环境,IDE)转用 VS Code (文本编辑器)那阵,连项目根目录都分不清。想要引用自己写的一个 module ,却总是报错。这就是被 IDE 惯坏了的后果。当然,现在我们知道,我们在项目根目录下调用解释器命令 python3 main.py ,与 main.py 处于同一目录级别的模块便可以被引用。

而且讽刺的是,IDE 高度集成的大部分功能都不是给新手用的,是用于给专业人士协作、调试的。如果使用 IDE ,新人既承担了性能损失的代价,又没有得到其带来的好处。

因此,新人有必要:

  • 使用一个带有自动补全的文本编辑器如 VS Code 书写代码;
  • 使用命令行编译代码,运行脚本文件。

这有助于我们习惯在命令行(终端)中操作 Linux ,而非依靠图形界面。

大四这一年我是缘何使用并学习 Linux 的

前面提到了实践的重要性,我在提问并没有得到满意答案后,其实是准备搁置 Linux 的学习。但是对于 CS 的学习并未停下脚步,而各种比赛项目也未停歇。在高性能计算时代,你很难不与 Linux 打交道。我大四包括毕业后的暑假实践主要有如下几个。

KDD CUP2020 :租了一台远程 CPU

KDD CUP 2020 开赛时,我正好入门强化学习,主要学习对象是 Sutton 的 《Introduction》。在导师的建议下,我参加了 KDD CUP2020 的强化学习赛道。

我觉得这道题可能并不像图像数据,矩阵维度很大,需要依赖高性能 GPU 来运算。但是还是心疼自己的笔记本,于是便在 矩池云 上按小时租了个低性能的 CPU ,每晚跑跑我的算法。

当时我并没有配置终端,也不会用 screen ,每次只是在 VS Code 里 ssh Remote ,然后在 VS Code 的终端里小心翼翼地 python xxx.py 一下。

这算是我初次使用 Linux 。

HUAWEI DAI2020 :使用 docker

一个正在进行中的自动驾驶比赛(基于强化学习)。主办方提供了模拟器,这便是强化学习比赛的独特之处:并非对数据进行学习,而是对一个复杂的动态环境进行学习。而模拟器的安装,就需要一些功夫。主办方推荐使用 docker 安装。我便在 windows 10 上基于 wsl2 安装了 docker ,并且在 wsl2 中 build docker 。虽然出现几次失误,且文件系统发生了冲突,但是最终还是解决,模拟器与渲染都可以跑得顺畅。

这算是我第一次使用 docker ,我将经验与遇到的 bug 记录了下来:

  • WSL2 下的 Docker 配置,使用网易云镜像 + 更改 docker 文件系统

关于比赛的具体内容不便透露。

WSL2 :这是小白学习 Linux 最好的时代

就在今年,微软推出了 wsl2,相比原来版本的 wsl (Windows Subsystem for Linux),这个 Linux 子系统不再是“伪操作系统”,而是一个基于虚拟机的真实系统。

在以前,想要学习 Linux ,要么通过远程服务器,要么安装非官方虚拟机,要么给电脑再装一个系统(用一个 U 盘在开机时引起中断,我只见过视频讲解,并未真正实践过),要么在 Mac 中体验 Linux 原生命令;而现在,我们只需要在 Windows 系统中进行几步简单配置,再很方便地从应用商店中安装 wsl2 ,就可以体验 Linux 了!对于新手简直不要太友好!

可以说,有了 wsl2 ,这是小白学习 Linux 最好的时代。

其他正在进行的项目与高手指点…

最近在与一些颇有经验的朋友们合作,大家经验都很丰富,也乐于指导,这让我对于 Linux 的使用能力也得以潜移默化进步。具体内容不便透露。

因此,2019 的 PiperLiu ,你想好要怎么入门 Linux 了吗?祝顺利!

PiperLiu,
2020.9.1

更多推荐

一年前我在知乎上提了个愚蠢的问题:如何入门 Linux ?