汇总
second
关系型数据库&非关系型数据库
docker是什么? 其原理是?
基于 Linux 内核特性的容器引擎。把应用和依赖打包成镜像,跑起来是进程级隔离的容器,不带独立内核。
三根支柱
- Namespace 管隔离:PID / Network / Mount / UTS / IPC / User,让容器以为自己独占一台机器
- Cgroups 管限制:CPU、内存、IO 配额,防止单个容器吃满宿主
- UnionFS 管镜像分层:镜像是只读层叠加,容器启动时在顶上加一个可写层,写时复制,所以层可共享、启动秒级
三个概念
- 镜像:模板,Dockerfile 每条指令生成一层
- 容器:镜像的运行实例
- 仓库:存镜像,Docker Hub / Harbor
和虚拟机的区别
- VM 虚拟化硬件,每台带完整 OS 和内核,启动分钟级、GB 量级
- 容器共享宿主内核,启动秒级、MB 量级,代价是隔离性弱一些,且不能跨内核(Docker Desktop 底下其实跑着一个 Linux 虚拟机)
常用:Dockerfile 构建、compose 编排多容器、volume 做持久化、bridge 网络让容器互通,集群调度交给 K8s。
agent是什么? 其原理是?
以 LLM 为决策核心、能调用外部工具、在循环里自主完成多步任务的程序。相比单轮问答,它有状态、能行动、能根据执行结果修正下一步。
核心是一个循环(ReAct)
- 系统提示 + 工具定义 + 历史消息一起发给模型
- 模型输出下一步:直接回答,或返回 tool_call(工具名 + JSON 参数)
- 外层程序真正执行这个工具,读文件、查库、调 API、跑命令
- 执行结果作为新消息追加回上下文
- 回到第 1 步,直到模型不再要工具或触发步数上限
模型本身不执行任何东西,它只输出”我想调什么”,执行权在外层 harness 手里。
四个组成
- 规划:拆解目标,复杂任务用 CoT、反思、子 agent
- 工具:用 JSON Schema 描述函数签名,模型按 schema 填参
- 记忆:短期靠上下文窗口,长期靠向量检索或落盘文件
- 反馈:结果和报错回灌上下文,形成闭环
工程上的坑:上下文窗口有限,长任务要压缩历史;工具要幂等且做权限白名单;必须设最大步数防死循环;模型填的参数要校验再执行。
给你一个项目, 如何在这个项目的基础上添加新的功能? (实际操作)
六步:跑起来、读范式、设计、通链路、自测、提交。
1 先跑起来,别急着写代码
- README 和 pom.xml 摸清技术栈、依赖了哪些中间件(MySQL、Redis、MQ、注册中心)
- 本地完整启动一次,确认基线是干净的,后面出问题才能确定是自己引入的
- 顺手跑一遍已有测试
2 摸清项目的既有范式(最关键)
- 从启动类进去看分层:controller / service / mapper / entity / config
- 挑一个和新功能最像的现有功能,从接口入口一路读到 SQL
- 重点记四件事:统一响应体、全局异常怎么抛、参数校验怎么做、日志怎么打
目的是让新写的代码看起来像原作者写的,而非塞进个人风格。
3 设计
- 先查现成实现:官方文档定接口语义,同类开源项目看数据模型和踩坑,通用能力直接引依赖
- 需求边界:输入输出、异常场景、并发量级
- 数据层:新建表还是老表加字段,索引怎么建,历史数据要不要刷
- 接口层:URL、请求响应结构、错误码复用项目现有体系
- 影响面:会动到哪些老逻辑,要不要加开关兜底
4 拉分支,先打通最小闭环
git checkout -b feature/xxx,不在 main 上直接写- Controller 先返回假数据,Postman 打通,确认路由、拦截器、鉴权这条链路是活的
- 链路通了再从下往上填逻辑:Entity → Mapper → Service → Controller
- 先通链路再填逻辑,能把框架配置问题和业务逻辑问题隔离开,debug 快很多
5 自测三件套
- 单测:Service 层用 Mockito mock 掉 Mapper,测核心分支
- 接口:正常、异常、边界值(空值、超长、重复提交)各打一遍
- 回归:相关的老接口再跑一遍,确认没改坏
6 提交
- commit 按项目规范,例如
feat: 新增文章点赞功能 - MR 写清三句话:改了什么、为什么这么改、怎么测的
- Review 过了再合
实例:给博客加文章点赞。先读收藏功能的完整实现,跟着它的 Result<T> 和 @Valid 写;点赞表用 (user_id, article_id) 联合唯一索引防重复;计数走 Redis INCR 扛高频写,定时任务异步刷回 MySQL。
三个易踩的坑:改了 MySQL 忘删 Redis 留下脏数据;@Transactional 里套远程调用把事务占死;漏唯一索引或分布式锁导致重复提交写脏。
如何看待 Java和python
两门语言定位不同,谈不上谁替代谁。
- 类型系统:Java 静态强类型,编译期就能抓错,重构有保障;Python 动态类型写得快,项目一大要靠 type hints 加 mypy 补
- 运行方式:Java 编译成字节码跑在 JVM 上,JIT 把热点代码编成机器码,性能接近原生;Python 解释执行,有 GIL,多线程吃不满多核
- 并发:Java 有线程池、JUC、虚拟线程,天生适合高并发服务端;Python 用 asyncio 扛 IO 密集,CPU 密集只能上多进程
- 生态:Java 占企业级后端和大数据基建,Spring、Netty、Kafka、Flink;Python 占 AI 和数据科学,PyTorch、NumPy、pandas
- 工程性:Java 啰嗦但约束强,适合多人长期维护;Python 简洁自由,适合快速验证和脚本