有哪些话一听就知道一个程序员是个水货?

1 阅读5分钟

不用聊技术细节,光听他描述问题的方式就够了。真正的差距不在会不会写代码,在于出了事之后嘴里蹦出来的第一句话。


能跑就行,别动了

组里有个服务,接口响应时间偶尔飙到 3 秒。查了一圈发现是某个同事写的一段逻辑:先从数据库查出全部订单,在 Java 里做过滤和分页。

你跟他说这个应该在 SQL 层用 WHERE 加 LIMIT 做,不应该全量查出来再内存过滤。他的回答是:能跑就行,别乱改,万一改出问题呢。

一万条数据的时候确实能跑。十万条的时候接口超时,连接池打满,其他接口跟着一起挂。

这类人有个共同特征:分不清"能跑"和"没问题"的区别。测试环境一百条数据跑得飞快,觉得万事大吉了。生产环境数据量翻一百倍,原来的写法就是定时炸弹。不是不会优化,是压根没意识到需要优化,因为他从来不想代码在真实负载下会发生什么。

异常处理见真章

让一个人写段调用第三方接口的代码,看他怎么处理异常,段位一目了然。

段位最低的写法:整个方法体套一个大 try-catch,catch 里写一句 e.printStackTrace(),然后 return null。调用方拿到 null,不知道是接口没数据还是网络超时还是对方返回了错误码。线上排查的时候日志里一堆堆栈,但没有任何业务上下文,不知道是哪个用户、哪笔订单、调的哪个接口炸的。

段位高一点的区分了异常类型:网络超时重试一次,对方返回业务错误码记日志并走降级逻辑,未知异常往上抛让调用方决定怎么处理。日志里带着请求参数和响应内容,出了事一条日志就能定位。

代码量差不了多少,但第一种人线上出故障要查半天,第二种人三分钟定位完毕。

你不用问他会不会写代码,看他怎么对待"出错了怎么办"这五个字就行。觉得这事不重要的人,写出来的系统就是一个又一个 return null,每一个都是埋给后人的地雷。

用微服务的方式写单体

技术选型会上聊得头头是道,注册中心用 Nacos,网关用 Gateway,配置中心、链路追踪一应俱全。

你打开代码一看:所有服务共用一个数据库,服务之间互相调用没有熔断,A 挂了 B 跟着超时 C 跟着排队,一个接口慢拖垮整条链路。部署倒是分开部署了,但每次上线要同时发布四个服务才能保证兼容,发布顺序还不能错。

这叫什么?分布式单体。单体的缺点全留着——改一个功能要动好几个服务,联调成本翻倍。分布式的坑也一个没少——网络抖动、数据一致性、运维复杂度全加上了。

但你要问他架构是什么,他能给你画出一张漂亮的微服务拓扑图。图是真的好看,跟代码没关系。

能把一个团队四五个人、日活几千的项目硬套上微服务全家桶的人,技术判断力基本可以画个问号。不是说微服务不好,是杀鸡用了牛刀,还没握住刀柄。

描述 bug 的方式

同样一个线上问题,两种人的描述方式完全不同。

第一种:"这个接口挂了,不知道为什么,昨天还好的。"

第二种:"下午两点开始订单查询接口 P99 从 200ms 涨到 2s,看了监控发现数据库连接池等待队列在涨,慢查询日志里多了一条全表扫描,怀疑是今天上午上线的那个新查询没走索引。"

第一种人给你的是一个结果,第二种人给你的是一条排查链路。

这不是经验多少的问题,是思维方式的问题。碰到异常第一反应是"坏了"还是"哪里坏了、什么时候开始坏的、最近改了什么",这个反应是装不出来的。

评估工期的姿势

产品提了个需求,一种人脱口而出"两天",另一种人说"我先看看"。

前者只算了写主流程的时间。后者脑子里在过一遍:要不要改表结构?改了表结构老数据要不要刷?跟现有接口有没有冲突?要不要和前端联调?灰度方案怎么做?

最后可能也是两天,但这个两天是算过的,不是拍的。

工期拍太紧不是能力强,是考虑得少。真正快的人不是评估得短,是执行的时候不返工。

面对不会的问题

面试里最见人的一个瞬间:碰到答不上来的题。

一种人开始硬编,东拉西扯说一堆沾边不沾边的东西,试图用信息量掩盖理解的缺失。你追问一句细节,他换个方向继续编。

另一种人直接说"这块我没深入研究过,但我猜测是……因为……"。猜得对不对其次,关键是他知道自己不知道,而且能在有限信息下做推理。

前者让面试官疲惫,后者让面试官想接着聊。

工作中也一样。不会不丢人,不会还装会才丢人。因为装的那一刻不会有人拆穿你,但代码上线之后会。


你发现没有,上面说的这些其实跟"会多少技术"关系不大。

会用 Redis 不代表知道什么时候该用。能写出微服务不代表理解为什么要拆。背得出设计模式不代表能判断哪个场景用哪个。

真正暴露一个人的,不是他知道什么,是他碰到不确定的事情时怎么反应。是直觉性地糊弄过去,还是老老实实说一句"我查一下"。

前者十年经验也是一年的水平复制了十遍,后者三年就能让人放心把事情交给他。