第一届「逐梦杯」比赛规则来了,但这只是一个起点。对参赛者来说,规则发布之后最该做的不是马上写代码,而是把规则拆成可执行、可验收的工程需求。尤其当比赛需要提交完整作品时,代码质量、项目结构、运行说明、自测记录和提交材料会一起决定最终结果。本文围绕逐梦杯的参赛准备过程,整理一套可复用的打法:先澄清比赛信息,再把规则转成需求,然后搭一个换台电脑也能跑的项目骨架,用最小功能跑通主流程,最后按检查清单完成自测和提交。文中以「作品交付自检工具」作为最小示例,方便读者把每个步骤落到实际开发中。如果比赛细则后续有调整,请以主办方发布的正式通知为准。
1. 先别急着写代码:从逐梦杯公告里拆出必须澄清的信息
1.1 这份公告能确定什么,不能确定什么
从“第一届「逐梦杯」比赛规则来了,有兴趣参加的评论区留言”这个标题里,能确定的信息很有限:
- 比赛叫逐梦杯。
- 这是第一届。
- 主办方已经放出规则或至少有规则预告。
- 评论区留言是收集参赛意向的一种方式。
不能确定的信息更多:比赛主题是什么,有哪些赛道,参赛对象是学生还是社会开发者,作品形式是文档、代码还是视频,评审标准怎么算分,截止时间是什么,提交入口在哪里。这些信息没有公布之前,不要凭经验脑补规则,否则后续所有开发方向都可能跑偏。
这里要特别提醒一点:评论区留言“有兴趣参加”只代表参赛意向,不等于正式报名。很多比赛后续还会要求填写报名表、加入官方群、上传作品或确认身份。如果只停留在留言阶段,很容易错过正式报名窗口。
1.2 参赛前必须澄清的六项关键信息
在投入大量时间和精力之前,优先确认下面这组信息。可以做一个自己的《赛前信息清单》,逐项打勾。
| 信息类别 | 需要确认的内容 | 确认渠道 |
|---|---|---|
| 参赛对象 | 是否限制学历、年龄、单位、团队成员数量 | 主办方公告、报名须知 |
| 比赛赛道 | 是否有算法、应用开发、创意方案等多个方向 | 赛题说明、赛道分组 |
| 作品形态 | 提交源代码、可运行安装包、演示视频还是设计文档 | 提交要求、作品模板 |
| 评审标准 | 功能完整度、创新性、代码规范、演示效果各占多少分 | 评审细则、评分表 |
| 时间节点 | 报名截止、初赛提交、决赛答辩分别是哪一天 | 赛事日程、官方通知 |
| 运行环境 | 评委使用什么系统,是否需要离线运行,是否有指定技术栈 | 环境说明、FAQ |
这六项信息如果没有,宁可先做通用准备,也不要在错误方向上堆功能。比如规则要求“作品必须离线可运行”,你却在作品里依赖一个临时云服务,那么这个功能在答辩现场就会变成风险点。
1.3 做一次参赛成本评估
比赛报名门槛低,不代表时间成本低。开发一个可提交的作品通常要经历需求分析、方案设计、编码、测试、文档、演示准备这些阶段。如果逐梦杯的赛道偏向项目制,个人参赛至少需要预留一周到两周的碎片时间,组队参赛则需要额外协调沟通成本。
可以从三个维度评估是否值得投入:
- 时间:近期是否有考试、上线任务或其他占用大量时间的事情。
- 技能:是否具备完成一个最小作品的技术能力,或能在比赛周期内补齐。
- 资源:是否有可靠的开发设备、网络环境、队友配合以及数据素材。
如果三项都不满足,及时放弃也是合理选择。不要把参赛变成负担。
注意:比赛规则往往包含“参赛即代表同意主办方使用作品进行宣传”等条款。报名前最好读一遍规则原文,尤其是知识产权和授权范围部分。
1.4 把“想参加”转成下一步行动
看到比赛公告后,可以这样安排前三天:
- 整理一份问题清单,把自己不确认的信息逐条列出来。
- 到主办方官方渠道找规则原文、赛题说明和 FAQ,能查到的先填上。
- 查不到的信息通过官方联系方式或评论区向主办方确认。
- 根据已确认信息判断是否正式参赛,并建立项目仓库。
这个流程的好处是,在写第一行代码之前,先完成信息闭环。对于逐梦杯这种信息还不完整的场景,尤其重要。
2. 把比赛规则变成可验收的需求,而不是停留在“我理解了”
2.1 规则拆解四步法
拿到完整规则后,不要通读一遍就结束,建议按四步处理:
- 通读:完整读一遍,知道有哪些条目。
- 圈关键词:把“必须”“不得”“优先”“加分”等词圈出来。
- 逐条转需求:把每条规则转换成“需要交付什么、满足什么条件、如何验证”。
- 定优先级:区分硬性要求和加分项。
技术类比赛最容易出问题的地方,是把“加分项”误当成“必须项”,或者反过来,把硬性要求漏掉。比如规则写着“提交作品时需附带十分钟演示视频”,这个就是硬性要求,即使作品本身代码再好,没有视频也会被扣材料分。
2.2 从规则到验收标准
下面用一个示例说明规则如何转换成验收标准。这里只是演示方法,不是逐梦杯的真实赛题。
| 规则原文 | 是否硬性 | 对应交付物 | 验收标准 |
|---|---|---|---|
| 作品需要提交源码 | 硬性 | 代码仓库 | 压缩包内包含源码,剔除依赖目录,根目录有 README |
| 作品需提供运行说明 | 硬性 | README 文档 | 新环境按文档步骤操作能启动项目 |
| 鼓励使用新技术 | 加分 | 技术设计文档 | 文档列出使用的新技术及解决的问题 |
| 禁止抄袭他人成果 | 硬性 | 原创声明 | 提交材料附带原创声明和参考来源列表 |
转换之后,每条规则都变成可以检查的条目。开发结束后,不需要重新读一遍规则才发现漏了材料。
2.3 解释“为什么要把规则转成需求”
很多参赛者输在“觉得理解了,但交付物对不上”。就是因为规则停留在自然语言层面,没有变成工程语言。
自然语言说:“作品要求界面友好。”这句话无法直接验证。 工程语言说:“界面应该包含清晰的导航、表单校验、错误提示,核心操作能够在三个步骤内完成。”这句话可以拆分出功能点,也可以写进测试用例。
当逐梦杯的正式规则公布后,建议按照这个方式逐条解析。尤其要注意数字类约束,比如“视频不超过 5 分钟”“源码包不超过 50MB”“提交截止时间为 23:59:59”等,这类条件最容易出问题。
2.4 先做 MVP,别一开始就设计完整大系统
需求拆解完成后,所有功能会分成两块:必须有的最小闭环、可以后补的增强功能。MVP 是指能跑通主流程的最小版本。
以自检工具为例:
- 必须有:添加检查项、标记完成状态、查看检查项列表。
- 可以有:按分类筛选、自动生成提交报告、多用户管理。
- 不做:在线协同、消息通知、复杂权限系统。
开发时先完成 MVP,再根据剩余时间补增强功能。很多开发者在前期追求功能全面,结果临近截止日期时连主流程都没跑通,这是比赛项目最常见的失败模式。
3. 项目骨架先做成“换一台电脑也能跑”,再谈功能
3.1 技术栈选择以“评委能运行”为第一目标
在技术选型上,热门框架不是第一考虑因素,真正重要的是目标环境能不能跑。评委可能只有一台安装了常见运行时的电脑,也可能是统一提交平台。技术栈选择前,优先确认这几个问题:
- 比赛是否指定了语言或框架。
- 提交平台是否支持自动构建。
- 作品是需要在线演示、本地运行还是提交源码即可。
- 运行环境是否有网络连接。
如果这些信息不明确,选择部署简单、依赖少、文档多的技术栈会更稳妥。比如 Python Flask、Go 标准库、纯前端静态页面,属于“环境要求清晰、评审容易运行”的类型。
3.2 推荐的目录结构
下面是适合大多数技术类比赛提交的目录结构,可以按实际项目调整:
dream-cup-submission/ ├── app/ # 核心代码 │ ├── __init__.py │ ├── models.py │ └── views.py ├── templates/ # 页面模板(如使用 Flask) ├── tests/ # 测试代码 ├── docs/ # 设计文档、说明文档 ├── README.md # 项目介绍和运行方式 ├── requirements.txt # 依赖清单 ├── .gitignore # Git 忽略规则 └── run.sh # 一键启动脚本(可选)这样的目录结构有四个作用:
- 评审能快速定位核心代码。
- README 天然成为作品说明书。
- tests 目录展示工程素养。
- 依赖清单保证环境可复现。
如果比赛要求必须使用给定模板,优先遵循官方模板,不必为了结构统一而自造流程。
3.3 Git 初始化与忽略规则
进入项目目录后,第一件事不是写功能,而是初始化版本管理:
mkdir dream-cup-submission cd dream-cup-submission git init然后把不需要提交的内容写进.gitignore:
venv/ __pycache__/ *.pyc .DS_Store *.db *.sqlite3 node_modules/ dist/这里要解释原因:虚拟环境、缓存文件、数据库文件和依赖目录都属于生成物。评委拿到源码后不应该靠这些文件运行,而是根据依赖清单重新安装。如果把这些大目录塞进压缩包,不仅体积变大,还可能因为本机路径写死导致评委环境无法运行。
3.4 README 模板
README 是作品提交材料的核心。建议包含以下板块:
# 项目名称 ## 项目简介 一句话说明作品解决什么问题。 ## 功能点 - 功能一 - 功能二 ## 环境要求 - Python 3.10+ - Flask 3.0+ ## 运行方式 1. 创建虚拟环境 2. 安装依赖 3. 启动服务 4. 访问地址 ## 目录说明 简要说明每个目录的作用。 ## 常见问题 列出评委最容易遇到的启动问题及解决办法。README 的目标是让一个没有看过代码的人,也能在十分钟内把项目跑起来。能跑起来,才有资格被评审;跑不起来,代码质量再好也难救。
3.5 依赖锁定与环境隔离
依赖文件必须锁定版本。Python 项目用requirements.txt:
flask==3.0.3Node 项目用package.json里的精确版本号,或者用锁文件。锁定版本不是多此一举,而是保证“本地能用,评委环境也能用”。如果不锁版本,几个月后依赖升级带来兼容性问题,项目可能突然跑不起来。
建议统一使用虚拟环境:
python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate pip install -r requirements.txt这样开发过程不会污染系统环境,后续写 README 时也能给出更干净的安装步骤。
4. 用最小可运行的自检工具跑通开发闭环
4.1 工具定位
下面的示例是一个「作品交付自检工具」。它解决的是参赛过程中的真实问题:规则条目多,材料容易漏。把规则拆成检查项后,用这个工具统一管理完成状态。
这里需要说明两点:第一,这个工具是演示 MVP 用的,不是逐梦杯的官方指定作品。第二,如果正式赛题和这个方向无关,重点看开发流程和工程规范,而不是复制代码。
4.2 项目结构
checklist-app/ ├── app.py ├── templates/ │ └── index.html ├── requirements.txt └── README.md4.3 数据库与接口设计
使用 SQLite 保存数据,单文件数据库,零额外安装。表结构设计为:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER 主键 | 自增 ID |
| title | TEXT | 检查项名称 |
| requirement | TEXT | 对应的规则要求 |
| status | INTEGER | 0 未完成,1 已完成 |
接口设计保持简单:
| 方法 | 路径 | 功能 |
|---|---|---|
| GET | / | 展示所有检查项 |
| POST | /add | 添加检查项 |
| GET | /toggle/ | 切换完成状态 |
| GET | /delete/ | 删除检查项 |
4.4 核心代码
app.py是一个最小可运行的 Flask 应用:
from flask import Flask, render_template, request, redirect, url_for, g import sqlite3 DATABASE = "checklist.db" app = Flask(__name__) def get_db(): if "db" not in g: g.db = sqlite3.connect(DATABASE) g.db.row_factory = sqlite3.Row return g.db @app.teardown_appcontext def close_db(exception): db = g.pop("db", None) if db is not None: db.close() def init_db(): db = sqlite3.connect(DATABASE) db.execute( "CREATE TABLE IF NOT EXISTS checklist (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "title TEXT NOT NULL, " "requirement TEXT DEFAULT '', " "status INTEGER DEFAULT 0)" ) db.close() @app.route("/") def index(): db = get_db() items = db.execute("SELECT * FROM checklist ORDER BY id").fetchall() return render_template("index.html", items=items) @app.route("/add", methods=["POST"]) def add(): title = request.form.get("title", "").strip() requirement = request.form.get("requirement", "").strip() if title: db = get_db() db.execute( "INSERT INTO checklist (title, requirement) VALUES (?, ?)", (title, requirement), ) db.commit() return redirect(url_for("index")) @app.route("/toggle/<int:item_id>") def toggle(item_id): db = get_db() db.execute( "UPDATE checklist SET status = CASE status WHEN 0 THEN 1 ELSE 0 END WHERE id = ?", (item_id,), ) db.commit() return redirect(url_for("index")) @app.route("/delete/<int:item_id>") def delete(item_id): db = get_db() db.execute("DELETE FROM checklist WHERE id = ?", (item_id,)) db.commit() return redirect(url_for("index")) if __name__ == "__main__": init_db() app.run(host="127.0.0.1", port=5000)页面模板templates/index.html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>逐梦杯参赛自检工具</title> </head> <body> <h1>逐梦杯参赛自检工具</h1> <form method="post" action="/add"> <input type="text" name="title" placeholder="检查项名称" required> <input type="text" name="requirement" placeholder="对应规则要求"> <button type="submit">添加检查项</button> </form> <ul> {% for item in items %} <li> <a href="/toggle/{{ item['id'] }}"> {{ '已完成' if item['status'] else '未完成' }} </a> {{ item['title'] }} {% if item['requirement'] %} - {{ item['requirement'] }} {% endif %} <a href="/delete/{{ item['id'] }}">删除</a> </li> {% endfor %} </ul> </body> </html>依赖文件requirements.txt:
flask==3.0.3这段代码的关键点有三个。第一,get_db使用 Flask 的请求上下文g对象,保证同一个请求复用数据库连接。第二,SQL 统一使用参数化查询,避免字符串拼接导致的 SQL 注入风险。第三,init_db使用CREATE TABLE IF NOT EXISTS,重复启动不会报错,方便演示。
4.5 运行与验证
启动服务:
python app.py正常输出类似:
* Running on http://127.0.0.1:5000浏览器访问http://127.0.0.1:5000,添加几个比赛检查项:
- 提交源码
- 运行说明文档
- 演示视频
- 原创声明
每完成一项,点击“未完成”切换为“已完成”。这就是一个最小闭环。它虽然简单,但已经覆盖了数据库操作、请求路由、模板渲染和前端交互,足够作为比赛项目的基础骨架。
注意:示例项目里使用了相对简单的密码和会话逻辑,如果要在公网部署,需要补充身份认证、安全配置和日志记录。比赛提交阶段通常只要求本地演示,但上线部署前必须做安全加固。
5. 本地验证、接口检查和异常排查,按这条链路走
5.1 正常验证方式
项目跑起来后,至少验证三类情况:
- 正常访问:首页能打开,样式和文字正常。
- 功能操作:添加、完成、删除三项操作都能生效。
- 异常分支:输入空标题不会崩溃,刷新页面后数据还在。
只验证“服务能启动”是不够的。很多比赛演示在启动那一刻就结束,但交互逻辑到第二个按钮才出问题,这种体验非常影响评审结果。
5.2 使用 curl 验证接口
不使用浏览器也可以验证接口是否工作:
curl http://127.0.0.1:5000/添加一条数据:
curl -X POST \ -d "title=演示视频" \ -d "requirement=提交十分钟演示视频" \ http://127.0.0.1:5000/add添加成功后刷新首页,应该能看到新检查项。如果返回 400 或 500,就从请求参数和日志开始排查。
5.3 常见问题表
下面的表格列出这个小工具和同类 Flask 项目最常见的启动失败原因:
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
Address already in use | 5000 端口被占用 | lsof -i :5000或netstat -ano | 更换端口,或结束占用进程 |
TemplateNotFound | 模板目录或文件名不对 | 检查templates/目录和index.html是否存在 | 保持默认模板目录,模板名和render_template参数一致 |
no such table: checklist | 数据库表未初始化 | 查看项目根目录是否有checklist.db | 启动前先调用init_db() |
ModuleNotFoundError: No module named 'flask' | 虚拟环境未激活或依赖未安装 | pip list查看已安装包 | 激活虚拟环境后执行pip install -r requirements.txt |
ImportError或版本错误 | Flask 版本不匹配 | pip show flask查看版本 | 按requirements.txt锁定版本 |
5.4 排查链路
遇到问题时,按下面顺序排查,不要直接重装环境:
- 检查输入和命令:路径、参数、配置文件是否写错。
- 检查运行环境:是否在正确的虚拟环境中,Python 版本是否满足要求。
- 检查依赖:
requirements.txt是否安装完整,版本是否冲突。 - 检查代码逻辑:路由、数据库、模板是否有低级错误。
- 检查资源目录:模板、静态文件、数据库文件是否存在且路径正确。
- 检查端口和网络:端口是否被占用,监听地址是否正确。
- 看完整日志:不要只看第一行,异常堆栈的最后一行往往才是根因。
这条链路几乎适用于所有技术类比赛项目。很多问题不是出在代码本身,而是环境或路径不一致。
6. 提交前,按这份材料清单完成最终自检
6.1 代码仓库自检
提交代码前,在项目根目录执行一次自查:
| 检查项 | 操作 | 通过标准 |
|---|---|---|
| 依赖是否锁定 | 打开requirements.txt或package.json | 有精确版本号,无浮动版本 |
| 生成物是否排除 | 检查.gitignore | 不包含venv、node_modules、缓存文件 |
| README 是否存在 | 打开 README | 包含运行方式、环境要求、功能说明 |
| 数据库文件处理 | 查看根目录 | 不提交本地数据库文件,或提供初始化脚本 |
| 测试是否可跑 | 执行测试命令 | 测试命令通过,并写入 README |
6.2 文档材料自检
比赛作品通常不只包含源码,可能还需要设计文档、演示文档、原创声明。提交前确认:
- 项目简介:说明作品解决什么问题。
- 技术方案:选型原因、架构设计、核心模块。
- 使用说明:环境准备、运行步骤、功能入口。
- 遇到问题与解决过程:这部分展示真实工程能力,比罗列功能更受评委认可。
6.3 演示材料自检
如果比赛要求演示视频,需要注意视频不是“录屏流水账”。建议结构为:
- 作品目标:10 秒内说明解决什么问题。
- 主要功能:演示核心流程。
- 关键技术点:展示代码或工程决策。
- 验证结果:说明测试情况。
视频命名按规则要求来,常见格式是“队长姓名-作品名称-演示视频”。文件体积如果过大,使用压缩工具处理后再上传。
6.4 压缩包规范
最终提交的压缩包建议满足:
- 压缩格式为 ZIP 或 RAR,按主办方要求执行。
- 压缩包内第一层是项目目录,避免打开后文件散落一地。
- 不包含临时文件、系统文件、虚拟环境和依赖目录。
- 大小符合规则限制,超出限制时先删缓存、压缩图片、清理无用的中间产物。
建议提交前在另一台电脑或虚拟机里解压,然后严格按照 README 步骤跑一遍。这个过程能发现大量“本地能跑,提交不能跑”的问题。
7. 最常见的三种翻车场景和应对方式
7.1 只写代码,不写 README,评委不知道如何运行
现象:压缩包里有源码,但没有运行说明,或者 README 只写了项目标题。评委打开后不知道执行哪条命令,最后只能跳过演示。
原因:开发者默认“代码写得很清楚”,但别人拿到项目时缺少上下文,连入口文件都找不到。
解决方式:把 README 当成产品说明书来写。至少写清环境要求、安装命令、启动命令、访问地址。如果还有精力,补充一笔目录结构和常见问题。
7.2 本地能跑,评委环境跑不起来
现象:开发环境一切正常,提交后评委反馈启动报错,报错信息可能是找不到模块、端口被占用、Python 版本不兼容。
原因:常用的可能性包括依赖未锁定、路径写死为绝对路径、使用了本机才有的环境变量、未考虑端口冲突。
解决方式:提交前在干净环境里完整跑一遍。创建新的虚拟环境,按 README 执行,不复制本机缓存的包。路径尽量使用相对路径,端口在启动时支持配置。如果比赛允许,提供一键启动脚本,降低评委手动操作出错的概率。
7.3 功能演示到一半,数据为空或依赖外部服务
现象:演示时首页没有数据,或者功能依赖的第三方服务已经失效,演示流程中断。
原因:演示环境没有初始化数据,或者作品把核心逻辑建立在外部 API 之上。
解决方式:开发阶段准备一份演示用种子数据,提交时说明如何导入。凡是依赖外部服务的功能,都要提供本地模拟数据或降级方案。这不是为了作弊,而是保证评审在任何环境下都能看到完整效果。
8. 赛后复盘:把一次参赛变成可复用的工程经验
8.1 复盘清单
比赛结束后,不管结果如何,都值得做一次复盘。围绕五个问题进行:
- 规则理解与实际交付是否一致。
- 哪些功能做了但没用上,哪些该做却没做。
- 项目从搭建到提交花了多少时间,瓶颈在哪里。
- 评委或对手提出了哪些自己没想到的问题。
- 如果再来一次,哪些决策会改变。
问题不要空想,最好写下具体例子。比如“我花了一整天优化界面,但没提前确认演示视频格式,导致最后补录视频时间不够”就是很好的复盘素材。
8.2 把项目沉淀为资产
逐梦杯的参赛项目不要比赛结束就删除。可以继续做三件事:
- 把代码推到自己的仓库,整理 README。
- 把踩过的问题记到个人知识库。
- 把项目提炼成作品集中的一个案例。
即使项目没有拿到名次,它仍然证明了你具备从规则到交付的完整链路能力。这种能力比单个奖项更容易迁移到真实工作中。
8.3 给新手的下一步练习建议
如果这是第一次参加技术类比赛,下一步可以这样练:
- 重新读一遍本文的规则拆解方法,找一场往届比赛题目练习。
- 在三天内完成一个最小项目,强制自己写 README 和测试。
- 找一位朋友扮演评委,让他在没有你帮助的情况下运行项目。
- 把演示过程录下来,自己回看一遍,找出说不清楚的地方。
做完这几步,再看下一场比赛,会发现准备过程会顺很多。逐梦杯这场比赛的最终评审标准可能还不明确,但工程化的参赛方法是不变的:把信息查清楚,把需求拆细致,把项目做可复现,把材料备完整。只要按这条链路走,无论最后是否获奖,参赛过程本身都会是一次有价值的技术训练。