结营感受:从入门到入土 | 青训营
我参加了字节跳动青训营 第六届 后端方向 并组建了队伍:轮椅人 。虽然最后就剩我和另外一个队员。
不过大项目:WheelChair-tiktok 好歹是肝出来了(以前没写过项目,bug嘎嘎多呀,晚上嗷嗷写呀)
下面我来分享我的心路历程。
1.开营前夕
以前对Go语言很感兴趣,稍微了解过Go语言的语法,快放暑假的时候,看到学工部的老师在学院QQ群里甩了一个链接:字节跳动青训营,我点开一看,哟!GO语言,还是字节跳动的活动,打着提升自己编程能力的想法,也想写个项目练练手,就报名参加了,一开始本想报进阶班,加了唠嗑群一看,都是985、211的大佬,还有许多硕士研究生,吓得我赶紧把报名信息的进阶班改为了基础班。
就这样,过了十几天,收到了笔试的通知,这笔试题就会做其中的几道,提交后本以为不会被录取,没想到又过了几天,我收到了通过的通知,那就充满干劲地学吧
2.开营后
看了看课表,感觉课程安排挺好的,就听了那个开营班会,了解了结营的条件。
然后就在群里看到了一堆大佬的组队信息,哇!都学历这么高,有的还是oier,大一就开始打ACM了,而我上了大学之后才开始接触编写的,大一的时候就写过几个python的爬虫。我也不敢向这些大佬发组队申请,索性就自己组建了一个队伍------轮椅人♿️ ,邀请了5个同样是小白的网友来组队。
第一天我就在群里设置了定时机器人🤖️,来督促同学们进行沸点打卡和学习,一开始一切都好,本以为会如此欣欣向荣下去。
前几次的课程都是基础语法和简单的练习题,跟上学习是完全没问题的,后面的开始就感觉看不懂,这时第一个队友说自己学不会来,打算放弃。我挽留了几次,还是退出了。没办法,为了结营证书,认真学吧。
3.开营中期
这时候,我开始准备考驾照了,冬天报了名没学。我简简单单地刷了600多道驾考宝典的题,在b站上看了看课程,然后在app上模拟了几次考试,每次都是六七十分,通过率才19.4%,我就开始约上科目一考试。万幸,我以90分的成绩一次通过科目一考试,然后学了几天的golang,就到了8月初了。
8月初,我开始去驾校练习科目二,在1号到14号这十几天里,我上午看课程学习,下午2-7点练习科目二的项目,晚上沸点打卡后就早早地睡了,这期间的课程比较难,没有基础,听不懂,所以就草草的学了一下。
期间又有一名队友选择了退出,看来坚持下来还是不容易呀!
到了16号,我去考科目二,两次机会,都挂了。索性就准备全心全意地做项目。
由于剩下的3名队友同样是小白,也没项目经验,所以我决定我的队伍的项目不用微服务,使用单体架构。
但是单体应用也没经验呀,我就去Github上找前几届的项目,第一页前几个都是微服务架构的,即使是单体应用我对他么的架构也不满意,我就去看了kan用Golang开发的知名项目Gin-Vue-Admin 发现他的架构我可以拿来参考,所以我就大体确立了如下的文件结构:
go
├── cache //用来放redis相关的用来储存token
│ ├── redis.go
│ └── token.go
├── config //配置文件的加载,我选用了godotenc
│ └── config.go
├── controller //controller
│ ├── comment.go
│ ├── favorite.go
│ ├── feed.go
│ ├── publish.go
│ └── user.go
├── logger //日志相关的配置,选用了viper
│ └── logger.go
├── main.go //程序入口
├── middleware //中间件 用来验证token
│ └── auth.go
├── model //储存一些模型 和初始化数据库
│ ├── comment.go
│ ├── database-operator.go
│ ├── favorite.go
│ ├── follow.go
│ ├── response //响应用到的结构体
│ │ ├── auth.go
│ │ ├── comment.go
│ │ ├── favorite.go
│ │ ├── publish.go
│ │ ├── user.go
│ │ └── video.go
│ ├── user.go
│ └── video.go
├── public //静态资源储存目录
├── readme.md
├── router //路由组
│ └── router.go
├── service //一些service
│ ├── favorite.go
│ ├── publish.go
│ ├── upload.go
│ ├── user.go
│ └── video.go
└── utils //一些工具函数
├── check.go
├── crypt.go
├── ffmpeg.go
├── hash.go
├── jwt.go
├── storage //储存系统相关的
│ ├── local.go
│ ├── storage.go
│ └── tencent_cos.go
└── string2time.go
期间部分的改动例如一开始是有gobal模块的,但是因为bug,我又删除了。
这个也是经过了好多次改动的。
自从8月17号我创建了Github仓库后,邀请队友成为Contributor,就两个队员回应我了,但是只有一个队员和我写了这个项目,另一个队员说不会,放弃了,此时队里还剩3个人,另一个人说电脑坏了,修不好了,也退了,队伍就剩两个人了。
其实刚创建仓库的时候,我也不怎么会,都是参考 别人的代码,看各种教学视频,Chatgpt慢慢搓得,队友也是个小白。为此我们对于这个怎么写讨论的很激烈,我给他分配的任务是写数据相关的表和初始化数据库的操作,我去写utils里的储存模块和jwt。对于这个储存模块,我可是费了牛鼻子劲了。真难写。重构了n次,用了一周的时间才定型。
队友写的model就很简单了,直接从别的库里copy过来的,所有的流程处理都是controller里一把梭,写的不太认真,程序跑不起来呀,能跑起来之后响应也是错的,只有注册用户的能用,最后发现的是响应不对,我就把响应的结构体和数据库储存数据的结构体分开,重写了队友的,然后就重写了很多代码,这时也开学了,前几天没课,我就从白天写到半夜,改bug,测试。
3.结营
这时候就来到了8月27号及以后了,9月初就要交代码答辩,我就让队友写了几个接口,没想到他写的都是bug,一个能用的都没有,跟他说了具体代码要塞service里,controller里主要是用来处理请求与响应的,还是一个文件一把梭,没办法,只能由我来重写,写到点赞,关注的时候,由于对数据库操作比较多,容易报错,我才从chatgpt里了解到了数据库事务,我打算把它列为todo的,写完逻辑后再具体添加上,此时项目马上就完工了。
4.个人感受和总结
作为队长的感受: 作为领导者,选择是很重要的,当要选择基于什么开发时,选择不分上下时,一定要定下来。协同开发沟通很重要!! ,不同开发人之间有信息差,和每个人写的代码风格不一样,一定要制定一套规范,所有人都要按着这个规范来写,这样就不会造成代码不匹配的情况。
对个人来说: 写项目一定要多重构,开发时一定要多dubug,好多情况都要考虑到,不能想用户的所有操作都是正确的,一定要根据具体情况来判断,要多调试,多看底层,否则你server上写的是正常请求并响应了,但是客户端的操作并不良好。