不少同窗接觸linux很少,對linux平臺的開發更是一無所知。 而如今的趨勢愈來愈代表,做爲一個優秀的軟件開發人員,或計算機it行業從業人員,="" 掌握linux是一種很重要的謀生資源與手段。html
下來我將會結合本身的幾年的我的開發經驗,及對 Linux,更是類UNIX系統,及開源軟件文化, 談談Linux的學習方法與學習中應該注意的一些事。java
就如同剛纔說的,不少同窗之前可能連Linux是什麼都不知道,對UNIX更是一無所知。 因此咱們從最基礎的講起,對於Linux及UNIX的歷史咱們不作多談,直接進入入門的學習。linux
Linux入門是很簡單的,問題是你是否有耐心,是否愛折騰,是否不排斥重裝一類的大修。 沒折騰能夠說是學很差Linux的,鳥哥說過,要真正瞭解Linux的分區機制,對LVM使用至關熟練, 沒有20次以上的Linux裝機經驗是積累不起來的,因此必定不要怕折騰。程序員
因爲你們以前都使用Windows,因此我也儘量照顧這些「菜鳥」。 個人推薦,若是你第一次接觸Linux,那麼首先在虛擬機中嘗試它。 虛擬機我推薦Virtual Box,我並不主張使用VM,緣由是VM是閉源的,而且是收費的,我不但願推進盜版。 固然若是你的Money足夠多,能夠嘗試VM,但我要說的是即便是VM,不必定就必定好。面試
付費的軟件不必定好。編程
首先,Virtual Box很小巧,Windows平臺下安裝包在80MB左右,而VM動輒600MB,雖然功能強大,但資源消耗也多,況且你的需求Virtual Box徹底可以知足。 因此,仍是本身選。瀏覽器
如何使用虛擬機,是你的事,這個我不教你,由於很簡單,不會的話Google或Baidu均可以, 英文好的能夠直接看官方文檔。 如今介紹Linux發行版的知識。服務器
正如你所見,Linux發行版並不是Linux,Linux僅是指操做系統的內核,做爲科班出生的你不要讓我解釋, 我也沒時間。網絡
我推薦的發行版以下:架構
UBUNTU 適合純菜鳥,追求穩定的官方支持,對系統穩定性要求較弱,喜歡最新應用,相對來講不太喜歡折騰的開發者。
Debian,相對UBUNTU難不少的發行版,突出特色是穩定與容易使用的包管理系統,缺點是企業支持不足,爲社區開發驅動。
Arch,追逐時尚的開發者的首選,優勢是包更新至關快,無縫升級,一次安裝基本能夠一直運做下去,沒有如UBUNTU那樣的版本概念,說的專業點叫滾動升級,保持你的系統必定是最新的。缺點顯然易見,不穩定。同時安裝配置相對Debian再麻煩點。
Gentoo,相對Arch再難點,考驗使用者的綜合水平,從系統安裝到微調,內核編譯都親歷親爲,是高手及黑客顯示本身技術手段,按需配置符合本身要求的系統的首選。
Slackware與Gentoo相似。
CentOS,社區維護的RedHat的復刻版本,徹底使用RedHat的源碼從新編譯生成,與RedHat的兼容性在理論上來講是最好的。若是你專一於Linux服務器,如網絡管理,架站,那麼CentOS是你的選擇。
LFS,終極黑客顯擺工具,徹底從源代碼安裝,編譯系統。安裝前你獲得的只有一份文檔,你要作的就是照文檔你的說明,一步步,一條條命令,一個個軟件包的去構建你的Linux,徹底由你本身控制,想要什麼就是什麼。若是你作出了LFS,證實你的Linux功底已經至關不錯,若是你能拿LFS文檔活學活用,再將Linux從源代碼開始移植到嵌入式系統,我敢說中國的企業你能夠混的很好。
一、Linux基礎
你得挑一個適合你的系統,而後在虛擬機安裝它,開始使用它。 若是你想快速學會Linux,我有一個建議就是忘記圖形界面,不要想圖形界面能不能提供你問題的答案, 而是滿世界的去找,去問,如何用命令行解決你的問題。
在這個過程當中,你最好能將Linux的命令掌握的不錯,起碼經常使用的命令得知道,同時創建了本身的知識庫, 裏面是你積累的各項知識。
二、Linux平臺的C/C++開發,同時還有Bash腳本編程[JAVA]
再下個階段,你須要學習的是Linux平臺的C/C++開發,同時還有Bash腳本編程,若是你對Java興趣很深還有Java。 一樣,建議你拋棄掉圖形界面的IDE,從VIM開始,爲何是VIM,而不是Emacs, 我無心挑起編輯器大戰,但我以爲VIM適合初學者,適合手比較笨,腦殼比較慢的開發者。 Emacs的鍵位太多,太複雜,我很畏懼。而後是GCC,Make,Eclipse(Java,C++或者)。
雖然將C++列在了Eclipse中,但我並不推薦用IDE開發C++,由於這不是Linux的文化, 容易讓你忽略一些你應該注意的問題。 IDE讓你變懶,懶得跟豬同樣。若是你對程序調試,測試工做很感興趣,GDB也得學的很好, 若是不是GDB也是必修課。這是開發的第一步,注意我並無提過一句Linux系統API的內容, 這個階段也不要關心這個。你要作的就是積累經驗,在Linux平臺的開發經驗。
我推薦的書以下:C語言程序設計。 C語言,白皮書固然更好。 C++推薦 C++ Primer Plus, Java我不喜歡,就不推薦了,附一個別人的書單:java 入門書籍。 工具方面推薦VIM的官方手冊,GCC中文文檔,GDB中文文檔,GNU開源軟件開發指導(電子書), 彙編語言程序設計(讓你對庫,連接,內嵌彙編,編譯器優化選項有初步瞭解,沒必要深度)。
若是你這個階段過不了就沒必要往下作了,這是底線,最基礎的基礎,不然離開,不要霍霍Linux開發。 不專業的Linux開發者做出的程序是與Linux文化或UNIX文化相背的,程序是走不遠的, 不可能像Bash,VIM這些神品同樣。 因此作很差乾脆離開。
三、UNIX環境高級編程(做者英年早逝,第3版即將出版,稍等)
UNIX環境高級編程堪稱神做,經典中的經典。
接下來進入Linux系統編程,不二選擇,APUE,UNIX環境高級編程,一遍一遍的看, 看10遍都嫌少,若是你能夠在大學將這本書翻爛,裏面的內容都實踐過,有做品,你口頭表達能力夠強, 你能夠在面試時說服全部的考官。
(可能有點誇張,但APUE絕對是聖經通常的讀物,即便是Windows程序員也從其中汲取營養, Google創始人的案頭書籍,扎爾伯克的牀頭讀物。)
這本書看完後你會對Linux系統編程有至關的瞭解,知道Linux與Windows平臺間開發的差別在哪? 它們的優缺點在哪?個人總結以下:作Windows平臺開發,很苦,微軟的系統API總在擴容, 想使用最新潮,最高效的功能,最適合當前流行系統的功能你必須時刻學習。 Linux不是,Linux系統的核心API就100來個,記憶力好徹底能夠背下來。 並且經久不變,爲何不變,由於要同UNIX兼容,符合POSIX標準。 因此Linux平臺的開發大可能是專一於底層的或服務器編程。
這是其優勢,固然圖形是Linux的軟肋,但我站在一個開發者的角度,我無所謂,由於命令行我也能夠適應, 若是有更好的圖形界面我就看成恩賜吧。另外,Windows閉源,系統作了什麼你更本不知道, 永遠被微軟牽着鼻子跑,想一想若是微軟說Win8不支持QQ,那騰訊不得哭死。 而Linux徹底開源,你不喜歡,能夠本身改,只要你技術夠。
另外,Windows雖然使用的人多,但使用場合單一,專一與桌面。 而Linux在各個方面都有發展,尤爲在雲計算,服務器軟件,嵌入式領域, 企業級應用上有廣大前景,並且兼容性一流,因爲支持POSIX能夠無縫的運行在UNIX系統之上, 無論是蘋果的Mac仍是IBM的AS400系列,都是徹底支持的。 另外,Linux的開發環境支持也絕對是一流的,無論是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就連C#也支持。而微軟除Visual Stdio套件之外,都不怎麼友好,不是嗎?
若是你看完APUE的感觸有不少,但願驗證你的某些想法或經驗,推薦UNIX程序設計藝術, 世界頂級黑客將同你分享他的見解。
四、選擇方向:網絡,圖形,嵌入式,設備驅動
網絡方向:服務器軟件編寫及高性能的併發程序編寫
如今是時候作分流了。 大致上我分爲四個方向:網絡,圖形,嵌入式,設備驅動。
若是選擇網絡,再細分,我對其餘的不是他熟悉,只說服務器軟件編寫及高性能的併發程序編寫吧。 相對來講這是網絡編程中技術含量最高的,也是底層的。 須要不少的經驗,看不少的書,作不少的項目。
個人見解是如下面的順序來看書:
APUE再深讀 – 尤爲是進程,線程,IPC,套接字
多核程序設計 - Pthread必定得吃透了,你很NB
UNIX網絡編程 – 卷一,卷二
TCP/IP網絡詳解 – 卷一 再看上面兩本書時就該看了
5.TCP/IP 網絡詳解 – 卷二 我以爲看到卷二就差很少了,固然卷三看了更好,努力,爭取看了
6.Lighttpd源代碼 - 這個服務器也頗有名了
7.Nginx源代碼 – 相較於Apache,Nginx的源碼較少,若是能看個大體,很NB。看源代碼主要是要學習裏面的套接字編程及併發控制,想一想都激動。若是你有這些本事,能夠試着往暴雪投簡歷,爲他們寫服務器後臺,想想全球的魔獸都運行在你的服務器軟件上。
Linux內核 TCP/IP協議棧 – 深刻了解TCP/IP的實現
若是你還喜歡驅動程序設計,能夠看看更底層的協議,如鏈路層的,寫什麼路由器,網卡, 網絡設備的驅動及嵌入式系統軟件應該也不成問題了。
固然通常的網絡公司,就算百度級別的也該絕不猶豫的僱用你。 只是看後面這些書須要時間與經驗,因此35歲之前辦到吧!跳槽到給你將來的地方!
圖形方向,我以爲圖形方向也是頗有前途的,如下幾個方面。
Opengl的工業及遊戲開發,國外較成熟。
影視動畫特效,如皮克斯,也是國外較成熟。
GPU計算技術,能夠應用在瀏覽器網頁渲染上,GPU計算資源利用上,因爲開源的緣由,有不少的文檔程序能夠參考。若是能進火狐開發,或google作瀏覽器開發,應該會很好 。
嵌入式方向:嵌入式方向沒說的,Linux很重要。
掌握多個架構,不只X86的,ARM的,單片機什麼的也必須得懂。 硬件不懂我預見你會死在半路上,我也想走嵌入式方向,但我以爲就學校教授嵌入式的方法, 我連學電子的那幫學生都競爭不過。 奉勸你們,必定得懂硬件再去作,若是走到嵌入式應用開發,只能祝你好運, 不要碰上像Nokia,Hp這樣的公司,不然你會很慘的。
驅動程序設計:軟件開發週期是很長的,硬件不一樣,很快。 每月誕生那麼多的新硬件,如何讓他們在Linux上工做起來,這是你的工做。 因爲Linux的兼容性很好,若是不是過低層的驅動,基本C語言就能夠搞定,系統架構的影響不大, 由於有系統支持,你可能作些許更改就能夠在ARM上使用PC的硬件了, 因此作硬件驅動開發不像嵌入式,對硬件知識的要求很高。
能夠從事的方向也不少,如家電。
最後分享一些Linux相關的學習資料便於學習參考
linux基礎
http://www.makeru.com.cn/course/details/2058?s=45051
Linux網絡聊天室設計