軟件以程序員爲本,謹以此文獻給全部想當程序員的朋友。
(一) 文章由來及我的經歷
我是一名計算機專業的本科畢業生,畢業已經1年多了。畢業後從事的是軟件編程工做,常常有其餘專業的朋友想從事軟件編程工做,向我請教如何,由於我自覺涉行不深,不敢信口開河,無奈朋友信任,我不得不鄭重考慮一下這個問題了,來幫助朋友選擇和回報朋友的信任。(
中國軟件工程網)
這也就是此文的由來。
仍是先談談我我的的經歷吧。(是否是有點俗套,但我以爲了解個人經歷,有助於理解我話的含義;我一貫認爲不瞭解古龍的生活經歷的,不會真正讀懂古龍的做品和古龍筆下的英雄的)我本科就讀於南方一所著名的高校(由於本身的不成氣,愧談母校名謂),學的就是計算機專業。上本科時,幾乎沒有認真的聽完一門專業課程,上課看報紙睡大覺,下課看錄像看小說看球賽,臨考抱佛腳,每次考試和課程設計都是矇混過關。(於之相對是,我選修的工商管理和經濟貿易方面的課到是聽得不亦樂乎,考的分數頗高,也許這纔是個人真正興趣所在。)(
中國軟件工程網) 總而言之,大學是混過來了,對專業的理解和掌握程度,應該沒有達到畢業要求的合格水平。(也很後悔,可是有什麼用呢,當時不知道珍惜;若是上天再給我一次機會的話,我必定會抓住,多看點美國大片少看點港片;如今,重回校園是個人一大理想)可是大學的學習使我有了一個簡單的知識框架(總算學費沒白交),我對一個朋友這樣形容過個人這個知識框架,「它不是鋼筋鑄的,是稻草扎的」,哈哈哈,不要笑,真的,我敢說不少本科畢業的朋友的本專業的知識框架也只不過是「稻草扎的」。直到如今,我一直以爲本身的基礎知識仍是很薄弱,一直想抓點時間,把基礎書本好好的溫習一下。(此項任務正在計劃和實施中) 畢業後,分配到某研究所工做。當領導讓我選擇本身之後的工做方向時,我絕不猶豫的選擇了軟件(也不知道究竟是對仍是錯,但我決不後悔)。此研究所主要是以硬件爲核心搞通訊控制設備的研發生產;軟件是輔助,因此也不受什麼重視,不少搞軟件的人都跳槽走了,留下來的大都是一些已經廢掉和行將廢掉的「僞/萎」程序員(名副其實的「軟件人員」)。在這裏感受不到什麼高緊張和高技術程度的研究和開發;軟件開發的技術含量極低,以至於大部分人只有半年的學習和開發經驗,之後都是這些知識和經驗的重複利用。(我問過其餘到研究所工做的同窗,他們說都同樣,嗚呼,咱們的國防科研開發呀)對於軟件的開發,領導的意志和老掉牙的經驗在新課題的技術採用和開發中起了決定性做用,沒有明確的需求,沒有明確的開發計劃和進度,你們在一天一天一週一週的浪費着寶貴的時間,最後開發出來的東西修來改去,直至它變成垃圾。 我愈來愈認識到一點,要麼象那些廢人同樣廢掉,要麼本身去努力尋求出路,反正別期望從工做中獲得什麼高明的經驗了(教訓倒也許有)。期間發生了一些感情上的糾紛,嚴重的影響了學習計劃和效果,直到如今浮躁的心仍然有些浮躁。 期間,我讀了一些書,看了一些文章,編過一些小例程,搞了一些沒有什麼技術含量的開發工做,也和一些前輩和高手們談過聊過。 我一直在思考幾個問題;如何學習軟件開發?如何搞軟件開發,國外的軟件開發到底其祕訣在何處?爲什麼咱們的軟件業一直在低水平徘徊?咱們難道真的離了Microsoft就活不了?咱們的程序員到底在浪費時間幹些什麼?軟件開發究竟是如何分類的?咱們如何走本身的民族軟件之路? 我想了好久,一些想通了,一些還在想。但我知道有一點是確定的,那就是咱們必定要靠咱們本身走出本身的軟件之路!跟在別人屁股後面永遠受制於人! 好了,關於經歷和牢騷就先寫這些吧,該進入咱們的正題了。 (二) 你適合當程序員嗎,你知道編程序是怎麼回事嗎? 一、 程序員意味着要編程序。(若是你僅僅想獲得一份高薪水的工做,喝喝咖啡就等老闆發薪水,我奉勸你仍是另找一份更合適的工做,譬如練攤,真的,兄弟,這份工做不適合你) 二、你是學文的仍是學理的,編程序也許須要浪漫,但更須要邏輯和嚴謹。(說坦白點就是,在你沒有找到樂趣之前,它很枯燥) 三、你有對新技術追求的熱情嗎?你有刨根問底的探索精神嗎?(熱情絕對是最重要的!你仔細思考一下本身的性格適合當程序員嗎?) 四、當程序員決不是什麼好差事,時刻須要學習,須要思考 五、程序員的將來很迷茫。(但我認爲關鍵看你本身!我但願你是一個有追求的人,不只僅是混碗飯吃。由於真正的樂趣在於創造;若是你能改變軟件業的歷史,那纔是英雄;不想成爲Bill Gates,不想成爲Dennis Ritchie和 Bjarne Stroustrup,我會說你沒有追求。有個關於程序員將來的笑話,也許你還沒聽過,你該聽一聽,摘抄以下: 一個程序員對本身的將來很迷茫,因而去問上帝。 「萬能的上帝呀,請你告訴我,個人將來會怎樣?」 上帝說「個人孩子,你去問Lippman,他如今領導的程序員的隊伍多是地球上最大的」 因而他去問Lippman。 Lippman說「程序員的將來就是駕馭程序員」 這個程序員對這個將來不滿意,因而他又去問上帝。 「萬能的上帝呀,請你告訴我,個人將來會怎樣?」 上帝說「個人孩子,你去問Gates,他如今所擁有的財產多是地球上最多的」 因而他去問Gates。 Gates說「程序員的將來就是榨取程序員」 這個程序員對這個將來不滿意,因而他又去問上帝。 「萬能的上帝呀,請你告訴我,個人將來會怎樣?」 上帝說「個人孩子,你去問侯捷,他寫的計算機書的讀者多是地球上最多的」 因而他去問侯捷。 侯捷說「程序員的將來就是誘惑程序員」 這個程序員對這個將來不滿意,因而他又去問上帝。 「萬能的上帝呀,請你告訴我,個人將來會怎樣?」 上帝搖搖頭「唉,個人孩子,你仍是別當程序員了」 六、當程序員仍是頗有樂趣的。(當你學到新知識時,當你有新的思想看法時,當你有新的產品問世時,和知己探討你的成果時…我問你,以爲這些是樂趣嗎?) 七、當程序員不易也不難。(世間事有難易乎?爲之…;不爲…。你有決心和信心嗎?) 八、你真的要當程序員?是你本身的想法? 九、你捨得花錢買書嗎?(讀好書絕對是學習編程的最佳捷徑。你必定會說,如今電腦書籍真他媽的貴,無法子,誰讓知識和技術在人家的腦殼,在人家的書裏呢;等你寫書時能夠把價格定低一點,記着還有好多沒錢但想買書的兄弟很困難呀。要捨得買書,買好書,很差的的書不如不讀,其害大於其益,關於買什麼書,你能夠問高手或看候捷的書評;準備一個小本子記錄你想買的書的名字,逛書店時看看,若是好就買下,記住要讀,別光買不看。) 十、我告訴你,程序就是:任何有目的的、預想好的動做序列,它是一種軟件。 十一、編程序就是編寫程序。 十二、你想好了嗎?(若是你想好了仍是決定要當程序員,能夠繼續往下讀;不然,你能夠繼續尋找別的出路了。) (三) 一個程序員應該具有的基礎知識和概念 一、計算機是有什麼組成的,CPU是什麼東西,其工做原理是什麼。(對於這些以及下面將要提到的概念我不會告訴你什麼答案,你能夠看相應的教材,關於教材我會在下一部分詳述,記住理解最重要!) 二、機器語言和微指令集的概念。 三、程序的概念。 四、彙編語言是低級語言但不是機器語言。 五、高級語言主要有那些?(C,C++,Basic,Pascal,Fortran,C#,Java等等;若是你是中國軟件業的英雄,你也寫一門語言,最好不用英語) 六、編譯程序和解釋程序的概念和其原理。(編譯器是高手和專家編寫的) 七、HTML、XML等是標識性語言。 八、Prolog是人工智能 九、操做系統OS的概念和原理。(Windows98,Windows2000,Windows NT,UNIX,Linux,等等都是OS,還有一些實時OS,嵌入OS,編這些的絕對是高手) 十、Windows編程說白了就是Windows API的調用。(中國的程序員不少只是會編windows程序,用的是VB,個人建議是這些程序員頂多只是低級編碼員,我稱其是coder) 十一、VC++、VB、BC、BCB、Delphi、VF等都只是編程的工具和環境,不是編程語言。 十二、面向結構的設計概念。 1三、面向對象的概念。 1四、軟件工程的概念和原理。(若是你想當老總就須要好好研究了,系統分析員比編碼員要高一個等級,薪水也高喲) 1五、數據庫的概念。(要熟悉一些著名的數據庫系統和語言的名字,如Orcle,SQL,DB2,DyBase等) 1六、瞭解網絡概念。 1七、瞭解多媒體概念。 1八、熟悉和掌握數據結構和基本算法。 1九、是否是要求過高了,彆着急慢慢來,進步在不知不覺之中。(一旦開始學習,一個月之後你就會有一個基本的概念;兩個月之後你就會感受本身有了全面的基礎知識;當你知道編程序是怎麼回事時,說明你已經入門了。也有不少人編了不少年程序尚未入門呢,你不會但願本身步其後塵吧。要有信心和耐心。沉不住氣怎麼能成大事?!) (四) 教材推薦 推薦的教材主要仍是針對概念來的,最好選用名校的教學用書。 一、《計算機組成原理》(熟悉) 二、《數據結構》(掌握) 三、《操做系統》(瞭解->熟悉) 四、《The C language》(掌握) 五、《編譯原理》(瞭解原理) 六、《彙編語言》(瞭解) 七、《計算機網絡》(瞭解) 八、《軟件工程》(瞭解) 九、《關係數據庫》(熟悉) 十、《The C++Languege 》(掌握) 十一、《面向對象設計》(掌握;結合C++學習) (五)一些經驗和體會 一、真正的程序員用C++;(一位專家說的) 二、動手去編程序; 三、動腦去思考; 四、要有良好的編程風格; 五、讀書,讀好書,儘可能讀原版書!(我反覆強調這一點,讀書要有選擇,堅持讀好書,名家出的經典書,不要浪費實踐在一些粗製濫造的書上面;堅持博覽羣書) 六、有本身的學習計劃; 七、總結本身的經驗教訓;(準備一個筆記本,記錄錯誤和心得) 八、不要怕學新東西; 九、要有軟件工程的思想; 十、善於發現問題,而後去尋找答案; 十一、向高手請教;(要虛心直到你成爲高手) 十二、和同行交流;(不善於交流確定不行) 1三、懂得軟件的實質,不要被變幻無窮的表象所迷惑; 1四、真正要學習用的是編程語言和方法,不是什麼庫,什麼類,什麼工具;(學用那些什麼庫都比較簡單,但光會這些庫,我以爲還遠遠不夠) 1五、學習wiodows編程主要是學習windows OS和win32 API; 1六、有空了解一下嵌入式開發; 1七、有空了解一下PDA軟件開發; 1八、瞭解一下.NET框架和C#語言,也許它是你新的衣食父母; 1九、要有耐心,不要做浮躁的人; 20、對程序加註釋,並保留你的老程序; 2一、學到的東西越多,瞭解的越多,你就越接近專家; 2二、有空去逛逛CSDN,那裏有你不少知己; 2三、要有信心成爲一個優秀的程序; (六)一些好書的推薦 一、《The C Programming language》 (Keinighan & Dennis Ritchie 1988) 二、《The C++ Programming Languague》(Bjarne Stroustrup 1997) 三、《Inside The C++ Object Model》 (lippmans) 四、《Effective C++》 (同上) 五、《More Effective C++》 (同上) 六、《Exceptional c++》 七、《C++面向對象高效編程》 八、《設計模式》 九、《Thinking In C++》 十、《The Standard C++ Bible》(通常推薦) 十一、《The Art of Computer Programming 》 十二、《Programming Windows》 (Charles Petzold) 1三、《VC++5.0技術內幕》 1四、《MFC 深刻淺出》 1五、《軟件需求》 1六、《Advanced Windows》 1七、《C++ primer》 1八、《win32程序員參考手冊》(七)學習計劃 1九、《用TCP/IP進行網際互連》 20、《COM 本質論》 這個學習計劃是我我的定的,也共享給你們參考一下,共同進步吧。 一、《計算機組成原理》 二、《操做系統》 三、《數據結構》 四、《彙編語言》 五、《 C 》 六、《 C++ 》 七、《VC 技術內幕》 八、《Programming Windows》 九、《深刻淺出MFC》 十、《Advanced Windows》 十一、《Inside The C++ Object Model》 十二、《Thinking in C++》 1三、《Effective C++》 1四、數據庫 1五、網絡 1六、嵌入式OS和編程 1七、硬件單片機 1八、.NET和C# 1九、軟件工程 20、UNIX和Linux (八)後記 一年來浪費了大量的時間去摸索,去思考,走了不少的彎路,直到如今我還以爲本身是個編程的門外漢。我把個人一些體會和想法說出來(固然,不少都不必定正確,歡迎你們指正和討論),也許對一些想加入程序員行列的朋友有一些建議和幫助。但願能幫助這些朋友順利走上編程之路,成爲高手。 我要說明的就是個人這篇小文,主要是想給「一些想成爲程序員」的朋友一些建議,幫他們尋找一條自我培訓的捷徑,(其實世界上沒有什麼捷徑的,我以爲一切都在於悟性,師傅領進門,修行在我的,譬如我就修行不夠)少象我同樣做大量的無用功。還有,主要就是一個程序員應該具有的基本功(我的見解),有人稱其爲「內功」,我以爲很對。沒有紮實的基本功,咱們如何可以作到遊刃有餘的編寫高質量高性能的優秀程序呢?