前言: 一年前(2019.07)看了几个 Linux 和 Vim 配置视频,被 UP 主行云流水的操作和高度定制化的配置打动了,也想玩玩 Linux 。从 Windows 应用商店下载了个 Ubuntu 便不知所措,于是上知乎提问:
在Windows系统上安装了Linux子系统Ubuntu,如何入门?
没有得到满意答案。大四一学年下来,因为各种机缘
(项目、比赛、微软推出WSL2
),算是“入门”了 Linux ,常用命令/工具比如docker
、ssh
、npm
等等。笔者想借此文回答一下一年前自己的提问。
本文纲要:
很喜欢知乎的这个高赞问答:编程新手如何提高编程能力? - 牛岱的回答 - 知乎
,链接:
“计算机的学习最好应该是自顶向下,而非自底向上(如理论物理)。” 作者的论证极其精彩,我不再赘述。其核心思想,我完全认同,并深有体会(大一大二没意识到这个道理,走了不少弯路,浪费了不少时间)。
对于 Linux 也是同理。
如果要学习 Linux ,就要问自己:学习目标是什么?如何才算“学会了”?连标准都没有,哪里有“学会了”可说?
幸运的是,自己没有把时间浪费在 Linux 培训课程上。大四伊始,在 B 站上收藏了两门课,并用三个月时间学完了,笔记记录于 CSDN:
这两门课对我在 CS 路上的启发都极大,算是我从 野路子自学 改正到 系统理解 CS 的正道上的标志了。《操作系统(概论)》中,除了介绍操作系统历史外,几乎没有专门讲解 Linux 的地方,但是却改变了我对 Linux 的看法。
操作系统说白了也是一套软件,只不过这个软件直接与硬件对接
,并且负责管理其他软件
、作为其他软件的容器
,为其分配计算资源
。Linux 的优势在于:开源、精简、天生适合网络编程。
因此,我大概总结出两条学习 Linux 的理由:
前者在我看来有一定门槛,目前我也没有去阅读 Linux 源码,不便多发言;后者,不建议单独学习理论,而建议在需要时(或者现在就租个 Linux 服务器,很便宜),玩玩 ssh
,配置 vim
和 zsh
,边用边学,完全来得及,很简单。
Linux 是操作系统,是软件,是管理计算机硬件与软件的工具;编程语言也是工具,是实现开发者的需求的工具。前文提到“边用边学完全来得及”,是源自笔者的亲身体会:笔者专程学习过太多遍相同内容,却都无疾而终了。
以前端(html/css
)为例。
笔者第一次准备系统学习前端,是大一刚入学。在二手书店买了两本二手非知名中文书,以为有毅力就能啃完,并且把技能都留在脑子里。
事实证明,没有压力,没有需求,人是引发不出毅力的。且这两本书写的很差,整本书都像是知识点的罗列,前后内容不连贯,没有一个项目来复现。最后的结果就是,书没读玩,技能一点都没学会。
大二假期,我又想学习前端。在 B 站上找了个网课(某培训班资料)。恕我直言,这位老师可能很博学,但是教学手段实在是不高明。同样,没有完整的项目给人复现,没有循序渐进的知识树,搭建在学生脑海里。知识不成体系,实在是令人感到无奈。
最后,在看到老师对着 Chrome 调试台里的几层方块讲什么是 margin
、什么是 padding
、什么是 border
时,我实在是厌倦了填鸭式教学,关闭了课程,从此再也没点开过。
如果现在让我为一个网页设计爱好者安排前端入门课,我可能会如下设置学习路径:
描述这种结构的代码
?由这个问题,引出 DOM 树这种 html 数据结构。
此外,便不再赘述 html 中各类标签,让学习者在实践过程中自行根据需求检索、记忆、学习。css
?可以自己在 codepen 上复现几个小项目。每一句话都要理解其意义。由浅入深地复现项目,css
将无师自通。JavaScript
?理解面向对象吗?理解指针吗?传入的参数,是值还是对象,能搞懂吗?建议从其他语言比如 C++ 入手,先将编程基础思想搞懂;接下来才可专注于 JS 的特性,进行学习。最后,再跟着某些以动手实践为主网课,用一个框架(如 Vue
)开发一款产品试试。有位朋友的观点我很认同:“高度封装的工具剥夺了新手思考的机会, VS Code 作为文本编辑器适于老师教学,而非集成开发环境 IDE 。”
比如说做菜。想象一下,如果一个朋友,每道菜都是购买的现成的料包;每次只需要把洗好的菜配合现成的料包翻炒,出锅,你能说他会做菜吗?他明白这道菜的色
、香
、味
分别来自哪些调料吗?明白如何配比吗?
IDE 越来越笨重,也是同样的问题。我刚弃用 PyCharm (集成开发环境,IDE)转用 VS Code (文本编辑器)那阵,连项目根目录都分不清。想要引用自己写的一个 module
,却总是报错。这就是被 IDE 惯坏了的后果。当然,现在我们知道,我们在项目根目录下调用解释器命令 python3 main.py
,与 main.py
处于同一目录级别的模块便可以被引用。
而且讽刺的是,IDE 高度集成的大部分功能都不是给新手用的,是用于给专业人士协作、调试的。如果使用 IDE ,新人既承担了性能损失的代价,又没有得到其带来的好处。
因此,新人有必要:
这有助于我们习惯在命令行(终端)中操作 Linux ,而非依靠图形界面。
前面提到了实践的重要性,我在提问并没有得到满意答案后,其实是准备搁置 Linux 的学习。但是对于 CS 的学习并未停下脚步,而各种比赛项目也未停歇。在高性能计算时代,你很难不与 Linux 打交道。我大四包括毕业后的暑假实践主要有如下几个。
KDD CUP 2020 开赛时,我正好入门强化学习,主要学习对象是 Sutton 的 《Introduction》。在导师的建议下,我参加了 KDD CUP2020 的强化学习赛道。
我觉得这道题可能并不像图像数据,矩阵维度很大,需要依赖高性能 GPU 来运算。但是还是心疼自己的笔记本,于是便在 矩池云 上按小时租了个低性能的 CPU ,每晚跑跑我的算法。
当时我并没有配置终端,也不会用 screen
,每次只是在 VS Code 里 ssh Remote ,然后在 VS Code 的终端里小心翼翼地 python xxx.py
一下。
这算是我初次使用 Linux 。
一个正在进行中的自动驾驶比赛(基于强化学习)。主办方提供了模拟器,这便是强化学习比赛的独特之处:并非对数据进行学习,而是对一个复杂的动态环境进行学习。而模拟器的安装,就需要一些功夫。主办方推荐使用 docker 安装。我便在 windows 10 上基于 wsl2 安装了 docker ,并且在 wsl2 中 build docker
。虽然出现几次失误,且文件系统发生了冲突,但是最终还是解决,模拟器与渲染都可以跑得顺畅。
这算是我第一次使用 docker ,我将经验与遇到的 bug 记录了下来:
关于比赛的具体内容不便透露。
就在今年,微软推出了 wsl2,相比原来版本的 wsl (Windows Subsystem for Linux
),这个 Linux 子系统不再是“伪操作系统”,而是一个基于虚拟机的真实系统。
在以前,想要学习 Linux ,要么通过远程服务器
,要么安装非官方虚拟机
,要么给电脑再装一个系统
(用一个 U 盘在开机时引起中断,我只见过视频讲解,并未真正实践过),要么在 Mac 中体验 Linux 原生命令
;而现在,我们只需要在 Windows 系统中进行几步简单配置,再很方便地从应用商店中安装 wsl2 ,就可以体验 Linux 了!对于新手简直不要太友好!
可以说,有了 wsl2 ,这是小白学习 Linux 最好的时代。
最近在与一些颇有经验的朋友们合作,大家经验都很丰富,也乐于指导,这让我对于 Linux 的使用能力也得以潜移默化进步。具体内容不便透露。
因此,2019 的 PiperLiu ,你想好要怎么入门 Linux 了吗?祝顺利!
PiperLiu,
2020.9.1