《敏捷革命》读后感之一——我理解的Top2

前言

《敏捷革命》可以说是我近期一直都在拜读的书,结合近期工作的一些状况。对书中提到的很多观点、实践故事感触非常的大。

我所在的公司,推行敏捷可以说也有很多年了。可是,从读过这本书之后。自我感觉,我们前面都是浪费,是形而上学。用《敏捷革命》这本书的核心思想来看,那我们就是极大的浪费。完全没有贴近我们真正的目标,向着这个目标前进。

读过《敏捷革命》之后,我理解的最主要的核心思想就是:消灭浪费,提升效率。这八个字的思想,一直贯穿着整本书。

Top1:目标对齐

目标对齐必须要确保团队和客户的“真实需求”达成一致,团队的交付件要能够尽可能的贴近客户需要的。同时,对于个人来说,个人的目标必须要“时刻”和团队的目标保持一致。目标对齐就是个人对齐团队,团队对齐客户。为了避免浪费,必须进行充分的沟通和交流。同时,又通过一些关键的方式来确保目标的对齐。比如书中非常注重可以运行的交付件,通过不断地可交付的软件,来向客户展示团队的工作进展和交付件的完成的状态。通过这个showcase从而达到了向客户对齐目标的目的,书中也用“冲刺”来描述这个阶段。同时,这个“冲刺”的节点又不能太长。必须是在一个相对短的周期,就通过可以交付的软件向客户进行呈现。对比传统的软件开发流程,那种具有长长开发周期,而最后完成的软件在交付给客户,有可能就会发现很多都不是客户最想要的,从而会引发一系列的需求变更。导致这种状况的原因,可以说是客户需求不明,客户没有把明确的需求呈现出来。但是实际上,为什么不从流程或者制度上去入手考虑呢?敏捷的推行实际上就是这种流程的改变。它强调了软件开发中更多的客户互动,更多的客户目标的引导和对齐。通过短周期的冲刺,不断地呈现给客户交付的软件,一方面可以引导出客户深层次的需求(有可能客户自己也说不清楚需求),一方面还可以深入的挖掘客户的真实需求(这些功能到底是不是对客户有真正的价值,还只是客户想当然》),再一方面还可以发现潜在需求,这些潜在的需求往往是对客户价值最大的。因为它们往往可以为客户带来真正的变革,真正的急客户所需。

Top2:执行

执行可以说是最难做的一个环节,往往我们对与一些理论的知识或者观点都可以做到理解。但是在执行的时候,却发现真的没有那么简单。所谓知行合一,要做到这个境地真的非常的困难。借助本书中的观点和指导,我们只有不断地check,不断地去思考这么做是不是可以最好的解决手上的问题?书中已经为我们描述了方法:PDCA。

  1. Plan:拿到问题,首先需要分析。运用创造性的思维去分析,不局限于现在的条条框框中。例如,有技术上的限制,有工作流程的限制。但是,往往人们都会陷入在自己的现有“能力”框架下去思考问题。这个时候,必须要能够天马行空的去思考。也许一些非常nice的idea就会在这个时候迸发出来,并且会引领问题想着“卓越”目标前进。
  2. Do:有了nice的idea,就需要实际的去落地。这个时候,就是要突破个人的能力范围。运用各种条件去创造,去执行。需要不断地去尝试,不断地从失败中寻求突破。
  3. Check:审视,在完成了do之后,要停下来,对之前的plan+do的过程进行审视。这也是这个环节中最重要的一环。通过check,我们可以发现之前环节的问题,甚至是可以改进的地方。可以让我们及时修正下一步前进的方向,也就是向着目标(个人目标、团队目标)前进的一个方向上的修正。例如,plan中很好的,很nice的idea也许在do的时候会发现一些列的问题。也许,已经真的偏离了目标的方向。
  4. Action:check之后的行动,用《敏捷革命》中的理念,在check发现问题时,要立即进行修正。不能拖延,这个也是效率最高的修复手段。
以下是 **JDK 新特性相关的 Top 20 面试题**,覆盖从 **JDK 8 到 JDK 17(LTS)及 JDK 21(最新 LTS)** 的核心新特性。每道题均采用: ✅ **结构化答案**:定义 → 核心机制 → 特点 → 应用场景 🧠 **形象比喻记忆**:帮助你轻松理解并长期记住 --- ### 1. **JDK 8 中最重要的新特性有哪些?** - **定义**:JDK 8 是 Java 历史上最具革命性的版本之一。 - **核心特性**: - Lambda 表达式 - Stream API - 接口默认方 - Optional 类 - 新的日期时间 API(java.time) - 方引用 - **特点**:函数式编程支持、代码更简洁、并发处理更强。 - **应用场景**:集合操作、函数式接口设计、避免空指针。 🧠 **形象比喻**: JDK 8 就像给 Java 装上了“涡轮增压发动机”——老车(Java)突然变得敏捷、省油、智能驾驶(函数式编程)。 --- ### 2. **什么是 Lambda 表达式?它的语是什么?** - **定义**:一种简洁地表示可传递的匿名函数的方式。 - **语**:`(参数) -> { 表达式或语句块 }` ```java (x, y) -> x + y () -> System.out.println("Hello") ``` - **特点**: - 只能用于函数式接口(@FunctionalInterface)。 - 减少模板代码。 - **应用场景**:线程创建、集合遍历、事件监听。 🧠 **形象比喻**: Lambda 就像“一句话代办服务”:你说“帮我把快递放门口”,不用写完整合同(实现类),系统自动帮你办。 --- ### 3. **Stream API 有什么作用?集合的区别?** - **定义**:用于对数据源进行函数式操作的流水线工具。 - **核心机制**: - 源 → 中间操作(filter/map/sorted)→ 终端操作(collect/forEach/reduce) - **与集合区别**: | 区别 | 集合 | Stream | |------------|--------------------------|-------------------------| | 存储 | 存数据 | 不存储,只处理数据 | | 修改 | 支持增删改 | 不修改原数据 | | 惰性求值 | 否 | 是(中间操作不执行) | - **应用场景**:大数据过滤、统计、聚合分析。 🧠 **形象比喻**: 集合是“水库”,存着水;Stream 是“自来水厂流水线”——抽水 → 过滤 → 消毒 → 输出,全程不存水,只加工。 --- ### 4. **接口默认方是什么?为什么引入?** - **定义**:在接口中使用 `default` 关键字定义的具体方。 ```java public interface MyInterface { default void sayHello() { System.out.println("Hello"); } } ``` - **引入原因**: - 兼容旧代码:可在不破坏实现类的前提下扩展接口。 - 支持 Lambda(如 Collection 接口新增 stream() 方)。 - **特点**:可被实现类重写。 - **应用场景**:API 升级、框架扩展。 🧠 **形象比喻**: 以前接口是“纯图纸”,不能带工具;现在图纸上可以附赠一把螺丝刀(default 方),方便施工队(实现类)使用。 --- ### 5. **Optional 类的作用是什么?如何避免空指针?** - **定义**:一个容器类,代表一个值可能存在也可能不存在。 - **常用方**: - `Optional.ofNullable(obj)` - `opt.isPresent()` / `ifPresent(consumer)` - `opt.orElse(defaultValue)` - `opt.map(func)` - **优点**:显式处理 null,防止 NPE。 - **应用场景**:DAO 查询返回、配置读取。 ```java Optional<String> name = Optional.ofNullable(user.getName()); name.ifPresent(System.out::println); ``` 🧠 **形象比喻**: Optional 像“防碎包装盒”:快递员告诉你“里面可能有东西”,你必须打开确认(isPresent),而不是直接拆就摔了(NPE)。 --- ### 6. **新的日期时间 API(java.time)解决了什么问题?** - **定义**:JDK 8 引入的现代化日期时间库(LocalDateTime、ZonedDateTime、Duration 等)。 - **解决的问题**: - `Date` `Calendar` 是可变的、线程不安全。 - 时区处理混乱。 - API 设计不合理(月份从 0 开始)。 - **特点**: - 不可变对象,线程安全。 - 更直观的 API。 - **应用场景**:跨时区业务、日志时间戳、定时任务。 🧠 **形象比喻**: 旧 Date 类像“老式机械表”,不准还容易坏;java.time 是“智能手表”,自动校准、防水防震、全球同步。 --- ### 7. **方引用是什么?有哪几种形式?** - **定义**:Lambda 的简写,直接引用已有方。 - **四种形式**: 1. `类名::静态方` → `Integer::parseInt` 2. `对象::实例方` → `System.out::println` 3. `类名::实例方` → `String::length`(第一个参数作为调用者) 4. `构造器::new` → `ArrayList::new` ```java list.forEach(System.out::println); // 等价于 x -> System.out.println(x) ``` - **应用场景**:简化 Lambda 表达式。 🧠 **形象比喻**: 方引用就像“快捷方式图标”:双击图标(引用)等于运行程序(方),比重新写一遍命令更高效。 --- ### 8. **JDK 9 的模块化系统(JPMS)是什么?** - **定义**:Java Platform Module System,通过 `module-info.java` 定义模块依赖。 ```java module com.example.app { requires java.base; exports com.example.service; } ``` - **目的**: - 解决“JAR 地狱”问题。 - 实现强封装(private 包不可见)。 - 提升启动速度安全性。 - **应用场景**:大型项目解耦、微服务架构基础。 🧠 **形象比喻**: 以前 Java 是“大杂院”,谁都能进别人家;模块化后变成“封闭小区”,每栋楼有门禁(exports 控制访问)。 --- ### 9. **JDK 10 的局部变量类型推断(var)是什么?** - **定义**:使用 `var` 让编译器自动推断局部变量类型。 ```java var list = new ArrayList<String>(); // 推断为 ArrayList<String> ``` - **限制**: - 只能在方内使用。 - 必须初始化。 - 不能用于字段、参数。 - **优点**:减少冗余类型声明,提升可读性。 - **应用场景**:复杂泛型声明、流式编程。 🧠 **形象比喻**: `var` 就像“智能标签打印机”:你写下内容,它自动识别是文件还是药品,并贴上合适标签,省去手动填写。 --- ### 10. **JDK 11 中最实用的新特性有哪些?** - **核心特性**: - 字符串增强(`isBlank()`, `lines()`, `strip()`) - 文件读写便捷方(`Files.readString()` / `writeString()`) - HttpClient(标准库支持 HTTP/2 WebSocket) - 单文件运行:`java HelloWorld.java` - 删除了 Java EE CORBA 模块 - **特点**:轻量、现代、适合云原生。 - **应用场景**:脚本化开发、微服务通信。 🧠 **形象比喻**: JDK 11 像“精装修公寓”:自带厨房(HttpClient)、净水器(字符串工具)、即插即用(单文件运行),拎包入住。 --- ### 11. **JDK 14 中的 instanceof 模式匹配有什么改进?** - **定义**:允许在 `instanceof` 后直接声明变量并自动转换。 ```java if (obj instanceof String s) { System.out.println(s.toUpperCase()); } ``` - **旧写痛点**:需先判断再强转。 - **优点**:减少样板代码,提高安全性。 - **应用场景**:类型判断与转换频繁的场景。 🧠 **形象比喻**: 以前要“先验身份证 → 再开门”;现在刷脸进门同时知道你是谁(模式匹配一举两得)。 --- ### 12. **JDK 15 的密封类(Sealed Classes)是什么?** - **定义**:限制哪些类可以继承或实现某个类/接口。 ```java public sealed interface Shape permits Circle, Rectangle, Triangle {} ``` 子类必须用 `final`、`sealed` 或 `non-sealed` 修饰。 - **目的**:增强抽象控制力,替代枚举的部分功能。 - **应用场景**:领域模型设计、DSL 构建。 🧠 **形象比喻**: 密封类像“贵族俱乐部”:只有邀请名单上的家族(permits)才能加入,其他人一律禁止。 --- ### 13. **JDK 16 的记录类(Record)是什么?** - **定义**:一种特殊的类,用于**仅承载数据**的不可变对象。 ```java public record Point(int x, int y) {} ``` 自动生成:构造器、getter、equals、hashCode、toString。 - **特点**: - 隐式 final Serializable。 - 不能继承其他类(但可实现接口)。 - **应用场景**:DTO、POJO、函数返回值。 🧠 **形象比喻**: Record 就像“自动生成的合同模板”:填几个字段,立刻生成完整律文书(所有方),无需律师手写。 --- ### 14. **JDK 17 删除了什么重要功能?为什么?** - **删除内容**: - Applet API(已废弃多年) - Security Manager(将被移除) - **原因**: - Applet 被 HTML5 取代; - Security Manager 复杂且少用; - **影响**:标志着 Java 彻底告别浏览器插件时代。 - **趋势**:聚焦服务器端、云原生、高性能计算。 🧠 **形象比喻**: 删除 Applet 就像拆除“电话亭”——虽然曾经辉煌,但现在人人都有手机(Web 技术)。 --- ### 15. **JDK 21 的虚拟线程(Virtual Threads)是什么?** - **定义**:轻量级线程(预览特性 → 正式于 JDK 21),由 JVM 管理,数量可达百万级。 ```java try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10_000).forEach(i -> executor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; }) ); } ``` - **优势**: - 极大降低并发编程成本。 - 提高吞吐量(尤其 I/O 密集型)。 - **应用场景**:高并发 Web 服务(Spring Boot 6+ 支持)。 🧠 **形象比喻**: 平台线程是“私家车”,每人一辆堵马路;虚拟线程是“共享单车”,百万辆也不占道,随骑随停。 --- ### 16. **JDK 21 的结构化并发(Structured Concurrency)是什么?** - **定义**:将多线程任务视为一个整体结构,确保子任务与父任务生命周期一致。 - **目的**:简化错误传播、取消传播、资源管理。 - **特点**:基于 `StructuredTaskScope`,支持 fork/join 模式。 - **应用场景**:微服务调用聚合、异步结果合并。 🧠 **形象比喻**: 传统并发像“散养孩子”,各自乱跑;结构化并发是“亲子团”,导游统一管理,走失立即报警。 --- ### 17. **switch 表达式(JDK 12/14)相比旧版有何改进?** - **改进**: - 支持 `->` 替代 `break` - 可作为表达式返回值 - 多个 case 合并 ```java String day = switch (dayOfWeek) { case MONDAY, TUESDAY -> "工作日"; case SATURDAY, SUNDAY -> "周末"; default -> throw new IllegalArgumentException(); }; ``` - **优点**:更安全、更简洁。 - **应用场景**:状态机、路由分发。 🧠 **形象比喻**: 旧 switch 像“漏斗”,容易掉下去(忘记 break);新 switch 是“滑梯”,每个出口独立,不会串道。 --- ### 18. **文本块(Text Blocks)从哪个版本开始?解决了什么问题?** - **定义**:JDK 13 引入,使用 `"""..."""` 定义多行字符串。 ```java String json = """ { "name": "Alice", "age": 30 } """; ``` - **解决的问题**: - 多行字符串拼接麻烦。 - JSON/XML 字符串难维护。 - **特点**:保留格式、自动换行、支持 `\` 控制。 - **应用场景**:SQL、JSON、HTML 模板。 🧠 **形象比喻**: 文本块就像“富文本编辑器”:你可以自由排版一段话,而不是用 `\n` `+` 手动拼接。 --- ### 19. **yield 关键字在 switch 中的作用?** - **定义**:在 switch 表达式中用于返回值(替代 `break value;`)。 ```java int result = switch (op) { case "+" -> 1; case "-" -> -1; default -> { System.out.println("Unknown"); yield 0; } }; ``` - **特点**:只能在 `->` 风格的 switch 表达式中使用。 - **应用场景**:复杂逻辑分支返回值。 🧠 **形象比喻**: `yield` 就像“临时退场领取奖品”:你在表演中暂时退出舞台,拿完奖再回来继续演完。 --- ### 20. **Records + Sealed Classes 如何构建“代数数据类型”(ADT)?** - **定义**:用 `sealed` 接口 + 多个 `record` 实现穷尽的数据结构。 ```java public sealed interface Result<T> permits Success, Failure {} public record Success<T>(T data) implements Result<T> {} public record Failure(String msg) implements Result<Object> {} ``` - **优势**: - 类型安全。 - 易于模式匹配(switch exhaustive check)。 - **应用场景**:函数式编程、错误处理、解析器设计。 🧠 **形象比喻**: 这就像“俄罗斯套娃”:外层是密封盒子(sealed interface),里面只能放指定形状的小娃娃(records),一个都不能少。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值