今天是6月30日,大二的最后一天。
  我在D座5楼,一个我每次面试待的地方,写下这篇博客。今天已经精疲力尽,但还是决定落笔,要给我的大二画上一个句号了。
  我的大二,可以说是丰富多彩,也可以说是五味杂陈,还是从时间线来梳理整个大二生活吧。
  大二上我分到了新北宿舍,宿舍的各个设施和服务我都非常满意,没什么可挑剔的,除了那经常堵的下水道,我们的宿舍应该算集齐了大部分优点。我的床位布置是一个比较标准的理工男风格,桌子上下全是杂乱的电线,当时的我,对大二充满期待。
  由于大二上的课程难度不高,课程数量也不是很多,所以我在九月的时候很无聊,就想找导师进组体验一下科研,同一时间,我偶然看到机器人队硬件组招新,想起暑假的时候我错过了报名时间,现在正好有机会,能参与我一直感兴趣的机器人开发,也是一个很好的学习硬件技术的机会。
  八九月份画pcb的时候,我总是头疼元件的购买,一次买一堆,每个型号就用几个,很浪费,而且做一个板子各种费用加起来也不小,加上当时我买了很多焊接设备,花费了不少时间和金钱。加入机器人队后学习硬件知识的同时,也能打一些板子培养经验。
  在上计软的时候我碰到了罗老师,觉得老师性格非常好,而且老师研究的领域我也很感兴趣,因此在课后也向老师寻求进组机会。在和老师线下见面之前,我看了看老师最近发的几篇paper,其中有一篇的作者正好是之前单片机课程的老师,史晓锋老师,这位老师也给我留下很深的印象,也成为后续我和罗老师谈论的话题。
  九月底,机器人队的面试通过,罗老师也给我安排了任务,因此那个国庆我在玩耍的同时,也完成了机器人队的考核以及顶会论文的筛选,当时对很多方向都感兴趣,也发现了很多有意思的paper。
  但坦白说,机器人队的那个考核我完成的并不好,其中一个原因是我不知道不画排针,导致我那次布线花了很久的时间,最后校验的时候蹦出一堆bug。但总体而言还是以很短的时间完成了任务。因此从十月开始,我是两线并行,组里的任务和机器人队的任务都要完成。
  我们硬件组接到的任务是优化硬件通讯,要把整体的通讯频率优化到1000hz,这个任务要在寒假前完成。当时我来机器人队是想着抱大腿,向学长学姐学习经验,但可惜的是,我们组有经验的人都是控制组,硬件组的学姐也比较忙。而且关于这个任务学姐也不是很了解,因此从11月左右开始,我就开始熟悉硬件通讯的代码,并且尝试通过stm32把下位机的代码搞定。
  为了能及时完成任务,我把硬件频率测定的任务交给了队友,我重点开发下位机。大概用了两周左右时间,下位机能做到和12个电机通讯且频率达到1000hz,当时coding agent还做不了这个代码,并且硬件相关的代码我还是不放心给ai写,毕竟需要上电测试,如果参数有问题将会很危险,所以那段时间还是古法手搓。
  不过整体代码都是基于宇树的单电机通讯的框架进行修改的,大部分时间都是和dma打交道。顺便一提,当时的我还不会FreeRTOS(现在的我也不会),所以当时直接操作dma来达到1000hz的通信频率。下位机完成后,我就着手查看上位机的代码是否有bug,因为队友测出来的实际通讯频率只有200多。
  经过几天的debug,最后发现bug不在于代码侧,而在Ubuntu系统中的串口设置上。
  latency_timer系统默认是16,也就是16毫秒才能通讯一次,更换到1ms并且把代码修改一下,成功达到1000hz。
  到这里也许你会问,为什么不一开始就去找上位机的问题。是这样的,上位机和电机之间我们是通过宇树的1转485的板子进行连接的,并且队长和其他队伍交流的过程中都发现这个板子不能支持1000hz的通讯频率,只能到500左右,因此我一开始就着手下位机,也就是stm32的开发,即使我看到官网中这个板子是支持1000hz这个频率的,只是他的参数单位是波特率,经过计算他是满足1000hz的通信要求的。
  但当时的我还是一个小白,不能确定是不是板子的问题,为了进度只能双线并行,而最后通过修改这个参数就达到了通信要求,自然下位机就不需要开发了。
  这样看来,硬件组的任务很快就完成了,后续我们参与调研了轮足电机的选型,但可惜的是最后我们的轮足并没有开展设计工作,这其中有很多复杂的原因,我也无意展开。
  寒假我就跟随队员调试狗,顺便参与了轮足仿真,但个人水平不够,没有把轮足控制搓出来,甚至连车都没从仿真中搓出来,可能是由于控制相关的基础知识不够了解,也可能是轮子的建模需要修改。大二下学期主要就是调试相关的工作,硬件没有开发任务,更多的是维护,整理布线,因此每次我去沙河都是呆坐一天。
  遗憾的是我没有帮上机构,控制的同学一些忙。后续队友也说我周末可以不用去了,也由于我个人的原因,后续的调试工作我也没有帮忙。坦白来说,这是违反队规的,但是这也没有阻塞备赛的进度,因此给予我相应的处罚我也可以接受。
  但是,我犯了一个错误。
  在四月左右有一个去港大的活动,我非常感兴趣,按照我的记忆,去港大的时间应该和四足比赛的时间不冲突,所以就报名了。到六月办理港澳通行证的时候我想起来确认一下时间,发现刚好冲突了,于是我问导员能不能取消我的行程,导员说已经签合同了不能修改。
  这个完全是我个人的错误。导致不能和队员一起参与备赛。但是去港大前还有4天时间,我和队长商量了一下,队长觉得去三四天没有意义,也帮不上什么忙,因此就让我不去了。
  此时我又犯了一个错误。
  主赛道的队友在群里询问我30号什么时候出发,由于我当时在考场看到的这条消息,马上要考试了,因此我草草回复了一句:不去了,并马上关闭了手机。
  这真的是一个情商超级低的行为,我当时以为这位同学和队长沟通一下应该就能了解情况,可是最后的结果却不是这样。她在我考试的时候在群里发了一长段话,大概意思就是我没有做出什么贡献,下半年从来没去过实验室,反而还报名参赛,报名后又不去,白嫖队员的成果。并且她发完这些后就将我踢出了群聊,没有给我任何解释的机会。
  我当时看到这些话,首先想到的是我在寒假备赛的时候,某天早上在沙河被冻醒。因为前一天晚上调试太晚,没有地铁,所以我只能睡到椅子上,而我错误地估计了温度,腿上没有穿秋裤,那天早上我的腿和脚都快没有知觉了,我等到第一班回学院路的车,以为上车就暖和了,车里有空调,可是那天车里并没有开空调。
  我永远忘不了那天早晨。
  因此我的第一感受就是非常愤怒,马上询问队友这个人是谁,并且马上加她的好友,想要知道是谁告诉她这些片面的消息,也马上告诉了我的队长。队长第一时间也还很震惊,队里之前从来没有这样说话的,大家都是好聚好散。随后队长联系到她后,说她是一时冲动说了这样的话。至今她也没有通过我的好友请求,我也不知道是谁告诉她这些信息。
  冬天我和两位队长吃完火锅后,走回学校,在路上他们问我为什么参加机器人队,我说是因为喜欢,觉得好玩,并且我也不在乎综测加不加分,因为我们学院好像没有把这个比赛列入综测中,我也不在乎综测。以至于她说我白嫖成果的时候,我非常愤怒,不是委屈,是愤怒。
  不过现在想来,也非常理解她当时说这些话的原因,毕竟我当时的情商实在是太低了,没有经过思考就发送。这件事也让我明白,了解到别人负面的信息后,也不要马上给这个人贴上标签,毕竟你也不知道信息在传递的过程中添加了多少噪声,因此还是谨言慎行。
  截止这篇文章撰写之时,比赛还未开始,也祝愿我们能获得好成绩。
  说回大二上,当时并行的任务还有跟随罗老师进行视觉语言导航相关的研究,我都不好意思说研究,因为确实这方面读的论文太少,了解到的都是皮毛,并且参与的开发都是简单的算法,没有拓展一点点边界。
  起初是每周阅读一篇论文,当时的我总是在组会前一天晚上熬夜奋战,把论文读明白,第二天向老师汇报的时候也比较熟练,也许有些研究生也和我一样哈哈哈,组会前一天完成一周甚至一个月的活,当然这是开玩笑,研究生的工作量应该是无法压缩到一个晚上的。
  之后我就和师兄探讨关于视觉角度定位的问题,这个问题的关键点其实不在于算法上,而在于无法树立一个标准,因为定位本质上是定一个点的为止,而真实的物体有无数个点,要选择哪一个点?这个就无法解决,如果精确度都无法测量,其实就很难说我们的算法定位是否更准。因此这个问题我们后来就没有继续研究了。
  由于无人机的数据集太少,因此我们最初是用newscenes来做一些简单的算法研究,主要就是定位出安全位置的方向,我当时是用一个简单的吹泡泡的算法去做的,这里遇到的难题在于没有雷达反射点的区域要如何判定。因为真实的数据集下没有雷达反射点的区域可能是非常远的地方,也可能是玻璃。
  因此我们想通过加入rgb的校验解决这个问题,但与此同时罗老师想让我做一个冯如杯项目,关于盲人视觉语言导航的。关于冯如杯,我不太想发表观点。但是这个项目确实是有意义的,因此我的寒假也在开发这部分的算法。
  避障算法很简单,通过解算平面得出地面的位置,然后在解算得到的地面中规划路径,这里的难点就在于真实的行走是有很大的抖动的,因此地面的解算需要滤波,但是滤波就会导致遇到高度比较小的坎时会不能分辨出来,这也是我后续没有很好解决的corner case。
  大二下的组会在沙河,并且组会的时间和我上课的时间有冲突,导致我其实整个下学期没去过几次组会。当然这也有我个人的原因,下面会说到。
  避障的算法并不难,难在导航。我通过调用qwen omni模型来做导航任务,并不理想,处理帧数的速率非常低,完全不能用于行走,并且由于行走的时候镜头晃动,导致有时候本来是左侧的通道却识别到了右侧。而且模型没有空间感知的能力,也就是说他不知道左和右,不知道从a点到b点它处于什么位置,而这些靠prompt工程无法解决。
  这个问题卡了我很久很久,我尝试采集一些数据,通过深度相机捕捉到高频特征,然后通过这个特征的移动来给出左转还是右转,再去建立一套语义地图去进行定位,但是最后的效果并不好,并且这个问题在于如果有一步偏离了轨迹,就无法纠正回来,没有任何泛化可言。
  也就是说,在这个项目上,我没什么可做的了,最后的冯如杯也没进入答辩,当然这里可能是因为我的论文和ppt过于粗糙,但不重要。有趣的是我看到一个和我类似的项目,不过他的标题中有大语言模型。当时我就比较疑惑,llm怎么去辅助导航,至少也得是多模态模型吧。这个项目好像最后还进入了一等奖答辩,不过我也不知道他们具体的算法是什么,也没有渠道知道。
  现在说回到比较重要的一条线,vibe coding,或者说 coding agent。在大二上学期刚开始的时候, 我本来想做一款软件,用来管理我的电子元件,如上文所说,每一次购买的电子元件非常多,因此在进行下一个电路板开发的时候,就要去查看有没有一些元件自己买过,以及数量够不够。学期刚开始的时候,我学习了 C++ 语言,因为大一学习的是 C 语言,当时觉得 C++ 是不是在 C 的基础上有一些拓展,并且后续也可以用来开发 App。
  但是在我学习了一两周之后,我发现掌握的这些语法距离实际的 App 开发其实还有很远。并且与此同时,我看到了一款软件,叫做 Replit。我现在还记得我第一次下载并使用那个软件是周四下午,《大学生职业规划》的课堂上。
  我记得实在是太清楚了。因为我只是把我的需求简单描述了一下,就看到它一直在界面上工作,那种感觉是之前从未有过的。因为之前你和 ChatGPT 对话,或者和 DeepSeek 对话,它们都是即问即答,或者说他们只是一个问答工具。而replit会自己编译,自己测试,你可以很快的看到他渲染出一个前端页面,并且能看到他在解决很多bug,现在大家已经习以为常,可是当时我非常震撼。
  下课后我走在路上,盯着手机中的屏幕,意识到好像我不需要做任何干预,他自己就能做成这个app,对于一个代码水平不高的学生,马上搓出一个app还是让我非常震撼的。那个demo用了20分钟,应该算是属于我的第二个前端,第一个前端是基于hexo的next主题博客,是在别人的框架下建立的,而这个demo是全新的,完全独特的,完全属于我的。
  也就是从那时开始,我开始了vibe coding。replit的免费额度只够做一个demo,因此我注册了很多gmail账号,并且replit的项目是可以共享的,因此我的demo开发就是一个一个账号进行接力。当时的replit远远没有现在的codex聪明,他会犯很多错误,但是实在是太让我兴奋了,gmail注册到风控后,我转向了cursor,kiro,继续在空余时间vibe coding,做了思维导图,做了很多好玩的demo,并且还尝试开发一套个人agent,不过在memory上遇到了很大困难,这个agent算是openclaw迷你版,但是要比openclaw爆火早很久,复杂度也远远比不上openclaw。
  三月初,回到学校,codex windows版本发布,我也抱着玩玩的心态从闲鱼买了api额度,codex应该是给我第二个震撼,虽然那一刻我没有第一次使用replit那么兴奋,但是我意识到codex真的能用于生产意义上的开发。我做了第一个安卓端的app,用了一周的课余时间,与此同时我从知乎上认识了锦恢。
  第一次看到锦恢的文章是他吐槽coding agent不可能取代程序员,并且他举了很多例子,但是那些例子在3月对codex来说不成问题,因此我划到最下面发现这是去年的回答,点开评论区,锦恢也说,他错了。这就非常有趣,因为一般而言,知乎上有不少自大,逆天的答主,尤其喜欢在评论区对线。
  因此我点开锦恢的主页,打开他的博客,发现他最新一篇博客在几天前,并且他的更新频率蛮高,这就让我知道,这个人很厉害。因为写一篇高质量的博客非常消耗时间,并且作者只有自己有很深的见解才能写好一篇博客。如果他对这部分的知识掌握不足,很难组织好语言写出一篇博客。毕竟我创建好我的博客后,一年也没写几篇。当时马上加入了锦恢的粉丝群,并且第一时间加了锦恢的好友。
  锦恢通过好友请求后,我马上把我app的demo发给他,想问问他的意见。因为当时的我遇到一个问题,不确定是否给我的产品的界面支持图片显示。后续我们聊了蛮久,他建议我多去参加一些线下的活动,比如黑客松。
  接下来的四月我参加了不少活动,也认识了陈哥,超哥,毛毛。同时也投了一些实习,第一次面试的是深言科技的产品岗位,一面就面挂了,现在想来,当时真是幼稚又胆大。第二次面试某公司非常顺利,而二面非常失败,但是出乎意料的是流程推进到了三面,三面顺利通过后我拿到了offer,几个月后,一位同事告诉我,四月的那个面试有很大的运气成分,我当时也是这样想的,比较一个大二的学生,能拿到这家公司的实习offer,一定是多种因素叠加到一起。
  现在复盘大二,我感到我浪费了太多时间,做了太多浮于表面的工作,缺乏扎实的基础。实习的过程中学到了很多知识,但由于业务保密,无法透露,但越工作就越认识的自己的不足太多,自己浪费的时间太多。因此以后要多多更新博客,多输出,毕竟输入得到的不是真正掌握的知识,输出的文本才是个人水平的体现。
  这篇博客也作为后续的baseline,可以看到,有很多语句不够通顺,这是因为我太久没有下笔。今天是7月12日,我手里还有很多任务,但写下这篇博客,最为重要。后续我也会继续补充,完善,让这个结尾不这么仓促。