晋江文学城
下一章 上一章  目录  设置

126、第126章:经济转折:第一个技术兼职 CS1 ...


  •   CS106B的教授办公室门开着,沈清辞站在门口,犹豫着要不要敲门。德雷克教授正在电脑前打字,眼镜滑到了鼻尖,花白的头发像一团被风吹乱的云朵。

      “教授?”

      德雷克抬起头,透过眼镜上方看他:“沈。进来吧。正好要找你。”

      沈清辞走进办公室。空间不大,堆满了书和论文,墙上的白板写满了算法推导。空气里有咖啡和旧书的混合气味——典型教授办公室的味道。

      “你上周交的作业,”德雷克从一堆文件中抽出一份打印件,“关于图着色问题的算法优化。你的解法很有创意。特别是你用马尔可夫链蒙特卡洛方法近似求解的那部分——这不是课程要求的内容。”

      沈清辞的心跳微微加快。这是批评还是赞扬?

      “我自己看了一些额外资料,”他说,“觉得可能有用。”

      “确实有用,”德雷克摘下眼镜,用衬衫下摆擦了擦,“你把时间复杂度从指数级降到了多项式级,虽然牺牲了精确解,但在实际应用中足够好。这个思路很好。”

      “谢谢教授。”

      德雷克重新戴上眼镜,仔细打量着沈清辞:“你是大一?”

      “是的。”

      “以前有编程经验?”

      “在国内参加过信息学竞赛。”

      “怪不得,”德雷克点头,“我认识一个创业公司的CTO,他们在做社交网络分析平台,需要处理大规模图数据。他们最近在找一个兼职的算法实习生,时薪不错,还能远程工作。你感兴趣吗?”

      沈清辞几乎要脱口而出“我感兴趣”,但他忍住了,先问:“时薪多少?”

      “25美元一小时,每周最多20小时。但考虑到你是大一,可能先定10小时比较合适。而且,”德雷克顿了顿,“这是正规公司,需要报税,你要申请CPT(课程实践培训)。”

      25美元一小时。

      沈清辞快速计算:25美元×10小时=250美元一周。一个月四周就是1000美元。这比他洗盘子(每月约700美元,如果每天工作)和图书馆工作(每月约400美元)加起来还多。而且——最重要的是——这是技术工作,对简历有帮助,还能学到东西。

      “我感兴趣,”他说,努力保持声音平稳。

      “好,”德雷克在便签纸上写下一个邮箱和名字,“这是CTO的联系方式。你发邮件给他,附上你的简历和这个作业的代码。我会提前跟他打个招呼。”

      沈清辞接过便签纸。上面写着:“马克·罗森伯格,SociaLyze联合创始人兼CTO”。

      “谢谢教授,”他说,这次声音里有了真实的感激。

      “不客气。你有潜力,但需要机会。这就是一个机会。”

      沈清辞离开办公室,走在走廊上时,感觉脚步都轻快了。25美元一小时。技术工作。创业公司。

      这是他来美国后,第一次不是因为“需要钱”而找到工作,而是因为“有能力”而得到机会。

      ---

      三天后,2014年3月13日,周四下午3点

      SociaLyze的办公室在帕洛阿尔托市中心的一栋三层小楼里。外墙是红砖的,爬满了常春藤,看起来不像科技公司,更像是什么律师事务所或设计工作室。

      沈清辞提前十五分钟到达。他穿着最好的衣服——一件在旧货店淘到的深蓝色衬衫(5美元,几乎全新),配上黑色裤子(10美元,裤脚有点长,他自己用针线改过)。他背着双肩包,里面装着笔记本电脑、简历打印件,还有一瓶水。

      前台接待他的是一位年轻女生,金发,笑容灿烂:“你是沈清辞?马克在二楼等你。”

      二楼是开放办公区,十几张办公桌,白板上写满了架构图和数学公式。空气里有咖啡和年轻科技公司特有的活力感。

      马克·罗森伯格坐在角落的一张办公桌后,四十岁左右,光头,穿着灰色T恤和牛仔裤,正在和两个人讨论什么。看到沈清辞,他挥手示意:“稍等两分钟。”

      沈清辞站在旁边,观察着这家公司。员工都很年轻,大多数在二三十岁。有人在写代码,有人在讨论产品设计,有人戴着耳机专注工作。墙上贴着公司的标语:“理解连接,预测行为”。

      “沈?”马克结束了讨论,走过来,“我是马克。德雷克教授说你很厉害。”

      “谢谢,”沈清辞和他握手。马克的手很有力。

      “我们到会议室谈,”马克带他走进一间玻璃隔断的小会议室,“坐。要喝什么吗?水?咖啡?”

      “水就好。”

      马克从冰箱里拿了一瓶水给他,然后坐在对面:“德雷克教授把你的作业发给我看了。确实不错。特别是马尔可夫链蒙特卡洛的应用——很多大三学生都不懂这个。”

      “我在国内学过一些概率论和随机过程。”

      “很好。那么,我想先问你几个技术问题,看看你的实际能力。可以吗?”

      “当然。”

      接下来的半小时,马克问了沈清辞一系列问题:关于图算法、时间复杂度分析、分布式系统基础、Python和C++的区别。沈清辞大多能回答,有些问题他没学过,就诚实地说“这个我不了解,但我会去学”。

      马克一边听一边在笔记本上记着什么。最后,他说:“OK,基本的技术能力没问题。现在,我想给你一个实际问题,看你如何解决。”

      他从白板架上拿起一支马克笔:“假设我们有一个社交网络图,有1亿个节点,平均每个节点有150个连接。我们需要快速找出所有三角形关系——也就是A连接B,B连接C,C连接A的三元组。传统算法需要O(n^3),在这么大图上不现实。你有什么想法?”

      沈清辞看着白板上的问题。大规模图,三角形计数。这是社交网络分析中的经典问题,确实计算复杂度很高。

      他思考着。传统方法是三重循环,肯定不行。那有什么优化方法?

      他想起了高中时,陆星衍教过他的一种数学思维:当问题太大无法直接解决时,尝试分解、近似或转换问题。

      “也许我们可以用抽样方法,”沈清辞说,“不用计算所有三角形,而是随机抽样一部分节点,计算这些节点形成的三角形,然后根据抽样比例估算总数。”

      “思路不错,”马克点头,“但抽样误差可能很大,尤其是当三角形分布不均匀时。”

      “那……也许可以用邻接矩阵的谱方法?”沈清辞说,但这个想法一出口他就知道不对——1亿节点的邻接矩阵太大了,内存放不下。

      马克微笑:“放轻松,这不是考试。你可以思考一下。”

      沈清辞闭上眼睛。他需要转换思路。三角形计数……本质上是在图中找到闭合的三元环。这和图论中的什么概念相关?

      突然,他想到了什么。

      “我们可以用节点度数的信息来优化,”他说,“在社交网络中,度数高的节点(大V)参与的三角形更多。我们可以按度数排序节点,优先处理高度数节点。同时,我们可以把图分成多个社区,社区内的三角形密度更高,社区间的三角形很少。这样我们可以先识别社区,然后在每个社区内计算三角形,最后合并结果。”

      马克的眼睛亮了一下:“继续说。”

      沈清辞越来越有信心:“具体来说,我们可以用Louvain社区发现算法先对图进行社区划分,时间复杂度接近线性。然后在每个社区内,我们可以用更精细的算法,比如把邻接表转换成比特位图,用位运算加速三角形检测。因为社区规模远小于整个图,所以内存和计算都可行。”

      “那社区间的三角形呢?”

      “社交网络的社区结构通常很明显,社区间的连接很少。我们可以单独处理这些跨社区的边,数量不会太多。”

      马克沉默了几秒,然后笑了:“很好。非常实际的思路。你提到的Louvain算法确实适合大规模图,位运算加速也是常用技巧。最重要的是,你考虑到了实际系统的限制——内存、计算时间、数据分布。”

      沈清辞松了口气。

      “但还有一个问题,”马克在白板上画了个示意图,“如果我们实时更新图——不断有新的连接产生,旧的连接消失——我们需要增量更新三角形计数。怎么办?”

      这个问题更难。沈清辞皱眉思考。增量更新……意味着每次图的微小变化,都要快速更新三角形总数,而不是重新计算整个图。

      他想起了分布式系统中的流处理概念。

      “我们可以维护一个流处理系统,”他说,“当新的边(A,B)加入时,我们找出A和B的共同邻居集合C。对于每个C,就形成了一个新的三角形(A,B,C)。删除边时同理。这样每次更新的时间复杂度是O(d),其中d是平均度数。”

      “实时性呢?”

      “我们可以用内存数据库存储最近的图数据,比如过去24小时的。更久的数据可以归档到磁盘。三角形计数也分层:实时计数、近线计数、历史计数。”

      马克放下马克笔,鼓掌:“非常好。沈,你被录用了。”

      沈清辞愣住了:“真的?”

      “真的。时薪25美元,每周10小时起,根据项目需要可以增加到20小时。工作内容主要是算法实现和优化,可以远程,但每周至少来办公室一次开会。你需要申请CPT,公司会提供文件。有问题吗?”

      “没有,”沈清辞说,努力控制住笑容,“没有问题。谢谢。”

      “不客气。你值得这个机会。”马克看了看表,“我还有会,你先跟HR签文件。下周一开始工作,可以吗?”

      “可以。”

      周一

      沈清辞收到第一笔工资的银行转账通知:两周工作20小时,税前500美元。税后大约420美元。

      他盯着手机屏幕上的数字,看了很久。

      420美元。相当于他在“福满楼”洗52.5小时的盘子(按8美元时薪算)。相当于他在图书馆工作35小时(按12美元时薪算)。而现在,他只需要坐在电脑前写代码,做自己擅长且喜欢的事情。

      这不仅仅是钱的问题。这是尊严的问题。

      他打开电脑,登录网上银行,做了三件事:

      第一,给父母的账户转账200美元。备注:“给妈妈买件新衣服,给爸爸买点好茶。”

      第二,还了Raj借给他的50美元——上个月他感冒发烧,Raj帮他买了药。

      第三,给自己留了170美元。

      然后他打开购物网站,搜索篮球鞋。

      他记得那款鞋。高中时,陆星衍送他的生日礼物:耐克Air Jordan的一款,黑白配色,侧面有红色的飞人标志。那双鞋他穿到鞋底磨平都没舍得扔,来美国时太匆忙,没带来。

      现在网站上有新款,设计类似,但细节不同。价格:120美元。

      120美元。相当于他洗15小时盘子。相当于他在SociaLyze工作4.8小时。

      他犹豫了三秒钟,然后点击“购买”。

      三天后,鞋到了。沈清辞打开鞋盒,拿出那双崭新的篮球鞋。皮革的质感,橡胶底的气味,鞋带的光泽——一切都和记忆中的那双很像,但又不完全一样。

      他穿上,系好鞋带,走到镜子前。

      镜子里的人,穿着二手衬衫和改过的裤子,脚上却是一双崭新的、昂贵的篮球鞋。这种搭配很怪异,但他不在乎。

      他跳了跳。鞋很合脚,缓冲很好。

      他决定去球场。

      球场上有几个人在打半场。沈清辞加入他们,分组打3对3。

      他已经很久没打篮球了。来美国后,除了学习和打工,几乎没有时间运动。但今天,穿着新鞋,他感觉身体里有什么东西苏醒了。

      第一个回合,他接到传球,突破,上篮,球进。

      “好球!”队友喊道。

      第二个回合,他在三分线外接球,起跳,投篮——姿势和高中时一样,手腕发力,指尖拨球。球在空中划出弧线,空心入网。

      “漂亮!”

      沈清辞在球场上奔跑,跳跃,投篮。汗水流下来,但感觉很畅快。这让他想起高中时的篮球赛,想起陆星衍的传球,想起夺冠后的拥抱。

      打完一轮,他坐在场边休息,喝着水。

      一个队友坐到他旁边:“鞋不错。新买的?”

      “嗯。”

      “打球风格也挺特别。你在中国打过球?”

      “高中时打过校队。”

      “怪不得。我是迈克,物理系研究生。”

      “沈清辞,计算机系大一。”

      他们聊了一会儿篮球。迈克说这周五晚上有个留学生篮球联赛,问沈清辞要不要参加。

      “我可以考虑,”沈清辞说。

      “好,想好了告诉我,”迈克拍拍他的肩,回去打球了。

      沈清辞坐在场边,看着自己的新鞋。鞋面在阳光下反射出光泽,白色的部分已经沾上了一些灰尘和草屑。

      他想,如果陆星衍在这里,会说什么?

      可能会说:“终于换新鞋了?你那双旧的都快成拖鞋了。”

      可能会说:“打球退步了。刚才那个转身太慢。”

      可能会说:“……想你了。”

      沈清辞笑了笑,起身继续打球。

      又打了一个小时,天开始暗了。沈清辞告别球友,骑车回宿舍。

      路上,他收到母亲的邮件回复:

      “清辞,钱收到了。不要总给我们寄钱,你自己多买点好吃的。爸爸的案子有新进展,律师说可能下个月有初步结果。保持联系。爱你。”

      沈清辞停下自行车,在路边读了好几遍这封邮件。

      案子有新进展。可能下个月有结果。

      这意味着什么?如果结果是好的,也许他们家的情况会改善。也许他可以……联系陆星衍?

      这个想法让他心跳加速。

      但他很快冷静下来。即使案子有结果,也不代表一切结束。律师说过,这种经济案件可能拖好几年。而且,即使案件结束,他们家也不再是以前的家庭了。父亲的事业毁了,家里的积蓄花光了,他们现在只是普通家庭,甚至可能负债。

      这样的他,还有资格站在陆星衍面前吗?

      他不知道。

      但他知道,至少现在,他有了新鞋,有了新工作,有了稳定的收入。

      至少现在,他不用再洗盘子了。

      他继续骑车,风吹在脸上,带着春天的暖意。

      回到宿舍,Raj看到他脚上的新鞋,吹了声口哨:“哇,大手笔。这鞋不便宜吧?”

      “120美元。”

      “你发财了?”

      “新工作。时薪25美元。”

      “Congratulations!”Raj真诚地说,“你值得。”

      “谢谢。”

      沈清辞把鞋脱下来,小心地放在门边。然后他坐到书桌前,打开电脑,开始工作——SociaLyze的项目,他需要优化那个三角形计数算法。

      写着代码,他突然想起面试时马克问的问题,以及他给出的解法。那个解法,其实融合了陆星衍教他的思维方式:分解问题,转换视角,寻找本质。

      陆星衍的数学思维,现在在帮他赚钱,帮他生存,帮他找回尊严。

      这像一种遥远的合作。即使隔着太平洋,即使三年没见,陆星衍依然在影响他的生活。

      他停下打字,从抽屉里拿出那张塑封的照片。照片上的陆星衍穿着7号球衣,笑容浅浅。

      “阿衍,”他轻声说,“我今天买了一双新篮球鞋,和你送我的那双很像。穿着它打球,感觉你还在身边。”

      “我还找到了一份好工作,时薪25美元,写代码,做算法。面试时用了你教我的数学方法。你教我的东西,现在在养活我。”

      “谢谢你。”

      “虽然你可能永远听不到这些感谢。”

      “但我会一直记得。”

      他把照片放回抽屉,继续写代码。

      窗外的天色完全暗了,宿舍楼里传来其他学生的笑声和音乐声。但沈清辞的世界很安静,只有键盘的敲击声,和心里那个温柔的声音。

      那个声音说:继续前进。继续成长。继续等待。

      等到重逢的那一天。

      等到能亲口说“谢谢”的那一天。

      等到能并肩站在同一片星空下的那一天。

      他会等到。

      因为现在,他有能力等下去了。

  • 昵称:
  • 评分: 2分|鲜花一捧 1分|一朵小花 0分|交流灌水 0分|别字捉虫 -1分|一块小砖 -2分|砖头一堆
  • 内容:
  •             注:1.评论时输入br/即可换行分段。
  •                 2.发布负分评论消耗的月石并不会给作者。
  •             查看评论规则>>