七月的广州,热得像一口锅。
那种热不是干爽的炙烤,而是带着极高湿度的闷。空气像是凝胶,糊在人的皮肤上。城中村的楼栋建得毫无章法,楼与楼之间的距离近得能让人看清对面阳台上晾着的褪色T恤。空调外机嗡嗡地响,不间断地把热气吐在逼仄的巷子里,水滴砸在满是油污的水泥地上,很快就蒸发得没有痕迹。
我从出租屋出门,打算去巷口的便利店买一瓶冰水。推开防盗门的时候,热浪扑面而来。就在门口墙角的裂缝里,我看到长出了一棵不知名的草。叶片小小的,边缘有些打卷,但在四十度的水泥丛林里,它绿得有些不讲道理。
暑假过半。我没有回家。大三结束,大四的边缘,这是一个让人不太能安然躺平的节点。
留在广州的理由,说出来其实有些寒酸。学校的宿舍没有空调,或者说,为了省下那点高昂的电费和应对夜间的断电,我选择搬出来。我在学校附近的村子里租了一间房,每月八百块,一间不到十平米的隔断房。房间的窗户正对着另一栋楼的墙壁,白天也得开灯,终年见不到直射的阳光。
但这里有WiFi,有空调,有一张足够放下我那台外星人游戏本的桌子。对于一个软件工程专业的学生来说,这就足够构成一个完整的世界了。
bosszhipin_spider 就是在这个房间里写完的。
起因是一件很小的事。大我一届的学长在微信上发来一条消息,说他最近在找工作,被海投的反馈弄得很焦虑,问我:“帮我看看广州Python岗的薪资分布呗,你不是会爬虫吗?”
我也在焦虑。广州商学院,民办三本。在计算机这个极其看重学历和出身的行业里,这个头衔就像是一个隐形的滤镜,把简历投递出去后,多半会石沉大海。我拿过两次国家奖学金,绩点刷到了4.02,专业课的成绩单打出来很漂亮。但这就像是在一个偏僻的村落里考了第一名,走到大城市的人才市场,别人依然只会先看你的户口本。
于是我接下了学长的话茬,权当是给自己找点事做,转移一下对未来的恐慌。
我花了三天时间写那个爬虫。第一天写基础逻辑,第二天处理反爬机制——那些不断弹出的滑块验证和IP封禁让人头疼,第三天用Pandas和Matplotlib做了数据清洗和可视化。我抓了两万条广州地区的招聘数据。屏幕上跑出最终的散点图和柱状图时,房间里的空调正发出老旧压缩机特有的轰鸣。数据很直白,薪资方差很大,学历门槛的硬性要求比想象中还要冷酷。
后来,我把这份代码整理了一下,写了一份还算详尽的README,传到了GitHub上。
没指望会有什么波澜,毕竟GitHub上的开源项目浩如烟海。但接下来的半个月里,我断断续续收到了57个Star。
有一天深夜,我正看着天花板发呆,手机屏幕亮了。是一封GitHub的邮件提醒。有人在Issue里问,能不能增加一个配置文件,支持抓取北京和上海的数据。过了两天,又有一个陌生的ID发来了一个Pull Request,他帮我修了一个在Windows环境下运行会报错的UTF-8编码问题,那个bug我之前在Mac上测试时完全没有注意到。
我点开那个PR的代码变动,只加了两行代码,但逻辑很漂亮。
那是一种很奇妙的体验。在这个十平米、终日不见阳光的隔断房里,我的身体被困在广州七月的闷热和城中村的廉价气味中。但我的代码像一粒微小的种子,顺着墙角那根老旧的网线爬出去,穿过海底光缆和无数个路由节点,落在了几千公里外陌生人的屏幕上,甚至还在别人的电脑里生了根。
这种跨越物理空间的连接,让我短暂地忘记了三本学历带来的逼仄感。
海德格尔有个概念叫“间距”(Abstand),他在《存在与时间》里提到,人总是在与他人的间距中确认自身,这种间距往往带来比较和焦虑。放在我的语境里,这种间距就是985高校和民办三本的间距,是大厂Offer和外包公司的间距。
但我现在更喜欢另一种理解:间隙不是空虚,也不是纯粹的落差,它是可能性本身。
出租屋和学校之间,有一条步行大概二十分钟的路。我每天傍晚会走这条路去学校食堂吃饭,顺便透透气。路上会经过一个喧闹的菜市场,一家门口永远转着三色灯柱、音响里永远在放周杰伦《暗号》或《轨迹》的理发店,还有一棵被各种黑色电线死死缠绕的老榕树。
这些都是城市的缝隙。它们杂乱、无序,在任何一份光鲜亮丽的城市规划图上都不会被重点标注。但真实的生活恰恰发生在这里。菜市场里卖水产的老板娘每天都在用带着浓重口音的粤语和顾客讨价还价,理发店的学徒坐在台阶上抽烟,看着路过的女大学生发呆。
写代码的逻辑其实也是如此。我渐渐发现,那些真正解决问题的灵感,或者说对于程序架构的顿悟,从来不会出现在你正襟危坐、死死盯着需求文档和IDE的时候。
它们总是出现在间隙里。
比如洗澡时,水流冲过头发的瞬间,突然想到那个多线程死锁的问题是因为少加了一个互斥锁;比如走在菜市场,闻到那种混合着鱼腥味和烂菜叶的湿润气味时,脑子里突然理顺了数据库表的关联逻辑。那些脑子放空、不再强迫自己思考的间隙,才是想法真正生长的土壤。
我开始不再那么执着于去填补所谓学历上的“间隙”。拿双国奖、保持4.02的绩点,是我能做到的本分,是我在既定规则里争取到的最大空间。但我不需要每天都在心里重复那些比较。我只需要像写那个爬虫一样,找到一个具体的问题,写一行具体的代码,然后把它丢进世界的缝隙里。
八月底,广州的雨季来了几场暴雨,气温终于降下去了几度。暑假结束,我把这间十平米的出租屋退了,准备搬回学校宿舍,迎接大四的秋招。
收拾东西没花多少时间,一个行李箱,一个双肩包,装着一台电脑和几件换洗衣服。房东阿姨来退押金时,仔细检查了空调和热水器,确认没坏后,把钱微信转给了我。
拉着行李箱走出巷子的时候,我下意识地回头看了一眼。
墙角那棵不知名的草还在那里。它比一个月前我初见它时更高了一些,茎秆稍微粗壮了一点。因为最近的几场雨,它周围的水泥地上长出了一点点青苔。它的叶片上沾着城中村特有的灰尘和油污,但依然是绿着的。
这一个月里,没人给它浇水,没人给它施肥,甚至路过的流浪狗都懒得在它旁边做记号。它只是偶然落在了一条极其狭窄的裂缝里,然后用力地、安静地活着。它不抱怨水泥地的坚硬,也不去羡慕公园里被精心修剪的草坪。
它只是完成了属于它自己的生长。
我拉起行李箱的拉杆,轮子在凹凸不平的石板路上发出沉闷的滚动声。耳机里放着一首很安静的纯音乐,我朝着学校的大门走去。
我想,这大概也是某种回答。
