Home avatar

东东东尼君

东尼君的世界

Machine Learning 2026 Spring (李宏毅)

人工智能的发展正在经历一次深刻的范式转变。过去十年,机器学习的核心目标更多集中在训练一个能够完成特定任务的模型:给模型大量数据,通过优化算法调整参数,让模型学会分类、预测、生成文本或理解图像。然而,以 ChatGPT 为代表的大语言模型(Large Language Model, LLM)的出现,让 AI 的角色发生了变化:

AI 不再只是一个被动响应问题的模型,而正在逐渐成为能够规划、调用工具、持续学习并完成复杂任务的智能体(Agent)。

在这个快速演进的时代,我们不仅需要理解“如何使用模型”,更需要深入理解:

  • 一个 AI Agent 是如何构建的?
  • 大模型内部的 Transformer 架构如何支撑如此强大的能力?
  • 为什么模型推论速度如此重要?如何进行模型加速?
  • 当输入长度达到几十万甚至百万 Token 时,模型如何处理超长上下文?
  • 我们如何通过数据、反馈和训练方法教育模型?
  • 模型是否能够像人类一样持续学习,实现自我成长?

这些问题,正是李宏毅老师《Machine Learning 2026 Spring》课程试图探索的方向。本课程不再局限于传统机器学习中的监督学习、优化算法或模型训练流程,而是聚焦当前人工智能领域最前沿的问题:

  • AI Agent:让模型具备规划、推理和执行能力
  • 深入模型内部架构:如何优化推论效率
  • 超长上下文处理:探索模型面对海量信息时的能力边界
  • 模型教育(Teaching Models):研究如何通过数据、反馈和训练方法塑造模型行为
  • 模型自我成长(Model Self-Improvement):探索未来 AI 是否能够自主提升能力

希望通过这系列学习笔记,不只是记录课程内容,更希望从工程实践和系统设计的角度,理解现代 AI 系统背后的技术原理。

C# LINQ学习之旅:从集合操作到声明式编程

在C#的发展过程中,有一个非常重要的转折点,那便是从「如何操作数据」转向「描述想要什么数据」。在LINQ出现之前,我们通常需要通过循环、条件判断、临时变量等方式完成数据查询。例如:

1
2
3
4
5
6
7
8
9
List<User> result = new();

foreach (var user in users)
{
    if (user.Age > 18)
    {
        result.Add(user);
    }
}

而LINQ提供了一种完全不同的思考方式:

1
var result = users.Where(x => x.Age > 18);

我们不再关注如何遍历集合,而关于我需要哪些数据,这就是LINQ带来的核心变化:从命令式编程(Imperative Programming)转向声明式编程(Declarative Programming),本文将记录了学习LINQ的过程。

从LevelDB CMakeFiles.txt开始学习CMake:C++项目构建系统入门

最近开始阅读LevelDB源码,希望通过源码理解一个优秀 C++ 项目的工程设计。当我打开LevelDB项目目录时,发现CMakeLists.txt几乎贯穿整个项目,但是我之前并没有怎么使用过CMake。CMakeLists.txt的内容让我有点无法理解。于是产生了几个问题:

  • CMake是什么?
  • 为什么C++项目需要CMake?
  • CMake和Make有什么区别?
  • CMakeLists.txt如何组织一个大型项目?

带着这些问题,开始学习CMake。

rustnet源码剖析:从零学习Rust构建网络监控工具

学习一门语言最有效的方式或许并不是从语法手册开始,而是通过一个真实项目理解语言的奥秘。因此,我选择了rustnet作为Rust学习的入口。rustnet是一个基于Rust实现的网络监控工具,它涉及网络连接管理、数据包捕获、协议解析、异步处理,包含了大量Rust在系统编程中的典型应用场景。因此,这次源码剖析不仅仅是为了理解rustnet的实现细节,更重要的是希望通过这个项目逐渐建立Rust的使用方法和工程思维。本文将会采用问题驱动的方式,从程序入口开始,逐步探索项目架构、核心模块、关键技术实现,逐步理解Rust设计背后的理念。希望通过这次源码阅读之旅,能够从一个Rust小白的视角,逐渐掌握Rust的核心思想,并最终具备阅读和参与大型Rust项目的能力。

douyin源码剖析:Vue3 + Pinia仿抖音工程实践

很多时候,我们学习了一个前端框架,更多停留在API使用层面:知道如何创建组件、如何调用生命周期、如何进行状态管理,却很少去思考一个真实的大型项目是如何组织代码、如何设计组件体系、如何管理复杂业务逻辑,以及如何将Vue的能力真正应用到工程实践中。因此,我选择了douyin作为学习对象。该项目基于Vue技术栈实现了一个仿抖音Web应用,在Github上已收获了11.5k Star。相比简单的Demo项目,它更加接近真实业务场景,设计页面架构设计、组件拆分、状态管理、接口交互、性能优化以及前端工程化等多个方面。

通过对该项目源码的阅读与分析,我希望不仅仅了解“Vue怎么用”,更进一步探索:

  • 一个成熟的Vue项目的目录结构是如何设计的?
  • 页面、组件、工具类以及业务逻辑之间如何划分职责?
  • Vue的响应式系统、组件机制、生命周期等核心能力在真实项目中如何发挥作用?
  • 一个受到社区认可的开源项目,在代码规范、工程组织以及架构设计方面有哪些值得借鉴的地方?

这篇源码剖析文章并不是简单介绍项目如何运行,而是希望站在学习者的角度,通过阅读源码逐步回答这些问题,从项目整体架构开始,深入到关键模块实现,理解一个Vue项目背后的设计思想。于我而言,这也是一次从“Vue使用者”向“Vue工程实践”的美妙之旅,希望通过分析这个项目,建立对现代前端项目架构和工程化实践更加系统的认识。

Design Patterns in C# and .NET (Dmitri Nesteruk)

设计模式(Design Patterns) 是软件工程中用于解决特定设计问题的经典方案,也是面向对象设计能力的重要体现。然而,很多开发者在学习设计模式时,往往停留在「记住二十三种模式」的层面,却很难理解为什么需要某种模式、它解决了什么问题,以及在现代 .NET 项目中应该如何使用。为了更系统地掌握设计模式,我选择学习Dmitri Nesteruk的在线课程Design Patterns in C# and .NET。该课程并非简单介绍GoF(Gang of Four)的 23 种设计模式,而是从设计原则出发,结合大量 C# 示例,深入讲解各种模式的设计思想、适用场景、优缺点以及不同模式之间的联系,并讨论现代 C# 语言特性对传统设计模式的影响。

本篇文章将作为我的课程学习笔记,也是对整个课程内容的一次系统梳理。文章不会局限于对每个模式的定义进行罗列,而是围绕以下几个问题展开:

  • 为什么会出现这个设计模式?
  • 它解决了什么设计问题?
  • 它的核心思想是什么?
  • 在 C#/.NET 中通常如何实现?
  • 它有哪些优点、缺点以及适用场景?
  • 与其他设计模式之间有什么联系与区别?

希望通过这篇文章,不仅能够完整记录自己的学习过程,也能够帮助读者从设计思想而非模式名称的角度理解设计模式,在实际项目中真正做到根据问题选择设计,而不是为了使用模式而使用模式。

MongoDB权威指南 第3版 (Shannon Bradshaw / Eoin Brazil / Kristina Chodorow)

MongoDB 是当前最流行的 NoSQL 数据库之一,它采用文档模型存储数据,通过灵活的数据结构、高性能的索引机制以及完善的分布式能力,广泛应用于互联网应用、大数据处理和实时业务场景。但想真正理解 MongoDB,仅仅掌握 CRUD 操作和查询语法是不够的。MongoDB 背后涉及许多数据库核心概念:文档模型设计、BSON存储、索引原理、WiredTiger存储引擎、MVCC并发控制、副本集以及分片架构等。本文将结合《MongoDB权威指南》,从使用实践逐步深入底层原理,探索 MongoDB 的设计思想以及它如何解决现代应用中的数据存储和扩展问题。

C#编程实践(三):Modbus协议从入门到实战

在工业自动化领域,无论是 PLC、HMI、变频器、伺服驱动器、仪器仪表,还是机器视觉设备,你经常会看到Modbus的身影。例如:PLC与上位机通信、PLC与上位机通信、PLC与IO模块通信等等。几乎所有的工业设备都会支持Modbus。在初次接触Modbus后,产生了很多疑问:

  • 什么是Modbus?
  • RTU和TCP有什么区别?
  • 主站和从站是什么意思?

本文将采用问题驱动的方式,带你一步步理解Modbus。

C#编程实践(二):从SerialPort到工业级通信框架设计

在现代工业化设备中,串口通信大量存在。例如:PLC通信、伺服驱动器、扫码枪、光源控制器、温控器等等。虽然现在Ethernet、TCP/IP越来越普及,但串口因为成本低、稳定、硬件简单等原因,仍然是工业现场最常见的通信方式之一。很多开发者初次接触串口通信,会觉得非常简单:

1
2
3
4
5
6
7
8
SerialPort serialPort = new();

serialPort.PortName = "COM3";
serialPort.BaudRate = 9600;

serialPort.Open();

serialPort.Write("Hello");

但是在实际工业项目中,很快会遇到为什么收到的数据经常不完整?为什么一次Read读不到完整协议?如何设计一个可扩展通信系统?真正困难的不是打开串口,而是:

如何设计一个可靠的串口通信系统。

shadowsocks-windows源码剖析:一个C#网络代理客户端是如何工作的?

shadowsocks-windows是一个经典的C#网络代理客户端项目,它将SOCKS5代理、TCP/UDP Relay、加密通信、系统代理管理以及Windows桌面应用结合在一起。本文通过问题驱动的方式阅读源码,深入分析其架构设计、网络通信模型以及C#工程实践,探索一个成熟的开源项目是如何实现高性能、稳定的网络代理能力。

C#编程实践(一):深入System.Net.NetworkInformation获取系统网络信息

在工业软件、设备控制系统、网络诊断工具开发中,经常需要获取当前计算机的网络状态,例如:

  • 当前有哪些网卡?
  • 网卡是否连接?
  • IP地址是多少?
  • MAC地址是多少?
  • 网络连接速度是多少?
  • DNS、网关、DHCP信息是什么?

.NET提供了一个非常方便的命名空间System.Net.NetworkInformation,其中核心类:

作用
NetworkInterface 获取网卡信息
IPInterfaceProperties 获取 IP 配置
IPAddressInformation 获取 IP 地址状态
PhysicalAddress 获取 MAC 地址
NetworkChange 监听网络变化

本文将系统介绍如何使用这些API构建一个网络信息采集工具。

代码整洁之道 (Robert C. Martin)

在软件开发过程中,代码并不是写完提交之后就结束了。一个项目真正的生命周期,往往伴随着持续的修改、扩展和维护。需求会不断变化,新的功能会不断加入,原本简单的模块可能逐渐变得复杂。如果代码经过良好的设计和整理,随着时间推移,系统会慢慢演变成难以理解、难以修改,甚至无人敢触碰“遗留代码”。

正如软件工程领域常说的一句话:

代码的第一读者是人,第二读者才是机器。

计算机只关心代码是否能够正确运行,而开发人员需要面对代码背后的意图、结构以及未来变化的可能性。一段能够运行的代码,并不一定是一段优秀的代码。

由Robert C. Martin(人称Uncle Bob)编写的《代码整洁之道》正是围绕这一问题展开讨论。本书从变量命名、函数设计、类的职责划分,到错误处理、测试、架构设计等多个方面,系统总结了如何编写更加清晰、可维护的软件代码。

书中提出:

“Clean code always looks like it was written by someone who cares.”

优秀的代码不仅仅是满足需求,更体现了开发者对软件质量的关注。在实际开发中,我们经常会遇到这样的代码:

  • 一个几百行甚至上千行的函数
  • 一个承担几十种职责的巨大类
  • 大量重复逻辑散落在项目各处
  • 修改一个小需求,却需要影响多个模块
  • 新成员接手项目,需要花费大量时间理解代码

这些问题并不是某一天突然出现的,而是在一次次“先实现功能,以后再优化”的过程中逐渐累积形成的。《代码整洁之道》提供了一套思考方式:

  • 如何通过命名让代码表达真实意图
  • 如何设计短小、专注的函数
  • 如何让类保持单一职责
  • 如何降低模块之间的耦合
  • 如何通过测试保护代码质量
  • 如何让软件具备持续演进的能力

学习整洁代码,并不是为了追求代码形式上的“漂亮”,而是为了降低软件长期维护的成本,让系统能够面对未来的不确定变化。在本文中,我将结合书中的核心思想,并结合实际工程开发中的案例,对《代码整洁之道》进行深入学习和总结,希望能够探索:

什么样的代码才是真正适合长期维护的软件代码?

NETworkManager源码剖析:一个网络管理工具的实现细节

在 GitHub 闲逛时,我偶然发现了NETworkManager这个开源项目。作为一款网络管理和故障排查工具,它已经积累了超过 8.5k Star,足以说明社区对它的认可。更让我感兴趣的是,这个项目采用 C# + WPF 进行开发,与我当前正在深入学习和实践的技术栈高度契合。因此,我产生了一个想法:通过深入分析 NETworkManager 的源码,探索一个成熟的 WPF 桌面应用是如何进行架构设计、模块划分以及工程实践的。接下来,我将以 NETworkManager 为切入点,逐步拆解它在 WPF UI 设计、MVVM 架构、依赖注入、配置管理、网络通信、异步编程以及工程化实践 等方面的实现,希望能够从优秀的开源项目中学习桌面应用开发的最佳实践。