从明天起,做一个 Rust 程序员,喂马、劈柴,周游世界。
10 年前我开始写第一行 Rust 程序,到如今全职远程做 Rust 开源项目,也许我真能去过喂马劈柴周游世界了😆。但回想自己的学习旅程,其中有各种曲折有几度放弃的时候,如果你也想学习或者提高 Rust 方面的技能,我这篇文章里有一条更容易的路。
Rust 1.0 发布已经快 10 年,所以并不是一门新编程语言了,从发展的角度来看 Rust 已经度过了生存期,并进入了迅速发展的阶段。从目前可见的业界方向来说,Rust 主要在以下几个方面取得了成功:
如果你对 Rust 的发展情况感兴趣,可以参考 2023 Annual Rust Survey Results。在内卷的 IT 市场,作为程序员选择一门小众的编程语言是避免过度竞争的方式,我之前介绍过其他人的类似经验,我们称之为 The Niche Programmer。Rust 还未成为主流编程语言,但潜力和发展空间很大,而门槛相对其他语言比较高,所以我认为从求职的角度来考虑是值得一试的。
之前提到 Google 投入更多的资金在 Rust 上面,钱进来后相关的职位就出来了 C++/Rust Interop Initiative Software Engineer Lead。
我 2014 年时践行每年学习一门新的编程语言,Rust 作为一门新的编程语言进入了我的视野。我开始使用 Rust 写些简单的个人学习项目,然后我继续做了 Rust exercises 。
后续几年我偶尔看看 Rust 相关的新闻和项目,时不时动手写点代码都会有点磕磕碰碰。直到四年前开始在 Github 上给一些 Rust 开源项目贡献,两年前开始给 Rust 编译器做贡献,一年前开始全职从事 Rust 区块链相关的工作。
从技术角度来说,Rust 非常有趣,这里面包含了近些年程序设计方面的一些良好实践。全职写 Rust 程序这一年多是我开发体验最好的阶段,当然有时候我们需要和编译器斗智斗勇、做类型体操,但很多问题在开发阶段给规避掉了。
Rust 的最大问题还是在于学习门槛相对较高,因为在 Rust 中程序员接触最多的 =
语义都变了。从我个人体验来说,在学会了 Rust 语法后会陷入一个瓶颈,如果日常工作中不使用 Rust,就没有多少机会去实践,另外不知道做一些什么项目。
我相信很多人同样如此,看了官方 tutorial 之后不知道如何下手,我想如果有一个经验丰富的老师带,会少走很多弯路,这就是我要介绍的极客时间训练营要解决的问题。
说起来我与这个训练营还有些渊源。
当极客时间在筹划这个 Rust 训练营的时候,策划人员找到过我问我是否有意愿当这个课程的讲师。我还稍微犹豫了一下,因为我之前也想过如何在 Rust 领域做更多的分享,我很羡慕优秀的技术分享者比如 Jon Gjengset能够非常自如地通过视频分享 Rust 方面的技术。当老师当然是个机会能从沟通和表达方面提高这方面的能力。
后来考虑到自己时间方面安排不过来,我有全职工作、有业余的 Rust 社区工作、还有三个小孩,所以我应该真没时间去录制课程了,而且他们已经找到了我认为最合适的讲师:
我看了这个项目的大纲,陈天老师希望可以教大家怎么用 Rust 比较简单的语法和技巧,来完成 80% 的日常工作,主要是通过各种实践项目来学习,这也是我最推崇的 Learn by doing 的方式。
有很多主题我都没怎么接触过,比如构建一个 ChatGPT 的应用、比如跨平台 GUI 之类的,所以我对这个课程很感兴趣,然后我和策划说能不能做这个项目的助教,后来沟通下来发现当助教也需要不少时间的,所以就没机会参与到具体的教学里面了。
总之,这个项目对于想学习 Rust 或者已经有一定 Rust 经验,但想获得更多实践经历的人是非常合适的。在和极客时间的相关人员沟通的过程中,我发现他们做事情很用心,这个训练营的课程质量我认为是有保证的。
这个训练营一共是 15 周的课程安排,其中每周都会有明确的项目安排,课后还有助教答疑。关于训练营的更多信息请参考:极客时间训练营-Rust 训练营
我最早知道陈天是他写的公众号《程序人生》,他是那种技术和文笔都非常棒的程序员,非常难得。我还看过他的 B 站上的技术讲解视频,他的演讲和分享都很流畅。陈天是极客时间《陈天 · Rust 编程第一课》专栏作者,已有 2.3w 人学过,广受好评。技术能力、演讲表达、对技术的热情这些都是讲师最重要的素质要求,所以陈天是这个训练营最好的讲师人选。
再分享一个小故事,我一年多前跳槽的时候还有些犹豫,因为自己的职业规划方面有些困惑,所以想找些人聊聊。当时我突然想到陈天之前从事过区块链方面的创业,后来从里面退出来了,所以我就想向他咨询一下。我没有他的联系方式,但灵机一动我想到了从 Git 的提交记录里面找 Email,然后抱着试一试的想法给他发了个邮件说明了自己的情况和困惑。没想到他很快给我回复了,并很详细地告诉我他对于区块链的想法,还有如何判断自己是否适合一个公司,通过各种途径了解公司的相关产品来作为决策的依据等等。
我作为一个陌生人,陈天老师都会乐于给与指导和帮助,可见为人真的很好。还没能有幸和陈天老师现实中有所交流,我本来想用当助教的机会和陈天老师多学习,但时间方面安排不过来了。希望大家能在老师的的训练营学到知识、经验、还有探索技术的乐趣!
]]>mooz/percol 这个工具是典型的 Unix 风格工具,它唯一做的事情就是通过管道接收输入,提供一个模糊搜索和 UI,用户选择后再把结果返回给后面的管道继续执行。
比如我这个 gt
的 alias 是我日常使用非常多的一个命令,做的事情就是 check out 一个 git 分支,因为我的本地通常有很多的分支,所以使用这个命令来模糊查找,然后选中就非常方便了:
alias gt="git branch| percol | awk '{ print \$1 }' | xargs git checkout "
类似的下面这个命令是 kill 掉某个进程,我们可以通过模糊搜索来找进程:
alias pk="ps eaux | percol | awk '{ print \$2 }' | xargs kill -9 "
如果你仔细总结,日常开发任何需要选择的地方都可以使用这个小工具来达到更高的效率,比如我工作的目录下有很多测试文件,测试其中一个文件的命令是 just ts file-path
,我需要找到其中一个来测试:
find ./tests/ui/ -name \*.rs | percol | xargs just ts
percol
可以嵌入到很多配置里面,比如在 tmux.conf
里面加入这个配置,这样可以模糊查找 tmux 的 session 和 window:
bind B split-window "tmux lsw | percol --initial-index $(tmux lsw | awk '/active.$/ {print NR-1}') | cut -d':' -f 1 | tr -d '\n' | xargs -0 tmux select-window -t"bind b split-window "tmux ls | percol --initial-index $(tmux ls | awk \"/^$(tmux display-message -p '#{session_name}'):/ {print NR-1}\") | cut -d':' -f 1 | tr -d '\n' | xargs -0 tmux switch-client -t"
atuinsh 是一个记录 shell 历史的小工具,不同于普通的记录 shell history 的工具,atuin 会把数据记录在一个 SQLite 的数据库文件中,这样可以支持更丰富的查询功能。
另外 atuin 也支持不同机器之间的同步,当然这需要加密通信。我目前还没使用这种场景,只是把 Ctrl-R
绑定到了 atuin。
atuin 也是一个 Rust 实现的工具。
tmux 我之前听很多人推荐过,但是我一直没怎么尝试,直到某天我需要通过网页打开跳板机登录到服务器上,网络不稳定的情况下我经常需要重新登录,这时候我尝试了一下 tmux 发现真是太好用了。
tmux 的教程很多,比如 Tmux 使用教程 - 阮一峰的网络日志。我的 tmux.conf
配置很简单:
set -g @plugin 'tmux-plugins/tpm'set -g @plugin 'tmux-plugins/tmux-sensible'set -g @plugin 'tmux-plugins/tmux-resurrect'set -g @plugin 'tmux-plugins/tmux-continuum'unbind-key C-bset-option -g prefix C-Spacebind-key C-Space send-prefixset-option -s set-titles onset-option -g set-titles-string "#W/#T"run '~/.tmux/plugins/tpm/tpm'
安装 tmux-resurrect
和 tmux-continuum
,这样即使我重启了机器,打开 tmux 后我的 session 仍然和之前一样。
最近也有个 Rust 写的 zellij,但我认为这种软件使用更老的会更方便,比如公司的远程服务器必然有 tmux,但不一定有 zellij。
casey/just: 🤖 Just a command runner 是我喜欢的另外一个 Rust 写的工具,我的日常工作中严重依赖这个工具,比如我的 rustc-dev 项目中配置渐渐积累了这么多的配置:rustc-justfile
just
有些像 Makefile,但使用起来又比 Makefile 的语法简单和直观,我通常是来把一些常用的命令写入 justfile,然后留下经常需要调整的参数,比如:
err FILE N: rustup toolchain link dev2 ./build/aarch64-apple-darwin/stage1/ RUSTC_ICE=/tmp rustc +dev2 {{FILE}} -Z treat-err-as-bug={{N}}
这样我执行 just err tests/ui/consts/const-eval/infinite_loop.rs 1
的时候就相当于执行配置的一系列命令。
另外我也会把一些频繁需要修改的参数放到最后一个位置,比如本来我需要执行:
CKB_TEST_ARGS={{SPEC}} make integration
在 justfile 里面配置:
test-one SPEC: CKB_TEST_ARGS={{SPEC}} make integration
执行 just test-one SPEC
来测试不同的用例就会方便点。
你有什么喜欢的 Shell 工具,希望也能分享给我。
]]>这几年因为我在外企和开源上的工作经历,接触了很多来自各个国家的程序员,今天想写写我发现的一些国内外程序员间的差异,我相信经常混迹开源社区的人会有些类似感受。
这点是我感受最深的,我自认为已经算是一个对细节比较在乎的人了,但我接触到一些国外的程序员,他们对细节的把握让人佩服。
最近的一个例子是我在写这篇英文文档 的时候遇到的,其中的 Reviewer jordanmack 对我文档里面的所有内容逐字逐句都过了一遍,发现不懂的地方一定要弄明白。这里面有的是中英文表达差异造成的理解偏差,也有他对这个功能的逻辑上的质疑,甚至可以细节到我在文中给出的 json 例子里的数字范围和自洽性。我们在 Github 上来回讨论了很久,然后继续在 Discord 上讨论,而在这个过程中我也确实发现了些代码上需要调整的地方,最后他给我的文章几乎全部润色了一遍。
jordanmack 不算是全职的程序员,但他也有一些程序员背景。在我做开源的经历中,PR 中被挑细节的时候太多了,一度我已经不再认为自己是个对细节很把握的人了。后来我总结了一下,有时候我是在赶时间,觉得某些 corner case 就暂且跳过吧,但大多会在代码 Review 中被提出来的。
然后经历多了也就看淡了,不光是我,任何人的 PR 都可能引发大量的讨论,比如到底是使用 µs 还是 us。也许在很多人看来这是个小问题,但却引起了大量的讨论,细看其中还有些引经据典和长篇大论。随便挑一个 RFC,也都可以看到大量的讨论。
所以我的感受是,国外程序员中在意细节的比例更大。那么问题是,他们为什么能看这么细?固然其中一个很重要的原因是他们确实有时间,才能静下心来看和写。
在国内公司我也碰到过对细节的把握,但很多用在了我最讨厌的形式主义上。在微软的时候,我见过各种不够漂亮的 PPT,有的时候翻来一段 onenote 就开始讲,因为都没人关注这些。
文字表达能力是开源社区里一个非常重要的,因为但凡一个大的改动都需要和其他人广泛讨论和协作。
不少国外的程序员有文字表达的习惯,就是即使看很小的一点问题也会通过文字表达出来。这是很多国内程序员所没有的习惯,因为我们大多比较含蓄,认为多做比说强,说多容易错,说多容易暴露自己。
可能和教育和网络环境也有一定关系,如果不是刻意维持文字表达的习惯,很多人高中毕业后就没有写过几篇长文,对很多事情也没有自己的看法。
另外他们习惯使用 Email 来沟通,但中国开发人员大多习惯使用 IM 沟通。这两者还是有区别的,IM 沟通会让人不自觉地回复得更快,有的模糊想法随口就就表达了。而 Email 沟通更容易让人把事情写清楚,也更容易写得更长和有条理。
这种细微的差异长久了之后就可看出中英文技术社区的巨大差别。另外,中文网络的环境中戾气更重一些,人们对自我推销很反感,容易揣测你的意图。
很多欧美大公司里有不少只做 Individual Contributor 而不做管理的人,在这些公司里,管理和技术是两条并行线,薪资和职级挂钩,也就是说纯 IC 的岗位可能收入比管理岗位更高,因为职级更高。
管理人员和技术人员大多是上下级关系,但下属对管理人员没有绝对的单向服从关系。当然大多数情况下,管理更容易升职上去,因为纯做技术岗位不容易通过杆杠来放大自己,管理就是一种很有效的杠杆。但这种纯粹的并行晋级路线是非常重要的,可以让技术人员有更多的选择权,甚至如果对自己的管理者不满意直接给差评和换组就是了。
所以在国外程序员中,如果一个人做了多年开发,很可能就是他确实喜欢做技术和更擅长做技术。而中国职场中,管理和技术岗的差别太大了,或者说绝大部分人到了一定年龄,如果你不混个管理的 title,好像就已经落后了,甚至没有职场安全感。
另外有些人是喜欢混到管理岗之后,纯粹为了获取更高的薪水,或者是为了把不喜欢做的事情推给别人。当然,这其中也有很大一部分中国文化里的官本位的影响,还有一部分原因是太看中钱了。
我接触过一些年龄在 40 岁多的国外程序员,他们还是对技术有很大热情。如果喜欢做技术,而又能通过做技术挣钱,这没有什么失败的,这与年龄没关系,反而这是一种很好的度过自己短暂一生的方式。
只是在国内要做到这点并不容易,很多岗位做的事情本来就不够有深度,时间更久也无法积累起来足够的壁垒,业务上的开发年轻人上手很快,而需要深入做下去的岗位不够,所以年龄大了就容易失业。
国外程序员的业余时间真是非常多,如果你经常混 Github 就会发现,每当到了 12 月份就很多出来很多 aoc 字样的项目,这是他们在做Advent of Code 2023。
Advent of Code 就是整个 12 月份每天出一道题目,都是些编程谜题,有点类似 leetcode,但题目描述更长。你可以用任何语言来实现,反正要的结果就是答案。可以发现这些 aoc 项目基本都是欧美的程序员在做,因为他们大多在 12 月份有几乎一个月的假期,我在微软工作的时候,很多人也是 12 月份开始基本不见人影。
创造性的前提是不用为生存问题发愁,欧洲那些搞哲学、做研究的,大多都是家底丰厚,闲得多了自然就能搞事。如果有大把的业余时间,用来发展工作外的开源项目可就太好了。其实很多著名的开源项目只有吃饱饭没事做的时候才能搞出来,我之前在知乎问题 为什么中国程序员不如外国程序员有创造性 中写到:
荷兰人蟒蛇大叔想着哇塞圣诞假期这么长,找点事做,结果出了 Python。
日本人松本行弘,经济危机时闲得发慌,搞出了 Ruby。
芬兰人李纳斯,大三不用为了找工作背八股和考研,冬眠似地宅家里写代码,搞出了 Linux。
在 Rust 社区中的贡献人员里,除了美国,第二多的是欧洲,他们也不是为了挣钱,完全就是感兴趣做做而已,我看到好几个大学年轻人做的事情已经非常深入了,当然其中花费的时间也是很多,他们几乎一直在线。
这些总结比较粗略,另外也可能有幸存者偏差因素。这个话题很大,深入下去探讨会包含很多方面。
我也不是在抱怨,年龄大了之后发现多看看历史相关的书还挺好,让自己更容易理解所处的环境为什么是这样的,比如《中国国民性演变史》这本书值得推荐。另外《美国种族简史》这本书也值得一看,多了解了解其他人的特点和长处,努力让自己不要局限于国界,另外做到程序员中的 80% 以上水平,保持英文能力。
]]>Copilot 价格是每个月 10 美金,但我至今还没付费过,感谢微软支持开源,从测试阶段就邀请我试用,到现在还一直在免费使用。Github 应该有些政策,比如如果你持续给一些 star 数比较多的开源项目做贡献,就可以免费使用 Copilot:
我会给出日常碰到过的一些具体的实际案例截图,以方便你更直观地感受到这个工具准确度。
我们在编程过程中经常会碰到一些命令的参数记不太清楚,这种问题很适合问 Copilot。这比自己去 Google 的感受好很多,因为他几乎能完全理解用户说的自然语言,而且给出的答案简介明了:
比 Google 更好的地方在于上下文的交谈,比如我继续基于上面的问题说我的想法,他就能继续给出反馈,比如我说大概有个类似 --exact
的参数,Copilot 会继续给出使用案例。
Copilot 非常善于回答对这种 manual 类的问题,因为这是有标准答案的,并且我作为用户对这些是有判断的,只是我们细节上记不清楚了。
还有一次我发现跑测试的时候挂了,分析下来是这个命令行失败了(但既然 CI 是过的,所以必然只是在 MacOs 下失败了):
diff -u --strip-trailing-cr -r -q A_file.txt A_file.txt
这是在 diff 同一个文件,所以必然应该返回 0,但在 MacOS 下这个命令会报错:
✗ diff -u --strip-trailing-cr -r -q ./x.py ./x.pyerror: conflicting output format options.blah blah 一大堆错误 blah blah 一大堆错误
我知道这里面肯定是有参数冲突了,但我具体不知道是哪两个冲突了,所以这时候我问 Copilot:
可以看到这个解释非常清楚,并且帮我找到了问题的根源,所以我就能很快地发 PR 修复这个问题,并且我 PR 里的描述基本都是从 Copilot 里来的:
Fix diff option conflict in UI test #109036
我们在写代码的时候,经常会出现固定的 Pattern,不同的语言对固定的 Pattern 有一些相对固定的代码样式。我很喜欢找 Example 类的代码,然后在这个基础上再思考或者修改:
对这种情况我们需要给 Copilot 足够的信息,他给出的 Rust 代码通常是可直接编译通过的,但当然这些示例代码需要进行仔细的修改,但这也比我自己翻 Doc 会快很多。
VSCode 上的 Copliot 更新很快,肉眼可见地体验越来越好,现在我们可以选择一段代码,然后就选择的代码来进行提问。
有时候我会选中一个函数,然后问这段函数能不能重构得更简单一些,或者我们能不能用其他方式实现。
今天让我有欲望写下这篇分享的文章是因为这个问题:
Missing request extension: Extension of type
这是一个有非常明确的报错的繁琐 issue,应该就是 Server 端限制了 HTTP 的请求类型,客户端通过 curl 发 GET 请求的时候报错了,只是这个报错信息看起来很不友好,而且和老版本行为不同。所以我就选中代码中对应的函数,然后问这里为什么会有这个错:
其实我对 Copilot 解决这个问题不怎么报有信心,只是好奇先试了试,没想到 Copilot 真的能理解我的代码,并且指出了问题所在。注意看它加的注释就是我代码中缺少的逻辑 (之前的代码只是在 enable_websocket
的条件下才加载了 stream_config 这个 Extension):
加上它建议的代码之后,那个错误信息没了,但是现在发 GET 请求是另外一个问题:
Connection header did not include 'upgrade'
这看起来是服务端期望客户使用 Websocket,但是客户端只是在通过 Curl 发一个 GET 请求,并没有按照这个期望来。所以我继续问 Copilot:
他给的回复里的代码并没有直接修复问题,但里面的you can separate the handlers for POST and GET requests
提示了我应该尝试对 HTTP endpoint 和 Websocket endpoint 的 handler 进行分开,所以我一下想到了修复方案:
如今使用 Copilot 已经成为我的一个编程习惯,就如同之前我严重依赖 Google 一样,但这个工具明显比搜索引擎高级了一个维度,当然现在我还是依赖搜索,但使用比率明显下降了不少,搜索引擎更像是成了一个书签的角色了。
我之前认为 Copliot 这种工具甚至是这辈程序员所不能体验到的东西,在我第一次尝试到 ChatGPT 居然可以理解一个函数,并且找出函数中的问题时,就感觉新的编程时代来临了。
前段时间 Redis 的创始人在文章 LLMs and Programming in the first days of 2024 中写到:
随着时间的推移,我们见证了框架、编程语言、各种库的大量涌现。这种复杂性通常是不必要的,甚至无法自圆其说,但事实就是如此。在这样的情况下,一个无所不知的“白痴”成了宝贵的助手。
这是一个事实:现今的编程大多是在微调同样的内容,只是形式略有变化。这种工作并不需要太高的推理能力。
Copilot 已经可以在一些具体的编码问题上给到我们很多帮助,甚至你把这个当作一个包含万物的文档查询工具都非常有效。
当然没有银弹,Copilot 并不能解决编程中的所有问题,比如理解大规模的程序,通过深入分析去找出 bug,或者做设计问题中的各种折中和取舍,这些都是不能取代人类的,这也是我认为编程中的乐趣还没有完全消失。
我会把繁琐和细节的问题抛给 Copilot,然后更开心地做重要和有趣的部分。
]]>生活上最大的变化是我又有了一个儿子,所以我现在是三个孩子的父亲了。
同龄人中几乎没有生三胎的,有些人问我为什么这么想不开,自己找罪受。我只能说是命运的馈赠吧,我从小生活在一个大家庭里,加上我和老婆都算是喜欢小孩的人,三胎顺其自然地接受了,这个孩子也促使了我们更早地离开了苏州。
孩子 8 月底出生,前两个月请到了一个靠谱的月嫂,所以生活方面还不算痛苦。最近女儿生病才开始感受到三个孩子带来的巨大挑战,看来我们是低估了其难度。
我的大女儿开始在深圳上一年级,没想到现在的一年级都这么卷,基本上每天都有语数外作业,一个月一次的考试。我们力不从心已经放弃了一些家庭作业,比如数学之类的无聊作业我们就不怎么做,我认为每个小孩的大脑发育有自己的节奏,小学数学这种东西到了年龄自己会懂,小学阶段重要的是培养学习习惯和兴趣,强压给孩子只会让她产生对数学的恐惧。陪小孩做作业真是一件极其需要耐心的事情,我现在还在努力尝试从孩子的角度考虑问题。
三个孩子带来的另外一件事情就是冲突,大女儿心情好的时候会带着小的玩,心情不好的时候就会和妹妹争东西。如何在这些孩子中平衡,在吵闹中克服情绪去解决问题,这些都是在磨炼心性。
纪伯伦在《论孩子》中写到:你的孩子,其实不是你的孩子,他们藉助你来到这个世界,却非因你而来,他们属于你做梦也无法达到的明天。
有孩子之前我觉得养育孩子重要的是把他们当朋友,但真的等孩子三岁后有了更多自主意识之后,作为父母就会面临更多困难,什么时候该管教孩子,什么时候该放任他们。有时候我也忍不住发火,而后又觉得自己是个失败的父亲,心里多默念『还只是个孩子』几遍,如何做一个好父亲这必然是我今后一直需要学习的。
生活中的另一个变化是今年身体状态更好了,可能是因为深圳的暖和天气更适合我,加上在家办公出去本职工作外,没感受到什么职场上的琐事和压力,另外在家里办公相关的设备更适合自己,所以整体身体上没有大的问题。
但从心理方面,我能感受到和以前的更大差别,主要是彻底接受了中年这个年龄阶段。这是一点点积累起来的,那些曾经我看着长大的晚辈们都到了谈婚论嫁的年龄,或者偶然想起一些人和事心里一算已经是十多二十年前了,或是我发现自己某些方面更像印象中的父亲了。
我的生活看起来极其单调,不是坐在屏幕前写程序就是在带娃和遛娃,和梦想与激情这些词汇毫不沾边。但我满足并感恩目前的状态,我几乎没有焦虑,物欲低所以也不觉得缺钱,做着自己喜欢的工作和事情,有足够多的时间陪家人,这就很好了。
2023 我全职远程做开源项目,很幸运在 Cryptape 这大半年里工作感受非常好,这大概是我工作这么多年来写程序最开心的一段时间。因为远程办公,今年我的人际圈子似乎更小了,日常微信沟通的都是些认识了 10 来年的朋友。
我的工作主要是做区块链 Layer 1 相关的事情,入职以后做的事情是交易池这块,后来又涉及到一些 RPC 相关的工作,还有些 Infra 类的工作。区块链这行涉及范围太多了,有网络、性能、分布式、密码学等各种,所以对于纯喜欢技术的人来说,这里面挑战太多,比 CRUD 之类的项目好玩得多。
我做的主要工作都是集中在 nervosnetwork/ckb这个项目,这里可以看到我做的一些 Pull requests。
另外现在日常工作中纯用 Rust,编程体验和之前完全不是一个层次,除了如何实现功能,我们也会在乎项目的长期可维护性和优雅程度。区块链 Layer 1 也算是一个复杂度高和对准确度要求很高的项目,Rust 是很适合的。我虽然这两年一直在写 Rust 代码和做开源,但之前还真没有用 Rust 在实际工作中,特别是异步这块我之前甚少涉及。同事中有对 Rust 理解很深入的人,沟通也很顺畅,所以我特别喜欢这个工作氛围。
在工作过程中我看了更多 Bitcoin 相关的代码,越发觉得这真是一个伟大的发明,这像是个黑客用技术发起的社会性实验,在 beta 阶段就能如此深刻地影响了世界。关于 Bitcoin 推荐看这一系列文章 比特币的过去、现在和未来。
今年继续在为 Rust compiler 做贡献,能回想到的一些事情是:
因为在 Cryptape 的工作涉及到其他一些 Rust 项目,所以参与到了一些,比如我们在改造交易池的过程中用到了 multi_index_map
这个数据结构,顺带完善了一些不足 Non-unique index support, capacity operations, performance improvement 。
作为技术人,能全职使用自己喜欢的编程语言工作是一个很大的幸运,希望能继续在 Rust 开源这条路上走得更远。
2023 看书的时间也少了很多,回顾了一下很多书没有看完,但这些书看完后值得分享:
同样在写作上的时间就更少了,总结下来居然是 13 篇博客,勉强达到月更的节奏。
写作这件事情似乎停下来之后就容易长时间停顿。带孩子太耗精力算是一个借口,但我其实很是可以把一些日常的琐碎时间利用好来做这件事情的,只是确实犯懒了。
希望借这次写年终总结的劲头,把写作这件事情捡起来。
]]>我折腾这个的主要的需求是使用私有仓库的 Git repo 来同步日记。为什么不买 Obsidian sync
,我认为 Github 更符合我的使用习惯,并且我选择使用 Obisidian 的一个原因就是我不想把笔记数据同步到其他的第三方平台上,相对来说 Github 是我更信任的基础设施,毕竟我已经使用 Github 这么多年了。
Obsidian 的安卓客户端好像没有在国内各个安卓软件市场上,你需要用过 Google play 来安装。
termux/termux-app 是一个 Andriod 上的终端模拟器,也是一个开源软件。基本上你可以把 Andriod 当作一个简化版本的 Linux 服务器来使用,Termux 高级终端安装使用配置教程 是一个很详细的介绍文章。
注意目前 termux 已经不能在 Google Play 上安装了,你需要去 Releases · termux/termux-app 下 apk 安装包来手动安装。
termux 安装好之后就可以在 Andriod 手机上跑一个 Shell,打卡进去之后运行来创建一个叫作 storage
的目录:
termux-setup-storage
接下来安装一些后面需要用到的依赖:
pkg install gitpkg install openssl
用 ssh-keygen
来生成一对公钥和私钥,把公钥配置到自己的 Github 账户上,然后 clone 你的 Obsidian vault repo:
cd storage/sharegit config --global credential.helper storegit config --global user.email "<your_email>"git config --global user.name "<The name you want on your commits>"git config --global pull.rebase true
确保能在 Termux 上正确提交改动到 Github 上。如果有一些文件是不想同步到远程的,可以加入到.git/info/exclude
里,比如把 .obsidian/workspace-mobile.json
忽略了。
打开 Obsidian 的客户端,找到刚才 Git clone 的目录,打开作为 vault 即可使用。
先安装 Termux 上的 cron 服务:
pkg install cronie termux-services
然后退出 Termux 重新打开,运行:
sv-enable crond
运行 crontab -e
来创建一个定时备份的 job:
*/2 * * * * ~/sync_repo.sh
每两分钟自动备份一次,我的 sync_repo.sh
是这样的:
#!/bin/bashcd /data/data/com.termux/files/home/storage/shared/obgit add -A && git commit -a -m "android backup: `date +'%Y-%m-%d %H-%M-%S'`"git pullgit add .git rebase --continuegit push
上面的同步脚本很粗暴,如果冲突了我会把冲突一起提交进去,但这也是合理的,因为我需要让自动同步尽量成功,至于冲突可以在笔记本上解决。如果 Termux 进程被杀了,自动备份将无法自动运行。但在我的日常使用过程中,这倒不是一个大问题。
参考:
]]>这本书记录了作者从小时候的经历、年轻时的知青生活、美国求学的回忆,算是一部回忆录。原版是用英文写作的《Out of the Gobi: My Story of China and America》,但中文版据说不是直接翻译过来,而是很多部分重新用中文写出。我猜还有一些英文版的内容如果翻译过来,那这本书就不能出版了。
知青下乡的书我看过一些,最早的时候是偶然发现家里有一本叶辛写的《蹉跎岁月》,所以就看了起来。那个年代于我这种 80 后而言很陌生,但小说中人物的某些心理特征对那时候的我来说很熟悉,比如羞涩和自卑等。这本书我后来又陆陆续续看了几遍,里面也有些爱情心理的描述,算是我看得比较投入的第一本小说,所以至今仍然印象深刻。
王小波也写过不少关于知青岁月的文章,那个年代里每个人都背负时代的枷锁,出身和成分很大程度上决定了人的命运,大部分人因为十年的浩劫失去了接受教育的机会。
有些自传和回忆类的书读起来会有点自吹自擂的感觉,而这本书里作者用了一种看似云淡风轻、带着些许幽默的口吻写成,而细节很丰富,阅读中仍会让人感到戈壁凌冽的北风,那样的生活真是太苦了。
一群年轻人被放在了戈壁滩上,总得找事情去让他们去做做,完成自我的”改造“,日常生活就是饥肠辘辘地”修理地球“。里面有不少这类事情,让人很辛苦地去做完而结果看起来没什么意义,比如部队让大家去挖土豆,结果挖出来又没开车去收,大部分又烂在了地里;比如让大家去修土壕,然后无止境地半夜做演习,结果少部分人被埋死在了土壕里。
这样折腾几次之后,大部分人都会“看破红尘”,开始随大流地磨洋工,而作者的心态是”干什么事都要干好,否则闲着也是浪费时间,而且争强好胜,虽然身体瘦弱,但不甘人后,如此而已。“
没什么英文资料可读,就反复看药品说明书里的英文单词。积极认真的工作态度,抓紧时间学习一切东西,因为这些他才能后来被推举成为工农兵大学生。一个让我印象深刻的是他处理人际关系的方法,当遭受到他人的算计时,并未过多抱怨他人,而是认识到这本就是人性中存在的恶,然后从自己的角度去尝试解决这些问题。他开始了一个广结人缘的计划,还能用一些看起来很隐蔽的方法,比如让父亲寄书过来学着当排球裁判,让更多其他连的人认识他。能站在旁观者的视角审视自己和周遭处境,并找到解决办法,这对于一个 20 岁左右的年轻人来说是非常难的。
作者在前两年的大学生推举中仍被刷下去了,大致是因为和领队的关系不够密切。这两次对作者来说是很大的打击,所以抗搓能力非常重要,即使非常难过也得在人面前保持平静:
所以说,那个时代的大学生,不是纯考试的,但能通过群体推举去上大学生,绝对是非常不简单的人。经历过那个年代的苦之后,以后什么学习上的苦都是不足挂齿了。作者上大学之后,学习和成长的速度都是惊人的,10 年间从一个戈壁知青做到了藤校的副教授级别。他到了美国之后在两三周之内就能说服校方和教授,为自己定制了一个特殊的学习路径,并在两年内拿到硕士学位:
其中的一个感人的故事,教授夫妇发现作者很想拿一个学位而且学习能力强,但是没有足够多的钱来应对学业开销,所以就谎称说有人匿名资助了他,其实就是教授夫妇自己资助了他。我猜想也许是因为作者赶上了新中国第一波留美学习的时机,不少人对他们是有好奇心态的,或者是“自助者天助之”。
还有一个小故事说明作者深谙体制里那套规则,并且做事很有智慧,他是通过基金会的一个留学考察项目去美国的,所以读硕士学位其实并不在计划内的:
后来我明白了为什么亚基会的官员们不热心,他们担心如果为我破例的话会影响基金会与外贸学院的关系。安迪表示,他要给外贸学院的领导写一封信,征求北京的意见。
我说你不能这么写,他问我为什么。我说,如果你征求北京方面的意见,他们就要研究是否批准。只有两个可能——批准或者不予批准。批准了当然好,但是如果不予批准,我怎么办?安迪问我还有更好的办法吗?我说有,你就给北京发个贺电,说我学习成绩优异,校方决定给我奖学金,只需延期一个学期,就可以获得硕士学位,对于这样的成绩,亚基会向外贸学院表示祝贺,其他的都不必说。
安迪将信将疑地接受了我的建议,草拟了一封电报,赞扬了我,把我的成绩归功于外贸学院的领导知人善任,表示祝贺。两周后,安迪打来电话,说外贸学院回电了。“怎么说?”我焦急地问。他停顿了一下,说:“只有四个字——‘非常感谢’。”我心花怒放。
正如我所料,谁能拒绝别人的道贺呢?后来,外贸学院的领导还专门给我写了一封信,对于我在美国的学习成绩表示满意,鼓励我再接再厉,早日拿到学位。
看这本书的过程中,我会想起自己最努力的初中时光。那是我第一次读寄宿,学校的物质条件也很贫乏,每次下完课去吃饭都得百米赛跑,不然自己的饭就会被瓜分掉。另一个深刻的印象是冷,热水也总是需要抢。生活虽然清苦,但那几年我开始感受到学习和思考的乐趣,上自习做到半夜也不觉得累,我当时觉得几何证明题目很有趣,第二天早上五六点又会爬起来去教室里早读。回想起来,我后来再也没那么专心和努力过了。
匮乏和苦难也许真能磨砺人,在那样的大环境下如何生存,在逆境中保持乐观、有所成长,这本书里所描写的是绝大部分人无法做到的。可以修改一下长者那句话:一个人的命运啊,当然要考虑到历史的进程,主要还是靠自我奋斗。
]]>也许是因为我践行了创造运气的方法:多做 + 多分享,所以顺便多分享一些其他想法。
三年前,我离职时不知道自己未来如何走技术路线,在国内很多职位都很卷,当时我对工作和环境都厌倦了,所以离职换了公司和城市。我在微软的岗位虽然是技术的,但做起来比较无聊,好在业余时间比较多。
闲暇能激发创造力和保持动力,很感激前公司微软包容和良好的工作环境,在苏州的两年里我有时间和精力去找自己感兴趣的事情,我重拾了写作和开源,这让我的生活变得充实,又因为些巧合开始给 Rust 编译器做贡献,从中得到了很多乐趣和收获。
没想到后来逐渐走上了 Rust 开发这条路,再回想起来过程也算是漫长的了,从 2014 年开始接触 Rust 到如今完全以写 Rust 为生,从观望学习、业余投入、全职投入这个过程快 10 年了。回想起来我对编程语言的兴趣是从看 eopl开始的,而再往前是因为 scheme,再往前是因为偶然用了 emacs,所以年纪越大越觉得这句话太对了:
You can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future.
Rust 让我开启了一个正向循环,比较容易能在一些开源项目上做出贡献,能看到开源社区里面有很多其他和我类似经历的人。
Rust 社区里另一个吸引我的地方在于有很多乐于分享的技术人,我们可以从世界上这些优秀的工程师身上学习,比如最近我喜欢看 Jon Gjengset的频道,他一期直播就有 2、3 个小时,讲解得非常细致,涉及到的主题也非常宽泛,有分布式、Rust、算法、读博和生活上的体验等等。
当然长期做开源很难,只有真的热爱才能持久,而对喜欢做技术的人来说开源是可能会上瘾的。这一年多里,给 rustc 做贡献好像已经成了我的习惯,业余时间找个 issue 试着解决就像是玩一把游戏,所以我做的事情大多并不难,而只是需要时间和耐心。国外程序员的一大优势就是有空余时间,生活负担不大,并且有足够的耐心去做周期长的事情。
这些资助算是兴趣的副产物,这次 Fellow 项目的一个好处在于可以找 mentor 来指导自己,我还在尝试找打算做的具体领域。上次 Project Grant 让我尝试了些新鲜事,比如录制播客、在 Conf 上公开演讲,这些都是代码之外的一些体验:
感觉上面的播客和演讲的内容大多差不多,打算以后会在博客里再写点技术细节相关的博文。
做得越多,越觉得自己还有好多东西需要学习,我算不上编程语言的专家,只是个业余的爱好者,希望能在接下来时间里有更大的成长。
]]>远程办公有好的方面,也有一些需要克服的困难,这篇文章我总结一下这方面的想法。
并不是所有团队都适合远程办公,因为有的岗位需要频繁交流,而面对面沟通肯定是会更高效的。就软件开发这行来说,如果公司要实施全远程办公,需要满足几个条件:
这些缺一不可,下面我稍微解释一下。什么是有效的管理,通常员工人数到了一定规模都会强调管理,然而很多公司做的是过程管理而不是结果管理,比如统计员工的加班时长,这是在衡量员工的上班过程,也许是因为没有更好的办法来衡量产出、或者是为了压榨员工,反正这就是一种管理上的失败。
远程工作本质来说就是放权,关注结果而非过程。就纯软件开发这行来说,工作结果是相对容易评价的,比如功能是否高质量地完成,方案和设计是否合理等,项目进度等等。
如果公司让员工远程办公,意味着相信员工能够自己管理好时间和进度,而公司也有合理地方式来验收结果。这要求员工有足够的自驱力,而且员工也对工作内容有足够的兴趣,如果一个人对工作内容没什么兴趣或者是排斥的,那远程的情况下就会更糟,因为人都是有惰性的。
远程最大的困难当然在于沟通,所以一个员工日常需要沟通交流的人数非常重要。通常一个小组就是日常协作的单元,15 个以内是相对可行的范围。对管理者而言可能是个更大的挑战,对 IC 来说日常沟通的人数通常是 4、5 个人以内。
另外公司的 IT 支撑很重要,如果工作中涉及到机密文件,而对应的 VPN 等工具不够完善,在家工作就会成为灾难。比如疫情开始那会儿,我的远程办公体验就非常不好,需要连入公司的网络才能访问某些文件,而且速度不稳定。微软的 IT 工具好用些,但连入生产环境和服务器之类的会非常麻烦,需要专门的另外一台笔记本来操作,用一台价值一万多的笔记本来专门连 VPN 确实很浪费,但这也可以理解,毕竟安全对于 ToB 的业务是更重要的事,只是日常带两台笔记本实在会很麻烦。秘猿的 IT 是专门为远程考虑过的,比如公司不提供办公设备,但会提供一些 IT 补助,员工可以用自己的设备来办公,代码都在 Github 上开源的,所以办公体验非常好。
异步沟通需要时间去适应,也更适合我这样的偏向于文字交流的人。在不能得到及时反馈的情况下,就需要把一个事情尽量用简单直接的文字把事情写清楚,并且需要考虑到对方可能会缺失的信息。当然,实时的文字沟通也是很重要的,适当地交流工作之外的事情,可以和线下没见过的同事培养出默契和情感。
软件开发中要达成有效的异步沟通,写好文档尤为重要。这对很多开发人员来说是一个重要的挑战,相比而言程序员更想写代码而不是文字,但文字和图都是更大范围表达自己的工具,你可以写给同事看,也可能需要写给用户看。如果无法通过文字表达清楚,意味着还没想清楚,那用代码也无法表达清楚。
所以,有的公司在面试时会看看应聘者是否有 Blog,主要也是想看这个人有没有文字表达的习惯,以及能不能把事情写明白。
就工具方面,我觉得邮件是个很好的方式,但相对来说国外开发人员更适应邮件。Slack 和 Discord 也不错,但感觉 Discord 相对来说更实时些。文档协作工具比如 Notion、Office 365、飞书等都行,我认为只要能有协同编辑就好。
除了异步沟通之外,一些在线的会议也是非常有必要的,但不宜过长,而且最好在开始之前让参与的人都了解会议的主题和相关资料,这样会更有效率。
我认为自己完全适应了远程办公的阶段就是培养出用文字记录工作的时候,我每天在 Obsidian 上都会建一个当天的文本,按时间顺序记录自己做的什么事情,或者是参与的会中的一些要点。然后通过标签做一些标注,还有把 Todo 给汇总到固定的页面。我在开会之前都会用文字记录会上要谈的要点,也会把一些零散的感受记录下来。
通常来说,一个人的有效办公时间是到不了 8 个小时的,所以在办公室里面一直耗着就是耗着,很多时候都在摸鱼耗时间,有的会议就是大家都在摸鱼。
远程办公可以更好地利用碎片时间,以我的感受来说,如果是办公室办公通常下班后我再也不怎么去思考工作上的事,因为上班和下班是有一个明显的界限的。但在远程办公模式下这个界限会很模糊,可能我这会儿在办公,一会儿下楼去取快递了,或者我需要去接孩子之类的。所以很多时候,虽然我不在屏幕前,但我也会脑海里在考虑些工作上的问题。我反而觉得这种情况下会有更多的想法冒出来,比如人在洗澡的过程中会迸发出新的想法,这是很多人都有的体验。
这也是我在做开源的过程中得到的一个体会,因为大项目的开发者会遍布各个时区,所以绝大部分时间都是异步沟通。如果我彻底理解了一个问题,我就可以离开屏幕,随后时不时地去考虑这个问题了,等有了想法再回到屏幕前继续。
当然,在和他人讨论的情况下也可能会冒出想法,但总体而言群体讨论主要是为了达成共识,而更多好的想法是个体产生的。
在家办公一个影响效率的因素是环境,调皮的孩子可能是一个工作上的干扰,但我觉得问题不大,这也需要和孩子协调好。有时候我晚上思维更清晰、效率更高,因为晚上没人打扰,自由安排的情况下我可以更多地利用高效率时间工作,所以我在远程办公的情况下效率倒更高点。
对于大公司而言,整体来说远程办公的总体效率估计还是有损耗的,这也是硅谷大公司想让员工回到办公室的一个原因。但很多人宁愿少拿一些钱也想继续远程办公,因为就个人来说可以节省很多不必要的时间成本,这对于有孩子的员工来说真是太重要了。
我看到很多人说远程办公会很孤独,我对此感受不够强烈,大概是因为日常经常和家人在一起,而且我还有两个小孩。如果没有小孩我估计也会感到孤独,即使结婚后也是容易孤独的,而和小孩相处完全是另外一种模式,我想这也是人类生小孩的一个重要原因吧。
但远程工作之后,确实会有一种脱离感,就好像没有进入社会的正常节奏。
脱离感也来自社交圈更小了,和同事之间的沟通基本发生在线上,而除此之外认识其他人的机会也少。我能想到的一个办法就是约老朋友线下见见,或者主动约一些线上认识的人聊聊,也可以线下见。总体而言,年级越大好像越容易产生孤独感,不容易深交,平时交流的人也都是些认识了十年、二十年的人,我不知道其他人是不是有类似体验。我倒是发现自己全职远程后,真的见到线下朋友会更有交谈的欲望,这大概是憋出来的。
另一个感受是,我远程工作之后倒更不容易焦虑了。细想一下大概是我抛去了办公室的一些不良因素的干扰,比如同事之间的竞争等。不是说远程没有晋升的压力,但我觉得从心理上我不是那么在乎了,而更在乎的是如何做好工作和如何提升自己,因为远程的情况下好像自己和公司更为平等的一个状态。不把自己和公司绑定,从物理上做到了就更容易从心理上达成这点。
最近确实能看到大量工作在流失,我身边失业的人越来越多,在这种情况下找远程工作只会更难,但这并不意味这没有机会。
我之前总结过一些工作,但我知道现在这个列表里很多公司都没在招人了:
remote-jobs-cn: 国内远程办公职位
这里有一个更全的、看起来还在更新的列表:
remote-jobs-in-china: 支持远程办公的中国公司
如果英语足够好,可以尝试找一些国外的远程机会,我在 Linkedin 看到还是有些的。区块链这行现在是熊市,所以工作机会也少了很多,但远程工作的比率相对大,大概是这个行业的人确实在践行分布式和无中心化,Web3 Jobs: Blockchain 这个站点上会有相关工作。
我能想到的另一个途径是,尝试找一些招人的、自己感兴趣的开源项目 (背后有商业公司运作的,可支持远程的) – 这样的项目也挺多的,然后给项目做贡献和社区的人熟悉,逐渐成为远程员工。虽然过程会比较耗时,但这确实是个途径。
远程办公还有很多其他好处,比如我现在可以把车的油耗保持在 6L 左右,因为我基本都在错峰出行,很多地方的人流量在工作日会少很多,包场看电影是很常见的。我们还可以做地理套利,比如去生活成本更小的地方生活。我看到公司有个数字游民计划,就是几个同事一起约好去一些未曾待过的城市和地方边工作边旅行,真是很羡慕这样的自由生活,可是我有两个小孩需要照顾😂。
总体而言,我已经习惯了远程办公,好像就再也回不去坐办公室的日子了,这是适合我的一种工作方式。
]]>localhost
打造得舒适一些,最近一直在断断续续升级工作相关的设备,对于整天生活在屏幕前的数字宅来说这犹如买新房和装修吧。我对设备的要求并不是很高,但年级大了多少有点职业病,所以我打算这次尽量找些好设备来满足自己,主题就是“关爱中年程序员”。
我近两年都在使用 PC 笔记本当主力开发机,最近几个月重回了 Mac 的怀抱。即使苹果生态有我之前提到过的各种问题,但 M2 芯片的 Mac 性能和续航我都很满意。不过我也花了好些时间来找称手的工具和配置。
我买的 Mac 是 32 G + 12 Core + 1 TB 的中等配置,这个配置完全满足我日常需求,大概是因为我还没什么视频剪辑类的事要做,我的主要需求是编程、写文档、浏览网页这些普通事项,一周需要带出去两三次,因为我又不玩游戏,所以 Mac 还是挺适合我的。
14 寸的 Mac 外出办公稍微有点重,如果你已经有适合外出携带的笔记本,在家里放个 Mac Mini 也是很适合的选择,因为 Mac Mini 价格太美丽了,而且接口更丰富。新款的 Mac Air 看起来也很不错,也许 M3 是个入手的好时机。
我用了两个来月才完全重新适应 Mac,下面谈谈一些配置和应用:
首先系统默认语言使用英文,这样有个好处在于很多配置都可以用字母去搜索,应用的切换也完全不用中文,减少了切换输入法的动作。
我形成了一个使用习惯,那就是严重依赖各种 App 的 Command Palette,比如 VsCode
我把 Ctrl+L
绑定到 command palette,然后 Obsidian 和 Arc 也同样有 Command bar。使用 Command Palette 通过模糊搜索去跑命令是更统一的方式,因为快捷键太多了我根本记不住,而命令是一个个普通的英语单词,容易在心里念出来。
另外我会关闭所桌面和应用切换动画,这样操作起来会迅速很多。
Mac 的应用切换简直惨不忍睹,而且这些年来都没有很好的改进。市面上有不少这类工具,足以看出很多人不适应系统原生的应用切换。特别是像我一样会用 VsCode 为不同的项目打开多个窗口,快速定位到窗口对我来说是一大刚需。
Contexts 这个应用是我想象中工具,完全贴合我的使用习惯和对细节的要求。安装后 Cmd + Tab
就替换了系统原有的应用切换,这是符合大多数人使用习惯的 Windows 风格的切换,另外我会把一个很重要的快捷键 Ctrl+I
绑定到 Contexts 里面的 search,这样我能快速通过部分关键词选中要跳转的应用。还有,Contexts 很贴心地有个自动学习用户使用习惯的 Number-Switcher
,基本上我日常 右Cmd+W
跳转到 Wechat,右Cmd+D
跳转到 Discord 等等,真是提高效率的利器。
另外很多人推荐 Raycast
,这款软件可以做很多自动化的功能,但目前我只是用 Raycast
来查找和启动应用。
我使用 Arc 接近三个月了,目前已经成为了我的默认浏览器。我认为最有用的是 command bar
,可以输入 command,extension command,tab url,我把 Ctrl + L
配置到 command bar
,这样我基本不会去关注 tabs 了,也不会去收藏网页,一切都是用关键词搜索。
其中的 Space
功能我也很喜欢,比如公司用 Gmail,而自己也用私人 Gmail 账户,Space
就可以把不同场景的同样网站区分开来。
Chrome 的所有 Extension 在 Arc 上都可以使用,而且我也不会再为插件配置快捷键,常用的命令通过 command bar
触发。
Easel
是 Arc 的另外一个好用功能,我们可以很直观地通过类似截图的动作就能组合成一个 Dashboard,比如我把邮件、Github PR、Meeting Schedule 组合成一个看板,能够一目了然地看到需要关注的信息。
这个工具用来设置一些应用的默认输入法,为什么这个很重要呢?因为我特别烦切换输入法,这是一个很干扰心流的动作。
比如在 Terminal、Raycast、Contexts、VSCode 这些应用里面,95% 以上的概率我都只会用英文输入,所以配置这些应用的默认输入法就能很大程度上减少切换。
这类工具有好几个,我用得最舒服的就是 Input Source Pro,这个工具还在 Beta 阶段,目前免费。
这是修改快捷键必备工具,我做了一些方向键的配置,另外配置 Ctrl
的键,因为这比 Cmd
好按:
- Change left_command+hjkl to arrow keys- Change left_command+u/i to page_up/page_down- Ctrl+Z => Cmd+Z (Undo)- Ctrl+T => Cmd+T (New tab)- Ctrl+W => Cmd+W (Close)- Ctrl+S => Cmd+S (Save)
不管是 PC 还是 Mac,我必须做的配置是把 Caps Lock
映射为 Ctrl
,因为我们很少使用 Caps Lock
,而这个键位是非常适合小拇指去按的,如果你是键盘党,这样配置可以很大程度减少左小拇指的损伤。
大半年前我改变自己的使用习惯,强制自己使用双拼输入,目前我已经完全适应,总体而言我认为双拼没有极大地提高我的输入效率,但确实减少了很多不必要的按键,另外我觉得敲字的节奏感会好些。
我之前看到很多人吹小狼毫,但几次打开那些文档我都没有折腾的欲望,大概是我对输入法也没有特殊的需求,系统默认或者搜狗之类的都行。
两个月前偶然在 Twitter 上看到一个人推荐 Rime 雾凇拼音,这次我试了试。虽最后还是花了点时间折腾,但我觉得这个投入是值得的。Rime 的输入体验是好过 Mac 原生的输入法,没有任何多余、花哨的功能,你不输入时不会感觉到它的存在,并且支持我喜欢的小鹤双拼。但这东西就是注定比较小众,配置个输入法需要用到很多 Yaml 文件估计会劝退很多人。
我另一个比较特别的配置是,不像大多数人那样通过按 Shift
来进行中英文切换,因为 Shift
是一个常用键,容易误切换输入法,另外一个原因是我希望有一个唯一的标识来识别目前的中英文状态,而 ShowEdge 就是这样一个工具,我在屏幕特定的边沿会配置一个小圆圈,如果是红色便是中文,如果是黑色便是英文。这样不会存在我开着 Rime 输入法,但是输入的是英文的情况。我使用 Ctrl+J
或者 Caps Lock
来切换输入法,因为 J
是右手最容易默认找到的按键。
我以前也主要看重键盘的外貌和敲打手感,所以我买了个 HHKB,后来也买了宁芝等各种小尺寸的键盘。最近两年我越发觉得肩胛骨酸疼,特别是右肩胛骨,有时候晚上疼得我睡不好。
我稍微调查了一翻,感觉确实是因为自己长期的坐姿和使用键盘的习惯造成的。Mac 的键盘和各种小尺寸键盘,因为宽度不够,两个手都要往中间靠,这样肩胛骨就长期保持这个姿势容易出问题:
人体工程学这东西有的人说是智商税,但我还是试试吧,于是我购买了套罗技的人体工程学鼠标键盘。
这个罗技 K860 尺寸巨大,其固定的手托材质舒适,这键盘需要大概一周左右的时间去完全适应,毕竟很多人的指法也是不对的,这种双手分离式键盘需要大致正确的敲打指法。
唯一的缺点是数字小键盘,毕竟我们大部分人是不用数字小键盘的,这有点浪费空间。刚用的时候我觉得很难受,我需要伸长手去摸我的鼠标,所以很想退货。但巧的是我买的是个套装,里面还有个轨迹球鼠标。当我把这两个设备这样组合起来时,小键盘的问题解决了:
使用轨迹球也是个神奇的体验,刚开始觉得操作起来太慢,适应了之后觉得右手轻松不少,反正只需要移动大拇指就行。同时鼠标也可以使用键盘的手垫,而且如果移动键盘鼠标也可以跟着移动了,配合 left_command+hjkl to arrow keys
方向键那里我也不会去按的。
很多程序员不喜欢用鼠标,但我最近发现鼠标的前进和后退键其实非常有用,比如我看代码的时候,按住 cmd 键点击鼠标可以跳转到定义,然后按鼠标的后退键返回之前的位置,这比一直使用键盘会舒服很多。
Mac 的 Trackpad 手感和体验都是很好的,但因为 Trackpad 也是居中的,和小尺寸键盘同样用久了同样容易劳损
如果你用外接鼠标,还需要另一个小 App 来配置一下。因为我们通常适应了 Mac 默认的 Natural scrolling,但是鼠标用这个选项就会很诡异,所以我找到了 Scroll reverser
这个工具,可以单独设置滚动的控制方向:
我对这套设备非常满意,肩胛骨酸疼这个问题很大程度上得到了缓解。现在我偶尔外出使用原始的 Macbook 键盘和 Trackpad 时,我会极其难受,很难想象自己使用这个姿势这么多年,不出问题才怪。
但这临时的缓解也可能是只是因为换了姿势,彻底解决长期的问题,大概只能尽量少坐多运动,不要长期保持同样的姿势太久。
我之前的椅子扶手快坏了,然后想着买个新的办公椅。按照这次升级的主题,直接选择了购买 Herman Miller 这把号称世界上最舒服的椅子。
我之前偶尔试过同事的这款椅子,确实很舒服,但我自己买的刚开始坐上去觉得有些偏硬,后来找了些视频资料发现是我的坐姿有点问题,这椅子适合正坐而不是半葛优躺那种坐姿,用了几周后确实能感受到差异了。二代的前倾功能很适合专注的时候使用,而这个功能在目前的椅子上相对少见。
由奢入俭难,再也回不去了,如果这把椅子帮我纠正了坐姿也算是值了:
这期间我还新增了些其他设备,比如 4k 显示器、支架等等,加上多年前买的升降桌等就完全够用了。我推荐的另一个小设备是韶音的骨传导耳机,我经常带这个耳机半天一天的都不觉得难受,而且这个品牌的质量和售后我非常满意。
最近我还看了看桌面的布线之类的东西,毕竟作为数字宅男是无法拒绝一个类似这样的桌面美学:
什么东西但凡涉及到美学就会是个无底洞,然后我开始怀疑自己是不是要掉进另外一个坑,需要及时止住了,所以我买了个隐藏电线的盒子把桌面搞干净点就够了。
总之,我对现在这套办公设备非常满意,程序员要对自己的身体好一点,毕竟这些东西差不多占据了日常的大部分时间,所以值得投入些时间和金钱在上面。
如果你有什么好用的设备请推荐给我,虽然我现在也不一定会买,但我喜欢种草 😜
]]>