跳至正文

计算机学生怎么样找到项目做?为就业做准备

我读本科的时候,简历上”项目经历”那一栏空了整整两年。

不是不想做项目。是打开GitHub,看到别人的项目——精致的README、整齐的目录结构、几百个star——然后再看看自己刚学会写冒泡排序的水平,默默把页面关掉了。

那种感觉很难形容。就像你站在一栋大楼门口,看见里面的人都在忙碌地走来走去,你知道你应该走进去,但你不知道从哪扇门进,也不确定自己进去之后能干什么。

后来我终于开始做项目了。不是因为我突然变强了,是因为我换了一个理解方式——

你不需要”够格了”才能开始。你是在做的过程中变得够格的。

最大的误解:你以为的”项目”不是你需要的”项目”

很多人一说”做项目”,脑子里浮现的就是——做一个完整的Web应用、做一个App、做一个推荐系统、做一个XXX管理平台。

然后就被吓住了。因为你甚至不知道这些东西要用什么技术栈,怎么可能做出来。

但你翻翻那些拿到好offer的学长学姐的简历,他们大一大二写在项目栏里的东西,其实没你想象的那么厉害。

一个命令行的待办事项工具。一个能自动整理文件的Python脚本。一个爬取课表然后发邮件提醒的小程序。一个用Excel数据画图的Jupyter Notebook。

项目不是从”厉害”开始的。项目是从”我有一个小问题想解决”开始的。

第一种找法:从你的真实痛点出发

这是我最推荐的方式,也是最容易坚持下去的方式。

你每天的生活里一定有让你觉得麻烦的事情。那些事情就是项目的种子。

我举几个我自己和身边同学做过的例子:

“每次交作业都要把文件手动重命名成特定格式,烦死了”——写了一个Python脚本,自动按规则批量重命名。二十行代码,但这是一个完整的项目:有输入、有处理、有输出、有异常处理(文件名冲突怎么办?目标文件夹不存在怎么办?)。

“课程群里老师发的通知经常被刷屏淹没,找起来很麻烦”——一个同学用Python写了个微信消息监控(后来改成了钉钉机器人),自动把包含”作业”“截止”“考试”等关键词的消息单独存下来。

“实验室的服务器经常有人用着用着GPU显存就占满了,但人已经走了进程还挂着”——我写了一个定时检查GPU状态的脚本,如果发现某个进程占着显存但CPU利用率为零超过两小时,就自动发飞书通知对应的人。

“读论文的时候经常需要查某个术语在不同论文里的定义”——用LangChain做了一个简单的RAG,把读过的论文灌进去,可以问它”XXX在Smith 2023那篇里是怎么定义的”。

你看,这些都不是什么惊天动地的大项目。但它们都有一个共同点—— 它们解决了一个真实的、自己的问题。

这意味着你做的时候有天然的动力(因为做完了你自己就能用),你能判断它做得好不好(因为你就是用户),你能在简历上讲出一个有说服力的故事(”我遇到了什么问题,我怎么分析的,我怎么解决的,效果怎么样”)。

面试官听到的最动人的项目介绍,从来不是”我做了一个XXX系统”,而是”我遇到了一个问题,我用技术解决了它”。

第二种找法:给课程作业”加戏”

这是性价比最高的方式之一,因为你不需要额外找时间——课程作业本来就要做,你只是做深一层。

数据库课让你设计一个图书管理系统?大部分人用命令行交差。你给它加个Web前端,部署到一个免费的云服务器上,让同学真的能用。

操作系统课让你实现一个简单的调度算法?你多实现两三个,然后写一份对比分析——不同算法在不同负载模式下的表现差异,画几张图,写一段分析。

机器学习课的大作业是用某个模型跑某个数据集?你把数据预处理的过程、模型选择的理由、调参的过程、失败的尝试,全部记录下来,写成一篇完整的博客,推到你的GitHub上。

同样的作业,别人交了一份作业,你交了一个项目。 差别不在工作量(可能多花了几个小时),在意识。

而且课程项目有一个独特的优势—— 你有老师和助教可以问。 自己独立做项目遇到的很多坑,在课程里是有人兜底的。

第三种找法:复刻你每天在用的东西

你每天都在用很多软件和服务。你有没有想过,它们的核心功能,可能没有你想的那么难实现?

你用Markdown写笔记——试试自己写一个Markdown渲染器。不需要支持所有语法,先支持标题、加粗、列表就行。几十行代码,但你会在写的过程中理解正则表达式、字符串处理、甚至编译原理最基础的概念。

你用短链接服务——一个短链接服务的核心逻辑就是:长URL映射到短code,存到数据库,访问短code时重定向到长URL。一个下午能写完,但它涉及到Web框架、数据库、HTTP协议、哈希算法。

你用ChatGPT——用一个开源模型的API,加上一个简单的前端界面,做一个你自己的”AI助手”。加上聊天历史保存、system prompt自定义、多轮对话支持。这就是一个完整的全栈项目了。

你不需要做得比原版好。你需要的是”做完”这个过程中获得的理解。

我室友当年做了一个极其简陋的”记账App”——命令行的,数据存在本地JSON文件里,没有界面。但他在这个项目里第一次理解了CRUD是什么、数据持久化怎么做、怎么设计一个简单的数据结构来存储交易记录。

后来他在这个基础上加了Flask前端、加了SQLite数据库、加了数据可视化。同一个项目,迭代了三个版本,每个版本学一组新技术。最后简历上写的是”全栈记账应用”,面试的时候能从前端聊到后端聊到数据库聊到部署,一个项目撑起了整个技术面。

第四种找法:参与开源项目

很多人觉得”给开源项目贡献代码”是大佬才能做的事。

不是。

大部分开源项目都有大量的 good first issue ——这些issue是项目维护者专门标记出来给新人做的。可能是修一个文档的typo,可能是加一个简单的测试用例,可能是把一段代码从Python 2语法改成Python 3。

这些事情技术含量不高,但 流程含量很高 ——你需要fork仓库、创建分支、读懂项目的贡献指南、写符合规范的代码、提PR、跟reviewer沟通、根据反馈修改。

这套流程本身就是你需要学的东西。在公司里写代码,70%的时间花在这些”代码之外的事情”上。

怎么找适合的项目?

GitHub上搜: label:"good first issue" language:python label:"help wanted" language:javascript 或者去这些网站: goodfirstissue.dev up-for-grabs.net firsttimersonly.com

我第一次给开源项目提PR,改的是一个文档里的错别字。整个PR就改了一个单词。但被merge的那一刻——那种感觉,怎么说呢,就像你在一个很大的工程里留下了一个很小很小的痕迹,小到几乎看不见,但你知道它在那里。

那个项目后来我又贡献了好几次,从改文档到改代码到加功能。但最让我记得的还是第一次那个typo fix。

第五种找法:跟人组队

一个人做项目最大的问题不是技术,是 坚持不下去 。

做到一半发现比预期难,放弃了。做了个半成品觉得拿不出手,放弃了。突然忙起来,搁置了,然后再也没捡起来。

找一两个同学一起做,情况会完全不同。不需要找很强的人,找靠谱的人就行。”靠谱”的定义是——他答应做的事情会做完,他会出现在约定的时间。

可以是课程大作业组队做一个有野心一点的选题。可以是参加一个比赛——不一定是ACM那种硬核的,学校每年有各种计算机类比赛:软件杯、创新创业大赛、hackathon。可以是跟朋友一起搞一个side project,每周碰一次进度。

组队做项目有一个独特的好处—— 你被迫学会了协作 。怎么分工、怎么定接口、怎么用Git管理多人代码、怎么做code review、意见不一致的时候怎么讨论。这些软技能在面试里经常被问到,而且只有真正做过才能讲得出来。

第六种找法:找老师要

这条路很多人没想过,但其实非常好走。

去找你们学院的老师——不一定是最有名的那个,可以是年轻的讲师或者副教授。跟他说你想找一个项目练手,问他有没有需要帮忙的。

年轻老师手里通常有很多需要做但没人做的事情:一个实验平台需要搭建、一个数据集需要清洗和标注、一个课题的前期调研需要人做、一个小工具需要人开发。

这些事情对老师来说是”杂活”,对你来说是 真实场景里的真实项目 。而且你有一个现成的导师可以请教,遇到问题有人兜底。

我就是大三主动去找了一个做NLP的老师,帮他做数据预处理的工具。技术含量说实话不高,但在那个过程里我第一次接触了真实的研究流程、学会了怎么处理脏数据、理解了”真实世界的数据和教科书里的数据差距有多大”这件事。

后来保研面试的时候,这段经历比我任何一个课程项目都好使。因为面试官能从我的回答里感觉到—— 这个人真的做过,不是编的。

关于”做什么”的焦虑

我知道你看到这里,可能还是觉得——道理我都懂,但我就是不知道具体做什么。

说个有点残忍的事实: “不知道做什么”往往不是缺少选项,是害怕选错。

你怕选了一个太简单的项目,做完没有成长。怕选了一个太难的项目,做不完浪费时间。怕选了一个”不够高大上”的项目,写在简历上会被笑。

但你回头看看那些已经找到工作的学长学姐,问问他们的第一个项目是什么——大概率是一个现在看来很幼稚的东西。

每个人的第一个项目都是幼稚的。但”幼稚的项目”和”没有项目”之间的差距,远远大于”幼稚的项目”和”厉害的项目”之间的差距。

因为从零到一和从一到十,完全是两件事。

从零到一的那个跨越——你第一次自己起一个项目、自己定需求、自己选技术栈、自己写代码、自己踩坑、自己解决、最后把一个能跑的东西交付出来——这个过程里你学到的东西,比你再看十本教程都多。

我现在在实验室做的东西比当年复杂了不知道多少倍。分布式训练、大规模数据处理、复杂的模型pipeline——每一个都是当初的我想都不敢想的。

但我很清楚,我之所以能做这些,不是因为某一天突然”准备好了”。是因为大三那年,我硬着头皮开始做了第一个项目——那个丑陋的、bug满天飞的、代码写得一塌糊涂的文件批量重命名脚本。

它丑。但它跑起来了。

它跑起来的那个瞬间,某扇门就开了。不是什么宏伟的大门,更像是一道窄窄的缝。但光透进来了,你看见里面有路。

然后你就会想——再往前走走看吧。

👁 阅读量:14
标签:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注