写给 Linux 初学者的一封信

编程修养
• 阅读 1579

大家好,我是肖邦

这篇文章是写给 Linux 初学者的,我会分享一些作为初学者应该知道的一些东西,这些内容都是本人从事 Linux 开发工作多年的心得体会,相信会对初学者有所帮助。如果你是 Linux 老鸟,那可能就不需要再往下看了

写给 Linux 初学者的一封信

为啥要学Linux

作为从事 IT 工作的同学,对 Linux 系统一定不陌生。如今我们在各种领域都能看得到它的身影,比如,手机、服务器、嵌入式、电信设备、大型计算机,以及各种电子类产品都离不开 Linux,它已经渗透到互联网世界的方方面面了。

包括那些火热的技术,比如云计算、虚拟化、容器、大数据、人工智能,几乎都是基于 Linux 技术的,那些平台系统,电商、团购、社交、新闻、快递,都是部署在服务器端,也几乎都是基于 Linux 技术的。

在编程的世界中,Linux 就是主流,不会 Linux 你就可能会格格不入。如果你想进大公司,想学新技术,Linux 一定是一道绕不过去的砍,只有进入了 Linux 系统这扇大门,你才可能成为合格的软件工程师。

企业服务器环境绝大部分都是 Linux 系统,所以不管你是从事前端、后端、运维、测试中的哪一类工作,Linux 都是你必须掌握的基础知识,只是不同类型工作需要学习 Linux 的方向不同而已。

经验与建议

下边分享的内容是本人从事 Linux 开发多年的一些经验总结,相信对 Linux 初学者会有所帮助,当然如果有不准确的地方,还请指正。

  • 一定要自己搭建Linux环境。Linux 系统学习是很重实践的,仅学习理论知识是不能真正掌握 Linux 的。我推荐在个人电脑上安装虚拟机,虚拟机的方式非常灵活,既可以提供 Linux 环境,也不会影响宿主机的正常使用。对于虚拟机软件的选择,可以考虑使用 VMwareVirtualBox 。虚拟机的快照功能一定要用好,尤其是对新手来说,它可以将你不小心搞坏的环境恢复到初始化状态,就像是重新安装了操作系统一样,从此妈妈再也不用担心我 rm -rf /* 了。
  • Linux发行版的选择。由于 Linux 的强大,目前存在太多的发行版本了,有些同学在选择上可能会有些纠结。这里我推荐选择使用 CentOS 就行,由于免费且稳定,国内企业服务器使用最多的就是 CentOS 了,使用上和 RedHat 几乎没有什么区别。当然你可以选择 Ubuntu 系统,国内服务器使用份额仅次于 CentOS。其实所有发行版都是基于 Linux 内核的,只是扩展了相关的系统组件和软件库,本质上都是 Linux 系统,学会了 CentOS 后就很容易上手其它版本的系统了,所以无需太关注和纠结这个问题。
  • 一定要使用命令行。大部分初学者经常喜欢安装图形桌面,因为我们之前都习惯了 win 或 mac 的图形操作。但我强烈建议,安装系统时不要安装桌面,平时的操作和学习都坚持使用命令行。学习前期可能会比较痛苦,但熬过了阵痛期,熟练使用之后,就能享受到命令行带来的强大功能。命令行不仅功能强大,而且可以极大的提高效率,因为命令行就意味着能够自动化,自动化能为你释放很多重复性的工作,让你有充足的时间去学习更有价值的知识。另外,图形界面在 linux 系统上作为一个独立软件存在,会额外消耗服务器的资源,企业的服务器一定是不会安装图形的,所以需要你一定要在 Linux 世界中忘掉 windows 的思维方式
  • Linux 是开源的。开源意味着你能够查看 Linux 源码,可以从代码层面理解系统实现的原理,这些可以让你达到一通百通、醍醐灌顶的效果,而不是简单的使用它。
  • 养成安全严谨的良好习惯。对于初学者来说,虽然大部分时间是在虚拟机上操作,有快照的加持,可以毫无顾忌的进行各种实验性的操作。但我还是强烈建议初学者一定要养成良好的操作习惯:1. 经常备份重要的数据;2. 少用 root 用户进行各种操作;3. 敲命令不是越快越好;4. 服务器密码尽可能的复杂些,不要使用 123456 这类弱密码,服务器很可能被侵入当肉鸡;5. 服务器密码不要简单记录在文档上或 U 盘之类的移动设备上;6. 对生产环境一定要有敬畏心

如何学习?

高效的学习方法往往能够帮助你事半功倍,下边是我分享的一些自己的学习心得和方法,希望对大家有帮助。

  • 一定要多实践。Linux 是一门实操性非常强的学科,初学者需要多敲命令,多实践和练习。与学习其它东西是一样的,大多时候我们不需要非得先将理论知识学的通透后才来实践动手,而是从实践中发现问题后再深度学习,这样效果可能会更好。
  • 有效的学习方式。说到学习方式,每个人学习的方式可能不太一样。我推荐 视频 + 看书 的方式,视频教程可以让你快速上手,快速了解相关的概念,而看书可以更加全面的学习具体的细节,会让你有更多的思考,看书可以作为视频的补充和扩展。
  • 思考,总结与归纳。不管以什么形式来学习,我们都需要对学习中的每个问题和概念认真思考,需要从 whathowwhy 三个角度进行学习,作为学习的问题模板。学习任何新技术,我们都需要知道这个技术知识点的应用场景,以及能够解决什么问题,是否有类似的解决方案,此技术点有什么优势
  • 输出是一种高效学习方法。在学习过程中,必不可少的一个环节就是归纳和总结,总结就要输出,可以是文档形式的笔记或者其它。我比较推荐写博客*,有条件的话一定要写,因为写博客可以帮助你更有效地、更系统的总结和学习。写博客是一种 *教 的形式,如果能够将自己学到的知识在博客上清晰的讲清楚,教会别人,那才说明你是真正的掌握了它。如果博客写的不错的话也能为自己够积累影响力,对自己将来的求职也会有帮助。另外如果别人从你博客学习到了东西而且觉着不错的话,会给你点赞、留言、赞赏,这都是对你写博客和学习的正反馈,同时也能够刺激你保持学习的兴奋和激情,呵呵。
  • 制定明确的学习目标。做任何事,有了目标才能够走的更远,少走弯路。我们学习 Linux 也一样,需要根据自己的实际情况,制定适合自己的学习目标。个人建议目标不要太大,时间周期也不要太长,要切合实际,比如制定三个月的学习目标。有了目标后,就要确定详细的学习计划,细化到每周需要完成的任务列表。注意,你需要为计划任务指定结果检验的方式,比如写一篇博客文章或是笔记,计划真实落地才是最困难的,因为执行力是一种稀缺资源。
  • 坚持与激情,获得正反馈。学习是一件逆人性的事情,大部分人在遇到诸多问题后就很容易会放弃。1. 合理的学习计划和结果输出,能够让你继续保持学习的激情;2. 写博客、讨论交流等方式也可以获得正向的反馈,从而激励着你继续向前;3. 坚持学习也能够帮你养成良好的习惯,无形中提高自己的执行力,个人认为这些收获可能远比具体的技术知识更加重要。
  • 如何解决问题。在学习 Linux 技术的时候,初学者肯定会遇到各种 奇怪 的问题,面对这些问题时,我们要学会分析错误信息,尝试以目前学习到的技术来思考找答案,如果解决不了,可以使用搜索引擎,对于初学者遇到的问题,百度一般都能够解决。如果实在解决不了,可以请教身边的高手,不过提问问题时,一定要描述清楚问题,带着谦虚请教的态度。

应该学习的基础知识

Linux 系统涉及的技术知识点非常广泛,学习者可以根据自己的实际情况,选择相应的主题方向进行学习,不可盲目的跟随他人的学习路线,有可能适得其反,学习效果事倍功半,得不偿失,所以选择适合自己的学习路线非常重要。

因为每个人将来从事的工作和方向不同,需要重点学习的内容也不一样,而且本文目标也只是分享给 Linux 初学者一些实用的经验心得,所以后边内容中只简单罗列了最通用和实用的一些技术,这些是学习 Linux 技术的所有同学都应该知道的技术知识点。

  • 学习 vim。在 Linux 系统下,基本没有什么可以与之竞争的编辑器(不接受反驳),你只需要花费 1-2 天的时间来熟悉 vim 的基本使用操作即可,无需研究那些高大上的各种插件使用技巧。要知道 vim 的学习是有难度的,不过一旦熟练使用后,就会得心应手,能极大提高编辑效率。这里推荐陈皓的《简明 vim 练级攻略》。
  • 简单的文件管理。这些都是一些非常基础的操作与文件的管理命令,如:lslessheadtaildudfln 等,当然 find 是查找文件的非常有用的命令,功能非常强大。
  • 基础的网络管理。常用的网络管理命令,一定要学会使用,这对平时工作或学习时的网络诊断和网络配置非常有用。比如 ipifconfig 等网络命令,还有网络诊断工具 netstatpingtraceroute 等。
  • 学些 shell 脚本编程。我们知道 Linux 特点之一就是命令行,上边我们说过,命令行就意味着可以自动化,自动化后就能够规模化。shell 脚本就是我们实现自动化的最有效的方式,因为 shell 程序是最擅长与 Linux 内核打交道的。我们可以利用 shell 脚本帮我们做很多重复性的工作,来释放我们工程师的双手去创造更大的价值。
  • 熟悉作业管理。我们需要经常在命令行终端上管理应用程序,启动或关闭程序。你需要知道这些概念,如:进程、进程组、会话、终端,学会使用 jobsfgbgkillCtrl-CCtrl-Z,以及信号的相关操作,需要知道 kill -9 到底是在干什么。
  • 学习使用软件包的管理。国内最常用的 Linux 发行版是 ubuntucentos,需要学会使用 apt-getyum 命令来查找和安装相关的软件包,当然也要学会试着从源码编译方式安装软件。
  • 学习简单的数据处理。我们在工作和学习中也会经常需要处理文本信息,Linux 在这方面提供了很多的工具,组合起来能够非常方便的实现强大的功能。常见的命令 sortuniqcutsplit,还有 Linux 经典的三剑客 sedawkgrep,这三个工具都是上古神器,功能非常强大,awk 还有专门的书籍来讲解它,可见功能之强大与复杂,我们初学者只需要熟练掌握一些常用的功能即可。
  • 学会看文档。虽然不是具体的技术知识,但它却非常重要,初学者在学习命令时总是希望能记住所有的参数和选项,其实这些参数我们不需要记忆(大脑是用来思考的而不是存储的),我们可以通过 Linux 手册来查看,通常使用 man ifconfig 就能够查看该命令的官方文档说明,既准确又清晰。当然在遇到问题时,也可以查看手册来确认命令的使用方法是否正确。

Linux 系统涉及的技术知识点非常复杂,上述所分享的仅是一些必学基础知识,如果能够认真学习并够掌握好,基本上算是入门 Linux(存活的级别)。

如果你是运维方向,至少需要更深入的学习:用户管理、磁盘管理、系统日常管理、常见服务的搭建、高可用集群、系统监控等运维知识。

如果你是后台开发方向,至少需要更深入学些 Linux 操作系统、进程与线程、进程间通信、信号、网络编程、系统调用、Linux 内核等知识。

如果你是嵌入式方向,你至少需要深入研究 Linux 内核源码、设备驱动程序了。

本篇文章到此结束,后边还会更新 Linux 系列文章,文章内容风格会尽量保持通俗易懂、重实践和实用性,尽可能地帮助到有需要的同学,如果感兴趣的话,可以继续关注后续 Linux 系列文章。

谢谢大家,我是肖邦,欢迎关注后续的精彩分享。

推荐阅读:


写给 Linux 初学者的一封信

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Linux菜鸟到老鸟的那些建议
相信很多同学对Linux(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.linuxprobe.com%2Fchapter00.html)的认识并不多,平常接触的也不多,对Linux的开发运维等也是一无所知。如今,如果要做一名优秀的程序猿,掌握Linux知识已经是一门必备技能了
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这