欢迎来到编程世界

沉淀知识,打磨技艺,成为一名优秀的软件工程师。这里记录我的学习历程、技术思考和实战经验。

近期更新

  • 深入理解 JavaScript 闭包与作用域链
  • React Hooks 性能优化实战指南
  • Node.js 高并发架构设计思路
  • 数据结构与算法刷题日记 (Day 30)

学习目标

  • 掌握至少一门主流前端框架 (React/Vue)
  • 熟练使用至少两门后端语言 (Node/Python)
  • 刷完 LeetCode Top 200 经典题目
  • 独立设计并实现一个全栈 Web 应用

高效编程学习法

科学的学习方法能让你事半功倍,少走弯路,更快掌握编程技能。

费曼学习法

如果你不能向一个6岁小孩解释清楚某个概念,那你就没有真正理解它。

  • 第一步:选择概念 - 选择一个你想学习的编程概念,如"闭包"或"递归"
  • 第二步:教学 - 尝试用最简单的语言教给一个假想的初学者
  • 第三步:查漏补缺 - 发现解释不清的地方,就是你的知识盲区
  • 第四步:简化 - 使用类比和简单例子,让解释更加通俗易懂
// 用费曼法理解递归 function factorial(n) { // 基线条件:最简单的情况 if (n === 1) return 1; // 递归条件:将问题分解为更小的同类问题 return n * factorial(n - 1); } // 就像俄罗斯套娃,一层层拆开,直到最小的那个

项目驱动学习

不要为了学而学,要为了解决问题而学。

  • 从兴趣出发 - 选择一个你真正感兴趣的项目,比如游戏、工具或网站
  • 分解任务 - 将大项目拆解为可执行的小任务,每天完成一部分
  • 遇到问题再学 - 遇到不懂的技术点再去学习,这样记忆更深刻
  • 完成比完美重要 - 先做出最小可行产品(MVP),再逐步优化

推荐项目:待办清单、天气应用、个人博客、电商网站

间隔重复法

利用遗忘曲线规律,合理安排复习时间,巩固所学知识。

  • 学习后24小时内 - 第一次复习,强化短期记忆
  • 3天后 - 第二次复习,防止遗忘
  • 1周后 - 第三次复习,转化为长期记忆
  • 1个月后 - 第四次复习,永久记忆

可以使用 Anki 等记忆软件辅助实践间隔重复,制作编程知识点卡片。

社群学习法

加入技术社区,与他人一起学习,互相促进。

  • 参与开源项目 - 在 GitHub 上贡献代码,学习他人优秀实践
  • 技术博客 - 写博客记录学习过程,教是最好的学
  • 技术论坛 - 在 Stack Overflow、掘金等平台提问和回答问题
  • 线下活动 - 参加技术 Meetup、讲座和研讨会

编程实战技巧与规范

这些实用技巧能显著提高你的编码效率和代码质量。

高效 Debug 策略

遇到 Bug 不要盲目试错,要有科学的方法:

  • 复现原则:确保你能稳定复现 Bug,这是定位问题的第一步
  • 二分法排查:在代码中逐步注释或删除部分逻辑,缩小问题范围
  • 阅读报错堆栈:不要只看第一行,顺着堆栈信息找到源头文件
  • 打印日志:使用 console.log 或 debugger 语句检查中间变量状态
// 调试技巧示例 function calculateTotal(items) { console.log('输入参数:', items); // 检查输入 let total = 0; for (let item of items) { console.log('当前item:', item); // 检查循环中的每个元素 total += item.price * item.quantity; } console.log('计算结果:', total); // 检查最终结果 return total; }

代码可读性与规范

写出"看起来像专家写的"代码:

  • 命名规范:变量用名词(userInfo),函数用动词(getUserData)
  • 单一职责:一个函数只做一件事,超过 50 行代码就要考虑拆分
  • 避免魔法数字:使用常量代替散落在代码里的数字
  • 注释原则:解释"为什么"这么做,而不是"做了什么"
// ❌ 糟糕的命名 let d; // 这是什么意思? function process(x, y) { ... } // ✅ 好的命名 let daysSinceLastLogin; function calculateTotalPrice(unitPrice, quantity) { ... } // ❌ 魔法数字 if (user.age > 18) { ... } // ✅ 使用常量 const ADULT_AGE = 18; if (user.age > ADULT_AGE) { ... }

Git 高频操作技巧

提升团队协作效率:

  • 查看提交记录: git log --oneline --graph --decorate
  • 撤销暂存区: git reset HEAD <file>
  • 修改最后一次提交: git commit --amend
  • 临时保存更改: git stash / git stash pop
  • 清理未追踪文件: git clean -fd (慎用!)

数据库优化技巧

提升数据库性能的关键点:

  • 索引优化:为经常查询的列创建索引,但不要过度索引
  • 查询优化:避免使用 SELECT *,只查询需要的字段
  • 连接池:使用数据库连接池,避免频繁创建连接
  • 分页查询:大数据量时使用 LIMIT 和 OFFSET 分页
-- ❌ 低效查询 SELECT * FROM users WHERE name LIKE '%张%'; -- ✅ 高效查询 SELECT id, name, email FROM users WHERE name = '张三';

数据结构与算法

算法是编程的核心,掌握常见算法和数据结构能提升解决问题的能力。

核心数据结构

理解各种数据结构的特点和适用场景:

  • 数组(Array):连续内存,随机访问快(O(1)),插入删除慢(O(n))
  • 链表(LinkedList):非连续内存,插入删除快(O(1)),访问慢(O(n))
  • 栈(Stack):后进先出(LIFO),用于函数调用、撤销操作
  • 队列(Queue):先进先出(FIFO),用于任务调度、BFS
  • 哈希表(HashTable):键值对,O(1)查找,用于处理映射关系
  • 树(Tree):层次结构,用于文件系统、DOM、数据库索引
// 实现一个简单的链表节点 class ListNode { constructor(val, next = null) { this.val = val; this.next = next; } } // 使用示例 const node1 = new ListNode(1); const node2 = new ListNode(2); node1.next = node2; // 1 -> 2

常见排序算法

比较各种排序算法的性能:

  • 冒泡排序: O(n²),稳定,简单但效率低
  • 选择排序: O(n²),不稳定,每次选最小的元素
  • 插入排序: O(n²),稳定,适合小规模数据
  • 快速排序: O(n log n),不稳定,平均性能最好
  • 归并排序: O(n log n),稳定,需要额外空间
  • 堆排序: O(n log n),不稳定,原地排序

实际应用:快速排序通常是首选,对于稳定性要求高的场景用归并排序。

动态规划入门

动态规划是解决最优化问题的利器:

  • 定义状态: dp[i] 表示什么含义
  • 状态转移: 如何从已知状态推导新状态
  • 初始化: 边界条件是什么
  • 计算顺序: 自顶向下还是自底向上
// 斐波那契数列 - 动态规划解法 function fibonacci(n) { if (n <= 1) return n; const dp = [0, 1]; // 初始化 for (let i = 2; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; // 状态转移 } return dp[n]; } // 时间复杂度 O(n),空间复杂度 O(n)

刷题策略

高效刷 LeetCode 的方法:

  • 按类型刷题:先集中刷一类题,掌握套路后再换
  • 五分钟思考法:想不出解法就去看题解,不要浪费太多时间
  • 一题多解:尝试用不同方法解决同一道题
  • 定期复习:一周后重做之前的题目,巩固记忆
  • 总结模板:整理常见算法的代码模板

推荐刷题顺序:数组 → 链表 → 栈/队列 → 哈希表 → 二叉树 → 动态规划

实战项目记录

通过实际项目应用所学知识,积累实战经验。

电商后台管理系统

基于 React + Ant Design + Node.js 的全栈应用

  • 用户认证:JWT 实现无状态登录,Token 过期自动刷新
  • 权限控制:RBAC 模型,不同角色看到不同菜单和功能
  • 数据可视化:ECharts 实现销售数据图表展示
  • 文件上传:阿里云 OSS 存储商品图片,支持拖拽上传

收获:掌握了前后端分离开发、RESTful API 设计、数据库建模

微信小程序博客

使用原生小程序框架 + 云开发

  • Markdown 渲染:使用 wxParse 解析 Markdown 内容
  • 评论系统:云数据库存储评论,支持回复功能
  • 搜索功能:云函数实现全文搜索,高亮关键词
  • 订阅消息:新评论时发送模板消息通知管理员

高并发秒杀系统

使用 Redis + RabbitMQ 解决高并发问题

  • 缓存预热:活动开始前将商品信息加载到 Redis
  • 库存扣减:Redis 原子操作防止超卖
  • 异步下单:RabbitMQ 削峰填谷,异步处理订单
  • 限流防护:Nginx 限流,防止恶意请求
// Redis 原子操作示例 // 使用 Lua 脚本保证原子性 local key = KEYS[1] local decrement = tonumber(ARGV[1]) local current = tonumber(redis.call('get', key) or '0') if current >= decrement then redis.call('decrby', key, decrement) return 1 -- 成功 else return 0 -- 失败 end

关于博主

热爱技术,享受代码带来的创造乐趣。分享不仅是输出,更是自我梳理的过程。

技能栈

  • 前端:JavaScript(ES6+), TypeScript, React, Vue3, Next.js
  • 后端:Node.js(Koa/Express), Python(Flask/Django), Java(Spring Boot)
  • 数据库:MySQL, MongoDB, Redis, PostgreSQL
  • DevOps:Docker, Nginx, Linux, CI/CD, 阿里云/腾讯云
  • 工具:Git, Webpack, Vite, VS Code, Postman

学习理念

"Talk is cheap. Show me the code." —— Linus Torvalds

  • 始终保持初学者心态,永远在路上
  • 代码不仅要能运行,还要优雅、可维护
  • 技术服务于业务,解决实际问题才是王道
  • 分享是最好的学习方式,教是最好的学

联系我

如果你有任何问题或想交流技术,欢迎通过以下方式联系我:

  • 邮箱: coder@example.com
  • GitHub: github.com/coding-notes
  • 掘金: juejin.cn/user/coding-notes
  • 知乎: zhihu.com/people/coding-notes

学习进度

2026年学习计划完成情况:

  • ✅ 完成 React 源码学习
  • ✅ 刷完 LeetCode Top 100 题
  • 🔄 正在学习分布式系统设计
  • ⏳ 计划学习 Go 语言