初級程序員,該如何提高?

我是一名非常初級的程序員,剛畢業,大學期間主要是各種hello world嘗試,面廣,但是不精。我希望能夠提高計算機原理,演算法,編程思想等方面的知識。
我該看些什麼書,做些什麼功課,遵循什麼原則?


去參加軟考《初級程序員》吧,按著大綱學習一遍。大部分需要研發掌握的理論都照顧到了。非常不錯。
我是認真的。


說一下我的理解
程序員的方向其實差異還是蠻大的。往往一個做硬體編程的完全搞不懂什麼敏捷開發之類,所以要看你以後的工作方向。有針對性的在你的方向上把能力提高上去。當然,有一些程序員共性的知識,就像你提到的計算機原理 演算法和編程思想等等,雖然不同方向上有差異,而且對這些理解不深刻也不妨礙你工作的順利展開。
在計算機原理方向,《計算機程序的構造和解釋》做完裡面的習題感覺收穫特別大!不過這是一個慢功夫,急不得。《深入理解計算機系統》過多的讚美都是浪費。
演算法的話,不過不是專門搞演算法的話,看一下《演算法導論》就可以了吧。如果還比較感興趣的話,可以去做一下Topcoder的Single Round Match,很有挑戰性!幾乎在中國的每個大學裡面,總有那麼一群搞ACM的人,如果你感興趣可以和他們成為朋友,會有很多收穫。
編程思想,這個就屬於仁者見仁智者見智的話題了,不同類型的語言他們的思想也有差異(個人理解) 面向過程的,面向對象的,函數式,靜態,動態,並行的。。。找到個自己感興趣的,玩玩OK,興趣不能當飯吃。
先把自己工作的東西搞清楚了,有飯吃,然後回來補基礎,我覺得是一個比較明智的決定


程序人生的寂靜歡喜

程序人生的寂靜歡喜

標題起得太大咯,是在故作老成么?

「程序人生的寂靜歡喜」——怎麼看都感覺像是某位已故計算機大師的墓志銘,可卻偏偏被一個菜得摳腳的毛頭小子拿來當做人生寄語——也是日了狗了!

人都沒生過,談什麼人生!?

莫怪我,我偏要「奢談」一下!

一.記敘

一開始我是拒絕的!因為我根本就不喜歡寫程序。

打高中數理化就不好,什麼排列組合、圓錐曲線、電磁場中一帶電粒子、水溶液中的水解電離,困擾我有如夢魘。

高考時,祖墳上冒出一縷青煙,數學創歷史新高考了88,理綜破有史記錄考了200,數據不僅太美太感人,而且大吉大利、元亨利貞!終於,我以總分522分考上了一所夢寐以求的2本就讀於計算機科學與技術1202班——命中犯2!

可是對於編程其實我是拒絕的——大一花了一年的時間來研究心理學,大二花了一年的時間來研究哲學,大三花了一年的時間來研究中醫——結果,《離散數學》掛了,《數字邏輯》掛了,《數據結構》掛了,《編譯原理》掛了——恨不得自掛東南枝!

人在做天在看,出來混總是要還的!曾堅信「天生我才必有用」,「我輩豈是蓬蒿人」;曾篤定「心所願力畢至」,「有志者事竟成」;曾夙願「天授其賦必賜其福」,「好風憑藉力,送我上青雲」。可是,一個冷峻若紫電青霜的問題劈面而來:不寫程序又能幹嘛呢?

然而我根本就不會寫程序!試想,一個打字只能用到右手食指、左手食指和左手無名指的人,敲代碼時是多麼捉急!試想,一個高數補考考了19分,滿腦子宏大敘事的理科弱智,寫程序時是多麼腦洞大開!

後來去公司實習,遇到的第一個項目就是要使用ESFramework通信框架,當我第一眼看到了開發手冊上的如下句子時,我就知道,春天不會再來了!

客戶端通過調用ESPlus.Application.Basic.Passive.IBasicOutter介面對應的方法以及預定其相關的事件,就可以完成基礎功能或得到相關狀態改變通知。我們可以從 ESPlus.Rapid.IRapidPassiveEngine暴露的BasicOutter屬性來獲取IBasicOutter引用。

介面、預定、事件、暴露、屬性、引用,你們一個一個來,我還大概能明白,你們群起而攻之,我便委地如泥了!

重載的Query方法(帶有CallbackHandler參數的)在發送請求信息後,不會阻塞而繼續向下執行,而框架在收到對應的回複信息時,會回調CallbackHandler委託指向的方法。由於調用線程與回復回調的線程不是同一個線程,所以稱這種機製為回復非同步調用。

再當我看到「重載」、看到「阻塞」時,我徹底憤怒了!而緊接著映入眼帘的「委託」、「回調」更使我出離憤怒!最後「線程」、「非同步」更令我萬念俱滅,心如死灰!

從此,我便以一種菜得摳腳的姿態狼狽不堪地行走在險象環生的程序世界裡。莫非是寒更雨歇,葬花天氣,獵獵北風襲單衣;荒原寂寂,遠聽猿啼,近看寒鴉起;鬼影幢幢,步步驚心,不知今夕何夕。

好多次我都想,別瞎費勁了,你不是寫程序的料!真正適合寫程序的人根本就不可能是這個樣子!

於是乎放棄。可是不寫程序又能幹嘛呢?好歹讀了四年大學,何況拉弓沒有回頭箭。還是要頂風逆水雄心在,不負人民養育情!

終於,苦水的浸泡痛徹了肌膚,磨練了身心,同時也澆灌出了涅槃之花!

某天我突然發現,那些原本看來佶屈聱牙的技術文檔如今看來卻直白如話,那些原本晦澀難懂的語法如今卻能夠熟練運用,那些原本看都看不懂的源碼如今也能夠在自己指下流淌,實習之前我連循環語句都寫不對,如今卻也能用ESFrameworkOMCS等框架開發出像樣的網路通信應用。

二.議論

更重要的是,從當初的不喜歡、不擅長、不自信,到而今能夠懷揣著一顆歡喜之心來寫程序,能夠以樂在其中的心緒來開啟自己的程序人生,這不僅是我收穫到的莫大財富,更是我把握住的莫大幸福!

胡適先生的名言:「怕什麼真理無窮,進一寸有一寸的歡喜。」真理無窮並不可怕,因為我們在每一寸的前進中始終獲得歡喜。編程之路並非坦途,我們也並非天賦異稟,然而那個最幸福的人,並非是玩轉代碼的編程高手,也並非是億萬家資的IT精英,而是那個在流年中始終以歡喜之心書寫代碼,又通過書寫代碼恆久再獲歡喜之人!

常言道:「男怕入錯行,女怕嫁錯郎」。嫁郎要嫁有情郎——有情飲水飽,無情龍肉都無味!入行也是一樣。入了所愛之行,舉手投足皆得歡喜;入了所憎之行,坐卧立行儘是苦悲!嫁郎的幸福不在於嫁郎所獲得的富貴榮華,其根本在於郎本身。那些通過嫁郎以獲取外在利益的女子,她們充其量只是獲得了生意上的成功,而根本沒有獲得婚姻本身的幸福,而這何嘗不是一種買櫝還珠?同樣,那些以工作作為純粹手段的人,他們也從來沒有獲得過工作本身的幸福快樂。

由此看來,我想恐怕對於絕大多數的程序員而言——你不是真正的快樂!

所有程序員恐怕可以粗略的劃分為這五種狀態:

1.不愛,但是迫於生計

2.無感,反正亦步亦趨

3.熱愛,但卻身心俱疲

4.狂熱,打了雞血一般

5.歡喜,畢竟樂在其中

你是屬於哪一種呢?

如果要我來選,我一定會選5,因為唯其如此才能獲得程序人生的個中真昧,才能擁有彼此交融的內在完滿。而其他的幾種狀態在不同程度上都是殘缺的。

也許我們寫程序總是不可避免的為了各種外在的目的,但是寫程序時的那份小確幸的歡喜,卻始終是我們精神飛鳥的棲息地。 正如孔子贊顏回——子曰∶「賢哉回也,一簞食,一瓢飲,在陋巷,人不堪其憂,回也不改其樂 。賢哉回也!」

罷筆時風煙俱凈,但願自己剛剛開啟的程序人生能夠無關風月,寂靜歡喜。


前面眾人已經說了很多,我補充一點:
不斷試圖通過技術手段改進公司現有產品和工具,這樣才會有足夠的編碼環節。


在剛進入某個領域之時,有再大的雄心壯志也敵不過眼前的迷茫:不知道應該怎麼做,不知道應該做什麼。下面是我作為一名軟體開發人員所學到的經驗,希望能對大家有所幫助。

1.不要害怕在工作中學習。

只要有電腦,就可以通過電子閱讀器閱讀報紙和大多數書籍。如果你只是做好自己的本職工作以及分配的任務,那是學不到很多東西的。如果你盲目地要求更多的工作,也是不可能提升自己的。放慢腳步,先將一些基礎的知識撿起來。

2.在事業上勇往直前,自己為自己負責。

大 概只有十分之一的人才能得到導師的特殊照顧,如果你是十分之九中的一員,那就意味著大部分時間裡是沒有人來關照你的。所以你必須自己關照自己。如果可以的 話,盡量避免那些無法提升自己也不能教你任何東西的工作:因為它不會為你的職業增值,其他人也不會關心你所付出的努力(只要你不妨礙他們)。然後三年之 後,如果你拿不出什麼成績,那麼通常能做的就只能是換工作。

3.過度表現和表現不佳都是病,得治。

很 多企業都有不少效率低下的工作人員。這並非是個糟糕的決策,因為你完全可以通過管理等一系列措施提高他們的效率。那些被解僱的通常是那些既表現不佳又搞出 了什麼大的紕漏的傢伙。不過,你也要警惕不可過度表現。因為這會導致上級和同事一些額外的不必要的關注——也許是等著隨時抓你的小辮子。

我的意思並不是說你就可以不努力工作了,相反,你應該好好工作,用心學習。但是從我個人的經驗看,完全沒有必要過分表現——可能比表現不佳更要不得。

4.不要去徵求「同意」,除非不這麼做會有無法承擔的後果。

想 用一個星期的時間去鑽研自己的調查研究?不要去請示老闆,因為他們永遠也不可能「同意」。甚至他們會對你表示不喜,因為從他們的角度看,你這是沒有責任心 不愛崗敬業的表現。當然如果你所要做的對業務確實是有風險的,又或是在大多數情況下,老闆都能同意的,那就大膽去請示吧。反之,就不用去了。

5.永遠不要為自己的時間說抱歉。

你 可以承認一個項目沒有成功,當然最好是將它作為一種前進的動力和經驗,但是關鍵是你永遠不應該為自己項目的感到抱歉。這隻能說明你還需要更多的磨練。也千 萬不要主動去像老闆坦白,「我只在周末我自己的時間搞這些業務項目」。如果你的公司不允許在正常的工作時間干其他事情,那麼嚴格遵守。你不尊重自己的時 間,那就沒人會尊重它。

6.了解CS6,哪怕你忘了它,不願意學習它,但是它永遠與你同在。

隨著我們年齡的增長,我們會趨向於將關注的重點放到可轉移和通用型技能上。沒錯,CS6是不漂亮,但是它能在整個行業轉移,這是其他任何編程語言做不到的。如果你不學的話,那麼你的職業生涯將會被那些擅長CS6的人才給擠下來。

備註:cs6:Adobe Creative Suite 6」(簡稱CS6) 包含四大套裝和十四個獨立程序

7.不要不切實際地試圖證明你的老闆是錯誤的。

當年輕的工程師們覺得他們的想法比上司的更好,但又缺乏支持的時候,他們往往會在這上面加倍投注時間和精力:「我要證明是老闆錯了……!」

如 果你用的是自己的時間(並且工作上沒有緊急事情),那麼你的老闆,實際上並不會怎麼在意。反之,你的老闆就會懷疑和不滿你的工作狀態和工作態度了,並且會 潛意識地拒絕給你晉陞和加薪的機會。他們會用自己的方法來證實你給他們的負面印象,所以,即使你成功說服了你的老闆,其實你已經失敗了。不出意外的話,你 的老闆早就給你打上了「能力不錯,但是不能專註於完成分配的工作,而且喜歡和我對著干,真讓人不爽。」的標籤。

8.不要參合其他人的爭鬥。

正 如你還年輕,經驗不足,所以在大多數情況下,你是沒有任何實權的。如果你參合到其他人之間的爭鬥,或者站出來支持他人的不公正遭遇,那麼你很可能會被推出 來作」殺雞儆猴「用。我們應該為自己而戰鬥,這樣即使結局並不美好,至少也能贏得一部分人的尊重,並保護了自己。否則,別人只當你是一個愚蠢又傲慢的傻 叉。

9.好和壞並不是絕對性的。換個角度看問題。

不 要看到任何事情就給它定性為「好」或者「壞」,換個角度看看。老闆愛用咆哮體?那麼說明他可能也不被他的上級信任。分配到的項目很無聊?可能你的經理也正 鬱悶著呢,所以就沒時間找你的茬了。而且你還可以將空出時間用於學習新的技能為下一份工作做準備。令人頭大的文化?如果你能堅持而其他人做不到的話,那麼 你就會脫穎而出了親。所以,不要將一件事情簡單地貼上「好」或「壞」的標籤。話說,這似乎是一個會隨著年齡增長而提高的技能哦。

10.薪資不能走下坡路,除非自己去創業。

如果你轉行了(從金融轉到生物技術研究),或者去了消費水平比較低的區域,那麼10%的降幅是允許的,除此之外,請回答「No」。告訴你一件事,其實大多數人在評估他人工作上面都不擅長。也就是說,你現在的薪資水平完全可以當作以後談判的起點。如果你決定自降身價,那麼最好有一個能說服自己的理由,比如說,地位更高,同時分享下成為精英移動開發者的必備素質,自行學習。

11.鍛煉。

鍛煉能影響你的健康、你的信心、你的性生活以及你的職業生涯。而且鍛煉身體也能提高工作效率。如果你發現自己已經很久沒有鍛煉了,那麼馬上可以運動起來了,話說,身體才是革命的本錢啊。

12.長時間工作:偶爾還行,總是這樣就有害處了。

如果你的周老闆(周扒皮)只是為了省錢而讓你一個人幹了兩份工作,還只拿一份薪水,那麼立馬走人。相信我,你的這個老闆比你需要這份工作更加需要你。

13.透過現象發現核心技術的發展趨勢。

NoSQL資料庫和大數據技術等熱詞將有一半在15年 之後成為明日黃花。相反,線性代數的工作知識則是常青樹。你得琢磨清楚什麼才是有意義的,值得學習的核心技術原理(如函數式編程),而哪些只是潮流而已。 這些」潮流「可能對你當下非常有用(例如,有助於你找到工作),但是你不應該在它們身上花太多的時間。只有紮實的基礎才能讓擋得住一波又一波的新潮流,而 不被前浪拍死在沙灘上。

14.最後,儘可能多地學習。這很難,但是請堅持。

學 習才是根本,只有不斷地學習不斷地吸收營養,我們職業生涯這顆小樹苗才有可能成長為參天大樹。這很難,因為即使是真正聰明的人也很難讀懂那些前沿論文。 (在某種程度上,這是因為許多論文寫得並不是很好,但這是另一個話題了。)相信我,沒有人天生就看得懂複雜的公式。我們其實很幸運,我們是站在一個又一個 巨人的肩膀上。所以,如果你想成為一名偉大的程序員,那麼就應該比在學校里的時候更加用功地學習和鑽研。


一個外行人來回答專業問題,這個有些慚愧啊,不過是第一次回答,就盡我所能好了。我轉發工場首席佈道師蔡學鏞的兩句話給你吧——
「如果你是一個在校生,希望以後進入 IT 行業,但沒有明確的目標以後要做什麼技術領域,那麼我會建議你把時間花在 JavaScript 以及相關框架上。這是目前 "性價比" 最高的技術。 性 =用途廣泛性(跨前後端與各種平台),價 =學習的代價(耗費時間與難易程度)。」
「我建議的程序員學習成長之路:某語言 = &> 編碼風格 = &> 一兩個程序庫/框架 = &> 重構 = &> 設計模式 = &> 系統架構」
其實在微博上關注他是不錯的選擇。


最基礎的知識和原理最重要。平時多看多想多問。在讀書的過程中要不斷的去問人家為什麼這樣做,這樣做有什麼好處。看書的時候要不斷的去參照對應,這本書上講得可能和另外一本書上講得東西是一個東西但是表現形式不一樣,要挖掘其中的相同處,要觸類旁通。
基礎知識紮實了,建議去讀一些OpenSource的代碼,學習學習大牛們怎麼去寫代碼,怎麼去設計的,這樣功力提升會非常快。


作為一個程序員,不管以後的發展方向如何,基礎的重要性怎麼強調都不為過。好好地把大學裡學的數據結構、操作系統、編譯原理、演算法都好好的看看,甚至於數學、統計學可以看看。這些掌握不好,永遠都只能做一個低級程序員,更可悲的是有些低級程序員還不知道自己差在在哪裡。Sosi兄提到的幾本書都是非常不錯,值得好好看看。基礎紮實了,接下來根據發展方向的不同,就可以自己選擇性的去學習了。另外還有一個重要的,就是一定要實踐,知行合一


多看書,多寫代碼。
無它,唯手熟爾


要想成為合格的程序員,理論和實踐是缺一不可的。
從你的描述來看,你的實踐經驗是比較欠缺的。如果你的理論知識學習得比較好,例如數據結構,演算法,計算機組成原理,編譯原理等,這時候最好能找一個大公司進行實踐方面的鍛煉,同時學習一些技能方面的書,例如某種語言或者某種變成框架。如果理論知識不夠紮實的話,那就需要兩條腿同時走路,學習理論的同時進行實踐。
總的來說,理論是內功,實踐是外功,缺一不可。根據自己的情況,合理安排學習計劃吧,只要堅持,就肯定能做到。


推薦閱讀:

理論上可以通過除窮舉法以外的方法破解不可逆的加密演算法嗎?
毒酒迷題:現有 1024 瓶美酒,其中 2 瓶有毒。毒藥 24 小時內發作,現有 65 名死囚,怎樣能在 24 小時 01 分內找出 2 瓶毒酒?
x,y是正實數,解方程x^6-y^6=2016xy^2?
階乘函數n!推廣到連續情形是gamma函數,那麼為什麼特別要這樣定義:Γ(n+1)=n! 呢 ?
如何求MATLAB中構造的幻方的秩?

TAG:程序員 | 演算法 | 程序員修養 | 編程思想 |