编程导航2024年度总结话题讨论

2024年度总结

50 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

2024 总结,我的停滞与觉醒

大家好,我是拭心。 2024 一转眼过去了,按照惯例,是要做个总结的。 当我在键盘上敲下第一个字时,心中仍盘旋着自我质疑的迷雾:"这样平凡的一年,值得被记录吗?" 翻阅过往五年的年终总结,从新婚燕尔到出书得奖,每年都闪耀着里程碑式的光芒。而今年的日记本上,没有闪耀的奖杯,没有突破性成就,有的只是一些生活琐事。但正是这些看似琐碎的日常碎片,拼凑出了最真实的我。 # 每月记录 ## 一二月 1. 工作上主要在开发鸿蒙 ReactNative 底座和短剧项目 2. 在公司跳蚤群里发了自家的羊肉广告,带来了几个单子 3. 开启了微信阅读 360 天挑战,拉了个阅读群(挑战成功!) 4. 和老婆玩跳棋飞行棋大富翁,赢少输多,老婆喜欢下棋 5. 发布文章 1. [# 一二月总结:回家过年、阅读挑战、线下新体验](https://mp.weixin.qq.com/s/90gGtE_wVeuEANigIMCplA) 2. [# 在上海做程序员这么多年,退休后我的工资是多少?](https://mp.weixin.qq.com/s/31Oavt5S5VpZxh4GJSlTFQ) ### 开心的事: 1. 老婆给双方妈妈买了金镯子,妈妈很高兴,我也开心 2. 体验新事物,以前只知道工作和学习,娱乐就是玩手机。**今年要多去体验线下,快乐其实不需要很多钱就能获得** 1. 看了次脱口秀,线下和网上的区别:可以坐第一排互动 2. 看了次钢琴演奏会,小孩很多,估计是家长带来熏陶的 3. 年度计划里的锻炼,终于说到做到了(**然而仅坚持了俩月**) 1. 燃脂单车:自己家里的单车没有骑的欲望,来到这个氛围下,骑的很带劲; 2. 杠铃操:强度有点大,杠铃加的有点重(好面子),第二天全身酸痛 4. 拿到驾照 5. 春节在家里过了十五,很多人不喜欢拜亲戚,但我今年发现了乐趣:**找人问怎么赚钱、避免亏钱(有些真经验只有亲人才会讲)** 6. 读完: 1. 《我的妈妈做保洁》(推荐) 2. 《太白金星有点烦》(推荐) 3. 《纳瓦尔宝典》(干货不如故事容易记住,忘的差不多了😭) ### 不开心的事: 1. 房价跌了 2. 经常下午七点就感觉很困,身体素质有所下降 3. **空闲时间经常茫然,不知道该做什么(没有清晰目标)** ### 值得反复看的: 关于写作: > 故事的重要性(主角、目标、冲突、结果),就像学习英语一样,学习写作第一步是建立信心「我可以写得不差!」,故事是否吸引人,和文笔是否华丽没有关系,更重要的是情节是否有趣,是否可以调动读者的情绪(好奇、担心、角落、恍然大悟) ## 三四月 1. 健身 3 次 * 体验、磨练,可以增加生命的厚度 * 早上锻炼,感觉一天都变长了 * 锻炼完完全没有精力学习,还是放周日下午吧 * 划船,比杠铃操要好,但第二天肚子肌肉和膝盖疼 3. 直播签名 2h,签了两百本书,有趣的体验 4. 乐乐单招录取 5. 关注的房子一天降了 44 万 6. 和朋友 lxl 约饭 * 现在找工作比较难,八股文和算法、项目 * 创业,需要多出去和非技术的人聊 8. 看了一个视频印象深刻,主要讲**中产在投资、教育和创业上如何被收割** * 说白了就是要**小心那些持续让我们支出的项目,多思考思考是否值得** 9. 了解到华为渠道投放可以不花钱的,不过这需要你的 app 有收费项目,**走分成** 10. 老婆开始加班模式,好多天忙完凌晨 11. 看了一个[小米食堂的演讲](https://www.bilibili.com/video/BV1LoDuYWEk9),值得逐字学习 12. 发布[# 鸿蒙 React Native 和 Android 的区别?](https://juejin.cn/post/7357979741666246690) ### 开心的事: 1. [书籍上架,得到了很多朋友转发推荐](https://juejin.cn/post/7350510977052688420),感谢 * 拥有的第一个作品 * 作品是可以代表你的能力、持续给你带来收入的东西 * 虽然书不赚钱,但这段时间带来的影响力和小范围内的虚荣心满足,还是不错的 2. 妹妹来上海做暑假工,顺利找到工作 ### 不开心的事 1. 前同事找来想创业,当时有个别的事情要先做,婉拒,现在人家做的很好,后悔 * **对的人对的项目,比先来后到更重要,学会及时刹车** 2. 评估工作量的时候,又装 B 了,说了类似“这个很容易”的话。不要装逼,要凸显工作量 3. 四月给 xx 借了 xx,承诺最多两个月还,希望能守信誉(唉) ### 值得反复看的 <https://mp.weixin.qq.com/s/z42XYUwirg0BlwMBkZrmVQ> > 就创业这件事,软件开发只是非常小的一环节,我们将企业数字信息化的角度来看,各行各业都需要企业信息化,而我们天天打交道的买卖,比如买卖水果、医院系统,这些生意里面有客户关注的业务问题,比如医院会考虑医生的日常操作、各个科室的管理要求、以及医院行业的考核评级要求等等 > > 每个业务都有自己的商业规则和赚钱机会,要深入下去,只有成为里面的人,或者就是拥有这些朋友。 > > 所以我建议产品经理/程序员一定要多交非本行业的朋友,在企业管理统一这个要求下,可以得到非常多的商业机会。 我觉得是程序员也要有商业思维,编程是方法,获客是目的,内容运营是手段。 基于抖音等平台的内容营销,是在成熟产品之上的获客行为,程序员的差异化优势能体现的很少。 官网的搜索量比小程序大很多,影响力也更强。在官网上运营内容、创始人IP等很有效果,在官网埋关键词、内容首发提升网站搜索排名(再分发其他平台),是比较有效的策略。 ## 五六月 1. 带妹妹和老婆去顾村公园划船,有趣 2. 周末时间基本都在开发个人项目,**现在来看并不是一个好方向,只赚了经验,吸取教训** 3. 我的性格太谦虚,不好意思自夸,这在商务沟通的时候并不好,要自信满满 4. 掘金直播分享:<https://juejin.cn/live/Android> ### 值得反复看的 老余分享: > 我们只要离客户远了,我们只要不关注他们,不听他们了,就很容易走向失败的边缘。所以反过来说,我们想要把事业做成,把我们的业务干成功,那就必须要去关注用户的声音。 ## 七八月 1. 老婆开始忙起来,各种事夹杂起来,连续熬夜,三四点才睡! 2. 妹妹结束暑假工生活 3. 帮母校做了个报考班级查询的功能,反馈不错。能为母校做一些事很开心 :) 这两个月没有认真记录,以至于回顾起来重要的事情不多。 **工作注意点:借势、尺子、做坏人、拿结果** 在公司里,要主动思考怎么创造价值,怎么解决问题,**让自己尽量处于漩涡中心。不要老是退缩,嫌麻烦,逃避思考,被动的工作**。主动往前一步才是更重要的,千万不要混日子,不要停止学习,不要停止提升能力。 人的成长,常常需要反馈,尤其是一些否定。 应对不确定性,是对人最好的磨练。 和高层沟通,首先要说清楚要做的是什么,大目标,别上来就讲细节,否则人家会不耐烦。 拖了很久的项目,要尽快结尾,哪怕说不做了。 ## 九十月 1. 帮旭哥做游戏官网 2. 又收到一笔稿费,虽然不多,但还是比我预期的高一点,需要多宣传 3. 听完喜马拉雅上的《认知觉醒》,书内容和读的很好,推荐 4. 被铺天盖天的牛市言论吸引,又进股市 5. 黑神话悟空通关,推荐 人的自信,来自自己在某方面的领先优势,或财富或权利或资源。 炒股的时候,经常会觉得心烦。仔细思考,心烦的主要原因:**对交易的股票理解不够,预期和结果经常不一致,自我怀疑。** 如何解决:减少持有的票数,在精不在多,拿住半导体。 ## 十一十二月 1. 做了一项重大决策 2. 定下装修合同 3. 西安技术分享:<https://www.bilibili.com/video/BV1ZizbYEEcV> 4. 输出文章: * [# Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍](https://juejin.cn/post/7451107065961349170) * [# 准备换手机?这些 Android AI 手机的功能你是否了解](https://juejin.cn/post/7454489325752107045) 参加西安活动,「大模型 + 知识库」的分享最火爆,提问的人接三连四,业务需求量可见一斑。 ### 值得反复看的话 1. 判断这件事有什么价值,比如何做这件事更重要 2. 专业的事让专业的人做,不要自己闷头干!利用好自己的资源 3. 我们是我们反复做的事情。因此,卓越不是一个行为,而是一个习惯。 4. 你提到在执行创造软件的过程中不知道从哪里开始,那么你是否尝试过制定一个详细的计划,或者寻找一些入门的资源,比如在线课程、书籍或者社区支持? # 做的好与不好 以上便是 2024 年发生在我人生里的一些事。 总的来说,2024 年我有这些事值得记住: 1. 《Android 性能优化入门和实战》出版,加印两次 2. 做了一个 ToB 系统并交付使用,但方向不对努力白费 3. 微信阅读 360 天打卡完成 4. 房子决策,确定装修合同,在生活重大事件上需要多花心思 **2024 做的不好的:** 1. 身体健康方面不到位:经常熬夜,运动不足,导致经常没精神 2. 工作上深度思考不够:增加冥想,思考下当下最重要的问题和解决办法 3. Android 社区不活跃:新技术感觉没有什么值得学的,主动调研的不够 4. 答应老婆的下一本书投入时间不够:潜意识觉得自己写不好,不能预期太高 5. 浪费太多时间在低级趣味:目标感不够强,没有方向 **2024 我最重要的问题:深度思考不足。** 思考什么呢?思考社会、人性更深层的东西,比如对自己行为的复盘分析。**2024 虽然记录了日常发生的事情,但很少进一步复盘**,导致的结果是:今天的我和去年的我相比,认知上没有太多的变化,这是最可怕的。 年轻的时候我总觉得比我年长就比我强,因为他们可能经历的更多、会的更多。然而事实是,很多人早早地就停止了成长。如果我一直像去年忙着低头,不常常擦拭内心(回顾、分析、改进),几年后,恐怕和年轻人没有多大区别,也就面临那可怕的“没有价值”。 # 总结 好了,这就是我的 2024 总结。 写这篇文章,就和**我想做的很多事一样:刚决定做时异常兴奋,但一执行就有各种原因拖延,越拖越矛盾,最后咬牙完成或者跌向不了了之**。过去一年我有很多点子最后都不了了之,还好这篇总结完成了。 > 想到和得到,中间还有个做到。最难的便是一点点做到。 总的来说,记录的一定比发生的少,计划的多半比落实的多,2025 会怎样我也说不准,但无论如何,在我完成这篇文章时,我已经前进了一点点,发布了两个新作品,收获了一些用户差评,比起什么都不做,未来多了些可能性。 一年之后,我会再来分享我的 2025,希望到时有更多深度的思考输出,有更多有用、有趣的作品向大家介绍,并且我能更瘦一点。 *** 历年总结: * [2023:举行婚礼、公司内部比赛得冠、成为 GDE](https://juejin.cn/post/7318224345793069056) * [2022:完成书稿、黑客马拉松得奖](https://mp.weixin.qq.com/s/hDYD32nIfeV4UxPa2a5exQ) * [2021:系统复盘工作经历](https://mp.weixin.qq.com/s/jxB3TjTKlRyz0Ti4pnXZcw) * [2020:开始炒股、柿子来了、接触底层优化](https://mp.weixin.qq.com/s/JulOcQKVM4D_iy5nUY6lOw) * [2019:做敏捷组长四个月、沉迷打牌](https://mp.weixin.qq.com/s/4ewn5ErFlgh4KmRNebxacg)

苦行修士的年终总结

# 以史为鉴,可证道途 大家好,好久不见,我是苦行修士。2024成为历史,2025悄然而至!我这一年的经历应该是20多年以来最为丰富的一次经历。有迷茫有遗憾,但该走的路还是得一步步走下去!多了点过来人的沧桑感😂。 本来是打算不写年终总结的,寒假这段时间有点忙,想了想还是写一下吧。以史为鉴,可证道途! ## 升本之路 2024年的现在应该还在准备升本,我虽然不想升本,但也知道凭现在的水平和学历也无法顺利入职一个好点的公司,毕竟入场劵和足够的时间积累对我来说还是很重要的。经过漫长的学习最后还是上了一个联培的本科。联培本科就是说白了就是分数达不到又想要你的钱,所以把你外包给了别的学校,而你只是在这个本科学校挂个名。虽然结果不尽人意,但好歹也算半个公办本科的学生,不过这大学名字还是挺唬人的。😂 md,除了软件工程这个专业学费1w,其他专业都是5000左右,关键是课和计科的一模一样😭,老师上课还是挺好的。但学的内容却是从大一开始,这就没太意思了。想想这1w多的学费真的亏大发了😤 ## 求职之路 大概是升本过完51后,我陆续开始在Boss直聘沟通一些公司,因准备不足,大概有800多家公司,很多都石沉大海;江西这边Java岗位很少,实习岗就更少了。而且工资普遍的很低,我看到的3年经验最高的好像只有1w,普遍是6-8千;离谱的是我看到还有个别公司4千块钱招一个3年经验的后端开发😂(我心想:你TM打发要饭呢,老子进厂也不止这点钱啊)。 这段时间也面试过一些公司,有些公司项目用的go,还有一些表面上招后端实则招全栈,一个打几份工工资却是低的离谱,还有些公司拿我刷kpi,我人来了以后又说搞错了(😑)。 因为当时很多公司都不接受线上面试又没有确定究竟会在哪个城市收到面试机会,学校又不在这边,不好直接在学校或是南昌这边租房。所以只好坐火车两地跑,哪边有面试机会就去面试,面试上了就租房;定的都是最便宜的青年公寓,一晚上20-40块,而且只敢定3-4天,因为如果没面试机会,继续待在公寓,不仅环境差学习效率低,生活费都需要不少。我记得当时一边拖着行李箱,背着一个破书包,手里拿着面包就这么走在路上,当时感觉自己就像一个行尸走肉的失败者。 也进过一个小公司,想让我一个人开发系统搞全栈,受不了直接辞职了。 求职压力加之父母这边的压力,真是心理和身体的双重疲惫。 这是我第一次感受到牛马求职人的痛苦! ## 租房经历 大概是六月份了吧,我想着这个时间也找不到实习了。干脆随便找了一个招专升本学员的工作。当时我的成绩已经出了,之后就在南昌租了房子,房租水电费一个月大概800,房子小到只能容纳一个人通过进入的过道,而且只有一个很小的窗户夏天房子里面就和蒸笼一样,四级耗能的空调真有点舍不得开。我租了两个月,当时还因为不知道退房要提前15天和房东说,导致起了点冲突,扣了一半的押金(350的巨款啊😭,深知赚钱的不易)这是我第一次租房,真是满满的教训。因为没有厨房,而且空间实在太小,锅都不好放,我借朋友的空气电锅,连着吃了两个多月的辣椒酱蘸面,吃吐了🤢,现在想想还真有点当牛马的窝囊。 ## 打工之路 我一共去了两个公司,先说这个招学员的机构。 面试开场就是满满的画大饼,但没办法当时真被忽悠去了,结果进去一个多月,一个学员都没招到。(但这事真不赖我,摆摊发的资料厚度还不到人家的一半,而且全是装订版,后面基本每天还有城管来砸场子,不过那段时间还算挺安逸的,除了工资低,资金压力都给到领导,我们这帮人该吃吃,该喝喝,该摸鱼还得摸摸🐟😁),但后面因为老板实在扛不住花销,搞了一个机制,如果该月没招到人还得从我们这点微薄的工资里面扣,也是因为这个,我最后选择辞职跑路。我走之后几个同事也都跑路了,听说最后这机构就剩5个老师教2-3个学生🤣。(这公司也有黑幕) 来到了我的第二家公司——招网约车司机的。 干了这行才知道,社会的水有多深,资本家的套路有多黑。坑蒙拐骗把人骗到公司,然后给你一顿洗脑,把车的租金换个套路改成保证金,说合约到期后全退,说每月2000多的奖励,时间自由,都是骗人的,也不知道那些截图的月薪过万的图片是哪偷来的。公司基本每天都有警察叔叔上门,说白了就是诈骗,后面别人一听到这个地点就说那是个诈骗大厦🤣。再后面公司搬个地方继续搞,听说老板把那边的派出所关系都拉通了,这是后话了。当然我后面也辞职了。我不辞职老板也不会留我了,因为明眼人都看得出来我又多摆烂,老板来了我都照样坐地上听歌。当然我也不是故意摆烂,谁会跟钱过不去呢?又害人又赚不到钱的工作谁愿意干?这些来开网约车的大哥大姐大多数都是家里没啥钱的,年纪大找不到的,还有刚从🏦里出来的。 正义感爆棚的我也是不负众望一个人都没招到,后面这段时间基本上就是拿工资摆烂了,主打一个顺其自然😁。 那老板也不是啥好鸟,脖子上挂一条大金链子,黑短袖、紧身裤、洞洞鞋、一撮蓝卷毛的一个肥仔,说话嗓子扯得老大,不知道的还以为他搞黑社会呢。听说10几年前和一帮人搞高利贷,黑了不少钱,后面社会制度完善了,不少人因为暴力催债进去了,就没搞这行了。反正挺黑暗的,我自己都想报警了,但很可惜他们并没违法,报警也没用;也是受不了这帮人,最后选择直接摆烂。 剩下一个月时间我就在家学技术摆烂了。 ## 重回校园 看着新熟悉又陌生的校园,不错的校园环境,那一刻真的感觉自己很幸运,不用再受社会的压榨和别人的冷眼,我还是那个清澈愚蠢的大学生。 本来计划是白天上课摸鱼做项目,晚上休息摆烂,新的开始默默猥琐发育,没想到这学校课程这么多一星期十几节课,而且上课签到还要收手机,还有老师不定时查课,🐟都不好摸。所以这学期只做了聚合搜索项目和面试刷题项目。学了一下前端,自以为可以开始做项目了,结果拿到网上的前端项目模板还是看不懂,真不知道各位大佬的前端是怎么学会的😔。后期想着背面试题学算法,学着学着又没动力了,效率贼低加上害怕期末挂科疯狂复习,后期基本时间都没怎么利用好。 ## 寒假开始 学校放假还是挺早的,想着暑假实习的时候增加一点面试亮点,在网上找了一个秒杀商城项目。因为nacos和springcloud、springboot版本不匹配的原因,各种依赖版本的匹配,数据库表的建立,服务的配置,初始化导入项目就用了我4天时间,完成项目用了一个月,但还存在一些瑕疵:因为RocketMq安装失败,只能用rabbitmq代替,自己改造业务,出现了不少问题,当然也收获不少。这个过程中也认识到了自己的一些缺陷,基础不牢固,思路不清晰,代码不熟练。我从这里才真正开始准备实习,今天从星球里面看了一些鱼友的面经才找到一点启发,重燃学习八股的热情🔥,希望能一直保持吧。看着和自己差不多年级的鱼友上岸真的压力山大😰 ## 备战实习 再过一个多星期,我也要开学了,这段时间,我打算停止做项目,专心准备八股文和算法,多了解求职的信息,希望能拿到一个满意的暑假实习offer。与各位大佬在各大公司平台嘎嘎乱杀! ## 我的感受 这一年我,从一个备战升学的大学生到一个求职者,经历领导PUA、裁员、租房看到了不少社会现实。 1. 不为自己发声,没人会在乎你 2. 远离有暴力倾向和人品不行的人 3. 望文问切,多听多看多问多思考,弥补知识盲区 4. 老一辈的建议大多不靠谱,“不听老人言吃亏在眼前”放现在已经不适用了 5. 远离诱惑,拒绝内耗 经历了这段打工求职之路,我才真不后悔当初选的这条路,如果当初没选这条路,就算成功升本,也只能是一个平平无奇、毫无追求、毫无热情的普通大学生吧!现实真的对底层劳动人民太不友好了,但我们也改变不了什么,只有不停地往上爬。 两年前我还是一个刚入门的菜鸟,时间过得真快啊!虽然我也经常内耗,喜欢摆烂,但编程这条路我从未想过要放弃,也许是热爱,相信这也是不少朋友坚持的原因吧。希望2025年,我能完成第一个小目标——拿到一个满意的offer,给我爸60岁大寿发一个大大的红包! 以史为鉴,可证己道途!2025年的我也许更值得期待·········

2024 年度总结

2024 是尽显迷茫的一年,写这篇年度总结便当作好好梳理和反思一下 2024 了。 年初专升本考完,我觉得没有太大的意外应该是能考上的,结果也确实如此。但可能是应试考试带来的后遗症,考完后到开学的小半年时间我并没有怎么学习,基本上是都在玩。 期间和朋友合作了一个项目,因为种种原因并没有掀起多大的风浪——更多原因还是在于我没有什么动力,一拖再拖。 关于专升本是有一个小波澜的,因为我大专考了 3 次都没考过 PhotoShop 证书( 学校自己组织的证书考试。我第一次被强迫去考,后两次报名了没去 ),但是后面学校通知说不考过不给毕业证书影响专升本,我就用 ps p 了一张 ps 证书 😂。 很好笑吧,更好笑的是还被上面发现了,辅导员说这件事可大可小,大的话就要处分了,虽然最后还是成功在本科开学当天拿到毕业证,但其中还是有些许压力的,导致我在那段时期没法安心做其他事情。 > 关于 ps,我和它真的算是上有某种 " 不解之缘 ",这里先按下不表。 到了本科开学的时候,我想着终于可以好好学习了,事实上也确实如此——开学后那一个月就把项目上线了。但是,我被舍友影响了,我一直以为自己是一个意志力还算坚定的人,其实是十分不堪一击的。 在开学前我就决定不考研了( 要考也是顶多学几个月考本校 ),但是看到舍友们都在卷考研,我动摇了,所幸后来及时收手,只是花费了的时间有点可惜。 环境的影响感觉对于我的冲击力还是挺大的,其实更多的是我 " 道心不稳 "——知道正确解法却还是不能很好地做对题目,具体来说体现在期末考试——我实在不明白这些无用且无聊的东西他们为什么要这么早准备。 " 简单的问题复杂化,复杂的问题妖魔化 "——这是我 24 年经常挂在嘴边的话,但到头来自己也掉进去了这个陷阱 😰。 我人生挂的第一个科——依旧是 ps,倒不是说是我没好好准备,事实上我对于这门课花费的时间是最多的,因为它是要求做一个项目,但很不巧的事情是我被老师针对了。 原因也很简单——我在课上学考研内容,且屡教不改。试想一下一个一周 4 节课 3 小时的水课我做点我认为有意义的事情没问题吧。无奈老师过于 " 负责 ",只能自认倒霉了。 综上,是时候该总结教训了,其实也就是围绕一句话的事情——**搞清自己到底想要什么**。 对于 25 年就定 2 个小目标: - 自己做的项目用户量达到 5000 - 暑假找个实习( 学校放人的话 )

2024年度总结

## 年度回顾 时间如落花流水 一去不回。今年是我写年度总结的第四年,每年都有一个核心主题: - 第一年:迷茫,人生初起步,无人识我。 - 第二年:确定职业方向,寻找岗位对应专业所需实际技能,试错摸索,多次重头学起。 - 第三年:精细规划职业道路,细化毕业一年目标,锚定三年成长路线,眺望五年志向。 - 第四年:人生路线规划三组成,也是本次主题核心。 职业的发展是有所局限的,受限于职业本身,束缚自己的思想。体现于对本身职业之外知识的排斥,且AI的兴盛注定难以存在始终不被淘汰的具体工种。对此当对应主干线职业技术学到对应层次时,及时止步,回头补充自身底蕴。底蕴决定一个人未来的上限,难以补充,难以触摸,略显抽象,但这是必要的道路。 底蕴是什么?是逻辑分析思维、信息检索捕获(对细节信息等掌握度)、认知经验、情绪察觉共鸣、深度思考、良好习惯、抗压等底层能力。底蕴通常在良好家庭中,父母有意识的进行培养,能够在之后赶超诸多同龄人,但作为普通人,在学校期间依然有机会自我补充。古人曾说过:急中生智,静中生慧。慧指慧根,也包含一个人的底蕴。在学校是最容易掌握静心能力的时刻,这是巨幅提升综合能力前置条件,用比较流行的话表达,则为耐得住寂寞,享受得起孤独,这些内容的本质是相通的。 ## 2025思考规划 人生路线三组成:`象牙塔,社会,理想`。 一层跃进一层,象牙塔指学校,此阶段阅历较少,主要集中掌握一个核心能力:强大的自主学习能力,对任何所需技能 能够以最快速度掌握,可以结合各种科学的方法论最终集成自己的一套实践体系。具体学习内容的重要性远低于该核心能力。 具体学习的内容是薪柴,注定要燃烧殆尽,遗忘是必然的归属,从中结合实践得以验证,归于自身的知识是真金。其余此刻不属于自身的,该果断舍弃,因为还有更重要的事情去做。 对文字的理解能力是自主学习能力的细分领域,或者说很多的底层能力都为自主学习的细分方向。而自主学习是并集,作为人生第一阶段最重要的终极要素。当踏入社会还未掌握时,难度随时间指数性递增。 人生规划第二阶段:社会。带着第一阶段的自主学习能力和大量理论,开始大量实践,磨砺自身。用对应规划能力对社会不足处进行弥补,做出贡献。获取社会进而反馈而来的名望,利益,积攒原始资金。经济独立,开始真正自立,摆脱原生家庭最后一层附着影响,家里的重大决策真正意义上拥有资格去操作。 在资金达到一定程度后,开始进行投资规划,获取稳定的投资收益。此阶段,需要尽可能的攒钱攒家底,当不断积攒的资金所产生投资收益能够填补日常开销时(值得投资和认识的朋友会是最丰厚的一笔),对自己说退休,什么时候完成什么时候退休,30岁完成目标就30岁退休,人生进入阶段三。 人生规划阶段三:理想。带着阶段一的底蕴能力和阶段二的资金,去做内心渴望的事情吧!这么多年下来,这么多的思考,前路注定清晰也注定坎坷,向着自身的理想前进。 总结中的人生规划三组成是极度简化的产品,真实规划是严谨且繁杂的,需要面临各种问题,但好在第一阶段的终极能力和众多底蕴,我已经摸到了,接下来紧紧抓住就能顺利完成。 ### 写书 2024年中,和coderwhy老师进行合作,出版人生第一本JS高级技术书,在这里既感谢coderwhy老师给的机会,也感谢张爽编辑负责的指导修正,让我书写措辞更为严谨,内容更为规范,对文字的把握水准更上一层。经过格式修订,文字精简,图片美化等阶段的不断修改,书籍终于即将迎来定稿。这段漫长的时间里,对每一句话的逐字斟酌,对四百多张图画的全部重绘,都在磨练着我。 在这里其实还蛮对不起张爽编辑的,最终还是拖稿了,以我的速度,是绝对不应该产生此问题的。但由于学业的繁忙,以及到家需要干体力活,被迫将完整的时间拆得支离破碎,写作速度因此不太理想,这点需要反思。 家庭的集体性体力劳动是必须的,这能够极大减少家庭矛盾。但亦存在诸多磨合问题,很多是由于低认知产生的,父母对于我明确指出的隐患问题依旧会固执踩下去,用自己的狼狈去印证我的想法。这种行为是一种傲慢与偏见,后果也理应承担。 这种现象源于上一代人的心理多多少少存在问题,例如我的家庭长辈喜欢吃苦,当有人跟她们说:“你这辈子怎么这么苦”时,能立刻触发她们的共鸣,一边唉声叹气,一边内心暗暗窃喜,反之亦然。我曾尝试过通过复盘,讲问题细化拆分辅助父母进行优化,但阻力比想象中更大,这对他们造成极大的痛苦,因为一旦意识到问题在自己身上,就是一次否定自身价值,这种精神上的压力对于他们来说太大,无法承受,宁可体力上多承担一点负担,那么生活在虚幻的价值里也不失一种办法。 计算机操作系统中对死锁的操作就有一种节省性能的方式:直接忽略死锁问题。这种场景何尝不相似?沉睡在虚假的摇篮中,这样的晚年何尝不是一种幸福,多一份宽容,多一份和谐相融。各种致命心理漏洞弱点过于明显,此处不表述。缺点是可以修改的,改不动的称为弱点。每个人都有弱点,或多或少的问题,要保护好弱点,对外社交构建对应人设,以防被针对。 所有计划最终能否生效实行,与计划的完美程度无关,与人有极其紧密的联系。雷军的投资理念正是如此,只投资认可的熟人,最多投资熟人认可的熟人。我的计划难度,会随着每年自身能力的提升而不断提升,无时无刻都在进行微小调整,始终适合自己,适合最重要。 目前的规划,有两个非常重要的前提:足够了解自己,足够了解目标。只有对起点和终点清晰了解,才能对中间路程有充足把握,清晰认知到自身还有多少时间,从而决定什么时候歇一歇,什么时候抓紧冲刺,因此人生路线也可以清晰预知。例如通过阅读纳瓦尔宝典,我足够了解自身的欲望水准以及预判增长速度,知道如何获得长久的幸福,因此可以直接对欲望增长速度进行预留空间,以保持投资收益能够覆盖的情况下再进行退休。 纳尔瓦宝典中对于幸福的理解是平和的,这与我想法不谋而合,因为平和意味着长久维持,这和Jack叔叔的`快乐痛苦对冲理论`有角度上的契合,所有的快乐与痛苦都是相对的,当过于痛苦需要用极致的快乐来缓冲,当过度的快乐之后容易陷入难以自拔的空虚,这是猛药,只适合特定环境下使用,更多情况更应该平和稳定,一丝丝的甜过现在,回忆会让这份甜变得更醇厚,幸福恒定幸福。 ### 建议 有效的建议也是基于这两点:足够了解自己,足够了解目标。因此绝大多数建议,不选择认真倾听,因为会消耗自己宝贵的精力,维持表面的礼貌即可。 我想成为什么样的人,就倾听那类人的建议(真实建议),因为他们就站在我们目标上,满足其中的一个建议要素,建议值得去听。但依旧需要辩证的去思考,因为他的所有建议都是基于他自身条件与能力去设置的,他有能力完成的,我们自身未必有。 第二种建议是自己给自己建议,自己足够了解自己,那么无时无刻都在审视和微调,那么效果比第一种更好。但一个人如果足够了解自己,那么距离了解自己想要的目标也不遥远,因此这为过渡阶段。 最好的也是最值得倾听的建议:驻立在目标上的那人是依靠实力上去的,根基很牢,对目标足够透彻,且对我们足够熟悉,熟悉到能够看穿我们的真实水平,将所有不稳定与未知情况消除,则此时给出的建议,将会足够的清晰且宝贵,按部就班去执行就能抵达上岸。 建议含金量:目标对象建议我们<我们自己建议自己<看穿自己的目标对象建议我们。 在以往,最高水平的建议是可遇不可求的,但现在AI可以充当此角色,前提是足够了解自身。先构建一个自己的知识库,蕴含自身所有思考,让AI以该标准进行建议,此建议足够具备含金量,非"通用性建议"。 最差建议案例分析:基本没上过学的长辈推荐读研究生/博士生。此无效建议在于目标对象不了解目标,会进行一定程度美化,且不足够了解我们(大概率事件),直接过滤即可。有价值的建议需要倾听在读研究生的真实想法以及自己到底需要什么进行比对。 以对"建议"二字的建议来看,生活中的大多数建议都可以不倾听,绝大多数需要自己独立思考,辩证判断。目标距离自身较为遥远,则目标对象极低概率存在当前环境,因此当前环境的建议可以直接选择全盘不听。这是网络上:"不要听任何人建议"的分析判断。 ## 对AI的理解 `了解自己`和`了解目标`这两点非常重要,也是我没对AI焦虑的部分原因。有很多人并不了解自己,也不了解自己到底需要什么,表述模糊,这种情况下,AI无法给出准确有效建议,这是绝大多数人的情况。 目前最新的DeepSeek,我很喜欢用,我喜欢看他的推理过程,充满了辩证性思维,以及多角度的深度思考,对自身提升很大,配合我的各种复盘,也能给出中肯的建议,更是一种鼓励。相对于以前的纯输出AI,更具备价值。AI在未来是一定会抹平大量的教育资源差异,但会用的,一段时间内,始终只占少数。很多人认为比的是看谁更会提问,其实这只是表面。真实比的是看谁对自己的能力水准判断更精准,对目标所需要求具体高度足够清晰,而如果具备此能力,答案也能自己找到,AI的回答只是加速便利的该过程。 而且提问也只是改变的一部分,不行动的话,纯理论不具备较高价值,AI总结再好也无用。不具备足够的学习能力和实践力,只能驻足原地,你和AI给出的内容无法产生更深的共鸣和认知。且存在以下几个客观原因,因此能改变自己命运的依旧是少数: 1. 行动力、自驱力不足,想法和行动相冲突,折磨自己。优秀的是AI,不是自己,始终有别。 2. 人是环境的产物,会受到环境极大影响。AI本身并不能带你脱离环境。 3. 不知道怎么真正认识自己,不清楚自己的源动力。 4. 只选择自己爱看的,逃避改变自己的痛苦。AI会很自觉的配合你,讲你爱听的。 5. 底蕴差,支撑不起改变,人就垮了… ## 书籍阅读 因此需要多看有价值的书,书籍大多成体系且客观,能极大的磨砺自身,但依旧需要具备前置条件:静心,推荐冥想恢复精力,收束思维。 我看的书主要有以下种类:历史、认知、人物传记、心理学、经济学、法律、计算机、佛经、医学、英语、摄影,健康养生、科学、哲学,术数。今年主攻心理学,用以研究自己的情绪以及心理,从而对自身有更深刻的把握。间接的能够清晰感受到他人想法,并针对性的分析复盘。心理学的核心是真诚待人,所有的手段都只是辅助,但就这一点,做到的寥寥无几。多数人沟通都相对傲慢,话语较冲,对自身情绪的控制失衡,不够稳定。主要依据来自对上百个微信群的观察,评价较为主观,只适合参考。 推荐心理学读物(部分看完,部分正在看): 《思考 快与慢》,《设计心理学》,《幸福的婚姻》,《实现自我·神经症与人的成长》,《变态心理实录:资深心理咨询师24则心理治愈手记》,《态度改变与社会影响》,《亲密关系》,《改变心理学的40项研究》,《福格行为模型》,《蛤蟆先生去看心理医生》,《性格心理学》,《先学会爱自己 再遇见对的你》,《我很幸福:奥斯威辛幸存者…》,《拖延心理学》,《社会心理学第11版》(奠定我基础的成体系读物),《幽微的人性》,《非暴力沟通的父母语言》,《心理学与生活》,《傲慢与偏见》,《人性的弱点》。 书架实际心理学相关书籍为以上数量x2,结合实际分析复盘,效果更为迅速。其他类型书籍在2024下半年非侧重点,不进行表述,但哪怕只看了一两本经典的帮助都很大(有深度思考的情况下)。 计算机类型的书籍阅读量较大,核心为408(操作系统、计算机网络、组成原理、数据结构),以及各种程序思维类型书籍,为写书做出更充足的铺垫。 推荐人物传记:《李光耀观天下》,《邓小平时代》,《毛泽东选集》…等,像毛选以及实践论 推荐放后面一点再进行阅读,它们更适合人生规划阶段二的时刻。 摄影的书籍只看两本,对自身的日常摄影技术有较强进步。历史书籍过于厚重,过于消耗时间,不主加入2025规划中。健康养生值得关注,这是长期的收益。英语是工具,科学哲学是思想。术数是古代对某些规律的高精度总结,需要辩证看待,取其精华,去其糟粕。 经济类型的书需要等到2025下半年再进行高密度阅读,所有书籍的阅读本身不是为了炫耀看多少书,该做法无实义,相关书籍只作为薪柴用于燃烧触发思考,产生属于自己的真金。 书籍是更适合我的方式,但同时当前时代,各种信息来源丰富。涵义丰富的电影(例:豆瓣TOP100),精美的专业视频(影视飓风等),直播(Jack要加油、童年终结者、大冰老师)都很不错,但同样需要自身有足够的逻辑思维去解析,才能更快进步。 ## 2025年展望 人生轨迹发生可控良性改变,需要足够底蕴。底蕴能用来扭转命运,这是可以改变的。这与专业技能这种需要体现在`特定场景下突出`不同,底蕴是无时无刻在发生影响,积攒足够,在关键时刻能够看穿知见障,命运就会发生大幅改变。前人总结出通用性的命运节点有:出生、高考、结婚。出生无法决定,高考前绝大多数人缺乏真正认知,结婚是能够插手的最主要节点。 多数人是迷茫的,在可控的关键节点没有做出发自内心的选择,因而要付出更多代价,但这是可以弥补的,只是更累,注定要选择舍弃一些内容才能追赶上来。新的一年也愿大家能够弥补自己的遗憾。 按影响大小排布:出生>结婚>高考。 哪怕高考失利也可以读书,底层能力也能培养,只是环境不足。但结婚是更深层的绑定,金钱利益是其次,重点在于婚姻双方会长期相处,思想无时无刻都在触及,同时影响三代人,后悔分离代价较大。 不可控的节点有:贵人、时代风口、奇遇等... 对自身的2024具体事例总结为无,因为具体值得思考的案例事件都已复盘且AI分析后,收录知识库中,有明确目录,无需重复工作。2025年展望只有几句话,因为该有的计划都已规划好: 1. 多阅读书籍,然后输出内容。 2. 多观察生活中的细节,去锻炼心理学能力,多复盘总结,结合AI深度思考。 3. 寻找更多有独立深度思考的沟通对象进行思想上的碰撞,更好结合实践进行验证(即多实践)。 4. 锻炼口才,希望在课余,能够和coderwhy老师有更深的合作,去产出更优质的内容,扩展自己良性影响力。 5. 对底层能力(又称可迁移、跨学科、才干、底蕴能力)有更深的探索,弥补之前的不足,摆脱家庭附着的负面影响。 对自己说的话:情绪埋在内心,理性的思维不意味不关心生活,也不意味不会表达感情。将情感埋在心里沉淀,将负面情绪排解出去,将可改变的改变,不可改变的留待将来有能力。

2024 年度总结:曲折但整体向上的一年

🌆摘要 ==== 大家好,我是小答,时间过得很快,已经过去一年了,今年也开始实习和整秋招相关的,上次写实习还是在一年前,当时还是在大三的时候,当时说想要一直追求⌨️ coding 之路,还定下十年之约,当时还以为很远,没想到已经过去一年了,我记得当时给自己定下的目标就是找到一段中厂实习吧,没想到完成了两段,算是超过预期了,哈哈哈,接下来我就来小小说一下我这一年吧。 然后我这一年的总结主要分为几个部分吧,🚢实习和面试、⛅日常生活、🚀技术提升、👻疑问解答、✨目标展望,因为我答应了许多人说年度总结的时候问题一起回答,但是我怕我有的地方控制不住说得有点多了,所以先把目录画出来,需要的同学直接定位到相关的部分去看就好了。文章略长,勿喷😭!!!! 🚢实习和面试 ======= 🕐初始:实习准备 --------- 在去年春节回到家之后,其实在家里的鼓动,有过一阵子想要考研的想法,当时就纠结了很久,还询问了一下鱼皮哥给的意见,当时就是一直在动摇,没有做出决定,后面想了一下,还是决定选择继续找实习不考研了,然后就继续准备八股和算法,然后八股一开始准备的路线也正常就是 MySQL->Redis->JUC->JVM,然后计网和操作系统由于当时大三上的时候基本准备得差不多了,当时就是看一下,到学习差不多就开始面试了。这个时候我背的八股可能还是纯八股,不会结合项目和自己的经历去说,只能说还是太嫩了,不过差不多 4~5 月开始,我就已经知道自己的不足了,然后当时项目也非常简单,就是网关 + 12306 + 论坛项目。 🕝实习之路 ------ 然后当时基本就是准备差不多一个月就去面试了,当时面试的第一家公司是杭州的一个小公司,只能说是一家初创公司吧,当时基本没有怎么经验,就是纯面试,然后基本就是面试了基本十几分钟,然后就是问一些常规的八股,我回忆,当时面试的内容也非常简单,就是简单的 MyBatis 缓存、SQL 注入、HTTP 三次握手、四次挥手,差不多就这些了,我记得当时面试完过后,半个小时 HR 就打电话来通知已经通过了,然后我就先去问了一下我们班主任,当时的说法就是我们班主任说小厂的话可能学校不会同意让你出去,没有办法,那就只能尝试各种中大厂,当时主要是和条神交流多一点,当时条神教会了我很多东西,在这里先感谢一下条神,然后也给条神的 AI 智能图书馆项目([https://gitee.com/falle22222n-leaves/vue_-book-manage-system](https://gitee.com/falle22222n-leaves/vue_-book-manage-system))可以说课设、学习都是很不错的项目,适合小白入门学习进行实现,而且现在大模型也非常流行,这个项目整体来说算法非常不错的,感兴趣的小伙伴可以学习或者点个小 star ⭐,然后还是继续说我的实习寻找之路了。 在后面知道只有大厂实习才有机会的时候,我就开始尝试去冲大厂的暑期实习,可是发现投了一个星期没有效果,我开始思考是不是我的简历是不是不够了,后面想了一下,是否可以使用我自己大二之前写的项目,后面问了一下,就是可以,就是不要直接用项目的简介,换一下描述就好了,自此我的项目就变成了一个 CRM 和一个异步任务框架,然后任务描述基本用到了现在,这里我找到当时的项目描述。 ![](https://pic.code-nav.cn/post_picture/1627889630378479618/P5pyeZvsXe6BrFw1.webp) 后面的话我两个项目,一个字节青训营的电商项目,还有一个 CRM 项目平分这个项目的亮点💡,基本上够用了。 然后换成这个之后,当时是面试就多了起来,直到后面暑假去实习我用的项目都是这个,秋招前期用的也是这个,后面去了现在的公司日常实习才换,当时面字节的时候冷热分离,还有链路追踪基本这两个问到就稳了,冷热分离可以扯 LSM 树、RocksDB、HBase 这三个都可以扯,然后后面实习的时候完成了一个日志数据的优化,那个主要是 MongoDB 数据的优化,到秋招后期面试的时候,日志数据优化的三个方案 CK、HBase + ES + 冷热分离、MongoDB 的优化就都有了,基本只要问到冷热分离,这场面试基本就稳了。 然后当时 5 月还是 6 月的时候,Boss 上面美团测开的时候给了一个机会,当时面试也是通过了,但是可惜学校还是不放,后面我也就没有面试了,安心准备暑假找实习,然后在没有实习的期间,我选择了另外一个方式,就是尝试去整一些开源项目,这里我说的开源项目可以是一些开源社区的项目、开源之夏、自己开源的项目都是可以的,我主要做的是开源社区的项目,这个也是后面别人问的比较多的点,我后面一起在日常答疑那块一起解答。 然后就是等到学校期末考试,学习期末考试之后开始投实习,当时优先投的是深圳的,但是深圳很多岗位都是测试和运维,就连测开都没有,还有一个公司当时甚至直接 KPI 面试,他当时是先发了一套笔试题,然后笔试完成之后就面试了 5 分钟,然后就没有下文了😡,甚至后面这个公司挂了实习生岗位挂了快两个多月才取消,我就知道这是故意的了,然后继续投了接近一个星期,没有下文之后,我就开始投上海、杭州和北京的公司,然后当时很幸运,给我实习公司的 leader 一下子就选中,原本公司是卡 211 甚至最低只要一本的,当时收到面试通知的时候我也是懵的,没想到我 leader 给了机会,后面面试也非常顺利,直接就是问了一点实习的东西还有项目的东西就给过了,没有什么为难的点,这个也是我从春招面试到暑期最容易得一场实习。 之后就是一边实习,一边准备秋招了,不得不说,一边实习一边秋招是真得累,算法、八股、简历这些都得整,只能说完全忙不过来,还有到后面还得整学习毕设,所以可以上岸还是建议早点上岸,不然到后面真得忙死,然后实习主要语言就是 Go 后端,然后 Python、C++、前端都写,这里还是得感谢一下鱼皮哥星球的项目,我是大一就已经跟着鱼皮哥做星球前后端一起的项目了,所以虽然前端一些底层原理可能不是很熟悉,但是组件封装、前后端联调这些基本我都可以整,所以基本第二天就开始干活了,这里实习还是比较轻松的,请假什么的都比较方便,基本都是我下午需要请假,中午吃完饭再申请都没事,我现在实习的这个公司基本都要提前一天去请,而且提前结束也不能。 然后后续就是实习到差不多 10 月份的时候,知道公司没有转正,就开始寻找其他公司的转正实习了,然后后面面了许多公司,就发现今年的公司有一个奇怪的点,就是很多公司都要求提前实习和转正实习,当时面了许多小厂,基本都是要求转正实习,甚至我现在这个实习的公司也是转正实习(后面来了后知道没有机会,给 HR 骗了😭o(╥﹏╥)o),为此我错过了我的 Airpoir 套装啊,当时差点哭死。 不过后面来到我现在实习的公司,是一家物流方面的公司,不过来到这边之后就经常很忙了,当时主要是听了 HR 的实习转正,在这里切记要问一下 HR,**是否是转正实习,有无转正 HC**,但是 HR 大概率不会告诉你,就记得一定要有保底,不要完全相信 HR 说的话,因为把你招进去,其实就算她们的绩效!!! 📺面试 review ----------- 说完实习的过程之后,我简单说一下面试,我春招暑期实习的时候,有面试的不过,主要就腾讯日常,那个一个资产部门的,当时忘记问了,然后就是度小满、美团日常测开,其他都是一些不知名的小厂,春招整体来说并不顺利,只能说前期的准备就不是很好,因为当时还错过了腾讯暑期基地的招聘(那个不卡学历,感兴趣的同学可以冲一下,因为腾讯这两年校招的 HC 并不是很多,主要还是给转正实习的多一些)。 然后主要就是暑假的时候面试,暑假的时候深圳投了很多都没有消息,也让我对深圳有点祛魅了,在深圳一直投一直没有消息,投到后面我也放弃了,就去投了一下上海、杭州的,然后主要就中了两个,一个是 Open AI 旗下产品的子公司,好像是干求职 AI 模型的,另外一个就是上海一个不知名的游戏厂,当时的话我是选择去了那个游戏厂,主要有一定规模了,秋招 title 会大一点,然后这个时候其实我分享一个选择的吧,就是实习的话主要还是看公司 title,因为实习生可以干的事情基本大差不差,有亮点💡的活基本都要自己抢着去做,我实习的时候基本就是可以做的事情,我都会努力做吧。 然后秋招的话面试其实不是很多,就面了几个字节、商汤、月之暗面、联想测开、快手游戏,微软日常实习(二面英语没提前准备,这个有点难受)、希音(Boss 捞),然后基本其他面试都是小的,基本都是转正实习的那种,有一个正式的秋招的 offer,然后一开始拒绝的时候她薪资涨了一点,好像数马是可以 A 的,但是不知道为什么那个网上说不让 A,不过要提前实习的时间确实没办法改,这个和我期末考试和毕业论文开题答辩的时间有点冲突,我就没有去了,后面听别人说那个是数码的 SSP,笑死,应了当时让二哥看简历那个 SSP 的话了 🤣 <img src="https://pic.code-nav.cn/post_picture/1627889630378479618/mydJUOzCaQyKUtnN.webp" alt="" width="100%" /> 然后字节就一言难尽了,除了第一次是硬实力确实不够,不过那次给我之后的收获挺大的,自那之后我基本面试只要不是算法 A 不出来,基本都可以应付,月之暗面当时面了三次流程,第三次流程一面当时给我整道树形 DP,当时快一个月没刷算法了,直接 GG,当时第一眼就看出是树形 DP 了,暴力写出来了,但是面试官要求要 DP,我 DP 公式当时知道推不出来就没了。然后字节除了第一次是自身原因,之后面试有一次是到 Offer 审批没通过,然后另外一个调剂到一个卡学历的部门,然后换到抖音电商,然后面了一次之后,就卡流程,也没给你释放,还是等到我后面去脉脉上面投才知道流程卡了,所以我春招选择直接放弃字节核心部门了,就选择一些边缘的部门看一下情况了😭,不然再卡流程,命都不够面的。 快手游戏和联想测开都一样,都是技术面面完,然后 HR 面正常流程,不过联想 HR 有谈薪,联想主要是 offer 审批下不来(八成是学历了),快手游戏是面完直接就挂在那里,不挂你,也不管你,最后直接没了。商汤这个是因为部门整个裁了,然后就一直在池子,希音主要是学历排序挂,当时在牛客上遇到一个面试同个部门的兄弟,然后 HR 说只有一个 HC,那哥们 QS 50,好家伙,也就没了。 总得来说,秋招只能说磕磕绊绊,一直碰壁吧,不过春节的时候,一发入魂免费中了一个传说皮肤,我朋友说拿秋招运气换的,当时其实想说我不要,我想上岸😂,不过希望春招可以顺利吧,秋招真得一直碰壁 ⛅日常生活 ===== 然后在上面基本就说完实习的寻找过程了,然后主要说一下一边实习一边秋招吧,只能说一边实习,一边准备面试还是挺累的,如果公司有会议室,然后可以请假一会还好,但是如果不能请假,基本就只能请假一天或者半天了。 日常实习的话一般就是早上提前半小时到公司,然后先看看公司文档,这里和一些实习的小伙伴说一下,就是公司如果有📃文档沉淀一定要用笔记记下来,我现在实习的组,沉淀全在注释里,那个没办法,不过我上海实习的那家游戏公司是有对应的文档分组的,然后好的一些文档,比如最佳实践、期刊之类是由 + 💰 的,就一定要收藏或者自己记录下来📓,如果有朋友去大厂的话,记得疯狂收集,这个你之后如果跳槽写简历,发现没有产出的话,你就可以整合一下包到你的简历里面,这个我之前刚刚开始的时候没有注意,直到后面离开了才发现,不过在记录到你的文档的时候,如果要分享的话,记得脱敏一些敏感信息,或者就是直接不分享,自己记在笔记里。 然后周末的话,我基本是属于夜猫子 + 宅家类型,就是如果没人叫我出去的话,就是在家里研究八股或者敲点代码玩玩,可以发现基本这一年下来,我学习的项目比我前面三年学习的还有多,这个我在下面单独总结一下,今年学的项目有点多,这里就不过多赘述了。 🚀技术提升与项目积累 =========== 这一年整的技术积累主要体现在项目上,有点多,我按照时间线,然后还有我目前在做的项目一起说一下: * **神领物流**(小程序端 + 鸿蒙端 + 后端):这个主要是我当时为了学习鸿蒙的语法,然后去考一个开发者证书顺便学习的项目,我主要把鸿蒙端和后端的代码完整过了一遍,代码的话我是基本按照章节的方式去整,就我其实不太喜欢一遍敲代码,一边看视频,我喜欢就是将对应的需求记录下来,然后再一个章节去敲,然后遇到不会的东西,再去看视频,这样的印象会比较深刻一点,然后神领物流的调度算法那块还是有点难度的,不过吃透之后确实还可以,然后其他的就是一些简单的 CRUD 了,没有那么难 * **Blossom 网关 + 小傅哥网关**:这两个网关我是一起学的,不过这两个网关的性质不太相同,Blossom 主要是流量网关,小傅哥的主要是 API 网关,这两个的方向不太相同,流量网关偏向于流量调用,比如说鉴权,灰度、限流、负载均衡,主要作用是为了保护服务,然后 API 网关的话,主要偏向于服务调用相关的,一般这种会有对应的业务,所以在企业里面也有对应的业务网关,像我之前待的那个游戏公司,不同的游戏服务就有不同的业务网关,比如说登录有专门的 API 网关,然后内部服务比如说充值有其他的一些网关,这个主要看服务的差异来进行决定 * **小傅哥抽奖(主要看抽奖算法部分):**这个主要我之前实习的公司有对应的抽奖算法,我发现他的抽奖算法还没有小傅哥那个抽象设计的好,我就想着直接套小傅哥的抽奖算法了,在这里就是简单说一个点,就是你在星球学习的项目,其实从一定程度上来说是可以和你的实习经历结合起来的,像我之前做的一个前端需求,其用到一个配置文件配置,类似 Nacos 那样的配置文件读取,我就是利用率鱼皮哥 OJ 前端的代码块实现的,这里我下面在疑问解答那里会专门说一下,就是如何把实习经历和项目经历结合起来,这个可以说是一门学问。 * **小傅哥组件**:分库分表路由组件 + 支付组件:**这两个是当时写学习课程设计代码的时候用到的,就顺便学习了一下,感觉这两个组件还是挺 OK 的,特别是小傅哥的分库分表路由组件,基于 HashMap 算法 + Mybatis 拦截器 + ThreadLocal,不过后面 ThreadLocal 我想到了没办法解决父子线程传递的问题,我换成了阿里云的 TTL(Mark 住了,八股 + 1,简历亮点💡 + 1) * **面试鸭**(主要在动态黑白名单、JD-HotKey 实现高性能缓存):从这里开始我开始学习一些项目,我就很少会去看对应的视频教程了,我一般喜欢直接上手去看代码,然后自己去实现类似的逻辑,然后看看可以往实习经历上去靠可以不,就是我项目从秋招开始一直没换过,基本上有新项目,我就是结合对应的项目经历加上我做的业务,然后往简历上去靠。 * **SingleFlight 缓存击穿组件**:这个主要是我在做一个表单填写的需求做的,当时要开放预约报名,然后我负责解决缓存击穿的问题,然后我就基于 Go 原生的 SingleFLight + Redis 分布式缓存实现了缓存击穿组件改造。 * **TairZset 封装**:这个主要是阿里云整的,也是实习的需求,阿里云魔改的 Redis 中 zset 支持多维度排行榜的实现,但是其他的 Redis 是不支持的,然后我当时有一个需求,要实习一个多维度的排行榜,但是阿里云 Redis 太贵了,所以我们就基于原生的 Redis 哈希结构 + Zset 的结构实现一个多维度的排行榜,然后结合 ES 的一个算法就可以实现亿级时间精度的搜索计算,然后再时候时间轮 + 哈希桶的方式实现 Redis 排行榜大 Key 的解决。 * **Redis Hot Key-Golang 版本简易实现**:这个主要是为了解决 JD-Hot Key Golang 版本没有的问题,当时是为了字节青训营的项目,为了实现一个类似 hotkey 的统计组件,结合面试鸭的动态黑白名单实现简单的 IP 以及流量风控,还有实现高性能的动态换成,当时就去解析 Redis 对应的 AOP 日志,统计对应 key 的出现频率,最后实现对应的热 Key 统计,然后为了实现规则配置化,这里使用的配置中心是 Nacos,然后读取对应的热 Key 配置统计规则实现热 Key 统计 * **冰河 RPC(SPI 扩展 Java 动态代理):**这个主要是实习的需求,要实现一个对应的 RPC 动态代理扩展,然后之前看 RPC 的时候有看到过,这里推荐一下冰河的 RPC,整体来说 100 多章还是不错的,不过要看之前建议先看一下 yupi 哥的 RPC ,鱼皮哥的适合入门,你要深入研究可以看一下冰河的,冰河哥的 RPC 生产可用这个绝对不是吹的,我毕业设计也是实现这个,看完可以学到很多东西。 * **马哥短链接系统:** 这个主要是为了帮一个同学改简历的时候看的,主要核心在于短链接的生成算法,谷歌的 mumuHash,然后短链接监控,短链接管理,异步处理等等,整体来说马哥的短链接系统还是 OK 的,感兴趣的同学直接去看就可以了,整体来说较充分了。 * **12306(主要在于 12306 的秒杀库存扣减 + 基因法)**:这个主要当时在做字节青训营项目的时候,12306 是我接触的比较简单的秒杀场景的项目,当时主要借鉴 12306,然后来实现抖音电商的库存扣减,还有一个分库分表实现多维度查询,主要是雪花算法+主键冗余(简历亮点💡 + 1,这个可以自己去实现一下) * **冰河秒杀(主要看秒杀风控):** 这里主要我在过年前接了一个风控组件开发的需求,所以在学习一些风控相关的东西,主要是流控 + 规则(责任链 + 规则树),这个主要是我结合之前 Blossom 网关想到的,然后风控一般 QPS、TPS、RT 这些要求比较高,所以一般会采用单元化部署,我的想法就是基于大数据组件,开发一个流式风控引擎,然后涉及到冷热分离,我的想法是 HBase,然后日志的话计划用 CK 实现,因为我目前已经有了 MongoDB、ES 两套日志的优化经验了,加上 CK 的话基本就三套方案了,然后如果春招前可以整出来,就直接做春招的简历项目。 然后以上就是这一年主要的项目,然后今天的技术提升主要是八股文,比如 Redis,今年在 4-6 月的时候简单看了一下 Redis 的源码,然后整理了一些对应的八股,然后技术栈的话冷热分离主要看了一下 HBase、RocksDB、Clickhouse、TIdb 这几个底层的数据结构 LSM 树,然后看的时候顺便看了一个 PgSQL 底层的 B-link 树,其和 B+ 树主要的区别在于其在插入方面加入了优化,即 patch 和 lock 方面有了一些优化,所以 PgSQL 的写入性能会更加好一点,但是 pgSQL 带来的代价就是其 MVCC 的实现会提高一点(当时在面试一些 Web 3 的公司,就简单学习用 Rust 实现链表,然后提升一点难度,简单实现一个简单版本的 MVCC),然后技术栈基本就这些。 线上问题排查由于我现在实习主要负责故障诊断引擎的开发,OOM、FullGC、数据倾斜这些比较常见,我感觉我现在实习积累的线上问题排查,至少够我社招三年内的面试了,所以基本问题不是很大,就是积累就可以了🤣。 还有一个就是从今年开始,我就开始养成了一个习惯,就是一天至少看一篇技术文章,比如说美团技术、哈啰技术、小红书技术、阿里技术、得物技术等等,这个主要看的就后端和大模型方向,B 站技术还有大数据方向,不过今年因为秋招的缘故,输出有点少了,命令可以加大一些输出,哈哈哈哈。 然后以上就是今年的技术积累,主要就是实习和写项目中整的比较多,这里主要就是我在上海实习的时候 + 1教我的,当时阿里云提供的服务是没有对应链路追踪实现的,然后我 +1 沟通了很久,阿里云那边的架构就是这个说很久之前就在考虑范围内了,但是没有做,当时我 +1 就一直吐槽阿里云,然后自己实现了一个服务的链路追踪,然后他当时还和我说了一句话,就是印象有点深刻,如果看一个人不爽,你最直接的方式不是抱怨,而是选择去干掉他,当时差点笑死,不过也是他教会了我很多东西,就如果你一些东西,依靠第三方服务的话,如果第三方服务很烂,在你可以解决的成本里面,你就可以去解决他,这个也是我现在的观念,如果一些代码问题没办法完成自己的需求,最直接的方式就是自己动手用代码去解决。 👻疑问解答 ====== 今年和许多的朋友交流,然后也帮许多朋友看了一下简历,就有遇到一些问题,我在这里一并解答一下吧,然后有其他问题可以评论区一起问。我看到会直接解答。 ### 1. 开源经历怎么整? 这个应该是很多看过我兄弟之后,问得最多的点,开源项目是在你没有实习的情况下,最加分的情况,一般分两种,自己开源和社区开源,自己开源的项目,像小红书的校园招聘,其非常看重 Github 的 star 数,不过有的同学说自己开源的项目点赞很少,其实也没有很大的关系,主要就是有开源的经历就可以了,然后这里推荐一下可以增加自己开源 star 的方式,一个方式是参加字节青训营的项目,然后去分享你的项目,或者字节青训营的项目直接去比赛,然后取得名次后去开源,这个是增加开源一个方式,或者发在编程导航或者 CSDN 一些平台,通过宣传来提高自己的 star 数目。 <img src="https://pic.code-nav.cn/post_picture/1627889630378479618/Sz8FlNbnOPVVPDVr.png" alt="" width="692px" /> 不过很多小伙伴比较感兴趣的应该还是开源社区的项目,这里简单说一下,大家可以去看一下 Dubbo、CloudWeGo、Apche、Dubbo-Go 一些社区,就去联系一下社区的 Comitee,问一下有哪些需求自己可以做的或者加入的,想要加入或者贡献,一般他们有对应的周会,你只要表达你的想法就可以了,这个方式是比较简单的,因为如果有人带的话,你可以更快地熟悉这个项目,然后 Cloudwego 社区还是比较友好的,因为是字节云旗下的一个社区,所以如果想冲字节的同学,可以优先看一下这个。 另外一个就是直接找一下社区 issues,然后自己去修改,然后改多了,然后你只要做了比较核心的需求,基本就可以简历上面写了。这个比较直接,我当时在写前端的时候,发现有一个组件不太 OK,然后有一些 Bug,就直接去提 issues 然后顺便完成了一个 feature,整体来说还是可以的。 ![](https://pic.code-nav.cn/post_picture/1627889630378479618/H5Tq332s75ILI1m4.webp) 最后一个方式是一些开源活动,比如谷歌的 GSoc、中国开源之夏,腾讯犀牛鸟开源计划等,然后谷歌的 GSoc 如果完成可以的话,甚至可以直接去谷歌实习,然后我列举的这些活动都是有报酬的,还有一些 AWS 开源活动还直接提供 AWS 的实习名额,然后我直接还看到一个双非的前端开源大佬 gronk 去微软实习,所以参与开源不仅可以简历加分,在你没有实习的时候,也是和面试官聊下去的关键,不过有实习的兄弟可以更多把精力放在实习上,或者想给自己简历增加亮点💡的时候可以去整。 ![](https://pic.code-nav.cn/post_picture/1627889630378479618/kQYnfzwOaEmYZVAq.webp) ### 2. 八股文怎么背? 这个应该是问得第二个比较多的问题,八股一开始我背的方式其实差不多,就是直接看,然后记录,不过自从字节第一次面试失败之后,我就开始琢磨一个点,要是面试官一直问我八股,我要是回答得中规中矩,那不就寄了,所以自那之后我背八股就开始结合我的项目,实习去整,比如说我上面说的阿里云 TTL 解决 ThreadLocal 父子线程传递问题,这个就是一个亮点💡,面试官问到 ThreadLocal,你可以说完 ThreadLocal 之后,继续说一下 TTL 的,但是有的面试官可能不喜欢你扩展,那么你就直接简单说一下就可以了,一笔带过,不要说面试官不喜欢还一直说,这种面试其实没有那么加分。 就八股的话可以你自己整理一个你的笔记,然后一直看一直整理,因为面试的本质就是你提前准备,你准备得越充分,面试通过的概率就越大,这个时候有个兄弟会说了,面试官喜欢问场景题,那怎么解决,那就要你的八股活学活用了,就背八股的时候最好带着自己的思考去背,不要为了背而背,因为面试的本质就是一场交流,在问到场景题的时候,你可以阐述你的观点,因为方案这东西不唯一,有好有坏,如果你的方案不可以,面试官会提出来,然后你顺着他的思路去优化你的方案,最终给出一个满意的答案就可以了。 ### 3. 项目烂大街怎么办? 这个应该是问的比较多的,因为很多同学都是在校的同学,很少有自己的项目,然后项目很多就是跟着 up 主做的,比如鱼皮、马哥、小傅哥等,所以简历上的写法基本都大差不差,为了避免烂大街,所以鱼皮哥在讲自己的项目的时候,其实有很多时候提出了扩展点,就去扩展,但是扩展点又有个问题,就是很多人项目都是把扩展点整了,这个时候简历的描述就又重复了,怎么整? 这个时候最简单的一个方法就是融合其他项目的亮点💡,然后添加到自己的项目里,让自己的项目不再是一个项目,而是多个项目的融合,我这样说吧,鱼皮哥星球的那么多个项目,我感觉除了用户中心以外,通用性最强的项目就是 BI 项目,也是我看了很多简历最多的项目,因为这个项目逻辑简单,而且结合大模型,所以面试的时候遇到的问题基本是最好解决的,但是你感觉简单了,那么其他人也肯定感觉学习起来简单,那么写的人自然而然就多了,那么有什么方法可以解决呢?那有的,包有的,兄弟,那就是和其他项目结合起来,比如 API 开放平台,你是否可以将 BI 的功能进行接入后台管理页面,通过大模型去分析用户调用情况的数据,然后针对调用频率的 API,采用分组限流的方式去优化调用,这里分组限流,主要是针对不同的情况,因为你有的 API 调用的比较多,你就可以添加限流参数,然后有的比较少,你就减少调用的参数,这样你不就可以实现不同 API 的限流效果不同了,或者你可以和 OJ 项目结合,分析用户的做题情况,像以下这个雷达图,用去统计用户的做题数据,然后这里为了避免用户查看到其他用户的数据,即出现水平越权的情况,你可以校验一下用户的信息,一般从 session 中拿用户 id 就可以了,然后因为这种数据对于实时性的要求并不是很高,你不是就可以异步的方式进行展示,然后每隔一段时间去进行一次统计即可,然后针对用户的刷题给出对应的结论,甚至你不用 BI 分析,你直接利用大模型也是可以的。 <img src="https://pic.code-nav.cn/post_picture/1627889630378479618/zvRPvVfYuO6ocwt9.webp" alt="" width="398px" /> 像下面这个,其就是 OJ 加上模型的结合,通过利用大模型帮忙刷题,充当你的刷题助手,这个其实并不难想到的亮点💡,只是很多同学没有去进行扩展而已。 ![](https://pic.code-nav.cn/post_picture/1627889630378479618/Bow2vQJbdFndOImj.webp) 还有就是面试鸭那里教的刷题热力图,你就可以去进行展示,用到对应的 OJ 项目那里,还有一个我之前面试遇到的反向压力的探讨,是否可以一起用到 OJ 那里呢,这就是一个点了。 ![](https://pic.code-nav.cn/post_picture/1627889630378479618/DU7L3MEhd5A7ScFb.webp) 那有的同学说了,我只想用 BI 项目怎么办,那还是有的,你可以在 BI 项目上接入支付的功能,这里可以使用小傅哥的支付组件,也可以找到 IJPay 聚合支付组件,小傅哥那个好像用点钱就可以解决,然后内网穿透就可以了,这个时候有个问题了,支付问题有什么亮点💡呢?那包有的,当你支持多种支付即微信、支付宝、银行卡等多渠道支付的时候就有了第一个问题,幂等问题的解决,比如说你在微信支付了,但是一直在转圈圈,你以为支付失败了,那么你就换支付宝支付,但是支付成功了,这个时候由于网络原因,微信支付的回调比较慢到,这个时候幂等问题如何解决,这个时候就涉及到两个问题,第三方不可信以及幂等的保证,第三方不可信最直接的方式就是自己做记录,优先按照自己的记录为保证,这个也是后面实现幂等的关键所在,然后如果你支付宝支付成功了,回调的时候只需要检查一下是否前面微信支付已经成功了,或者已经生成了对应的支付流水号就可以了,这样问题就解决了。 有人说支付太难了,有无更简单的写法?有的,兄弟,有的,这个时候就可以从文件上传入手,即文件太大了,怎么解决上传问题,很多同学说我第一办法就是限制文件大小就可以了,但是如果是第三方用了你 BI 平台作为企业内部项目,这个时候你限制文件上传的大小,那不就噶了,所以有无解决方法,答案是分块上传以及断点续传,就是还要限制文件上传的大小,但是可以加大上传的大小,比如 10 MB 升级到 100 MB 不就可以了,这个时候再进行文件大小的限制,然后继续使用分块上传和断点续传的方案不就可以了。 有人说上面这个太简单了,有没有其他亮点💡,那一定是有的,首先就是实现多维度变量分析,因为 BI 使用多个列数据对比分析,查看多个因变量,这个时候有没有解决方案,一定是有的,那就 MongoDB,因为 MongoDB 支持文档存储,你拿 MongoDB 去存你 AI 生成的代码,然后通过调用 MongoDB 的 API 参数,不就可以实现数据的多维度分析了,有人说这个就是调 API,没难度,那还是有的,鱼皮哥直播的时候不是说可以针对列元素过多的情况,去使用分库分表吗?这个也就是一个扩展,然后分库分表键的选择,你要实现多维度查询,那就直接基因法就可以了,这样你简历亮点💡就又 + 1了,然后你针对那个图例太多怎么办?是不是可以采用数据的冷热分离,这个时候引入 HBase,针对图例数据按照时间分离存储,这样不就可以提高和写入的效率了吗,亮点💡就又双叒 +1 了。 所以到这里,基本项目烂大街的说法基本就可以打破了,然后你换一下描述,换个说法,那不就是又一个说法的新项目了吗?所以没有烂大街的项目,既然这个项目能实现,那就有他的亮点,然后平时在看一些 APP 的时候,就可以多借鉴一下他们的亮点,这里我就又想到了一个亮点,比如说你在做博客项目的时候,是否可以引入 AGI 实现评论的风控,然后我这篇文章废话有点多了,是否可以使用大模型帮我总结一下,这样博客项目的亮点不就 +1 了,然后博客项目换个皮,是不是就可以变成面试鸭了?那不就变成了鱼皮哥的商业项目了吗?哈哈哈哈,说得太多了,不废话了。 ### 4. 训练营有没有必要加? 这个是一些朋友问我的,问的人不多,但是我简单表达一下我的观点吧,就是训练营有很多,然后很多训练营的价格也很高,这里每个人的观点可能不一样,我简单说一下我的观点吧,其实看你的自制力,因为训练营只是一种辅助你的方式,主要还是看你自己,你可以看你的需求吧,而且训练营很多质量有差距,有的训练营有一丢丢水。里就不过多进行赘述了,就是加训练营,可以首先看一下牛客上的描述,不要过分相信他人的说法,或者找一些评价吧,就加训练营建议谨慎一点,如果一定要加的话,我建议加一些知识星球,这里我推荐一下质量比较高的星球吧,然后大家感兴趣的可以了解一下,首先声明,我不是托,哈哈哈哈,主要加的星球多了,所以看的比较多,然后绝对客观,没有掺杂想法,我这里主要推荐几个: * **码农会所**:这个是小傅哥的星球,也是我绝对强推的星球,小傅哥堪比生产队的驴,大年初三,我还在睡觉,他就开始更新项目了,而且项目质量绝对有保障,分库分表路由组件、聚合支付组件、小型监控组件等等,还有一个很强的网关项目,绝对质量可以,而且有一些训练营一年推出的项目不到一个,小傅哥一年推出两三个项目,所以基本差距可以看出来。 * **冰河技术&冰河指南:** 这个是冰河哥的星球,比较硬核,不建议初学者加入,适合一些社招的人群,项目不多,但是更新的深度绝对可以,像 RPC 目录,可以去看一下冰河老师的博客,绝对硬核,然后这个更是卷王,我记得大年初二我还在拜年,这个已经在 B 站更新 RPC 的视频了,比我优秀的人还卷,我有什么理由不卷😭‼️ * **编程导航:** 我加入的第一个星球,可以说是白月光星球,可以说以前绝对每个视频直播都看完,可惜我现在年老了,已经不行了,只能看一些残羹生菜,所以一般都是挑亮点看,比如 Disruptor、DDD、热点黑名单,感觉小伙伴可以挑一些亮点,写到自己的简历里,或者和其他项目一起融合,鱼皮哥的项目绝对适合零基础的同学,可以说鱼皮哥做项目的思路,绝对用到自己写代码没有问题,实习写代码绝对足够。 * **拿个offer-开源&项目实战:** 这个是马哥的星球,项目 12306、牛券、短链接这几个都不错,而且和鱼皮哥一样都是从 0 到 1 开始敲,然后我开始接触开源项目并参与开源贡献,而且马哥是 Apache 分库分表开源项目的贡献者,如果想要接触开源,找马哥绝对可以,然后项目亮点和鱼皮哥一样,基本通用的解决思路,比如分库分表基因法、秒杀库存扣减等等,基本思路通用。 然后还有许多优秀的星球,比如开发者内功训练营(深入学习计网和 OS 可以加入)、JavaGuide、二哥等,都是非常不错的,然后训练营水有点深,加入需谨慎!!! ✨目标展望 ===== 新的一年目标其实比较简单,主要如下: * **工作方面**:找到一个满意的 Offer 吧,想上岸了😭 * **技术学习**:飞哥星球内存管理、网络管理、CPU 管理过完、ES 深入学习、然后 RocketMQ 和 Kafka 源码 * **项目方面**:继续积累项目,为社招做准备(目前春招简历项目其中一个打算社招用) * **开源**:参与更多的开源项目,明年参加一下原子开放、阿里大数据天池。 * **积累:** 每天 leetcode 每日一题,然后一天 3 篇技术博客,新的一年更近一步 * **生活**:注意身体作息,在这里劝诫广大朋友,注意身体,我已经年纪轻轻就神经衰弱了,所以还请身体为重,注意身体。 然后目标我与 coding 的十年之约,第二年,目标启航!!! 📚年度记录 ====== 最后再附上我的年度记录,记录一下我在编程导航的一年吧,主要是上半年在星球说得会比较多一点,后面开始实习和秋招就少了很多了,新一年的目标就是保证自己持续输出吧,感觉今年输出还是有点少了,继续加油!!! 然后有问题的同学可以评论区提问,看到了会一一解答的,然后废话可能有点多, ( * /ω\* )。 <img src="https://pic.code-nav.cn/post_picture/1627889630378479618/CbsOO1k6IcHRIf4z.webp" alt="" width="507px" />

2024年终总结

### 前言 今天是大年初五,假期将至,家人朋友们陆续开工上班了。毕业后,感觉每个年都过得十分仓促,心情也只有除夕前几天是开心的,过了除夕夜,心里不禁有一种迷茫与压迫侵袭着我,让我喘不过来气。不禁感叹一声!工作了之后,肩上的担子愈发沉重,心态有了很大的改变。 <img src="https://pic.code-nav.cn/post_picture/1635908870553522177/TQeNi5a5HUVaPEbU.webp" alt="undefined" width="335" /> ### 回顾这一年 - 大部分时间花在了工作 这一年没有选择跳槽,继续呆在我从23年毕业到现在一直工作的地方,这一年过的好快,工作上对于业务越来越熟悉,对于需求开发和bug处理也是越来越熟练,也在开发需求过程中学到了不少知识。 - 在编程导航,每天坚持学习 加入编程导航也快两年了,今年记忆深刻的是码神挑战,还蛮有趣。平常下班之后会看面试直播,也会看新项目教程,上班时间还会水鱼王群。还入手了面试鸭永久会员,偶尔刷刷面试题。 <img src="https://pic.code-nav.cn/post_picture/1635908870553522177/XULqLWEtYr58pe0g.webp" alt="image.png" width="100%" /> - 追番国漫剑来、吞噬星空、仙逆、斗破 <img src="https://pic.code-nav.cn/post_picture/1635908870553522177/ESgeuvLmdzsWn78I.webp" alt="微信图片_20250202213031.jpg" width="100%" /> - 爱上骑行、摄影,入手大疆action4记录生活 <img src="https://pic.code-nav.cn/post_picture/1635908870553522177/TXSMtVqPMxPtjGu6.webp" alt="undefined" width="628" /> - 每天跑步,坚持锻炼好身体 <img src="https://pic.code-nav.cn/post_picture/1635908870553522177/wOrXKBD7hRre44zl.webp" alt="undefined" width="335" /> ### 2025年Flag 1. 提升车技 2. 熟练的弹吉他 3. 持续内容创作输出,不限于文字、视频,并发布到各大平台 4. 读书、学习、刷题、考证 5. 锻炼身体,照顾好自己 6. 找到我的另一半

回望2024,展望2025

2024年是过渡的一年,完成了数据结构操作系统,计网计组的学习与笔记,但是受制于出门实践,代码能力停滞不前,年前完成Java零基础目标,年后争取在开学前完成javaweb、ssm学习 展望2025,是关键的一年,争取开学前可以开始黑马点评项目,学期初完成,后备战蓝桥杯,期间完成代码生成器项目,暑假前提前准备暑期实习简历与投递!

# 2024年度总结——项目和毕设

​ 2024年,是我加入编程导航的第一年,这一年,跟着鱼皮做完和正在做的项目有四个,分别是用户中心、伙伴匹配、API开放平台和手写RPC框架。印象里我是从大三下开始接触到编程导航的,邀请我的人是我的表哥,之后我就开始跟着鱼皮写项目,改bug,一点点地提升自己。 ​ 现在是大四上的学期末,毕业设计已经开题,现在我就要用我从编程导航学习到的知识,进行毕业设计项目的编写了。 ​ 下面具体讲一下我这一年都做了什么。 # 1.项目🎓 ## 1.1 用户中心🚲 ​ 用户中心想必很多小伙伴都做过,我也不例外,通过学习用户中心项目,我学会了如何从0到1搭建起一个前后端分离的项目,并且成功将项目部署到了远程服务器上。 ​ 在这个项目中,我学会了基础的用户登录态识别、错误码和返回值的封装、前后端跨域问题解决、使用多种方式进行项目的部署等等很有价值的知识。 ​ 其中我对两件事情的印象比较深刻,一个是前端修改登录逻辑,另一个是项目的部署上线。 ### 1.1.1 前端登录逻辑修改 ​ 在修改前端登录逻辑,实现用户登录状态保存的时候遇到了许许多多的问题,调试了很久,中间遇到过登录成功却不主动跳转到欢迎页,但是直接访问欢迎页又正常的奇怪问题,那几天脑子里想的都是为什么不跳转啊,现在回想起来都头疼,回想起来,最主要的原因是没用过ant design pro,对于它里面方法的调用逻辑完全不熟悉,只能一点点去了解和适应。 ### 1.1.2 项目的部署上线 ​ 搞定了本地的前后端交互,接下来就要学习如何把项目部署上线了,为此,我使用学生优惠购买了远程服务器,进行项目的部署,一开始非常不适应,因为平时用电脑都是图形化界面,但是远程服务器只有命令行,无论要做什么,都要敲指令。 ​ 在部署的过程中,总会遇到端口占用、启动失败、环境变量配置等问题,通过解决这些问题,我对于命令行的操作变得更熟练了。 ​ 在编写年度总结的时候,我回看了用户中心的笔记,在如何上传文件到远程服务器这部分,我尝试了配置ssh,防火墙、端口开放、配置文件修改也做了,但还是无法在命令行使用ssh上传文件,最后我选择了另一种方法,使用WinSCP这款软件,最终成功上传;这启示我:有时候遇到了难以解决的问题,换一种方式也未尝不可,不要太死板,不能因小失大,如果我一直执着于这个,完成用户中心的时间可能就更久了。 ## 1.2 伙伴匹配🛵 ​ 伙伴匹配是跟着做的第二个项目,印象比较深刻的是整合Swagger+Knife4j接口文档、大量数据导入、分布式锁和推荐算法。 ### 1.2.1 整合接口文档 引入knife4j后,根据编写的后端controller和dto,就可以生成一个可供前端、后端使用的接口文档,真的很方便,虽然使用的过程中也遇到了一些问题。 ​ 比如说找不到某些方法和dto,明明写了,但是查看接口文档的时候却没有;有时候是后端没有重新clean和install,有时候是没用Post和@RequestBody;不过使用的次数变多后,很快就能察觉到问题所在了。 ### 1.2.2 数据导入 ​ 导入大量数据到数据库中,以前从来没有做过这种事情;在进行数据导入的时候,我感受到了数据量大后优化的必要性,因为我现在使用的是个人电脑进行数据存储,插入10万条数据用了10秒,如果我使用的是性能较差的远程服务器,那时间就更久了; ​ 导入后,再去看看伙伴匹配系统的页面,发现页面渲染了很久,最后报错了,原因是发送给前端的数据多达30万条,前端很难接收,因此数据量大起来后,分页也很有必要。 ### 1.2.3 分布式锁 ​ 以前学操作系统的时候接触过锁,但是没接触过分布式锁,当我们考虑多个后端进程的时候,只用锁是不行的,因为单个锁只对单个JVM生效,这时候就要考虑使用中间件,让后端进程在一个地方抢锁,只有抢锁成功才能执行,而且要注意判断锁和删除锁操作的原子性。 ### 1.2.4 推荐算法 ​ 说起算法,我只有在学校学习《算法设计与分析》这门课和伙伴匹配接触过,这样一想,我算法方面相当薄弱。 ​ 在伙伴匹配系统中,鱼皮带我们使用的是编辑距离算法实现用户推荐,但是我测试的时候发现了一个奇怪的地方,就是推荐的次序不对,相同标签多的在少的用户后面,我看了一下编辑距离算法实例,发现编辑距离是直接适用于字符串之间的,但是我们的标签是一个列表,里面才是字符串,举个例子就是["java","男"]和["男","java"]的编辑距离是1,而不是0,当标签变多,加入次序不同,问题越严重,所以如果编辑距离算法要用到我们的伙伴匹配中,需要进行改进。 ## 1.3 API开放平台🚌 API开放平台相比于上面的两个项目,有更多我之前极少接触的东西,比如签名认证、Sping Cloud的gateway,也就是网关;还有RPC远程调用; ### 1.3.1 签名认证 ​ 之前做项目,要说到安全方面,最多有一个登录和角色校验,对于签名认证,从来没涉猎过,和账号密码不同,签名认证的密钥不应该直接在网络上传递,防止他人拦截请求,获取密钥,取而代之的是签名,使用密钥+请求参数等,使用签名算法生成。 ​ 除此之外,还需要随机数和时间戳,来防止请求被重现,当时还想过:为什么又要加随机数,又要加时间戳呢?是否是多此一举?我自己使用反证法证了一下 1. 如果只有随机数,会怎样呢?为了保证请求不会被重现,只能一直保存随机数,但是我们的存储空间是有限的,这样做肯定会出问题。 2. 如果只有时间戳,那我们设置的时间不能太短,防止因为用户网速慢等原因调用接口失败,那时间戳未到期前,别人可以随便复现你的请求,这也不行 3. 当时间戳和随机数都存在时,当时间戳未到期,随机数发挥作用,当时间戳到期了,随机数就可以移除,让时间戳发挥作用。 ### 1.3.2 gateway ​ 网关,之前也没接触过这个概念,了解一点后发现它的作用很强大,可以路由转发,负载均衡,统一鉴权等等,我们可以使用网关统一接收请求、进行签名认证、打印日志、把请求转发到我们的接口项目。 ### 1.3.3 RPC远程调用 ​ 之前只在一个沙龙项目中使用过类似的东西,但是当时不知道它叫RPC,只记得Dubbo和zookeeper,现在再学一次,才回忆起来,原来Dubbo是一款RPC框架,zookeeper是注册中心。 ​ RPC远程调用比起发请求要轻松许多,特别是使用Dubbo,引入依赖,在需要被调用的类上写注解,然后就可以像使用本地类一样使用不属于自己项目的类,真是太方便了!!! ## 1.4 手写RPC框架🚝 ### 1.4.1 基础实现 首先我跟着鱼皮写了基础的RPC框架,实现了使用自己的框架完成RPC调用,了解了RPC调用,作为服务消费者和服务提供者,需要做什么事情。 - 服务双方都要使用同样的序列化器进行数据的序列化和反序列化 - 服务的消费者要发起调用,为此需要进行代理,有静态代理和动态代理,静态代理需要一个个服务类编写,比较麻烦,动态代理用反射机制和工厂模式,可以轻松完成服务调用。 - 服务的提供者需要先注册服务,再处理调用——通过反射机制调用服务的实现类,将结果返回给消费者。 ### 1.4.2 优化 完成了基本的功能,接下来就要思考这样的调用有哪些地方可以优化。 #### 1.4.2.1 全局配置加载 ​ 首先可以想到的有配置,我们的RPC框架要给用户使用,就不可能指望用户自己用修改代码的方式修改配置,我们可以通过配置文件的方式,用户只需要填写一点需要的信息,框架就能加载用户配置。 #### 1.4.2.2 注册中心 ​ 在基础调用中,服务提供者的地址是写死的,但是服务提供者的地址很可能会变化,而且实际使用时,很明显服务的提供者不会只有一个的,服务的消费者同时也可能是服务的提供者,所以实现注册中心很有必要。 #### 1.4.2.3 其他优化 ​ 由于我们学校要求毕业设计提前进行,所以首先RPC框架项目只做到完成简单注册中心,其他的优化需要抽时间进行学习了。 # 2.毕设⚔ ## 2.1 从项目中吸收经验 在设计我的毕业设计作品的时候,我马上想到了我做过的用户中心和伙伴匹配系统,当然并不是说照搬,而是我可以用我学过的这两个项目的经验指导我的毕业设计,比如用户中心的经验让我可以了解如何快速搭建一个后台管理系统,并进行优化,而伙伴匹配系统的经验让我可以了解如何制作一个移动端H5页面的项目,给用户使用。项目使用的技术栈也可以供我参考。 ## 2.2 遇到的问题 ​ 在学习编程导航项目和平时的项目学习的过程中,大多数时候都是跟着教程写,虽然对代码也有自己的思考,但是没怎么做过拓展,对于没做过或仅仅接触一次的业务,总有种不知所措的感觉,而且写的时候总会想要一次性把事情做完,但是又会由于难以做到而拖慢了进度,这是需要注意的。 ​ 下面说一下我要做的功能,包括排队功能、支付功能。 ### 2.2.1 排队功能 ​ 首先来说排队功能,在之前做的项目中,我不曾接触过这种需要实时通信的功能,为此,我需要多多查阅资料,把这个功能集成到我的项目中。 ### 2.2.2 支付功能 ​ 然后是支付功能,这个功能倒是接触过,在我大三下的时候,某公司给我们软件专业的做过一次实训课程,其中就带我们实现了支付宝的模拟支付,但是我在思考我的毕业设计的时候突然发现有点不太对,如果给用户使用的话,现在大家用的都是手机,但是当时支付是跳转到了支付宝的网页支付页面,不知道毕业答辩的时候会不会有老师指出我这不符合实际需求,我可能还需要思考一下。 # 3. 其他🎉 ​ 总结一下2024,我一点点跟着编程导航学习,之前实现前后端交互都要做很久,现在可以完成基础的前后端交互,思考优化点,并把自己学习到的知识运用到毕业设计中,不再是以前那个只要代码能跑就行的菜鸟程序员了,但是我的知识掌握得还是不够牢固,而且知识层面还是比较浅,今后也会跟着教程继续学习,2025继续进步。 #2024年度总结

长风破浪会有时,直挂云帆济沧海!——2024年总结

去年目标 ---- 回顾 2023 年总结,自己定下四个目标: <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/aNaXBMgLv3GbwP9V.webp" alt="" width="100%" /> 1. 简历项目完成的不错,两个项目都完成且加入自己想法并拓展了,到了秋招融合成 Yinsight 2. 撰写简历:从一开始懵懵懂懂的写简历(现在看回第一版简历简直是毫无亮点 无力吐槽...)到现在有一份算是满意简历(当然还需要继续提升 冲刺春招) 3. 实习:暑期实习期间不断迭代简历,突击八股文,还有很大部分运气成分,之前面的外包、全干的血汗公司、小厂都没过,反倒是一家 1000+规模的厂面试的时候聊的不错,最终通过了,当时也算是比较想去的一家。 4. 实习学的东西:进去实习后,虽然已经到项目交付期,做的比较杂,但接触到的项目还可以,用的技术也比较新 还有自己完全没接触过的框架,导师也很耐心(第一天问怎么用 git 拉代码以及后面一些傻问题没被喷😂)。离职后总结发现开发 coding 能力的提升还是比较多的。 总的来说,在当初一年前自己的视角,当初立下目标都完成了,且也比较满意。 回望整年 ---- 之前看占卜,说**今年是开智的一年**。整体来说,现在回想对比去年一月自己,确实有非常大的进步和改变,这个进步不止是技术方面: * 内在的表达(面试)、工作协调、沟通(实习)在暑期实习 and 秋招打磨下愈发俞善,现在听自己第一次面试都会尴尬到抓地板的地步 * 外在的身体:身体逐渐变好。实习之后开始自律,甚至比现在更自律😂。每周 10km 以上的间歇性高强度运动 + 周末放假游泳🏊‍。早餐玉米鸡蛋加牛奶,因为实习保证早睡早起,大概两个多月瘦了 15 斤左右。到现在虽然没实习时自律,但是仍然保持健康饮食 + 适度锻炼,身体依旧杠杠滴~ ### 1~3 月 殊不知是夜幕前的狂欢 第一次看演唱会 - 开心过年 - 出去玩... 当然也有一点学习,不过没意识到暑期实习紧迫性,还在做新项目,玩也玩得不亦乐乎 <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/md5YxvQrx3vIMj47.webp" alt="" width="100%" /> ### 3~5 月 黑夜降临 #### 啊?暑期实习已经开始了? 三月初,才意识到已经开始招暑期实习了,当时还不知道暑期实习来的这么快,不知道 3 月之后很多公司都开了。 八股?完全没背。项目?没上线,对应项目简历点一个没提取。简历?更加没写过。 > 天塌了!赶紧动起来! 三月就是赶鸭子,一切从零开始,这也是我没做好提前规划(但后续秋招也没有吃一垫长一智,继续犯错...): * 八股:快一个月时间连忙把常见八股文全部刷一遍,每看到一题都试着自己讲一遍,消耗时间比较多;但是讲了一遍特别自信,天真的想巴不得自己马上面试。 * 项目:连忙梳理点,三月底终于赶出第一份现在我自己看着都尴尬的简历。 ![](https://pic.code-nav.cn/post_picture/1627854772813975553/MAhmEYHmPojKCd4o.webp "几乎每天的常态") 👆几乎每天的常态 #### 赶上了一点了,有面了 三月底四月初开始投递简历,投递了三四个星期没有一点响应,第一次感受到求职痛苦。 终于等到一家公司发起面试,但是是 50 人的血汗小厂,还要做全栈。不管怎么样,先面试吧... 又等到了五月中旬,面试多起来了,一周五面:ToG 边远小厂两次面 - 外包 - 百人小厂,最后都没过。 ... * * * 正当佛系摆烂,一天午睡,一个电话邀约震醒,发现是之前随手投的一家 1000+的厂 当天面试发挥出奇好,和面试官也是我的导师聊得不错,一周后口头 offer 至此,进入了暑期实习,算是终于结束了...松了一口气,但没全咽下去 ### 6~8 月 松了一口气 白天实习 + 晚上无缝衔接自习室学技术栈(知道自己不足)or 跑步运动维持身体 <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/myu8JADkcaNsAxXD.webp" alt="undefined" width="445" /> 反思:这时关心秋招,没参考去年具体时间,总认为是金九银十,八月再注意也不怕。 出来后没及时投递简历 ### 8~11 月 又陷入痛苦的校招 八月中旬辞职备战秋招,投递简历,没有面试的日子里专心准备面试。(不是在面试就是在准备面试) 不断准备项目、实习、八股文,找了一些大佬模拟面或改简历。但总是事与愿违,秋招的结果不怎么好... 详见《[双非本秋招颗粒无收,我做错了什么...](https://www.codefather.cn/post/1869066731528519681)》, <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/tSIpaRGSYBd7SspQ.jpg" alt="" width="400px" /> ### 11~1 月 调整心态 总结反思 * 心态: 经过无数次心跳崩又调整心态然后又崩,循环往复好几次。好不容易看到希望,又被磨灭了。直到 虽然心态跌落低谷了几天,但又重新振作回来。过去的事已发生,无法改变,现在能做的只有吃一垫长一智,避免重蹈覆辙,冲刺春招! * * * * 调整: 已经到十一二月尾声了,把之前高压准备面试放了放,重点调节好自己心情。 * 多出去走走 散散心。好的心情和心态最重要 <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/sXSYLJpUjowSmsIG.webp" alt="undefined" width="386" /> * 反思秋招以来有哪些地方没做好导致这样。从八月辞职出来到十一月份的总结反思。 * 把毕业论文进度赶了赶,尽量下学期不影响到春招进度。 启发与教训: * 尽早规划 * 问题:没了解秋招形势。暑期实习开的时候没有得到教训(因为影响也不大 - 当时水平+学历确实小厂水平,大厂投了也不理会),实习期间 7 8 月没意识到很多公司已经开始秋招(询问一些拿到 offer 的同学)。 * 反思:目前已经参考去年春招 记录关键时间节点 提前做好准备,年前专心琢磨简历,根据建议再次修改,大概年后最迟元宵节收心准备状态面试 * 密切关注招聘信息 * 问题:8 9 月虽然简历很快出来但是**投的少投的晚**。当时不知道汇总表格的含金量,九十月份只跟着表格最新部分投递,忽略了大部分在下面的互联网厂。等到大概十月份才在牛客里零零散散投递。 * 反思:春招时密切关注招聘信息,跟着表格尽早投递。 --- 需要注意的点: * **回家后面试回答表达欠缺了**:放假回家感受 - 口头回答面试鸭问题有点困难了,太久没面了... 行动:新年后要继续刷回面经,把感觉捡回来。 * **发挥好优势**:总结好秋招学习的知识点,融入到面试里,体现差距。 行动:将秋招每日打卡的知识点进行回顾,总结好学习的知识点。 * **修改简历**:根据后来给别人看简历给的建议,继续修改简历(同实习同学、拿到 offer 同学) 回顾与展望 ----- 回望一整年,虽然今年年尾的求职不太如意,但今年也有挺多值得庆幸的事情: 工作方面 * **刚踏上春招时身边有挺多帮助**:三月份从 0 开始准备春招,身边同学还有鱼皮哥在求职路上大大小小的指导(背八股 写简历 分享面试经验)。 * **拿到实习 offer**:虽然春招面试屡屡受挫,面过血汗牛马工厂、外包、边远小厂,失败了但没有受一点影响,不断复盘,最后得到一家千人规模公司的 offer。 * **实习公司还不错**:实习的公司通勤还好,单栋办公 环境不错,正常时间上下班,时不时还有一些福利,比较轻松。使用的技术是正常的(是 Java springboot cloud idea 后端),还有一些后来学习才知道的技术。过程中,几个月和同事沟通下来也挺好,有时候跨部门请教时都很耐心排查。带的导师可以,不会的也会不厌其烦教(永远记得问怎么从 git 拉代码下来的时候没骂人😭)。如果不是要秋招了,入职晚了,真挺想待久一点😂。 * **秋招更有力量**:秋招时发掘认识更多志同道合同学大佬,秋招过程中不断交流,获取信息,吸取经验进步... 个人方面: * **个人能力提升**:因为求职面试以及实习过程中沟通,倒逼自己表达能力,换位思考,更加流畅表达东西。 * **身体倍儿棒了**:实习时候为了避免身体颓废发福,加之一直想把肚子减下来,变得更加自律。控制好饮食,早睡早起,每星期跑步 10km 起步运动 + 周末游泳。三个月下来成功瘦下 20 斤并且一直保持到现在,正常生活也没有反弹😊 * **尝试烫发**:当时拿到实习后去烫了个头,第一次注重自己的发型(有一说一 烫完是真的靓仔啊😂) 无论秋招有无 offer,过程中相比刚辞职的自己学习到很多东西。八股更熟了 不会的也弥补了(JUC JVM OS 计网),有更多技术的经验。感谢秋招三个月不断坚持,不放弃,不断奋斗的自己,春招继续加油! 蛇年目标与愿景:和去年一样,只能放眼到明年毕业前😂工作后想法不一样了,也有太多不确定性了 1. 拿到满意 offer!!! 2. 计划去健身 增肌。今年暑期能把减脂做好了,说明自己是自律并且有能力的。 3. 毕业旅行。当牛马前好好享受最后大学时光。 * * * 大学时光最后半年了,祝自己前程似锦吧!加油!✊💪 <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/8tcKJsgI7KRQSbJT.webp" alt="undefined" width="474" /> 最后附一张编程导航的年终总结,去年因为求职也是高强度刷星球了哈哈: <img src="https://pic.code-nav.cn/post_picture/1627854772813975553/GWsixEt9LtCjUodw.webp" alt="undefined" width="346" />

年度总结+学习打卡

# 一些小知识 ## word技巧 选择题挖空 文字无填充+黑色下划线 <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/Hp8zOWHPY8KNkrmD.webp" alt="image.png" width="100%" /> 获得单字拼音 拼音指南+只保留文本粘贴 <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/c03gfoVFSHyU11g1.webp" alt="image.png" width="100%" /> 两端对齐英文排版满行 分散对齐占满所在的行 <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/ppq8yL1VOk7xRRZW.webp" alt="image.png" width="100%" /> ## Excel技巧 公式视图CTRL+` 批量填充CTRL+Enter 单表数据量约为百万条 单元格格式匹配顺序为 正数格式;负数格式;零值格式;文本格式 用[]表示格式或条件 占位符有: 数字0/#/? 字符@ 换行输入ALT+Enter 利用数字拖拽+单元格格式生成学号 也可数字拖拽+TEXT函数生成学号 (数值精度15位,写身份证会进位,重做) 写函数在识别到函数时按F1 可查看公式具体内容 ## PPT技巧 选择窗格对象起名 陀螺旋+触发器可以做抽奖 OKPlusPPT插件有批量工具,PPT效率插件 ## 算法 大致学习了以下的内容: - 数组 - 排序,查找,求区间,统计,过滤 - 字符串 - 遍历,拼接,分割,查找,匹配,比较,格式转换 - 栈&队列 - 先进先出/先进后出 - 集合和哈希表 - 记录存在/记录状态 - 二叉树 - 查找/遍历 - 回溯 - 回溯是迭代的,还可以做剪枝 直接for嵌套就不好处理 - 贪心 - 积累局部最优得最优 - 动态规划 - 存储子问题的解,通过迭代,压缩到多项式时间 避免全量计算 for的效率比递归高,所以很多时候优于回溯 ## 选择器 ### 权重 | 选择器 | 权重 | | --------------------------------- | ------- | | 继承/通配符/后代( )/子(>)/并集(,) | 0,0,0,0 | | 元素选择器/伪元素选择器 | 0,0,0,1 | | 类选择器/伪类选择器/属性选择器 | 0,0,1,0 | | ID选择器 | 0,1,0,0 | | 行内样式style="" | 1,0,0,0 | | !important重要的 | ∞无穷大 | 层叠性 ### 链接伪类选择器 | 选择器 | 说明 | | --------- | -------------------------------- | | a:link | 选择未被访问的链接 | | a:visited | 选择已被访问的链接 | | a:hover | 选择鼠标悬停时的链接 | | a:active | 选择活动(鼠标按下未松开)的链接 | 为了防止被覆盖按照LVHA的顺序 love hate 除了链接伪类,还有表单伪类focus等 ### 属性选择器 - E[att="val"]根据某属性值来进行选择 - E[att^="val"]根据属性值开头来进行选择 - E[att$="val"]根据属性值结尾来进行选择 - E[att*="val"]根据属性子串来进行选择 ### 结构伪类选择器 - E:first-child(先把每个孩子都排列一个序号,在根据序号判断是否为指定元素) - E:last-child - E:nth-child(n) 第n个子元素 - nth-child选择器()里可以是数字,也可以是公式和关键字(even(偶数)、odd(奇数)) - 公式1:E:nth-child(n) 选择所有的孩子 - 公式other: 2n(偶数)、2n+1(奇数)、5n(5的倍数)、n+5(第5个到最后)、-n+5(前5个) - E:first-of-type(会看指定元素,再排序) - E:last-of-type - E:nth-of-type(n) ### 伪元素选择器(属于行内元素,但在HTML中找不到) - ::before - ::after ## 鼠标坐标计算 1. pageX,pageY(mousemove的事件触发时鼠标在页面中的坐标) 2. offsetTop+offsetLeft属性或getBoundingClientRect()方法(相对于视口的坐标) 3. `e.pageX - getBoundingClientRect().left-document.documentElement.scrollLeft` `e.pageY - getBoundingClientRect().top-document.documentElement.scrollTop` 好处是不受父元素定位影响,但要计算滚动距离 ## 垃圾回收机制算法 ### 引用计数法 IE采用"内存不再使用"就回收的思想,==追踪记录被引用的次数==,引用次数为0时回收 通过让引用类型对象的引用为空,如`arr = null` ,来回收 ```js function fun(){ let o1 = {} let o2 = {} o1.a = o2 o2.a = o1 return '引用计数无法回收' } fun() ``` > 嵌套引用不回收,因为堆里面的数值相互引用了,我们只能改地址到数值的引用,所以就导致了内存泄漏... ### 标记清除法 现代的浏览器采用"无法到达"就回收的思想,从根部(即js的全局变量)出发扫描内存对象,凡是能到达就还需要用,无法触及到的对象被标记为不再使用,稍后回收. ## 闭包 闭包是指使用了外层非全局变量的函数,特征是**变量提升** 即函数引用和外层变量一起提升到访问闭包函数的那一级作用域 闭包其实是利用了垃圾回收机制,有内存泄漏的风险 ## 箭头函数与立即执行 **参数列表只有一个参数时**箭头函数可以写作`argument1 => {}` **函数体只有一个语句时**还能简化,像`() => console.log(1)` 如果仅有的一句是return可以在省略{}的情况下再省略return直接写值`() => 1+1` 对于匿名函数,箭头函数`() => {}` 比`funcition () {}`简略一些,而且箭头函数没有自己的this,只会隔离代码防止命名冲突 立即执行函数: (function(c){ return c})('参数') (function(c){ return c}('参数')) <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/M0Ej8yHD6BWT56S6.png" alt="image.png" width="232px" /> (c => ({ name: c }))('刘德华') //立即执行返回对象 <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/abJuwRZPbFtbFQ4k.png" alt="image.png" width="212px" /> ## 解构赋值 左值直接写成和数组或对象一致的情况可以进行解构赋值 const [a,[b,c]] = [1,[2,3]] //定义三个变量,分别赋值为1,2,3 ## 数组常用方法 语法: | 方法 | 作用 | 说明 | | ------------------------------------------------------------ | ------------------- | --------------------------------------------- | | forEach(回调函数(item,index,array)) | 遍历 | 不返回数组,查找数组元素 | | filter(回调函数(item,index,array)) | 过滤 | 返回数组,筛选满足条件的数组 | | map(回调函数(item,index,array)) | 映射 | 返回数组,返回处理后的数组 | | reduce((非迭代)回调函数(prev,current),起始值) | 累计计算 | 返回累计处理的结果,经常用于求和(再加上初始值) | | join(分隔符=',') | 拼接 | | | find(回调函数) | 查找 | 返回第一个匹配的值,没有返回undefined | | every(回调函数) | 检测所有 | 都符合返回true否则false | | some(回调函数) | 检测存在 | 有符号返回true否则false | | concat(其他数组) | 合并数组 | 返回新数组 | | sort(compareFn),默认数组元素会被转换为字符串,然后根据每个字符的 Unicode 码位值进行排序。 | 排序 | 返回数组 | | splice(start, deleteCount, item1, item2, /* …, */ itemN) | 删除\替换原数组单元 | 返回删掉的数组 | ## 字符串常用方法 语法: | 实例方法 | 作用 | | --------------------------------------------------- | ------------------------------ | | split(separator) | 字符串拆分成数组 | | substring(startIndex,[endIndex]) | 截取子串(不包含结束位置的字符) | | startsWith(searchString,[startPosition=0]) | 判断开始是否是searchString | | includes(string,[index=0]) | 包含 | | toUpperCase | 转大写 | | toLowerCase | 转小写 | | indexOf | 查找索引 | | endsWith(searchString, [endPosition=this.length-1]) | 判断结束是否是searchString | | replace | 替换,支持正则匹配 | | match | 查找,支持正则匹配 | ## 对象原型和原型对象 <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/MTASm4URrhCWttek.webp" alt="image.png" width="100%" /> 使用`instanceof`检测构造函数的prototype属性是否出现在某个实例对象的原型链上 构造函数new实例,prototype原型对象 实例对象可以通过`__proto__`属性获得对象的原型 > 原型对象和对象原型指向同一个对象,只是概念用途存在差异 `__proto__`主要用于运行时的属性和方法查找 `prototype`主要用于新对象共享原型对象的属性和方法,这样可以节省内存,提高代码的复用性 ## 深拷贝模板 ```js function deepClone(source) { if (typeof source !== 'object' || source == null) { return source; } const target = Array.isArray(source) ? [] : {}; for (const key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (typeof source[key] === 'object' && source[key] !== null) { target[key] = deepClone(source[key]); } else { target[key] = source[key]; } } } return target; } ``` ## 异常捕获语法 ```js try { // 要执行的语句 // 这里可以放置可能会抛出异常的代码,例如: // let result = someFunctionThatMightThrowError(); } catch (exceptionVar) { // 异常处理 // 当 try 块中的代码抛出异常时,程序将跳转到这里,exceptionVar 包含异常信息 // 可以根据 exceptionVar 的类型和信息进行相应的处理,例如: // if (exceptionVar instanceof SomeErrorType) { // console.error('发生了某种类型的错误:', exceptionVar.message); // } else { // console.error('发生了其他错误:', exceptionVar.message); // } } finally { // 无论是否报错都执行的退出前语句,哪怕 throw 抛出异常 // 这里通常用于资源清理,例如关闭文件、释放连接等操作,例如: // if (file) { // file.close(); // } } ``` ## 防抖截流 防抖是触发中**打断重新触发** 实现方式: - lodash库处理防抖`_.debounce(fun,时间)` - 手写防抖函数 ```js function debounce(fun,t){ let timer return function(){ if(timer) clearTimeout(timer) timer = setTimeout(fun,t) } } ``` 节流是触发中**不再重复触发** 实现方式: - lodash库处理节流`_.throttle(fun,时间)` - 手写节流函数 ```js function throttle(fn,t){ let timer return function(){ if(!timer){ timer = setTimeout{function(){ fn() timer = null//(使用clearTimeout()不会清除timer的值) },t} } } } ``` ## 视口标签与二倍图 视口标签可以控制页面的显示缩放和自适应调整 比如**`initial-scale=1.0`** 加**`maximum-scale=1.0`**加**`minimum-scale=1.0`**不让用户缩放 **`width=device-width`**视口宽度设置为设备屏幕宽度 手机等设备会用两个以上物理像素显示一个像素,想要图片不糊,需要提前准备二倍图,这样先缩小再放大,不会影响显示 ## flex布局 设置`display:flex` `justify-content: space-around` 6个属性是对父元素设置的 - flex-direction(设置主轴方向(默认是row,向右为正方向(row-reverse翻转可以让元素从右到左,向左为正方向),垂直方向是侧轴。可以设置为column,默认向下是正方向)) - flex-wrap(默认情况下flex里不换行,项目都排在一条线(轴线)上,加元素会缩小所有子元素) - `wrap`(装不开就换行) - `nowrap`(默认值,不换行) - flex-flow(设置主轴方向与设置换行合写) - justify-content(使用前请确认主轴是哪个) | 属性值 | 说明 | | ------------- | ---------------------------------------------------- | | flex-start | 默认值 从头部开始 如果主轴是x轴,则从左向右 | | flex-end | 从尾部开始排列(==顺序不变==) | | center | 在主轴居中对齐(如果主轴是x轴则水平居中) | | space-around | 平分==剩余==空间(左右边距相等,即两边会少一块边距) | | space-between | 先两边贴边 再平分剩余空间(重要) | - align-items(侧轴对齐,只适用于单行(没有flex-wrap属性)) | 属性值 | 说明 | | ---------- | ---------------------------------------------- | | flex-start | 默认值 从侧轴头部开始排列 | | flex-end | 从尾部开始排列(==顺序不变==) | | center | 在侧轴居中显示 | | stretch | 拉伸(默认值,若子元素有高度则无效,否则占满) | - align-content(试用于子项换行的情况) | 属性值 | 说明 | | ------------- | ------------------------------ | | flex-start | 默认值 从侧轴头部开始排列 | | flex-end | 从尾部开始排列(==顺序不变==) | | center | 在侧轴居中显示 | | space-around | 在侧轴平分剩余空间 | | space-between | 先两边贴边 再平分剩余空间 | | stretch | 拉伸(子项元素平分高度) | flex属性定义子项分配多少份==剩余空间==(左右固定,中间分配唯一的剩余空间,就可以实现所谓圣杯布局或双飞翼布局的效果) `flex: num` align-self(控制子项自己在侧轴上的对齐方式) > flex可以套娃 ## 渐变色 线性渐变:`background: linear-gradient(起始方向,颜色1,颜色2,...);` 有如下几种写法: `background: -webkit-linear-gradient(red,blue);`(默认是从上往下) `background: -webkit-linear-gradient(left,red,blue);` `background: -webkit-linear-gradient(left top,red,blue);` 没设置宽度时flex垂直分布改align-items则不会默认填满每个水平宽度 ## 媒体查询 ### 基本语法 - `media-type`: - `all`:适用于所有设备类型。 - `screen`:主要用于电脑屏幕、平板电脑、智能手机等屏幕显示设备。 - `print`:用于打印机和打印预览。 - `speech`:用于屏幕阅读器等语音合成器。 - `media-feature`: - `width`:视口的宽度。 - `min-width` 和 `max-width`:视口的最小和最大宽度。 - `height`、`min-height` 和 `max-height`:视口的高度及最小和最大高度。 - `orientation`:设备的方向,值可以是 `portrait`(纵向)或 `landscape`(横向)。 - `resolution`:设备的分辨率。 可以使用and和not作为逻辑操作符控制媒体查询 使用only 指定特定媒体类型 ### css媒体查询 ```css @media screen and (min-width: 1200px) { header { height: 100px; } } @media screen and (min-width: 768px) and (max-width: 1199px) { header { height: 80px; } } @media screen and (max-width: 767px) { header { height: 60px; } } ``` ### 外部样式表中的媒体查询 ```html <link rel="stylesheet" href="large.css" media="screen and (min-width: 1200px)"> <link rel="stylesheet" href="medium.css" media="screen and (min-width: 768px) and (max-width: 1199px)"> <link rel="stylesheet" href="small.css" media="screen and (max-width: 767px)"> ``` ## less语法 **一、Less 基础概念** - Less 是一种 CSS 预处理器,它扩展了 CSS 的功能,最终会编译为 CSS 代码,使样式表更具可维护性和扩展性。 **二、变量** - 声明:使用 `@变量名: 值;` 来定义变量,例如:`@primary-color: #333;`。 - 使用:在样式中使用 `@变量名` 来引用变量,如 `color: @primary-color;`。变量可用于存储颜色、尺寸、字体等,提高代码复用性和可维护性。 **三、嵌套** - 基本嵌套:将子元素的样式嵌套在父元素样式内部,增强代码结构的逻辑性。 ```less nav { ul { margin: 0; li { list-style: none; } } } ``` - 伪类和伪元素嵌套:在嵌套中使用 `&` 来表示父元素,以处理伪类和伪元素。 ```less a { color: blue; &:hover { color: red; } &:before { content: ''; } } ``` **四、混合(Mixins)**(嵌套) - 声明:使用类名或 ID 来定义混合,可包含一组样式,可带参数。 ```less .border-radius(@radius) { border-radius: @radius; } ``` - 使用:将混合应用到元素上,可传递参数。 ```less .button { .border-radius(5px); } ``` - 不带参数的混合:可以直接引用,像调用函数一样,实现代码复用。 ```less .border { border: 1px solid black; } .box { .border; } ``` **五、函数** - Less 提供了内置函数,如 `lighten(@color, 10%)` 可将颜色变亮,`darken(@color, 10%)` 可将颜色变暗。 ```less @base-color: #f06; .button { color: lighten(@base-color, 20%); } ``` - 自定义函数:使用 Guard 表达式和模式匹配,可以实现自定义函数功能。 ```less .square(@size) when (isnumber(@size)) { width: @size; height: @size; } ``` **六、运算** - 支持基本的算术运算,如加、减、乘、除。注意运算符两边要有空格,单位遵循 CSS 规则。 ```less @width: 100px; @padding: 20px; .container { width: @width - @padding; } ``` - 颜色运算:可对颜色进行加、减、混合等操作。 ```less @color: #444; .button { background-color: @color + #111; } ``` **七、继承** - 使用 `:extend()` 关键字实现继承,减少代码重复。 ```less .primary-button { background-color: blue; } .secondary-button { &:extend(.primary-button); color: white; } ``` **八、导入** - 使用 `@import "文件名";` 导入其他 Less 或 CSS 文件,可导入多次,Less 会自动合并。 ```less @import "variables"; @import "mixins"; ``` **九、条件判断** - 使用 `when` 关键字进行条件判断,结合 Guard 表达式。 ```less .border-radius(@radius) when (@radius > 0) { border-radius: @radius; } ``` **十、循环** - 通过递归混合和 Guard 表达式可实现循环功能。 ```less .generate-columns(@n) when (@n > 0) { .column-@{n} { width: (@n * 100% / 12); } .generate-columns(@n - 1); } .generate-columns(12); ``` **十一、命名空间和访问器** - 创建命名空间:使用 `#命名空间名` 包裹一组混合,使用时需通过 `#命名空间名.混合名` 访问。 ```less #utils { .center() { margin: auto; } } .container { #utils.center(); } ``` Less 的优势在于其强大的变量、混合、函数、继承等功能,能够帮助你编写更简洁、灵活、易于维护的样式表,同时也支持各种高级逻辑,如条件判断和循环,通过编译为 CSS 保证了在浏览器中的兼容性。 ## Bootstrap布局 [参考网址](https://bootstrap.nodejs.cn/docs/5.3/layout/grid/) 提供了一些使用的插件和布局 ## axios语法 ### 实例配置 ```js const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 1000, headers: { 'Content-Type': 'application/json' } }); instance.get('/data') .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` ### 拦截器 ```js instance.interceptors.request.use( config => { // 在发送请求之前做些什么,如添加 token config.headers.Authorization = 'Bearer token'; return config; }, error => { // 对请求错误做些什么 return Promise.reject(error); } ); instance.interceptors.response.use( response => { // 对响应数据做点什么,如处理错误码 if (response.status === 200) { return response.data; } return Promise.reject(response); }, error => { // 对响应错误做点什么,如处理错误信息 console.error(error); return Promise.reject(error); } ); ``` 可以使用 `axios.all` 发送多个并发请求 可以使用 Axios 的 `CancelToken` 来取消请求 ## 原生XHR 使用XMLHttpRequest的步骤: 1. 创建XMLHttpRequest对象 2. 配置请求方法和请求url地址 3. 监听loadend事件,接收响应结果 4. 发起请求 示例: ```js const xhr = new XMLHttpRequest() xhr.open('get', 'http://hmajax.itheima.net/api/city?pname=辽宁省') xhr.addEventListener('loadend', e => document.querySelector('.my-p').innerHTML = JSON.parse(e.target.response).list.join('<br>')) xhr.send() ``` ```js function sendRequest(url, method, data = null, token = null, timeout = 5000) { return new Promise((resolve, reject) => { // 1. 创建对象 let xhr = new XMLHttpRequest(); // 2. 配置请求 xhr.open(method, url, true); // 设置超时时间(毫秒) xhr.timeout = timeout; // 设置请求头 if (token) { xhr.setRequestHeader('Authorization', `Bearer ${token}`); } if (data) { xhr.setRequestHeader('Content-Type', 'application/json'); } // 3. 监听事件,接收响应结果 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { // 请求成功 resolve(xhr.responseText); } else { // 请求失败,但请求已完成 reject(new Error(`Request failed with status ${xhr.status}: ${xhr.statusText}`)); } }; xhr.onerror = function() { // 网络错误,请求无法完成 reject(new Error('Network error occurred')); }; xhr.ontimeout = function() { // 请求超时 reject(new Error('Request timed out')); }; xhr.onabort = function() { // 请求被中止 reject(new Error('Request aborted')); }; // 4. 发起请求 if (data) { xhr.send(JSON.stringify(data)); } else { xhr.send(); } }); } ``` ## Promise **`Promise`** 对象表示异步操作==最终状态==(完成或失败)以及其==结果值==。 ```js //1.创建Promise对象并传递参数 const p = new Promise((resolve,reject)=>{ //2.执行异步任务-并传递结果 //根据自定义的判断分支,可以返回两种调用 //成功调用: resolve(值)触发then()执行 //失败调用: reject(值) 触发catch()执行 //两种调用都不会直接返回,但是它们之间会有冲突,先调用的那一个有效(先占先得) }) //3.接受结果 p.then(result=>{ //进行resolve调用时这里拿到参数resolve()里的值 }).catch(error=>{ //进行reject调用时,这里拿到参数reject() 里的值 }) ``` 简易版axios ```js function myAxios(configObj) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() // let params = '' let data = configObj.data || null if (configObj.params) { configObj.url += '?' + new URLSearchParams(configObj.params).toString() // const obj = } xhr.open(configObj.method || 'GET', configObj.url) if (data) { if (data instanceof FormData) { //手动处理 multipart/form-data 是非常复杂的,需要处理boundary并手动构建表单数据,所以什么也不需要做, //浏览器会自动处理请求头 } else if (data instanceof Object) { console.log(1) xhr.setRequestHeader('Content-Type', 'application/json') data = JSON.stringify(data) console.log(data) } } xhr.addEventListener('loadend', e => { if (/^2/.test(xhr.status)) { resolve(JSON.parse(xhr.response)) } else { reject(new Error(xhr.response)) } }) xhr.send(data) }) } ``` Promise可以实现链式调用,避免回调函数地狱问题 有async和await语法糖 ## 事件循环 宏任务通常是由浏览器环境提供的异步任务。常见的宏任务有`setTimeout`、`setInterval`、`setImmediate`(仅在 Node.js 中有)、I/O 操作、UI 渲染等。 微任务是由 JavaScript 引擎自身管理的异步任务。常见的微任务有`Promise.then`、`process.nextTick`(仅在 Node.js 中有)、`MutationObserver`等。 事件循环是一种机制,它持续检查调用栈是否为空,为空时先执行微任务队列直到清空,再从宏任务队列中取出一个宏任务放入调用栈执行,如此循环,以实现 JavaScript 的异步执行。 ## wang Editor 一个富文本编辑器插件 [快速开始 | wangEditor](https://www.wangeditor.com/v5/getting-started.html) ## Node.js模块 ### 一、HTTP 模块 ```js const http = require('http') // 创建服务器 const server = http.createServer((req, res) => { if (req.method === 'GET') { // 处理 GET 请求 res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end('This is a GET request') } else if (req.method === 'POST') { let body = '' // 接收 POST 请求的数据 req.on('data', (chunk) => { body += chunk.toString() }) req.on('end', () => { // 处理 POST 请求的数据 res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end(`This is a POST request with body: ${body}`) }) } else { // 处理其他请求方法 res.writeHead(405, { 'Content-Type': 'text/plain' }) res.end('Method Not Allowed') } }) // 监听端口 server.listen(3000, () => { console.log('Server is running on port 3000') }) ``` **解释**: - 首先使用 `http.createServer` 创建一个 HTTP 服务器,回调函数接收 `req`(请求)和 `res`(响应)对象。 - 根据 `req.method` 判断请求方法,若是 `GET` 请求,设置响应头并返回相应内容;若是 `POST` 请求,通过 `req.on('data')` 监听数据传输,将数据累加到 `body` 中,在 `req.on('end')` 时处理完整的数据;对于其他请求方法,返回 405 错误。 - 使用 `server.listen` 监听 3000 端口,并在监听成功时输出日志。 ### 二、Fs 模块 ```js const fs = require('fs') // 同步读取文件 try { const data = fs.readFileSync('example.txt', 'utf8') console.log(data) } catch (err) { console.error(err) } // 异步读取文件 fs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.error(err) return } console.log(data) }) // 写入文件(异步) fs.writeFile('output.txt', 'Hello, World!', (err) => { if (err) { console.error(err) return } console.log('File has been written successfully') }) // 使用流进行文件读取 const readStream = fs.createReadStream('example.txt') readStream.on('data', (chunk) => { console.log(chunk.toString()) }) readStream.on('end', () => { console.log('File reading completed') }) // 使用流进行文件写入 const writeStream = fs.createWriteStream('output.txt') writeStream.write('This is a streamed write.') writeStream.end() writeStream.on('finish', () => { console.log('File has been written using stream') }) ``` **解释**: - `fs.readFileSync` 同步读取文件,需处理可能的异常。 - `fs.readFile` 异步读取文件,通过回调处理结果或错误。 - `fs.writeFile` 异步写入文件,根据回调处理错误。 - `fs.createReadStream` 创建文件读取流,通过 `on('data')` 监听数据块,`on('end')` 表示读取完成。 - `fs.createWriteStream` 创建文件写入流,使用 `write` 方法写入数据,`end` 方法结束写入,`on('finish')` 表示写入完成。 ### 三、Path 模块 ```js const path = require('path') // 路径拼接 const fullPath = path.join(__dirname, 'subfolder', 'example.txt') console.log(fullPath) // 解析路径 const parsedPath = path.parse(fullPath) console.log(parsedPath) // 获取路径分隔符 const separator = path.sep console.log(separator) ``` **解释**: - `path.join` 将当前目录(`__dirname`)和 `subfolder` 及 `example.txt` 拼接成完整路径。 - `path.parse` 解析路径,返回包含根目录、目录、文件名等信息的对象。 - `path.sep` 获取系统的路径分隔符,在不同操作系统下不同(如 Windows 是 `\`,Unix 是 `/`)。 ### 四、Url 模块 ```js const url = require('url') const urlString = 'http://example.com:8080/path?query=string&key=value' const urlObj = url.parse(urlString, true) console.log(urlObj.protocol) // 协议 console.log(urlObj.host) // 主机和端口 console.log(urlObj.pathname) // 路径 console.log(urlObj.query) // 查询参数对象 // 格式化 URL const formattedUrl = url.format({ protocol: 'http', hostname: 'example.com', port: 8080, pathname: '/path', query: { query: 'string', key: 'value' } }) console.log(formattedUrl) ``` **解释**: - `url.parse` 将 URL 字符串解析为对象,`true` 表示将查询参数解析为对象。 - 可通过 `urlObj` 的属性获取 URL 的各个部分,如协议、主机、路径、查询参数等。 - `url.format` 将对象格式化为 URL 字符串。 ### 五、Buffer 模块 ```js const buffer = Buffer.from('Hello, Buffer') console.log(buffer.toString()) const buffer2 = Buffer.alloc(10) // 创建一个长度为 10 的空缓冲区 buffer2.write('Node.js') console.log(buffer2.toString()) const buffer3 = Buffer.allocUnsafe(10) // 创建一个未初始化的长度为 10 的缓冲区 buffer3.write('Buffer', 0, 6) console.log(buffer3.toString()) ``` **解释**: - `Buffer.from` 从字符串创建缓冲区并转换为字符串。 - `Buffer.alloc` 创建指定长度的已初始化缓冲区,可使用 `write` 方法写入数据。 - `Buffer.allocUnsafe` 创建未初始化缓冲区,需注意可能包含旧数据,使用时要谨慎,使用 `write` 方法可在指定位置写入数据。 ### 六、Events 模块 ```js const EventEmitter = require('events') const myEmitter = new EventEmitter() // 定义事件监听器 myEmitter.on('customEvent', (arg1, arg2) => { console.log(`Event occurred with arguments: ${arg1} and ${arg2}`) }) // 触发事件 myEmitter.emit('customEvent', 'Hello', 'World') ``` **解释**: - 使用 `EventEmitter` 类创建一个事件发射器实例。 - `on` 方法添加事件监听器,接收事件名和回调函数。 - `emit` 方法触发事件,并可传递参数,触发时调用相应的监听器函数。 ## CommonJS与ECMAScript ### CommonJS标准 一般应用在Node.js项目环境中 需求:定义utils.js模块,封装基地址和求数组总和的函数 使用`module.exports = {}`导出文件 ```js const baseURL = 'http://hmajax.itheima.net'//基地址常量 const getArraySum = arr => arr.reduce((sum,val) => sum += val , 0)//求和函数 module.exports = { 对外属性名1:baseURL,//此处自定义对外暴露的属性 对外属性名2:getArraySum }//向外导出 ``` 导入: `require('模块名或路径')` - 内置模块:直接写名字 - 自定义模块:写模块文件路径 ### ECMAScript标准 一般应用在前端工程化项目中 默认导出和导入 默认导出: export default 暴露模块对象 ```js export default{ //此处自定义对外暴露的属性 } ``` 导入语法:`import 变量名 from '模块名或路径'` 注意:Node.js默认支持 CommonJS标准语法,在运行模块所在文件夹新建`package.json`文件,并设置{"type" : "module"}(默认值是`commonjs`) Nodejs项目配置 命名导出和导入 命名导出: export 修饰==定义语句==(例如 `const baseURL = "http://any"`) 导入: `import {同名变量} from '模块名或路径'` 如何选择: 按需加载,使用命名导出和导入(有点类似于对象解构,只声明需要的属性导入) 全部加载,使用默认导出和导入 <br> <br> <br> # 其他 之后学习了Webpack,Git,Vue,React,echart,TS,小程序 见过的优化有包体积分析,分割代码块,异步懒加载,CDN分发三方包 学习了各种路由(Vue Router,React Router)和状态管理 其实大的收获可能就是经验加一些琐碎的模板(以后相关内容搜下笔记),如图: <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/gF1dGHmoEc05SKvU.webp" alt="image.png" width="100%" /> <br> 下面放一个react模板好了,这算是本人现有笔记中比较完整的模板了 ## 项目初始化 ### 使用vite创建项目 ```bash yarn create vite react template --template react ``` ### vite自动打开浏览器+端口配置 ```js //vite.config.js ... server: { host: '0.0.0.0', port: 8989, // 是否开启 https https: false, }, //package.json命令 "dev": "vite --open", ``` 运行启动,无误 ### 清理目录 删除样式和图标,App.js留个架子,index.html中清除图标引用,main.jsx中清除样式引用,重启无误 最终路径如下: ```bash │... │ └─src │ App.jsx │ main.jsx │ ├─api ├─assets ├─components ├─page │ └─NotFound │ index.jsx │ NotFound.css │ ├─router │ index.jsx │ ├─store │ │ index.jsx │ │ │ └─modules │ counter.jsx │ └─utils index.jsx request.jsx ``` ### 配置别名路径 路径解析配置: ```js //如果没有传入 path 片段,则 path.resolve() 将返回当前工作目录的绝对路径。 import { resolve } from 'path' const __dirname = resolve(); /**这样写也可以: * * import path from 'path'; * import { fileURLToPath } from 'url'; * const __dirname = path.dirname(fileURLToPath(import.meta.url)); * */ resolve: { // 设置文件./src路径为 @ alias: [ { find: '@', replacement: resolve(__dirname, './src') } ] } ``` 联想路径配置: ```json //jsconfig.json { "compilerOptions": { "baseUrl": "./", "paths": { "@/*": [ "src/*" ] } } } ``` 运行无误 ### VSCode配置setting ```json { //主题 "workbench.colorTheme": "One Dark Pro", "workbench.iconTheme": "vscode-icons", //保存代码时自动格式化(便于使用prettier插件) "editor.formatOnSave": false, // 删除文件时不弹出确认对话框 "explorer.confirmDelete": false, //默认终端和浏览器 "terminal.integrated.defaultProfile.windows": "Command Prompt", "open-in-browser.default": "Chrome", //使用空格,默认大小为2,自动换行,自动闭合括号 "editor.insertSpaces": true, "editor.tabSize": 2, "editor.wordWrap": "on", "editor.autoClosingBrackets": "always", //关闭JS代码校验 当保存的时候,使用eslint自动帮助我们修复错误 "editor.codeActionsOnSave": { "source.fixAll": "always" }, "javascript.validate.enable": false, //volar 是 vue3 的配套,vetur 是 vue2 的配套,这里用Vue3 // "[vue]": { // "editor.defaultFormatter": "Vue.volar" //和eslint校验冲突,应关闭 // }, // 使 JavaScript 支持 Emmet 开启Emmet补全 "emmet.includeLanguages": { "javascript": "javascriptreact" }, "emmet.triggerExpansionOnTab": true, // less 编译输出目录配置 "less.compile": { "out": "${workspaceRoot}\\css\\" }, //使用prettier格式化代码 // "editor.defaultFormatter": "esbenp.prettier-vscode" //有保存时自动修复,没必要 } ``` ### 配置代码校验 #### EditorConfig:(跨编辑器编码风格统一) > 对于VSCode,需开启EditorConfig for VS Code ```js // .editorconfig root = true [*] charset = utf-8 indent_style = space indent_size =2 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true //另起一行结束 [*.md] max_line_length = off trim_trailing_whitespace = false ``` #### prettier单独使用:(代码自动格式化工具) 对于VSCode,三步走 开启 Prettier - Code formatter , Editor: Default Formatter 设置为 Prettier - Code formatter Format On Save √ ```js // .prettierrc { "useTabs": false, "tabWidth": 2, "printWidth": 80, "singleQuote": true, "trailingComma": "none", //尾随逗号 "semi": false } ``` **使用命令格式化**: 不用插件,额外配置以下内容 ```js //package.json "prettier": "prettier --write ." //.prettierignore node_modules build .husky *.svg *.sh .local public ``` #### ESlint:(代码检查工具) > 使用prettier进行风格校验,prettier只设置配置项即可 如果项目空空如也,可以先执行`npx eslint --init` **安装** ```bash yarn add eslint-plugin-prettier eslint-config-prettier ``` **配置** ```js import js from '@eslint/js' import globals from 'globals' import react from 'eslint-plugin-react' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import eslintConfigPrettier from 'eslint-config-prettier' // 用于避免 ESLint 与 Prettier 的冲突 import prettier from 'eslint-plugin-prettier' // 用于将 Prettier 作为 ESLint 规则执行 export default [ { ignores: ['**/node_modules/', '**/.vscode/', '**/.husky/', 'dist'] }, { files: ['**/*.{js,jsx}'], languageOptions: { ecmaVersion: 2020, globals: globals.browser, parserOptions: { ecmaVersion: 'latest', ecmaFeatures: { jsx: true }, sourceType: 'module' } }, settings: { react: { version: '18.3' } }, plugins: { react, 'react-hooks': reactHooks, 'react-refresh': reactRefresh, prettier // 启用 Prettier 插件 }, rules: { // 添加默认的推荐规则 ...js.configs.recommended.rules, // React 相关的推荐规则 ...react.configs.recommended.rules, // React JSX 运行时相关的规则 ...react.configs['jsx-runtime'].rules, // React Hooks 推荐规则 ...reactHooks.configs.recommended.rules, // 关闭 "jsx-no-target-blank"(允许不加 rel="noopener noreferrer") // 'react/jsx-no-target-blank': 'off', // 禁止不必要的赋值 'no-useless-assignment': 'error', // React Refresh 只允许导出组件 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true } ], // Prettier 格式化规则,强制执行 Prettier 风格 'prettier/prettier': 'error' // 这里启用 Prettier 的代码风格检查 } }, // 通过直接添加 eslint-config-prettier 来禁用可能的冲突规则 eslintConfigPrettier // 禁用与 Prettier 冲突的 ESLint 规则 ] ``` ### 使用Husky工具管理版本提交 安装 ```bash yarn add husky -D npx husky init yarn add lint-staged -D #pre-commit修改 # yarn lint-staged ``` ```js #package.json配置 // 命令 "lint": "eslint . --fix", "lint-staged": "lint-staged", // 配置项 "lint-staged": { "*.{js,ts,jsx,tsx,vue}": [ ////不要漏掉jsx "eslint --fix" ] } ``` **报错** - Current directory is not a git directory!(初始化) - No staged files found. (提交暂存区) - No valid configuration found (配置项) ### 配置ReactRouter 安装依赖 ```bash yarn add react-router-dom@6 history@5 ``` 模板代码 ```js //@/router/index.jsx import App from '@/App' //很可能用不上,首页一般单独写layout组件,先占个位 import NotFound from '@/page/NotFound' //需要额外准备 import { createBrowserRouter } from 'react-router-dom' const router = createBrowserRouter([ { path: '/', element: <App /> }, { path: '*', element: <NotFound /> } ]) export default router //main.js import { createRoot } from 'react-dom/client' import { RouterProvider } from 'react-router-dom' import router from '@/router' createRoot(document.getElementById('root')).render( <RouterProvider router={router}></RouterProvider> ) ``` ### 配置Zustand **模板代码** ```js //store\modules\counter.jsx export const createCounterStore = (set) => { return { count: 0, inc: () => { set((state) => { return { count: state.count + 1 } }) } } } //store\index.jsx import { create } from 'zustand' import { createCounterStore } from './modules/counter' const useStore = create((...a) => { //剩余参数(剩余参数运算符) return { ...createCounterStore(...a) //数组展开(展开运算符) } }) export default useStore //App.jsx import useStore from './store' // import { useState } from 'react' function App() { // const [count, setCount] = useState(0) const { count, inc } = useStore() return ( <> <div>this is App</div> <span>{count}</span> <button onClick={inc}>+</button> </> ) } export default App ``` ### 配置axios ```js //request.jsx import axios from 'axios' export const request = axios.create({ baseURL: 'http://127.0.0.1:8888/api/', timeout: 5000 }) request.interceptors.request.use( (config) => { //请求前逻辑,加请求头,判断登录状态等等 return config }, (error) => { return Promise.reject(error) } ) request.interceptors.response.use( (config) => { //响应后逻辑,拆一层axios的包装等等 return config }, (error) => { return Promise.reject(error) } ) //index.jsx export { request as http } from './request' ``` # 得失总结 上半年个人计算机二级优秀+蓝桥杯B组省二,下半年做了很多前端的小练习,上线了很多练习项目 近期最大的收获,期末不挂科✅ <img src="https://pic.code-nav.cn/post_picture/1775871480282869762/0HmbQygYzOWUjlms.webp" alt="image.png" width="100%" /> 不过还是很多东西没做完 立了读书的目标,未达成,看久了视频教程就不太能读进去书了,尤其是理论书. 学习Linux使用未完成,半途而废(弄好的Java虚拟机近期也用不上),这个下学期肯定要继续的 五笔打字未完成,学会了理论,能打字,不过比起用微软双拼,五笔大概1-5秒一个字,慢太多了,就废弃了. 期末复习笔记本来要做的,不过不是很想看,就还是照期末冲刺留印象去了 英语零基础,期末考试完了就没再看过,也算废弃了. 对上线项目的管理不够标准,部分传码云,部分GitHub,部分free3v,还有部分干脆覆盖了,虽然都是课程里带着做的基础项目,不过还是挺可惜的. 还有就是本来想好好总结一下的,不过东西太多怕拖进度,就先点到为止了(关键的框架语法,表单规则和组件的一些总结都没做) 暂时想不起来更多了 # 学习打卡Day10 AI刷题一道√,今日冲总结,python停摆. 最后,提醒看到这里的各位大佬们——合理安排时间,享受健康生活。 向前\~向前\~向\~前\~\~!

下载 APP