Linux應用開發自學之路

前言

在 「關于我 」那篇博文里,朋友們應該知道了我不是科班出身,是由機械強行轉行到Linux應用開發方向。下面我就詳細向大家介紹自己這一路上的轉行歷程,希望對大家有所啟發。

我是學機械專業的,對于機械專業我還是很感興趣,而且當年這個專業也是我自己選擇的。本科時成績沒排第一,但也排專業前列。碩士時成績一直是專業第一,還拿過國家獎學金。由此可見,我還是挺熱愛機械的,考研時甚至還想去中科院深造(可惜落榜了),想成為一名機械磚家。

轉折點

但轉機在我畢業之后。本來我就想一直踏踏實實的做機械,但陰差陽錯的,第一份工作由機械工程師調劑到電子工程師。雖然是電子工程師,但做了很多代碼工作,那時候學了一些Verilog,以及C#,并且用C#開發了一個測試工具及一個生產用的上位機,據說那個測試工具現在還在電子部門使用。也就是那時,我真正接觸到了編程,并深深的被編程世界所著迷。

可是,我在學校學的是機械啊,跟軟件相關的東西頂多是C語言及匯編語言,但C語言是十年前(那時候)學的,早就還給老師了。因此,為了工作的需要,我硬著頭皮開始學習編程。我每天早上6點起床,學習一個小時后7點去趕班車,晚上下班回來再繼續學習。在這樣的條件下我學會了Verilog及C#,同時對STM32有個大概的了解。

但那個崗位畢竟不是完全做軟件工作,還需要做電子方面的工作。做軟件的都知道,寫代碼的時候需要一個不被打擾的環境,而我那個崗位,一天可以接到十幾個電話,嚴重干擾我的軟件開發進度,因此,我決定離開公司,去做真正的軟件工程師。

入門

第二份工作,我是嵌入式工程師。在去公司之前,我系統的學了一遍51,看的是郭天祥十天學會51單片機,對單片機有個初步的入門。真正入職后,再利用一個月的時間系統學習一遍C語言,看的是C語言之父寫的C程序設計語言。這本書雖然寫于80年代,但現在看來依然不過時。而且這本書比較薄,容易看完,比較有成就感。

看完 「C程序設計語言」之后,最好再看C和指針,C專家編程,C陷阱與缺陷。這三本書號稱「C語言三劍客」 ,學完它們你的C語言水平絕對是非常之高了。做我們這行,C語言是基礎語言,一定要把C語言完全拿下。

之后為了工作的需要,開始接觸了Marvell 88MC200及88MW300。這兩款是WIFI芯片,但本質是單片機,采用的是ARM M3內核。底層驅動已經由廠家寫好了,我們要做的工作就是在SDK基礎上做應用做二次開發。在這個過程中,我對敏捷開發有了初步的認識,看了高效程序員的45個習慣:敏捷開發修煉之道這本書。

在第二家公司里,我知道了物聯網的整體解決方案,對于物聯網的整體框架有了更深入的了解。同時對嵌入式開發所需的技能有了全面的掌握,達到能夠獨立做一個物聯網項目的水平。當然,期間還學會了版本控制工具git,看的是Pro Gitgit權威指南。同時再進一步系統學習了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編程。下面一一詳細介紹。

  1. 環境搭建 作為Linux工程師,毋庸置疑一定需要Linux環境。對于Linux環境的獲取,我們通常有三種方式:

    • 將電腦整體安裝為Linux系統;
    • 在電腦里安裝一個虛擬機,跑Linux電腦;
    • Window+Linux雙系統。

    得到Linux環境后還不夠,還要知道如何配置、如何遠程連接Linux電腦、如何與Linux電腦互傳文件、如何在主機上閱讀Linux電腦中的代碼,等等。

  2. 基本操作 眾所周知,Linux很少或幾乎沒有界面,所有的操作幾乎都可以通過命令行來完成。對于運維人員來說,需要掌握相當大量的Linux命令。而對于應用、驅動方向的人員來說,只需掌握一些基本的常用的命令即可。對于這部分很多人建議看 「鳥哥的私房菜」 ,但我覺得這個更適合運維人員,我們無需掌握那么多命令。

  3. 系統編程 在學系統編程之前,一定要先學習Makefile,這會為后續的學習提高很大效率。之后的系統編程,主要有幾大塊:IO編程、進程、線程、進程間通訊(包括管道、信號、信號量、共享內存等)。這幾部分學完了,基本也就差不多了。

  4. 網絡編程 網絡編程主要就是socket,poll,epoll,以及對TCP/IP的理解,同時要學會高并發式服務器的編寫。

  5. 數據庫編程 數據庫的內容其實并不屬于Linux,但在項目中經常要用到。這部分主要要學會數據庫的基本操作,以及如何寫一套接口去操作數據庫。

  6. 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,人工智能,等等。公眾號內回復進群,邀請您進高手如云技術交流群。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Verdi 基礎教程

一、Verdi 功能 查看設計debugVerdi不能自己產生波形 二、Verdi使用流程 1、Verdi環境配置 .bashrc中配置 export Verdi_HOME$Synopsys_Dir/Verdi2015 #export NOVAS_HOME$Synopsys_Dir/Verdi2015 export PATH$Verdi_HOME/bin:$PATH export LD_LIBRARY_PATH"/opt/Syno…

ida和idr機制分析(盤符分配機制)

內核ida和idr機制分析(盤符分配機制) ida和idr的機制在我個人看來,是內核管理整數資源的一種方法。在內核中,許多地方都用到了該結構(例如class的id,disk的id),更直觀的說&#xff0…

MIPI CSI-2學習

CSI(Camera Serial Interface)定義了攝像頭外設與主機控制器之間的接口,旨在確定攝像頭與主機控制器在移動應用中的標準。 關鍵詞描述 縮寫解釋CCICamera Control Interface(物理層組件,通常使用I2C或I3C進行通信&…

internet網絡 checksum校驗和計算方法

http://hi.baidu.com/%CE%C4%B3%AD%B9%AB/blog/item/7d9a4e08f82d72b32eddd4cb.html

最有效的創建大數據模型的6個技巧

數據建模是一門復雜的科學,涉及組織企業的數據以適應業務流程的需求。它需要設計邏輯關系,以便數據可以相互關聯,并支持業務。然后將邏輯設計轉換成物理模型,該物理模型由存儲數據的存儲設備、數據庫和文件組成。 歷史上&#xff…

【轉】Castle Windsor之組件注冊

【轉】Castle Windsor之組件注冊 注冊方式較多&#xff0c;大體有這么幾種&#xff0c;學習得比較粗淺&#xff0c;先記錄&#xff1a;1、逐個注冊組件即對每個接口通過代碼指定其實現類&#xff0c;代碼&#xff1a;container.Register(Component.For<IMyService>() //接…

Verilog 補碼加法溢出判斷及處理

補碼加法運算溢出判斷三種方法&#xff1a; 一、符號位判斷 Xf、Yf分別兩個數的符號位,Zf為運算結果符號位。 當Xf Yf 0&#xff08;兩數同為正&#xff09;,而Zf1(結果為負)時,負溢出&#xff1b;當出現Xf Yf 1&#xff08;兩數同為負&#xff09;,而Zf0&#xff08;結果為…

Android繪制(三):Path結合屬性動畫, 讓圖標動起來!

Android繪制(一):來用shape繪出想要的圖形吧! Android繪制(二):來用Path繪出想要的圖形吧! 目錄 效果圖前言繪制屬性動畫最后效果圖 不廢話, 直接上效果圖, 感興趣再看下去. 其實不單單是效果圖演示的, 運用熟練的話各種圖標之間都是可以切換的. 前言 之前的文章也說了, path還…

{{view 視圖層}}微信小程序

微信小程序 view 視圖層//自學 1.數據綁定 數據綁定WXML中的動態數據均來自對應Page的data。 簡單綁定數據綁定使用"Mustache"語法&#xff08;雙大括號&#xff09;將變量包起來&#xff0c;可以作用于&#xff1a; 內容<view> {{ message }} </view>Pa…

CMOS圖像傳感器——概述

一、概述 圖像傳感器是把光學圖像信息轉換成電信號的器件。圖像傳感器是隨著電視技術在20世紀30年代發展起來的,早期圖像傳感器技術的最重要貢獻在于建立了掃描(Scan)的概念,用掃描的方法把二維空間平面上的光電信息離散成行(Line)和幀(Frame),然后按空間順序讀出形成…

nand flash壞塊管理OOB,BBT,ECC

0.NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH為例&#xff0c;一片Nand flash為一個設備(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 數據塊大小(512Bytes) OOB 塊大小(16Byte…

小白學git2

你已經在本地創建了一個Git倉庫后&#xff0c;又想在GitHub創建一個Git倉庫&#xff0c;并且讓這兩個倉庫進行遠程同步&#xff0c;這樣&#xff0c;GitHub上的倉庫既可以作為備份&#xff0c;又可以讓其他人通過該倉庫來協作&#xff0c;真是一舉多得。 首先&#xff0c;登陸G…

[LeetCode_5] Longest Palindromic Substring

LeetCode: 5. Longest Palindromic Substring class Solution { public: //動態規劃算法string longestPalindrome(string s) {int n s.length();int longestBegin 0;int maxLen 1;bool table[1000][1000] {false};for (int i 0; i < n; i) {table[i][i] true;}//對角…

冒泡排序java

一、最簡單粗暴的排序 思想為&#xff1a;讓每一個關鍵字都和它后邊的每一個關鍵字比較&#xff0c; 如果大則交換&#xff0c;這樣第一個位置的關鍵字在一次循環后一定變為最小值。 1 package demo01;2 3 class BubbleSort01 {4 public static void main(String[] args) {…

CMOS圖像傳感器——工作原理

一、像素陣列結構 一般像素陣列是由水平方向的行( Row ) 和垂直方向的列(Column)正交排列構成的。像素排列的最基本設計原則是:攝像器件像素排列的坐標,必須在顯示的時候能夠準確地還原在圖像原來的相對位置上。在大多數情況下,每個像素中心線在行的方向和列的方向,即…

追尋終極數據庫 - 事務/分析混合處理系統的交付挑戰 (3)

挑戰&#xff1a;支持多個存儲引擎 以下內容并不是新發現&#xff1a;行優化存儲適用于OLTP和運營工作負載&#xff0c;而列存儲適用于BI和分析工作負載。頻繁寫入的工作負載適用于行式存儲。對Hadoop而言&#xff0c;Hbase適合低延遲工作負載&#xff0c;列式ORC文件或Parquet…

hibernate快速入門

第一步:下載Hibernate的開發包:  http://sourceforge.net/projects/hibernate/files/hibernate3 第二步:Hibernate框架目錄結構:  documentation :Hibernate文檔  lib :Hibernate開發jar包    bytecode :操作字節碼jar包.    jpa :Hibernate的實現jpa規范.   …

U-boot給kernel傳參數和kernel讀取參數—struct tag

U-boot 會給 Linux Kernel 傳遞很多參數&#xff0c;如&#xff1a;串口&#xff0c; RAM &#xff0c; videofb 等。 而 Linux kernel 也會讀取和處理這些參數。兩者之間 通過 struct tag 來傳遞參數。 U-boot 把要傳遞給 kernel 的東西保存在 struct tag 數據結構中&#xf…

異步FIFO設計(Verilog)

FIFO&#xff08;First In First Out&#xff09;是異步數據傳輸時經常使用的存儲器。該存儲器的特點是數據先進先出&#xff08;后進后出&#xff09;。其實&#xff0c;多位寬數據的異步傳輸問題&#xff0c;無論是從快時鐘到慢時鐘域&#xff0c;還是從慢時鐘到快時鐘域&…