Board logo

主題: [其他] [轉貼] 程式設計師要如何讓公司不敢隨便開除你 [打印本頁]

發表人: jocosn    時間: 2006-7-22 05:43 AM     主題: [轉貼] 程式設計師要如何讓公司不敢隨便開除你

寫出無法維護的程式

寫出無法維護的程式 - 簡介 (How To Write Unmaintainable Code)
原作 Roedy Green ©1997-2004 Canadian Mind Products.
中譯 Fred Wang(王富民) (http://fmwang.blogspot.com)

簡介
為了得到Java程式設計師的聘僱機會, 我寫了這些技巧給雇主有關如何讓寫出來的程式難以維護, 而這些維護者必須跟在你旁邊幾年才有辦法做最簡單的修改. 更進一步你若虔誠地遵循這些規則, 你可以確保終身被雇用, 因為除了你以外, 沒有人希望進入維護程式的煉獄. 另外, 如果你虔誠地遵循這全部的規則, 甚至連你自己都可能無法維護這些程式.

不要做的太過分. 你的程式不該看起來完全沒有可以維護的希望, 而是只是一定程度的問題. 否則會有被重寫或重構的風險

這篇論文分成下面段落(原來各段落為網頁上的連結)
a.财 基本原則General Principles
b.财 命名Naming
c.财 偽裝Camouflage
d.财 文件Documentation
e.财 程式設計Program Design
f.财 程式模糊化Coding Obfuscation
g.财 測試Testing
h.财 語言的選擇Choice Of Language
i.财 對付其他人Dealing With Others
j.财 寫你自己的東西Roll Your Own
k.财 掌握語言的弱點Tricks In Offbeat Languages
l.财 混雜的技術Miscellaneous Techniques
m.财 哲學Philosophy
n.财 沒有鞋的鞋匠The Shoemaker Has No Shoes
o.财 貢獻者Contributors
p.财 運作白蟻Operation Termite

基本原則General Principles
要搞垮維護程式設計師, 就要先了解他在想什麼. 他有你龐大的程式且他沒有時間全部讀完並了解這些程式. 他要快速的找到他要改的地方, 並確定沒有因為更改而產生額外問題並順利上線

他檢視你的程式猶如看廁所的捲紙筒, 一次只能看到程式的一個小片段. 你要讓他無法得到程式的全貌. 你儘可能的讓他很困難的才可以找到他要找的程式. 更重要的是, 你要讓程式儘可能笨拙的讓他忽略掉一些重要的部分

程式設計師會習慣於某些設計慣例, 但是你可以在程式每隔一段程式就偷偷的違反這個慣例, 迫使他必須仔細的檢視每一行程式

你可以根據不同語言的特性, 洽當的誤用這些特性, 就可以創造出無法維護的程式


命名
寫無法維護的程式許多的技巧是在變數與方法命名上,這些技巧並不會被編譯器視為錯誤,這讓你有大量的自由使用這些技巧把維護程式者搞得昏頭轉向。

1.  用嬰兒命名的方式命名
買本嬰兒命名書,那麼你就不缺變數名稱。例如一些容易輸入的字如Fred。其他像鍵盤上鄰近的字如adsf等。

2. Single Letter Variable Names用單一字母的變數名稱
如果用a, b, c 這類的字就無法用簡單的文字編輯器找到使用它的地方。而且沒有人可以猜的出來這變數是幹麼用的。

3. Creative Miss-spelling 使用有創意的錯別字
如果你要用描述性的變數及功能名稱,就用拼錯的字,或有些對有些錯的組合如 SetPintleOpening Set PintalClosing,這樣就讓一些工具的搜尋功能無法發揮作用。

4. Be Abstract 用抽象的字
在功能及變數的命名上用一些抽象的字,如 it, everything, data, handle, stuff, do, reoutine, perform及數字如routineX48, PerformDataFunction, DoIt, HandleStuff and do_args_method等。

5. A.C.R.O.N.Y.M.S. 用縮寫
用縮寫字讓程式更精簡。真正的男子漢不用解釋這些縮寫, 因為他們生下來就懂得這些字。

6. Thesaurus Surrogatisation 辭典代理人
為避免無聊,使用辭典儘可能尋找一些相同動作的可替代性詞彙,如 : display, show, present。將有重要差異但相似的功能使用相同的字來描述,例如print表示”write to a file”, “put ink on paper”, and “display on the screen”。不要為特定目的的專案編寫明確定義的語彙表,這樣是不專業的,因為違反結構化設計資訊隱藏的原則。

7. Use Plural Forms From Other Languages 使用別種語言的複數形式
使用世界語(Esperanto), 克林貢語Klingon(出自電影星際大戦http://www.kli.org) and 哈比語(Hobbitese出自電影魔戒) 等語言,讓您往世界和平的目標邁進。

8. CapiTaliSaTion 將字中的每個音節的第一個字用大寫
For example: ComPuteRasTerHisToGram().

9. Reuse Names 重用名稱
在程式語言允許的範圍內給classes, constructors, methods, member variables, parameters and local variables相同的名稱。另外在相同的{}區塊重複使用local variable名稱,這樣可以讓維護程式的人可以仔細的檢查每一個instance的範圍。特別在Java,可以讓一般的methods偽裝成constructors。

10. Åccented Letters 使用重音字母
使用一般的編輯器很難區分重音字母上的斜線( í )

11. Exploit Compiler Name Length Limits 利用compiler在名稱長度的限制
如果編譯器只判別名稱的前八字元,那麼就變更結尾字元,例如一個用var_unit_update(),另一個用var_unit_setup()。編譯器將兩個都視為var_unit。

12. Underscore, a Friend Indeed用底線
Use _ and __ as identifiers.

13. Mix Languages 混合語言
混用兩種語言(人與電腦)。如果你的老闆堅持你使用他的語言,就告訴他,你只能用你自己的語言組織你的思想,如果這種方式沒有用則控告他語言歧視。

14. Extended ASCII 用ASCII擴充碼
ASCII的擴充碼拿來作變數名稱,包含ß, Ð, and ñ等字元。這些字在一般簡單的文字編輯器沒有複製貼上的話是幾乎無法輸入的。

15. Names From Other Languages 用別種語言命名
用外國語言字典當作變數名稱的來源。例如用德語的punkt表示point。維護程式的人如果沒有你對德語的了解,則將會享受到翻譯多國語言的經驗。

16. Names From Mathematics用數學運算子的名稱:
e.g.: openParen = (slash + asterix) / equals;

17. Bedazzling Names 用令人迷惑的名字
選用與內涵無關的字作為變數名稱,這可以混淆讀者,因為他們試著去了解程式邏輯時,很難不去聯想到該字的意義,而這個字的意義和資料本身是不相干的。
e.g.: marypoppins = (superman + starship) / god;

18. Rename and Reuse 重新命名及重用命名
這招在Ada這個程式語言特別有效。讓一些地方參考到舊的名字,留下陷阱給別人

19. When To Use I 使用i的時機
不要把i用在最內層的迴圈變數。大膽的用i在其他目的,特別是非整數變數,然後用n作為迴圈索引。

20. Conventions Schmentions
不管Sun Java命名慣例。例如inputFilename與inputfileName只有大小寫的差異。

未完,有興趣者自行觀看下列原文
http://mindprod.com/jgloss/unmain.html

http://www.freevbcode.com/ShowCode.Asp?ID=2547
發表人: alexchen    時間: 2006-8-4 11:03 AM

不敢隨便開除你,
另一種解釋是不敢任用你!
發表人: ROACH    時間: 2006-8-6 10:37 PM

要如何讓公司不敢隨便開除你
其實最現實的問題~~

就是『人際關係』啦~

通常公司要叫你走路
有兩種情形

公司經營不散要遣散人:
如果你平時做人好的話~相信老闆在看這一堆遣散名單之中
也會特別把你剔除掉把你留下來

平時太白目不努力:
很現實的問題,平時就在那邊混吃等死,不請你走要請誰走~


不過你交情好,那就另當別論的~
老闆看到你發生的一個過錯,會幫你找到好幾個理由~去說服自己原諒你

假如你平時做人就不太好
老闆看到你發生的一個過錯,會想到好幾個你的缺點~想辦法叫你滾蛋

[ROACH 在  2006-8-6 10:38 PM 作了最後編輯]
發表人: swimman    時間: 2006-8-24 01:40 AM

我個人覺得程式設計師的人生就像是寄居蟹一樣
會隨著個人的成長而不停的換工作
一開始工作能力不足只能從小系統開始寫起
等能力好了點就會換到大一點的系統,
換到大一點的公司,有著大一點的PARTITION
所以在程式設計師的成長期不換工作
就像是硬縮在太小的殼裡面
把自己搞的很不舒服,而且成長期過了也就再也長不大了
發表人: rja    時間: 2006-9-6 11:24 PM

原來我們公司的工程師比我先拜讀過這一篇
難怪他的寫法我都猜不透................
發表人: soupjvc999    時間: 2006-9-15 01:19 AM

作者想必是經驗老道的人
這篇反諷法,應該是為了講出他 maintain 坎坷的遭遇
發表人: wugen    時間: 2006-9-22 10:03 PM

會寫PERL的人都枝到這是一個很沒規局的語言...  
而且有些網站還可以幫你把PERL寫的更亂
參考:
http://liraz.org/obfus.html

高手寫的曾經得過獎的例子:
package S2z8N3;{
    $zyp=S2z8N3;use Socket;
        (S2z8N3+w1HC$zyp)&
    open SZzBN3,"<$0"
  ;while(<SZzBN3>){/\s\((.*p\))&/
    &&(@S2zBN3=unpack$age,$1)}foreach
   $zyp(@S2zBN3)
  while($S2z8M3++!=$zyp-
  30){$_=<SZz8N3>}/^(.)/|print $1
      ;$S2z8M3=0}s/.*//|print}sub w1HC{$age=c17
;socket(SZz8N3,PF_INET,SOCK_STREAM,getprotobyname('tcp'))&&
connect(SZz8N3,sockaddr_in(023,"\022\x17\x\cv"))
       ;S2zBN3|pack$age}
發表人: NeoBetas    時間: 2007-2-7 03:36 PM


引用:
wugen寫到:
會寫PERL的人都枝到這是一個很沒規局的語言...  
而且有些網站還可以幫你把PERL寫的更亂
參考:
http://liraz.org/obfus.html

高手寫的曾經得過獎的例子:
package S2z8N3;{
    $zyp=S2z8N3;use Socket;
        (S2z8N3+w1HC$zyp)&
    open SZzBN3,"<$0"
  ;while(<SZzBN3>){/\s\((.*p\))&/
    &&(@S2zBN3=unpack$age,$1)}foreach
   $zyp(@S2zBN3)
  while($S2z8M3++!=$zyp-
  30){$_=<SZz8N3>}/^(.)/|print $1
      ;$S2z8M3=0}s/.*//|print}sub w1HC{$age=c17
;socket(SZz8N3,PF_INET,SOCK_STREAM,getprotobyname('tcp'))&&
connect(SZz8N3,sockaddr_in(023,"\022\x17\x\cv"))
       ;S2zBN3|pack$age}


是不錯啦...
但是自己的工作量也會因此而加倍....
不過,如果團體開發的環境(如Microsoft Windows Team),那我告訴你你會是第一個被開除的....

發表人: stanleyh    時間: 2007-2-12 03:18 PM

其實沒有任何工作非某個人不可...
目標放的更遠...
上層才能感受到下屬的企圖心..
如果有一個工作非某個人不可...
那此人也只能待在這工作上...
因為他可能要花很多心思去防別人怎麼學會他的專業..
卻沒有其他的心思去怎麼讓自己往上一層樓...
最後...還是逃不了開除的命運...
發表人: PresarioNeil    時間: 2007-2-14 07:35 PM

寫出無法維護的程式,這樣很沒有職業道德,我知道很多人寫程式都不加註解的,有的是偷懶,有的是忘記,至於故意不加的就很少聽過囉~
發表人: NeoBetas    時間: 2007-2-17 07:46 AM

在模組化分工的情況下...
有的大型公司為了怕被開天窗會找不只一個人負責相同的部分....
所以....
發表人: felix    時間: 2007-2-23 04:17 PM

程式設計師應著重於設計出穩定,效率高,size小,易讀。把程式弄得不容易讀,基本上只是自找麻煩而已。而且沒有程式是trace不出的,要不要花時間而已。所以要讓公司不隨便開除妳,唯有持續精進自己而已~
發表人: den007    時間: 2007-2-24 08:17 PM

我認為把程式寫的令人看不懂,只為了保住自己的工作
這是很自私的行為,國家要有競爭力,不是這樣做的
眼光看遠一些、廣一些

但這一篇文章還是另人有反向思考的空間
發表人: sueboy    時間: 2007-2-24 11:54 PM

最簡單的,來個多層(十層)且多父親的繼承,當場腦袋當機,不知道如何demo起......
發表人: AGC    時間: 2007-3-1 09:47 AM

掌握全公司的關鍵技術才是王道。
發表人: dayi    時間: 2007-3-1 12:23 PM

看完的感覺是
這是很反諷的文章

在下寫程式斷斷續續也有十年以上的時間了
最怕碰到的就是維護別人的程式
在我而言
寫的好的程式並不一定是效率最高,程式碼最少的程式
而是條理清楚,註解完整的程式
過度賣弄技巧的程式反而會令人厭惡

我並不想把寫程式當做一輩子的職業
看到業界有不少前輩當了20年的PG,從菜鳥PG一直到資深PG
因為不求進步,還只能是PG而己
那麼與其養一個月薪5,6萬的資深PG(還不能加班)
倒不如請3個月薪只要2萬多的大學剛畢業的(加班睡公司,隔天起來繼續寫)
現在的資訊業界PG早就飽合了
說實在的
我自己coding的功能也不怎樣
但我已經能從PG升至SA

如何讓公司不敢開除我,還能升職
就是我能做的"並不止是一個程式設計師"
培養自己的能力,以宏觀的角度去看系統
進而能設計、規劃系統、帶領PG解決問題
公司要的是人材,能幫公司賺錢的
你解決愈多的問題,公司就賺更多
那公司還會開除你嗎?

廢言有點多了,就此打住
以上是在資訊業界的一點感想

[dayi 在  2007-3-1 12:25 PM 作了最後編輯]
發表人: 桂正和    時間: 2007-3-1 03:35 PM

每次看到這篇有點好笑
但是有著更多的無奈

常常碰到不知道該怎樣維護的程式
光是理解就花上一堆時間
如果好死不死
要修改的地方連動到很多層面
我真的會考慮重寫
發表人: steven211    時間: 2007-3-3 10:10 PM

個人覺得一個較有規模的開發團隊當中,
程式的變數、常數、函式、模組的命名規則乃至整個程式的架構是由Team Leader(或稱架構師好了)所訂定的,
PG只不過類似一個照空格填答案的一個寫手,
如果這樣架構出來的程式別人看不懂也蠻有問題的(頂多時間的多寡罷了),
連這種架構人材都沒有的公司基本上也差不多該倒一倒了
身為技術員我只有"Just Fun"兩個字送給大家,
我們只有稟持這兩個字才有辦法在資訊洪流生存下去。
發表人: 北極熊大發    時間: 2007-3-14 04:15 PM

寫出無法維護的程式碼叫鬼才...這類人反而無法在團隊工作...而公司也不一定敢用你
發表人: LiuRambo    時間: 2007-11-27 12:54 PM

何必這樣搞心機啦
把搞這的時間拿來多學些東西不是更好嗎
不然去拍拍主管的馬屁說不定還有些意想不到的好處

發表人: crazydark    時間: 2007-11-28 01:04 AM

照樓主貼的那篇文章做的人
保證最後吃苦頭的會是自己!!
等你寫完一年後
做完另一件案子又被叫來維護時就"知死"了
發表人: cnewave    時間: 2008-1-12 01:52 PM

按照上述的作法 ....在某些地方應該很快就會被踢走吧....
畢竟寫要找人寫程式並沒有那麼難....應該要在人際關係及關鍵技術上 才能讓公司重用你...
況且自己亂寫種下的因 通常也都是要由自己收拾...
發表人: digisp    時間: 2008-1-12 02:04 PM

同意..不過再趕案子的時候,常會無意間就忘記註解..
過個幾天,就傻了.

而且同理心,當你接手前人的Case,對方這樣寫
那天開始會讓你加班到死,兩眼昏花,全身癱瘓
最後動彈不得,口吐白沫在電腦桌上




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0