ITPUB

你见过最烂的代码长什么样子?

今天在知乎上看到这样一个问题:"你见过最烂的代码长什么样子?"

Image

问题地址:

https://www.zhihu.com/question/265453795

背景介绍

源于我之前发的帖:吐槽我见过的最烂的代码,目的不是抨击和取笑鄙视,我们最终的目的是发现一些我们编码中的问题并改进(可能自己已经习惯了而发现不了 ),欢迎大家吐槽。

这里只针对spring框架,贴一份我见过最烂的代码(没有之一),我就想知道,有没有其他人能写出这样的代码?还有没有更加烂的编码方式??

controller代码:

/** * 增加配置 */@PostMapping("/add")public void addConfig(HttpServletRequest request, HttpServletResponse response)  throws IOException {
response.setContentType("application/json;charset=UTF-8");
//返回了一个json格式的字符串。。 String result = configService.add(request);
response.getOutputStream().write(result.getBytes()); response.getOutputStream().flush();}

services代码:

/** * !!!错误的示例 *  * @param request * @return */public String add(HttpServletRequest request) {  Map<String, Object> data = new HashMap<String, Object>();
try { String name = (String) request.getParameter("name"); String value = (String) request.getParameter("value");
//示例代码 long newID = add(name, value);
data.put("code", 0); data.put("newID", newID); } catch (CheckException e) {// 参数等校验出错,已知异常,不需要打印堆栈,返回码为-1 data.put("code", -1); data.put("msg", e.getMessage()); } catch (Exception e) {// 其他未知异常,需要打印堆栈分析用,返回码为99 logger.error("add config error", e);
data.put("code", 99); data.put("msg", e.toString()); }
return JSONObject.toJSONString(data);}

看到这样的代码,我第一个反应是震惊,然后是愤怒,最后是悲哀。问了一下开发人员,为什么这些写,他说一过来项目组里面的代码就是这样的,继续追下去原来是一个工作了多年的老开发人员定的代码框架,我就说嘛,开发新手也写不出这么烂的代码啊。这个写法还不如在servlet里面写呢。可见,开发组长的性能的重要性。

回答

整理了几个不错的回答,分享一下。

赛博铁犁的回答

我第一份工作清理的代码。十几年依然没见过更烂的。

3500行的主逻辑代码,只有一个函数!!!

函数的开头声明了一百多个变量,包括i, j, k这种计数器(C++代码哦)。

里面是一个奇大无比的连续if。

每一个else if代表一个逻辑分支。一共判断了十几次。

整个项目有十几万行。

工具类绝不抽离出来做函数,最夸张的在同一个函数中都能写四五次。有的逻辑在整个系统中重复写了不下十几次。

神秘数字多如牛毛。绝不用宏或者常量替代。

注释基本上只有一种//xxx modified at yyyy/mm/dd

跑起来的效果是每一两个小时就崩溃一次。

当时也是初生牛犊不怕虎。刚好住在公交的始发站附近,每天都有位子。于是买了本《代码大全》,每天上下班就抱着啃。啃完了就照着书里说的原则去改。

花了小半年吧。

把所有的工具代码都抽出来做了工具类。

把大函数都拆成几十行的小函数。

用VC全项目一个数字,一个数字的搜索,把所有能找到的神秘数字都抽出来用宏或者常量来替代。保证代表同一件事物的神秘数字,只出现一次。

那个巨大的if,改成了switch,并且主函数里面,几乎只有这一个switch和针对不同逻辑需要的参数变量,每一个开关下,直接去调用一个逻辑函数。

在所有清理好的重要的地方,都加了伪代码注释。

最终削减了近三分之一的代码。还顺手增加了几个小功能。

测试一个月,7*24小时运转,崩溃三次。

我本来还不满足。结果老板告诉了我一个重要的人生哲理。

客户签的合同要求没这么高。你费那个劲干嘛。那几个功能已经白送了。他又不给咱们加钱。

交差。

白泽的回答

2020年跨年的时候,有一个朋友拜托我写一个倒计时的小程序,要在广场跨年的时候用。

说真的,没有比这个更简单的需求了吧,我三下两下写好之后,又花了半天做了些看起来花里胡哨的特效。

但是我忘记了一个相当重要的细节……直到跨年当天,我亲眼看着广场的人们在倒计时的时候一直在看大屏幕并高呼……

00:05

00:04

00:03

00:02

00:01

00:00

00:-01

00:-02

…

不说了,脸又发烫了

隆道尔的孙笑川的回答

世界上最简洁易懂的代码,是自己刚写出来的代码。

世界上最烂的代码,就是自己一年前写出来的代码。

请叫我大叔可好的回答

有次帮小姐姐修电脑,偶然看到这幕,这应该也算吧...

Image

jack60506的回答

Image

看到这代码后隔天就辞职了。

匿名用户的回答

大二时接触了Python爬虫,学了点前端,然后某一天打开学校教务系统页面,不小心碰到F12无意间看到了源代码,瞬间来精神了:

Image

就这样,我知道了其他人的教务系统的密码.....

登录几个人的查看了后,没敢继续下去,毕竟涉及隐私。之后报告给了学校信息中心,得到了50G校园网流量作为奖励。

量子位的回答

大概就是,一个if循环19.8亿次,而且7年没人敢动....

真事,就出现在知名游戏大厂R星的知名大作 GTA 5 中。而且,19.8亿次的if循环,今天仍然在世界各地的玩家cpu上跑着。

继揭R星老底的帖子在全网大火后,后续就是……R星不得不出面应对,官宣准备修复了!

在和黑客大哥联系后,R星认可了他的改进方法,宣布在后续更新中修复相关问题,并且还慷慨的给他付了一笔1万美元的奖金。

Image

鉴于R星失误实在太低级太离谱,而这位老哥的方法又太有效,以致无数玩家称他“功德无量”。

如果平均给每个玩家节省10秒,全球500万玩家一天就能节约5000万秒,一年中,节约的总时间大概能有数十年。相当于挽救了十多个人的生命!

“事了拂衣去,不留功与名”,这位黑客大哥被无数玩家膜拜。当然大家也不忘再把R星拖出来“鞭尸”。

有人吐槽,GTA 5仅2020年就买了2000万份,累计销量更是达到1.4亿份,R星每年都能从这个项目上赚数亿美元,但是却不肯花几分钟去解决这么一个低级错误,实在可耻。

Image

还有人抨击R星几乎从不与玩家社区互动,玩家提的意见也从来充耳不闻,直到这次被被黑客嘲讽打脸,才不得不出来表态。

事后,黑客大哥还透露了一丝身份信息,原来他人在拉脱维亚。

拉脱维亚是波罗的海国家,原来是前苏联加盟国之一。在网上搜索相关信息,可以发现“拉脱维亚黑客”,几乎是和俄罗斯黑客一样传奇神秘的存在。

Image

有网友爆料,在拉脱维亚,普通程序员工资平均3-4k欧元(23000-31000人民币)。

而他领到的这1万美元奖金,相当于三四个月工资了。

提前领了一笔“年终奖”,黑客大哥表示很开心。同时他也说,将密切关注GTA 5未来更新,一丝不苟的检查修复情况。不知道他还能不能从R星领走更多奖金……

(注:所谓“屎山”,是程序员间流传的一个梗,指陈年累月且复杂低效的代码,因为改动成本巨大,所有人避之不及。)

Image