Linux應用開發自學之路
在 「關於我 」那篇博文裏,朋友們應該知道了我不是科班出身,是由機械強行轉行到Linux應用開發方向。下面我就詳細向大家介紹自己這一路上的轉行歷程,希望對大家有所啟發。
我是學機械專業的,對於機械專業我還是很感興趣,而且當年這個專業也是我自己選擇的。本科時成績沒排第一,但也排專業前列。碩士時成績一直是專業第一,還拿過國家獎學金。由此可見,我還是挺熱愛機械的,考研時甚至還想去中科院深造(可惜落榜了),想成為一名機械磚家。
轉折點
但轉機在我畢業之後。本來我就想一直踏踏實實的做機械,但陰差陽錯的,第一份工作由機械工程師調劑到電子工程師。雖然是電子工程師,但做了很多代碼工作,那時候學了一些Verilog,以及C#,並且用C#開發了一個測試工具及一個生產用的上位機,據說那個測試工具現在還在電子部門使用。也就是那時,我真正接觸到了編程,並深深的被編程世界所著迷。
可是,我在學校學的是機械啊,跟軟件相關的東西頂多是C語言及匯編語言,但C語言是十年前(那時候)學的,早就還給老師了。因此,為了工作的需要,我硬著頭皮開始學習編程。我每天早上6點起床,學習一個小時後7點去趕班車,晚上下班回來再繼續學習。在這樣的條件下我學會了Verilog及C#,同時對STM32有個大概的了解。
但那個崗位畢竟不是完全做軟件工作,還需要做電子方面的工作。做軟件的都知道,寫代碼的時候需要一個不被打擾的環境,而我那個崗位,一天可以接到十幾個電話,嚴重幹擾我的軟件開發進度,因此,我決定離開公司,去做真正的軟件工程師。
入門
第二份工作,我是嵌入式工程師。在去公司之前,我系統的學了一遍51,看的是郭天祥十天學會51單片機
看完 「C程序設計語言」之後,最好再看C和指針,C專家編程,C陷阱與缺陷。這三本書號稱「C語言三劍客」 ,學完它們你的C語言水平絕對是非常之高了。做我們這行,C語言是基礎語言,一定要把C語言完全拿下。
之後為了工作的需要,開始接觸了Marvell 88MC200及88MW300。這兩款是WIFI芯片,但本質是單片機,采用的是ARM M3內核。底層驅動已經由廠家寫好了,我們要做的工作就是在SDK基礎上做應用做二次開發。在這個過程中,我對敏捷開發有了初步的認識,看了高效程序員的45個習慣:敏捷開發修煉之道
在第二家公司裏,我知道了物聯網的整體解決方案,對於物聯網的整體框架有了更深入的了解。同時對嵌入式開發所需的技能有了全面的掌握,達到能夠獨立做一個物聯網項目的水平。當然,期間還學會了版本控制工具git,看的是Pro Git及git權威指南。同時再進一步系統學習了STM32,看的書是野火的STM32庫開發實戰指南,但看的視頻卻是正點原子的。這裏強烈推薦正點原子的視頻,真的是做的非常好。
由於我是轉行,我自知底子薄,起點比別人落後很多,因此我很刻苦學習。我就住在公司附近,公司8點上班,我依然6點起床,12點睡覺。平時沒事的時候就在公司學習,看代碼,寫代碼,調代碼,甚至好幾個周末也是在公司度過。為了轉行我一心撲在了學習上,放棄了一切娛樂活動,只為能趕上同事一點半點。這個狀態一直持續了我在這個公司的整個過程。
新挑戰
可惜,一年之後我不得不離開了,因為我老婆在廣州,我去廣州追隨我老婆了。由於我面試時的不錯表現,以及我不錯的英語口語,我順利的被廣州一家外資世界500強錄用。我的新崗位是Linux應用開發工程師,使用C++ 開發。而在那時,我既不會Linux,也不會C++,所以公司敢錄用我真的是勇氣可嘉。
從單片機到Linux又是一個比較大的跨度。Linux主要有三個方向:運維、應用、底層,而我選擇的是應用方向。為了工作的需要,我必須先拿下C++。好在公司是外企,幾乎不加班,於是我有充足的時間學習。可是,每天坐班車的時間加起來有三個小時,這麽好的時間我不能浪費啊,於是,我買了個iPad,下載一套視頻,在班車上也進行學習。當然,我也註意保護眼睛,在班車上絕不看書,看視頻的時候也經常往窗外看看。
這裏講講自學過程中是采用看書還是看視頻的方式。我采用的是先看視頻再看書
的方式。為什麽要這樣?因為我個人覺得,很多技術書都是很厚的一本,自己看下來要花費很多時間精力,而且很多知識點在工作中很少會用到,可以暫時先略過的。視頻一般會比較短,一般是幾天就能看完,而且老師一般只挑重點的講。我們時間都很寶貴,我建議先把老師講的知識完全掌握了以後,再利用書籍進一步擴展其它知識。但是,不管是看書還是看視頻,一定要寫代碼,一定要寫代碼,一定要寫代碼,否則非常容易造成眼高手低!!
我這家公司裏我依然保持著早上6點起床,晚上11點睡覺的習慣。這樣早上有1個小時,晚上3個小時,班車上3個小時,一天總共有7個小時可以用於學習。而周末我會睡個懶覺,7點起床,依然11點睡覺,周末幾乎不出門,所以周末又有大量的時間可以用來學習。
C++ 實在是太難了,我用了一個多月才將視頻裏的知識完全拿下來。之後,在工作中,陸續開始看C++ Primer進一步鞏固。其它書籍推薦:Effective C++,C++ 語言的設計與演化,C++ 標準程序庫。在stackoverflow上有個C++必讀書單,可以去看看。
學完C++我再學習了Linux系統編程,同樣采用的是先視頻後書籍的方式進行。不管是視頻還是書籍,一定要看最經典的。市面上有太多良莠不齊的視頻和書籍,如果選擇了一個質量不好的材料來看,不僅會浪費很多時間,而且有可能還會被誤導。對於視頻的選擇,可以去各大培訓機構,裏面通常有一些免費視頻資料供我們下載。
對於Linux應用的學習,主要有六部分:1. 環境搭建;2. 基本操作;3. 系統編程;4. 網絡編程;5. 數據庫編程,6. Shell編程。下面一一詳細介紹。
-
環境搭建
作為Linux工程師,毋庸置疑一定需要Linux環境。對於Linux環境的獲取,我們通常有三種方式:- 將電腦整體安裝為Linux系統;
- 在電腦裏安裝一個虛擬機,跑Linux電腦;
- Window+Linux雙系統。
得到Linux環境後還不夠,還要知道如何配置、如何遠程連接Linux電腦、如何與Linux電腦互傳文件、如何在主機上閱讀Linux電腦中的代碼,等等。
-
基本操作
眾所周知,Linux很少或幾乎沒有界面,所有的操作幾乎都可以通過命令行來完成。對於運維人員來說,需要掌握相當大量的Linux命令。而對於應用、驅動方向的人員來說,只需掌握一些基本的常用的命令即可。對於這部分很多人建議看 「鳥哥的私房菜」 ,但我覺得這個更適合運維人員,我們無需掌握那麽多命令。 -
系統編程
在學系統編程之前,一定要先學習Makefile,這會為後續的學習提高很大效率。之後的系統編程,主要有幾大塊:IO編程、進程、線程、進程間通訊(包括管道、信號、信號量、共享內存等)。這幾部分學完了,基本也就差不多了。 -
網絡編程
網絡編程主要就是socket,poll,epoll,以及對TCP/IP的理解,同時要學會高並發式服務器的編寫。 -
數據庫編程
數據庫的內容其實並不屬於Linux,但在項目中經常要用到。這部分主要要學會數據庫的基本操作,以及如何寫一套接口去操作數據庫。 - Shell編程
Shell是Linux下的腳本語言,功能雖然不如高級語言強大,但它可能做很多事,在某些場合甚至比高級語言要方便得多。當然除了Shell腳本,還有Python腳本。
Linux應用編程書籍推薦:
- UNIX環境高級編程。簡稱APUE,號稱程序員的聖經。它不是一本API字典,它還講述了很多操作系統的細節,內存,文件系統等方面,是一本難得的好書。但是它起點有點高,不適合初學者。
- Linux程序設計。如果覺得APUE有點難入門的話,可以選擇此書進行入門。
- Unix/Linux系統編程手冊。這本書號稱是一本超越APUE的書,它是一本比較新的書,裏面新增了APUE所沒有的Linux/Unix新特性。而且對於一些概念性的東西講的確實比APUE好。但至於能否超載APUE,還有待歷史的考驗。
- UNIX 網絡編程。也是一本非常經典的書,主要是網絡編程方向的。
- MySQL必知必會。本書在Amazon上長期排在數據庫銷售榜首,建議想快速了解數據庫原理和MySQL的新手閱讀。快餐性質,簡潔明快,小開本,而且很薄,比較好閱讀。
- Linux Shell腳本攻略。這本書很薄很精華,它追求的不是全,而是精,所以用它來入門再適合不過了。
學完以上六部分,基本就有能力完成Linux環境下的應用編程了。當然,在有些場合我們可能還需要用到Python腳本。像我公司的項目部分腳本就是用Python完成的。對於Python的入門,可以參考簡明Python教程。但如果想進一步提高的話,那就需要閱讀大量書籍了。對於Linux層級的腳本應用,掌握一些基礎的足夠了。
以上就是我的Linux應用開發自學之路,雖然我離高手還有很長的距離,但我還是將自己的這段自學經歷分享出來,希望能夠幫助朋友們少走一些彎路,同時也期待和高手一起學習、提高。好了,今天的分享就至此為止。
更多精彩內容,請關註公眾號良許Linux,公眾內回復1024可免費獲得5T技術資料,包括:Linux,C/C++,Python,樹莓派,嵌入式,Java,人工智能,等等。公眾號內回復進群,邀請您進高手如雲技術交流群。
Linux應用開發自學之路