1. 程式人生 > >java技術大牛修煉記5-一名中級程式設計師的自述

java技術大牛修煉記5-一名中級程式設計師的自述

我是一名中級程式設計師。

我有相當不錯的基本技能。我犯了足夠多的錯誤才明白為什麼那些被稱為錯誤。我很清楚我還需要了解更多東西。最重要的是,我知道那些東西大概是什麼,並且我正在努力而積極地提升自己。

勇敢地承認自己不過是水平一般的程式設計師,這花了我一些時間。我不再感覺有必要去抓住那些我並不瞭解的觀點。當人們發現我對某樣東西不瞭解時,我也不再感到害怕。

事情並非從來如此。你可能對此不以為然,但是我曾經自詡為程式設計大師。

這種對自己能力的不正確的評估,很大程度歸因於我在一個相對封閉的環境中學習技能。在過去那些日子裡,有電腦就已經很特別了;更不用說知道如何使用了。

在我自己看來,我當時是一個知識淵博並且經驗豐富的程式設計師。在我不到20歲的時候我已經用C++、Pascal、C#、JavaScript寫過程式。當然我最引以為傲的是,曾經徒手用PHP編了一個電子商務平臺。

事實上,我可能只是人們平時談話中提到的“我有個朋友的兒子很會寫網站”。我和別的程式設計師沒有任何交流,所以我僅有的比較物件是我周圍的人;要麼是一些根本不在意電腦的人,要麼是那些會用電腦,但是在IE視窗中塞了5個沒用的工具欄的人。那些可能會說“我的網壞了”這種話的人。

接下來這個故事就是講我如何產生自己很厲害的幻覺的。

天才的起源

當我九歲的時候,我的一個朋友家裡有衛星電視。而在我們家裡,我們只能收到四個英國的頻道(你能想象第五頻道出現之前的日子嗎?),我熱切地盼望有一臺普通的電視機。我們所需要的只是那些“衛星盤子”,或者我稱為“衛星”的東西——那樣我就隨時可以看QVC臺或者Eurosport臺。由於隱約意識到自己的某種天分,我開始搭建自己的衛星!我的設計包括了一把開啟的傘和一條銅質音訊線,一段接在傘的金屬柄上,另一端接在電視機天線上。必須承認我的設計有一些缺陷,並直接導致我沒有得到想要的結果。但是這個小故事僅僅想表達我童年和青少年時期對技術的渴望。我認識的人中從沒人想過製造“衛星”。

幾年後,當我父親的辦公室得到一個14.4k的貓時,我成為了最早一批網民一員。我能回憶起花了整個星期六下午的時間等待這個火焰漫畫圖示被載入,每個幀的動畫大概要過一分鐘才顯示。我甚至用Netscape搭建了我自己的網站。由於不知道網際網路的架構,我把所有的HTML檔案存放在本地,並且期待有一天他們會出現在網際網路上。然而這些細節並沒有削弱一個事實:我認識的人中沒有一個製作了他們自己的網站。

在我十多歲的時候,我發現了自己天才中的黑暗面。在裝備了Jolly Rogers的食譜後,我和一群小夥伴們準備動搖整個九十年代英格蘭的技術和道德根基。破解電話系統是我們的專長。我們用手提式聲音耦合器和公用電話,給我們在ICQ上認識的美國姑娘們打免費國際電話,以及在私人交換機上設立語音信箱。最終學業和滑板阻止了我們在這條路上越走越遠,如果沒有這些干擾,我們無疑已經在製造凝固汽油,黑進政府網站並且徒手殺人了。儘管我們沒有把自己的能力發揮到極致,但事實是除了我們沒有其他人哪怕擁有聲音耦合器。

儘管到那個時候我已經經歷了一些冒險和失敗,我還是缺少一些東西。我的想法總是要超前我自身能力好幾步-正如在“衛星”一節裡體現出來的。我需要一種把我腦海中想法表達出來的方式。我需要一個直接的介於我想象和現實之間的介面。

Fuck 生成器

真正的轉機出現在我十四歲的時候。我購買了一份PC Plus雜誌,其中附贈了帶有完整版Borland C++編譯器的CD。我安裝了,並且認真學習了雜誌上的“hello world”教程。

就這樣,一個嶄新的世界在我面前打開了。物質世界對於我想象力的限制消失了。我的創造力被解放了,我腦海中的大教堂要成為現實了!我該把這個新工具用於怎樣崇高的事業呢?很顯然,Fuck生成器。

簡單而優雅的Fuck生成器是一個命令列程式,也是我即”hello world”之後第一個里程碑。程式開始執行後會提示使用者輸入一個數字n,然後它會輸出字串”fuck”,n次。最後使用者被提示可以重複以上過程或是退出。儘管功能有限,我還是沉醉於我所品嚐到的成就。這是任何程式設計師都能享受到的一種快感,即看著機器執行你的命令,不管這個任務有多簡單。它在運行了,並且你知道為什麼它能夠執行。它除了在那裡執行不會做任何別的事。

過了些時日,另一期的PC Plus附贈了一個完整版的Borland Delphi。有了這個,我把程序升級為帶有視窗介面並且可以隨機生成彩色的4種不同的髒話。當別的孩子在玩PlayStation的時候,我正在投身於一項更有意義和創造性的事業,我在生成很多fuck。

到那時,一切都預示著我是註定要成大事的。我要向世人展示我真正可以做的事情。

我的鉅著

在90年代晚期,我為一家小型並且擴張迅速的郵件訂購零售商建立了一個網站。一開始,這個站點只包含一些靜態的頁面——關於商品的小冊子,一個導航選單和一個訪問數量計數器。

當我們的訪問量越來越大時,我們決定加入電子商務功能。我們遍歷了一些現成的工具包,它們的質量從差到極差不等。我印象中第一個版本大部分建立在擺弄cgi指令碼以及怪異地把<select>元素用於幾乎所有的使用者互動部分之上。之後的一個版本是充斥著framesets和Javascript的怪物——遠在Javascript成為舉世皆準的構建應用功能的方式之前。另一個版本是由微軟的Access資料庫驅動的。

不久後我們意識到,如果我們想要一個真正可用的甚至體面的線上商店,我們需要一個自定義解決方案。我想到了我過去的成功經驗:fuck生成器系列,以及截至那時我所編寫的優秀網站,這其中:我的 Manic Street Preachers吉他譜收藏網站非常具有權威性。我認為是時候看看我能真正做些什麼的時候了。我要自己從頭開始幹。

從頭開始?即使那個時候開源框架已經存在,我也不會知道他們。我有自己的計劃。我買了一本關於PHP和MySQL的書,一邊學習一邊著手搭建新的網站。

幸運的是,這本書把一個非常簡單的購物網站作為它的核心例子。所有的部分都在那兒:“category.php”會列出一個目錄中的所有物品;“product.php”會顯示商品資訊以及把該商品加入購物車的按鈕;以及最重要的“cart.php”,它是所有奇蹟發生的所在。這就是我想要的東西!

我孜孜不倦地學習這個例子,充滿自信地實現所有巧妙的而且毫無疑問也是最新潮的技術-那些方便的“mysql_”函式;用於建立查詢的字串連線函式;把不同的函式放進“functions.php”檔案;通過加入“header.php”和“footer.php”來維護整個網站的一致性;為了程式碼的快速執行而回避了笨重的面向物件的設計方式(管它是什麼玩意)。我的技能在飛速成長。

像一個人的王國一樣,我建造了高塔和迷宮般的地道。我每新增一個特性,就好像整個結構在向天空伸展同時也向地下蔓延。顧客帳戶、商品評價、購買歷史、優惠點數、帳單號、特殊優惠、日誌、 A/B測試、支付資訊加密,等等。一個蔓延的迷宮,一整個星系的函式,大的小的,緩緩圍繞一個不變的核心:“cart.php”。

經過八個月的激情工作,我終於完成了。

現在,你們這些讀者一定在期待我會詳述當網站正式執行時發生了怎樣恐怖的事情。恐怕我要讓你們失望了。

它成功運行了。

最糟的方法

儘管我現在把這當作我最糟的設計,但是這個東西確確實是能夠執行。它在每一個糟糕的教程,每一個反php的帖子裡都能找到。攪成一團的程式碼?是的。不一致的資料和方法名稱?是的。介紹和業務邏輯混在一起?是的。魔幻數和全域性變數?是的。

對我而言,面向物件的設計只是一堆不必要的開銷和公式化的程式碼,並且有很多片面的理論支援我的觀點。我知道有關測試的所有,點選一些你設計的特性,看上去不錯,上傳執行。我不太知道別的架構,但是據我所知,我所採用的是最明智的方法。

一些事實能“證明”我所做的都是正確的:我從零開始,白手起家,用智慧創造了一個功能齊全的電子商務站點。更重要的,它執行完好並且還在擴張。

在我的眼裡,我和那些寫了亞馬遜的程式設計師們沒什麼太大區別。當然亞馬遜要大一些,但是我沒有看到任何我的網站不能擴張成那樣的理由--尤其考慮到我採用的高速執行的架構。

我認為我的技術水平已經到了巔峰了。並不是說我對學習新技術不感興趣了,我只是不再對此感到緊迫。畢竟我創造了一些不錯的產品。任何在此之上的東西只是附加獎勵,是蛋糕頂端的櫻桃而已。

回到地表

我很遺憾,我在這種心態下生活了好幾年。我只是將一小部分時間用在這個網站上,而把主要時間用在完全不同的領域。在之後多年的維護和偶爾新增特性的過程中,我確實意識到了之前做的一些選擇是有問題的。我意識到有時候要花很長時間才能找到我要找的檔案。有時候當我做一個改動時,一些看上去毫無關聯的地方會出現bug。

我的學習沒有停止,但它確實進展緩慢。我意識到我曾經寫的mysql函式是有風險的,因為後面版本的PHP減少了對它們的支援。在一段時間裡,我克服對此的恐懼的方法是堅信我的無懈可擊的設計可以彌補這些風險。畢竟我嘗試了所有形式的我能找到的SQL注入,一切看起來都沒有問題。

去年的一天我接到了一個緊急電話,網站掛了。所有的請求都得到500錯誤。在工程師們重新啟動並且分析了事故原因後,這被證實是一起來自國外的sql注入攻擊,是我從來沒見過的一種。

好吧,我想,這也許是我該轉向PDO的時候了。

覺悟

當我坐下來準備重寫所有的資料存取方法時,我意識到了一些深層次的問題。我意識到這將會很困難。而且我知道為什麼它會這麼困難。

因為這些方法散落在所有地方;因為我無法知道是否會不經意地破壞一些東西;因為程式碼是如此不一致以至於我要小心地研究不同物件的細微差別;因為很多程式碼和別的部分緊密相連,這也會導致我會不小心造成破壞。簡單地說,這將會很困難。不僅因為所有這些壞的實現方法,還因為我對它們所將造成的後果缺乏預見。

所有的辯護,藉口,逃避都無法繼續下去了。我錯了。我不是那個幻想中的天賦卓越的程式設計師。這麼多年來,我一直都沒有認清這一點。

我的愚蠢已經顯而易見,儘管這對我的自尊心是極大的打擊,但這也是很寶貴的一個教訓。我通過親身經歷(而且是非常痛苦的),學到了為什麼做一件事的方法有對錯之分。這不僅僅關係到品味或者時尚。這不是比誰的方法更聰明。正確的方法可以在現實生活中找到,並且能讓你和那些使用你程式碼的人的生活更好。錯誤的方法讓人沮喪,浪費時間。我在這裡不想說明哪些東西是組成“正確方法”的要素。只要說不是我做的那些就夠了。

真正的錯誤

我實現了PDO。同時開始第一次使用PHPUnit。我決不想嘗試通過單元測試去改造那樣的程式碼。

現在我有意識地迫使自己無論何時都儘量去學習。我正在讀一些每個程式設計師都應該讀的書。我在關注別人的部落格。我在收聽播客。我會看會議視訊。我正在參加一些當地的社團並且在其中做演講。我在做副業並且挑戰自己學習新的技術。我在學習用正確的方法做事。

對你們所有獻身於這項事業中的人來說,有一個對我們很重要的有利條件。即程式設計是這樣一個完全抽象的活動,任何其他領域都會受到的現實世界中的限制在這裡不存在。在這裡,你的極限是你自己。

我要以一些真正的箴言結束這個故事。我在開始寫這片部落格的時候正好剛看完第二版的《程式碼大全》。在書的最後,第825頁的底部,作者準確地描繪了我在寫這篇文章時的想法。可以說他只用了兩句話就表達我在這數千字裡想表達的東西:

“作為一個初學者或者進階者,這並沒有什麼錯。當一個有能力的程式設計師而不是領導者,這也沒有什麼錯。真正的錯誤是,當你知道應該如何去提高時仍然選擇做一名初學者。”