事情是這樣的,前天晚上在家開着電腦摳着腳丫寫着爬蟲。而後接到了一個需求,一個學生想要作個東西,關於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,不要緊!!!不要緊的東西你給我幹啥,上午你跟我研究那幾個類研究那麼久到底在幹啥,貼幾張圖。
真的,怒火中燒。絕逼不作了,若是你站在我面前我不打死你算我脾氣好,愛哪哪去,愛誰誰作!
總結下客戶的奇葩需求:
總之一句話,程序員再接私活眼鏡擦亮。咱們不是什麼樣的客戶都要伺候,程序很講理,客戶不講理。