上篇文章,发布之后,收到了一些回复。有的赞成,也有反对的声音,正如其中一个网友评论的
就如同你混的不容易一样,他也不容易。
其实也没必要用奇葩两个字。
程序员不容易,两三年的工作经验,或许也只是做一个项目,
被动的日日加班,心力憔悴,
不断地修改需求,不断的梦想上线。
到头来所练熟悉的也只不过是把数据库里的数据较简单地增删改查,
且展示出来而已。
这里还是有必要说下,这里不是在比较辛苦,如果比辛苦,我见过夏天大中午还在太阳底下搬砖的民工哥;比辛苦,我见过晚上七八点还在送快递的快递哥;这个世界上最廉价的恐怕就是辛苦了吧。然而辛苦中,还是要有一点工程师精神,起码是保证自己出的产品能够正常使用,不能跑一会就崩溃,流程都没有走完系统就撂翘子。这个世界上不只是老板坑员工的,也有员工坑老板的,就是论事,而不是一概而论。
即上次的奇葩程序员走了之后,公司又来了以为老程序员,这位程序员外地上的大学,在这个经济区三个比较大的城市都有工作经验。属于年纪大了,回到家乡建设家乡的那种。十多年的开发经验,孩子都很大的,与人相处也十分融洽。我和他关系很好,很能聊到一起,公司因为需要比较好的开发者,也为了尊重我,于是就把我俩放到了同级的位置,很长一段时间,他开发他的,我开发我的,开发上交流不太多,直到系统上线跑,很多用户进来才发现了很多问题,我才回过头来去翻阅他的代码。奇葩的代码出现了。
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不断,一查问题都在服务器,当然了根本也不用查。