iaun
iaun
发布于 2025-10-01 / 680 阅读
17
0

我的 WorldSkills 故事

正值第三届全国职业技能大赛(25/9/19 - 25/9/23)结束,还有前阵子朋友发来 WorldSkills 相关的文章和以前的同学发来的回忆。

于是我去翻看了一下以前的手机相册,发现了不少回忆,就有了写这篇文章的想法。

也欢迎关注我的 blog 更新,会发一些技术文章(虽然很慢)。

观前须知

  1. 由于已经退了当时主要的集训群,聊天记录都删掉了,部分细节已经忘记,所以可能有部分内容不准确,我尽量保证真实,如有错误欢迎指正。

  2. 文中提及的所有人物均隐藏真实姓名。

第一次了解 WorldSkills

在入学第一年下学期,学院内的俱乐部会开始向第一年的学生招新,我当时给推荐去了 2 个俱乐部的招新,最后选择了当时学院内最大的俱乐部,覆盖了程序、网络、美工、产品等等。

俱乐部会先通过一学期的选修课来看看学生的表现,当时选修课是学前端三件套(HTML/JavaScript/CSS),一个推箱子项目,由于有点开发基础,自认为学起来还是挺快的,也可能因此,在第二年的上学期,俱乐部老师邀请我参与一个世赛集训项目(应该是网站设计与开发),当时一起的还有6位大一两级的学长。

这个项目的内容包括前端(HTML/JavaScript/CSS)、后端(PHP Laravel/WordPress)、数据库(MySQL)和设计(PhotoShop),其实可以学到不少东西,所以我也接受了。

集训从学期开始,一直到下学期的开学前,中间经历了很多培训,甚至寒假也要留校继续,临近农历过年时,校外的餐馆、商场都几乎停业,而且集训期间就过年前放过一次比较长的假期。

集训的目的其实是为了选拔出参加市赛的成员,当时加上另一个俱乐部的1位学长,一共8人中竞选出4个人。

在寒假接近尾声时,开始校内选拔比赛,很显然,初出茅庐的我落选了,不过毕竟我是抱着学习的心态去的,所以也没在意。

选拔结束后,已经是第二年下学期开学,我被归到程序部,做俱乐部的项目。

这也是我第一次了解到 WorldSkills,也是我 WorldSkills 故事的开始。

转网络的契机

在俱乐部的程序部做了一段时间,发现实在不喜欢俱乐部的项目,首先是特别像 jQuery 但是 bug 特别多的框架和落后的理念,加上俱乐部电脑跑程序项目特别卡。

与此同时俱乐部有自己的服务器机房,运行着数台服务器,由网络部管理,主要是跑俱乐部项目还有网络部成员的测试,由于一直喜欢这些嗡嗡响又高性能的机器,于是我申请转到网络部,开始了网络、服务器、Linux 等的学习。

AWS Gameday

在第三年下学期,忘记是怎么被拉去参加一个校内比赛,似乎是考察AWS Infra相关的内容,选3个人去北京参加AWS官方的邀请赛。

但这是我第一次接触AWS,对云上概念完全不熟悉,最后我也是在帮助下被带去了北京……

在北京的邀请赛中,也是我第一次接触AWS的其中一个竞赛平台——Gameday

选择

大概在第四年上学期,学校又开始准备 WorldSkills 市赛。因为转网络了,我可能参与的项目就变成了:

  • 网络系统管理 (IT Network Systems Administration)

  • 云计算 (Cloud Computing)

同时学校一年一度的技能节也开始了,正好也是集训队招贤纳士的时机。

因为第一次参加 WorldSkills 的经历实在辛苦,而且那段时间有其他事情,其实我是不想参加了。

不过真要在这二者中选,我会偏向选择网络系统管理,因为这能学到很多东西,工作上可能也更用得上。

但在当时听说,网络系统管理是省内其他市某学校的强项,我们基本没赢面,云计算是新项目(45届时的新项目),大家都是刚开始,我们有不小的机会,且在当时已经有上一届学长(参加过45届国赛时被淘汰,后在 WorldSkills 2022 特别赛夺金,后简称金牌学长)参加过,所以集训队内有经验,推荐我加入云计算的集训队。

后来在邀请下也确实选择了云计算,集训队中除了金牌学长,还有一位同年级隔壁班的同学(后简称好兄弟)、一位学弟(之后在47届 WorldSkills 夺金,后简称金牌学弟),加上指导老师,一共五人。

但是听说寒假也要集训,让我想到以前集训时的痛苦,而且市赛进省赛只进两个人,省赛进国赛只进一个人,进省赛的其中一人肯定有金牌学长,我觉得对我来说进国赛希望渺茫,于是主动在市赛中从前二掉到第三。

前二是金牌学长和金牌学弟。

集训团队建立

但是即便第三名,也要一起集训:

一是协助参加省赛的金牌学长、金牌学弟;

二是听说有机会可以有其他途径作为其他省(或海外)的选手参加省赛/国赛/(甚至世界赛);

三是团队选手拿奖了也可以分到奖金。

大家似乎有了共同的目标,团队因此建立。

开始集训

那是在19年底20年初,Covid19 开始流行,各场所封闭管理,实施严格管控。

刚开始我们各自在家,在线练习和训练,除了 Gameday,当时还有国内公司的一套类似 Gameday 的训练平台,使用中国区 AWS(后简称中国区平台),也供各校练习。

大概20年初,通知统一回学校集训,当时其他学生都在上网课,学校只有集训队(包括指导老师)和必要的人员,学校会提供食宿并统一管理。

下图是集训时期发的一件衣服。

探索新玩法

集训期间,催生出了很多玩法来提高分数和降低应用负载,并应用到各种邀请赛和正式比赛当中。

但由于 2021 之后已没有接触 Gameday,现题目可能已经变得不一样了,所以我分享一些思路,在此不讨论架构部分,仅供技术探讨和学习。

公平比赛

请勿舞弊

1.使用 ECS 代替 EC2
一些比赛中并未禁止 ECS,而且 ECS 也不计入扣分,利用这点即可减少扣资源分。
难点在于 Server 会通过 IMDS 获取一些信息,但是在 ECS Fargate 中没有 metadata 信息,于是我们尝试:
1) 为每个容器增加运行 nginx 本地服务器,冒充 IMDS;
2) 修改 Server 以让 Server 连接到本地假的 IMDS 服务器;
3) 在 Fargate 中启动 nginx 服务后,再启动修改后的 Server,以让 Server 正常运行。
以上操作完成后,即可通过 ALB/CloudFront 访问到 ECS Fargate 的 Server 提供的服务。

2.在一台 EC2 同时运行多个 Server 提高并发
具体来说,在每台 EC2 上运行不同 Port 的同一个 Server,但是有如下难点:
1) Server 启动后会创建标识文件,Server 检测到标识就会拒绝运行
只需启动完一个 Server 后删除标识文件后即可继续运行第二个 Server。

2) 平台限定的 EC2 Instance 类型为 t2.micro,仅有 1C1G,运行多个 Server 会导致内存溢出
为每个 EC2 额外挂载一块高 IO 的 EBS Volume (e.g. io1),将这块 Volume 在系统中格式化为 SWAP 并启用,并调整系统 swappiness 参数以完整利用 SWAP 空间。

此玩法的衍生玩法为使用 docker / docker swarm 等,可以参考如下(已隐去部分信息)

#!/bin/bash
yum install docker -y
systemctl enable --now docker
docker pull busybox:glibc
docker volume create server
cd /var/lib/docker/volumes/server/_data
curl https://******/server -o server
chmod +x server
docker swarm init --default-addr-pool 192.168.0.0/16
docker service create --name server -p 80:80 --mount type=volume,source=server,destination=/server -w /server --replicas=20 busybox:glibc ./server

和如下(已隐去部分信息)

#!/bin/bash
SERVER_COUNT=20

mkswap /dev/sdb
swapon /dev/sdb
sysctl vm.swappiness=100
amazon-linux-extras install nginx1 -y
cd /root/
curl https://******/server -o server
chmod +x server

cat >start.sh<<EOF
#!/bin/bash
rm /tmp/******.rentals.lck
pkill server
EOF
for i in `seq 1 $SERVER_COUNT`
do
        echo "./server -port 8$i &">>start.sh
        echo "./wait.sh">>start.sh
done
chmod +x start.sh
cat >wait.sh<<EOF
#!/bin/bash
while :
do
        if [ -f "/tmp/******.rentals.lck" ]; then
                rm /tmp/******.rentals.lck
                break
        fi
done
EOF
chmod +x wait.sh
echo "upstream server{">/etc/nginx/conf.d/server.conf
for i in `seq 1 $SERVER_COUNT`
do
        echo "server 127.0.0.1:8$i;">>/etc/nginx/conf.d/server.conf
done
cat >>/etc/nginx/conf.d/server.conf<<EOF
}
server {
listen 80;
location / {
proxy_pass http://server;
}
}
EOF
systemctl enable --now nginx
./start.sh

不过由于 CPU 硬限制在,跑多一些 Server 之后 CPU 就会是瓶颈,所以实际上能跑的 Server 数量也比较有限。

3.逆向 Server
逆向 Server 的算法,在此不讨论技术细节。在逆向后可以:
1) 替代原有 Server,并删去处理延迟和并发限制,以提高单机带载量;
2) 使用算法提前将结果写入缓存,使用真 Server 去运行会 hit cache 以更快返回结果。

集训历程

省赛前

在省赛前,由于疫情原因主要参加一些线上邀请赛和线上的练习。

同时在拿到练习题目后,我们也会研究对应的玩法(如上)去取得更多的优势,尤其在逆向的玩法上颇有研究。

在 AWS 中国区平台的一次邀请赛中,由于在情报和玩法上我们有一些领先(其他选手也可能有一些玩法的领先),所以在比赛群连平台方技术人员都震惊。

在这个邀请赛的决赛中,还让了第一名给金牌学长,不过前三都是一等奖,所以对我也没差啦。

省赛

省赛采用 AWS Gameday 平台,不过直到最后些天都还不知道具体哪个题目,所以是全部已知的题目都有准备。

因为云计算比赛是可以上网的,选手们可以在网上去查找资料,所以我们的策略是,上传已破解的 Server 或对应的写缓存程序到 Github / Gitee 平台,由于 Git 提交时的时间是本地电脑的时间,所以可以修改电脑时间到较早的时间进行 Commit,之后再上传到仓库,这样在仓库中这个 Commit 就会是较早的时间,很难被质疑是与比赛有关提前准备的内容。

这样,在比赛中似乎就可以“合法地”从网上去搜索并拿到我们自己的程序,以替代或者协助原有的 Server。

当然,还需要幕后人员控制这些 Git 仓库,在比赛中途或过后就要及时将这些仓库隐藏,防止被它校选手拿到后下载研究,而我和好兄弟没有参加比赛,自然担此“重任”。

好在最终金牌学长还是拿下了第一名,顺利入选国赛。

国赛前

在国赛前我们听说是会使用其他平台而非 AWS Gameday,传闻有 AWS 中国区平台、华为云等,最终确定是 AWS 中国区平台。

于是我们着重使用 AWS 中国区平台进行训练,同时进行题目研究。

但是在国赛前夕,学校已经催着实习,好兄弟没有选择留下来,出去实习了。而我留了下来,成为了所谓“教职工”,月薪 3410 + 900 饭补,一起为了国赛选手金牌学长的“金牌”而努力,因为我相信学长拿了金牌等于集体荣誉,是大家一起努力的结果,大家共享成果...

我们虽然有在练习中拿到一些题目,但是这些题目很可能不是最终比赛的题目,而且平台其他题目的 Server 下载链接也是未知的(没有开 Index),所以此时情报上我们也不处于优势,我们也去 Github / Gitee 平台去查找,看看有无其他情报。

就在一筹莫展时,我发现了参加国赛的另一个省的选手的 Github 和 Gitee,里面有一个公开仓库,有 TA 的学习记录,集训记录等等…… 其中还在一个 Commit 历史中看到了一个 URL,域名指向了 AWS 中国区的 EC2 IP,访问了一下,发现是一个网站,开了 Index,最重要的是里面是所有 AWS 中国区平台的题目,而且看日期很新,嗯……难道……

如下是仓库的备份:

于是我们没有打草惊蛇,从这里面下载全部已有的 Server 先研究。

直到国赛的前面几天,这个 EC2 的 Web Server 也有在更新,这可是国赛最关键的情报啊!

比赛前夕,我将再度被赋予将所有破解的 Server 和相关程序等按照省赛的方式再次上传到 Github 和 Gitee 的任务。

另外在这期间,学校已经组建了官方队伍,将所有项目参与国赛的选手(后称其他项目选手)拉到一起,他们也就互相认识了。

国赛

国赛时,集训队的老师、金牌学长、金牌学弟都前往比赛现场,其中金牌学弟是作为观众去的,而我被留在学校,因为要像省赛时在后台支援,嗯确实,学长拿金牌是最重要的。

而我在学校也是待机,无聊时还写了个小玩意定时抓了比赛数据,用于日后研究。同时关注其他选手的 Github / Gitee 和那台 EC2。

在国赛第一天结束的晚上,我一如既往地查看那台 EC2,发现了新的文件夹,里面有新的 Server,怀疑可能是第二天的题目,于是我赶紧汇报。

事实证明确实如此,这个情报对他们来说非常有帮助。最终,也拿到了金牌。

国赛后...

国赛后,金牌学长与我和金牌学弟先说明了最后要分配的国赛奖金比例,是 5%,我后来有询问是否能 10% 也没有下文了。

在这期间到我毕业,我只是参与一些集训项目的训练,6 月底毕业了,我也离开了。

后续还有选拔赛选拔出真正去参加 WorldSkills 的选手,我已没再支援和关注,后续 WorldSkills 2022 特别赛等已不再与我有关。

最终我分到的奖金是省赛? 5000 元和国赛 12500 + 20000 元,加上我在校实习的 8 个月收入,一共是 71980 元,如果从集训开始计算(那时已经可以开始实习),大概 18 个月每个月近 4000 元,这大概就是我在集训队的全部价值了。

乌云密布?

平心而论,这朵云干净吗?

外挂破解、平台与选手勾结 …… 其实作弊都非常明显,明眼人都能看出来。

我理解每个学校的教育资源各不相同,但是破解/使用外挂和提前拿到试题的选手,是否算违规呢?

如果是正常训练的选手,或者提前拿到错误情报的选手,看到这些选手大放异彩,看到他们断层领先,就算觉得有内幕,但是有证据吗?申诉会有用吗?

一些往事

前面提到好兄弟选择离开集训队。原因是好兄弟在校集训时,经常被金牌学长欺负和阴阳。

除此之外,好兄弟在集训队时因为进度较缓,问了很多东西也都没告诉他,觉得自己像个外人,只有和我聊得比较多。

最终接受不了被孤立和阴阳而离开。


前面提到在国赛前夕学校已经组建了官方队伍,这让金牌学长与校内参与其他项目的国赛选手(后称其他项目选手)有了密切联系。在这之后,金牌学长经常有与他们往来,似乎任何与其他项目选手的安排都优先,经常在集训队中讲其他项目选手的故事,虽然和我们没有关系。

例如金牌学长经常会和其他项目某选手一起吃饭,在某次我们集训队去吃饭,金牌学长让我们先去,但是其他项目某选手可能有事,金牌学长被鸽了,才说“等我,我来了”


再或者,在某次我们集训队(含云计算和网络系统管理)与其他项目某选手一起吃完饭返回集训队时,我们其他人按照常走的路线到教学楼直接搭电梯上楼,此时金牌学长和其他项目某选手正聊天,金牌学长说了句“你们怎么要搭电梯?”类似的话。

嗯,真是高高在上呢,这是我们平时的路线啊,为啥不搭电梯呢?我想是因为其他项目某选手的集训队还要再走一段路,要护送过去多聊几句,所以想绕行到前面走楼梯吧,当然最后也是我们先搭电梯上去了。


在校集训/实习时学校有为我们安排教职工宿舍,最开始我与金牌学长、金牌学弟在一个宿舍,后来金牌学弟因为开学了回学生宿舍,而我在实习期所以继续留在教职工宿舍。

在国赛后的某个周日晚上,我回到宿舍,发现宿舍没有人,回想起上周金牌学长说的“周末不一定来”,所以没觉得奇怪。

一直到我睡觉(大概 0 点),确实也没来,我想既然这么晚了肯定是不来了,也没多过问,就在睡觉前把宿舍门锁了。

直到早上 7 点起床,发现了金牌学长打来的未接电话,我觉得疑惑,发了问号过去金牌学长就来敲门了。

原来他当时在其他项目成员的宿舍吃火锅,凌晨回房间发现我锁门了,他们在敲门、打电话,我都没有听见,因为睡觉前手机都会静音,加上可能正好在深睡眠,也没听到敲门声。

开门后,“怎么睡这么死啊”,我只听到这句。听说金牌学长当晚在一个其他项目选手的宿舍先睡觉了,因为是双层床,床位有多,但因为在冬天,那位选手也没有多的被子床单,所以当然也没睡好。

这可能也为以后关系恶化埋下了伏笔,或许我可以多问一嘴就可以避免这次冲突。


在国赛后某次 AWS Jam 训练中(Jam 是模拟企业云端出现问题的环境,去排除问题的挑战),金牌学长与金牌学弟不再在集训队的小群去讨论题目解法,而是私聊,在平台老师(B)问到“所有同学都有这个问题吗?”,金牌学长(A)回答了“嗯”

是吗?但是我解出来了啊,我不在这个所有同学里面?OK没关系,我也发出了我的思路。


不知何时起,金牌学长吃饭只叫了金牌学弟,时常是金牌学弟再叫我一起去。

在这之后,我都提前/延后去吃饭,错开时间。

总结

确实从我离开后,集训队出了 2 个世界赛金牌,诚然靠他们自己的努力是可以做到的,仿佛有我没我都是一样的,那么我为什么要留在集训队呢?


前面说,有其他途径可以参加省赛/国赛甚至世界赛,但是都杳无音信;

前面说,可以分到奖金,但是只有 5%;

前面说,我功劳最大,但是国赛结束后我什么都没有得到。


是帮助他人拿奖,自己却成为了工具人;

是继好兄弟后,我也成为了外人,原集训队忙于比赛,也没再往来。


或许我当初就应该坚定拒绝加入集训队,在最艰难的时期,我协助逆向 Server、线上支援…… 连去比赛现场观摩都没有过。只是默默付出,但是付出和回报不成正比,或许这就是社会第一课。

但人总要往前看,如今我还在做 AWS,这可能是我在集训中最大的收获。

与比赛相比,企业项目所需的知识要多很多,就算比赛是以企业项目为原型,但怎么都只是冰山一角,继续进步吧,人生没法重来,吃一蛰长一智,希望自己不再重蹈覆辙。


在校实习的最后一天,也是我那段时间最高兴的日子,指导老师知道我要离开后,安排了一顿中午的聚餐。

在备份完数据、还回职工卡、宿舍钥匙,收拾完行李,走出校门时,我终于解脱了。


最后感谢集训队指导老师,不论是在实习、离校、资源和诉求等都能够协调和提供帮助,再次感谢!

- End -

wxpicture2025.png


评论