代碼寫成這樣,老闆把我開除了,最讓人感到無可奈何的代碼,你可千萬別這麼寫!

  • 2019 年 10 月 28 日
  • 筆記

1、耍猴的最佳手段

還記得 XX 手機的搶購活動么,搶購按鈕的代碼類似是這樣的:

<a href="javasript:alert('搶購結束!')">立即搶購</a>

活動還沒開始就結束了。。

後面有人挖出來這段神邏輯,大家真是哭暈在廁所了,還好,搶購買手機這種我從來不參加。。

就是在前端寫死代碼造成搶購結束的假象,其實請求壓根沒有發送到服務器,或者休眠幾秒直接跳轉到搶購結束頁面,良心點的,點 10 次有一次發到服務器就不錯了,這樣耍猴是不是太好玩了?

眾所周知,為了提高服務器的承載能力,現在各類 APP、網頁等都會或多或少加入前端緩存,但上面這種耍猴的代碼也太無恥了。

2、豬一樣的隊友

大家有沒有見過這樣的代碼:

<!-- 原價 180 元,現在活動價 228 元,活動結束後恢復原價 -->...

這上面的活動價比原價還貴,真是哭笑不得……

類似這樣的代碼,一些程序員在注釋中說明活動的內容,又或者是把一些生產上環境的 IP、端口、用戶名、密碼等敏感信息把在注釋中,好隨時能切換……

真是豬一樣的隊友,這樣的程序員不開除么!?定時炸彈啊!

3、最牛逼的排序算法

據說是一個月薪 9K 的 Java 程序員,因老闆讓他寫一個排序算法,然後他就寫了一段屌炸天的休眠排序算法,接着他就被老闆開除了……

排序算法代碼大概是這樣的:

這個程序員更屌啊,數字排序,用一行簡單的 Arrays.sort 就搞定的東西,他竟用到了這麼多概念。

1、循環

2、線程休眠

3、多線程

還好是數字小啊,還好休眠是毫秒啊,要是數字大,要是休眠時間是秒,那要等多少休眠時間才能排序完?

按道理,他的程序也沒問題啊,老闆為什麼要開除他?應用程序中出 BUG 不是很正常的事嗎?但他這種排序思維,能寫出這樣的隱藏 BUG 也是絕了,創造性的發明了 "休眠排序" 算法,系統裏面還不知道有多少這樣的坑,不開除他開除誰啊?

排序排成這樣,不開除你,開除誰?

4、休眠的最高境界

/**   * 獲取未來幾天的日期   * @param days 指定的天數   * @author 微信公眾號:Java技術棧   * @return   */  public static Date getNextDays(int days){      try {// 休眠指定的天數Thread.sleep(days * 24 * 60 * 60 * 1000);}      catch (InterruptedException e) {e.printStackTrace();}      // 休眠結束後返回日期      return new Date();}

獲取指定日期用休眠?寫完,已笑暈在廁所。。。

開除的原因是因為沒寫注釋嗎?

顯然不是,休眠的邏輯,大家都懂,不需要寫注釋,你注釋寫休眠 1 天也沒意義啊。。。

這個程序員的思維不是一般的牛啊,獲取下一天的日期,居然要休眠等到下一天再獲取,欲哭無淚。。。

想離職找不到借口?

那還不容易,哥送你這段加強版,複製這段代碼,提交打包測試上線,坐等開除。

5、真就是假,假就是真

boolean isBoy = user.isBoy() == true ? true: false;  if (isBoy){ ...}   else { ...}

布爾值可以直接拿來用,你硬要寫個三元表達式?年底績效考核了,代碼量有 KPI 么?

還有類似這樣的:

if (xx1 == true && xx2 !=  true){ ...}  else { ...}

還有這樣的:

if (xx1 > xx2){return true;}  else {return false;}

寫得太優雅了!

6、循環循環循環

for (int i = 0; i < 1; i++){...}

一個循環也用循環,曾經就遇到過這麼一段,不知所云了,要改這段代碼,還要把他叫在旁邊坐着,看着改才行。。

for (;;){...}

死循環這麼寫,我們就看不出來了么?

7、魔法值的真諦

曾經檢查代碼時,發現代碼中很多魔法值,叫同事要定義成公共常量,結果來了這麼一段:

private final static int ZERO = 0;  private final static int ONE = 1;  private final static int TWO = 2;  ...

看到上面的常量定義,我真想打人,雖然魔法值是沒了,但又定義了一些沒有意義的常量,完全沒有理解修改魔法值的真諦,這和脫褲子放屁有什麼區別?

上面還只是一個簡單的示例,實際審查情況遠比你想像的糟糕。

8、看花眼的參數

Order order = new Order(orderNo, 1678.13, "CNY", 1, 3, "wx", 5, "1", 0, "8", 0, 1, new Date());

看到這樣的代碼,我也是醉醉的了。

我就見過同事寫出這樣的代碼,是趕時間呢,還是真的不會設計模式,一個構造函數參數能寫這麼多,且不說魔法值,這麼長,看一眼都覺得頭大。

9、消失的異常

try {...} catch (Exception e) {}

程序捕捉了異常,卻不打印。

try { ...} catch (Exception e) { e.printStackTrace();}

錯誤是輸出來了,但沒有輸出到日誌文件。

try { ...} catch (Exception e) {logger.info("...", e);}

日誌級別用的不對,去錯誤日誌文件裏面死活找不着錯誤日誌。

上面的種種不規範的寫法,在生產環境出現問題時,一方面導致排查問題艱難,另一方面,監控系統也不能及時地監控到異常。

10、神奇的if

最後一個了,壓軸了。。

來,我們一起賞析下這段神奇的 if 代碼:

if(user.getFirstName() != null)      if(user.getMiddleName() != null)          if(user.getLastName() != null)              if(user.getNickName() != null)                  if(user.getShortName() != null)                      if(user.getFullName() != null)                          if(user.getFamilyName() != null)                              if(user.getEnglishName() != null)                                  ...                                  return true;  return false;                                

這段代碼夠奇葩了吧,一個 if 能搞定的非要寫這麼長,還縮進得這麼有層次感。。

小結

寫神邏輯代碼的人才這麼多,找問題、解決問題真是太難了。