主頁 > 後端開發 > 搞破壞(手動滑稽),如何寫出讓同事無法維護的代碼?

搞破壞(手動滑稽),如何寫出讓同事無法維護的代碼?

2020-09-24 08:42:53 後端開發

對,你沒看錯,本文就是教你怎么寫出讓同事無法維護的代碼,

搞破壞(手動滑稽),如何寫出讓同事無法維護的代碼?

 

一、程式命名

  • 容易輸入的變數名,比如:Fred,asdf
  • 單字母的變數名,比如:a,b,c, x,y,z(如果不夠用,可以考慮a1,a2,a3,a4,….)
  • 有創意地拼寫錯誤,比如:SetPintleOpening, SetPintalClosing,這樣可以讓人很難搜索代碼,
  • 抽象,比如:ProcessData, DoIt, GetData… 抽象到就跟什么都沒說一樣,
  • 縮寫,比如:WTF,RTFSC …… (使用拼音縮寫也同樣給力,比如:BT,TMD,TJJTDS)
  • 隨機大寫字母,比如:gEtnuMbER..
  • 重用命名,在內嵌的陳述句塊中使用相同的變數名有奇效,
  • 使用重音字母,比如:int ínt(第二個 ínt不是int)
  • 使用下劃線,比如:_, __, ___,
  • 使用不同的語言,比如混用英語,德語,或是中文拼音,
  • 使用字符命名,比如:slash, asterix, comma…
  • 使用無關的單詞,比如:god, superman, iloveu….
  • 混淆l和1,字母l和數字1有時候是看不出來的,

二、偽裝欺詐

  • 把注釋和代碼交織在一起,
for(j=0; j<array_len; j+ =8)
{
total += array[j+0 ];
total += array[j+1 ];
total += array[j+2 ]; /* Main body of
total += array[j+3]; * loop is unrolled
total += array[j+4]; * for greater speed.
total += array[j+5]; */
total += array[j+6 ];
total += array[j+7 ];
}
  • 代碼和顯示不一致,比如,你的界面顯示叫postal code,但是代碼里卻叫 zipcode.
  • 隱藏全域變數,把使用全域變數以函式引數的方式傳遞給函式,這樣可以讓人覺得那個變數不是全域變數,
  • 使用相似的變數名,如:單詞相似,swimmer 和 swimner,字母相似:ilI1| 或 oO08,parselnt 和 parseInt, D0Calc 和 DOCalc,還有這一組:xy_Z, xy__z, _xy_z, _xyz, XY_Z, xY_z, Xy_z,
  • 多載函式,使用相同的函式名,但是其功能和具體實作完全沒有關系,
  • 運算子多載,多載運算子可以讓你的代碼變得詭異,感謝CCTV,感謝C++,這個東西是可以把混亂代碼提高到一種藝術的形式,比如:多載一個類的 ! 運算子,但實際功能并不是取反,讓其回傳一個整數,于是,如果你使用 ! ! 運算子,那么,有意思的事就發生了—— 先是呼叫類的多載 ! 運算子,然后把其回傳的整數給 ! 成了 布爾變數,如果是 !!! 呢?呵呵,

三、檔案和注釋

  • 在注釋中撒謊,你不用真的去撒謊,只需在改代碼的時候不要更新注釋就可以了,
  • 注釋里面寫廢話,比如:/* add 1 to i */
  • 只注釋是什么,而不是為什么,
  • 不要注釋秘密,如果你開發一個航班系統,請你一定要保證每有一個新的航班被加入,就得要修改25個以上的位置的程式,千萬別把這個事寫在檔案中,
  • 注重細節,當你設計一個很復雜的演算法的時候,你一定要把所有的詳細細設計都寫下來,沒有100頁不能罷休,段落要有5級以上,段落編號要有500個以上,例如:1.2.4.6.3.13 – Display all impacts for activity where selected mitigations can apply (short pseudocode omitted). 這樣,當你寫代碼的時候,你就可以讓你的代碼和檔案一致,如:Act1_2_4_6_3_13() 千萬不要注釋度衡單位,比如時間用的是秒還是毫秒,尺寸用的是像素還是英寸,大小是MB還是KB,等等,另外,在你的代碼里,你可以混用不同的度衡單位,但也不要注釋,
  • Gotchas,陷阱,千萬不要注釋代碼中的陷阱,
  • 在注釋和檔案中發泄不滿,

四、程式設計

  • Java Casts,Java的型別轉型是天賜之物,每一次當你從Collection里取到一個object的時候,你都需要把其轉回原來的型別,因此,這些轉型操作會出現在N多的地方,如果你改變了型別,那么你不一定能改變所有的地方,而編譯器可能能檢查到,也可能檢查不到,
  • 利用Java的冗余,比如:Bubblegum b = new Bubblegom(); 和 swimmer = swimner + 1; 注意變數間的細微差別,
  • 從不驗證,從不驗證輸入的資料,從不驗證函式的回傳值,這樣做可以向大家展示你是多么的信任公司的設備和其它程式員
  • 不要封裝,呼叫者需要知道被呼叫的所有的細節,
  • 克隆和拷貝,為了效率,你要學會使用copy + paste,你幾乎都不用理解別人的代碼,你就可以高效地編程了,
  • 巨大的listener,寫一個listener,然后讓你的所有的button類都使用這個listener,這樣你可以在這個listener中整出一大堆if…else…陳述句,相當的刺激,
  • 使用三維陣列,如果你覺得三維還不足夠,你可以試試四維,
  • 混用,同時使用類的get/set方法和直接訪問那個public變數,這樣做的好處是可以極大的挫敗維護人員,
  • 包裝,包裝,包裝,把你所有的API都包裝上6到8遍,包裝深度多達4層以上,然后包裝出相似的功能,
  • 沒有秘密,把所有的成員都宣告成public的,這樣,你以后就很難限制其被人使用,而且這樣可以和別的代碼造成更多的耦合度,可以讓你的代碼存活得更久,
  • 排列和阻礙,把drawRectangle(height, width) 改成 drawRectangle(width, height),等release了幾個版本后,再把其改回去,這樣維護程式的程式員們很快就不明白哪一個是對的,
  • 把變數改在名字上,例如,把setAlignment(int alignment)改成,setLeftAlignment, setRightAlignment, setCenterAlignment,
  • 保留你所有的沒有使用的和陳舊的變數,方法和代碼,
  • Final你所有的子節點的類,這樣,當你做完這個專案后,沒有人可以通過繼承來擴展你的類,java.lang.String不也是這樣嗎?
  • 避免使用layout,這樣就使得我們只能使用絕對坐標,如果你的老大強制你使用layout,你可以考慮使用GridBagLayout,然后把grid坐標hard code.
  • 環境變數,如果你的代碼需要使用環境變數,那么,你應該把你的類的成員的初始化使用環境變數,而不是建構式,
  • 使用全域變數,1)把全域變數的初始化放在不同的函式中,就算這個函式和這個變數沒有任何關系,這樣能夠讓我們的維護人員就像做偵探作業一樣,2)使用全域變數可以讓你的函式的引數變得少一些,
  • 組態檔,組態檔主要用于一些引數的初始化,在編程中,我們可以讓組態檔中的引數名和實際程式中的名字不一樣,
  • 膨脹你的類,讓你的類盡可能地擁有各種臃腫和晦澀的方法,比如,你的類只實作一種可能性,但是你要提供所有可能性的方法,不要定義其它的類,把所有的功能都放在一個類中,
  • 使用子類,面向物件是寫出無法維護代碼的天賜之物,如果你有一個類有十個成為(變數和方法)你可以考慮寫10個層次的繼承,然后把這十個屬性分別放在這十個層次中,如果可能的話,把這十個類分別放在十個不同的檔案中,
  • 混亂你的代碼,使用XML,XML的強大是無人能及的,使用XML你可以把本來只要10行的代碼變成100行,而且,還要逼著別人也有XML,(參看,信XML得永生,信XML得自信)
  • 分解條件運算式,如:把 a==100分解成,a>99 && a<101
  • 學會利用分號,如:if ( a );else;{ int d; d = c;}
  • 間接轉型,如:把double轉string,寫成new Double(d).toString() 而不是 Double.toString(d)
  • 大量使用嵌套,一個NB的程式員可以在一行代碼上使用超過10層的小括號(),或是在一個函式里使用超過20層的陳述句嵌套{},把嵌套的if else 轉成 [? :] 也是一件很NB的事,
  • 長代碼行,一行的代碼越長越好,這樣別人閱讀時就需要來來回回的
  • 不要過早的return,不要使用break,這樣,你就需要至少5層以上的if-else來處理錯誤,
  • 不要使用{},不要在if else使用{},尤其是在你重量地使用if-else嵌套時,你甚至可以在其中亂縮進代碼,這樣一來,就算是最有經驗的程式員也會踩上陷阱,
  • 瑣碎的封裝,比如封裝一個bool類,類里面什么都做,就是一個bool.
  • 回圈,千萬不可用for(int i=0; i<n; i++)使用while代替for,交換n和i,把<改成<=,使用 i–調整步伐 ,

五、測驗

  • 從不測驗,千萬不要測驗任何的出錯處理,從來也不檢測系統呼叫的回傳值,
  • 永遠不做性能測驗,如果不夠快就告訴用戶換一個更快的機器,如果你一做測驗,那么就可能會要改你的演算法,甚至重設計,重新架構,
  • 不要寫測驗案例,不要做什么代碼覆寫率測驗,自動化測驗,
  • 測驗是懦夫行為,一個勇敢的程式員是根本不需要這一步的,太多的程式太害怕他們的老板,害怕失去作業,害怕用戶抱怨,甚至被起訴,這種擔心害怕直接影響了生產力,如果你對你的代碼有強大的信心,那還要什么測驗呢?真正的程式員是不需要測驗自己的代碼的,

六、其他

  • 你的老板什么都知道,無論你的老板有多SB,你都要嚴格地遵照他的旨意辦事,這樣一來,你會學到更多的知識以及如何寫出更加無法維護的代碼,
  • 顛覆Help Desk,你要確保你那滿是bug的程式永遠不要被維護團隊知道,當用戶打電話和寫郵件給你的時候,你就不要理會,就算要理會,讓用戶重做系統或是告訴用戶其帳號有問題,是標準的回答,
  • 閉嘴,對于一些像y2k這樣的大bug,你要學會守口如瓶,不要告訴任何人,包括你的親人好友以及公司的同事和管理層,這樣當到那一天的時候,你就可以用這個bug掙錢了,
  • 忽悠,你會學會忽悠,就算你的代碼寫得很爛,你也要為其掛上GoF設計模式的標簽,就算你的專案做得再爛,你也要為其掛上敏捷的標簽,讓整個團隊和公司,甚至整個業界都開始躁動,這樣才能真正為難維護的代碼鋪平道路,

總之,我們的口號是—— Write Everywhere, Read Nowhere

原文:http://mindprod.com/jgloss/unmain.html

譯者:陳皓 (@左耳朵耗子)

譯文:http://coolshell.cn/articles/4758.html

最近面試BAT,整理一份面試資料《Java面試BAT通關手冊》,覆寫了Java核心技術、JVM、Java并發、SSM、微服務、資料庫、資料結構等等,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117764.html

標籤:Java

上一篇:別在網上亂找代碼了,找了一段代碼突然爆了!!!

下一篇:探討Netty獲取并檢查Websocket握手請求的兩種方式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more