24岁程序媛,二战考研失利、三无人员 ==> 最佳新人、优秀个人,讲讲我的技术成长之路

背景

双非本科、22年毕业,大学期间将所有心思精力投入到学业课程、科研竞赛、学生工作中,成为更优秀的人、去985高校读研是我内心唯二想要的,从未想过本科毕业后工作。因某些原因放弃保研,眼中只盯着北京的985,结果准备两年研究生考试均落榜。21年一战因复习时间太短,成绩不理想;22年二战冲北大软微,拼了命复习,可考前中招,顶着高烧、吞针般的嗓子,强撑着考完全程,结果还是离北大差一点儿,放弃了北京科技大学的复试,开始找工作。

        准备两年研究生考试均落榜,毕业后有10个月的空窗期,典型的三无人员——无实习、无技术、无应届生身份。于是,在担忧、遗憾、自我鼓励等多种情绪下,从不知选择Java、C++、还是测试,到确定走Java方向,从0开始跟着B站学习(为啥说从0开始?学校课程,懂的都懂!),经两个月的学习、面试,2023年4月底入职一家小公司,担任Java程序员。很幸运,带我的领导、主管都很好,能力、格局、谋略、远见、耐心等等方面,都是我极其佩服且要从之学习的。

        现已工作一年5个月,平常在努力学习各类技术的同时,会担心自己30岁之后的出路,也会思考 当35岁危机来临的时候,我是否有能力、底气接住它;偶尔也雄心壮志,希望这一生能按照自己的心意而活,实现自己的价值,闯出一番天地……

机缘

为什么想成为创作者呢?

这个问题很大很长,可能一时无法描述清楚。我的第一篇博客是 “IDEA更改新建项目默认地址(2021.3版本及之后版本都适用)”,内容很少、极其简单,只是单纯地记录,方便日后遇到同样问题时直接查阅。那个时候没考虑过写博客、也压根没时间,重心都放在学习Spring那一套框架、解决bug、完成需求、度过试用期。

第一次让我意识到记录博客比较重要的是 mysql、redis这些命令。作为后端开发,有时需要通过命令行查看库数据,升级安装系统时需要备份恢复数据。虽然这些命令我用过、但还没到那种“下手如有神”的地步,每次只能查找博客等资料,有些可能还有误,比较零散。于是,忙完手头上的工作,我就整理了一下MySQL常用命令、备份、导入导出。自己先在本地测试运行各类命令、确认ok、再整理、记录到博客,这样日后方便查阅自己的博客,孰能生巧,更加得心应手;也能为其他程序员朋友们提供一份可靠的资料、参考。

简而言之,最初成为创作者的初心:

  1. 日常学习过程中的记录
  2. 疑难点、薄弱点突击
  3. 实战项目中的经验分享
  4. 通过文章进行技术交流

收获

在创作的过程中,我攻克了很多似懂非懂的知识点,譬如:get和post区别、后端接收参数(全面)、Sring各种注解、索引、缓存击穿等等。随着越深入了解,我越发现 自己掌握得不够,越能知道什么时候可以用它、怎么用;心态也从最初的似懂非懂、不予处理、担忧,到后面的不懂可以学,同时也更加平静、自信了。

在整理笔记、拓展学习、反思总结的过程中,我的知识、笔记更加系统化,也清楚地看到自己的知识体系以及成长。而这些博客不仅帮助了我,也可以帮助其他遇到同样问题的技术人员。

随着文章的积累、技术的拓宽,我也获得了许多意想不到的收获:逐渐积累了一定的粉丝基础,获得了很多正向反馈,看到越来越多的人通过我的文章获得帮助,这种正向的反馈给了我继续创作的动力。与此同时,通过创作我认识了许多志同道合的同行。他们在评论中分享自己的想法、建议和技术心得,通过这份技术交流,我们一起成长,拓展了彼此的视野。


日常

我唯一确定且坚信的是,我会坚持创作。忙的时候可能输出少些,但若得空了,一定会抽时间持续学习、创作。因为它丰富了我的知识体系,让我获得内心的安宁、也更加有自信。

日常我还是以工作、学习为主。一般会利用早晨上班前、休息等碎片时间,进行素材积累、尽量把遇到的技术问题快速记下来,而后在周末或者空闲时段将这些问题/知识点集中整理成系统化的内容,并设置于周一至周五等工作日 定时发布。

通过这种方式,不仅保证了文章的输出,也让我的技术积累更加系统化。同时,创作也反过来推动我在工作中追求更优雅的解决方案(这个问题适合用什么技术、还有其他更好解决方案吗),让自己始终保持对技术的热情。


成就

在创作过程中,我最自豪的一段代码是日志分片下载。通过Redis、ZSet、Base64、TCP处理大文件的传输下载,解决排序、丢包、超时等问题,其核心模块如下:

protected void getLogAck(EmbMsgJson json) {
    JSONObject jsonObject = json.getJsonObject();
    if (jsonObject.containsKey("offset")) { //分片传输
        /**
         * 1.获取GetLogRecv按序存到redis中 LOG_FRAME为true,根据offset与frames大小 设置hasNext
         *      其他片 hasNext=true, 最后一片 hasNext=false
         */
        CacheManager.addDeviceLog(json.getDeviceId(), json.getJsonObject());  //待确认
        DeviceInfo device = CacheManager.getDevice(json.getDeviceId());
        String deviceId = json.getDeviceId();
        CacheManager.setDeviceWaitOk(deviceId, DevPT.EMB.LOG_FRAME, true);
        CacheManager.delLogHasNext(deviceId);
        int offset = jsonObject.getIntValue("offset");
        int frames = jsonObject.getInteger("frames");
        if ( offset != frames-1 ) {
            CacheManager.setDeviceWaitOk(deviceId, DevPT.EMB.LOG_FRAME, true);
            //每接收一片 判断存HasNext;到下一片 先删之前的、再判断、存
            CacheManager.setLogHasNext(deviceId, true);
            return;
        }
        CacheManager.setDeviceWaitOk(deviceId, DevPT.EMB.LOG_FRAME, true);
        CacheManager.setLogHasNext(deviceId, false);

        //最后一片 hasNext=false,写入文件
        List<GetLogRecv> deviceLog = CacheManager.getDeviceLog(deviceId);
        String logName = jsonObject.getString("log_name");

        //  D:\home\etc-server\data_files\log
        String dir = AppConfig.MONITOR_PATH + File.separator + "log" + File.separator + deviceId;
        File file = new File(dir + File.separator + logName);
        if (!file.exists()) {
            try {
                FileUtils.forceMkdir(new File(dir));
            } catch (IOException e) {
                log.error("设备{}生成日志文件失败", json.getDeviceId(), e);
            }
            file = new File(dir + File.separator + logName);
        }

        try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
            for (GetLogRecv getLogRecv : deviceLog) {
                fileOutputStream.write(Base64.getDecoder().decode(getLogRecv.getBase64()));
            }
        } catch (IOException e) {
            log.error("设备{}分片下载日志失败", json.getDeviceId(), e);
        }
        CacheManager.setDeviceWaitOk(json.getDeviceId(), DevPT.EMB.GET_LOG, true);
    } else { //ftp传输
        getAckStatus(json, DevPT.EMB.GET_LOG, "下载日志");
    }

}

这段代码可能看起来简洁,但却经历了多次的优化和调整,最终成功解决了大文件传输下载存在的排序、丢包、超时等问题。通过该模块,我更加理解 为什么要拓宽技术的广度与深度,因为这两者决定了你在实际项目中能否找到高效且优雅的解决方案,并保证系统性能;它也会伴随你整个职业生涯,帮助你往更高处前进。


憧憬

展望未来,一方面我会持续精进Java领域相关技术,包括微服务、高并发、高可用、分布式、集群等等,希望能接触到更多更大的优质项目,逐渐成长为一名具备全栈思维的架构师,既能深入理解底层技术,又能把控全局架构;另一方面,我会抽时间了解学习Go语言、人工智能、大模型等领域,希望能跟上时代发展。

与此同时,希望我能在探索中明晰后续的发展方向,形成自己的一套体系,成为主管、管理层乃至更高。我心里一直有个隐隐的声音——不希望自己的上限只是程序员。我不知道最后会是什么样子,现阶段只能尽力去做,走到自己能去的最高处,多体验、永远在路上,相信结果总归不会很差。

在深入技术领域的同时,我也会保持创作热情,分享更多技术见解和实战经验,进一步完善自己的知识体系,成为一名优质的程序员。当图文内容达到一定的瓶颈,我想尝试视频和直播等形式,将复杂的技术点以更加生动、清晰的方式呈现给大家。请允许我贪心地说一句,在博客创作这条路上,当我技术的深度与广度、项目的实用与创新 达标后,希望能打造自己的知识星球,形成影响力,帮助更多人解决问题。

        道阻且长,时间远远不够,希望自己坚定信念、合理规划、持续努力,以自己喜欢的方式、往正确的方向前行。

        最后,感谢所有在这个过程中支持和鼓励我的粉丝、读者朋友们,未来我们继续前行,探索更广阔的技术天地。祝大家在人生海海,尽兴、开怀,活出自己的光芒!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值