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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 能力、格局、谋略、远见、耐心。灵魂的欲望是命运的先知,希望永远自信、洒脱、松弛、明媚、张扬;追随自己的内心、以喜欢的方式、往正确的方向前行,永远在路上,我甘之如饴!持续精进Java领域相关技术,包括微服务、高并发、高可用、分布式、集群等等;希望能接触到更多更大的优质项目,逐渐成长为一名具备全栈思维的架构师,既能深入理解底层技术,又能把控全局架构;抽时间了解学习Go语言、人工智能、大模型等领域。在探索中明晰后续的发展方向,形成自己的一套体系,成为主管、管理层乃至更高,不希望自己的上限只是程序员。

灵魂的欲望是命运的先知,希望永远自信、洒脱、松弛、明媚、张扬;追随自己的内心、以喜欢的方式、往正确的方向前行,永远在路上,我甘之如饴!

背景

双非本科、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语言、人工智能、大模型等领域,希望能跟上时代发展。

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

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

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

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
并行计算 算法 安全
考研学生应该知道:研究方向和开发技术
我自己的一位大二学生,由参加ACM不安心,后来体会了应用的核心在算法,能在竞赛中坐住了。但现在,又有新问题了。  【来信】  贺老师,我想问一下,如果打算考研,在这四年里只搞算法不搞应用,或者说只是懂一点应用,这样合适吗。    【回复】  算法在计算机和软件工程中都很重要,但不是全部。大学期间的学习,是专业教育中的基础阶段,其他的也要好好学。研究生开始,要钻研具体的研究方向,需要对专业全面的
1504 0
|
存储 固态存储 程序员
考研计算机组成原理总结(5)
考研计算机组成原理总结(5)
735 0
|
存储 算法 调度
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(下)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
|
5月前
|
存储 知识图谱
【计算机组成原理】指令系统&考研真题详解之拓展操作码!
也就是说 “其中三地址指令29”条这句话,完全可以翻译成“三地址这种类型的指令一共能有29种不同的可能性” 这样说就清晰多 因为这就意味着 我们需要用若干个字节 来表示这29种不同的可能性 然后又已知每一个字节位能表示的可能性是2种(0/1),那么我们想有多少个字节可以表示29种不同的可能呢?最少5种 (因为2的4次方=16<29),2^5=32>29,也就是说有32-29=3种可能性是不在三地址指令这种类型的指令集里面的,所以这3 种余出来的可能性要被利用 就在下一种 “二地址指令集”中利用到
74 0
|
5月前
计算机网络——物理层相关习题(计算机专业考研全国统考历年真题)
计算机网络——物理层相关习题(计算机专业考研全国统考历年真题)
47 0
|
存储 安全 网络安全
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(下)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
|
存储 Unix Linux
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
【考研必备二】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
|
存储 机器学习/深度学习 Unix
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)
【考研必备】解开“黑匣子”的神秘面纱,透视数字世界底层实现过程(计算机组成原理)(上)
|
存储 芯片 内存技术
考研计算机组成原理总结(4)
考研计算机组成原理总结(4)
416 0
考研计算机组成原理总结(4)

热门文章

最新文章