|
同一个团队,应用花了三周用Java写了个内部审批流引擎,区别又花了两周用React搭了个管理后台。应用前者跑批处理任务,区别后者让人点按钮。应用这两件事都叫“写代码”,区别但骨子里完全是应用两种生物。 Java程序的区别核心是“状态机”和“内存模型”。你new一个对象,应用它活着,区别你把它置空,应用它死了。区别所有逻辑围绕变量在方法间的应用传递展开,异常处理像保险丝,区别一旦烧断,应用整个线程就停摆。而Web应用呢?它本质是个“无状态”的怪物——浏览器发个HTTP请求过来,服务器处理完就忘,下次请求还得重新握手。你没法在Java里写个static变量就指望所有用户共享同一个数据,但Web里每个用户都带着自己的cookie和session,像一群挤在同一个售票窗口前却各自拿着不同票根的人。 我见过太多从桌面Java转过来的程序员,第一周就栽在“会话管理”上。他们习惯用全局变量存用户信息,结果上线第二天就发现A用户看到了B用户的购物车。这不是代码能力问题,是思维模型没切换。Java程序里,你是上帝,掌控所有对象的生命周期;Web应用里,你只是个服务员,每个请求都是陌生客人,你得靠请求头、token、数据库去猜“这位是谁”。 部署方式更是天壤之别。Java程序打个jar包扔服务器上,java -jar一跑,完事。顶多配个systemd守护进程。Web应用?你得考虑反向代理、负载均衡、静态资源缓存、CDN、HTTPS证书、跨域策略。我有个朋友用Spring Boot写了个简单的文件上传服务,本机测试爽得飞起,一上生产环境,Nginx默认上传大小限制1MB直接把他坑惨了。他骂了半小时“这跟Java有什么关系”——确实没关系,但这就是Web的生存法则。 性能瓶颈也完全不同。Java程序跑得慢,多半是算法烂或者内存泄漏,你拿JProfiler一抓一个准。Web应用卡,八成是数据库查询没加索引,或者某个接口被爬虫刷爆了。你没法靠优化代码解决“同时一万个人点提交按钮”的问题——那得靠消息队列削峰,靠Redis扛热点,靠分库分表。这些玩意儿,写Java核心逻辑的时候根本不用想。 但最微妙的是“错误处理”的哲学。Java程序出错,你可以try-catch包住,然后让程序继续跑,或者记录日志后优雅退出。Web应用出错?你返回个500页面,用户刷新一下,可能又好了——也可能把同一笔订单提交两次。你得设计幂等性,得考虑“用户点了两次保存按钮”这种破事。Java程序里,函数调用是确定的,传什么参数得什么结果;Web里,用户可能中途关浏览器,可能断网重连,可能按F5刷新一个POST请求——这些“非正常路径”才是Web开发的主战场。 说到底,Java程序像写小说——情节由你控制,角色按你的设定行动。Web应用像办一场开放麦——你不知道台下谁会突然冲上来抢话筒,你得准备应急预案。我见过写Java中间件很溜的大神,搞Web时被CSRF攻击搞得焦头烂额;也见过前端出身的小伙子,用Node.js写个爬虫脚本溜得飞起,但让他处理一下Java的checked exception就抓瞎。工具没有高低,但思维模式必须切换——否则你只是把Java的习惯硬塞进Web的壳里,两边都难受。 |