语言、工具、协议各一则——都是平时会突然想起来要查的东西。

一、语言

LSP

Language Server Protocol 把编辑器与语言智能拆开:编辑器发 JSON-RPC,语言服务器提供补全、跳转、诊断和重构。VS Code、Neovim 和各类 IDE 因此能共享同一套语言实现,不必为每个编辑器重写解析器。

能力集中在 textDocument 系列方法。工作区配置、文件监视和进度通知影响体验。服务器可以是进程内或独立进程,崩溃隔离更好,但启动延迟更高。

自研语言或 DSL 时,先实现文档同步和诊断,再补全跳转。注意增量同步与编码位置(UTF-16)一致性,否则高亮会错位。日志里的 LSP 消息是排查卡顿的第一手材料。

Lua语言

Lua 是轻量脚本语言,表是唯一的复合数据结构,元表可模拟面向对象。它以嵌入见长:游戏逻辑、Nginx 扩展、Redis 脚本和许多引擎都把 Lua 当宿主语言的插件层。

语法少、启动快,但错误处理与包管理相对简单。与 C 交互靠栈式 API,要注意引用生命周期,避免在回调里持有已释放的对象。LuaJIT 在 x86 上很快,但架构支持不完整。写脚本时应限制沙箱、超时和内存,尤其是把用户输入当脚本执行的场景。模块用 local 引用,减少全局污染。适合做配置和热更新,不适合替代完整应用后端。

正则表达式

正则表达式用模式描述字符串集合,适合校验、抽取和替换。常见引擎分 NFA 与 DFA:大多数语言是 NFA,支持回溯与捕获组,但错误的模式可能造成灾难性回溯。

写表达式时先明确锚点、字符类和量词边界,避免用 .* 吞掉整段文本。邮箱、手机号这类规则应参考官方格式,而不是自己发明过宽的模式。在服务端要用超时和长度限制保护解析器。调试可先在可视化工具里看匹配路径,再固化到代码。复杂语法解析不要硬上正则,交给专门的解析器更稳。

二、工具

git merge和rebase

git merge 把两条历史合成一次合并提交,保留分叉形状;rebase 则把当前提交接到另一条分支后面,历史更直。共享分支上用 merge 更安全,因为不会改写已经推送的提交。个人功能分支在合入前 rebase 到最新主线,能减少无意义的合并泡。

冲突时两边都要看语义,不要只留一方。已经公开的提交不要强制 rebase。交互式 rebase 可以压缩临时提交,但要在推送前做。CI 上建议禁止直接推 main,用 PR 看差异。记不清命令时,先 git status 和 git log --oneline --graph,再决定是继续、中止还是用 rerere。团队约定一种主策略,比每个人混用更重要。

Github CLI

GitHub CLI(gh)在终端里完成 Issue、PR、Actions 和仓库操作,减少在网页和 git 之间切换。常见用法包括 gh pr create、gh run watch、gh issue list,以及用脚本把检查状态接到本地工作流。

认证用 gh auth login,权限按最小范围申请。企业实例要指定 host。把 gh 写进 CI 时用专用 token,不要复用个人账号。输出用 --json 方便脚本解析。它不能替代 git 本身的历史与变基操作,只是补上托管平台的 API。团队规范(模板、标签、CODEOWNERS)仍要在仓库里配置,CLI 只是调用它们。

Retrofit

Retrofit 把 HTTP API 变成接口:注解描述方法,动态代理生成 Call。底层默认 OkHttp,转换器用 Gson/Moshi/kotlinx.serialization。协程可用 suspend 函数,RxJava 有适配器。

baseUrl 必须以 / 结尾,相对路径不要重复斜杠。@Url 可覆盖整段。错误处理看 HTTP 码与业务码分离。文件上传用 MultipartBody。

不要每个页面 new Retrofit,单例共享连接池。拦截器做 token 刷新要注意重入。测试用 MockWebServer。Android 上注意主线程回调:默认 OkHttp 在后台,enqueue 回调也非主线程,要自己切。

三、测试

软件测试:回归测试

回归测试确认新改动没有破坏已经稳定的行为。范围可以是冒烟、核心链路或全量自动化,取决于变更半径:改公共组件就要扩圈,改局部文案可以收缩。

维护成本主要来自脆弱的 UI 断言和过期用例。把回归集中在业务不变量上:下单必扣库存、支付幂等、权限拒绝路径,比核对每一个像素更耐重构。

理想状态是提交即跑、合并前阻断。失败用例要能追溯到需求或缺陷单,否则回归套件会变成谁也不敢删的噪声集合。