一名合格黑客所具備的基本技能包括那些?


基本技能:

  • 異想天開的腦子
  • 對機械的工作方式的敏銳嗅覺
  • 行動力和蔑視社會常規道德觀的性格

總之我的確是這樣理解的。有些人認為歷史上第一名黑客所做的事就是攻破遠距離電話撥號系統,使用的工具是一個口哨(John Draper)。我對此表示贊同,並且認為黑客的引人注目之處在於四兩撥千斤,以個人之力藐視一個群體的複雜智力勞動。
一個人如果能把搜索引擎用到巔峰造極,快速發現一些機密信息我認為也屬於黑客的範疇。


參考 @pansz 引用(http://www.zhihu.com/question/19891424/answer/13268473)的《怎樣成為一名黑客中》的幾條:

  • 至少掌握一門樂器;
  • 掌握一門 Martial Art;
  • 掌握至少六門編程語言;
  • 掌握英語;
  • 熱愛科幻;
  • 為自由軟體社區做貢獻。

詳見:如何成為一名黑客?

主要的技能是學會如何思考,具體的包括一些基礎:

1. 學習如何編程。

這當然是最基本的黑客技能。如果你還不會任何編程語言,我建議你從Python開始。 它設計清晰,文檔齊全,合適初學者入門。 它是一門很好的入門語言,並且不僅僅只是個玩具; 它非常強大、靈活,也適合做大型項目。 我有一篇 Python評價詳細說明這點。好的 教程 可以在Python網站得到。 (譯者:比較好的中文Python站點可能是http://pythonrecord.51.net。)

Java也是好的入門語言。它比Python難得多,但是生成的代碼速度也快得多。 它同時也是一種優秀的計算機語言,不止是用來入門。但是注意,如果你只會一兩門語言,你將不會達到黑客所要求的技術水平, 甚至也不能達到一個程序員的水平——你需要學會如何以抽象的方式思考編程問題, 獨立於任何語言。要做一名真正的黑客,你需要學會在幾天內通過一些手冊, 結合你現在所知,迅速掌握一門新語言。這意味著你應該學會幾種截然不同的語言。

如果要做一些重要的編程工作,你將不得不學習C語言,Unix的核心語言。 C++與C非常其他類似;如果你了解其中一種,學習另一種應該不難。 但這兩種都不適合編程入門者學習。而且事實上,你越避免用C編程,你的工作效率會越高。C非常有效率,節約你的機器資源。不幸的是,C的高效是通過你手動做很多底層的管理 (如內存)來達到的。底層代碼都是複雜極易出現bug的,會使你花極多的時間調試。 如今的機器速度如此之快,這通常是得不償失——比較明智的做法是使用一種運行較慢、較低 效率,但大幅節省你的時間的語言。因此,選擇Python。

其他對黑客而言比較重要的語言包括 Perl和 LISP。 Perl實用,值得一學;它被廣泛用於動態網頁和系統管理, 因此即便你從不用Perl寫程序,至少也應該學會看。許多人使用Perl的理由和 我建議你使用Python的理由一樣,都是為了避免用C完成那些不需要C高效率的工作。 你會需要理解那些工作的代碼的。LISP值得學習的理由不同——最終掌握了它時你會得到豐富的啟迪和經驗。 這些經驗會使你在以後的日子裡成為一個更好的程序員,即使你實際上很少使用LISP本身。

當然,實際上你最好五種都會(Python,Java,C/C++,Perl和LISP)。 除了是最重要的黑客語言外,它們還代表了截然不同的編程思路和方法,每種都會讓你受益非淺。這裡我無法給你完完全全的指導教會你如何編程——這是個複雜的技能。 但我可以告訴你,書本和上課也不能作到(最好的黑客中,有許多,也許 幾乎都是自學成材的)。 你可以從書本上學到語言的特點——只是一些皮毛, 但要使書面知識成為自身技能只能通過實踐和虛心向他人學習。 因此要作到 (一)讀代碼(二)寫代碼。學習如何編程就象學慣用優美的自然語言寫作一樣。 最好的做法是讀一些大師的名著,試著自己寫點東西,再讀些,再寫點,再讀些,再寫點…… 如此往複,直到你的文章達到你體會到的範文的簡潔和力量。

過去找到適合閱讀的好的代碼是困難的,因為幾乎沒有大型程序的源代碼能讓新手練手。 這種狀況已經戲劇性地發生變化;開放源代碼軟體,編程工具和操作系統(全都由黑客寫成)現在已經 隨處可見。讓我們在下一個話題中繼續討論……
2. 得到一個開放源代碼的Unix並學會使用、運行它。
我假設你已經擁有或者能使用一台個人電腦(今天的孩子們真幸福)。新手們能夠朝學習黑客技能邁出的最基本的一步就是得到 一份Linux或BSD-Unix的一種,安裝在個人電腦上,並運行它。沒錯,這世界上除了Unix還有其他操作系統。 但它們都是以二進位形式發布的——你無法讀到它的源代碼,也不可能修改它。 嘗試在運行DOS或Windows或MacOS的機器上學習黑客技術,就象是帶著腳鐐學跳舞。除此之外,Unix還是Internet的操作系統。 你可以學會上網卻不知道Unix,但你不了解Unix就無法成為一名Internet黑客。 因此,今天的黑客文化在很大程度上是以Unix為中心的。(這點並不總是真的, 一些很早的黑客對此一直很不高興,但Unix和Internet之間的聯繫已是如此之強, 甚至連Microsoft也無可奈何。)

所以, 安裝一套UNIX——我個人喜愛LINUX但還有其他種類的 (是的,你可以同時安裝Linux及DOS/Windows在同一電腦上)。 學習它,使用它,配置它。用它在Internet上衝浪。閱讀它的源代碼。修改它的源代碼。 你會得到比在Microsoft操作系統上更好的編程工具(包括C,LISP,Python及Perl)。 你會覺得樂趣無窮,學到在你成為大師之前意識不到的更多的知識。

想知道更多關於學習Unix的信息,訪問 The Loginataka。
想知道如何得到一份Linux,訪問 我在哪裡可以獲得Linux。
你可以在 http://www.bsd.org找到BSD Unix的求助及其他資源。

我有寫一篇關於 Unix和Internet基礎的入門文章。
(註:如果你是一個新手,我不推薦自己獨立安裝Linux或者BSD。 安裝Linux的話,尋求本地Linux用戶組的幫助;或聯繫 Open Projects Network。 LISC維護著一些 IRC頻道, 在那裡你可以獲得幫助。)
3. 學會如何使用WWW和寫HTML

黑客文化建造的大多東西都在你看不見的地方發揮著作用,幫助工廠、辦公室和大學正常運轉, 表面上很難看到它對非黑客的普通人的生活的影響。Web是一個大大的例外。 即便政客也同意,這個巨大耀眼的黑客玩具正在改變整個世界。 單是這個原因(還有許多其它的),你就需要學習掌握Web。
這並不是僅僅意味著如何使用瀏覽器(誰都會),而是要學會如何寫HTML, Web的標記語言。如果你不會編程,寫HTML會教你一些有助於學習的思考習慣。 因此,先完成一個主頁。(網上有很多好的教程; 這是一個。)

但僅僅擁有一個主頁不能使你成為一名黑客。 Web里充滿了各種網頁。大多數是毫無意義的,零信息量垃圾——界面時髦的垃圾, 注意,垃圾的水準都類似(更多信息訪問 The HTML Hell Page)。
要想有價值,你的網頁必須有內容—— 它必須有趣或對其它黑客有幫助。這是下一個話題所涉及的……
4. 如果你不懂實用性的英語,學習吧。

作為一個美國人和一個以英語為母語的人,我以前很不情願提到這點,免得成為 一種文化上的帝國主義。但相當多以其他語言為母語的人一直勸我指出這一點,那就是 英語是黑客文化和Internet的工作語言,你需要懂得以便在黑客社區順利工作。

這一點千真萬確。大概1991年的時候我就了解到許多黑客在技術討論中使用英語,甚至當他們的母語都 相同,英語對他們而言只是第二語言的時候;據我知道的報導,當前英語有著比其他語言豐富得多的技術辭彙, 因此是一個對於工作來說相當好的工具。 基於類似的原因,英文技術書籍的翻譯通常不令人滿意(如果有翻譯的話)。

Linus Torvalds,一個芬蘭人,用英語注釋他的代碼(很明顯這對他來說不是湊巧)。 他流利的英語成為他能夠管理全球範圍的Linux開發人員社區的重要因素。 這是一個值得學習的例子。


懂得感恩


根據Richard Stallman的說法,黑客行為必須包含三個特點:好玩(playful)、高智商(cleverness)、探索精神(exploration)。


單手脫殼。


ESR定義的hacker是廣義的。估計lz有興趣的是狹義的hacker。

然而在這個狹義的hacker里,還能再細分。比如說有專門黑網站的,基本上都是在找SQL注入和XSS的機會。有專門寫/分析病毒的,綁定的平台是x86+win。還有一批人專門研究各種平台的overflow。如:各種重要的lib,比如allocator,font engine,png/jpg/gif engine,browser core等等等等;幾大重要的kernel,linux/freebsd/andriod/ios;重要的遊戲平台,比如ps3/psp/psvita/wii/xbox等等。

有意思的是,不管是哪個小圈子,都有相當數量的中學生。就我接觸到的幾個中學生來說,他們的技術水平早已不是script kids,而是有相當紮實的C/C++和彙編基礎,英語則早就不是問題了。

至於需要哪些基本技能,主要還是看你中意哪條路。就我的體會來說,要向如下幾個方向努力:
- c/c++ 注意,這裡不僅指從語義上和編程了解c/c++,而且要從compiler的角度來了解。知道compiler常用的模式,比如虛表的實現,jmp table的實現。除此之外,幾個常用的ABI必須瞭然於胸。
- 彙編 現在平台不只有x86了,arm/mips/power都有自己的市場,所以基本上幾個體系都得了解。最好是熟悉到能看到彙編就想到對應的c,反之亦然。
- 了解主流allocator的行為和細節。不然的話就沒法搞清楚heap是怎麼管理的。也就沒法找heap overflow。
- 了解主流processor和MMU的保護機制。同樣,不限於x86。
- 了解主要crypto演算法及實現。AES/DES/IDEA/ECC等。

當積累到一定程度後,會聚焦於某一特定平台。到了那個階段,日常工作就是不停的audit。很煩瑣的工作,但一旦有了發現也是很激動的。

因為我對SQL/XSS以及win平台沒經驗,所以就不多說那兩方面的需要了。


一般的:會用黑客軟體,懂原理,網路,系統。
高手:會開發黑客軟體,破解演算法,知道後門,漏洞。


利用技術手段屏蔽此類問題,避免浪費自己的寶貴時間。


推薦閱讀:

怎樣讓一個編程新手的演算法思路,邏輯思路變清晰?
老大隻讓用vi寫代碼該怎麼破?
如何維護可讀性很差的代碼?
雷軍問我:你寫程序有寫詩一樣的感覺嗎?
哪種語言適合沒有編程經驗的人學習?

TAG:程序員 | 編程 | 黑客Hacker |