个人 · 纪实 2026 年春 / 约 8 分钟阅读 / NO. 001

十年磨一剑:一个 C# 全栈老兵的航海志与墨焱实验室发刊词

这不是一篇技术教程,也不是一份履历清单。这大概是我写过最「不技术」的一篇技术文章—— 但十年之后回头看,它记录的东西,比任何一段代码都重。

一、十年一瞬:从不分离到云原生

我写下第一行在生产环境里真正跑起来的 C# 代码时,「前后端分离」这个词还不是一个概念—— 因为压根就没人分。一个 .aspx 页面从上到下就是整条链路:代码后置里取出 Request 参数, 拼一段 SQL 塞进 SqlCommand,等 DataTable 回来,再用 Repeater 循环把 HTML 吐出去。 前端是「页面」,后端是「数据访问」,中间隔着一层被称作 UI → BLL → DAL 的经典三层架构, 像三节火车厢,规矩、笨重,但也踏实。

// 2016:一个查询贯穿 UI → BLL → DAL
public DataTable GetArticle(int id) {
    var cmd = new SqlCommand("SELECT * FROM Article WHERE Id=@id", conn);
    cmd.Parameters.AddWithValue("@id", id);
    var da = new SqlDataAdapter(cmd);
    var dt = new DataTable();
    da.Fill(dt);   // 数据从数据库一路裸奔到页面
    return dt;
}

手拼 SQL 是被迫练出来的手艺。参数化查询是背下来的纪律,「字符串拼接」是简历上的减分项, 也是当年事故报告里的常客。今天回头看,那几年真正教会我的不是怎么写 SQL, 而是为什么要对用户输入保持怀疑——这条直觉,后来在我做过的每一个接口里都在起作用。

转折发生在 ASP.NET MVC。视图与逻辑终于被拆开,Controller 成了一个可以被理解、被测试、被单独重构的东西。 再往后是那件当时看起来像「背叛」的事:.NET Core 开源、跨平台。我到现在还记得第一次在 Ubuntu 上敲下 dotnet run、看着一套原本只属于 Windows 的业务代码跑起来的感觉——那是一种很奇怪的解脱。 一度被绑在 Windows Server 与 IIS 上的东西,忽然可以装进一个几十兆的容器,跟着 Shell 脚本一起漂洋过海。

今天我用 docker compose up -d 拉起一整套环境,推送主分支后由流水线自动构建与替换镜像。 工具的迭代速度,比我入行时快了至少一个数量级。

但真正让我踏实的,是那些没有变的东西:请求进来、模型校验、事务边界、幂等设计、失败重试、日志可追。 不管外面套的是 WebForm、MVC、WebAPI 还是 Minimal API,一个接口该守的规矩,十年前和今天一模一样。 架构在变,工具在换,可工程师对底层确定性的追求,从来没有变过。

二、武器库:以 C# 为底座的全栈纵深

如果只能用一句话介绍自己,那大概是:以 C# 为底座,向上打通到用户界面,向下扎到系统调用。

后端是我的主战场。C# 与 .NET 我用了十年,最熟的其实不是语法糖,而是「这段代码到了生产环境会怎样」—— GC 什么时候来、线程池会不会被同步阻塞耗尽、一段看似无害的延迟求值会在哪里被重复触发、 async/await 在什么情况下会悄悄退化成假异步。性能调优这四个字听起来很玄,做起来极其枯燥: 压测、采样、看火焰图,把一个接口的 p99 从 800ms 一寸一寸抠到 120ms。高可用也不玄: 无状态、可重入、能在任意一台机器上被重新拉起来。

桌面客户端是我很庆幸没有丢下的一块。从 WinForms 的年代,到 WPF 的依赖属性、数据模板、MVVM 与自定义控件渲染, 桌面端给了我 Web 给不了的东西:真正的原生性能,和复杂交互的细腻度。 一个需要实时波形、需要多窗口协同、需要在没有网络的环境里连跑八小时不崩的客户端, 是网页永远模拟不出来的。真正理解渲染管线之后,你对「性能」这两个字会有一层完全不同的体感。

前端我没有站在岸上看。Vue 2 到 Vue 3 的迁移我完整经历过,从 Webpack 换到 Vite 之后构建速度的提升是实打实的爽感; 组件通信、状态管理、工程化分层、按需加载、首屏指标——这些不是「前端同学的事」,而是全栈能否真正闭环的关键。 跨端补上了最后一块拼图:uni-app 让我用一套代码覆盖小程序与 App,Flutter 则让我有机会重新理解一次渲染引擎与布局约束。

四块拼起来,才叫全链路掌控。它带来的最大好处不是「一个人能把项目做完」(虽然确实能),而是定位问题的速度:

  • 后端:C# / .NET 高可用服务、性能剖析与调优、并发与异步模型。
  • 桌面:WinForms 到 WPF,自定义控件、渲染优化、离线稳定运行。
  • 前端:Vue 2 / Vue 3 工程化,构建链路与首屏指标治理。
  • 跨端:uni-app 与 Flutter,一套逻辑覆盖多端交付。

当一个 Bug 从数据库一路冒到界面,我不需要在四个群里来回传截图、等四个人的时间。 这就是纵深的价值。

三、实战熔炉:大厂规范、小队带兵与内网攻坚

我的十年大致分成两种完全不同的环境。

在大公司,我学到的第一个词是「克制」。能不加的依赖不加,能不改的公共组件不改,能小步发布的绝不一次性上线。 系统设计不是炫技,而是在已知的容量、成本与团队能力之间,找一个最不坏的交点。 我在这里第一次认真对待高并发——不是「QPS 很高」这么简单,而是缓存击穿时怎么兜底、降级开关由谁拍板、 限流阈值依据是什么、数据库连接池打满之后的前三分钟该做什么。也是在这里, 标准化工程流程变成了一种肌肉记忆:Code Review 不是找茬,发布单不是形式, 回滚预案必须在写代码之前就存在。

后来到了小团队,我成了技术带头人,带 2~3 个人。环境变了,规则也变了:没有人替你兜底,也没有那么多时间做完美设计。 我必须学会业务穿透——不只接需求,而是搞清楚需求背后客户到底想解决什么问题, 然后判断哪些能砍、哪些必须做。我学会了在信息不全时先交出一个能上线的版本,再在真实反馈里迭代。 最重要的是,我学会了对整体交付结果负责,而不是只对自己写的那几个模块负责。 这两个角色之间的距离,比任何两个技术栈之间的差距都大。

而最极端的一段经历,是「内网开发」。那是一个与外网彻底隔绝的环境:不能 npm install, 不能 docker pull,几乎所有依赖都要靠离线仓库与手工导入。我被迫把一件事想得极其清楚—— 一个项目的依赖到底有几层,每一层从哪里来,升级一次要付出什么代价。

# 内网环境:没有外网,每一步都得自己搬砖
npm pack --pack-destination=./offline-npm   # 在外网机打包
docker save -o app-1.4.2.tar app:1.4.2      # 镜像导出
scp ./offline-* ./app-1.4.2.tar jump-host:/tmp

# 内网机:离线导入,走依赖白名单
docker load -i app-1.4.2.tar
npm ci --offline --registry=file:///opt/offline-npm

我们在本地搭镜像源、做依赖白名单、写导入脚本;因为交付物要落到特定硬件上,还得处理软硬件协同部署: 驱动版本、运行库、端口占用、开机自启顺序,一个都不许想当然。安全基线更是硬约束——最小权限、 关闭非必需服务、端口只开必需的、日志脱敏。

那段日子很累,却是我工程能力成长最快的一段。它把「把代码跑起来」和「把系统交付出去」这两件事之间的鸿沟, 完完整整地摆在了我面前。

四、为什么在今天还要建「墨焱实验室」?

2026 年做个人博客,说实话有点逆流而上。

打开任何一个信息流,扑面而来的是「三天精通」「一周转型」「这个框架已经死了」。 技术内容被切成十五秒的片段,标题越来越长,信息密度越来越低。算法很聪明,它知道你点开什么,于是拼命喂你什么—— 刷了一晚上,最后记住的只有一堆名词。

我不想要这样的输入,也不想要这样的输出。

所以我做了一件看起来很笨的事:自己租云主机、做域名实名认证、走完工信部 ICP 与公安联网两套合规备案、 手写 Docker Compose 与 Nginx 反向代理、签证书、配流水线。这一整套下来花掉的时间,够我在平台上开十个账号。

但换来的是一个很朴素的东西:一座完全属于我自己的、纯粹可控的数字堡垒。 数据在我手里,排版我说了算,哪天想换机器,一条命令就能重放。这个站点没有推荐算法,也不需要讨好任何人。

如果一段经验不能被复现、不能被验证,那它就只是一段回忆。

所以这里只有一条原则:不写虚头巴脑的流水账,只沉淀可复现、可验证、经过生产检验的工程实战。 我写的每一条排错记录,都来自真实的报错窗口;我给出的每一个参数,都在生产环境跑过; 我不会的东西,也会直接说不会。

五、未来航线:在墨焱实验室,我们将探索什么

接下来这里会持续输出四类内容,都是我日常真正在用的东西:

  • .NET 底层与性能:.NET 8 / 9 的运行机制、GC 与内存排查、异步与并发模型,以及真实场景下的调优案例。
  • WPF 与现代客户端:渲染与布局原理、MVVM 工程化、自定义控件、工业与大屏场景的交互实践。
  • Docker 与 Linux DevOps:容器编排、反向代理与证书自动化、私有镜像与离线部署、运维踩坑与回滚方案。
  • 全栈独立开发实战:从需求拆解到上线运维的完整闭环,包括一个人怎么同时当好产品、后端、前端和运维。

十年只是第一个航段。我从手拼 SQL 的年代走到容器编排的今天,看着一门曾经只属于 Windows 的语言变成跨平台的主力, 也看着自己从一个写页面的人,变成一个要对整条链路负责的人。

代码未冷,墨焱常燃。

如果你也相信慢一点、扎实一点的工程方式;如果你也在为一个没人愿意排查的内存泄漏熬到凌晨; 如果你也觉得「技术」这件事值得被认真地写下来——欢迎同路人。