在初创公司度过的第一个月会给人留下深刻印记。这里没有缓慢的适应期,也没有在等待 IT 配置笔记本电脑时盯着入职培训视频的一周。从第一天起,你就被期望去构建、破坏并修复那些真实用户会实际使用的东西。在加入 Treevah 之后,我很快意识到了这一点。Treevah 是一家致力于开发工具以帮助求职者整理申请进度的公司。在初创阶段的环境中度过的三十天,教会我的软件开发知识比任何课堂或竞赛都要多。
节奏紧凑,永不停歇
在 Treevah,工作不会等你适应后再开始。团队正努力推动产品从 alpha 版向 beta 版过渡,并最终进入生产环境,这意味着每一项任务都至关重要。这里没有敷衍了事的工作,也没有那种会被扔进教授收件箱里吃灰的任务。当你发布一个功能时,它会直接交付给那些正在寻找下一份工作、试图追踪截止日期、面试安排和后续跟进的真实用户。
这种节奏令人精疲力竭。你每天都在飞速运转,工作量的堆积速度远超你的预期。截止日期并非抽象的概念,它们与里程碑紧密相连,而这些里程碑决定了公司能否服务更多的求职者,或者能否修复当前体验中的缺陷。这种沉重感会让你感到疲惫,但它也带来了一种在大公司中难以寻觅的清晰感。当我完成一项任务时,我可以在我构建的东西与一个现在能更轻松管理求职进程的人之间,画出一条清晰的直线。这种主人翁意识是难能可贵的,它让疲劳也变得值得。
在生产环境中,技能积累得更快
在这个夏天之前,我的大部分精力都花在公众演讲和黑客松上。这两者都教会了我如何随机应变,以及如何在压力下展示想法。尤其是黑客松,它训练你在几小时内拼凑出一个可运行的演示 demo。但在“能让评委眼前一亮的周末项目”与“必须经受数百名真实用户考验的生产环境代码”之间,存在着本质的区别。
在 Treevah 专注于 Web 开发的一个月填补了这一差距。在学校里,项目都有“护栏”。范围是固定的,需求是手把手喂到嘴边的,如果你的数据库 Schema 崩溃了,你可以在演示幻灯片里解释过去。但在初创公司,你的 Schema 必须稳固,因为真实的求职者正在其中存储真实的申请数据。反馈循环是即时且毫不留情的。当页面加载缓慢或表单保存失败时,没人关心你的成绩;他们只关心自己是否刚刚错过了一个机会。
这种压力迫使你成长。你学习编写更整洁的代码,不是因为评分标准要求,而是因为你就是那个要在半夜进行调试的人。你在代码审查(code review)期间学会提出更尖锐的问题,因为部署一个损坏的构建版本意味着真实用户会撞上“南墙”。这里的机会带来的冲击力远比学校项目要大。错误成本更高,因此教训也更深刻。
面对 Bug 时那份令人谦卑的现实感
如果说有什么迷思是我想要彻底打破的,那就是“每一个软件 Bug 都是一场戏剧性的逻辑失败”的想法。当然,有些确实如此。但在 Treevah 遇到的许多 Bug 都是令人抓狂的小问题。它们隐藏在显眼之处,白白浪费了我数小时的生命。
有两种模式反复出现。第一种是重复的 CSS 规则。当多个开发者在多个迭代(sprint)中触及同一个组件时,样式表就会变得臃肿。一个人添加了一个外边距(margin)工具类,而另一个人在组件文件中硬编码了一个值。单独来看,两者都没错。但结合在一起,它们会产生布局偏移(layout shifts)或权重之争(specificity wars),导致一个按钮在 Chrome 上看起来很正常,在 Safari 上却显示异常。追踪这类问题意味着你需要打开浏览器开发者工具,逐行检查计算样式(computed styles),而不是阅读优雅的算法逻辑。
第二种是在父级 div 之外定义元素。一个模态框(modal)触发器或下拉菜单可能会被附加到 DOM 中的错误节点。屏幕看起来几乎没问题,于是你以为结构是稳固的。接着,z-index 冲突出现了,或者点击事件冒泡到了错误的处理器,突然间,用户无法关闭一个遮挡了申请表单的弹窗。这些并不是计算机科学难题,而是当你追求速度时,容易累积的空间和结构上的疏忽。
有些 Bug 花了好几周才找到。我会盯着代码,说服自己逻辑没问题,然后一头扎进毫无结果的死胡同。这种挫败感是真切的。你会觉得漏掉了一些显而易见的东西,而事实也确实如此。但最终发现一个重复规则或一个放错位置的闭合标签时,那种满足感却出奇地
