果我在用HTML+CSS編程,那么,我能算是名開發人員嗎?
作者 | Amadou Ibrahim
譯者 | 彎月,責編 | 郭芮
以下為譯文:
有好多次,別人說我算不上程序員,因為我在用HTML + CSS編程。我非常傷心,因為別人都不認為我是開發人員。我們討論了好幾個小時,網上也有很多關于這個話題的討論。但仍然還有人否認這一點,那么就讓我們在本文中好好探討一番。
在深入探討之前,讓我們先來了解一下HTML + CSS的基礎知識。
根據維基百科:
超文本標記語言(英語:HyperText Markup Language,簡稱:HTML)是一種用于創建網頁的標準標記語言。
這意味著你需要使用HTML來構造顯示在網頁上的文檔。下面是一個基本的HTML頁面的例子:
<!DOCTYPE html>
<html>
<head>
<!-- Metadata goes here -->
</head>
<body>
<!-- Page content goes here -->
</body>
</html>
除了HTML之外,你還可以利用CSS來美化頁面。這就是為什么我們會結合二者使用。
根據維基百科:
層疊樣式表(英語:Cascading Style Sheets,縮寫:CSS;又稱串樣式列表、級聯樣式表、串接樣式表、階層式樣式表)是一種用來為結構化文檔(如HTML文檔或XML應用)添加樣式(字體、間距和顏色等)的計算機語言。
下面是一個CSS文件的示例:
*{
box-sizing: border-box; max-width: 100%;
}
body{
font-size: 1.25rem; padding-bottom: 70px;
background: #fff;
}
編程語言的結構
首先,我不止一次聽說有人認為HTML + CSS沒有編程結構。那么編程結構是什么?經過一番搜索后,我發現,現代編程語言的編程結構幾乎都如出一轍。控制結構和數據結構。別著急,且聽我慢慢道來。
控制結構
控制結構指的是,分析變量并根據給定的參數選擇程序執行順序的一塊程序。
控制結構包括順序控制、條件控制和循環控制。下面我來舉例說明。我使用Ruby語言來書寫示例。別擔心,Ruby很接近英語,非常易于理解。
順序控制:逐條執行的指令。在下面的示例中,我們將執行一系列指令。
# Sequences control-structures
## Set a new varibale age to 0.
age = 0
## Then another varibale required_age to 15.
required_age = 15
## Print this message "What is your age?" to the user
puts "What is your age?"
## Get the user input and store it in age. Type 14
age = gets.chomp.to_i
## Print this message "You are 14 year's old" to the user
puts "You are #{age} year's old"
條件控制:如果條件為true,則執行此處的代碼。程序根據條件的結果,決定要執行的代碼塊。
# Condition Control Structure
## Set a new varibale age to 15.
age = 15
## Then another varibale required_age to 16.
required_age = 16
## check if the user age is less than 16
if age < 16
## If the condition is checked, print the message "Sorry, you can't pass the driver license!" to the user
puts "Sorry, you can't pass the driver license!"
else
## If the condition is not checked, print this message "Great! You can pass your driver license" to the user
puts "Great! You can pass your driver license"
end
上述指定的代碼塊將循環執行多次,直到條件成立為止。示例中的條件是“counter”等于5。因此,這則消息輸出了5次。
# Loop Control Structure
## Set a variable "counter" to zero
counter = 1
## Iterate through the loop as long as "counter" is less than 5
while counter <=5 do
## Print "Get your driver license with LicenseGuru"
puts "Get your driver license with LicenseGuru"
## Add 1 to the current value of counter
counter+=1
end
那么,HTML+ CSS有這樣的控制結構嗎?你怎么看?
數據結構
什么是數據結構?維基百科上說:
數據結構(英語:data structure)是計算機中存儲、組織數據的方式。
簡單來說,數據結構表示組織數據、定義數據類型以及操作數據的方法。大多數編程語言都有不同類型的數據,包括字符串、整數、布爾值、數組、對象...
那么,HTML + CSS也有這種數據結構嗎?此外,還有人說HTML + CSS不具備圖靈完備性——那么,圖靈完備性又是什么?
我的第一反應也是發懵。但經過幾個小時的查閱后,我有了大致的了解。
簡而言之,在計算理論里,如果一系列操作數據的規則(如指令集、編程語言、細胞自動機)可以用來模擬單帶圖靈機,那么它是圖靈完備的。
圖靈機是英國數學家艾倫·圖靈于1936年提出的一種將人的計算行為進行抽象的數學邏輯機,其更抽象的意義為一種計算模型,可以看作等價于任何有限邏輯數學過程的終極強大邏輯機器。
圖靈機是一個規則、狀態和轉換的系統,并不是指真正的機器。
如此說來,HTML + CSS確實不具備圖靈完備性。因為HTML + CSS無法更改系統狀態。也無法做出決策或根據輸入更改狀態……
那么,我還能說HTML + CSS是編程語言嗎?
CSS的控制結構
是的,你沒看錯,CSS有自己的控制結構方式。下面是一些例子。
順序控制
與其他編程語言一樣,我們可以在CSS中逐行執行指令。
body{
// Set the background to white color
background:#fff;
// Set the font size to 20px
font-size: 20px;
// Set the background to yellow
background:yellow;
// Set the font size to 14px
font-size:14px
}
在上述代碼中,第一條指令被覆蓋, 所以最后的結果是:
條件控制
@media screen and (max-width: 567px) {
// Style 1
}
@media screen and (max-width: 900px) {
// style 2
}
在上述代碼中,如果設備屏幕的最大寬度為567px,則應用樣式1;如果最大寬度為900px,則應用樣式2。因此,這就是一個條件控制。
@supports (display: flex) {
navbar{
display:flex;
}
}
對于上述navbar的樣式代碼,如果用戶的設備支持,則顯示屬性將設置為“flex”。你甚至可以使用關鍵字“not”書寫false語句:
@supports not (display: flex) {
div { float: left; } /* alternative styles */
}
循環控制
你是認真的嗎?是認真的。CSS也有類似循環的指令。盡管看上去與其他編程語言的循環有所不同。CSS的循環指令沒有“for”循環或“while”循環。讓我們看一下這段代碼:
li a{
font-weight:700;
display: block;
padding: 15px;
margin-bottom:10px;
background:#333;
color:white;
text-align: center;
text-decoration: none;
}
li a.active{
background:red;
color:white;
}
第一段代碼告訴瀏覽器循環遍歷“li”元素內所有的“a”元素,然后應用給定的樣式。第二段代碼告訴瀏覽器再循環一遍。如果“a”元素的類為“active”,則應用給定的樣式。因此,我結合使用了循環和條件控制。
現在你是否同意HTML + CSS具有編程語言結構?你同意?那太好了!我們之間達成了共識,你可以走了。
哦?你還在繼續閱讀?你還有疑問?那么就讓我來一一解答吧。
如果有人說CSS具備圖靈完備性,你會說什么?你無言以對,是嗎?事實上,有一位名叫Eli Fox-Epstein的名人證明了這一點。他進行了一項實驗,并證明HTML + CSS具備圖靈完備性,而這個故事發生在2011年。有關的詳細信息,請點擊這里(https://accodeing.com/blog/2015/css3-proven-to-be-turing-complete)。
所以,你現在可以接受HTML + CSS是一種編程語言了嗎?
HTML + CSS就是當代網頁的“雙俠”(請參照電影《雙俠》)。
對于全世界所有的網站而言,無論其服務器端的語言是什么,前端都使用了HTML + CSS。
當目前為止,互聯網上的網站數目高達17億,供44億用戶使用。而且這個數字還在不斷增長。
這些網站又分為靜態網站和動態網站。靜態網站僅使用HTML + CSS構建。而動態網站還用到了其他語言。
其他語言是什么意思?
為了讓HTML + CSS大放異彩,你還需要其他的編程語言來潤色。常見的編程語言包括PHP、Python、Ruby、Javascript等等。Facebook、Twitter、Google和Medium都是動態網站。他們的網站因結合了多種語言而得以蓬勃發展。
感謝您的閱讀。如果你有不同的觀點,請在下方留言。
原文:https://medium.com/swlh/the-most-used-and-unrecognized-programming-languages-b0882e8c8c6f?
本文為 CSDN 翻譯,轉載請注明來源出處。
【End】
文:mindprod.com/jgloss/unmain.html
譯者:陳皓 (@左耳朵耗子)
譯文:coolshell.cn/articles/4758.html
對,你沒看錯,本文就是教你怎么寫出讓同事無法維護的代碼。
一、程序命名
- 容易輸入的變量名。比如: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
如果喜歡本篇文章,歡迎轉發、點贊。關注訂閱號「Web項目聚集地」,回復「進群」即可進入無廣告技術交流。
文:http://mindprod.com/jgloss/unmain.html
譯者:陳皓 (@左耳朵耗子)
譯文:http://coolshell.cn/articles/4758.html
對,你沒看錯,本文就是教你怎么寫出讓同事無法維護的代碼。
一、程序命名
- 容易輸入的變量名。比如: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
廢了他,歡迎留言區留下你曾經遇到的沒法下手的代碼