程序员应该学开车

说实在的,过去从来也没有想到这辈子还会学会开车。没学会开车之前,有时做梦开车,只不过更像开飞机。现在学会开车了,结果经常做梦找不到车,或者找不到地方停车。:)
闲话少说,这会儿想说说开车和编程之间的关系。用我外公(抗战前就开车了,开了50年了)说:开车很简单,两分钟就能学会。但是要开好车,则需要一辈子。
几年前我学了开车,尽管不是两分钟就学会,但在同组的几个人中,学的是最快的(如果再早十年,就更快了,年纪小学东西快)。开车实际上是一个颇为复杂的并发操作,刚开始的时候总是让人手忙脚乱的(挨师傅骂,是非常正常的事)。
举个例子,开车到一个路口,打算右转弯。首先开方向灯,然后减速。但是不能随随便便地马上就能打把转向了。作为驾驶员,保证行人和自行车的安全是非常重要 的。于是,在打把之前,先得从右反光镜里观察右侧的非机动车。同时眼睛还要扫视车头右侧的人和自行车。在右前方没有阻挡的情况下,开始转弯。但这还没完, 因为减速,必须换档。如果垂直方向的道路是绿灯,那么还必须注意避让那个方向的车和人。还有一个小麻烦,驾驶室左前方的挡风玻璃立柱往往会影响视线,形成 盲区。有经验的驾驶员会不停地前后摇动头部,以避开立柱的遮挡。
综合起来讲,当你驾车在一个繁忙的十字路口右转的时候,往往是:左脚踩着离合器,右脚带着刹车,左手打方向,右手抓着排挡,头不停地转动,或前后摇动,视 线在右反光镜、车右侧和右前方、正前方、左前方这几个方位间不断地扫视。脑子当然不能闲着,高速运转,寻找车流和人流中的空隙,以便快速穿入。此时的司 机,就像一台跑着多线程的笔记本。
通常,人脑一个时刻只能处理一项任务。因此,我们初学的时候,基本上会把车开得七歪八扭。但随着练习时间的增加,这些动作慢慢地会融入我们的潜意识,渐渐地成为反射性的动作。于是,我们便学会了并发地开车。
当一个程序员编程的时候,有很多与开车相似的地方。比如我们编写一个程序,在一个窗口中绘制一些曲线图,我们实际上需要同时处理很多方面的问题。首先,我 们得对付语法,尽可能地回想起语法要点,以便编写出有用的代码。然后,我们必须调用系统服务,我们必须回忆起每个参数的类型、次序和含义。并且需要明确每 个参数和返回的约定。必要时还得对某些异常作出必要的处理。我们要尽可能多地回忆起预定义的常量、枚举或宏。我们还要竭力避免破坏代码的软件工程性,尽可 能做到DRY。为了实现程序,我们还必须明确图形构建的算法,以及色彩线条的设定。最重要的,还要尽力避免编写引发错误的代码。
在很多情况下,我们几乎同时处理着这些问题,时常让脑子超负荷。这也就是编软件累人的地方。
我们通过编程练习和开发活动不断地操练这些工作,最后就像开车那样把编程的基本技巧作为本能存储在大脑中,在未来的开发活动中使我们驾轻就熟。
至于为什么程序员应该学开车,那就很容易理解了。因为编程,还可以把某些不是顶顶要紧的工作放一放,比如DRY、错误处理等等,先完成功能再说。但开车, 只要疏忽了哪一项,便会引发事故。开车有助于训练人并发处理问题的能力。对于程序员,就更容易处理诸多相互混杂的编程要领了。
<think>嗯,用户的问题很有意思,ta注意到了黑马程序员说Servlet项目过时,但同时又知道Spring底层其实还是基于Servlet的,这看起来有点矛盾。用户应该是个有经验的Java开发者,至少对Web开发有基本了解,不然不会注意到这种框架底层实现的问题。 从用户引用的内容来看,ta可能正在学习Java Web开发,遇到了使用传统Servlet/JDBC/JSP技术的课程项目,但发现业界已经转向Spring框架。ta的困惑点在于:既然Spring底层还是Servlet,为什么说Servlet项目过时了? 需要区分清楚“技术过时”和“设计模式过时”的区别。Servlet作为规范当然没有过时,但直接裸写Servlet的开发方式确实已经不符合现代工程实践了。这就像虽然所有程序最终都转化成机器码执行,但我们不会因此就说汇编语言没过时。 用户引用的资料[1]提到老师教的购物系统课设使用“特别老的”Servlet+JDBC方式,这个“老”主要体现在三个方面:一是缺乏分层设计,业务逻辑和数据库操作混在一起;二是没有利用现代框架的声明式编程;三是前端还在用JSP这种服务端渲染技术。这些都是工程实践层面的落后。 特别要注意引用[3]强调的Servlet规范本质——它只是定义了处理网络请求的基本生命周期方法(init/service/destroy)。Spring的DispatcherServlet虽然也叫Servlet,但它通过精妙的设计把这个基础能力扩展成了完整的MVC框架,比如用HandlerMapping解耦请求路由,用@Controller注解代替硬编码的service()方法。 用户可能没意识到的是,现代框架的价值不在于取代底层,而在于提供更高抽象。就像开车不需要了解内燃机原理,用Spring的开发者也无需关心Servlet线程模型。但高手还是需要懂底层,所以引用[2]详细说明的Servlet生命周期知识依然重要。 最后要提醒的是,在微服务场景下(引用[4]),Servlet的应用方式也进化了。比如Spring Boot把Servlet容器嵌入应用,而Servlet本身更多作为传输层实现,业务逻辑完全由框架接管。这种架构下确实不需要开发者直接操作Servlet API了。</think>### 为什么黑马程序员称Servlet项目“过时”,而Spring Web层仍基于Servlet? #### 1. **“过时”的本质是开发模式,而非技术本身** - **原始Servlet开发的痛点** 如引用[1]所述,传统Servlet项目常存在以下问题: - **重复性代码**:每个Servlet需手动实现`service()`方法处理请求(引用[3]),导致大量模板代码(如请求参数解析、响应格式设置)。 - **低效的数据库操作**:直接使用`JDBC`而未封装(如引用[1]),需手动管理连接池、事务,易出错且维护难。 - **视图耦合**:JSP前端与后端逻辑强耦合(如引用[1]),难以实现前后端分离。 ```java // 传统Servlet示例:需手动处理请求参数和响应 protected void doGet(HttpServletRequest req, HttpServletResponse resp) { String param = req.getParameter("id"); // 手动解析参数 // 业务逻辑与JDBC操作混杂... resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); // 手动设置响应 out.print("<html><body>Result</body></html>"); } ``` *这种开发模式效率低、扩展性差,被业界视为“过时”实践[^1]。* - **Spring的优化本质** Spring并未淘汰Servlet,而是通过**抽象层**解决上述问题: - `DispatcherServlet`作为唯一入口(引用[4]),统一处理请求分发。 - 注解(如`@GetMapping`)自动绑定参数,无需手动解析。 - 依赖注入解耦业务逻辑与数据库操作(如Spring Data JPA封装JDBC)。 #### 2. **Spring如何基于Servlet实现现代化开发** | **传统Servlet痛点** | **Spring的解决方案** | **技术实现** | |---------------------------|-----------------------------------|---------------------------------------| | 手动处理请求/响应 | 声明式参数绑定 | `@RequestParam`, `@RequestBody`注解 | | 业务逻辑与Servlet耦合 | 控制器分层(Controller层) | `@Controller`分离业务与HTTP处理[^4] | | JDBC操作繁琐 | 数据库抽象层(如JPA) | Spring Data JPA自动管理事务和连接 | | JSP前后端耦合 | 前后端分离(RESTful API +前端框架)| `@RestController`返回JSON数据[^4] | - **关键设计**:`DispatcherServlet`通过**策略接口**(如`HandlerMapping`、`ViewResolver`)扩展Servlet功能,开发者只需关注业务逻辑[^4]。 #### 3. **为何Servlet技术未过时,但项目模式已过时** - **Servlet仍是基石**: Spring Boot内嵌Tomcat/Jetty(Servlet容器),所有请求仍通过Servlet API处理(引用[2][3])。 - **过时的是开发范式**: 直接使用Servlet API开发大型项目,如同用汇编语言写应用——底层可行,但效率低下。现代开发需借助框架提升生产力。 #### 4. **现代架构中的Servlet定位** - **微服务场景**: 即使使用Spring Cloud,服务仍运行在Servlet容器中。但开发者通过`WebFlux`(非阻塞模型)进一步优化性能,Servlet作为**可选项**存在。 - **核心价值保留**: Servlet的生命周期(`init()`→`service()`→`destroy()`)仍是Web应用的基础(引用[2][3]),只是框架隐藏了细节。 ### 总结 黑马程序员批评的“过时Servlet项目”,特指**未使用现代工程实践**(分层架构、声明式编程)的传统开发模式。Spring通过封装Servlet API,解决了原始开发的痛点,但底层仍依赖Servlet规范。**技术栈的演进本质是抽象层次的提升,而非底层技术的替代**。掌握Servlet原理(如生命周期[^2][^3])仍是深入理解Spring的关键。 --- ### 相关问题 1. **Servlet的生命周期方法(如`init()`, `service()`)在Spring MVC中如何被调用?** 2. **Spring Boot如何实现对Servlet容器的自动配置?** 3. **除了Spring,还有哪些框架基于Servlet构建?它们的设计差异是什么?**
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值