从舒适区突围,在项目驱动中重新理解学习
一、缘起:当熟悉成为一种舒适区
作为一个以 Java 为主的全栈工程师,我的技术栈已经相当“稳定”。这套组合我用了很多年,熟悉到几乎可以不假思索地搭建一个新项目。
但正是这种“熟悉”,让我开始感到不安。
技术领域的舒适区是一个悖论:它让你效率最高,却也让你成长最慢。当你对一门语言或一套框架了如指掌时,你很容易陷入一种错觉——只要问题还能用现有工具解决,就没必要换一种方式思考。
Go 语言进入我的视野,并不是因为工作需要,也不是为了跟风。更真实的原因是:
我想刻意把自己从这套熟悉路径里“拽出来”一次。
但我给自己设了一个明确的限制条件:
不用 Java。
这个限制并不是为了证明什么,而是想验证一个假设:
对于一个已经有工程经验的开发者来说,学习一门新语言的最短路径,是否可以不是“先系统学习”,而是“直接进入真实项目”。
二、为什么是博客:一个被低估的练习项目
选择博客作为练习项目,本质上是在为学习设置约束条件。
博客这个项目乍看之下很普通,甚至有点“老套”,但它有几个非常关键的特性:
-
业务边界极其清晰
- 首页:文章列表
- 详情页:文章内容
-
需求稳定,不容易变形
-
有明确的“完成状态”
当你用一门陌生语言写代码时,你的认知负荷本来就很高——
语法不熟、标准库不熟、生态不熟,如果业务本身再复杂,很容易陷入“双线作战”。
博客的好处在于:
业务几乎是透明的。
你在写代码之前,脑子里就已经知道它应该怎么工作,这让你可以把几乎全部精力放在“语言和实现方式”本身,而不是在业务理解上反复消耗。
更重要的是,博客是一个有终点的项目。
你可以清晰地定义什么叫“做完了”:
能写文章、能展示、能部署、能访问。
这个终点感非常重要,因为它直接决定了你能不能走到最后。
三、真正开始之前:我并没有“先学 Go”
在 AI Coding 已经成为日常的前提下,下面这些事情,并不是必须的前置步骤:
- 系统阅读 Go 教程
- 集中学习语法细节
这并不是否定这些方式的价值,而是它们不再是启动项目的必要条件。
相反,我做的第一件事是:
把“我要做的东西”描述清楚。
第一次对话:不是问代码,而是问“结构”
我一开始问的不是:
“用 Go 怎么写博客?”
而是更偏架构的问题:
- 如果用 Go 做一个单作者博客
- 不需要登录系统
- 内容以 Markdown 为主
- 希望长期可维护
后端整体结构应该怎么拆?
得到的不是一堆代码,而是几个关键决策点:
- 是否需要数据库
- 是否需要后台
- 内容如何组织
- 服务是否真的必要
这一步的价值在于:先把“不要做什么”确定下来。
第二轮对话:把模糊目标拆成“可以动手的子任务”
在结构明确之后,我继续往下问:
如果把这个博客拆成几个最小可交付的阶段,每个阶段应该做什么?
这一步非常关键,因为它直接把一个模糊的目标,拆成了可执行的步骤,例如:
- 后端能返回文章列表
- 后端能返回文章详情
- 前端能渲染 Markdown
- 页面能被搜索引擎抓到
- 部署流程足够简单
这相当于给学习过程加了一条“导航线”。
第三轮对话:不会 Go,但先把“能跑”的代码写出来
真正开始写 Go 代码后,问题就变得非常具体了。
比如:
- Go 的 HTTP 服务最小实现长什么样?
- 一个最简单的 handler 应该怎么写?
- main 函数里通常做哪些事?
这里我的策略很明确:
不追求完全理解,先让程序跑起来。
对于看不懂的部分,我会做两件事:
- 直接在代码旁边标注注释:
// TODO: 这里暂时不理解 - 继续往下推进功能
第四轮对话:围绕“为什么这样写”反复追问
当代码能跑之后,我会回过头,针对刚才那些“不理解”的点继续追问:
- 为什么 handler 要满足这个函数签名?
- context 是在什么时候被创建的?
- error 为什么要这样一层层返回?
- 如果不用这种写法,会有什么问题?
这一阶段的对话,已经不是“教我怎么写”,而是:
“帮我解释我现在手里这段代码”。
这和看教程最大的区别在于:
所有问题都是有上下文的,而不是抽象概念。
第五轮对话:报错驱动的学习
用陌生语言写代码,报错是常态。
类型不匹配、接口不满足、返回值数量不对……这些问题在 Go 里出现得非常频繁。
我的做法是:
-
不急着“修”
-
先搞清楚:
- 编译器为什么不接受这段代码
- 它期望的是什么
这个过程会反复触发新的对话,而这些对话几乎都围绕一个点:
Go 为什么要强迫你这样写?
五、Go 带来的“陌生感”,以及我如何逐步适应
(这一节你原本写得很好,这里只做轻微收紧)
- 项目结构的自由度
- 显式错误处理
- 隐式接口
- context 的存在感
这些差异在一开始确实会让人不适,但在多轮“写 → 问 → 改”的过程中,它们逐渐从“规则”变成了“习惯”。
六、完成比完美更重要
最终完成的博客功能非常克制:
- Markdown 写文章
- 列表 + 详情
- SEO 友好
- 不依赖数据库
- 部署成本极低
没有炫技,没有复杂架构。
但这正是我想验证的东西:
项目驱动的学习路径,是否真的能把一门陌生语言“拉进可用区间”。
答案是肯定的。
结语:学习的本质,是打破惯性
这次经历并没有让我“精通 Go”。
但它让我确认了一件事:
对于有经验的工程师来说,学习的关键不是信息获取,而是启动方式。
当你把目标从“学会一门语言”换成“完成一个项目”,很多心理障碍会自然消失。
哪怕只是一个博客,也足够了。