git init
git checkout chemistry\2048

高中学的是化学竞赛,上大学之前没接触过编程,想象之中,二进制和计算机是无比神秘的事物。

大一上学期与许多人一样,接触了第一门语言是c语言,但是王峥老师的c语言课程采用翻转课堂的方式,要求我们线下学习,一上课直接进行测验。这种课堂营造了一种特殊的紧张感,使我们不得不提前学习新一章节的内容,在这里我第一次学习了分支,循环等结构,也被地址和指针弄得晕头转向。

王峥老师每节课还会出一道进阶的题目,一般是一个复杂的现实问题,因为做出来可以加分,所以我每次都会尝试去实现它,在这里我第一次学习到了程序设计的含义,也第一次体会到了程序设计的乐趣。或许它与有机全合成的设计一样有着无穷的问题与创意。

九月份入学,十月份正逢1024程序员节,在学子路举办的活动上我第一次接触到2048这个小游戏,c语言结课之后,我和我一个舍友不想上每天早上的数学课,于是就在宿舍每天睡觉和打游戏,在这样过了一段时间之后,因为过于无聊而不得不给自己找点事干,再想到之前的2048,于是我就在想:能不能用c语言实现一个2048呢?恰好我舍友是信息学竞赛出身,向他征求了可行性并得到他的鼓励了之后,我就着手准备开发。

当时的开发并没有什么思路范式和逻辑,就是想到哪里写到哪里,最终磕磕绊绊的还是完成了这个2048小游戏程序。当自测所有功能都没问题了的时候,我得到了一种强大的正反馈,并且兴奋地把它分享给认识的每个朋友。

git checkout werun\addscore

2048编写完成之后,虽然得到了一些成就感,但是又没了目标,(期间还自学了Python,与团队一起以一个极其简单的爬虫完成了大一立项。)一次偶然的机会,跟球队的邹学长聊天,我跟他说我相对数学和考试还是更喜欢编程,喜欢看着那种2048的复杂逻辑所映射出的漂亮代码的感觉,他就推荐我去Werun实验室试试。

我去报名参加了它的寒假纳新。当时的后端纳新作业相比现在可以说是非常的简单,由两次java作业和两次sprinboot作业组成。java的作业我还算是做的相对顺利,但是到了springboot项目,因为学习的跨度太大,前置知识过少,却各种报错,无论如何也启动不起来。当时的我贼着急,想找人帮忙也找不到什么人,只能在家里无能狂怒,甚至我父亲还说要帮我找人解决电脑问题。不过最终还是在邹哥和鲁哥的帮助下成功启动了项目。算是迈出了第一步。

当第一个接口在postman上测试成功之后,我发了一条朋友圈并选择了一首我非常喜欢的诗作为测试数据,是辛弃疾的《满江红》:

赤壁矶头千古浪,铜鞮陌上三更月。正梅花、万里雪深时,须相忆。

项目能启动,后续开发只是业务逻辑的堆叠,相对要简单的多,然后就是实验室的面试。记得那天我还是非常紧张的,因为相比其他人我的大作业并没有太多的加分项,唯一的优势可能是项目结构还比较清晰,面试面对各位学长提出的IOC,AOP以及各种细节问题,大部分问题我也没回答上来。记得当时面试完了,我在研究院前面的公园里吹着冷风坐了接近一个小时来平复心情。不过很幸运,最终还是成功加入了Werun这个团队。

加入之后做的第一个项目是前后端联调的云端笔记项目,主要是让我们适应前后端开发的模式,当时我对接两位前端,感谢林同学和刘同学的配合,我们最终没遇到什么大的波折就完成了这个项目。完成这个项目之后,因为实验室没什么工作,我也没有新的任务了。

有一天晚上和舍友聊天,他说到学校的日常行为分统计流程是大家手动操作的,非常的繁琐而且浪费时间,各方的体验都不好。当时我已经通过两个项目的开发了解了CRUD的基本原理,于是我就想到:能不能编写一个程序去管理各种分数呢?当时我把这个想法告诉了当时的鲁主席,但是实验室要做什么项目不是我们开发人员能决定的。于是这个想法就搁置了。

不过后来,到了大二上学期,同样很幸运的是校团委那边也有这个需求,于是我就和其他几个同学开始了这个项目的开发。加分系统是我做的第一个正式的项目,当时我还有着对业务CRUD的热情去设计和实现它。不过在后期反复的对需求,开发,测试,联调之后也有一些倦怠了,感觉对业务开发没有之前那么感兴趣了。再加上不知道后面应该学什么,以至于技术栈的学习到springboot这里就告一段落了,虽然也参加了几个比赛(互联网+,物联网,大创等,并无太大的成就,但是仍然要感谢我的队友们),但是整个大二下学期都处于一个年过半摆(一年到头有超过一半的时间都在摆烂)的状态。唯二的成就可能是用hexo搭建了一个博客和参加了字节跳动举办的寒假青训营,在这里第一次接触到了go语言,但是只是语法层面的浅尝辄止。并没有学到什么很有价值的东西。

git checkout werun\elevator

大三上学期,虽然有一些波折,但还是和好朋友一起混上了werun实验室后端的主席。同样很幸运的是,这时候实验室来了一个非常大的项目:威海市电梯维保系统,一个需求和技术栈复杂的微服务项目。从大二暑假开始整个团队一直在为项目努力。但是我当时对微服务和springcloud技术不甚了解,所以整个项目前期的架构基本上都是王梓主席构建的,现在想来有点对不起他,因为这个阶段他每次找我讨论需求和业务,我总是在外面玩(笑)。

开学之后,项目开始正式的告诉推进,由于实验室没有开发这种大型微服务项目的经历,工作过程中出现了进度管理混乱,技术栈不统一,需求不明确等等很多的问题,不过好在最终都一一解决了,可能是这时候我和王梓主席两个人一起cover整个项目。所以并未感觉到有很大的压力,直到九月末,(在我过生日那天),王梓主席找到我说他寒假实习和项目负责人叠在一起压力太大,希望整个项目交给我来管,当时我觉得寒假实习没有那么的重要,加上前期确实是他付出的更多,于是我就答应了他,开始管理整个项目的第二阶段。

“走马上任”之后,首先我重构了整个项目的文档,分成了开发文档,对接文档,新人接入文档,新人管理文档等模块。然后就是找人,当时大家都忙得很,没有什么人愿意去做项目,我就一个一个私聊他们,尝试把模块和任务尽可能的分解之后分给他们。并且陈俊曦同学的配合下在把日志处理,异常处理,图片存储等公共服务抽取出来,尽我所能提升大家的开发效率。虽然很多CRUD我自己也能写,但是由于已经对CRUD PTSD了,加上希望实验室更多的人能参与到项目中来,所以我把更多的时间放到了找人上而没有一个人做更多的工作。

经过对当前项目开发流程的分析,我发现每个同学修改代码之后都需要联系负责人手动更新来测试。这样效率太低了,于是我开始研究自动化的方式,也是第一次接触到了"CI/CD"的概念,但是当时的项目是在gitlab上部署的,我只知道部署在github上的项目可以通过github runner实现编译和部署的自动化,但是对于gitlab就完全没办法了。通过网上搜索我知道了jenkins,于是开始尝试使用它搭建自动化部署框架。

这个jenkins主打的是一个教程少加难用,记得当时是2023年国庆节,我直接被这个东西整破防了,无数次调整配置都实现不了自动化的更新服务。而且遇到报错网上搜不到教程,也不知道找谁问。中间很多次想过放弃,感觉就手动部署得了,但是总想着在试试,于是继续尝试各种方法,问各种人,最终在同学的程序员姐夫的帮助下解决了问题,他为我提供了解决问题的新思路:当自动化全流程出错的时候,就把自动化的流程变成手动执行,拆解开一步一步的看是哪里出了问题,最终发现是ssh链接之后由于用户不同所以/etc/profile配置文件未生效。

git checkout bearlyricattack/andulir

解决自动化部署之后,电梯项目的进展一路基本平稳,未再遇到很大的问题。但是我发现,开发同学的测试仍然非常的繁琐,每个接口都需要手动的进行测试,而且当业务逻辑频繁修改的时候,每次的测试数据都需要重新手动输入,而且前端同学也看不到正确的测试数据是什么。那么我就在想:能不能在自动化部署的基础上,再编写一个自动化的测试工具来对springboot代码进行自动化的测试呢?

当时,我也面临着寒假实习的压力,但是还是比起背常见的八股文和刷在我看来没什么用的算法,我还是更想做完这个项目,然后用它作为简历上的轮子项目来找实习。于是就有了andulir,它结合了我自己认为的诸多巧思和创意,和市面上其他的接口测试工具使用都有所不同,更适合初学者和小型开发团队的项目测试。它的名字来源于这是我非常喜欢的小说《魔戒》里人族之王阿拉贡的佩剑名字。andulir是我发布到github上的第一个项目,算是打开了开源的大门。

git checkout allsaints/ornncache

写完andulir,已经是寒假实习的末尾,我简单粗略的准备了之后开始找寒假实习。这个时候大厂基本都招人招的差不多了,我就在boss直聘上不停的刷和投简历。当时也在java和go之间犹豫,最终决定找到哪个实习就去哪个,最终选择了万声音乐,来到了北京。

同样非常幸运的是,我并没有遇到一般实习生所遇到的边缘业务问题,而是一开始就参与了实际项目的接口开发中。感谢我的mentor杨哥对我的指导,他不仅会指导我业务上的问题,还会给我讲他入行十多年的经历,给我对未来的发展提供建议与帮助。同时也会在工作的间隙与业务做完的的时候和我闲聊(笑)。导致我这段实习的第一阶段没有遇到太大的挫折。

做了一段时间的接口业务开发后,我发现公司的一些代码结构存在问题,有一些自己的想法,mentor建议我去和我们组的leader交流,感谢孙哥积极热情的与我聊我这些初出茅庐的不成熟的想法,给予了我很大的肯定,并给了一些文章让我去研究。但是到我因为学校的考试而离职,并没有得出最终的产品,只留下了一些碎片化的代码和文档,但是离职的时候我的mentor和leader仍然给予了我的工作很大的肯定。临走还请我吃了饭。

"实习生能学到东西就很好啊。"

2024年初的北京,新年过去头场雪非常的寒冷。但是我在实习期间认识了一个好朋友,他和我一样都是实习生,我们都喜欢go语言的语法,都喜欢打王者和聊天。后来我们就每天下班一起吃饭,听他讲绍兴的风土人情,大半夜一起打游戏,早上不想起床让他帮我签到.......

三月回到学校,在直接投简历开始暑期实习之前,我想的仍然是实现我之前在公司因为时间原因没有实现的想法。为什么go语言没有内存数据库代码生成的工具呢?可以实现缓存屏蔽,解决缓存穿透和击穿,可以自由动态的选择隔离/并发级别,甚至实现多个内存数据库之间的同步......,这就是ornncache,一个内存数据库代码生成工具。它严格意义上来说是我的第二个开源项目。在这个项目中,我融合了刚看过了设计模式(没有银弹)和凤凰架构(解决系统复杂性最好的方式是分层),整体使用装饰者模式进行设计。但是这个项目并不是十分的完善,有很多模块甚至是只有设计,完全没有任何实现就开始了暑期实习。

暑期实习之前,还会之前只有java的实验室新增的golang线路,包含纳新和培养方案两部分,感谢凇哥和朱老师的大力支持,让它以很快的速度变为了现实。也在我和刘,张二位学弟的大力支持下,已经有了雏形,唯一的缺陷就是一时半会可能没有太正式的项目之外没有其他的缺点了,希望这条代表着未来和基础架构(或许?)的线路能越来越好。欢迎同学们参加。

git checkout seata/seata-ctl

暑期实习的经历暂且按下不表。在找到暑期实习后,我通过Gsoc QQ群了解到了开源之夏这个活动,并且尝试参加。当时我的策略是广撒网,但是由于时间较晚,对很多个自己感兴趣的项目都发出了短信,但是大部分回信都是已经有了人选,只有少部分的项目还未确定。我一开始就知道这个活动的难度非常大,所以只是告诉自己尽力就好,并未有很大的信心。但是同样非常幸运的是,或许是之前的项目设计经验帮助到了我,最终有mlivus和seata两个社区都选中了我的设计方案。但是只能选一个,于是我选择了云原生方向的seata-ctl。

那时候的我其实对云原生相关技术的了解并不是十分深入,而且由于实习工作太忙,理论上应该是项目开发主要时期的7.8月份我的进度都比较的缓慢,感谢我的导师ptyin对我的支持和帮助,并且愿意和我在每周的阴间时间(例如周日晚上十点)沟通项目进度,并为我提出各种指导的意见。并且忍耐我的一点点拖延和无能。在7月的apache亚洲大会上,作为志愿者的我还与导师一起吃了饭和开了会,可以说是最幸运的一集。

在10月份暑期实习完成回到学校之后,我整日在同学实习的咖啡店赶项目进度,终于在11月份的ddl之前提交了一份还算满意的pr,成功结项。这就是云原生形态的seata-ctl,大大增强了原有的功能。在这个项目中大部分的地方难度不算太大,但是仍然有一些我自认为的context机制,直接向api server发送请求以绕过client-go,自研的动态client等等一系列的创意和巧思,其中的每一个都是经过反复的讨论和设计,最终呈现出了现在的样子。虽然有些部分仍然不太完善,甚至可以被称之为demo,但是随着不断的迭代他会变的越来越好的。(笑)

git checkout sealos/devbox

早在寒假的时候我就了解到了现在的公司和sealos产品,"开源的云操作系统",这五个字对于当时对云原生一知半解的我来说有一种莫名的魅力。所以暑期实习我再次投递了这家公司并且最终选择了它。

公司有着非常良好的氛围,大家之间非常的平等和融洽,甚至可以在公司的okr会议上为整个公司的发照提出自己的意见。在我初来乍到的时候,在这个领域可以说是什么都不懂。但是感谢方老板,曾哥,yy以及各位其他同事对我的包容,他们会与我一起讨论产品,从更高的维度指导我产品和程序思考的维度,修改我漏洞百出的代码,甚至主动交给我我想要去尝试和做的业务,哪怕是devbox这种公司最重要的业务,在技术探索上他们仍远愿意给我一个只是刚入职的实习生以信任。我仍然记得当在我的电脑上,第一次验证通过devbox nodeport方案时群里老板和同事们的赞美和夸奖,也记得下班好几个小时之后,曾哥连麦与我一同解决go生成ssh 公私钥不匹配的bug并分享他解决问题的思路。

我也由衷的佩服各位同事的远见和技术,我认为devbox是优秀的产品,它虽然仍然在性能上有着诸多的问题,但是在设计理念和产品形态上是超前的。希望日后能为它做出更多的贡献。

在sealos实习的这段时间,是我技术上进步最快的时期,更多的接触到了网络,存储,调度,语言的底层与各种设计方案与实现的优劣。同时也在思考计算机,软件与人类社会生活的意义,也会与王梓为"单纯的技术与技术的落地转化到底哪个才是对社会有益的",这种问题争论到凌晨五点。所以我觉得实习是重要的,它会让你脱离学生思维,站在更高的角度去思考一些问题,虽然它会让你暂时性的远离你的理想,但是就想"绝望之谷"与"进步之坡"一样,我认为这是一个程序员进步的必经之路。只有思考,痛苦过这些问题,或许才会创作出更加令人满意的作品。才能更好的认识自我,认识程序与认识这个世界。

现在,出了devbox之外,我在公司有了更多的任务和方向,victoria metrics&logs ,ai可观测,公有云serverice隔离,甚至是自研高性能网关......希望能与我的同事一同创作出更多优秀的产品,带给大家。

git checkout bearix/future

还有半年就要毕业了,刚入学时我还是个什么都不懂的学生,现在或许可以被称之为一个半吊子程序员了(换而言之:牛马社畜打工人,笑)。一路走来,我一直认为我是不是一个非常努力和聪明,但是可以算是一个非常幸运的人,无论是纳新的大作业,实验室的项目,还是两次实习的工作,ospp的中选和结项,开源领域的贡献.......都得到了父母,朋友,同学,导师,同事的诸多帮助。时至今日,我都不知道自己参与过多少个项目的创意,设计,开发,测试和实现了。

有一首古风歌曲叫《一拜天地》它的作曲黄诗扶因为一些版权的争论而备受困扰,但是她还是在微博写下:

没事的,最好的创意永远是下一个。

我觉得这句话同样适用于计算机行业和它其中的一些从业者。创意与实现永远是推动人类社会发展的基石。日后,希望能够用更多的idea为计算机发展,云原生行业,开源事业,做出自己一点点微不足道的贡献。最后,用我电脑上one thing app(这个app的作者也是开源领域的传奇人物,感兴趣的可以去了解下它的故事)在右上角一直挂着的一句话做结尾。他是由计算机著名的著名辨证思想和乔布斯时代的苹果广告词组成,与诸君共勉。

No Silver Bullet,So Think Different

祝大家在新年快乐!

”他们并没有创造出伟大的产品,只是为他们创造了环境而已。“
“或许,这也是伟大的产品本身?”

Bearix.

2024.12.31

:wq