1// ==================== 秃然飞升 · 完整剧情 ====================
2// 本文件由 AI 生成
3const CHAPTERS = [
4 {
5 title: '第零章 · 面试初试',
6 start: 'ch0_room',
7 scenes: {
8 ch0_room:{text:`<p class="sys">北京 · 回龙观 · 九月初</p>
9<p>风扇的声音像有人拿指甲刮黑板。四年份的灰堵在出风口里,笔记本烫得能煎鸡蛋。你把掌心贴在键盘左侧的金属面上。凉的,只有那一小块是凉的。</p>
10<p>屏幕上是改了七遍的简历。「项目经历」那一栏,光标闪了又灭,灭了又闪。</p>
11<p>隔断间是用三合板从客厅隔出来的。隔壁那对情侣又在吵,声音穿过薄薄的板壁,像在自己耳朵边上说话一样清楚。这次好像是为了一双袜子。你已经学会了在这种背景音里发呆。</p>
12<p>桌上的泡面泡了一个多小时了,面条胀得发白,汤汁全被吸干了,糊成一坨。筷子搁在桶沿上,没动过。旁边是一瓶见底的老干妈,瓶口结了一层暗红色的油。</p>
13<p>毕业三个月了。二本计算机,GPA 3.2。没有实习,没有内推。投了一百多份简历,面试通知五个手指头数得过来,全挂在了二面。</p>
14<p>椅子右腿短了一截。你往后一靠,「咯噔」一声,又赶紧坐直了。</p>
15<p>手机亮了。</p>
16<p>妈:<span class="info">"儿子,找到工作了吗?妈不催你,就是问问。"</span></p>
17<p>你看了那条消息很久。打了两行字,又删了。锁屏。把手机扣在桌上。</p>
18<p>正要合上电脑。右下角弹出一封邮件。</p>
19<p class="good">「段飞您好,感谢您投递我公司的初级后端工程师岗位……银河科技」</p>
20<p>你看了三遍。第一遍看开头,第二遍看结尾,第三遍才敢看中间。面试时间、地点、联系人。</p>
21<p>心跳声盖过了隔壁的吵架声。你把手按在胸口。是真的,不是做梦。</p>`,choices:[{t:'📧 把邮件仔仔细细再看一遍',next:'ch0_email'},{t:'😰 给妈回个消息',next:'ch0_mom'}]},
22 ch0_email:{text:`<p>你把邮件从头到尾读了一遍。读完又读了一遍。像怕它突然消失似的。</p>
23<p>西二旗。北京互联网公司最密的那片地方。每次坐13号线经过那个站,你都会往窗外看一眼。那些玻璃幕墙的大楼,楼下穿梭的人,工牌在胸前晃来晃去。你想过很多次自己挂上工牌的样子。</p>
24<p>银河科技,做企业服务,A轮五千万。天眼查上显示六十多个人,技术团队大概二十五人。你又去脉脉翻了翻评价。有人说氛围不错,有人说加班狠。</p>
25<p>加班?你不怕。你在六平米的隔断间里已经待了三个月了。还有什么比这更难熬的。</p>
26<p>窗外一辆货车轰隆隆开过去,震得窗户嗡嗡响。你看了看时间。十一点了。</p>
27<p class="sys">明天面试。你决定——</p>`,choices:[{t:'📚 刷一宿LeetCode',next:'ch0_prepare'},{t:'📖 背面经,突击八股文',next:'ch0_ba'},{t:'😴 睡觉,明天临场发挥',next:'ch0_sleep'}]},
28 ch0_mom:{text:`<p>你拿起手机,打了又删,删了又打。</p>
29<p class="mono">"妈,刚收到一个面试通知。明天去试试。"</p>
30<p>发出去不到十秒——</p>
31<p>妈:<span class="info">"太好了!明天加油!别紧张!妈给你求了个平安符,你带着!"</span></p>
32<p>后面跟了一张照片。一张叠得整整齐齐的黄纸,压在枕头底下拍的。边角都卷起来了。不知道已经求了多久,一直在枕头底下压着,等你找到工作那天。</p>
33<p>你盯着那张照片看了好一会儿。锁了屏,又把邮件翻出来看了一遍。</p>
34<p>西二旗。明天上午十点。</p>
35<p class="sys">时间不早了,你决定——</p>`,choices:[{t:'📚 刷一宿LeetCode',next:'ch0_prepare'},{t:'📖 背面经,突击八股文',next:'ch0_ba'},{t:'😴 睡觉,明天再说',next:'ch0_sleep'}]},
36 ch0_prepare:{text:`<p>你刷了一整晚LeetCode。</p>
37<p>从两数之和到动态规划,从动态规划到图论。困了就掐自己大腿内侧。那里肉嫩,掐一下能精神半小时。凌晨三点四十二分,背包问题的状态转移方程终于通了。不是那种"好像懂了"的通。是真的通了。你盯着屏幕上那个绿色的Accepted,发了一会儿呆。</p>
38<p>七点,你站起来洗了把脸。水龙头拧到最左边,只有冷水。冰凉的。镜子里的人黑眼圈重得跟被人打了一拳似的,眼白里全是血丝。</p>
39<p>换上了昨晚熨好的白衬衫。优衣库打折,九十九块,买回来半年了没穿过,吊牌今早才剪。领口有点硬,不太习惯。</p>
40<p>你对着镜子压了压翘起来的头发,沾了点水。</p>
41<p class="sys">出发。</p>`,choices:[{t:'🚇 去西二旗!',next:'ch0_subway',fx:{"exp":10}}]},
42 ch0_ba:{text:`<p>你背了一整天的八股文。</p>
43<p>HashMap原理、GC机制、线程池七个参数、MySQL索引为什么用B+树、JVM内存模型、Spring IOC、三次握手、四次挥手……你把这些东西写在便利贴上,贴在墙上、贴在桌上、贴在泡面桶上。上厕所的时候脑子里都在想ConcurrentHashMap的分段锁。</p>
44<p>凌晨一点,你合上书,脑子里像塞满了棉花,又像被这些名词撑得快要炸开。</p>
45<p>第二天早上七点睁开眼睛。脑子里冒出来的第一件事居然是HashMap的负载因子为什么是0.75。你躺在床上想了一会儿,确认自己还记得,才爬起来。</p>
46<p>白衬衫昨天熨好的,挂在门把手上。双肩包磨了边,拉链头坏了一个,用回形针别着。你拽了拽,没掉,放心了。</p>
47<p>出门前在镜子前站了几秒钟。深呼吸。推门。</p>`,choices:[{t:'🚇 去西二旗!',next:'ch0_subway',fx:{"exp":5,"mp":10}}]},
48 ch0_sleep:{text:`<p>你想,紧张也没用。与其刷一晚上题明天顶着两个黑眼圈去面试,不如睡个好觉。</p>
49<p>你洗了澡,关了机,躺下来。隔壁又在吵。这次是为了一瓶洗衣液。女的怪男的买错了牌子,男的说都是一个味,女的说你鼻子是不是摆设。</p>
50<p>你戴上耳机,随便放了一首钢琴曲。你把被子蒙过头顶,蜷成一团。</p>
51<p>居然真的睡着了。</p>
52<p>早上七点自然醒。闹钟还没响。窗帘缝里漏进来一条光,落在枕头边上。你躺了一会儿,觉得精神从来没有这么好过。</p>
53<p>白衬衫是昨天熨好的,挂在门把手上。你套上之后对着镜子看了看。气色确实不错。黑眼圈淡了很多。</p>
54<p>背上双肩包,推门出去了。</p>`,choices:[{t:'🚇 去西二旗!',next:'ch0_subway',fx:{"exp":3,"hp":10}}]},
55 ch0_subway:{text:`<p>北京地铁13号线。早高峰。人贴着人。</p>
56<p>你被挤在两个上班族中间,左肩顶着一个大叔的胳膊肘,右肩靠着一个姑娘的帆布包。大叔在看短视频,外放的声音震得他耳膜发麻。姑娘在背英语单词,嘴里念念有词。</p>
57<p>一只手吊着拉环,另一只手护着胸前的背包。电脑在里面。你唯一的家当。</p>
58<p>窗外什么都没有。黑漆漆的隧道,偶尔闪过一盏黄色的检修灯,快得像错觉。</p>
59<p>你戴上耳机放了首歌。旋律灌进来的时候,脑子里自动开始过算法题。两数之和、三数之和、反转链表、环形链表。像一个程序一样一行一行地跑。</p>
60<p>列车晃动着穿过一个又一个站台。每报一个站,心跳就快一点。</p>
61<p>「西二旗站。到了。」</p>`,choices:[{t:'🚶 出站',next:'ch0_lobby'}]},
62 ch0_lobby:{text:`<p>写字楼是灰色的。十五层。玻璃幕墙反射着上午的阳光,晃得他眯了眯眼。</p>
63<p>门口吸烟区站着几个穿格子衬衫的年轻人,烟夹在手指间,脸上是一种你看不太懂的疲惫表情。可能是这里的员工,也可能跟他一样是来面试的。</p>
64<p>你深吸一口气,推了一下旋转门。门比你想象中重,你用了点力才转进去。</p>
65<p>大厅的地面干净得反光。你低头看了一眼。鞋子上有灰,昨晚忘了擦。前台坐着一个戴眼镜的姑娘,正在接电话。你站在那儿等了一会儿,等她挂了才走上去。</p>
66<p>"你好,我来面试的。你。初级后端。十点。"</p>
67<p>她查了一下电脑,抬起头笑了笑:"B区十楼,出电梯左拐,第二间会议室。"</p>
68<p>你说了声谢谢。走向电梯口的时候,感觉大厅的空调温度比外面低了十度,胳膊上起了一层细小的鸡皮疙瘩。</p>
69<p>电梯正从B2上来。红色数字一格一格地跳。</p>
70<p class="sys">叮。</p>`,choices:[{t:'🚪 进电梯',next:'ch0_elevator'}]},
71 ch0_elevator:{text:`<p>电梯门打开的瞬间,有个人差点撞进他怀里。</p>
72<p>白T恤,低马尾,手里端着一杯冰美式。杯壁上全是水珠,顺着杯沿滑下来,在她手指上汇成一小滴。她低头在看手机,没看路。</p>
73<p>两个人同时刹住。</p>
74<p>她抬起头。</p>
75<p>你低下头。</p>
76<p>眼睛。你先注意到了她的眼睛。很亮。不是那种刻意有神的亮,是刚好看了一眼窗外透进来的光,反射在瞳孔里的那种亮。</p>
77<p>她先反应过来,往旁边让了一步,笑了一下,不是那种客套的、前台式的笑,是真的觉得有点好笑:<span class="good">"不好意思,没看路。你。面试的?"</span></p>
78<p>你的嘴巴动了动,发出一个含混的气音:"嗯。"</p>
79<p>她上下扫了他一眼,目光在那件白衬衫上停了一下:<span class="good">"衬衫很正式嘛。加油。"</span></p>
80<p>然后她就走了。像一阵风。擦肩而过的时候,带过来一点点咖啡的苦味和洗衣液的味道。清新的,像某种花香。</p>
81<p>你站在原地。脑子里嗡了一下。</p>
82<p>电梯门又关上了。你愣了两秒才伸手去按。门重新打开,你走进去,靠在电梯壁上。不锈钢的壁面冰凉,隔着衬衫贴着你的后背。</p>
83<p>你摸了摸自己的脸。有点烫。</p>
84<p class="sys">心跳加速的原因,好像跟面试没什么关系。</p>`,choices:[{t:'📴 去面试间',next:'ch0_interview'}]},
85 ch0_interview:{text:`<p>十楼的走廊很安静。灰色地毯,吸掉了所有脚步声。墙上挂着一幅巨大的世界地图,北京的位置贴了一个红点,其他几个城市也有。你看了一眼,没来得及数。</p>
86<p>第二间会议室。门虚掩着。你敲了两下,推开。</p>
87<p>里面坐着一个三十多岁的男人。黑框眼镜,黑色T恤,外面套了一件深蓝色的冲锋衣,拉链没拉。头发有点乱,像是刚睡醒随手扒拉了两下。面前放着一台ThinkPad,旁边搁着一杯茶。茶叶沉在杯底,水已经不冒热气了。</p>
88<p>你抬头看了你一眼。没什么表情。</p>
89<p>"坐。"</p>
90<p>你在他对面坐下来。把背包放在脚边。会议室的空调出风口正对着他,冷风呼呼地往下吹,胳膊上瞬间起了一层鸡皮疙瘩。</p>
91<p>"我姓张。技术面。没有寒暄,不浪费时间,直接开始。"</p>
92<p>你咽了一口口水。嗓子眼干得发紧。你点了点头。</p>`,choices:[{t:'💪 来吧',next:'ch0_tech'}]},
93 ch0_tech:{text:`<p>"HashMap的底层数据结构讲一下。"</p>
94<p>"数组加链表加红黑树。当链表长度超过8时转换成红黑树,优化查找效率。负载因子默认0.75,超过阈值时扩容两倍。扩容时重新计算索引位置。叫rehash,比较耗时,所以能提前预估容量最好指定初始值。"</p>
95<p>老张眼皮都没抬:"怎么保证线程安全?"</p>
96<p>"可以用ConcurrentHashMap。JDK1.8之前分段加锁,1.8之后用CAS加synchronized只锁数组头节点。也可以用Collections.synchronizedMap或者Hashtable,但后两个性能不太好。"</p>
97<p>"MySQL索引B+树叶子节点存什么?"</p>
98<p>"InnoDB存整行数据,MyISAM存物理地址。所以InnoDB的辅助索引要回表。因为辅助索引叶子节点存的是主键值。"</p>
99<p>老张的表情始终没有变化。你面无表情的时候显得有点凶,你心里完全没底。</p>
100<p>"说一下JVM内存模型。"</p>
101<p>你从堆讲到栈,从方法区讲到程序计数器,从年轻代讲到老年代,又讲了垃圾回收算法。标记清除、标记复制、标记整理,顺便说了CMS和G1的区别。</p>
102<p>老张翻了一页纸。你看到那是你的简历,上面被你写了一些笔记。</p>
103<p>"手写一个单例模式。"</p>
104<p>你拿起白板笔,在白板上写了一个双重校验锁的DCL单例。</p>
105<p>老张看了一眼:"为什么要加volatile?"</p>
106<p>"防止指令重排序。new对象在字节码层面不是原子的。分配内存、初始化对象、把引用指向地址。如果不加volatile,第三步可能先于第二步,别的线程拿到的是一个还没初始化完成的对象。"</p>
107<p>老张沉默了两秒。</p>
108<p>"来做一道算法题。"</p>
109<p>你站起来走到白板前。白板笔在板面上顿了一下。你写下一行字。</p>
110<p class="mono" style="font-size:18px;">实现一个LRU缓存 · get和set都是O(1)</p>
111<p>然后你把笔递过来。你伸手接住,笔杆还是温的。被老张握过的余温。</p>`,choices:[{t:'🖊️ 拿起笔,开写',next:'ch0_algorithm',fx:{"exp":5}}]},
112 ch0_algorithm:{text:`<p>你拿起白板笔。LRU缓存。你知道这个题。双向链表加HashMap。LinkedHashMap就是现成的实现。你脑子里已经有了大概的结构。</p>
113<p>你落笔开始写。第一个字母写下去的时候,笔尖的感觉不太对。白板的表面不是光滑的。有一点点起伏,像有什么东西在板面底下呼吸。</p>
114<p>你停了一下,低头看了一眼板面。</p>
115<p>你写下的那一横,正在微微蠕动。</p>
116<p>你眨了眨眼睛。</p>
117<p>然后那行代码活了过来。</p>
118<p>笔画从白板上浮起来。像墨水里孵出了什么东西。一团黑色的、半透明的、没有固定形状的东西从板面里挤出来,越来越浓,越来越实。它膨胀、聚拢、成形。一个看不清轮廓的东西挂在白板上方,胸口的位置亮着一个标签——</p>
119<p class="bad" style="font-size:20px;">「NullPointerException」</p>
120<p>你往后退了一步。椅子腿刮了一下地面,发出刺耳的声音。</p>
121<p>你转头看老张。老张坐在原位,端起那杯凉茶喝了一口。表情跟刚才一模一样。</p>
122<p>"这。这是什么?!"你指着白板。</p>
123<p>老张把茶杯放下:<span class="info">"哦,正常。写代码嘛,遇到Bug常有的事。打就是了。"</span></p>
124<p>NullPointer发出一声尖啸。像金属刮擦玻璃的声音。朝你扑了过来。</p>`,choices:[{t:'⚔️ 抄起键盘,打!',next:'__FIGHT__',fx:{"exp":10}}]},
125 ch0_after_fight:{text:`<p>NullPointer在一声尖叫中碎裂了。像一团被揉碎的黑色纸屑,散落在空气中,然后消失不见。</p>
126<p>什么都不剩。白板上干干净净。那行代码还在,一笔一划,工工整整,像一个什么都没发生过的好学生作业。</p>
127<p>你喘着粗气。你发现自己不知道什么时候把那把键盘从桌上抄起来了。握在手里,像握着一件兵器。</p>
128<p>老张放下茶杯,站起来:<span class="info">"嗯。回去等通知吧。"</span></p>
129<p>五个字。</p>
130<p>像一盆冷水从头顶浇下来。刚才打怪的那股劲一下子泄了。</p>
131<p>你放下键盘,背上包。会议室门口你停了一下:"谢谢张老师。"</p>
132<p>走出去的时候,走廊的灰色地毯吸掉了你的脚步声。</p>`,choices:[{t:'😞 走',next:'ch0_low'}]},
133 ch0_low:{text:`<p>你站在电梯口等电梯。脑子里嗡嗡的,像塞了一窝蜜蜂。那只NullPointer的尖叫声好像还在耳膜里振。老张那张什么表情都没有的脸也在脑子里挥之不去。</p>
134<p>「等通知。」</p>
135<p>你把这三个字嚼了一遍。苦的。</p>
136<p>电梯门开了。你低着头迈进去——</p>
137<p>"哎。又是你。"</p>
138<p>你抬起头。</p>
139<p>白T恤,低马尾。她站在电梯门外,手里多了一份外卖。塑料袋上印着一家米线店的logo,被她拎在手上晃来晃去。</p>
140<p>她歪着头看你:"面完了?怎么样?"</p>
141<p>"不知道。让我回来等通知。"</p>
142<p>"是不是一个戴黑框眼镜、看起来很严肃的大叔?"</p>
143<p>"对。"</p>
144<p>她笑了。眼睛弯成两道月牙。</p>
145<p><span class="good">"他姓张。我们都叫你老张。你那个人就那样。不是故意凶你,是天生长了张面瘫脸。一般他要是觉得你不行,当场就会说。你说等通知。反而说明有戏。"</span></p>
146<p>你愣了一下:"真的?"</p>
147<p>"真的。"她把塑料袋换了一只手拎,<span class="good">"我叫林悦,也是这公司的。前端。"</span></p>
148<p>"你。你怎么知道我面的岗位?"</p>
149<p>"我帮HR筛过简历。"她眨了眨眼睛,<span class="good">"你那简历一看就是自己写的。没有模板味。朴实,但该有的都有。"</span></p>
150<p>电梯门开始关了。她伸手挡了一下。手指碰到你的手背,凉丝丝的。</p>
151<p><span class="good">"加油。应该没问题。"</span></p>
152<p>然后她转身走了。马尾辫在脑后一晃一晃的。塑料袋也一晃一晃的。</p>
153<p>你看着她的背影走远。</p>
154<p>电梯门缓缓合上。你靠在电梯壁上,发现自己嘴角不知道什么时候翘起来了。</p>`,choices:[{t:'🏠 回去等消息',next:'ch0_wait',fx:{"mp":5}}]},
155 ch0_wait:{text:`<p>面试那天是周五。</p>
156<p>周六。周日。</p>
157<p>你把手机铃声调到最大,音量键按了有十遍,确认不是静音。微信通知也开了。短信也开了。连邮箱都开了推送。明知道offer不会周末发,还是开了。</p>
158<p>周六上午,你在屋里走来走去。六平米的空间,走三步就得转身。隔壁又在吵。这次是因为男的忘了买洗衣液。你靠在墙上听了半天,觉得别人的日子过得真热闹。</p>
159<p>周日上午,手机还是安静的。</p>
160<p>你开始往坏处想。是不是那个NullPointer打得太难看了。是不是老张其实就没看上。是不是那句"等通知"就是客套。是不是HR已经把简历扔进了「不合适」的文件夹。</p>
161<p>你打开招聘软件,又开始刷。手指机械地往下滑,眼睛没在看,一个岗位都没读进去。</p>
162<p>周日下午三点。你终于忍不住了。给HR发了一条短信。删了写,写了删。最后发了一句:</p>
163<p class="mono">"您好,我是周五面试的你,想问一下面试结果。"</p>
164<p>没有回复。</p>
165<p>你把手机扔在床上,仰面躺下。天花板上有几块水渍,形状像一只蹲着的猫。</p>`,choices:[{t:'📱 等',next:'ch0_offer'}]},
166 ch0_offer:{text:`<p>周一早上八点二十三分。</p>
167<p>你其实很早就醒了。窗帘缝里漏进来一线灰白色的光,你就盯着那道光看。听着窗外车流声越来越大。新的一周开始了。</p>
168<p>手机响了。一个北京的座机号。</p>
169<p>你一把抓起来。手指在接听键上滑了一下。没滑开。又滑了一下。</p>
170<p>"喂。您好?"声音哑的,像不是自己发出来的。</p>
171<p>"喂,你吗?我是银河科技HR。恭喜你,通过了面试。"</p>
172<p>你握着手机,张着嘴。有什么东西堵在嗓子眼里。</p>
173<p>"喂?还在吗?"</p>
174<p>"在。在在在!"</p>
175<p>"月薪8K,试用期80%,下周一入职。offer邮件等会儿发你。有什么问题联系我。"</p>
176<p>"没有没有。谢谢!谢谢您!"</p>
177<p>HR笑了一下:"加油干。"</p>
178<p>电话挂了。</p>
179<p>你坐在床沿上,握着手机,愣了两秒。</p>
180<p>然后他吼了一声。不是"耶"那种克制的声音。是一声从胸腔里挤出来的、憋了三个月的吼叫。六平米的隔断间太小了,声音撞在墙上又弹回来,震得你自己耳朵嗡嗡响。</p>
181<p>你在屋里转了好几个圈,差点被地上的背包绊一跤。</p>
182<p>然后他给妈打电话。</p>
183<p>"妈。我找到工作了!!"</p>
184<p>"真的?!"那边声音一下子高了八度,"什么公司?"</p>
185<p>"银河科技。月薪八千。"</p>
186<p>"好好好。妈给你寄点腊肉……"</p>
187<p>"不用不用——"</p>
188<p>"你管我寄不寄!好好干!"</p>
189<p>挂了电话,你仰面躺在床上。天花板上的那几块水渍。现在看起来像一朵云。</p>`,choices:[{t:'💬 收到offer邮件',next:'ch0_wechat',fx:{"exp":15,"money":200}}]},
190 ch0_wechat:{text:`<p>下午四点。offer邮件来了。</p>
191<p>你把每一个字都读了一遍。公司名称。职位。薪资。入职日期。然后又读了一遍。确认不是自己看错了。</p>
192<p>你把邮件打印出来。那张A4纸放在桌上,你转身做别的事的时候,余光一直能看到它。白纸黑字,确确实实存在。</p>
193<p>晚上准备出门买点吃的。手机亮了。</p>
194<p>一条微信好友申请。</p>
195<p>头像是一把白色的小雨伞。背景是淡蓝色的天空。放大看,伞骨有一根微微弯了。是用过很久的伞。</p>
196<p>备注:<span class="good">"我是林悦,明天带你入职呀 👋"</span></p>
197<p>心脏又不争气地快了一拍。</p>
198<p>你看了那个头像几秒钟。点下了绿色的按钮。</p>
199<p>那边几乎秒回:<span class="info">"明天早点来,八点半到。我带你领电脑和工牌。"</span></p>
200<p>你回:"好的,谢谢!"</p>
201<p>过了两秒她又发了一条:<span class="info">"别紧张。第一天不会有什么大事的 😄"</span></p>
202<p>你捧着手机,翻了翻她的朋友圈。最近一条是工位上一盆多肉的照片。配文:"加班到十点,还好有它陪我"。再往下翻,有出去玩拍的风景、自己做的饭、偶尔发一张代码截图。干净。舒服。带着她不紧不慢的生活气。</p>
203<p>你看了一会儿。锁了屏。又打开看了一眼那个小雨伞的头像。然后笑了一下,放下手机出门了。</p>`,choices:[{t:'🌅 第二天·入职',next:'ch0_morning',fx:{"mp":5}}]},
204 ch0_morning:{text:`<p>第二天早上六点半。你醒了,比闹钟还早了一个小时。</p>
205<p>你干脆起床了。昨晚熨好的白衬衫挂在门把手上。你又检查了一遍,确认没有褶皱。洗漱、刮胡子、摸了摸下巴确认刮干净了。</p>
206<p>背上那个磨了边的双肩包。今天里面装着电脑、充电器、水杯、两支笔和一本小笔记本。</p>
207<p>你出门了。</p>
208<p>九月的北京清晨已经有了凉意。阳光斜着打在地面上,带着一层淡淡的金色。地铁里人比那天面试时少了一些。你找到了一个角落的位置坐下。</p>
209<p>耳机里放着歌。你看着窗外飞掠的城市,心里翻涌着一种说不清的复杂情绪。紧张、兴奋、期待、不安,混在一起,像一口闷下去的高度酒。</p>
210<p>你想起大四那年。同学们要么考研、要么去了大厂实习、要么回了老家考公务员。你选了最难的一条路。来北京,做程序员。</p>
211<p>那时候很多人问你"你确定吗?"你说你不确定,但你想试试。</p>
212<p class="sys">现在,你正在去试的路上。</p>`,choices:[{t:'🏢 到公司楼下',next:'ch0_meet_again',fx:{"hp":5}}]},
213 ch0_meet_again:{text:`<p>你提前四十分钟到了公司楼下。</p>
214<p>站在那栋灰色写字楼门口,你来回踱了几步。想抽根烟缓解一下紧张,但你不抽。就在那站着,像一个等人的高中生。</p>
215<p>正准备推门进去——</p>
216<p>"这么早就来了?"</p>
217<p>你转过头。</p>
218<p>林悦正从地铁站方向走过来。手里端着一杯咖啡,另一只手拎着一个纸袋。</p>
219<p>她今天穿了一件浅蓝色的连衣裙,外面套了一件牛仔外套。头发披散着。不是之前见过的马尾辫。风轻轻吹了一下她的发梢,她抬手顺了一下。</p>
220<p>你突然发现自己忘了怎么说话。</p>
221<p>"呃……嗯……想早点来适应一下。"</p>
222<p>她笑了笑,走过来:<span class="good">"走吧,我带你上去。"</span></p>
223<p>她推开门,回头看了你一眼。阳光从门缝里照进来,她侧脸的轮廓在逆光中变得很柔和。</p>
224<p>你跟在她身后,走进了大厅。</p>`,choices:[{t:'🚪 跟她进电梯',next:'ch0_elevator2'}]},
225 ch0_elevator2:{text:`<p>电梯里只有你们两个人。</p>
226<p>空间不大。你站在她旁边,能闻到她身上淡淡的洗衣液的香味。不是什么浓郁的香水,就是一种很干净的味道。</p>
227<p>"你住哪儿?"</p>
228<p>"回龙观。"</p>
229<p>"那挺远的啊。通勤多久?"</p>
230<p>"地铁一个多小时吧。"</p>
231<p>"辛苦了。西二旗这边租房贵,回龙观算性价比高的了。我刚来的时候也住那边。"</p>
232<p>你侧头看了看她。她已经换了手机壳,这次是白色底上画了一只卡通猫。</p>
233<p>"你在这儿工作多久了?"</p>
234<p>"一年多了。"</p>
235<p>"感觉怎么样?"</p>
236<p>她想了想:<span class="good">"挺好的。公司氛围不错,技术团队的人也都挺好相处的。唯一的缺点就是加班有点多,但互联网公司嘛,都这样。"</span></p>
237<p>电梯到了。</p>
238<p class="sys">叮——</p>
239<p>门开了。</p>
240<p><span class="good">"走吧。先带你去HR那领合同,然后去你的工位。"</span></p>`,choices:[{t:'📋 去HR签合同',next:'ch0_hr'}]},
241 ch0_hr:{text:`<p>HR办公室里,你签了合同,领了工牌。</p>
242<p>工牌上印着你的照片和名字——</p>
243<p class="mono" style="font-size:16px; text-align:center;">你 · 后端开发实习生</p>
244<p>你把工牌挂在脖子上。觉得它有点沉。不是因为它重,是因为上面印着的那行字。</p>
245<p>林悦在门口等你。看你出来了,她笑了笑:</p>
246<p><span class="good">"走吧,带你去看看你的工位。"</span></p>
247<p>她带你走进办公区。</p>
248<p>办公区很大。工位排列整齐,大部分已经有人了。有的在敲代码、有的在开会、有的在吃早餐。墙角放着饮水机和咖啡机,旁边是一个摆了各种零食的架子。</p>
249<p>你的工位在靠窗的位置。窗户外面能看到远处的国贸CBD,一片钢筋水泥森林在阳光下闪闪发光。</p>
250<p>桌上摆着一台崭新的MacBook Pro。旁边还有一盆多肉。</p>
251<p>"这盆多肉——"你指了指。</p>
252<p><span class="good">"哦,上周我帮你申请的。新同事嘛,得有点仪式感。"</span></p>
253<p>你放下背包,摸了摸那台电脑。金属外壳凉凉的,屏幕擦得一尘不染。你打开它。屏幕亮了,显示着macOS的初始化设置界面。</p>
254<p>从今天开始——</p>
255<p>你不再是那个在出租屋里刷招聘网站、对着天花板怀疑人生的应届生了。</p>
256<p>你有了一个工位、一台电脑、一张工牌——</p>
257<p>还有一个叫林悦的同事。</p>`,choices:[{t:'👉 前往第一章',next:'CHAPTER_COMPLETE',fx:{"exp":20,"hp":10}}]},
258 ch0_walk:{text:`<p>西二旗地铁站出口,人潮像开闸一样往外涌。你被裹挟在人流里,跟着那些和你差不多年纪的人一起往前走。</p>
259<p>路两边全是互联网公司的logo。网易、百度、快手、新浪。一栋楼挨着一栋楼,全是玻璃幕墙,反射着九月上午灰蓝色的天空。路上的人脚步都很快。有人在打电话、有人在喝咖啡、有人背着双肩包小跑着过马路。</p>
260<p>你混在他们中间。觉得自己好像也是这片风景的一部分了。但又不太是。</p>
261<p>你在一家便利店门口停了一下。透明的玻璃门里,能看到店员在整理关东煮。</p>`,choices:[{t:'🏪 进去买瓶水',next:'ch0_convenience'},{t:'🚶 直接去公司',next:'ch0_lobby'}]},
262 ch0_convenience:{text:`<p>你推开便利店的门。门上的铃铛叮当响了一声。</p>
263<p>冷气扑面而来。跟外面的闷热比起来,便利店里的空调凉得你胳膊一激灵。货架上的东西整整齐齐,灯光明亮到有点晃眼。</p>
264<p>你走到饮料区。冰柜的玻璃门上有水雾,擦开一道能看到里面。矿泉水、脉动、可乐、茶π。你伸手拿了一瓶农夫山泉,又放回去了。换成了一瓶冰红茶。甜的,补充糖分。</p>
265<p>收银台前面排了三个人。都是穿着格子衫或者T恤的年轻人,挂着工牌。一个在刷手机,两个在聊昨晚上线的事。</p>
266<p>"昨晚那个hotfix我搞到十二点才睡。"</p>
267<p>"正常,周四发版嘛。"</p>
268<p>你在后面听着。心里有一种说不上来的感觉。你也会变成他们中的一员吗?</p>
269<p>轮到你了。你扫码、付钱。走出便利店的时候,你拧开瓶盖喝了一口。冰凉的液体顺着喉咙滑下去,你深吸一口气。</p>`,choices:[{t:'🚶 走向公司大门',next:'ch0_lobby'}]},
270 ch0_result:{text:`<p>你从会议室里走出来。走廊还是那条走廊,灰色地毯还是灰色地毯,但感觉不一样了。像从另一个世界走回来。</p>
271<p>你低头看了看自己的手。刚才握着键盘打怪的那股触感还在指尖。不是真实的记忆,但它确实发生了。你甩了甩头,试图把这些念头甩出去。</p>
272<p>走廊尽头是一面落地窗。阳光透过玻璃洒进来,在地毯上切出一道明亮的区域。你走到窗户前面站了一会儿。</p>
273<p>楼下是西二旗的大街,车流不息。远处能看到一片正在施工的工地,吊塔缓缓转动。这座城市一直在长,你刚参加了一场面试。别的什么都不知道。</p>
274<p>你听见身后有人走动的脚步声。转过身,一个戴眼镜的小伙子端着一杯咖啡从茶水间走出来,看了你一眼,笑了笑:"面试的?"</p>
275<p>"嗯。"</p>
276<p>"加油啊。我们公司不错的。"他拍了拍你的肩膀就走了。对襟衬衫领口解开了一颗扣子,胸口的工牌晃了一下。银河科技。设计部。</p>
277<p>你看着你的背影,心里暖了一下。</p>`,choices:[{t:'😐 去等电梯',next:'ch0_low'}]},
278 ch0_street:{text:`<p>你从写字楼里走出来。阳光一下子打在脸上。跟大厅里的冷气比起来,外面的温度像一个巨大的拥抱。</p>
279<p>你站在大楼门口的台阶上,仰起头看了一眼那面灰色的玻璃幕墙。十五层。不知道林悦在哪一层。不知道老张的工位在哪个窗户后面。</p>
280<p>手机震了一下。是妈的消息。</p>
281<p>妈:<span class="info">"面完了吗?怎么样?"</span></p>
282<p>你打了一行字:"面完了,让等通知。"</p>
283<p>然后想了想,又加了一句:"感觉还行。一个面试官让我等通知,另一个同事说等通知说明有戏。"</p>
284<p>那边秒回:<span class="info">"那就好那就好!妈给你炖了排骨汤,回来热热就能吃。"</span></p>
285<p>你看着屏幕上那行字,笑了一下。天气很好。九月的北京,天蓝得不真实。有一朵云慢慢飘过十五楼的楼顶。你沿着路边走了一段路,风吹过来的时候,树叶沙沙响。</p>`,choices:[{t:'🏠 坐地铁回去',next:'ch0_wait',fx:{'hp':5}}]},
286 ch0_saturday:{text:`<p>周六早上,你醒来的时候,窗帘缝里透进来的光线是灰色的。</p>
287<p>你摸到手机看了时间。九点四十七。睡了很久,但不觉得精神好。脑袋晕沉沉的,像塞了一团湿棉花。</p>
288<p>你躺了一会儿。隔壁没在吵。可能出去了。安静得有点不习惯。</p>
289<p>起床之后他干了什么?自己也不太记得清了。洗了把脸,热了昨天剩的包子,就着白开水吃了两个。站在窗前往外看了一会儿——楼下的小巷里,一个老人在卖废纸箱,两个小孩在追一只橘猫。</p>
290<p>你试着打开电脑写点东西。写了三行注释:</p>
291<p class="mono">// TODO: 如果拿到offer——</p>
292<p class="mono">// TODO: 如果没有——</p>
293<p>光标停在那里。你没往下写。两个可能性在脑子里打架,堵住了所有思路。</p>
294<p>你合上电脑,决定打扫房间。</p>
295<p>六平米的空间没什么好打扫的。你把桌子擦了,把泡面桶扔了,把床单扯下来抖了抖,又把地上的书摞整齐。做完这些只花了十五分钟。</p>
296<p>然后他又不知道该干什么了。</p>`,choices:[{t:'📱 拿起手机刷了刷',next:'ch0_saturday2'}]},
297 ch0_saturday2:{text:`<p>你打开牛客网。看到有人在晒offer。字节跳动、快手、美团。你逐条点开看了看。底下评论区一片恭喜。又看到一条帖子:"秋招到现在零offer,是不是我太菜了"。</p>
298<p>你默默退出了。</p>
299<p>打开知乎。搜了一下「面试后等通知一般多久」。答案五花八门。有人说第二天就给offer了,有人说等了两周收到拒信,有人等了三天然后发现HR在出差。</p>
300<p>这些回答越看越焦虑。你又搜了一下银河科技。没多少信息,只有几篇老文章提到这家公司获得了A轮融资。其中有一句:"团队技术氛围浓厚,CTO曾在微软工作过八年。"</p>
301<p>你关上手机。拿起桌上那张打印出来的简历,看了看HR在背面写的几个字——字迹很潦草,只能辨认出「后端」「可」「试试」几个词。</p>
302<p class="sys">周六就这样过去了。</p>`,choices:[{t:'😴 周日了',next:'ch0_sunday'}]},
303 ch0_sunday:{text:`<p>周日上午。</p>
304<p>昨晚下了一场雨。窗帘缝里的光线跟昨天差不多,但空气里多了一股雨水冲刷过的味道。你推开窗户透气,楼下的柏油路面湿漉漉的,映着一小块天空的倒影。</p>
305<p>你站在窗口,感觉到风吹过脸上。</p>
306<p>手机一直很安静。</p>
307<p>你开始跟自己对话。在心里。</p>
308<p>——如果真的没通过呢?</p>
309<p>——那就继续投。</p>
310<p>——继续投就有用吗?</p>
311<p>——不知道。但不投肯定没用。</p>
312<p>——你确定今天他们会发通知吗?</p>
313<p>——不确定。</p>
314<p>你关上窗户。拿出那本翻熟了的《Java核心技术》。随便翻开一页,看到的是垃圾回收那一章。你读了两段就合上了。</p>
315<p>下午你出去了。在回龙观的大街上走了很久。路过一家兰州拉面,进去吃了一碗。面馆里电视在放综艺,几个工人在另一桌大声聊着工地的事。你埋头吃面,脑子里空空的。</p>
316<p>回到出租屋的时候,天色已经暗了。你开灯,坐下。把手机音量调到最大。放在桌上。</p>
317<p class="sys">等待。</p>`,choices:[{t:'📱 周一早上',next:'ch0_offer',fx:{'exp':3}}]},
318 ch0_mom_detail:{text:`<p>挂了电话之后,你在床沿上坐了很久。</p>
319<p>手机安静了不到三分钟,又响了。</p>
320<p>这次是妈打过来的。不是微信语音,是直接拨号。她一般不会直接打过来。她觉得电话费贵。</p>
321<p>"喂,妈。"</p>
322<p>"儿啊,妈刚才电话挂快了。你再给妈说说,那个公司叫什么来着?"</p>
323<p>"银河科技。银河的银,河水的河。"</p>
324<p>"做啥的?"</p>
325<p>"企业服务。就是帮别的公司做软件。"</p>
326<p>"那挺好那挺好。"她的声音里带着一种"其实我也不太懂但你说好就好"的热情,"多少钱一个月来着?"</p>
327<p>"八千。"</p>
328<p>"八千啊——"她拖了长音,"比老家强多了。你表姐在县医院上班,一个月才三千多。好好干,别给人丢脸。"</p>
329<p>"知道了妈。"</p>
330<p>"吃饭了吗?别老吃泡面,那东西没营养。"</p>
331<p>"知道了。"</p>
332<p>"你那边冷不冷?北京天凉得快,你把那件厚外套带上。"</p>
333<p>"还没到那时候呢。"</p>
334<p>"多带一件又不费事!"</p>
335<p>你听到电话那头她好像在翻什么东西。塑料袋窸窸窣窣的声音。</p>
336<p>"妈给你寄了点东西。腊肉、香肠、还有一包红枣。你泡水喝,补血。"</p>
337<p>"妈,不用——"</p>
338<p>"已经寄了!"</p>
339<p>你沉默了。不知道该说什么。胸口有什么东西堵着,酸酸的。</p>
340<p>"妈。"</p>
341<p>"嗯?"</p>
342<p>"谢谢你。"</p>
343<p>那边安静了一下。然后她用一种故作轻松的语气说:"谢什么,傻孩子。妈就盼着你好。"</p>`,choices:[{t:'❤️ 挂了电话,心里暖暖的',next:'ch0_wechat',fx:{'hp':10}}]},
344 ch0_evening_walk:{text:`<p>入职前一天的晚上。</p>
345<p>你躺在床上,怎么也睡不着。不是紧张。是一种说不清的兴奋。</p>
346<p>你翻了个身。手机亮了一下。林悦发了一条消息。</p>
347<p class="info">"明天记得带身份证,HR要复印件。"</p>
348<p>然后过了十秒又发了一条:<span class="info">"你穿什么颜色衣服?我怕到时候认错人。"</span></p>
349<p>你心跳了一下。回她:"白衬衫。黑色裤子。"</p>
350<p>她回了一个"OK"的手势。</p>
351<p>你捧着手机,看着聊天记录。从加好友到现在,你们没聊几句。但你发现自己在期待她再发点什么。</p>
352<p>等了五分钟。没动静。</p>
353<p>你放下手机。但还是睡不着。索性起来了。穿上拖鞋,走出隔断间,下了楼。</p>
354<p>九月底的北京夜晚已经有点凉了。小区里很安静。路灯照在地上,落叶被风吹着,在灯下来回打转。你穿着一件薄外套,在小区里慢慢走了一圈。</p>
355<p>走到小区门口。马路对面是一家24小时便利店,灯光白晃晃的。你在门口站了一会儿,没有进去。折返。</p>
356<p>回到出租屋。你坐在椅子上,把明天要带的东西又检查了一遍。身份证、毕业证复印件、简历(虽然可能用不上了)、笔记本、两支笔。</p>
357<p>然后你看了看背包。那个磨了边的双肩包。拉链头还别着回形针。</p>
358<p>你在心里说:没事,先干着。第一个月工资下来就换个新的。</p>
359<p>然后你关了灯。黑暗中,天花板上的水渍看不清了。但你知道它在那儿。</p>
360<p class="sys">明天,一切都会不一样。</p>`,choices:[{t:'🌅 起床!入职第一天',next:'ch0_morning'}]}
361 }
362 },
363 {
364 title: '第一章 · 入职第一天',
365 start: 'ch1_entry',
366 scenes: {
367 ch1_entry:{text:`<p>周一早上八点。你提前了半小时到公司楼下。</p><p>阳光很好,空气里有一层淡淡的秋天的味道。北京的初秋,干燥的、凉丝丝的,混着街边早点摊的油烟味。你在门口站了一会儿,摸了摸脖子上的工牌。照片拍得不太好看,但上面「段飞」两个字让你觉得不真实。</p><p>正准备推门。门从里面开了。</p><p>林悦走出来,手里端着一杯咖啡。看到你的时候她没意外,笑了一下:<span class="good">"早啊,正好。走吧。"</span></p><p>她把头发扎起来了,穿着一件白色卫衣。你注意到她换了一双新的帆布鞋。白色的,鞋带系得很整齐。</p><p>电梯里她按了十楼,转头看你:<span class="good">"今天有什么计划?"</span></p><p>"老张让我先装环境。"</p><p><span class="good">"哦。那你有的搞了。老张的装机清单出了名的长。"</span></p><p>电梯门开了。办公区比昨天面试时热闹得多。大部分工位都有人了。有人戴着耳机在打电话,有人靠在椅背上吃包子,有人趴在桌上补觉,显示器还亮着,屏幕上是一行没写完的SQL。墙上的电视在播早间新闻,音量调得很低,字幕在底下一行一行地滚。</p><p>你走到自己的工位前。靠窗,能看到远处的国贸。桌上摆着一台崭新的MacBook Pro,旁边还有一盆多肉。你放下背包,打开电脑。屏幕亮了,macOS的壁纸是一片渐变色的沙漠。</p><p>手机震了一下。老张的消息。</p><p class="mono">"来一下我工位。拿装机清单。"</p>`,choices:[{t:'💪 去找老张',next:'ch1_env'},{t:'☕ 先缓一缓',next:'ch1_morning'},{t:'⚔️ 消灭这个Bug!',next:'__FIGHT__',fx:{"exp":7}}]},
368 ch1_entry_ride:{text:`<p>电梯门在你面前缓缓合上。轿厢里只有你一个人。</p>
369<p>不锈钢壁面映出你的影子——白衬衫,黑色双肩包,表情有点僵。你伸手把领口的扣子解开了一颗。又扣上了。又解开了。最后还是扣上了。</p>
370<p>电梯里的广告位贴着一张海报——「银河科技 · 让数据流动起来」。一个蓝色的星系图案,中心有一颗发光的星星。你盯着它看了几秒钟。</p>
371<p>楼层数字一格一格跳。你感觉自己的心跳也在跟着跳。六、七、八。快到了。</p>
372<p>你深吸一口气。把包从双肩换到单手提着。站直了一点。</p>`,choices:[{t:'🚪 电梯门开了',next:'ch1_entry'}]},
373 ch1_morning_arrive:{text:`<p>你推开公司楼下的玻璃门。一阵冷气迎面扑来,跟外面秋天的温度差了至少十度。大厅里的中央空调开得很足,白色的地砖擦得能照出人影来。</p>
374<p>前台还没人,灯已经亮了。你站在大厅中间,左右看了看。左边是电梯间,右边是楼梯间,墙上贴着一块「企业荣誉墙」——几块奖牌整齐地排成一排:「最佳企业服务商·2023」「高新技术企业认证」。最下面那块是新挂上去的,连保护膜都没撕。</p>
375<p>你听到身后传来脚步声。保洁阿姨推着清洁车走出来,看了你一眼:「这么早啊?公司还没人呢。」</p>
376<p>「我……今天入职。」你有点不好意思。</p>
377<p>阿姨笑了一下:「新同事啊!加油啊小伙子!」她推着车走了,轮子在地上发出咕噜咕噜的声音。</p>`,choices:[{t:'📱 在微信上跟HR说一声',next:'ch1_morning_hr_msg'},{t:'☕ 先去买杯咖啡',next:'ch1_morning_coffee'}]},
378 ch1_morning_hr_msg:{text:`<p>你掏出手机,在入职群里发了一条消息:</p>
379<p class="mono">「大家好,我是段飞,今天入职。已经到了。」</p>
380<p>发出去之后,群里安静了大概十秒。你盯着屏幕,感觉自己是不是说错了什么。</p>
381<p>然后群里炸了。</p>
382<p>王宇:<span class="info">「欢迎新人!🎉」</span></p>
383<p>小陈:<span class="info">「欢迎!到几楼了?」</span></p>
384<p>林悦:<span class="info">「到了呀?等我一下,我下来接你 👋」</span></p>
385<p>你愣了一下。这么快就有人回复了。而且——林悦要下来接你?</p>
386<p>你攥着手机,站在大厅里,嘴角不自觉地翘了起来。</p>`,choices:[{t:'⏳ 等她下来',next:'ch1_morning_wait'}]},
387 ch1_morning_coffee:{text:`<p>你决定先买杯咖啡。公司楼下有一家瑞幸,柜台后面一个小姑娘正在擦咖啡机。</p>
388<p>你看了看菜单。拿铁28、美式22、澳白32。你犹豫了一下,点了一杯最便宜的美式。</p>
389<p>「冰的还是热的?」</p>
390<p>「……热的。」九月底的北京,喝热的也不算早。</p>
391<p>等咖啡的时候,你看到旁边的展示柜里摆着几款三明治和面包。价格都不便宜。你摸了摸口袋,还是没买。</p>
392<p>咖啡好了。你端起来喝了一口。有点苦。但热乎乎的,握在手里感觉很踏实。</p>`,choices:[{t:'☕ 端着咖啡回大厅',next:'ch1_morning_wait'}]},
393 ch1_morning_wait:{text:`<p>你站在大厅里等了一会儿。手中的咖啡杯壁传来温热的触感。</p>
394<p>早上八点四十。陆续有人开始进楼了。穿着格子衫的年轻人、踩着高跟鞋的职业女性、背着大包的快递员。电梯口开始排起了小队。有人手里拿着煎饼果子,有人一边走一边回消息。北京的工作日早晨,每个人都在赶时间。</p>
395<p>你看着他们,心里想着:再过一个月,你也会变成他们中的一个。刷卡、上楼、开电脑、写代码。会有自己的节奏。不会再站在大厅里等别人来接。</p>
396<p>电梯叮了一声。是下来的那台。</p>`,choices:[{t:'👀 看电梯门打开',next:'ch1_morning_meet'}]},
397 ch1_morning_meet:{text:`<p>电梯门打开。林悦从里面走出来。</p>
398<p>她今天扎了个低马尾,穿着一件白色的连帽卫衣。看到你的时候她笑了一下——不是那种太用力的笑,是刚起床不久的人脸上那种轻松的笑:</p>
399<p><span class="good">「早!这么准时。走吧,带你上去。」</span></p>
400<p>她手里端着一杯咖啡,杯沿上沾了一点口红印。你假装没看到。</p>
401<p>她转身的时候马尾辫扫了一下,你跟在后面进了电梯。电梯里有一股淡淡的洗衣液味道,跟她上次在他身边经过时闻到的一样。</p>`,choices:[{t:'🚪 跟她进电梯',next:'ch1_entry'}]},
402 ch1_reception:{text:`<p>前台姑娘是个二十出头的女孩,戴着细框眼镜,面前放着两杯奶茶。</p>
403<p>「你好,今天入职的。」你尽量让自己的声音听起来平静一点。</p>
404<p>她抬起头,上下打量了你一下:「段飞是吧?稍等,我联系HR。」她拿起座机拨了个号码,对着话筒说了几句。</p>
405<p>然后她挂掉电话,对你说:「HR马上下来。你先坐一下。」</p>
406<p>你在旁边的沙发上坐下来。沙发是灰色的布艺沙发,坐垫有点塌了。面前的茶几上放着一本翻得很旧的《程序员》杂志,封面是某个大厂的CTO访谈。你拿起来翻了翻,一个字都没看进去。</p>`,choices:[{t:'📱 刷了刷手机',next:'ch1_reception_phone'},{t:'👀 观察前台的小姑娘',next:'ch1_reception_girl'}]},
407 ch1_reception_phone:{text:`<p>你掏出手机,打开知乎,刷了刷首页推荐。「如何度过入职第一天」——你点进去扫了一眼。高赞回答的第一条是:「不要迟到,不要早退,不要在第一周就暴露实力。」你笑了一下。锁屏。</p>
408<p>又打开了微信。妈早上六点发了一条消息:<span class="info">「儿子,今天第一天上班。妈给你求的平安符带了吗?」</span></p>
409<p>你摸了摸背包侧袋。那个叠成三角形的黄纸片确实在里面,用一个小塑料袋装着。你出门的时候犹豫了一下,还是塞进去了。</p>
410<p>你回了一条:「带了。妈放心。」</p>
411<p>放下手机。感觉心里安定了一些。</p>`,choices:[{t:'🚶 HR来了',next:'ch1_checkin'}]},
412 ch1_reception_girl:{text:`<p>前台姑娘接了几个电话,处理了几件事。有人来拿快递,她核实了一下签收;有人问会议室预订,她帮忙查了电脑;一个穿西装的男人过来拿了一份文件,她笑着叫了声「刘总」。</p>
413<p>你看着她熟练地处理这些事情,心里想:她在这里应该工作了一段时间了。她看起来年纪跟你差不多大,但那种从容是你现在还没有的。</p>
414<p>她忙完了,看到你在看她,笑了一下:「你是不是在想——我什么时候才能像她一样熟练?」</p>
415<p>你被说中了心思,有点尴尬地笑了:「……差不多。」</p>
416<p>「没事。第一天都这样。过两周你就习惯了。」</p>`,choices:[{t:'😅 点点头',next:'ch1_checkin'}]},
417 ch1_hr_walk:{text:`<p>HR小林是个戴眼镜的年轻女人,穿着职业装,说话速度不快但很清晰。</p>
418<p>「跟我来吧。」她带你穿过闸机,走进电梯。</p>
419<p>电梯里她问你:「你是应届生?」</p>
420<p>「嗯,今年毕业的。」</p>
421<p>「哪个学校?」</p>
422<p>你说了一个二本的名字。她没什么特别的反应:「挺好的。技术团队里应届生不少,你不会有压力的。」</p>
423<p>电梯到了。门打开的时候,你看到了办公区——开放式的工位密密麻麻排列着,大部分已经有人了。键盘声此起彼伏,混杂着打电话的声音和偶尔的笑声。</p>
424<p>真实感一下子涌了上来。你不是来参观的。你真的要在这些工位中的某一个坐下,开始你的职业生涯。</p>`,choices:[{t:'👣 跟在HR后面',next:'ch1_checkin'}]},
425 ch1_desk_setup:{text:`<p>你走到自己的工位前。靠窗的位置,能看到远处的国贸三期。</p>
426<p>桌上摆着一台崭新的戴尔显示器,旁边是键盘鼠标。主机箱放在桌下的架子上,指示灯一闪一闪的。椅子上贴了一张便利贴——手写着「新同事座」三个字,字迹有点歪。</p>
427<p>你放下包,在椅子上坐下来。转椅比你想的舒服。你转了一圈,又转了一圈。然后觉得这种行为好像不太成熟,就停下来了。</p>
428<p>打开抽屉。空的。干净的。什么东西都没有。像一个等着被填满的空间。</p>
429<p>你把包里的东西拿出来放在桌上——水杯、笔记本、两支笔。又从包里摸出那个平安符,看了两秒,放回了包里。</p>
430<p>手机亮了。HR小林的消息:<span class="info">「电脑在桌面右下角贴了密码,打开先改密码。有任何问题找我。」</span></p>`,choices:[{t:'💻 打开电脑',next:'ch1_mentor'}]},
431 ch1_first_look:{text:`<p>你坐在工位上,环顾了一下四周。</p>
432<p>左边隔了一个空位,坐着一个戴耳机的大哥。屏幕上是一个终端窗口,黑色的背景上滚动着绿色的字符。你打字的速度很快,手指在机械键盘上跳跃,发出噼里啪啦的声音。</p>
433<p>右边是一个女生,正在看设计稿。显示器旁边贴满了一排便利贴,上面写着各种颜色标记的待办事项。</p>
434<p>斜对面坐着一个瘦高的男生,面前摆了两个显示器,一个在跑测试,一个在写文档。</p>
435<p>你突然想到——几个月前你还在六平米的隔断间里,对着天花板怀疑人生。而现在,你坐在了办公室里。你的左右,都是跟你做一样事情的人。你不是一个人在战斗了。</p>`,choices:[{t:'🙂 打开电脑',next:'ch1_mentor'}]},
436 ch1_mentor_tour:{text:`<p>老张站起来。你比你想象中高一点。</p>
437<p>「走。带你认认人。」他迈开步子,你赶紧跟上。</p>
438<p>后端组。老刘,四十出头,秃顶,穿着老年款的格子衫。看到你笑了一下:「新来的?好好干。老张带人很严的。」你点头。</p>
439<p>前端组。王宇,跟你差不多大,戴一副圆框眼镜,笑起来很憨。你主动跟你握手:「你好你好!以后接口联调多关照!」你握回去:「互相学习。」</p>
440<p>测试组。小陈,唯一的女生看起来最年轻。她正在看一个Bug报告,头也没抬:「等会儿加个微信,有问题我直接找你。」</p>
441<p>产品部。Tony从会议室探出头来:「新同学?欢迎!晚上有空吗?产品需求先跟你对对——」老张回头瞪了他一眼:「让你先搭环境。」Tony缩回去了。</p>
442<p>一圈走下来,你记住了大概五个人的名字和脸。但你知道,过两天你就分不清谁是谁了。</p>`,choices:[{t:'🔄 回到工位',next:'ch1_setup'}]},
443 ch1_meet_linyue_again:{text:`<p>正跟着老张往回走。林悦端着杯子从茶水间走出来。</p>
444<p>看到你,她愣了一下,然后笑了:<span class="good">「你又来了。」</span></p>
445<p>「对。我又来了。」</p>
446<p>老张看了看你们两个:「你们认识?」</p>
447<p>「面试的时候在电梯里碰到的。」林悦说。</p>
448<p>「行。那她我就不介绍了。前台交给你。」老张说完就走了。</p>
449<p>林悦靠在茶水间的门框上,喝了一口水:<span class="good">「环境搭了吗?」</span></p>
450<p>「还没。正准备。」</p>
451<p><span class="good">「那你有的搞了。老张的装机清单我至今记忆犹新。安了一天。」</span></p>
452<p>你忍不住笑了:「这么夸张?」</p>
453<p><span class="good">「一点都不夸张。我那时候装Docker装了三个小时。」</span>她放下杯子,<span class="good">「有任何问题找我。我坐那边。」</span>她朝一个方向指了指。你顺着看过去,记住了她的工位位置——窗边第三排,桌上放着一盆多肉。</p>`,choices:[{t:'💪 回到工位开始搭环境',next:'ch1_setup'}]},
454 ch1_first_git:{text:`<p>你打开终端。敲下第一行命令:</p>
455<p class="mono">git clone git@gitlab.银河科技.com:backend/old-php-project.git</p>
456<p>进度条开始跑。百分之三、百分之十二、百分之三十七。你盯着屏幕上的数字变化。每一格百分比的跳动,都像是在说——你在一步一步靠近真实的工作。</p>
457<p>克隆完成的那一刻,终端显示了一行:</p>
458<p class="mono">Receiving objects: 100% (8472/8472), 128.34 MiB | 5.21 MiB/s, done.</p>
459<p>一百多兆。这还只是代码。你只是看了一眼那个数字,就觉得这个项目的分量。</p>
460<p>你打开项目文件夹,看了看目录结构。controller、service、dao、model、config。标准的Java分层架构。跟你大学课设的结构差不多,但是大了几百倍。</p>`,choices:[{t:'📂 打开项目看看',next:'ch1_code'}]},
461 ch1_first_build:{text:`<p>你用IDEA打开了项目。IDE开始索引。进度条慢悠悠地走,像北京早高峰的地铁。</p>
462<p>你趁这个时间看了几行代码。controller层的类名虽然不标准,但能看出来意图。UserController、OrderController、ReportController。看到第三十个Controller的时候,你开始意识到这个系统有多大了。</p>
463<p>Maven在后台下载依赖。pom.xml里有七十多个依赖项。看着那些坐标——spring-boot-starter-web、mybatis-plus、mysql-connector-java——你有一种熟悉又陌生的感觉。这些名字你在课本上见过,但它们是第一次以真实的面貌出现在你的屏幕上。</p>
464<p>你第一次觉得,从理论到实践的这一步,跨得比想象中大。</p>`,choices:[{t:'⏳ 等依赖下载完',next:'ch1_build_try',fx:{'skill':'coding'}}]},
465 ch1_build_try:{text:`<p>依赖下载完了。你点了Build按钮。</p>
466<p>IDEA开始编译。绿色的进度条在底部跑。你的目光一直跟着它。</p>
467<p>十秒。二十秒。</p>
468<p class="bad">BUILD FAILED</p>
469<p>你心里一紧。点开控制台。红色的报错信息映入眼帘。</p>
470<p>你深吸一口气。你不是第一次遇到编译失败了。但这是你工作之后第一次遇到。你告诉自己——冷静。看错误信息。</p>
471<p>错误指向一个不存在的类。原来是某个依赖的版本对不上。你打开pom.xml,找到了那个依赖项。版本号写的是1.2.3,但你发现项目里用的一个内部库需要的是1.3.0。</p>
472<p>你改了版本号。重新编译。</p>
473<p class="good">BUILD SUCCESS</p>
474<p>你往后靠在椅背上。笑了笑。</p>`,choices:[{t:'👍 继续配数据库',next:'ch1_db_setup'}]},
475 ch1_db_setup:{text:`<p>接下来是数据库。</p>
476<p>你在本地装了一个MySQL 8.0。照着配置手册一步步来。建库、建用户、赋权限——</p>
477<p class="mono">CREATE DATABASE galaxy_crm;<br>CREATE USER 'dev'@'localhost' IDENTIFIED BY 'dev123456';<br>GRANT ALL PRIVILEGES ON galaxy_crm.* TO 'dev'@'localhost';</p>
478<p>你手敲完这三行SQL。回车。Query OK。你看着终端里那行绿色的提示,有了那么一点踏实的感觉。</p>
479<p>然后你发现一件事。你给数据库设的密码是「dev123456」。你挠了挠头。这大概不是一个好的安全实践。</p>
480<p>算了。本地开发环境。先用着。你在备忘录里加了一行——「上线之前改密码」。</p>`,choices:[{t:'🏗️ 改application.yml配置',next:'ch1_env'}]},
481 ch1_env_docker_struggle:{text:`<p>Docker装不上的时候,你盯着屏幕上那行红色的报错,脑子和屏幕一样空白。</p>
482<p>你又从头查了一遍。PATH变量加了,Docker Desktop重启了,电脑也重启了。没用。</p>
483<p>你靠在椅背上。旁边的键盘声噼里啪啦的。那个戴耳机的大哥打字像飞一样。你不好意思打扰他。</p>
484<p>你在网上搜了一圈。StackOverflow上有人跟你遇到了同样的问题。下面的回答列了五种方法。你从第一种开始试。全试完了,没有一个有用的。</p>
485<p>你又搜了一遍中文结果。百度上有人说是Hyper-V的问题,有人说是WSL2的兼容性问题。你试了一下打开Hyper-V——然后电脑蓝屏了。</p>
486<p>你整个人靠在椅背上,盯着天花板。</p>`,choices:[{t:'😅 找林悦帮忙',next:'ch1_env_help'},{t:'🤔 再试一次',next:'ch1_env_fail'}]},
487 ch1_env_lesson:{text:`<p>林悦帮完你的忙,走回了她自己的工位。</p>
488<p>你看着终端里正常的<code>docker ps</code>输出——没有报错,只有干净的表格。CONTAINER ID、IMAGE、STATUS。一切正常。</p>
489<p>你打开备忘录,把刚才的解决方法写了下来:</p>
490<p class="mono">export PATH=\$PATH:/usr/local/bin/docker</p>
491<p>你不知道以后还会不会遇到这个问题,但你决定把它记下来。如果遇到了,你不需要再花两个小时百度了。</p>
492<p>然后你又在下面加了一行:</p>
493<p class="mono">遇到不会的问题,超过15分钟解决不了就去问人。——林悦语录</p>`,choices:[{t:'📝 继续装剩下的',next:'ch1_rest'}]},
494 ch1_code_shock:{text:`<p>你把U盘里的项目打开。一个PHP项目。你深吸了一口气,开始浏览。</p>
495<p>第一眼。index.php。两千行。没有函数,没有类,全是自上而下的if-else。你看了二十分钟,终于搞清楚了它的大致逻辑——一个用户信息展示页面。</p>
496<p>第二眼。有一个叫functions.php的文件。打开一看,里面塞了三十多个完全不相关的函数。从数据库查询到字符串处理到发送邮件。你翻了半天才找到一个叫getUserById的函数。</p>
497<p>你看了看那个函数的实现——它直接用<code>mysql_query</code>拼接了用户输入。连个转义都没有。</p>
498<p>你闭上了眼睛。</p>
499<p>你在学校写过课设。你知道课设代码可以不那么好看。但你从没见过这样的代码。不是难看的问题——它像一个活了十年、没被人好好照顾过的老房子,到处是裂缝和漏水的痕迹。</p>`,choices:[{t:'😱 继续往下看',next:'ch1_code'}]},
500 ch1_code_detail:{text:`<p>你继续翻项目,手指在文件列表里一个一个点开。</p>
501<p>有一个文件叫「备份-20220901.sql」。你看了看里面的内容——建表语句。你注意到字段名拼写错了两个:<code>user_name</code>写成了<code>usre_name</code>,<code>create_time</code>写成了<code>creat_time</code>。</p>
502<p>你又翻到了一个叫util.php的文件。打开一看,里面全是封装好的工具函数。写的人明显知道怎么写好代码——函数拆得合理,命名规范,有注释。但这个文件没有任何人在用。它像一本被遗忘在图书馆角落的书。</p>
503<p>你觉得你看到了银河科技的另一面。面试的时候,你们跟你聊微服务、聊敏捷开发、聊DevOps。但真正的代码库,是一头已经在泥潭里打滚了好几年的老水牛。</p>
504<p>老张没跟你说的那句话,你自己领悟到了:所谓的工作,就是从这头水牛身上一点一点把泥洗干净。</p>`,choices:[{t:'🍜 先吃饭',next:'ch1_lunch'}]},
505 ch1_lunch_walk:{text:`<p>电梯在一楼停下。你跟着林悦走出大楼。</p>
506<p>秋天的阳光打在脸上,暖洋洋的。街上的人很多。有穿着西装的销售在打电话,有外卖员骑着电动车在人流里穿来穿去,有几个跟你差不多年纪的人蹲在路边抽烟。</p>
507<p>「这边。」林悦朝右拐。你跟在后面。</p>
508<p>穿过一条巷子。巷子深处有一家面馆,门面不大,招牌上写着「老北京炸酱面馆」六个字,字体是手写的,有点褪色了。</p>
509<p>她推开门。门上的风铃叮当响了一声。里面大概有七八张桌子,已经坐了好几桌了。</p>
510<p>「老板,两碗面!」她朝着厨房喊了一声。</p>
511<p>「好嘞!」里面传来一个厚实的声音。</p>`,choices:[{t:'🍜 坐下来等面',next:'ch1_lunch'}]},
512 ch1_lunch_chat:{text:`<p>等面的时候,你们面对面坐着。</p>
513<p>阳光透过窗户照进来,斜斜地打在桌面上。你能看到她手边玻璃杯里的水在发光。她今天涂了淡色的口红。你发现你盯着她看了有点久,赶紧移开目光。</p>
514<p>「你平时下班都干嘛?」她先开口了。</p>
515<p>「呃……看看书。刷刷视频。你呢?」</p>
516<p>「我?写写自己的小项目。最近在做一个记账的微信小程序。」</p>
517<p>「自己做?」你有点惊讶。</p>
518<p>「嗯。前端后端都是自己搞。练手嘛。」她说得很随意。你心里却在想——她居然下班了还在写代码。</p>
519<p>面上来了。热气腾腾的。她拿起筷子搅了搅,抬头看了你一眼:<span class="good">「快吃。下午还有得忙呢。」</span></p>`,choices:[{t:'😋 埋头吃面',next:'ch1_lunch'}]},
520 ch1_lunch_back:{text:`<p>吃完饭,你们往回走。</p>
521<p>林悦走得不快,你也就放慢了步子。路上她指着一栋楼说:「那是快手的楼,我朋友在里面上班。」又指了另一栋:「那是百度,我从来没进去过。」</p>
522<p>「你没投过百度吗?」你问。</p>
523<p>她笑了笑:<span class="good">「投过。挂了。二面面的算法,没写出来。」</span>她说这话的时候没什么负面情绪,就像在说一件早就过去的事情。</p>
524<p>你突然觉得。她的这种状态,挺让人羡慕的。</p>
525<p>回到公司楼下。她掏出工牌刷了一下闸机,回头看你:<span class="good">「你工牌还没发吧?」</span></p>
526<p>「还没。」</p>
527<p><span class="good">「那你先跟我进吧。」</span>她侧身让你过去。你从她身边经过的时候,又能闻到那股干净的洗衣液味道。</p>`,choices:[{t:'🚶 回工位',next:'ch1_rest'}]},
528 ch1_meeting_prep:{text:`<p>下午两点。会议室已经有人在里面了。</p>
529<p>你走进门。椭圆形的会议桌,老张已经到了,坐在斜对面。你的杯子放在面前,里面泡着一杯看起来泡了很久的茶,茶叶沉在杯底,水已经不怎么冒热气了。</p>
530<p>你选了一个靠门的位置坐下,把笔记本和笔摆在面前。</p>
531<p>其他人陆续走进来。一个戴圆框眼镜的女生——小陈。她抱着一个笔记本电脑,坐下来就噼里啪啦开始打字。然后是Tony——瘦高个、穿着公司T恤、拿着一个iPad。你进来的时候冲你点了点头:「新人啊?欢迎欢迎。」</p>
532<p>最后进来的是王姐。短发、干练、不苟言笑。她一坐下,所有人都坐直了。你也不自觉地挺了挺腰。</p>`,choices:[{t:'📋 会议开始',next:'ch1_meeting'}]},
533 ch1_meeting_details:{text:`<p>Tony打开原型图开始讲需求。</p>
534<p>你一边听一边在笔记本上记。用户反馈模块分三块:提交反馈、管理后台、数据统计。你记下了几个关键点:</p>
535<p>1. 反馈类型:Bug、建议、投诉</p>
536<p>2. 需要图片上传功能</p>
537<p>3. 后台按状态过滤(待处理/处理中/已完成)</p>
538<p>你写完这几个要点,抬头看了看王姐。她正在听Tony讲,表情没什么变化。你不知道她是满意还是不满意。</p>
539<p>「这个功能三天能搞定吧?」Tony转头看了看你。</p>
540<p>你正要开口。老张先说了一句:<span class="info">「让你先看看代码库。再说排期。」</span></p>
541<p>Tony耸了耸肩:「行。明天给个排期就行。」</p>
542<p>王姐开口了:<span class="info">「段飞。这个功能你来干。老张兜底。」</span></p>
543<p>你的心一下子就提起来了。独立负责一个功能?第一周?</p>`,choices:[{t:'😰 接!',next:'ch1_coding_start'},{t:'💪 一定完成任务',next:'ch1_coding_start'}]},
544 ch1_meeting_after:{text:`<p>会议结束后,你走回自己的工位。</p>
545<p>你坐下来,打开了一个空白文本文件。你在文件里写下了用户反馈系统的功能拆解:</p>
546<p>1. 建表:feedback表(id、user_id、type、content、image_url、status、create_time、update_time)</p>
547<p>2. 后端API:POST /api/feedback(提交)、GET /api/feedback/list(管理后台)</p>
548<p>3. 前端:用户提交表单 + 后台管理页面</p>
549<p>你盯着这份拆解看了五遍。觉得没什么遗漏了。然后你开始写第一行代码。</p>
550<p>这时候你才意识到——这真的是你的代码。不是课设,不是练习。是要跑在服务器上、被客户用的代码。</p>
551<p>你的手停在键盘上方。吸气。呼气。敲下第一个字符。</p>`,choices:[{t:'⌨️ 开始写代码',next:'ch1_coding_start',fx:{'skill':'coding'}}]},
552 ch1_first_query:{text:`<p>你打开Navicat,连上了开发数据库。</p>
553<p>信息量很大的一张表。几十个字段,几千条已经存在的数据。你翻了翻,看到了各种用户信息——公司名、联系人、手机号、邮箱。你突然意识到,这些不是假数据。这是真实的客户数据。</p>
554<p>你收回鼠标,只敢SELECT了几个字段。心里有一种说不清的敬畏感。</p>
555<p>你开始写反馈系统的建表语句。CREATE TABLE、字段类型、索引、默认值。每一步你都做得很认真。因为你知道,这张表会存在很久。</p>
556<p class="mono">CREATE TABLE user_feedback (<br> id BIGINT AUTO_INCREMENT PRIMARY KEY,<br> user_id BIGINT NOT NULL,<br> type TINYINT COMMENT '1=bug 2=suggestion 3=complaint',<br> content TEXT NOT NULL,<br> status TINYINT DEFAULT 0 COMMENT '0=pending 1=processing 2=done',<br> create_time DATETIME DEFAULT CURRENT_TIMESTAMP<br>);</p>
557<p>建好了。你看着那张空表,心里有一种很踏实的感觉。</p>`,choices:[{t:'📝 写API',next:'ch1_coding_start'}]},
558 ch1_code_review_wait:{text:`<p>你把代码发给了老张。然后开始了最煎熬的阶段——等Review结果。</p>
559<p>你坐在工位上,想写点别的代码,但一个字都写不进去。每隔两分钟就切到老张的聊天窗口看一眼。你没回。</p>
560<p>你打开网页随便刷了刷。又关上。拿起水杯喝了一口。水是凉的。你去茶水间接了一杯热水。回来的时候又看一眼消息。还没回。</p>
561<p>你开始自我怀疑。是不是代码写得太烂了他不知道该从哪开始批?是不是你看了前面几行就关掉了?是不是——</p>
562<p>老张的消息终于来了。就两个字:<span class="mono">「过来。」</span></p>
563<p>你心跳加速了一下。拿起笔记本。走了过去。</p>`,choices:[{t:'😰 去老张工位',next:'ch1_review'}]},
564 ch1_first_deploy:{text:`<p>站在上线按钮面前。</p>
565<p>你握着鼠标。光标悬停在那个蓝色按钮上方。你感觉手心在出汗。鼠标有点滑。</p>
566<p>你深呼吸了一下。</p>
567<p>后端代码测试通过了。前端联调也通过了。所有checklist都打勾了。</p>
568<p>但你还是在犹豫。</p>
569<p>旁边工位的王宇探过头来看了看:「还没点?」</p>
570<p>「……快了。」</p>
571<p>「第一个功能上线都这样。我第一次点了之后闭了十秒眼睛。」</p>
572<p>你也笑了。</p>
573<p>你点了下去。</p>`,choices:[{t:'🚀 部署!',next:'ch1_launch'}]},
574 ch1_after_fight:{text:`<p>你三下五除二就把那只Bug干掉了。毕竟是在公司门口遇到的第一只,没什么难度。</p><p>你拍了拍手,心情舒畅。林悦端着咖啡在电梯口转过头来:<span class="good">"走吧,还在那愣着干嘛?老张等着呢。"</span></p><p>你赶紧跟了上去。</p>`,choices:[{t:'💪 去找老张拿装机清单',next:'ch1_env'}]},
575 ch1_env:{text:`<p>老张的工位在办公区最里面。靠墙,背对所有人。两台显示器,一台横一台竖。键盘是一把看起来很旧的机械键盘,键帽上的字母都快磨没了,空格键泛着油润的光。</p><p>他从抽屉里抽出一张A4纸递过来。上面手写着一串命令和链接。老张的字不太好看,但一笔一划很清楚:Git、Node.js 18、Python 3.11、Docker Desktop、Homebrew、VS Code、Postman、iTerm2。</p><p>"装完了叫我。"说完他就转回去继续敲代码了。没有多余的字,甚至没有多看你一眼。</p><p>你拿着那张纸回到工位。你坐下来,把A4纸贴在显示器边上,开始干活。</p><p>前面几个装得很顺。Git几分钟搞定,Node.js一路Next,VS Code装好了插件。一切都在轨道上。你甚至觉得有点轻松。</p><p>然后装Docker。</p><p>Docker Desktop下载、安装、进度条走完。一切正常。你打开终端,敲了<code>docker ps</code>。</p><p class="bad">Cannot connect to the Docker daemon.</p><p>你愣一下,百度,改环境变量。没用。换一种方法。还是没用。再换一种。报错变成了一串新的红色文字。</p><p>你靠在椅背上,盯着屏幕上那行红色的字。感觉自己像一个刚上路就爆了胎的司机。你甚至还没开始开。</p>`,choices:[{t:'🤔 自己再研究一下',next:'ch1_env_fail'},{t:'🙋 找人帮忙',next:'ch1_env_help'}]},
576 ch1_env_fail:{text:`<p>你又折腾了半个小时。</p><p>卸载重装。重启。改PATH。改Docker设置。你试了能想到的所有办法。那个报错像烙在屏幕上一样,每一次打开终端,它都稳稳地等在那里。</p><p>你靠在椅背上。旁边的工位传来急促的键盘声。那个戴耳机的大哥正在写什么,手指像机关枪一样敲着。你不好意思打扰。</p><p>你盯着屏幕,发了几秒钟的呆。</p><p>"还没搞定?"</p><p>你转过头。林悦端着一杯水站在你身后。</p>`,choices:[{t:'😅 "卡在Docker了……"',next:'ch1_env_help2',fx:{"exp":3}}]},
577 ch1_env_help:{text:`<p>你抱着电脑站起来。刚转过身,差点撞上一个人。</p><p>林悦不知道什么时候站在你身后,手里端着一杯水。</p><p>"怎么了?一脸生无可恋的表情。"</p><p>"Docker装不上……环境变量的问题。"</p><p>她把水杯放在他桌上:<span class="good">"我看看。"</span></p>`,choices:[{t:'📱 给她看屏幕',next:'ch1_env_help2'}]},
578 ch1_env_help2:{text:`<p>林悦凑过来看你的屏幕。</p><p>很近。近到你能闻到她身上淡淡的洗衣液的味道。跟第一次在电梯里闻到的一样。不是香水味,就是那种干净的、被阳光晒过的味道。她的发梢扫过你的手臂,痒了一下。</p><p>她看了一眼终端里的报错,眉头轻轻皱了一下:<span class="good">"哦。这个啊。PATH没配对。"</span></p><p>她俯下身。手指在你的键盘上敲了几行——</p><p class="mono">export PATH=$PATH:/usr/local/bin/docker</p><p>她的手指很白。敲键盘的动作很轻很快,像早就知道答案。</p><p>"再试一下。"</p><p>你敲了<code>docker ps</code>。没有报错了。Docker活了。</p><p>"好了。谢谢……"你说。声音不太自然。因为她离他很近。近到你余光里能看到她耳垂上那枚小小的银色耳钉。</p><p>她直起身来,笑了一下:<span class="good">"不客气。下次遇到问题直接问,别自己死磕。公司不流行个人英雄主义。"</span></p><p>她端起水杯走了。你看着她的背影。觉得刚才那几分钟里,自己好像什么都没学进去。</p>`,choices:[{t:'📝 继续装剩下的环境',next:'ch1_rest',fx:{"exp":10,"mp":5}}]},
579 ch1_rest:{text:`<p>剩下的环境装得很顺。Python、Homebrew、Postman、iTerm2。一路绿灯。中间遇到一个小问题,你拿起手机给林悦发了条消息。她当时在调试一个CSS动画,看到消息后秒回了一个解决方案。</p><p>你放下手机想。有这样一个同事,好像还挺好的。</p><p>全部装完已经快中午了。你给老张发消息:<span class="mono">"张哥,环境装好了。"</span></p><p>不到五分钟老张就过来了。你弯腰看了看终端,敲了几个命令检查版本,点了点头。</p><p><span class="good">"嗯。比我预想的快。给你个项目看看。"</span></p><p>他从口袋里掏出一个U盘放到桌上。就是面试那天他见过的那个。银色,尾部系了一根黑色的挂绳。</p><p><span class="info">"里面是项目代码。你先看看熟悉一下。下午有个会,你一起来。"</span></p>`,choices:[{t:'📂 打开项目代码',next:'ch1_code',fx:{"exp":15}}]},
580 ch1_code:{text:`<p>你插上U盘,打开项目文件夹。</p><p>愣住了。</p><p>controller、model、view全混在一起,文件名一半英文一半拼音,注释几乎为零。你随手点开一个文件——</p><p class="mono">$sb = 2;<br>$result = mysql_query("SELECT * FROM users WHERE id=" . $_GET['id']);<br>// TODO: 优化</p><p>你差点把水喷在屏幕上。</p><p>没有ORM,没有防注入,变量名是拼音缩写。你看了两秒才反应过来——「sb」是「上报」。一个SQL查询赤裸裸地拼接了用户输入。教科书级别的反面教材。</p><p>你又打开另一个。一千多行,没有拆分没有注释。if和else嵌套六层,缩进像倒金字塔。读到第四层的时候你已经跟丢逻辑了。</p><p>你终于懂了老张那句话的意思。</p><p>这个项目不是给你写的。是给你救的。</p>`,choices:[{t:'😱 硬着头皮看',next:'ch1_lunch',fx:{"exp":5}}]},
581 ch1_lunch:{text:`<p>看了一上午代码。中午的时候手机震了一下。</p><p>林悦:<span class="info">"吃饭了。一起?楼下有家面馆还不错。"</span></p><p>你愣了一下,回了个好。</p><p>电梯里只有他们两个。跟早上的场景一模一样。连轿厢里的广告都没换。</p><p>"上午怎么样?"她问。</p><p>"代码……有点震撼。"</p><p>她笑了:<span class="good">"你是说那个祖传PHP项目吧?我第一次看的时候也是这个反应。老张说那个项目比你入职的时候还老。换个说法就是,它比公司里一半的人都大。"</span></p><p>你忍不住笑了。</p><p>面馆不大,但干净。墙上贴着老北京话的招贴画——"您吃了吗""倍儿棒"。你点了一碗炸酱面,她要了一碗西红柿鸡蛋面。</p><p>等餐的时候她问你北京怎么样。</p><p>"挺好的。就是房子贵。"</p><p>"你住哪儿?"</p><p>"回龙观。隔断间。六平米。隔壁情侣天天吵。"</p><p>她笑得肩膀抖:<span class="good">"你住得也太惨了吧。我刚来北京的时候也是地下室,住了半年才换到地上。"</span></p><p>她说话的时候眼睛里有光。不是那种刻意乐观的光。是经历过、但觉得没什么大不了的自在。</p><p>你低头吃面。面的味道还行,但你觉得这可能是你到北京以来吃过的最好的一碗面。</p>`,choices:[{t:'🍜 回公司准备开会',next:'ch1_meeting',fx:{"hp":15,"exp":5}}]},
582 ch1_meeting:{text:`<p>下午两点,会议室。</p><p>这是你第一次参加团队正式会议。椭圆形会议桌,老张坐在斜对面,林悦坐在靠门的位置。除了他们,还有——</p><p>测试小陈,戴圆框眼镜,说话语速快得像开了倍速。</p><p>产品经理Tony,瘦高个,穿着印着公司logo的T恤,手里拿着一个翻盖保护套的平板。</p><p>技术总监王姐,四十岁左右,短发,干练。她说话的声音不大,但你注意到她开口的时候,所有人都坐直了一点。</p><p>会议内容是一个新功能。用户反馈系统。</p><p>Tony打开原型图开始讲需求:<span class="info">"很简单。用户能提交反馈,后台能看到列表,我们回复。三天能搞定吧?"</span></p><p>你心里倒吸了一口凉气。三天?你连项目结构都还没完全看懂。</p><p>王姐环视了一圈会议室,目光最后落在你身上:<span class="info">"新同学。这个功能你来当主力。老张带你。"</span></p><p>所有人的目光都转向了你。你能感觉到自己耳朵开始发热。</p><p>你张了张嘴——</p>`,choices:[{t:'🚀 "没问题,我来!"',next:'ch1_coding_start',fx:{"exp":15,"hp":-5}},{t:'🤝 "好,我跟老张学着做"',next:'ch1_coding_start',fx:{"exp":10}}]},
583 ch1_coding_start:{text:`<p>会议结束,你回到工位。打开编辑器,建了一个新文件,开始写功能。</p><p>你先画接口设计。数据库表结构。用户ID、反馈内容、提交时间、处理状态。然后建表、写API、写前端页面。你写得很投入,键盘敲得噼里啪啦响。</p><p>卡在一个CSS上。按钮圆角在Chrome和Safari上显示不一样。你调了五六次,都没调对。</p><p>林悦路过,看你眉头皱成一团,凑过来看了一眼:<span class="good">"你那个选择器写错了啦。"</span></p><p>她弯腰下来,在键盘上改了一行——</p><p class="mono">-webkit-border-radius: 8px;</p><p>她又离你很近。那股洗衣液的味道又飘了过来。</p><p>"好了。试试。"</p><p>你刷新了一下。圆角正常了。</p><p>"谢了。你也太厉害了……"</p><p>她笑了笑,拍了一下你的肩膀:<span class="good">"加油写。写完了请你吃饭庆祝。"</span></p><p>她走了。你盯着屏幕看了好一会儿。一行代码都没写进去。</p>`,choices:[{t:'📝 继续写代码!',next:'ch1_overtime',fx:{"exp":20,"hp":5}}]},
584 ch1_overtime:{text:`<p>天黑了。办公室的灯一盏一盏熄灭。走廊的声控灯在你敲键盘的间隙里灭掉,然后又在你敲出下一个字符时重新亮起来。整层楼只剩他这一排的灯还亮着。</p><p>你抬起头。林悦也没走。她坐在自己工位上,戴着耳机,屏幕上是VS Code的界面。她也在加班。</p><p>你走过去站在她身后。她在调一个前端Bug。</p><p>"还没走?"你问。</p><p>她摘下一只耳机,转过头:<span class="good">"有一个样式Bug死活搞不定。你呢?"</span></p><p>"反馈系统的接口。差不多了,还差分页。"</p><p>她站起来走到你工位前,看了看你的屏幕:<span class="good">"这里用POST吧,不然URL太长了。这里加一个loading动画,用户体验好很多。"</span></p><p>她说得很耐心。你听得很认真。她站在他旁边大概十分钟。你记了满满一页笔记。</p><p>她回去之前回头说:<span class="good">"别太晚。第一天别把自己累垮了。"</span></p><p>你点了点头。</p><p>她走了。办公室安静下来。只剩你和一排亮着的显示器。你写到了凌晨一点,把功能框架搭完了。</p><p>关掉电脑走出公司。北京凌晨的街道很安静,路灯把影子拉得很长。你抬头看了看夜空。没有星星,但你觉得心里有什么东西亮着。</p>`,choices:[{t:'🏠 回家睡觉',next:'ch1_review',fx:{"exp":15,"hp":-3}}]},
585 ch1_review:{text:`<p>第二天上午,你把代码发给老张Review。</p><p>老张戴上老花镜,一行一行地看。你看得很慢。非常慢。你坐在旁边,心里七上八下。会议室里只有老张鼠标滚轮滚动的声音。</p><p>终于。你开口了。</p><p>"这里变量命名不规范。pay_status。驼峰还是下划线?统一。"</p><p>"这里少了一个空指针判断。用户传空值怎么办?"</p><p>"这里没加try-catch。数据库连不上,用户看到的是白屏。"</p><p>"这里。算了,前面几条先改了再说。"</p><p>你掏出笔记本,一条一条记下来。七条。改完一遍,又发给老张看了一次。</p><p>他扫了一眼,点了点头:<span class="good">"嗯。还凑合。上线吧。"</span></p><p>你松了一口气。</p>`,choices:[{t:'🚀 上线!',next:'ch1_launch',fx:{"exp":25,"def":1}}]},
586 ch1_launch:{text:`<p>你坐在工位前。鼠标悬停在部署按钮上。你深吸了一口气,点了一下。</p><p class="sys">部署中……50%……80%……95%……</p><p>100%。</p><p>没有报错。</p><p>你刷新了一下页面。用户反馈功能正常。输入、提交、显示。你又刷新了一遍。还是正常。</p><p>你靠在椅背上,长长地呼出一口气。</p><p>拿起手机给林悦发消息:<span class="mono">"上线了!"</span></p><p>她秒回了一个👍。然后又跟了一条:<span class="info">"晚上请你吃饭庆祝一下?楼下那家烤串店。"</span></p><p>你盯着屏幕,嘴角翘了起来。</p>`,choices:[{t:'🍢 去吃烤串!',next:'ch1_dinner',fx:{"exp":10,"hp":10}}]},
587 ch1_dinner:{text:`<p>烤串店在公司对面一条小巷子里。露天摆了几张塑料桌椅,地面油亮亮的,空气中混着炭火和孜然的味道。</p><p>老板是个东北大叔,嗓门很大。看到林悦就喊:<span class="info">"小林来了!今天带男朋友来啦?"</span></p><p>你的脸一下子就红了。</p><p>林悦白了老板一眼:<span class="good">"是新同事!别乱说!"</span></p><p>他们在角落坐下。她点了一堆。羊肉串、鸡翅、烤茄子、韭菜。又要了一瓶北冰洋。</p><p>"能喝酒吗?"</p><p>"不太能……"</p><p>"那算了。喝北冰洋吧。以后有的是机会。"</p><p>玻璃瓶碰在一起,发出一声清脆的响。</p><p>"今天上线的时候紧张不?"她问。</p><p>"紧张死了。点了按钮之后那几秒差点不敢看屏幕。"</p><p>她笑了:<span class="good">"我第一次上线也是。点完部署把电脑合上了。过了五分钟才敢打开。"</span></p><p>你也笑了。你笑自己刚才的样子,也笑自己终于成了这些人中的一员。</p><p>北京的夜色沉下来,城市的灯火一点一点亮起来。初秋的风吹过来,带着烤串的香味和炭火的温度。</p><p>林悦举起瓶子:<span class="good">"来。欢迎加入银河科技。"</span></p><p>你举起瓶子碰了一下。北冰洋的玻璃瓶冰凉冰凉的,细小的气泡在橙黄色的液体里往上蹿。</p><p>你觉得这可能是你喝过的最好喝的汽水。</p>`,choices:[{t:'👉 前往第二章',next:'CHAPTER_COMPLETE',fx:{"exp":15,"hp":15}}]},
588 ch1_morning:{text:`<p>早上七点。闹钟还没响,你已经醒了。</p><p>穿上唯一一件熨过的白衬衫。毕典那天买的,穿过一次,之后一直挂在椅背上。你对着那面裂了一条缝的镜子照了照。还行。</p><p>地铁上人挤人。你护着背包。大学用了四年的那一个,拉链不太好使了,得用手捏着。</p><p>西二旗站到了。你跟着人流涌出站口。抬头。银河科技那栋写字楼立在早晨的阳光里,玻璃幕墙晃得人眯眼。</p><p class="sys">深吸一口气,你推门走了进去。</p>`,choices:[{t:'🚶 直接去前台报到',next:'ch1_checkin'},{t:'☕ 先在楼下咖啡厅缓一缓',next:'ch1_coffee'}]},
589 ch1_coffee:{text:`<p>你决定先在楼下咖啡厅坐五分钟。</p><p>点了一杯最便宜的美式。十二块。找了个角落坐下,掏出手机又把offer邮件看了一遍。试用期六千五,转正八千。在北京不算多好,但这是他人生第一个起点。</p><p>旁边坐着一个穿格子衫的中年男人,对着笔记本电脑敲代码。屏幕上的光标飞快地跳动,你一直没有抬头。</p><p>你有点羡慕那种专注。</p><p class="sys">喝完最后一口咖啡,你站了起来。</p>`,choices:[{t:'🚶 去前台报到',next:'ch1_checkin'}]},
590 ch1_checkin:{text:`<p>大厅里,前台的姑娘穿着职业装,微笑着看你。</p><p>"你好,今天入职的。后端开发。"你尽量让声音稳一点。</p><p>她查了一下电脑:"你对吧?稍等,我联系HR。"</p><p>你站在前台旁边等着。几分钟后,一个戴眼镜的年轻女人走过来。</p><p>"你?我是HR小林。跟我来吧。"</p><p>她带你穿过闸机走进电梯。"紧张吗?"她问。</p>`,choices:[{t:'😅 有点紧张',next:'ch1_hr_chat'},{t:'💪 还行,挺期待的',next:'ch1_hr_chat2'}]},
591 ch1_hr_chat:{text:`<p>"有点紧张。"他老实承认。</p><p>小林笑了笑:"正常。不过技术团队氛围挺好的,放心。"</p><p>电梯在十二楼停下。开放式的办公区,工位密密麻麻的。小林带他到靠窗的位置:"这是你的位子,电脑已经准备好了。"</p><p>你放下包坐下去。皮质转椅,比家里那把三条腿的强太多了。桌上是一台崭新的戴尔显示器,旁边还放着一个印着公司logo的马克杯。</p>`,choices:[{t:'🖥️ 先打开电脑',next:'ch1_mentor'}]},
592 ch1_hr_chat2:{text:`<p>"还行,挺期待的。"他比实际有信心。</p><p>小林笑了笑:"挺好的。有干劲。"</p><p>电梯在十二楼停下。办公区里键盘声此起彼伏。小林指了指靠窗的工位:"这是你的,先坐。我去叫mentor。"</p><p>你把包放在桌上,环顾了一圈。落地窗外是西二旗的天际线。</p><p class="sys">从今天开始。你就是职场人了。</p>`,choices:[{t:'🖥️ 打开电脑',next:'ch1_mentor'}]},
593 ch1_mentor:{text:`<p>你刚打开电脑,背后传来一个声音:"你?"</p><p>回过头。一个三十出头的男人,深蓝色卫衣,黑框眼镜。"我是张伟,叫我老张。后面三个月你的mentor。有什么不懂的都可以问我。"</p><p>他带你在工位间走了一圈。后端组六个人,前端组四个,测试两个。大部分名字你都没记住。</p><p>回到工位,老张拍了拍显示器:"先搭开发环境。项目Java Spring Boot的。有不会的随时问我。"</p>`,choices:[{t:'💻 开始搭环境',next:'ch1_setup',fx:{"skill":"coding"}},{t:'📋 先问问项目架构',next:'ch1_arch'}]},
594 ch1_setup:{text:`<p>你打开IDEA,开始搭环境。Git clone、Maven下载依赖、配数据库连接、跑单元测试。这套流程他练过很多遍了。</p><p>项目代码大概十几万行,标准的三层架构——controller、service、dao。翻了翻代码,有些注释已经过期了,有些方法写得很绕。你没吭声。第一天,多看少说。</p><p>想起面试时CTO说过的话:<span class="info">"我们不追最新的技术,但要稳定可靠。客户的数据不能丢。"</span></p>`,choices:[{t:'👍 稳字当头',next:'ch1_afternoon'},{t:'❓ 技术栈有点旧',next:'ch1_thought'}]},
595 ch1_thought:{text:`<p>你在心里对比了一下。公司用的Spring Boot 2.x,你自己看过3的文档了,但你很快就没再想这事。技术新不旧不重要,重要的是能解决问题。再说,一个新人还没资格评价公司的选型。</p><p>你埋头继续配环境。Maven下载依赖花了快二十分钟。你趁这个时间翻了翻Wiki文档。这是一个企业内部的审批管理系统,客户是几家国企。业务逻辑挺复杂,光是审批流程就有十几种。</p>`,choices:[{t:'📖 好好看文档',next:'ch1_afternoon'}]},
596 ch1_arch:{text:`<p>老张听说他想了解项目架构,拉了一把椅子坐过来,打开系统架构图。"前端Vue2,后端Spring Boot,数据库MySQL。核心逻辑在service层,有一套自己的工作流引擎——"你在白板上画了起来。</p><p>你发现老张讲东西很清楚。从整体到局部,重点突出。"审批流核心是状态机,每个节点有前置条件、后置动作。"讲了大概二十分钟,你看了看表:"先去吃饭,下午继续。"</p>`,choices:[{t:'🍚 跟老张去食堂',next:'ch1_lunch'}]},
597 ch1_afternoon:{text:`<p>下午继续搭环境。数据库连接、Redis、MQ。中间件比你以前在学校用的多得多。</p><p>隔壁工位的同事探过头来。后来他知道这人叫王宇,前端组的。"你是新来的后端?你?我是王宇。以后接口联调多多关照。"他也今年刚毕业,比你早来了两个月。"这个月已经加了三个通宵了。"他压低声音,"做好准备。"</p>`,choices:[{t:'😅 先做好手头事',next:'ch1_eod'},{t:'❓ 加班很严重?',next:'ch1_overtime'}]},
598 ch1_eod:{text:`<p>下午五点半,环境搭建完成了。IDEA里项目可以正常编译,单元测试全部通过。</p><p>老张过来看了看:"环境搭好了?不错。今天就到这儿吧,明天给你安排第一个活儿。"</p><p>走出大楼,晚霞把天空染成橙红色。西二旗的街道上,人群像潮水一样涌出来。</p><p>你站在路边给妈妈发消息:<span class="mono">"妈,第一天上班,挺好的。"</span></p><p>这一次,你没有犹豫。</p>`,choices:[{t:'📖 明天继续',next:'ch1_env'}]}
599 }
600 },
601 {
602 title: '第二章 · 第一个任务',
603 start: 'ch2_start',
604 scenes: {
605 ch2_start:{text:`<p>你的一周新手适应期结束了。</p><p>周二早上。王姐在群里@了你。</p><p class="mono">@你 用户反馈系统,周四上线。有问题找老张。</p><p>你盯着这条消息看了三遍。周四。你只有两天时间。</p><p>你深吸了一口气,打开了一个空白文本文件。把功能拆成三大块:前端表单、后端API、数据库设计。</p><p>看起来很简单。</p><p>但你心里清楚。真正的坑永远在你以为简单的地方。</p>
606<p>老张路过你工位,看你一脸紧张,拍了拍你的椅子背:<span class="info">"别慌。先拆需求再做方案。不会的问我。"</span></p><p>你点了点头。</p>`,choices:[{t:'🟢 两天搞定!',next:'ch2_gung_ho'},{t:'🟡 写稳一点,先做测试',next:'ch2_steady'},{t:'🔴 实话实说要一周',next:'ch2_safe'},{t:'⚔️ 消灭这个Bug!',next:'__FIGHT__',fx:{"exp":9}}]},
607 ch2_start_morning:{text:`<p>周一早上,你比平时早到了二十分钟。</p>
608<p>周末两天,你心里一直惦记着王姐在群里说的那个任务。用户反馈系统。周四上线。你周日晚上翻来覆去没睡好,满脑子都是数据库设计和API接口的事。</p>
609<p>你走到工位前,放下包。还没到九点,办公区只有零星几个人。戴耳机的大哥已经到了,正对着屏幕啃一个包子。前排的小陈也在,面前放着一杯豆浆。</p>
610<p>你打开电脑,先把功能拆解的文档打开看了一遍。周末在家画的那几张草图,越看越觉得不够完善。你重新打开一个文件,把功能模块从头梳理了一遍。</p>`,choices:[{t:'💪 梳理完毕',next:'ch2_start'}]},
611 ch2_start_anxiety:{text:`<p>你盯着王姐那条消息看了很久。周四。两天时间。</p>
612<p>你打开编辑器,建了一个空白的HTML文件。然后光标停在第一行,什么也写不出来。</p>
613<p>你深吸了一口气。站起来去接了一杯水。回来的时候路过林悦的工位,她正在调试一段CSS,眉头皱成一团。</p>
614<p>「早啊。」她说,没抬头。</p>
615<p>「早。」你站在她旁边看了一下她的屏幕——一个复杂的Flexbox布局,看起来怎么调都不对。</p>
616<p>你回到自己工位。打开了一个空白文本文件。先写字段定义:user_id、type、content、image_url、status、create_time。然后写CRUD的接口路径。一件事情一件事情地分解。</p>
617<p>分解完之后,你发现——好像没有那么难了。</p>`,choices:[{t:'📝 开始写代码',next:'ch2_gung_ho'},{t:'🤔 先做设计再动手',next:'ch2_steady'}]},
618 ch2_db_design:{text:`<p>你打开Navicat,开始建表。字段名想了很久——user_id还是submitter_id?type还是category?status用tinyint还是varchar?</p>
619<p>你在草稿纸上画了三种方案,最后选了最保守的一种:用整数表示状态,用外键关联用户表,create_time设默认值。</p>
620<p class="mono">CREATE TABLE feedback (<br> id INT AUTO_INCREMENT PRIMARY KEY,<br> user_id INT NOT NULL,<br> type TINYINT COMMENT '1=bug 2=suggestion 3=complaint',<br> content TEXT,<br> image_url VARCHAR(500),<br> status TINYINT DEFAULT 0,<br> created_at DATETIME DEFAULT CURRENT_TIMESTAMP<br>);</p>
621<p>建好之后,你看着那张空表发了一会儿呆。</p>`,choices:[{t:'📝 写后端API',next:'ch2_gung_ho',fx:{'skill':'coding'}}]},
622 ch2_api_first:{text:`<p>你打开IDE,在controller层新建了一个类。FeedbackController。</p>
623<p>你写了第一个接口:提交反馈。</p>
624<p class="mono">@PostMapping("/api/feedback/submit")<br>public Result submit(@RequestBody FeedbackDTO dto) {<br> // TODO: 参数校验<br> // TODO: 图片上传<br> // TODO: 入库<br> return Result.success();<br>}</p>
625<p>三个TODO,像三个未解的谜题。你看着它们,一个个开始解决。</p>`,choices:[{t:'🔍 先写参数校验',next:'ch2_gung_ho',fx:{'skill':'coding'}}]},
626 ch2_cors_struggle:{text:`<p>你写好了后端API,用Postman测了一下,通了。然后开始写前端页面。</p>
627<p>一个简单的表单:用户名、反馈类型、反馈内容、上传图片。你照着公司现有页面的风格写了一个差不多的。</p>
628<p>本地开发服务器跑起来。你打开浏览器。点了一下提交按钮。</p>
629<p class="bad">Access to XMLHttpRequest at 'http://localhost:8080/api/feedback/submit' from origin 'http://localhost:3000' has been blocked by CORS policy.</p>
630<p>你盯着屏幕看了好一会儿。</p>
631<p>跨域。你记得这个东西。但从来没真正处理过。</p>`,choices:[{t:'🤔 查一下怎么搞',next:'ch2_cors_solve'}]},
632 ch2_cors_solve:{text:`<p>你百度了一下"CORS跨域解决方案"。</p>
633<p>网上的文章列出了三种方法:JSONP、后端加CORS头、Nginx代理。你选了第二种,因为最直接。</p>
634<p>你在后端加了一个配置类:</p>
635<p class="mono">@Configuration<br>public class CorsConfig {<br> @Bean<br> public WebMvcConfigurer corsConfigurer() {<br> return registry -> registry.addMapping("/api/**")<br> .allowedOrigins("http://localhost:3000")<br> .allowedMethods("GET", "POST", "PUT");<br> }<br>}</p>
636<p>重启后端。刷新页面。点击提交。</p>
637<p class="good">请求成功!</p>
638<p>你靠在椅背上,长长地呼出一口气。然后你发现——刚才太专注了,完全忘了时间。一看右下角,已经下午一点了。</p>`,choices:[{t:'🍜 吃饭!',next:'ch2_lunch',fx:{'exp':10}}]},
639 ch2_lunch:{text:`<p>你站起来伸了个懒腰。办公区的人少了一半。</p>
640<p>手机亮了。林悦的消息:<span class="info">「你不吃饭吗?」</span></p>
641<p>你愣了一下。你完全忘了看手机。</p>
642<p>回她:「正要吃。你吃了吗?」</p>
643<p>「吃了。给你带了份炒饭放你桌上了,看你写得太投入没打扰你 😄」</p>
644<p>你低头一看。桌上确实多了一个外卖袋子。打开一看——蛋炒饭,还冒着热气。旁边放了一瓶可乐。</p>
645<p>你拿起筷子,吃了一口。米粒松软,蛋香十足。你吃了几口,才想起来给她回消息:</p>
646<p class="mono">「谢谢啊!多少钱?」</p>
647<p>她回了一个翻白眼的表情:<span class="info">「请你的。好好写代码。上线了再请回来 😄」</span></p>`,choices:[{t:'😋 吃完继续肝!',next:'ch2_gung_ho',fx:{'hp':15}}]},
648 ch2_late_afternoon:{text:`<p>下午三点。你完成了前端表单的所有功能。</p>
649<p>用户选择类型、填写内容、上传图片(Base64编码,你还没学会传文件)、提交。整套流程通了。</p>
650<p>你在本地完整测了一遍。提交→入库→显示。每一步都正常。</p>
651<p>然后你发现了一个Bug——如果用户什么都不填就直接提交,后端会收到一堆空值,然后数据库就插了一条全是NULL的记录。</p>
652<p>你拍了拍脑袋。加上了参数校验。</p>
653<p class="mono">if (StringUtils.isEmpty(dto.getContent())) {<br> return Result.error("反馈内容不能为空");<br>}</p>
654<p>你再测了一次。留空提交。页面弹出了错误提示。你满意地点了点头。</p>`,choices:[{t:'🌆 天快黑了',next:'ch2_night_before'}]},
655 ch2_office_evening:{text:`<p>窗外的天色暗了下来。北京的晚霞从蓝色变成橙色,再变成深紫色。CBD的高楼开始亮灯,一格一格的窗户像发光的棋盘。</p>
656<p>你站起来活动了一下脖子。坐太久了,肩膀有点僵。</p>
657<p>办公区的人已经走了大半。保洁阿姨推着车在过道里穿梭,把垃圾桶一个一个清空。戴耳机的大哥也走了,你的显示器还亮着,屏保是一行一行不断滚动的代码雨。</p>
658<p>你回到工位,继续写后台管理页面。</p>
659<p>后台比前端复杂——要分页、要搜索、要按状态过滤。你一边查公司现有的后台代码风格,一边照葫芦画瓢。</p>`,choices:[{t:'🌃 继续肝',next:'ch2_night_before'}]},
660 ch2_midnight_code:{text:`<p>写到了晚上十一点。</p>
661<p>你的眼睛开始发酸。肩膀酸痛得厉害。但你不想停下来。就差最后一页——管理后台的数据统计页面。</p>
662<p>你打开了一个新文件。写了一个简单的统计图表,用ECharts。柱状图展示各类反馈的数量分布。</p>
663<p>你盯着屏幕上那个慢慢成型的图表,心里涌上来一种很奇怪的感觉——这个功能,从一张空白数据库表,变成了一个有界面、有交互的完整功能。从无到有。是你一个人做的。</p>
664<p>你拿起手机拍了一张屏幕上的代码,发给妈妈:<span class="mono">「妈,我在写第一个功能。」</span></p>
665<p>你没想到她会秒回:<span class="info">「别太晚!身体要紧!」</span></p>`,choices:[{t:'😴 看一眼林悦',next:'ch2_together'}]},
666 ch2_midnight_break:{text:`<p>你合上电脑,趴在桌上休息五分钟。</p>
667<p>闭上眼。脑子里还在转——统计页面的SQL怎么写。按类型分组,用GROUP BY,查每个类型的数量。然后再做一个折线图,按时间趋势展示……</p>
668<p>你睁开眼。发现自己的脑子根本停不下来。算了,不休息了。继续写。</p>
669<p>你打开电脑,开始写统计接口。SELECT type, COUNT(*) as count FROM feedback GROUP BY type。你写完了,又加了一个按日期的趋势查询。</p>
670<p>数据出来了。空的——因为还没有真实数据。但你看到那个空图表的时候,心里是满的。</p>`,choices:[{t:'💻 继续',next:'ch2_together'}]},
671 ch2_linyue_sleep:{text:`<p>你写完统计接口,转头看了一眼林悦的方向。</p>
672<p>她已经趴在桌上睡着了。</p>
673<p>电脑屏幕的光映在她脸上。她侧着头,头发垂下来遮住了半张脸。一只手还搭在键盘上,像是睡前的最后一秒还在想着某行代码。</p>
674<p>你看了看时间。凌晨十二点四十。</p>
675<p>你犹豫了一下。该不该叫醒她?她看起来睡得挺沉的。</p>
676<p>最后还是走过去,轻轻拍了拍她的肩膀:<span class="good">「悦姐,回去了。」</span></p>
677<p>她没反应。</p>
678<p>你又拍了拍。</p>
679<p>她嗯了一声,慢慢抬起头,迷迷糊糊地看了你一眼:<span class="good">「嗯……写完了?」</span></p>
680<p>「差不多了。回去吧。」</p>
681<p>她揉了揉眼睛,站起来收拾东西。你把她的杯子帮她洗了,她看了你一眼——那种刚睡醒还没完全清醒的眼神:<span class="good">「你还挺细心的嘛。」</span></p>`,choices:[{t:'🚶 走,送你回去',next:'ch2_walk_home'}]},
682 ch2_night_air:{text:`<p>你和林悦一起走出公司大楼。</p>
683<p>北京的深夜,空气凉丝丝的,带着一种只有秋天深夜才有的干燥和清冽。广场上几乎没有人,路灯把地面照得发白。远处偶尔有一辆车驶过,轮胎碾过路面,声音在空旷的街道上回荡。</p>
684<p>她缩了缩脖子。你也觉得有点冷。</p>
685<p>「你住哪里?」你问。</p>
686<p>「回龙观。跟你差不多。」</p>
687<p>「你也住回龙观?」你有点意外。</p>
688<p>「嗯。合租。三居室,我和两个室友。」她哈了一口气,白色的雾气在路灯下散开。<span class="good">「来北京的人,十个有八个住回龙观或天通苑。」</span></p>
689<p>你笑了。这是你在北京听到的,最真实的一句话。</p>`,choices:[{t:'🚇 一起走去地铁站',next:'ch2_walk_home'}]},
690 ch2_launch_morning:{text:`<p>上线那天早上,你七点就到了公司。</p>
691<p>整层楼只有你一个人。你打开电脑,把代码重新跑了一遍——本地测试、集成测试、前端联调。一切正常。</p>
692<p>你又检查了一遍配置文件。数据库连接没问题。Redis没问题。邮件服务器没问题。</p>
693<p>你坐在椅子上,盯着屏幕上的部署按钮。</p>
694<p>现在部署吗?还是等老张来了再说?</p>
695<p>你决定等老张来。</p>
696<p>等待的时间很难熬。你在工位上坐了半个小时,什么事都做不进去。站起来接了一杯水,喝了一口,又放下了。</p>`,choices:[{t:'⏳ 等老张来',next:'ch2_launch_day'}]},
697 ch2_launch_check:{text:`<p>老张九点零八分到的。你端着一杯茶,慢悠悠地走进办公室。</p>
698<p>看到你已经坐在工位上,你愣了一下:「这么早?」</p>
699<p>「……睡不着。今天上线。」</p>
700<p>老张没说话。你把茶放在自己桌上,然后搬了一把椅子坐在你旁边。</p>
701<p>「先给我看看代码。」</p>
702<p>你把代码打开给你看。你一行一行地扫。你坐在旁边,手心开始出汗。你看得比上次仔细多了。</p>
703<p>看完了。你点了点头:<span class="good">「比上次强很多。上线吧。」</span></p>
704<p>你松了一口气。</p>`,choices:[{t:'🚀 点部署按钮',next:'ch2_launch_day'}]},
705 ch2_launch_pulse:{text:`<p>你握着鼠标。食指悬在左键上方。</p>
706<p>心跳声清晰可闻。你甚至能感觉到耳朵里的脉搏跳动。</p>
707<p>你看了看老张。你在喝那杯茶。没有在看你。</p>
708<p>你深呼吸一口。点击了一下。</p>
709<p class="sys">部署中……</p>
710<p>绿色的进度条慢慢往前走。你盯着它,不敢眨眼。</p>
711<p>百分之四十。百分之七十。百分之九十五。</p>
712<p class="good">部署成功。</p>
713<p>你刷新了一下页面。打开用户反馈页面。提交了一条测试反馈。</p>
714<p>成功了。</p>
715<p>你转过头看向老张。你正在看你的屏幕,似乎已经确认了线上正常。</p>
716<p>你没说话。你也没说话。</p>`,choices:[{t:'🎉 成了!',next:'ch2_launch_day'}]},
717 ch2_team_chat:{text:`<p>你在群里发了一条消息:<span class="mono">「用户反馈系统已上线。功能正常。」</span></p>
718<p>群里安静了几秒。然后——</p>
719<p>王宇:<span class="info">「牛逼!🎉🎉🎉」</span></p>
720<p>小陈:<span class="info">「恭喜上线!🎉」</span></p>
721<p>Tony:<span class="info">「效率可以啊新人!晚上安排庆功宴!」</span></p>
722<p>林悦:<span class="info">「👏👏👏」</span></p>
723<p>然后是王姐的回复——只有四个字:<span class="info">「做得不错。」</span></p>
724<p>你盯着王姐那四个字看了好几遍。这四个字,比Tony的一整条消息都重。</p>`,choices:[{t:'😊 放下手机',next:'ch2_dinner2'}]},
725 ch2_team_dinner:{text:`<p>晚上七点。还是那家烤串店。这次人齐了——老张、林悦、Tony、小陈、王宇,还有你。</p>
726<p>老板看到你们一群人,嗓门很大地喊了一声:「又是你们!今天啥日子?」</p>
727<p>Tony指了指你:<span class="info">「这小伙子第一个功能上线!庆祝一下!」</span></p>
728<p>老板上下打量了你一下:「新来的?可以啊!今天给你们加个菜!送一份拍黄瓜!」</p>
729<p>大家欢呼了一声。</p>
730<p>你坐在桌角,看着他们七嘴八舌地点菜、聊八卦、吐槽产品经理。你发现你已经不再是一个旁观者了。你也是这些人中的一员。</p>`,choices:[{t:'🥂 举起杯子',next:'ch2_dinner2'}]},
731 ch2_dinner_talk:{text:`<p>烤串上来了。羊肉串滋滋冒着油,孜然的香味直往鼻子里钻。你拿起一串咬了一口——烫,但好吃。</p>
732<p>小陈坐在你对面,正跟王宇吐槽一个Bug:<span class="info">「你们后端的接口文档跟实现不一样好吗?我调了一下午才发现!」</span></p>
733<p>王宇一脸无辜:<span class="info">「是老刘写的接口,跟我没关系啊!」</span></p>
734<p>你们斗嘴的样子很好笑。你坐在旁边,一边吃串一边笑。</p>
735<p>林悦坐在你旁边。她没怎么说话,但一直笑盈盈的。她拿起一根鸡翅,啃得很仔细。你注意到她吃鸡翅的顺序——先啃掉两头的小骨头,再吃中间。</p>
736<p>你也不知道为什么,但你记住了这个细节。</p>`,choices:[{t:'🍺 老张要敬你酒了',next:'ch2_drunk2'}]},
737 ch2_standup_morning:{text:`<p>站会在九点半。</p>
738<p>你站在圈里,有点紧张。之前站会你一直是旁听者——听别人说昨天做了什么,今天要做什么。今天轮到你了。</p>
739<p>轮到你这的时候,你清了清嗓子:<span class="info">「昨天用户反馈系统上线了,线上正常。今天打算修复两个小Bug,然后看看有没有新的任务。」</span></p>
740<p>王姐点了点头。</p>
741<p>老张接着说:<span class="info">「段飞昨天做得不错。今天给你一个新任务——审批流加一个抄送功能。」</span></p>
742<p>你点了点头。回到工位的时候,你发现自己的脚步比平时轻快了一些。</p>`,choices:[{t:'💪 开始搞抄送功能',next:'ch2_standup'}]},
743 ch2_code_review_prep:{text:`<p>你写完了抄送功能的所有代码,检查了一遍。改了几个变量名,删了两个无用import。</p>
744<p>然后你深吸一口气,把代码提交到了Git,给老张发了一条消息:<span class="mono">「张哥,抄送功能写完了,有空帮我review一下。」</span></p>
745<p>然后就是等待。</p>
746<p>你坐在工位上,不敢写新的代码——万一老张让你大改,新写的代码可能也得跟着改。你打开之前写的统计接口看了看,觉得写得还行。</p>
747<p>又看了看公司的Wiki文档,了解了一下其他模块的业务逻辑。</p>
748<p>四十分钟后,老张的消息来了:<span class="mono">「过来。」</span></p>`,choices:[{t:'🏃 过去',next:'ch2_review'}]},
749 ch2_review_notes:{text:`<p>老张把Review意见一一列了出来。你在笔记本上一条一条地记:</p>
750<p>1. 事务粒度太粗——只有DB操作需要事务</p>
751<p>2. 枚举用switch/case更清晰</p>
752<p>3. 加了try-catch但catch块日志不够详细</p>
753<p>4. API返回格式跟团队不一致</p>
754<p>你低头记着。每一条你都在旁边加了一个小勾——表示你理解了,会改。</p>
755<p>老张说完之后看了你一眼:<span class="info">「这些不是大问题。第一次写,能写成这样已经不错了。」</span></p>
756<p>你抬头看你。你脸上没有任何表情。但你知道,你那句话是认真的。</p>`,choices:[{t:'🛠️ 一条一条改',next:'ch2_fix'}]},
757 ch2_deploy_wait:{text:`<p>你把修改后的代码重新提交。等CI跑完。</p>
758<p>你每隔两分钟刷新一次GitLab。每次刷新,心里都在想——这次不会挂了吧?</p>
759<p>林悦路过你的工位,看到你紧张的样子笑了:<span class="good">「第一次CI?跟你第一次上线一样紧张。」</span></p>
760<p>「被你看出来了。」你有点不好意思。</p>
761<p><span class="good">「正常的。第一次之后就不紧张了。因为你会知道——紧张也没用,该挂还是会挂。」</span></p>
762<p>你愣了一下:「……你这算安慰吗?」</p>
763<p>她笑出了声:<span class="good">「算。一种比较真实的安慰。」</span></p>
764<p>CI跑完了。全绿。你松了一口气。</p>`,choices:[{t:'✅ 合并到dev',next:'ch2_deploy'}]},
765 ch2_merge_click:{text:`<p>你点下了"Merge"按钮的那一刻,心里涌上来一股说不清的情绪。</p>
766<p>这是你写的代码。通过了Review,通过了CI,合并到了主分支。它很快会跑在线上服务器上,被真正的用户使用。</p>
767<p>你关掉GitLab页面。靠在椅背上。窗外的阳光从玻璃幕墙照进来,在你的键盘上投下一道斜斜的光影。</p>
768<p>你看着那道光,发现自己的生活好像也被这束光照亮了一些。</p>
769<p>手机震了一下。林悦的消息:<span class="info">「合并了?Congratulations 🎉」</span></p>
770<p>你回她:「谢谢!晚上请你吃饭!」</p>
771<p>她回了一个「OK」的手势,然后又发了一条:<span class="info">「其实,你现在已经不太像一个新人了。」</span></p>`,choices:[{t:'😊 继续工作',next:'ch2_deploy'}]},
772 ch2_weekend_plan:{text:`<p>周五下午,你把本周的工作整理了一下。用户反馈系统上线了,抄送功能也做完了。你的任务列表上,所有任务都标成了"已完成"。</p>
773<p>你新建了一个文件。写下了下周的计划:</p>
774<p>1. 修复线上反馈的小Bug</p>
775<p>2. 学习Spring Boot的单元测试</p>
776<p>3. 看看能不能重构一下那个老PHP项目的一小部分</p>
777<p>你看着第三项,笑了一下。才工作两周,就已经开始想着重构别人的代码了。</p>
778<p>下班之前,你看到老张正在收拾东西。你今天破天荒地准时下班了。</p>
779<p>「张哥,今天这么早?」</p>
780<p>「老婆过生日。再不走回去要跪搓衣板了。」他说完就走了。你看着你的背影消失在电梯口。那是你第一次觉得老张也是个普通人。</p>`,choices:[{t:'😌 周末愉快',next:'CHAPTER_COMPLETE'}]},
781 ch2_steady_plan:{text:`<p>你选择稳一点做。</p>
782<p>你先花了一上午做设计。用思维导图把用户反馈系统的功能拆解成十几个小任务,标了优先级和依赖关系。然后给每个任务估了工时。</p>
783<p>拆解完之后,你发现最耗时的是前端联调和后端异常处理。你把这两块的工时多留了一些。</p>
784<p>然后你开始按计划执行。先做核心功能,再做边缘情况。每做完一个任务,就在思维导图上打一个勾。</p>
785<p>到了周三下午,你的任务列表上只剩两个小任务了。你知道自己能在周四上午交付,不用加班。</p>
786<p>你靠在椅背上,看了看窗外。秋天的天空很高很蓝。你感觉很好。</p>`,choices:[{t:'✅ 继续按计划走',next:'ch2_steady'}]},
787 ch2_safe_talk:{text:`<p>你站在王姐办公室门口,深吸了一口气,然后敲了敲门。</p>
788<p>"进来。"</p>
789<p>你推门进去。王姐正在看一份文档。她抬起头看了你一眼,等了几秒。</p>
790<p>你开口了:「王姐,用户反馈系统那个功能,我评估了一下。两天不够,需要一周。涉及到前后端联调、数据库设计、还有测试,我不想赶工期出问题。」</p>
791<p>你说完之后,等着她的反应。</p>
792<p>王姐看了你几秒。然后合上了面前的电脑:<span class="good">「你觉得需要多久?」</span></p>
793<p>「一周。」</p>
794<p>她点了点头:<span class="good">「那就一周。品质优先。去找老张对齐一下排期。」</span></p>
795<p>你走出办公室的时候,发现自己的手心里全是汗。但心里很踏实。</p>`,choices:[{t:'📋 找老张对齐',next:'ch2_safe_plan'}]},
796 ch2_week_review:{text:`<p>一周过去了。</p>
797<p>用户反馈系统如期上线了。虽然没有Bug,但也没有惊喜——它只是正常运行。在你看来,这就是最好的结果。</p>
798<p>周五下午,你坐在工位上,梳理了一下入职两周的收获:学会了公司的技术栈、写了第一个独立功能、通过了老张的Code Review、还积累了第一次上线的经验。</p>
799<p>你在心里盘点这些的时候,发现自己已经不再是那个站在大厅里等HR来接的新人了。</p>
800<p>你打开了备忘录,写下了下周要做的事。还没写完,林悦的消息弹了出来:<span class="info">「下班了!周五不加班!去吃好的!」</span></p>
801<p>你笑了笑,关了电脑。</p>`,choices:[{t:'🎉 走!',next:'ch2_safe_end'}]},
802 ch2_end_note:{text:`<p>回到家,你坐在床上,拿出那张已经叠了很多次的A4纸——面试那天老张给的那张装机清单。</p>
803<p>你看着上面的字,觉得已经过去很久了。但其实才两周。</p>
804<p>你翻了翻手机相册。入职第一天拍的工位照片、第一次编译成功的截图、第一次上线成功的日志、聚餐时的合影。</p>
805<p>你相册里关于工作的照片,已经比大学四年的课设照片还多了。</p>
806<p>你把那张装机清单折好,放进了抽屉。抽屉里还有那枚平安符。你妈妈求的。你从背包里拿了出来,放在抽屉最里面。</p>
807<p class="sys">两周。你已经在路上了。</p>`,choices:[{t:'😴 晚安',next:'ch2_end_expanded',fx:{'exp':15,'hp':10}}]},
808 ch2_new_week:{text:`<p>新的一周开始。你走进办公室的时候,前台姑娘已经认识你了,冲你笑了一下:「早啊,段飞。」</p>
809<p>「早。」你回了一个微笑。刷卡进闸机的时候,动作已经很自然了。不用像第一周那样刷好几次才能刷开。</p>
810<p>你走到工位,发现桌上多了一张便利贴。字迹你认出来了——林悦的。上面写着:<span class="info">「新的一周,继续加油 💪」</span>旁边画了一个小小的笑脸。</p>
811<p>你看了一下四周,没看到她。但你知道她大概七点半就到了——她桌上已经放着一杯喝了一半的咖啡。</p>
812<p>你把便利贴撕下来,贴在了显示器的边框上。跟那张写着"新同事座"的便利贴并排贴在一起。</p>`,choices:[{t:'💻 开工!',next:'ch2_standup'}]},
813 ch2_after_fight:{text:`<p>你刚把那个Bug消灭。王姐的消息又来了:<span class="mono">@你 进度?</span></p><p>你赶紧回了一句:<span class="info">"马上开搞。"</span>还是先搞定正事吧。</p>`,choices:[{t:'🟢 两天搞定!',next:'ch2_gung_ho'}]},
814 ch2_gung_ho:{text:`<p>"没问题。两天够了。"他脱口而出。</p><p>然后开始疯狂赶工。</p><p>第一天上午。数据库建表、写API。一切顺利,你甚至觉得"这东西也不难嘛"。</p><p>第一天下午。写前端表单。一个跨域问题跳出来,你以为很简单,结果调了四十分钟。</p><p>你靠在椅背上。屏幕上那行红色的报错安安静静地躺在那里。那种"我不行了"的感觉又浮上来了。</p><p>但这次你没有停下来。百度、StackOverflow、翻文档。半个小时后找到了答案。</p><p>页面正常显示的那一刻,你有种奇怪的满足感。不是代码跑通的满足。是在Bug面前没有逃的满足。</p>`,choices:[{t:'💪 继续肝!',next:'ch2_night_before',fx:{"exp":15}}]},
815 ch2_night_before:{text:`<p>天暗下来了。办公室的灯一盏一盏熄灭。走廊的声控灯在他键盘声的间隙里灭掉,又被下一个字符重新叫亮。</p><p>你看了看时间。晚上九点半。后台管理页面还没写完。</p><p>正准备继续埋头——</p><p>"还不走?"</p><p>抬起头。林悦站在他工位旁边。包已经收拾好了,但她没有要走的意思。</p><p>"明天上线。东西没写完。"</p><p>她犹豫了一下,放下包,坐回自己工位上:<span class="good">"那我陪你一会儿吧。反正回去也没什么事。"</span></p><p>办公室里很安静。只剩他们两个人,和两排亮着的显示器。窗外是北京初秋的夜景,国贸CBD灯火通明。</p>`,choices:[{t:'💻 继续码代码',next:'ch2_together',fx:{"exp":10,"hp":5}}]},
816 ch2_together:{text:`<p>你写了一会儿代码,余光看到林悦打开了一本电子书。</p><p>"在看什么?"</p><p>她把屏幕转过来——《设计的艺术》。</p><p><span class="good">"前端也得不断学习啊。不然就被淘汰了。"</span></p><p>"你怕被淘汰吗?"</p><p>她想了一下:<span class="good">"有时候吧。这行业变得太快。去年jQuery,今年React、Vue,明年不知道又是什么,但——"</span>她顿了一下,<span class="good">"这也是它有意思的地方。永远不会无聊。"</span></p><p>你点了点头。她说到了你心里。你也是因为这种"永远在变"的感觉,才选了这行。</p><p>他们聊了一会儿。技术、学习、为什么做程序员。她说她大学学的其实是设计,后来自学的前端——"因为想做自己能看得见的东西。"</p><p>你说他选后端是因为"后端不用跟太多人打交道"。</p><p>她笑了:<span class="good">"结果你天天跟老张打交道。后悔了吧?"</span></p><p>你也笑了。<.p>`,choices:[{t:'🕐 继续写到凌晨',next:'ch2_midnight',fx:{"exp":15,"hp":5}}]},
817 ch2_midnight:{text:`<p>写到十二点。你终于把第一个版本写完了。伸了个懒腰,转头——</p><p>林悦已经趴在桌上睡着了。</p><p>电脑屏幕的光照在她侧脸上。睫毛很长,在脸颊上投下一小片阴影。呼吸很轻很均匀,一只手还搭在鼠标上。像是睡着前一秒还在想代码的事。</p><p>你犹豫了一下。叫不叫醒她?</p><p>最后还是轻轻拍了拍她的肩膀:"悦姐。写完了。回去吧。"</p><p>她迷迷糊糊抬起头,揉了揉眼睛:<span class="good">"嗯?写完了?……好。走吧……困死了。"</span></p><p>她站起来收拾东西的时候,你注意到她脸上被袖子压出了一道浅浅的红印。你没说,但觉得那挺可爱的。</p>`,choices:[{t:'🚶 一起走出公司',next:'ch2_walk_home',fx:{"exp":10}},{t:'💻 第二天站会',next:'ch2_standup'}]},
818 ch2_walk_home:{text:`<p>你们一起走出公司大楼。</p><p>北京的深夜很安静。秋天的风带着凉意,吹在脸上很舒服。路灯把两个人的影子拉得很长。</p><p>她裹了裹外套。你也觉得有点冷。</p><p>"明天上线。紧张吗?"</p><p>"有点。"</p><p>"正常。我第一次上线的时候,点了部署就把电脑合上了。过了五分钟才敢打开。"</p><p>你笑了:<span class="good">"那我明天也试试。"</span></p><p>"别。万一崩了回滚都来不及。"她也笑了。</p><p>地铁口分开。她13号线,你8号线。走进闸机之前她回头看了他一眼:<span class="good">"到了给我发消息。"</span></p><p>"好。"</p><p>你坐在地铁上,窗外是黑漆漆的隧道,偶尔闪过一盏灯。掏出手机翻了翻她的朋友圈。最新一条是两小时前发的:办公室窗外的夜景,配文只有一个月亮。</p><p>你点了一个赞。</p>`,choices:[{t:'😴 回家睡觉',next:'ch2_launch_day',fx:{"exp":5,"hp":5}}]},
819 ch2_launch_day:{text:`<p>第二天。上线。</p><p>你没有合上电脑。盯着进度条一点一点走完。100%。刷新。功能正常。</p><p>你一项一项测。提交反馈、后台查看、搜索、回复。全部正常。</p><p>靠回椅背上,长长呼出一口气。</p><p>正准备去倒水。老张过来了。沉默地站在你身后,看代码。你心里又开始七上八下。</p><p>过了一会儿老张开口了:<span class="good">"嗯。比上次强,但这里——"</span>他指着屏幕,<span class="info">"SQL没加索引。数据量大了会慢。加上。"</span></p><p>你赶紧加上。老张又扫了一遍,点了点头:<span class="good">"行了。今天别加功能了。稳住。"</span></p><p>你松了一口气。</p>`,choices:[{t:'🎉 下班庆祝!',next:'ch2_dinner2',fx:{"exp":20,"def":1}}]},
820 ch2_dinner2:{text:`<p>下午林悦发来消息:<span class="info">"今晚团队聚餐。老地方。"</span></p><p>晚上七点,还是那家烤串店。这次人齐了。老张、小陈、Tony、林悦,还有你。</p><p>老张第一个举杯:<span class="info">"庆祝你第一个独立功能上线。来,走一个。"</span></p><p>你手忙脚乱地举起杯子。啤酒,冰的。跟老张碰了一下。Tony开始吐槽产品经理日常——"你们知道吗,今天三个客户说要加功能,每一个都说是'很小的改动'"。你学客户说话的语气特别像,小陈笑得前仰后合。</p><p>老张喝了几杯后话也多了。讲他当年在阿里写代码,一个Bug找了三天,结果是一个括号放错了位置。</p><p>林悦坐在旁边。她今晚没怎么说话,但一直在笑。笑起来眼睛弯弯的。</p>`,choices:[{t:'🍺 敬老张',next:'ch2_drunk2',fx:{"exp":10,"hp":10}}]},
821 ch2_drunk2:{text:`<p>你敬老张三杯。然后。不知道是空腹喝酒还是太高兴了。喝多了。</p><p>散场时站起来晃了一下。林悦一把扶住他胳膊:<span class="good">"没事吧?"</span></p><p>"没……没事……就是有点晕……"舌头不听使唤了。</p><p>老张摇了摇头:<span class="info">"年轻人酒量不行。小林你送他一下吧。"</span></p><p>"我送他。顺路。"</p><p>她扶着你走出烧烤店。秋天的风一吹。你清醒了一点,但脚步还是飘的。她一只手扶着你的手臂,另一只手拦了辆出租车。</p><p>车上他靠着车窗,她坐在旁边。城市的灯光一盏一盏从窗外流过。你头晕,但你记得。她的肩膀离他很近。</p><p>送到小区门口。<span class="good">"能自己上去吗?"</span></p><p>"能……"</p><p>"到了给我发消息。"</p><p>你点了点头。走了两步回头。她还站在那里。你冲她挥了挥手。她笑了一下,转身走了。</p>`,choices:[{t:'🏠 上楼',next:'ch2_end_expanded',fx:{"exp":10,"hp":-5}}]},
822 ch2_steady:{text:`<p>"写稳一点。先做测试。"你认真地说。</p><p>你估算了一下。用户反馈系统涉及前后端联调,还有表单验证、错误处理。两天确实太赶了。你不想为了赶工期留下技术债。</p><p>老张看了你一眼。什么也没说,但你没注意到,你转身的时候嘴角动了一下。</p><p>接下来两天。你按自己的节奏来。先写测试用例。再写功能代码。每完成一个模块就跑一遍测试。红灯绿灯来回切换,但你知道自己在做什么。</p><p>过程中你遇到了一个跨域问题,但因为你提前做了测试,排查起来思路很清楚。</p><p>周四上午。你的代码按时交付了。功能正常。</p><p>老张看了一眼邮件。没有表扬。也没有批评。这对于他来说,就是最高的评价了。</p>`,choices:[{t:'📮 收到一条消息',next:'ch2_steady_msg',fx:{"exp":20}}]},
823 ch2_steady_msg:{text:`<p>下午。你收到一封邮件。是王姐发来的——<span class="mono">你,用户反馈系统第一版已验收。做得不错。继续保持。</span></p><p>你盯着屏幕看了一会儿。</p><p>入职以来。这是你第一次收到王姐的正面反馈。虽然只有短短几个字,但你把它截了图,存在了手机里。</p><p>下班的时候。林悦路过你的工位,看了一眼你的屏幕:<span class="good">"王姐的邮件?可以啊。她一般不给人发表扬邮件的。"</span></p><p>"真的假的?"</p><p>"真的。上次她给人单独发邮件还是去年。那个人的名字我现在还记得——"她故意停顿了一下——<span class="good">"算了不说了。反正你挺厉害的。"</span></p><p>她笑了一下,走开了。你坐在工位上。鼠标无意识地在桌面上滚动。嘴角压不住了。</p>`,choices:[{t:'🏠 下班',next:'ch2_steady_end',fx:{"exp":15,"hp":10}}]},
824 ch2_steady_end:{text:`<p>你走出公司大楼。北京的秋天傍晚凉爽舒适。风吹在脸上,带着一丝烤红薯的香气。</p><p>你在路边买了一根烤红薯。暖暖地握在手里。剥开皮。金黄色的瓤冒着热气。</p><p>你一边吃着烤红薯一边往地铁站走。觉得生活好像也没那么难。</p><p>今天你写了一个功能,做了测试,按时上线,得到了老板的认可。对于一个入职不到一个月的程序员来说,这已经不错了。</p><p>你掏出手机。刷了一下朋友圈。看到林悦发了一条:一张窗外晚霞的照片,配文"秋天真好 🍂"。</p><p>你点了一个赞。</p><p>你突然想到。你喜欢上了现在这个工作。不是因为代码。而是因为在这个城市的这个秋天。你正在成为更好的自己。</p>`,choices:[{t:'👉 前往第三章',next:'CHAPTER_COMPLETE',fx:{"exp":25,"hp":15,"money":50}}]},
825 ch2_safe:{text:`<p>你深吸一口气:<span class="info">"王姐。这个功能涉及到前后端联调、表单验证、错误处理还有数据库设计。两天可能不够。安全起见。需要一周。"</span></p><p>你说完之后。心里做好了被骂的准备。</p><p>但王姐只是点了点头:<span class="good">"那就一周。品质优先。"</span></p><p>你愣一下,没想到她这么痛快。</p><p>王姐站起来。拍了拍你的肩膀:<span class="good">"敢说实话的年轻人不多。你能实事求是,比硬撑要强。去跟老张对齐一下排期。"</span></p><p>你走出办公室的时候。感觉后背的汗还没干,但你心里踏实了。</p>`,choices:[{t:'📋 找老张对齐排期',next:'ch2_safe_plan',fx:{"exp":10}}]},
826 ch2_safe_plan:{text:`<p>老张听你说完一周的排期。什么都没说。你打开你的项目计划扫了一眼。然后用笔在上面改了两处:</p><p><span class="info">"这里。你可以先写API再写前端。不用等。这里。数据库设计先做完。第一周做不完可以留尾巴,但核心流程必须通。"</span></p><p>你看着他轻描淡写地优化了你的计划。心里暗暗佩服。这就是经验。不是代码写得快,而是知道怎么把一件事安排好。</p><p>接下来的几天。你按老张的建议来。虽然速度不快,但每一步都很稳。出错也比预期少。</p><p>一周后。项目按时上线了。没有Bug,没有事故。</p>`,choices:[{t:'🎉 发了上线邮件',next:'ch2_safe_team',fx:{"exp":15,"hp":5}}]},
827 ch2_safe_team:{text:`<p>你在群里发了上线通知。然后收到了几个竖起大拇指的表情。</p><p>前排工位的小陈回头看了你一眼:<span class="good">"牛逼啊兄弟!第一个功能就这么稳!"</span></p><p>你还没来得及谦虚。林悦从旁边探了个头:<span class="good">"所以你的秘诀是。先跟老板要更多时间?"</span></p><p>"这叫风险管理。"你一本正经地说。</p><p>她笑出了声。那种很清脆的笑声。让整个办公区都亮了一些。</p>`,choices:[{t:'🍜 晚上奖励自己一碗面',next:'ch2_safe_end',fx:{"exp":10,"hp":10}}]},
828 ch2_safe_end:{text:`<p>晚上。你没有加班。</p><p>你去了公司附近一家兰州拉面馆。点了一份加肉的牛肉面。热腾腾的汤面端上来。你夹了一筷子。面条筋道,牛肉入味。</p><p>你边吃边想。今天做了一个正确的决定。</p><p>不是因为项目上线了。而是因为你学会了在工作中保持诚实。不是所有事情都能硬扛。有时候说出来,反而能获得信任。</p><p>你掏出手机。给妈妈发了一条消息:<span class="mono">"妈。今天我的第一个项目上线了。"</span></p><p>妈妈秒回了一个语音。声音里带着笑意:<span class="good">"我儿子真棒!别太累了啊。记得按时吃饭!"</span></p><p>你笑了笑。把剩下的汤也喝完了。</p><p>走出面馆。北京的夜晚灯火通明。你站在路边。抬头看了一眼公司大楼的方向。那里亮着几扇窗。</p><p>你突然发现。你开始把这里叫做"公司"了。不再是一个暂时的落脚点。而是你真正开始的地方。</p>`,choices:[{t:'👉 前往第三章',next:'CHAPTER_COMPLETE',fx:{"exp":25,"hp":20,"money":80}}]},
829 ch2_end_expanded:{text:`<p>回到家躺在床上,脑子还是晕的。你拿起手机给林悦发了一条消息:<span class="mono">"到了。"</span></p><p>那边秒回:<span class="info">"好。早点睡。明天还有一天班 😄"</span></p><p>你把手机放在枕头边,闭上眼睛。天花板还是像往常一样转,但你今晚睡得着。</p><p>第二天醒来,发现床头多了一张纸条。不知道什么时候画的,一张笑脸,旁边写着"第一个功能 ✅"。你看了半天,把纸条叠好放进了抽屉。</p><p>后来他才知道。那天晚上的聚餐是老张提议的。"新人第一个功能上线,得有仪式感。"</p><p>你刚来的时候觉得老张是个面瘫。后来发现,你只是面冷心热。</p>`,choices:[{t:'👉 前往第三章',next:'CHAPTER_COMPLETE',fx:{"exp":20,"hp":15,"money":100}}]},
830 ch2_standup:{text:`<p>第二天早上九点,你参加了第一次站会。</p><p>六个人围成圈轮流说昨天做了什么、今天打算做什么。轮到老张时你说:"今天给小段安排一个开发任务。"</p><p>所有人的目光都看向你。你下意识挺了挺背。</p><p>站会后,老张把你叫到工位前。你的屏幕上是接口设计文档。"这个需求不大。给审批单加一个'抄送'功能。需要改数据库、后端接口和前端页面。给你三天,够吗?"</p>`,choices:[{t:'💪 两天就够了',next:'ch2_review',fx:{"skill":"coding"}},{t:'🫡 三天吧,稳一点',next:'ch2_steady'}]},
831 ch2_review:{text:`<p>代码写得差不多了,你给老张发消息让你review。</p><p>他端着水杯走过来,一行一行看你的代码。比你预期的仔细得多。有时候他会停下来皱一下眉头,然后继续往下看。</p><p>你在旁边坐着,比面试还紧张。</p><p>看了十五分钟后老张说话了:"整体思路没问题,但有几个地方。这个事务注解粒度太粗了,只有数据库操作需要事务,前面的校验逻辑可以提出来。还有这个枚举判断用switch更清晰。"</p><p>你赶紧记下来。</p>`,choices:[{t:'🛠️ 按意见改代码',next:'ch2_fix',fx:{"skill":"coding"}}]},
832 ch2_fix:{text:`<p>你一条一条地改老张提的问题。调整事务粒度、简化if-else、把硬编码的常量抽离出来……改完之后代码确实比之前干净多了。</p><p>你想起在学校做课设时,代码只要能跑就行,从来没人给你做过code review。</p><p>改完提交了新commit,老张看了一遍:"可以了,合并到dev分支。"</p><p>你点下"Merge"按钮的那一刻,有一种不真实的成就感。</p>`,choices:[{t:'🎉 等测试通过',next:'ch2_deploy'}]},
833 ch2_deploy:{text:`<p>代码合并后,测试同学跑回归测试。你每隔五分钟刷新一次Jira。</p><p>王宇路过看到你的样子笑了:"别紧张,你那个功能简单,出不了啥大问题。"</p><p>半小时后,测试在群里@你:<span class="info">"抄送功能测试通过,可以上线。"</span></p><p>你松了一口气。老张帮你部署到了预发布环境。一切正常。</p><p>你的第一行代码,就要跑在真正的服务器上了。</p>`,choices:[{t:'🌟 明天继续',next:'ch2_launch_day'}]}
834 }
835 },
836 {
837 title: '第三章 · 线上事故',
838 start: 'ch3_start',
839 scenes: {
840 ch3_quiet_afternoon:{text:`<p>周五下午。阳光从落地窗斜斜地照进来,在办公区的地毯上切出一道道明亮的条块。</p>
841<p>你在写一个数据导出功能。一切都很平静。键盘敲得顺,代码跑得稳,你甚至觉得今天可以准时下班。</p>
842<p>你端起杯子喝了一口水。打开音乐播放器,调了一首轻音乐当背景音。耳机戴上,世界安静下来。</p>
843<p>显示器右下角的报警群图标,正在一闪一闪地跳。</p>
844<p>你没看到。</p>`,choices:[{t:'😰 摘下耳机',next:'ch3_friday'}]},
845 ch3_first_alarm:{text:`<p>你摘下耳机,发现周围的气氛不对。</p>
846<p>隔壁工位的王宇正在打电话,声音压得很低但语速很快:「对……线上挂了……502……不知道原因……」</p>
847<p>你转头看向老张的方向。你正站在王姐工位旁边,两个人都在看老张的屏幕,表情严肃。</p>
848<p>你的心跳了一下。你打开报警群,往上翻了翻消息——</p>
849<p class="bad">「线上502!」</p>
850<p class="bad">「CPU 100%!」</p>
851<p class="bad">「数据库连接池满了!!」</p>
852<p>每一行红色文字都像一只手攥住了你的心脏。</p>`,choices:[{t:'😰 查看服务器',next:'ch3_panic'}]},
853 ch3_panic_thoughts:{text:`<p>你坐在屏幕前,手悬在键盘上,不知道该干什么。</p>
854<p>脑子里有一个声音在说:检查日志。另一个声音在说:先看是不是你的代码。还有一个声音在说:不管是谁的,先恢复服务再说。</p>
855<p>你深吸了一口气,按住第三个声音说服了自己。先恢复。</p>
856<p>你打开命令行。输入<code>ssh deploy@prod-server</code>。连接成功了。你松了一口气——至少还能连上。</p>
857<p><code>top</code>命令打出来。CPU占用率99.9%。MySQL进程占了大部分。你看着那个数字,后背开始冒汗。</p>`,choices:[{t:'🔄 先回滚部署',next:'ch3_rollback2'},{t:'🔍 看看错误日志',next:'ch3_debug2'}]},
858 ch3_check_deploy:{text:`<p>你打开部署记录。今天下午三点五十分,有一个部署。</p>
859<p>你点开详情。一个很小的改动——改了一个数据库查询配置文件。改动人:你的名字。</p>
860<p>你的手停了一下。</p>
861<p>你记得那个改动。很简单的改动,就是把一个查询条件从<code>status=1</code>改成<code>status IN (1,2)</code>,因为业务需求改了。你在本地测了一次,没发现问题,就直接部署了。</p>
862<p>没有在staging上测。因为staging环境当时被测试同学占着,你想着「这么小的改动不会有问题」。</p>
863<p>你盯着屏幕。后悔像潮水一样涌上来。</p>`,choices:[{t:'😰 先解决问题!',next:'ch3_rollback2'}]},
864 ch3_rollback_cmd:{text:`<p>你的手指开始敲键盘。</p>
865<p class="mono">git log --oneline</p>
866<p>找到最近一次commit。复制hash。</p>
867<p class="mono">git revert 【那串hash】</p>
868<p>Git处理的时候,那几秒钟像过了一个世纪。</p>
869<p class="mono">git push origin master</p>
870<p>远程仓库更新了。你在Jenkins上重新部署。进度条动了。百分之十。百分之三十。百分之七十。</p>
871<p>你感觉自己的心跳跟进度条同步了。</p>
872<p>百分之百。</p>
873<p>你刷新了一下页面。502消失了。页面正常显示了。</p>
874<p>你靠回椅背上。发现自己一直憋着一口气。现在才呼出来。</p>`,choices:[{t:'💨 呼……',next:'ch3_rollback2'}]},
875 ch3_after_rollback:{text:`<p>服务恢复了。但你的手还在抖。</p>
876<p>你发现自己对刚才那几分钟的记忆有点模糊。好像发生得太快了。你只记得自己一直在跑命令,跑完一个跑下一个。</p>
877<p>老张走到你工位后面。你转过头,你脸上没什么表情:<span class="good">「回滚了?」</span></p>
878<p>「嗯。回了。」</p>
879<p>「多长时间?」</p>
880<p>「……大概四分钟。」</p>
881<p>老张点了点头:<span class="good">「不错。第一次能这么果断,比很多人强。」</span></p>
882<p>你愣了一下。你刚才一直在想自己犯了多大的错。没想过自己做了正确的应对。</p>`,choices:[{t:'📝 写事故报告',next:'ch3_postmortem2'}]},
883 ch3_debug_process:{text:`<p>你决定先查清楚原因再动手。</p>
884<p>你打开日志文件。最后几万行全是重复的错误信息——<code>Lock wait timeout exceeded</code>。你往上翻,找到第一条错误的时间戳。然后从那里往前翻了五分钟的日志,找到了一个慢查询。</p>
885<p>你复制了那条SQL。在本地数据库上跑了一下EXPLAIN——</p>
886<p class="mono">+----+-------------+----------+------+----------------------+------+---------+------+-------+-------------+<br>| id | select_type | table | type | possible_keys | key | rows | Extra |<br>+----+-------------+----------+------+----------------------+------+---------+------+-------+-------------+<br>| 1 | SIMPLE | feedback | ALL | idx_status,idx_type | NULL | 152348 | Using where |<br>+----+-------------+----------+------+----------------------+------+---------+------+-------+-------------+</p>
887<p>没有走索引。全表扫描。十五万行数据。</p>
888<p>原因找到了。</p>`,choices:[{t:'⚔️ 消灭这个慢查询!',next:'ch3_debug2'}]},
889 ch3_docker_memory:{text:`<p>你在查看服务器状态的时候,发现了一个更严重的问题。</p>
890<p>Docker容器内存占用接近极限。有两个Java进程各自占了1.5G。再加上MySQL,整台服务器的内存已经快见底了。</p>
891<p>你赶紧查看Docker日志。发现有一个容器在不断重启——因为OOM(内存溢出)。每次重启后运行不到五分钟,又挂了。</p>
892<p>你查了一下那个容器跑的是什么服务——是公司的一个数据同步任务。每天定时跑,把数据从旧系统同步到新系统。不知道什么原因,它今天下午开始不断崩溃。</p>
893<p>你把这个发现发到了报警群。</p>
894<p>老刘回复了:<span class="info">「那个服务我上周改了一个参数,可能是改出问题了。我看看。」</span></p>`,choices:[{t:'😮💨 不是我的锅',next:'ch3_after_fight'}]},
895 ch3_postmortem_prep:{text:`<p>周末这两天你都没过好。</p>
896<p>周六你躺在床上,脑子里一直在复盘那次事故。每一个步骤、每一个决定、每一个本可以做得不一样的地方。</p>
897<p>周日你打开了电脑,把事故经过写成了文档。从时间线到根因分析,再到改进措施,你写了两千多字。写完之后又读了两遍,改了几个用词不当的地方。</p>
898<p>你甚至画了一张时间线图——什么时间发生的报警,什么时间回滚的,什么时间恢复的。每个时间节点你都标得很清楚。</p>
899<p>然后你建了一个新文档,标题是:<span class="mono">「线上部署规范(个人版)」</span>。你在里面写了五条规则:</p>
900<p>1. 任何改动都要先在staging上测</p>
901<p>2. 数据库变更要提前Review</p>
902<p>3. 部署时间避开高峰期</p>
903<p>4. 回滚方案要提前准备好</p>
904<p>5. 出事了第一时间通报,不要自己扛</p>`,choices:[{t:'📋 周一拿去复盘会',next:'ch3_postmortem2'}]},
905 ch3_postmortem_meeting:{text:`<p>周一上午十点。会议室。王姐坐在会议桌主位,老张、老刘、小陈、Tony都在。</p>
906<p>你坐在靠门的位置,面前放着一杯水。你没喝。</p>
907<p>会议室安静了几秒。王姐开口了:<span class="info">「段飞,你先说吧。」</span></p>
908<p>你站起来,把文档投到屏幕上。你一条一条地讲了事故经过、原因分析、改进措施。你讲得很清楚,没有推卸,没有含糊。</p>
909<p>讲完之后,会议室安静了几秒。</p>
910<p>王姐看着你:<span class="info">「你提议的三项改进,具体怎么落地?」</span></p>
911<p>你愣了一下。她不是在质疑你,她是在问你执行方案。你已经想好了——</p>
912<p>「第一,部署前加一道Checklist审批。第二,所有数据库变更必须走Review。第三——」你拿出一张打印好的纸,<span class="info">「这是我整理的回滚操作手册,以后每个人上线前都要读一遍。」</span></p>`,choices:[{t:'📄 把手册递给她',next:'ch3_postmortem2'}]},
913 ch3_lin_comfort:{text:`<p>复盘会结束。你回到工位,打开电脑,发现屏幕还停留在事故那天的日志界面。</p>
914<p>你关掉了那个窗口。靠着椅背,看着天花板发呆。</p>
915<p>手机震了一下。</p>
916<p>林悦:<span class="info">「还好吗?」</span></p>
917<p>你回她:「还好。就是有点累。」</p>
918<p>她过了几秒又发了一条:<span class="info">「你知道吗,我第一年搞崩了三次线上。第一次把整个数据库搞没了,恢复了一整天。」</span></p>
919<p>你盯着屏幕,忍不住笑了一下。</p>
920<p>「你骗我的吧?」</p>
921<p>「真的。那次之后我哭了一场。后来发现——哭完之后,问题还在。不如想怎么解决。」</p>
922<p>你看着那条消息。觉得她好像什么都知道。知道你现在需要听到什么。</p>`,choices:[{t:'☕ 去楼下走走',next:'ch3_lin_message'}]},
923 ch3_lunch_after:{text:`<p>中午。你没什么胃口,但还是去了食堂。</p>
924<p>你端着餐盘找了个角落坐下。刚吃了几口,一个人端着餐盘在你对面坐下来。</p>
925<p>林悦。</p>
926<p>她什么也没说。就坐在你对面吃她的饭。偶尔看手机。偶尔抬头看一圈食堂里的人。</p>
927<p>你们沉默地吃了大概五分钟。然后她开口了:<span class="good">「下午要不要出去走走?我看天气预报说今天下午是北京今年最好的秋日。」</span></p>
928<p>你抬起头看她。她正在认真地把一块排骨上的肉拆下来,没有在看你。</p>
929<p>「好。」你说。</p>`,choices:[{t:'🌤️ 下午出去走走',next:'ch3_lin_message'}]},
930 ch3_walk_park:{text:`<p>下午三点。林悦走过来,站在你工位旁边:<span class="good">「走吧。」</span></p>
931<p>你跟着她走出办公室。电梯里只有你们两个人。她按了一楼。</p>
932<p>「去哪?」你问。</p>
933<p><span class="good">「附近有个小公园。走十分钟就到了。」</span></p>
934<p>她带你穿过几条街。路上经过一家花店,她停下来看了看门口的向日葵:<span class="good">「这种花看着就让人心情好。」</span></p>
935<p>公园很小。几棵银杏树,叶子已经黄了,阳光穿过树叶洒下来,在地上铺了一层碎金。长椅上坐着一个老人,正在喂鸽子。</p>
936<p>你们在一条长椅上坐了下来。</p>
937<p>「我第一次搞崩线上那天,也是秋天。」林悦说。<span class="good">「我跟你一样,觉得自己不适合干这行。」</span></p>
938<p>你看着她。她的侧脸被秋天的阳光镀上一层淡淡的金色。</p>`,choices:[{t:'🍂 听她讲',next:'ch3_lin_message'}]},
939 ch3_lesson_learned:{text:`<p>你从公园回来,坐在工位上。</p>
940<p>你打开备忘录,把今天学到的东西写了下来:</p>
941<p>1. 任何改动都要先上staging</p>
942<p>2. 先恢复再说原因</p>
943<p>3. 回滚比修Bug快</p>
944<p>4. 不是你一个人在战斗</p>
945<p>5. 犯错了别躲,面对它</p>
946<p>你写完之后,看了两遍。</p>
947<p>然后你在最后加了一行:</p>
948<p class="mono">6. 搞崩线上不可怕。可怕的是搞崩了不知道怎么恢复。</p>
949<p>你合上备忘录。打开IDE。继续写代码。</p>`,choices:[{t:'💪 继续工作',next:'ch3_end2'}]},
950 ch3_night_phone:{text:`<p>凌晨一点十二分。手机震了。</p>
951<p>你从睡梦中惊醒。有那么几秒,你还没搞清楚自己在哪。然后你看到了屏幕上的来电显示——老张。</p>
952<p>凌晨一点。</p>
953<p>你接起电话。声音哑哑的:「喂?」</p>
954<p>「段飞。线上出问题了。审批流卡住了,单子都提交不了。」老张的声音很稳,但你听得出来那种压着的紧张。<span class="info">「我正在往公司赶,你也过来。」</span></p>
955<p>「好。马上。」</p>
956<p>电话挂了。你坐在床沿上,花了三秒钟清醒过来。然后你开始穿衣服。</p>`,choices:[{t:'🚕 打车去公司',next:'ch3_drive'}]},
957 ch3_taxi_ride:{text:`<p>你站在路边等车。凌晨一点半的小区门口,路灯昏黄,一个人都没有。</p>
958<p>手机上的打车APP显示前面还有三个人排队。你盯着那个数字,每刷一次就少一个。好不容易排到了——有车接单了。</p>
959<p>车上很安静。司机没说话,收音机里放着深夜音乐节目。你靠着车窗,看着北京的街道飞快地向后退。路灯一盏一盏地闪过,像是某种急促的倒计时。</p>
960<p>你打开报警群,往上翻消息。几十条未读。大部分是自动报警——502、超时、连接失败。每一条都让你心跳加速。</p>
961<p>你关掉手机。窗外的城市在黑暗中安静地呼吸。而你正奔向你职业生涯中第二次线上事故。</p>`,choices:[{t:'🏃 到了',next:'ch3_drive'}]},
962 ch3_warroom_crowd:{text:`<p>你推开办公室的门。眼前的场景让你愣了一下。</p>
963<p>后端组几乎全到了。老刘戴着耳机在打电话,声音很低但表情紧绷。小陈坐在角落里,正盯着监控面板,面前放着三杯已经凉了的咖啡。老张站在白板前面,上面已经画了一堆拓扑图和箭头。</p>
964<p>王姐也在。她坐在会议室的椅子上,正在翻看手机上的报警信息。</p>
965<p>老张看到你进来了,招手让你过去:<span class="info">「来看一下。把线上日志调出来。」</span></p>
966<p>你赶紧到工位上打开电脑。连VPN。连服务器。心跳比上次那场事故的时候快了一倍,但你的手这次没抖。</p>`,choices:[{t:'🔍 开始查日志',next:'ch3_logs'}]},
967 ch3_find_root:{text:`<p>你从日志里找到了根源。</p>
968<p>一条SQL。就是你上周写的抄送功能里的批量插入语句。</p>
969<p>你盯着那句SQL,感觉血液一下子涌到了头顶。你的代码。这一次真的是你的代码。</p>
970<p class="mono">INSERT INTO cc_list (feedback_id, user_id) VALUES (?, ?), (?, ?), (?, ?)</p>
971<p>你没做唯一键校验。高并发下同时插入相同的数据,导致死锁。积累到一定量之后,整个表被锁住了。后面的所有操作都在排队等锁释放——等不到。因为锁已经死循环了。</p>
972<p>你看完了那行代码。然后你站起来,走到老张旁边:<span class="info">「我找到原因了。是我的代码。」</span></p>`,choices:[{t:'😰 是我的问题',next:'ch3_mybug'}]},
973 ch3_hotfix_push:{text:`<p>你知道了原因,修复方案也在脑子里成型了。</p>
974<p>你回到工位。打开代码。先加唯一索引防止重复插入,再改插入逻辑,插入前先做一次去重查询。双保险。</p>
975<p>你改完之后编译。通过了。</p>
976<p>你发消息给老张:「改好了,帮我过一眼。」</p>
977<p>你走过来,看了一眼你的diff。点了点头。<span class="good">「可以。部署吧。」</span></p>
978<p>你打包。上传。重启服务。</p>
979<p class="mono">[INFO] Application started successfully in 12.847 seconds.</p>
980<p>群里的报警停了。</p>`,choices:[{t:'😮💨 恢复',next:'ch3_hotfix'}]},
981 ch3_midnight_supper:{text:`<p>凌晨三点。服务恢复了。积压的审批单开始重新处理。一切回到了正轨。</p>
982<p>老刘挂了最后一个客户电话,靠回椅背上,长长地呼了一口气:<span class="info">「行了。客户那边没事了。」</span></p>
983<p>整个办公室安静了几秒。然后不知道谁先开始——大家开始收拾东西。</p>
984<p>老张不知道什么时候点了一堆外卖。烧烤、小龙虾、炒饭、可乐。堆在会议桌上:<span class="info">「吃吧。吃完回去睡觉。」</span></p>
985<p>你拿了一串羊肉串,咬了一口。肉有点凉了,但你吃着觉得这是你今天吃过最好吃的东西。</p>
986<p>林悦不知道什么时候也来了。她坐在你旁边,端着一杯热水,没吃。她说她晚上不吃夜宵。</p>
987<p>「你怎么来了?」你问她。</p>
988<p><span class="good">「看到群里报警,睡不着。就过来看看。」</span>她顿了一下,<span class="good">「你还好吧?」</span></p>
989<p>你说不上来。但你知道,她在这里,让你觉得事情没有那么糟。</p>`,choices:[{t:'😌 回家睡觉',next:'ch3_go_home'}]},
990 ch3_note_to_self:{text:`<p>你回到隔断间的时候,天已经快亮了。窗帘缝里透进来一线灰白色的光。</p>
991<p>你没有马上睡。你打开台灯,拿出那个在学校用了四年的笔记本。翻到最后一页,写了几行字:</p>
992<p class="mono">某年某月某日 凌晨三点<br>第二次线上事故。<br>原因:批量插入没做唯一键校验。<br>教训:永远不要相信输入数据是干净的。<br>学到了:出事了不要慌,一起扛的人比你以为的多。</p>
993<p>你合上笔记本。关了灯。躺下来。</p>
994<p>你闭上眼睛之前,脑子里闪过一个念头——你不再是一个遇到事故只会慌的新人了。你知道怎么处理了。</p>
995<p>虽然代价有点大。但你学到了。</p>`,choices:[{t:'😴 睡吧',next:'ch3_go_home'}]},
996 ch3_start:{text:`<p>两个月了。</p><p>你写了好几个功能,修了不少Bug,也踩了不少坑。从最初连项目结构都看不懂,到现在能独立解决一些小问题了。</p><p>工位上多了几本翻到一半的技术书——《代码整洁之道》《重构》。你开始养成写注释的习惯,学会了deploy之前先跑一遍测试。</p><p>一切看起来都在往好的方向走。</p><p>直到那个周五。</p>`,choices:[{t:'📅 一个普通的周五下午',next:'ch3_friday'},{t:'😰 半夜被电话叫醒',next:'ch3_midnight'}]},
997 ch3_friday:{text:`<p>周五下午。五点五十分。</p><p>你正在收拾包。手机突然疯狂震动。报警群炸了——</p><p class="bad">"线上挂了!"<br>"502!"<br>"CPU 100%!"<br>"数据库连接池满了!!"</p><p>你脑子里嗡地一声。屏幕上的报警像瀑布一样刷下来。整个办公区安静了一秒,然后炸开了锅。</p><p>你突然想起来。今天下午你deploy了一个小改动。改了一个数据库查询的配置文件。很小很小的改动。没有在staging上测。直接推到了production。</p><p>手开始发抖。</p>`,choices:[{t:'😰 心跳加速,怎么办',next:'ch3_panic'}]},
998 ch3_panic:{text:`<p>你坐在工位前,盯着屏幕上疯狂滚动的报错日志。大脑一片空白。手搭在键盘上,不知道敲什么。后背开始冒冷汗。心跳声咚咚咚的,比平时快了一倍。</p><p>打开命令行。犹豫了。回滚?先查问题?回滚错了怎么办?如果不是你的改动引起的呢?</p><p>时间变得很慢。每秒钟都像一个世纪那么长。报警群里不断弹出新消息。每一条都让你更紧张。</p>`,choices:[{t:'🏃 不管了,先回滚!',next:'ch3_rollback2',fx:{"exp":10}},{t:'🔍 冷静,先查日志',next:'ch3_debug2',fx:{"exp":5,"hp":-5}}]},
999 ch3_rollback2:{text:`<p>你深吸一口气,告诉自己冷静。回滚。先恢复服务再说。</p><p class="mono">git revert HEAD<br>git push origin master<br>重新部署</p><p>手指在键盘上飞快地敲。每敲一个命令,心跳就更快一点。</p><p>三分钟后。服务恢复了。502消失了。报警群安静了。</p><p>你整个人瘫在椅子上,后背全是冷汗。</p><p>老张走过来看了一眼你的屏幕。然后说了一句你没想到的话:<span class="good">"回滚得快。有经验。这次长记性了吧?"</span></p><p>你点了点头。说不出话来。</p>`,choices:[{t:'📝 复盘,写事故报告',next:'ch3_postmortem2',fx:{"exp":30,"def":1}}]},
1000 ch3_debug2:{text:`<p>你没有立刻回滚。你决定先搞清楚问题出在哪。</p><p>你打开日志系统。搜索关键词。一条异常SQL出现在你眼前。它像一条蛇一样在日志文件里游走。你追着它往下翻。发现了——</p><p>那个查询没有加索引。数据量上来之后变成了一只性能怪兽。把数据库CPU吃满了。</p><p>但就在你以为找到了原因的时候。那条SQL突然从屏幕里探出头来!</p><p>一个由慢查询化成的怪物——<span class="bad">「OutOfMemoryError」</span>。朝你扑了过来!</p>`,choices:[{t:'⚔️ 消灭这个SQL怪物!',next:'__FIGHT__',fx:{"exp":10}}]},
1001 ch3_after_fight:{text:`<p>怪物被打败了。化作一行行正常的日志代码,安静地躺在屏幕上。</p><p>你喘着粗气,但脑子清楚了。</p><p>你找到了问题。一个缺少索引的查询。然后你修复了它,重新deploy。</p><p>服务恢复了。</p><p>你靠在椅背上。感觉像跑了一场马拉松。虽然身体累,但你做对了。</p>`,choices:[{t:'📝 写复盘报告',next:'ch3_postmortem2',fx:{"exp":35,"atk":2}}]},
1002 ch3_postmortem2:{text:`<p>复盘会定在周一上午。周末两天你没睡好。周一提前一个小时到了公司,把事故经过从头到尾写了一份详细报告。</p><p>会上王姐坐在会议桌首位,表情平静,但严肃。</p><p>你主动开口了:"这次事故是我的责任。deploy了一个没在staging上测的改动。我提议三项改进——"你一条一条说完。所有人都听着。</p><p>会议室安静了几秒。王姐点了点头:<span class="good">"检讨到位。措施也具体。就按你说的做。"</span></p><p>你松了一口气。</p>`,choices:[{t:'📱 看手机消息',next:'ch3_lin_message',fx:{"exp":20,"def":1}}]},
1003 ch3_lin_message:{text:`<p>复盘会结束回到工位。手机上有好几条消息。</p><p>林悦:<span class="info">"别太自责。谁还没搞崩过线上呢 😄 我第一年搞崩了三次。第一次还把整个数据库搞没了。恢复了一整天。"</span></p><p>你看着屏幕,忍不住笑了。</p><p>老张:<span class="mono">"今天别写代码了。休息。明天再说。"</span></p><p>你回了个好,关了电脑。走出公司。外面的阳光很好。秋天的天空很高,蓝得不像话。你在楼下的长椅上坐了一会儿,看着来来往往的人,心里慢慢平静下来。</p>`,choices:[{t:'☕ 给自己买杯咖啡',next:'ch3_end2',fx:{"exp":10,"hp":10}}]},
1004 ch3_end2:{text:`<p>那次事故之后你在公司多了个外号——"回滚哥"。一开始觉得丢人,后来发现这外号其实带着认可。回滚得够快,没造成更大损失。</p><p>你提的三项改进被全团队采纳了。从那以后每个人deploy之前都会多想一想。</p><p>有一天老张在团队会议上说:<span class="info">"犯错不可怕。可怕的是犯了错不知道怎么改。你这一点做得不错。"</span></p><p>你坐在角落里,表面上没什么表情,心里有一点高兴。</p><p>下班时在电梯里碰到林悦。"今天不加班?"她问。"不加。回去早睡。"她笑了笑:<span class="good">"这才像话。走吧。一起。"</span></p><p>电梯门关上。秋天的傍晚,金色的阳光穿过玻璃幕墙洒在她的头发上。你觉得。今天好像也没那么糟糕。</p>`,choices:[{t:'👉 前往第四章',next:'CHAPTER_COMPLETE',fx:{"exp":20,"hp":10}}]},
1005 ch3_midnight:{text:`<p>凌晨一点,手机震醒了。老张的电话。凌晨一点打来。不会是什么好事。</p><p>"你,线上出问题了。审批流卡住了,单子都提交不了。客户那边炸了。"</p><p>他一下子清醒了,坐起来一边穿衣服一边问:"什么原因?"</p><p>"还不确定。我正在往公司赶,你也过来。"</p>`,choices:[{t:'🚕 打车去公司',next:'ch3_drive'}]},
1006 ch3_drive:{text:`<p>你穿着拖鞋冲出门。凌晨一点的北京几乎没人,站在路边叫车。前面排了十几个人。总算有车接单了。路上很顺,十五分钟就到了。下车的时候,写字楼十二层的灯还亮着。</p><p>刷卡进楼。电梯空荡荡的,只有嗡嗡的运行声和你自己的心跳声。</p>`,choices:[{t:'🏃 小跑进办公室',next:'ch3_warroom'}]},
1007 ch3_warroom:{text:`<p>走进办公室,后端组几乎全到了。老张眉头紧锁敲着键盘,组长老刘在跟客户打电话。语气客气但表情很难看。办公室里弥漫着速溶咖啡和紧张的味道。</p><p>"你来了。"老张招手,"看一下线上日志。出问题的服务器IP发你了。"</p><p>他赶紧打开电脑连上VPN。心跳得很快。第一次处理线上事故。</p>`,choices:[{t:'🔍 仔细排查日志',next:'ch3_logs',fx:{"skill":"coding"}},{t:'🎯 先看最近变更',next:'ch3_logs'}]},
1008 ch3_logs:{text:`<p>你深吸一口气开始逐行看日志。grep过滤ERROR,按时间排序倒着往上翻。</p><p>发现一个可疑的地方。某张表的死锁异常突然飙升。所有卡住的审批流都停在了同一个数据库操作上。</p><p>"张哥。审批记录表的insert频繁死锁。并发插入同一主键导致锁等待超时。"</p><p>老张走过来看你的屏幕,沉默了几秒:"今天上线的版本引入的。抄送功能的批量插入没做唯一键校验。"</p><p>你愣一下,这是你写的代码。</p>`,choices:[{t:'😰 是我的问题',next:'ch3_mybug'},{t:'🛠️ 马上修',next:'ch3_hotfix',fx:{"skill":"coding"}}]},
1009 ch3_mybug:{text:`<p>脑子嗡了一下。你写的代码。那个抄送功能。导致了线上故障。脸上发烫,手心全是汗。</p><p>老张拍了拍你的肩膀:"先别想这个。谁都会出Bug。先修。"</p><p>他用力点了点头,把情绪压下去,打开代码开始改。</p>`,choices:[{t:'🛠️ 马上改',next:'ch3_hotfix',fx:{"skill":"coding"}}]},
1010 ch3_hotfix:{text:`<p>定位很快。批量插入没做去重。修复不复杂:插入前去重,加唯一索引兜底。改完、编译、老张review通过。</p><p>你手抖着敲下部署命令。屏幕上一行一行日志滚过——<span class="mono">[INFO] Health check passed...</span></p><p>群里弹出一条消息:<span class="good">「审批流已恢复,积压单子正在处理。」</span></p><p>你整个人靠在椅背上。后背的衣服湿透了。</p>`,choices:[{t:'😮💨 复盘一下',next:'ch3_postmortem'}]},
1011 ch3_postmortem:{text:`<p>凌晨三点。线上恢复了。后端组几个人瘫在工位上,有人点了外卖当宵夜。</p><p>老刘挂了最后一个客户电话:"今天辛苦大家了。明天上午十点复盘会。"你说这话时没看你,但你知道明天会上会讨论你写的那段代码。</p><p>老张端了杯水过来放在他桌上:"还在想那个Bug?记着这个感觉。以后你写每一行代码之前,都会多犹豫三秒。这是好事。"</p><p class="sys">线上没有小Bug。</p>`,choices:[{t:'📝 回家写复盘笔记',next:'ch3_go_home'}]},
1012 ch3_go_home:{text:`<p>凌晨四点走出办公室。天边泛起鱼肚白,街道很安静。打车回家,靠着车窗。心情复杂。自责。后怕。还有一种奇怪的踏实感。你经历了一次线上事故。你修好了它。你还活着。</p><p>回到隔断间,躺在床上打开备忘录写下一行字:<span class="mono">"批量写入前一定要去重。记住。"</span></p>`,choices:[{t:'😴 睡觉',next:'ch3_end2'}]}
1013 }
1014 },
1015 {
1016 title: '第四章 · 初露锋芒',
1017 start: 'ch4_start',
1018 scenes: {
1019 ch4_new_responsibility:{text:`<p>王姐开始让你参与一些非技术的工作——客户沟通、需求评审、排期规划。一开始你觉得这些事跟写代码没关系浪费时间。后来你发现——你写出的代码越来越符合客户的需求了。不是因为你的技术变好了。是因为你开始理解业务了。有一天你在需求评审会上提出了一个连产品经理都没发现的逻辑漏洞。Tony看了你一眼——「你转行做产品吧。」你说:「不了。我还是喜欢写代码。」但你心里挺高兴的。</p>`,choices:[{t:'📋 继续',next:'ch4_discuss'}]},
1020ch4_big_project:{text:`<p>你接手了一个大项目——把公司老旧的报表系统整个重做。数据量很大逻辑很复杂。你花了一周做调研画了二十几页的架构图。方案评审的时候你一个人讲了四十分钟。讲完之后王姐说了一句话——「这个方案可以直接开始做。」你回到工位坐下的时候发现手心里全是汗。但你知道——你做到了。</p>`,choices:[{t:'💪 开工',next:'ch4_doit'}]},
1021ch4_independent:{text:`<p>你独立负责的第二个项目上线了。这次没有老张兜底——从方案设计到代码实现到上线部署全是你一个人搞定的。上线之后你在群里发了一条消息。老张回了一个字:「嗯。」你知道这个「嗯」的意思——你放心了。</p>`,choices:[{t:'✅ 上线',next:'ch4_launch'}]},
1022ch4_self_review:{text:`<p>转正后的周末你坐在家里翻看自己这半年的代码提交记录。三百多个commit,从最开始的「fix typo」到后来的「optimize query performance」。你一个一个看过去,像翻一本日记。最早的代码你看了都想笑——变量名叫a、b、temp,函数全是拼音。最新的代码已经规范了很多。你关了电脑靠在椅背上。半年时间你写了三百多次commit。每一次都在变好一点点。</p>`,choices:[{t:'😊 继续进步',next:'ch4_optimize'}]},
1023 ch4_new_challenge:{text:`<p>王姐给了你一个新任务——带一个实习生。你听到之后第一反应是「我?带人?我才刚转正。」王姐说——「你能教他的,比你想象的要多。」实习生来的那天你带你走了一圈办公区、帮他搭环境、给你讲了项目架构。你发现自己说的话跟老张当年说的一模一样——「先看代码,有不懂的问我。」你说完之后在心里笑了一下。你变成了你当初遇到的那个人。</p>`,choices:[{t:'👨🏫 开始带人',next:'ch4_discuss'}]},
1024ch4_team_lunch:{text:`<p>转正后你请全组吃了一顿饭。你选了公司楼下那家你们经常去的烤串店。老张、林悦、王宇、小陈、Tony——一个不落。你举着杯子站起来说了一句:「谢谢大家这半年的照顾。」说完你觉得这句话太正式了有点尴尬。小陈笑着说:「你这致辞好像获奖感言。」大家都笑了。你坐下来的时候林悦在你旁边小声说了一句:「致辞挺好的。」你侧过头看她。她在笑。你也笑了。</p>`,choices:[{t:'🥂 吃串!',next:'ch4_dinner'}]},
1025ch4_standup_detail:{text:`<p>站会上你汇报完了本周的工作。王姐听完之后看了你一眼说:「段飞,你上次提的那个数据库索引优化方案,写个文档发全组学习一下。」你愣了一下——她让你写文档发全组。这不是一个任务,这是一份认可——她认为你的方案值得大家学习。</p><p>站会结束后你回到工位,打开文档写了起来。写到一半林悦发消息:「王姐让你写文档了?她一般不让人写学习文档的。」你回她:「我知道。」三个字打出来的时候你嘴角是翘着的。</p>`,choices:[{t:'📝 认真写',next:'ch4_discuss'}]},
1026 ch4_refactor_feeling:{text:`<p>你写了一周的优化方案,把那个老模块的性能提升了三倍。上线那天你盯着监控面板看了一整天——响应时间从800ms降到了250ms,错误率归零。你截了一张监控图存在手机里。这是你的第一个独立优化项目,从分析到设计到落地全是你一个人完成的。晚上你给妈妈打电话的时候说起这个,她听不懂但很开心地说:「我儿子真厉害。」你说:「妈,SQL优化,说了你也不懂。」她说:「不懂。但妈知道你厉害就行了。」</p>`,choices:[{t:'😊 挂了电话',next:'ch4_launch'}]},
1027ch4_morning_routine:{text:`<p>半年后的一个普通早晨。你刷卡进公司的时候,前台姑娘抬头看了你一眼:「早啊,段飞。」</p><p>你走到工位前。显示器边框上贴了两张便利贴。一张是入职那天贴的,边角已经卷起来了;一张是林悦写的「新的一周继续加油」。你打开电脑。新的一周开始了。</p>`,choices:[{t:'💻 查邮件',next:'ch4_start'}]},
1028 ch4_code_improve:{text:`<p>你打开自己半年前写的用户反馈系统代码看了看。代码能跑,但全是问题:没有异常处理、日志打得太随意、SQL没考虑性能。你打开一个新分支开始重构,改完之后提交了一个commit:<span class="mono">「优化。半年后看。」</span></p><p>老张路过看了一眼:「知道自己以前写的代码烂了,说明你在进步。」</p>`,choices:[{t:'😊 继续干活',next:'ch4_start'}]},
1029 ch4_wangyu_chat:{text:`<p>中午在茶水间接水的时候遇到了王宇。你压低声音说听说你涨了20%,比你自己转正时涨得还多。你笑了笑,可能跟你那次线上事故处理得还行有关系。你说你写的回滚操作手册他也打印了一份贴工位上了。你愣了一下——你写的东西真的有人在用。</p>`,choices:[{t:'😊 回工位',next:'ch4_start'}]},
1030 ch4_after_office:{text:`<p>从王姐办公室出来,你看着那张涨薪通知。8000→9600。你拍了张照发给妈妈。就在半年前你还在隔断间吃泡面刷招聘网站,现在你转正了、涨薪了、还有一个关系不错的同事。你心里有一种从未有过的平静。</p>`,choices:[{t:'📞 给妈妈打电话',next:'ch4_happy'}]},
1031 ch4_call_mom_detail:{text:`<p>你走到楼梯间打电话。妈妈的声音带着紧张:「上班时间咋打电话了?出啥事了?」你笑了:「妈,我转正了,涨了20%。」妈妈的声音高了八度:「太好了!妈再给你寄点腊肉——」你挂了电话站在窗前。窗外是北京秋天的天空。蓝得很干净。</p>`,choices:[{t:'📱 回工位',next:'ch4_tell_mom'}]},
1032 ch4_plan_afternoon:{text:`<p>下午。你心情完全静不下来,打开编辑器写了三行代码又删了两行。你干脆关掉文件打开了周报模板:1.完成数据导出模块 2.协助前端联调 3.准备下周技术分享。第三项空着——你完全不知道自己要分享什么。要不就从那次线上事故复盘开始讲起?</p>`,choices:[{t:'📝 准备PPT',next:'ch4_work_afternoon'}]},
1033ch4_start:{text:`<p>半年过去了。你已经不是那个在面试间手忙脚乱的新人了。</p><p>三个项目、两次线上事故、无数次加班到深夜。技术栈从PHP扩展到了Node.js和Python。工位上的东西也变多了。多了一盆新的多肉、一条外接显示屏、一个印着公司logo的保温杯。</p><p>一天上午,王姐在群里@了他。<span class="mono">@你 来一下我办公室。</span></p>`,choices:[{t:'😰 去王姐办公室',next:'ch4_office'},{t:'🌟 站会上被表扬',next:'ch4_standup_praise'},{t:'⚔️ 代码报错,干它!',next:'__FIGHT__',fx:{"exp":13}}]},
1034 ch4_office:{text:`<p>你敲了敲门。王姐正在看文档。你坐下来后她合上电脑。</p><p>"你。来公司半年了。三个项目按时交付,质量在线。上次线上事故虽然是你搞的,但复盘和改进都做得不错。公司决定提前给你转正。月薪涨百分之二十。"</p><p>你愣住了。她从抽屉里拿出一份文件推到你面前——<span class="mono">薪资调整通知 · 你 · 8000 → 9600</span></p>`,choices:[{t:'🙏 谢谢王姐!',next:'ch4_happy',fx:{"exp":20,"hp":10,"money":300}}]},
1035 ch4_happy:{text:`<p>走出王姐办公室。感觉整个人都是飘的。你盯着通知看了好几遍。20%的涨薪。不多,但这是你第一次觉得自己被认可了。</p><p>你先给妈妈打了电话:"妈。我涨工资了!""真的?!涨了多少?""20%。""太好了!妈给你寄点腊肉——"</p><p>挂了电话。林悦的消息弹出来:<span class="info">"听说你转正涨薪了?🎉 晚上庆祝一下?"</span>你秒回了一个"好"。然后放下手机,靠在椅背上。感觉今天的一切都好得不真实。</p>`,choices:[{t:'📞 也给爸打个电话',next:'ch4_tell_mom',fx:{"exp":10,"hp":10}}]},
1036 ch4_tell_mom:{text:`<p>你挂了妈妈的电话又拨通了爸爸的——</p><p>"爸。我转正了,涨了20%。"</p><p>电话那头沉默了两秒:<span class="good">"嗯。好。"</span></p><p>你爸就是这么个人。话不多,但你听得出他声音里的高兴。你挂了电话,坐在工位上。嘴角压不下去。</p><p>小陈从旁边探过头来:<span class="good">"兄弟。你这一下午傻笑什么呢?涨工资了?"</span></p><p>"你怎么知道?"</p><p>"你那嘴角都快翘到后脑勺了。全公司都看见了。"</p><p>你笑出了声。感觉今天的一切都好得不太真实。</p>`,choices:[{t:'📱 回林悦的消息',next:'ch4_reply_lin',fx:{"exp":10,"hp":5}}]},
1037 ch4_reply_lin:{text:`<p>你拿起手机。给林悦回了消息:<span class="mono">"好啊。晚上几点?我请你。"</span></p><p>她秒回:<span class="info">"七点?我来定地方。你只管带着好心情来就行了 😄"</span></p><p>你放下手机。看着屏幕上她的头像。一只橘猫。戴着工牌。</p><p>你发现自己在看她的头像发呆。</p><p>你赶紧把手机翻了过去。像是什么秘密被人发现了一样。</p>`,choices:[{t:'⏰ 等下班',next:'ch4_work_afternoon',fx:{"exp":5,"hp":5}}]},
1038 ch4_work_afternoon:{text:`<p>下午剩下的时间里。你写代码的效率出奇地高。三个Bug一会儿就修完了。还抽空把明天要交的周报也提前写了。</p><p>老张路过的时候。站在你身后看了一会儿你的屏幕。</p><p>"今天状态不错。"你说。</p><p>"嗯。心情好。"</p><p>老张没问为什么,但你走的时候。你好像看到你的嘴角动了一下。</p><p>你看了看时间。五点四十。还有一个多小时。你打开浏览器。搜了一下"三里屯日料推荐"。然后赶紧把页面关了。</p>`,choices:[{t:'🏃 准时下班',next:'ch4_dinner',fx:{"exp":10}}]},
1039 ch4_dinner:{text:`<p>晚上七点。林悦带你去了三里屯一家日料店。暖黄色灯光和烤肉的香气扑面而来。她点了一瓶清酒。</p><p>"庆祝你转正。来,走一个。"你们碰了一下杯。</p><p>"半年了感觉怎么样?"她问。"挺好的。学到的东西比大学四年都多。"她点了点头:<span class="good">"第一年是最难的。熬过去就好了。"</span></p><p>她今晚穿着那件白T恤。袖口有一小块墨水的痕迹。你发现你已经开始留意她身上的小细节了。</p>`,choices:[{t:'🥂 跟她聊天',next:'ch4_chat',fx:{"exp":10,"hp":10}}]},
1040 ch4_chat:{text:`<p>你们聊了很多。聊技术、聊产品、聊公司八卦。她告诉你老张其实才35岁——"他头发少是遗传,不是写代码写的。"</p><p>"那个面瘫大叔才35?"你不敢相信。"他22岁就出来工作了。十几年老程序员了。"</p><p>她又给你倒了一杯。你的脸开始发热。不知道是酒精的原因,还是她坐在你对面、隔着吧台暖光看着你的原因。</p>`,choices:[{t:'🌉 散步回家',next:'ch4_walk',fx:{"exp":10,"hp":5}}]},
1041 ch4_walk:{text:`<p>走出日料店。快十点了。秋天的风带着凉意。她缩了缩脖子。你把外套脱下来递给她:"穿上吧。"她接了过去。指尖碰到你的手,有点凉。</p><p>她穿着你的外套。袖子有点长,她把袖口往上卷了一下。</p>`,choices:[{t:'🚶 送到地铁站',next:'ch4_goodbye',fx:{"exp":15,"hp":10}}]},
1042 ch4_goodbye:{text:`<p>走到地铁口。她把外套脱下来递给你。"谢谢。""不客气。"她走进闸机。回头看了你一眼:<span class="good">"明天见。"</span></p><p>你站在原地直到她的背影消失。那件外套上残留着她的香味。你没有马上穿上,搭在手臂上走回了家。</p><p>到家后收到她的消息:<span class="info">"到家了。今晚很开心 😄"</span></p>`,choices:[{t:'😴 睡觉',next:'CHAPTER_COMPLETE',fx:{"exp":15,"hp":15}}]},
1043 ch4_after_fight:{text:`<p>你盯着屏幕上红色的报错信息。深吸一口气——<span class="mono">"行。那就干吧。"</span></p><p>三个小时后。凌晨一点半。最后一个单元测试通过了。你靠回椅背。手指有点发抖。眼睛干涩得不行,但你做到了。</p><p>你盯着绿色的测试结果看了十秒钟。然后拍了拍自己的脸。把修复代码push到了master。</p><p>走出电梯的时候。你看到大楼门口的保安大叔正在看手机。"加班到这么晚?"你问。</p><p>"嗯。修了个Bug。"你笑了笑——"修好了。"</p><p>大叔对你竖了个大拇指。走出大楼。凌晨的凉风扑面。你掏出手机在群里发了条消息:<span class="mono">已修复,上线观察。</span></p><p>两分钟后老刘回了一个字:<span class="good">"好。"</span></p><p>就这一个字。你觉得今晚的班加得值了。</p>`,choices:[{t:'🙏 第二天站会被表扬',next:'ch4_standup_praise',fx:{"exp":20,"hp":10}}]},
1044 ch4_standup_praise:{text:`<p>周一的站会上,老刘在所有人面前说:"上周的线上事故虽然是你的代码引起的,但你的响应速度和处置方式是值得肯定的。凌晨一点被叫过来,十分钟定位问题,半小时修复上线。这种态度很好。"</p><p>你愣一下,王宇在人群后面悄悄对你竖了个大拇指。</p><p>老张低声说:"老刘这个人对事不对人。Bug是Bug,但你的反应你看在眼里。"</p>`,choices:[{t:'🙏 继续踏实干活',next:'ch4_optimize',fx:{"skill":"coding"}}]},
1045 ch4_optimize:{text:`<p>站会后老张给你安排了新任务:"审批列表页加载很慢,客户反馈翻页要等好几秒。你看看能不能优化一下。"</p><p>你打开接口代码,发现是一个连表查询。没有加索引,而且查了一大半没用上的字段。你花了一上午分析,发现三个问题:</p><p>1. 缺少联合索引,导致全表扫描<br>2. SELECT * 查了很多无用字段<br>3. 数据量到了五十万行,深度分页越往后越慢</p>`,choices:[{t:'📊 先跟老张讨论',next:'ch4_discuss'},{t:'🔧 直接动手',next:'ch4_doit',fx:{"skill":"coding"}}]},
1046 ch4_discuss:{text:`<p>你先去找老张讨论方案。老张听完你的分析眼睛亮了:"游标分页?你知道怎么做吗?"</p><p>"用上一页最后一条记录的ID做条件代替OFFSET。"</p><p>"行啊你。"老张笑着说,"但这个方案需要前端配合改传参方式,你先跟王宇说一下。"</p><p>你去找王宇,你表示没问题。前端后端达成一致,你回到工位开始写代码。</p>`,choices:[{t:'💻 开干',next:'ch4_doit',fx:{"skill":"coding"}}]},
1047 ch4_doit:{text:`<p>你花了整个下午写优化代码。加联合索引、重构查询、改成游标分页、去掉冗余字段。每改完一个地方就跑一遍单元测试。</p><p>下班前性能测试结果出来了:</p><p class="good">优化前:第50页加载耗时4.8秒<br>优化后:第50页加载耗时0.3秒</p><p>十六倍的提升。王宇也改好了前端,联调一次通过。老张看完性能报告沉默了几秒:"这是你一个人搞的?"</p>`,choices:[{t:'🚀 准备上线',next:'ch4_launch'}]},
1048 ch4_launch:{text:`<p>优化代码上线后立竿见影。客户第二天反馈:<span class="good">"审批列表页快了很多,谢谢。"</span></p><p>老刘在群里@了你两个字:<span class="good">"不错。"</span></p><p>就这两个字让你心里美了一整天。中午吃饭时王宇坐到你对面:"你这次优化做得真好,那个页面慢的问题被吐槽了半年。"</p>`,choices:[{t:'😊 继续加油',next:'ch4_goodbye'}]}
1049 }
1050 },
1051 {
1052 title: '第五章 · 996的考验',
1053 start: 'ch5_start',
1054 scenes: {
1055 ch5_team_dinner:{text:`<p>加了一个月的班之后团队终于出去吃了一顿好的。大家坐在火锅店里热气腾腾的锅底咕嘟咕嘟冒着泡。王宇涮了一片毛肚七上八下然后塞进嘴里露出满足的表情。小陈在涮蔬菜。老张在调一碗很辣的蘸料。林悦坐在你旁边往你碗里夹了一块牛肉——「多吃点。你瘦了。」你低头看着那块牛肉想起她上次也说同样的话。你夹起来吃了。挺好吃的。不是因为牛肉好是因为有人记得你瘦了。</p>`,choices:[{t:'🍲 吃火锅',next:'ch5_weekend_after'}]},
1056ch5_weekend_movie:{text:`<p>终于有一个周末没有加班。你去看了一场电影——一个人。电影很好看但你看到一半的时候想——如果林悦也在这里就好了。你拿出手机拍了一张票根发给她。她秒回:「你居然去看电影了?不叫我?」你说:「你也没说你想看啊。」她说:「下次叫我。」你说好。你把手机收起来后面的电影讲了什么你没太看进去。你在想——下次是什么时候。</p>`,choices:[{t:'📱 发消息',next:'ch5_weekend_after'}]},
1057ch5_morning_after:{text:`<p>有一天你加班到凌晨才回家。第二天早上到公司的时候发现桌上放着一杯咖啡——还冒着热气。你看了看四周没人。你端起咖啡喝了一口——正好是你喜欢的温度。你打开手机给林悦发了一条消息:「咖啡是你放的?」她回了一个笑脸:「不知道你在说什么。」你笑了。你放下手机开始一天的工作。那杯咖啡让你觉得昨晚的加班没那么难熬。</p>`,choices:[{t:'☕ 喝咖啡',next:'ch5_exhausted'}]},
1058ch5_complex_bug:{text:`<p>有一个Bug你在本地怎么也复现不了。你在代码里加了一堆日志重新部署到线上等了两个小时——终于复现了。原因是一个多线程的竞态条件你看了很久才看懂。你修好之后在代码上方加了一行大大的注释——「此处有坑。修改前请找段飞。」</p>`,choices:[{t:'✅ 搞定',next:'ch5_noodles'}]},
1059ch5_overtime_limit:{text:`<p>连续加班三周之后你的身体开始抗议了。有一天早上你起来的时候发现脖子动不了——落枕了。你歪着脖子去上班。林悦看到你的样子笑了好久然后说——「你今天别写代码了。去按摩吧。」你歪着脖子看了她一眼:「你觉得我这样能去按摩吗?」她笑得更厉害了。</p>`,choices:[{t:'💆 去按摩',next:'ch5_weekend_after'}]},
1060ch5_bug_night:{text:`<p>Bug修到凌晨一点终于找到了原因——一个字段类型对不上。字符串传到数据库的时候被隐式转换导致索引失效。你改完之后想——这个Bug花了你四个小时。但下次你再也不会犯同样的错了。</p>`,choices:[{t:'😴 睡觉',next:'ch5_noodles'}]},
1061 ch5_late_dinner:{text:`<p>加班到晚上十点叫了一份外卖。等餐时你站在窗前往外看。北京夜景里有一栋楼的灯还亮着大半。你的手机响了——下楼取餐。门口放着一瓶酸奶没有纸条。你愣了一下然后笑了。你知道是谁放的。你拿起那瓶酸奶上楼。</p>`,choices:[{t:'😊 吃宵夜',next:'ch5_midnight'}]},
1062ch5_coding_night:{text:`<p>又一次加班到凌晨。整层楼只有你的工位还亮着灯。你写完了最后一段代码,伸了一个懒腰——骨头咔嚓响了一声。你站起来活动了一下脖子,走到窗前往外看。北京的凌晨很安静。远处有几盏灯还亮着——可能是跟你一样在加班的人。你突然想到了一个问题:如果有一天你不用加班了,你会做什么?你想了想说不上来。但你确定你不想现在就停下来。</p>`,choices:[{t:'😴 回家睡觉',next:'ch5_weekend_after'}]},
1063 ch5_saturday_rest:{text:`<p>这个周六你强迫自己没开电脑。你睡到了中午,起来煮了一碗面,然后坐在沙发上发了好一会儿呆。你发现自己不知道不加班的时候该干什么。你打开手机刷了一会儿视频。又关上了。你站起来在屋里走了两圈。最后你拿起那本买了很久但一直没看的《代码整洁之道》翻了几页。看着看着就看进去了。你发现不加班的时候看书也挺好的。</p>`,choices:[{t:'📖 看书',next:'ch5_weekend_after'}]},
1064ch5_bug_hunt:{text:`<p>有一个Bug你追了三天。线上偶发,本地无法复现。你加了日志、加了监控、加了断点——什么都抓不到。第三天晚上你准备放弃的时候突然想通了一个可能性——不是代码逻辑的问题,是数据的问题。有一条脏数据导致了一个分支判断走到了意料之外的路径。你修好了那个Bug,然后花了两个小时写了一段数据清洗的脚本。那一刻你觉得,做程序员最爽的时候不是代码跑通的那一瞬间,是找到那个你找了很久的问题的那一刻。</p>`,choices:[{t:'✅ 搞定',next:'ch5_noodles'}]},
1065 ch5_sleep_deprived:{text:`<p>连续加班两周之后的一个早上,你在地铁上睡着了。醒来的时候发现自己坐过了站——已经到终点站了。你迷迷糊糊地下了车,站在站台上愣了十几秒才搞清楚自己在哪。你给老张发了条消息说可能会晚到一会儿。你回:「昨晚几点走的?」你说:「两点。」他说:「今天早点走。代码不会跑的。」你看着那条消息,觉得老张这个面瘫其实挺关心人的。虽然你的关心方式是用命令句。</p>`,choices:[{t:'😅 回公司',next:'ch5_exhausted'}]},
1066ch5_996_mid:{text:`<p>连续加班两周后的一个周二晚上。你坐在工位上盯着屏幕,眼睛酸得不行。你揉了揉眼睛,发现视力好像变模糊了。你赶紧闭了一会儿眼睛。睁开之后好了一点。你告诉自己——等下一定要在十二点之前走。然后你看了一眼任务列表,还有三个Bug没修。十二点十分的时候你关了电脑。你走到电梯口的时候发现林悦也刚走。她看到你的黑眼圈吓了一跳:「你还好吧?」你说:「还活着。」她没笑。</p>`,choices:[{t:'😩 回家',next:'ch5_weekend_after'}]},
1067 ch5_weekend_work:{text:`<p>周六下午你在家还是打开了电脑。有一个问题你在脑子里转了一上午了——一个诡异的并发Bug,你在纸上画了十几张流程图都没想通。你打开IDE把代码跑了一遍,加了一些日志。跑了三遍之后你发现了一个之前没注意到的线程交错。你改了一行代码,跑了十遍测试,全过了。你合上电脑,长长地呼出一口气。然后你发现外面的天已经黑了。你整整坐了一下午。</p>`,choices:[{t:'😴 休息',next:'ch5_weekend_after'}]},
1068ch5_monday_morning:{text:`<p>周一早上你到公司发现气压有点低。王宇面前放着一杯没怎么喝的咖啡,小陈的座位是空的。你看到了群里的消息——上个版本上线出了一个事故。不是你背锅,但全组的气氛让你坐立不安。你坐在工位上,不知道干什么。你第一次感受到——不是自己的Bug,但整个团队的气氛还是会影响到你。</p>`,choices:[{t:'😰 先把手头事做好',next:'ch5_start'}]},
1069 ch5_overtime_feeling:{text:`<p>已经连续加班一周多了。每天晚上十点以后才能走。你站起来接水,路过茶水间的镜子看了一眼自己——黑眼圈重得跟被人打了一拳似的。你端着水杯站在窗前。北京夜晚灯火通明。这个城市好像永远有人在工作。</p>`,choices:[{t:'😩 回去继续写',next:'ch5_exhausted'}]},
1070 ch5_overtime_dinner:{text:`<p>晚上八点。你叫了一份麻辣烫,一边吃一边看监控面板。林悦走过来说你是不是觉得不加班就显得不够努力。她说中了。她告诉你刚来的时候也这样,后来发现加班加出来的代码第二天多半要重写。你看着碗里的麻辣烫觉得她说得有道理,但今天还是想把这个Bug修完再走。</p>`,choices:[{t:'😅 先修完这个Bug',next:'ch5_midnight'}]},
1071 ch5_midnight_code:{text:`<p>凌晨一点。办公室只剩你一个人。一个诡异的并发问题你已经找了两个小时了。两个线程同时写同一个文件导致数据错乱。你在网上查了半天,发现自己之前用错了FileLock——你需要的是synchronized。你改了代码跑了五次全对。空无一人的办公室里你小声说了一句:「成了。」</p>`,choices:[{t:'🏠 回家',next:'ch5_midnight'}]},
1072 ch5_weekend_relief:{text:`<p>周六下午你终于可以在家待着了。睡到中午十一点,煮了一包方便面加了一个鸡蛋。手机震了。林悦问你要不要出来走走,今天天气很好。你看着窗外——确实很好,天蓝得不像北京。你回她:「好。去哪?」</p>`,choices:[{t:'☀️ 出门走走',next:'ch6_lingering'}]},
1073 ch5_code_review_v2:{text:`<p>你把修好的代码提交了第二次Review。这次你做了完整测试、写了单元测试、加了注释解释为什么用synchronized。老张看完回了一行字:<span class="good">「这版可以。合并吧。」</span></p><p>你盯着那四个字看了好久。比上次涨薪还开心。</p>`,choices:[{t:'🎉 合并',next:'ch5_exhausted'}]},
1074ch5_start:{text:`<p>好景不长。</p><p>周一早会,王姐表情严肃地走进会议室。她手里没拿笔记本,空着手——这在平时很少见。</p><p>"公司拿了B轮融资,但对手也在发力。从下周起,全员996。"</p><p>会议室安静了几秒。你看到老张攥紧的拳头慢慢松开——不是接受,是无奈。林悦咬着嘴唇,目光落在桌面上。</p><p>你的心沉了一下。996——早上九点到晚上九点,一周六天。它终于来了。</p>`,choices:[{t:'💪 接受996,趁年轻拼一把',next:'ch5_accept'},{t:'😎 表面996,实际摸鱼',next:'ch5_slack'},{t:'🗣️ 找王姐谈谈',next:'ch5_talk'},{t:'⚔️ 遇到Bug,先打一架',next:'__FIGHT__',fx:{"exp":15}}]},
1075 ch5_after_fight:{text:`<p>你盯着那个堆栈错误——三页长的traceback。你从下往上一行一行追,像走迷宫。</p><p>半小时后找到了:一个并发条件下才会触发的竞态条件。修复不复杂,跑了一遍压力测试,全部通过。你靠在椅背上长出一口气。</p><p>王宇凑过来:<span class="info">"搞定了?"</span><br>"高并发下的竞态条件。"<br>他拍了拍你的肩膀:"可以啊,这种Bug你都能搞定了。"</p><p>你笑了,但你心里清楚,这种Bug查一次少活三年。刚想歇口气,新需求又到了。996的时代,喘口气都是奢侈。</p>`,choices:[{t:'💪 接受996,趁年轻拼一把',next:'ch5_accept',fx:{"exp":20,"hp":-5}}]},
1076 ch5_accept:{text:`<p>你决定拼了。每天早九点到晚九点,周末也来。你跟老张一样在桌上摆了两杯咖啡——上午一杯提神,下午一杯续命。代码量上去了,睡眠质量下来了。</p><p>有一天凌晨一点你还在写代码。办公室里只剩你一个人和安全出口指示灯渗出的绿色荧光。你站起来想去倒杯水——走到茶水间门口,看到林悦也从工位上站了起来。她也没走。</p>`,choices:[{t:'☕ 跟她一起去倒水',next:'ch5_midnight',require:{accessory:1},fx:{"exp":15,"hp":-5}}]},
1077 ch5_midnight:{text:`<p>茶水间的灯亮着。林悦站在饮水机前,手里拿着空杯子。她看起来有点疲惫——头发随便扎了一下,眼睛下面有浅浅的黑眼圈。</p><p>"你也没走?"你说。<br>她笑了笑:<span class="good">"前端有个Bug死活搞不定。你呢?"</span><br>"写不完的需求。"</p><p>她按了一下热水键,机器发出咕噜咕噜的声音。在安静的深夜里,这个声音格外清晰。</p><p>"累吗?"你问。<br>她想了一下:<span class="good">"累,但还能撑。"</span>她转头看你,<span class="good">"你呢?"</span><br>"我也累,但不知道为什么,还能撑。"</p><p>她没有接话。你们一起站在那儿,听着饮水机的声音。好像两个人一起熬,就没那么难熬了。</p>`,choices:[{t:'💻 回去继续写',next:'ch5_exhausted',fx:{"exp":15,"hp":5}}]},
1078 ch5_weekend:{text:`<p>996的第一个周末。周六早上九点你坐在工位上,看着空荡荡的办公室。窗外的阳光很好,但跟你没什么关系。</p><p>你打开电脑盯着代码,一个字都写不进去。手机震了一下。林悦:<span class="info">"你也在公司?"</span><br>"在。你也在?"<br>"嗯。中午一起吃饭?楼下新开了一家面馆。"</p><p>你看了看时间——才十点。还有两个小时,但你突然觉得这个周末好像也没那么难熬了。</p>`,choices:[{t:'🍜 等中午一起去吃面',next:'ch5_noodles',fx:{"exp":5,"hp":5}}]},
1079 ch5_noodles:{text:`<p>中午十二点。你们坐在那家新开的面馆里。</p><p>店面不大,但很干净。墙上贴着繁体字的菜单。老板是重庆人,操着一口浓重的方言招呼客人。</p><p>她要了一碗牛肉面。你点了豌杂面。</p><p>等面的时候。她刷着手机。突然笑了一下:<span class="good">"你看这个——"</span>她把手机转过来。是一个程序员笑话。</p><p>你笑了。然后又觉得有点心酸:"周末加班的时候刷到这种笑话。真不知道是该笑还是该哭。"</p><p>她把手机收回去。认真地看着你:<span class="good">"你觉得——996能撑多久?"</span></p>`,choices:[{t:'🤷 "撑到撑不下去为止吧"',next:'ch5_weekend_after',fx:{"exp":10,"hp":5}},{t:'💪 "我想撑过去"',next:'ch5_weekend_after',fx:{"exp":15,"hp":10}}]},
1080 ch5_weekend_after:{text:`<p>你们吃完面走回公司。阳光很好,秋天的银杏叶落了一地金黄。你踩着一片落叶,咔嚓一声脆响。</p><p>"你知道吗——"她突然开口,<span class="good">"我以前在上一家公司也是996。撑了半年实在撑不下去了,就跳到了这里。"</span><br>"那这里也996,你受得了吗?"<br>她想了想:<span class="good">"这里不一样。这里的人,我喜欢。"</span></p><p>她说的是"人"——不是技术,不是待遇。你说不清自己是不是想多了,但心跳了一下。</p>`,choices:[{t:'😊 回公司继续写代码',next:'ch5_exhausted',fx:{"exp":10,"hp":5}}]},
1081 ch5_exhausted:{text:`<p>又过了两周。你的身体开始报警了——失眠、掉头发、腰酸背痛。有一天早上你醒来,发现枕头上散落着好几根头发。你对着镜子看了半天,发现自己瘦了一圈。</p><p>你坐在工位前盯着屏幕,一个字都写不出来。林悦路过的时候在你桌上放了一瓶牛奶和一块面包。<span class="good">"吃早饭了吗?"</span>你摇了摇头。</p><p>她叹了口气,在你旁边坐下来,安静了几秒,然后说:<span class="good">"你这样撑不了多久的。你得学会偷懒。"</span></p>`,choices:[{t:'🤔 怎么偷懒?',next:'ch5_skill',fx:{"exp":10,"hp":5}}]},
1082 ch5_skill:{text:`<p>林悦教你——不是让你不干活,是让你优化干活的方式。她列了几条:重复的事情写脚本自动化;能问别人的别自己死磕;学会说'这个做不完';中午一定要休息,不管多忙。</p><p>你照着她说的试了一周,效率不但没降反而提高了。有一天你正趴在桌上睡午觉,有人在你背上披了一件衣服。你迷迷糊糊睁开眼,看到林悦的背影走远了。你身上披着她的牛仔外套。你闭上眼睛,嘴角翘了一下,继续睡。</p>`,choices:[{t:'💪 调整节奏坚持下去',next:'ch5_end2',fx:{"exp":20,"hp":10}}]},
1083 ch5_slack:{text:`<p>你决定表面996,实际高效摸鱼。带薪拉屎、假装盯代码实则刷手机、会议发呆——你都学会了。一个月下来精神状态不错,但月末绩效评估排名垫底。王姐找你谈话了。</p>`,choices:[{t:'😥 以后认真点',next:'ch5_end2',fx:{"exp":10,"hp":5}}]},
1084 ch5_talk:{text:`<p>你找了个机会跟王姐单独聊了一次,坦诚说了自己对996的担忧。王姐沉默了一会儿:<span class="good">"你说得有道理。这样,我争取搞大小周,你们用效率说话。"</span>你没想到老板居然听进去了。林悦听说后给你发了一个竖起大拇指的表情。</p>`,choices:[{t:'🙏 用行动证明',next:'ch5_end2',fx:{"exp":30,"atk":1,"def":1}}]},
1085 ch5_end2:{text:`<p>996风波总算过去了。公司调整了制度,虽然还是忙,但不那么疯狂了。</p><p>有一天你在茶水间碰到老张,你难得笑了一下:<span class="info">"听说你跟王姐谈了?胆子不小。"</span><br>"我就是说了实话。"<br>老张拍了拍你的肩,什么都没说——但那个动作比任何话都重。</p><p>下班的时候林悦在公司门口等你。<span class="good">"今天不加班,有什么安排?"</span><br>"没有。"<br>"那陪我去买杯奶茶?"</p><p>你跟着她走在北京的暮色里。996虽然苦,但有这些人在身边,好像也没那么苦了。</p>`,choices:[{t:'👉 前往第六章',next:'CHAPTER_COMPLETE',fx:{"exp":20,"hp":10}}]}
1086 }
1087 },
1088 {
1089 title: '第六章 · 转角遇到爱',
1090 start: 'ch6_start',
1091 scenes: {
1092 ch6_first_gift:{text:`<p>你过生日那天林悦送了你一个礼物。一个很小的盒子你拆开一看——一枚书签。银色的上面刻着一行字:「代码如诗。」你看着那四个字笑了很久。后来那枚书签一直夹在你最常看的那本技术书里。每次翻到那一页你就会看到那四个字——「代码如诗。」</p>`,choices:[{t:'📚 谢谢',next:'ch6_shy'}]},
1093ch6_early_bird:{text:`<p>你开始习惯早到公司。不是因为活多。是因为早到的时候可以在空荡荡的办公室里待一会儿——然后在林悦来的时候假装是刚到的。有一天你到得太早了——她还没来。你坐在工位上等了一会儿听到电梯叮了一声。你的心跳了一下。她的脚步声越来越近。她出现在办公区门口看到你的时候愣了一下——「你今天怎么这么早?」你说:「睡不着。」其实你睡得很好。你只是想早点见到她。</p>`,choices:[{t:'😊 早',next:'ch6_work'}]},
1094ch6_share_song:{text:`<p>有一天晚上你在听一首歌觉得很好听就分享给了林悦。她过了一会儿回了一条语音。你点开——她在跟着那首歌哼唱。声音很轻但很好听。你听了三遍。然后你回了一条消息:「你唱歌挺好听的。」她说:「你才发现啊。」那天晚上你们聊到很晚——从这首歌聊到喜欢的歌手从喜欢的歌手聊到第一次听歌的记忆。你发现你们有很多共同点。你想——这个世界上有一个人跟你喜欢同样的歌。真好。</p>`,choices:[{t:'🎵 继续聊',next:'ch6_shy'}]},
1095ch6_linyue_help2:{text:`<p>林悦成了你在公司的「默认求助对象」。遇到不会的问题你第一个想到的不是百度也不是老张——是她。她也从来不会不耐烦。有一次你问她一个很基础的问题她回答完之后说了一句话——「你最近问问题的频率变低了。进步了。」你说:「因为之前问过的我都记住了。」她笑了笑:「不错。有前途。」</p>`,choices:[{t:'😊 继续进步',next:'ch6_work'}]},
1096ch6_linyue_food:{text:`<p>林悦有时候会给你带早饭。不是每天都带——但每当你加班到很晚第二天她会多带一份。她从来不说「这是给你带的」。她只会把袋子放在你桌上然后走开。你打开袋子——有时候是包子有时候是三明治有时候是一盒切好的水果。你吃着那些早饭的时候觉得加班好像也没那么累。</p>`,choices:[{t:'😊 吃早饭',next:'ch6_work'}]},
1097ch6_linyue_helps:{text:`<p>有一个前端问题你搞了一下午没搞定。你站起来走到林悦工位前——「悦姐。有个样式问题帮我看看。」她转过来看了一眼你的屏幕。不到一分钟就找到了问题——「你少了一个闭合div。」你愣了一下然后笑了。她拍了拍你的肩膀——「后端同学。前端不是你的强项。术业有专攻。」你说:「那你就是我的专攻。」她说:「什么?」你赶紧说:「没什么没什么。」</p>`,choices:[{t:'😅 回工位',next:'ch6_work'}]},
1098ch6_weekend_walk:{text:`<p>某个周末下午你们约了一起去颐和园。深秋的颐和园人不多。昆明湖的水面被风吹出一层又一层的波纹。你们沿着湖边慢慢地走。她走在你左边影子在下午的阳光下斜斜地落在你身上。走到一半她停下来看一群鸭子在湖里游。你站在她旁边。你没有看鸭子。你在看她。</p>`,choices:[{t:'🦆 继续逛',next:'ch6_home'}]},
1099 ch6_daily_msg:{text:`<p>不知道从什么时候开始你们每天都会聊天。不是约好的。每天早上到了工位之后她会发一条消息——「早。」然后你回一条「早。」中午她会问「吃了吗?」周末她会发一张照片——今天天气很好、她做的早饭、路边遇到的一只猫。你发现自己每天醒来第一件事就是看她有没有发消息。</p>`,choices:[{t:'📱 回消息',next:'ch6_work'}]},
1100ch6_work_lunch:{text:`<p>你们开始经常一起吃午饭。没有约定——就是每到中午她就会走过来站在你工位旁边,什么都不说。你关掉电脑跟她走。有一天下雨你们没出去吃,在公司茶水间吃各自带的三明治。她带的是鸡蛋沙拉三明治,你带的是火腿的。她掰了一半给你,你掰了一半给她。你们交换着吃的时候她说——「你觉得我们这样像什么?」你嚼着三明治想了想:「像同事。」她笑了:「对。像同事。」但你看到她笑的时候眼睛是弯的。</p>`,choices:[{t:'😊 继续吃',next:'ch6_shy'}]},
1101ch6_note_on_desk:{text:`<p>有一天早上你到工位的时候发现桌上多了一瓶牛奶和一包饼干。旁边压着一张便利贴——没有署名,只画了一个笑脸。你知道是谁放的。你坐下来,拧开牛奶喝了一口。常温的。你看了看林悦的工位——她还没到。你把那张便利贴撕下来,贴在了显示器的边框上。跟另外两张贴在一起。你后来问过她一次牛奶是不是她放的。她没承认也没否认,只是说:「你每天早上都不吃早饭,对身体不好。」从那以后你开始吃早饭了。</p>`,choices:[{t:'😊 吃早饭',next:'ch6_work'}]},
1102 ch6_weekend_movie:{text:`<p>某个周末你们一起去看了一场电影。你选了一部科幻片,她选了一部文艺片。最后你们在电影院门口剪刀石头布——她赢了。电影很慢,画面很美,讲的是一个在北海道生活的女人的故事。你其实没太看进去——因为她的手臂放在扶手上,离你的手臂很近。近到你能感觉到她袖口的布料偶尔擦过你的皮肤。电影散场后她问你电影讲了什么。你支支吾吾说了一个大概。她笑了:「你根本没看吧。」你被说中了。</p>`,choices:[{t:'😳 被发现了',next:'ch6_home'}]},
1103ch6_walk_home_feeling:{text:`<p>那天你们一起走到地铁站。雨停了,路面上还有积水,倒映着路灯的光。她走在前面几步,踩着一块松动的砖,溅起一小片水花。她回头看了你一眼笑了。你跟在后面,踩着同一块砖。水花溅起来的时候你也笑了。地铁站口分别的时候她说了句明天见。你说好。你走进闸机之后回头看了一眼——她已经走下楼梯了。马尾辫在脑后一晃一晃的。你站在原地多看了两秒才转身。</p>`,choices:[{t:'🚇 坐地铁回家',next:'ch6_home'}]},
1104 ch6_weekend_cook:{text:`<p>周末你真的去了她家做饭。一个合租的三居室,她的房间不大但收拾得很干净。窗台上摆着一盆薄荷。厨房不大但东西很全——她说她是认真地自己做饭的。你帮忙洗菜切菜,她在旁边掌勺。红烧排骨在锅里咕嘟咕嘟冒着热气的时候,她转头看了你一眼:<span class="good">「你刀工还行啊。」</span>你说:「大学的时候自己做饭吃,练出来的。」她笑了笑:「那以后你负责切菜,我负责炒。」说完之后两个人都安静了一下。你低头继续切菜,但刀速变慢了。</p>`,choices:[{t:'😳 继续做饭',next:'ch6_home'}]},
1105ch6_rain_prep:{text:`<p>下午五点半北京突然下起了大雨。你没带伞。林悦发消息问带伞了吗,你说没带。她回了一个伞的emoji:带了一把,一起走吧。</p>`,choices:[{t:'☔ 等她一起走',next:'ch6_rain'}]},
1106 ch6_rain_umbrella:{text:`<p>林悦撑开一把蓝色的折叠伞。伞不大,两个人站得有点近。她的洗衣液味道在雨天的潮湿空气里若隐若现。雨水砸在伞面上咚咚响。她说先送你。你说不用。她说顺路——说得很自然,好像没什么大不了的。</p>`,choices:[{t:'🚶 一起走',next:'ch6_rain'}]},
1107 ch6_rain_talk:{text:`<p>雨声很大,你们不得不提高音量说话。她说你瘦了,没好好吃饭吧。你愣了一下——她注意到了。她说她周六睡到下午两点。你说你也是。她说明天中午一起吃饭,她带你去找一家好吃的。</p>`,choices:[{t:'😊 好',next:'ch6_rain'}]},
1108 ch6_home_cooking:{text:`<p>周末你在家试着自己做了一顿饭。西红柿炒鸡蛋。味道还行。你拍了张照片发给林悦。她回了一张红烧排骨的照片——比你专业十倍:「下次来我家做饭吧,我教你。」你盯着那条消息发了一会儿呆。</p>`,choices:[{t:'😳 好……',next:'ch6_home'}]},
1109 ch6_guitar_night:{text:`<p>晚上你翻出了大学时买的吉他。弦都生锈了,你擦了擦调了调音,弹了一首《小星星》。断断续续的,但弹完的时候心里挺安宁的。你录了一段音频发给林悦。她回了一条语音带着笑意:「你还会弹吉他啊?下次弹给我听呗。」</p>`,choices:[{t:'😊 好',next:'ch6_guitar'}]},
1110ch6_start:{text:`<p>又是一个加班夜。你走出办公室才发现外面下着大雨。你没带伞,站在门口躲雨,冷风裹着水汽往领口里钻。</p><p>"没带伞?一起走吧。"林悦站在你身后,举着一把白色的伞。雨顺着伞沿滑落,在她脚边溅起细小的水花。</p>`,choices:[{t:'☂️ "谢谢,一起走吧"',next:'ch6_rain'},{t:'😅 "你先走吧,我等雨小点"',next:'ch6_shy'},{t:'⚔️ 来战!',next:'__FIGHT__',fx:{"exp":17}}]},
1111 ch6_after_fight:{text:`<p>Bug被你干掉了!你靠在椅背上,才发现林悦不知道什么时候站在了你身后。<br>"修完了?"她举了举手里的伞,"我还以为你要搞到天亮呢。"<br>你笑了笑,关上电脑:"走吧,一起。"<br>她撑开伞,你们并肩走进了夜色中的雨里。</p>`,choices:[{t:'☂️ 一起走在雨里',next:'ch6_shy',fx:{"exp":10,"hp":10}}]},
1112 ch6_shy:{text:`<p>"你先走吧,我等雨小点。"你说。林悦愣了一下,点了点头:<span class="good">"那行,到家了跟我说一声。"</span>她撑开伞走进雨里。你看着她的背影消失在十字路口,突然有点后悔。</p><p>你在楼下又等了十分钟,雨没有变小的意思。你叹了口气,把包顶在头上冲进了雨里。回到家已经湿透了。手机上有她发来的消息:<span class="info">"淋雨了吧?😏 下次别逞强。"</span></p>`,choices:[{t:'😅 回她消息',next:'CHAPTER_COMPLETE',fx:{"exp":10,"hp":-5}}]},
1113 ch6_rain:{text:`<p>你们并肩走在雨里。晚上十点的街道很安静,只有雨声和脚步声。她的伞不大,你们靠得很近,你的右肩淋湿了,但你没说。</p><p>"你今天怎么也没带伞?"她问。<br>"早上看天气预报说没雨——"你指了指天上。<br>她笑了:<span class="good">"北京的天气预报你也信?"</span></p><p>雨声很大,但她的笑声在雨里格外清晰。她走在你旁边,肩膀偶尔碰到你的手臂。隔着打湿的卫衣,你能感觉到她身上的温度。</p>`,choices:[{t:'💓 心跳加速',next:'ch6_arrive',fx:{"mp":10}}]},
1114 ch6_arrive:{text:`<p>到了你家楼下她停下来,把伞递给你。"你拿着吧,明天还我就行。"<br>"那你呢?"<br>"我家就在前面,跑两步就到了。"</p><p>你没接伞,把外套脱下来举过头顶:"那我送你。不能让你淋雨感冒了。"她看了你一眼,犹豫了一下,然后钻进了你的外套下面。你们之间的距离近得你能闻到她的洗发水味道——不是洗衣液,是另一种更甜的味道,像某种花香。</p><p>你们一路小跑到她家楼下。停下来的时候都喘着气,笑着——像两个放学淋雨的小学生。</p>`,choices:[{t:'😊 "到了就好"',next:'ch6_lingering',fx:{"exp":15,"hp":10}}]},
1115 ch6_lingering:{text:`<p>她站在楼门口,头发上沾着细小的雨珠。路灯的光照在她脸上,眼睛在雨夜里显得特别亮。她转过身准备进门,又回过头来:<span class="good">"要不要上来喝杯热水?你看你都湿透了。"</span>你的心跳漏了一拍。</p>`,choices:[{t:'🏠 上去坐坐',next:'ch6_home'},{t:'😅 不了,太晚了',next:'ch6_no'}]},
1116 ch6_home:{text:`<p>她的房间不大但收拾得很干净——一张书桌、一个书架、一把吉你靠在墙角。窗台上摆着几盆绿萝,在雨夜里绿得很安静。</p><p>她递给你一条毛巾:<span class="good">"先把头发擦干。"</span>你接过毛巾擦着头发,站在客厅里有点手足无措。第一次进女生的家,不知道该站在哪里,手该放哪里。她去厨房烧水,你听到水壶咕噜咕噜响起来。窗外的雨还在下,拍在玻璃上沙沙的。</p><p>她端了两杯热水出来,在你旁边坐下。<br>"你家挺温馨的。"你说。<br>"谢谢。一个人住久了总得让自己舒服点。"<br>沉默了几秒,但不尴尬。</p>`,choices:[{t:'☕ 喝水,聊聊',next:'ch6_talk',fx:{"exp":10,"hp":10}}]},
1117 ch6_talk:{text:`<p>你们聊了很多——大学、为什么来北京、理想中的生活。她说她学的是视觉传达,后来觉得光做图没意思就自学了前端。</p><p>"为什么不做设计了?"你问。<br>她想了想:<span class="good">"我想做能交互的东西。我写的东西用户能点、能滑、能填表单——有回应。"</span></p><p>你点了点头。你明白那种感觉。你选后端是因为喜欢"逻辑通了就能跑起来"的那种确定感。</p><p>她突然说:<span class="good">"你是公司里第一个让我觉得'这个新人应该能留得住'的人。"</span>你愣了一下,最后只说了一句:<span class="good">"谢谢你。这句话对我很重要。"</span></p>`,choices:[{t:'🎸 看到她墙角的吉他',next:'ch6_guitar',fx:{"exp":15,"hp":10}}]},
1118 ch6_guitar:{text:`<p>你指了指墙角那把吉他。"会弹?"<br>"以前会一点,很久没碰了。"<br>"能弹一首吗?"</p><p>她犹豫了一下,站起来拿起吉你试了试音。弹的是陈绮贞的《九份的咖啡店》。不是什么激烈的曲子,只是轻轻拨着弦哼着旋律,雨声成了最好的伴奏。</p><p>你靠在沙发上看着她低头弹琴。灯光把她的侧脸照得很柔和,她的手指在琴弦上游走。动作不算熟练,但很认真。</p><p>一曲终了,她抬起头有点不好意思:<span class="good">"好久没弹了,手生。"</span><br>"很好听。"你是认真的。</p>`,choices:[{t:'🕐 看时间,不早了',next:'ch6_leave2',fx:{"exp":10,"hp":5}}]},
1119 ch6_leave2:{text:`<p>你看了一下时间——快十二点了。"不早了,我得走了。"她送你到门口,把伞递过来。你接过伞柄的时候——上面还残留着她手的温度。</p><p>"今天谢谢你收留我躲雨。"<br>她笑了:<span class="good">"下次记得带伞。"</span></p><p>你走进电梯,门关上之前她还站在门口朝你挥了挥手。电梯门合上,你靠在电梯壁上,手里握着那把白色的伞。</p>`,choices:[{t:'😊 回家睡觉',next:'CHAPTER_COMPLETE',fx:{"exp":15,"hp":10}}]},
1120 ch6_no:{text:`<p>"不了,太晚了。你先休息吧。"她没有坚持,把伞递给你:"那伞你拿着,明天还我就行。"</p><p>你接过伞走进雨里,撑开——回头看了一眼。她还站在楼门口看着你。你冲她挥了挥手,她笑了笑转身回去了。你走在雨里握着那把白色的伞——伞柄上还带着她手的温度。雨声很大,但你的心跳声更大。</p>`,choices:[{t:'😊 回家',next:'CHAPTER_COMPLETE',fx:{"exp":10,"hp":5}}]},
1121 ch6_work:{text:`<p>你回到工位继续写代码。打开编辑器光标停在昨天没写完的那行代码前面。你敲了几个字符然后停下来想了一下刚才的事。你笑了一下然后继续写。工作还是要做的。但心情不一样了。</p>`,choices:[{t:'💻 继续工作',next:'ch6_home'}]}
1122 }
1123 },
1124 {
1125 title: '第七章 · 团建之旅',
1126 start: 'ch7_start',
1127 scenes: {
1128 ch7_group_hike:{text:`<p>团建第二天上午安排了爬山。山路不算陡但有一段很长的台阶。你走在队伍中间林悦走在前面。她爬得比你快你追了一段没追上。你停下来喘气的时候发现她也停下来了——在等你。你追上她的时候她递过来一瓶水——「你体能不太行啊。」你接过水喝了一口——「写代码的。体能都不太行。」她笑了然后继续往上走。这次她走慢了。你没说但你注意到了。</p>`,choices:[{t:'⛰️ 继续爬',next:'ch7_beach_walk'}]},
1129ch7_group_dinner:{text:`<p>团建那天的晚餐是一顿丰盛的自助烧烤。食材摆了一长排——羊肉串牛肉串鸡翅玉米韭菜馒头片。大家分头行动有人负责烤有人负责吃。你负责烤。林悦站在旁边帮你刷酱料。火光映在她脸上她的眼睛被热气蒙了一层薄薄的水汽。你翻了一串鸡翅——「快好了。」她递过来一个盘子。你把鸡翅放上去的时候手指碰了一下她的手。很短的一下。你假装专心烤下一串。但你记住了那个触感。</p>`,choices:[{t:'🍢 继续烤',next:'ch7_bonfire_prep'}]},
1130ch7_outdoor_game:{text:`<p>团建的下午安排了户外拓展。有一个项目是两人三足——两个人把腿绑在一起跑。你跟林悦一组。她的腿跟你的腿绑在一起的时候你感觉自己的心跳快了一拍。哨声一响你们就跑了起来。一开始节奏不对差点摔倒——你赶紧搂住她的腰。她看了你一眼——「别松手。跟着我的节奏。」你们调整了一下步伐。然后你们跑了起来越来越快越来越顺。到达终点的时候你们一起摔在了垫子上。她躺在你旁边笑着喘气。你也在笑。</p>`,choices:[{t:'🏃 到终点了',next:'ch7_bonfire_prep'}]},
1131ch7_firework:{text:`<p>团建晚上的篝火晚会快结束的时候不知道谁放了一个烟花。一束光冲向夜空然后炸开——金色的火花散落在黑色的天幕上。大家仰着头看。你也在看。但你的余光在看林悦——火光在她眼睛里闪烁。烟花放完了大家开始鼓掌。你也鼓了掌。但你鼓掌的原因跟烟花没什么关系。</p>`,choices:[{t:'🎆 好看',next:'ch7_bonfire_late'}]},
1132ch7_return_gift:{text:`<p>团建回来的路上大巴在服务区停了一次。你下车买了点零食。回来的时候发现座位上多了一瓶水——林悦放的。你没说什么坐下来拧开喝了一口。她坐在靠窗的位置正在听歌。窗外的风景飞快地向后退。你看了看手里的水瓶又看了看她。你发现有些事情不需要说出来。</p>`,choices:[{t:'🚌 继续回程',next:'CHAPTER_COMPLETE'}]},
1133ch7_morning_hike:{text:`<p>团建第二天早上你天没亮就醒了。老张还在睡。你轻手轻脚穿好衣服走出房间。山里清晨的空气冷得你缩了缩脖子。你沿着昨天那条小路走到湖边。湖面上有一层薄薄的雾。太阳还没出来。你听到了身后的脚步声——林悦站在你身后穿着一件厚卫衣头发随便扎了一下。「你怎么也起这么早?」你问。她说:「醒了。看到你房间灯亮了。」你们并排站在湖边等日出。</p>`,choices:[{t:'🌅 等日出',next:'ch7_sunrise'}]},
1134ch7_return_bus:{text:`<p>回程的大巴上你坐在靠窗的位置。林悦坐在你旁边。大巴启动的时候她靠着窗户闭上了眼睛。没过多久她的头慢慢歪过来靠在了你的肩膀上。你的身体僵了一下。你没动。车在山路上颠簸,窗外的风景一片一片地往后退。她的呼吸很轻很均匀。你低头看了一眼——她睡着的样子很安静。你小心翼翼地动了一下肩膀让她靠得更舒服一点。你没睡着。你不想错过这一刻。</p>`,choices:[{t:'🚌 回北京',next:'CHAPTER_COMPLETE'}]},
1135ch7_bonfire_photo:{text:`<p>篝火晚会的后半段,老刘不知道从哪里拿出来一台拍立得。照片一张一张地从机器里吐出来——大家围着篝火的合影、Tony喝多了抱着树唱歌的样子、小陈对着镜头比V。最后一张,老刘把相机递给了你:「帮你们拍一张。」你和林悦坐在篝火旁边。你还没反应过来,她就往你身边靠了靠。闪光灯亮了一下。照片吐出来,灰色的相纸上慢慢浮现出轮廓——你们两个人,火光映在脸上,她靠在你旁边。你看着那张照片慢慢显影。她把照片拿过去看了一眼,然后放进了自己的口袋:「这张归我了。」</p>`,choices:[{t:'📸 珍藏',next:'ch7_bonfire_late'}]},
1136 ch7_night_stars:{text:`<p>篝火晚会散场后你一个人走到湖边。山里的夜晚没有灯光,头顶的星空清晰得不像真的。你抬头看着那些星星——你在北京从来看不到这么多星星。你听到了身后的脚步声。你没有回头。林悦走到你旁边站定,也抬起头看着星空。你们沉默地站了很久。然后她说了一句话,声音很轻——「你知道吗,我来北京五年了。这是第一次看到星星。」你想说点什么。但你觉得说什么都不如就这样站着好。</p>`,choices:[{t:'🌌 一起看星星',next:'ch7_night_talk_deep'}]},
1137ch7_start:{text:`<p>周五下午五点十分,<span class="good">你终于把最后一个bug修完了。</span>你往后一靠,椅背发出吱的一声。眼睛酸得像糊了一层沙,你使劲揉了揉,再睁开的时候,显示器右下角弹出一条企业微信消息的横幅。</p><p>这条不属于第10章,跳过</p><p>你愣了愣,扭头问旁边的老王:「团建不是自愿参加吧?」</p><p>老王头也不抬,手指还在键盘上敲着:「自愿?上次说不去团建的小张,下个月绩效考核就是C。」他终于停下动作,转过来看了你一眼:「你说呢?」</p>`,choices:[{t:'认命吧,准备出发',next:'ch7_prepare',fx:{"exp":10}},{t:'偷偷问林悦去不去',next:'ch7_ask_linyue',fx:{"exp":15}},{t:'⚔️ 来战!',next:'__FIGHT__',fx:{"exp":19}}]},
1138 ch7_after_fight:{text:`<p>Bug终于被你按死了。编辑器里的红色波浪线消失,代码安静下来。你松开鼠标,手掌心有点湿。你长出了一口气,揉了揉发酸的眼睛。<br>老王端着水杯走过来,拍了拍你的肩膀:\"可以啊小段。这Bug我跟了一下午没搞定。\"<br>你笑了笑,然后下意识地瞥了一眼企业微信。团建通知还在那挂着,那个消息框像一张甩不掉的车票。你默默关掉了窗口。该来的总会来。</p>`,choices:[{t:'😅 认命吧,准备团建',next:'ch7_prepare',fx:{"exp":15,"hp":5}}]},
1139 ch7_morning_bus:{text:`<p>周五早上。你比平时早到了半个小时——公司楼下集合出发去团建。</p>
1140<p>大巴车停在路边,车身印着公司的logo。你到的时候,车上已经坐了几个人。小陈坐在前排,戴着耳机在看剧。Tony坐在她后面,正在跟运营部的小李聊着什么。</p>
1141<p>你找了个靠窗的位置坐下。阳光透过车窗照进来,暖洋洋的。你放好背包,掏出手机看了一眼——林悦发了一条消息:<span class="info">「到了吗?我刚出地铁。」</span></p>
1142<p>你回她:「到了。在车上。不急。」</p>
1143<p>你放下手机,看着窗外。秋天早上的北京,街道上人还不多。你突然意识到——这好像是你入职以来第一次参加集体出游活动。</p>`,choices:[{t:'😊 等大家到齐',next:'ch7_bus_depart'}]},
1144 ch7_bus_mood:{text:`<p>大巴开动了。窗外的城市景色慢慢向后移动。北京秋天的天空很高很蓝,阳光透过玻璃照进来,车厢里暖洋洋的。</p>
1145<p>你靠在座椅上,耳机里放着一首老歌。你看着窗外飞掠的街道和树木,心情慢慢地松弛下来。那种工作日里一直绷着的弦,终于松了一点。</p>
1146<p>小陈不知道什么时候从前排走了过来,在你旁边的空位坐下:<span class="good">「段飞,你入职以来第一次团建吧?」</span></p>
1147<p>「嗯。第一次。」</p>
1148<p>「那你准备好被老张灌酒了吗?」她露出一个意味深长的笑容。</p>
1149<p>「……老张还会灌人酒?」</p>
1150<p>「上次团建他把新来的运维小哥灌到抱着马桶喊妈妈。」</p>`,choices:[{t:'😅 那我还是少喝点',next:'ch7_bus_rest_stop'}]},
1151 ch7_bus_view:{text:`<p>大巴驶出市区后,窗外的景色开始变得不一样了。高楼逐渐被树和山取代,天空变得更宽了。</p>
1152<p>你看着窗外,发现北京也有这样的一面。不是钢筋水泥的那一面,而是有山有水的那一面。你来北京这么久,从来没认真看过这个城市以外的样子。</p>
1153<p>林悦不知道什么时候从前面的座位探过头来,递给你一瓶水:<span class="good">「渴了吧?我多带了一瓶。」</span></p>
1154<p>你接过来。瓶身还带着她手心的温度。</p>
1155<p>「谢了。」</p>
1156<p>她笑了笑,又缩回去了。你拧开瓶盖喝了一口。水是常温的。但你喝着觉得有点甜。</p>`,choices:[{t:'🌄 继续看窗外',next:'ch7_arrive_hotel'}]},
1157 ch7_checkin:{text:`<p>大巴在酒店门口停下。一栋三层的度假酒店,白墙灰瓦,门口种着一排银杏树,叶子已经黄了。</p>
1158<p>你拎着包下车。秋天的山风吹在脸上,凉丝丝的,带着一股草木的味道。你深吸了一口气——跟北京城里的空气完全不一样。</p>
1159<p>前台办入住的时候,HR在分发房卡。你被分到了一个双人间。你拿着房卡正在看房间号——</p>
1160<p>「段飞。你跟我一间。」老张的声音从背后传来。</p>
1161<p>你转过头。老张面无表情地站在你身后,手里也拿着一张房卡。</p>
1162<p>「……好的张哥。」</p>
1163<p>你跟老张一间房。这个消息让你的心情复杂了大概三秒。</p>`,choices:[{t:'🏨 去房间放行李',next:'ch7_prepare'}]},
1164 ch7_room_unpack:{text:`<p>你和老张进了房间。房间不大,两张床,中间一个床头柜。窗外能看到远处的山。</p>
1165<p>老张把包往床上一扔,打开了电视。新闻频道。然后他从包里掏出了一本书——一本《系统设计面试》。</p>
1166<p>你愣了一下:「张哥……团建你还带技术书?」</p>
1167<p>老张头也没抬:「等人无聊的时候看的。」</p>
1168<p>你放好行李,站在窗前往外看了一会儿。远处的山被一层薄薄的雾气笼罩着,像一幅水墨画。</p>
1169<p>「张哥,你不出去走走?」</p>
1170<p>「下午有活动。先休息一会儿。」你翻了一页书。</p>
1171<p>你决定自己先出去转转。你拿起手机,给林悦发了条消息:<span class="mono">「我到房间了。你住哪间?」</span></p>`,choices:[{t:'🚶 出去转转',next:'ch7_beach_walk'}]},
1172 ch7_lake_walk:{text:`<p>你走出酒店,沿着一条石径往后山走。</p>
1173<p>路两边种满了银杏树。金黄色的落叶铺了一地,踩上去沙沙响。你走了一会儿,看到前面有一个小湖。湖水很静,倒映着蓝天和树影。</p>
1174<p>湖边有一条长椅。你坐下来,掏出手机拍了一张照片。</p>
1175<p>你看着那张照片,想着要不要发给妈妈。最后你发了,配了一行字:「公司团建,环境挺好。」</p>
1176<p>妈妈秒回:「好好玩!别光顾着工作!」</p>
1177<p>你笑了笑。你把手机收起来,闭上眼睛,听着风吹过树叶的声音。这种感觉已经很久没有过了。</p>`,choices:[{t:'🍂 享受安静',next:'ch7_arrive_hotel'}]},
1178 ch7_lunch_buffet:{text:`<p>中午的自助餐厅里,大家三三两两地坐着。</p>
1179<p>你端着餐盘找位子。林悦在角落朝你招了招手。你走过去坐下。</p>
1180<p>「你上午去哪了?」她问。</p>
1181<p>「去后面湖边走了走。挺安静的。」</p>
1182<p>「我发现了一个更好的地方。」她压低声音,<span class="good">「酒店后面有一条小路可以上山。上面的观景台能看到整个山谷。下午要不要去?」</span></p>
1183<p>你看了看周围。老张在跟老刘聊天,Tony在拍食物发朋友圈。</p>
1184<p>「好。下午什么时候?」</p>
1185<p>「自由活动的时候。三点?我在酒店后门等你。」</p>`,choices:[{t:'🌄 下午见',next:'ch7_beach_walk'}]},
1186 ch7_hike_up:{text:`<p>下午三点。你在酒店后门等了两分钟,林悦出现了。她换了一双运动鞋,背了一个小包。</p>
1187<p>「走吧。」</p>
1188<p>你们沿着一条土路往上走。路不太好走,有的地方要踩着石头过。她走在前面,你跟在后面。</p>
1189<p>走了大概十几分钟,她在一处开阔的平台停下来:<span class="good">「到了。」</span></p>
1190<p>你站到她旁边。眼前的景色让你说不出话来——整个山谷尽收眼底。秋天的树林像一块巨大的调色板,绿色、黄色、红色交织在一起。远处有一条河,在阳光下闪闪发光。</p>
1191<p>你站在那儿,风吹过来,带着山林的气息。</p>
1192<p>「怎么样?」她问。</p>
1193<p>「……太美了。」你说。你发现你说的不只是风景。</p>`,choices:[{t:'🌅 看风景',next:'ch7_bonfire_prep'}]},
1194 ch7_hike_photo:{text:`<p>林悦从包里掏出一台相机——一台看起来很老的胶片相机。</p>
1195<p>「你带了胶片机?」你有点惊讶。</p>
1196<p>「嗯。每次出来玩都带着。」她举起来,对着山谷按了一张快门。咔嚓一声,过片的声音。<span class="good">「数码照片太多了,拍完很少看。胶卷不一样。一卷只有三十六张。每一张都得想好了再拍。」</span></p>
1197<p>你看着她的侧脸。她正在认真地对焦。阳光透过树叶在她脸上投下斑驳的光影。</p>
1198<p>她突然转过身,把相机对准了你:<span class="good">「别动。」</span></p>
1199<p>咔嚓。</p>
1200<p>你愣了一下:「你拍我干嘛?」</p>
1201<p><span class="good">「留个纪念嘛。第一次团建。」</span>她把相机收起来,笑了一下。</p>`,choices:[{t:'😊 继续走',next:'ch7_arrive_hotel'}]},
1202 ch7_bonfire_song:{text:`<p>篝火晚会进行到一半,不知道谁拿了一把吉他出来。吉他传了一圈,最后传到了老张手里。</p>
1203<p>你没想过老张会弹吉他。但你在那里,抱着吉他,弹了一首《成都》。弹得不算好,有几个和弦按得不太稳,但他弹得很认真。大家跟着唱了起来。</p>
1204<p>你坐在篝火旁,看着跳动的火焰,听着大家的歌声。你发现这些平时坐在工位前敲代码的人,原来各有各的样子。Tony唱歌跑调但唱得最大声,小陈在录视频,老刘闭着眼睛听。</p>
1205<p>林悦坐在你旁边。火光映在她脸上,她的眼睛里有跳动的火焰。</p>
1206<p>「你会弹吉他吗?」她问。</p>
1207<p>「会一点。」</p>
1208<p>「那你上去弹一首呗。」</p>`,choices:[{t:'🎸 上去弹一首',next:'ch7_bonfire_game'},{t:'😅 下次吧',next:'ch7_bonfire_late'}]},
1209 ch7_prepare:{text:`<p>你回到家已经快七点了。外面的天还没全黑,春天的黄昏总是拖得很长。你打开卧室灯,翻箱倒柜地找行李。从衣柜深处扯出一件泛白的T恤和一条大裤衩。<span class="bad">这身行头还是大学毕业那年买的,算算已经六年了。</span>T恤的领口洗得有点松,大裤衩倒是还挺新——因为压根没穿过几次。你把两件衣服甩到床上,又折回卫生间翻出一瓶防晒霜。瓶身已经有点瘪了,你看了看底部的生产日期——去年买的,但有没有过期他也不确定,拧开盖子闻了闻,感觉还正常,就塞进了包里。</p><p>手机在桌上震了一下。你擦了擦手,拿起来一看——是林悦的微信头像。</p><p>「段飞,你带泳衣了吗?」</p><p>你站在床边,手指悬在屏幕上方想了三秒,然后打字:「没,不会游泳,去看看海。」</p><p>林悦回得很快:「那多没意思,我教你啊。」后面跟了个吐舌头的表情。</p><p>你盯着屏幕看了几秒,嘴角不自觉地翘了起来。你把手机放下,又拿起来看了一遍那条消息。然后你打开衣柜,翻了翻,把那件大学T恤扔回了衣柜,换了一件看起来稍微新一点的。</p>`,choices:[{t:'心情忽然变好了',next:'ch7_bus_depart',fx:{"exp":10}}]},
1210 ch7_ask_linyue:{text:`<p>你偷偷打开和林悦的私聊窗口。光标在输入框里闪了又闪,你打一行字,删掉,再打一行,又觉得不对,再删掉。折腾了快两分钟,最后发了一条看起来最安全的:「那个……团建你去不去?」</p><p>林悦几乎是秒回:「去啊,怎么了?你该不会不想去吧?」</p><p>你赶紧打字:「没有没有,就是问问。」</p><p>过了大概十秒,林悦又回了一条:「放心,我在那边有几个朋友,到时候带你玩好玩的 😏」</p><p>你盯着那个表情符号看了半天。那个😏,到底是普通的朋友之间的玩笑,还是……你不敢往下想,但心跳已经快了一拍。你关掉聊天框,盯着代码编辑器看了好一会儿,一行代码都没写进去。</p>`,choices:[{t:'开始期待团建了',next:'ch7_bus_depart',fx:{"exp":15}}]},
1211 ch7_bus_depart:{text:`<p>周六早上六点五十,你背着那个装了旧T恤和过期防晒霜的双肩包到了公司楼下。四月的早晨还有点凉,路边的法桐刚冒出嫩芽。一辆白色大巴车停在路边,引擎没熄,突突地吐着尾气。HR小刘穿着一件亮黄色的冲锋衣,拿着名单站在车门旁招呼大家上车。</p><p>你上了车,扫了一圈。后排靠窗有个空位,你正准备走过去——</p><p>「段飞,这边!」</p><p>林悦的声音从车厢中段传过来。她坐在靠过道的位置,旁边的空位被她用手拍了拍椅垫:「坐这儿。」</p><p>你感觉到周围几个同事的目光齐刷刷地飘过来,带着一种心照不宣的意味。你硬着头皮走过去,把包举到头顶的行李架上,在她旁边坐下。坐下去的时候,鼻尖捕捉到一阵淡淡的洗发水香味。不是浓烈的香水,是那种洗过澡之后留在头发上的、干干净净的味道。<span class="good">车子启动了,空调从头顶吹下来,你觉得这个早上还不赖。</span></p>`,choices:[{t:'和林悦聊天打发时间',next:'ch7_bus_chat',fx:{"exp":15}},{t:'补觉,昨晚又熬夜了',next:'ch7_bus_sleep',fx:{"exp":10}}]},
1212 ch7_bus_chat:{text:`<p>大巴在京哈高速上跑起来之后,车厢里的噪音渐渐稳定成一个均匀的白噪音。有人开始在手机上看剧,有人戴上眼罩补觉。你和林悦坐在中段,车窗外的田野一片一片地往后退。</p><p>「你平时周末都干嘛?」林悦侧过头问你。</p><p>「写代码。」你想了想,又补充了一句:「嗯……还是写代码。」</p><p>林悦噗嗤一声笑了出来:「你这样会找不到女朋友的。」</p><p>你挠了挠头:「那……你周末干什么?」</p><p>「健身、看书、偶尔跟朋友去探店拍照。」林悦从兜里掏出手机,翻了翻相册递到你面前,「你看,这是上周去的一家咖啡馆。老板原来是程序员,后来转行开的店,店里的菜单都是用JSON格式写的。」</p><p>你凑过去看那张照片。照片里是一个布置得很舒服的角落,暖黄色的灯光打在木桌上,桌上放着一杯拿铁,拉花是一只猫。旁边确实有一张塑封的菜单,上面密密麻麻的代码格式文本。「JSON格式的菜单?」他笑出了声,「这个我得去见识一下。哪天带我去?」</p>`,choices:[{t:'感觉和林悦越来越近了',next:'ch7_bus_rest_stop',fx:{"exp":20}}]},
1213 ch7_bus_sleep:{text:`<p>你昨晚改bug改到凌晨三点,车开了不到一个小时就开始犯困。眼皮越来越沉,脑袋像装了弹簧一样一点一点地往下栽。</p><p>在半梦半醒之间,你感觉到有什么东西托住了你的头——动作很轻,像怕把你弄醒似的。然后你的脑袋靠在了一个温暖又柔软的东西上。鼻尖飘来一丝淡淡的桂花香,你想努力睁开眼睛看一眼,但困意像潮水一样涌上来,你连抵抗的力气都没有,意识就那么沉了下去。</p><p>等你再醒过来的时候,发现自己的头正靠在林悦的肩膀上。她的肩胛骨有点硌人,但面料软软的,带着体温。林悦戴着耳机,侧着头看窗外,嘴角挂着一丝若有若无的笑,也不知道是不是在偷偷笑他。<span class="bad">你瞬间清醒了,脸从脖子根一直红到耳尖。</span>他猛地坐直了身体,动作有点大,碰到了前面的座椅靠背。</p><p>「醒了?」林悦头也没回,声音里带着笑意,「你睡相倒挺老实。」</p>`,choices:[{t:'尴尬地道歉',next:'ch7_bus_rest_stop',fx:{"exp":15}},{t:'假装镇定继续聊天',next:'ch7_bus_chat',fx:{"exp":20}}]},
1214 ch7_bus_rest_stop:{text:`<p>大巴在服务区停了十五分钟。你第一个跳下车透气。双脚踩在水泥地上的感觉让你清醒了不少。你伸直胳膊,使劲伸了个懒腰,脊椎骨咔咔响了两声。北方的春天,风从旷野上吹过来,带着泥土和一点柴油的混合气味,凉意从衬衫领口钻进去。</p><p>老王从兜里摸出烟盒,递给你一根。你摆摆手说不会。老王自己叼上,用打火机啪地点燃,深深吸了一口,然后眯着眼,下巴朝大巴方向努了努:「我看你和林悦关系挺好啊。」</p><p>「就是普通同事。」你连忙解释,声音比预想的大了一点。</p><p>「普通同事?」老王吐了个烟圈,烟雾在下午的光线里散开。你笑得意味深长,「你小子要么是情商负数,要么就是装傻。她说要教你游泳的时候,那眼神——」他顿了顿,「我活了四十年都没见过那种眼神。」</p><p>你被你这句话噎住了,张了张嘴又闭上,不知道该怎么接,只能低头掏手机假装在刷什么重要的消息。手机屏幕明明亮着,但他一个字都没看进去。</p>`,choices:[{t:'心里有点乱,上车继续',next:'ch7_arrive_hotel',fx:{"exp":10}}]},
1215 ch7_arrive_hotel:{text:`<p>上午十一点,大巴拐进一条种满松树的林荫道,停在一家海边度假酒店门口。阳光正好,从车窗照进来晒得人胳膊发暖。车门一开,一股咸湿的海风扑面而来,带着海藻和阳光晒过的沙滩那种特有的气息。</p><p>HR小刘在酒店大堂分发房卡。你和老王一间,三楼,海景标间。推开门的瞬间,白色的窗帘被海风吹得鼓起来,窗外就是一片蓝得发亮的海面,阳光在上面碎成无数个金色的小点。<span class="good">你把包往床上一扔,心里挺满意。</span></p><p>放下行李没多久,群里弹出通知:十二点餐厅集合,午饭海鲜自助,下午自由活动,晚上沙滩烧烤加篝火晚会。</p><p>「自由活动?」老王往床上一倒,床垫弹了两下,「我选择睡觉。你呢?」</p><p>你的手机在口袋里震了一下。你掏出来一看,是林悦的消息:「下午海边见?我带了相机,给你拍几张照。」</p>`,choices:[{t:'当然去了',next:'ch7_beach_photos',fx:{"exp":20}},{t:'想睡午觉……但算了',next:'ch7_beach_photos',fx:{"exp":10}}]},
1216 ch7_beach_photos:{text:`<p>下午两点,阳光最烈的时候。你换上那身旧T恤和大裤衩,踩着酒店的一次性拖鞋走到海边。沙子在脚底下又细又烫,你走了几步就觉得脚底板在抗议。林悦已经到了,她穿了一条白色的连衣裙,外面套了件浅蓝色的防晒衫,手里端着一个微单相机,正对着海面调参数。海风吹起她的裙摆和头发,她抬手拢了拢。</p><p>她听到脚步声转过身来,上下打量了你一番,目光在他那件洗得发白的T恤上停了片刻,然后忍不住笑了:「你这身……是不是把大学时期的校服穿来了?」</p><p>你低头看了看自己,不好意思地挠了挠后脑勺:「我觉得……还挺舒服的。」</p><p>「算了算了,来,站那边去。」林悦举起相机,对着他咔擦按了一张,然后低头看了看预览画面,眉头皱了起来,「不行,光线不好,你往左边挪两步。」</p><p>你照做。</p><p>「再退一步。」</p><p>你又退。</p><p>「头稍微往右偏一点……不对,往左……算了你站那儿别动。」</p><p>你像个人形立牌一样被她指挥来指挥去。海风吹得他头发乱飞,你努力睁大眼睛看向镜头,但阳光刺得他眯起了眼。林悦一口气拍了十几张,每一张看完都摇头。最后她把相机放下来,叹了口气:「算了,硬件条件有限,后期P吧。」</p>`,choices:[{t:'你这话很伤人啊',next:'ch7_beach_walk',fx:{"exp":10}},{t:'笑着回怼:你拍照技术也不行',next:'ch7_beach_walk',fx:{"exp":15}}]},
1217 ch7_beach_walk:{text:`<p>拍完照,两人沿着海岸线慢慢散步。浪花一阵阵涌上来,漫过脚踝又退下去,带着细沙从脚趾间流走。远处有几个小孩蹲在沙滩上堆沙堡,一个穿红衣服的小女孩在尖叫着躲浪。天上有几只风筝,在蓝得近乎透明的背景里忽高忽低。</p><p>走出一段路之后,林悦忽然开口了——不是闲聊的语气,是那种真的想知道答案的语气:「工作几年了?」</p><p>「三年多了。」你说,脚踩在湿沙上,留下一个个深浅不一的脚印,「大学学的计算机,毕业就进这家公司了,一直干到现在。」</p><p>「没想过换工作?」</p><p>「想过啊。」你苦笑了一下,踢了一下脚边的沙子,「但每次打开招聘网站,看看那些职位要求,再看看自己写的代码,就觉得……还是再攒攒经验吧。」</p><p>林悦停下脚步。你走了两步发现旁边没人了,回头一看,她站在几步之外,很认真地看着你。</p><p>「段飞。」她叫你的名字,声音被海风吹散了一些,但每个字都很清楚,「你知道你和别人最大的区别是什么吗?你总觉得自己不够好。但事实上,你的代码能力在咱们组已经算上游了。」</p><p>你愣住了。海风还在吹,浪还在涌,远处小孩的尖叫声混在海浪声里传过来。但你所有的注意力都集中在刚才那句话上。<span class="good">这是第一次有人这么肯定地评价他——不是客套,不是安慰,是那种真正发自内心的认可。你张了张嘴,想说点什么,但喉咙有点发紧。</span></p>`,choices:[{t:'谢谢你,林悦',next:'ch7_dinner_buffet',fx:{"exp":20}}]},
1218 ch7_dinner_buffet:{text:`<p>傍晚六点,酒店餐厅的海鲜自助开始了。长桌上摆满了不锈钢托盘的皮皮虾、螃蟹、生蚝、扇贝,还有堆成小山的烤串和拌好的凉菜。同事们端着盘子来来往往,空气里弥漫着蒜蓉和辣椒的香气,还有海鲜特有的咸腥味。有人已经在开啤酒了,瓶盖崩飞的声音此起彼伏。</p><p>你端了一盘皮皮虾回到座位上。橙红色的虾壳泛着油光,闻起来很香。你看着那堆张牙舞爪的虾,陷入了沉思——你不大会剥这玩意儿。</p><p>「你这人真是……」林悦端着自己的盘子在他旁边坐下。她放下盘子,伸手从他盘里拿了一只皮皮虾,手指翻飞——拧头、剥壳、用筷子从尾部一捅——整个动作行云流水,三秒之后,一只完整的虾肉就躺在了你的盘子里。</p><p>「看好了,先拧掉头,然后用筷子从尾部一捅——整条肉就出来了。」</p><p>你看是看清楚了,但自己试的时候完全不是那么回事。虾壳崩得到处都是,有一片弹到了对面同事的杯子里。虾肉在他手里碎成了好几段,看起来像被暴力拆解过的。</p><p>林悦看着你的惨状,笑得直不起腰来,肩膀一抖一抖的:「你写代码的时候手不是挺灵巧的吗?怎么剥个虾跟拆炸弹似的。」</p>`,choices:[{t:'不服气,继续练习剥虾',next:'ch7_bonfire_prep',fx:{"exp":10}},{t:'认输,让她帮忙剥',next:'ch7_bonfire_prep',fx:{"exp":15}}]},
1219 ch7_bonfire_prep:{text:`<p>晚上七点半,沙滩上已经搭好了篝火堆——几根粗木柴堆成塔形,周围浇了一圈助燃液,空气里有一股淡淡的煤油味。几个男同事在搬音响和整箱的啤酒,远处有人在架投影仪和幕布。今晚的安排是篝火加露天KTV。</p><p>你帮忙搬了两箱啤酒放到篝火旁边,累得直了直腰。转头一看,林悦正踮着脚挂一串小彩灯。海风把灯串吹得晃来晃去,她试了几次都没能把线头挂到树枝上。</p><p>「我来吧。」你走过去,从她手里接过灯串。你比林悦高了大半个头,稍微一抬手就挂上了树枝。灯串垂下来,暖黄色的小灯泡在黄昏的光线里亮了,在海风中轻轻晃荡。</p><p>林悦仰头看着他,眼睛里映着刚亮起来的小灯泡的光:「没想到你还有有用的时候。」</p><p>「我一直很有用好吗。」你不服气地拍了拍手上的沙子。</p><p>「是吗?那你给我写个能自动剥虾的程序呗?」</p>`,choices:[{t:'她笑起来真好看',next:'ch7_bonfire',fx:{"exp":15}}]},
1220 ch7_bonfire:{text:`<p>篝火被点燃了。橘红色的火苗舔着木柴,发出噼噼啪啪的爆裂声。热浪扑面而来,带着木柴燃烧时特有的焦香。音乐响了起来,有人用手机连着蓝牙音箱放了一首节奏很嗨的歌,几个活跃的同事已经开始跟着节奏扭动身体。</p><p>HR小刘拿着话筒招呼:"来来来,大家围成一个圈,我们玩真心话大冒险!"</p><p>同事们发出一阵起哄声。你想溜走,被老王一把拽回来:"跑什么跑,团建的重点环节就是这个。"</p><p>酒瓶开始转动。第一轮指向了测试组的小王。</p><p>"大冒险!"小王选了。</p><p>"好,现场找一个异性,十指相扣对视十秒钟!"</p><p>众人起哄声中,小王抓了一个男同事的手,全场笑翻。</p>`,choices:[{t:'在旁边看戏,希望瓶子别转到我',next:'ch7_bonfire_game',fx:{"exp":10}}]},
1221 ch7_bonfire_game:{text:`<p>游戏进行到第五轮,酒瓶缓缓停在了你面前。</p><p>「哦哦哦——!」同事们像被点燃了一样开始起哄,有人拍桌子,有人吹口哨。HR小刘笑眯眯地看着你,声音里带着一种让人无法拒绝的热情:「真心话还是大冒险?」</p><p>你看了看周围那些跃跃欲试的眼神,在心里迅速衡量了一下——真心话?你们要是问你对林悦什么感觉,你当场就得交代在这儿。大冒险至少还有个操作空间。「大冒险。」你说。</p><p>「好!」小刘眼珠一转,明显是早有准备,「请现场找一位异性,喂她吃一颗葡萄——注意,对方不能用手。」</p><p>现场瞬间安静了。所有人的目光像商量好了一样齐刷刷投向林悦。你的脸从脖子根一直烧到耳尖,红得在火光里都看得一清二楚。你手里捏着一颗葡萄,进退两难,那葡萄在他指尖显得又滑又小。</p><p>林悦倒是大方,在众人的注视下站起来,往前走了两步,站到你面前。她微微仰起脸,张开了嘴。</p><p>篝火的噼啪声,海浪的拍岸声,同事们屏住呼吸的安静。你的手在微微发抖,你把葡萄送到她嘴边的时候,指尖碰到了她的下唇,葡萄差点滑脱掉到沙子里。林悦轻轻咬住了那颗葡萄,嘴唇在你的指尖上碰了一下——很轻,轻到像错觉。</p><p><span class="good">但你知道那不是错觉。</span></p><p>全场爆发出震耳欲聋的欢呼声和口哨声。</p>`,choices:[{t:'心脏快要跳出来了',next:'ch7_bonfire_late',fx:{"exp":25}}]},
1222 ch7_bonfire_late:{text:`<p>篝火晚会一直闹到晚上十点多。大部分人喝得东倒西歪,被各自的室友半拖半架地弄回了房间。你只喝了一瓶啤酒,脸有点热但脑子还算清醒。</p><p>林悦也没喝多。她坐在篝火边的沙滩椅上,手里端着一杯只剩一点底的可乐,看着其他人三三两两地散去。你收拾完自己脚边的空啤酒罐,抬头正撞上她的目光。两个人隔着将熄的篝火对视了一秒,然后默契地同时站起来,开始帮忙收拾垃圾和整理音响设备。</p><p>收拾得差不多了,林悦拍了拍手上的沙子,踢了踢脚下的沙地:「去海边走走?」</p><p>夜晚的海滩完全变了一副模样。没有白天的喧闹和阳光,只有潮水一下一下拍打沙滩的声音,节奏稳定得像呼吸。远处的酒店灯火通明,但隔了一段距离,那些光看起来像是另一个世界的。近处只有月光洒在黑沉沉的海面上,被波浪揉碎成一片银色的波纹,不断扩散又聚拢。</p><p>两人并肩走了很远。谁都没说话,但那种沉默不是尴尬的沉默。海浪声填满了所有空隙。<span class="good">你觉得,这种沉默比任何话语都更让人舒服。</span></p>`,choices:[{t:'好想时间停在这一刻',next:'ch7_night_walk',fx:{"exp":20,"affection":8}}]},
1223 ch7_night_walk:{text:`<p>你们在一块被海水磨得光滑的礁石上坐了下来。海浪就在脚下方两三米处涌动,黑暗中只能看到白色的泡沫一次次漫上来又退下去。林悦脱了凉鞋,试探着把脚伸进海水里——「嘶——」凉意让她激灵了一下,她飞快地把脚缩了回来,自己先笑了。</p><p>安静了一会儿之后,林悦忽然开口了,叫了你的全名——不是平时那种随意的「段飞」,而是带着一种认真的语气:「段飞。」</p><p>「嗯?」你转过头看她。</p><p>「你有没有觉得……」她顿了一下,像是在整理措辞,「上班就像在做一个超长的项目。每个人都急着赶deadline,但没有人问这个项目到底有没有意义。」</p><p>你想了想,仰头看了看天上的星星,然后说:「有时候会这么想。但又能怎么样呢?房租要交,饭要吃。」</p><p>「所以啊——」林悦转过头来看着他。远处篝火的余烬映在她的眼睛里,亮晶晶的,像是眼睛里藏了两颗小火苗。「如果有一天,我们要做点真正属于自己的事情,你觉得你会做什么?」</p>`,choices:[{t:'做一款真正有用的产品',next:'ch7_night_talk_deep',fx:{"exp":15}},{t:'还没想那么远……你呢?',next:'ch7_night_talk_deep',fx:{"exp":10}}]},
1224 ch7_night_talk_deep:{text:`<p>「我想做一个产品。」林悦说,目光落在远处的海面上,声音不大但很坚定,「不是那种为了KPI做的垃圾功能。是真的能解决普通人问题的产品。比如……让独居老人能一键叫到懂方言的志愿者。」</p><p>你愣住了。这个想法谈不上多宏大,甚至朴实得有点过分——没有AI,没有区块链,没有任何时髦的技术概念。但它莫名地打动了他。可能是因为它太具体了,具体到像是有人真的遇到过这个问题。</p><p>「这个想法……挺好的。」你说,觉得这个词有点不够表达你的感受,但又找不到更合适的。</p><p>「是吧?」林悦笑了笑,站起来拍了拍裙子上的沙子。「不过我也就是想想而已。回去吧,明天还要早起看日出呢。」</p><p>你跟着站起来,拍了拍裤子。你走在林悦身后半步的位置,看着她的背影在月光下拖出一道长长的影子,被海浪的泡沫时不时淹没一点。<span class="good">你忽然觉得,身边有这样一个人,好像连上班都没那么痛苦了。</span></p>`,choices:[{t:'回酒店休息',next:'ch7_sunrise',fx:{"exp":10}}]},
1225 ch7_sunrise:{text:`<p>凌晨四点五十。手机闹钟在枕头底下震动起来,声音被被子捂得闷闷的。你从被窝里伸出一只手摸索着按掉闹钟,艰难地坐起来。房间里黑漆漆的,老王的呼噜声均匀而响亮。你翻了个身,含含糊糊地嘟囔了一句「有病」,又睡过去了。</p><p>你蹑手蹑脚地洗漱完,抓起外套出了门。走廊里安安静静,只有地毯吸收了他全部的脚步声。电梯下到一楼,门一开,你就看到林悦已经坐在大堂的沙发上了。她换了一身浅灰色的运动装,头发扎成马尾,看起来精神抖擞,完全不像凌晨五点该有的样子。</p><p>她看到你走出来,站起来冲他招了招手:「走。」</p><p>两人走到海滩最东边的一处观景台。木质的栈道上还挂着露水,踩上去有点滑。天边已经泛起了一层鱼肚白,不是亮,是一种颜色从漆黑往深蓝渐变的过程。海面上笼罩着一层薄薄的晨雾,像一层半透明的纱。</p><p>等了大概十分钟。晨风带着凉意,你把手插在外套口袋里,缩了缩脖子。林悦站在他旁边,安静地看着海平线。然后天边开始泛红了——先是一小片,像被谁用水彩笔晕开的,然后红色越来越浓,越来越亮。海面上的雾气被染成了浅橘色。<span class="good">太阳从海平面下面露了出来,先是一个弧形,然后半个圆,最后整个脱离海面。像一颗橘红色的蛋黄,温和地悬浮在那里,把整片大海染成了流动的金色。</span></p><p>「好美。」林悦轻声说,声音像是怕惊扰了什么。</p><p>你侧过头。林悦的侧脸被朝阳勾勒出一道金色的轮廓——额头、鼻梁、嘴唇、下巴,线条柔和而清晰。晨光在她的睫毛上镀了一层极细的金边。你看着她,心里有一个念头无比清晰地浮现出来——<span class="good">他不想只当她的同事。</span></p>`,choices:[{t:'鼓起勇气说点什么',next:'ch7_confession_attempt',fx:{"exp":25}}]},
1226 ch7_confession_attempt:{text:`<p>「林悦。」你叫了她一声。声音有点哑,不知道是因为早起还是因为紧张。</p><p>「嗯?」她转过头来。朝阳的光正好打在她脸上,她的眼睛里映着整片金色的海面。</p><p>「我……」你张了张嘴。那句话明明就在嘴边,烫得像刚从锅里捞出来的饺子,但他就是说不出口。你咽了一口唾沫,最后说出来的变成了:「我是说……日出真好看。」</p><p>林悦盯着你看了两秒。那两秒钟长得像一个世纪。然后她笑了——不是取笑的笑,是那种看穿了一切但不点破的笑:「你刚才想说什么?」</p><p>「没什么。」你窘迫地转回头,重新看向海面。你的耳朵烫得能煎鸡蛋。</p><p>林悦没有追问。她也转回去继续看日出。海面上的金色越来越大,太阳已经彻底离开了海面。过了大概十秒钟——你数着的——你感觉到自己的右手被什么东西轻轻碰了一下。是她的手背。那种触碰轻得像是一片羽毛落在皮肤上。你没有动。<span class="good">然后,五根手指慢慢地、试探性地,从你的指缝里穿了过去,轻轻地、扣住了你的手。</span></p><p>你的呼吸停了一拍。你没有转头,没有说任何话。你只是轻轻地、但很用力地,握住了那只手。她的手比你想象中的小一点,也凉一点,骨节分明。</p><p>日出还在继续。海风还在吹,把她的发丝吹到你的手臂上,痒痒的。远处有海鸥在叫,海浪还在重复着永不停歇的节拍。但世界好像忽然变了一个样——不是风景变了,是你看风景的心情变了。</p>`,choices:[{t:'握紧她的手,看完日出',next:'CHAPTER_COMPLETE',fx:{"exp":30,"affection":10}}]}
1227 }
1228 },
1229 {
1230 title: '第八章 · 重构之战',
1231 start: 'ch8_start',
1232 scenes: {
1233 ch8_chatgpt_drop:{text:`<p>重构进行到第五周的时候,一件改变了整个行业的事发生了。那天早上你打开浏览器,看到新闻——OpenAI发布了ChatGPT。你随便问了它一个问题——「用Python写一个快速排序。」它十秒钟就写出了比教科书还优雅的版本。你盯着屏幕看了很久。</p><p>你把这个消息发到团队群。群里炸了。有人兴奋有人不安。王宇说:「这玩意以后还要我们写代码吗?」你说:「不知道。但它刚才写了一个快速排序比我写得快。」</p>`,choices:[{t:'🤔 继续研究',next:'ch8_ai_try'}]},
1234 ch8_ai_try:{text:`<p>接下来几天你一直在用ChatGPT。你发现它写模板代码比你快、查文档比你快、甚至debug也比你快。一开始你有点不安——这种感觉就像你练了十年的武功,突然有人告诉你内功心法已经过时了。</p><p>但你很快发现了一件事:ChatGPT写的代码虽然快,但它不理解业务逻辑。它不知道这个审批流程为什么要有三层审核、不知道那个字段为什么不能为空。它能帮你写代码。但不能替你做决策。你松了一口气。</p>`,choices:[{t:'💡 继续重构',next:'ch8_refactor_day5'}]},
1235ch8_refactor_team:{text:`<p>重构进行到一半的时候你发现一个人搞不定了——代码量太大。你跟老张说要加人手。你调了两个人给你。你第一次带着两个人做项目——你分配任务做Code Review把控进度。项目进展快了很多。有一天老张路过看了一眼你们组的进度——「进度不错。你开始像技术主管了。」你愣了一下。你从来没想过自己会变成「技术主管」的样子。但你确实在变成那个人。</p>`,choices:[{t:'👨👨👦 带团队',next:'ch8_refactor_day4'}]},
1236ch8_refactor_ship:{text:`<p>重构代码上线的那天全组都在盯着监控面板。你按下了部署按钮。进度条走得比你的心跳慢。百分之百。没有报警。你刷新了一下页面——功能一切正常。群里安静了几秒然后炸了。你坐在工位上椅子往后一靠长长地呼出一口气。三个月的重构——从一行代码到几千行代码——从一个看不懂的祖传项目到一个结构清晰的新系统。你做到了。你拿起手机给林悦发了一条消息:「搞定了。」她回了一个烟花表情。</p>`,choices:[{t:'🎉 完成',next:'CHAPTER_COMPLETE'}]},
1237ch8_refactor_tired:{text:`<p>重构到了后半段你越来越累。有一天你在工位上趴着睡着了。醒来的时候发现身上披着一件外套——灰色的。你看了看四周最后目光落在老张身上。你穿着一件卫衣——跟他平时那件外套不一样。你拿起那件外套走到你工位前:「张哥。你的外套。」他头也没抬:「放那儿就行。」你没放下。你披着那件外套走回工位坐下了。你继续写重构的代码。那件外套很暖和。</p>`,choices:[{t:'😊 继续写',next:'ch8_refactor_day5'}]},
1238ch8_refactor_done:{text:`<p>重构完成的那天你坐在工位上发了一会儿呆。你打开那个项目的Git历史——最早的commit是八年前的。最新的commit是你的。你从第一次commit到最后一次commit——八年的代码历史你在三个月里重写了一遍。你关掉Git。你站起来走到老张工位前说了一句:「张哥。搞完了。」你看了你一眼——「嗯。那下周给你安排新活。」你笑了。</p>`,choices:[{t:'💪 接受挑战',next:'CHAPTER_COMPLETE'}]},
1239ch8_complexity:{text:`<p>重构过程中你遇到了一个巨大的障碍。有一个模块的代码太复杂了你看了两天都没完全理解它的逻辑。你去找老张求助。你看了那段代码十分钟然后说——「这段代码我写的。三年前。」你愣住了。你继续说——「我那时候也不会写。但现在你会。」你站起来在你的代码文件里加了一行注释就走了。你看了看那行注释——「此处逻辑复杂。请谨慎修改。」你忍不住笑了。</p>`,choices:[{t:'📝 加注释',next:'ch8_refactor_day4'}]},
1240ch8_before_refactor:{text:`<p>重构正式开始之前你花了整整一周做分析。打开代码覆盖率工具——覆盖率15%。打开SonarQube——技术债务评级C一千多处代码异味。你把这些数据整理成一份报告发给团队。你在报告最后写了一句话——「这些数字很难看。但我们有机会把它们变好看。」老张回了一行字:「你写报告的口气越来越像领导了。」</p>`,choices:[{t:'📋 开始重构',next:'ch8_start_refactor'}]},
1241ch8_final_commit:{text:`<p>重构结束的那天你提交了最后一个commit。你写的commit message是:「重构完成。感谢这个项目教会我的一切。」你从项目的第一行代码开始看——不是你自己写的,是你刚入职时那个祖传PHP项目的第一行。你想起了第一次打开那个文件时的震撼——两千行的index.php,if-else嵌套六层,SQL直接拼接用户输入。现在那些代码全部被干净的、有测试的、结构清晰的代码取代了。你关掉IDE。你站起来走到老张工位前说了一句:「张哥。重构完了。」你看了你一眼——「用了多久?」你算了算:「三个月零十天。」他没说话。你转身走了两步之后听到你在后面说了一句:「比我预想的快。」</p>`,choices:[{t:'✅ 完成',next:'CHAPTER_COMPLETE'}]},
1242ch8_refactor_legacy:{text:`<p>重构过程中你遇到了一个特别老的模块——八年前的代码,作者已经离职了。代码没有注释、没有测试、没有文档。你跟它搏斗了三天。第三天下午你终于理解了那段代码的意图——它是一个非常早期的支付回调处理模块,处理逻辑很巧妙,但被后面的人改来改去改得面目全非。你没有重写它。你加了一篇详细的注释,然后在外面包了一层新的接口。有些代码值得保留——不是因为它写得好,因为它承载了历史。</p>`,choices:[{t:'📝 加注释保留下',next:'ch8_refactor_day5'}]},
1243ch8_refactor_milestone:{text:`<p>重构进行到第十周。你的计划表上的任务已经完成了三分之二。你打开代码覆盖率工具看了一眼——覆盖率已经从15%提升到了85%。你从代码库里删除了最后一个已经废弃的接口。然后你运行了一遍全部的测试用例——全部通过。你靠在椅背上闭了一会儿眼睛。你想起第一次打开这个项目时的感受——那时候你连结构都看不懂。现在你亲手重写了它的一半。</p>`,choices:[{t:'😌 继续',next:'ch8_refactor_complete'}]},
1244ch8_refactor_progress:{text:`<p>重构进行到第六周。你对照着最初的计划表,一项一项地打勾。数据库访问层——完成。业务逻辑拆分——完成。API统一——完成。测试覆盖率——从15%提升到了78%。你站在白板前看着那张目标架构图。大部分模块已经从旧架构迁移到了新架构。你拍了一张白板的照片。然后坐下继续写代码。</p>`,choices:[{t:'💻 继续',next:'ch8_refactor_complete'}]},
1245ch8_start_morning:{text:`<p>重构项目的第一天早上,你比平时到得早了半小时。办公室里只有几个人。</p><p>你打开电脑,看着那个祖传PHP项目的目录结构。controller、model、view混在一起,文件命名五花八门。你深吸一口气。你要把这一堆乱麻理清楚。</p><p>你在白板上画了一张目前的架构图,然后画了一张目标架构图。两张图之间的差距,大概有半年的工作量。</p>`,choices:[{t:'💪 开始',next:'ch8_start_refactor'}]},
1246 ch8_code_review_session:{text:`<p>重构进行到第三周。你写了一个新的模块——用户权限系统。你觉得自己写得还不错。</p><p>你把代码发给老张Review。你看了一个小时,列了九条意见。你一条一条地改。改到第五条的时候你突然意识到——老张的每一句批评都在让你变成更好的程序员。</p><p>改完之后你重新提交。你看了一眼:「嗯。可以了。」</p>`,choices:[{t:'📝 继续重构',next:'ch8_refactor_day3'}]},
1247 ch8_middle_check:{text:`<p>重构进行到一半。你停下手中的工作,回头看了看已经改完的部分——大约三分之一的代码已经被重写了。所有改完的部分测试都通过了。</p><p>你站在窗前看着远处的天际线。这一瞬间你意识到:你已经不是那个连项目结构都看不懂的新人了。你正在亲手改写一个还在线上运行的系统。这种感觉有点不真实。</p>`,choices:[{t:'💻 继续',next:'ch8_refactor_day4'}]},
1248 ch8_team_support:{text:`<p>重构进行到第五周。有一天你在茶水间接水,王宇走过来跟你说:「段飞,你重构那个模块,我昨天调接口的时候发现文档清晰了很多。」</p><p>你愣了一下。你确实顺便把接口文档也更新了。</p><p>小陈也凑过来说:「测试用例也好写多了。以前一个接口要测十几种边界情况,现在逻辑清楚,测起来快很多。」</p><p>你站在那里,端着水杯,觉得这几个月的辛苦全都值了。</p>`,choices:[{t:'😊 继续干',next:'ch8_refactor_day5'}]},
1249ch8_start:{text:`<p>团建回来之后的第一个周一。你走进工位区就感觉气氛不对——以往码字的键盘声消失了,取而代之的是一种沉闷的安静。老王坐在工位上,脸色铁青地盯着屏幕,手指悬在键盘上方但没有敲下去,整个人像一座随时会喷发的火山。</p><p>「怎么了?」你放下包坐下。</p><p>老王没说话,只是把显示器屏幕往他这边转了转。你凑过去看了一眼,然后倒吸一口凉气——<span class="bad">老王负责的核心交易模块,代码行数已经达到了两万三千行。一个函数就有一千多行,if-else嵌套了十几层,缩进缩到屏幕右边快看不见了。</span></p><p>「昨晚线上出了个bug。」老王打字说,你注意到你的手在微微颤抖,「我查了四个小时才找到问题——一个变量名拼写错误。藏在第十五层if里面。」</p><p>消息框还在闪烁,产品经理的头像亮着,最新的消息是:「老王,那个新功能这周五能上吗?」</p>`,choices:[{t:'主动提出帮忙重构',next:'ch8_offer_refactor',fx:{"exp":20}},{t:'先看看代码有多烂',next:'ch8_check_code',fx:{"exp":10}},{t:'⚔️ 遇到Bug,先打一架',next:'__FIGHT__',fx:{"exp":21}}]},
1250 ch8_after_fight:{text:`<p>Bug被你搞定了。你放下键盘。转向老王。<br>\"老王。你这个模块。我帮你重构吧。\"<br>老王愣一下,然后露出了一个复杂的表情。有感激也有不好意思。<br>\"那……辛苦你了。\"你说。声音有点哑。</p>`,choices:[{t:'🔧 主动提出帮忙重构',next:'ch8_offer_refactor',fx:{"exp":20,"hp":5}}]},
1251 ch8_check_code:{text:`<p>你把老王的代码拉到自己机器上看了看。打开文件的瞬间,IDE卡了整整三秒才渲染完成。<span class="bad">两万三千行代码塞在一个文件里,没有注释,没有类型定义,变量名从a到z用了个遍。</span></p><p>你随便翻到一处,</p><p><code>if (a) { if (b) { if (c && !d) { e = f ? g : h; } else { if (i || j) { for (let k = 0; k < l.length; k++) { ... }}}}}}</code></p><p>你看完沉默了。这代码像是被人用脚踩出来的。</p><p>"这代码谁写的?"你问。</p><p>老王面无表情,"前两年离职的那个大牛。你走之后没人敢动,后来在上面加需求的人越来越多,就变成这样了。"</p>`,choices:[{t:'这必须重构,不然早晚出事',next:'ch8_discuss_refactor',fx:{"exp":15}}]},
1252 ch8_offer_refactor:{text:`<p>你深吸一口气,感觉胸腔被冷空气填满。你拍了拍老王的肩膀:「这代码必须重构。我跟你一起搞。」</p><p>老王转头看了他一眼,目光里有一种复杂的情绪——一半感激,一半怀疑:「你知道重构这玩意儿意味着什么吗?两万三千行。没有单元测试。没有文档。业务逻辑跟意大利面条一样缠在一起。稍有不慎线上就崩了。你担得起?」</p><p>「我知道。」你说。你还知道自己说完这句话之后,每个字都会变成落在自己头上的责任。「但不重构的话呢?以后每加一个需求都是在屎山上再堆一层屎。早晚有一天整座山都会塌。是被压死的那天再改,还是趁现在还来得及——选一个吧。」</p><p>老王沉默了很久。隔壁工位有人在打电话,茶水间的咖啡机发出一阵研磨的噪音。最后你揉了揉太阳穴,说:「行。但要先跟技术总监说一声。至少要给两周的时间,不能接新需求。」</p>`,choices:[{t:'去找技术总监沟通',next:'ch8_talk_cto',fx:{"exp":20}}]},
1253 ch8_discuss_refactor:{text:`<p>你和老王在茶水间碰了个头,摊开笔记本开始画重构方案。</p><p>"我的想法是,先把核心业务逻辑拆出来。"你在白板上画了个大框,"用户认证、订单处理、支付、通知。这四个模块现在全在一个文件里,至少拆成四个独立的service。"</p><p>老王点头:"同时要补单元测试。现在测试覆盖率为——"他查了一下,"0%。"</p><p>两人对视一眼,都从对方眼里看到了绝望和决绝。</p><p>"我去跟老板申请时间。"你说,"你先把代码里所有的业务逻辑梳理一遍,画个流程图出来。"</p>`,choices:[{t:'分头行动',next:'ch8_talk_cto',fx:{"exp":15}}]},
1254 ch8_talk_cto:{text:`<p>技术总监老陈的办公室在公司最里面。门开着,老陈正坐在办公桌前泡茶,热水冲进杯子里的声音隔了老远都听得见。</p><p>你敲了敲门框。老陈抬起头,目光从茶杯上方越过来,认出了他:「小段?进来坐。」</p><p>你在办公桌对面坐下,把笔记本打开转向老陈,开始说自己的重构方案。你说话的时候,老陈端着茶杯慢慢喝,脸上的表情像一堵墙,什么都看不出来。你说到一半的时候差点被打断节奏——老陈什么反应都没有,这让你心里有点发毛。但他还是硬着头皮把话说完了。</p><p>等你说完,老陈放下杯子:"你知道下周产品那边有三个新功能要上吧?你这时候说要重构,产品经理会来找我拼命。"</p><p>"陈总。"你很少这么正式地叫人,但此刻他异常认真,"那个模块现在已经成了定时炸弹。昨晚老王查了四个小时才修了一个拼写错误。如果再往上叠功能,下次出问题可能就是线上事故了。"</p>`,choices:[{t:'据理力争,争取两周时间',next:'ch8_cto_decision',fx:{"exp":20}},{t:'退一步,争取一周加加班',next:'ch8_cto_decision2',fx:{"exp":15}}]},
1255 ch8_cto_decision:{text:`<p>老陈沉默了很久,最后叹了口气:"你有多大的把握?"</p><p>"七成。"你老实说,"但只要我们测试充分,不会出大问题。"</p><p>"七成不够。"老陈说,但语气松动了,"我给你一周时间,不接新需求。一周搞不定,该堆功能继续堆。"</p><p>你咬了咬牙:"好。"</p><p>从老陈办公室出来,你才发现自己的后背已经湿了一层——不是热的,是紧张的。你在走廊里站了五秒钟,深呼吸了两下。林悦端着咖啡从茶水间走出来,看到你靠在墙边一副余悸未消的样子,笑了笑:「谈下来了?」</p><p>「谈下来了。一周。」你说,声音里有一种劫后余生的疲惫。</p><p>林悦把手上那杯咖啡递给你。杯壁温热,透过纸杯传到你的掌心。「加油,我看好你。」她说。没有多余的话,但你觉得这四个字比什么长篇大论的鼓励都管用。</p>`,choices:[{t:'开始动手重构',next:'ch8_start_refactor',fx:{"exp":20}}]},
1256 ch8_cto_decision2:{text:`<p>老陈说:"一周,不加新需求,但一周后必须能正常发版。你接受吗?"</p><p>你算了一下,一周时间非常紧,但也不是完全没可能。你点了点头:"接受。"</p><p>"行,我跟产品那边说。"老陈摆了摆手,"去忙吧。"</p><p>你出了办公室,长出一口气。一周时间,两万三千行代码,这注定是场硬仗。</p>`,choices:[{t:'叫上老王,开干',next:'ch8_start_refactor',require:{skill:'refactor'},fx:{"exp":30,"hp":15}}]},
1257 ch8_start_refactor:{text:`<p>当天下午,你和老王在角落里支了块白板,开始画架构图。</p><p>原来的代码是典型的"大泥球"架构。一个入口函数接收所有请求,然后在内部用switch-case分发到不同的逻辑块。你用红笔在板上画了几条线:"我们拆成三层:controller、service、dao。每个模块独立文件夹,独立测试。"</p><p>老王在旁边补充:"还有,数据库查询全部抽出来,不能再在上面写SQL了。"</p><p>两人讨论了两个小时,白板上画满了箭头和方框。路过的同事都绕着走。那两个程序员身上散发出的气场让人不敢靠近。</p>`,choices:[{t:'开始写第一行新代码',next:'ch8_refactor_day1',require:{weapon:1},fx:{"exp":20,"hp":10}}]},
1258 ch8_refactor_day1:{text:`<p>重构第一天,你从最核心的订单模块开始。你先花了三个小时读懂了那团乱麻。原来那个"大牛"的思路其实不差,只是在上面加需求的人不断打补丁,才把代码弄成了现在这样。</p><p>你开了新的Git分支,名字叫 <code>refactor/order-module-v2</code>,然后敲下了第一行代码:</p><p><code>class OrderService {</code></p><p>打完这行字,你有点感慨。好的代码就像好的建筑,每一行都该有它存在的理由。而他现在的任务,就是从一堆废墟里把原来的地基挖出来,重新盖一座新楼。</p><p>林悦路过的时候,在他桌上放了一盒牛奶。盒子上贴了张便签:<span class="good">「别太拼,记得吃晚饭。」</span></p>`,choices:[{t:'心里一暖,继续写代码',next:'ch8_refactor_day2',fx:{"exp":15}}]},
1259 ch8_refactor_day2:{text:`<p>第二天,老王那边出了问题。你把原来的一段逻辑拆出来之后,发现有几个分支怎么也对不上原来的输出。</p><p>"妈的。"老王把键盘一推,往后靠在椅背上,"这段逻辑里有隐含的状态依赖。A函数执行完之后会在全局变量里存一个值,B函数要用这个值,但它又不是参数传进来的。"</p><p>你凑过去看了看代码,找了半天才发现在一个不起眼的地方,有人用 <code>global.state.tempFlag</code> 做了状态传递。</p><p>"这……"你深吸一口气,"这特么是谁写的?"</p><p>老王摇头:"不知道,但改了它可能其他地方也要改。"</p>`,choices:[{t:'搜索全局变量所有引用',next:'ch8_global_hunt',fx:{"exp":15}}]},
1260 ch8_global_hunt:{text:`<p>你在IDE里搜索了 <code>global.state</code> 的所有引用,结果显示有47处。<span class="bad">你感觉自己的血压在飙升。</span></p><p>你把结果截图发到了和林悦的聊天框里:「你猜我发现了什么?」</p><p>林悦回了个捂脸的表情:「我的天……这是祖传代码吧?」</p><p>你:「祖传?这代码怕不是从原始社会传下来的。」</p><p>林悦:「加油吧段飞,你这是在净化代码世界的罪恶。」</p><p>你看着她的消息笑了一下,然后深吸一口气,开始逐个处理那47处全局变量引用。</p>`,choices:[{t:'一个一个修,没有捷径',next:'ch8_global_fix',fx:{"exp":20}}]},
1261 ch8_global_fix:{text:`<p>处理全局变量的过程比预想的还要痛苦。有些地方的逻辑直接依赖了某个全局变量在特定时间点的值,而且没有注释说明。</p><p>你不得不像考古一样,把代码的每一次提交记录翻出来看。幸好公司的git历史还算完整。</p><p>追根溯源,你发现那个 <code>global.state.tempFlag</code> 是三年前为了赶一个紧急需求加的,当时"先这样吧",然后就没有然后了。</p><p>你在重构方案里加了一行红字:<span class="bad">「禁止全局状态。所有依赖显式传递。这条规矩谁违反谁请全组喝奶茶。」</span></p>`,choices:[{t:'继续推进,写到半夜',next:'ch8_late_night',fx:{"exp":15}}]},
1262 ch8_late_night:{text:`<p>晚上九点多,办公室的人陆陆续续走了。你和老王还在工位上奋战。空调已经关了,只剩下显示器的散热风扇嗡嗡作响。</p><p>"你先回去吧。"你对老王说,"你老婆不是今天过生日吗?"</p><p>老王愣了一下,看了看手表,一拍脑门:"靠,我把这事儿忘了。"</p><p>"快走快走。"你挥手,"剩下的我来盯着。"</p><p>老王犹豫了一下:"你一个人行吗?"</p><p>"我写了五年代码了,老王。"你说,"要是连重构都搞不定,那我这五年白干了。"</p><p>老王拍了拍你的肩膀,收拾东西走了。办公室只剩下你一个人。</p>`,choices:[{t:'一个人继续战斗',next:'ch8_linyue_visit',fx:{"exp":10}}]},
1263 ch8_linyue_visit:{text:`<p>大概十点半的时候,你正对着一堆报错日志发愁,忽然听到门口传来脚步声。</p><p>"果然还没走。"林悦的声音在空旷的办公室里格外清晰。</p><p>你抬头,看到林悦提着一个外卖袋子走进来。她把袋子往他桌上一放:"给你带了麻辣烫,多辣多醋不要香菜。我记得你说过。"</p><p>你愣住了。你确实是说过,但那是在一个月前的某次午饭时随口提了一句。林悦居然记得。</p><p>"你……你怎么还没回去?"你的声音有点哑。</p><p>"我项目也没做完啊。"林悦拉了个椅子在他旁边坐下,打开了自己的笔记本电脑,"正好一起加班。"</p>`,choices:[{t:'一起吃麻辣烫,心里暖暖的',next:'ch8_code_together',fx:{"exp":25}}]},
1264 ch8_code_together:{text:`<p>深夜的办公室里,只剩两个人的键盘声和麻辣烫的香气在空气中交织。你一边吸溜着粉丝,一边拿筷子指着屏幕跟林悦解释自己在重构什么。麻辣烫的汤底有点辣,你的嘴唇被辣得发红,额头上冒出一层薄汗。</p><p>「……所以我把那个god类拆成了六个单独的类,每个类只负责一件事。」你一边说一边用手比划着,筷子尖在空中画了个圈,「但问题在于,原来的代码有很多隐蔽的副作用。一个方法调完了,某个对象的状态就变了,不仔细看根本发现不了。」</p><p>林悦嚼着一块午餐肉,想了想,说:「那你能不能给每个方法加一个契约?用TypeScript的接口约束输入输出,副作用显式声明。」</p><p>你夹菜的动作停在了半空中。你愣了两秒,然后猛地放下筷子:「……对!我怎么没想到这个办法。」</p><p>「因为你脑子里塞的全是业务逻辑。」林悦笑着伸出手指戳了戳你的太阳穴。</p><p><span class="good">那种触感——温热的指尖在太阳穴上轻轻一碰——让你的耳朵瞬间红了。你低头扒了两口麻辣烫来掩饰,但心里想的是,连深夜加班都没那么难熬了。</span></p>`,choices:[{t:'开始实施接口约束方案',next:'ch8_refactor_day3',fx:{"exp":20}}]},
1265 ch8_refactor_day3:{text:`<p>第三天上午,你把TypeScript的接口定义全部写好。强制类型检查一开,IDE立刻标红了一百多处错误——<span class="bad">这说明原来的代码有一百多个地方存在隐式的类型不匹配。</span></p><p>"你看这个。"你指着屏幕对老王说,"这个函数接收一个参数叫 <code>orderId</code>,但实际传进来的那个变量在某个分支里是 <code>undefined</code>。因为之前没有类型检查,这段代码一直在线上跑,只不过每次走到这个分支的时候,都会静默失败。"</p><p>老王看着那个bug,冷汗都下来了:"也就是说……这个功能其实从来就没真正工作过?"</p><p>"对的。"你面无表情,"但没人发现,因为这个分支触发的条件很罕见。"</p>`,choices:[{t:'修复这个隐藏了三年的bug',next:'ch8_bug_fix',fx:{"exp":20}}]},
1266 ch8_bug_fix:{text:`<p>你修复了那个bug之后,触发的连锁反应比你想的要大。那个分支的逻辑和后面三个模块有依赖关系,改了之后需要同步调整很多地方。</p><p>你花了整个下午来追这个依赖链,最后发现——<span class="good">原来那个"大牛"在写这块逻辑的时候,设计了一个非常精巧的状态机。</span>只不过后来在上面加功能的人不理解这个状态机,打了各种补丁绕过它,才把代码搞成了现在的样子。</p><p>"我靠。"你看着代码感慨,"原来这代码本来写得挺好的……是后来的人把它改坏了。"</p><p>你决定尊重原始设计,把状态机的逻辑还原出来。这比重新发明轮子要高效得多。</p>`,choices:[{t:'顺着状态机思路继续重构',next:'ch8_refactor_day4',fx:{"exp":15}}]},
1267 ch8_refactor_day4:{text:`<p>第四天,你开始写单元测试。<span class="bad">这是他第一次给自己的代码写测试覆盖率超过80%。</span></p><p>你采用的是测试驱动开发。先写测试用例,再写实现。每写一个测试之前,你都会想清楚这个模块在各种边界条件下的行为。</p><p>正常数据、空数据、异常数据、并发场景。你把能想到的情况全写进了测试用例。有些测试一开始是红色的,然后他一行一行地写实现,看着那些红条慢慢变成绿色,心里有种说不出的满足感。</p><p>老王看你写测试看得目瞪口呆:"你什么时候变得这么……专业了?"</p><p>"被屎山吓出来的。"你头也不抬。</p>`,choices:[{t:'继续写测试到深夜',next:'ch8_refactor_day5',fx:{"exp":15}}]},
1268 ch8_refactor_day5:{text:`<p>第五天,你和老王进入了最艰难的阶段。联调。拆出来的模块各自独立跑没问题,但合在一起就出各种奇怪的bug。</p><p>订单服务调支付服务的时候超时了三次。支付服务返回成功后通知服务没收到回调。通知服务发了重复的消息……</p><p>"分布式系统的三大难题。"你苦笑着说,"不,不是三大难题,是每一个细节都是难题。"</p><p>你和老王在白板上画了张调用时序图,标记出每个接口的预期行为,然后逐一排查。<span class="good">整整六个小时后,最后一个bug被找到。一个soap请求的timeout设置太短了。</span></p>`,choices:[{t:'终于联调通过了',next:'ch8_refactor_complete',fx:{"exp":20}}]},
1269 ch8_refactor_complete:{text:`<p>第六天下午,你在测试环境上跑完了最后一轮回归测试。一百四十七个测试用例,全部绿色通过。</p><p>你把结果截图发到群里:「重构完成。测试全部通过。」</p><p>群里安静了一秒,然后炸了:</p><p>产品经理:「真的假的?新功能能上了?」</p><p>老王:「代码量从两万三千行降到了一万两千行,测试覆盖率从0%到了85%。」</p><p>技术总监老陈发了个大拇指:「干得漂亮。」</p><p>林悦私聊了他:「🎉 晚上请你吃饭庆祝一下?」</p><p>你看着屏幕上的消息,嘴角止不住地上扬。</p>`,choices:[{t:'当然要去',next:'ch8_celebration',fx:{"exp":25}}]},
1270 ch8_celebration:{text:`<p>晚上七点半,公司附近的一家烤鱼店。林悦点了一桌菜,你看着说太多了吃不完,林悦说:"吃不完打包,反正你明天午饭也有了。"</p><p>烤鱼端上来的时候,辣椒和花椒的香气直冲鼻腔。林悦给你倒了一杯啤酒:"来,敬你。成功的重构,比我预期的还快了三天。"</p><p>你跟她碰了一杯:"其实真要感谢你。那天晚上你建议我用接口约束,帮我省了两天时间。"</p><p>"那你怎么谢我?"林悦歪着头看你。</p><p>你想了想:"下周末请你吃饭?吃那家JSON菜单的咖啡馆?"</p><p>林悦眼睛亮了:"你居然还记得。好,一言为定。"</p>`,choices:[{t:'拉勾约定',next:'ch8_after_refactor',fx:{"exp":20}}]},
1271 ch8_cursor_shock:{text:`<p>重构进行到第三个月的时候,一个叫Cursor的编辑器在程序员圈子里炸了。王宇把截图发到群里——一个新手用它三小时写了一个完整的CRUD应用。「我靠。」老王回了一句。你下载了试试。打开编辑器、描述需求、生成代码——前后不到三十秒。你看着屏幕上自动生成的代码,沉默了很久。ChatGPT还能安慰自己说它只是个辅助工具。但Cursor会让你觉得自己正在被替代。</p><p>你关掉编辑器。你打开自己的重构项目。你看着那两万行代码。你重新打开了Cursor。</p>`,choices:[{t:'🤔 试试用AI辅助重构',next:'ch8_ai_daily'}]},
1272 ch8_ai_daily:{text:`<p>你开始在日常开发中用AI。写单元测试让AI生成模板再自己改参数。写文档让AI先写框架再补细节。写SQL让AI优化性能。效率确实提升了——以前一天写三个接口,现在能写五个。但团队里开始有声音——「这代码算谁写的?」老王半开玩笑地说了一句。你认真想了想说:「算我们俩的。」你说不清楚这种感觉——你在用AI加速自己的工作,但每周工作总结的时候,你发现自己能写的东西变多了,但写完之后的时间并没有变多。老板给的任务量也跟着翻倍了。你开始理解——工具越强,期望越高。</p>`,choices:[{t:'😐 继续干吧',next:'ch8_after_refactor'}]},
1273 ch8_after_refactor:{text:`<p>重构上线后的那个周一,全组都感受到了变化。原来打开那个文件要等三秒,现在秒开。原来加一个新功能要小心翼翼地在屎山上找位置,现在只用新增一个service类就好。</p><p>最直观的变化是。老王的笑声变多了。以前他每天都像上坟一样坐在工位上,现在居然偶尔会哼歌了。</p><p>"小段。"午休的时候,老王把你拉到一边,"你有没有想过……转管理?"</p><p>你愣了一下:"管理?我没想过。"</p><p>"你有这个潜质。"老王认真地说,"这次重构,你不仅技术到位,还主动跟老板沟通争取时间。很多人只会埋头写代码,但你既能写代码又能推动事情。"</p><p>你没接话,但老王的话在他心里种下了一颗种子。</p>`,choices:[{t:'认真考虑一下未来',next:'CHAPTER_COMPLETE',fx:{"exp":15}}]}
1274 }
1275 },
1276 {
1277 title: '第九章 · 出差偶遇',
1278 start: 'ch9_start',
1279 scenes: {
1280 ch9_ai_debug:{text:`<p>在深圳出差的时候你遇到了一个棘手的问题。客户的系统有一个Bug你调了一整天没找到原因。你抱着试试看的心态把日志贴给了ChatGPT。它看了几秒说——「第三行有个类型转换错误。String转Integer没做空值处理。」你检查了一下代码。它说对了。</p><p>你坐在酒店房间里呆了好一会儿。你写了这么多年的代码、debug了无数次——《一个AI几秒钟找到了你一天的活》。黄工第二天问你问题解决了没有。你说解决了——用一种新的方法。</p>`,choices:[{t:'🤯 太强了',next:'ch9_solution'}]},
1281ch9_shenzhen_evening:{text:`<p>出差的最后一个晚上你一个人在深圳的街头走了很久。你走到深圳湾公园坐在海边的长椅上吹着海风。你给林悦打了个电话。她接起来的时候正在回家的地铁上——「喂?你那边怎么有海浪的声音?」你说我在海边。她说——「深圳还有海?」你说有的。她沉默了几秒然后说——「下次我们一起去。」你说好。挂了电话之后你坐在海边的长椅上看着远处的灯火。你开始期待下次来深圳——不是出差。是跟她一起。</p>`,choices:[{t:'🌊 回酒店',next:'ch9_solution'}]},
1282ch9_return_flight:{text:`<p>回北京的飞机上你靠窗坐着。深圳在舷窗外越来越小最后消失在云层下。你打开手机翻看这几天跟林悦的聊天记录。从早到晚——每天十几条消息。你把聊天记录往上翻翻到了第一句——她问的:「到了吗?」从那一句开始你们聊了一整个出差周期。你关掉手机靠着窗。空姐问你要什么喝的。你要了一杯橙汁。喝着橙汁看着窗外的云你觉得深圳很好——但北京更好。因为北京有她。</p>`,choices:[{t:'☁️ 飞回北京',next:'ch9_solution'}]},
1283ch9_work_late_shenzhen:{text:`<p>在深圳出差那几天你每天都工作到很晚。有一天晚上你走出客户公司的时候已经快十一点了。站在深圳的街头你突然觉得有点饿。你找了一家还在营业的砂锅粥店点了一碗。热腾腾的粥端上来的时候你拍了一张照片发给林悦。她过了几分钟回了一条——「这么晚才吃饭?」你说刚忙完。她说——「回来给你做好吃的。」你看着那条消息把一碗粥喝完了。每一口都是暖的。</p>`,choices:[{t:'🍲 吃完回酒店',next:'ch9_solution'}]},
1284ch9_wechat_msg:{text:`<p>出差那几天你跟林悦的聊天记录比跟客户还多。她每天早上会发一条——「今天深圳天气怎么样?」你回一张窗外的照片。每天晚上她会发一条——「吃饭了吗?」你回一张饭的照片。第三天晚上她发了一条——「还有几天回来?」你说后天。她说——「那后天我去接你。」你看着那条消息在黑暗的酒店房间里笑了。</p>`,choices:[{t:'😊 好',next:'ch9_solution'}]},
1285ch9_shenzhen_night:{text:`<p>在深圳的最后一晚你一个人出去走了走。南方的夜晚跟北京完全不同——空气潮湿温暖路边的棕榈树在路灯下投下长长的影子。你走到一家糖水铺子点了一碗杨枝甘露。坐在路边的小桌上吃着糖水看着深圳的夜景。你想——如果有一天你离开北京你会去哪里。你想了想觉得还是北京好。不是因为北京有多好。是因为那个人在北京。</p>`,choices:[{t:'🍨 吃完回酒店',next:'ch9_solution'}]},
1286ch9_hotel_call:{text:`<p>出差住的酒店房间有一个很大的窗户。窗外是深圳的天际线。你站在窗前给林悦打视频电话。她接起来的时候穿着睡衣头发散着。「你那边夜景不错嘛。」你把摄像头转向窗外。「好看。但还是北京好看。」「北京有什么好看的。」「有你啊。」说完她就挂了。你站在窗前看着深圳的夜景笑了很久。</p>`,choices:[{t:'😊 晚安',next:'ch9_solution'}]},
1287ch9_return_gift:{text:`<p>回北京那天你在深圳机场买了一个礼物——一盒广式点心。你带回来放在林悦桌上的时候她正在写代码。她抬头看了一眼盒子:「深圳特产?」你说是的。她打开盒子拿起一块老婆饼咬了一口:「嗯。好吃。算你有心。」然后她继续写代码了。你回到自己工位。过了一会儿手机亮了。她的消息:「谢谢。点心很好吃。比好吃更好吃的是你记得带。」</p>`,choices:[{t:'😊 不客气',next:'ch9_debug_start'}]},
1288ch9_client_praise:{text:`<p>出差结束那天客户请你们吃饭。黄工举着酒杯跟你说:「小段,你是我见过的外派工程师里技术最好的之一。」你赶紧谦虚了一下。你说不是客套话——「你有几个问题,我在我们自己的技术团队里都没找到答案,你来了两天就搞定了。」你端起酒杯跟他碰了一下。你不确定自己是不是真的有那么厉害。但你确定自己喜欢这种——帮人解决问题的感觉。</p>`,choices:[{t:'🍻 干杯',next:'ch9_solution'}]},
1289ch9_airport_back:{text:`<p>回北京的飞机上你坐在靠窗的位置。深圳在舷窗外越来越小,最后消失在云层下面。你靠着窗户,脑子里过了一遍这次出差的收获:搞定了客户的疑难问题、跟黄工建立了不错的关系、还吃了这辈子最好吃的肠粉。你拿出笔记本把这次出差的经验写了下来。空姐经过的时候问你要什么喝的。你要了一杯可乐。喝着可乐看着窗外的云,你觉得这份工作比你想象中更有意思——不是因为技术多难,而是因为你跟真实的人在打交道。</p>`,choices:[{t:'😊 回北京',next:'ch9_debug_start'}]},
1290ch9_hotel_night:{text:`<p>深圳的夜晚很潮湿。你躺在酒店床上,窗户开着一条缝,带着咸味的暖风从缝隙里钻进来。你给林悦发了条消息说深圳的晚上跟北京完全不一样。她回那你喜欢哪边的晚上。你想了想说,北京的有你。发出去之后你盯着屏幕看了好久。她回了一串省略号然后说:「你什么时候变这么会说话了。」你放下手机笑了很久。</p>`,choices:[{t:'😴 睡觉',next:'ch9_solution'}]},
1291ch9_debug_midnight:{text:`<p>在深圳的第三天。你在酒店房间里写到凌晨一点。客户的系统有个Bug跟本地环境的表现不一样,你调了四个小时还没找到原因。你揉着眼睛,准备放弃明天再说。躺在床上却睡不着,脑子里一直在过代码逻辑。突然你坐了起来——你找到原因了。一个时区配置的差异。你打开电脑改了一行代码,然后躺下来,终于睡着了。</p>`,choices:[{t:'😴 睡吧',next:'ch9_solution'}]},
1292 ch9_shenzhen_food:{text:`<p>客户带你吃了深圳最好吃的肠粉。店面不大,在一条巷子里,但门口排了很长的队。黄工说这家店你从大学吃到现在,十几年了。你夹起一块肠粉蘸了蘸酱油,入口滑嫩,米香浓郁。你想起北京那些匆忙的早餐——煎饼果子、包子、豆浆。深圳的节奏好像跟北京不一样,连早餐都从容一些。你拍了张照片发给林悦:「深圳的肠粉,正宗。」她回:「羡慕!给我带一份回来。」你笑了——肠粉怎么带。</p>`,choices:[{t:'🍜 吃完回公司',next:'ch9_solution'}]},
1293ch9_flight_mood:{text:`<p>飞机穿过云层,北京在舷窗外越来越小。你看着那些方块一样的城市慢慢被云遮住。这是你第一次出差。你心里有一种说不上来的感觉——不是紧张,是一种「你在往前走」的感觉。</p><p>空姐推着餐车经过。你要了一杯咖啡。咖啡一般,但热乎乎的握在手里很踏实。你打开笔记本,把客户的需求又看了一遍。</p>`,choices:[{t:'📖 准备资料',next:'ch9_flight'}]},
1294 ch9_dinner_shenzhen:{text:`<p>客户那边请吃饭。一家粤菜馆,装修很讲究。客户方的技术负责人是个四十多岁的广东人,姓黄,说话带着广式普通话的口音。</p><p>黄工很健谈,从技术聊到深圳的房价,从房价聊到孩子的教育。你坐在那里听着,偶尔插几句话。你发现跟客户吃饭也是一种能力——不是要你多能说,是要你让人觉得靠谱。</p>`,choices:[{t:'🍚 好好吃饭',next:'ch9_solution'}]},
1295 ch9_night_shenzhen:{text:`<p>晚饭后你一个人走在深圳的街头。南方的夜晚跟北京完全不一样——空气潮湿温暖,路边种着棕榈树,街上的人穿着拖鞋走来走去。</p><p>你给林悦发了条消息:「深圳晚上的风是暖的。」</p><p>她回了一条:「北京晚上降温了,记得穿外套。」然后过了一秒又发了一条:「不对,你在深圳,那边热。那你别穿太多了。」</p><p>你笑了。站在陌生的城市街头,看着手机屏幕上的那两行字。</p>`,choices:[{t:'🌴 回酒店',next:'ch9_solution'}]},
1296ch9_start:{text:`<p>六月中旬,北京的天气已经开始热了。空调从早转到晚,窗外的蝉鸣透过关不严的窗户缝隙钻进来。</p><p>周一晨会上,技术总监拿着名单扫了一圈,目光落在你身上。</p><p>「小段,你之前重构那个模块跟深圳的系统有对接,你去最合适。」然后他目光又移动了一下,「林悦你也是,那个接口是你当初写的,一起去。」</p><p>你和林悦隔着三个工位的距离对视了一眼。林悦的表情从惊讶变成了一种说不清道不明的微妙。</p><p>「出差几天?」你问。</p><p>「看情况,三到五天。」老陈的语气轻描淡写得像是在说去楼下取个快递,「机票已经订好了,下午两点。」</p>`,choices:[{t:'这出差也太突然了',next:'ch9_pack_rush',fx:{"exp":10}},{t:'⚔️ 消灭这个Bug!',next:'__FIGHT__',fx:{"exp":23}}]},
1297 ch9_after_fight:{text:`<p>Bug被你消灭了。你拍了拍手。然后看到了技术总监的消息。<br>\"小段。下午两点出差。和林悦一起去深圳。\"<br>你看了看时间。已经快中午了。你敲了敲林悦的桌子:\"收拾东西。下午出差。\"<br>她抬头看你。笑了笑——\"你知道了?我刚想跟你说。\"</p>`,choices:[{t:'🏃 赶紧收拾行李',next:'ch9_pack_rush',fx:{"exp":15,"hp":5}}]},
1298 ch9_pack_rush:{text:`<p>中午十二点。晨会结束才过了一个小时,你就站在了自己的出租屋里——你骑共享单车回来的,骑了二十分钟,后背的衣服湿透了贴在皮肤上。你拉开衣柜,随便拽了几件衣服往背包里塞:两件T恤、一条牛仔裤、充电器、笔记本。你出差从来不拖沓,从进门到收拾完不超过二十分钟。</p><p>手机在桌上震了起来。林悦打来的。</p><p>「段飞,你带外套了吗?」她的声音从听筒里传过来,带着一点理所当然的关心,「我看深圳这周有雨。气温倒是不低,但室内空调很冷。」</p><p>你低头看了看自己已经拉好拉链的背包——里面只有短袖。你沉默了一秒,然后拉开拉链,从衣柜里抽出一件薄外套塞了进去。「……现在带了。」</p><p>林悦在那头笑了,笑声像一串铃铛:「我就知道你没带。机场见?」</p><p>「机场见。」你挂了电话,嘴角不自觉地弯了一下。</p>`,choices:[{t:'出发去机场',next:'ch9_airport',fx:{"exp":10}}]},
1299 ch9_airport:{text:`<p>下午一点。你在公司楼下打到一辆出租车,拉开车门的时候发现林悦已经坐在后座了。她穿了一件浅灰色的薄针织衫,配一条深色牛仔裤,头发松松地扎在脑后,露出一截白皙的后颈。</p><p>「你怎么这么快?」你上车坐好,关上车门才反应过来——她住的地方比自己远至少五公里。</p><p>「我提前出来了。」林悦说,语气轻描淡写,「出租屋也没什么好收拾的。」</p><p>出租车驶入主路,空调吹出来的风带着一股淡淡的车载香薰味。你靠在座椅上,余光里是林悦搭在膝盖上的手。指甲剪得很短,干干净净的。</p><p>去机场的路上,林悦靠在窗边刷手机。城市在车窗外流动,国贸的楼群、东三环的车流、机场高速两侧的绿植。偶尔她会转头跟你聊两句。聊着聊着就说到了深圳分公司的情况——「据说那边的技术负责人是出了名的难搞,外号叫‘铁手’。」</p><p>「铁手?」你听到这个名字的第一反应是觉得有点中二,像武侠小说里的称号。</p><p>「因为他review代码的时候,从来不给情面。不管你是谁,代码写得烂就直接打回去重写。」林悦说,然后又压低了一点声音,「听说上个派去支援的同事,在会议室被你当众骂哭了。」</p>`,choices:[{t:'有点紧张',next:'ch9_flight',fx:{"exp":10}},{t:'我倒想会会他',next:'ch9_flight',fx:{"exp":15}}]},
1300 ch9_flight:{text:`<p>飞机在跑道上滑行了一段,然后加速、抬头、离地。窗外的地面越来越远,房屋变成火柴盒,公路变成灰色的细线。飞机穿过云层的时候颠簸了一下,你握了握扶手。</p><p>飞行平稳之后,空姐推着小车开始发餐。一个纸袋里装着一块小面包、一盒切好的水果、一小包榨菜。</p><p>「这玩意儿够谁吃的。」你看着那个纸袋叹气。你早上吃得不多,肚子已经开始叫了。</p><p>林悦从自己的随身包里掏出一包坚果和两瓶酸奶,像变魔术一样:「我早有准备。」</p><p>她把一瓶酸奶递过来。你伸手去接,两个人的手指在冰凉的瓶身上碰了一下。就那么一瞬间——不到一秒的接触——<span class="good">你感觉到自己的脉搏不争气地加速了。冰凉的瓶壁和温热的指尖形成了鲜明的对比。</span></p><p>「你脸怎么有点红?」林悦歪着头看你。</p><p>「……飞机上有点热。」你生硬地说,然后扭过头去看窗外。窗外的云层白得晃眼,你假装被那景色深深吸引住了,但玻璃上映出了你自己那副心虚的表情。</p>`,choices:[{t:'装作看风景',next:'ch9_arrive_shenzhen',fx:{"exp":15}}]},
1301 ch9_arrive_shenzhen:{text:`<p>下午四点半,飞机降落在宝安机场。机舱门打开的瞬间,一股湿热的气浪像一堵墙一样迎面撞上来。你在北方待久了,几乎忘了夏天还可以这么潮湿——空气黏糊糊的,带着一种植物蒸腾出的闷热,像走进了一个巨大的温室。</p><p>「好热……」林悦一出航站楼就用手扇风,但扇出来的风也是热的。</p><p>分公司派了一辆黑色商务车来接。坐进车里,空调的凉风终于让你缓过劲来。司机从后视镜里看了他们一眼:「两位先到酒店放行李。然后李工——就是你们说的'铁手'——说七点在分公司见面。」</p><p>你看了看手机:快五点了,还有两个小时。你转头看向窗外。深圳的天际线在午后的光线中展开——平安金融中心像一根银色的针矗立在云层下,周围的高楼大厦鳞次栉比,玻璃幕墙反射着刺眼的光。<span class="good">这座城市跟北京不一样。它年轻、逼仄、闷热,但有一种说不出的活力,像刚打开瓶盖的碳酸饮料,气泡在往上冒。你看着窗外,莫名地有些兴奋。</span></p>`,choices:[{t:'去酒店放行李',next:'ch9_hotel_checkin',fx:{"exp":10}}]},
1302 ch9_hotel_checkin:{text:`<p>分公司订的酒店在科技园附近,一家连锁商务酒店。前台给了两张房卡。你在1206,林悦在1208,正好隔壁。</p><p>"真巧。"林悦晃了晃房卡。</p><p>你心里想的是"真不巧怎么不是一间",但嘴上说的是:"嗯,挺方便的,有事敲门。"</p><p>你进了房间,发现是个标准的大床房。床很白,窗户正对着对面的科技园大楼。你放下包,洗了把脸,对着镜子整理了一下头发。然后觉得自己这个举动有点莫名其妙,又不是去相亲。</p>`,choices:[{t:'准备去分公司',next:'ch9_meet_tieshou',fx:{"exp":10}}]},
1303 ch9_meet_tieshou:{text:`<p>晚上七点,你和林悦准时到了分公司。分公司在科技园一栋写字楼的十六层,出电梯就是一面玻璃门,上面印着公司的Logo。</p><p>一个穿着格子衬衫、戴着黑框眼镜的中年男人站在前台等着他们。你看起来四十出头,头发有点稀疏,眼神很锐利。</p><p>"你们就是总部派来的?"你打量了你和林悦一眼,语气不冷不热,"我叫李建国,进来吧。"</p><p>你心想:这就是"铁手"?看起来就是个普通程序员啊。</p><p>李建国把你们带到会议室,打开投影仪,屏幕上显示出一堆报错日志。"三天前开始,订单系统的对账模块每天凌晨都会报这个错。本地团队查了三天没找到原因。"</p>`,choices:[{t:'仔细看报错日志',next:'ch9_debug_start',fx:{"exp":15}}]},
1304 ch9_debug_start:{text:`<p>你盯着屏幕上的日志看了十分钟。<span class="good">你的大脑在处理信息的时候会自动进入一种"心流"状态,周围的人说什么他都听不见。</span></p><p>林悦知道你的习惯,没有打扰他,自己也在旁边翻阅系统的架构文档。</p><p>过了十分钟,你开口了:"这个错误不是逻辑问题,是并发问题。对账任务的cron表达式设的是每天凌晨两点执行,但你们有没有另一个定时任务也在同一时间跑?"</p><p>李建国愣了一下,叫来运维查了一下。果然,数据库备份任务也是凌晨两点。</p><p>"两个任务同时跑,数据库连接池打满了,对账任务拿不到连接就报错了。"你说。</p>`,choices:[{t:'找到了根本原因',next:'ch9_solution',fx:{"exp":25}}]},
1305 ch9_solution:{text:`<p>李建国看了你一眼,眼神里有了一丝认可:"你只看了十分钟日志就定位到了问题?"</p><p>"巧合而已。"你谦虚地说,"我之前的项目也遇到过一模一样的问题。"</p><p>李建国点了点头,没再多说,但语气缓和了不少:"那解决方案呢?"</p><p>你想了想:"两个方案。短期内,把对账时间改成凌晨三点,错开备份窗口。长期方案,把两个任务加到同一个调度队列里,由调度中心统一管理资源分配。"</p><p>"短期方案今天就能改。"李建国拍板,"长期方案你写个设计文档,后面我们再评估。"</p>`,choices:[{t:'现场修改cron表达式',next:'ch9_fix_success',fx:{"exp":15}}]},
1306 ch9_fix_success:{text:`<p>你在分公司的开发环境上改了cron表达式,又检查了一遍相关配置,确保没有其他冲突。然后你在测试环境上手动触发了一次对账任务。一切正常。</p><p>"好了,明天凌晨两点看看线上还会不会再报错。"你合上电脑。</p><p>李建国点了点头,难得露出了一丝笑意:"比我预期的快。你们总部的水平还可以。"</p><p>林悦在旁边说:"那李工,您看我们明天是不是可以……?"</p><p>"问题解决了,明天你们自由活动。"李建国说,"不过既然来了深圳,晚上一起吃个饭吧,我请客。"</p>`,choices:[{t:'盛情难却',next:'ch9_dinner_tieshou',fx:{"exp":10}}]},
1307 ch9_dinner_tieshou:{text:`<p>李建国带他们去了科技园附近的一家潮汕牛肉火锅。店不大,但生意火爆,门外排着长队。李建国显然跟老板很熟,直接进了包间。</p><p>"总部来的稀客,必须安排到位。"李建国脱下外套,露出里面的格子衬衫。领口已经洗得发白了。</p><p>火锅端上来,鲜切的牛肉在滚汤里涮八秒就能吃。你吃了一口,眼睛亮了:"这牛肉好新鲜。"</p><p>"深圳就这点好。"李建国说,"想吃什么都有。你们年轻人,以后可以考虑来深圳发展。"</p><p>你看了林悦一眼,林悦正低头吃牛肉,耳朵尖微微泛红。</p>`,choices:[{t:'聊起工作经历',next:'ch9_life_stories',fx:{"exp":10}}]},
1308 ch9_life_stories:{text:`<p>饭桌上,李建国聊起了自己的经历。你原来在北京一家大厂干了八年,受不了没完没了的加班和内卷,三年前来了深圳这家分公司做技术负责人。</p><p>"北京那会儿,我连续三个月每天凌晨两点下班,头发就是这么掉的。"他拍了拍自己稀疏的头顶,"现在虽然也忙,但至少周末能陪孩子了。"</p><p>你问:"李工,你对这次重构怎么看?"</p><p>李建国放下筷子,认真地说:"你们那个模块我早就想重构了,但我在分公司管不到总部的代码。你能推动这件事,说明你不仅有技术头脑,还有政治头脑。这种人在公司里最容易往上走。"</p>`,choices:[{t:'这句话让你若有所思',next:'ch9_after_dinner',fx:{"exp":15}}]},
1309 ch9_after_dinner:{text:`<p>吃完饭已经快十点了。李建国打车把你们送回酒店。晚风吹过来,带着南国特有的潮润气息。</p><p>"散散步?"林悦问。</p><p>两人沿着酒店附近的小路走了一段。路两边是茂密的榕树,气根垂下来在路灯下投出斑驳的影子。旁边有一家24小时营业的糖水铺,林悦拉着他进去点了两碗杨枝甘露。</p><p>"你知道吗,"林悦用勺子搅着碗里的芒果粒,"我觉得你跟李工是一类人。"</p><p>"哪类?"你问。</p><p>"就是那种。看起来平平无奇,但实际上心里什么都明白的人。"</p>`,choices:[{t:'你觉得我是什么样的人?',next:'ch9_linyue_confession',fx:{"exp":20,"affection":10}}]},
1310 ch9_linyue_confession:{text:`<p>你问出那个问题之后,林悦没有立刻回答。她低头喝了几口糖水,然后抬起头看着你,眼睛在路灯下亮晶晶的。</p><p>"你真的想知道?"她问。</p><p>你心跳加速了,但还是点了点头。</p><p>林悦沉默了几秒,然后说:"你是一个明明很厉害但总觉得自己不够好的人。你习惯往后缩,但推你一把的时候你又能做得比所有人都好。你写代码的时候表情特别专注,专注到……让人移不开眼睛。"</p><p>最后那句话她说得很轻,轻到差点被晚风吹散,但你听清了。</p><p>你的心跳声大到自己都觉得吵。</p>`,choices:[{t:'鼓起勇气回应',next:'ch9_moonlight_walk',fx:{"exp":30}}]},
1311 ch9_moonlight_walk:{text:`<p>两个人从糖水铺出来,并肩走在深圳的夜晚里。街道上行人渐少,只有偶尔路过的外卖骑手和夜班出租车。</p><p>走到一条人行天桥的时候,林悦停了下来,靠在栏杆上看着远处的城市灯火。深圳的中心区在夜色中璀璨如星河。</p><p>"你。"林悦轻声说,"你有没有想过,如果我们不在同一家公司了……还会是朋友吗?"</p><p>你愣了一下:"怎么会不在同一家公司?你要离职?"</p><p>"没有。"林悦笑了笑,"我只是在想未来。谁能保证一直在一个地方呢?"</p><p>你沉默了。你站在林悦旁边,手搭在栏杆上。你犹豫了很久,然后把手慢慢地、装作不经意地往旁边挪了挪,碰到了她的手背。林悦没有躲。</p>`,choices:[{t:'握住她的手',next:'ch9_hotel_return',fx:{"exp":25,"affection":15}}]},
1312 ch9_hotel_return:{text:`<p>回到酒店已经快十一点半了。两人站在走廊里,你刷开了1206的门,林悦站在隔壁1208的门口。</p><p>"明天……"你开口,"明天你有什么安排?"</p><p>"李工不是说让我们自由活动吗?"林悦靠在门框上,"我查过了,深圳湾公园不错,还有一个很火的文创园区。要不要一起去?"</p><p>"好。"你说。</p><p>"那明天早上九点,大堂见?"</p><p>"好。"</p><p>林悦笑了笑,推开房门进去了。门关上之前,她又探出头来:"晚安,你。"</p><p>"晚安。"</p>`,choices:[{t:'回到房间,失眠了',next:'ch9_shenzhen_day2',fx:{"exp":10}}]},
1313 ch9_shenzhen_day2:{text:`<p>第二天早上九点,你准时出现在大堂。你昨晚翻来覆去到凌晨两点才睡着,但今天精神却出奇地好。</p><p>林悦从电梯里走出来,穿了件白色T恤配牛仔短裤,戴了一顶棒球帽。她看到你,上下打量了一下:"你今天穿得比昨天帅。"</p><p>你低头看了看自己。一件新买的黑色Polo衫,牛仔裤,帆布鞋。你早上在镜子前纠结了十五分钟才选了这身。</p><p>"走吧。"林悦很自然地挽了一下你的胳膊,又很快松开,"先去吃个早茶。"</p>`,choices:[{t:'心情好到飞起',next:'ch9_dimsum',fx:{"exp":15}}]},
1314 ch9_dimsum:{text:`<p>林悦带他去了一家藏在老城区的茶楼。茶楼有三层,装修是典型的广式风格。大理石地板,吊扇慢慢转着,推车的大姐用粤语吆喝着"虾饺。烧卖——"。</p><p>林悦熟练地拿下几笼点心:虾饺、烧卖、凤爪、肠粉、流沙包。她给你倒了一杯普洱茶:"尝尝,这家是深圳为数不多还保留传统手艺的茶楼。"</p><p>你夹了一个虾饺,咬了一口。皮薄馅足,虾肉鲜甜弹牙。你忍不住点头:"好吃。"</p><p>"好吃就多吃点。"林悦把整笼虾饺推到你面前,自己夹了一个流沙包。</p>`,choices:[{t:'这大概是最幸福的一个上午',next:'ch9_shenzhen_bay',fx:{"exp":15}}]},
1315 ch9_shenzhen_bay:{text:`<p>吃完早茶,两人打车去了深圳湾公园。公园沿着海岸线延伸,一边是深圳的高楼大厦,一边是开阔的海面,对面可以望见香港的山影。</p><p>海风吹过来,带着咸湿的气息,比昨晚的湿热舒服多了。有人在跑步,有人在骑车,有人在草坪上躺着晒太阳。</p><p>"真想在这个草坪上躺一下午。"林悦张开双臂,深深吸了一口气。</p><p>"那就躺呗。"你说。</p><p>林悦看了他一眼,笑了,真的在草坪上坐了下来。你犹豫了一下,在她旁边坐下。两人看着远处海面上的白鹭和货轮,谁都没说话。</p>`,choices:[{t:'享受这一刻的宁静',next:'ch9_photo_memory',fx:{"exp":10}}]},
1316 ch9_photo_memory:{text:`<p>林悦从包里拿出相机。还是团建时带的那个微单。对着海面拍了几张,然后转头对你说:"来,给你拍张照。"</p><p>你下意识地要躲,林悦喊住他:"别躲!自然一点,就看海。"</p><p>你只好僵在原地,强行看向海面。林悦按下快门,看了看预览,笑了:"这个表情比团建那张好多了。"</p><p>她坐回你身边,把相机递给你看。照片里,你坐在草坪上,侧脸被下午的阳光镀上一层温暖的轮廓,表情平静而自然。</p><p>"这张拍得挺好。"你承认。</p>`,choices:[{t:'可以发给我吗?',next:'ch9_creative_park',fx:{"exp":10}}]},
1317 ch9_creative_park:{text:`<p>下午他们去了华侨城创意园。园区由旧厂房改造而成,红砖墙面上爬满了绿植,咖啡馆和设计工作室散落在园区各处。</p><p>林悦兴奋得像个小孩子,每个角落都要拍几张照片。她拉着你进了一间独立书店,书架上摆满了各种设计类书籍和独立杂志。</p><p>"你看这个。"她拿起一本封面很好看的文学杂志翻了几页,"深圳这种城市,表面上看是搞钱的,但深入下去会发现很多人在认真做文化。"</p><p>你在旁边翻着一本讲Golang并发编程的书,听到她的话,放下书说:"就像程序员这个群体,表面上看是修电脑的,实际上有人在写诗。"</p>`,choices:[{t:'两个人相视而笑',next:'ch9_evening_return',fx:{"exp":15}}]},
1318 ch9_evening_return:{text:`<p>傍晚六点,两人找了一家园区里的精酿酒吧。店里放着轻爵士,灯光暖黄,客人们三三两两地坐着聊天。</p><p>林悦点了一杯西柚味的酸IPA,你要了一杯小麦啤。碰杯的时候,林悦说:"这趟出差比我想象的好玩多了。"</p><p>"因为bug解决得顺利?"你问。</p><p>"因为遇到了对的人一起玩。"林悦看着他,喝了一口酒。</p><p>你觉得自己的心跳又开始加速了。你低头喝了一大口啤酒来掩饰,然后被苦味呛得直咳嗽。</p><p>林悦笑出了声,拿纸巾递给你:"你喝慢点,又没人跟你抢。"</p>`,choices:[{t:'心里甜甜的,又有点慌',next:'CHAPTER_COMPLETE',fx:{"exp":25}}]}
1319 }
1320 },
1321 {
1322 title: '第十章 · 跳槽风波',
1323 start: 'ch10_start',
1324 scenes: {
1325 ch10_ai_future:{text:`<p>收到那份大厂offer之后你犹豫了很久。但这次跟钱没关系。你在想的是——AI时代来了。大厂有资源做AI、有数据训练模型、有最好的AI基础设施。留在小公司会不会被时代抛下?</p><p>你问ChatGPT这个问题。它回了一堆理性的分析。你关掉页面。你不需要AI帮你做这个决定。你开始意识到——AI越强大,人类做的决定越珍贵。你选择留下不是因为理性分析。是因为你想留下。</p>`,choices:[{t:'😤 定了',next:'ch10_final'}]},
1326 ch9_ai_industry_chat:{text:`<p>深圳分公司的午休时间。你、林悦和李建国在公司楼下的快餐店吃饭。李建国夹了一块叉烧,忽然说了一句:「你们觉得AI会干掉我们这行吗?」</p><p>你放下筷子想了想:「会干掉一部分。但不会干掉全部。」</p><p>「怎么说?」</p><p>「能标准化的活——写SQL、调接口、写单元测试——这些早晚被AI替代。但需要在十几张表里找到业务逻辑的漏洞、需要在凌晨两点判断是回滚还是hotfix、需要理解客户说'这个功能不对'背后到底什么意思——这些AI还不行。」</p><p>李建国点了点头:「我在这个行业干了十五年。见过框架从SSH到Spring Boot、前端从jQuery到React、部署从物理机到容器。每一次都有人说'这次不一样了'。但活还是需要人干。AI也一样。」你喝了一口可乐——「只是干活的人会越来越少。你要确保自己是在越来越少的那批人里。」</p>`,choices:[{t:'😐 若有所思',next:'CHAPTER_COMPLETE'}]},
1327ch10_final_stay:{text:`<p>你拒绝了那份offer。你坐在工位上把offer邮件关掉然后打开了今天的任务列表。第一件事——把用户反馈系统的一个小Bug修了。你开始写代码。一切跟昨天一样。但你心里知道——不一样了。你做出了选择。不是被动的——是主动的。你选择了留在这里不是因为走不了。是因为你不想走。你敲完最后一行代码提交了commit。commit message写着——「fix: 小Bug。心情挺好。」</p>`,choices:[{t:'💻 继续写代码',next:'ch10_final'}]},
1328ch10_commitment:{text:`<p>你决定留下来之后工作状态反而更好了。因为你不再犹豫了。你开始主动承担更多责任——不仅仅是写代码还有带新人做方案跟进项目。有一天你在周报上写了一段话——「这个季度我最大的收获不是技术上的进步。是找到了自己真正想做的事。」王姐在周报下面回了一行批注——「很好。保持。」你看着那两个字关掉了周报。你站起来走到窗前。北京的天很蓝。你觉得自己正在成为想成为的人。</p>`,choices:[{t:'😊 继续加油',next:'ch10_final'}]},
1329ch10_stay_decision:{text:`<p>你做出留下的决定之后给老张发了一条消息——「张哥。我不走了。」他回了一个字——「嗯。」然后过了五分钟他又发了一条——「晚上一起吃饭。我请客。」那天晚上你们去了那家烤串店。老张点了一堆串开了一瓶啤酒。你给自己倒了一杯也给你倒了一杯。你举起杯子说了一句——「留下来是对的。你会走得比去任何大厂都远。」你跟他碰了一下杯。烤串的炭火味混着啤酒的味道。你觉得这是你吃过最好的一顿烤串。</p>`,choices:[{t:'🍺 干杯',next:'ch10_final'}]},
1330ch10_after_decision:{text:`<p>拒绝offer之后你发现自己工作效率变高了。不是因为心情好——是因为你不焦虑了。以前你总是忍不住刷招聘软件、看薪资报告、对比公司。现在你把那些软件全删了。你的注意力回到了代码本身。有一天你写完一个功能的时候发现天已经黑了。你完全忘记了时间。你伸了个懒腰心想——这种感觉真好。</p>`,choices:[{t:'😊 继续写代码',next:'ch10_final'}]},
1331ch10_resign_no:{text:`<p>你没有辞职。你选择留下来。那天下午你照常写代码、开会、跟团队成员对齐进度。跟以前没什么两样。但你知道不一样了——你不再是那个觉得「外面更好」的人了。你知道了自己想要什么。不是薪资翻倍。不是大厂title。是你正在做的这件事——和你正在一起做这件事的人。下班的时候你走出公司大门。北京的秋天傍晚很美。你站在门口深呼吸了一下。然后你笑了。</p>`,choices:[{t:'😊 回家',next:'ch10_final'}]},
1332ch10_lin_stay:{text:`<p>你告诉林悦你拒绝了那份offer。她正在喝水听到之后放下杯子看着你。她沉默了一会儿然后说——「其实我做好了你走的准备。因为你是那种应该往上走的人。我不想到时候拉住你。」她眼睛有点红。你说:「我不走不是因为谁拉住我。是因为我不想走。」</p>`,choices:[{t:'😊 不走了',next:'ch10_dinner'}]},
1333ch10_reject:{text:`<p>你打了那个拒绝电话。对方HR沉默了两秒然后说——「段飞,我们给的薪资你应该知道市场上是什么水平。你确定不再考虑一下?」你说:「确定。谢谢您给我这个机会。我已经决定了。」挂了电话之后你坐在工位上。你做了一件自己都没想到的事——你在手机上删除了招聘软件的账号。你看着那个「确定删除」的按钮犹豫了两秒——然后点了下去。断了自己的退路。你突然觉得轻松了很多。</p>`,choices:[{t:'😤 定了',next:'ch10_final'}]},
1334ch10_interview_day:{text:`<p>面试那天你请了半天假。你没跟任何人说你去哪了——说了「出去办点事」。坐在面试间的椅子上你突然有一种奇怪的感觉——对面的人问你的技术问题你都会。你回答的时候发现自己的语气跟老张很像——平静、直接、不带多余的字。面完之后你在楼下站了一会儿。北京的阳光很好。你能拿到这份offer不是因为运气,是因为你真的变强了。</p>`,choices:[{t:'😐 回公司',next:'ch10_dinner'}]},
1335 ch10_compare:{text:`<p>你坐在工位上把两家公司——现在的和未来的——在脑子里做了一个对比。银河科技:六十五个人、创业氛围、老张王宇小陈林悦、楼下烤串店、加班多但自由。新公司:两万人、大平台、高级技术栈、薪资翻倍、但谁也不认识。你发现你在比较的时候在心里天平一直在往一边偏。你叹了一口气。你知道自己已经做出选择了。</p>`,choices:[{t:'😤 定了',next:'ch10_final'}]},
1336ch10_pros_cons:{text:`<p>你在笔记本上画了一张表格。左边写跳槽的好处,右边写留下的好处。左边写了三条:薪资翻倍、大厂履历、新挑战。右边写了五条:团队熟悉、产品有感情、不用重新证明自己——然后你停了一下,又加了第四条:她在这里。你看着那张表格看了很久。然后你把整张纸撕了下来,揉成一团扔进了垃圾桶。你不需要表格帮你做决定。你心里早就知道答案了。</p>`,choices:[{t:'😤 决定了',next:'ch10_final'}]},
1337ch10_offer_struggle:{text:`<p>你在工位上坐了一整天,一个字都没写进去。打开的代码文件还是早上那个状态,光标停在同一个位置闪了一整天。你站起来去茶水间接水的时候碰到了老张。你看了你一眼:「有心事?」你说没什么。你没追问。但你走的时候他说了一句:「段飞,不管你做什么决定,我支持你。」你端着水杯站在茶水间里,看着窗外北京的天际线发了很长时间的呆。</p>`,choices:[{t:'😐 想清楚',next:'ch10_final'}]},
1338ch10_tell_linyue:{text:`<p>你终于还是把收到了offer的事告诉了林悦。你们坐在公司楼下的便利店里——她拿着一瓶乌龙茶,你拿着一瓶可乐。你说完之后她沉默了一会儿。然后她说:「你走了我会想你的。」就五个字。但你听完之后心里像被什么东西撞了一下。你张了张嘴想说点什么,但什么也说不出来。她拧开瓶盖喝了一口茶,然后笑了笑说:「但如果你觉得那个机会更好,你就去。」</p>`,choices:[{t:'😐 我还没决定',next:'ch10_dinner'}]},
1339ch10_hunter_call:{text:`<p>周二下午。你正在写代码。手机响了。一个不认识的北京号码。</p><p>你接起来。对面是一个年轻男人的声音,语速很快很专业:<span class="info">「请问是段飞先生吗?我是猎头顾问小陈。方便讲两句吗?」</span></p><p>你愣了大概两秒。猎头。第一次有猎头给你打电话。</p><p>「呃……方便。你说。」</p><p>「我这边有一家B轮电商公司在招高级后端工程师。薪资范围二十到二十五K。我看过你的履历,觉得你挺合适的。有兴趣聊聊吗?」</p>`,choices:[{t:'📞 聊聊',next:'ch10_interview_prep'},{t:'🙅 先不聊',next:'ch10_start'}]},
1340 ch10_interview_prep:{text:`<p>你挂了电话。二十到二十五K。你现在是九千六。</p><p>你打开招聘网站翻了一下同类岗位的薪资范围。发现自己确实被低估了。不是能力的问题——是你从来没想过自己可以值更多。</p><p>你开始准备面试。不是真的想走,是想知道自己现在到底值多少钱。</p>`,choices:[{t:'📚 准备面试',next:'ch10_start'}]},
1341 ch10_offer_received:{text:`<p>面试通过了。对方给了二十K。你盯着offer邮件,手有点发抖。</p><p>二十K。是你现在工资的两倍多。你想起一年前在隔断间里吃泡面的时候,觉得月薪八千已经是天花板了。现在有人愿意给你两万。</p><p>你坐在工位上,看着窗外北京的天际线,脑子里翻来覆去只有一个问题——走,还是不走?</p>`,choices:[{t:'😐 认真考虑',next:'ch10_dinner'}]},
1342 ch10_count_offer:{text:`<p>你在心里算了一笔账。</p><p>跳槽:薪资翻倍,能住更好的房子,每月多攒七八千,能更快给家里寄钱。但新公司是电商行业,加班文化出了名的重。而且你要离开银河科技——离开老张、王宇、小陈。</p><p>还有林悦。</p><p>你坐在工位上把这份offer看了很多遍,直到林悦端着水杯从你工位旁边经过,问你今天晚上要不要一起吃饭。</p>`,choices:[{t:'🥟 好',next:'ch10_dinner'}]},
1343ch10_start:{text:`<p>出差回来后的第三周,你的生活恢复到了日常。写代码、修bug、午休时和林悦一起吃饭,但一切平静在一个周二下午被打破了。</p><p>手机在桌上无声地亮了一下——你设了静音——屏幕上弹出一条微信消息通知,来自一个没有备注名的联系人。</p><p>「您好段先生,我是XX猎头的Joyce。方便电话聊一下吗?有一个高级开发工程师的机会,薪资非常有竞争力。」</p><p>你盯着屏幕上那行字看了好几秒,脑子里处理这句话花的时间比处理一行bug日志还长。你一直觉得「被猎头挖」是那些十年以上经验的大牛才有的待遇——那种在技术大会上侃侃而谈、GitHub星星比代码行数还多的人。自己一个写crud写了三年的初级程序员,怎么会被猎头盯上?你第一反应是是不是诈骗。</p>`,choices:[{t:'好奇,回复了猎头',next:'ch10_hunter_call',fx:{"exp":10}},{t:'直接忽略,不感兴趣',next:'ch10_ignore_headhunter',fx:{"exp":5}},{t:'⚔️ 抄起键盘,打!',next:'__FIGHT__',fx:{"exp":25}}]},
1344 ch10_after_fight:{text:`<p>Bug灰飞烟灭。你放下键盘。手机正好震了一下。是一条猎头发来的微信。<br>你盯着那个对话框看了几秒——Bug刚修完就有人来挖。这算是命运的安排吗?<br>你犹豫了一下。点开了消息。</p>`,choices:[{t:'📱 回复猎头看看',next:'ch10_hunter_call',fx:{"exp":15,"hp":5}}]},
1345 ch10_ignore_headhunter:{text:`<p>你把猎头的消息划掉了,但过了两天,同一个猎头又发了一条消息:「段先生,我看了您在GitHub上的重构项目,那个状态机设计非常出色。我们这边的一家头部互联网公司正好在找有这方面经验的人。」</p><p>你犹豫了。你打开了猎头发来的职位描述——"高级后端工程师,负责核心交易系统的架构升级"。薪资范围比你现在的工资高了将近一倍。</p><p><span class="good">一倍。</span></p><p>你开始认真考虑这个机会了。</p>`,choices:[{t:'约猎头聊一聊',next:'ch10_hunter_call',fx:{"exp":15}}]},
1346 ch10_hunter_call:{text:`<p>午休时间,你躲到楼梯间给猎头回了电话。猎头Joyce的声音很专业:"段先生,这家公司的具体情况是这样的。你们是一家DAU千万级的社交电商平台,技术栈跟你现在用的很匹配,但是他们正在从单体架构往微服务迁移,急需有重构经验的人。"</p><p>你问:"薪资范围能透露一下吗?"</p><p>Joyce报了一个数字。你差点以为自己听错了。那数字是他现在工资的两倍,还不算期权。</p><p>"……我可以试试。"你听到自己说。</p>`,choices:[{t:'约好面试时间',next:'ch10_prepare_interview',fx:{"exp":20}}]},
1347 ch10_prepare_interview:{text:`<p>挂了电话,你回到工位,心还在怦怦跳。你打开浏览器搜索那家公司。确实是知名互联网企业,C轮融资,团队技术氛围在圈内口碑不错。</p><p>面试定在这周六。你需要在五天之内准备好系统设计、算法和项目经验的面试内容。</p><p>下班后,你没有走,留在工位上刷LeetCode。你三年没刷过算法题了,动态规划那种题目看着就像天书。</p><p>"还不走?"林悦的声音从背后传来。</p><p>你吓得差点把手机扔出去,赶紧把LeetCode页面最小化。</p>`,choices:[{t:'被发现了,有点心虚',next:'ch10_linyue_discovers',fx:{"exp":15}}]},
1348 ch10_linyue_discovers:{text:`<p>林悦走过来,看了一眼你的屏幕。你关窗口的速度慢了半秒,LeetCode的Logo还是被她看到了。</p><p>"LeetCode?"林悦挑眉,"你找工作?"</p><p>你知道自己瞒不住了,只能老实交代:"有一个猎头联系我,说有一家不错的机会……我还没决定要不要去。"</p><p>林悦的表情没有什么变化。她沉默了几秒,然后在旁边的椅子上坐下来:"哪家公司?"</p><p>你说了公司名字。林悦点了点头:"不错的公司。薪资呢?"</p><p>你说了那个数字。林悦的表情终于出现了一丝波动。她的眼神黯了一瞬,但很快就恢复了正常。</p><p>"那确实很高。"她说,语气很平静。</p>`,choices:[{t:'你觉得我应该去吗?',next:'ch10_linyue_advice',fx:{"exp":20}}]},
1349 ch10_linyue_advice:{text:`<p>你问出这个问题之后,林悦很久没有说话。</p><p>"你想听我作为同事的建议,还是作为……朋友的?"林悦问。</p><p>"都听。"你说。</p><p>林悦靠在椅背上,看着天花板想了一会儿:"作为同事,我告诉你这个机会挺好的。薪资翻倍,平台更大,对你职业生涯有利。作为朋友……"她停顿了一下,"我会想你走。"</p><p>最后四个字她说得很轻,但你听得很清楚。</p>`,choices:[{t:'心里很乱,不知道该怎么办',next:'ch10_interview_dilemma',fx:{"exp":25}}]},
1350 ch10_interview_dilemma:{text:`<p>接下来的几天,你陷入了一种矛盾的状态。白天在公司写代码、开会、跟林悦正常相处;晚上回到家刷算法题、准备系统设计、改简历。</p><p>有一天午休,你在茶水间倒咖啡,碰到了老王。</p><p>"你最近脸色不太好。"老王说。</p><p>"没睡好。"你含糊地说。</p><p>老王看了他一眼,没追问,只是说:"年轻人别太拼。工作是做不完的,但身体和身边的人更重要。"</p><p>你端着咖啡回到工位,看着旁边林悦的背影,心里五味杂陈。</p>`,choices:[{t:'周六去面试',next:'ch10_interview_day',fx:{"exp":15}}]},
1351 ch10_interview_day:{text:`<p>周六早上,你穿上自己最好的一件衬衫。那件只在面试和年会时穿的白衬衫。坐了一个小时地铁到了那家公司所在的写字楼。</p><p>写字楼比你现在公司的高大上多了。一楼大堂挑高十几米,前台小姐姐妆容精致,递给你一张访客卡。</p><p>面试分四轮:两轮技术面、一轮系统设计、一轮HR面。第一轮技术面问了不少八股文。进程线程、内存管理、TCP拥塞控制。你答得中规中矩。</p>`,choices:[{t:'第二轮开始上难度了',next:'ch10_interview_round2',require:{armor:3},fx:{"exp":20,"hp":10}}]},
1352 ch10_interview_round2:{text:`<p>第二轮技术面的面试官是个三十出头的男人,头发比李建国还少。你看了看你的简历,然后问了一个很实际的问题:</p><p>"你重构过核心交易系统。我想知道,如果线上出了问题,你是更倾向于回滚还是hotfix?"</p><p>你想了想,说:"这要看情况。如果是影响用户交易的核心链路出现问题,我会优先回滚到上一个稳定版本,保障用户体验。然后再去修复问题,充分测试后再上线。如果是非核心链路上的小bug,hotfix风险更小的话也可以考虑。"</p><p>面试官点了点头,没有表态,继续问下一个问题。</p>`,choices:[{t:'继续作答,渐入佳境',next:'ch10_interview_system',fx:{"exp":15}}]},
1353 ch10_ai_interview_question:{text:`<p>面试进行到第三轮。面试官——一个戴着无框眼镜的技术总监——看了一眼你的简历,然后问了一个你没想到的问题:「你怎么看待AI对后端开发的影响?」</p><p>你想了两秒,然后说:「AI会让后端开发的门槛降低,但天花板会更高。」</p><p>面试官挑了挑眉:「详细说说。」</p><p>「门槛降低是因为CRUD类的接口生成已经被AI覆盖了,初级开发的工作会被挤压。天花板变高是因为——当代码生成不再是瓶颈的时候,架构设计、数据一致性保障、高可用设计这些真正值钱的能力会更值钱。」</p><p>面试官笑了一下:「你这个观点挺有意思。我们内部也在讨论AI对技术团队的影响。后面如果入职了,你可以参与到这个讨论里来。」</p>`,choices:[{t:'😊 回答得很好',next:'ch10_interview_system'}]},
1354 ch10_interview_system:{text:`<p>系统设计题是"设计一个秒杀系统"。你在白板上画了个架构图:</p><p>"前端做限流,NGINX层做IP级别的限流。业务层用消息队列削峰,Redis做库存预热和扣减。数据库层面做乐观锁防止超卖。"</p><p>面试官追问:"如果Redis挂了怎么办?"</p><p>"Redis可以做集群加哨兵模式保证高可用。如果Redis完全不可用,可以降级到数据库层面,用行锁保证一致性,但吞吐量会下降很多。所以要设计兜底策略。在极端情况下,牺牲部分用户体验来保证核心交易的正确性。"</p>`,choices:[{t:'面试官表情松动了',next:'ch10_interview_hr',fx:{"exp":20}}]},
1355 ch10_interview_hr:{text:`<p>HR面是一个看起来很干练的三十多岁女性。她没问技术问题,而是问了很多关于职业规划的问题。</p><p>"你为什么想要离开现在的公司?"HR问。</p><p>你斟酌了一下措辞:"我现在的工作平台不错,但我感觉成长天花板已经快到了。我希望在更大的平台上挑战自己。"</p><p>HR点了点头:"你现在的薪资是多少?期望薪资呢?"</p><p>你报了一个数字。你几乎没有底气报那么高,但还是硬着头皮说了。</p><p>HR在笔记本上记了几笔,微笑着说:"好的,我们会在一周内给你回复。"</p>`,choices:[{t:'面试结束了,但心里很忐忑',next:'ch10_after_interview',fx:{"exp":10}}]},
1356 ch10_after_interview:{text:`<p>从写字楼出来,你站在路边,阳光有些刺眼。你看了看手机。下午四点,面试一共进行了三个半小时。</p><p>你站在街边发了会儿呆,然后给林悦发了一条消息:「面完了。」</p><p>林悦几乎是秒回:「怎么样?」</p><p>你想了想,回:「不知道。感觉自己答得还行,但竞争对手肯定也很强。」</p><p>林悦:「别想太多,你已经很棒了。晚上一起吃个饭?」</p>`,choices:[{t:'好,老地方见',next:'ch10_dinner_after_interview',fx:{"exp":15}}]},
1357 ch10_dinner_after_interview:{text:`<p>晚上七点,你们常去的那家小川菜馆。林悦已经到了,点了一桌子菜。水煮鱼、麻婆豆腐、夫妻肺片、蒜泥白肉。</p><p>"你这是……犒劳我还是想撑死我?"你坐下的时候说。</p><p>"都有。"林悦给你倒了杯冰啤酒,"不管结果怎么样,今天都值得庆祝。你迈出了第一步。"</p><p>你跟她碰了杯,喝了一大口。冰凉的液体顺着喉咙下去,让你整个人放松了不少。</p><p>吃饭的时候,林悦一直很活跃,聊最近的剧、聊公司的八卦、聊深圳出差那家精酿啤酒。她没有再问面试的事,你也没有主动提。</p>`,choices:[{t:'这样轻松的氛围真好',next:'ch10_offer_arrives',fx:{"exp":10}}]},
1358 ch10_offer_arrives:{text:`<p>周三下午,你正在改一个bug,手机响了。是猎头Joyce发来的消息,只有一行字:</p><p>「段先生,恭喜!对方发了offer,你看看邮箱。」</p><p>你的手抖了一下,点开邮箱,果然看到一封标题为"Offer Letter"的邮件。你深吸一口气,点开——</p><p>职位:高级后端工程师。薪资:比你现在的翻了一倍多。还有期权。</p><p><span class="good">他做到了。</span></p><p>但他没有立刻感到高兴。你关掉邮件,转头看向旁边工位的林悦。她正在专注地写代码,侧脸被显示器光照亮。</p>`,choices:[{t:'这个决定太难做了',next:'ch10_decision_struggle',fx:{"exp":25}}]},
1359 ch10_decision_struggle:{text:`<p>你在楼道里给猎头回了电话。Joyce在电话里很兴奋:"段先生,这个package在行业里非常有竞争力,而且这家公司的技术氛围很好,去了一定能学到很多东西。"</p><p>你说:"我需要考虑一下。"</p><p>"当然,offer有效期一周。"Joyce说,"但我建议你尽快决定,因为同批还有另一个候选人在沟通中。"</p><p>挂了电话,你靠在楼道墙上,脑子里乱成一团。翻倍的薪资、更大的平台、更好的职业前景。这些都是他想要的东西,但代价是离开这家公司,离开现在熟悉的环境,离开……林悦。</p>`,choices:[{t:'和林悦认真谈一次',next:'ch10_talk_linyue_serious',fx:{"exp":20}}]},
1360 ch10_talk_linyue_serious:{text:`<p>下班后,你和林悦在楼下的便利店门口坐着。你买了一瓶冰绿茶,林悦要了一杯热玉米汁。</p><p>"我拿到offer了。"你说。</p><p>林悦喝玉米汁的动作顿了一下,然后继续喝了一口:"恭喜你。"</p><p>"但我不知道要不要去。"</p><p>林悦转头看着他:"为什么不去?"</p><p>你沉默了很长时间。便利店门口的灯光照在他们脚边,飞蛾在灯下打转。</p><p>"因为……如果去了,就见不到你了。"你说出了口。</p>`,choices:[{t:'说出了心里话',next:'ch10_linyue_response',fx:{"exp":30}}]},
1361 ch10_linyue_response:{text:`<p>林悦没有立刻说话。她低头看着手里的玉米汁杯子,杯壁上的水珠顺着流下来。</p><p>"你。"她开口了,声音很轻,"你知道吗?我一直在等你开口说这种话。"</p><p>你愣住了。</p><p>"从团建那天开始,"林悦继续说,"我以为你会主动一点,但你这个人啊,工作上的事情雷厉风行,感情上却像个木头。"</p><p>她抬起头看着他,眼睛里有你从未见过的东西。是认真,也是勇气。</p><p>"所以这次我来说:我不希望你为了我放弃一个好机会,但如果……如果你去了,我们要保持联系。我想要的不是同事关系的延续,是更深入的东西。你明白吗?"</p>`,choices:[{t:'我明白',next:'ch10_the_decision',fx:{"exp":35}}]},
1362 ch10_the_decision:{text:`<p>那天晚上,你在家想了很久。你把offer邮件看了五遍,把猎头的消息又读了一遍,然后在阳台上吹了半个小时的夜风。</p><p>你想到了老王说的话——"工作做不完,但身边的人更重要。"</p><p>你想到了林悦说的——"我不希望你为了我放弃好机会。"</p><p>你还想到了自己这三年来在这个公司所有的成长。从一个只会写crud的新人,到独立完成核心系统重构的工程师。</p><p><span class="good">你拿出手机,给猎头发了一条消息:「我接受offer。」</span></p><p>然后他又打开和林悦的聊天框,打了一行字:「我去了,但我会每天都给你发消息。」</p>`,choices:[{t:'发送',next:'ch10_linyue_reply_night',fx:{"exp":25}}]},
1363 ch10_linyue_reply_night:{text:`<p>消息发出去的瞬间,你的心悬着。</p><p>过了大概两分钟,林悦回了一条:</p><p>「好。那我等你每天的消息。不过要提醒你,我可能会回得比你发得还多 😊」</p><p>你看着那条消息,在阳台上笑出了声。邻居家的狗被你吓了一跳,叫了两声。</p><p>你抬头看了看夜空。城市的光污染太严重了,看不到几颗星星,但月亮很亮,像一枚银色的勋章挂在天上。</p>`,choices:[{t:'开始准备离职',next:'ch10_resignation',fx:{"exp":15}}]},
1364 ch10_resignation:{text:`<p>周四早上,你敲开了技术总监老陈的门。</p><p>"陈总,有件事想跟您谈。"</p><p>老陈看你神情严肃,放下茶杯:"你说。"</p><p>你把自己的offer情况和离职决定说了。老陈听完之后,沉默了很久。</p><p>"小段,我很想挽留你。"老陈说,"但对方给的offer确实很好。如果我有这样的机会,我可能也会走。"</p><p>你站起来,跟你握了握手:"你在这家公司的时间不长,但你做的那个重构项目,会在很长一段时间里成为团队的技术基础。谢谢你。"</p>`,choices:[{t:'办理离职手续',next:'ch10_farewell_party',fx:{"exp":15}}]},
1365 ch10_farewell_party:{text:`<p>你的离职消息在组里传开后,同事们张罗着给你搞了一个欢送会。地点是公司附近的那家烤鱼店。就是林悦上次庆祝重构成功的那家。</p><p>老王举起酒杯:"小段,我敬你一杯。你走了之后,那堆破代码又得我一个人维护了。"</p><p>大家都笑了。</p><p>老王继续说:"但说真的,你是我这几年见过的最有潜力的年轻人。去了新公司好好干,别给咱们老东家丢脸。"</p><p>你跟老王碰了杯,一饮而尽。你看了看在座的人。这些每天一起写bug、一起吃外卖、一起骂产品的同事,忽然间变得有些陌生,又有些温暖。</p>`,choices:[{t:'最后一天下班',next:'ch10_last_day',fx:{"exp":15}}]},
1366 ch10_last_day:{text:`<p>离职前的最后一天,你把自己工位上的东西收拾干净。你的工位很简洁。一台公司配的显示器、一个水杯、一盆早就干枯了的多肉(林悦送的)、几张写了代码片段的便利贴。</p><p>你把多肉的花盆拿起来,发现下面压着一张纸条。是林悦的字迹:</p><p>「工作累了就看看它,虽然它已经死了,但它曾经绿过。就像你,不管在哪,都会发光。」</p><p>你把纸条小心翼翼地折好,放进了自己的钱包里。</p>`,choices:[{t:'离开公司,开始新篇章',next:'CHAPTER_COMPLETE',fx:{"exp":20}}]},
1367 ch10_final:{text:`<p>你关掉了offer邮件。打开IDE开始写今天的功能。键盘敲下去的时候你知道你做对了选择。不是因为你留在了舒适区。是因为你选择了自己想走的路。北京秋天的阳光透过窗户照在键盘上。你敲完最后一行代码提交了commit。</p>`,choices:[{t:'✅ 继续前行',next:'CHAPTER_COMPLETE'}]},
1368 ch10_dinner:{text:`<p>你们约了一起吃晚饭。还是那家烤串店。坐下之后她问你考虑得怎么样了。你说不走了。她正在倒饮料的手停了一下然后继续倒。她把倒好的饮料推到你面前——「那庆祝一下。」你们碰了一下杯。北冰洋的汽水在杯子里冒着泡。你喝了一口。冰的。甜的。</p>`,choices:[{t:'🥤 干杯',next:'ch10_final'}]}
1369 }
1370 },
1371 {
1372 title: '第十一章 · 技术主管',
1373 start: 'ch11_start',
1374 scenes: {
1375 ch11_ai_policy:{text:`<p>当上技术主管之后你做的第一件事——制定团队的AI使用规范。不是禁止AI,是怎么用好AI。你写了一份文档:哪些场景可以用AI提效(写模板代码、写测试、查文档),哪些场景不能依赖AI(架构设计、核心业务逻辑、安全审查)。</p><p>小杨看了之后说——「飞哥你还专门写这个?」你说——「因为AI不会替我们背锅。出了事还是我们负责。」你把文档发到团队群,老张回了一句:「这个写得好。发全公司学习。」</p>`,choices:[{t:'📋 执行',next:'ch11_tech_plan'}]},
1376ch11_tech_debt_cleanup:{text:`<p>你花了两个月清理技术债务。你跟团队说这两个月不接新功能只做一件事——把代码库变干净。你去掉了所有废弃的接口重写了混乱的文档统一了命名规范。两个月后代码库的SonarQube评级从C升到了A。小杨在群里发了一条消息——「看着代码库的评级从C到A我好爽。」你回了一条——「我也是。」那天你下班的时候心情很好。不是因为评级升了。是因为你带着团队做了一件对的事。</p>`,choices:[{t:'✅ 清理完成',next:'ch11_arch'}]},
1377ch11_code_standard:{text:`<p>你推行了一套代码规范之后团队的整体代码质量明显提升了。Bug率下降了CI通过率提高了。有一天老张看了一下你们组的数据——Bug率比上个季度降了40%。你没说什么。但你看到你看数据的时候嘴角动了一下。你也没有说什么。你知道他满意了。这就够了。</p>`,choices:[{t:'📊 数据说话',next:'ch11_tech_plan'}]},
1378ch11_first_fire:{text:`<p>你当上技术主管后第一次处理「人的问题」。团队里有一个开发能力不错但态度不太好——经常在群里怼人。你找他聊了一次。你没有批评他。你问你最近是不是遇到了什么困难。你沉默了一会儿说家里出了点事。你又问你需要请几天假吗。你愣了一下然后说——「你是我遇见的第一个问我需不需要请假的leader。」你拍了拍你的肩膀——「先把家里的事处理好。代码不会跑的。」后来你回来之后工作态度好了很多。</p>`,choices:[{t:'👨🏫 处理好了',next:'ch11_tech_plan'}]},
1379ch11_mentor_style:{text:`<p>你带人的方式跟老张不一样。老张是「你自己先试不行再来找我」。你是「我先给你讲一遍然后你试不行再来找我」。有一次小杨跟你说——「飞哥你带人的方式比老张好。」你说老张是我的mentor你的方式也很好。小杨说——「但你的方式更适合我这样的人。」你愣了一下然后明白了——每个mentor都有自己的风格。而你已经形成了自己的风格。</p>`,choices:[{t:'👨🏫 继续带',next:'ch11_tech_plan'}]},
1380ch11_interview_other:{text:`<p>你开始参与招聘面试了。坐在桌子的另一边看简历、问问题、做评价。来面试的人有的紧张有的自信有的答非所问。你从每个人身上都看到了自己当年的影子。面完一个人之后你在评价表上写了一段评语。老张看了一眼你的评语说——「你写评语比我写得好。我当年就写两个字——还行。」你说:「那你现在也还是写两个字。」他瞪了你一眼。</p>`,choices:[{t:'📋 继续面试',next:'ch11_tech_plan'}]},
1381 ch11_code_policy:{text:`<p>你制定了一套团队代码规范。从命名规范到注释规范到commit message格式——一共十六条。发到群里之后群里安静了很久。你有点紧张——是不是大家觉得你管太多了。然后小杨发了一条消息——「飞哥这个规范好早就该有了。」然后是王宇——「+1。」然后老刘——「+1。」然后老张——「+1。」你看着屏幕上那一串「+1」松了一口气。你做对了。</p>`,choices:[{t:'📝 执行规范',next:'ch11_tech_plan'}]},
1382 ch11_ai_codereview:{text:`<p>你做了一件团队里没人做过的事——用AI做Code Review。你把小杨提交的代码贴进AI,让AI检查逻辑漏洞。AI花了十秒钟指出了两处人工review没发现的隐患——一个是并发场景下的竞态条件,一个是边界情况下数组越界。</p><p>你把这些结果发给小杨。你看了之后沉默了一会儿:「飞哥……这是AI查出来的?」你说是的。你又看了一遍:「那以后还要我们review吗?」你说:「要。AI只能发现已知模式的问题。业务逻辑对不对、这个设计是不是最优解——这些只有人才知道。」你在团队的代码规范里加了一条:「所有代码必须经过人工+AI双层review。」小杨后来私下跟你说——「飞哥,你是我见过最不装的技术主管。」</p>`,choices:[{t:'📋 执行新规范',next:'ch11_delegate'}]},
1383 ch11_ai_fear:{text:`<p>周五下午。你正在写代码。小杨端着一杯咖啡走过来,站在你旁边犹豫了一下:「飞哥。我有个问题想问你。」</p><p>「说。」</p><p>「你觉得……AI会让我们失业吗?」</p><p>你放下键盘。你想了想然后说:「会让我们的一部分技能贬值。但不会让我们失业——前提是我们要变。」</p><p>「怎么变?」</p><p>「以前我们靠写代码吃饭。以后代码本身不值钱了——值钱的是你对业务的理解、你的架构能力、你在关键时刻做决策的能力。就像老张,他写代码不一定比AI快,但公司少了他就不转。」</p><p>小杨端着咖啡杯站了一会儿:「所以我要学架构设计?」</p><p>「不止。你还要学会跟AI合作。它不是你的对手——是你手里现在最好的工具。你用不用,你的竞争对手会用。」</p><p>小杨点了点头,走回自己工位。你看着你的背影。你想起几年前自己刚入职的时候——也是这样惴惴不安地问老张问题。只是那时候问的是「这个Bug怎么找」,现在的人问的是「我以后还有饭吃吗」。时代真的变了。</p>`,choices:[{t:'📋 继续带团队',next:'ch11_tech_plan'}]},
1384ch11_push_system:{text:`<p>你设计了一个新的消息推送系统。架构方案画了三版。第一版太复杂被自己否了。第二版太简单怕扛不住。第三版你找老张过了一遍。你看完说了四个字:「可以搞了。」上线那天推送系统吞吐量比旧系统提升了五倍。</p>`,choices:[{t:'📊 上线',next:'ch11_tech_plan'}]},
1385ch11_tech_debt:{text:`<p>你做了一个决定——花两个月时间清理技术债务。不是老板要求的。是你自己觉得再拖下去系统会出问题。你把任务列了一个清单:升级依赖版本、重写三个核心模块的文档、把手工测试的流程自动化。你跟团队说这两个月不做新功能,只做清理。有人不理解。你说——「你现在不还债,以后连本带利一起还,你会更痛。」两个月后系统的稳定性和可维护性明显提升了。你说的话没人再质疑了。</p>`,choices:[{t:'✅ 清理完成',next:'ch11_arch'}]},
1386ch11_first_1on1:{text:`<p>你开始跟团队成员做1对1。这是王姐建议的。你跟小杨第一次聊的时候他有点紧张——「飞哥,我是不是哪里没做好?」你说是随便聊聊。然后你问了他一个问题——「你觉得你在现在这个岗位上,最想学什么?」他想了一会儿说想学系统设计。你在本子上记了下来。从那以后你每周都会给小杨布置一个小型系统设计的练习。你的进步比你预期的快。你在心里默默感谢了老张——你正在用他当年带你的方式带别人。</p>`,choices:[{t:'📋 继续',next:'ch11_arch'}]},
1387 ch11_budget:{text:`<p>你第一次参与做技术预算。会议室里坐着王姐、老张、老刘和你。王姐说今年技术团队要扩到三十人,服务器预算翻倍。你要负责估计你们组的硬件和资源需求。你花了一周做了详细的测算——服务器数量、带宽、第三方服务费用、培训预算。你在会上展示的时候数据清楚逻辑清晰。王姐听完之后只问了一个问题——「这些数字你自己算的?」你说是的。她点了一下头。</p>`,choices:[{t:'📊 通过预算',next:'ch11_tech_plan'}]},
1388ch11_delegate:{text:`<p>做技术主管之后你学会的最重要的一件事是——放手。有一个任务你自己写只需要两小时,但你决定交给小杨去做。你花了一整天。中间问了你七八个问题。你忍着没有自己上手。你交上来的时候代码虽然还有些粗糙,但思路是对的。你帮他review了一遍,指出了几个改进点。你改完之后兴奋地说:「飞哥!我学会了!」那一刻你觉得那一整天的等待是值得的。你想起老张当年也是这样对你的——忍住不替你做,让你自己学会。</p>`,choices:[{t:'👨🏫 继续带',next:'ch11_tech_plan'}]},
1389ch11_new_role:{text:`<p>当上技术主管的第一个月。你发现最难的不是技术问题——是人的问题。小杨跟另一个开发因为接口设计吵了起来,两个人在群里互相@,你来我往地发了二十几条消息。你把你们叫到会议室。你让你们各自说了自己的想法,然后你帮他们梳理出了一个折中方案。走出会议室的时候你发现自己的沟通方式变了——你不只是写代码的人了。你也是一个需要协调人和人之间关系的人了。</p>`,choices:[{t:'📋 继续带团队',next:'ch11_tech_plan'}]},
1390ch11_team_lead:{text:`<p>「你来做技术主管。」王姐跟你说话的时候语气平静,像在说一件再普通不过的事。「组里现在就你成长最快。老张也推荐了你。」</p><p>你张了张嘴。技术主管。你才工作一年半。但你知道王姐从来不会随便做决定。</p><p>「……好。我试试。」</p>`,choices:[{t:'💪 上任',next:'ch11_start'}]},
1391 ch11_new_responsibility:{text:`<p>当上技术主管的第一周。你发现最大的变化不是写更难的代码——而是你要帮别人解决他们解决不了的问题。</p><p>新来的实习生小杨遇到一个Bug,花了半天没搞定。你走过去看了一眼你的代码——一个数组越界,索引从1开始了。你花了一分钟就找到了问题。你指给你看的时候,你看你的眼神跟你当年看老张的眼神一模一样。</p><p>那一刻你明白了——技术主管不是写更厉害的代码,是让别人能写出更厉害的代码。</p>`,choices:[{t:'👨🏫 带好团队',next:'ch11_arch'}]},
1392 ch11_arch_design:{text:`<p>你花了两周设计新的系统架构。这是你第一次独立做这么大的技术决策——从技术选型到模块划分到接口设计。</p><p>你画了几版方案,跟老张对齐了一遍,又根据你的反馈改了一版。然后在评审会上,你站在白板前讲了四十分钟。讲完之后王姐只说了一句话:「按这个方案做。」</p><p>你回到工位,坐下。感觉刚才那四十分钟比跑了一万米还累——但你做到了。</p>`,choices:[{t:'📝 开始实施',next:'ch11_tech_plan'}]},
1393ch11_start:{text:`<p>你在新公司入职已经三个月了。</p><p>新公司叫"云帆科技",做社交电商平台的。团队规模比你之前的公司大了不止一倍。光后端组就有三十多个人。你刚来的时候还有点不适应,觉得每个人都好强,自己是不是混进来的。</p><p>但三个月过去,你用实力证明了自己。重构经验在新公司非常吃香,你来了之后主导了两个核心模块的性能优化,把接口响应时间从800ms降到了150ms。</p><p>今天是周二,直属主管李磊在早会上宣布了一个消息:公司准备成立一个新项目组,需要从各团队抽调一个技术负责人。</p>`,choices:[{t:'对这个机会很感兴趣',next:'ch11_new_project',fx:{"exp":10}},{t:'⚔️ 代码报错,干它!',next:'__FIGHT__',fx:{"exp":27}}]},
1394 ch11_after_fight:{text:`<p>Bug干掉了。代码终于跑起来了。你靠在椅背上长出一口气。</p><p>这时你想起刚才李磊说的新项目组的事。这个机会不等人。</p>`,choices:[{t:'🚀 报名新项目组',next:'ch11_new_project'}]},
1395 ch11_new_project:{text:`<p>"新项目是什么方向的?"散会后你问李磊。</p><p>"公司准备做自营物流系统。"李磊说,"从零开始搭建,技术选型、架构设计、团队组建。全部由技术负责人主导。这是一个从0到1的项目,很有挑战性。"</p><p>你的心跳加速了。从0到1搭建系统,这是他梦寐以求的机会。在公司重构虽然成就感满满,但那毕竟是站在别人的地基上翻修。而现在这个,是要自己打地基、自己设计整栋楼。</p><p>"我可以申请吗?"你问。</p><p>李磊看了他一眼:"你想申请?"</p>`,choices:[{t:'是的,我想试试',next:'ch11_apply_lead',fx:{"exp":20}}]},
1396 ch11_apply_lead:{text:`<p>李磊点了点头:"你有重构经验,技术底子也扎实,但这个角色不只是写代码,还要管人、跟产品经理撕需求、向老板汇报进度。你应付得来吗?"</p><p>你想了想,说:"我觉得可以试一下。虽然这些方面我没有太多经验,但我愿意学。"</p><p>李磊笑了:"就冲你这句话,我推荐你。这次选拔不看资历看能力,你准备一份技术方案,周三前交到CTO那边。"</p>`,choices:[{t:'开始准备技术方案',next:'ch11_prep_plan',fx:{"exp":15}}]},
1397 ch11_prep_plan:{text:`<p>接下来的两天,你几乎是住在公司的。你写了厚厚一沓技术方案。系统架构、技术选型、团队分工、项目时间线、风险评估……你没有当过管理,但他观察过老陈和李磊是怎么做的,你把那些经验全写进了方案里。</p><p>晚上十一点,办公室里只剩下他一个人。手机屏幕亮了一下,是林悦的消息:「还在加班?」</p><p>你回:「你怎么知道?」</p><p>林悦:「你连续两天没在晚上十点前回过我消息了。猜的。」</p><p>你笑了笑,给她发了自己正在写的方案的截图。</p><p>林悦看了一会儿回了:「这是你写的?架构图画得真不错。」后面跟了个崇拜的表情。</p>`,choices:[{t:'心里暖暖的,继续写方案',next:'ch11_cto_presentation',fx:{"exp":20}}]},
1398 ch11_cto_presentation:{text:`<p>周三上午,你站在CTO办公室里,面前坐着CTO张总、技术总监李磊和HR总监三个人。</p><p>你打开投影,开始讲自己的方案。起初他有点紧张,声音微微发抖,但讲了两页PPT之后,你发现自己在说的都是他真正熟悉和热爱的东西。技术架构、系统设计。越说越流畅。</p><p>"……我计划前两周做技术选型和架构设计,第三周开始搭建核心框架,第六周出第一个可用的内部版本,第十周灰度上线。"</p>`,choices:[{t:'讲完之后,会议室安静了几秒',next:'ch11_cto_question',fx:{"exp":15}}]},
1399 ch11_cto_question:{text:`<p>CTO张总翻完了你的方案,问了一个问题:"你以前没有带过团队。如果上线前一周,你团队里的两个核心成员同时请假,你会怎么办?"</p><p>你没有立刻回答。你想了想,说:"第一,我会提前做好知识交叉培训,不让任何一个人成为单点瓶颈。第二,准备应急预案。提前梳理出必须完成的核心功能和可以延后的非核心功能。如果真遇到这种情况,优先保障核心链路的交付。"</p><p>张总点了点头,又问:"如果你是主管,团队里有个成员代码写得不好但你不好意思批评他,你怎么处理?"</p><p>"我会把问题摆在代码层面。"你说,"不评价人,只讨论代码。安排code review,并且自己在上面做示范。"</p>`,choices:[{t:'CTO的问题一个接一个',next:'ch11_cto_decision',fx:{"exp":20}}]},
1400 ch11_cto_decision:{text:`<p>面试持续了一个小时。你走出CTO办公室的时候,后背已经被汗湿透了。</p><p>李磊在门口等他,拍了拍你的肩膀:"表现不错。张总很少问那么多人问题。你问得越多,说明越感兴趣。"</p><p>你松了一口气:"那结果什么时候出来?"</p><p>"这周内。"</p><p>接下来几天,你过得格外煎熬。你一边做手头的项目,一边不停地看手机有没有新消息。周五下午四点,你终于收到了李磊的消息:</p><p>「来一下会议室。」</p>`,choices:[{t:'心跳加速地走进会议室',next:'ch11_result',fx:{"exp":25}}]},
1401 ch11_result:{text:`<p>会议室里除了李磊,还有CTO张总。</p><p>张总看到你进来,站起来跟你握了握手:"恭喜你,你。经过综合评估,我们决定让你担任自营物流项目的技术负责人。"</p><p>你愣在原地,大脑空白了两秒钟。</p><p>"……真的?"你问了一个很蠢的问题。</p><p>张总和李磊都笑了。李磊说:"真的。从下周一开始,你就不再是后端组的普通成员了。你是技术主管,带一个五人小组。"</p>`,choices:[{t:'接受了这个任命',next:'ch11_new_role',fx:{"exp":20}}]},
1402 ch11_new_role:{text:`<p>你升职的消息很快在团队里传开了。有人恭喜他,有人表面恭喜但眼神复杂,也有人直接来找他聊自己的职业发展。</p><p>最让你没想到的是,一个比你早来半年的同事赵明,直接敲了他桌上的隔板:"你,恭喜你升职。我想申请加入你的项目组。"</p><p>你愣了一下:"你为什么想加入?我这边是从零开始的项目,压力会很大。"</p><p>"就是因为从零开始。"赵明说,"只有从零开始的项目,才能学到真正的架构能力。我不想一直在现有系统上修修补补。"</p>`,choices:[{t:'感受到了作为主管的责任',next:'ch11_build_team',fx:{"exp":15}}]},
1403 ch11_build_team:{text:`<p>你花了三天时间组建自己的团队。你从不同组里挑选了四个人。两个后端、一个前端、一个测试。你选人的标准不是技术最强,而是"遇到问题愿意主动解决,而不是等着别人来喂答案"。</p><p>团队组建完成后,你在周五下午开了第一次团队会议。会议室的白板上,你画了一张大大的架构图。</p><p>"我们的目标是。三个月内,搭建一个支撑日均百万订单的物流系统。"你在白板上写下deadline,"从今天开始,我们就是一个团队了。不管遇到什么困难,我们一起解决。"</p>`,choices:[{t:'第一次以主管身份开会',next:'ch11_first_week',fx:{"exp":15}}]},
1404 ch11_first_week:{text:`<p>当主管的第一周,你发现自己的角色跟以前完全不一样了。以前他只要管好自己那一亩三分地就行,现在他要管五个人。确保每个人的任务明确、进度可控、遇到的阻塞能及时解决。</p><p>每天早上他要开十五分钟的站会,每天晚上要写项目日报发给CTO。中间还要参加各种跨部门沟通会议。跟产品经理对需求、跟运维商量部署方案、跟运营沟通数据接口。</p><p>一周下来,你写代码的时间从以前的80%降到了30%。<span class="bad">但你发现,让团队里的其他人写出好代码,比自己写出好代码更有成就感。</span></p>`,choices:[{t:'慢慢适应新的角色',next:'ch11_linyue_visit_new',fx:{"exp":10}}]},
1405 ch11_linyue_visit_new:{text:`<p>周末,林悦来你的新公司附近找你吃饭。她穿着一条薄荷绿的连衣裙,站在写字楼门口等你的时候,你差点没认出来。平时在公司看到的都是穿卫衣的林悦。</p><p>"你……今天不太一样。"你说。</p><p>"周末当然要穿好看点。"林悦转了个圈,"怎么样?"</p><p>"好看。"你脱口而出,然后自己先红了脸。</p><p>林悦笑得很开心。两人在公司附近找了一家云南菜馆,你给她讲了新项目的进展,讲了自己当主管的新体验,讲了团队里每个人的特点。</p><p>林悦一边吃一边听,偶尔插几句话帮他分析。说到后面你自己都没意识到自己越讲越快、越讲越兴奋,筷子在空中比划,差点戳到旁边桌的人。林悦停下筷子,看着你笑。</p>
1406
1407<p>「你讲这些的时候,眼睛在发光。」她说。</p>
1408
1409<p>你愣住了,筷子停在半空中。</p>
1410
1411<p>「真的。」她把最后一块菠萝饭拨到你碗里,「你自己没发现而已。」</p>`,choices:[{t:'因为做自己喜欢的事',next:'ch11_project_challenge',fx:{"exp":20}}]},
1412 ch11_project_challenge:{text:`<p>项目进行到第二个月的时候,遇到了一个大问题。原本承诺在第四周交付的订单接口对接,因为合作方的API变动,延迟了整整一周。</p><p>周一早上,产品经理小王在群里发了很大一段话,话里话外的意思是"技术团队没有做好风险评估"。</p><p>你看了消息,没有在群里回复。你直接去找到小王,当面沟通。两人聊了四十分钟,你坦诚地承认了风险评估的不足,同时提出了补救方案。调整后续排期,压缩其他环节的时间来弥补这一周的延迟。</p><p>小王最后同意了。<span class="good">你发现,当面沟通比在群里吵架有效得多。</span></p>`,choices:[{t:'危机处理后,团队更团结了',next:'ch11_milestone',fx:{"exp":20}}]},
1413 ch11_milestone:{text:`<p>项目进行到第三个月,终于到了灰度上线的日子。</p><p>那天早上,你六点就到了公司。你检查了所有服务的状态、数据库的连接池、Redis的缓存命中率、消息队列的堆积情况。一切正常。</p><p>上午十点,灰度开关打开。首批10%的流量被导入新系统。</p><p>你盯着监控大屏,手心全是汗。第一分钟过去了,正常。第五分钟,正常。第十一分钟。报警响了。</p><p>你的心跳骤停了一拍,然后发现报警内容是个warning级别的日志。某个接口的响应时间超过了阈值,但很快又恢复了。虚惊一场。</p>`,choices:[{t:'灰度上线成功',next:'ch11_go_live',fx:{"exp":25}}]},
1414 ch11_go_live:{text:`<p>灰度上线平稳运行了三天后,全量上线。</p><p>全量上线的那个晚上,你带着团队叫了外卖。烤串、小龙虾、啤酒。大家在会议室里围坐在一起,投影仪上放着监控大屏的数据。一切正常。</p><p>赵明举着一串羊肉串说:"老大,我敬你一杯。这是我做的第一个从零到一的项目,谢谢你让我加入。"</p><p>你跟他碰了杯,环视了一圈自己的团队成员。每个人脸上都带着疲惫但满足的笑容。<span class="good">你忽然觉得,这就是他一直想要的东西。不是工资条上的数字,而是这种和一群人一起创造点什么的感觉。</span></p>`,choices:[{t:'会后给林悦打电话',next:'ch11_call_linyue',fx:{"exp":20}}]},
1415 ch11_call_linyue:{text:`<p>晚上十一点,你回到家,给林悦打了个电话。</p><p>"喂?"林悦的声音带着睡意,但听到是你的声音就清醒了,"怎么样?全量上线成功了?"</p><p>"成功了。"你靠在阳台上,"没有任何重大事故。"</p><p>"恭喜你!"林悦在那头欢呼了一声,"段主管,你现在是货真价实的技术主管了。"</p><p>你笑了:"其实……我能走到今天,有一半功劳是你的。"</p><p>"是吗?哪一半?"林悦问。</p><p>"从北戴河的日出,到深圳出差的那个晚上……还有我犹豫要不要跳槽的时候,你跟我说的那番话。"你的声音很平静,但很认真,"如果没有你,我可能现在还窝在原来的公司里写crud,不敢迈出任何一步。"</p>{fate_promotion}`,choices:[{t:'那剩下的一半呢?',next:'ch11_linyue_response_night',fx:{"exp":25}}]},
1416 ch11_linyue_response_night:{text:`<p>电话那头沉默了几秒。</p><p>"剩下的那一半,"林悦的声音变得很轻很柔,"是你自己的努力。你加班到凌晨的样子、你重构代码时专注的眼神、你写方案时趴在桌上睡着的样子……我都看到了。"</p><p>你握着手机的手微微发紧。</p><p>"你。"林悦叫你的名字,声音像夜风一样轻柔,"下周我过生日,你能来吗?"</p><p>"当然能。"你说,然后加了一句,"你想要什么礼物?"</p><p>"你帮我把上次那张深圳湾的照片洗出来吧。就是你在草坪上那张。我想把它放在办公桌上。"</p><p>你觉得自己的心被什么东西温柔地包裹住了。</p>`,choices:[{t:'好,我一定去',next:'ch11_final_reflection',fx:{"exp":30}}]},
1417 ch11_final_reflection:{text:`<p>挂了电话,你没有立刻去睡觉。你坐在阳台上,看着远处的城市灯火。</p><p>从面试时那个紧张得手心冒汗的程序员,到如今带着五人团队的技术主管。这中间也不过一年多的时间,但这一年,你经历了太多:团建的意外牵手、重构屎山的痛苦与成就感、深圳出差的暧昧、跳槽的纠结与勇气……</p><p>而所有这些故事里,都有一抹薄荷绿的身影。</p><p>你打开手机相册,翻到那张在北戴河日出时林悦的侧脸照。海风把她的头发吹起来,阳光把她的轮廓镀成金色。<span class="good">你把这张照片设成了收藏,然后给林悦发了一条消息:</span></p><p>「谢谢你出现在我的故事里。」</p>`,choices:[{t:'发送',next:'ch11_end',fx:{"exp":30}}]},
1418 ch11_end:{text:`<p>手机震了一下,林悦回了两个字:</p><p>「傻瓜 ❤️」</p><p>你看着那两个字,在凌晨的阳台上笑出了声音。月亮挂在天上,城市的灯火在远处闪烁。<span class="good">你忽然觉得,所谓的人生飞升,大概不是当上了多大的官、赚了多少钱。</span></p><p><span class="good">而是。在平凡的日子里,遇见了不平凡的人,然后因为这个人,变成了更好的自己。</span></p><p>这就是你的故事。一个普通程序员的,秃然飞升的故事。</p><p>(全文完)</p>`,choices:[{t:'回顾整个旅程',next:'CHAPTER_COMPLETE',fx:{"exp":50}}]},
1419 ch11_arch:{text:`<p>你打开白板开始画系统架构图。从整体到局部从模块到接口。画完之后你退后两步看了看。架构清晰模块划分合理。你拍了一张照片发到群里。群里安静了一会儿然后老张回了一条——「可以。」</p>`,choices:[{t:'📋 推进',next:'ch11_tech_plan'}]},
1420 ch11_tech_plan:{text:`<p>你制定了接下来的技术规划。三个月目标:完成核心模块重构。六个月目标:系统性能提升一倍。一年目标:成为行业领先的技术方案。你把规划发给王姐她回了一行字——「目标清晰。执行到位。」你关掉邮件开始干活。</p>`,choices:[{t:'💪 执行',next:'CHAPTER_COMPLETE'}]}
1421 }
1422 },
1423 {
1424 title: '第十二章 · 老张要创业',
1425 start: 'ch12_start',
1426 scenes: {
1427 ch12_ai_product:{text:`<p>创业后的第一个产品方向讨论会上,你提出了一个想法——把AI做到产品里去。老张沉默了三十秒然后说——「你是说那个能写代码的东西?」你说——「不只是写代码。我们的客户是几万家小企业。他们不懂技术。但如果我们的系统能用AI帮他们自动处理审批、生成报表、写工作周报——这就是我们的护城河。」</p><p>老刘说——「但我们没人懂AI。」你说——「我们不需要自己训练模型。把别人的模型用好、跟业务结合起来。这就是我们的优势。」老张拍了一下桌子——「干。」</p>`,choices:[{t:'🚀 开工',next:'ch12_join'}]},
1428 ch12_ai_argue:{text:`<p>讨论产品路线图的时候,老刘拍了一下桌子。</p><p>「我们现在只有二十个人。你们要把一半的资源扔到AI上?那些大厂做AI烧了几个亿。我们这点钱够干什么?」</p><p>老张没说话。你知道你在等你的回答。</p><p>你站起来走到白板前画了两条线。「刘哥。你说的对——我们做不了大模型。但我们不需要做大模型。我们的客户是几万家小企业,他们用的管理软件里甚至还有纸质的流程。我们只要把AI做到现有的审批流里——帮他们自动填表单、智能推荐审批人、根据历史数据预填内容——这就够了。这不是烧钱搞大模型,是用AI优化现有产品。」</p><p>老刘沉默了一会儿:「……那预算呢?」</p><p>「第一个AI功能我们两个人两个月。用最便宜的API接入。不行就砍。亏不了多少钱。」</p><p>老刘看了一眼老张。老张点了点头。老刘叹了口气:「行。你们干吧。但两个月出不来结果我就投反对票。」</p>`,choices:[{t:'💪 干',next:'ch12_ai_first_feature'}]},
1429 ch12_ai_first_feature:{text:`<p>你们花了两个月做了一个AI功能——智能审批助手。它能根据历史审批数据自动推荐审批结果。上线那天你们盯着数据面板。用户使用率——第一天3%。第二天7%。一周后——42%。你给这个功能写了一行注释在第237行——「在此处,AI第一次学会了帮人做决定。」</p>`,choices:[{t:'🎉 AI上线',next:'ch12_join'}]},
1430 ch12_ai_hallucination:{text:`<p>AI审批助手上线后的第三周。你半夜被电话吵醒——客户的审批流出现了异常。一个明明是「不同意」的报销申请,系统自动回复了「已批准」。</p><p>你坐在床上心都凉了。你打开电脑查日志——AI模型出现了幻觉。在某种特定场景下,模型错误地理解了审批人的意图,把「驳回」当成了「通过」。虽然只是边缘案例——几百次审批中只出现了三次。但这三次代表了三个审批决策错误。</p><p>你连夜做了两件事:第一,在AI推荐结果后面加了一个「人工确认」步骤,AI的推荐只作为参考,不做自动执行。第二,你在接口上加了日志审计,每一次AI推荐都被记录,方便事后回溯。修完之后你坐在黑暗的房间里,手还在微微发抖。你想起当初说过的——「AI不会替我们背锅。出了事还是我们负责。」这句话现在变成了真正的教训。</p>`,choices:[{t:'📋 加人工确认',next:'ch12_join'}]},
1431ch12_startup_struggle:{text:`<p>创业第一个月的工资你没给自己发。你把自己攒的钱全部投进了公司。老张知道之后没说什么。但有一天你到办公室的时候发现桌上多了一张纸——老张写的一张借条:「借给段飞——一个更公平的股权方案。」后面附了一行小字:「创业是大家一起扛的。不是让你一个人扛的。」你看着那张纸你一个大男人在空荡荡的办公室里差点没忍住。</p>`,choices:[{t:'📄 收好',next:'ch12_join'}]},
1432ch12_sleepless_night:{text:`<p>创业初期你经常失眠。不是因为紧张——是因为脑子停不下来。每天晚上躺在床上脑子里全是要做的事:产品功能市场客户团队……有一天凌晨三点你又醒了。你拿起手机想找人说说话。你翻到林悦的聊天窗口犹豫了一下。然后你发了一条消息——「睡不着。」你没想到她会秒回——「我也睡不着。在改图。」你愣了一下:「你这么晚还在工作?」她说:「你不也是。」然后你们聊了一个小时。聊完之后你睡着了。那是你创业以来睡得最好的一晚。</p>`,choices:[{t:'😴 晚安',next:'ch12_join'}]},
1433ch12_business_plan:{text:`<p>你跟老张创业后的第一个任务不是写代码——是写商业计划书。你们坐在那间六十平米的办公室里对着一个空白文档发了一上午的呆。老张先开口了——「你有没有想过我们要做成什么样的公司?」你想了想说——「我想做成一个——员工不需要加班也能做出好产品的公司。」老张看着你——「那你先把这句话写进去。」你把它写在了商业计划书的第一页。后来公司真的做到了。不是因为你们不忙——是因为你们学会了高效地忙。</p>`,choices:[{t:'📝 写计划书',next:'ch12_join'}]},
1434ch12_first_client:{text:`<p>创业后的第一个客户是林悦帮忙介绍的。她以前公司的同事正好需要一个审批系统。你花了一周做方案。客户看了之后说——「可以。做吧。」挂了电话之后你在空荡荡的办公室里转了好几圈。老张坐在椅子上看着你转:「就一个客户。至于吗?」你说:「第一个。值得转。」那天晚上你们三个人——你、老张、老刘——去楼下吃了一顿烧烤庆祝。虽然只有一个客户。但有了第一个就会有第二个。</p>`,choices:[{t:'🍢 庆祝',next:'ch12_join'}]},
1435ch12_notice_lin:{text:`<p>你决定跟老张一起创业之后第一个告诉的人不是爸妈——是林悦。你们坐在公司楼下那家便利店里她拿着一瓶乌龙茶你拿着一瓶可乐。你说完她沉默了几秒然后说——「那你还跟我在一个城市吗?」你说在——办公室就隔两条街。她松了一口气然后说——「那行。你创业我支持你。但如果又搞崩了线上你别半夜给我打电话——我现在不是你们公司的前端了。」你笑了:「那我就打给你。」她也笑了。</p>`,choices:[{t:'😊 好',next:'ch12_join'}]},
1436 ch12_last_day:{text:`<p>在银河科技的最后一天你收拾工位。抽屉里的东西不多——那个印着公司logo的保温杯、那盆多肉(林悦送的)、那两张便利贴(已经褪色了但还贴着)。你把多肉捧在手里看了看然后放进了纸箱。你走到老张工位前——你在写代码。你站了一会儿:「张哥。我走了。」他头也没抬:「嗯。」你转身走了两步之后听到你在后面说——「到了那边好好干。别给我丢人。」你没回头但你笑了。</p>`,choices:[{t:'📦 搬走',next:'ch12_join'}]},
1437ch12_first_office:{text:`<p>创业后的第一个办公室。离银河科技原来地方不远——隔了两条街。六十几平米,摆了几张从二手市场淘来的办公桌。墙上还没挂任何东西。窗台上有一盆前任租户留下的绿萝——还活着。你们三个人站在空荡荡的办公室里。老张环顾了一圈说——「这就是我们的新开始了。」</p>`,choices:[{t:'💪 开工',next:'ch12_join'}]},
1438ch12_resign:{text:`<p>你递交辞职信的那天王姐把你叫到办公室。她坐在办公桌后面看着你——没有生气,没有挽留。她只是问你:「想清楚了?」你说:「想清楚了。」她沉默了一会儿然后说——「段飞。你是我这几年带过的最好的苗子。你去了那边,如果以后需要什么,跟我说。」你走出她办公室的时候心里有一种说不清楚的感觉。你在这间办公室里签了第一份劳动合同。现在你在这里签了辞职信。你从一个什么都不会的新人变成了一个被老板说「最好的苗子」的人。</p>`,choices:[{t:'😊 谢谢王姐',next:'ch12_join'}]},
1439ch12_oldzhang_story:{text:`<p>大排档那晚老张跟你讲了他离职的真正原因。不是因为钱。不是因为跟王姐不和。「我做技术做了十几年。做过大厂、带过团队、写过几百万行代码。但我从来没有建过一样完全属于自己的东西。段飞——我想在建不动之前试一次。」你听完之后沉默了。你从来没想过老张这样的人也会有这样的焦虑。在你眼里老张是那个什么都会、什么都不怕的人。原来他也有想试一试但还没做的事情。</p>`,choices:[{t:'🍺 敬你',next:'ch12_join'}]},
1440 ch12_decision_night:{text:`<p>决定创业的那天晚上你一个人在小区里走了很多圈。秋天的夜晚凉意已经很重了,你裹着一件薄外套。你一边走一边在脑子里过各种可能——最坏的、最好的、最可能的。走到第七圈的时候你停了下来。你掏出手机给老张发了一条消息:「我想了一天。去他妈的稳定。我想试试。」你按下发送键的时候手有一点抖。不是因为害怕。是因为你知道从这条消息发出去的那一刻开始,你的人生就要拐弯了。</p>`,choices:[{t:'🤝 好',next:'ch12_join'}]},
1441ch12_count_cost:{text:`<p>你算了一笔账。创业第一年可能没有稳定收入。你的积蓄大概能撑一年半。你租的房子还有半年到期。你给妈妈打的电话里没有提辞职的事。你不想让她担心。挂了电话之后你坐在床边想了很久。风险很大。但你心里有一种奇怪的感觉——不是害怕。是一种「终于要开始了」的感觉。你给老张发了一条消息:「我想好了。一起干。」</p>`,choices:[{t:'📱 发出去',next:'ch12_join'}]},
1442ch12_oldzhang_trust:{text:`<p>你问老张为什么选你一起创业。你沉默了一会儿说了一段让你没想到的话——「面试那天你打那个NullPointer怪的时候,我就知道你跟我是一类人。不是因为你能打。是因为你没跑。」你端着啤酒杯愣了一下。老张继续说:「这一年多我看着你成长。你犯过错、搞崩过线上、写过烂代码。但你没跑过一次。创业要的就是这种不跑的人。」</p>`,choices:[{t:'🍺 干杯',next:'ch12_join'}]},
1443ch12_plan_detail:{text:`<p>老张把商业计划书发给你看了。二十几页的PPT,从市场分析到产品规划到财务预测。你花了两个小时一页一页地看。越看越觉得——这个方案靠谱。目标客户明确,产品差异化清晰,团队已经有了初步的核心成员名单。你问老张:「你打算什么时候开始?」他说:「三个月后。这三个月我处理完手上的事情。你也想清楚。」你点了点头。其实你心里已经清楚了。</p>`,choices:[{t:'🤝 好',next:'ch12_join'}]},
1444ch12_oldzhang_proposal:{text:`<p>周五晚上。老张把你拉到公司楼下的大排档。两瓶啤酒下肚之后你开口了:「段飞,我准备辞职创业。」</p><p>你夹花生的筷子停在半空中。</p><p>「做企业服务SaaS。跟银河科技现在的方向有点像,但更垂直。」他盯着你的眼睛,<span class="info">「我想拉你一起干。」</span></p>`,choices:[{t:'🤔 听听详细计划',next:'ch12_plan'}]},
1445 ch12_weigh_decision:{text:`<p>你躺在床上翻来覆去睡不着。老张要创业。你要你一起去。这意味着你要离开银河科技——离开稳定收入、离开王姐、离开那个你坐了两年多的工位。</p><p>你打开手机看银行余额。工作两年攒了十几万。不多,但够撑一段时间。你又看了看老张发的商业计划书——方向对、团队有竞争力、启动资金也谈好了。</p><p>风险很大。但你说不上来为什么,你想去。</p>`,choices:[{t:'😤 去!',next:'ch12_join'}]},
1446ch12_start:{text:`<p>下班后,天已经黑透了。老张破天荒地在群里@了你一个人:「晚上有事没?请你撸串。」你看着那条消息愣了一下——老张从来不会单独约人吃饭。你回了一个「行」。</p>
1447
1448<p>公司附近的大排档。塑料凳子,折叠桌,桌上铺着一层一次性塑料布,被风吹得哗哗响。老张要了两瓶啤酒,也不说话,先给自己满上一杯,一口干了半杯。你坐在对面等着你开口。认识老张快一年了,你知道他这个人——有事不会直接说,得先喝两口把自己灌到某个合适的程度。</p>
1449
1450<p>第三瓶啤酒喝到一半的时候,你放下瓶子,脸已经红了,从脖子一直红到耳根。你看着桌面沉默了几秒,然后抬起头来,用一种你从未在他脸上见过的表情说:<span class="info">「小段。我想自己干了。」</span></p>
1451
1452<p>你刚喝进去的一口啤酒差点从鼻子里喷出来。</p>`,choices:[{t:'🚀 "干!算我一个!"',next:'ch12_join'},{t:'🤔 "让我想想"',next:'ch12_think'},{t:'😰 "张哥。我不敢"',next:'ch12_decline'},{t:'🍺 想起那晚的大排档',next:'ch12_night_beer'},{t:'⚔️ 代码报错,干它!',next:'__FIGHT__',fx:{"exp":29}}]},
1453 ch12_after_fight:{text:`<p>Bug被干掉了。你合上电脑。发现老张还在旁边等你。<br>\"修完了?\"你问。<br>\"修完了。\"你站起来——\"走吧。撸串的事不能耽误。\"<br>老张难得地笑了一下,你们一起走出了公司大门。</p>`,choices:[{t:'🍺 走,撸串去!',next:'ch12_join',fx:{"exp":20,"hp":10}}]},
1454 ch12_join:{text:`<p>你一巴掌拍在塑料桌上,桌上的花生盘子弹了一下,几颗花生米滚落到地上。「干!」</p>
1455
1456<p>老张愣了愣,然后笑了——那种憋了很久终于可以放心笑的、如释重负的笑。当晚你们聊到凌晨两点,大排档的老板来收了三次桌子都被老张摆手打发走了。你们在塑料餐巾纸上画产品架构图,在上面写股权分配比例,写第一年的里程碑节点。凌晨两点的街道空荡荡的,只有远处偶尔有一辆出租车驶过。</p>
1457
1458<p>最难的不是做决定本身,是回家之后告诉林悦。</p>
1459
1460<p>她坐在沙发上,听完之后沉默了很久很久。窗外的月光透过窗帘的缝隙照进来,在她脸上投下一道细细的光线。最后她开口了,声音平静得让你心里发紧:<span class="info">「你决定了?」「决定了。」「那……我跟你一起走。」</span></p>`,choices:[{t:'😲 "你也来?"',next:'ch12_love',fx:{"exp":40}}]},
1461 ch12_love:{text:`<p>"你从前端跳到创业公司?"你不敢相信。林悦笑了:<span class="good">"谁说我跳槽了。我在你身边支持你。等你公司做大了再考虑。"</span>你心里一热。那晚你抱着她。在阳台上看着城市的夜景。不知道创业这条路能不能走通,但你不再害怕了。</p>`,choices:[{t:'💪 开始创业!',next:'ch12_end3',fx:{"hp":20,"mp":20}}]},
1462 ch12_think:{text:`<p>"让我考虑一周。"这一周你夜不能寐。你分析了市场、竞品、老张的技术Demo。一周后你找到老张:<span class="good">"我想好了。干。"</span></p>`,choices:[{t:'💪 加入创业!',next:'ch12_end3',fx:{"exp":30,"atk":1}},{t:'📞 半夜给老张打电话',next:'ch12_call'}]},
1463 ch12_decline:{text:`<p>"张哥。我放不下现在的稳定。"老张没生气:<span class="info">"理解。创业不适合每个人。你以后想来了。随时找我。"</span>几个月后。老张的产品上线了。拿到了一笔天使投资。你看着你的朋友圈。心里有点羡慕,但不后悔。</p>`,choices:[{t:'😊 安稳生活',next:'ch12_end4',fx:{"exp":20}}]},
1464 ch12_end3:{text:`<p>你和老张的创业之路开始了。共享办公空间。两人一台电脑——712模式:早7点到凌晨1点。虽然辛苦,但每次看到产品有了新功能。那种成就感是无与伦比的。</p>`,choices:[{t:'👉 前往第十三章',next:'CHAPTER_COMPLETE',fx:{"exp":30,"hp":-5}}]},
1465 ch12_end4:{text:`<p>你选择了安稳。继续做技术主管。生活没有太多波澜,但你很满足。有爱的人在身边。有自己喜欢的工作。</p>`,choices:[{t:'🏠 过小日子',next:'ch12_home',fx:{"exp":20}}]},
1466 ch12_home:{text:`<p>你和林悦的感情越来越好。周末一起看电影、逛公园、做饭。你买了房。在五环外。不大但温馨。有一天你发现她的抽屉里放着一张纸条:<span class="info">"给你买了新键盘。放在工位上了。"</span>你回头看她。她正在假装看手机。耳朵却红了。</p>`,choices:[{t:'👉 跳转终章',next:'ch14_direct',fx:{"exp":20,"atk":1}}]},
1467 ch14_direct:{text:`<p>你做了一个大胆的决定。直接去找投资人。</p><p>你花了两周时间打磨商业计划书。画了十几版产品架构图。把数据模型翻来覆去改了无数遍。</p><p>老张知道以后。沉默了一会儿:<span class="info">"你确定要这么做?这条路可不好走。"</span></p><p>"我想试一试。"你说。</p><p>你看了你一眼。点了点头:<span class="good">"行。我帮你介绍几个投资人。"</span></p><p>你人生的新篇章。就此开始了。</p>`,choices:[{t:'🚀 飞升之路',next:'CHAPTER_COMPLETE',fx:{"exp":30,"atk":1,"def":1}},{t:'🏠 安稳生活',next:'CHAPTER_COMPLETE'}]},
1468 ch12_night_beer:{text:`<p>晚上九点,老张约你在公司附近的大排档见面。</p><p>你到的时候他已经坐在那儿了。面前摆了一盘花生毛豆、一碟拍黄瓜,还有两瓶啤酒。你看起来跟平时不太一样,没有穿那件深蓝色卫衣。</p><p>"坐。"他给你倒了一杯酒。你坐下了等着你开口。认识老张快一年了,你知道他有事不会直接说,得先喝两口。</p>`,choices:[{t:'😮 什么事?',next:'ch12_where'}]},
1469 ch12_where:{text:`<p>他喝了半杯啤酒之后说话了:"你,我要走了。"</p><p>"走?去哪儿?"你差点被啤酒呛到。</p><p>老张靠在塑料椅背上:"我要出来创业了。"</p><p>风从街道那头吹过来,吹得大排档的塑料布啪嗒啪嗒响。"你认真的?"</p><p>"非常认真。我想了大半年了。我老婆说我疯了。有稳定工作不做非要瞎折腾,但我觉得再不折腾就老了。"</p>`,choices:[{t:'📋 做什么方向?',next:'ch12_plan'}]},
1470 ch12_plan:{text:`<p>老张说了你的计划。项目叫"轻语科技",做AI客服SaaS平台,面向中小企业。技术栈用Go+React,数据库PostgreSQL,AI能力接入大模型API。</p><p>"我已经找了一个前端合伙人和一个销售合伙人。现在缺一个后端核心。"你看着我。</p><p>你明白你的意思了。"你是想让我跟你一起?"</p><p>"对。技术方面,你这一年成长很快。我信得过你,但得跟你说清楚。前期肯定没有现在工资高,而且创业九死一生。"</p>`,choices:[{t:'💰 能开多少?',next:'ch12_salary'},{t:'🧐 我考虑一下',next:'ch12_think'}]},
1471 ch12_salary:{text:`<p>"工资能开多少?"</p><p>"前六个月税前一万,加期权。六个月后项目跑起来了涨到一万五。跑不起来你可能得重新找工作。"</p><p>你现在在公司是一万二。创业降薪两千。你沉默了一会儿。老张说:"我能给你的,是一个技术合伙人的位置。如果成了,你分到的不是年终奖,是股份。"</p>`,choices:[{t:'🤔 让我再想想',next:'ch12_think'},{t:'🔥 干!拼了',next:'ch12_think'}]},
1472 ch12_call:{text:`<p>凌晨三点半,你拨通了老张的电话。响了三声他就接了。你也没睡。</p><p>"喂?"</p><p>"张哥,是我。"你深吸一口气,"我跟你干。"</p><p>电话那头沉默了几秒。然后老张笑了。那种放松的、如释重负的笑。"好。"他只说了一个字,但那个字比你想象中更有力量。</p>`,choices:[{t:'📝 第二天提离职',next:'ch12_quit'}]},
1473 ch12_quit:{text:`<p>第二天一早你敲开了老刘办公室的门。</p><p>"刘哥,我要辞职了。"</p><p>老刘放下鼠标靠在了椅背上。你没有生气也没有惊讶:"是因为上次涨薪的事?还是被挖了?"</p><p>"都不是。我跟老张一起创业。"</p><p>老刘沉默了一会儿点了点头:"老张是个靠谱的人。你们俩搭伙,我觉得能干出点东西来。公司大门永远给你开着。"</p>`,choices:[{t:'📋 办离职手续',next:'ch12_farewell'}]},
1474 ch12_farewell:{text:`<p>离职手续办得很快。下午王宇拉着你去楼下咖啡厅喝了杯告别咖啡。</p><p>"你小子真要走了。你说老张走了你也走了。我?我可不敢,房贷压着呢。不过我觉得你能成。"</p><p>"为什么?"</p><p>"因为你敢赌。我认识的人里,大部分连想都不敢想。"</p><p>走出银河科技的大楼,你回头看了一眼那十二层的玻璃窗。</p><p class="sys">从一个职场新人到奔向前方的创业者。这条路走了一年,但仿佛才刚刚开始。</p>`,choices:[{t:'🚀 新旅程开始',next:'ch12_join'}]}
1475 }
1476 },
1477 {
1478 title: '第十三章 · 第一次吵架',
1479 start: 'ch13_start',
1480 scenes: {
1481 ch13_ai_talk:{text:`<p>有一次你们吵架之后,她问你——「AI以后会不会让你更忙?」你想了想说可能会更忙。因为AI会让能做的东西变多。她又问——「那你以后还有时间陪我吗?」你愣了一下然后说——「AI可以帮我写代码。但它不会替我爱你。」她笑了。虽然她说你这个话太土了。但她笑了。</p>`,choices:[{t:'😊 和好',next:'ch13_reconcile'}]},
1482ch13_understanding:{text:`<p>你们之间有一个暗号——当一方说「今天有点累」的时候另一方就知道今天不适合吵架。有一天你说今天有点累。她问你怎么了。你说创业的事情不太顺。她没再追问。她去厨房给你热了一杯牛奶端过来放在你手边。你端着那杯温热的牛奶突然觉得——吵架不吵架的都不重要了。重要的是你们都在对方身边。</p>`,choices:[{t:'🥛 喝牛奶',next:'ch13_reconcile'}]},
1483ch13_simple_happy:{text:`<p>和好之后你们过了一个很普通的周末。周六下午你们一起去菜市场买菜。她挑菜你拎袋子。卖菜的大婶看着你们笑着说——「小两口真般配。」她没否认你也没否认。你们买了排骨玉米和一把青菜。回家她炖汤你切菜。厨房里热气腾腾的。你们坐在桌边喝汤的时候她突然说——「如果以后每周都能这样就好了。」你说:「以后不只每周。每天都可以。」她放下汤勺看着你。你看到她眼睛里有光。</p>`,choices:[{t:'😊 喝汤',next:'ch13_reconcile'}]},
1484ch13_growing_pains:{text:`<p>你们在一次关于未来的对话中吵了一架。她说你最近把所有精力都放在创业上完全忽略了她。你说你创业也是为了你们的未来。她说——「我要的是现在不是未来。你懂吗?」你沉默了。那天晚上你躺在床上想了很久。你给她发了一条消息——「对不起。我以后每周至少留一天陪你不谈工作。」她回了一条——「不用一天。半天就够了。」从那以后你们每个周六下午都是属于彼此的。谁也不带手机。</p>`,choices:[{t:'😊 好',next:'ch13_reconcile'}]},
1485ch13_learn_compromise:{text:`<p>你们慢慢学会了吵架的节奏。不是不吵了——是吵完之后知道怎么收场了。有一次你们因为一件很小的事又吵了起来——为了周末去爬山还是看电影。吵了五分钟你突然停下来看着她:「我们别吵了。你想去爬山还是看电影?」她愣了一下然后说——「我想爬山。但如果你不想去就算了。」你说:「那去爬山吧。我本来也无所谓。」她看着你——「你变了。」你说:「是你把我变好了。」</p>`,choices:[{t:'⛰️ 去爬山',next:'ch13_reconcile'}]},
1486 ch13_ai_burnout:{text:`<p>AI让工作效率提升了。但也让工作量翻倍了。以前一个功能迭代两周,现在老板说「AI帮忙加速一下」,deadline变成了一周。你能写完,但代价是每天多加班两小时。</p><p>她开始抱怨了——不是抱怨你忙。是抱怨你「在的时候心不在焉」。有一天周末你们在客厅看电影,你每隔十分钟就看一眼手机。她按了暂停:「你在等什么?」你说没有。她看着你:「你在等消息。但你在跟谁聊天?」你愣住了。你确实不是在跟谁聊天——你是在焦虑。脑子里一直在转明天要交的接口、下周一要评审的方案、AI生成的代码要不要人工再过一遍……</p><p>她说:「段飞。你不是在加班。你是把工作带进了生活。」她站起来去厨房给自己倒了杯水。你没有跟过去。你坐在沙发上。你知道她说得对。</p>`,choices:[{t:'😔 好好沟通',next:'ch13_ai_future_talk'}]},
1487 ch13_ai_future_talk:{text:`<p>和好之后你们靠在沙发上。电视关着。屋里只有空调的低鸣声。她忽然说:「你们做AI的……以后会不会都变成AI的奴隶?」</p><p>你被她这个问题逗笑了——但笑了三秒之后你发现这不是个玩笑。「不会。」你说,然后想了想,「但会变成另一群人。」</p><p>「什么意思?」</p><p>「以前程序员比的是谁写的代码快、谁的Bug少。以后比的是谁更会用工具、谁能做出更好的决策。AI能写代码,但它不知道怎么设计一个让用户用起来舒服的审批流程。它不知道一个五金厂的老板真正焦虑的是工人不会用电脑,不是功能不够多。这些东西——它不会替我们想。」</p><p>她侧过头看着你:「所以你其实不担心?」</p><p>你沉默了一下:「……偶尔会担心。但不是担心失业,是担心有一天我不再需要思考了。如果什么都让AI决定——那我还是我吗?」</p><p>她没说话。她握住你的手。你们在黑暗中坐了很久。</p>`,choices:[{t:'😊 睡吧',next:'ch13_reconcile'}]},
1488ch13_stress_talk:{text:`<p>吵架之后你们约定了一件事——每周五晚上不管多忙都要一起吃顿饭。第一次执行的时候你们去了一家新开的云南菜馆。她点了一桌子菜——汽锅鸡、香茅草烤鱼、过桥米线。你们吃到一半的时候她突然说——「其实我知道你创业压力大。我不是生你的气——我是气自己帮不上你。」你放下筷子看着她:「你在这里陪我吃饭。就是最大的帮助了。」</p>`,choices:[{t:'😊 继续吃饭',next:'ch13_reconcile'}]},
1489 ch13_postcard:{text:`<p>和好之后有一天你收到了一张明信片。没有寄件人地址。邮戳是北京的。正面是一张秋天的银杏大道的照片。翻过来——是你熟悉的字迹:「北京的秋天很美。我们一起看。」你把那张明信片贴在了办公桌的隔板上。旁边就是那两张褪色的便利贴。你看着三张贴在一起的东西——入职第一天的便利贴、林悦写的鼓励、和这张明信片。你在这家公司待了两年多了。</p>`,choices:[{t:'📬 珍藏',next:'ch13_reconcile'}]},
1490ch13_date_night:{text:`<p>和好之后你们去看了那部一直说要看但一直没时间看的电影。你买了可乐和爆米花。她靠在你肩膀上。电影讲的是什么你不记得了。你只记得她的手一直握着你的手。电影散场后走出影院外面的空气很凉但她的手在你手心里是温的。你说——「以后我们多这样出来走走。」她说——「好。不加班的时候就出来。」</p>`,choices:[{t:'🌃 散步回家',next:'ch13_reconcile'}]},
1491 ch13_lock_repair:{text:`<p>和好之后的那个周末你们一起做了一件事——把她出租屋里坏了好几个月的门锁换了。一起去五金店买锁芯她挑了一个贵的说「安全最重要」。你蹲在门口拆旧锁她蹲在旁边递工具。装好新锁之后你试了好几次——开关都很顺畅。你站起来拍了拍手上的灰:「好了。」她说:「有你在真好。」</p>`,choices:[{t:'😊 不客气',next:'ch13_reconcile'}]},
1492ch13_grow:{text:`<p>那次吵架之后你们的关系反而更好了。不是因为吵开了什么——是因为你们都学会了在吵架之前先停一下。有一天你们因为一件小事又要吵起来了。你深呼吸了一下然后说:「我们先冷静十分钟再说。」她愣了一下然后点了点头。十分钟后你们坐在沙发上。她先开口了:「我刚才语气不好。」你说:「我也是。」然后你们对视了一下都笑了。吵架变成了沟通。你们都在变成更好的人。</p>`,choices:[{t:'😊 好了',next:'ch13_reconcile'}]},
1493ch13_midnight_talk:{text:`<p>冷战后的第三天晚上你躺在床上睡不着。你拿起手机又放下。第三次拿起的时候你给她发了一条消息:「睡了吗?」没有回复。你盯着天花板看了二十分钟。手机亮了。一个字:「没。」你立刻坐起来打了几个字又删了。最后你打了一行:「我在楼下。你下来一下。」你根本没在楼下——但发完之后你穿上外套冲下了楼。你站在她家楼下喘着气。五分钟后她穿着睡衣下来了。看到你站在路灯下面她愣了一下。你说:「对不起。我不该那样跟你说话。」她没说话,走过来抱住了你。她的手臂环过你的腰。你的心跳慢慢慢了下来。</p>`,choices:[{t:'😊 和好了',next:'ch13_reconcile'}]},
1494 ch13_learn:{text:`<p>吵架之后你学会了一件事:创业的压力不能带回家。有一天你加班到很晚回家,发现她还没睡。她坐在沙发上等你,面前放着两杯热好的牛奶。你换了拖鞋坐下来。她递给你一杯。你们喝牛奶的时候都没说话。你放下杯子之后说了一句:「以后我尽量早回来。」她靠在你肩膀上:「不用尽量。你回来就行。」你搂着她的肩膀。窗外的北京安静下来。</p>`,choices:[{t:'😌 睡吧',next:'ch13_home'}]},
1495ch13_stress:{text:`<p>创业的压力开始影响到你们的关系。你每天回家都很晚,有时候连话都不想说。她理解你忙,但她也会累。有一天晚上你到家的时候她已经睡了。桌上留了一碗粥和一张纸条:「锅里有粥,自己热一下吃。别太晚。」你站在厨房里热粥的时候,热气的温度扑在脸上。你端着那碗粥坐在餐桌前一口一口地喝。粥很好喝。但你喝到一半的时候发现自己的手在发抖——不是冷。是累的。</p>`,choices:[{t:'😞 好好沟通',next:'ch13_midnight'}]},
1496ch13_quiet_morning:{text:`<p>冷战之后和好的那个周末早晨。你醒来的时候发现她还没醒。她的呼吸很轻很均匀,睫毛在晨光里投下一小片阴影。你看了她一会儿。然后你轻轻地起床,去厨房煮了两碗面。她醒来的时候穿着你的大T恤走到厨房门口,看到你在煮面,靠在门框上没说话。你把面端到桌上:「吃吧。」她坐下来拿起筷子夹了一口,然后说了一句话——声音有点哑:「你别对我这么好。」你说:「做不到。」她低头吃面,但你看到她在笑。</p>`,choices:[{t:'😊 安静的早晨',next:'ch13_reconcile'}]},
1497ch13_after_fight:{text:`<p>和好之后你们坐在客厅里,她靠着你的肩膀看电视。是一部看了很多遍的老电影。你没在看电视,你在想——为什么你们会吵架。是因为创业压力大,你对她说话的语气不如以前耐心了。她感觉到了,但她没说。她只是用吵架来表达。你转过头看着她的侧脸。她感觉到了你的目光,没有转头:「干嘛?」你:「对不起。」她:「你已经说过了。」你:「那再说一次。」她把头往你肩膀上靠了靠:「知道了。」窗外北京的夜安静下来。你们就这样靠着坐了很久。</p>`,choices:[{t:'😊 好了',next:'ch13_home'}]},
1498ch13_fight_start:{text:`<p>你们冷战了三天。起因是一件很小的事——她加班到很晚,你说了她几句。她说你没资格管她。话一说出口,两个人都沉默了。然后就冷了。</p><p>三天里你们没有发一条消息。你坐在工位上,手机亮了又暗、暗了又亮。你点开她的聊天窗口好几次,打了几个字,又删了。</p>`,choices:[{t:'😞 主动道歉',next:'ch13_reconcile'}]},
1499 ch13_reconcile:{text:`<p>你买了她最爱喝的那家奶茶,站在她公司楼下等她下班。秋天的风很凉,你站了四十多分钟。她出来看到你的时候愣了一下。你没说话,把奶茶递过去。她接过去喝了一口,然后说:「走吧。回家。」</p><p>你们并肩走在路上,谁也没提那三天的事。但你知道,和好了。</p>`,choices:[{t:'🏠 回家',next:'ch13_home'}]},
1500ch13_start:{text:`<p>创业的压力让你们的感情经历了第一次真正意义上的争吵。</p><p>那天晚上。你又加班到凌晨一点。回到家的时候。她坐在沙发上。没睡。桌上摆着一碗早就凉了的粥。</p><p>"你回来了。"她的声音很平静,但那种平静让你觉得不对劲。</p>`,choices:[{t:'😥 "怎么了?"',next:'ch13_fight'},{t:'😤 创业第三个月的紧张气氛',next:'ch13_morning_tension'},{t:'⚔️ 消灭这个Bug!',next:'__FIGHT__',fx:{"exp":31}}]},
1501 ch13_after_fight:{text:`<p>Bug被你K.O.了,但你的心已经不在代码上了。<br>你走到客厅。看到她坐在沙发上。面前的粥已经凉了很久了。<br>\"我回来了。\"你说。声音有点哑。<br>她抬起头。看着你。眼眶有点红。你走过去。坐在她旁边。握住了她冰凉的手。</p>`,choices:[{t:'😥 坐在她身边',next:'ch13_fight',fx:{"exp":15,"hp":5}}]},
1502 ch13_fight:{text:`<p>"你答应过今晚早点回来的。"她的声音有点发抖。"我。项目出问题了。走不开。""你每次都这么说。连续两周了。你说过的话。没有一次做到的。"</p><p>你心里一堵。想解释,但话出口变成了:"你以为我想吗?我不拼。公司怎么办?"</p><p>她站起来。看着你。眼睛红了:"那你有没有想过我怎么办?"</p><p>你沉默了。她转身进了房间。关上了门。</p>`,choices:[{t:'😔 坐在客厅冷静',next:'ch13_after',fx:{"exp":10,"hp":-10}}]},
1503 ch13_after:{text:`<p>你在客厅坐了很久。看着那碗凉了的粥。你端起来。一口一口喝完了。凉的粥。喝下去的时候。你的鼻子有点酸。</p><p>你不知道怎么解决这个问题,但你清楚地知道一件事:你不想失去她。</p><p>你站起来。走到房门前。敲了敲门。</p>`,choices:[{t:'🚪 推开门',next:'ch13_makeup',fx:{"exp":15,"affection":15}}]},
1504 ch13_makeup:{text:`<p>你推开门。她坐在床边。没有睡。在等你。</p><p>你走过去。在她面前蹲下来。握住她的手:"对不起。"</p><p>她没说话,但眼泪掉下来了。</p><p>你就那样蹲着。握着她的手。过了很久很久。最后她开口了:<span class="good">"我不是不让你拼。我只是希望。你不要把我忘了。"</span></p><p>你站起来。把她抱住。她贴在你胸口。你的衬衫湿了一小块。</p><p>你没有说话,但你抱得很紧。像怕失去什么最珍贵的东西。</p>`,choices:[{t:'💕 和好',next:'CHAPTER_COMPLETE',fx:{"exp":25,"hp":20}}]},
1505 ch13_morning_tension:{text:`<p>创业第三个月,办公室气氛越来越紧绷了。</p><p>说是办公室,就是商住两用楼里租的一个小套间。六十平米摆了五个工位,角落里堆着泡面箱。窗外风景是对面楼的空调外机。</p><p>你到的时候老张已经在里面了。你眼睛发红,桌上烟灰缸里塞满了烟头。</p><p>你打开电脑看任务列表。七个待修复的Bug,两个未完成的接口,客户催进度消息刷了三十多条。</p>`,choices:[{t:'💻 埋头干活',next:'ch13_argument'},{t:'☕ 先跟老张聊聊',next:'ch13_chat'}]},
1506 ch13_chat:{text:`<p>你决定先跟老张聊聊。你最近状态不太对。</p><p>"张哥,最近压力太大了?"</p><p>老张揉了揉太阳穴:"压力大是正常的。客户说月底不交付就要退款。"</p><p>"进度确实赶。我尽力。"</p><p>"不是有点赶。"你的语气有点冲,"是很赶。后端还有两个核心接口没做——"他停住了,意识到在对你发火。"抱歉。"</p><p>"没事。"你说,但气氛已经不对了。</p>`,choices:[{t:'🤝 继续干活',next:'ch13_argument'}]},
1507 ch13_argument:{text:`<p>下午三点矛盾爆发了。起因是一个API设计。你觉得用RESTful,老张觉得用GraphQL。</p><p>"GraphQL灵活,客户需求变来变去,你写REST接口改到死。"</p><p>"但我们前端用React Query,REST配合得很好。而且GraphQL的学习成本——"</p><p>"学习成本不是问题,问题是不管什么方案月底都要交付!"老张的声音大了起来。</p><p>"那也不能为了快把架构搞烂!"你也不自觉地提高了声音。</p><p>办公室安静了一秒。前端合伙人小陈探出头看了一眼又缩回去了。这是你们认识一年多来第一次真正吵架。</p>`,choices:[{t:'😤 出去冷静一下',next:'ch13_walk'},{t:'🤝 冷静,好好说',next:'ch13_calm'}]},
1508 ch13_walk:{text:`<p>你抓起手机走出办公室。楼道里很安静,你靠在墙上深呼吸。</p><p>你明白老张的压力。你是创始人,客户催他,销售催他,投资人盯着进度,但你也有你的坚持。不能为了赶进度牺牲代码质量。你想起了一年前那场线上事故。那次之后你对自己说:质量不能妥协。</p><p>手机亮了,老张发来的消息:<span class="info">"回来吧,好好聊。"</span></p>`,choices:[{t:'🔙 回去谈',next:'ch13_talk'}]},
1509 ch13_calm:{text:`<p>你深吸一口气压低了声音:"张哥,我不是要跟你吵。咱们能不能折中一下。核心接口用REST,查询部分用GraphQL?"</p><p>老张愣了一下,想了几秒然后缓缓点头:"……这个方案可以。是我刚才太急了。"</p><p>有时候,吵架之后的和解,比从来没吵过更让人安心。</p>`,choices:[{t:'👍 继续干活',next:'ch13_work',fx:{"skill":"coding"}}]},
1510 ch13_talk:{text:`<p>回到办公室,老张已经给你倒了杯水。</p><p>"刚才是我态度不好。"他先开口了,"但你知道我急什么。"</p><p>"我知道。我也急,但我的意思是。找一条中间的路。"你把混合方案说了一遍。</p><p>老张听完点了点头:"行。以后有什么意见早点说,别憋到爆发。"</p><p>你笑了笑:"你也是。"</p>`,choices:[{t:'💻 继续写代码',next:'ch13_work',fx:{"skill":"coding"}}]},
1511 ch13_work:{text:`<p>达成共识之后效率反而更高了。你们分工明确。你负责核心API,老张负责GraphQL查询层。晚上十点两个核心接口写完了。</p><p>小陈点了外卖。三份黄焖鸡米饭。三个人一边吃一边聊,气氛比白天缓和了很多。</p><p>"你们白天吵架时我大气都不敢出。"小陈说。你和老张对视了一眼都笑了。创业的伙伴关系大概就是这样。吵完架还能一起吃饭。</p>`,choices:[{t:'🌙 回家休息',next:'ch13_after'}]},
1512 ch13_home:{text:`<p>回到家的时候天已经黑了。你换了拖鞋坐在沙发上发了一会儿呆。手机亮了——她的消息。你说到了。她说那就好晚安。你看着那两个字想说点什么但又不知道说什么。最后你回了一个月亮的表情。</p>`,choices:[{t:'😴 睡觉',next:'CHAPTER_COMPLETE'}]},
1513 ch13_midnight:{text:`<p>凌晨一点你还没睡。你拿起手机给她发了一条很长的消息。打了又删删了又打。最后你只发了三个字——「对不起。」你没想到她还没睡。她秒回了四个字——「我没生气。」你看着那四个字愣了几秒然后笑了。你放下手机很快就睡着了。</p>`,choices:[{t:'😴 终于能睡了',next:'ch13_reconcile'}]}
1514 }
1515 },
1516 {
1517 title: '第十四章 · 生死时刻',
1518 start: 'ch14_start',
1519 scenes: {
1520 ch14_maturity:{text:`<p>那场事故之后你成熟了很多。不是技术上的成熟——是心态上的。以前遇到问题你会慌。现在遇到问题你脑子里第一个念头是——「先恢复。再查原因。再改进。」你把这个原则写成了团队的操作手册。有一天一个新来的同事遇到了线上问题慌慌张张跑来找你。你拍了拍你的肩膀说——「别慌。先恢复。我教你。」你带着他一步一步操作。你恢复完之后说——「飞哥你处理事故好冷静。」你说:「因为我也慌过。慌多了就不慌了。」</p>`,choices:[{t:'👨🏫 传授经验',next:'ch14_dawn'}]},
1521ch14_infra_upgrade:{text:`<p>那次事故之后你们升级了整个基础设施。数据库从单机变成了主从架构加了一个只读节点。缓存层加了Redis集群。监控系统全面升级——从只能看CPU内存到能看每一个接口的P99延迟。升级完成之后系统稳定了很多。再也没有出现过因为单点故障导致全站宕机的情况。你站在机房看着一排排闪烁的指示灯。你想起刚入职的时候连数据库都不敢碰。现在你在设计整个系统的架构。</p>`,choices:[{t:'✅ 升级完成',next:'ch14_dawn'}]},
1522ch14_crisis_lesson:{text:`<p>那次事故之后你写了一份很长的复盘文档。从技术层面到管理层面到流程层面——你写了十几条改进措施。你发到团队群之后老刘在底下回了一条——「段飞写的每一条我都赞成。」然后老张也回了一条——「执行。」你看着屏幕。这不是你一个人的复盘——这是整个团队的改进路线图。你关掉文档。你知道从这次事故之后你们的系统会变得更强。</p>`,choices:[{t:'✅ 改进执行',next:'ch14_dawn'}]},
1523ch14_three_amigos:{text:`<p>那次事故之后你们三个人——你、老张、老刘——有了一条不成文的规矩:每周四晚上一起喝酒。不是团建。就是你们三个人找一个没人的地方喝两杯聊聊天。不谈工作。有一回老刘喝多了说了很多话。你说他做了大半辈子技术没做出过什么牛逼的东西——但这个 SaaS 产品让你觉得自己这辈子没白干。你听完之后也喝了一杯。你没说话。但你心里想的是——我也是。</p>`,choices:[{t:'🍺 干杯',next:'ch14_dawn'}]},
1524ch14_monitoring:{text:`<p>你搭建了一套完整的监控告警系统。从服务器指标到应用性能到业务数据——全部可视化。有一天凌晨三点你的手机震了——但不是报警。是监控系统的每日摘要推送。你半梦半醒地看了一眼然后愣住了——系统一切正常。没有一条告警。那是你搭建监控系统以来第一次看到「零告警」的日报。你在黑暗中盯着手机屏幕笑了。然后翻了个身继续睡。</p>`,choices:[{t:'😴 真好',next:'ch14_dawn'}]},
1525 ch14_trust:{text:`<p>那次事故之后王姐对你的态度变了。不是更好了——是更信任了。以前重要的决策她会问你意见但最后还是她自己拍板。现在她会说——「段飞你觉得行就行。」第一次听到这句话的时候你愣了一下。你不是那个需要别人兜底的新人了。你就是那个兜底的人。你坐在办公室里看着窗外。北京的天空很高。你觉得自己可以飞。</p>`,choices:[{t:'💪 继续',next:'ch14_dawn'}]},
1526ch14_cicd_pipeline:{text:`<p>你主导建立了一套自动化的CI/CD流程。从代码提交到自动测试到自动部署全自动化了。以前每次上线要三个人忙活半天。第一个全自动上线成功那天你看着Jenkins上绿色的通过标志。你等了三分钟没有报警。你站起来走到茶水间给自己倒了一杯水。没有人知道你刚才完成了一个很重要的里程碑。</p>`,choices:[{t:'✅ 上线',next:'ch14_dawn'}]},
1527ch14_new_process:{text:`<p>事故之后你们建立了一套新的上线流程。每个人都必须遵守——代码Review、Staging测试、上线Checklist、回滚预案。不能跳过任何一步。一开始有人觉得太繁琐了。一个月之后线上事故率降到了零。没有人再抱怨了。有一次Tony想绕过流程上线一个紧急需求。你拦住了他。你有点急——「客户等着呢!」你说——「流程就是用来保护客户的。」他想了想没再坚持。那天晚上你走的时候看到Tony的工位显示器上贴了一张便利贴——你自己写的:「先走流程。」</p>`,choices:[{t:'✅ 流程建立',next:'ch14_dawn'}]},
1528ch14_aftermath:{text:`<p>那次事故之后你养成了一个习惯:每次上线之前,自己先手动跑一遍核心流程。不依赖测试环境——就是自己登录线上、提交一个申请、审批、归档。整个过程跑一遍。如果卡住了就不上线。小陈有一次看到你做这个动作:「你每次都自己测一遍?」你说:「嗯。自己不跑一遍不放心。」她沉默了一会儿然后说:「你这样的技术负责人,我们组以前没有过。」你没接话,但你记住了这句话。</p>`,choices:[{t:'✅ 继续',next:'ch14_dawn'}]},
1529 ch14_bonding:{text:`<p>那次通宵之后你们三个人——你、老张、老刘——有了一种很奇怪的关系。不是朋友,不是同事——是一起扛过枪的那种关系。有一天你们在公司楼下抽烟(你不抽,但站旁边陪着)。老刘说了一句:「你们知道吗,我今年四十二了。干了大半辈子技术,今天是第一次觉得——这个团队真的不会散。」你看着他,发现你的眼睛有点红。可能是被烟熏的。</p>`,choices:[{t:'😊 回办公室',next:'ch14_dawn'}]},
1530ch14_lessons:{text:`<p>那场事故之后你学会了三件事。第一:数据库连接池一定要配置连接检查和自动恢复。第二:报警群里的每一条消息都要认真看。第三:遇到问题先恢复、再查原因、最后问责(但不是找谁背锅,是找流程的漏洞)。你把这三条写进了团队的操作规范里,发给了所有人。老刘在群里回了一条:「段飞写的这几条,建议全团队学习。我就说这么多。」你看到那条消息的时候正在喝水。你差一点呛到。</p>`,choices:[{t:'😊 继续',next:'ch14_dawn'}]},
1531ch14_crisis_recovery:{text:`<p>事故之后第三天,一切恢复了正常。你坐在工位上,把这次事故从头到尾复盘了一遍,写了详细的事故报告。然后你发现自己写文档的速度和质量都比一年前进步了很多。不是因为文笔变好了。是因为你经历得多了。你知道什么信息是有用的、什么结论是有价值的。你把文档发给团队之后,老刘回了一条消息:「写得很清楚。赞。」两年前你第一次写事故报告的时候,老刘根本没回复。</p>`,choices:[{t:'📝 继续工作',next:'ch14_dawn'}]},
1532ch14_after_crisis:{text:`<p>熬了一整夜之后,你们三个人——你、老张、老刘——坐在公司旁边的一家永和豆浆里吃早饭。你点了一碗豆浆两根油条,老张要了一碗粥,老刘什么都没点,趴在桌上睡着了。你喝了一口豆浆,烫的。但它是热的,你感觉自己的身体在慢慢回温。老张说:「今天放一天假。回去睡觉。」你说:「线上的监控怎么办?」他说:「我盯着。你睡醒了换我。」你点了点头。走出永和的时候,清晨的阳光照在脸上。新的一天开始了。</p>`,choices:[{t:'😴 回家睡觉',next:'ch14_dawn'}]},
1533ch14_crisis_start:{text:`<p>SaaS平台上线后的第三个月。那天晚上十一点,报警电话响了。数据库挂了。所有客户的审批流全部中断。你的手机在桌上震动,屏幕亮得刺眼。</p><p>你穿上外套冲出门的时候甚至没来得及换鞋。凌晨的街道上你一边跑一边给老张打电话。你的声音很稳但你知道他也紧张:「我已经在机房了,你快来。」</p>`,choices:[{t:'🚕 去机房',next:'ch14_crisis'}]},
1534 ch14_all_nighter:{text:`<p>凌晨四点。你和老张终于找到了问题——数据库的一个参数配置错误导致内存溢出。你一边骂自己当初为什么没检查这个参数,一边敲命令修复。</p><p>服务恢复了。你瘫在机房的椅子上,眼睛干涩得像进了沙子。老张递过来一瓶水。你们俩谁都没说话。过了很久他说了一句:「创业就是这样的。永远不知道下一个坑在哪。」</p><p>你拧开瓶盖喝了一口。你知道你说得对。</p>`,choices:[{t:'😮💨 回家睡觉',next:'ch14_dawn'}]},
1535ch14_start:{text:`<p>创业第一年是最难的。不是技术上的难——技术上的问题熬夜总能解决——是那种不知道明天还有没有明天的难。产品有人用,日活在缓慢地往上爬,但增长曲线的斜率不够陡。账上的钱,掰着手指头算,只够再撑三个月零八天。这个数字你每天早上到办公室都会重新算一遍,好像多算一次就能多出一点似的。</p>
1536
1537<p>老张开始失眠。你嘴上不说,但你注意到你桌上的烟灰缸从一天清一次变成了一天清三次。你也焦虑——不是掉头发那种焦虑,是做噩梦那种。你梦见过服务器全部宕机、客户打电话来骂人、投资人撤资、你们俩坐在空荡荡的办公室里大眼瞪小眼。</p><p>有一天。警报响了。线上服务挂了。关键时刻。产品还出了致命Bug。</p>`,choices:[{t:'⚔️ 先打Bug再想出路',next:'__FIGHT__',fx:{"exp":10}},{t:'😔 算了。不挣扎了',next:'ch14_giveup'},{t:'⚡ 压力测试出问题了',next:'ch14_crisis'}]},
1538 ch14_start_after_fight:{text:`<p>你不甘心。你花了两周准备BP。见了十几个投资人。被拒了十一次。第十二次。你遇到了一个懂技术的投资人。你看了你们的Demo。问了三个技术问题。你一一回答。你点了点头:<span class="good">"200万——15%股份。干不干?"</span></p>`,choices:[{t:'🎉 "干!"',next:'ch14_success',fx:{"exp":60,"hp":20}}]},
1539 ch14_giveup:{text:`<p>你们决定解散。你收拾好东西。走出共享办公空间。回头看了一眼那块写满代码的白板。老张站在门口抽烟:<span class="info">"对不住啊小段。"</span>你回到了原来的公司。王姐二话不说让你复职了。林悦在楼下等你:<span class="good">"回来就好。走。请你吃火锅。"</span></p>`,choices:[{t:'😊 重新开始',next:'ch14_end2',fx:{"exp":30,"hp":10}}]},
1540 ch14_success:{text:`<p>融资到账的那天。你和老张在办公室里吼了一嗓子。你们招了第一个员工。林悦辞了职。加入你们当产品经理。有了钱。团队扩充到10个人。产品开始快速迭代。用户量从1万涨到了10万。</p>`,choices:[{t:'📈 快速增长!',next:'ch14_end2',fx:{"exp":50,"atk":2,"def":1}}]},
1541 ch14_end2:{text:`<p>不管结果如何。你都尽力了。创业就像一场修行。你看到了自己的极限。也看到了自己可以有多强。</p><p>老张有一次喝多了。拍着你的肩膀说:<span class="info">"小段。你知道吗。我拉你创业。不是因为你的技术。是因为我相信你这个人。"</span></p><p>你听了之后。低头喝了一口酒。什么也没说,但你记住了这句话。</p>`,choices:[{t:'👉 前往第十五章',next:'CHAPTER_COMPLETE',fx:{"exp":30}}]},
1542 ch14_crisis:{text:`<p>离交付日期还有三天。你们在做最后的压力测试。</p>
1543
1544<p>小陈在电脑前敲了几下键盘,然后把屏幕转过来,脸上的表情像是发现自己得了什么绝症:「……你们过来看一下。」</p>
1545
1546<p>你放下手里的泡面走过去。监控面板上,TPS曲线像一条垂死的线——最高冲到200就再也上不去了,然后开始震荡下滑。客户要求至少1000。差了五倍。</p><p>"TPS最高只有200。"你盯着监控面板说,"客户要求至少1000。"</p><p>老张的脸一下子白了。"扩容呢?"</p><p>"已经扩到顶配了。瓶颈不在服务器配置,在数据库连接池。"</p>`,choices:[{t:'🔍 深挖根因',next:'ch14_diagnose',fx:{"skill":"coding"}},{t:'😰 要延期?',next:'ch14_diagnose'}]},
1547 ch14_diagnose:{text:`<p>你打开数据库监控面板一条一条分析慢查询。很快你发现了一个核心查询没有走索引。是重构时忘记迁移的。</p><p>"找到了!"你大喊了一声。老张和小陈都凑过来看。</p><p>"这个查询每次全表扫描。加上索引并发量至少翻三倍。"</p><p>"那也还差得远。"</p><p>"别急。连接池默认20个,改成200个。再加上Redis缓存层。"</p>`,choices:[{t:'⚡ 连夜改',next:'ch14_night_fix',fx:{"skill":"coding"}}]},
1548 ch14_night_fix:{text:`<p>你开始一系列优化。加索引、调大连接池、引入Redis缓存、优化热点SQL、加CDN加速。</p><p>一边改一边测,每次改动后都跑压力测试。老张在旁边盯着监控,小陈在改前端缓存策略。</p><p>凌晨两点第一版优化完成——TPS从200涨到650。</p><p>"还不够。"你继续调。把ORM查询改成原生SQL、把事务粒度改小、把非关键路径改成异步处理。</p>`,choices:[{t:'🔥 继续优化',next:'ch14_more_opt',fx:{"skill":"coding"}}]},
1549 ch14_more_opt:{text:`<p>凌晨四点。咖啡已经喝了三杯,手在抖但脑子异常清醒。</p><p>你把懒加载改成批量加载,把实时计算改成定时预热缓存。每改完一个地方就跑压测。数字慢慢往上爬:650... 720... 810... 890。</p><p>卡在900上不去了。</p><p>"瓶颈在哪?"老张问。</p><p>你盯着监控看了一分钟。"磁盘IO。我们的服务器是普通云盘。"</p><p>"换SSD要提工单——"</p><p>"不用。把频繁读写的表内存缓存化,减少磁盘IO。"</p>`,choices:[{t:'💡 干!',next:'ch14_final_opt',fx:{"skill":"coding"}}]},
1550 ch14_final_opt:{text:`<p>你把热点数据表全部加了一层Caffeine本地缓存。代码改动不大,但效果惊人。</p><p>再跑一次压力测试——<span class="good">TPS: 980... 1020... 1150!</span></p><p>你靠在椅背上,感觉全身力气都被抽空了。老张盯着监控沉默了很久:"你,你他妈真是个天才。"</p><p class="sys">撑过去了。</p>`,choices:[{t:'😴 睡觉',next:'ch14_aftermath'}]},
1551 ch14_aftermath:{text:`<p>交付那天一切顺利。客户系统上线后你盯了一天监控——TPS稳定在800到1200之间,没有报警。</p><p>下午客户发来消息:<span class="good">"系统上线了,运行稳定。"</span></p><p>老张看到消息难得地笑了:"今晚别写代码了,我请客。"</p><p>你们三个人去涮肉馆。老张要了两瓶二锅头。半醉时他拍着你的肩膀说:"你,你知道吗?昨天我都想放弃了。想好了去跟客户说对不起退定金。你他妈救了这个公司。"</p>`,choices:[{t:'🍻 干杯!',next:'CHAPTER_COMPLETE'}]},
1552 ch14_dawn:{text:`<p>天亮了。你从公司走出来的时候清晨的阳光照在脸上。北京的早晨空气很冷但阳光是暖的。你在路边买了一杯豆浆和一个包子坐在路边的长椅上吃着。你喝完最后一口豆浆站起来把纸杯扔进垃圾桶。新的一天开始了。你还有一堆事要做。但你不怕。</p>`,choices:[{t:'☀️ 新的一天',next:'CHAPTER_COMPLETE'}]}
1553 }
1554 },
1555 {
1556 title: '第十五章 · 逆袭之路',
1557 start: 'ch15_start',
1558 scenes: {
1559 ch15_product_focus:{text:`<p>你们拒绝了一个看起来很大的客户。因为那个客户的需求跟你们的产品方向不匹配。老刘有点犹豫——「那可是一个大单。」你说——「一个不符合方向的客户会拖垮整个团队。」老张支持了你。你们拒掉了那个单子。三个月后你们的产品在核心市场增长了三倍。因为你们没有分散精力去做不擅长的事。你想起了一句话——「说不比说是更需要勇气。」</p>`,choices:[{t:'🎯 聚焦',next:'ch15_milestone'}]},
1560ch15_growth_pain:{text:`<p>用户量增长之后服务器压力越来越大。有一天晚上数据库的CPU飙到了90%。你坐在工位上盯着监控面板不敢眨眼。你在心里快速过了一遍可能的解决方案——加索引、读写分离、缓存预热。你选了最快的一个——先加索引。你小心翼翼地执行了ALTER TABLE。加完索引之后CPU开始回落。90%……80%……60%……40%。你靠在椅背上呼出一口气。你看了看时间——凌晨两点。你一个人搞定了。不需要叫醒任何人。</p>`,choices:[{t:'😮💨 搞定',next:'ch15_milestone'}]},
1561ch15_first_hire:{text:`<p>创业后你亲自招了第一个人。不是通过猎头——是在技术论坛上看到的。那人的帖子写得很认真分析问题的思路很清晰。你私信了你问你有没有兴趣聊聊。你来了之后你们聊了两个小时。临走的时候你说——「你跟别的创始人不一样。你不画饼。你讲的是怎么做。」你笑了笑说——「因为我自己就是从写代码一步步上来的。」他入职之后成了你们团队最早期的核心成员之一。</p>`,choices:[{t:'👋 欢迎加入',next:'ch15_milestone'}]},
1562ch15_product_market:{text:`<p>你们的产品在小型企业市场站稳了脚跟。有一天你打开了后台的客户列表——两千多家公司在用你们的产品。你随机点开了一家公司——一家在浙江小城的五金厂。你看了看你们的使用记录——每天都在用审批流程、考勤管理、工资结算。你关了页面靠在椅背上。你写的代码不在大厂的服务器上服务几亿人——但它在帮助一家小五金厂的日常运转。这个意义一点也不小。</p>`,choices:[{t:'😊 继续',next:'ch15_milestone'}]},
1563ch15_team_building:{text:`<p>创业团队从三个人发展到十五个人。你们换了一个大一点的办公室。搬家那天你搬着一个纸箱走进新办公室的时候看到老张站在窗前往外看。你走过去站在他旁边。你说——「这个窗外的风景比上一个办公室好。」你说:「下一个会更好。」他转头看了你一眼没说话。但你们都知道——这不是一句空话。</p>`,choices:[{t:'🏢 新办公室',next:'ch15_milestone'}]},
1564 ch15_round_b:{text:`<p>B轮融资的时候投资人问了一个问题——「你们团队的核心竞争力是什么?」老张指了指你:「他。」投资人看着你。你愣了一下但马上接住了话——「我们的核心竞争力不是技术。是对客户业务的理解。我们团队的每一个开发都花过时间跟客户聊需求。这不是每个技术团队都能做到的。」投资人点了点头。融资过了。后来老张跟你说——「你小子反应挺快。」你说:「跟你学的。」</p>`,choices:[{t:'💰 融资成功',next:'ch15_milestone'}]},
1565ch15_series_a:{text:`<p>A轮融资的消息是早上九点收到的。老张在群里发了四个字——「钱到账了。」你坐在工位上靠着椅背看着窗外。北京的天空很蓝。你想起两年前在一间六平米的隔断间里吃泡面。现在你参与创立的公司拿到了A轮融资。你走到窗口往下看——中关村大街上车水马龙。你也是这个城市的一部分了。不是被动的——是主动的。</p>`,choices:[{t:'🎉 庆祝',next:'ch15_milestone'}]},
1566ch15_first_revenue:{text:`<p>SaaS产品的第一笔付费收入到账那天你在群里发了一条消息:「第一笔钱——3480元。」群里安静了几秒然后炸了。老张发了一个表情包——一只熊猫在哭。老刘发了一个大拇指。你坐在工位上看着银行到账短信——3480元。不多。但这是你们的产品第一次被人认可到愿意付钱。你截了图存在了手机里。后来公司融资了几千万的时候,你手机里还存着那张3480元的到账截图。</p>`,choices:[{t:'🎉 第一笔收入',next:'ch15_milestone'}]},
1567ch15_hundred_thousand:{text:`<p>十万用户那天发生在周三下午。你正在改一个Bug。老张突然在工作群里发了一张截图——注册用户数突破十万。然后群里炸了。你看着那个数字——100,037——发现自己入职银河科技的时候,公司的用户数是两万。不到两年翻了五倍。而你也是让这个数字变化的原因之一。你截了一张图存在了手机里。</p>`,choices:[{t:'🎉 不错',next:'ch15_milestone'}]},
1568 ch15_pivot:{text:`<p>SaaS产品上线后的三个月,你们做了一次重要的方向调整。原来瞄准的中型企业客户反应一般,反而是小型企业在大量注册。你们花了两周时间分析数据——用户行为、留存率、付费转化。然后做了一个大胆的决定:放弃中型企业市场,全力服务小型企业。改产品方向的那天你熬了一整夜做方案。天亮的时候你走出办公室。北京的晨光打在脸上。你走在空荡荡的街道上,觉得累,但很清醒。</p>`,choices:[{t:'☀️ 新的一天',next:'ch15_milestone'}]},
1569 ch15_team_growth:{text:`<p>团队从三个人扩到了十二个人。新来的开发有一个叫小赵的,比你小两岁,但经验很丰富。面试的时候你问你为什么想来创业公司。你说:「因为我觉得你们在做的事有搞头。」你听完之后笑了一下——你跟老张当年也是这么想的。小赵入职第一天你带你走了一圈办公区——位置不大、人也不多。但你看了一圈之后说了一句话:「挺好。该有的都有了。」你点了点头。</p>`,choices:[{t:'👋 欢迎新同事',next:'ch15_milestone'}]},
1570ch15_milestone_team:{text:`<p>一百万用户那天老张买了一箱啤酒和一堆烤串拿到公司。你们就在办公室里——几个创始人、几个早期员工——坐着地板喝着啤酒吃着烤串。没有香槟没有庆祝仪式,就是一群人在深夜的办公室里一边吃串一边聊天。老张举着啤酒罐说了一句:「这一杯敬那些相信我们的人。」大家一起碰了一下。啤酒沫洒了一点在地上。你喝了一口。冰的。好喝。你看了看周围的人——你们都是你每天一起工作的人。你们一起熬过了最难的时期。</p>`,choices:[{t:'🍺 继续喝',next:'ch15_milestone'}]},
1571ch15_reflection:{text:`<p>一百万用户那天晚上,你没有庆祝。你坐在办公室里,把从创业第一天到现在的周报翻出来看了一遍。第一份周报很短——「这周完成了用户注册模块。Bug有点多。下周优化。」你看着那些字忍不住笑了。那时候的你什么都不会,什么都敢写。你再翻到最新的周报——密密麻麻的工作内容、团队管理、技术决策。你从一个写Bug的新人变成了一个带团队的人。</p><p>你关掉电脑。站起来走到窗前。北京的夜晚灯火通明。这座城市很大,你只是其中很小的一部分。但你确实在这里留下了一些东西。</p>`,choices:[{t:'🌃 回家',next:'ch15_milestone'}]},
1572ch15_user_milestone:{text:`<p>那天是个普通的周三。你正在改一个前端样式Bug——一个按钮在iPhone SE上显示不全。改完提交之后你顺手打开了后台看了一眼数据。</p><p>注册用户数:1,000,247。</p><p>你盯着那个数字看了好几秒。然后你喊了一声老张。你走过来看了一眼屏幕。沉默了几秒然后说:「挺快的。」但他嘴角的笑容出卖了他。</p>`,choices:[{t:'🎉 庆祝一下',next:'ch15_milestone'}]},
1573ch15_start:{text:`<p>产品上线一年后。用户在一个普通的周二下午突破了100万。那天没有庆祝,没有香槟——你是在上厕所的路上看了一眼后台数据发现的。你站在走廊里盯着手机屏幕看了十几秒,然后把截图发到了三个人的群里,附了一行字:「兄弟们。我们到100万了。」老张回了一个字:「靠。」过了两秒又回了一条:「今晚别加班,我请客。」</p>
1574
1575<p>但更大的消息在一个月后到来。一家知名互联网公司看中了你们的产品,通过投资人辗转递来了收购意向。报价是一个让你连续确认了三遍才确信自己没有看错的数字——3000万。</p>`,choices:[{t:'💰 卖掉套现',next:'ch15_sell'},{t:'🚀 不卖。继续做',next:'ch15_keep'},{t:'🏢 搬到新办公室',next:'ch15_new_office'},{t:'⚔️ 抄起键盘,打!',next:'__FIGHT__',fx:{"exp":35}}]},
1576 ch15_after_fight:{text:`<p>Bug被你解决了。你放下键盘。拿起手机。收购方的消息还在那里闪着。<br>3000万。还是继续做下去?<br>你站起来。走到窗边。看着城市的灯火。这个决定。比刚才那个Bug难太多了。</p>`,choices:[{t:'💰 回会议室决定',next:'ch15_sell',fx:{"exp":25,"hp":5}}]},
1577 ch15_sell:{text:`<p>签字的那天在一间没有窗户的会议室里。律师把文件一页一页翻给你看,每一页都像一叠厚重的扑克牌。你握着笔,在最后一页签下自己名字的时候,笔尖在纸上停顿了一下。八位数。你拿到了人生中第一张八位数的支票。</p>
1578
1579<p>走出会议室,你站在写字楼门口的阳光里,掏出手机打给了林悦。</p>
1580
1581<p>「悦。」你说。喉咙有点干。「我们财务自由了。」</p>
1582
1583<p>电话那头安静了很久很久。久到你差点以为信号断了。然后你听到了她的声音——混杂着笑声和抽泣,像压抑了很久的东西终于被释放了出来。</p>`,choices:[{t:'💰 套现成功!',next:'ch15_celebrate',fx:{"exp":80,"money":50000}}]},
1584 ch15_keep:{text:`<p>你们决定不卖。继续打磨产品。把AI代码助手做成了行业标准。第二年。用户突破1000万。第三年。公司估值5亿。</p>`,choices:[{t:'🚀 继续做大!',next:'ch15_celebrate',fx:{"exp":100,"atk":3,"money":30000}}]},
1585 ch15_celebrate:{text:`<p>庆功宴上。大家都喝多了。你也喝了不少。最后的记忆是你靠在沙发上。林悦坐在你旁边。帮你整理了一下领带。</p><p>"你今天很棒。"她说。</p><p>你醉醺醺地笑了笑。然后靠在了她的肩膀上。</p><p>醒来的时候。你发现你躺在酒店的大床上。衣服换了。床头放着一杯水和一片解酒药。手机屏幕上有一条消息:<span class="info">"好好休息。明天见。悦"</span></p>`,choices:[{t:'😊 给她回消息',next:'CHAPTER_COMPLETE',fx:{"exp":40,"hp":20}}]},
1586 ch15_new_office:{text:`<p>第一个项目成功交付后口碑传开了。两个月内你们又签了三个客户。做电商的、做教育的、做医疗的。核心架构已经打磨成熟,适配起来快了很多。</p><p>你们终于搬出了那个商住两用的小套间,换到了正经写字楼。搬家那天你站在新办公室的落地窗前,看着楼下车水马龙。小陈在旁边感慨:"半年了,终于有窗户了。"</p>`,choices:[{t:'🚀 继续招人',next:'ch15_hire'},{t:'📈 优化产品',next:'ch15_hire',fx:{"skill":"coding"}}]},
1587 ch15_hire:{text:`<p>业务多了一个人忙不过来了。你们决定招人。老张负责前端和销售,你负责后端团队。你从普通开发者变成了技术leader。</p><p>你第一次坐在面试官位置上,看着对面的年轻人。你看起来跟你一年前差不多,有点紧张。你想起了自己当年在银河科技面试的样子。</p><p>面试结束后老张说:"技术上还行,但没你当年好。你那天说'我最擅长的就是学新东西'。我记住这句话了。"</p>`,choices:[{t:'👨💻 带新人成长',next:'ch15_lead'}]},
1588 ch15_lead:{text:`<p>新人入职了。一个刚毕业的本科生,叫小刘。跟你当年一样,二本毕业,但眼睛里有一种想证明自己的光。</p><p>你带着他搭环境、过架构、讲规范。你把自己从老张那里学到的东西一点一点教给你。你第一次提交代码时你做了code review。指出了几个问题,但最后加了一句:"整体不错。"</p><p>你说完这句话愣一下,这不是老张当年对你说的吗?</p>`,choices:[{t:'😊 传承下去',next:'ch15_growth'}]},
1589 ch15_growth:{text:`<p>半年后,轻语科技已经是十五个人的公司了。后端团队四个人,技术栈从Go+React变成了微服务架构,部署变成了CI/CD流水线。</p><p>客户数量从1个变成12个,月收入从0涨到了三十万。</p><p>你坐在工位上看着每个人都在忙碌,突然意识到。你已经不是一个"刚毕业的初学者"了。</p>`,choices:[{t:'🚀 冲击下一阶段',next:'ch15_celebrate'}]},
1590 ch15_milestone:{text:`<p>你看着后台数据面板上的数字——用户数还在涨。你关掉面板站起来走到窗前。窗外北京的天际线在阳光下闪闪发光。你想起刚入行时觉得能写出一个没有Bug的功能就是最大的成就。现在你带着团队做出了一款服务几万家企业的产品。你笑了笑然后坐回工位继续写下一行代码。</p>`,choices:[{t:'💻 继续',next:'CHAPTER_COMPLETE'}]}
1591 }
1592 },
1593 {
1594 title: '第十六章 · 年会之夜',
1595 start: 'ch16_start',
1596 scenes: {
1597 ch16_team_love:{text:`<p>年会快结束的时候大家开始互相敬酒。你端着酒杯走了一圈——敬了王姐、敬了老张、敬了王宇、敬了小陈。最后你走到林悦面前。她端着果汁看着你你端着酒看着她。你脑袋一热说了一句——「谢谢你。」她问谢什么。你说——「谢谢你给我带早饭、帮我修Bug、在我加班的时候陪着我。谢谢你让我上班变成了一件值得期待的事。」旁边的人开始起哄。她的脸红了。你的脸也红了。</p>`,choices:[{t:'🥂 干杯',next:'ch16_dance'}]},
1598ch16_year_end:{text:`<p>年会的最后有一个环节——每个人在卡片上写下新年的愿望然后挂在门口的圣诞树上。你写的是——「继续做自己喜欢的事。继续跟喜欢的人在一起。」你挂卡片的时候看到林悦也走过来挂了一张。她走了之后你偷偷看了一眼她写的——「希望段飞的愿望都能实现。」你把她的卡片拍了一张照片存在了手机里。然后你把你的卡片换了一个位置——挂在她那张旁边。</p>`,choices:[{t:'🎄 新年快乐',next:'CHAPTER_COMPLETE'}]},
1599ch16_mom_watch:{text:`<p>年会那天你给妈妈打了一个电话。你说今晚公司年会。她说那好好玩。你说——「妈。我今年拿了一个奖。」她问什么奖。你说优秀新人奖。她在电话那头沉默了几秒然后说——「儿子。妈为你骄傲。」就五个字。你拿着手机站在公司楼下眼眶突然有点热。你挂了电话仰起头看着北京的夜空深吸了一口气。然后你转身走进了那个灯火通明的年会大厅。</p>`,choices:[{t:'🏆 进场',next:'ch16_wine'}]},
1600ch16_group_photo:{text:`<p>年会散场的时候有人提议全组拍一张合影。大家挤在一起有人蹲在前面有人站在后面。你被挤到了中间位置——不再是角落里那个新人了。摄影师喊「三二一」的时候你笑了一下。闪光灯亮起来的那一秒你脑子里闪过一个念头——如果一年前有人告诉你你会站在这里跟这些人一起拍年会合影你一定不会相信。照片后来发到了群里。你把它存了下来。后来换手机的时候这张照片是第一批被转移过去的。</p>`,choices:[{t:'📸 好照片',next:'ch16_dance'}]},
1601ch16_speech:{text:`<p>今年年会上你被主持人叫上台做一个简短的分享。你站在台上看着台下——技术团队坐在第三桌林悦坐在靠边的位置。你拿着话筒想了几秒钟然后说——「两年前我坐在那个位置。」你指了指最后一排的角落。「那时候我是一个什么都不会的新人。今天我站在这里想说的是——如果你觉得自己不行。给自己两年时间试试。」台下安静了一秒然后响起了掌声。</p>`,choices:[{t:'🎤 下台',next:'ch16_dance'}]},
1602ch16_year_review_walk:{text:`<p>年会散场之后你一个人走了一段路。冬天的北京很冷但天空很干净。你回顾了这一年:从普通开发到技术主管、从跟别人学到带别人学、从一个人加班到有人等你下班。你摸了摸口袋里的那个星星奖杯——水晶做的——凉凉的。你走回家的路上一直在想一个词——值得。</p>`,choices:[{t:'🏠 到家',next:'CHAPTER_COMPLETE'}]},
1603ch16_look_back:{text:`<p>年会结束后你在回家的出租车上靠着车窗。北京的冬夜街道两旁的树上挂满了彩灯。你想起两年前的同一天——你一个人在隔断间里吃着泡面,电脑上开着招聘网站,手机里妈妈问你找到工作了吗。你不敢回。现在的你——工牌、工位、涨薪、奖杯、还有——你转头看了看坐在旁边的林悦——一个愿意陪你一起加班到深夜的人。出租车司机放着一首老歌。你没听进去歌是什么。你只是在想——这两年过得真快。</p>`,choices:[{t:'🚕 回家',next:'CHAPTER_COMPLETE'}]},
1604ch16_award:{text:`<p>年会上有一个环节是优秀员工颁奖。你坐在台下吃着水果拼盘,根本没想过跟自己有关。主持人念到「年度最佳新人奖——段飞」的时候你的叉子停在了半空中。你站起来往舞台走的时候脑子是空的。接过奖杯的时候主持人问你有什么想说的。你拿着话筒看着台下——技术团队那一桌都在鼓掌,林悦在笑。你说了两个字:「谢谢。」然后走下台。回到座位之后小陈凑过来说:「就两个字?你倒是多说两句啊。」你说:「想说的太多了,说不出来。」</p>`,choices:[{t:'🏆 好奖杯',next:'ch16_dance'}]},
1605 ch16_new_year:{text:`<p>年会结束之后你和林悦没有马上回家。你们在公司楼下站了一会儿。北京的冬夜很冷,路灯把两个人的影子拉得很长。你手里还拿着那个奖杯——一个水晶做的星星形状的摆件,在路灯下闪闪发光。你看了看奖杯又看了看她。她也在看那个奖杯。然后她抬起头说了一句——「明年你会拿更好的奖。」你说:「什么奖?」她说:「最佳员工。」你笑了:「你怎么知道?」她说:「因为我认识你。」</p>`,choices:[{t:'😊 回家',next:'CHAPTER_COMPLETE'}]},
1606ch16_team_photo:{text:`<p>年会快结束的时候,有人提议全团队拍一张合影。大家挤在一起,有人蹲在前面有人站在后面。你被挤到了中间位置——不再是角落里那个新人了。摄影师喊「三二一」的时候你笑了一下。闪光灯亮起来的那一秒你脑子里闪过一个念头——如果一年前有人告诉你你会站在这里,跟这些人一起拍年会合影,你一定不会相信。照片后来发到了群里。你把它存了下来。后来你换手机的时候,这张照片是第一批被转移过去的。</p>`,choices:[{t:'📸 好照片',next:'ch16_dance'}]},
1607ch16_year_end:{text:`<p>年会结束后那年就真的结束了。你站在公司门口回头看了一眼那栋楼。对面墙上的倒计时牌子已经换成了「距离春节还有21天」。你在门口站了一会儿,回想这一年——从一个连Git都不太利索的新人变成了能独立带模块的开发。从一个人吃饭变成了有人帮你带炒饭、跟你一起加班到深夜。</p><p>手机震了。林悦的消息:「别站那发呆了。车来了。」你回过神。出租车停在路边,她摇下车窗在看你。你笑了,走了过去。</p>`,choices:[{t:'🚕 回家',next:'CHAPTER_COMPLETE'}]},
1608ch16_yearly_prep:{text:`<p>年底了。公司要办年会。消息在群里发了三天,大家的反应很统一:不感兴趣。但行政说了,今年有抽奖环节,一等奖是最新款iPhone。群里立刻活跃了起来。</p><p>你其实也没什么兴趣。但林悦很兴奋——「听说今年有节目表演!你们后端组要不要出个节目?」你连忙摆手:「写代码可以,上台不行。」</p>`,choices:[{t:'🎤 年会要开始了',next:'ch16_dress'}]},
1609 ch16_dress:{text:`<p>年会当天。你翻遍了衣柜才发现自己根本没有正式场合的衣服。唯一一件白衬衫是入职那天买的,已经洗得有点发黄了。你咬了咬牙,在网上下单了一件新的。第二天到货,穿上试了试。还行。林悦发消息问你穿什么,你说了白衬衫。她说她穿一条黑色的裙子。你放下手机的时候,发现自己不知道为什么开始期待今晚了。</p>`,choices:[{t:'🚶 出发去会场',next:'ch16_arrive'}]},
1610 ch16_arrive:{text:`<p>年会在隔壁区的一个酒店宴会厅。你到的时候大厅里已经坐了不少人。技术团队被安排在了靠前的位置。你找到自己的座位坐下,旁边是小陈和王宇。老张坐得远一些,正在跟老刘聊天。</p><p>舞台上灯光闪烁,大屏幕上滚动着公司的年度数据——用户增长、营收增长、团队规模。你看到那些数字,心里有一点自豪。因为你也是这些数字的一部分。</p>`,choices:[{t:'😊 坐下等开场',next:'ch16_wine'}]},
1611 ch16_wine:{text:`<p>晚宴开始了。菜一道一道地上来。大家开始互相敬酒。先是王姐站起来敬了全桌一杯,然后是组内互敬。</p><p>你端着酒杯站起来的时候,发现林悦不知道什么时候坐到了你旁边的空位上。她今晚穿着一条黑色的连衣裙,头发披散着,跟你平时在办公室看到的完全不一样。你愣了一下,差点把酒洒了。她笑了:「怎么了?不认识我了?」你赶紧说:「没有没有。就是……你今天不太一样。」</p>`,choices:[{t:'🥂 敬她一杯',next:'ch16_dance'}]},
1612 ch16_dance:{text:`<p>抽奖环节结束后,音乐响了起来。有人开始跳舞。你打算溜了——你不会跳舞。但你刚站起来,林悦就拉住了你的手腕:「走啊,去跳一会儿。」</p><p>你被她拉到了舞池中央。聚光灯打下来,你感觉自己像一个被推到舞台中央的社恐。你的手不知道该放哪,脚也不知道该怎么动。她笑了笑:「跟着我就行。慢一点。放松。」</p><p>你试着跟着她的步伐。踩了她两下。她说没关系你继续。踩了她第三下的时候她笑出了声。你也笑了。然后在酒店的灯光和音乐里,你们转了一圈又一圈。</p>`,choices:[{t:'💃 继续跳',next:'ch16_night'}]},
1613 ch16_night:{text:`<p>年会结束的时候已经快十二点了。你们站在酒店门口等车。北京的冬夜很冷,她穿着裙子,缩了缩脖子。你脱下外套披在她身上。她抬头看了你一眼,没说话,但把外套裹紧了一些。</p><p>出租车来了。她先上车。你关门之前她摇下车窗:「今天很开心。晚安。」你站在路边看着出租车尾灯消失在夜色里。风很冷,但你心里是暖的。</p>`,choices:[{t:'🏠 回家',next:'CHAPTER_COMPLETE'}]},
1614 ch16_prize:{text:`<p>抽奖环节到了。主持人念三等奖——耳机。二等奖——扫地机器人。一等奖——最新款iPhone。</p><p>你根本没抱希望。从小到大你抽奖从来没中过。你低头吃了一口菜。</p><p>「一等奖——」主持人拖了一个长音,全场安静。你抬头看了一眼舞台。「工号1053——段飞!」</p><p>你差点被嘴里的菜噎住。全桌的人都在看你。王宇推了你一把:「中了!!还不上去!」你站起来,在全场注视下走到舞台。接过那个白色的盒子的时候,主持人问你有什么想说的。你拿着话筒看了看台下——林悦在鼓掌,笑得比你还开心。你说:「谢谢公司。我会继续努力的。」</p>`,choices:[{t:'📱 把手机给妈寄回去',next:'ch16_night'}]},
1615 ch16_mom_gift:{text:`<p>年会第二天你把中奖的iPhone寄给了妈妈。快递单上你写了一行备注:「一等奖中的,给你用。别省着。」</p><p>妈妈收到之后打了三个电话。第一个电话:「儿子你怎么花这个钱!」第二个电话:「真的是中的?没骗妈?」第三个电话:「妈用不太来这个智能机……那个微信怎么安装?」你笑着一一回答。那天下午你花了两个小时远程教妈妈用智能手机。她终于学会发语音消息的时候开心得像个小孩。</p>`,choices:[{t:'😊 继续工作',next:'CHAPTER_COMPLETE'}]},
1616ch16_start:{text:`<p>公司年会。你作为创始人之一。被安排上台发言。</p><p>你穿了一身正装。在镜子前站了半天。觉得不太像自己。林悦走过来。帮你整了整领带。然后退后一步看了看:<span class="good">"嗯。可以。"</span></p><p>她今晚穿了一件深蓝色的长裙。头发盘了起来。露出了好看的锁骨。你看到她的那一刻。愣一下,</p><p>"怎么了。不好看?"她有点紧张。</p><p>"太好看了。"你说。然后你的脸红了。</p>`,choices:[{t:'💃 一起去年会',next:'ch16_party',fx:{"exp":10,"hp":10}},{t:'🎉 年会前准备',next:'ch16_prepare'},{t:'⚔️ 抄起键盘,打!',next:'__FIGHT__',fx:{"exp":37}}]},
1617 ch16_after_fight:{text:`<p>Bug被你消灭了。你合上电脑。林悦站在你面前。穿着那条深蓝色的长裙。笑着看你。<br>\"修完了?\"她问。<br>\"修完了。\"<br>她伸出手——\"那走吧。年会要开始了。\"<br>你握住她的手。站了起来。深呼吸了一下。</p>`,choices:[{t:'💃 一起去年会',next:'ch16_party',fx:{"exp":15,"hp":10}}]},
1618 ch16_party:{text:`<p>年会在一个五星级酒店的宴会厅举行。水晶灯、红毯、香槟塔。一切都很盛大。你端着酒杯跟各种人聊天。投资人、合作伙伴、媒体。你觉得自己像在演一场戏,但演得还不错。</p><p>轮到你上台发言的时候。你站在聚光灯下。看着台下一片黑压压的人头。你在人群中找到了林悦。她坐在第三排。正在看你。你对她说完了你的整段发言。虽然她可能不知道,但你每一句话。都是对她说的。</p>`,choices:[{t:'🎤 发言结束',next:'ch16_dance',fx:{"exp":20,"hp":10}}]},
1619 ch16_dance:{text:`<p>发言结束后。音乐响起来。是慢四拍。有人开始跳舞。</p><p>"跳一支?"你伸出手。有点紧张。</p><p>她看了你一眼。把手放进了你的手心。</p><p>你的舞步很生疏,但你尽量不踩到她的脚。她靠得很近。你能闻到她身上的香水味。跟平时的不一样。更浓一些。大概是今晚特意喷的。</p><p>"你今天很棒。"她在你耳边说。声音很轻。只有你能听到。</p><p>你没有说话,但你握紧了她的手。</p>{fate_birthday}`,choices:[{t:'💕 公开关系',next:'CHAPTER_COMPLETE',fx:{"exp":25,"hp":20}}]},
1620 ch16_prepare:{text:`<p>公司第一次办年会。说是年会,其实就是租了一个轰趴馆,十几个人聚在一起吃吃喝喝,但对你们来说意义不一样。半年前你们还在那个六十平的小套间里吃泡面,现在你们活下来了。</p><p>你穿了一件稍微正式点的衬衫。站在镜子前,你发现自己看起来确实不一样了。不是外表,是气质。</p><p>手机响了,林悦发来的消息:<span class="info">"今晚年会?加油,你是最靓的仔。"</span></p>`,choices:[{t:'🎤 准备上台讲几句',next:'ch16_speech'},{t:'🍻 先跟大家喝几杯',next:'ch16_drinks'}]},
1621 ch16_speech:{text:`<p>年会上老张先上台讲了这一年。从三个人吃泡面到十五个人十二个客户月入三十万。然后你点名让你上台。</p><p>你没想到你会叫你。你站在话筒前突然不知道该说什么。"也没准备什么……就是想说谢谢大家。也谢谢老张。一年前我还是个在隔断间里吃泡面的毕业生,现在跟一群很厉害的人做很酷的事。"</p><p>下面有人起哄:"不是幸运,是牛逼!"</p>`,choices:[{t:'🍻 下去喝一杯',next:'ch16_drinks',require:{armor:3},fx:{"exp":10}}]},
1622 ch16_drinks:{text:`<p>你端着啤酒走了一圈。小刘过来敬你:"飞哥,谢谢你带我。"</p><p>老张走过来把胳膊搭在你肩膀上:"你,你知道我最佩服你什么吗?你从来不觉得自己行了。你永远觉得还能更好。这个心态比技术难学多了。"</p>`,choices:[{t:'🎯 定个更大目标',next:'ch16_goals'}]},
1623 ch16_goals:{text:`<p>年会结束前老张让大家说明年目标。有人要买房,有人要买车。</p><p>轮到你了:"明年,我要让轻语科技成为行业里叫得出名字的公司。"掌声响起来。</p><p>走出轰趴馆,北京的冬夜很冷但你的脸是热的。你给林悦发消息:<span class="mono">"年会结束了。明年会更好。"</span>她回了一个微笑的表情。</p>`,choices:[{t:'🌙 回家',next:'ch16_dance'}]}
1624 }
1625 },
1626 {
1627 title: '第十七章 · 巅峰之上',
1628 start: 'ch17_start',
1629 scenes: {
1630 ch17_old_mentor:{text:`<p>有一天你回银河科技找老张吃饭。你们去了公司楼下那家烤串店。老板还记得你们——「哟!段飞!好久不见!听说你当技术总监了!」你笑了笑说是的。老张坐在对面一边吃串一边说——「别得意。技术总监只是开始。」你说我知道。然后你问你——「张哥。你觉得我现在做得怎么样?」他沉默了一会儿然后说——「比我预期的好。」你愣了一下——「你预期是什么?」他说——「我以为你会在第二年撑不住走人。你不仅没走。你还带着别人往前走。」</p>`,choices:[{t:'😊 谢谢张哥',next:'ch17_night'}]},
1631ch17_promotion:{text:`<p>晋升技术总监的消息是王姐在全员大会上宣布的。你坐在台下听到自己的名字的时候周围的人在鼓掌。你站起来微微鞠了一躬然后坐下。林悦坐在不远处朝你竖了一个大拇指。你拿出手机看到她的消息——「技术总监了。请客。」你回她:「好。你想吃什么?」她回:「你做的就行。」你看着那条消息笑了一下。然后收起手机继续开会。你的生活没有因为这个title改变太多。但你知道——你走的每一步都没有白走。</p>`,choices:[{t:'😊 继续前行',next:'ch17_night'}]},
1632ch17_old_desk:{text:`<p>你有时候还会路过你原来的那间办公室——银河科技的写字楼离你们现在的办公室只隔了两条街。有一次你路过的时候正好遇到了前台姑娘。她认出了你——「段飞!好久不见!回来看看?」你说是的路过。你在大厅里站了一会儿。一切都没变。沙发还是那张灰色的布艺沙发茶几上还是放着几本旧杂志。你站了一会儿然后走了。你已经不属于这里了。但这里永远是你的起点。</p>`,choices:[{t:'🚶 继续走',next:'ch17_night'}]},
1633ch17_mom_proud:{text:`<p>你给妈妈打了一个电话告诉她你升职了。她问升了什么——你说技术总监。她沉默了几秒然后说——「那你现在管多少人?」你说十几个吧。她说——「那是不是以后不用自己写代码了?」你说还写。她好像放心了——「那就好。你从小就喜欢敲电脑。别丢了。」你挂了电话后坐在办公室里。你妈永远是你妈。在你妈眼里你永远是需要她操心的小孩。但你知道——你已经不是那个需要她操心的孩子了。</p>`,choices:[{t:'☎️ 挂了电话',next:'ch17_team'}]},
1634ch17_linyue_proud:{text:`<p>林悦有时候会来你的新办公室等你下班。她坐在会客区的沙发上刷手机。你开会的时候透过玻璃墙能看到她——她有时候抬头看看你然后低头继续刷手机。有一天你开会出来她还在那里。「等很久了吧?」你说。「没多久。」她站起来。「你们公司前台小姑娘问我是不是你女朋友。我说是。她说你男朋友好厉害。」你笑了:「那你怎么说的?」她说:「我说——我知道。」她挽住你的胳膊:「走吧。吃饭去。」</p>`,choices:[{t:'🍜 吃饭',next:'ch17_night'}]},
1635ch17_strategy_meeting:{text:`<p>你第一次参加公司的战略会。会议室里坐着八个人——王姐、投资人代表、几个核心部门的负责人。轮到你发言的时候你说了一个技术架构方向的看法。你说完之后王姐接了一句话——「段飞说的这个方向我们技术部已经在做了。」你愣了一下——她不是在补充你的发言。她是在肯定你的判断。</p>`,choices:[{t:'📋 继续',next:'ch17_strategy'}]},
1636ch17_old_friends:{text:`<p>成为技术总监之后你跟老张见面的次数变少了。但他还坐在你原来那个工位上。你有时候经过他工位会停下来聊两句。有一次你问你——「张哥,你觉得我现在做得怎么样?」他头都没抬:「你问我干嘛?你现在是领导了。」你说:「你永远是我师傅。」你敲键盘的手停了一下。然后他继续敲键盘没说话。但你看到你嘴角动了一下。你用手机拍了一张你的背影。以后不管走到哪你都记得这个人。</p>`,choices:[{t:'📸 纪念',next:'ch17_night'}]},
1637ch17_talk_to_lin:{text:`<p>你约林悦在公司楼下那家便利店见面。你买了两瓶乌龙茶——你记得她喜欢喝这个。你们站在便利店外面的台阶上。你告诉她你收到了那个offer。她听完之后没有马上说话。然后她说了一句——「你去吧。」你愣了一下。她继续说——「我能照顾好自己。你不用担心我。」你看着她。便利店的白光照在她脸上。你沉默了一会儿然后说:「我不会走的。」这次换她愣了一下。</p>`,choices:[{t:'😤 定了',next:'ch17_night'}]},
1638ch17_recruit:{text:`<p>你亲自招了一个人。这是你第一次作为面试官坐在桌子的另一边。来的年轻人跟你当年一样——二本计算机、紧张、但有一双很亮的眼睛。你问了他几个技术问题。你答得不算完美,但思路清晰。面试结束的时候你问了他一个问题——「你为什么想做这一行?」他想了想说:「因为写代码的时候,我能创造一点有用的东西。」你听完之后沉默了几秒。然后你说了跟你当年面试时老张说的一样的话:「回去等通知吧。」你关掉面试记录之后写了一个「通过」的评语。</p>`,choices:[{t:'📋 招进来了',next:'ch17_team'}]},
1639ch17_mentoring:{text:`<p>你开始带更高级别的开发了。有一个从大厂跳过来的高级工程师,技术上不比你差。但他不太适应创业公司的节奏——事情多、变化快、资源少。有一天他跟你聊了一个多小时。你说他觉得在这里做的事情没什么意义。你沉默了一会儿然后说了一句话——「你觉得没意义是因为你在用大厂的标准衡量这里。但这里的每一行代码都在帮一个真实的小企业活下去。这个意义不一样。」</p><p>你想了很久。后来你在周报里写了一条:「这周理解了产品的价值。继续干。」</p>`,choices:[{t:'📋 继续',next:'ch17_team'}]},
1640ch17_corner_office:{text:`<p>你坐在新办公室里。不大,但有一扇很大的窗户。窗外能看到中关村的车流和远处连绵的西山。桌上摆着你从旧工位搬过来的东西——那盆多肉(林悦送的)、两张便利贴(已经有些褪色了)、还有那个印着公司logo的保温杯。</p><p>你靠在新转椅上转了一圈。比工位上的椅子舒服。但你心里有一种奇怪的感觉——你好像离那些日常的代码越来越远了。</p>`,choices:[{t:'📊 查看团队进度',next:'ch17_strategy'}]},
1641 ch17_team_lead:{text:`<p>你现在的team有六个人。两个高级开发、三个中级、一个实习生。每天早上站会的时候,你们看着你,等你安排任务、解答问题、做技术决策。</p><p>你发现自己说话的方式变了。不再说「我觉得可以这样」,而是说「我们按这个方案走」。不再是跟别人商量,而是做决定。</p><p>有一次你看到实习生写的一段代码——一个复杂的lambda嵌套——你说了跟老张当年一样的话:「写简单点。别人要能看懂。」说完你愣了一下。你变成了你当初遇到的那个mentor。</p>`,choices:[{t:'👨🏫 继续带团队',next:'ch17_team'}]},
1642 ch17_code_review_as_leader:{text:`<p>你帮团队成员Review代码。看到一段写得不太好的逻辑,你本来想像老张当年那样直接说「这里不行」。但你犹豫了一下。你换了一种说法:「这个地方的逻辑可以再简化一下。你看看有没有别的思路?」</p><p>那个开发想了想,给出了一个更好的方案。比你脑子里想的那个还好。你点了点头:「嗯。这个方案比我想到的好。就按这个来。」</p><p>你发现带团队跟写代码一样——一个好的方案,不是一个人想出来的。是让所有人都能贡献最好的想法。</p>`,choices:[{t:'📝 继续工作',next:'ch17_strategy'}]},
1643 ch17_meet_lin:{text:`<p>你的办公室在三楼,她在五楼。现在你们见面的机会变少了。但她偶尔会在下班的时候发消息:「今天不加班吧?楼下等你。」</p><p>有一天你们在电梯里碰到。她靠着电梯壁,看你的眼神带着一种说不清的情绪:「你现在是大领导了。」你笑了:「什么大领导。就是换个地方写文档。」她说:「但你确实变了很多。」电梯到了。她走出电梯之前回头看了你一眼:「挺好的。」</p>`,choices:[{t:'😊 看着她走远',next:'ch17_night'}]},
1644 ch17_night:{text:`<p>晚上你最后一个离开办公室。走廊的声控灯在你走过后一盏一盏熄灭。你刷卡出门。北京的夜晚灯火辉煌。</p><p>你站在楼下给林悦发了一条消息:「下班了。走不走?」她秒回:「走。北门见。」</p><p>你们并肩走在深夜的北京街头。谁也没说话。你突然觉得——不管你是技术主管还是普通开发,不管你的办公室有没有窗户——跟这个人一起走在深夜的街头,就是你想要的生活。</p>`,choices:[{t:'🌃 回家',next:'CHAPTER_COMPLETE'}]},
1645ch17_start:{text:`<p>你站在千人技术大会的舞台上。聚光灯打在你身上。台下是黑压压的人群。</p><p>主持人介绍:<span class="good">"让我们欢迎。银河科技创始人兼CTO。你!"</span></p><p>掌声雷动。你走到讲台中央。看着PPT上你的头像和简介:从实习生到科技公司创始人。一个普通程序员的十年。</p>`,choices:[{t:'🎤 开始演讲',next:'ch17_speech'},{t:'📈 公司扩张到百人',next:'ch17_expansion'}]},
1646 ch17_speech:{text:`<p>你深吸了一口气。开始讲。</p><p>讲到第一天入职时的紧张。第一次上线时的胆怯。第一次搞崩线上时的手忙脚乱——996那个冬天在工位上写代码。老张拉你创业时的热血。融资被拒十一次时的绝望。产品突破百万用户时的狂喜。</p><p>台下很安静。偶尔有笑声。偶尔有掌声。</p><p>你讲到一半。准备开始现场Demo——</p><p>大屏幕上突然出现了一个——<span class="bad">OutOfMemoryError!</span></p>`,choices:[{t:'⚔️ 当着千人的面打Bug!',next:'__FIGHT__',fx:{"exp":30}}]},
1647 ch17_speech_after_fight:{text:`<p>Bug被你消灭了——Demo成功。全场起立鼓掌。</p><p>你站在台上。看着台下的掌声和欢呼。然后你的目光落在第二排。林悦坐在那里。怀里抱着你们半岁的女儿。正在抹眼泪。</p><p>"最后。我要感谢一个人。"你的声音有点哽咽。"谢谢你在我最穷的时候没有嫌弃我。谢谢你在我创业的时候辞了工作来帮我。谢谢你给我生了一个这么可爱的女儿。"</p><p>全场再次起立鼓掌。她在台下。泪流满面地笑着。</p>`,choices:[{t:'💕 走下台拥抱她',next:'CHAPTER_COMPLETE',fx:{"exp":50,"hp":30}}]},
1648 ch17_expansion:{text:`<p>第三年轻语科技已经是一百多人的公司了。你们搬到中关村的写字楼租了整整三层。你的title从"技术负责人"变成了"技术总监",工资是当年的十倍。你有了独立办公室。虽然不大但有一扇很大的窗户。</p><p>有时候你站在窗前看着楼下中关村大街的车流,觉得一切像一场梦。林悦已经毕业了,在北京一家设计公司工作,你们在一起两年多了。</p>`,choices:[{t:'📈 规划技术战略',next:'ch17_strategy',fx:{"skill":"coding"}},{t:'👥 带好团队',next:'ch17_team'}]},
1649 ch17_strategy:{text:`<p>公司大了技术决策不再是你一个人能拍板的事。你开始定期开技术评审会。有一次一个架构师提出了一个跟你完全不同的微服务方案,你听完后没有反驳而是问了几个问题:"容错机制是什么?数据一致性怎么保证?学习成本高不高?"</p><p>会议结束后老张私下说:"你现在越来越像个真正的技术leader了。"</p>`,choices:[{t:'😊 继续学习',next:'CHAPTER_COMPLETE'}]},
1650 ch17_team:{text:`<p>团队大了以后人的问题比技术问题更复杂。有一个开发连续迟到代码质量下降。你把那个人叫到办公室没谈制度先问你是不是遇到困难了。</p><p>你沉默了很久说他母亲生病了,每天晚上在医院陪床。你给你调了远程办公权限。你感激得差点哭了,后来成了最拼的人之一。</p><p class="sys">管理不是管制度,是管人心。</p>`,choices:[{t:'📝 记下这个教训',next:'ch17_balance'}]},
1651 ch17_balance:{text:`<p>工作和生活的平衡越来越难把握了。林悦开始抱怨你回家太晚。有时候你到家她已经睡了。你们像住在同一个屋檐下的室友。</p><p>有一天晚上你难得十点前到家。她坐在沙发上看书,看到你进来愣了一下:"今天这么早?"你坐在她旁边发现不知道该聊什么。你突然意识到已经很久没好好跟她说过话了。你握住她的手:"周末我们去哪儿转转吧。"她笑了:"好。"</p>`,choices:[{t:'❤️ 多陪陪她',next:'ch17_speech'}]}
1652 }
1653 },
1654 {
1655 title: '第十八章 · 见家长',
1656 start: 'ch18_start',
1657 scenes: {
1658 ch18_parents_ok:{text:`<p>春节过后林悦爸妈对你的态度明显不一样了。她妈妈开始每隔一段时间给你寄吃的——自己腌的咸菜炸的丸子包的饺子。她爸爸也开始在微信上给你转发一些文章——技术类的、行业新闻类的。有一次他还问你一个关于企业数字化转型的问题。你认认真真回答了他。后来林悦告诉你——她爸爸跟朋友喝酒的时候说:「段飞这孩子靠谱。」你听到的时候正在喝水。你差点呛到。</p>`,choices:[{t:'😊 被认可了',next:'CHAPTER_COMPLETE'}]},
1659ch18_hometown:{text:`<p>春节带林悦回老家那几天你带她走了很多你小时候走过的路。小学门口的那棵大榕树还在——你爬过那棵树从上面摔下来过。你指着树说——「我在这里摔断过胳膊。」她笑了:「你小时候是有多皮。」你带她去吃了你从小吃到大的那家牛肉面。她说好吃。你看着她吃面的样子突然觉得很幸福——因为你在跟你最喜欢的人分享你最喜欢的东西。那天晚上你走在老家的街道上。你牵着她的手。冷风中你的手是暖的。</p>`,choices:[{t:'😊 回北京',next:'CHAPTER_COMPLETE'}]},
1660ch18_new_year:{text:`<p>春节你真的带林悦回老家了。火车上她靠在你肩膀上睡着了。你看着窗外飞掠的田野和村庄心里有一种说不清的踏实感。到了老家你妈站在门口等——穿了一件新衣服头发也烫过了。林悦叫了一声阿姨好你妈笑得合不拢嘴。那天晚上你妈做了一桌子菜——红烧肉炖排骨清蒸鱼。林悦吃了两碗饭。你妈悄悄跟你说——「这姑娘好。你别把人气跑了。」你说:「妈。我不会的。」</p>`,choices:[{t:'😊 过年',next:'CHAPTER_COMPLETE'}]},
1661ch18_family_warm:{text:`<p>从那以后逢年过节你都会去林悦家。不是每次都有什么特殊的事——就是去吃顿饭。她妈妈会做一桌子菜。她爸爸会开一瓶酒。你坐在客厅里跟他们聊天——聊工作聊北京聊最近看的新闻。有一次你走的时候她妈妈往你手里塞了一袋自己腌的咸菜——「带回去吃。小林说你爱吃。」你接过那袋咸菜的时候心里暖了一下。你在这个城市有了第二个家。</p>`,choices:[{t:'🥬 谢谢阿姨',next:'CHAPTER_COMPLETE'}]},
1662ch18_family_photo:{text:`<p>林悦家客厅的电视柜上有一张全家福——她爸爸妈妈和她。照片上她大概十八九岁的样子扎着马尾辫笑得没心没肺。你站在那张照片前看了很久。她走过来站在你旁边:「那时候刚考上大学。我妈非要拉我去拍的。」你说:「你跟现在差不多。」她说:「老了。」你说:「没有。」她看了你一眼:「你嘴怎么这么甜。」你说:「跟你学的。」</p>`,choices:[{t:'😊 真好',next:'ch18_after'}]},
1663 ch18_dad_talk:{text:`<p>临走的时候林悦爸爸送你到门口。你拍了拍你的肩膀力气不小。你站直了看着他。你说——「小林从小被我惯坏了。她有什么不好的地方你多担待。」你说:「叔叔她没有什么不好的地方。」你看了你一眼然后笑了——「你小子会说话。」你笑了笑:「叔叔我不是会说话。我是真心的。」你点了点头:「行了。以后常来吃饭。」你走出门的时候觉得今天的风都是暖的。</p>`,choices:[{t:'😊 回家',next:'CHAPTER_COMPLETE'}]},
1664ch18_mom_call_spring:{text:`<p>见完林悦父母的第二天你妈妈打电话来了。「儿子!小林她爸妈对你印象怎么样?」你说挺好的。你妈说那你什么时候带她回家。你说春节吧。你妈在那头开心得连声说好。挂了电话之后你坐在沙发上。春节带她回家——想到这个的时候心里是暖的。</p>`,choices:[{t:'☎️ 打完电话',next:'CHAPTER_COMPLETE'}]},
1665ch18_farewell:{text:`<p>第一次见完家长你们走在小区的路上。路灯把你们的影子拉得很长又很短——每经过一盏路灯,影子就变一次形状。你问她:「你爸妈对我印象怎么样?」她说:「还行吧。」你说:「还行是多少分?」她说:「八十五。」你问扣的十五分在哪。她想了想说:「你喝茶的时候端杯子的姿势不太对——我妈觉得你没有茶道修养。」你愣住了——「你妈还看端杯子的姿势?」她笑了:「骗你的。我妈说你挺好的。」你松了一口气——然后意识到她在逗你。</p>`,choices:[{t:'😄 回家',next:'CHAPTER_COMPLETE'}]},
1666ch18_family_talk:{text:`<p>吃完饭之后你帮林悦妈妈收拾桌子。她在厨房里洗碗你站在旁边擦碗。她问你——「你们在一起多久了?」你说两年多了。她点了点头然后说:「小林这孩子从小主意大,她认定了的事九头牛都拉不回来。」你笑了笑说知道。她沉默了一会儿然后说:「她认定了你。」你手里的碗停了一下。然后你继续擦碗。你听到自己说了一句:「阿姨,我也是。」她看了你一眼。笑了。</p>`,choices:[{t:'😊 洗完了',next:'ch18_after'}]},
1667ch18_linyue_room:{text:`<p>吃完饭林悦带你参观了她的房间。墙上贴着几张电影海报,书架上满满都是书。你看到了一本《设计心理学》和一本《JavaScript高级程序设计》。你问她这两本书是怎么放在一起的。她说——「设计和代码是一样的。都是解决问题。」你在她的书架前站了一会儿。你发现她书架上的很多书你都没看过。你想了想自己书架上的书——全是技术的。你觉得自己应该多看一点别的东西。</p>`,choices:[{t:'📚 好品味',next:'ch18_after'}]},
1668ch18_family_feeling:{text:`<p>从林悦家回来的那天晚上你躺在床上,脑子里一直回放着饭桌上的画面。她爸爸给你倒酒、她妈妈给你夹菜、她全程假装不在乎但其实一直注意着你。你拿起手机给她发了一条消息:「你爸妈挺好的。」她秒回:「那当然。我爸妈。」然后过了十秒又发了一条:「那你觉得我怎么样?」你看着那条消息,心跳漏了一拍。你打了几个字又删了。最后你回了一句:「你更好。」</p>`,choices:[{t:'😊 睡觉',next:'CHAPTER_COMPLETE'}]},
1669ch18_prep:{text:`<p>周五晚上你在家里来回踱步。明天要去见林悦的父母。你已经在脑子里排练了无数次见面场景——敲门、问好、坐下、聊天。但每次排练到「坐下」之后的部分,你的大脑就一片空白。</p><p>你打开手机查了一下「第一次见女方家长注意事项」。搜索结果列出了几十条:带礼物、主动帮忙做家务、少说话多笑……你越看越紧张。林悦打来视频电话,看到你一脸焦虑的样子笑了:「你干嘛呀?我爸妈又不是老虎。」你说:「比老虎可怕。」她笑出了声。</p>`,choices:[{t:'😅 准备礼物',next:'ch18_gift'}]},
1670 ch18_gift:{text:`<p>周六早上。你站在超市的茶叶区,面对着几十种茶叶陷入了选择困境。铁观音、龙井、大红袍、普洱……你拍了张照片发给林悦。她回了一个哭笑不得的表情:「你买普洱吧,我爸喜欢。」你如获至宝,拿起一盒普洱去了收银台。</p><p>然后又去了水果区买了一篮水果。又觉得少了点什么。最后在花店买了一束花——康乃馨,送给她妈妈的。你拎着三样东西站在她家楼下的时候,觉得自己像一个要去参加高考的学生。</p>`,choices:[{t:'🚪 上楼',next:'ch18_meet_parents'}]},
1671 ch18_meet_parents:{text:`<p>开门的是林悦妈妈。一个五十多岁的阿姨,短发,戴着眼镜,笑起来跟林悦很像。你赶紧鞠了一躬:「阿姨好!」她把门拉开了一些:「哎呀快进来快进来。小林说你今天要来,我一大早就去买菜了。」</p><p>你换了拖鞋走进客厅。林悦爸爸坐在沙发上,戴着老花镜在看报纸。看到你进来,你放下报纸,上下打量了你一下:「来了?坐。」你在沙发上坐下来,腰挺得笔直。林悦从厨房里探出头来冲你挤了挤眼睛。</p>`,choices:[{t:'😊 坐下聊天',next:'ch18_dinner'}]},
1672 ch18_dinner:{text:`<p>饭桌上摆了七八个菜。红烧排骨、清蒸鲈鱼、蒜蓉西兰花、番茄蛋汤……林悦妈妈说:「也不知道你爱吃什么,随便做了几个。」你说:「太多了阿姨,吃不完。」她笑着给你夹了一块排骨:「那就多吃点。你看你瘦的。」</p><p>林悦爸爸开了一瓶白酒,给自己倒了一杯,又问你:「能喝吗?」你说「一点点」。你给你倒了一个杯底:「意思意思就行。」喝了一口之后你的话匣子就打开了。聊你的工作——你在国企干了大半辈子——聊北京的房价——「你们年轻人不容易啊」——聊林悦小时候——「她小时候可皮了,上树掏鸟窝摔下来,哭着回家找她妈。」你忍不住看了林悦一眼。她正在低头吃饭,耳根是红的。</p>`,choices:[{t:'😄 多听少说',next:'ch18_after'}]},
1673 ch18_after:{text:`<p>吃完饭你主动帮忙收拾碗筷。林悦妈妈拦了你三次,你坚持洗了碗。她站在厨房门口看着你刷碗,回头冲林悦说了一句:「这个小伙子不错。」你假装没听到,但嘴角已经翘起来了。</p><p>从她家出来的时候天已经黑了。你们走在小区里。林悦问你感觉怎么样。你说:「你爸酒量不错。」她笑了:「他今天只喝了两杯,平时至少半斤。」你愣了一下:「那他今天是给我面子了?」她笑而不语。你抬头看了看她家的窗户——灯还亮着。你心里有一种很踏实的感觉。</p>`,choices:[{t:'🏠 回家',next:'CHAPTER_COMPLETE'}]},
1674ch18_start:{text:`<p>过年了。你要带林悦回老家。</p><p>高铁上。车窗外的华北平原披着一层薄薄的雪,麦田在雪下面露出浅浅的绿色。林悦坐在靠窗的位置,但她的心思显然完全不在风景上。她已经问了不下二十个问题了——</p><p><span class="good">「你妈喜欢什么颜色?」</span></p><p><span class="good">「我带的这些礼物够不够?还是再买点?」</span></p><p><span class="good">「你爸平时聊什么话题?足球?新闻?还是他只聊你?」</span></p><p><span class="good">「我穿这件会不会太正式了?像个推销保险的?」</span></p><p>你靠在座椅上,看着她紧张的样子觉得有点好笑又有点心疼:「我妈就喜欢你这样的。别紧张。」</p><p>「你当然不紧张。又不是你见我妈!」</p>`,choices:[{t:'🚄 到家了',next:'ch18_home'},{t:'😰 准备去杭州见家长',next:'ch18_prepare'},{t:'⚔️ 代码报错,干它!',next:'__FIGHT__',fx:{"exp":41}}]},
1675 ch18_after_fight:{text:`<p>Bug灰飞烟灭。你关掉电脑。林悦在旁边等你。<br>\"修好了?\"<br>\"修好了。走吧。高铁快赶不上了。\"<br>她笑了笑。挽住你的胳膊。你们一起走出办公室。回家的路上。她一直在紧张地问你妈喜欢什么。你握紧了她的手。告诉她别担心。</p>`,choices:[{t:'🚄 出发回家',next:'ch18_home',fx:{"exp":15,"hp":10}}]},
1676 ch18_home:{text:`<p>你妈站在门口等。看到林悦的第一眼。就笑了。那种发自内心的笑。你妈拉着她的手进屋。桌上已经摆满了一桌菜。比你过年自己回来的时候丰盛三倍。</p>`,choices:[{t:'🍽️ 吃年夜饭',next:'ch18_dinner',fx:{"exp":10,"hp":15}}]},
1677 ch18_dinner:{text:`<p>饭桌上。你妈一直在给林悦夹菜——"多吃点。你太瘦了。"你爸话不多,但一直在笑。林悦表现得很好。礼貌、大方、嘴甜。一口一个"阿姨""叔叔"。把你妈哄得合不拢嘴。</p>`,choices:[{t:'🌙 安排住宿',next:'ch18_after_dinner',fx:{"exp":10,"hp":10}}]},
1678 ch18_night3:{text:`<p>晚上。你妈收拾好客房。铺了新床单。然后说了一句:"客房有点冷。要不你们俩睡你那屋?"</p><p>你和林悦同时愣住了。</p><p>你妈装作若无其事地走开了,但你分明看到她嘴角的笑。</p><p>你看向林悦。她的脸红了,但没有反对。</p><p>凌晨三点左右。你被走廊里一阵轻微的脚步声惊醒——不是重到能把人吵醒的那种,是家里有人起夜时那种小心的、尽量不发出声音的脚步。你妈去上了个厕所,回来的时候路过你的房间。门没关严——有一道大概两厘米的缝隙。</p><p>你听到脚步声在你的门口停住了。然后是一阵极其轻微的响动——应该是他妈在透过门缝往里看。</p><p>过了大概十秒,脚步声继续往前走,走向主卧。然后你听到你妈压低的声音——她以为自己压得够低了,但老房子的隔音其实没那么好——</p><p><span class="info">「老段。你醒着吗。我跟你说。」</span>顿了顿,带着那种藏都藏不住的笑意,「儿子这次是真的了。」</p>`,choices:[{t:'😳 被发现了……',next:'CHAPTER_COMPLETE',fx:{"exp":20,"hp":20}}]},
1679 ch18_prepare:{text:`<p>见家长这件事比你面试任何一家公司都紧张。林悦家在杭州,父亲是中学老师,母亲是银行职员。</p><p>你准备了茶叶和保健品,换了一身新衣服。站在镜子前转了好几圈:"这样行吗?"林悦在旁边笑:"行,比我爸还像老师。"</p>`,choices:[{t:'🚄 高铁去杭州',next:'ch18_arrive'}]},
1680 ch18_arrive:{text:`<p>高铁上你一直坐立不安。林悦把手搭在你手上:"别紧张,我爸妈人很好的。"</p><p>"你不懂。你爸妈看女儿肯定越来越好。看拐走女儿的臭小子肯定怎么看都不顺眼。"</p><p>到了杭州东站,林悦的父亲开车来接。一个五十多岁的中年男人戴着眼镜。你看了看你点了点头:"上车吧。"</p>`,choices:[{t:'😊 礼貌问好',next:'ch18_dinner'}]},
1681 ch18_after_dinner:{text:`<p>饭后林爸爸关了电视突然说了一句:"小段,我不是不开明的家长。只要你们两个人好好的,我没意见。"</p><p>你愣了一下认真地说:"叔叔,我会对林悦好的。"</p><p>你说完就站起来去书房了。林悦妈妈笑着说:"你叔叔就是嘴硬心软。"你松了一口气。感觉自己通过了人生中最难的一次面试。</p>`,choices:[{t:'🌙 回酒店',next:'ch18_night3'}]}
1682 }
1683 },
1684 {
1685 title: '第十九章 · 最终抉择',
1686 start: 'ch19_start',
1687 scenes: {
1688 ch19_afterword:{text:`<p>这是你的故事。不是英雄的故事。是一个普通人的故事。你没有超能力。你不是天才。你只是在每一次想放弃的时候多坚持了一天。在每一次被诱惑的时候想起了自己真正想要什么。在每一次疲惫的时候有一个人在身边说——「你可以的。」这就是秃然飞升。不是飞升成神。是一个普通人在普通的日子里——一步一步变成了更好的自己。</p>`,choices:[{t:'📖 全篇完',next:'CHAPTER_COMPLETE'}]},
1689ch19_close:{text:`<p>故事的最后——你没有成为什么大神。你没有改变世界。你没有写出一行改变一个行业的代码。但他做了一件更难的事——你坚持下来了。你没有在困难面前逃跑。没有在诱惑面前动摇。没有在疲惫面前放弃。你只是一个普通人。一个每一次都选择了不逃跑的普通人。而正是这些不逃跑的选择——让你走完了这条路。</p>`,choices:[{t:'📖 全书完',next:'CHAPTER_COMPLETE'}]},
1690ch19_end_words:{text:`<p>你留在了银河科技。后来他跟老张一起创业做出了一个服务几万家企业的SaaS产品。再后来他跟林悦结婚了婚礼上老张当了证婚人。老张站在台上说——「段飞是我带过的最好的徒弟。不是因为技术。是因为他从来不逃。」台下鼓掌的时候你看到了林悦在笑。你也笑了。这就是你的故事——一个普通人的飞升之路。不是靠天赋是靠不逃跑。</p>`,choices:[{t:'📖 全剧终',next:'CHAPTER_COMPLETE'}]},
1691ch19_end_title:{text:`<p>很久以后有人问你——你后不后悔当年没去那家大厂。你想了想说不后悔。为什么?你想了想说——「因为我在对的地方遇到了对的人做了对的事。」那你的故事是什么样的?你说——「一个普通人。做了一些普通的决定。然后过上了不普通的生活。」这就是秃然飞升的故事。不是关于飞升成神。是关于一个年轻人一步一步找到了自己的路。</p>`,choices:[{t:'📖 故事完结',next:'CHAPTER_COMPLETE'}]},
1692ch19_future:{text:`<p>拒绝了offer之后的某天晚上你躺在床上。林悦已经睡着了呼吸很轻很均匀。你转过头看着她的侧脸。月光透过窗帘洒进来在她的轮廓上镀了一层银色的边。你想起这一路走来的每一步——面试那天在电梯里撞到她、入职第一天她帮你装Docker、她带你去吃那家烤串、团建时在篝火旁拍立得的闪光灯、吵架后她在楼下等你、年会舞池里她握着你的手。你轻轻地说了一句——「谢谢。」她没听到。但没关系。你知道就好。</p>`,choices:[{t:'😴 晚安',next:'CHAPTER_COMPLETE'}]},
1693ch19_steady_life:{text:`<p>拒绝offer之后的生活回归了日常。每天早上刷卡进公司前台姑娘跟你打招呼。你走到工位打开电脑开始一天的工作。你不再急于证明自己了。你知道自己值多少钱——不是薪资数字决定的。是你建的每一个系统、你带出来的每一个开发、你解决过的每一个问题决定的。</p>`,choices:[{t:'💻 开工',next:'CHAPTER_COMPLETE'}]},
1694ch19_peace:{text:`<p>拒绝了offer之后的日子跟以前没什么两样。你还是每天写代码、开会、带团队。不一样的是你不再看招聘信息了。有一天你下班的时候在公司楼下碰到林悦。她刚下班。你们一起走了一段路。秋天的风吹过来,地上的落叶被卷起来又放下。她说——「你今天看起来心情不错。」你说:「嗯。想通了一些事。」她没追问。她只是挽住了你的胳膊。你们一起走进了北京的夜色里。</p>`,choices:[{t:'🌃 回家',next:'CHAPTER_COMPLETE'}]},
1695ch19_why_stay:{text:`<p>拒绝了大厂offer之后老张问你为什么。你坐在你的办公室里。窗外是北京的中关村。你说——「我刚来的时候什么都不会。是这个地方教会了我写代码、教会了我解决问题、教会了我怎么跟人合作。我在这里找到了我想做的事情。」你停了一下。「还有我想在一起的人。」老张听完之后喝了一口茶。然后他说了一句——「你小子。成熟了。」</p>`,choices:[{t:'😊 继续干',next:'CHAPTER_COMPLETE'}]},
1696ch19_lin_voice:{text:`<p>你发了那封拒绝的邮件之后,林悦给你打了一个电话。没有寒暄。她在电话里说了一句话——「我下楼了。你下来。」你愣了一下然后坐电梯下楼。她站在公司门口的台阶上,穿着那件白色的卫衣。北京的秋风吹着她的头发。看到你出来她笑了。你走过去站在她面前。她没说话。她伸出手握住了你的手。她的手有点凉。你握紧了。你们就那样站在公司门口,谁也没说话。但你知道你做了对的选择。</p>`,choices:[{t:'😊 一起走',next:'CHAPTER_COMPLETE'}]},
1697ch19_final_decision:{text:`<p>你发了那封邮件。拒绝了大厂offer。你关掉邮箱,靠在椅背上。窗外的阳光洒在桌上,键盘上落了一层细细的光。你拿起手机给林悦发了三个字:「我留了。」</p><p>她过了一分钟回了四个字:「我知道的。」</p><p>你又发了一条:「你怎么知道?」</p><p>她回:「因为你从来没走过。」</p>`,choices:[{t:'😊 继续',next:'CHAPTER_COMPLETE'}]},
1698ch19_offer2:{text:`<p>第二份offer来了。这次不是猎头打来的——是CTO直接给你发的微信。一家头部互联网公司,职位是技术总监。薪资翻了三倍。对方甚至说:「你什么时候能入职?越快越好。」</p><p>你盯着那条微信看了一整个下午。翻了三倍的薪资。头部平台。技术总监的title。你职业生涯里可能只有一两次这样的机会。但你知道接下它意味着什么——离开银河科技,离开老张,离开你自己亲手搭建起来的团队。</p>`,choices:[{t:'😐 认真考虑',next:'ch19_choice'}]},
1699 ch19_choice:{text:`<p>你坐在办公室里,把两份offer摆在桌面上——一份是头部大厂的技术总监,薪资诱人;另一份是留下,继续带着团队做你们的产品。</p><p>你给老张打了个电话。你听完沉默了一会儿:「段飞,我不替你选。但我可以告诉你——你去大厂能学到很多东西,也能赚更多钱。但你留在这里,你在建的东西是你自己的。」</p><p>你挂了电话,坐在办公室里看着窗外中关村的日落。太阳正在落山,但你知道明天它还会升起来。</p>`,choices:[{t:'🤔 再做决定',next:'ch19_final'}]},
1700 ch19_talk_linyue:{text:`<p>晚上你约了林悦。你们坐在公司楼下那家烤串店里。你把两份offer都跟她说了。她听完之后没有马上说话,喝了一口北冰洋。</p><p>「你问我意见吗?」</p><p>「嗯。」</p><p>她放下瓶子:「我在你身上看到过一种东西。你写代码的时候、你搞定一个Bug的时候、你帮新同事解决问题的时候——你眼睛里有光。不管你在哪家公司,别让那个光灭了。」</p><p>你看着她的眼睛。烤串店的灯光昏黄,她的眼睛很亮。</p>`,choices:[{t:'😊 我知道了',next:'ch19_final'}]},
1701 ch19_final:{text:`<p>你在阳台上站了很久,手里端着一杯凉了的茶。你想起这一路走来的每一个画面:隔断间里的风扇声、面试电梯里撞到林悦的那一刻、第一行上线的代码、第一次线上事故后老张说「回滚得快」、王姐给你转正通知时那张平静的脸、团建篝火晚会上林悦坐在你旁边的温度。</p><p>你走回屋里。打开电脑,打开了那份offer邮件的回复框。你敲了几个字。然后你点了发送。你做了自己的选择。</p>`,choices:[{t:'😤 决定了',next:'CHAPTER_COMPLETE'}]},
1702ch19_start:{text:`<p>公司越来越大。你站在一个十字路口是继续把公司做大,还是放慢脚步回归生活?</p><p>那天晚上。你坐在阳台上。看着城市的灯火。林悦走出来。在你旁边坐下。递给你一杯热茶。</p><p>"在想什么?"</p><p>"在想。接下来怎么走。"</p><p>她靠在你肩膀上:<span class="good">"不管你怎么选。我都支持你。"</span></p>`,choices:[{t:'🚀 继续奋斗。把公司做到上市',next:'ch19_work'},{t:'🏠 放慢脚步。回归家庭',next:'ch19_home2'},{t:'📧 收到大厂offer',next:'ch19_offer'},{t:'⚔️ 遇到Bug,先打一架',next:'__FIGHT__',fx:{"exp":43}}]},
1703 ch19_after_fight:{text:`<p>Bug被你消灭了。你靠在阳台的椅背上。吹着晚风。林悦坐在你旁边。递给你一杯热茶。<br>\"修完了?\"她问。<br>\"嗯。最后一个Bug。\"你接过茶。握着她微凉的手——\"以后的日子。该好好想想怎么走了。\"</p>`,choices:[{t:'🚀 继续奋斗',next:'ch19_work',fx:{"exp":25,"hp":10}}]},
1704 ch19_work:{text:`<p>你选择了继续拼。公司进入了快速扩张期。你比任何时候都忙,但不管多晚回家。客厅的灯总是亮着。桌上总有热着的饭菜。</p>`,choices:[{t:'💪 继续前行',next:'CHAPTER_COMPLETE',fx:{"exp":80}}]},
1705 ch19_home2:{text:`<p>你选择了放慢脚步。把CEO的位置交给了老张。自己退居技术顾问。你有了更多的时间。陪她看想看的电影。去想去的地方。做想做的事。</p>`,choices:[{t:'🏠 过平凡的日子',next:'CHAPTER_COMPLETE',fx:{"exp":60}}]},
1706 ch19_offer:{text:`<p>一封邮件打破了平静的生活。一家知名大厂想挖你去做技术总监。薪资翻倍,期权若干。</p><p>你看着邮件心跳有点快。大厂的光环、翻倍的薪资。这些曾经做梦都想要的东西,但你真的拿到了你却犹豫了。你合上电脑靠在椅背上,窗外是北京秋天的蓝天。</p>`,choices:[{t:'🤔 跟老张聊聊',next:'ch19_talk_zhang'},{t:'💬 问林悦',next:'ch19_talk_yue'}]},
1707 ch19_talk_zhang:{text:`<p>你约老张在公司楼下咖啡厅坐了一会儿,把邮件给你看了。老张看完沉默了一会儿把手机推回来:"你走吧。"</p><p>你愣住了。"我不是赶你走。如果这是对你最好的选择,你走吧。公司没有你也活得下去。我已经不是你刚认识的那个老张了。"你笑了笑。</p>`,choices:[{t:'😔 让我想想',next:'ch19_talk_yue'}]},
1708 ch19_talk_yue:{text:`<p>晚上回到家你跟林悦说了这件事。她安静了一会儿问你:"你开心吗?在现在的公司。"</p><p>你想了想:"开心。虽然累但开心。"</p><p>"那现在做的事有意义吗?"</p><p>"有。看到客户用我们的产品我觉得很有意义。"</p><p>"那不就够了?大厂工资再高你不开心有什么用?"</p>`,choices:[{t:'❤️ 你说得对',next:'ch19_decision'}]},
1709 ch19_decision:{text:`<p>你坐在书房里把那封邮件又看了一遍。你想起了当年吃泡面的自己,想起了老张在大排档说"我要创业了"的那个晚上,想起了通宵优化服务器的夜晚。</p><p>你拿起手机给那位HR回了消息:<span class="mono">"感谢您的邀请,但我在这边还有未完成的事。祝好。"</span></p><p>发完之后老张在群里发了一条:<span class="info">"听说某人拒绝了大厂offer?今晚我请客。"</span>你笑了。你知道自己做对了选择。</p>`,choices:[{t:'🍻 吃老张一顿',next:'ch19_home2'}]}
1710 }
1711 },
1712 {
1713 title: '终章A · 飞升成神',
1714 start: 'endA_start',
1715 scenes: {
1716 endA_start:{text:`<p>十年。</p><p>你的公司没有敲钟上市。但你做了一件更酷的事——你们把一个传统行业的SaaS产品做成了AI原生的智能平台。不是什么炫酷的大模型——是一个帮几万家小企业自动处理审批、报销、考勤的AI系统。没有改变世界。但实实在在地帮几十万个普通员工每天少加了一个小时的班。</p><p>那天你站在公司年会的台上,看着台下五百多个人。十年前你是一个人。现在你是一家五百人公司的CTO。台上大屏幕在滚动数据:服务企业——十二万家。日均AI调用——八百万人次。客户满意度——98.7%。</p><p>你叫老张上台。你头发白了不少,但精神很好。你对着台下说——「这个公司不是我一个人的。是老张在大排档跟我说'要不要一起干'的那个晚上开始的。是一个普通程序员和一个更普通的程序员——在AI时代没有被打败、反而学会了跟AI共舞的故事。」</p><p>台下在鼓掌。你看到第一排——林悦在笑。女儿在玩她的手。爸妈坐得笔直。你看到了很多年前的那个自己——那个在隔断间里写代码、对未来一无所知的少年,大概不会相信有一天你会站在五百人面前说这样的话。</p><p>{fate_summary}</p>{fate_all}{fate_mystery}<p class="special" style="text-align:center;font-size:22px;font-weight:700;margin-top:20px">🌟 秃然飞升 · AI时代 · 完 🌟</p>`,choices:[{t:'🔄 重新开始',next:'__RESET__'},{t:'🗺️ 自由探索',next:'__EXPLORE__'},{t:'📖 AI之路回顾',next:'endA_ai_journey'}]},
1717 endA_ai_journey:{text:`<p>你翻出了公司最早的那个AI功能——智能审批助手的代码。Git历史显示第一次提交是在创业后的第三个月。你打开那个文件——237行Python代码。当年你一行一行手写的。现在看来那代码写得真不怎么样。但它跑起来了,第一次把AI带进了一个传统行业的日常。</p><p>后来你们做了更多。AI报销审核、AI客服、AI数据分析。每一步都是从零开始摸索。没有教科书,没有老师。你们自己就是第一批吃螃蟹的人。</p><p>你想起当初有人问——「你们又不懂AI,凭什么做?」你的回答是——「不懂AI的人才最懂业务。因为我们没有被技术炫花眼,我们只关心客户需要什么。」</p>`,choices:[{t:'🏆 致谢',next:'endA_thanks2'}]},
1718 endA_thanks2:{text:`<p>你在台上讲了最后一段话——</p><p>「我想谢谢一个人。不是投资人。不是合伙人。是十年前在我还什么都不会的时候,带我去吃那碗面的同事。林悦。如果没有她那碗面,我可能撑不过第一周。」</p><p>台下,林悦在擦眼睛。女儿在问妈妈你怎么哭了。她说没事妈妈高兴。</p><p>你继续说——「我还想谢谢AI。不是因为它替我写了多少代码。是因为它逼我思考了一个问题——当机器什么都能写的时候,人的价值是什么。」你停了一下——「我现在有答案了。人的价值不是写更好的代码。是想清楚为什么要写那行代码。」</p><p>掌声响了很久。</p>`,choices:[{t:'📖 终',next:'endA_epilogue2'}]},
1719 endA_epilogue2:{text:`<p>晚上你一个人坐在办公室里。窗外是北京的夜景——跟十年前一样,灯火通明。你打开当年那个老项目的Git日志。最早的commit是八年前的。你一行一行地翻——从第一次搭环境、第一次上线、第一次搞崩线上、第一次带新人……到后来一切都越来越顺。你合上电脑。</p><p>手机亮了。是林悦的消息——「还不回来?女儿等你讲故事呢。」你看着那条消息笑了。你关掉办公室的灯,走出去。走廊的声控灯在你走过后一盏一盏熄灭——跟十年前你在银河科技加班到凌晨时一模一样。但这次你不是去赶末班地铁。你是回家。</p><p class="sys">—— 终章A · 完 ——</p><p class="sys" style="color:#484f58;font-size:12px;margin-top:12px;">🎉 恭喜通关!感谢游玩「秃然飞升 · AI时代」</p>`,choices:[]}
1720 }
1721 },
1722 {
1723 title: '终章B · 安稳生活',
1724 start: 'endB_start',
1725 scenes: {
1726 endB_start:{text:`<p>你没有选择创业。不是因为没有勇气。是因为他清楚地知道自己要什么——一个能在下班后陪她吃饭、周末一起去超市、偶尔出门旅行的工作。一个不被AI时代抛下但也不被它裹挟的生活。</p><p>你留在公司成了技术总监。没有惊天动地的成就。但他做了一件事——在公司第一个把AI落地到日常开发中。你写了一本内部手册《AI时代的程序员工单法》,从prompt工程到AI代码审查到AI辅助设计。后来那本手册被几百人传阅,最后被一家出版社看中出了书。</p><p>周末的时候他会在屋里写书——把AI和程序员的共处之道写下来。林悦在客厅画设计图。阳台上的多肉已经养了好几年了,从一盆变成了八盆。没有什么大富大贵。但有一种在这个时代里站稳了的踏实感。</p><p>{fate_summary}</p>{fate_all}{fate_mystery}<p class="special" style="text-align:center;font-size:22px;font-weight:700;margin-top:20px">🌟 秃然飞升 · 安稳篇 · 完 🌟</p>`,choices:[{t:'🔄 重新开始',next:'__RESET__'},{t:'🗺️ 自由探索',next:'__EXPLORE__'},{t:'📖 AI布道者的日常',next:'endB_ai_day'}]},
1727 endB_ai_day:{text:`<p>周二上午。你在公司做了一场内部分享。话题是——「AI来了,程序员怎么办?」会议室坐满了人,远超你的预期。你站在前面讲了四十分钟——从AI能做什么、不能做什么,到怎么跟AI合作而不是对抗它。</p><p>讲完之后一个年轻的实习生举手问——「段哥,你觉得AI什么时候会取代我们?」你说——「等AI学会问你'这个需求为什么要这样做'的时候,你才需要担心。在那之前——它就是你的超级工具。」</p><p>散场后。老刘走过来——「你这个分享做得好。以后每个月搞一次。」你说好。你回到工位。打开编辑器。Copilot已经开始给你补全下一行代码了。你笑了一下。接受它的建议。然后自己改了两处。</p>`,choices:[{t:'📝 写书',next:'endB_book'}]},
1728 endB_book:{text:`<p>你的书出版了。不是什么畅销书。但行业里口碑不错。有一天你收到一封邮件——一个二本计算机专业的学生写的。「段老师,我读了你的书。我现在也在用AI写代码。我也想成为一个不被时代淘汰的程序员。谢谢你。」</p><p>你坐在书房里把那封邮件读了三遍。然后回了一行字——「加油。你会比我走得更远。」</p><p>你想起很多年前的自己。那个在隔断间里写代码、对未来一无所知的少年。如果当时的你能读到这样一封信——大概也会觉得有希望吧。你合上电脑。走出书房。林悦在客厅喊你吃饭。你走过去。桌上是她做的红烧排骨和你最爱的番茄蛋汤。窗外的北京夜晚灯火通明。</p>`,choices:[{t:'😊 这就是生活',next:'endB_epilogue2'}]},
1729 endB_epilogue2:{text:`<p>很多年以后。有人问你——你后不后悔当年没去创业。你想了想说不后悔。为什么?你说——「因为我在AI时代找到了自己的位置。不是做最厉害的人。是做最踏实的人。」</p><p>那你的故事是什么样的?你笑了笑——「一个普通人的故事。一个在AI浪潮中没有被卷走、也没有被落下的普通人的故事。写了几年代码。写了一本书。爱了一个人。过了一辈子。」</p><p>窗外是北京的秋天。阳光透过银杏树叶洒下来。林悦在阳台上浇花。你坐在书桌前——打开编辑器,开始写今天的第一行代码。跟二十年前一样。又跟二十年前完全不一样。</p><p class="sys">—— 终章B · 完 ——</p>`,choices:[]}
1730 }
1731 },];
1732
1733var DUNGEON_SCENES = [
1734{id:'dun_1', title:'第一次Code Review', minChapter:1, category:'项目跟进', scene: {text: `<p>周三上午,老张在群里@了你:<span class=\"mono\">@你 代码写完了发我review。</span></p><p>你看着自己刚写完的接口代码,检查了三遍。缩进对齐了,变量命名用了驼峰,该加的注释也加了。应该没问题吧?</p><p>你刚把PR链接发出去,老张那边几乎是秒回了一个字:<span class=\"info\">「等。」</span></p><p>你坐立不安地等了十五分钟。期间你假装在写下一段代码,但实际上连一个字符都没打进去。你每隔十秒刷新一次PR页面。</p><p>终于。老张的消息来了。你点开一看。整整十二条评论。你从头看到尾,从尾看到头,脸色逐渐变化。</p><p>第一条评论是:<span class=\"bad\">「这里的判断条件反了。」</span></p><p>你仔细一看。确实反了。</p><p>第二条:<span class=\"bad\">「这里没做空指针判断。如果user是null的话,整个接口会500。」</span></p><p>第三条:<span class=\"bad\">「这个变量名是拼音。换成英文。」</span></p>`, choices: [{t:'😰 老老实实一条一条改', next:'dun_1_fix', fx:{exp:15,money:10}}, {t:'💪 找老张当面请教', next:'dun_1_talk', fx:{exp:20,money:15}}, {t:'😤 有点不服气', next:'dun_1_angry', fx:{exp:5,money:5}}]}, ends: {dun_1_fix:{text:`<p>你深吸一口气,打开IDE,一条一条地改老张的review意见。</p><p>改到第五条的时候,你发现老张说得确实有道理。那块代码如果用户传了特殊字符,数据库就该出问题了。你默默地加上了参数校验。</p><p>改完十二条,你重新提交了PR。老张这次只看了一分钟就回了两个字:<span class=\"good\">「过了。」</span></p><p>你靠在椅背上,长长地呼出一口气。虽然过程有点难受,但你不得不承认。被review过的代码,确实比自己写的干净多了。</p><p>中午吃饭的时候,林悦端着餐盘坐到你对面:<span class=\"good\">\"听说你今天被老张review了十二条?\"</span></p><p>\"你怎么知道?\"</p><p>\"全组都知道了。老张一边看一边在那边自言自语——'嗯,这个新人底子还行,就是经验少了点。'这是你的原话。\"</p><p>你愣一下,\"底子还行\"。从老张嘴里说出来,这居然算是好话了。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_1_talk:{text:`<p>你没有直接改代码,而是拿着电脑去找老张了。</p><p>老张正在喝水,看到你走过来,放下杯子:\"怎么?\"</p><p>\"张哥。有几个地方我不太明白为什么这么改,想当面请教一下。\"</p><p>老张沉默了两秒,然后拉了一把椅子过来:\"坐。\"</p><p>他一条一条地跟你讲。为什么空指针要提前判断、为什么事务要控制粒度、为什么接口要做参数校验。你讲得比评论里写的详细多了。你一边听一边记,笔记本上写了满满两页。</p><p>讲到第八条的时候。旁边工位的小陈探过头来:\"老张你什么时候讲课这么耐心了?\"</p><p>老张瞪了他一眼:\"去去去,写你的代码去。\"</p><p>但你注意到。老张的嘴角好像动了一下。</p><p>全部讲完之后,你回到工位。花了两个小时把所有意见改完。提交——<span class=\"good\">一次通过。</span></p><p>你看着绿色的\"Merged\"按钮,觉得这次学到的比看任何技术书都多。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_1_angry:{text:`<p>你看着那十二条评论,心里有点不服气——\"那个命名只是临时用的\"、\"那个空指针概率很小\"、\"那个性能优化是不是过度设计了\"……</p><p>你在回复框里打了又删、删了又打。最后只回了一条:<span class=\"mono\">「收到,我改一下。」</span></p><p>你改是改了,但心里那股劲儿一直没顺过来。提交之后,你默默戴上耳机开始写下一个功能。</p><p>下午。你写的那个新功能上线了。不到两个小时。报警群弹出一条消息:<span class=\"bad\">「用户反馈提交接口500了!」</span></p><p>你的心猛地一沉。打开日志一看。就是老张评论里说的那个空指针问题。你当时觉得概率小没认真处理,结果用户传了一个空值过来,系统直接崩溃了。</p><p>你手忙脚乱地修好。重新部署。整个过程你的脸都是烫的。</p><p>林悦路过的时候,在你桌上放了一杯奶茶:<span class=\"good\">\"听说你踩坑了?经验+1,别太自责。\"</span></p><p>你把那杯奶茶喝完,默默打开老张的review,把那十二条评论又重新看了一遍。这次看的时候,心态完全不一样了。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1735{id:'dun_2', title:'需求又变了', minChapter:2, category:'项目跟进', scene: {text: `<p>周四下午四点五十分。距离下班还有十分钟。</p><p>你已经写完了本周最后一个需求,正准备合上电脑——</p><p>产品经理Tony突然出现在你工位旁边,脸上挂着那种你太熟悉的笑容了。那种\"我有个好消息也有个坏消息\"的笑容。</p><p>\"你,有个小改动——\"</p><p>你的右眼皮跳了一下。</p><p>\"之前的导出功能,客户说要加一个按时间筛选的条件。\"Tony语速飞快,显然已经练习过很多次了,\"数据量太大,你们只想导最近一个月的。很简单,就在查询条件加一个时间范围的参数就行。\"</p><p>\"这个……不是说好下周才迭代的吗?\"</p><p>\"客户明天要演示给老板看。帮帮忙,今晚加点班?\"</p>`, choices: [{t:'😤 忍了。今晚加班改', next:'dun_2_overtime', fx:{exp:20,money:20}}, {t:'🤝 跟Tony谈条件。延后另一个需求', next:'dun_2_negotiate', fx:{exp:25,money:15}}, {t:'😰 直接拒绝。这周排期满了', next:'dun_2_refuse', fx:{exp:10,money:5}}]}, ends: {dun_2_overtime:{text:`<p>你叹了一口气:\"行吧。我今晚加个班。\"</p><p>Tony双手合十:\"谢谢谢谢!明天请你喝奶茶!\"然后就消失了。像一阵风一样。</p><p>你打开代码,开始改查询接口。表面上看确实只是加一个时间范围参数,但那个导出功能当初用的是存储过程,改起来比预期的麻烦多了。</p><p>你怼着屏幕写到了晚上九点。中间老张下班路过,看了看你的屏幕:\"又改需求?\"</p><p>\"嗯。导出加时间筛选。\"</p><p>老张同情地看了你一眼,拍了拍你的肩膀走了。</p><p>九点半。你终于改完了。测试了一遍。没问题。你提交代码的时候,发现肚子已经饿过了劲儿了。</p><p>你关上电脑,办公区已经没人了。你站起来伸了个懒腰。看到自己桌上不知道什么时候多了一瓶酸奶和一张纸条:<span class=\"good\">\"别太晚。林悦\"</span></p><p>你笑了。喝着那瓶酸奶,觉得今晚加班好像也没那么惨。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_2_negotiate:{text:`<p>你放下键盘,转向Tony:\"我加这个需求没问题,但下周的那个用户权限模块。得往后推两天。\"</p><p>Tony的笑容僵了一下:\"那个……老板说那是个高优先级……\"</p><p>\"那这个时间筛选也是客户要的。\"你摊了摊手,\"总得选一个吧。\"</p><p>Tony纠结了三十秒,最后咬了咬牙:\"行。权限模块往后推两天。我先去跟老板说。\"</p><p>\"成交。\"</p><p>你花了三个小时改完导出功能。虽然加班了,但你心里挺舒服。因为你用这次加班换来了下周的喘息空间。</p><p>第二天站会上,Tony在大家面前说:\"你同学昨晚加班搞定了客户紧急需求,同时我们也调整了排期。大家有需求变更的时候,可以学你。先评估影响,再商量调整。\"</p><p>你愣一下,Tony居然在全组面前表扬了你。坐在对面的林悦冲你眨了眨眼睛。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_2_refuse:{text:`<p>你摇了摇头:\"Tony,这周的排期已经满了。这个功能放在下个迭代吧。\"</p><p>Tony脸上的笑容消失了:\"可是客户明天就要演示了……\"</p><p>\"那你可以用旧版本演示。或者。你提前跟客户说清楚,这个功能在下个版本上线。\"你语气很平静但很坚定。</p><p>Tony张了张嘴,最后无奈地点了点头:\"行……我去沟通。\"</p><p>Tony走后,旁边工位的小陈探过头来:\"牛啊兄弟,敢拒绝产品经理的要求。\"</p><p>\"排期满了就是满了。\"你说,\"硬接的话,质量出了问题更麻烦。\"</p><p>第二天——Tony在群里发了一条消息:<span class=\"info\">「客户那边沟通好了。导出功能下个迭代上线。」</span></p><p>你看到消息,心里踏实了。有时候说\"不\",比硬撑着说\"行\"更负责任。</p><p>但下午的时候。你听到老张在茶水间跟别人说:\"你这小子,学会管理需求了。有进步。\"</p><p>你端着水杯站在门口,默默转身走了。嘴角没压住。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1736{id:'dun_3', title:'线上日志排查', minChapter:3, category:'项目跟进', scene: {text: `<p>周五下午三点。你正写代码写得起劲。</p><p>突然。报警群炸了。</p><p class=\"bad\">「【告警】订单接口P99延迟超过3秒!」<br>「【告警】错误率上升至5%!」</p><p>你的心跳猛地加速。你放下手里的活,打开监控面板。订单接口的响应时间在最近十分钟内从200ms飙升到了3秒以上。</p><p>老张在群里@了你:<span class=\"mono\">@你 看日志。</span></p><p>你打开日志系统。几千行日志像洪水一样涌过来——ERROR级别的、WARN级别的、INFO级别的。密密麻麻,完全不知道从哪里看起。</p><p>你需要在这堆日志里找到导致问题的原因。</p>`, choices: [{t:'🔍 从最近的ERROR日志开始查', next:'dun_3_error_log', fx:{exp:20,money:15}}, {t:'📊 先看监控面板找异常模式', next:'dun_3_monitor', fx:{exp:25,money:20}}, {t:'🏃 先回滚再查', next:'dun_3_rollback', fx:{exp:15,money:10}}]}, ends: {dun_3_error_log:{text:`<p>你沉住气,在日志系统里输入了过滤条件:<code>level:ERROR</code>。</p><p>三千多条ERROR日志被筛了出来。你从最新的一条开始往上看。大多数的报错都是数据库连接超时。你又往上看。在超时出现之前,有一条异常引起了你的注意:</p><p class=\"bad\">ORA-00060: deadlock detected while waiting for resource</p><p>死锁。你打开代码,找到对应的那个事务方法。发现有两个并发的操作在同一个表上持有了相反的锁顺序。</p><p>你赶紧写了一个hotfix。调整了锁的顺序。然后让运维重启了服务。</p><p>监控面板上的数字开始回落。错误率从5%降到了0.1%,响应时间从3秒回到了200ms。</p><p>你松了一口气。老张在群里发了一条:<span class=\"good\">「问题定位很快。不错。」</span></p><p>关掉电脑的时候。你发现自己的后背都是汗,但心里有一种奇异的满足感。那种从一堆乱麻里找到线头的感觉,比写一百行代码都爽。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_3_monitor:{text:`<p>你没有急着翻日志,而是先打开了监控面板。看CPU、内存、数据库连接数、磁盘IO的各项指标。</p><p>数据库连接池的曲线引起了你的注意。在问题发生前的几分钟,连接数突然从峰值跌到了接近零,然后又猛冲到满额。这不是正常的曲线。像是连接被全部断开又重新建立。</p><p>你切到数据库的服务器日志。果然。在连接数暴跌的时间点,数据库发生过一次自动重启。</p><p>你找到运维确认——DBA在几分钟前做过一次参数调整,触发了数据库的重启。重启后,连接池里的一些长连接没有自动重连成功,导致大量请求排队等待新的连接。响应时间就上去了。</p><p>解决方案很简单。在连接池配置里加上连接有效性检查和自动重连。你又写了一个脚本确保数据库变更前通知开发团队。</p><p>问题解决了之后。老张专门走过来:<span class=\"good\">\"不看日志先看监控。这个思路对。\"</span></p><p>来自老张的肯定。比发奖金还让人高兴。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_3_rollback:{text:`<p>你先做了最稳妥的选择。回滚最近一次上线。不管问题是什么原因,先把服务恢复到正常状态再说。</p><p>回滚操作很顺利。三分钟后,报警群安静了。错误率和响应时间都恢复了正常。</p><p>然后你开始排查。对比回滚前后的代码差异。很快你发现了问题所在。这次上线引入了一个新的查询,联了五张表,但其中一张表没有加索引,数据量大的时候查询变成了全表扫描,拖垮了整个数据库连接池。</p><p>你加上索引、重新上线。一切正常。</p><p>这次的经验让你养成了一个习惯:每次上线前,都要检查新SQL的执行计划。因为一个没有索引的查询,就可能让整个系统崩掉。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1737{id:'dun_4', title:'技术方案评审', minChapter:4, category:'项目跟进', scene: {text: `<p>周一早上。王姐在群里发了一条消息:<span class=\"mono\">@你 下周的"用户积分系统"你做一下技术方案,周三评审。</span></p><p>你盯着屏幕。这是你第一次独立负责技术方案设计。以前都是老张画好架构图,你负责落地执行,但这次得你自己从零开始写了。</p><p>你打开一个空白文档,光标在屏幕上闪了半天。一个字都没写出来。</p><p>你打开浏览器,看了几个竞品的设计思路,又翻了翻公司现有的技术文档,还去问了问前端同学接口需要什么格式……</p><p>一天下来。你的文档里只有三行标题和一行字:<span class=\"mono\">「1. 需求分析 2. 技术架构 3. 数据模型」</span></p>`, choices: [{t:'🤔 先做需求分析再画架构', next:'dun_4_analyze', fx:{exp:25,money:20}}, {t:'💡 参考老张之前写的方案模板', next:'dun_4_template', fx:{exp:20,money:25}}, {t:'🙋 找老张请教怎么写方案', next:'dun_4_ask_mentor', fx:{exp:30,money:15}}]}, ends: {dun_4_analyze:{text:`<p>你决定从需求分析开始。你把产品经理Tony拉到一个会议室里,花了两个小时把用户积分系统的每一个功能点都过了一遍。</p><p>\"积分怎么获得?消费、签到、分享、邀请好友?\"</p><p>\"积分怎么消耗?兑换商品、抵扣金额、参与活动?\"</p><p>\"有效期多长?年底清零还是滚动过期?\"</p><p>Tony被你问得满头大汗,但也把需求理清楚了。有些之前连你自己都没想明白的地方。你在笔记本上记了满满五页。</p><p>回到工位,你感觉思路清晰多了。你按照功能模块画出架构图。积分服务、用户服务、商品服务、消息通知。每个模块的职责和接口都标得清清楚楚。</p><p>周三评审会上。你打开文档,从头到尾讲了一遍。讲完之后,会议室安静了几秒。</p><p>老张先开口了:<span class=\"good\">\"这个方案。比我预想的好。\"</span></p><p>王姐点了点头:<span class=\"good\">\"需求梳理得很清楚,架构设计也合理。按这个做吧。\"</span></p><p>你合上电脑的时候。手心里全是汗,但心里充满了成就感。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_4_template:{text:`<p>你打开公司的文档库,找到了老张之前写的一份技术方案模板。那是一份旧项目的架构设计文档。结构清晰、逻辑严密、每一部分都有清晰的结论和理由。</p><p>你没有直接照着抄。而是研究了它的结构:背景、目标、技术选型、架构设计、数据模型、接口设计、风险与应对……每一部分都回答了一个核心问题。</p><p>你按照这个结构开始填充自己的内容。写到技术选型的时候。你有些犹豫:用MySQL还是PostgreSQL?用消息队列还是直接RPC?</p><p>你列了一个对比表格。每个选项的优缺点、适用场景、团队熟悉度。然后做出了选择。</p><p>周三评审会上。你打开方案,按结构一条条讲解。讲到技术选型的对比表格时。王姐打断了你:<span class=\"good\">\"这里做得不错。有理有据,不是拍脑袋选的。\"</span></p><p>评审结束的时候。你的方案只改了两处小细节就通过了。你收拾电脑的时候心想。有一个好的模板,比自己瞎摸索强太多了。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_4_ask_mentor:{text:`<p>你拿着一个空文档和满脑子的问题,去找了老张。</p><p>\"张哥。我第一次写技术方案。不知道从哪里下手。\"</p><p>老张看了你一眼,放下手里的键盘。你打开自己的一个旧项目文件夹,翻出一个文档扔给你:<span class=\"info\">\"你看看这个。\"</span></p><p>那是他三年前写的一份方案。从背景到架构到风险评估,写得非常规范。你说:\"写方案不是为了展示你技术多牛,是为了让别人看懂你的思路。先讲清楚要解决什么问题,再说怎么解决。\"</p><p>你恍然大悟。回到工位后。你按照这个思路重新梳理:先写业务背景和核心目标,再一步步展开技术方案。写完之后又去找老张过了一遍。</p><p>老张看了之后:<span class=\"good\">\"可以了。评审的时候自信点。\"</span></p><p>评审会上。虽然你还是有点紧张,但方案本身得到了大家的认可。王姐说了一句让你印象很深的话:<span class=\"good\">\"方案写得好的本质,是思路清晰。你这个方案,思路是清楚的。\"</span></p><p>你偷偷看了老张一眼。你正低头喝茶,但你能感觉到你在笑。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1738{id:'dun_5', title:'版本发布之夜', minChapter:5, category:'项目跟进', scene: {text: `<p>周五。版本发布日。</p><p>这一次的版本有五个新功能、十几个Bug修复。是你入职以来参与的最大一次发布。</p><p>下午五点。代码冻结。你把最后一个commit push上去,在群里发了一条消息:<span class=\"mono\">「代码已合并,等待测试验证。」</span></p><p>测试小陈跑了半个多小时。然后群里冒出两条消息:<span class=\"good\">「核心功能测试通过。😊」</span>紧接着——<span class=\"bad\">「边缘case有两个小问题。不影响主流程,建议下个迭代修。」</span></p><p>你松了一口气。不影响发布。</p><p>但就在这时。产品经理Tony突然在群里说话了:<span class=\"mono\">@你 刚才客户说。那个导出功能的数据格式要从CSV改成Excel。能加一下吗?</span></p><p>群里安静了。你看着那条消息,深呼吸了三下。</p>`, choices: [{t:'🛑 拒绝。发布前不加新改动', next:'dun_5_refuse', fx:{exp:25,money:20}}, {t:'🤔 评估一下风险再决定', next:'dun_5_evaluate', fx:{exp:20,money:25}}, {t:'😤 咬咬牙加了。客户重要', next:'dun_5_add', fx:{exp:15,money:30}}]}, ends: {dun_5_refuse:{text:`<p>你深吸一口气,在群里回复:<span class=\"mono\">「Tony,代码已经冻结了。这个改到下一个迭代吧。」</span></p><p>Tony又发了一条:<span class=\"info\">「就改一个格式。很快的。」</span></p><p>你回复:<span class=\"mono\">「格式虽然看起来简单,但涉及到数据序列化、测试用例更新、兼容性验证。改动范围比你想的大。下个迭代我给你排第一优先级。」</span></p><p>群里沉默了一会儿。然后Tony回了一个字:<span class=\"info\">「好吧。」</span></p><p>晚上八点。正式发布。你盯着部署进度条——100%。一切正常。</p><p>你刷新页面。所有功能都在。测试验证通过。你合上电脑的时候。觉得拒绝了那个临时的需求变更,比加了一百行代码更有成就感。</p><p>周一早上——Tony给你带了一杯咖啡:<span class=\"good\">\"周末我想了一下。你说得对。发布前改需求确实风险大。下次我提前一周把需求定下来。\"</span></p><p>你接过咖啡,笑着点了点头。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_5_evaluate:{text:`<p>你没有直接答应也没有直接拒绝。你先评估了一下。</p><p>你打开代码,看了看导出模块的实现。原本的输出格式是一个通用的序列化方法,CSV和Excel的差别主要在格式封装层。如果封装得好的话。可能只需要改一个适配器。</p><p>你花十五分钟看了一下代码结构。发现确实可以加一个格式选项,但你也在评估里发现了三个风险点:</p><p>1. Excel格式需要引入一个新的第三方库<br>2. 大文件导出时Excel的内存占用比CSV高<br>3. 现有测试用例需要补充</p><p>你在群里发了一条:<span class=\"mono\">「风险如下:1. 需要引入新依赖;2. 大文件场景可能有OOM风险;3. 测试需要补充。如果今天上线的话,只能做个基础版本。大文件导出和边界case后续优化。OK吗?」</span></p><p>Tony回复:<span class=\"info\">「OK。今天只要能用就行!」</span></p><p>你花了四十分钟改完。测试通过。赶上了发布窗口。虽然累了一点,但你通过评估把风险控制在了可接受范围内。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_5_add:{text:`<p>你咬了咬牙:\"行。我加。\"</p><p>你打开代码开始改,但很快发现事情没那么简单。那个导出模块是祖传代码。输出格式写死在了一个巨大的if-else分支里。你要加Excel格式,不仅要改输出层,还得动数据处理层。</p><p>你埋头改到了晚上九点。发布窗口已经过了。你只能走紧急发布流程。</p><p>改完、测试、上线。一切总算搞定了,但你累得连话都不想说。</p><p>回家的地铁上。你想了想今天的事。需求确实满足了客户,但你也付出了代价。错过了正常发布窗口、加班到很晚、改动没有经过充分的测试。</p><p>你给自己定了一条规矩:以后发布当天。不管需求看起来多"小"。一律不接。</p><p>这条规矩后来帮你在无数次发布中避免了线上事故。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1739{id:'dun_6', title:'跨部门撕需求', minChapter:6, category:'项目跟进', scene: {text: `<p>周二的跨部门需求对齐会。是你最讨厌的会议之一。</p><p>运营部提了一个需求:要在用户列表页加一个批量发送消息的功能。听起来很简单,但你看了看邮件里附的需求文档,眉头越皱越紧。</p><p>会议室里。运营主管小李正眉飞色舞地描述着她的想法:\"就像微信群里@所有人那种感觉。点一下,选一批用户,发一条消息,你们就都能收到通知。\"</p><p>你翻到了需求的第7页。看到了一个被你标注了红色问号的地方:<span class=\"bad\">「日发送量:预计10万条」</span></p><p>\"等一下——\"你举手,\"小李。你预计的日发送量是10万条,但我们现在整个消息队列的日吞吐量也就8万。单这一个需求就要把队列打满?\"</p><p>会议室的气氛一下子紧张了起来。</p>`, choices: [{t:'📊 拿出数据说话。分析现有容量', next:'dun_6_data', fx:{exp:30,money:25}}, {t:'🤝 提出折中方案。分批次、限频率', next:'dun_6_compromise', fx:{exp:25,money:30}}, {t:'😤 硬刚。直接说做不了', next:'dun_6_refuse', fx:{exp:15,money:15}}]}, ends: {dun_6_data:{text:`<p>你打开自己提前准备好的数据图表。投到会议室的屏幕上。</p><p>\"这是当前消息队列的日吞吐量曲线。峰值在晚上八点到十点,日均有8万条。\"你指了指图表中那条几乎满负荷的线,\"如果在这个基础上再加10万条。队列必然会堆积。用户发消息的延迟会从现在的秒级变成分钟级。\"</p><p>小李的表情变了:\"那……那怎么办?客户那边已经答应了这个功能……\"</p><p>\"先别急——\"你翻到下一张PPT,\"我建议的方案是。消息队列能力扩容。目前集群是三节点,加到五节点可以把吞吐量提升到20万,但扩容需要运维配合,排期大概一周。\"</p><p>小李松了一口气:\"那可以。我跟客户说一周后上线。\"</p><p>会后方姐在走廊里碰到你:<span class=\"good\">\"你,你今天准备得很充分。不是光说不行。还带了方案。这个态度很好。\"</span></p><p>你笑了笑。心里想的是:周末两天没白加班准备这些数据。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_6_compromise:{text:`<p>你合上电脑,转向小李:\"一次性发10万条。系统扛不住,但我们可以换个思路。\"</p><p>你打开白板开始画:</p><p>\"第一。分批次发。每次发5000条,间隔十分钟。一天分二十批发完。这样队列的压力是平稳的。\"</p><p>\"第二。加频率限制。同一个用户,一天最多收五条批量消息。防止运营过度推送导致用户投诉。\"</p><p>\"第三。加一个定时发送功能。运营可以提前设定发送时间,系统在低峰期自动发送。\"</p><p>小李听着听着。眼睛亮了:\"这个方案比我想的还好!\"</p><p>\"那我就按这个排期了。分批发送+频率限制+定时功能。开发大概两周。\"</p><p>\"没问题!\"</p><p>走出会议室。你发现自己其实挺喜欢这种感觉的:把业务需求翻译成技术方案,用技术能力帮业务方找到更好的解决路径。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_6_refuse:{text:`<p>\"这做不了。\"你脱口而出。</p><p>会议室安静了。小李的脸色有点不好看:\"为什么做不了?\"</p><p>\"消息队列的容量不够。要加这个功能,得先扩容,但扩容不是一句话的事。得采购、部署、测试。至少两周。\"你说完才发现自己的语气有点冲。</p><p>小李合上笔记本:\"那你说什么时候能上?\"</p><p>\"……我回去评估一下,明天给你排期。\"</p><p>会议不欢而散。你回到工位,心里有点堵。你知道自己说得没错,但方式太生硬了。</p><p>林悦端着水杯路过,看你的表情:\"怎么了?又撕需求了?\"</p><p>\"嗯。话说得太硬了。\"</p><p>她坐下来:\"下次别直接说'做不了'。先说'我评估一下',然后拿数据说话。同样的意思,换个说法效果好很多。\"</p><p>你点了点头。第二天你带着数据去找小李,重新沟通了一遍方案。她接受了,气氛也好了很多。</p><p>你发现。技术能力重要,但沟通方式同样重要。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1740{id:'dun_7', title:'新同事带教', minChapter:7, category:'项目跟进', scene: {text: `<p>周一早上。王姐领了一个年轻人到你工位前。</p><p>\"你,这是新来的实习生。小杨。跟你当年一样,二本计算机专业。你带带他。\"</p><p>你看着面前这个戴着黑框眼镜、穿着一件崭新格子衫的男生。你看起来紧张得手心都在冒汗。跟你一年前的样子几乎一模一样。</p><p>\"飞……飞哥好!\"小杨鞠了一躬,差点撞到旁边的显示器。</p><p>你想笑但忍住了:\"别紧张。先把包放下,我给你讲一下项目结构。\"</p><p>你带着你走了一圈办公区、讲了项目架构、帮他搭了开发环境。你学得挺快,但看得出来,你对那堆祖传PHP代码露出了跟你当年一模一样的表情。那种\"我是谁我在哪我为什么要看这些代码\"的表情。</p>`, choices: [{t:'👨🏫 先讲业务逻辑再讲技术', next:'dun_7_business_first', fx:{exp:25,money:20}}, {t:'💻 直接上手。让你边写边学', next:'dun_7_hands_on', fx:{exp:20,money:25}}, {t:'📝 给你文档让你自己看', next:'dun_7_docs', fx:{exp:15,money:15}}]}, ends: {dun_7_business_first:{text:`<p>你没有直接让小杨看代码。你先在白板上画了一张业务流程图。</p><p>\"我们的系统是做审批流程的。用户提交申请。各级审批人审批。归档。\"你在白板上画了三个框和几条箭头,\"先理解业务,再看代码会轻松很多。\"</p><p>小杨一边听一边记。笔记本上画满了箭头和圈圈。你讲完之后,你提了两个问题。问得都在点子上。你觉得这小子底子不错。</p><p>下午。你给你分配了第一个任务:写一个简单的列表查询接口。你没给你太多指导——\"你先按自己的思路写,写完了我给你review。\"</p><p>他花了一下午写完了。你review的时候。发现代码风格有点稚嫩,但逻辑是对的。你想起了老张当年给你review的场景。你把自己的语气放得温和了一些:</p><p>\"这里。命名改成驼峰。这里。加一个空指针判断。整体思路没问题。\"</p><p>小杨的眼睛亮了一下:\"真的吗?谢谢飞哥!\"</p><p>那一刻。你突然理解了老张当年的心情。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_7_hands_on:{text:`<p>你拍了拍小杨的肩膀:\"你对着代码看一天也看不出什么名堂。直接上手吧。\"</p><p>你给了他一个简单的Bug。用户列表页的翻页功能出了一个小问题,但改起来不难。\"你先试试自己能不能找到问题原因。\"</p><p>小杨有些紧张地坐在工位上。盯着代码看了半小时。然后你开始改。改完之后跑了一遍。报错了。你又改。又报错了。你回头看了看你。你冲你点了点头:\"继续。\"</p><p>第四次。你改对了。功能正常了。</p><p>他长出一口气。整个人的表情从紧张变成了如释重负:\"飞哥。我改好了!\"</p><p>你走过去看了一下你的改动。虽然过程曲折,但最终方案是对的。\"不错。明天给你安排一个稍微复杂一点的。\"</p><p>小杨用力地点了点头。你在心里默默给自己加了一分。当mentor的第一天,没搞砸。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_7_docs:{text:`<p>你从文档库里找出了项目Wiki、接口文档、数据库设计文档。发给了小杨。</p><p>\"你先看这些。有不懂的问我。\"</p><p>小扬点了点头,坐下来开始看。你看你开始认真阅读了,就转回去写自己的代码了。</p><p>过了一个小时。你回头看你的时候,发现你的表情跟看天书一样。你走过去:\"怎么样?\"</p><p>\"飞哥……那个Wiki好像三年前就没更新过了……\"</p><p>你看了看。确实。文档里的接口地址还是旧版的,数据库表结构也跟现在对不上。</p><p>你叹了一口气。看来不能光靠文档。你拉了把椅子坐下来:\"算了。我直接给你讲吧。文档是旧的,但核心逻辑没变。我拿白板给你画一遍。\"</p><p>你花了四十分钟跟他讲了一遍系统架构和核心流程。你听完了。虽然没有全记住,但至少知道该从哪里入手了。</p><p>你心想:是时候把那些文档更新一下了。不然以后每个新人都得遭一遍这个罪。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1741{id:'dun_8', title:'技术分享会', minChapter:8, category:'项目跟进', scene: {text: `<p>周五下午。是团队的例行技术分享会。</p><p>这次轮到后端组分享了。老张在周初的时候找到你:<span class=\"info\">\"你。这次你来讲。\"</span></p><p>你差点从椅子上跳起来:\"我来讲?讲什么?\"</p><p>\"上次那个重构案例就很不错。给大家分享一下你的思路。\"老张的语气很平淡,但你知道他是在给你机会。</p><p>你花了两天时间做PPT。重构前后的数据对比、架构图、性能提升的曲线。能放的数据都放上去了。</p><p>但到了分享会前十分钟。你坐在会议室里,看着陆陆续续走进来的同事。手心开始冒汗了。七八个人坐了下来。齐刷刷地看着你。</p><p>老张坐在角落里。看你的表情。像极了面试那天。</p>`, choices: [{t:'🎤 深呼吸,上去讲', next:'dun_8_present', fx:{exp:30,money:25}}, {t:'😰 太紧张了。讲得磕磕巴巴', next:'dun_8_nervous', fx:{exp:15,money:15}}, {t:'💡 换个思路。边演示边讲', next:'dun_8_demo', fx:{exp:25,money:30}}]}, ends: {dun_8_present:{text:`<p>你深吸一口气。打开了PPT第一页。</p><p>前面三分钟你的声音还有点紧。讲到一半的时候,你偷偷看了一眼角落里的老张。你没什么表情,但也没有皱眉。</p><p>你慢慢地放松了下来。因为你在讲的是你最熟悉的东西。那些代码、那些架构、那些优化思路。是你一行一行写出来的。没有人比你更懂它们。</p><p>你翻到重构前后的性能对比那一页——<span class=\"good\">优化前第50页加载耗时4.8秒,优化后0.3秒</span>。同事们发出了"哇"的声音。</p><p>你继续讲。讲你遇到的坑、讲你的思考过程、讲你从中学到的东西。最后你加了一句:<span class=\"good\">\"其实这个优化方案不是我一个人想出来的。林悦同学帮我指出了接口约束的方向,省了我两天时间。\"</span></p><p>角落里有人在起哄。林悦低头假装在看手机,但耳朵尖红了。</p><p>讲完之后。掌声很热烈。老张站起来说了一句:<span class=\"good\">\"讲得不错。下次该你讲微服务了。\"</span></p><p>你站在讲台上。感觉自己的心跳比刚才还快,但这次不是因为紧张,而是因为兴奋。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_8_nervous:{text:`<p>你站起来。打开了PPT。</p><p>但你的声音一开始就有点抖。讲第一页的时候。你看到前排的测试小陈正在低头看手机。你的大脑突然空白了一下。</p><p>你忘了自己下一句要讲什么。</p><p>你赶紧低头看了看自己的笔记。找到了。然后继续讲,但节奏被打乱了。后面的内容你讲得有些仓促。有些地方自己都觉得没讲透。</p><p>讲完之后。掌声稀稀拉拉的。你坐下来的时候,脸有点烫。</p><p>散会后。老张走过来:<span class=\"info\">\"内容没问题。就是紧张了。多讲几次就好了。\"</span></p><p>你点了点头。虽然今天的分享不够完美,但你确实迈出了第一步。而且你记住了老张说的那句\"多讲几次就好了\"。你打算下次主动申请分享。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_8_demo:{text:`<p>你做了一个临场决定。把PPT只放在背景,改成给同事现场演示。</p><p>你打开开发环境。切换到优化前的代码分支。跑了一次列表查询。大家亲眼看着那个加载转圈转了快五秒。然后你切换到优化后的分支。同样的数据。点一下就出来了,几乎是瞬间。</p><p>\"哇——\"这次是真实的反应。</p><p>你顺着演示继续讲。你的思路比对着PPT讲流畅多了。因为你在做的事情就是你每天都在做的事情。</p><p>你展示了优化前后的代码对比、加了什么索引、怎么改的查询方式、怎么做的测试。一切都是实打实的。</p><p>最后你打开Jmeter的压力测试结果——TPS从200提升到了1150。全场响起了掌声。</p><p>分享会结束后。有两个人专门来问你具体的技术细节。你一个个回答。感觉自己像一个老师。</p><p>挺爽的。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1742{id:'dun_9', title:'年度述职', minChapter:9, category:'项目跟进', scene: {text: `<p>年底了。一年一度的述职考核。</p><p>HR发了一封邮件:<span class=\"mono\">「请各位同学准备10分钟的年度述职PPT,内容包括:年度工作回顾、重点项目、成长收获、明年规划。」</span></p><p>你打开了一个空白的PPT。面对一张白纸,跟当初写技术方案时一样迷茫。</p><p>这一年你做了多少事来着?你翻了翻自己的周报。从年初那个连项目都看不懂的新人,到独立完成核心模块重构、带新人、做技术分享……好像确实做了一些事情。</p><p>但真的把这些写进PPT里的时候。你又犹豫了:\"这些成绩够看吗?别人是不是做得更多?\"</p><p>你的电脑旁边贴着一张半年前的便利贴。上面写着:<span class=\"mono\">「你总觉得自己不够好,但其实你已经做得很好了。」</span>那是林悦的字迹。</p>`, choices: [{t:'📝 把一年成果一条条列出来', next:'dun_9_list', fx:{exp:25,money:30}}, {t:'📊 用数据和图表说话', next:'dun_9_data', fx:{exp:30,money:25}}, {t:'😅 简单写几句算了', next:'dun_9_brief', fx:{exp:10,money:15}}]}, ends: {dun_9_list:{text:`<p>你打开当年的周报、技术文档和Git提交记录。一条一条地梳理自己这一年做过的事情。</p><p>你写下了:</p><p>· 独立完成用户反馈系统(从设计到上线)<br>· 参与核心交易模块重构(代码量从23000行降到12000行)<br>· 处理线上事故7次,平均响应时间15分钟以内<br>· 带教实习生1名(已能独立开发)<br>· 做技术分享2次</p><p>你看着这份清单。觉得好像也没那么差。你又加上了自己学到的东西:</p><p>· 学会了写技术方案<br>· 学会了管理需求和预期<br>· 学会了在压力下保持冷静<br>· 学会了带新人</p><p>述职那天。你把这些一条一条讲了出来。语气平和。没有夸张,也没有自贬。</p><p>王姐听完之后。点评了一句:<span class=\"good\">\"你这一年进步很大。技术上的成长大家都看得到,但我觉得更难得的是。你开始有了技术owner的意识。\"</span></p><p>会后。老张把你叫到一边:<span class=\"info\">\"绩效我给你打了A。明年好好干。\"</span></p><p>你愣一下,然后笑了。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_9_data:{text:`<p>你决定用数据说话。你打开了Jira、GitLab和监控系统。拉了一堆数据出来。</p><p>PPT里放了几张图表:</p><p>· 全年完成需求数:47个(后端组第三)<br>· 代码提交量:356次commit<br>· Bug率:2.3%(低于组内平均的4.1%)<br>· 线上事故响应时间从45分钟降到了15分钟</p><p>你还放了一张重构前后的性能对比图——4.8秒到0.3秒的那条曲线。视觉效果非常震撼。</p><p>述职会上。你讲完这几页数据之后。会议室里的人都在点头。技术总监老陈专门问了一句:<span class=\"good\">\"Bug率2.3%。这个数据是怎么统计的?\"</span></p><p>你解释了自己的统计口径。老陈听完之后说了两个字:<span class=\"good\">\"专业。\"</span></p><p>你的述职顺利通过了。而且\"专业\"这个评价在公司传开了。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_9_brief:{text:`<p>你实在不想花太多时间在PPT上。就简单写了几段话:主要工作、主要成绩、明年目标。大概三页PPT。</p><p>述职那天。你上去讲了不到五分钟就讲完了。会议室里安静了几秒。</p><p>王姐看了看你:\"就这些?\"</p><p>\"嗯。今年做的事情大概就这些了。\"</p><p>王姐沉默了一下:\"你。你今年做了很多事,但你PPT上只写了三分之一。下次述职的时候。不要不好意思写自己的成绩。你做了什么、做得好不好。要敢于说出来。\"</p><p>你点了点头。回去的路上一直在想王姐那句话。</p><p>林悦后来知道了这件事:<span class=\"good\">\"你呀。什么都好,就是太谦虚了。下次述职前我帮你过一遍PPT。\"</span></p><p>你笑着答应了。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1743{id:'dun_10', title:'项目复盘会', minChapter:10, category:'项目跟进', scene: {text: `<p>一个大型项目终于交付了。</p><p>历时三个月。从需求分析到设计、开发、测试、上线。那个用户积分系统终于顺利跑起来了。上线一周。数据正常、用户反馈正面、老板也在全员群里发了一个👍。</p><p>但比上线更重要的。是复盘。</p><p>周四下午。王姐在会议室召集了项目复盘会。参与项目的人全都到了。后端、前端、测试、产品、运营。满满坐了一屋子。</p><p>王姐开场:<span class=\"info\">\"项目上线了。效果不错,但复盘不是为了听表扬。是为了找到可以做得更好的地方。每个人都说三点:做对了什么、做错了什么、下次怎么做。\"</span></p><p>会议室安静了几秒。气氛有点微妙。大家都不太愿意第一个开口说自己的不足。</p>`, choices: [{t:'🙋 主动第一个发言。正视不足', next:'dun_10_first', fx:{exp:35,money:30}}, {t:'🤔 先听听别人怎么说', next:'dun_10_listen', fx:{exp:20,money:25}}, {t:'📋 拿出提前准备好的复盘文档', next:'dun_10_prepared', fx:{exp:30,money:35}}]}, ends: {dun_10_first:{text:`<p>你举手了。王姐点了点头:<span class=\"good\">\"你。你先说。\"</span></p><p>你站起来。打开了你自己提前准备的一份文档。</p><p>\"做对了三件事:第一。前期需求梳理比较充分,功能上线后没有出现大的需求变更。第二。技术方案评审阶段发现了几个潜在的性能瓶颈,提前做了优化。第三。测试覆盖率高,上线后没有出现P0级故障。\"</p><p>你顿了顿。然后继续说:</p><p>\"做错了三件事:第一。对第三方接口的稳定性评估不足。上线前三天发现对方的API有限流策略,差点影响整体排期。第二。文档更新滞后。项目结束后还有几份接口文档没更新。第三。前期对运营的数据需求理解不够。上线后补了两版数据报表。\"</p><p>你讲完的时候。会议室里很安静。然后王姐带头鼓了掌。</p><p><span class=\"good\">\"你是我见过的最坦诚的复盘者。我们要的就是这种态度。\"</span></p><p>你坐下来的时候。旁边的测试小陈小声说:\"兄弟。你提前准备了文档?卷王啊……\"</p><p>你笑了:\"不是卷。是真的觉得很有必要。\"</p><p>那次复盘会结束后。所有人的发言都比预期的坦诚。你带了一个好头。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_10_listen:{text:`<p>你决定先听听别人怎么说。坐在位置上安静地听着。</p><p>小陈先说:\"我做对的是测试用例覆盖得比较全。遗漏不多。做错的是压力测试做得太晚了。上线前一周才跑,发现问题差点来不及改。\"</p><p>前端王宇接着说:\"我做对的是跟后端接口联调比较顺畅。没有出现大的返工。做错的是对移动端适配预估不足。上线后补了两版样式。\"</p><p>你一边听一边记。每一句话都有值得学习的地方。</p><p>轮到你了。你说了一些自己的反思。虽然没有第一个发言那么\"出彩\",但你的每一条反思都是真心实意的。</p><p>复盘会结束后。你觉得收获很大。不是因为你说了什么。而是因为听到了不同角色的视角。这些视角让你对"好项目"有了更全面的理解。它不止是代码写得好,测试覆盖全,还有沟通顺畅、排期合理、文档完善。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}, dun_10_prepared:{text:`<p>你打开电脑。投屏上一份排版精美的复盘文档出现在大家面前。</p><p>你已经提前把复盘内容写好了。不仅在内容上做了梳理,还按照\"做对/做错/改进\"三个维度分了类,每条都有具体的数据和案例支撑。</p><p>王姐看了一眼你的文档:<span class=\"good\">\"你。你提前准备了?\"</span></p><p>\"嗯。我觉得复盘会时间有限,提前写好了方便大家看。\"</p><p>你一条一条地讲。从项目时间线到每个阶段的关键决策。再到做得好的和做得不够好的地方。最后几页是你总结的"项目经验教训"。可以直接沉淀为团队的知识库。</p><p>你讲完之后。产品的Tony说了一句:<span class=\"good\">\"下次项目我也提前写一份复盘文档。你这个格式太好了。\"</span></p><p>会后。王姐把你的复盘文档发到了全公司群:<span class=\"mono\">「分享一份来自后端组段飞的项目复盘。值得大家学习。」</span></p><p>你看着手机屏幕上不断冒出来的点赞。心里暖暖的。</p>`,choices:[{t:'✅ 完成',next:'__DUNGEON_END__'}]}}},
1744{
1745 id:'dun_11',
1746 category:'情感互动',
1747 title:'约会日常·咖啡店偶遇',
1748 minChapter:1,
1749 scenes:{
1750 dun_11:{text:`<p class=\"sys\">周末 · 公司楼下咖啡店</p>
1751<p>周六早上。你难得睡到自然醒。拿起手机。看到林悦半小时前发的消息:</p>
1752<p><span class=\"good\">\"今天天气好好。要不要出来坐坐?公司楼下那家新开的咖啡店。\"</span></p>
1753<p>你盯着这条消息看了五秒。然后以堪比线上事故回滚的速度从床上弹了起来。</p>
1754<p>十五分钟后你出现在咖啡店门口。深呼吸了三次才推门进去。林悦已经坐在靠窗的位置了。她今天穿了一件白色的针织开衫。头发披散着。面前放着一杯拿铁和一本翻到一半的书。</p>
1755<p>她抬起头看到你。笑了:<span class=\"good\">\"你今天挺快的。\"</span></p>
1756<p>你坐在她对面。点了杯美式。咖啡还没上来,但你觉得这个周末已经值了。</p>`,choices:[{t:'☕ 聊最近看的书',next:'dun_11_talk'},{t:'📱 问她昨天那个Bug搞定了没',next:'dun_11_work'}]},
1757 dun_11_talk:{text:`<p>你指了指她面前那本书:\"在看什么?\"</p>
1758<p>她把封面翻过来。是一本叫《代码之外的功夫》的书。</p>
1759<p>\"讲程序员的职业规划的。\"林悦说,\"里面有一句话我觉得挺有道理——'你的价值不在于你会多少框架,而在于你能解决多少问题。'\"</p>
1760<p>你点了点头:\"那我现在的价值大概就是。今天能请你喝杯咖啡。\"</p>
1761<p>她愣一下,然后笑了。笑得眼睛弯弯的:<span class=\"good\">\"这个搭讪我给及格分。\"</span></p>
1762<p>午后的阳光透过窗户洒在她的头发上。你突然觉得。世界上最美好的事情。大概就是在阳光正好的周末。和一个让你心跳加速的人坐着聊聊天。</p>`,choices:[{t:'😊 续杯,再坐一会儿',next:'dun_11_walk'}]},
1763 dun_11_work:{text:`<p>\"对了。你昨天说的那个CSS兼容性问题。搞定了吗?\"你问。</p>
1764<p>林悦喝了一口拿铁:<span class=\"good\">\"搞定了。最后发现是Chrome更新之后把某个API标记成废弃了。改了一行代码就好。\"</span></p>
1765<p>\"才一行?那你纠结了四个小时。\"</p>
1766<p>她白了你一眼:<span class=\"bad\">\"你上次调那个Docker网络配置不是也调了一整个下午?谁也别笑谁。\"</span></p>
1767<p>你们都笑了。服务员端上你的美式。咖啡的香气在空气中弥漫开来。</p>`,choices:[{t:'☀️ 提议出去走走',next:'dun_11_walk'}]},
1768 dun_11_walk:{text:`<p>从咖啡店出来。你们沿着街边的梧桐树荫慢慢走着。秋天的阳光很好。透过树叶打在地面上。碎成一片一片金色的光斑。</p>
1769<p>\"下周有个新电影要上。听说不错。\"林悦若无其事地说。</p>
1770<p>你的心跳开始加速——\"那……一起看?\"</p>
1771<p>她歪着头看你:<span class=\"good\">\"你请客?\"</span></p>
1772<p>\"当然。\"</p>
1773<p>她又笑了。那种你百看不厌的笑容。然后加快了脚步走到你前面。马尾辫在脑后一晃一晃的。像在说:跟上我。</p>
1774<p>你跟了上去。觉得今天的咖啡。格外甜。</p>`,choices:[{t:'🎬 下周去看电影',next:'CHAPTER_COMPLETE',fx:{'affection':5,'exp':15}}]}
1775 }
1776 },
1777 {
1778 id:'dun_12',
1779 category:'情感互动',
1780 title:'约会日常·程序员做饭',
1781 minChapter:2,
1782 scenes:{
1783 dun_12:{text:`<p class=\"sys\">周末 · 你家厨房</p>
1784<p>\"你确定你会做饭?\"林悦靠在厨房门框上。表情充满了怀疑。</p>
1785<p>\"当然会。我一个人生活这么多年。做饭是最基本的生存技能。\"你系上围裙。信心满满。</p>
1786<p>四十分钟后。你对着锅里一坨黑乎乎的东西陷入了沉思。</p>
1787<p>林悦走过来。看了一眼。沉默了三秒。然后笑出了声。那种完全忍不住的笑。弯着腰。扶着门框。笑得眼泪都快出来了。</p>
1788<p><span class=\"good\">\"你管这叫——'最基本的生存技能'?\"</span></p>`,choices:[{t:'😅 尴尬地挠头',next:'dun_12_save'},{t:'🙋 叫外卖吧',next:'dun_12_save'}]},
1789 dun_12_save:{text:`<p>最后你们还是点了外卖。你点的。你请客。算是为那团黑色物质谢罪。</p>
1790<p>外卖到了之后。你们坐在你那张小小的折叠桌两边。吃着酸菜鱼和米饭。</p>
1791<p>\"其实吧——\"林悦一边吃一边说——<span class=\"good\">\"你能主动做饭这件事。已经超过90%的程序员了。至于做得好不好吃。那是另一回事。\"</span></p>
1792<p>\"你这是夸我还是损我?\"</p>
1793<p><span class=\"good\">\"两者都有。\"</span>她夹了一块鱼放到你碗里——<span class=\"good\">\"吃吧。下次我来做。你负责洗碗就行。\"</span></p>
1794<p>你低头看着碗里那块鱼。心里暖了一下。也酸了一下。像她刚才放进来的不是鱼。是一颗小石子。掉进了你心里的湖面。荡出一圈一圈的涟漪。</p>`,choices:[{t:'🍽️ 洗碗!下次一定学做饭',next:'CHAPTER_COMPLETE',fx:{'affection':3,'exp':12}}]}
1795 }
1796 },
1797 {
1798 id:'dun_13',
1799 category:'情感互动',
1800 title:'约会日常·加班夜的奶茶',
1801 minChapter:3,
1802 scenes:{
1803 dun_13:{text:`<p class=\"sys\">周三 · 晚上九点半 · 办公室</p>
1804<p>你对着屏幕上的报错日志已经发呆了十五分钟了。</p>
1805<p>那个Bug像是跟你玩捉迷藏。你追到东。它跑到西。你加了日志。重新跑。日志里什么都没有。你加了更多的日志。再跑。日志显示一切正常,但Bug还在。</p>
1806<p>你靠在椅背上。揉了揉发酸的眼睛。感觉自己的脑细胞在以可见的速度死亡。</p>
1807<p>\"给你。\"</p>
1808<p>一杯温热的奶茶出现在你的桌上。你抬起头。林悦不知道什么时候站在你旁边。手里也端着一杯。一边喝一边看着你的屏幕。</p>
1809<p><span class=\"good\">\"先喝口甜的。让脑子休息一下再继续。\"</span></p>`,choices:[{t:'🧋 喝口奶茶',next:'dun_13_chat'},{t:'😩 让她先走',next:'dun_13_chat'}]},
1810 dun_13_chat:{text:`<p>你拿起奶茶喝了一口。温的。甜度刚好。是你喜欢的那个牌子。</p>
1811<p>\"你怎么知道我喝这个?\"你有点惊讶。</p>
1812<p>林悦在你旁边坐下来。耸了耸肩:<span class=\"good\">\"上次团建你买了一路。记性好的程序员观察力都不会太差。\"</span></p>
1813<p>你没有拆穿她,但你的嘴角出卖了你。</p>
1814<p>\"那个Bug——\"她凑过来看了看你的屏幕——<span class=\"good\">\"你看看有没有可能是线程池的问题?任务提交之后没有正确捕获异常。报错被吞掉了。所以你日志里什么都看不到。\"</span></p>
1815<p>你愣一下,然后按她的思路查了一下。果然。线程池里有个异常被静默吞掉了。</p>
1816<p>你修完Bug。转头看她。她在旁边安静地喝着奶茶。像这件事根本没什么大不了的。</p>
1817<p>但你心里知道。她留下来陪你加班了。而且她的奶茶。比任何一行代码都让你觉得温暖。</p>`,choices:[{t:'💕 修完Bug一起下班',next:'CHAPTER_COMPLETE',fx:{'affection':4,'exp':18}}]}
1818 }
1819 },
1820 {
1821 id:'dun_14',
1822 category:'情感互动',
1823 title:'约会日常·逛宜家的幻想',
1824 minChapter:4,
1825 scenes:{
1826 dun_14:{text:`<p class=\"sys\">周日 · 宜家商场</p>
1827<p>起因是这样的:林悦说她想买一个书架。</p>
1828<p>你说\"我陪你去\"。她看了你一眼。说\"好\"。然后你们就出现在了宜家的巨大蓝色建筑面前。</p>
1829<p>你以前觉得逛宜家是一件很无聊的事,但你发现自己错了。错得离谱。</p>
1830<p>因为跟在林悦身后。看着她摸摸这个沙发的面料。在那个样板间的床上坐一坐。站在厨房样板间前认真比较两种橱柜的颜色。你会产生一种奇怪的错觉——</p>
1831<p><span class=\"good\">好像你们是一对在装修自己小家的情侣。</span></p>`,choices:[{t:'🛋️ 在她看沙发时在旁边站着',next:'dun_14_room'},{t:'🛏️ 跟她一起比较床垫',next:'dun_14_room'}]},
1832 dun_14_room:{text:`<p>你们走到一个卧室样板间前。林悦停下来看了很久。</p>
1833<p>\"这个设计挺温馨的。\"她说。声音有点轻。</p>
1834<p>你站在她旁边。看着那个样板间。一张双人床。一个床头柜。一盏暖黄色的台灯。墙上挂着一幅简单的装饰画。</p>
1835<p>\"以后我家的卧室。也要有这种暖黄色的灯。\"她说。</p>
1836<p>\"那你家客厅呢?\"你问。</p>
1837<p>她想了想——<span class=\"good\">\"客厅要有一张大沙发。能躺的那种。周末可以在上面看电影一整天。还要有一个书架。专门放技术书和小说。\"</span></p>
1838<p>你点了点头。在心里默默记下了每一个细节。</p>
1839<p>她转过头看你。歪着头笑了一下:<span class=\"good\">\"你记这些干嘛?\"</span></p>
1840<p>你被发现了吗?。耳朵开始发烫——\"我……我也打算以后这么装修。\"</p>
1841<p>她没追问,但她的笑容加深了。像午后的阳光一样。暖洋洋的。</p>`,choices:[{t:'📦 帮她搬书架回家',next:'CHAPTER_COMPLETE',fx:{'affection':5,'exp':14}}]}
1842 }
1843 },
1844 {
1845 id:'dun_15',
1846 category:'情感互动',
1847 title:'约会日常·深夜撸串坦白局',
1848 minChapter:5,
1849 scenes:{
1850 dun_15:{text:`<p class=\"sys\">周五 · 公司附近大排档</p>
1851<p>项目终于上线了。你累得半死,但心情很好。</p>
1852<p>林悦说想吃烤串。你们就坐到了那家东北大叔的烤串店里。两瓶北冰洋。一把羊肉串。一盘花生毛豆。晚风吹过来。烧烤的烟火气在空气里飘散。</p>
1853<p>\"你跟面试的时候完全不一样了。\"林悦一边剥毛豆一边说。</p>
1854<p>\"哪不一样?\"</p>
1855<p><span class=\"good\">\"面试那天你穿了一件白衬衫。紧张得像去参加高考。现在——\"</span>她上下打量了你一眼。你穿着一件印着\"Hello World\"的T恤。头发被风吹得乱糟糟的——<span class=\"good\">\"现在松弛多了。\"</span></p>
1856<p>\"那说明我现在不紧张了。\"你喝了一口北冰洋。</p>
1857<p>\"是吗?\"她歪头看着你。目光里带着一点狡黠——<span class=\"good\">\"那你看着我。说一句真心话试试。\"</span></p>`,choices:[{t:'😳 看着她。说真心话',next:'dun_15_truth'},{t:'😅 转移话题',next:'dun_15_truth'}]},
1858 dun_15_truth:{text:`<p>你看着她。灯光下她的眼睛亮亮的。带着一点期待和笑意。</p>
1859<p>\"我……\"你深吸了一口气——\"我这辈子写过的最好的代码。是在银河科技写的,但比代码更重要的。是在那里遇到了你。\"</p>
1860<p>你一口气说完了。然后立刻低头喝北冰洋。假装刚才什么都没发生。</p>
1861<p>林悦没有立刻说话。过了好几秒。你听到她轻轻地说:</p>
1862<p><span class=\"good\">\"你这句真心话。合格了。\"</span></p>
1863<p>你抬起头。她正在笑。笑得很安静。不像平时那种爽朗的笑。而是一种更柔软的笑容。像藏着什么秘密一样。</p>
1864<p>她举起北冰洋瓶子。跟你碰了一下。玻璃瓶发出清脆的声音。在夜晚的大排档里格外好听。</p>`,choices:[{t:'🍻 干杯。今晚真开心',next:'CHAPTER_COMPLETE',fx:{'affection':6,'exp':16}}]}
1865 }
1866 },
1867 {
1868 id:'dun_16',
1869 category:'情感互动',
1870 title:'约会日常·下雨天一起加班',
1871 minChapter:6,
1872 scenes:{
1873 dun_16:{text:`<p class=\"sys\">周四 · 晚上 · 公司</p>
1874<p>窗外下起了大雨。雨点噼里啪啦地打在玻璃上。</p>
1875<p>你看了看时间。晚上九点半。雨还没有停的意思。你翻了翻背包。叹了口气。没带伞。</p>
1876<p>办公室大部分灯已经关了。只有你这一排和林悦那一排还亮着。她也没走。你看到她戴着耳机。专注地盯着屏幕。敲代码的节奏很稳。</p>
1877<p>你犹豫了一下。站起来。走到茶水间。泡了两杯热茶。</p>
1878<p>你端着一杯茶放到她桌上。她吓了一跳。摘下耳机。看到是你。笑了。</p>
1879<p><span class=\"good\">\"你怎么还没走?\"</span>她问。</p>
1880<p>\"没带伞。——\"你指了指窗外——\"被困住了。\"</p>`,choices:[{t:'☕ 递给她热茶',next:'dun_16_together'},{t:'📱 看打车软件',next:'dun_16_together'}]},
1881 dun_16_together:{text:`<p>林悦接过茶。暖了暖手。喝了一口。</p>
1882<p>\"我也没带伞。\"她说。</p>
1883<p>\"那。我们都困在这儿了。\"你说。</p>
1884<p>她笑了笑。拍了拍旁边的椅子:<span class=\"good\">\"那正好。有个Bug我搞了半天了。你帮我看看?\"</span></p>
1885<p>你拉过椅子坐下。两个人凑在一个屏幕前。她指着代码里的一处逻辑。你的肩膀碰到了她的肩膀,但你俩谁都没有挪开。</p>
1886<p>窗外的雨声很大。办公室里只有两台显示器的光。和两个人偶尔的讨论声。</p>
1887<p>你帮她把Bug定位到了。是一个已经废弃的接口没更新导致的。修复只花了两分钟,但你在她旁边多坐了一会儿。假装在看代码。其实在听雨声和她浅浅的呼吸声。</p>
1888<p>雨停了。你们一起走出公司。地面上还有浅浅的积水。倒映着路灯的光。空气里有一股雨后的清新味道。</p>
1889<p><span class=\"good\">\"晚安。\"</span>她说。</p>
1890<p>\"晚安。\"</p>
1891<p>你走向地铁站。走了几步回头看了一眼。她也在回头看你。你们隔着一整条街。都笑了。</p>`,choices:[{t:'😊 这个夜晚很难忘',next:'CHAPTER_COMPLETE',fx:{'affection':4,'exp':13}}]}
1892 }
1893 },
1894 {
1895 id:'dun_17',
1896 category:'情感互动',
1897 title:'约会日常·被拉去逛书店',
1898 minChapter:7,
1899 scenes:{
1900 dun_17:{text:`<p class=\"sys\">周六 · 三里屯PageOne书店</p>
1901<p>\"你周末都不出门的吗?\"林悦站在你家楼下。叉着腰看你。</p>
1902<p>你刚从床上被叫起来。头发乱得像鸟窝。穿了一件皱巴巴的T恤——\"我……我在家也是学习的……\"</p>
1903<p>她上下打量了你一眼。叹了口气:<span class=\"good\">\"换件衣服。跟我去三里屯。\"</span></p>
1904<p>半小时后。你站在PageOne书店里。看着满墙的书。觉得这个地方好像也没那么糟糕。</p>
1905<p>林悦穿梭在书架之间。像一条在水里游动的鱼。她拿起一本设计类的书翻几页。又拿起一本摄影集看了起来。你跟在后面。发现她认真看书的样子。比书本身好看多了。</p>`,choices:[{t:'📚 找一本技术书看',next:'dun_17_find'},{t:'📸 帮她拍照',next:'dun_17_find'}]},
1906 dun_17_find:{text:`<p>你在编程区发现了一本讲Go语言并发编程的书。刚拿起来。林悦就凑过来了。</p>
1907<p><span class=\"good\">\"你在看Go?\"</span>她有点惊讶。</p>
1908<p>\"嗯。最近在学。想拓宽一下技术栈。\"</p>
1909<p>她点了点头:<span class=\"good\">\"你这个人吧。虽然平时看起来懒懒散散的,但在技术上还挺上进的。\"</span></p>
1910<p>\"这可是最高的赞美了。\"你笑着说。</p>
1911<p>她想了想。从旁边的书架抽出一本《设计中的设计》递给你:<span class=\"good\">\"那你也看看这本。技术很重要,但对美的感知也很重要。\"</span></p>
1912<p>你接过来翻了翻。原研哉的。确实是一本好书。</p>
1913<p>\"这样——\"她说——<span class=\"good\">\"我们互相给对方挑一本书。两周后交换读后感。输的人请喝一个月奶茶。\"</span></p>
1914<p>你看着她亮晶晶的眼睛——\"赌了。\"</p>
1915<p>不管输赢。你都赚了。你想。因为这意味着。接下来一个月。你每天都有理由跟她聊天了。</p>`,choices:[{t:'📖 接受挑战!',next:'CHAPTER_COMPLETE',fx:{'affection':5,'exp':15}}]}
1916 }
1917 },
1918 {
1919 id:'dun_18',
1920 category:'情感互动',
1921 title:'约会日常·公园野餐写代码',
1922 minChapter:8,
1923 scenes:{
1924 dun_18:{text:`<p class=\"sys\">周日 · 朝阳公园</p>
1925<p>\"今天外面天气这么好。你确定要窝在屋里写代码?\"林悦在电话里问。</p>
1926<p>\"但我有一个Bug——\"</p>
1927<p>\"带着电脑来公园写。\"她说完就挂了。完全不给你拒绝的机会。</p>
1928<p>二十分钟后。你抱着笔记本电脑坐在朝阳公园的草坪上。林悦从背包里拿出一块野餐垫铺开。又掏出了三明治、水果和两瓶气泡水。</p>
1929<p>\"你这准备得也太齐全了……\"你目瞪口呆。</p>
1930<p><span class=\"good\">\"这叫生活品质。\"</span>她坐在野餐垫上。拿出自己的平板——<span class=\"good\">\"你写你的代码。我看我的书。互不干扰,但比一个人闷在屋里好。\"</span></p>`,choices:[{t:'💻 在草地上写代码',next:'dun_18_coding'},{t:'🍱 先吃再说',next:'dun_18_coding'}]},
1931 dun_18_coding:{text:`<p>你打开电脑。开始写代码。阳光透过树冠洒在屏幕上。形成斑驳的光影。旁边有几个小孩在放风筝。远处有人在弹吉他。</p>
1932<p>奇怪的是。你在这种环境下写代码。效率居然出奇地高。那个困扰了你一个上午的Bug。你花了二十分钟就定位到了问题。一个死锁条件没处理好。</p>
1933<p>你合上电脑。发现林悦正躺在一旁。平板盖在脸上。看起来像是睡着了。</p>
1934<p>风吹过来。她的发梢轻轻飘动。你看着她。看了好几秒。然后转回头。拿起一块三明治咬了一口。</p>
1935<p>她突然开口了。平板还盖在脸上:<span class=\"good\">\"你刚才是不是在看我看呆了?\"</span></p>
1936<p>你被三明治噎了一下。疯狂咳嗽。</p>
1937<p>她拿开平板。坐起来。笑着递给你一瓶气泡水:<span class=\"good\">\"喝慢点。又没人跟你抢。\"</span></p>
1938<p>你接过气泡水。喝了一口。橘子味的。气泡在舌尖炸开。跟你的心跳一样凌乱。</p>`,choices:[{t:'😳 嘴硬说没有',next:'dun_18_walk'},{t:'💪 承认了。对,就是在看你',next:'dun_18_walk'}]},
1939 dun_18_walk:{text:`<p>傍晚的公园格外美。夕阳把天空染成橘红色。湖面上倒映着金色的光。</p>
1940<p>你们沿着湖边走了一圈。林悦走在前面。时不时回头看你一眼。确认你跟上了。</p>
1941<p>\"今天开心吗?\"她问。</p>
1942<p>\"开心。\"你说。这是实话。不是因为天气好。不是因为公园漂亮。是因为有你在旁边。</p>
1943<p>她笑了。那种发自内心的笑。然后从口袋里掏出一颗糖递给你:<span class=\"good\">\"奖励你的。陪我这个无聊的人出来逛了一天。\"</span></p>
1944<p>你接过糖。是橘子味的。跟你刚才喝的气泡水一个味道。</p>
1945<p>你剥开糖纸。把糖放进嘴里。橘子味在舌尖化开。</p>
1946<p>嗯。甜的。</p>`,choices:[{t:'🍬 甜到心里',next:'CHAPTER_COMPLETE',fx:{'affection':6,'exp':14}}]}
1947 }
1948 },
1949 {
1950 id:'dun_19',
1951 category:'情感互动',
1952 title:'约会日常·一起跨年',
1953 minChapter:9,
1954 scenes:{
1955 dun_19:{text:`<p class=\"sys\">12月31日 · 深夜 · 国贸天桥</p>
1956<p>这一年的最后一天。</p>
1957<p>你本来以为会在家里看跨年晚会。一个人,但林悦发了一条消息:<span class=\"info\">\"今晚有安排吗?\"</span></p>
1958<p>你秒回:\"没有。\"。然后又觉得回得太快了。补了一句——\"你呢?\"</p>
1959<p><span class=\"info\">\"那一起跨年吧。国贸那边有灯光秀。\"</span></p>
1960<p>现在你站在国贸的天桥上。周围挤满了人。大家举着手机。等待着零点的到来。北京的冬夜很冷。你呼出的气在路灯下变成一团白雾。</p>
1961<p>林悦站在你旁边。穿着厚厚的外套。围着一条乳白色的围巾。只露出一双亮晶晶的眼睛。</p>`,choices:[{t:'🧣 把围巾分她一半',next:'dun_19_countdown'},{t:'🕐 安静地等倒计时',next:'dun_19_countdown'}]},
1962 dun_19_countdown:{text:`<p>远处的大屏幕上开始倒计时了——</p>
1963<p class=\"mono\" style=\"font-size:24px;text-align:center;\">10……9……8……</p>
1964<p>周围的人群开始一起喊。你转过头看林悦。她的眼睛倒映着城市的灯光。亮晶晶的。像装进了一整片星河。</p>
1965<p class=\"mono\" style=\"font-size:24px;text-align:center;\">7……6……5……</p>
1966<p>你的手在口袋里握了握。心脏跳得比电脑风扇还快。</p>
1967<p class=\"mono\" style=\"font-size:24px;text-align:center;\">4……3……2……</p>
1968<p>你深呼吸了一下——</p>
1969<p class=\"mono\" style=\"font-size:24px;text-align:center;\">1——</p>
1970<p>\"新年快乐!!\"</p>
1971<p>人群爆发出欢呼声。烟花在头顶炸开。五彩斑斓的光芒照亮了整个夜空。</p>
1972<p>你在这震耳欲聋的欢呼声中。转向她。说了一句:</p>
1973<p><span class=\"good\">\"林悦。新年快乐。谢谢你。让我这一年。变得不一样。\"</span></p>
1974<p>她从围巾里抬起眼睛。看着你。烟花的颜色在她眼睛里明明灭灭。</p>
1975<p><span class=\"good\">\"新年快乐。你。\"</span></p>
1976<p>然后。她把手从口袋里伸出来。握住了你的手。</p>
1977<p>她的手凉凉的,但你握得很紧。烟花还在放。欢呼声还在继续,但世界好像安静了那么几秒。</p>`,choices:[{t:'🎆 握紧她的手看完烟花',next:'CHAPTER_COMPLETE',fx:{'affection':8,'exp':20}}]}
1978 }
1979 },
1980 {
1981 id:'dun_20',
1982 category:'情感互动',
1983 title:'约会日常·终于表白了',
1984 minChapter:10,
1985 scenes:{
1986 dun_20:{text:`<p class=\"sys\">春天 · 玉渊潭樱花树下</p>
1987<p>你约林悦出来赏樱花。你提前来踩了点。找了一棵开得最盛的樱花树。花瓣随风飘落。铺了一地粉白色的花毯。</p>
1988<p>林悦来的时候穿了一件浅粉色的毛衣。站在樱花树下。花瓣落在她的肩膀上。她浑然不觉。仰着头在看花。</p>
1989<p>你站在她旁边。看着她被阳光照亮的侧脸。心跳得像有一万只虫子在胸口挠。</p>
1990<p>\"这棵花开得真好。\"她转头看你。</p>
1991<p>\"嗯。\"你根本没在看花。</p>`,choices:[{t:'💪 鼓起勇气告白',next:'dun_20_confession'},{t:'😰 再酝酿一下',next:'dun_20_confession'}]},
1992 dun_20_confession:{text:`<p>\"林悦——\"你叫她的名字。声音有点哑。</p>
1993<p>\"嗯?\"她转过来。看着你。</p>
1994<p>你感觉自己后背在冒汗。手心也在出汗,但你已经走到这一步了。不能再退了。</p>
1995<p>\"从入职第一天你在电梯里跟我说'衬衫很正式嘛'。从你帮我装Docker。从你坐在我旁边加班到凌晨。从你在大排档说'如果你去了我们也要联系'。从那个跨年夜的烟花。从你说'你不要把我忘了'——\"</p>
1996<p>你深吸了一口气。看着她。她的眼睛在阳光下亮得惊人。嘴唇微微张开。像是预感到了什么。</p>
1997<p>\"我好像。从一开始。就喜欢上你了。\"</p>
1998<p>说完这句话。你感觉自己把整颗心都掏出来了。放在阳光下。放在春天的风里。放在她面前。</p>
1999<p>樱花还在落。风还在吹。</p>
2000<p>她看着你。安静了三秒。然后。她的眼眶微微泛红了。</p>
2001<p><span class=\"good\">\"你终于说了。\"</span>她的声音有点抖——<span class=\"good\">\"我还以为。我要等到这棵樱花树枯死。你才会开口。\"</span></p>
2002<p>你愣住了。然后她往前走了一步。踮起脚尖。在你脸颊上轻轻亲了一下。</p>
2003<p><span class=\"good\">\"我也是。从第一天就开始了。\"</span></p>
2004<p>你的大脑彻底宕机了。所有线程全部卡住。连个空指针异常都没来得及抛。就彻底死机了。</p>
2005<p>而你。站在春天的樱花树下。牵着她的手。觉得这一生。再也没有比此刻更好的瞬间了。</p>`,choices:[{t:'💕 牵着她的手不放开',next:'CHAPTER_COMPLETE',fx:{'affection':10,'exp':25,'hp':20}}]}
2006 }
2007 },
2008{
2009 title: '🏔️ 旅游游记 · 成都火锅之旅',
2010 minChapter: 2,
2011 id: 'dun_21',
2012 category:'情感互动',
2013 start: 'dun21_start',
2014 scenes: {
2015 dun21_start:{text:`<p class=\"sys\">成都 · 春熙路 · 周六晚</p>
2016<p>项目上线后的第一个周末,你被林悦拉着上了去成都的航班。</p>
2017<p>\"为什么是成都?\"你在登机口还在问。</p>
2018<p>\"因为你有年假没用完,因为我馋了,\"林悦掰着手指头数,\"因为往返机票特价,因为你写代码写傻了需要出门。\"</p>
2019<p>你想反驳,但发现自己确实在工位上连续坐了十二个小时没动过。</p>
2020<p>\"而且,\"林悦凑近了一点,压低声音,\"我查过了,成都有家火锅店,老板是前阿里P8,你家的毛肚是从新西兰空运的。\"</p>
2021<p>你沉默了两秒:\"你怎么不早说。\"</p>`,choices:[{t:'✈️ 起飞!去成都吃火锅',next:'dun21_arrive',fx:{exp:5}}]},
2022 dun21_arrive:{text:`<p>晚上九点,飞机降落在双流机场。一出航站楼,一股混合着辣椒和花椒味道的空气扑面而来。</p>
2023<p>\"你闻到了吗?\"林悦深深吸了一口气,\"这就是成都的味道。\"</p>
2024<p>你也吸了吸鼻子:\"我闻到了串串香、兔头和……\"他顿了顿,\"共享单车的消毒水味。\"</p>
2025<p>林悦白了他一眼:\"你能不能浪漫一点?\"</p>
2026<p>\"程序员的天职就是破坏浪漫。\"你认真地说。</p>
2027<p>你们打车到了春熙路附近的民宿。房东是个三十出头的程序员,门口贴着一张纸:<span class=\"mono\">\"WiFi密码:2024NiHaoChengDu!\"</span></p>
2028<p>你对着那张纸拍了张照:\"这个密码设计得不错,大小写加数字加特殊字符。\"</p>
2029<p>林悦已经拖着箱子进了门:\"你能不能先别职业病?我饿了。\"</p>`,choices:[{t:'🍲 深夜去找火锅店',next:'dun21_hotpot',fx:{exp:8}}]},
2030 dun21_hotpot:{text:`<p>凌晨十一点,你们找到了那家传说中的火锅店。藏在一条小巷子里,门口排着长队。</p>
2031<p>\"这么多人?\"你看着手中的号。前面还有二十三桌。</p>
2032<p>林悦一点也不慌,从包里掏出一副扑克牌:\"来,斗地主。输的人请客。\"</p>
2033<p>\"两个人怎么斗地主?\"</p>
2034<p>\"我跟你打,我当地主。\"林悦眨眨眼。</p>
2035<p>四十分钟后,你输了六把。你看着林悦洗牌时灵活的手指,忽然意识到一个问题:<span class=\"bad\">\"你是不是经常跟人打牌?\"</span></p>
2036<p>\"大学的时候是麻将社的副社长。\"林悦轻描淡写地说。</p>
2037<p>你沉默了。你觉得自己好像从来没真正了解过眼前这个人。</p>
2038<p>\"二十三号!\"服务员喊到了他们的号。</p>`,choices:[{t:'🔥 终于吃上火锅了',next:'dun21_eating',fx:{exp:12}}]},
2039 dun21_eating:{text:`<p>红油锅底端上来的时候,你被那股直冲天灵盖的辣味呛得打了个喷嚏。</p>
2040<p>\"你行不行啊?\"林悦已经夹起一片毛肚,在沸腾的锅里七上八下,\"程序员不是最能吃辣的么?\"</p>
2041<p>\"谁说的?\"你擦了擦眼泪。</p>
2042<p>\"Debug的时候怒火中烧,不吃点辣怎么平复?\"林悦把涮好的毛肚放进他碗里。</p>
2043<p>你咬了一口。脆嫩、鲜辣、满口香。你愣了一下,又夹了一片。</p>
2044<p>\"好吃吧?\"林悦笑眯眯地看着他。</p>
2045<p>你一边嘶哈嘶哈地吸气一边点头:\"……值了。这一趟值了。\"</p>
2046<p>旁边桌的大叔看到你们的吃相,用四川话跟老板说:\"老板,再给你们加两份脑花,我请客。这俩娃儿吃得香!\"</p>
2047<p>你和林悦对视一眼,都笑了。</p>`,choices:[{t:'🍻 感谢大叔,敬一杯',next:'dun21_night',fx:{exp:15}}]},
2048 dun21_night:{text:`<p>吃完火锅已经快凌晨一点了。两人撑着圆滚滚的肚子在空荡荡的街上散步。路灯把影子拉得很长,两只影子靠得很近。</p>
2049<p>\"你看。\"林悦指了指路边的招牌——<span class=\"mono\">\"老赵修手机·兼卖冰粉\"</span>,\"成都的副业文化真是深入到骨子里了。\"</p>
2050<p>你看着那块招牌,想了想说:\"如果我不写代码了,我就在成都开个冰粉摊。\"</p>
2051<p>\"你会做冰粉吗?\"</p>
2052<p>\"不会,但我会写个自动化冰粉机。树莓派控制水流和糖浆比例,摄像头识别配料余量,自动补货提醒。\"</p>
2053<p>林悦笑得弯下了腰:\"你开冰粉摊的成本全花在开发上了,一碗冰粉卖五十块钱都回不了本。\"</p>
2054<p>\"那至少是……\"你想了想,\"程序员最贵的冰粉。\"</p>
2055<p>林悦停下脚步,转过来看着你的眼睛:\"你知道吗?我最喜欢你的地方就是。你明明是个很无聊的人,但你的脑洞一点都不无聊。\"</p></p>`,choices:[{t:'💕 这句话比火锅还暖',next:'CHAPTER_COMPLETE',fx:{exp:20,affection:5}}]}
2056 }
2057 },
2058
2059 {
2060 title: '🚲 旅游游记 · 杭州骑行记',
2061 minChapter: 3,
2062 id: 'dun_22',
2063 category:'情感互动',
2064 start: 'dun22_start',
2065 scenes: {
2066 dun22_start:{text:`<p class=\"sys\">杭州 · 西湖 · 周末清晨</p>
2067<p>你从来没有周末早上六点起过床,但林悦说\"西湖的早晨属于骑行者\",所以他此刻正睡眼惺忪地站在一家自行车租赁店门口。</p>
2068<p>\"你确定要骑绕湖一圈?\"你看着地图上的路线。十公里,你早上只喝了一盒牛奶。</p>
2069<p>\"一圈不行就半圈,半圈不行就骑到哪儿算哪儿。\"林悦跨上一辆白色的共享单车,\"重点是出发,不是终点。\"</p>
2070<p>你觉得这句话很像朋友圈里的鸡汤文学,但从林悦嘴里说出来,却莫名地让人想试试。</p>`,choices:[{t:'🚴 出发!环湖骑行',next:'dun22_ride',fx:{exp:8}}]},
2071 dun22_ride:{text:`<p>清晨的西湖安静得不像话。湖面上飘着一层薄雾,远处的保俶塔在雾气中若隐若现。苏堤上只有零星几个晨跑的人,偶尔有一两只白鹭从水面上掠过。</p>
2072<p>\"你看那边。\"林悦停下车,指着湖对面。一家咖啡馆已经亮起了灯,暖黄色的光透过玻璃窗洒在湖边的石板路上。</p>
2073<p>\"开这么早?\"你看了看时间。早上七点零三分。</p>
2074<p>\"那是家程序员开的店。\"林悦说,\"我在小红书上看过。老板之前在阿里,干了五年身体扛不住,辞职开了这家店。店里每张桌子上都贴着一个LeetCode题目的二维码,扫码可以看答案。\"</p>
2075<p>你眼睛亮了:\"真的假的?走,去看看。\"</p>
2076<p>\"你不是要环湖吗?\"</p>
2077<p>\"环湖什么时候都能环,程序员开的咖啡馆不常有。\"</p>`,choices:[{t:'☕ 去程序员咖啡馆',next:'dun22_cafe',fx:{exp:12}}]},
2078 dun22_cafe:{text:`<p>他们推开咖啡馆的门,一阵咖啡香和轻柔的爵士乐扑面而来。店里客人不多,一个穿格子衫的年轻男人在吧台后面擦杯子。大概率就是老板。</p>
2079<p>你找了个靠窗的位置坐下,果然看到桌上贴着一张二维码,旁边印着一行小字:<span class=\"mono\">\"LeetCode #322 · 零钱兑换 · 难度:中等\"</span></p>
2080<p>你扫了码,手机弹出了题目页面。</p>
2081<p>\"你该不会真打算在这里刷题吧?\"林悦用菜单挡住了半张脸。</p>
2082<p>\"我看看……动态规划。\"你划了几下屏幕,\"哎呀,这题我写过。最优解是O(n)时间复杂度,用一维DP数组。\"</p>
2083<p>林悦放下菜单,对着吧台喊了一声:\"老板,你这里有人踢馆!\"</p>
2084<p>老板抬起头,笑了笑:\"解出来了免单。\"</p>
2085<p>你二话不说,打开手机里的代码编辑器就开始写。三分钟后,你把屏幕转向老板——<span class=\"good\">全部测试通过。</span></p>
2086<p>老板走过来看了一眼代码,点了点头:\"不错,优化到了O(n)。你也是做后端的?\"</p>`,choices:[{t:'🤝 和同行老板聊天',next:'dun22_chat',fx:{exp:15}}]},
2087 dun22_chat:{text:`<p>老板叫老周,前阿里P7,在杭州买了房,干了五年发现发际线和血压已经双双不可逆,索性辞职开了这家店。</p>
2088<p>\"现在的收入跟阿里比差远了。\"老周擦了擦另一个杯子,\"但以前我是凌晨两点下班,现在我是凌晨两点还在店里,但我是老板,我愿意。\"</p>
2089<p>你笑了:\"这两种凌晨两点,心态完全不一样。\"</p>
2090<p>\"对啊。\"老周把两杯拿铁放到你们面前,\"以前我的代码跑在服务器上,用户的每一次点击我都要负责。现在我的咖啡跑在杯子里,客人的每一口我都要负责。本质上是一样的。都是服务业。\"</p>
2091<p>林悦端着咖啡,看看老周又看看你:\"你们程序员是不是都这样?做什么事情都要找到和写代码的共通点。\"</p>
2092<p>老周和你同时说:\"这叫抽象思维。\"</p>`,choices:[{t:'😄 被这种默契逗笑了',next:'dun22_finish',fx:{exp:18}}]},
2093 dun22_finish:{text:`<p>从咖啡馆出来,太阳已经完全升起来了。西湖边的游客渐渐多了起来,旅游团的小旗子在人群中飘来飘去。</p>
2094<p>\"还环湖吗?\"林悦问。</p>
2095<p>你看了看时间。已经快九点了,太阳开始晒了。\"要不……下次?\"他试探着说。</p>
2096<p>\"我就知道。\"林悦假装生气地哼了一声,然后自己也笑了,\"算了,至少我们找到了一个程序员开的咖啡馆,这个成就比环湖重要多了。\"</p>
2097<p>你们推着车走回还车点。路过断桥的时候,你看到湖面上有一对鸳鸯在游。</p>
2098<p>\"你看,\"他指着湖面,\"鸳鸯。\"</p>
2099<p>林悦顺着你的手指看了看,然后转过头来看着他:\"你怎么突然变得这么……文艺了?\"</p>
2100<p>\"被西湖传染了。\"你说。</p>`,choices:[{t:'😊 这趟杭州没白来',next:'CHAPTER_COMPLETE',fx:{exp:20,hp:10}}]}
2101 }
2102 },
2103
2104 {
2105 title: '🏛️ 旅游游记 · 西安古城游',
2106 minChapter: 4,
2107 id: 'dun_23',
2108 category:'情感互动',
2109 start: 'dun23_start',
2110 scenes: {
2111 dun23_start:{text:`<p class=\"sys\">西安 · 钟楼 · 国庆假期</p>
2112<p>国庆长假,你被林悦拖到了西安。</p>
2113<p>\"为什么是西安?\"你在人山人海的钟楼广场上被挤得东倒西歪。</p>
2114<p>\"因为你上次说想去看看古城墙。\"林悦踮着脚尖看路标,\"而且我还约了一个大学同学。她是西安本地人,在字节跳动西安分部做前端。\"</p>
2115<p>你有一种不祥的预感:\"等一下,你是说我们这趟旅行还安排了技术交流环节?\"</p>
2116<p>\"不是技术交流,是面基。\"林悦纠正道,\"她看到你GitHub上那个状态机重构项目了,说想认识你。\"</p>`,choices:[{t:'😅 被同行关注了,有点紧张',next:'dun23_meet',fx:{exp:10}}]},
2117 dun23_meet:{text:`<p>你们在一家城墙脚下的陕菜馆见面了。林悦的同学叫小何,扎着利落的马尾辫,戴着一副圆框眼镜,说话语速飞快。</p>
2118<p>\"你就是你?\"小何一见面就打量了他一番,\"你那个状态机重构我看了,写得真不错。不过我觉得用策略模式会更优雅。状态机在状态分支多了之后维护成本会上升。\"</p>
2119<p>你还没来得及自我介绍,就被带入了技术讨论。两人从状态机聊到设计模式,从设计模式聊到微服务架构,从微服务架构聊到Kubernetes的调度策略。</p>
2120<p>林悦在旁边默默地倒茶,脸上带着一种\"我就知道会这样\"的表情。</p>
2121<p>二十分钟后,她终于忍不住了:\"两位,菜凉了。\"</p>
2122<p>你和小何同时低头。桌上的肉夹馍和凉皮还一口没动。</p>`,choices:[{t:'🍜 先吃饭,边吃边聊',next:'dun23_food',fx:{exp:12}}]},
2123 dun23_food:{text:`<p>小何推荐了地道的西安吃法:肉夹馍要配凉皮,再配一瓶冰峰。</p>
2124<p>\"肉夹馍的正确吃法是——\"小何拿起一个馍,\"先用牙齿撕开一个口子,让里面的热气散一散,不然会烫到上颚。然后浇一勺辣椒油——\"她熟练地操作着,\"最后一口咬下去要同时咬到馍和肉。\"</p>
2125<p>你学着她的样子试了一下。确实好吃。馍烤得酥脆,肉炖得软烂入味,辣椒油不辣但特别香。</p>
2126<p>\"你知道吗?\"小何说,\"字节西安分部有个传说:一个程序员连续吃了一周的肉夹馍,然后你写的代码bug率降低了50%。后来他们组就把每周四定为肉夹馍日。\"</p>
2127<p>\"这是真的还是编的?\"你问。</p>
2128<p>小何面不改色:\"我不确定,但我希望是真的。\"</p>`,choices:[{t:'🏯 吃完饭去逛古城墙',next:'dun23_wall',fx:{exp:15}}]},
2129 dun23_wall:{text:`<p>下午,三人登上了西安古城墙。城墙宽得能并排跑四匹马,夕阳把青灰色的砖墙染上了一层暖金色。</p>
2130<p>小何租了三辆自行车:\"城墙一圈十三点七公里,骑完大概一个半小时。\"</p>
2131<p>你骑上车,跟在小何和林悦后面。风吹过来,带着尘土和烤肉的味道。城墙内是仿古建筑群,城墙外是现代化的高楼大厦。古代和现代就在这一墙之隔。</p>
2132<p>\"你!\"林悦在前面喊他,\"骑快一点!\"</p>
2133<p>你用力蹬了几圈,追上了她。夕阳正好在她身后,把她的影子拉得很长很长。</p>
2134<p>你在这一刻忽然觉得——<span class=\"good\">代码里的那些if-else,都没有眼前这个画面值得保存。</span></p>`,choices:[{t:'📸 拿出手机拍下这一刻',next:'dun23_night',fx:{exp:18,hp:5}}]},
2135 dun23_night:{text:`<p>晚上,小何带他们去了回民街。整条街上空飘着烧烤的烟雾,摊位的叫卖声此起彼伏。羊肉串、柿子饼、甑糕、灌汤包。你觉得自己像是在一个巨大的美食循环队列里做遍历。</p>
2136<p>\"这大概是世界上最难优化的遍历。\"你一边吃烤串一边说,\"因为你永远不知道下一个摊位上有什么好吃的。时间复杂度是O(n),但你希望它永远不要结束。\"</p>
2137<p>小何听了哈哈大笑:\"你这个比喻太程序员了,我要记下来发到公司群里。\"</p>
2138<p>林悦在旁边默默地吃着甑糕,看着你和她的同学相谈甚欢。她没有说话,但嘴角一直带着一丝若有若无的笑意。</p>
2139<p>回民宿的路上,林悦忽然说:\"你今天很开心吧?\"</p>
2140<p>\"嗯。\"你点了点头,\"西安挺好的。\"</p>`,choices:[{t:'💕 谢谢她安排了这趟旅行',next:'CHAPTER_COMPLETE',fx:{exp:20,affection:5}}]}
2141 }
2142 },
2143
2144 {
2145 title: '🌊 旅游游记 · 厦门看海',
2146 minChapter: 5,
2147 id: 'dun_24',
2148 category:'情感互动',
2149 start: 'dun24_start',
2150 scenes: {
2151 dun24_start:{text:`<p class=\"sys\">厦门 · 鼓浪屿码头 · 初冬</p>
2152<p>项目发了年终奖之后,你做的第一件事就是订了两张去厦门的机票。</p>
2153<p>\"这次怎么这么主动?\"林悦在机场候机的时候问你。</p>
2154<p>\"因为上次去西安是你安排的,这次轮到我了。\"你说。</p>
2155<p>林悦挑了挑眉:\"你做的攻略?\"</p>
2156<p>你打开手机备忘录,上面列了一个详细的行程表。按天、按时段、按地点,甚至标注了每个景点之间的步行时间和备选路线。格式工整得像一份需求文档。</p>
2157<p>林悦看了半天,幽幽地说了一句:<span class=\"info\">\"你写需求文档的时候要是能这么详细,产品经理得感动哭。\"</span></p>`,choices:[{t:'🚢 上鼓浪屿!',next:'dun24_island',fx:{exp:8}}]},
2158 dun24_island:{text:`<p>轮渡在蓝色的海面上劈开一道白色的浪花。你站在甲板上,海风把你的头发吹成了中分。你才意识到自己今天没有用发胶。</p>
2159<p>\"你的发型……\"林悦站在他旁边,努力憋着笑。</p>
2160<p>\"别说话。\"你试图用手压住头发,但海风太猛了,头发像野草一样四处飞舞。</p>
2161<p>林悦终于忍不住笑出了声,掏出手机拍了一张:\"这张我要留着。\"</p>
2162<p>\"删掉。\"</p>
2163<p>\"不删。等你以后当CTO了,我就拿着这张照片去找你。\"</p>
2164<p>\"找我干什么?\"</p>
2165<p>\"说'你当年头发被风吹起来的样子,我见过。'\"</p>`,choices:[{t:'📸 反过来也拍她一张',next:'dun24_explore',fx:{exp:10}}]},
2166 dun24_explore:{text:`<p>鼓浪屿的小巷子里藏着各种有趣的小店。你的行程表上有标注必去的几个点,但林悦说\"随缘走\",于是他们开始无目的地闲逛。</p>
2167<p>你们路过一家卖手工贝壳首饰的小店,门口的招牌上用粉笔写着:<span class=\"mono\">\"本店支持支付宝、微信、比特币(不,比特币不支持)。\"</span></p>
2168<p>\"又是个同行。\"你说。</p>
2169<p>进店一看,老板是个戴着头巾的年轻人,墙上挂着各种贝壳风铃和手串,角落的桌子上放着一台打开的MacBook,屏幕上是一个终端窗口,正在跑着某个脚本。</p>
2170<p>\"你这个贝壳串的定价算法是什么?\"你指着一条手串问。</p>
2171<p>老板头也不抬:\"贝壳成本乘以二,加上我的手艺溢价。也就是我当年上班时的一小时工资。\"</p>
2172<p>\"那你为什么不写代码了?\"</p>
2173<p>老板终于抬起头,指了指窗外的大海:\"因为代码改不完,但海永远在那里。\"</p>`,choices:[{t:'🤔 这话有点哲理',next:'dun24_beach',fx:{exp:15}}]},
2174 dun24_beach:{text:`<p>下午,你们找了一片人少的海滩。沙滩不算细,但海水很清。远处有几只白色的海鸥在礁石上歇脚。</p>
2175<p>你脱了鞋,卷起裤腿走进海水里。十一月的海水有点凉,但阳光晒在背上暖洋洋的。</p>
2176<p>林悦没有下水,坐在沙滩上的一块大石头上,把鞋子放在旁边,安静地看着他。</p>
2177<p>\"你不下来?\"你回头喊她。</p>
2178<p>\"我坐会儿。\"她笑了笑,\"你看海的样子挺好看的。\"</p>
2179<p>你被她看得有点不好意思,转回头假装在看远处的海平线,但他心里很清楚——<span class=\"good\">这大概是他今年最放松的一个下午。</span></p>`,choices:[{t:'🌅 一起等日落',next:'dun24_sunset',fx:{exp:18}}]},
2180 dun24_sunset:{text:`<p>傍晚六点,你们找了一家海边的海鲜大排档。老板推荐了姜母鸭和清蒸石斑鱼,又送了她们一盘炒花蛤。</p>
2181<p>\"你。\"林悦剥着虾壳,忽然叫了他一声。</p>
2182<p>\"嗯?\"</p>
2183<p>\"你今年的年终奖……有没有想过去哪里?\"</p>
2184<p>你夹菜的手顿了一下:\"还没想好。怎么了?\"</p>
2185<p>\"我听说云南大理挺好玩的。\"林悦若无其事地说,眼睛盯着手里的虾。</p>
2186<p>你低下头,假装在认真吃饭,但他心里已经把\"大理\"两个大字写在了明年计划的第一行。</p>`,choices:[{t:'🌙 收拾心情,回酒店',next:'CHAPTER_COMPLETE',fx:{exp:20,hp:10}}]}
2187 }
2188 },
2189
2190 {
2191 title: '🌿 旅游游记 · 大理慢生活',
2192 minChapter: 6,
2193 id: 'dun_25',
2194 category:'情感互动',
2195 start: 'dun25_start',
2196 scenes: {
2197 dun25_start:{text:`<p class=\"sys\">大理 · 洱海边 · 春节过后</p>
2198<p>春节刚过,你和林悦飞到了大理。出发那天北京还在下雪,到了大理一下飞机。阳光灿烂得让人睁不开眼,气温十八度,蓝天白云像Windows XP的默认壁纸。</p>
2199<p>\"我终于知道为什么那么多人来大理了。\"你脱掉羽绒服,\",因为这里的天是蓝的。北京的冬天,天空永远是灰白色的,像一张没刷新的网页。\"</p>
2200<p>\"你的比喻永远离不开代码。\"林悦也脱了外套,穿着一件薄薄的针织衫,\"但我不讨厌这个比喻。\"</p>`,choices:[{t:'🏠 先去客栈放行李',next:'dun25_inn',fx:{exp:5}}]},
2201 dun25_inn:{text:`<p>他们订的是一家洱海边的客栈,推开窗就能看到苍山洱海。老板是个四十多岁的北京人,以前在百度做产品经理,四年前来大理旅游就不想走了。</p>
2202<p>\"我在北京干了十二年产品。\"老板给你们倒茶的时候说,\"上线过DAU千万的产品,也做过三个月就关掉的项目。有一天我站在西二旗的地铁站里,看着乌泱泱的人群,忽然问自己。我到底在图什么?\"</p>
2203<p>你端着茶杯没说话。你想起自己每天挤地铁时的状态。戴着耳机,面无表情,像一台被塞进循环队列的数据包。</p>
2204<p>\"然后我就辞了。\"老板笑了笑,\"拿着积蓄来大理开了这家客栈。收入是以前的十分之一,但我的血压恢复正常了。\"</p>`,choices:[{t:'🧘 被这种生活态度震撼了',next:'dun25_lake',fx:{exp:12}}]},
2205 dun25_lake:{text:`<p>下午,你们租了两辆电动车沿着洱海骑行。路两边是大片的农田和零星的村庄,远处苍山上的积雪在阳光下闪着银光。</p>
2206<p>林悦骑在前面,风吹起她的头发和衣角。你跟在后面,看着她的背影,忽然觉得这画面应该被写进代码里。作为一个永远不会被删除的注释。</p>
2207<p>你们在一个叫喜洲的小镇停下来。镇上保留了很多白族的老建筑,石板路两边是卖扎染和乳扇的小店铺。</p>
2208<p>\"你看那个。\"林悦指着一家店门口的对联:<span class=\"mono\">\"上联:bug改不完 下联:需求做不完 横批:早晚加完\"</span></p>
2209<p>你看着那副对联愣了半天:\"大理的程序员连幽默感都这么佛系。\"</p>`,choices:[{t:'📸 拍下这副对联',next:'dun25_night',fx:{exp:15}}]},
2210 dun25_night:{text:`<p>晚上,你们坐在客栈的露台上看星星。大理的夜空没有光污染,银河清晰得像是有人在天空画了一道白色的笔触。</p>
2211<p>\"你看那颗。\"林悦指着天上一颗很亮的星星,\"那是金星。\"</p>
2212<p>\"你怎么知道?\"你问。</p>
2213<p>\"因为它是除了月亮之外最亮的。\"林悦说,\"我大学的时候加入了天文社。\"</p>
2214<p>你又震惊了。这个人到底还有多少隐藏技能?</p>
2215<p>\"你还会什么?\"他忍不住问。</p>
2216<p>林悦转过头看你,眼睛里有星星在闪:<span class=\"good\">\"我会的东西很多,但最想让你知道的,都已经告诉你了。\"</span></p>
2217<p>你的心跳漏了一拍。你转头假装在看星星,但嘴角的笑意怎么也藏不住。</p>`,choices:[{t:'💕 握紧她的手',next:'CHAPTER_COMPLETE',fx:{exp:25,affection:5}}]}
2218 }
2219 },
2220
2221 {
2222 title: '⛰️ 旅游游记 · 重庆爬山记',
2223 minChapter: 7,
2224 id: 'dun_26',
2225 category:'情感互动',
2226 start: 'dun26_start',
2227 scenes: {
2228 dun26_start:{text:`<p class=\"sys\">重庆 · 解放碑 · 五一假期</p>
2229<p>五一假期,你跟着林悦来到了重庆。一下高铁,一股混合着火锅底料和潮湿空气的味道扑面而来。</p>
2230<p>\"重庆的地形——\"你看着手机上的地图,表情逐渐扭曲,\"为什么导航显示我们在一栋楼的十楼,但目的地在一楼,而且中间没有电梯?\"</p>
2231<p>林悦已经习以为常了:\"这就是重庆。你看地图会疯,你问本地人,你们会说'往下走两层,再往左拐,有个防空洞穿过去就到了'。\"</p>
2232<p>你看着导航上那个扭曲得像意大利面条的路线,沉默了三秒:\"我写了五年代码,但重庆告诉我。我的抽象能力还远远不够。\"</p>`,choices:[{t:'🗺️ 放弃导航,靠直觉走',next:'dun26_stroll',fx:{exp:8}}]},
2233 dun26_stroll:{text:`<p>你们索性关掉了导航,开始在重庆的街头随机漫步。</p>
2234<p>走了大概十分钟,你发现了一个惊人的事实。重庆没有平路。所有的路都是上坡或者下坡。你们的手机步数在疯狂增长,但实际移动的直线距离可能只有两百米。</p>
2235<p>\"我强烈怀疑重庆的程序员写排序算法的时候,\"你喘着气爬一个陡坡,\"会把冒泡排序的复杂度优化成O(爬山)。\"</p>
2236<p>\"你还有力气开玩笑,说明爬得还不够。\"林悦面不改色地走在前面。</p>
2237<p>\"你为什么一点都不累?\"</p>
2238<p>\"因为我平时健身。\"林悦回头看了他一眼,\"而你的日常运动是从工位到茶水间的十步路。\"</p>`,choices:[{t:'🏋️ 明年一定要健身',next:'dun26_hotpot',fx:{exp:10}}]},
2239 dun26_hotpot:{text:`<p>中午,你们在一条小巷子里找到了一家苍蝇馆子。门面不到十平米,但门口排了二十多个人。老板娘操着一口重庆话在门口招呼:\"排到号的进屋坐,没排到的先点菜!\"</p>
2240<p>等了四十分钟,终于坐下了。锅底端上来的时候,你被那层厚厚的红油和成堆的花椒震住了。</p>
2241<p>\"这是微辣。\"林悦看了看菜单。</p>
2242<p>\"这他妈是微辣???\"你看着那锅像岩浆一样翻滚的液体。</p>
2243<p>\"重庆的微辣和北京的微辣是两种不同的度量衡。\"林悦淡定地夹了一块鸭血放进锅里。</p>
2244<p>你鼓起勇气吃了一口。第一秒是香的,第二秒是辣的,第三秒你的大脑像被格式化了。一片空白。</p>
2245<p>你端起旁边的一大碗冰粉一口气喝了半碗,才感觉自己活了过来。</p>`,choices:[{t:'🔥 越辣越想吃,根本停不下来',next:'dun26_night',fx:{exp:15}}]},
2246 dun26_night:{text:`<p>晚上,你们坐长江索道过江。缆车在空中缓缓滑行,脚下是宽阔的长江水面,两岸的灯火倒映在江面上,像是无数颗金色的星星在流动。</p>
2247<p>\"洪崖洞看起来像《千与千寻》里的汤屋。\"林悦靠在缆车的玻璃窗边说。</p>
2248<p>你看着那片金碧辉煌的建筑群,想了想说:\"但里面全是火锅店。\"</p>
2249<p>林悦笑了:\"你能不能别这么现实主义?\"</p>
2250<p>\"程序员的天职就是从浪漫中发现Bug。\"你一本正经地说。</p>
2251<p>林悦侧过头看着他,眼睛里有索道外的灯火在闪烁:\"那你从我身上发现Bug了吗?\"</p>
2252<p>这个问题来得太突然。你卡壳了。</p>
2253<p>过了好一会儿,你才说:\"你全身都是Bug——\"</p>
2254<p>林悦的脸色变了。</p>
2255<p>\",但都是feature。\"你说完,自己先笑了。</p>`,choices:[{t:'💕 这个回答应该及格了吧',next:'CHAPTER_COMPLETE',fx:{exp:20,affection:5}}]}
2256 }
2257 },
2258
2259 {
2260 title: '🏯 旅游游记 · 南京citywalk',
2261 minChapter: 8,
2262 id: 'dun_27',
2263 category:'情感互动',
2264 start: 'dun27_start',
2265 scenes: {
2266 dun27_start:{text:`<p class=\"sys\">南京 · 夫子庙 · 初夏</p>
2267<p>周末两天,你和林悦坐高铁去了南京。车程三个半小时,你在车上补了两个小时觉,看了一个小时的技术文档。</p>
2268<p>\"你出来玩还看技术文档?\"林悦不可思议地看着他。</p>
2269<p>\"下一个项目要用新的框架,我得提前看看。\"你说,\"这叫碎片化学习。\"</p>
2270<p>\"碎片化学习?\"林悦抢过你的手机锁了屏,\"你现在最大的碎片就是你的大脑。让它休息一下。\"</p>
2271<p>她把耳机塞进你的耳朵里。放的是陈粒的《走马》。窗外的风景从华北平原变成了江南水乡,田野和河流在阳光下闪着光。</p>`,choices:[{t:'🎵 听歌看风景,也挺好',next:'dun27_arrive',fx:{exp:5}}]},
2272 dun27_arrive:{text:`<p>南京南站修得像个巨大的机场航站楼。出站的一瞬间,一股湿润的、带着梧桐树叶气息的风扑面而来。</p>
2273<p>\"南京的梧桐是一大特色。\"林悦深吸了一口气,\"据说蒋介石当年为了宋美龄种了满城的法国梧桐。\"</p>
2274<p>\"现在这些梧桐也造福了普通老百姓。\"你看着路边那些粗得两个人合抱不住的大树,\"一棵树要长这么大,至少得五六十年吧。\"</p>
2275<p>你们坐地铁去了夫子庙。秦淮河两岸的灯红酒绿让你想起了《泊秦淮》。高中课本里背过的诗,此刻忽然有了画面感。</p>
2276<p>\"如果我生活在古代,\"你看着河边的画舫说,\"我大概是个账房先生。负责记录每艘船的收入支出,调拨人工,处理各个码头的对账。\"</p>
2277<p>\"这不就是你现在的工作吗?\"林悦说。</p>
2278<p>你愣了一下:\"……靠,你说得好有道理。\"</p>`,choices:[{t:'📖 去逛秦淮河',next:'dun27_river',fx:{exp:10}}]},
2279 dun27_river:{text:`<p>秦淮河白天和晚上是两种完全不同的气质。白天是游客的秦淮河。到处是卖纪念品和鸭血粉丝汤的店铺。晚上是诗人的秦淮河。灯光把河水染成了五颜六色,画舫上有弹古筝的姑娘。</p>
2280<p>\"来来来,给你在秦淮河边拍个照。\"林悦举起手机。</p>
2281<p>你站在栏杆边,身后的河水映着红色的灯笼光。你努力挤出一个自然的微笑。</p>
2282<p>林悦看了看照片,皱了皱眉:\"你这是什么表情?像是在debug的时候被产品经理拍了。\"</p>
2283<p>\"程序员的标准微笑就是这样。\"你说,\"三分自信,三分疲惫,四分'这个需求什么时候能改'。\"</p>
2284<p>林悦笑了,让你重新站好:\"那你现在想一下。你刚写完一段跑了三天没有出bug的代码。\"</p>
2285<p>你笑了一下,那是发自内心的、骄傲的笑。</p>
2286<p>咔嚓。\"这张好了。\"林悦满意地看着手机。</p>`,choices:[{t:'🔍 看看拍得怎么样',next:'dun27_food',fx:{exp:12}}]},
2287 dun27_food:{text:`<p>晚上,你们去了科巷。南京本地人推荐的吃货一条街。鸭血粉丝汤、鸡汁汤包、赤豆小元宵、盐水鸭。你觉得自己的胃像是一个无限容量的缓存。</p>
2288<p>吃小元宵的时候,你忽然说:\"南京这个城市挺好的。有历史,有吃的,节奏也不快。\"</p>
2289<p>\"怎么,想搬来南京?\"林悦问。</p>
2290<p>\"想了一下。\"你认真地说,\"南京的互联网公司虽然没有北京多,但也有不少。而且房价比北京友好太多了。\"</p>
2291<p>\"你在认真考虑?\"林悦放下勺子。</p>
2292<p>\"……没有。\"你赶紧说,\"就是随口一说。\"</p>
2293<p>但林悦看你的眼神告诉他。她记住了。</p>`,choices:[{t:'🌙 晚上去玄武湖散步',next:'dun27_lake',fx:{exp:15}}]},
2294 dun27_lake:{text:`<p>晚上九点,你们走到了玄武湖。湖面很大,在夜色中像一面巨大的黑色镜子。远处的紫峰大厦灯火通明,倒映在湖水中。</p>
2295<p>湖边的步道上有人在夜跑,有人在遛狗,也有人像他们一样在慢慢走。</p>
2296<p>\"你。\"林悦忽然开口,\"如果有一天你不想在北京待了,你想去哪里?\"</p>
2297<p>你想了想:\"去一个有海的地方?或者像大理那样节奏慢的地方。\"</p>
2298<p>\"那我不在怎么办?\"</p>
2299<p>这个问题太直接了。你张了张嘴,发现自己竟然不知道怎么回答。</p>
2300<p>林悦看你不说话,笑了一下:\"逗你的。\"然后她加快脚步走到前面去了。</p>
2301<p>你看着她的背影,在心里默默补了一句:<span class=\"good\">你去哪,我就去哪。</span></p>`,choices:[{t:'😊 追上去,谁知道呢',next:'CHAPTER_COMPLETE',fx:{exp:20,affection:5}}]}
2302 }
2303 },
2304
2305 {
2306 title: '🌶️ 旅游游记 · 长沙美食之旅',
2307 minChapter: 9,
2308 id: 'dun_28',
2309 category:'情感互动',
2310 start: 'dun28_start',
2311 scenes: {
2312 dun28_start:{text:`<p class=\"sys\">长沙 · 五一广场 · 盛夏</p>
2313<p>这段旅程的起因很简单。林悦刷到了一个关于长沙美食的视频,然后她转发给了你,附言:<span class=\"info\">\"走不走?\"</span></p>
2314<p>你回了一个字:\"走。\"</p>
2315<p>于是周六早上七点,你们已经坐在飞往长沙的航班上了。</p>
2316<p>\"你这次怎么答应得这么干脆?\"林悦问。</p>
2317<p>你老实地说:\"我查了一下,长沙的茶颜悦色不用排队。\"</p>
2318<p>林悦白了他一眼:\"你的旅行动机永远这么朴实。\"</p>`,choices:[{t:'🧋 第一站:茶颜悦色',next:'dun28_tea',fx:{exp:5}}]},
2319 dun28_tea:{text:`<p>你们第一站就冲向了五一广场附近的茶颜悦色。果然不用排队。因为今天是工作日。</p>
2320<p>\"等等,\"你看着菜单,\"今天是周六啊。\"</p>
2321<p>\"周六怎么了?\"林悦已经点完单了。</p>
2322<p>\"你说工作日不用排队……\"</p>
2323<p>\"我说的是'查过了不用排队',\"林悦接过她的幽兰拿铁,喝了一口,露出满足的表情,\"又没说是工作日还是周末。\"</p>
2324<p>你看了一下四周。确实没人排队。你默默地也点了一杯。</p>
2325<p>喝第一口的时候,你的表情变了:\"……好喝。\"</p>
2326<p>\"是吧?\"林悦得意地挑了挑眉,\"代码喝多了,偶尔也要喝点人间美味。\"</p>`,choices:[{t:'🥟 下一站:吃臭豆腐',next:'dun28_street',fx:{exp:8}}]},
2327 dun28_street:{text:`<p>长沙的太平老街是一条千年古街,现在变成了美食一条街。黑色的臭豆腐在油锅里翻滚,发出滋滋的声音和一种难以形容的气味。</p>
2328<p>你站在摊位前,表情复杂。你从小就对臭豆腐敬而远之。</p>
2329<p>\"尝一块。\"林悦用竹签戳了一块递到你面前。</p>
2330<p>\"我……\"</p>
2331<p>\"就一块。\"</p>
2332<p>你闭上眼睛,像第一次提交代码上生产环境一样,怀着视死如归的心情咬了一口。</p>
2333<p>然后他睁开了眼睛。</p>
2334<p>\"……好吃?\"他难以置信地看着手里的臭豆腐。外壳酥脆,里面嫩滑,配上辣椒酱和蒜蓉。跟他想象的味道完全不一样。</p>
2335<p>\"这就是人生。\"林悦又给你戳了一块,\"很多事情你不试一下,永远不知道结果是什么。\"</p>`,choices:[{t:'😋 再来三份!',next:'dun28_museum',fx:{exp:12}}]},
2336 dun28_museum:{text:`<p>下午,去了湖南省博物馆。你本来觉得博物馆没什么意思,但看到辛追夫人的时候,你沉默了。</p>
2337<p>一具两千多年前的尸体,居然保存得这么完好。皮肤还有弹性,关节还能活动。</p>
2338<p>\"两千年前的防腐技术,\"你看着展柜里的辛追夫人,喃喃道,\"那时候没有C++也没有Python,但人家做的系统稳定运行了两千年。\"</p>
2339<p>旁边一个游客听到你的话,忍不住笑了一声。</p>
2340<p>林悦赶紧把你拉到一边:\"你能不能不要在博物馆里讲冷笑话?\"</p>
2341<p>\"我认真的。\"你说,\"你看,我们写的代码上线后能稳定运行两年就烧高香了,但人家这个。两千年,零故障,零维护。这才是真正的'写一次,跑一辈子'。\"</p>
2342<p>林悦看着他认真的表情,忽然觉得——<span class=\"good\">这个男人认真的样子,还挺可爱的。</span></p>`,choices:[{t:'🏛️ 继续逛博物馆',next:'dun28_dinner',fx:{exp:15}}]},
2343 dun28_dinner:{text:`<p>晚饭去了一家藏在居民区里的湘菜馆。剁椒鱼头、辣椒炒肉、酸豆角、擂辣椒皮蛋。每一道菜都让你吃出了汗。</p>
2344<p>\"长沙人是不是没有微辣这个概念?\"你一边擦汗一边说。</p>
2345<p>\"有啊。\"林悦说,\"微辣就是少放一半辣椒。\"</p>
2346<p>\"那不还是全是辣椒吗!\"</p>
2347<p>吃到最后,老板送了一碗红糖冰粉。你吃完之后感觉整个人重新活了过来。</p>
2348<p>\"你。\"林悦忽然认真地说,\"今天开心吗?\"</p>
2349<p>\"开心。\"你没有犹豫,\"虽然辣得我怀疑人生。\"</p>
2350<p>\"那就好。\"林悦笑了笑,低头继续吃饭。</p>`,choices:[{t:'🌙 回酒店的路上看夜景',next:'CHAPTER_COMPLETE',fx:{exp:20,hp:10}}]}
2351 }
2352 },
2353
2354 {
2355 title: '🥾 旅游游记 · 云南徒步',
2356 minChapter: 10,
2357 id: 'dun_29',
2358 category:'情感互动',
2359 start: 'dun29_start',
2360 scenes: {
2361 dun29_start:{text:`<p class=\"sys\">云南 · 虎跳峡 · 初秋</p>
2362<p>你从来没想过自己会来徒步,但林悦说\"趁年轻去一次虎跳峡\",然后他就鬼使神差地答应了。</p>
2363<p>站在虎跳峡的徒步起点时,你抬头看了看面前的山路。蜿蜒向上,消失在云雾中。</p>
2364<p>\"你确定这条路是给人走的?\"你问。</p>
2365<p>\"这条路是给徒步的人走的。\"林悦已经背上登山包,调整好登山杖,\"走吧,前两公里是最难的。\"</p>
2366<p>\"后几公里呢?\"</p>
2367<p>\"后几公里是更难的。\"林悦笑着拍了拍你的肩膀,\"但风景会告诉你,一切都值得。\"</p>`,choices:[{t:'🥾 硬着头皮上吧',next:'dun29_hike',fx:{exp:10}}]},
2368 dun29_hike:{text:`<p>前两公里,你的想法是:我为什么要来这里?我是不是有病?这跟996有什么区别?</p>
2369<p>到了第三公里,你已经累得说不出话了。山路很窄,一边是陡峭的山壁,一边是深深的峡谷。耳边是金沙江的轰鸣声,震得人心里发颤。</p>
2370<p>\"休息一下。\"林悦在一块大石头边停下来,递给你一瓶水。</p>
2371<p>你一屁股坐在地上,大口大口地喝水。</p>
2372<p>\"你看那边。\"林悦指着远处的雪山。</p>
2373<p>你顺着她手指的方向看过去。玉龙雪山在阳光下闪耀着银白色的光芒,山腰缠绕着云带,像是仙境。</p>
2374<p>\"……确实值了。\"你说。</p>`,choices:[{t:'🏔️ 继续往前走',next:'dun29_midway',fx:{exp:15}}]},
2375 dun29_midway:{text:`<p>中午,你们到达了Halfway客栈。一个开在半山腰的客栈,是徒步路线上的著名补给点。</p>
2376<p>客栈的露台上摆着几张桌子,坐满了徒步的人。有人在吃炒饭,有人在跟外国人用蹩脚的英语聊天,有人在给远处的雪山拍照。</p>
2377<p>\"你知道吗?\"林悦点了一碗番茄鸡蛋面,\"这个客栈的老板以前是昆明一家互联网公司的产品经理,干了六年,觉得没意思,就来山上开了这个客栈。\"</p>
2378<p>你正在吃面,听到这话停下了筷子:\"怎么又是转行的产品经理?\"</p>
2379<p>\"因为有想法的人,不会一辈子困在一个地方。\"林悦认真地说。</p>
2380<p>你想了想,觉得这句话好像不只是说给老板听的。</p>`,choices:[{t:'🤔 继续吃面,若有所思',next:'dun29_summit',fx:{exp:18}}]},
2381 dun29_summit:{text:`<p>下午三点,你们终于到达了徒步路线的最高点。一个能看到金沙江大拐弯的观景台。</p>
2382<p>站在悬崖边上往下看,金沙江像一条碧绿色的丝带,在深深的峡谷中蜿蜒。对面的山峰层峦叠嶂,在云层中若隐若现。风很大,吹得人站不稳,但眼前的景色让你忘记了所有疲惫。</p>
2383<p>\"我写了这么多年代码,\"你扶着栏杆说,\"从来没有在哪一行代码里见过这样的风景。\"</p>
2384<p>林悦站在他旁边,风吹乱了她的头发:\"所以你要多出来走走。\"</p>
2385<p>\"嗯。\"你点了点头,然后转过头看着她,\"不过,如果不是你拉着我,我可能一辈子都不会来这种地方。\"</p>
2386<p>\"所以——\"林悦侧头看着他,眼睛里映着远处的雪山,\"你需要我。\"</p>
2387<p>你没有否认。</p>`,choices:[{t:'💕 我需要你',next:'CHAPTER_COMPLETE',fx:{exp:25,affection:5}}]}
2388 }
2389 },
2390
2391 {
2392 title: '🌅 旅游游记 · 青岛看海',
2393 minChapter: 11,
2394 id: 'dun_30',
2395 category:'情感互动',
2396 start: 'dun30_start',
2397 scenes: {
2398 dun30_start:{text:`<p class=\"sys\">青岛 · 栈桥 · 深秋</p>
2399<p>这一年快要结束了。你的年假还剩五天,林悦说\"不用就浪费了\",于是他们订了去青岛的票。</p>
2400<p>\"为什么是青岛?\"你在高铁上问了今天第三次同样的问题。</p>
2401<p>\"因为我想看海。\"林悦说,\"冬天的大海和夏天是不一样的。冬天的海更安静,像在沉思。\"</p>
2402<p>你想了想:\"夏天的海就像在debug?\"</p>
2403<p>\"你能不能什么都往代码上靠?\"</p>
2404<p>\"不能。\"你坦然地说,\"这是我的出厂设置。\"</p>`,choices:[{t:'🚄 青岛,到了',next:'dun30_arrive',fx:{exp:5}}]},
2405 dun30_arrive:{text:`<p>青岛站是一座德式风格的百年老站,出站就是大海。你站在站前广场上,看着眼前那片辽阔的蓝色,一时说不出话来。</p>
2406<p>深秋的海风带着凛冽的寒意,但阳光很好。远处的栈桥延伸进海里,尽头是一座亭子。海面上有白色的海鸥在盘旋,它们的叫声和海浪声混在一起。</p>
2407<p>\"冷吗?\"林悦裹紧了自己的围巾。</p>
2408<p>\"有点。\"你缩了缩脖子。</p>
2409<p>林悦从包里拿出一条围巾递给你:\"给你织的。\"</p>
2410<p>你愣住了:\"你……你会织围巾?\"</p>
2411<p>\"不会,为了你学的。\"林悦把围巾塞到你手里,耳尖微微发红,\"第一次织,织得不好,你别嫌弃。\"</p>
2412<p>你低头看着手里的围巾。针脚确实不太均匀,有些地方松有些地方紧,但颜色是他喜欢的深灰色。</p>
2413<p>你默默地把围巾围上,没有说话,但他心里的一些东西,悄悄地变暖了。</p>`,choices:[{t:'🧣 这条围巾比任何代码都珍贵',next:'dun30_walk',fx:{exp:12,affection:5}}]},
2414 dun30_walk:{text:`<p>你们在海边走了很久。从栈桥走到了第一海水浴场,又沿着海岸线走到了八大关。路边的梧桐树叶子已经黄了,风一吹就簌簌地往下掉。</p>
2415<p>八大关的别墅群在深秋的阳光下格外好看。红瓦绿树,碧海蓝天,像是一幅色彩饱和度很高的油画。</p>
2416<p>\"老了以后在这里买套房吧。\"林悦忽然说。</p>
2417<p>\"青岛的房子现在不便宜。\"你下意识地开始算账。</p>
2418<p>林悦看了他一眼:\"你这个人真的是……我说的是理想。你非得用现实把它敲碎。\"</p>
2419<p>你张了张嘴,想解释什么,但最后只说了一句:\"那我们就一起努力。\"</p>`,choices:[{t:'💪 一起努力',next:'dun30_beer',fx:{exp:15}}]},
2420 dun30_beer:{text:`<p>中午,你们在大学路附近找了一家小饭馆。你点了一盘辣炒蛤蜊和一盘鲅鱼水饺,又来了两杯青岛啤酒。原浆的,从酒桶里直接打出来的。</p>
2421<p>\"原浆啤酒和普通啤酒的区别——\"你喝了一口,开始科普,\"相当于内测版本和正式版本的区别。原浆不过滤,保留了酵母,口感更醇厚,但保质期只有三天。\"</p>
2422<p>\"所以我们现在喝的是内测版。\"林悦也喝了一口。</p>
2423<p>\"对。\"你说,\"而且我告诉你,这个内测版的体验比正式版好。\"</p>
2424<p>蛤蜊很新鲜,用辣椒和蒜蓉炒的,鲜辣开胃。鲅鱼水饺的皮很薄,里面的馅料是新鲜的鲅鱼肉和韭菜,咬一口会爆汁。</p>
2425<p>你吃着吃着,忽然感慨了一句:\"你说,我们以后会不会怀念这样的日子?\"</p>`,choices:[{t:'🍺 一定会怀念的',next:'dun30_sunset',fx:{exp:18}}]},
2426 dun30_sunset:{text:`<p>傍晚,你们去了信号山公园。</p>
2427<p>爬到山顶的时候,正好赶上了日落。整个青岛老城区在他们脚下铺展开来。红色的屋顶、绿色的树木、蓝色的海平面。夕阳把这一切染成了金红色。</p>
2428<p>远处的海面上,一艘货轮缓缓驶过,船尾拖出一道白色的航迹。海鸥在天空中成群地飞过,叫声在海风中回荡。</p>
2429<p>\"真好看。\"林悦轻声说。</p>
2430<p>你没有说话。你站在山顶,看着眼前这片景色,脑海中像放电影一样闪过了这一年多的种种——</p>
2431<p>面试时在电梯口撞到她的瞬间、北戴河的那个日出、夜晚篝火晚会上的对视、重构代码时她送来的麻辣烫、深圳出差时两个人在草坪上晒太阳……</p>
2432<p>所有的画面都交织在一起,最后汇成了眼前这片金红色的海。</p>`,choices:[{t:'💕 这一年,谢谢你陪着我',next:'dun30_end',fx:{exp:25,affection:8}}]},
2433 dun30_end:{text:`<p>太阳沉入了海平面以下,天边只剩下最后一抹橘红色的余晖。华灯初上,青岛老城区的灯光一盏一盏地亮了起来。</p>
2434<p>\"你。\"林悦叫了他一声。</p>
2435<p>\"嗯?\"</p>
2436<p>\"明年……\"她顿了顿,\"明年我们还一起出来玩好不好?\"</p>
2437<p>你转过头看着她。她的侧脸被夕阳的最后一缕光勾勒出一道柔和的轮廓,眼睛里有期待,也有小小的不安。</p>
2438<p>\"好。\"你说。</p>
2439<p>然后他又加了一句:\"明年、后年、大后年。只要你想去的地方,我都陪你去。\"</p>
2440<p>林悦没有说话,但她的手悄悄地、轻轻地握住了你的手。</p>
2441<p><span class=\"good\">山顶上的风还在吹,脚下的城市灯火璀璨,头顶的星星一颗一颗地亮起来。</span></p>
2442<p><span class=\"good\">这大概就是最好的时光。和你一起,去看更大的世界。</span></p>`,choices:[{t:'🌟 约定好了,拉勾',next:'CHAPTER_COMPLETE',fx:{exp:30,affection:10}}]}
2443 }
2444 },
2445{
2446 id:'dun_31',
2447 title:'捡到一只流浪猫',
2448 minChapter:1,
2449 category:'奇遇',
2450 scenes: {
2451 dun_31:{
2452 text:`<p>下班回家的路上,你听到路边花坛里传来微弱的"喵喵"声。拨开草丛一看,一只灰白相间的小奶猫蜷缩在纸箱里,脏兮兮的,正用一双水汪汪的大眼睛看着你。</p><p>你蹲下来,小猫居然主动蹭了蹭你的手指。你内心OS:<em>作为一个996程序员,我自己都养不活,还能养猫?</em></p>`,
2453 choices:[
2454 {t:'抱回家,从此过上铲屎官的生活',next:'dun_31_end',fx:{exp:10,money:5}},
2455 {t:'拍个照发朋友圈,然后默默走开',next:'dun_31_end',fx:{exp:10,money:5}}
2456 ]
2457 },
2458 dun_31_end:{
2459 text:`<p>【结局:猫主子驾到】</p><p>你最终还是把小猫带回了出租屋。花了半小时用旧毛巾做了个临时猫窝,又连夜外卖买了猫粮和猫砂。</p><p>当晚你加班到凌晨两点写代码,小猫就趴在键盘旁边呼呼大睡。第二天你顶着黑眼圈上班,却在摸鱼群里发了九宫格猫片,获得同事一致点赞。</p><p>老张评论:"完了,你从程序员沦为了猫奴,双重debuff叠满了。"</p><p>你回:"它叫我起床比闹钟准时,比我妈还关心我有没有按时吃饭。"</p><p>从此,出租屋里多了一个等门的小生命,你的代码里多了一个叫"咪咪"的注释变量。</p>`,
2460 choices:[
2461 {t:'完成',next:'__DUNGEON_END__'}
2462 ]
2463 }
2464 }
2465 },
2466 {
2467 id:'dun_32',
2468 title:'和老张喝酒',
2469 minChapter:2,
2470 category:'奇遇',
2471 scenes: {
2472 dun_32:{
2473 text:`<p>周五晚上,老张发来微信:"老地方,整点?"你看了看桌上改到一半的bug,又看了看天花板,回了个"到"。</p><p>烧烤摊上,老张已经点好了腰子和啤酒。你比你早毕业两年,现在是一家创业公司的CTO。其实整个技术部就他一个人。</p><p>"你说咱俩图啥?"老张灌了一口啤酒,"当年选计算机,以为能改变世界。现在世界没改变,颈椎倒是突出了。"</p>`,
2474 choices:[
2475 {t:'举起酒杯,和老张吐槽职场心酸',next:'dun_32_end',fx:{exp:20,money:10}},
2476 {t:'劝老张少喝点,聊点开心的事',next:'dun_32_end',fx:{exp:20,money:10}}
2477 ]
2478 },
2479 dun_32_end:{
2480 text:`<p>【结局:老友记】</p><p>你们从九点喝到凌晨一点,从K8s部署聊到人生理想。老张说他最近在写一个side project,打算做一个"程序员防猝死提醒APP"。每坐一小时就强制锁屏让你做拉伸。</p><p>"这不就是另一个PUA工具吗?"你笑喷。</p><p>"至少我写的时候自己也在用,"老张认真地说,"上个月体检,脂肪肝从重度变中度的了。"</p><p>结账时你们又抢着买单,最后石头剪刀布三局两胜。你赢了,所以老张付的钱。</p><p>回家的路上你收到老张的微信:"下次带你去吃那家新开的潮汕牛肉火锅,我请。"</p><p>你回:"行,我给你带瓶好酒。"</p><p>成年人的友谊很简单:一起吃过烧烤,一起骂过产品经理,那就是过命的交情。</p>`,
2481 choices:[
2482 {t:'完成',next:'__DUNGEON_END__'}
2483 ]
2484 }
2485 }
2486 },
2487 {
2488 id:'dun_33',
2489 title:'公司年会',
2490 minChapter:3,
2491 category:'奇遇',
2492 scenes: {
2493 dun_33:{
2494 text:`<p>又到了一年一度的公司年会。行政小姐姐提前两周就开始在群里催节目报名,你们后端组写了个抽奖程序作为压轴节目。</p><p>年会在五星级酒店举办,会场布置得富丽堂皇。你穿着唯一的一套西装(还是去年双十一打折买的),坐在角落默默刷手机。</p><p>台上主持人激情澎湃:"接下来是我们研发团队带来的。全自动AI抽奖系统!"</p><p>你被同事推上台,面对几百号人,手心冒汗。大屏幕上代码滚动,你的模块开始运行了。</p>`,
2495 choices:[
2496 {t:'紧张到忘词,强行演示随机数算法',next:'dun_33_end',fx:{exp:30,money:15}},
2497 {t:'即兴发挥,现场讲了个技术冷笑话',next:'dun_33_end',fx:{exp:30,money:15}}
2498 ]
2499 },
2500 dun_33_end:{
2501 text:`<p>【结局:年会高光时刻】</p><p>你清了清嗓子,说:"这个抽奖系统用了真正的随机数,不是Math.random()。我们从服务器CPU温度、网络延迟抖动和鼠标移动轨迹中提取熵源,保证绝对公平。"</p><p>台下安静了三秒,然后爆发出一阵笑声和掌声。CEO在台下冲你竖了个大拇指。</p><p>抽奖环节,你写的系统抽中了特等奖。一辆特斯拉的是一年使用权。中奖的是你们组刚入职三个月的实习生。整个后端组欢呼着把你抬上了台。</p><p>年会结束后,你收到了行政发的"最佳节目参与奖"。一张200块的京东卡。虽然不多,但你在报销群里多了个称呼:那个写抽奖系统的哥们。</p><p>回家的出租车上你刷着年会群里的表情包,嘴角忍不住上扬。这一年,好像也不是那么糟。</p>`,
2502 choices:[
2503 {t:'完成',next:'__DUNGEON_END__'}
2504 ]
2505 }
2506 }
2507 },
2508 {
2509 id:'dun_34',
2510 title:'黑客马拉松',
2511 minChapter:4,
2512 category:'奇遇',
2513 scenes: {
2514 dun_34:{
2515 text:`<p>公司一年一度的48小时黑客马拉松开始了。你和后端组的三个同事组成了"改bug不改命"战队,打算做一个AI代码审查工具。</p><p>第一天上午,你们在白板上画架构图,每个人都自信满满。到了下午,前端同事和设计同学因为配色方案吵了起来,你默默打开了VS Code开始写API。</p><p>晚上十一点,所有人都在犯困。外卖到了,是KFC的全家桶。你们围坐在会议室的懒人沙发上,一边啃鸡翅一边debug。</p>`,
2516 choices:[
2517 {t:'通宵肝代码,力争冠军',next:'dun_34_end',fx:{exp:40,money:20}},
2518 {t:'量力而行,先把MVP做出来再说',next:'dun_34_end',fx:{exp:40,money:20}}
2519 ]
2520 },
2521 dun_34_end:{
2522 text:`<p>【结局:冠军队的日常】</p><p>你们选择了务实路线。凌晨三点,MVP终于跑通了。虽然UI丑得像Windows 98,但核心功能:自动检测代码中的魔法数字和重复函数,真的能用了。</p><p>第二天下午的Demo展示,你们的产品经理上台演示时,工具当场抓出了他演示代码里的一个bug。全场笑翻,但也因此获得了最多的技术投票。</p><p>最后你们拿了第二名,奖品是每人一台机械键盘。第一名是市场部用ChatGPT做了个营销文案生成器。你们甚至不会写代码,纯靠prompt。</p><p>颁奖结束后,你抱着新键盘回到工位,发现屁股底下坐了一整天,腰已经直不起来了。同事给你递了一贴膏药:"黑马选手,这是你的工伤补贴。"</p><p>你笑了。下次黑客马拉松,咱们还来。</p>`,
2523 choices:[
2524 {t:'完成',next:'__DUNGEON_END__'}
2525 ]
2526 }
2527 }
2528 },
2529 {
2530 id:'dun_35',
2531 title:'给妈妈买礼物',
2532 minChapter:5,
2533 category:'奇遇',
2534 scenes: {
2535 dun_35:{
2536 text:`<p>母亲节快到了,你打开淘宝准备给老妈买礼物,结果发现。你完全不知道她喜欢什么。</p><p>你翻聊天记录,上次你妈给你发微信是一个月前,消息是:"儿子,天冷了加衣服。"你回了个"嗯"的表情包。</p><p>你觉得有点愧疚,决定今年好好准备。你咨询了办公室的女同事,她推荐了护肤品套盒。你打开商品详情,被价格吓了一跳。够你吃半个月外卖了。</p>`,
2537 choices:[
2538 {t:'咬咬牙买最好的护肤品',next:'dun_35_end',fx:{exp:50,money:25}},
2539 {t:'务实一点,买保健品加手写贺卡',next:'dun_35_end',fx:{exp:50,money:25}}
2540 ]
2541 },
2542 dun_35_end:{
2543 text:`<p>【结局:老妈的凡尔赛】</p><p>最终你买了那个贵妇级护肤品套装,在贺卡上写了一段话:"妈,这些年辛苦了。我在外面过得挺好的,别担心。"你犹豫了一下,又加了一句:"代码写得越来越好了,领导都夸我。"。虽然你妈根本不懂什么是代码。</p><p>母亲节当天,你发视频通话,你妈拆开礼物的时候嘴上说着"花这个钱干嘛",但嘴角压都压不住。</p><p>第二天你发现家族群里你妈发了九宫格,配文:"儿子送的礼物,这孩子太会花钱了。"下面亲戚们一排羡慕嫉妒的回复。</p><p>你姐偷偷私信你:"咱妈在小区广场舞群里炫耀了一整天,说儿子出息了。"</p><p>你看了看余额宝里所剩无几的存款,又看了看屏幕上那个还没改完的bug,笑了笑。值得。</p>`,
2544 choices:[
2545 {t:'完成',next:'__DUNGEON_END__'}
2546 ]
2547 }
2548 }
2549 },
2550 {
2551 id:'dun_36',
2552 title:'健身房偶遇',
2553 minChapter:6,
2554 category:'奇遇',
2555 scenes: {
2556 dun_36:{
2557 text:`<p>连续加班三个月后,你看着体检报告上的"颈椎生理曲度变直""建议适当运动"陷入了沉思。咬咬牙,你办了公司楼下健身房的年卡。</p><p>第一次走进器械区,你感觉自己像个闯进异世界的萌新。那些肌肉猛男们举着你看不懂的器械,发出奇怪的呻吟声。</p><p>你找到一台看起来最安全的跑步机,调了个快走速度。刚走了五分钟,旁边来了个小姐姐,轻轻松松跑了8km/h还面不改色。</p>`,
2558 choices:[
2559 {t:'默默调高速度,不能丢人',next:'dun_36_end',fx:{exp:60,money:30}},
2560 {t:'按照自己的节奏慢慢来',next:'dun_36_end',fx:{exp:60,money:30}}
2561 ]
2562 },
2563 dun_36_end:{
2564 text:`<p>【结局:健身之路】</p><p>你选择按自己的节奏来。毕竟来健身是为了健康,不是来卷的。跑了二十分钟你就气喘吁吁,扶着跑步机扶手怀疑人生。</p><p>这时旁边那个小姐姐递给你一瓶水:"第一次来?"你尴尬地点点头。她笑着说:"我刚开始也这样,坚持一个月就好了。"</p><p>后来你才知道她是个健身教练。在她的指导下,你开始了正规的训练计划。虽然每次卧推都像在和杠铃搏斗,深蹲完从厕所都蹲不下去。</p><p>一个月后,你发现写代码时肩膀没以前那么酸了。两个月的某天,你照镜子时隐约看到了一点点腹肌的轮廓。虽然大概率是灯光角度问题。</p><p>你给老张发照片炫耀,老张回:"P的吧?"你笑着把手机放回口袋。不管怎样,你迈出了第一步。</p>`,
2565 choices:[
2566 {t:'完成',next:'__DUNGEON_END__'}
2567 ]
2568 }
2569 }
2570 },
2571 {
2572 id:'dun_37',
2573 title:'深夜加班外卖',
2574 minChapter:7,
2575 category:'奇遇',
2576 scenes: {
2577 dun_37:{
2578 text:`<p>晚上十一点四十七分,你在工位上盯着屏幕上那个怎么也修不好的bug,感觉头发又掉了三根。肚子不合时宜地叫了一声。你这才想起来,从中午到现在只喝了一杯美式。</p><p>打开外卖软件,附近还在营业的只剩一家兰州拉面和一家沙县小吃。你翻了翻订单记录,这已经是你这周第七次点兰州拉面了。</p><p>你叹了口气,正准备下单,手机弹出一条消息:"您的外卖即将送达,请准备取餐。"</p><p>你愣住了。你没点外卖啊。</p>`,
2579 choices:[
2580 {t:'下楼取餐,看看是谁送的',next:'dun_37_end',fx:{exp:70,money:35}},
2581 {t:'以为是送错了,不理它继续加班',next:'dun_37_end',fx:{exp:70,money:35}}
2582 ]
2583 },
2584 dun_37_end:{
2585 text:`<p>【结局:深夜的温暖】</p><p>你带着疑惑下楼,外卖小哥递过来一袋热腾腾的粥和几盒小菜。订单备注栏写着:"加班辛苦了,注意身体。妈"</p><p>你愣在原地。</p><p>赶紧给你妈打电话:"妈,你怎么知道我加班?"</p><p>"你姐说你今天发朋友圈说bug改不完,我就让楼下那家粥铺给你送了一份。你姐给了我你的地址。"电话那头你妈声音有点不好意思,"也不知道你爱吃什么,就点了你上次回家说好吃的那个皮蛋瘦肉粥。"</p><p>你端着那碗粥,心里五味杂陈。回到工位,打开外卖盒,热气腾腾的粥让整个工位都暖和起来。</p><p>你拍了张照片发了个朋友圈:"我妈给我点的外卖,比任何单元测试都好使。"<br>配图是一碗冒着热气的皮蛋瘦肉粥。</p><p>三十分钟后,那个bug也改完了。</p>`,
2586 choices:[
2587 {t:'完成',next:'__DUNGEON_END__'}
2588 ]
2589 }
2590 }
2591 },
2592 {
2593 id:'dun_38',
2594 title:'周末做菜翻车',
2595 minChapter:8,
2596 category:'奇遇',
2597 scenes: {
2598 dun_38:{
2599 text:`<p>这个周末你决定。不点外卖了!你要自己做一顿饭,向生活证明你除了写代码还会别的生存技能。</p><p>你打开下厨房APP,选了一道看起来最简单的西红柿炒鸡蛋。去超市采购的时候,你甚至分不清生抽和老抽的区别,被超市大妈用关爱智障的眼神审视了一遍。</p><p>回到家,你系上围裙,打开抽油烟机,感觉自己像个大厨。鸡蛋打得很顺利。虽然有两片蛋壳掉进了碗里,被你用筷子小心翼翼地挑出来了。</p>`,
2600 choices:[
2601 {t:'严格按照菜谱执行',next:'dun_38_end',fx:{exp:80,money:40}},
2602 {t:'自信发挥,凭感觉加调料',next:'dun_38_end',fx:{exp:80,money:40}}
2603 ]
2604 },
2605 dun_38_end:{
2606 text:`<p>【结局:翻车实录】</p><p>你选择了凭感觉发挥。结果就是。西红柿炒鸡蛋变成了西红柿鸡蛋汤,因为你在西红柿出水后又倒了半碗水;盐放了两次(因为你忘了刚才有没有放过);最后试图用淀粉勾芡救场,结果变成了糊状物。</p><p>你看着锅里那滩颜色诡异的未知物体,沉默了整整十秒。</p><p>拍照发到程序员群里:"兄弟们,这个怎么debug?"</p><p>老张秒回:"你这是运行了rm -rf /吧?"</p><p>产品经理:"需求不明确导致的架构混乱,建议重构。"</p><p>设计同学:"UI配色需要优化,对比度太高了。"</p><p>你笑着倒掉了那锅"系统崩溃产物",然后下楼吃了碗牛肉面。</p><p>回家的路上你买了本《新手学做饭。从入门到精通》。你暗暗发誓:下周,我一定要复现一道能吃的菜!</p>`,
2607 choices:[
2608 {t:'完成',next:'__DUNGEON_END__'}
2609 ]
2610 }
2611 }
2612 },
2613 {
2614 id:'dun_39',
2615 title:'宠物咖啡厅',
2616 minChapter:9,
2617 category:'奇遇',
2618 scenes: {
2619 dun_39:{
2620 text:`<p>自从上次捡了猫之后,你彻底沦为了猫奴。周末,同事推荐了一家新开的猫咖,说里面还有柴犬和柯尔鸭,堪称"治愈系迪士尼"。</p><p>你抱着"去见见世面"的心态去了。推开门的瞬间,你被扑面而来的毛茸茸攻势击倒了。三只布偶猫同时从沙发上跳下来,迈着优雅的猫步走向你。</p><p>你找了个角落坐下,刚掏出笔记本想写点代码,一只橘猫直接趴在了你的键盘上,用行动表达了"不准工作"的态度。</p>`,
2621 choices:[
2622 {t:'放弃抵抗,专心撸猫',next:'dun_39_end',fx:{exp:90,money:45}},
2623 {t:'尝试和猫协商,争取写两行代码',next:'dun_39_end',fx:{exp:90,money:45}}
2624 ]
2625 },
2626 dun_39_end:{
2627 text:`<p>【结局:猫咖疗愈记】</p><p>你和键盘上的橘猫对视了三十秒,你输了。</p><p>你合上电脑,专心撸猫。那只橘猫在你的腿上打起了呼噜,像个小发动机一样发出咕噜咕噜的声音。旁边一只柯基犬摇着屁股走过来,把脑袋塞进你手底下求摸。</p><p>你在猫咖待了整整三个小时,期间:被猫踩了胸口、被狗舔了脸、被柯尔鸭追着跑了半圈,但当你看着这些无忧无虑的小生命时,那些烦人的bug、产品的无理需求、下周一的deadline。好像都不那么重要了。</p><p>你拍了段小视频发到群里:"这就是我要的生活。"</p><p>老张回:"你旁边那只猫的表情,跟我看你代码时的表情一模一样。"</p><p>你回了一个狗头表情包,然后下单买了一个猫咪饮水机寄回家。你家中的那位主子,也得安排上。</p>`,
2628 choices:[
2629 {t:'完成',next:'__DUNGEON_END__'}
2630 ]
2631 }
2632 }
2633 },
2634 {
2635 id:'dun_40',
2636 title:'回顾十年',
2637 minChapter:10,
2638 category:'奇遇',
2639 scenes: {
2640 dun_40:{
2641 text:`<p>深夜,你在整理旧硬盘时,发现了一个名为"我的代码生涯"的文件夹。打开一看,里面是你大学时写的第一个程序。一个用C语言写的"学生成绩管理系统"。</p><p>你点开代码,看到自己十年前写的代码:变量名全是a、b、c,函数名是fun1、fun2、fun3,整个程序只有一个main函数,长达两千行。你忍不住笑了。</p><p>又翻到一张照片:大四那年你和室友们在机房通宵做毕设,四个人挤在两台电脑前,桌上堆满了红牛和泡面。照片里你顶着鸡窝头,穿着格子衬衫,眼神里全是对未来的憧憬。</p>`,
2642 choices:[
2643 {t:'感慨万千,写下十年感悟',next:'dun_40_end',fx:{exp:100,money:50}},
2644 {t:'默默保存,然后继续改bug',next:'dun_40_end',fx:{exp:100,money:50}}
2645 ]
2646 },
2647 dun_40_end:{
2648 text:`<p>【结局:十年一梦】</p><p>你打开了终端,写了一段话然后保存为CHANGELOG.md:</p><p>"致十年前的自己:</p><p>你现在写的那个学生管理系统,函数名确实很烂,但成绩管理系统里的每个分数都是真的。你当时真的以为,写出那个系统就能改变教育行业。</p><p>你后来没有改变教育行业,但你在改变自己。你从一个连Git都不会用的菜鸟,变成了能在生产环境上从容部署的人。你从写'Hello World'都会报错的新手,变成了能带着实习生入门的前辈。</p><p>现在的你还是会写出bug,还是会为deadline焦虑,还是会在深夜加班时怀疑人生,但你也学会了:</p><p>- 不要用alert()调试<br>- 不要在周五下午部署<br>- 吃早饭很重要<br>- 代码review不是为了挑刺,是为了让彼此更好</p><p>十年前你选择了这条路,今天的你依然在路上。挺好。"</p><p>你保存了文件,关掉终端。明天还有一场迭代会议等着你,但你知道,这十年,你没白过。</p>`,
2649 choices:[
2650 {t:'完成',next:'__DUNGEON_END__'}
2651 ]
2652 }
2653 }
2654 },
2655 {
2656 id:'dun_tech_1',
2657 title:'SQL注入漏洞排查',
2658 minChapter:3,
2659 category:'技术挑战',
2660 scenes: {
2661 dun_tech_1:{
2662 text:`<p>周四下午,运维突然在群里@了你:<span class="mono">「你看看生产环境的慢查询日志,有几条SQL跑了十几秒。」</span></p><p>你打开日志一看,冷汗就下来了。有一条查询没有加任何条件,全表扫描了上百万条数据。再仔细一看——这行代码居然拼接了用户输入。</p><p>你找到自己三个月前写的一个接口。那个查询确实没有做参数校验。如果被恶意利用,整张用户表的数据都可能泄露。</p><p>你深吸一口气,打开代码开始修。</p>`,
2663 choices:[
2664 {t:'🔍 先分析SQL注入路径', next:'dun_tech_1_fix', fx:{exp:30,money:25}},
2665 {t:'🛠️ 直接改代码加参数校验', next:'dun_tech_1_fix', fx:{exp:25,money:30}}
2666 ]
2667 },
2668 dun_tech_1_fix:{
2669 text:`<p>你花了两个小时把这个接口和相关联的代码全部审查了一遍,把所有拼接SQL的地方都改成了参数化查询。</p><p>改完之后你还顺手加了一套自动化SQL审计规则——以后再有类似的拼接代码,CI/CD直接报错不让部署。</p><p>老张review完你的改动之后说了一句:<span class="good">"嗯,这个安全意识,算是到位了。"</span></p><p>你回了工位,把那条审计规则的文档写了出来,发到了团队Wiki里。技术债务清了一笔,安全风险也堵上了。</p>`,
2670 choices:[
2671 {t:'✅ 完成',next:'__DUNGEON_END__'}
2672 ]
2673 }
2674 }
2675 },
2676 {
2677 id:'dun_tech_2',
2678 title:'性能优化大挑战',
2679 minChapter:6,
2680 category:'技术挑战',
2681 scenes: {
2682 dun_tech_2:{
2683 text:`<p>产品经理Tony在群里发了一条消息:<span class="mono">「用户反馈数据导出功能太慢了,导出几千条就要等一分钟。」</span></p><p>你打开代码一看——导出用的是逐条查询+逐条写入Excel。逻辑没问题,但数据量一上来,每次数据库查询的往返延迟累积起来就很可观了。</p><p>你估算了一下:每条查询10ms,10000条就是100秒。"难怪用户要疯。"你自言自语。</p>`,
2684 choices:[
2685 {t:'📊 改成批量查询+流式写入', next:'dun_tech_2_end', fx:{exp:35,money:30}},
2686 {t:'⚡ 加缓存+异步处理方案', next:'dun_tech_2_end', fx:{exp:40,money:25}}
2687 ]
2688 },
2689 dun_tech_2_end:{
2690 text:`<p>你选择了批量查询方案。一次查500条,分页拉取,同时用SXSSFWorkbook流式写入Excel。改完之后自己先测了一轮——同样的数据量,从52秒降到了3.2秒。</p><p>上线的那个下午,Tony发了条消息:<span class="good">「牛逼!客户刚才反馈说导出快多了。」</span></p><p>你看着屏幕笑了一下,然后顺手把这个优化方案写成了技术笔记发到团队Wiki。对于其他人来说,下次遇到类似的问题就不用再踩一遍坑了。</p>`,
2691 choices:[
2692 {t:'✅ 完成',next:'__DUNGEON_END__'}
2693 ]
2694 }
2695 }
2696 },
2697 {
2698 id:'dun_tech_3',
2699 title:'Docker容器化部署',
2700 minChapter:9,
2701 category:'技术挑战',
2702 scenes: {
2703 dun_tech_3:{
2704 text:`<p>王姐找你谈话:<span class="info">「公司准备把整套系统迁移到Docker容器化部署,这个任务你牵头。」</span></p><p>你心里既兴奋又紧张。Docker你倒是在自己的项目上用过,但要把一整套企业级系统容器化——涉及十几个微服务、共享存储、负载均衡——完全是另一个级别的事情。</p><p>你打开了架构文档,面对着那份十几页的部署拓扑图,开始画容器化的方案图。</p>`,
2705 choices:[
2706 {t:'📝 先写详细的容器化方案', next:'dun_tech_3_end', fx:{exp:45,money:35}},
2707 {t:'💪 先拿一个非核心服务练手', next:'dun_tech_3_end', fx:{exp:40,money:30}}
2708 ]
2709 },
2710 dun_tech_3_end:{
2711 text:`<p>你用了两周时间完成了整套系统的容器化迁移。期间遇到过各种奇奇怪怪的问题——容器时区不对、日志采集不通、健康检查配置写错了导致滚动更新失败……每一个都让你挠掉了几根头发。</p><p>但最终,全部服务在Docker上稳定运行了。CI/CD流水线也接入了,每次部署从原来的半小时缩短到了三分钟。</p><p>上线那天,老张站在你身后看了一会儿:<span class="good">"你现在算是全公司最懂Docker的人了。"</span></p><p>你笑了笑,心想:头上的白头发也是最多的。</p>`,
2712 choices:[
2713 {t:'✅ 完成',next:'__DUNGEON_END__'}
2714 ]
2715 }
2716 }
2717 },
2718 {
2719 id:'dun_mystery_1',
2720 title:'打印机的秘密',
2721 minChapter:10,
2722 category:'神秘事件',
2723 scenes: {
2724 dun_mystery_1:{
2725 text:`<p>凌晨两点,办公室只剩下你一个人。你正在赶一个紧急上线,键盘声在空旷的楼层里回荡。</p><p>突然——打印机自动启动了。它不是那种待机唤醒的声音,而是真正的打印任务启动声。嘎吱嘎吱嘎吱。</p><p>你僵住了。整个楼层除了你没有第二个人。打印机的灯在黑暗中一闪一闪的,纸缓缓地从出纸口吐出来。</p><p>你犹豫了几秒,还是站起来走了过去。纸上只有一行字——<span class="mono">「你在看这份打印件的时候,有人在看你的代码。」</span></p>`,
2726 choices:[
2727 {t:'😨 环顾四周,检查有没有人', next:'dun_mystery_1_mid', fx:{exp:35,money:20}},
2728 {t:'📸 拍照发给林悦', next:'dun_mystery_1_mid', fx:{exp:30,money:25}}
2729 ]
2730 },
2731 dun_mystery_1_mid:{
2732 text:`<p>你拿起那张纸,翻到背面——背面还有一行字,字体更小:</p><p><span class="mono">「检查一下 /var/log/.secret 文件。你会感谢我的。」</span></p><p>你的好奇心战胜了恐惧。你打开终端,SSH连上了服务器。导航到那个目录。果然有一个隐藏文件。你用cat打开它——里面是一份log,记录了过去三个月里所有人的每一次数据库操作。</p><p>你倒吸一口凉气。这份log不应该存在。公司的审计系统没有这个东西。有人在服务器上藏了一个后门。</p>`,
2733 choices:[
2734 {t:'🔍 继续调查这个后门', next:'dun_mystery_1_end', fx:{exp:50,money:30}},
2735 {t:'⚠️ 立刻报告给技术总监', next:'dun_mystery_1_end', fx:{exp:40,money:35}}
2736 ]
2737 },
2738 dun_mystery_1_end:{
2739 text:`<p>【结局:服务器的守护者】</p><p>你连夜写了一份详细的调查报告。第二天一早发给了技术总监老陈。老陈看到报告之后沉默了很久,然后说了一句:<span class="good">"这个后门在你入职之前就存在了。你是第一个发现它的人。"</span></p><p>后来你才知道。那台打印机确实被人植入了IOT后门——通过打印机的网络接口入侵了内网。你发现的那个.secret文件是某个早已离职的运维留下的监控脚本。他没有恶意,只是"以防万一"留下了全量审计日志。</p><p>公司为此升级了安全策略,把所有IOT设备都隔离到了独立VLAN。而你。你得了一个新的外号:"打印机侦探"。</p><p>你又去了那台打印机前看了看。它安安静静地待在那里,再也没有在半夜自动打印过。但你总觉得它的指示灯——偶尔会不自然地闪一下。</p>`,
2740 choices:[
2741 {t:'✅ 完成',next:'__DUNGEON_END__'}
2742 ]
2743 }
2744 }
2745 },
2746];