这几年遇到的奇葩代码(2)

上篇文章,发布之后,收到了一些回复。有的赞成,也有反对的声音,正如其中一个网友评论的  

就如同你混的不容易一样,他也不容易。
其实也没必要用奇葩两个字。
程序员不容易,两三年的工作经验,或许也只是做一个项目,
被动的日日加班,心力憔悴,
不断地修改需求,不断的梦想上线。
到头来所练熟悉的也只不过是把数据库里的数据较简单地增删改查,
且展示出来而已。

这里还是有必要说下,这里不是在比较辛苦,如果比辛苦,我见过夏天大中午还在太阳底下搬砖的民工哥;比辛苦,我见过晚上七八点还在送快递的快递哥;这个世界上最廉价的恐怕就是辛苦了吧。然而辛苦中,还是要有一点工程师精神,起码是保证自己出的产品能够正常使用,不能跑一会就崩溃,流程都没有走完系统就撂翘子。这个世界上不只是老板坑员工的,也有员工坑老板的,就是论事,而不是一概而论。

即上次的奇葩程序员走了之后,公司又来了以为老程序员,这位程序员外地上的大学,在这个经济区三个比较大的城市都有工作经验。属于年纪大了,回到家乡建设家乡的那种。十多年的开发经验,孩子都很大的,与人相处也十分融洽。我和他关系很好,很能聊到一起,公司因为需要比较好的开发者,也为了尊重我,于是就把我俩放到了同级的位置,很长一段时间,他开发他的,我开发我的,开发上交流不太多,直到系统上线跑,很多用户进来才发现了很多问题,我才回过头来去翻阅他的代码。奇葩的代码出现了。

public void getPlayer(int roleId)
{
    if(playerMap.contains(roleId))
    {
         return playerMap.get(roleId);
    }
    return null;
}

这样冗余费时的代码超级多,难道真的是古龙的小说吗?按行收费?其实不就是一行代码的事情吗

public void getPlayer(int roleId)
{
    return playerMap.get(roleId);
}
public void writeItemToData(ByteBuffer data)
{
    data.writeSize(items.size());
    for(Item item : items)
    {
        if(item != null)
        {
             item.writeToData(data);
        }
    }
}

上面的代码真是应了一句话,半途而废,费力不讨好;这个问题导致了一个严重的线上问题,如果没有if(item == null)的判断还好,直接报空引用异常,那么还比较容易查找问题,既然写了if(item==null)的判断,就应该想到如果null,那么这段代码会破坏消息结构,破坏消息结构,导致客户端读取这个数据的时候报错。处理else 处理else 处理else,重要的事情讲三遍。

List<IPet> list = new ArrayList<IPet>();
public IPet getIPet(Integer petId)
{
  for(int i=0;i<list.size();i++)
  {
      if(list.get(i).getPetId() == petId)
      {
          return list.get(i);
      }
  }
  return null;
}

    

首先,int值之间可以使用==操作符去比较,Integer不能,不能,不能。
再者频繁随机取值的时候,map是更加合适的数据结构,直接map.get一行代码解决问题,没有必要遍历来遍历去。

时间过去的有些久了,手头实在没有当时的代码了。只想起来着三个比较严重的,也就贴出来了。如果这是一个新手写出的代码,我觉得还好,我们告诉他,教教他,大部分人下回也就不会再烦这样的错误。可是一个开发过十多年的程序员,写出了这样的代码,真是让人无语加绝望,害我常常告诉自己,如果自己也老了,以后千万不要这样,千万不要。

游戏商城,商城里面的数据用json配置是最合适的了,结构清晰,容易阅读和修改。他却把数据保存在了数据库里面,每次策划想调整一下商城商品的价格,都需要喊程序去数据库里面修改。

客户端负责界面,服务器负责逻辑,客户端根据服务器的数据来改变客户端的行为;这个是典型的游戏开发者的思维。然而他却讲究精确控制,讲究服务器控制一切,要客户端每一个按钮是可点击还是不可点击,都需要服务器来精确控制,所以设计的消息协议复杂无比;所以导致每次开发一个模块的现象就是,客户端闲的要死,他忙的要死;最后上线bug不断,一查问题都在服务器,当然了根本也不用查。

 

时间: 2024-10-14 00:46:55

这几年遇到的奇葩代码(2)的相关文章

你见过哪些要命的奇葩代码?程序员:太多了!

毕竟大家都有刚入门的时候 难免会做成这样的事情 多多体谅就挺好 毕竟 获取明天的日期的正确打开方式 public static DateTime getTomorrowDate() { Thread.Sleep(24*60*60*1000); return DateTime.Now; } 写了个很牛逼的SQL 说出来自己都不敢相信 写了十几个嵌套if 看起来还觉得很漂亮 高端大气上档次的 定义了一个常量 public static final int ONE = 1 public static

WEB前端资源代码:面试篇

1.JS找字符串中出现最多的字符 例如:求字符串'nininihaoa'中出现次数最多字符 方法一: var str = "nininihaoa"; var o = {}; for (var i = 0, length = str.length; i < length; i++) { var char = str.charAt(i); if (o[char]) { o[char]++; //次数加1 } else { o[char] = 1; //若第一次出现,次数记为1 } }

BestCoder Round #62 (div.2) 1004

好长时间没做比赛了,原来就菜现在更菜,1004的题目没想到div.2赛后只有一个人做出来,做题的时候想到了做法但时间不多自己的奇葩代码不足以在比赛时间debug出来,赛后补了一发: 题目&提交地址在这:http://acm.hdu.edu.cn/showproblem.php?pid=5565 const int INF = 1000000000; const double eps = 1e-8; const int maxn = 10000000 + 10; const int mod = 1

前++和后++引发的血案~~!!

先看一段奇葩代码: int main(void) { int x = 4; int y; y = (x++); printf("hello world. y = %d.\n", y); x = 4; y = (x++)+(x++); printf("hello world. y = %d.\n", y);  x = 4; y = (x++)+(x++)+(x++); printf("hello world. y = %d.\n", y);  x

毁掉自己的汇编程序

下午的上机课,有位同学写的程序死了.她百思不得其解. 我看了几遍程序,没有发现问题. 多次观察后,发现程序修改数据时,由于循环次数错误地设多了,以致于改到了代码段--代码段的指令于是被当作数据改掉了,而此处的数据,当然它仍然还要被当作指令执行,恰好对应了wait指令!于是,程序进入了等待-- 那程序到底有没有问题?我看的程序没有问题,但运行的,却是老版本的.exe.开始时,源程序是错误的,她修改后,却没有再编译.接连!唉,这样的错也能犯?难为我当教师的了.麻子不叫麻子,叫什么来着? 按下这个不表

Android蓝牙开发---站在前辈的肩膀上唠嗑

描述一段背景:前年我找工作时,总碰到一个问题. 面试官问:"你会蓝牙开发吗?". 我说:"不会". 面试官答:"那,很抱歉.我们商量了一下,觉得你不适合这个岗位." 于是我就走了,心里想:"就应为一个蓝牙通讯技术不会,就把我给cut了,这面试官好有想象力." 我一个同学,都没做过编程,我半年时间都带到android开发道上了.我仅仅蓝牙没做过,研究蓝牙无非就是三两天的时间,难吗? 于是,我周末窝在家里,查阅了大量资料,实践和总

我对C++开发人员有偏见

前言 我确实对C++开发人员有一些偏见,我也知道对一类人有偏见是不正确的行为:但,在我所处的三线城市的环境中,我对C++开发有偏见并非是一件不正确的事,因为C++开发都是变态这件事,根本就是客观事实. C++开发总以为自己是写底层的 不知道为什么,也不知道从何时起,C++开发就默认自己都是写底层的,他们认为自己比其他语言更消耗脑力. 这件事真的很奇怪,但在C++开发的圈子里,好像是个共识.所以,他们以此为借口不合作,不加班,不写文档等等. C++语言是可以写底层 ,这没错. 但,这并不代表所有的

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

js 奇葩技巧之隐藏代码

昨天在群看到有人发了个文章叫<“短”化你的代码>,思路非常不错,采用unicode的零宽字符来实现字符隐藏,虽然有字符,可是你却看不见它.这篇文章详细的介绍了这种方法的实现原理,最后还给出了一个生成工具. 当然,作者算了留了一个小小的练习给我们,因为他只用了两个字符,导致转换后的数据是原始数据的 8倍.他给我们提供了4个零宽字符,我们就可以缩小至4倍. 好了,我们来看下代码吧. (function(window) { var rep = { // 替换用的数据,使用了4个零宽字符,数据量减少了