0x01 My workspace
工欲善其事,必先利其器,有一个趁手的开发环境,对于我们日常工作来说,至关重要。
自从前一段时间我从 Arch Linux 迁移到 NixOS 之后,这个在 Farewell Arch Linux, Hello NixOS 这篇文章里有讲,我的工作环境终于稳定了。
所有曾经我好奇过的技术,我都认真探索并比较过了,现在能留下来的,都是让我非常满意,并且能极大提升我工作效率的工具。
我最终的工作栈就是这个样子:
上图中,下到系统固件、操作系统,上到画图软件、编辑器,列出了很多工具,不过在这里,我重点讲几个我认为最重要最核心的工具。
注意,这个工作环境更侧重于后端开发,当然前端也适用,比如我这个网站,就是我自己在这个工作环境下一行行写出来的,效率也非常高。
0x02 NixOS
首先要介绍的就是 NixOS 操作系统,它是一个非常独特的linux发行版。
与我们熟知的 Ubuntu / Debian / Fedora / Red Hat / Arch Linux 等发行版不同,NixOS 是通过配置的方式,来实现一切功能的。
比如说,我通过配置,可以指定想要安装的内核版本,想要安装的应用程序,以及我还可以通过配置,来设置我的wifi网络。
总之,你想要的功能,都可以通过配置来完成。
在修改完对应的配置文件后,执行一条命令,NixOS 就会根据配置文件的内容,帮我们构建出来一个符合我们要求的系统环境。
也就是说,只要我们有了这份配置文件,我们就可以非常容易的在一台机器上,构建出来一个一模一样的开发环境。
是不是很神奇。
而且,NixOS 每次构建出来的系统环境,都是一个全新的版本,它和之前的各个版本,是可以同时共存,且不相互影响的。
这就意味着,假设我们新构建出来的版本有问题,我们是可以随时回退到以前的旧版本的。
基于配置的方式来构建系统,且每次构建的系统是一个全新的版本,这两个核心特性使得 NixOS 非常稳定可靠。
我们再也不用担心哪个操作把系统搞挂了,使得辛苦很久配置的工作环境瞬间就没有了,这种事情,在 NixOS 上永远不会发生。
NixOS 还有一个很好的点是,假设我们之前安装的某些软件,或者是系统设置不需要了,我们只用更改一下配置文件,然后构建一个新的版本,这样我们就得到了一个非常干净的,没有任何残留的系统环境。
这个在其他linux发行版上是很难实现的,而在 NixOS 上,这只是基本操作。
另外,NixOS 上还可以安装多个版本的应用程序,或者共享库,比如同时安装多个版本的glibc,这个在其他linux发行版上,也是很难实现的。
说了 NixOS 这么多优点,也来说说它的缺点。
它的缺点也很明显,就是上手难度非常高,对新手非常不友好。
因为 NixOS 独有的特性,使得它对linux系统做了各种定制,如果你不理解 NixOS 底层的运作机制,当你遇到问题时,你是很难独自解决的。
而且,你在其他linux发行版上的积累的经验,并不能给予你在 NixOS 上很多帮助。
所以,对新手来说,我非常不推荐 NixOS。
如果你是新手,且对linux感兴趣,可以先用 Ubuntu,等对linux有了一定的了解之后,再切换到 Arch Linux,顺便说一下,Arch Linux 也是一个非常好的发行版。
在用 Arch Linux 期间,你会学到大量的linux相关知识,如果在此期间,你深入理解了linux上程序的构建过程,以及linux上程序的运行原理,此时,你就可以开始探索 NixOS 的世界了。
这里再强调下,如果你有能力,一定要试一下 NixOS,它的美是只有你度过了前期的适应阶段才能察觉到的,而且在那个时候,你会感受到一个完全不一样的,全新的linux世界。
0x03 Hyprland
有了 NixOS,我们就有了一个可运行的linux系统,现在我们要挑选一个桌面环境。
如果你之前用惯了 Windows / Mac,可能会觉得所有的桌面环境应该都和 Windows / Mac 差不多,大同小异。
其实不然,在linux的世界里,不仅有和 Windows / Mac 类似的桌面环境,还有一种专门为开发者打造的,使用平铺式窗口管理的桌面环境。
在 Windows / Mac 桌面环境里,你打开的程序都会相互堆叠在一起的,而在平铺式窗口管理的桌面环境里,所有打开的程序,是整整齐齐的排好的,它们之间不会相互堆叠。
就像下图这个样子:
那有人可能会有疑问,如果打开的程序过多,使用这种方式,每个程序岂不是只有很小的一块空间用来显示内容?
是的,所以在平铺式窗口管理的桌面环境下,还有另外一个概念,就是工作空间。
一个工作空间其实就是一个完整的桌面,当你打开的程序在一个工作空间放不下时,你就可以把它放到其他的工作空间。
平铺式窗口管理器一般有很多个这样的工作空间,而且你可以通过各种方式来切换工作空间,其实就相当于在切换桌面上显示的内容。
工作空间给你提供了一个个相互独立,且组合起来无限大的桌面环境,而每个工作空间里平铺式的窗口管理,又让你的应用程序整整齐齐的排在一起,非常美观。
再配合快捷键来快速切换工作空间,也就是切换桌面上显示的应用内容,这样你就同时拥有了效率和优雅,这些特性是 Windows / Mac 给不了的。
这也正是平铺式窗口管理的精妙所在。
讲完了平铺式窗口管理的概念,我们再回到这一小节的主题,Hyprland。
在linux的世界里,能提供平铺式窗口管理的工具有很多,但最漂亮的非 Hyprland 莫属,没有之一。
下面是 Hyprland 官网 的一个视频:
这个视频里只展示了一些 Hyprland 的基础能力,如果你好奇 Hyprland 到底能配置的多漂亮,可以看下 Hyprland 的名人堂,看过之后你就会明白,为什么我会说 Hyprland 是最漂亮的平铺式窗口管理工具,没有之一。
其实,你从各平铺式窗口管理工具的官网就能看出来,Hyprland 在界面美观上,是非常用心的。
你看下 awesome / i3 / sway 的官网,再看下 Hyprland 的官网,Hyprland 对它们简直就是秒杀,根本就没有可比性。
而且,Hyprland 对自己的定位就是 Tiling compositor with the looks,即兼具美观的平铺式窗口管理工具,这是人家在官方首页就声明的。
所以,Hyprland 一出生,就是要打造一个漂亮的工具,这是写在基因里的,这正是其他同类工具没法比的一点。
这个其实也可以给我们带来一些启示,一些反思。
做技术的人往往过于专注技术,而忘了技术的最终目的是为了创造产品,是为了服务用户。
我们过于专注于用技术实现功能,而忘了我们做出的东西,也应该兼具美感。
只有我们做的东西拥有美感,拥有更好的用户体验,那它才能被用户接受,它才能更有生命力。
否则,你的代码写的再好又有什么用呢,用户体验一团糟,别人用了一次就再也不想用了,这样的产品能活下来吗?
产品都活不下来,这样的代码又有什么价值呢?
代码只是整个产品评分的一部分,不是全部,做好用户体验,提升产品美感,做自己产品的产品经理,人人都是产品经理。
话题跑的有点远,我们再回到 Hyprland。
Hyprland 对我来说唯一的缺点,就是它是用C++写的,不是Rust,这一点很可惜,这让我失去了参与开源贡献的动力。
人的精力有限,C++已经不再是一门值得投资的编程语言,它的市场已经在被Rust蚕食了。
期待开源社区能出一款用Rust编写的,媲美 Hyprland 的工具,我会毫不犹豫的转过去。
0x04 Alacritty
就像仙侠世界中,每一个的武者都要挑选一件趁手的兵器,做为一个命令行重度用户的人,也一定要拥有一个最满意的终端模拟器。
这里我推荐的就是 Alacritty。
我推荐 Alacritty 并不是说它就是最好的,而是因为它在我的工具体系里,是最合适的。
它专注于性能,奉行极简主义,它没有各种花哨的功能,愿意成为一个小而美的工具,这正是我需要的。
因为我已经拥有了一个功能非常强大的 Hyprland 了,我不那么需要这个终端有太多的功能,我需要的,只是一个性能高,占用资源少的终端,仅此而已。
就像我已经拥有了屠龙刀,我对倚天剑就没有那么多渴求了,反而我更需要的,是一把削铁如泥的锋利匕首。
而 Alacrity 就是这个角色。
最终选择 Alacritty,也是经过我层层筛选,细致比较的。
通过对比各种终端模拟器,最终进入我视野的,就只剩 Alacritty 和 Kitty。
Kitty 是我曾经尝试两次,但都最终放弃的一个工具。
之所以会尝试两次 Kitty,是因为总有一些时候,我觉得如果终端有标签会更方便些,特别是终端窗口开的比较多的时候,如果有标签,我可以把它们分组,这样整体更有逻辑感,而且也更节省桌面空间。
Alacritty 是没有标签功能的,而 Kitty 有,所以我一直想试下,能否用 Kitty 替换掉 Alacritty。
但之所以两次尝试都放弃了,是因为 Kitty 想要做的东西太多了,它违背了我想要的只是一个小而美的终端的初衷。
它集成了太多初看起来很好,但实际工作中几乎用不到的功能,比如在终端下显示图片,而且它的很多功能的做法,比如在终端中搜素文本,也是和其他终端的做法完全不同的,这无形中给我增加了很多学习成本和记忆成本。
我想要的只是一个标签功能,但它给的太多。
虽然 Hyprland 搭配 Alacritty 已经很完美了,但 Alacritty 没有标签功能总是有那么一点小小的遗憾,所以我平时在逛开源社区中,也时常会留意有没有 Alacrity 的替代品。
直到我发现了 Zellij,我才知道我寻找的方向错了。
Do one thing and do it well,Alacritty 作为一个终端,它已经做的很好了,我想要的标签功能并不一定非要内嵌在 Alacritty 里,它完全可以用其他工具来实现。
对,这个工具就是 Zellij。
0x05 Zellij
Zellij 是又一个给我初看即惊艳感觉的工具,因为它的界面做的真的很漂亮,而且用户体验极佳。
这是它的官方动态图,大家可以自己感受下:
它不仅提供了我想要的终端下多标签的能力,还能把终端区域进行各种切分,以及对这些区域进行悬浮隐藏等等。
它完美覆盖了 Hyprland 加 Alacritty 无法到达的区域,而且是非常漂亮的实现了这些功能。
Hyprland + Alacritty + Zellij 简直就是一个无可挑剔的完美组合,如果说 Hyprland 加 Alacrity 已经能让我健步如飞,那 Zellij 的加入,就是让我如虎添翼。
大爱。
0x06 Fish
现在终端体系已经完善了,那我们再来看一下,对终端里运行的shell的选择。
其实这个可选范围很小,只有 bash / zsh / fish。
bash是linux下的shell标准,如果要写shell脚本,一定是用bash,所以它是必须要懂的。
但因为bash太过简陋了,所以它并不适合在日常使用。
zsh在尽量兼容bash的前提下,对bash进行了各种优化及扩展,所以它也成了很多人的选择。
我最开始用的也是zsh,看中的就是它对bash的兼容性,但后来我还是放弃了,最终选择了fish。
因为我逐渐发现,对日常终端的各种操作来说,bash的兼容其实并没有那么重要。
当zsh对bash的兼容性不再是一个重要优势的时候,它的缺点也就暴露了出来。
对比fish来说,它的文档很差,并且远离开源社区,普通人参与度很低,这也导致了它的生命力必然不如fish顽强。
而且fish作为一个shell新锐,愿意大刀阔斧的改革,愿意创新,这是非常吸引技术极客们的。
比如它最近的一个大动作,就是把代码从C++迁移到Rust,这一举动必然会吸引很多人加入fish,其中就包括我。
另外,fish也做到了开箱即用,基本不用配置就有一个非常好的用户体验,这一点也是非常吸引我的。
总之,平时使用我选择fish,而如果需要写脚本,就用bash,zsh弃用。
0x07 Helix
有了 NixOS 作为基石,有了 Hyprland / Alacritty / Zellij 搭建终端环境,有了 Fish 提供 shell 环境,那我们下一步要做的,就是选择一个好用的编辑器了。
作为日常工作中打交道最多的工具,这个选择也至关重要。
因为我是重度命令行用户,所以像 VS Code / JetBrains 系的产品我不会选择。
它们是非常好的工具,我偶尔也会使用,但它们不是我的主力编辑器。
作为终端用户,可供选择的其实就是 Vim / Emacs,以及像 Helix 这样的后起之秀。
和绝大部分人的选择一样,很多年前我最开始尝试的也是 Vim,但不管当时我怎么配置,我总是觉得 Vim 的外观太过简陋了,使用体验很不好。
直到我遇到了 Emacs,我很容易的就配置出了一个理想的外观,后来也很容易的配置出了一个linux内核开发环境,这也是我第一次正式和linux内核结缘。
正是基于这两次很好的用户体验,我毅然决定离开 Vim,转向 Emacs,就这样一直使用了 Emacs 很多年,使用体验一直很好。
但我是一个喜欢探索,喜欢尝试新鲜事物的人,所以在几年前,我就关注到一款可称之为后起之秀的编辑器 Helix。
终于在前段时间,有机会试用了一下,非常惊艳。
在安装完它之后,我只是简单配置了下,就基本达到了我使用多年的 Emacs 的样子,甚至有的地方更好一些,当然还是有一些地方不如 Emacs,但都可以忍受,都可以适应。
在大概试用了一周之后,我就决定从 Emacs 转向 Helix 了。
比如现在这篇文章,就是用 Helix 写的。
我觉得 Helix 对 Emacs 的最大优势,当然也是我最终选择 Helix 的原因,就是它的开箱即用,配置简单,没有学习成本以及记忆成本。
这些也是 Vim / Emacs 的最大短板。
你要知道我是使用过 Emacs 很多年,并且详细阅读过它的官方文档的人,但即使这样,我要配置一些东西,还是要花很多时间,查阅很多文档。
这个过程是很痛苦的,Emacs 的记忆负担太重了。
而当我体会过 Helix 的开箱即用,以及它非常简单,甚至无需记忆的配置语法之后,我仿佛是在黑暗中看见了光,这对我来说真的是一种解脱。
基于这样的情绪,Helix 存在的各种缺点,在我眼中就不算什么严重到无法接受的缺点了。
但有一个事我非常担心,就是近一段时间,Helix 的开发活跃度很低。
Helix 绝算不上是一个成熟稳定的编辑器,它还有很多事情要做,所以如此低密度的代码提交频率是不正常的,是不健康的。
好在我详细关注过它一段时间之后,发现给它提issue以及pull request的人还是挺多的,说明现在社区很热情,但核心开发者投入的时间很少。
也有可能是这些核心开发者,在潜心开发像插件系统这样的重量级功能吧,不太清楚。
总之,非常不希望它因为开发活跃度低而死掉。
最后再说一下 Vim。
Vim 这几年在用户体验上有了长足的进步,特别是 Neovim 的出现,给了 Vim 足够的危机感,这使得它更加开放,更加创新。
Neovim 的分道扬镳,虽然在某种程度上是分裂了 Vim 社区,但它也是在倒逼 Vim 更快的进步,否则就是死。
坦白来说,我觉得 Neovim 给 Vim 带来的威胁还是挺大的,不知道十年之后,Vim 还能否像现在这样欣欣向荣。
不过 Neovim 的出现,还是给 Vim 社区带来了很多关注度,很多新鲜血液的。
比如说我,就一直再想尝试下 Vim / Neovim,想看看很多年前它给我留下的刻板印象,是不是我对它的误解。
0x08 Git
聊完了编辑器,最后再来说下 Git。
其实这个没什么好说的,因为在版本控制领域,它没有竞争对手,无人能出其右。
之所以在这里提到它,是因为它是日常工作中必不可少的一个工具。
如果 Hyrland / Alacritty / Zellij 提高的是效率,那 Git 就和 NixOS 一样,带来的是安全。
0x09 最后
以上就是我分享给大家的,提升我十倍效率的超级工具。
说提升十倍效率可能有些夸张,但说它们是超级工具,却一点都不为过。
我很难想象,如果没有这些工具,我日常工作中会浪费多少时间在移动鼠标上,在排列窗口上。
这些工具集成了大量快捷键,使我双手几乎不用离开键盘,就能完成绝大部分的工作。
同时,因为有快捷键的加持,我在进入到心流状态后,思路几乎不会被打断。
整个过程行云流水,畅快自然。
这些工具是我多年来不断比较挑选、不断在实践中去伪存真后保留下来的。
就像是十年磨一剑,现在分享给有缘人。
0x0a 其他
如果有对linux及linux内核感兴趣的,可以扫描右侧二维码添加我的微信。
另外,我开设了一门 linux内核启动流程源码分析 课程,有对内核源码感兴趣的,欢迎报名。