容我缓缓神,记一次气的心脏病发做的经历

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

  再肯定需求的过程当中,客户的需求也极为简单。他连本身要想的表结构都没有想法,彻底我自定义,事情更简单了,可是在接下来的编码过程当中,真的耗尽了我全部的耐心,真的有一种生不如死的感受。 程序员

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

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

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

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

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

  

    public class AlarmGaugeRet : BaseEntity
    {
        public DateTime Time;
        public int Status = 0; //复位=0,触发=1
        public 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);
    }

 

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

  但我仍是怀着忐忑的心情code

  我:?

  亲:你这是什么意思?

  客户:接口

  我:你啥意思?

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

  客户:嗯。

  

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

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

  然而客户犟的很,客户坚持要我实现接口,时间能够延一点。不行,绝对不作。你从昨晚折磨我到如今,不作了。我确定不干了,都不如我一天工资,我犯得上么。

  

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

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

  彻底看不懂

  彻底看不懂

  彻底看不懂

  再贴一次接口的定义吧

  

    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

 

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

相关文章
相关标签/搜索