跳转至

recynie

在这篇文章中简要回顾一下我的大学成长经历、建议和总结,希望有助于后来者,分为“学习”“竞赛”“科研”等几个板块介绍我的经历。

大学之前

我在初中时接触编程,比较感兴趣,于是课外学习了基础的C/C++语法、入门OI。在学习过程中我发现,我并不喜欢做竞赛题目,即便做出题目,我也并不会有成就感,和辽宁算法皇帝形成鲜明对比。 因此我逐渐放弃了继续学习OI相关知识,转而单纯学习编程语言语法、数据结构等内容。 由于我只是把它当作个人爱好,所以并没有系统性学习这些知识,OI水平也几乎为零。

这段经历对我大学的唯一直接帮助就是编程课程基本不用学,但也没拿高分

感觉上面的经历就是典型的不适合算法竞赛的情况。还没开始就已经望到尽头了。


到了高中,事情略微出现了转机,我发现自己真正感兴趣的东西是写一些有趣/有用的软件,而不是停留在做题、学习语法层面。 因此,我单纯凭借自己的兴趣和之前打下的基础,利用网上的资料在课余时间学习python语言,在放学后和假期写一些简单的脚本。 主要是写网络爬虫,因为我想爬轻小说网站的小说。

为什么选择学习python而不是用C/C++:我当时对C/C++的了解太浅,根本没用过STL等等方便的东西,感觉它特别难用;当时网络上python比较热门,上手简单,于是就学它了。然后发现python真的比C/C++简单很多。

学习

这里的学习指的是相对狭义的学习,即课程学习。个人认为,大学的课程学习对个人能力的提升其实较少,它更多是为了提高自己的学习成绩排名、GPA等,以有助于升学或找工作。

大部分学到的知识是脱离实际应用1的。由于没有应用它的机会,你很快就会忘记这些知识。但是,课程中学到的知识会帮助你建立对学科大概的认识,这在之后你需要掌握具体能力的时候依然有用处,能让你更快理解一个领域。

因此可以说,我认为课程学习的主要目的是:

  • 提高学习成绩、GPA;
  • 建立对一个领域或学科的认识。

针对这个目的,我会在平时上课的时候零零散散地了解课程大概内容(大部分不会认真听,在老师说明重点时,以及涉及计算、章节总结时会记录),期末前找一段时间结合往年题目集中学习课程内容。根据往年题目能够推断出重点内容和难点,大多数课程考试范围是相对固定的,这样复习就会快很多。

上述学习方法不适合所有人,需要根据自己的特点制定适合自己的学习方法。

这个认识是我在学习过程中逐渐总结的。我在大一时并未很快意识到这一点,在大一上期末没有系统性复习,排名非常低(~30%)。 后面我发现其实大部分的课程内容用处不大,于是开始把平时上课的时间用于竞赛和科研,在期末时集中学习。到大二左右,感觉已经能相对熟练地找出考核的重点,并用较少的时间复习完课程、拿到还不错的分数。

总体而言,我的学习成绩名次只有~20%,这为我的夏令营/预推免带来了不少负面影响。 如果追求保研,应当优先2提高自己的学习排名或综测排名(二者之一排名较高,基本就够了)。

竞赛

我主要在大二学年才开始参加竞赛,并且参加的经历相比其他同学非常单薄,这里仅做简单分享。

为什么要参加竞赛?

竞赛的主要用途:

  • 加综测分数,从而在保研排名中更靠前。
  • 拿奖学金,进而加综测分数。
  • 保研申请的认可度,大部分竞赛认可度低(不如已发表论文),但有的竞赛认可度高(ICPC/CCPC、挑战杯等)。

因此竞赛的选择标准比较简单:

  • 竞赛能为综测加分(参考推免方案)
  • 能拿到奖

显然我打的竞赛不满足上面的条件,能为综测加分的比赛我没有拿到奖,拿到奖的竞赛不能为综测加分。

对于保研,综测排名和学习排名的地位基本一样。综测成绩的很大一部分是学习成绩,剩余部分主要由竞赛、英语、奖学金等构成。“剩余部分”虽然占比小,但能很大程度上影响排名(因为学习成绩分差极小)。

如何取得奖项?

  • 选择好的团队,和有能力、有时间、有意愿(有需求)的同学组队最佳。
  • 对于开放性题目,首先分析赛题要求(“它要求什么样的作品?”),然后基于此进行调研,例如分析往届获奖作品等。
  • 竞赛过程中为每个人安排任务,并规定时间,尽量充分利用时间。

当然,做完这些只是开始。具体怎么获奖看团队协作情况、团队水平等诸多要素,没什么普适建议。

竞赛对个人成长的帮助

在学术能力方面,我认为竞赛的提升少于科研。

  • 大部分竞赛都比较水,它们对专业能力要求其实比较低,可能会将更多精力放在PPT制作、项目设计、排期、甚至宣传上,花在思考、学习的时间比较少。它或许更锻炼团队协作、团队管理能力。
  • 但少数竞赛十分锻炼综合能力,例如 ICPC/CCPC(难度高,认可度高), Kaggle(难度高,不加综测,保研认可度略低)等。

“锻炼综合能力”“加综测分高”“拿奖容易”这3个指标互不相关,根据你的需求选择竞赛。

科研

科研经历

我初次接触科研是在大一下学期学院的“微项目”3活动中。 我个人的方向偏好是人工智能、生物和化学,于是报名了生化两个方向的交流。在生物方向的一次活动中,生物学院的薛松教授做了简单的报告,非常有激情地讲述了她的研究课题:预测蛋白质结晶条件。我对这个课题十分感兴趣,于是和另一个同学(就叫他杰杰子吧)一起决定跟这个老师做微项目。我们学习了蛋白质结晶相关的基础生化知识,构建数据库,进行基础的统计分析等等。甚至还做了湿实验,浪费了很多实验经费。

虽然我们做的是AI for Science的课题,但后面分流我们两个人都选择了人工智能方向。 我当时的考量是:

  1. 人工智能方向发展的空间更广,后续就业和转换方向更容易、选择更多,
  2. AI for Science 领域对人工智能知识的要求更高,而不需要了解太多宽泛的Science相关知识。

现在来看,我仍然无法评价(1)是否正确;但我认为(2)比较片面,现在我的想法是AI4Sci研究者需要了解AI和Science两个领域的知识,深入了解两个领域的人才很有竞争力4

但我认为,如果你确实了解、喜欢某个方向(例如AI4Bio),那么应该选择这个方向,而不是选择“未来选择更多”的方向(例如人工智能)。


我正式5参与科研是在大二学年,我参加了学院另一个鼓励本科生科研的活动,可以双选本科生导师。在之前和薛松老师的科研中,我和杰杰子用到了图神经网络(GNN)表征蛋白质结构,于是对GNN有了基本的了解,于是双选导师的环节我们就选择了同样具有GNN背景的申彦明教授。

后来我们没有做独立的新工作,而是一边在申彦明老师的博士生指导下跑他论文的实验,一边继续研究原本的蛋白质相关课题(由于蛋白质结晶条件预测太困难,我们转向蛋白质水合的研究课题)。 甚至成功促成了两位导师的合作。

碎碎念:大二下学期是我最忙的一个学期,从开学前就开始打比赛,学期中一边做课程报告、完成大作业、开展期末复习,一边还在打更多比赛,一边做学长要求的实验,还要做学生工作安排拍摄任务。记忆中,有一两个月几乎每天工作10h+,周末无休。


后续,申彦明老师对科学发现的自进化智能体方向比较感兴趣,并且上手相对容易、能结合蛋白质领域,于是推荐我们在“领膺计划”中做这方面的工作,以发表论文为最终目的。 这是我首次接触到比较严肃的、独立的科研,真正开始着手广泛阅读文献、亲手撰写代码,了解自进化这一方向前沿,并且某种程度上也见证了它的发展。可能是由于课题组没有学生做这类方向,所以没有学长指导我们,我们会自己阅读论文、blog、社交媒体推文了解领域发展,以大约每两周交流一次、每次~2h的频率向导师汇报进展、决定后续方向。

记得当时的热门还是 prompt learning , GEPA 这种使用循环或进化方法迭代更新提示词的范式。我们从这类工作出发,结合蛋白质优化这个具体任务,开始设计一个 training-free 的优化系统。这个过程非常曲折,由于领域缺少科学理论支撑,主要靠实验,我们会尝试从实验结果中发现问题,然后提出或许能解决问题的架构,再切换架构重新实验,如此往复。从发表论文的角度,还需要同时调研同期论文,借助它们的insight为我们的方法讲出一个合理、新颖的故事。 现在,我们做的方向已经变得热门起来(虽然主要在国外),也被归类到了 Recursive Self-Improvement (RSI) 这个备受欢迎的概念下。

很久之后我们才有论文产出。“领膺计划”开始半年后,我们把前期的成果作为 workshop paper 发表,最终中稿;一年后,我们创新了方法,完成了相对完整的工作和实验,投稿 NeurIPS。

NeurIPS 投稿过程非常极限,截稿前十几天决定投,直到截稿保持每天14h+的工作时长(五一假期直接拜拜),每天写论文、做实验。 期间还投了创智和中关村学院的夏令营。 截稿日晚上八点截稿后开始复习必修课,第二天早上参加期末考试。 感谢导师的支持和理解,他的五一假期也没了

总结

我认为我的科研经历还是兴趣驱动为主,一方面让我愿意投入时间开展科研,一方面让我难以快速获得产出。找到一个容易发论文、符合自己兴趣的科研课题是比较困难的,我认为科研需要不断探索,既在探索领域本身的发展、未来前景,也在探索自己的偏好、兴趣。 其实从功利的角度讲,我认为我的科研并不“高效”,付出了非常多的时间,但没取得太多成果。但我认为我在这个过程中学到了许多,“没有学长带”迫使我学习各种需要的能力、知识、工具;“和导师直接交流”使我逐渐学会安排科研进度、汇报内容,收获了很多思维碰撞的瞬间;和杰杰子的紧密合作同样锻炼了快速分工、协调任务的能力。

一些建议

科研是一个长期的过程(最少几个月),需要占用很多时间和精力,且正反馈稀疏,需要做好心理准备。 做科研建议先明确自己的目的:深入研究、锻炼能力,还是发表论文,抑或是其他目标?它们可以兼得,但有所侧重能更好地让你规划科研的路径。

关于方法论,我其实认为我的弱势在于联系导师和沟通这个方面,因此提出的建议也多关于此:

  • 多方面了解课题,不清楚自己的研究兴趣时,可以多多请教相应方向的学长学姐、老师了解他们的课题,会比自己探索更节省时间;
  • 积极寻找导师,积极联系心仪的导师(本校外校都可,通过课堂交流、邮件联系、导师组内学生引荐等方式),导师一般都不会拒绝有本科生进组打工(对他们来说是打工,对你来说是入门学习);
  • 如果确实想要/需要科研经历、产出,那么应该尽早开始科研,科研本身就是学习的过程(科研要求的能力和课堂学到的知识基本没有重叠),不存在“打好基础再科研”的情况。

由于未来书院在大三学年的课程很少,后续空余时间很多,因此大部分学生都会选择科研(但不一定有有效产出)。结合前面说的“如果需要科研,那么应该尽早开始”,我个人建议大家早些接触科研,这样对产出有利。

开源项目

实际上我在这个方面是小白,纯粹爱好驱动,仅仅分享一下自己的经历和看法,提供基本的认识。

个人经历

我对开源项目一直非常感兴趣,科研竞赛之外的时间中,有不少都花费在了开发开源项目上,可以说是我的爱好之一。 我非常喜欢开发适合自己工作流的软件、工具,以及使用已有的开源项目,并加以改进或重写。在 pre-agent 时代,它带给我的主要收获是学习基础语法、主流框架、增加开发经验等;而现在我会大量使用 coding agent 开发项目,增加我使用 agent 的经验、对 agent 的了解,以至于自己开发 agent 扩展和 agent 框架(这和我科研的方向相关)。

目前,我也在尝试为开源社区做有价值的贡献,如:提出issue、提交 pull request (PR),发布自己的项目到公共平台等等。

作用和价值

一般来说,个人开源项目的价值是丰富你的简历,它对于升学的作用比较小,对找工作的作用似乎略大。 这不是一个稳定可靠的保研加分项,不确定性较大,收益相对小,不推荐以保研为目的投入大量时间。

当然,如果你开发的开源项目影响力很高,比如能在GitHub上拿到几百甚至几千stars,或是成为知名开源项目的contributor,那么它似乎会有很大的帮助。这类经历放在简历上会相对亮眼,毕竟少有人愿意投身于此、且产生影响力。

入门建议

其实没有什么特别的入门建议,只要你开始做各种项目,其实已经入门了。

我粗浅地认为“参与开源项目”可以分为几个部分/阶段:

  • 使用开源项目:最基础的,你大概率在用 Python, PyTorch,它们都是开源项目。当然,你也可以尝试更多开源项目,比如用 MkDocs 部署静态网站(这个网站就用的 MkDocs)。你也可以比较不同开源项目之间的差异,比如 Podman 和 Docker 在设计上的不同,同为静态网站生成器的 Hexo, Jekyll, Quartz, MkDocs 在使用场景、features方面的异同。
  • 开发开源项目:如果你的需求无法被现有项目满足,那么你可以选择开发一个开源项目。在coding agent的帮助下,开发开源项目的难度已经大大降低,对本科生是完全可行的。
  • 为开源项目做贡献:使用的开源项目有bug?想给开源项目提建议?为这个项目提issue。你想为这个开源项目提供新功能/修复bug?为这个项目提PR。

如果你想为开源社区做贡献(包括:开发开源项目、为开源项目做贡献),需要了解GitHub平台Git、Git工作流、开源贡献的一般要求和习惯。这类教程/信息非常丰富,仅需善用搜索或询问LLM即可。

总结

作为正在保研的大三(即将大四)学生,也有不少遗憾/怨念(保研没学校要我导致的):

  • 成绩排名低。大一学分占比很多,但我的排名非常低。大二学年的排名说明了我其实有能力提升成绩,只是大一时没有看重学习成绩、没有形成期末习惯。
  • 参加的比赛没有为综测加分。这与竞赛的选择有关,主要是当时对综测方案不够了解、以及社交圈小没有合适组队队友导致的。
  • 科研产出相对较少。选择的部分课题难度过大,难出文章,并且没有学长学姐带。有点被画饼了

总体来讲,我对大学生活的感受是:

  • 每个人的需求、所处的条件、对未来的期待都不尽相同,因此对未来的规划也差异很大。越早清楚自己想要的是什么,就能越早为之采取行动,这比任何保研经验、给大学生的建议都更有价值,可以说是最短的捷径。
  • 由于前一条讲的“人与人之间追求的不同”,大家会选择不同的道路。建议不要从众,而是遵从自己的内心。同时建议用包容的心态看待其他人的选择(和自己的选择)。
  • 每个人选择的“不同的道路”没有高下之分,难以用简单的、统一的指标去评价人。我认为这是大学和高中最大的差异:“比较”几乎没有意义,你需要更多地考虑“我想要什么”。
  • 学长学姐基本都是好人,老师未必。

若读者希望联系作者,或进一步了解我的科研、开源项目,可以访问我的个人主页

Aug 31, 鸽子衔枝之年


  1. 实际应用:科研或工作中能用到的。 

  2. 优先并不意味着在排名低的时候应该把全部经历放在学习或竞赛上,而是不应该让其他事情占据本该用于学习/竞赛的时间、在时间紧迫时优先保住排名。 

  3. 学院开展微项目的目的是鼓励学生接触不同交叉学科的具体问题,从而帮助学生在后续选择分流方向时对各交叉方向有基本的了解。 

  4. 我当初的想法是,AI4S主要针对某个交叉学科的具体科学问题(比如蛋白质结晶),那么系统性学习交叉学科的全部知识对这个具体领域的帮助很小(例如“学习如何开展动物实验”对“研究蛋白质结晶”几乎没有用)。AI4S中,交叉学科的知识是很重要的先验,能减少试错,避免很多“从原理上就没有意义、不值得尝试”的想法。 

  5. 正式:以发表论文为目的的。