关于写软件十年的事

整理数字资产时,我翻到了一些旧文件的扫描件。其中一份是我刚到杭州时和公司签订的劳动合同,期限从2016年7月1日起,到2019年7月1日止。合同还没到期,我便换了工作,去了杭州的另一家大公司。重新看到这些扫描件,我想起了从北京搬到杭州的那段时间。

2016年春天,我忙着打印、装订硕士论文,参加毕业答辩。四月的北京还不算太热,我拖着借来的行李车,一趟又一趟地往返于宿舍和快递站之间,把自己在北京的存在一箱箱寄走,期待着在另一个城市把这些包裹拆开,重新安顿下来。

没钱的日子过得简单,多年以后,反而容易想起。毕业以后,在正式工作开始之前,我有三个月的自由时间。读书时给老师打工攒下的钱不够生活,有时还要靠支付宝借呗周转。旅行、购物、在外吃饭之类的消遣,自然也不在考虑之内。探索城市、研究做饭和写代码,这三件事占去了这三个月的大部分时间。

生活拮据,能用体力解决的事情,我就不用财力。

探索城市这件事,就交给了前一小时免费骑行的杭州公共自行车。我偶尔走路或乘坐公交,但无论路程远近,也无论是否下雨,骑车始终是我的首选。后来,我咬牙买了一辆自行车,行动范围扩大了,也收到了人生中的第一张交通罚单。

第二件事是研究做饭。用便宜的食材和简单的方法尽量把自己填饱,是最主要的目标。土豆泥、炒蔬菜和炒米饭经常出现在我的菜单上。是否便宜、能否吃饱,比味道和卖相重要。

第三件事是写代码,我把大部分时间和热情都投入了进去。

当时选择学计算机,并非因为这个专业的就业前景,更多是因为软件开发在时间和空间上的自由。与硬件研发不同,当时写软件不需要实验室,也不需要专门的仪器设备。有一台电脑,就可以随时随地开始,哪怕最初只是为了好玩。

更吸引我的,是软件在理想状态下所具有的精密与秩序。经过合理抽象、严密设计和优雅实现的软件,能够稳定运行,具有良好的扩展性,并随着需求的变化持续演进。一个好的系统,应该像一块精致的瑞士手表,各个零件完美契合,走时分毫不差。我以为,前期精巧的设计和实现,加上后期简单的维护,就能保证整个系统长期稳定。

这种巧妙而完整的感觉让我深深着迷。从模块抽象、编码风格,到系统架构和算法实现,我认真学习前人的经验,也努力把它们应用到自己的程序中。

带着一些知识和十分浅薄的经验,我签下了人生中的第一份劳动合同,想在真实工作中验证自己所学的一切。研究生阶段虽然也接触过一些项目,但从规模和使用场景上看,都算不上严格的生产环境。对我而言,那份合同不只意味着工作的开始,也意味着过去积累的知识终于可以派上用场。

此后的三段工作经历,逐渐瓦解了我对完美软件的想象。

最初,我并没有怀疑自己的想法,只认为第一份工作的规模有限,自己的经验也不足,学到的知识因此没有用武之地。于是,我进入了国内一家规模较大的软件公司。我以为,在更成熟的组织里,由更优秀的工程师负责更重要的项目,软件应该会被设计得更加严密。

但事情并没有因此改变。项目依然在不断变化的需求中推进,设计不断向期限妥协,很多问题只能先处理眼前的需求,其他问题留到以后。我开始怀疑,也许这并不是软件开发本身的问题,只是工作环境和组织文化造成的。

后来,我又去了一家跨国软件公司,想看看更成熟的工程体系是否能让软件少一些仓促的设计和短期妥协。结果依然相似。在我所经历的团队里,很多设计只需要支撑未来几个月,因为再往后,方向可能已经改变,负责人可能已经离开,甚至整个部门都可能不复存在。

我先把问题归咎于公司的规模,后来又归咎于组织文化。走过三家公司以后,我才意识到,这并不是几家公司偶然出现的相同问题。问题不在于某一家公司不够优秀,而在于我从一开始就误解了软件开发。

到这时我才明白,软件并不是瑞士手表。手表的功能是明确的,结构在制造完成时已经确定,也不需要在运行中不断增加新的功能。软件更像一座持续建设的城市,没有预定的边界。它需要回应新的需求,也不得不在运行中不断改变。

老城区无法被轻易推倒,新的区域却又急需建设;有些道路下面还埋着老旧的电缆,有些新建的楼宇里已经铺了光纤。那些临时搭建的结构可能沿用很多年,原本规划完整的部分也会因为新的需求不断改变。软件和城市一样,都是普通人在有限的时间、信息、能力和组织条件中一点点建设出来的。

补丁和妥协并不只是软件偏离理想后留下的痕迹,也是维持系统运行的方式。软件没有最终完成的时刻,只有一个个暂时能够运行的状态,直到整个系统被废弃或取代。

但软件的问题还不止于工程上的不完美。当一套软件被投入使用,它就不再只是由代码和架构构成的工程系统。它会进入人的生活,被公司和个人用于实现某些目的。工程上的正确,并不等于它会带来好的社会结果。一套结构优雅、性能优秀、运行稳定的软件,也完全可能产生糟糕的社会后果。

我并不是因此否认软件能够改善人的生活。我开始怀疑一种更简单的信念:设计良好的软件,自然会让世界变得更好。

软件依然能够改变世界,只是创造它的人无法独自决定这种改变最终通向哪里。一套软件进入社会以后,它的作用会被设计者的目的、组织的利益、使用者的选择以及具体的社会环境共同塑造。

曾经,我相信网络更快、内容更多、交流更容易,会让人更接近真相,也更容易理解彼此。如今的网络却更像一排彼此隔绝的格子间。我们坐在其中,以为四面墙上开着通往世界的窗户,后来才发现,那些窗户其实是不断刷新的屏幕,反复展示着更符合我们既有判断的世界。

更让我不安的是,我也身处其中。我通过屏幕认识世界,被不断出现的信息牵引,在愤怒、惊讶和感动之间切换。我以为自己看见了更多,注意力却变得越来越零碎,与具体生活的联系也逐渐减弱。

我开始意识到,需要重新审视的不只是技术,还有我自己。十年前,我关心怎样建立一个更好的系统,相信清晰的抽象、精密的结构和正确的实现能够使复杂的事物变得有序。如今,我依然欣赏这些东西,却不再把它们当作理解世界的唯一方式。

我想做一些更接近具体生活的事情,接触真实的人和地方,感受美,保存记忆。

我开始阅读,了解自己到不了的地方,也为下一次出发寻找线索。我开始旅行,亲自走过那些道路、城市和村庄,而不再只是隔着屏幕了解它们。我与不同的人交谈,听他们讲述各自的生活,也借由他们的目光,看见同一个世界不同的模样。我用相机拍下沿途遇见的人和地方,以及那些容易被忽略的日常。我也偶尔写作,记录一些零散的思绪和那些不愿轻易忘记的经历。

我逐渐明白,世界并不总是按照清晰的逻辑运行。理解它,不只需要分析和判断,也需要认真地观看、感受和倾听。软件教会我拆解和解决问题,文学、艺术和哲学则让我接受,有些问题无法被彻底解决,人仍要带着它们继续生活。

十年前,因为没有钱,能用体力解决的事情,我就不用财力。走路、骑车、自己做饭,都是当时不得已的选择。现在,我想重新拾起这种生活方式,但出发点已经不同。

走路、骑车、旅行、与人交谈、举起相机、写下文字,这些事情不一定高效,却能让身体和注意力重新进入现场,让我和世界之间少隔一层屏幕。

体力所及之处,或许正是我重新与世界交谈的地方。

2026年7月17日
又下雨了