第一篇:一名平庸程序員的自白
一名平庸程序員的自白
來源:王昱(2010-5-15 16:30:49)
作者:阿蘭·諾頓(Alan Norton)
翻譯:Purple Endurer
導(dǎo)讀:阿蘭·諾頓揭示了他作為一名平庸程序員的生存之道:如何讓自己一般般的編程技能發(fā)揮出最佳效果。
我一直以編寫代碼為樂,起因并不是我精于此道,而要部分歸因于它是一大挑戰(zhàn)。我發(fā)現(xiàn)沒有什么比指揮個人電腦在顯示器上顯示“Hello World!”更令人激動的了。而在顯示器上顯示三個紅桃或者黑桃A(Ace)和J(Jack)則是一個完全不同的問題。我畢業(yè)后寫的第一個程序是用Northstar Basic為NorthStar Horizon編寫一個自動售貨機(jī)程序,后來又為Northstar Advantage編寫了基于圖形的21點(diǎn)紙牌(Blackjack)游戲程序。
PurpleEndurer注:
1、Northstar Basic:是源自NorthStar Horizon 和 NorthStar Advantage的一種BASIC語言。詳見 http://en.wikipedia.org/wiki/NorthStar_BASIC2、NorthStar Horizon:是North Star Computers公司生產(chǎn)、以ZiLOG Z80A為處理器的8位電腦。詳見http://en.wikipedia.org/wiki/NorthStar_Horizon
盡管如此陶醉于編程,但我必須坦白地承認(rèn):我是一個平庸的程序員,總在尋找一種方法來獲得大的回報 - 即程序沒有語法錯誤并能正常運(yùn)行。這并不奇怪,我從未像一名程序員那樣做好本職工作;我發(fā)現(xiàn)自己具有成為一名優(yōu)秀開發(fā)人員的天賦。但是,在我們繼續(xù)往下談之前,我要給“平庸程序員”下一個定義。
平庸程序員——會使用一些現(xiàn)成工具的程序員。他只知道最簡單的命令語法,但懂得在哪能
找到更復(fù)雜命令的語法。他不知道如何編寫最高效的代碼,但懂得在必要時如何重寫和測試比較高效的代碼。他可以克服重重困難獨(dú)辟蹊徑達(dá)到目標(biāo),但他把每個困難視為挑戰(zhàn),并自信會找到每一個困難的解決方法。他可能需要較長時間才能完成,但總能達(dá)到目標(biāo)。他不知道如何創(chuàng)建一個DLL,但在必要時可以弄懂。他與大多數(shù)程序員一樣,并不特別喜歡做工作記錄,之所以這樣做是因?yàn)樗且粋€專家。
工作決定技能
雖然我很想繼續(xù)編寫游戲,但為了填飽肚子,我只得遷就本地就業(yè)市場;公司們有“必需勝任實(shí)際工作”這個奇怪的要求是眾所周知的。產(chǎn)品、人力資源、會計、庫存跟蹤和數(shù)據(jù)報告只是做生意必要的一些東西 - 你知道,很無聊的東西。
當(dāng)我真正為報酬而編寫程序時,我的技能發(fā)生了戲劇性地變化。它不需要采用大量先進(jìn)的編碼技術(shù)來圍著數(shù)據(jù)團(tuán)團(tuán)轉(zhuǎn),并耍魔術(shù)般地變成信息。
我被 休斯飛機(jī)(Hughes Aircraft)公司雇用,通過IT服務(wù)來為產(chǎn)品控制部門提供支持。我的工作需要開發(fā)/分析技能,我熱愛我的工作。編程不過是達(dá)到目的的手段。
開發(fā)人員身兼數(shù)職
程序員只是開發(fā)人員所扮演的諸多角色中的一個,通常你要身兼以下數(shù)職:
購買方(帶預(yù)算)Buyer(with budget)
清道夫(無預(yù)算)Scavenger(no budget)
分析師(Analyst)
設(shè)計師(Designer)
規(guī)劃師(Planner)
程序員(Programmer)
協(xié)調(diào)員(Coordinator)
測試員(Tester)
文檔管理員(Documenter)
技術(shù)支持員(Support technician)
當(dāng)開發(fā)人員未被認(rèn)可為一個或更多角色中的專家時并不太令人奇怪。對我來說,工作職能就是編程。
我的生存之道
盡管我的編程技能不盡如人意,我仍然是一個非常成功的開發(fā)人員。這里有一些我多年來學(xué)到的訣竅,以及如何我作為一個平庸程序員,發(fā)揮出最佳平均編碼技能水平的生存之道:
▲ 明確要求——我會預(yù)先得到完整、精確的系統(tǒng)要求清單。如果你直接開始編碼就意味著你沒有針對系統(tǒng)設(shè)計的要求來進(jìn)行。
▲ 分析和設(shè)計——我獲得了分析和設(shè)計權(quán)。一名普通程序員獲得了分析和設(shè)計權(quán),就擁有了一個超越一名偉大的程序員的優(yōu)勢。
▲ 項(xiàng)目計劃——坦白來說,我早期職業(yè)生涯中沒有用過正式的項(xiàng)目計劃,一直到我加入了CSC,不得不使用更多的正式文檔編制技術(shù),從而開始使用項(xiàng)目計劃。由此我充分認(rèn)識到使用經(jīng)過慎重考慮后的項(xiàng)目計劃也是平庸程序員的一個優(yōu)勢。
▲
考材料。經(jīng)常翻閱手冊、指南——我總是備有手冊、指南以供不時之需。我也研究了其它的參
▲ 拷貝-粘貼程序員——我不介意承認(rèn)自己是一名拷貝-粘貼程序員。多年來,我寫了許多可以在新項(xiàng)目中重復(fù)使用的代碼。因?yàn)槲抑辽倩〞r間寫了一次代碼,所以我對這些代碼如何工作略知一二。在工作中我從不拷貝其他人寫的代碼,并且我從不使用我在其他公司寫的代碼。黃金規(guī)則和版權(quán)法都適用于知識產(chǎn)權(quán):您不得復(fù)制和使用別人的代碼,除非明確允許,或者你可以得到特別的許可。
▲
▲ 毅力——我永不放棄,我一直相信自己能完成任何編程任務(wù)。工具——當(dāng)我需要一臺更快的電腦但這又不在預(yù)算之列時,我發(fā)現(xiàn)了一個經(jīng)理愿意用他們的一部分預(yù)算資金為我購買。你可以通過乞求、借用,或交易來獲取所需工具,從而完成自己的任務(wù),要經(jīng)常向你的經(jīng)理提出自己的要求;只這些要求是合理的,一個優(yōu)秀的經(jīng)理會盡最大努力找到一種方式來獲得軟件,硬件,手冊,或者你所需要的幫助。
▲ 手氣好(Serendipity)——也被稱為“代碼一寫就好”策略。有幾次我像一個初級程序員那樣寫了代碼,而這些代碼運(yùn)行得很好。我把它比作是國際象棋,你在下棋的過程中突然發(fā)現(xiàn),自己走兩步就有將死的機(jī)會。這不是編程應(yīng)有的方法,但由于我在檢討自己的職業(yè)中的罪過,我不得不納入此項(xiàng)。
底線
我要做一個最終坦白:我不喜歡被看作是次等的團(tuán)隊(duì)成員。我見識卓越,而幼稚的程序員卻真的相信:不能寫出“先進(jìn)”代碼的人對團(tuán)隊(duì)和公司來說毫無價值。這些精英認(rèn)為平庸的程序員能力有限,不足以生產(chǎn)高品質(zhì)的代碼,幾乎總是犯錯,令人不快。有個觀念令我感覺既可笑又驚訝:如果你不能________(填空),就不是優(yōu)秀的程序員。
你不必成為一個出色的程序員或偉大的開發(fā)者,特別是正在開發(fā)商用系統(tǒng)的時候。沒錯,我是一個平庸的程序員,其主要原因是我從來不需要成為一個偉大的程序員。
我不是縱容平庸。不論做什么,都要盡力做好——包括編程?!白詈谩钡拇a可能難以確定,但越高效的代碼可能也越難維護(hù)。可以說,任何可以完成工作的代碼就是好的代碼。代碼是像索瑪立方體(Soma cube),有240種途徑可以解決索瑪難題,同樣,也有許多代碼編寫方法可以用來完成任務(wù)。底線就是盡可能做好工作——這是任何一個平庸的程序員都可以做到的。(完)
第二篇:如何成為一名程序員
苦逼中的戰(zhàn)斗雞:如何成為一名程序員
下面要說的是我在成為一名程序員的道路上做的幾件事情。寫在這里除了要讓自己銘記在心外,我還希望它能對別人有些用處。1.建立一個博客
這是我后來才認(rèn)識到的事,其實(shí)應(yīng)該很早就去做。如果你是跟我類似的情況,你應(yīng)該盡早開通一個博客——盡管還不知道該寫什么。注冊一個域名,買一個 空間。你會驚奇的發(fā)現(xiàn)有很多可寫的東西。你可以記錄下你成為一名程序員的過程,或?qū)懸幌履愀信d趣的技術(shù)方面的東西。我一直以為沒什么好寫的,可當(dāng)真正思考 這些問題時,卻發(fā)現(xiàn)有很多值得寫的。最重要的事情是開始去做。2.開發(fā)一些東西
開發(fā)什么并不重要。選一種編程語言,任何一種都行,開始干。你不必去花大量的時間來決定應(yīng)該使用什么語言。直接開始學(xué)一種語言,事實(shí)上最重要的是學(xué)習(xí)編程語言的基礎(chǔ)知識,而不是勞神費(fèi)力的去選擇一種“最好的編程語言”。我選擇的是PHP。因?yàn)樗且环N被廣泛使用的語言,在網(wǎng)上有大量的學(xué)習(xí)范例,我已經(jīng)通過搭建一個WordPress網(wǎng)站而熟練的掌握了它。沒有絲毫的遺憾。它使我學(xué)到了很多 基礎(chǔ)知識。我還學(xué)習(xí)了其它語言嗎?當(dāng)然,我后來涉獵了很多腳本語言,我要在下一個項(xiàng)目上試試Ruby。編程語言不斷的在變化,不要只盯著一個不放。3.注冊你的GitHub帳戶
我已經(jīng)在Bitbucket上有了一個代碼庫。我最初選擇注冊Bitbucket是因?yàn)樗芴峁?個免費(fèi)的私有庫。后來我決定在GitHub上注冊。事實(shí)上,我絲毫沒有拖延,看看我的成果吧。4.向開源項(xiàng)目捐贈代碼
我早該如此做了。我起初低估了做這種事情的重要性,說老實(shí)話,我現(xiàn)在仍需要進(jìn)一步重視。向開源項(xiàng)目捐贈代碼,這是一種很好的學(xué)習(xí)別人如何編程的方法,并且能把自己的代碼公開。我今晚的就要去列一個準(zhǔn)備去參與的開源項(xiàng)目的清單。5.熱心參與
這也是我需要改進(jìn)的方面。我應(yīng)該到stackoverflow網(wǎng)站上去回答更多的問題,在一些博客,科技網(wǎng)站上分享自己的東西。去那些網(wǎng)站,讓大家看到你。不在網(wǎng)上露面,就相當(dāng)于待在屋里不出門卻想找一份做巴黎導(dǎo)游的工作。重復(fù)做第2,4和5點(diǎn) 其它一些事情
很明顯,每一個有志向的程序員都應(yīng)該每天閱讀Hacker News和其它開發(fā)/科技/編程類的博客文章。
我打聽到了不少的技術(shù)討論會。這周末我準(zhǔn)備去參加一個。我會把那里的情況寫出來。我在這里并沒有提讀書。我喜歡閱讀,但我們沒有買任何的關(guān)于web開發(fā)的書籍。這是我個人的做法。我相信很多人都會建議首先買一本書看看。
找一些能和你討論你的web開發(fā)/技術(shù)/編程想法的人和群體。如果我做了更多的第5項(xiàng),我可能找到了更多的這樣的人。
好了,這就是我要說的。這些就是在過去的一年里我成為一個程序員的成長之路上做到事情。如果有人覺得在這個清單里我還應(yīng)該加入什么,請給我留言。我永遠(yuǎn)都希望聽到新的觀點(diǎn)。
第三篇:如何做好一名程序員
如何做好一名合格的程序員
一、90%的編程工作來自內(nèi)部軟件
(90% of programming jobs are in creating Line of Business software)計算機(jī)專業(yè)的學(xué)生,可能有一種印象,覺得大部分程序員,都在編寫公開出售的軟件或者通用軟件。
這種看法是不對的。大部分程序員,實(shí)際上編寫的是不公開的企業(yè)內(nèi)部軟件,比如追蹤費(fèi)用的軟件、優(yōu)化裝運(yùn)成本的軟件、幫助記賬的軟件、設(shè)計新部件的軟件、計算保單價格的軟件、識別惡意訂單的軟件等等。
各種各樣的商業(yè)公司,開發(fā)內(nèi)部軟件,解決它們自己的問題。市場上對程序員的大部分需求來源于此,只有極少數(shù)程序員直接編寫面向外部顧客的軟件。內(nèi)部軟件的開發(fā),通常非常乏味,令人厭倦。因?yàn)樗鼈兊募夹g(shù)復(fù)雜性低、技術(shù)決策非常保守、預(yù)算很少、缺乏長遠(yuǎn)考慮。但是,世界上大部分編程工作都是這種。
二、別人雇你的目的,是讓你創(chuàng)造利潤,不是讓你編程
(Engineers are hired to create business value, not to program things)商業(yè)公司最關(guān)心的(或者說唯一在乎的)事情,就是增加收入、降低成本。因此,它們實(shí)際上需要的不是程序員,而是能夠幫助它們增加收入、降低成本的人。
開發(fā)優(yōu)美的軟件,解決技術(shù)難題,編寫沒有 bug 的代碼,這些都不是商業(yè)公司的目的。它們雇傭你,是為了讓你幫它們完成某個可以增加收入、降低成本的項(xiàng)目,而不是因?yàn)槟闶?geek。
你個人對于公司的唯一價值,就在于你能多大程度上為它們增加收入、降低成本。
三、不要自稱為程序員
(Don't call yourself a programmer)
很多公司的經(jīng)理不懂計算機(jī),在他們心目中,“程序員”就是一群高成本的勞動力,只會在一臺復(fù)雜的機(jī)器上干一些難懂的事情。
如果你自稱為“程序員”,當(dāng)公司需要壓縮成本的時候,某些經(jīng)理首先就會想到解雇你。有一家公司叫 Salesforce,口號是“沒有軟件”,意思就是如果經(jīng)理們購買了他們的服務(wù),就不再需要別的軟件管理銷售業(yè)務(wù)了,也就是說,不再需要自己雇傭程序員了。
正確的做法是,你應(yīng)該把自己描述成與增加收入、降低成本有關(guān)系的人,比如“xx 產(chǎn)品的開發(fā)者”或“改進(jìn)者”。有一個 Google Adsense 程序員的自我介紹,是這樣寫的:“Google 公司97%的收入,與我的代碼有關(guān)?!?/p>
四、不要限定自己
(You are not defined by your chosen software stack)
年輕學(xué)生經(jīng)常會問,應(yīng)該選擇哪種語言或平臺?學(xué)會 Java,是不是比學(xué)會.NET 容易找工作?
過分強(qiáng)調(diào)某一種語言或平臺,都是不必要的。如果你把自己限定為 Java 程序員或.NET 程序員,你就已經(jīng)輸了,因?yàn)槭紫饶悴粦?yīng)該自稱為程序員(理由見上一點(diǎn)),其次這種限定使得你自動被排除在世界上大多數(shù)編程工作之外?,F(xiàn)實(shí)生活中,學(xué)會一種新語言,只需要幾個星期,然后再過半年到一年,你
就會變成老手。那時,根本沒人在乎你以前用什么語言。
天才程序員是很少的,可是需要天才程序員的工作機(jī)會卻很多很多,大多數(shù)場合都是需求遠(yuǎn)遠(yuǎn)大于供給。這意味著,即使你不是天才程序員,只要你是一個優(yōu)秀工程師,那些招聘公司也會立刻錄用你,因?yàn)樗鼈冎勒衅傅教觳懦绦騿T的機(jī)會微乎其微。(重復(fù)一遍,所謂“優(yōu)秀工程師”,就是你的履歷上有一連串增加收入、降低成本的記錄。)
某些公司的人事部門,會根據(jù)某個關(guān)鍵詞(比如 Java 或.NET)過濾簡歷。雖然這樣的公司根本不值得去,但是如果你真的想過這一關(guān),也很容易:投入幾個晚上和周末,在你當(dāng)前的項(xiàng)目中設(shè)法用到這個關(guān)鍵詞,然后再把它寫進(jìn)簡歷就行了。
五、如何提高求職時的談判能力?
(How do I become better at negotiation?)
(1)記住你不是在求職,不是在展示編程技巧,而是在推銷某種商業(yè)需求(增加收入或降低成本)的解決方案。
(2)面試時,要有自信,要平等的對話。你要的是一個互利的錄用合同,不要每次對方提出要求,你都說 Yes。
(3)雇主可能會問“你的上一份工資是多少”,他們其實(shí)在說“給我一個理由,壓低你的報酬”。你要想好如何適當(dāng)?shù)鼗卮疬@個問題。
(4)要還價。這里不僅僅指錢,還指其它你關(guān)心的方面。如果你無法要求更高的薪水,那就試著要求更多的假期。
(5)在對方?jīng)Q定錄用你以后,才開始討論薪水。因?yàn)槟菚r,他們已經(jīng)在你身上,投入了大量的時間和金錢,產(chǎn)生了一定的成本,此時他們可能覺得一些小問題已經(jīng)不值得再糾纏了,比如每年的工資增加幾千元。
六、創(chuàng)業(yè)公司是否適合應(yīng)屆畢業(yè)生?
(Are startups great for your career as a fresh graduate?)
如果你一畢業(yè)就加入創(chuàng)業(yè)公司,最可能的結(jié)果是,接下來幾年你都工作得非常辛苦,然后公司悲慘地失敗了,你失業(yè)了,不得不又去另一家創(chuàng)業(yè)公司工作。如果你真的想去創(chuàng)業(yè)公司,應(yīng)該首先找一家大公司干上兩年,攢一點(diǎn)錢,積累一些經(jīng)驗(yàn),然后精心挑選后再去創(chuàng)業(yè)公司。
在創(chuàng)業(yè)公司工作,一般情況下,你遇到的都是創(chuàng)業(yè)者。他們大多數(shù)人沒有能力在兩年后雇傭你;而在大公司工作,你遇到的都是其他大公司的人,他們中很多人將來有能力雇用你或者幫你介紹工作。
七、在創(chuàng)業(yè)公司工作是否值得推薦?
(So would you recommend working at a startup?)
選擇創(chuàng)業(yè)公司,就是選擇一條職業(yè)道路,而不是選擇一種生活方式??上Ш芏嗳税堰@兩者顛倒了,他們推薦創(chuàng)業(yè)公司,實(shí)際上是在推薦一種你感興趣的生活方式。
如果你確實(shí)喜歡這種生活方式,老實(shí)說,你在大公司里也可以得到它們。在許許多多大公司里,你都有機(jī)會鉆研最新的技術(shù),而且還能5點(diǎn)半準(zhǔn)時回家照顧孩子。
八、溝通技能是最重要的職業(yè)技能
(Your most important professional skill is communication)
前面說過,工程師被雇傭,不是因?yàn)闀幊?,而是因?yàn)槟軌騽?chuàng)造商業(yè)價值。所以,你讓人們相信你能創(chuàng)造價值,這是幫助你找到工作的最重要的能力。這種
能力與你真的能創(chuàng)造多少價值,實(shí)際上聯(lián)系不是很緊密。
我認(rèn)識的一些最優(yōu)秀的程序員,往往拙于表達(dá)。因此,別人不是不想與他們一起工作,就是低估了他們的價值。相反地,如果你看上去很會編程,并且很善于表達(dá),別人就會真的這樣看待你
第四篇:碼農(nóng)故事:一位中級程序員的自白(寫寫幫推薦)
碼農(nóng)故事:一位中級程序員的自白
我是一名中級程序員。
我有相當(dāng)不錯的基本技能。我犯了足夠多的錯誤才明白為什么那些被稱為錯誤。我很清楚我還需要了解更多東西。最重要的是,我知道那些東西大概是什么,并且我正在努力而積極地提升自己。
勇敢地承認(rèn)自己不過是水平一般的程序員,這花了我一些時間。我不再感覺有必要去抓住那些我并不了解的觀點(diǎn)。當(dāng)人們發(fā)現(xiàn)我對某樣?xùn)|西不了解時,我也不再感到害怕。事情并非從來如此。你可能對此不以為然,但是我曾經(jīng)自詡為編程大師。
這種對自己能力的不正確的評估,很大程度歸因于我在一個相對封閉的環(huán)境中學(xué)習(xí)技能。在過去那些日子里,有電腦就已經(jīng)很特別了;更不用說知道如何使用了。
在我自己看來,我當(dāng)時是一個知識淵博并且經(jīng)驗(yàn)豐富的程序員。在我不到20歲的時候我已經(jīng)用C++、Pascal、C#、JavaScript寫過程序。當(dāng)然我最引以為傲的是,曾經(jīng)徒手用PHP編了一個電子商務(wù)平臺。
事實(shí)上,我可能只是人們平時談話中提到的“我有個朋友的兒子很會寫網(wǎng)站”。我和別的程序員沒有任何交流,所以我僅有的比較對象是我周圍的人;要么是一些根本不在意電腦的人,要么是那些會用電腦,但是在IE窗口中塞了5個沒用的工具欄的人。那些可能會說“我的網(wǎng)壞了”這種話的人。
接下來這個故事就是講我如何產(chǎn)生自己很厲害的幻覺的。
天才的起源
當(dāng)我九歲的時候,我的一個朋友家里有衛(wèi)星電視。而在我們家里,我們只能收到四個英國的頻道(你能想象第五頻道出現(xiàn)之前的日子嗎?),我熱切地盼望有一臺普通的電視機(jī)。我們所需要的只是那些“衛(wèi)星盤子”,或者我稱為“衛(wèi)星”的東西——那樣我就隨時可以看QVC臺或者Eurosport臺。由于隱約意識到自己的某種天分,我開始搭建自己的衛(wèi)星!我的設(shè)計包括了一把打開的傘和一條銅質(zhì)音頻線,一段接在傘的金屬柄上,另一端接在電視機(jī)天線上。必須承認(rèn)我的設(shè)計有一些缺陷,并直接導(dǎo)致我沒有得到想要的結(jié)果。但是這個小故事僅僅想表達(dá)我童年和青少年時期對技術(shù)的渴望。我認(rèn)識的人中從沒人想過制造“衛(wèi)星”。幾年后,當(dāng)我父親的辦公室得到一個14.4k的貓時,我成為了最早一批網(wǎng)民一員。我能回憶起花了整個星期六下午的時間等待這個火焰漫畫圖標(biāo)被加載,每個幀的動畫大概要過一分鐘才顯示。我甚至用Netscape搭建了我自己的網(wǎng)站。由于不知道互聯(lián)網(wǎng)的架構(gòu),我把所有的HTML文件存放在本地,并且期待有一天他們會出現(xiàn)在互聯(lián)網(wǎng)上。然而這些細(xì)節(jié)并沒有削弱一個事實(shí):我認(rèn)識的人中沒有一個制作了他們自己的網(wǎng)站。
在我十多歲的時候,我發(fā)現(xiàn)了自己天才中的黑暗面。在裝備了Jolly Rogers的食譜后,我和一群小伙伴們準(zhǔn)備動搖整個九十年代英格蘭的技術(shù)和道德根基。破解電話系統(tǒng)是我們的專長。我們用手提式聲音耦合器和公用電話,給我們在ICQ上認(rèn)識的美國姑娘們打免費(fèi)國際電話,以及在私人交換機(jī)上設(shè)立語音信箱。最終學(xué)業(yè)和滑板阻止了我們在這條路上越走越
遠(yuǎn),如果沒有這些干擾,我們無疑已經(jīng)在制造凝固汽油,黑進(jìn)政府網(wǎng)站并且徒手殺人了。盡管我們沒有把自己的能力發(fā)揮到極致,但事實(shí)是除了我們沒有其他人哪怕?lián)碛新曇赳詈掀鳌?/p>
盡管到那個時候我已經(jīng)經(jīng)歷了一些冒險和失敗,我還是缺少一些東西。我的想法總是要超前我自身能力好幾步-正如在“衛(wèi)星”一節(jié)里體現(xiàn)出來的。我需要一種把我腦海中想法表達(dá)出來的方式。我需要一個直接的介于我想象和現(xiàn)實(shí)之間的接口。
Fuck 生成器
真正的轉(zhuǎn)機(jī)出現(xiàn)在我十四歲的時候。我購買了一份PC Plus雜志,其中附贈了帶有完整版Borland C++編譯器的CD。我安裝了,并且認(rèn)真學(xué)習(xí)了雜志上的“hello world”教程。
就這樣,一個嶄新的世界在我面前打開了。物質(zhì)世界對于我想象力的限制消失了。我的創(chuàng)造力被解放了,我腦海中的大教堂要成為現(xiàn)實(shí)了!我該把這個新工具用于怎樣崇高的事業(yè)呢?很顯然,F(xiàn)uck生成器。
簡單而優(yōu)雅的Fuck生成器是一個命令行程序,也是我即”hello world”之后第一個里程碑。程序開始運(yùn)行后會提示用戶輸入一個數(shù)字n,然后它會輸出字符串”fuck”,n次。最后用戶被提示可以重復(fù)以上過程或是退出。盡管功能有限,我還是沉醉于我所品嘗到的成就。這是任何程序員都能享受到的一種快感,即看著機(jī)器執(zhí)行你的命令,不管這個任務(wù)有多簡單。它在運(yùn)行了,并且你知道為什么它能夠運(yùn)行。它除了在那里運(yùn)行不會做任何別的事。
過了些時日,另一期的PC Plus附贈了一個完整版的Borland Delphi。有了這個,我把程序升級為帶有窗口界面并且可以隨機(jī)生成彩色的4種不同的臟話。當(dāng)別的孩子在玩PlayStation的時候,我正在投身于一項(xiàng)更有意義和創(chuàng)造性的事業(yè),我在生成很多fuck。
到那時,一切都預(yù)示著我是注定要成大事的。我要向世人展示我真正可以做的事情。我的巨著
在90年代晚期,我為一家小型并且擴(kuò)張迅速的郵件訂購零售商創(chuàng)建了一個網(wǎng)站。一開始,這個站點(diǎn)只包含一些靜態(tài)的頁面——關(guān)于商品的小冊子,一個導(dǎo)航菜單和一個訪問數(shù)量計數(shù)器。
當(dāng)我們的訪問量越來越大時,我們決定加入電子商務(wù)功能。我們遍歷了一些現(xiàn)成的工具包,它們的質(zhì)量從差到極差不等。我印象中第一個版本大部分建立在擺弄cgi腳本以及怪異地把
不久后我們意識到,如果我們想要一個真正可用的甚至體面的在線商店,我們需要一個自定義解決方案。我想到了我過去的成功經(jīng)驗(yàn):fuck生成器系列,以及截至那時我所編寫的優(yōu)秀網(wǎng)站,這其中:我的 Manic Street Preachers吉他譜收藏網(wǎng)站非常具有權(quán)威性。我認(rèn)為是時候看看我能真正做些什么的時候了。我要自己從頭開始干。
從頭開始?即使那個時候開源框架已經(jīng)存在,我也不會知道他們。我有自己的計劃。我買了一本關(guān)于PHP和MySQL的書,一邊學(xué)習(xí)一邊著手搭建新的網(wǎng)站。
幸運(yùn)的是,這本書把一個非常簡單的購物網(wǎng)站作為它的核心例子。所有的部分都在那兒:“category.php”會列出一個目錄中的所有物品;“product.php”會顯示商品信息以及
把該商品加入購物車的按鈕;以及最重要的“cart.php”,它是所有奇跡發(fā)生的所在。這就是我想要的東西!
我孜孜不倦地學(xué)習(xí)這個例子,充滿自信地實(shí)現(xiàn)所有巧妙的而且毫無疑問也是最新潮的技術(shù)-那些方便的“mysql_”函數(shù);用于建立查詢的字符串連接函數(shù);把不同的函數(shù)放進(jìn)“functions.php”文件;通過加入“header.php”和“footer.php”來維護(hù)整個網(wǎng)站的一致性;為了代碼的快速運(yùn)行而回避了笨重的面向?qū)ο蟮脑O(shè)計方式(管它是什么玩意)。我的技能在飛速成長。
像一個人的王國一樣,我建造了高塔和迷宮般的地道。我每添加一個特性,就好像整個結(jié)構(gòu)在向天空伸展同時也向地下蔓延。顧客帳戶、商品評價、購買歷史、優(yōu)惠點(diǎn)數(shù)、帳單號、特殊優(yōu)惠、日志、A/B測試、支付信息加密,等等。一個蔓延的迷宮,一整個星系的函數(shù),大的小的,緩緩圍繞一個不變的核心:“cart.php”。
經(jīng)過八個月的激情工作,我終于完成了。
現(xiàn)在,你們這些讀者一定在期待我會詳述當(dāng)網(wǎng)站正式運(yùn)行時發(fā)生了怎樣恐怖的事情。恐怕我要讓你們失望了。
它成功運(yùn)行了。
最糟的方法
盡管我現(xiàn)在把這當(dāng)作我最糟的設(shè)計,但是這個東西確確實(shí)是能夠運(yùn)行。它在每一個糟糕的教程,每一個反php的帖子里都能找到。攪成一團(tuán)的代碼?是的。不一致的數(shù)據(jù)和方法名稱?是的。介紹和業(yè)務(wù)邏輯混在一起?是的。魔幻數(shù)和全局變量?是的。
對我而言,面向?qū)ο蟮脑O(shè)計只是一堆不必要的開銷和公式化的代碼,并且有很多片面的理論支持我的觀點(diǎn)。我知道有關(guān)測試的所有,點(diǎn)擊一些你設(shè)計的特性,看上去不錯,上傳運(yùn)行。我不太知道別的架構(gòu),但是據(jù)我所知,我所采用的是最明智的方法。
一些事實(shí)能“證明”我所做的都是正確的:我從零開始,白手起家,用智慧創(chuàng)造了一個功能齊全的電子商務(wù)站點(diǎn)。更重要的,它運(yùn)行完好并且還在擴(kuò)張。
在我的眼里,我和那些寫了亞馬遜的程序員們沒什么太大區(qū)別。當(dāng)然亞馬遜要大一些,但是我沒有看到任何我的網(wǎng)站不能擴(kuò)張成那樣的理由--尤其考慮到我采用的高速運(yùn)行的架構(gòu)。
我認(rèn)為我的技術(shù)水平已經(jīng)到了巔峰了。并不是說我對學(xué)習(xí)新技術(shù)不感興趣了,我只是不再對此感到緊迫。畢竟我創(chuàng)造了一些不錯的產(chǎn)品。任何在此之上的東西只是附加獎勵,是蛋糕頂端的櫻桃而已。
回到地表
我很遺憾,我在這種心態(tài)下生活了好幾年。我只是將一小部分時間用在這個網(wǎng)站上,而把主要時間用在完全不同的領(lǐng)域。在之后多年的維護(hù)和偶爾添加特性的過程中,我確實(shí)意識到了之前做的一些選擇是有問題的。我意識到有時候要花很長時間才能找到我要找的文件。有時候當(dāng)我做一個改動時,一些看上去毫無關(guān)聯(lián)的地方會出現(xiàn)bug。
我的學(xué)習(xí)沒有停止,但它確實(shí)進(jìn)展緩慢。我意識到我曾經(jīng)寫的mysql函數(shù)是有風(fēng)險的,因?yàn)楹竺姘姹镜腜HP減少了對它們的支持。在一段時間里,我克服對此的恐懼的方法是堅(jiān)信我的無懈可擊的設(shè)計可以彌補(bǔ)這些風(fēng)險。畢竟我嘗試了所有形式的我能找到的SQL注入,一切看起來都沒有問題。
去年的一天我接到了一個緊急電話,網(wǎng)站掛了。所有的請求都得到500錯誤。在工程師們重新啟動并且分析了事故原因后,這被證實(shí)是一起來自國外的sql注入攻擊,是我從來沒見過的一種。
好吧,我想,這也許是我該轉(zhuǎn)向PDO的時候了。
覺悟
當(dāng)我坐下來準(zhǔn)備重寫所有的數(shù)據(jù)存取方法時,我意識到了一些深層次的問題。我意識到這將會很困難。而且我知道為什么它會這么困難。
因?yàn)檫@些方法散落在所有地方;因?yàn)槲覠o法知道是否會不經(jīng)意地破壞一些東西;因?yàn)榇a是如此不一致以至于我要小心地研究不同對象的細(xì)微差別;因?yàn)楹芏啻a和別的部分緊密相連,這也會導(dǎo)致我會不小心造成破壞。簡單地說,這將會很困難。不僅因?yàn)樗羞@些壞的實(shí)現(xiàn)方法,還因?yàn)槲覍λ鼈兯鶎⒃斐傻暮蠊狈︻A(yù)見。
所有的辯護(hù),借口,逃避都無法繼續(xù)下去了。我錯了。我不是那個幻想中的天賦卓越的程序員。這么多年來,我一直都沒有認(rèn)清這一點(diǎn)。
我的愚蠢已經(jīng)顯而易見,盡管這對我的自尊心是極大的打擊,但這也是很寶貴的一個教訓(xùn)。我通過親身經(jīng)歷(而且是非常痛苦的),學(xué)到了為什么做一件事的方法有對錯之分。這不僅僅關(guān)系到品味或者時尚。這不是比誰的方法更聰明。正確的方法可以在現(xiàn)實(shí)生活中找到,并且能讓你和那些使用你代碼的人的生活更好。錯誤的方法讓人沮喪,浪費(fèi)時間。我在這里不想說明哪些東西是組成“正確方法”的要素。只要說不是我做的那些就夠了。
真正的錯誤
我實(shí)現(xiàn)了PDO。同時開始第一次使用PHPUnit。我決不想嘗試通過單元測試去改造那樣的代碼。
現(xiàn)在我有意識地迫使自己無論何時都盡量去學(xué)習(xí)。我正在讀一些每個程序員都應(yīng)該讀的書。我在關(guān)注別人的博客。我在收聽播客。我會看會議視頻。我正在參加一些當(dāng)?shù)氐纳鐖F(tuán)并且在其中做演講。我在做副業(yè)并且挑戰(zhàn)自己學(xué)習(xí)新的技術(shù)。我在學(xué)習(xí)用正確的方法做事。
對你們所有獻(xiàn)身于這項(xiàng)事業(yè)中的人來說,有一個對我們很重要的有利條件。即編程是這樣一個完全抽象的活動,任何其他領(lǐng)域都會受到的現(xiàn)實(shí)世界中的限制在這里不存在。在這里,你的極限是你自己。
我要以一些真正的箴言結(jié)束這個故事。我在開始寫這片博客的時候正好剛看完第二版的《代碼大全》。在書的最后,第825頁的底部,作者準(zhǔn)確地描繪了我在寫這篇文章時的想法??梢哉f他只用了兩句話就表達(dá)我在這數(shù)千字里想表達(dá)的東西:
“作為一個初學(xué)者或者進(jìn)階者,這并沒有什么錯。當(dāng)一個有能力的程序員而不是領(lǐng)導(dǎo)者,這也沒有什么錯。真正的錯誤是,當(dāng)你知道應(yīng)該如何去提高時仍然選擇做一名初學(xué)者?!?/p>
第五篇:怎樣做一名合格的程序員
作者:xx,1990年畢業(yè)于xx工學(xué)院計算機(jī)軟件專業(yè),后又于xx年畢業(yè)在xx大學(xué)完成軟件工程專業(yè)碩士的學(xué)習(xí),現(xiàn)供職于CNpC旗下的一個行業(yè)軟件研發(fā)中心,因?yàn)樵诰W(wǎng)上看了許多有經(jīng)驗(yàn)的各路軟件開發(fā)人員寫的好帖,一時手癢興起,也湊一篇壯壯聲勢。sO100
假設(shè)你是一名軟件專業(yè)畢業(yè)的本科學(xué)子,如何在工作中~成為一名有較高職業(yè)水準(zhǔn)的程序員呢,本文試圖總結(jié)作者從事15年軟件開發(fā)工作的感想,希望對有志成為職業(yè)程序員的人有所幫助,并借此機(jī)會感謝原xx工學(xué)院計算機(jī)系的和智玲老師和張懷寧老師,特別感謝我的碩士導(dǎo)師,xx大學(xué)計算機(jī)系的博導(dǎo)鄭國梁教授。
注:本帖言辭尖刻,乃作者脾氣秉性使然,如果你看著有氣,就請多多見諒,放下別看了。
程序就是一系列按步驟進(jìn)行的操作序列,它有好多種級別,比如最低級的微程序、次低級的匯編程序、高級的各種編程語言程序、最高級的腳本語言程序,也許我列的不對,但沒關(guān)系,我要說的是不管是那個級別的程序,其本質(zhì)都是操作的邏輯序列。大多數(shù)系統(tǒng)和應(yīng)用程序都是建立在高級編程語言上的,比如C、C++、C
#、FORTRAN、BISIC、JAVA等等,就讓我們只關(guān)注這一級的編程能力吧。因此如果一個程序員的邏輯能力不高,他永遠(yuǎn)都不能成為一名具有合格職業(yè)水準(zhǔn)的程序員,我們在下面的討論有關(guān)編程能力的方方面面,最終都是為了最大程度地提高和實(shí)現(xiàn)一名程序員的邏輯能力。
一、掌握基礎(chǔ)知識:十六年寒窗的持續(xù)積累
從7歲讀小學(xué)起,經(jīng)過16年的學(xué)習(xí),你從軟件專業(yè)本科畢業(yè)后,必須完成以下幾門專業(yè)課程的學(xué)習(xí):計算機(jī)組成、操作系統(tǒng)原理、匯編語言、數(shù)據(jù)結(jié)構(gòu)、編譯原理、數(shù)據(jù)庫原理、軟件工程、結(jié)構(gòu)性設(shè)計語言(pASCAL、)、面向?qū)ο笤O(shè)計語言(C++、C#)、計算機(jī)網(wǎng)絡(luò)等,你最好還懂一些算法分析、分布式系統(tǒng)、計算機(jī)圖形學(xué)、形式邏輯、人工智能原理、軟件設(shè)計模式、軟件構(gòu)架/框架等研究生的課程,16年來,你積累的除了知識,更重要的是形成最適合自己的學(xué)習(xí)方法和工作方法。這些是你具備程序員職業(yè)水準(zhǔn)的基礎(chǔ)能力,不要受什么計算機(jī)軟件怪杰之類傳奇的影響,那不過是小概率事件,而且這些怪杰們就算沒有讀過軟件本科和研究生,也往往自學(xué)了大多數(shù)專業(yè)課程,很可能比在校學(xué)習(xí)的學(xué)生對這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現(xiàn)在你只需要問問自己,那些課程和知識都學(xué)會并掌握了嗎?如果是,那就準(zhǔn)備好進(jìn)行實(shí)踐了。
二、在實(shí)踐中提高:成為一名高水平的Coder好了,你畢業(yè)了,在校功課都不錯,也找了一個專業(yè)對口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說來看看。通常,你在工作中都會用到某一種單位/公司固定的操作系統(tǒng)和編程語言開發(fā)環(huán)境,比如Windows、UNIX、LINUX等操作系統(tǒng),又比如用VC、VB、pB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語言和開發(fā)環(huán)境,我們在后面把它們合稱為開發(fā)環(huán)境。就在校學(xué)習(xí)的有關(guān)開發(fā)環(huán)境的知識而言,大概你距工作需要的差距是不小的,當(dāng)某個操作系統(tǒng)和編程語言環(huán)境成為你的飯碗時,就不應(yīng)也不能用通過課程/認(rèn)證考試之類的眼光和要求來評價你的能力,即使你能考100分。
你需要深入地學(xué)習(xí)該操作系統(tǒng)和編程語言環(huán)境的各類開發(fā)手冊的所有內(nèi)容,你會說大多數(shù)你都用不上,其實(shí)你既對又不對,對的是單從使用的角度而言,你確實(shí)用不上開發(fā)手冊的大多數(shù)內(nèi)容,比如龐大的VC開發(fā)類庫和復(fù)雜的開發(fā)環(huán)境,你在實(shí)際工作中能用到的不到總數(shù)的1/10或1/5,不對的地方在于,你用到的部分不是孤立存在的,它們是整個體系中的一部分,只有對整個體系有了一個較完整的了解,才能得心應(yīng)手、隨心所欲地用好你用到的部分,你才算初步具備在這種開發(fā)環(huán)境下進(jìn)行Coding的職業(yè)水準(zhǔn)(還遠(yuǎn)不夠程序員的職業(yè)水準(zhǔn)呢),而這只是剛開始。如何才能真正掌握一種開發(fā)環(huán)境的全面的知識呢,最原始的辦法就是讀開發(fā)指南/教程、參考手冊,一般來講,學(xué)習(xí)開發(fā)指南/教程時,你如果是一個認(rèn)真的人,都會完成5/10~7/10左右內(nèi)容的學(xué)習(xí)和練習(xí),如果你想成為職業(yè)選手,就應(yīng)該完成9/10以上內(nèi)容的學(xué)習(xí)和練習(xí)。參考手冊不同,大多數(shù)所謂的“程序員”們只是用到了才翻翻,這差的太遠(yuǎn)了,你應(yīng)該象讀開發(fā)指南/教程一樣,每個環(huán)節(jié)都要讀,比如VC,參考手冊中的每個類,類的每個函數(shù),都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開始時讀得你毫無頭緒、心煩意亂,不要緊,還有一手呢,如果你開發(fā)環(huán)境安裝的全面,它們往往都有開發(fā)商做的demo例子可看,你就進(jìn)入另一個境界了,開始時你關(guān)注demo中的具體技術(shù),后來你發(fā)現(xiàn)這些demo的程序?qū)懙亩歼€算不錯,結(jié)構(gòu)簡單但合理,如果你真的用心,就一定能發(fā)現(xiàn)一些個別的demo是極品,它所展現(xiàn)的程序邏輯結(jié)構(gòu)是你設(shè)計不出來的,你現(xiàn)在有點(diǎn)更關(guān)心它的程序設(shè)計構(gòu)架,甚于對你原始目的(某種相關(guān)的技術(shù)/技巧)的關(guān)注,這時的你,開始了從一名Coder向一名programmer的轉(zhuǎn)變,你會忍不住要看看開發(fā)商提供的源程序,比如.h和.cpp,通常你會找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊中都沒提到,你要學(xué)的太多了,沒時間顧及其它的業(yè)余愛好了,現(xiàn)在知道為什么程序員是年輕人的職業(yè)了吧,你要有足夠多的時間才行,即使你的智商有160。如果你走到這一步,在你工作的團(tuán)隊(duì)中,已經(jīng)是經(jīng)常有人向你請教技術(shù)問題,經(jīng)常有人請求你幫忙debug,你已是公認(rèn)的“高手”了,別得意,因?yàn)槟闳匀皇莻€Coder,為什么這么說呢,你想想,你已深入了解了這個開發(fā)環(huán)境中的各種技能,知道一名Coder如何用好這些東西,可是你能設(shè)計的出提供給Coder們用的東西嗎?唔……,你想了想,可能還不太行。對了,就是這樣,你還是一名小我境界的程序員呢,本質(zhì)是個Coder,當(dāng)然已是一名高水平的Coder了,然而你需要進(jìn)一步登堂入室才能成為一名真正的程序員。
讓我們繼續(xù)吧,通常你
點(diǎn)也許有點(diǎn)困難,但這種事干的多了,你就會越干越快,越來越
得心應(yīng)手,你的邏輯能力飛速提升,你能看得上的邏輯結(jié)構(gòu)優(yōu)秀的程序開始不多
了,下一步就是練習(xí)。從工作中開始吧,如果你有空閑,你需要做至少兩類練習(xí),一類是算法練習(xí),所有的經(jīng)典算法都是經(jīng)典的邏輯,題目有的是,像個好學(xué)生
一樣吧,每年的國內(nèi)國際編程競賽都有邏輯要求非常高的題,你可以只選一兩道
難題來做做。當(dāng)你可以把復(fù)雜的單遞歸程序(只有A調(diào)A)變成非遞歸程序時,已經(jīng)
不錯了,如果你能看得懂雙遞歸程序(A調(diào)A、A調(diào)B、B調(diào)A、B調(diào)B都有),我為你鼓
掌!你不必往下看了,我有點(diǎn)不好意思啦――班門弄斧,你快滾蛋吧!另一類是
把以前和當(dāng)前你工作中你不滿意的程序推倒重新設(shè)計一遍,這非常重要,省時省
力,因?yàn)槟闶煜ば枨?,技術(shù)上也沒問題,目的就是改進(jìn)程序的邏輯結(jié)構(gòu),很劃算
哦,唯一要克服的就是:你對推翻以前工作中那點(diǎn)小小成就的心理障礙,如果你
真想優(yōu)秀,說句粗話:這點(diǎn)心理障礙算個屁,一遍遍反復(fù)地推倒已有的成果只能
使自己快速進(jìn)步,放手干吧,沒什么好可惜的,馬恩早就在《共.產(chǎn).黨宣言》里
說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來總結(jié)一下,經(jīng)過自我否定后,再生的你盡管對過去的“業(yè)績”還有一些
眷戀,但已是一個初步具備職業(yè)水準(zhǔn)的程序員了,掌握了相應(yīng)的技術(shù)和技巧,具
備了較高的抽象邏輯思維能力,最主要的特征是:能自覺地自我否定,不斷地追
求更高水平的邏輯能力。
在這個過程中,如果你能注意以下一些小的方面,你前進(jìn)的步伐也許會快一些。
l從編譯原理的角度來理解你工作中使用的高級語言,如果你做到這一
點(diǎn),至少有兩個好處,第一個好處是避免一大堆低水平重復(fù)出現(xiàn)的編譯錯誤。一
名優(yōu)秀的Coder平均在一個工作日中應(yīng)該完成200行以上的源碼,其編譯錯誤應(yīng)該
控制在5個以下,要知道這200行源碼不是一次完成的,所以大多數(shù)情況下你都要
追求一次編譯通過,而一名職業(yè)水準(zhǔn)的程序員,應(yīng)該進(jìn)一步做到即使用purify這
類的工具來檢查源碼,也不會存在嚴(yán)重的內(nèi)存泄露。第二個好處是可以提高源碼的可讀性和效率。規(guī)范地編寫你的代碼使你自己的邏輯清晰,因?yàn)槟忝靼锥嗉訋?/p>
個括號和空行、多換行對齊、多注釋,編譯器是會自動識別的,不影響程序執(zhí)行的效率,反過來,控制好遞歸調(diào)用和循環(huán)內(nèi)的if語句才是提高程序效率的關(guān)鍵,要全力避免遞歸,但要深刻理解遞歸,能通過自己建立堆棧來把遞歸程序轉(zhuǎn)換成非遞歸程序,要求還是較高的哦!
l避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表
現(xiàn)在你的程序邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但
要心里有數(shù)才行,所以你需要幫助,如果你有幾個水平相若或更高的職業(yè)伙伴,太好了,當(dāng)遇到花30分鐘還打不下的bug時,就別浪費(fèi)時間了,找他們吧,最要緊的是能思路清晰明確地表述你的問題,通常你自己在這個過程中或者伙伴中就有
人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業(yè)伙伴是人生的一
件幸事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT
發(fā)展的這么快,你再優(yōu)秀,那點(diǎn)東東也沒有什么值得隱藏的,所以你可以技術(shù)或
水平不夠高,但千萬不可以讓真正具有職業(yè)水準(zhǔn)的選手鄙視你的職業(yè)品質(zhì)和行為。
l有自己debug的特點(diǎn),下面的說法作者不敢太肯定,只是經(jīng)驗(yàn)之談。即
使在VC這種高度完善的開放環(huán)境下,你仍然應(yīng)該要求自己僅憑打印語句就能debug
。這也有兩點(diǎn)好處,第一個好處是,遇到bug你會認(rèn)真想問題所在,而不是用
debug工具一步步簡單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到孝從
粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思
維方式,這不算好,你應(yīng)該先看到森林,再看到樹木。我反復(fù)提及:程序就是邏
輯過程,大多數(shù)程序從main函數(shù)開始,是由數(shù)據(jù)結(jié)構(gòu)和功能子程序組成的一個樹
形結(jié)構(gòu)的邏輯過程(要認(rèn)清即使是面向?qū)ο蟮某绦蛘Z言也是一樣的),它的執(zhí)行過
程是深度優(yōu)先的,但你定位bug應(yīng)該是廣度優(yōu)先的,好好想想這一點(diǎn),嗯?第二個
好處是強(qiáng)迫你思考并記住而不是用工具看到調(diào)用過程,你大腦的抽象邏輯思維能
力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程序結(jié)構(gòu)上的邏輯錯
誤引起的,這一點(diǎn)就非常重要了,順便說一句,最難打的bug就是程序邏輯結(jié)構(gòu)錯
誤導(dǎo)致的bug。你要是真正明明白白地認(rèn)識到這兒了,那我就沒什么東西可以告訴
你了??傊?/p>
p;,Linux操作系統(tǒng)的一些源碼不錯,是開放的,你可以合法地搞到,其它的不要說
是我建議你侵犯知識版權(quán)??!
四、天生神力:成為系統(tǒng)分析員
本來就論述如何成為一名職業(yè)程序員而言,本文已基本完成任務(wù)了,但《菜根譚
》有言:竭世機(jī)樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到
此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫算了。
你要是運(yùn)氣好,直接進(jìn)入了一個嚴(yán)格規(guī)范生產(chǎn)的軟件企業(yè)就業(yè),剛開始就應(yīng)該是
按別人做好的軟件設(shè)計來實(shí)現(xiàn)編程,你可以有機(jī)會直接學(xué)習(xí)軟件設(shè)計,當(dāng)你積累的足夠多了,能夠?qū)ζ渲械囊恍┰O(shè)計提出好的改進(jìn)建議,而且干得又快又好,就
會漸漸地展露頭角,我相信你終有一天成為一名軟件設(shè)計人員(注意,不是軟件產(chǎn)
品設(shè)計人員),步入系統(tǒng)分析員的行列,但這還需其它的一些條件和自我~。如
果你在一個不規(guī)范的軟件企業(yè)工作,那也不錯,你很可能直接就有機(jī)會進(jìn)行軟件
設(shè)計,然后開發(fā)、測試,甚至還不得不自己定義需求,把軟件開發(fā)過程的各個環(huán)
節(jié)走一個遍,當(dāng)然這樣對你的要求更高,而且你也不容易得到及時有益的指點(diǎn),在正態(tài)分布的情況下,你應(yīng)該是成長的很慢。但不管就業(yè)的單位如何,如果你決
心要成為頂尖軟件職業(yè)選手,通常什么客觀困難都阻擋不了你,然而你個人的因
素可能會阻止你的前進(jìn)。下面提出的觀點(diǎn)純屬一己之見,傷人自尊之處作者在此
提前道歉,并建議你除非對本文有強(qiáng)烈的興趣,否則就請直接看第五節(jié)或放下別
看了。丑話已說在前頭了,在各種軟件開發(fā)組織的發(fā)展過程中的事實(shí)也證明,只
有少數(shù)程序員能成為系統(tǒng)分析員,我想這一點(diǎn)不是我杜撰的吧,因此你要是在看
接下來的部分時感到氣憤難當(dāng),那也實(shí)在沒著,純屬活該,因?yàn)樽髡咧皇窃谡f明
自己的觀點(diǎn)而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒有任何理
由可以罵人!
作者自己沒有到微軟面試過,但身處軟件行業(yè),關(guān)于微軟的許多東東當(dāng)然還是有
耳聞的,據(jù)說微軟招聘一名程序員要過五個已經(jīng)成為微軟程序員的面試關(guān),而且
是一票否決制,又據(jù)說大多數(shù)面試題并非編程,而是一些有關(guān)邏輯和智力的題,作者私下也做過許多流傳的微軟面試題,并對此做法深以為然。程序的本質(zhì)就是
邏輯,所以幾十年前就有人提出編程是一門藝術(shù),而藝術(shù)是要靠天份的,這一點(diǎn)
少有人反對。一個人的邏輯能力可以不斷提高,但其能到達(dá)的終極邏輯能力的層
次必定為其天生智力所限制,這一點(diǎn)就讓人不易接受了。好笑??!人們可以公開
承認(rèn)自己沒有某種或全部的藝術(shù)天份,但要說自己邏輯天份不夠,換句話說承認(rèn)
自己笨、IQ不夠高,往往是要怒發(fā)沖冠的,其實(shí)這又有什么區(qū)別呢?話都說到這
兒了,再次建議你如果不夠自信,就跳過這一節(jié)吧,直接看第五節(jié),好嗎?
好了,把話題說回來,你已經(jīng)成為一門合格的職業(yè)程序員了,如果要想成為從事
軟件系統(tǒng)設(shè)計的職業(yè)系統(tǒng)分析員,第一件事就是悄悄找一個標(biāo)準(zhǔn)智商測試的網(wǎng)站
或其它渠道,嚴(yán)格認(rèn)真的測一測自己的智商,如果IQ低于130(正常智商是110),就請別費(fèi)勁了,打消掉成為系統(tǒng)分析員的念頭吧!好!好!先請你冷靜一下,好
好想想,其實(shí)微軟面試時就是在測你的智商和邏輯數(shù)學(xué)素質(zhì)呢,這就是本節(jié)的標(biāo)
題為“天生神力”的原因,因?yàn)樵O(shè)計就是從無到有地進(jìn)行創(chuàng)造,無論是軟件還是
其它行業(yè)都一樣,可以有借鑒的,沒有現(xiàn)成的,設(shè)計就是創(chuàng)造!如果你IQ在130以
上,又決心要當(dāng)一名職業(yè)軟件系統(tǒng)分析員,其實(shí)你不過是要準(zhǔn)備好吃更大的苦而
已,有什么好虛榮的呢?
~還是從基本功開始的,過程和成為一名職業(yè)程序員差不多。必須使用設(shè)計工
具這一點(diǎn)是不用多說的。在工作中,你基本上遇到的是兩類方式的設(shè)計,一個是
結(jié)構(gòu)化設(shè)計,另一個是面向?qū)ο笤O(shè)計,就個人經(jīng)驗(yàn)而言,面向?qū)ο蟮脑O(shè)計更好。
如果你工作中不得不采用結(jié)構(gòu)化的設(shè)計,你必須熟練地掌握數(shù)據(jù)流圖和控制流圖的分析和設(shè)計,一般來講,如果你把一個軟件中用到的數(shù)據(jù)模型設(shè)計好了,針對
功能化的流程,不難設(shè)計出數(shù)據(jù)流圖,但下一步設(shè)計控制流圖才是挑戰(zhàn),如果你
按照需求走不通設(shè)計好的控制流圖,那么你或別人在按照這個設(shè)計編程實(shí)現(xiàn)時,必定也走不通,沒有奇跡會發(fā)生,還是在設(shè)計階段嚴(yán)格要求吧,又有一點(diǎn)需要牢
記:返工是最慢的。當(dāng)你在進(jìn)行控制流圖的設(shè)計時,也不要妄想得到需求人員提
供給你明確的指點(diǎn),通常他們要是能夠把需求的功能和操作次序?qū)懲暾脑?,?/p>
應(yīng)該就感恩戴德了,從需求中整理出功能、操作的拓?fù)浯涡蚝蜅l件是你作為系統(tǒng)
分析員的職責(zé)
??纯?,要是沒有一點(diǎn)圖論的基礎(chǔ)和拓?fù)鋵W(xué)的入門知識,你是當(dāng)不
好一個職業(yè)系統(tǒng)分析員的,即使你天賦不錯,必要的數(shù)學(xué)和邏輯素質(zhì)仍然不可或
缺。也不用氣餒,永遠(yuǎn)沒有最好的設(shè)計,只有更好的設(shè)計,反復(fù)地進(jìn)行設(shè)計迭代,勇于推翻舊的設(shè)計,你將快速進(jìn)步。如果你在工作中是采用面向?qū)ο筮M(jìn)行設(shè)計的,那就更有利了,有關(guān)面向?qū)ο笤O(shè)計的書太多了,不用作者在此多費(fèi)口舌,建
議精讀一本經(jīng)典的書,比如北大邵維忠等編譯的《面向?qū)ο蟮姆治觥?,有些方?/p>
和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質(zhì)是,你在邏輯上是
如何認(rèn)識這個世界的,你就是如何設(shè)計軟件體系結(jié)構(gòu)的,然后讀讀其它書,觸類
旁通,自己創(chuàng)造機(jī)會多實(shí)踐,成功自然會到來的,總之,不管是結(jié)構(gòu)化設(shè)計還是
面向?qū)ο笤O(shè)計,評價一下自己的軟件系統(tǒng)設(shè)計方案吧,有好多指標(biāo)呢,比如是否
均勻和平衡?局部獨(dú)立性強(qiáng)不強(qiáng)?有沒有歧異的結(jié)構(gòu)?有沒有層次太多或太少?
有沒有某個層次太大、太廣?是不是邏輯結(jié)構(gòu)先復(fù)雜了再化簡的?還是只會設(shè)計
簡單的,復(fù)雜不起來(這一點(diǎn)是笨哦,如果出現(xiàn)多次,請你不要意氣用事,轉(zhuǎn)行吧)?最重要的一點(diǎn),是否容易理解、實(shí)現(xiàn)和改進(jìn)?你自己會得出評價的。如果有機(jī)
會看到別人的設(shè)計,一定不要錯過學(xué)習(xí)的機(jī)會,自己推導(dǎo)一遍,認(rèn)真比較比較,獲益會較多。
走到這一步,你就應(yīng)該關(guān)注設(shè)計模式了,首先還是學(xué)習(xí),這方面的好書有的是,但一般在工作中用到的設(shè)計模式較為單一,應(yīng)該多嘗試一下其它的設(shè)計模式。其
次必須要明白設(shè)計模式不是設(shè)計思路,也不能代替設(shè)計思路,比方你要從A到B修
一條路,設(shè)計模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設(shè)計思路,模式對思路是有影響,但不能代
替,所以如果你的智商高達(dá)250,我相信你直接用匯編語言也能寫出面向?qū)ο蟮某?/p>
序來。第三在此有一個陷阱,很多系統(tǒng)分析員生搬硬套設(shè)計模式,全然不懂如何
融會貫通,在你的一項(xiàng)具體工作中,往往是以一種設(shè)計模式為主,其它模式為輔的,思維不拘泥于形式才是關(guān)鍵,而且也為你到達(dá)更高的軟件設(shè)計的境界做好準(zhǔn)
備。
唉!都不知該怎么向下寫好了,因?yàn)橐堰_(dá)到作者水平的極限了,我胡亂說一點(diǎn),你湊合看吧。軟件設(shè)計最終的層次是:以無法為有法、以無限為有限,這句話是
李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天
屠龍記》里講到張無忌初學(xué)太極,學(xué)會的標(biāo)志是把剛學(xué)的招數(shù)全忘了,記住的是
太極的道理和精神,和李小龍有些相似喔,軟件設(shè)計也一樣,忘記所有的設(shè)計模
式,隨心所欲進(jìn)行設(shè)計才是至高境界,所以你能到達(dá)多高的軟件設(shè)計的境界最終
將取決于你的哲學(xué)素質(zhì),這一點(diǎn)實(shí)在是不好寫啊,你自己領(lǐng)悟吧!作者只有祝福
了!
五、職業(yè)人的終極目標(biāo):全面~,成為Leader
這一節(jié)更不好寫,涉及到太多其它非技術(shù)方面的因素,特別是個人人生觀和世界
觀的~,如果本帖的點(diǎn)擊率超過作者私下期望的一個數(shù)值,那我就爭取盡力厚
著臉皮再補(bǔ)上吧。我只說一句,雖然大家都知道軟件開發(fā)是一個團(tuán)隊(duì)性的工作,但追求參與一個大型軟件系統(tǒng)的成功開發(fā),是一名軟件人員的本能,就像拿破侖
說的不想當(dāng)元帥的士兵不是好士兵,所以不追求實(shí)現(xiàn)大系統(tǒng)的軟件人員,也不是
一個好的職業(yè)軟件人員,但你只有成為Leader,領(lǐng)導(dǎo)一個優(yōu)秀的軟件開發(fā)團(tuán)隊(duì),才有機(jī)會實(shí)現(xiàn)這個終極職業(yè)目標(biāo),對不對?
好吧,不管你現(xiàn)在的感受如何,我都謝謝你能讀到這里!我不習(xí)慣假歉虛,就不
說什么作者水平有限,本文拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然
作者水平確實(shí)有限。所以我認(rèn)為你盡管有權(quán)砸磚,但實(shí)在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡興寫一點(diǎn)多年從事軟件開發(fā)工作的體驗(yàn),因此接
下來我就高掛免戰(zhàn)牌,不回復(fù)任何回帖了。再次謝謝你能有耐心讀到這里!希望
本文對你有所裨益,祝你成功!再見!