事情是这样的,前天晚上在家开着电脑抠着脚丫写着爬虫。然后接到了一个需求,一个学生想要做个东西,关于MongoDB的。这个东西我熟悉,可以做。经讨论客户的需求非常简单,一张表MongoDB中增删改查而已。商量好报价,交工时间,这还不简单吗,三两个小时的而已。

  再确定需求的过程中,客户的需求也极为简单。他连自己要想的表结构都没有想法,完全我自定义,事情更简单了,但是在接下来的编码过程中,真的耗尽了我所有的耐心,真的有一种生不如死的感觉。 

  客户要求用vs2013版本。这都什么年代了,还用这上古的产品。而用户真的很倔强,商量了十几分钟,客户依然不肯妥协,一直以自己电脑装的2013为理由,拒绝接收其他版本。这都什么年代了,我都用2017了,你还抱着13不放。客户就是上帝,

客户强烈要求那能咋整,用呗。一个vs2013需要好几个G,安装配置也要不少时间。其实使用13版本也没啥问题,但是客户要求第二天下午功能演示,隔天早上交代码。而这么紧张的时间里我需要下载2013,配置mongodb,时间太过紧张了。

下载vs2013全下载好,然后安装完成,为了节省时间,多余的组件全不装,只保留winform功能。赚这两个钱我也真是拼了,环境搭好已经晚上11点多了,光配置环境超过2小时,一行代码都没有写。然而我白天还需要上班,加班加点的搞吧。除去界面之外增删改查全部搞定,再看看表,凌晨1点+,睡觉吧。

  然而事情并没有这么简单,第二天一早。客户可发给我发来了几个类。我靠,嘛意思?让我按照这个类结构增删改查?昨晚你不是说什么都行吗?怎么现在又出来这些类结构。大不了我让一步吧,数据库的底层已经封装好,按照你的类结构操作表也不难。

也幸亏mongo没有Sql server,Oracle,mysql那种很强的表定义。

  

    public class AlarmGaugeRet : BaseEntity{public DateTime Time;public int Status = 0; //复位=0,触发=1public string LotNumber = "";public AlarmNode Node;}public class AlarmNode : BaseEntity{public string AlarmName;public int AlarmStaion;public int AlarmLevel;public int AlarmNum;public string AlarmInfo;public string Solution;}public class DataGaugeBase : BaseEntity{public DateTime Time;public int RowID = -1;public string Date = "";public int Level = 0;public string levelType = string.Empty;public string levelDes = string.Empty;public int BoxIdx = -1;public string CutNum = string.Empty;public string PosNum = string.Empty;public string RecipeNum = string.Empty;public string ProductNum = string.Empty;public string MetNum = string.Empty;public List<VisioBoxOutput> BoxList = new List<VisioBoxOutput>();}public class SystemGaugeRet : BaseEntity{public DateTime Time;public int Status = 0;//StandBy=0;Running=1;Testing=2;Warnning=3;public double Duration;public string StatusDes;}

  

 于是问客户咨询,这几个类结构的业务关联是怎样的?毕竟需要作业面,如果搞不清业务关系,页面该如何显示?客户支支吾吾,支支吾吾。无论如何也说不明白,大家可能不信就这几个类的定义,磨叽了一个小时,最后得到结论

 

SystemGaugeRet 机台信息
DataGaugeBase 数据结构
AlarmGaugeRet 警告信息

  墨迹了一个多小时,就得到这么几个结果。DataGaugeBase 类里面有一个List<VisioBoxOutput> BoxList = new List<VisioBoxOutput>(),大家也都看到了,这几个类中并没有的VisioBoxOutput定义。于是问客户VisioBoxOutput是怎么回事,客户说有问题,让我等等。 好嘛,这一个等等,足足从上午等到下午两点钟,然而事情并没有完。

  你们根本猜不到接下来的事情,事情发生在下午的两点多钟,下午两点多钟客户终于联系我了。我真的火不打一处来,你要下午演示,然后上午临时该需求,你的代码有问题,让我等等你人不见了,然后到下午你又出现了。你是找我来要演示的吗?但是客户也不是来解决VisioBoxOutput的问题。然而这次客户直接甩给我了一个接口。
   public interface IOperationDB{/// <summary>/// 如果不存在DB,则创建DB/// </summary>/// <param name="dbFullName">DB全名称</param>/// <param name="tableHeads">DB表头,逗号分隔</param>///<param name="msg">失败时返回错误信息</param>/// <returns>返回实例</returns>        IOperationDB InitDB(string dbFullName, string tableHeads, ref string msg);/// <summary>/// 插入数据 /// </summary>/// <param name="data">数据,采用逗号分隔</param>/// <param name="msg">失败时返回错误信息</param>/// <returns></returns>bool InsertDB(string data, ref string msg);/// <summary>/// 删除数据/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">指定列和对应的值</param>/// <param name="msg">失败时返回错误信息</param>/// <returns>成功返回true,失败返回false</returns>bool DeleteDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, ref string msg);/// <summary>/// 查询数据/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">指定列和对应的值</param>/// <param name="msg">失败时返回错误Q信息</param>/// <returns>成功返回true,失败返回false</returns>DataSet FindDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, ref string msg);/// <summary>/// 修改数据库/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">约束,指定列和对应的值</param> /// <param name="value">修改指定列和对应的值</param> /// <returns></returns>bool UpdateDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, Dictionary<int, string> value);}

  当时心里产生了一股不祥的预感,你要干啥、不会让我按照你接口的定义来吧?

  但我还是怀着忐忑的心情

  我:?

  亲:你这是什么意思?

  客户:接口

  我:你啥意思?

  我:你不会让我按照你的接口做吧?

  客户:嗯。

  

  当时心中的怒火真的压不住了,明确的跟客户表示。不行,绝对不行。

  为啥不行?我的程序都让我写的七七八八的了,数据库操作都已经完全弄好了,你给我发这个接口啥意思?你是要我推翻了重写吗。你也是搞程序的,你不知道这其中的工作量,你跟我开玩笑呢?

  然而客户犟的很,客户坚持要我实现接口,时间可以延一点。不行,绝对不做。你从昨晚折磨我到现在,不做了。我肯定不干了,都不如我一天工资,我犯得着么。

  

  当时我的想法真的很坚决,不干绝对不干了。当时心里真的无比放松,好像自己赚了一大笔一样,事实上我只是回到了平时的生活而已。然而过了一会客户私聊我,好声好气的商量我还是要我继续做。我加钱的要求他也答应了,算了别跟钱过不去继续做吧。

  然而,我真是后悔我的决定,那几个接口我一开始并没有仔细看,既然要做了,就去看一下接口的定义吧,发现。

  完全看不懂

  完全看不懂

  完全看不懂

  再贴一次接口的定义吧

  

    public interface IOperationDB{/// <summary>/// 如果不存在DB,则创建DB/// </summary>/// <param name="dbFullName">DB全名称</param>/// <param name="tableHeads">DB表头,逗号分隔</param>///<param name="msg">失败时返回错误信息</param>/// <returns>返回实例</returns>        IOperationDB InitDB(string dbFullName, string tableHeads, ref string msg);/// <summary>/// 插入数据 /// </summary>/// <param name="data">数据,采用逗号分隔</param>/// <param name="msg">失败时返回错误信息</param>/// <returns></returns>bool InsertDB(string data, ref string msg);/// <summary>/// 删除数据/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">指定列和对应的值</param>/// <param name="msg">失败时返回错误信息</param>/// <returns>成功返回true,失败返回false</returns>bool DeleteDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, ref string msg);/// <summary>/// 查询数据/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">指定列和对应的值</param>/// <param name="msg">失败时返回错误Q信息</param>/// <returns>成功返回true,失败返回false</returns>DataSet FindDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, ref string msg);/// <summary>/// 修改数据库/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">约束,指定列和对应的值</param> /// <param name="value">修改指定列和对应的值</param> /// <returns></returns>bool UpdateDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, Dictionary<int, string> value);}

我当时真的好不解啊,initDB是干啥用的,难道是创建database的么,那tableheader咋用,为啥结构还有再返回当前接口?

     /// <summary>/// 如果不存在DB,则创建DB/// </summary>/// <param name="dbFullName">DB全名称</param>/// <param name="tableHeads">DB表头,逗号分隔</param>///<param name="msg">失败时返回错误信息</param>/// <returns>返回实例</returns>        IOperationDB InitDB(string dbFullName, string tableHeads, ref string msg);

insert ,你insert到哪啊?你一个string类型我怎么对应到数据表啊?那个是表名

        /// <summary>/// 插入数据 /// </summary>/// <param name="data">数据,采用逗号分隔</param>/// <param name="msg">失败时返回错误信息</param>/// <returns></returns>bool InsertDB(string data, ref string msg);

还有这几个方法,删除。deleteDB,你是要删除整个数据库吗?starttime,endtime,selectvalue是干啥的,还是说删除表,那也没有指定那张表啊?你这玩意咋用?

下方的update,find都有相同问题。

        /// <summary>/// 删除数据/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">指定列和对应的值</param>/// <param name="msg">失败时返回错误信息</param>/// <returns>成功返回true,失败返回false</returns>bool DeleteDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, ref string msg);/// <summary>/// 查询数据/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">指定列和对应的值</param>/// <param name="msg">失败时返回错误Q信息</param>/// <returns>成功返回true,失败返回false</returns>DataSet FindDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, ref string msg);/// <summary>/// 修改数据库/// </summary>/// <param name="startTime">开始时间</param>/// <param name="endTime">终止时间</param>/// <param name="selectValue">约束,指定列和对应的值</param> /// <param name="value">修改指定列和对应的值</param> /// <returns></returns>bool UpdateDB(DateTime startTime, DateTime endTime, Dictionary<int, string> selectValue, Dictionary<int, string> value);

  实在猜不出,问客户。问了好久好久,双方你一言我一语沟通了近一小时无结果,客户都解释不清自己的接口到底是啥玩意,到底要怎么用,我实在要气疯了,我要求客户你写出一个接口的调用实例,然而客户也没给我。咋办?初步猜想,这个接口肯能是正在学习           的学生做的,经验不足导致。遂问,这个接口是谁定义的,最开始客户说不是自己。后来又说是他跟他一个学弟。算了,你们还是学生功力不够,我也不怪你们了,那这样,我好言好语的跟你商量下。

  我:我说句实话你也别介意,实话实说,你们俩个还年轻,功力还差点。

  客户:嗯嗯,你说的是实话。

  我:那我免费帮你做个接口,给你,你可以学习下,不懂可以问我。

  客户:不。

  绝望了,他做的接口不能用,我给他定义接口还不要。。。。

  行了,接口先放一放,慢慢研究。还有你那几个类的问题怎么解决,不知道业务逻辑,真的没法做,接下来真的更令我喷血,我按照那几个类做了那么久的更删改查,客户突然告诉我那三个类没啥用,跟我没关系,

  我CNM,没关系!!!没关系的东西你给我干啥,上午你跟我研究那几个类研究那么久到底在干啥,贴几张图。

  

  

  真的,怒火中烧。绝逼不做了,如果你站在我面前我不打死你算我脾气好,爱哪哪去,爱谁谁做!

  总结下客户的奇葩需求:

  • 一定要使用vs2013,熬夜下载配置
  • 本来简单的增删改查,结果要按照他的结构来,改
  • 类结构有错误,等
  • 按照他的接口标准,改
  • 接口定义不明,问。
  • 解释不明白,艹。
  • 按照类结构做的增删改查不用,cnm

  总之一句话,程序员再接私活眼镜擦亮。我们不是什么样的客户都要伺候,程序很讲理,客户不讲理。

转载于:https://www.cnblogs.com/abountme/p/10319185.html

容我缓缓神,记一次气的心脏病发作的经历相关推荐

  1. 挨踢人生路--记我的10年18家工作经历 续 .转

    挨踢人生路--记我的10年18家工作经历 续 .转 from http://mvlung.blog.163.com/blog/static/30961748200971745935542/ 第13家公 ...

  2. 挨踢人生路--记我的10年18家工作经历 - 后记

    挨踢人生路--记我的10年18家工作经历 - 前言 挨踢人生路--记我的10年18家工作经历 - 从大学说起――不得不说的一些事情 挨踢人生路--记我的10年18家工作经历 - 第1家公司,在老家的工 ...

  3. 挨踢人生路--记我的10年18家工作经历 - 第16家公司,英国公司――第一次当经理...

    挨踢人生路--记我的10年18家工作经历 - 前言 挨踢人生路--记我的10年18家工作经历 - 从大学说起――不得不说的一些事情 挨踢人生路--记我的10年18家工作经历 - 第1家公司,在老家的工 ...

  4. 记一次注销联通卡的吐血经历

    文章目录 一.起因 二.注销前奏 三.如果渠道不对,再多的投诉也是无用功 四.总结 摘要: 1月底我在x猫上购买了一个月租29元的联通流量卡,在收到卡并激活后卡就欠费了.联通卡是月初扣费的,这个操作有 ...

  5. iphone计算机锁,别人排队买11,我去店里刷了个机——记一次iPhone锁机刷机经历...

    别人排队买11,我去店里刷了个机--记一次iPhone锁机刷机经历 2019-10-03 21:49:10 77点赞 94收藏 231评论 前言 在我前几天还在表示自己很淡定,早上还在跟值友讨论说XS ...

  6. 记一次逆向追踪请求ip的经历

    记一次逆向追踪请求ip的经历 事发 应急处理 寻找问题原因 封锁请求进入 定位请求的内网ip 事发 某日下午,部门使用的测试环境出现问题,所有集成测试case都执行失败.查询测试用服务器发现是磁盘已满 ...

  7. 有才而性缓,有智而气和

    "有才而性缓,定属大才:有智而气和,斯为大智."--弘一法师 这句话的大抵意思是:有才华而能性情平和处世冷静,是大才:满腹谋略而能气定神闲处理人事,是大智.芸芸众生,我们都是普通的 ...

  8. 记一次蚂蚁金服面试被虐经历

    本文来自作者投稿,原作者:yes 面试前的小姐姐 来说说前不久蚂蚁金服一面的情况.说来也是巧合,当时在群里有位蚂蚁金服的小姐姐发了个内推,看了下JD感觉可以试试于是就私聊了小姐姐发简历内推了. 我16 ...

  9. 记一次内存泄漏问题的排查经历

    源宝导读:随着系统越来越庞大,越来越复杂,疑难杂症问题也越来越多.本文将介绍明源研发协同平台团队针对一次内存泄露问题的排查过程和技术探索. 一.背景 内存泄漏,一个说大不大说下不小的瑕疵.作为开发者, ...

最新文章

  1. diy高性能存储服务器,diy存储服务器
  2. 测试集没有标签,应该怎么办?
  3. iOS Masonry的使用详解
  4. 浅析网站友情链接交换潜在问题有哪些?
  5. 逻辑运算符和||与(和|)的区别
  6. Spring Session - Cookie VS Session VS Token 以及 Session不一致问题的N种解决方案
  7. MySQL备份之mysqldump工具--lock-all-tables
  8. Mr.J--Vue之v-cloak
  9. java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串
  10. 设计模式学习笔记(二十:享元模式)
  11. 几种在Linux下查询外网IP的办法(转)
  12. Android 9.0 HIDL接口添加
  13. JDK1.8下载 jdk1.8-64下载 国内源
  14. 05 基于H3 + RH850 的智能座舱功能安全设计
  15. linux 海思hi3798m_海思Hi3798M V310芯片简介
  16. 阿拉伯数字转中文数字(大写或小写)
  17. window7(64bit)环境下安装基于TensorFlow后端的Keras 教程(CPU版)
  18. 有关“iusb3mon.exe已停止工作”的解决方法与我解决这个问题的坑爹经历。
  19. 2021.5.5笔记 多态
  20. 用户体验地图——互联网平台建设

热门文章

  1. linux下/proc目录简介
  2. Windows电脑上那些为人熟知的视频剪辑调色应用
  3. 零时科技创始人邓永凯先生受邀对话《公链隐私保护及生态安全》
  4. python 插值 —— 如何实现插值,以及错误ValueError: A value in x_new is below the interpolation range.
  5. SpringBoot + Spring data JPA使用方言(自定义函数、一些自带函数)
  6. ca76a_c++_流文件打开输入输出文件模式
  7. 计算机相关分类号,中图法分类号(计算机专业) TP
  8. 2016年8月27日 星期六 --出埃及记 Exodus 16:28
  9. 关于MySQL的版本
  10. pushd和popd批处理_提示以及PushD和PopD