【魔芋种植】单文件宝宝的C++开发实录

前言

事情是这样的:因为某种机缘巧合,我本来以某个摸鱼工具人身份收到了一个开发任务,或者说,一个小challenge。但是发生了各种魔幻的事情之后(如因为打cf错过沟通,最后还掉了90分),我需要以一个更核心的身份进行此次C++开发任务。
于是,单文件宝宝的第一次像模像样的团队合作C++开发,就此开始…

(可能是我的最后一次CF,痛失紫名)

什么都不会

大概就是模仿传奇跨平台开源项目localsend来做一个类似的文件传输工具。
文件传输?也就是要用到计网的内容吧,可是我计网还没学啊,别说计网了,我连一个正经的c++项目都没开发过好吗!整天就在那里嗯写单文件,这很多文件…到底是怎么被组织起来工作的啊我去…

不过起码,我有github账号,我还有对git有着一知半解水平,这也是我仅有的东西了。我甚至没有自己写过约定式提交。

那就学

于是我就开始学了。当然了,学的都是一些非常基础的东西:

  • 约定式提交:用于规范化git提交的一套规则,同时还学了一下在进行团队项目开发的时候应该如何正确地使用git
  • CMake:一套C++构建工具。不过其语法对我来说还是太过抽象了,导致我其实是复制了一套板子,然后根据自己的理解做一些渐进地修改。
  • Boost(boost::asio):一套c++地异步网络库,很明显在这次的与网络传输相关(牵扯到效率等问题)的任务是离不开这一套库的。
  • 现代C++:我以前写的那叫c++吗?顶多可能叫C with class。我希望通过这次任务能对现代c++的一些思想的理解更加深刻,对语法更加熟悉。
  • vcpkg:一套好用的包管理工具,可能在小型项目开发的时候会比较有用。

怎么做

localsend是用flutter写的,我寻思我也不会啊。所以Mairon老师无私地给我写了一个小demo,里面包含了一个简易的CMakelist.txt、vcpkg的相关配置和boost::asio的简单应用。
于是我稍微看懂了,以我目前对项目的认知,就是简单对任务归类,一个类别放一个文件夹,然后写一个类来处理业务,业务与业务之间的耦合就纯靠一个main函数来进行调度嘛。

“先写一个开始页面,然后再进行udp广播用于设备的发现和连接,之后再验证消息,最后文件传输,不就好了嘛。”还是秉持着一贯的单文件思路。只不过就是把各个复杂的业务给分到了其他文件,仅此而已。

Mairon老师发烧了,我就自己写吧。

克苏鲁

刚一开始处理广播的部分的时候感觉还是不错的。在AI的帮助下,挺快就写完了主要的业务,毕竟现在也就这一件事情,所以感觉还比较好写。
结果到了处理第二个事情:连接时的密码验证的时候,直接给我干破防了。
因为我完全没有项目处理的经验,根本就不知道应该怎么去规划一个项目,所以从刚刚的广播开始,我都是想到哪里写到哪里,感觉就这样子一点一点写下去就完全没事了。

结果,就这么小一件事,我写了一个有一个文件,一行又一行的代码,一会加一个参数一会又加一个参数,感觉都叠成杀人书了。

但是我依然觉得“都tm写到这了,再重写不是沉默成本太高了吗,史山就史山了,反正整个项目就不大。

于是,写到文件传输那一块的时候,我为了实现异步疯狂的写回调函数,加了一堆莫名其妙的类,最后看似整个项目写完了,文件夹也分的好好的,但是总是给我一种不可名状的感觉。感觉每一个模块都像一个八爪鱼在那边张牙舞爪跟别的模块互相殴打,最后直接扭在一起不止天地为为何物了。这样的写项目的心路历程让我不由自主地想起今年年初看的Ave Mujica,前面看起来是一个正常在流转的流水线,到后面流水线扭来扭去,变成了跳舞的线,到最后这条线又变成了非常掉SAN的样子…

最后很明显是跑不起来的,哈哈。

重来

两个星期过后,经过了一系列痛苦的抉择,还是决定得重来。把整份代码全部推翻重写。

这次吸取了上次的教训,拿一个小本本,把整个项目的框图给画出来,把应该实现的哪些函数写好,明确地规划好整个项目的框架,然后才敢开始写。
计划是这样的:

  • 设备发现:单独一个线程用来处理,分发送和接受两个方法
  • Client:用于消息的接收
  • Server:用于消息的发送
    消息怎么发送?就包装成json就好了。这样也方便包装请求。
    所有的异步操作全都使用boost::asio的协程,放进io_context上下文中进行调度。

这样子看起来就清晰非常多了。不过还是有两个比较蛋疼的点:

  • server接收到消息了,我还想再发送一个反馈的消息怎么办?
    这里用了一个不太好的处理方式:建一个全局的消息队列,server模块将想要发的请求放进队列里面,client模块检测队列里面是否为空(定时3秒检测一次,这也是这个处理方式的愚蠢所在),client模块代为发送。
  • 文件分块传输了,怎么分块,分了块之后又以什么形式传输?
    1Mb一块吧。这个分法也只是俺寻思之力想出来的。然后数据处理…因为要包装成json,所以迫不得已,只能把二进制给编码成base64格式,这个想法实在是蠢到家了,也是传输效率低下的最大原因。
    不过至少比之前是健康多了。

Vibe Coding

不会写怎么办?问AI。
AI写的有问题怎么办?继续问AI。
编译出来有问题看不懂怎么办?再问AI。

写到最后我已经成这样了。

旁边的CEvove05老师跟我说,我这是纯纯的 vibe coding(氛围编程) 啊。
Vibe coding?啥意思?

后来,偶然刷到了与其相关的知乎帖子,天哪这简直就是我!

才发现,确实不能这么搞了,这样子做就算整个项目做出来了也不是自己的。AI应该是给自己学习的工具,而不是代替自己学习的工具。

最后…?

写这篇博客的时候这件事情其实已经过去了两个月左右,而我也因为这件事收获了一个对自己人生非常重要的东西。两个月后的自己也比当初的我长进了相当多(甚至中间还隔了个期末考试,所以我学技术的时间远小于两个月)。

感谢所有在这件事上给予我帮助的SAST的伙伴们。

之后还想做什么?当然是再把它重写一遍咯(逃


【魔芋种植】单文件宝宝的C++开发实录
http://blog.bluspace.ren/2025/07/27/【魔芋种植】单文件宝宝的C++开发实录/
作者
Blauter
发布于
2025年7月27日
许可协议