我在前公司主要使用的技术栈是 Go。Go 语言本身语法简单,既有动态语言的一些特性,又有很高的运行效率,同时拥有很好的并发运行能力的支持。Go 语言本身【大道至简】到丑陋,不过正是因此,反而统一了编码风格,对于团队协作而言非常有意义。而且 Go 直接输出可执行文件,工程部署上简单很多,也是公司很多团队都会用的原因。

Go 本身也有很多问题:乱用 interface、缺乏泛型、goroutine 调度、半吊子的面向对象、不完善的依赖管理(go mod 以后好多了)等。

后来写 serverless runtime 的时候,基于 V8 ,又写了一段时间 C++,欲仙欲死。因为不是原生开发,是基于 V8 的 API。对我这种不甚熟悉 C++ 的同学,搞出来一大堆奇奇怪怪的姿势,感叹确实 C++ 很强大很厉害,又担心过个把月我也看不懂我写的啥了。

离职后,本来是用 Go 在重写小站用的静态生成器(当初版本还是 GOPATH 时代,还没 go mod)。后来觉得,玩自己熟练的东西没意思,就想试一试 Rust。最早调研 serverless runtime 的时候就看到 Deno 使用的是 Rust v8 bindings —— rusty_v8。很多 wasm 的 runtime 也是用 Rust 写的,比如 WasmEdgeWasmer。当时调研认为 wasm 是边缘函数计算很有可能的未来。基于这些考虑,学习一下 Rust 好了。

学习 Rust

Rust 很重要的特点是【内存安全】。因而它增加了许多限制,如 mutownership 等。我参考原来 Go 开发的静态生成器代码,照猫画虎写了 PuGo-rs

首先是参考 Rust 官方的 Markdown 文档生成工具 mdBook。他用的 clap 做命令行工具库。我就看了一眼文档,例子是基于 Derive 的。我吐槽这都是啥!!!结构体注解吗?难怪有人说 Rust 代码难看懂,确实看了一眼猜得出来大概意思(英语阅读理解)。但如果这个代码是我写的业务代码,估计别人就难看懂你的 derive 都是干啥的。这算是我入坑的第一次震惊哈。

#[derive(Parser)]
#[clap(author, version, about, long_about = None)]
#[clap(propagate_version = true)]
struct Cli {
    #[clap(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Init sample site project
    Init {},
    /// Build site
    Build(cmd::BuildArgs),
    /// Serve site and watch for changes
    Serve(cmd::ServerArgs),
}

我这个程序对 Rust 使用的局限性还是很大的。一是没用上泛型。既可能是业务太简单,也可能是我理解不够。总觉得没啥好抽象的,也就没啥可归并的。二是没用上并行。内容的生成方式目前还是线性的,生成文章、页面、列表、主页、其他页面。理论上并发生成各个部分是可以做的。目前站点也就这么几篇文章,加快生成速度的需求并不着急。

最近又在研究 wasm 的 runtime,都是 Rust 实现的。也许能发觉到一些新的常见,体验更多的 Rust 的姿势。

新工作

离职休息整三个月后,准备找新的工作。前同事去了天翼云(电信云),由他推荐,我也去面试了天翼云。他也是 serverless 方向,正好也是我在前公司做的事情,可以继续做下去。天翼云一共面试三次,笔试了一次。

首先是团队直接面试。以后的同事进行简单的技术面试。开始聊了一些 Go 语言的特性,goroutine 的一些机制。然后是之前 serverless runtime 的经验,为何想着 V8 引擎,如何支持 ServiceWorker API,如果做到规模部署。

第二次是领导面试。聊了一些对开发基本概念,比如同步异步、阻塞非阻塞的。聊了之前 serverless 项目都有哪些内容,我负责开发哪些内容。整体上是如何考虑客户使用、部署和调度等。

这两个面试我觉得我聊的都还可以。因为之前 serverless 的 v8 runtime 我重度参与。ServiceWorker API 一大半的都是我在 V8 上实现出来。部署过程我也很清楚,毕竟给 runtime 提了很多对接需求。

第三次是笔试。Go 的代码单选题和多选题,和有几个问答题。我已经很久很久没刷过题了。上次面试前公司也没有笔试,只是两次面试。做完了之后心里还是比较忐忑的。万一题不对人,面试说的挺好,考试一团糟,就不好交代了。最终还是过了。

最后一次是 HR 面试。主要是聊工作经历,你对前公司的看法,已经对来这边有什么想法。

中间还有准备资料的过程,耗时比较慢。现在看新公司 offer 很接近了。但是他上报审批需要 1-2 周的流程,只能再等等了。