我现在的情况是,技术栈稀碎,并且大部分基础技术掌握不牢。我的技术阅历现在远超我的技术功底,导致我能设计和构思出可能还不错的应用,但是我没办法去实现它。LLM 的出现很大程度上弥补了我的缺憾,但还是不够,LLM 毕竟无法真正替代人类去进行开发。

这种阅历的过剩同时对我技术的学习造成了阻碍,我倾向于把所有的进程间交互的发生都理解成简单的 JSON/YAML 或者其他什么标记语言的组合,同时我倾向于过早优化——因为我知道这个地方之后一定要重构,再一个恶劣的方面是我倾向于不使用硬编码去完成程序原型,这使得我会花费大量的时间让软件去获取外部的配置项,我没有大型项目经验的缺点就暴露出来——我无法控制我的「阅历」来对我的工作指手画脚。这是一个恶性循环。

编程语言的困境稍微要更严重一点,我现在会一点 Golang,Golang 是我唯一掌握的一门能够进行现代式的「垒砌」的编程语言。像这样的编程语言还有很多,比如 Java、Python、Ruby、C#、Lua、Rust、JavaScript。它们集成了很棒的项目管理工具和依赖管理工具,进而能够以更轻松处理项目中遇到的依赖问题,最重要的是——它们能更轻易地引入依赖,调用包。之于第三方包而言,这些语言几乎有更可靠、易懂的语言设施,这比 C++ 好多了。

但是我的 Golang 也不精,并且 Golang 和我未来的发展方向究竟耦合多少呢?我不知道。我可能又要学一门新语言,然而学一门新语言真的能解决问题吗?我也不知道。

我现在的技术栈破碎不堪,我无法独立完成一个前端或者后端的应用,更遑论一些跨越技术栈更多的东西了。我缺乏创意,同时极度依赖参考文档。如果脱离了我的笔记软件和浏览器,那我甚至无法完成一个最简单的 wrapper 式的应用。这太糟糕了。

我于是需要列出一部分我需要做的事情了。人生的技术发展同样需要一个 Roadmap。

目标

先说目标。我的目标有两条,第一是成为某个领域的专家,这个领域最好是某种不可替代的经典应用,比如浏览器、操作系统、数据库内核、编译器,也可以是某种有源源不绝趋势的新兴场景,比如云计算。我至少要会点什么罢。我需要一个能吃饭的家伙什,所以我需要在某个领域里具有竞争力。

再呢?我很喜欢学习和掌握新技术的感觉,所以我还希望成为多种技术的多面手。我最好什么都「摸一下」,什么都接触一下,这样有利于让我的阅历进一步增长。技术视野是重要的,无论我打算精于哪个领域,技术视野都能帮助我很好地理解这个领域的技术运作的模式,以及其与其他技术栈/技术场景集成的模式。无论我学了什么,我记住这种经历的感觉,记住其中的理念。具体的技术细节都可以忘掉。这或许也会成为我业余生活中可贵的「休憩」。

为了精通,我该做点什么?

我现在掌握的技术栈有哪些呢?我会写点 Golang,还会写点 C/C++,我还是一个 Linux 用户,不过对内核知之甚少。除此以外我掌握的技能便不值一提了,都是一些标记语言之类的「边角料」。我需要规划一下我要去掌握的东西。

我觉得 C 和 C++ 的精进是高风险中回报的,尤其是考虑到我的精力可能无法支撑我现阶段在对其求索的道路上走太远的情况下,精进 C 和 C++ 对我而言就不是一个聪明的选择了。那么就学 Golang 罢,它足够简单,「80% 原则」足以解决我遇到的大部分技术场景里可能产生的问题。Golang 适合写后端,那么我还需要一门前端语言,JavaScript 不错,我应该去学一下 TypeScript(JS 的超集)。TS 也很适合作本地应用的开发。

完成上面两样事情是我在技术领域的当务之急。我需要对编程语言的技术栈足够精,这样我才好支撑我的想法。我并不是意识不到编程语言之外其他技术栈的重要性,但是那些东西对我而言并不需要太多精力,除了人工智能。我对 AI 实在没有什么「灵感」,我学习 AI 相关技术栈的效率是很低的。所以 AI 也必须加入某种程度的考虑来。那么我可能还需要接触一下 Python。我其实学习过「很多次」 Python。我对这门语言同样没有什么好感。动态类型语言在我看来是相当「野蛮」的东西,尤其是像 Python 这种有那么多语法糖的编程语言,尤其显得「野蛮」。Lua 就好得多,雅观一些。但是不得不承认 Python 的确是现在最好的胶水语言。并且几乎是 C 最好的「延展」。大量的 Python 包的底层都由 C 去实现。所以我其实也应该学一点 Python——为了 AI。

我不打算深入学习 Java 和 C#。Java 和 C# 都是老生常谈了,和 Golang 的定位相当接近。我有 Golang 就够了,对于这两门语言,我对自己的要求是能看懂它们在写什么。以及能用它们去调数据库的 CRUD 以及作 JSON/YAML、HTML请求的解析和构造。这样就够了。

我最好把工业领域的几个基础应用都过一遍手,以我自己的技术栈去过一遍。比如过一遍 build-your-own-x 那个仓库里的各种项目,尤其是 Shell、HTTP 服务器之类的经典应用。我需要培养一种能力,那就是我给出架构以后我能把应用快速做出来,至少能做一个原型出来。我现在并不缺乏设计软件架构的能力。我毕竟有那么深的「阅历」。虽然这种「设计」很多时候天马行空,缺乏工程实践经验的支撑,但对于我贫瘠的工程能力而言,它已经足够。

总结而言,精进 Golang,学习 TypeScript 和 Python,接触和了解 Java 和 C#,条件允许需要手动实现一些经典应用。这些工作要为自己未来成为某个领域的专家作准备。

当作是玩具摆弄技术:技术也是一种「休憩」

负重前行很累,并不依照自己的「意愿」去学习和应用新技术也很累。我在意愿上很乐意摆弄我的生产环境,就像前段时间那个 QQ 群在传的笑话那样——「我不理解那些喜欢 Linux 的人——农夫难道会爱自己的锄头吗?」

我是很喜欢摆弄自己生产环境的人,我在这个过程中能学习许多东西。我其实可以以此作提纲挈领,去掌握一些真正前沿、学术,或者说时兴的东西。

我现在的许多工具基于 Rust,我许多的朋友也向我推荐 Rust。Rust 人士有一种「老子要重构整个世界」的气质。这种气质让人感到好奇,所以我可能也会去接触一下 Rust。

我觉得手写 html 是很酷的事情,所以我必然会去摸一下「传统前端」的那些东西(HTML+CSS+JS),我正好有学习 TypeScript 的需要,这也许能放一起整。

对我而言,「休憩」语境下的技术是什么呢?它其实就是一种玩具了。当我们对技术投入的心智负担小到一定程度的时候,相应技术项目的工程性和严肃性其实会被消解许多,同样,我们也重新从其中获得乐趣了。这就像许多正在上中学的学生假期回来,特别想看到同学,甚至有些想上课了。技术是很累人的东西,但是当我们不考虑那么多的时候,技术也是很有趣的东西。我偏偏特别觉得这种有趣可贵,也特别享受这种有趣。高中时候我便很喜欢去读技术书籍作为某种放松。虽然那些晦涩难懂的文字就像水流一样流过我的大脑,一点痕迹都没留下,但是这个阅读、接触、了解的过程本身就是一种难能可贵的经验了。

可惜我现在案头也有许多技术书籍,许多都是当年买的。我一本都不想再看,大部分都没看完。这些书应该被我赋予了某种严肃性,所以我读它们已经不会感觉到放松了。

一些 RetroCompute 的东西也很有趣,这点分外值得提一提。比如 Lisp,比如 Pascal,比如 COBOL,比如 MIPS——你不能指望我们真的能从这些技术里获得在就业、科研里的竞争力或者突出点,但就是因为它们在我的处境里一点竞争力、突出点都没有,它们才最显得有趣。有道是「无用之用」。它们来疗愈我的精神,放松我的神经,这就已经很足够了。

计算机以外的技术:同样是「休憩」

那其实这样讲起来,我可能还会去读一点「Hard Science」的东西——只要我有时间。

数学和物理的一些经典领域也是很有意思的。我可能现在不觉得它们有意思,但以后的事情不好说。并且很大一部分程度上,这种对理工科的兴趣需要自己「装一下」,装着装着,就真的有兴趣了。这里的道理和「君子慎独」有点相近,就好像有人看着自己一样,那学一点「有格调」的「Hard Science」也不错,就当是放松了。

如此看来,其实思路都不一定要局限于「Hard Science」,人文社科同样重要。古文呢?书法呢?经济和法律能不能碰一碰?再就是大部头的著作,能不能读一读?往图书馆里走,能不能做到一面墙一面墙读下来。可以做一些笔记,但不要带心智负担去做。我们可以学许多东西!

学这些东西是为了放松,学习本身就是一种很好的放松。所以阅读和接触这些资料不是为了记忆,而是为了遗忘。这也许可以避免我未来被「妙妙环境里的灵车工程问题」逼疯,为我省一笔心理医生的咨询费。