第一篇:一名平庸程序員的自白
一名平庸程序員的自白
來源:王昱(2010-5-15 16:30:49)
作者:阿蘭·諾頓(Alan Norton)
翻譯:Purple Endurer
導讀:阿蘭·諾頓揭示了他作為一名平庸程序員的生存之道:如何讓自己一般般的編程技能發揮出最佳效果。
我一直以編寫代碼為樂,起因并不是我精于此道,而要部分歸因于它是一大挑戰。我發現沒有什么比指揮個人電腦在顯示器上顯示“Hello World!”更令人激動的了。而在顯示器上顯示三個紅桃或者黑桃A(Ace)和J(Jack)則是一個完全不同的問題。我畢業后寫的第一個程序是用Northstar Basic為NorthStar Horizon編寫一個自動售貨機程序,后來又為Northstar Advantage編寫了基于圖形的21點紙牌(Blackjack)游戲程序。
PurpleEndurer注:
1、Northstar Basic:是源自NorthStar Horizon 和 NorthStar Advantage的一種BASIC語言。詳見 http://en.wikipedia.org/wiki/NorthStar_BASIC2、NorthStar Horizon:是North Star Computers公司生產、以ZiLOG Z80A為處理器的8位電腦。詳見http://en.wikipedia.org/wiki/NorthStar_Horizon
盡管如此陶醉于編程,但我必須坦白地承認:我是一個平庸的程序員,總在尋找一種方法來獲得大的回報 - 即程序沒有語法錯誤并能正常運行。這并不奇怪,我從未像一名程序員那樣做好本職工作;我發現自己具有成為一名優秀開發人員的天賦。但是,在我們繼續往下談之前,我要給“平庸程序員”下一個定義。
平庸程序員——會使用一些現成工具的程序員。他只知道最簡單的命令語法,但懂得在哪能
找到更復雜命令的語法。他不知道如何編寫最高效的代碼,但懂得在必要時如何重寫和測試比較高效的代碼。他可以克服重重困難獨辟蹊徑達到目標,但他把每個困難視為挑戰,并自信會找到每一個困難的解決方法。他可能需要較長時間才能完成,但總能達到目標。他不知道如何創建一個DLL,但在必要時可以弄懂。他與大多數程序員一樣,并不特別喜歡做工作記錄,之所以這樣做是因為他是一個專家。
工作決定技能
雖然我很想繼續編寫游戲,但為了填飽肚子,我只得遷就本地就業市場;公司們有“必需勝任實際工作”這個奇怪的要求是眾所周知的。產品、人力資源、會計、庫存跟蹤和數據報告只是做生意必要的一些東西 - 你知道,很無聊的東西。
當我真正為報酬而編寫程序時,我的技能發生了戲劇性地變化。它不需要采用大量先進的編碼技術來圍著數據團團轉,并耍魔術般地變成信息。
我被 休斯飛機(Hughes Aircraft)公司雇用,通過IT服務來為產品控制部門提供支持。我的工作需要開發/分析技能,我熱愛我的工作。編程不過是達到目的的手段。
開發人員身兼數職
程序員只是開發人員所扮演的諸多角色中的一個,通常你要身兼以下數職:
購買方(帶預算)Buyer(with budget)
清道夫(無預算)Scavenger(no budget)
分析師(Analyst)
設計師(Designer)
規劃師(Planner)
程序員(Programmer)
協調員(Coordinator)
測試員(Tester)
文檔管理員(Documenter)
技術支持員(Support technician)
當開發人員未被認可為一個或更多角色中的專家時并不太令人奇怪。對我來說,工作職能就是編程。
我的生存之道
盡管我的編程技能不盡如人意,我仍然是一個非常成功的開發人員。這里有一些我多年來學到的訣竅,以及如何我作為一個平庸程序員,發揮出最佳平均編碼技能水平的生存之道:
▲ 明確要求——我會預先得到完整、精確的系統要求清單。如果你直接開始編碼就意味著你沒有針對系統設計的要求來進行。
▲ 分析和設計——我獲得了分析和設計權。一名普通程序員獲得了分析和設計權,就擁有了一個超越一名偉大的程序員的優勢。
▲ 項目計劃——坦白來說,我早期職業生涯中沒有用過正式的項目計劃,一直到我加入了CSC,不得不使用更多的正式文檔編制技術,從而開始使用項目計劃。由此我充分認識到使用經過慎重考慮后的項目計劃也是平庸程序員的一個優勢。
▲
考材料。經常翻閱手冊、指南——我總是備有手冊、指南以供不時之需。我也研究了其它的參
▲ 拷貝-粘貼程序員——我不介意承認自己是一名拷貝-粘貼程序員。多年來,我寫了許多可以在新項目中重復使用的代碼。因為我至少花時間寫了一次代碼,所以我對這些代碼如何工作略知一二。在工作中我從不拷貝其他人寫的代碼,并且我從不使用我在其他公司寫的代碼。黃金規則和版權法都適用于知識產權:您不得復制和使用別人的代碼,除非明確允許,或者你可以得到特別的許可。
▲
▲ 毅力——我永不放棄,我一直相信自己能完成任何編程任務。工具——當我需要一臺更快的電腦但這又不在預算之列時,我發現了一個經理愿意用他們的一部分預算資金為我購買。你可以通過乞求、借用,或交易來獲取所需工具,從而完成自己的任務,要經常向你的經理提出自己的要求;只這些要求是合理的,一個優秀的經理會盡最大努力找到一種方式來獲得軟件,硬件,手冊,或者你所需要的幫助。
▲ 手氣好(Serendipity)——也被稱為“代碼一寫就好”策略。有幾次我像一個初級程序員那樣寫了代碼,而這些代碼運行得很好。我把它比作是國際象棋,你在下棋的過程中突然發現,自己走兩步就有將死的機會。這不是編程應有的方法,但由于我在檢討自己的職業中的罪過,我不得不納入此項。
底線
我要做一個最終坦白:我不喜歡被看作是次等的團隊成員。我見識卓越,而幼稚的程序員卻真的相信:不能寫出“先進”代碼的人對團隊和公司來說毫無價值。這些精英認為平庸的程序員能力有限,不足以生產高品質的代碼,幾乎總是犯錯,令人不快。有個觀念令我感覺既可笑又驚訝:如果你不能________(填空),就不是優秀的程序員。
你不必成為一個出色的程序員或偉大的開發者,特別是正在開發商用系統的時候。沒錯,我是一個平庸的程序員,其主要原因是我從來不需要成為一個偉大的程序員。
我不是縱容平庸。不論做什么,都要盡力做好——包括編程。“最好”的代碼可能難以確定,但越高效的代碼可能也越難維護。可以說,任何可以完成工作的代碼就是好的代碼。代碼是像索瑪立方體(Soma cube),有240種途徑可以解決索瑪難題,同樣,也有許多代碼編寫方法可以用來完成任務。底線就是盡可能做好工作——這是任何一個平庸的程序員都可以做到的。(完)
第二篇:如何成為一名程序員
苦逼中的戰斗雞:如何成為一名程序員
下面要說的是我在成為一名程序員的道路上做的幾件事情。寫在這里除了要讓自己銘記在心外,我還希望它能對別人有些用處。1.建立一個博客
這是我后來才認識到的事,其實應該很早就去做。如果你是跟我類似的情況,你應該盡早開通一個博客——盡管還不知道該寫什么。注冊一個域名,買一個 空間。你會驚奇的發現有很多可寫的東西。你可以記錄下你成為一名程序員的過程,或寫一下你感興趣的技術方面的東西。我一直以為沒什么好寫的,可當真正思考 這些問題時,卻發現有很多值得寫的。最重要的事情是開始去做。2.開發一些東西
開發什么并不重要。選一種編程語言,任何一種都行,開始干。你不必去花大量的時間來決定應該使用什么語言。直接開始學一種語言,事實上最重要的是學習編程語言的基礎知識,而不是勞神費力的去選擇一種“最好的編程語言”。我選擇的是PHP。因為它是一種被廣泛使用的語言,在網上有大量的學習范例,我已經通過搭建一個WordPress網站而熟練的掌握了它。沒有絲毫的遺憾。它使我學到了很多 基礎知識。我還學習了其它語言嗎?當然,我后來涉獵了很多腳本語言,我要在下一個項目上試試Ruby。編程語言不斷的在變化,不要只盯著一個不放。3.注冊你的GitHub帳戶
我已經在Bitbucket上有了一個代碼庫。我最初選擇注冊Bitbucket是因為它能提供5個免費的私有庫。后來我決定在GitHub上注冊。事實上,我絲毫沒有拖延,看看我的成果吧。4.向開源項目捐贈代碼
我早該如此做了。我起初低估了做這種事情的重要性,說老實話,我現在仍需要進一步重視。向開源項目捐贈代碼,這是一種很好的學習別人如何編程的方法,并且能把自己的代碼公開。我今晚的就要去列一個準備去參與的開源項目的清單。5.熱心參與
這也是我需要改進的方面。我應該到stackoverflow網站上去回答更多的問題,在一些博客,科技網站上分享自己的東西。去那些網站,讓大家看到你。不在網上露面,就相當于待在屋里不出門卻想找一份做巴黎導游的工作。重復做第2,4和5點 其它一些事情
很明顯,每一個有志向的程序員都應該每天閱讀Hacker News和其它開發/科技/編程類的博客文章。
我打聽到了不少的技術討論會。這周末我準備去參加一個。我會把那里的情況寫出來。我在這里并沒有提讀書。我喜歡閱讀,但我們沒有買任何的關于web開發的書籍。這是我個人的做法。我相信很多人都會建議首先買一本書看看。
找一些能和你討論你的web開發/技術/編程想法的人和群體。如果我做了更多的第5項,我可能找到了更多的這樣的人。
好了,這就是我要說的。這些就是在過去的一年里我成為一個程序員的成長之路上做到事情。如果有人覺得在這個清單里我還應該加入什么,請給我留言。我永遠都希望聽到新的觀點。
第三篇:如何做好一名程序員
如何做好一名合格的程序員
一、90%的編程工作來自內部軟件
(90% of programming jobs are in creating Line of Business software)計算機專業的學生,可能有一種印象,覺得大部分程序員,都在編寫公開出售的軟件或者通用軟件。
這種看法是不對的。大部分程序員,實際上編寫的是不公開的企業內部軟件,比如追蹤費用的軟件、優化裝運成本的軟件、幫助記賬的軟件、設計新部件的軟件、計算保單價格的軟件、識別惡意訂單的軟件等等。
各種各樣的商業公司,開發內部軟件,解決它們自己的問題。市場上對程序員的大部分需求來源于此,只有極少數程序員直接編寫面向外部顧客的軟件。內部軟件的開發,通常非常乏味,令人厭倦。因為它們的技術復雜性低、技術決策非常保守、預算很少、缺乏長遠考慮。但是,世界上大部分編程工作都是這種。
二、別人雇你的目的,是讓你創造利潤,不是讓你編程
(Engineers are hired to create business value, not to program things)商業公司最關心的(或者說唯一在乎的)事情,就是增加收入、降低成本。因此,它們實際上需要的不是程序員,而是能夠幫助它們增加收入、降低成本的人。
開發優美的軟件,解決技術難題,編寫沒有 bug 的代碼,這些都不是商業公司的目的。它們雇傭你,是為了讓你幫它們完成某個可以增加收入、降低成本的項目,而不是因為你是 geek。
你個人對于公司的唯一價值,就在于你能多大程度上為它們增加收入、降低成本。
三、不要自稱為程序員
(Don't call yourself a programmer)
很多公司的經理不懂計算機,在他們心目中,“程序員”就是一群高成本的勞動力,只會在一臺復雜的機器上干一些難懂的事情。
如果你自稱為“程序員”,當公司需要壓縮成本的時候,某些經理首先就會想到解雇你。有一家公司叫 Salesforce,口號是“沒有軟件”,意思就是如果經理們購買了他們的服務,就不再需要別的軟件管理銷售業務了,也就是說,不再需要自己雇傭程序員了。
正確的做法是,你應該把自己描述成與增加收入、降低成本有關系的人,比如“xx 產品的開發者”或“改進者”。有一個 Google Adsense 程序員的自我介紹,是這樣寫的:“Google 公司97%的收入,與我的代碼有關。”
四、不要限定自己
(You are not defined by your chosen software stack)
年輕學生經常會問,應該選擇哪種語言或平臺?學會 Java,是不是比學會.NET 容易找工作?
過分強調某一種語言或平臺,都是不必要的。如果你把自己限定為 Java 程序員或.NET 程序員,你就已經輸了,因為首先你不應該自稱為程序員(理由見上一點),其次這種限定使得你自動被排除在世界上大多數編程工作之外。現實生活中,學會一種新語言,只需要幾個星期,然后再過半年到一年,你
就會變成老手。那時,根本沒人在乎你以前用什么語言。
天才程序員是很少的,可是需要天才程序員的工作機會卻很多很多,大多數場合都是需求遠遠大于供給。這意味著,即使你不是天才程序員,只要你是一個優秀工程師,那些招聘公司也會立刻錄用你,因為它們知道招聘到天才程序員的機會微乎其微。(重復一遍,所謂“優秀工程師”,就是你的履歷上有一連串增加收入、降低成本的記錄。)
某些公司的人事部門,會根據某個關鍵詞(比如 Java 或.NET)過濾簡歷。雖然這樣的公司根本不值得去,但是如果你真的想過這一關,也很容易:投入幾個晚上和周末,在你當前的項目中設法用到這個關鍵詞,然后再把它寫進簡歷就行了。
五、如何提高求職時的談判能力?
(How do I become better at negotiation?)
(1)記住你不是在求職,不是在展示編程技巧,而是在推銷某種商業需求(增加收入或降低成本)的解決方案。
(2)面試時,要有自信,要平等的對話。你要的是一個互利的錄用合同,不要每次對方提出要求,你都說 Yes。
(3)雇主可能會問“你的上一份工資是多少”,他們其實在說“給我一個理由,壓低你的報酬”。你要想好如何適當地回答這個問題。
(4)要還價。這里不僅僅指錢,還指其它你關心的方面。如果你無法要求更高的薪水,那就試著要求更多的假期。
(5)在對方決定錄用你以后,才開始討論薪水。因為那時,他們已經在你身上,投入了大量的時間和金錢,產生了一定的成本,此時他們可能覺得一些小問題已經不值得再糾纏了,比如每年的工資增加幾千元。
六、創業公司是否適合應屆畢業生?
(Are startups great for your career as a fresh graduate?)
如果你一畢業就加入創業公司,最可能的結果是,接下來幾年你都工作得非常辛苦,然后公司悲慘地失敗了,你失業了,不得不又去另一家創業公司工作。如果你真的想去創業公司,應該首先找一家大公司干上兩年,攢一點錢,積累一些經驗,然后精心挑選后再去創業公司。
在創業公司工作,一般情況下,你遇到的都是創業者。他們大多數人沒有能力在兩年后雇傭你;而在大公司工作,你遇到的都是其他大公司的人,他們中很多人將來有能力雇用你或者幫你介紹工作。
七、在創業公司工作是否值得推薦?
(So would you recommend working at a startup?)
選擇創業公司,就是選擇一條職業道路,而不是選擇一種生活方式。可惜很多人把這兩者顛倒了,他們推薦創業公司,實際上是在推薦一種你感興趣的生活方式。
如果你確實喜歡這種生活方式,老實說,你在大公司里也可以得到它們。在許許多多大公司里,你都有機會鉆研最新的技術,而且還能5點半準時回家照顧孩子。
八、溝通技能是最重要的職業技能
(Your most important professional skill is communication)
前面說過,工程師被雇傭,不是因為會編程,而是因為能夠創造商業價值。所以,你讓人們相信你能創造價值,這是幫助你找到工作的最重要的能力。這種
能力與你真的能創造多少價值,實際上聯系不是很緊密。
我認識的一些最優秀的程序員,往往拙于表達。因此,別人不是不想與他們一起工作,就是低估了他們的價值。相反地,如果你看上去很會編程,并且很善于表達,別人就會真的這樣看待你
第四篇:碼農故事:一位中級程序員的自白(寫寫幫推薦)
碼農故事:一位中級程序員的自白
我是一名中級程序員。
我有相當不錯的基本技能。我犯了足夠多的錯誤才明白為什么那些被稱為錯誤。我很清楚我還需要了解更多東西。最重要的是,我知道那些東西大概是什么,并且我正在努力而積極地提升自己。
勇敢地承認自己不過是水平一般的程序員,這花了我一些時間。我不再感覺有必要去抓住那些我并不了解的觀點。當人們發現我對某樣東西不了解時,我也不再感到害怕。事情并非從來如此。你可能對此不以為然,但是我曾經自詡為編程大師。
這種對自己能力的不正確的評估,很大程度歸因于我在一個相對封閉的環境中學習技能。在過去那些日子里,有電腦就已經很特別了;更不用說知道如何使用了。
在我自己看來,我當時是一個知識淵博并且經驗豐富的程序員。在我不到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腳本以及怪異地把
不久后我們意識到,如果我們想要一個真正可用的甚至體面的在線商店,我們需要一個自定義解決方案。我想到了我過去的成功經驗: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頁的底部,作者準確地描繪了我在寫這篇文章時的想法。可以說他只用了兩句話就表達我在這數千字里想表達的東西:
“作為一個初學者或者進階者,這并沒有什么錯。當一個有能力的程序員而不是領導者,這也沒有什么錯。真正的錯誤是,當你知道應該如何去提高時仍然選擇做一名初學者。”
第五篇:怎樣做一名合格的程序員
作者:xx,1990年畢業于xx工學院計算機軟件專業,后又于xx年畢業在xx大學完成軟件工程專業碩士的學習,現供職于CNpC旗下的一個行業軟件研發中心,因為在網上看了許多有經驗的各路軟件開發人員寫的好帖,一時手癢興起,也湊一篇壯壯聲勢。sO100
假設你是一名軟件專業畢業的本科學子,如何在工作中~成為一名有較高職業水準的程序員呢,本文試圖總結作者從事15年軟件開發工作的感想,希望對有志成為職業程序員的人有所幫助,并借此機會感謝原xx工學院計算機系的和智玲老師和張懷寧老師,特別感謝我的碩士導師,xx大學計算機系的博導鄭國梁教授。
注:本帖言辭尖刻,乃作者脾氣秉性使然,如果你看著有氣,就請多多見諒,放下別看了。
程序就是一系列按步驟進行的操作序列,它有好多種級別,比如最低級的微程序、次低級的匯編程序、高級的各種編程語言程序、最高級的腳本語言程序,也許我列的不對,但沒關系,我要說的是不管是那個級別的程序,其本質都是操作的邏輯序列。大多數系統和應用程序都是建立在高級編程語言上的,比如C、C++、C
#、FORTRAN、BISIC、JAVA等等,就讓我們只關注這一級的編程能力吧。因此如果一個程序員的邏輯能力不高,他永遠都不能成為一名具有合格職業水準的程序員,我們在下面的討論有關編程能力的方方面面,最終都是為了最大程度地提高和實現一名程序員的邏輯能力。
一、掌握基礎知識:十六年寒窗的持續積累
從7歲讀小學起,經過16年的學習,你從軟件專業本科畢業后,必須完成以下幾門專業課程的學習:計算機組成、操作系統原理、匯編語言、數據結構、編譯原理、數據庫原理、軟件工程、結構性設計語言(pASCAL、)、面向對象設計語言(C++、C#)、計算機網絡等,你最好還懂一些算法分析、分布式系統、計算機圖形學、形式邏輯、人工智能原理、軟件設計模式、軟件構架/框架等研究生的課程,16年來,你積累的除了知識,更重要的是形成最適合自己的學習方法和工作方法。這些是你具備程序員職業水準的基礎能力,不要受什么計算機軟件怪杰之類傳奇的影響,那不過是小概率事件,而且這些怪杰們就算沒有讀過軟件本科和研究生,也往往自學了大多數專業課程,很可能比在校學習的學生對這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現在你只需要問問自己,那些課程和知識都學會并掌握了嗎?如果是,那就準備好進行實踐了。
二、在實踐中提高:成為一名高水平的Coder好了,你畢業了,在校功課都不錯,也找了一個專業對口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說來看看。通常,你在工作中都會用到某一種單位/公司固定的操作系統和編程語言開發環境,比如Windows、UNIX、LINUX等操作系統,又比如用VC、VB、pB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語言和開發環境,我們在后面把它們合稱為開發環境。就在校學習的有關開發環境的知識而言,大概你距工作需要的差距是不小的,當某個操作系統和編程語言環境成為你的飯碗時,就不應也不能用通過課程/認證考試之類的眼光和要求來評價你的能力,即使你能考100分。
你需要深入地學習該操作系統和編程語言環境的各類開發手冊的所有內容,你會說大多數你都用不上,其實你既對又不對,對的是單從使用的角度而言,你確實用不上開發手冊的大多數內容,比如龐大的VC開發類庫和復雜的開發環境,你在實際工作中能用到的不到總數的1/10或1/5,不對的地方在于,你用到的部分不是孤立存在的,它們是整個體系中的一部分,只有對整個體系有了一個較完整的了解,才能得心應手、隨心所欲地用好你用到的部分,你才算初步具備在這種開發環境下進行Coding的職業水準(還遠不夠程序員的職業水準呢),而這只是剛開始。如何才能真正掌握一種開發環境的全面的知識呢,最原始的辦法就是讀開發指南/教程、參考手冊,一般來講,學習開發指南/教程時,你如果是一個認真的人,都會完成5/10~7/10左右內容的學習和練習,如果你想成為職業選手,就應該完成9/10以上內容的學習和練習。參考手冊不同,大多數所謂的“程序員”們只是用到了才翻翻,這差的太遠了,你應該象讀開發指南/教程一樣,每個環節都要讀,比如VC,參考手冊中的每個類,類的每個函數,都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開始時讀得你毫無頭緒、心煩意亂,不要緊,還有一手呢,如果你開發環境安裝的全面,它們往往都有開發商做的demo例子可看,你就進入另一個境界了,開始時你關注demo中的具體技術,后來你發現這些demo的程序寫的都還算不錯,結構簡單但合理,如果你真的用心,就一定能發現一些個別的demo是極品,它所展現的程序邏輯結構是你設計不出來的,你現在有點更關心它的程序設計構架,甚于對你原始目的(某種相關的技術/技巧)的關注,這時的你,開始了從一名Coder向一名programmer的轉變,你會忍不住要看看開發商提供的源程序,比如.h和.cpp,通常你會找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊中都沒提到,你要學的太多了,沒時間顧及其它的業余愛好了,現在知道為什么程序員是年輕人的職業了吧,你要有足夠多的時間才行,即使你的智商有160。如果你走到這一步,在你工作的團隊中,已經是經常有人向你請教技術問題,經常有人請求你幫忙debug,你已是公認的“高手”了,別得意,因為你仍然是個Coder,為什么這么說呢,你想想,你已深入了解了這個開發環境中的各種技能,知道一名Coder如何用好這些東西,可是你能設計的出提供給Coder們用的東西嗎?唔……,你想了想,可能還不太行。對了,就是這樣,你還是一名小我境界的程序員呢,本質是個Coder,當然已是一名高水平的Coder了,然而你需要進一步登堂入室才能成為一名真正的程序員。
讓我們繼續吧,通常你
點也許有點困難,但這種事干的多了,你就會越干越快,越來越
得心應手,你的邏輯能力飛速提升,你能看得上的邏輯結構優秀的程序開始不多
了,下一步就是練習。從工作中開始吧,如果你有空閑,你需要做至少兩類練習,一類是算法練習,所有的經典算法都是經典的邏輯,題目有的是,像個好學生
一樣吧,每年的國內國際編程競賽都有邏輯要求非常高的題,你可以只選一兩道
難題來做做。當你可以把復雜的單遞歸程序(只有A調A)變成非遞歸程序時,已經
不錯了,如果你能看得懂雙遞歸程序(A調A、A調B、B調A、B調B都有),我為你鼓
掌!你不必往下看了,我有點不好意思啦――班門弄斧,你快滾蛋吧!另一類是
把以前和當前你工作中你不滿意的程序推倒重新設計一遍,這非常重要,省時省
力,因為你熟悉需求,技術上也沒問題,目的就是改進程序的邏輯結構,很劃算
哦,唯一要克服的就是:你對推翻以前工作中那點小小成就的心理障礙,如果你
真想優秀,說句粗話:這點心理障礙算個屁,一遍遍反復地推倒已有的成果只能
使自己快速進步,放手干吧,沒什么好可惜的,馬恩早就在《共.產.黨宣言》里
說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來總結一下,經過自我否定后,再生的你盡管對過去的“業績”還有一些
眷戀,但已是一個初步具備職業水準的程序員了,掌握了相應的技術和技巧,具
備了較高的抽象邏輯思維能力,最主要的特征是:能自覺地自我否定,不斷地追
求更高水平的邏輯能力。
在這個過程中,如果你能注意以下一些小的方面,你前進的步伐也許會快一些。
l從編譯原理的角度來理解你工作中使用的高級語言,如果你做到這一
點,至少有兩個好處,第一個好處是避免一大堆低水平重復出現的編譯錯誤。一
名優秀的Coder平均在一個工作日中應該完成200行以上的源碼,其編譯錯誤應該
控制在5個以下,要知道這200行源碼不是一次完成的,所以大多數情況下你都要
追求一次編譯通過,而一名職業水準的程序員,應該進一步做到即使用purify這
類的工具來檢查源碼,也不會存在嚴重的內存泄露。第二個好處是可以提高源碼的可讀性和效率。規范地編寫你的代碼使你自己的邏輯清晰,因為你明白多加幾
個括號和空行、多換行對齊、多注釋,編譯器是會自動識別的,不影響程序執行的效率,反過來,控制好遞歸調用和循環內的if語句才是提高程序效率的關鍵,要全力避免遞歸,但要深刻理解遞歸,能通過自己建立堆棧來把遞歸程序轉換成非遞歸程序,要求還是較高的哦!
l避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表
現在你的程序邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但
要心里有數才行,所以你需要幫助,如果你有幾個水平相若或更高的職業伙伴,太好了,當遇到花30分鐘還打不下的bug時,就別浪費時間了,找他們吧,最要緊的是能思路清晰明確地表述你的問題,通常你自己在這個過程中或者伙伴中就有
人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業伙伴是人生的一
件幸事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT
發展的這么快,你再優秀,那點東東也沒有什么值得隱藏的,所以你可以技術或
水平不夠高,但千萬不可以讓真正具有職業水準的選手鄙視你的職業品質和行為。
l有自己debug的特點,下面的說法作者不敢太肯定,只是經驗之談。即
使在VC這種高度完善的開放環境下,你仍然應該要求自己僅憑打印語句就能debug
。這也有兩點好處,第一個好處是,遇到bug你會認真想問題所在,而不是用
debug工具一步步簡單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到孝從
粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思
維方式,這不算好,你應該先看到森林,再看到樹木。我反復提及:程序就是邏
輯過程,大多數程序從main函數開始,是由數據結構和功能子程序組成的一個樹
形結構的邏輯過程(要認清即使是面向對象的程序語言也是一樣的),它的執行過
程是深度優先的,但你定位bug應該是廣度優先的,好好想想這一點,嗯?第二個
好處是強迫你思考并記住而不是用工具看到調用過程,你大腦的抽象邏輯思維能
力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程序結構上的邏輯錯
誤引起的,這一點就非常重要了,順便說一句,最難打的bug就是程序邏輯結構錯
誤導致的bug。你要是真正明明白白地認識到這兒了,那我就沒什么東西可以告訴
你了。總之
p;,Linux操作系統的一些源碼不錯,是開放的,你可以合法地搞到,其它的不要說
是我建議你侵犯知識版權啊!
四、天生神力:成為系統分析員
本來就論述如何成為一名職業程序員而言,本文已基本完成任務了,但《菜根譚
》有言:竭世機樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到
此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫算了。
你要是運氣好,直接進入了一個嚴格規范生產的軟件企業就業,剛開始就應該是
按別人做好的軟件設計來實現編程,你可以有機會直接學習軟件設計,當你積累的足夠多了,能夠對其中的一些設計提出好的改進建議,而且干得又快又好,就
會漸漸地展露頭角,我相信你終有一天成為一名軟件設計人員(注意,不是軟件產
品設計人員),步入系統分析員的行列,但這還需其它的一些條件和自我~。如
果你在一個不規范的軟件企業工作,那也不錯,你很可能直接就有機會進行軟件
設計,然后開發、測試,甚至還不得不自己定義需求,把軟件開發過程的各個環
節走一個遍,當然這樣對你的要求更高,而且你也不容易得到及時有益的指點,在正態分布的情況下,你應該是成長的很慢。但不管就業的單位如何,如果你決
心要成為頂尖軟件職業選手,通常什么客觀困難都阻擋不了你,然而你個人的因
素可能會阻止你的前進。下面提出的觀點純屬一己之見,傷人自尊之處作者在此
提前道歉,并建議你除非對本文有強烈的興趣,否則就請直接看第五節或放下別
看了。丑話已說在前頭了,在各種軟件開發組織的發展過程中的事實也證明,只
有少數程序員能成為系統分析員,我想這一點不是我杜撰的吧,因此你要是在看
接下來的部分時感到氣憤難當,那也實在沒著,純屬活該,因為作者只是在說明
自己的觀點而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒有任何理
由可以罵人!
作者自己沒有到微軟面試過,但身處軟件行業,關于微軟的許多東東當然還是有
耳聞的,據說微軟招聘一名程序員要過五個已經成為微軟程序員的面試關,而且
是一票否決制,又據說大多數面試題并非編程,而是一些有關邏輯和智力的題,作者私下也做過許多流傳的微軟面試題,并對此做法深以為然。程序的本質就是
邏輯,所以幾十年前就有人提出編程是一門藝術,而藝術是要靠天份的,這一點
少有人反對。一個人的邏輯能力可以不斷提高,但其能到達的終極邏輯能力的層
次必定為其天生智力所限制,這一點就讓人不易接受了。好笑啊!人們可以公開
承認自己沒有某種或全部的藝術天份,但要說自己邏輯天份不夠,換句話說承認
自己笨、IQ不夠高,往往是要怒發沖冠的,其實這又有什么區別呢?話都說到這
兒了,再次建議你如果不夠自信,就跳過這一節吧,直接看第五節,好嗎?
好了,把話題說回來,你已經成為一門合格的職業程序員了,如果要想成為從事
軟件系統設計的職業系統分析員,第一件事就是悄悄找一個標準智商測試的網站
或其它渠道,嚴格認真的測一測自己的智商,如果IQ低于130(正常智商是110),就請別費勁了,打消掉成為系統分析員的念頭吧!好!好!先請你冷靜一下,好
好想想,其實微軟面試時就是在測你的智商和邏輯數學素質呢,這就是本節的標
題為“天生神力”的原因,因為設計就是從無到有地進行創造,無論是軟件還是
其它行業都一樣,可以有借鑒的,沒有現成的,設計就是創造!如果你IQ在130以
上,又決心要當一名職業軟件系統分析員,其實你不過是要準備好吃更大的苦而
已,有什么好虛榮的呢?
~還是從基本功開始的,過程和成為一名職業程序員差不多。必須使用設計工
具這一點是不用多說的。在工作中,你基本上遇到的是兩類方式的設計,一個是
結構化設計,另一個是面向對象設計,就個人經驗而言,面向對象的設計更好。
如果你工作中不得不采用結構化的設計,你必須熟練地掌握數據流圖和控制流圖的分析和設計,一般來講,如果你把一個軟件中用到的數據模型設計好了,針對
功能化的流程,不難設計出數據流圖,但下一步設計控制流圖才是挑戰,如果你
按照需求走不通設計好的控制流圖,那么你或別人在按照這個設計編程實現時,必定也走不通,沒有奇跡會發生,還是在設計階段嚴格要求吧,又有一點需要牢
記:返工是最慢的。當你在進行控制流圖的設計時,也不要妄想得到需求人員提
供給你明確的指點,通常他們要是能夠把需求的功能和操作次序寫完整的話,你
應該就感恩戴德了,從需求中整理出功能、操作的拓撲次序和條件是你作為系統
分析員的職責
。看看,要是沒有一點圖論的基礎和拓撲學的入門知識,你是當不
好一個職業系統分析員的,即使你天賦不錯,必要的數學和邏輯素質仍然不可或
缺。也不用氣餒,永遠沒有最好的設計,只有更好的設計,反復地進行設計迭代,勇于推翻舊的設計,你將快速進步。如果你在工作中是采用面向對象進行設計的,那就更有利了,有關面向對象設計的書太多了,不用作者在此多費口舌,建
議精讀一本經典的書,比如北大邵維忠等編譯的《面向對象的分析》,有些方法
和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質是,你在邏輯上是
如何認識這個世界的,你就是如何設計軟件體系結構的,然后讀讀其它書,觸類
旁通,自己創造機會多實踐,成功自然會到來的,總之,不管是結構化設計還是
面向對象設計,評價一下自己的軟件系統設計方案吧,有好多指標呢,比如是否
均勻和平衡?局部獨立性強不強?有沒有歧異的結構?有沒有層次太多或太少?
有沒有某個層次太大、太廣?是不是邏輯結構先復雜了再化簡的?還是只會設計
簡單的,復雜不起來(這一點是笨哦,如果出現多次,請你不要意氣用事,轉行吧)?最重要的一點,是否容易理解、實現和改進?你自己會得出評價的。如果有機
會看到別人的設計,一定不要錯過學習的機會,自己推導一遍,認真比較比較,獲益會較多。
走到這一步,你就應該關注設計模式了,首先還是學習,這方面的好書有的是,但一般在工作中用到的設計模式較為單一,應該多嘗試一下其它的設計模式。其
次必須要明白設計模式不是設計思路,也不能代替設計思路,比方你要從A到B修
一條路,設計模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設計思路,模式對思路是有影響,但不能代
替,所以如果你的智商高達250,我相信你直接用匯編語言也能寫出面向對象的程
序來。第三在此有一個陷阱,很多系統分析員生搬硬套設計模式,全然不懂如何
融會貫通,在你的一項具體工作中,往往是以一種設計模式為主,其它模式為輔的,思維不拘泥于形式才是關鍵,而且也為你到達更高的軟件設計的境界做好準
備。
唉!都不知該怎么向下寫好了,因為已達到作者水平的極限了,我胡亂說一點,你湊合看吧。軟件設計最終的層次是:以無法為有法、以無限為有限,這句話是
李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天
屠龍記》里講到張無忌初學太極,學會的標志是把剛學的招數全忘了,記住的是
太極的道理和精神,和李小龍有些相似喔,軟件設計也一樣,忘記所有的設計模
式,隨心所欲進行設計才是至高境界,所以你能到達多高的軟件設計的境界最終
將取決于你的哲學素質,這一點實在是不好寫啊,你自己領悟吧!作者只有祝福
了!
五、職業人的終極目標:全面~,成為Leader
這一節更不好寫,涉及到太多其它非技術方面的因素,特別是個人人生觀和世界
觀的~,如果本帖的點擊率超過作者私下期望的一個數值,那我就爭取盡力厚
著臉皮再補上吧。我只說一句,雖然大家都知道軟件開發是一個團隊性的工作,但追求參與一個大型軟件系統的成功開發,是一名軟件人員的本能,就像拿破侖
說的不想當元帥的士兵不是好士兵,所以不追求實現大系統的軟件人員,也不是
一個好的職業軟件人員,但你只有成為Leader,領導一個優秀的軟件開發團隊,才有機會實現這個終極職業目標,對不對?
好吧,不管你現在的感受如何,我都謝謝你能讀到這里!我不習慣假歉虛,就不
說什么作者水平有限,本文拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然
作者水平確實有限。所以我認為你盡管有權砸磚,但實在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡興寫一點多年從事軟件開發工作的體驗,因此接
下來我就高掛免戰牌,不回復任何回帖了。再次謝謝你能有耐心讀到這里!希望
本文對你有所裨益,祝你成功!再見!