
嵌入式培訓就業感言:我的未來不是夢-- 培訓對我的啟發
![]() |
學員姓名:李* | |
所在班級:武漢14051期班 | ||
就業單位:威盛電子股份有限公司 | ||
工作職位:嵌入式軟件工程師 |
轉眼間,四個月的培訓稍縱即逝,突然發現時間過的好快,在忙碌的學習節奏中幾乎忘記了時間是如何度過的,在華清的四個月,對我來說,收獲甚多,這離不開華清的每一位老師對每一位學員負責的授課態度和華清良好的學習氛圍,在培訓學習過程中,非常感謝各位老師對我的幫助,在此萬分感謝!
通過華清的培訓和自己的不懈努力,我自己找了一份滿意的工作,以下就培訓學習方法和有關找工作的一些經驗分享給大家,希望我能夠給大家帶來學習上和工作上的幫助。
對于培訓期間的學習,華清十分注重動手練習,也就是說,對于每一個程序,力求每個同學都能夠親自動手自己把代碼敲出來,并且能夠正常運行,我覺得這一點是非常重要的,也是華清培訓和大學上課的本質不同。我也聽過有人說過這樣一句話:學編程就像學游泳,紙上談兵永遠是不行的!我覺得這句話說的非常有道理,而華清剛好踐行了這樣一個準則,因此,我覺得,培訓幾個月以來大的收獲就是能夠獨立編寫程序了,可能有人覺得這其實很簡單,但是,大家也會發現大學里面,即使是學計算機的同學,大學幾年上完之后能夠獨立編寫一個50行左右的代碼,并且能夠考慮到各種bug和性能方面的同學寥寥無幾,大家不相信的話,在找工作的時候第一道“工序”就是筆試,筆試中有很多編程題,這些題目其實都是非常“簡單”的,但是,能夠把這些“簡單”的程序能夠寫出來,并且能夠考慮到各種邊界條件和bug就不容易了,另外,還有部分企業會安排機考,考試題目也很基礎,但是能夠編寫出程序,能夠正常運行我覺得也不是一件容易的事情,尤其對于沒有進行過實際編程的同學來說,難度更大,通過華清的培訓,這些能力我都具備了。
以下談談整個培訓過程中課程學習的一些體會。
對于C語言,我相信大家一定會在大學階段就已經學習過了,所以,問題不是特別大,但是,想要學好C語言就需要從深層次上去理解,我覺得學習任何一門語言,都必須理解這語言的設計初衷是怎么樣的,其目的是解決什么問題,面向的對象是什么?因為C語言是整個嵌入式學習的重點,因此一定要把C語言基礎打好。
學習C語言我們需要明白C語言的發展史、優缺點、特點、特色以及一些新特性,當然這些東西都是從概念上和宏觀上去理解,記住:理解非常重要!然后,就需要認真學習C語言的語法,每個語言都有自己獨特的語法體系,這其實就像我們一種玩游戲之前,必須要先搞明白游戲規則和每一種武器的特性一樣,規則不懂那肯定游戲都玩不了,不懂武器的特性顯然也不算一個“合格”的游戲玩家,這個道理大家肯定都明白,C語言的語法比較豐富,有數據類型、關鍵字、文件操作、豐富的運算符、語法結構、條件編譯、模塊化編程思想、書寫規則以及一些典型的錯誤等語法,你對這些語法了解的足夠透徹,你就能夠玩好C語言這場“游戲”,然后,就是要不停的“玩游戲”,你才對“玩游戲”比較熟悉,當別人要求你去玩這個“游戲”的時候,你才能夠輕松掌控整個場面。
在C語言階段,華清的老師會給我們把C語言的各種“游戲規則”和“武器特性”講解的非常透徹,我們要做的就是記住這些規則和特性,然后不斷的練習,記住,編程不練習結果就等于零。在這里我也有個建議,就是要養成一個良好的記筆記的習慣,因為,四個月的學習,知識量真的非常非常大,我覺得大家基本上和我一樣是一個普通人,很多東西當時就聽明白了,可是過了一段時間就會忘記,因此,記筆記就非常重要,忘記了你可以回過頭去看,這一點我做的非常好,這也是一個非常好的方法,假如別人問你:小學5年級的某一天你都干了些啥?我想,要是對于一個在小學寫了5年日記的同學來說,他翻翻自己的日記就能夠回憶自己當時干了什么,但是對于一個從來沒過日記的同學來說,你的童年就真的永遠變成童年了!另外,自己能夠把自己所學的知識講解給班級別的同學聽,并且能夠講明白這樣是好的,這也就是講著講著你就真的明白了,不信的同學可以試試,我就是這么學過來的。
C語言總結:深刻理解C語言的每一個詳細語法+記筆記的好習慣+不斷的練習編程+踏實勤奮的努力+樂于給別人講解你所理解的C語言 = 一個合格的C程序員。
對于學習數據結構,首先我們要搞明白數據結構到底是干什么的?數據結構是計算機存儲、組織數據的方式。然后就有一些典型的組織數據的方式需要我們去研究,數據結構是非常重要的,在找工作筆試環節會有很多的考點,尤其對于鏈表、隊列、棧、二叉樹等各種數據結構必須要多花時間寫程序實現,對一些典型的操作一定要熟練掌握,找工作筆試必考。
數據結構總結:理解+大量的練習
對于Linux系統編程,首先是要對整個Linux系統要有所了解,必須能夠正確熟練地應用Linux操作系統,因為大家在平時可能用的Windows系統更多一些,很少有人去用Linux,所以能夠熟練應用Linux系統時基本的,當然在華清上課期間的整個四個月都是基于Linux系統的,所以基本的操作不成大問題,接下來的問題就是要深刻理解Linux操作系統管理整個系統的方式,能夠進行shell編程等,以及后續的多進程和多線程等知識,這一部分的知識,我個人覺得理解的知識是非常多的,比如Linux的系統文件目錄組織方式,大家就要思考為什么這個目錄是這個名字?有什么用?然后還有后面的多進程、多線程等知識點,就必須明白進程和線程的概念,它們之間本質的卻別等等,多進程和多線程的編程模型是固定不變的,因此,重要的深刻理解進程和線程的運行原理,操作系統是如何進行調度的、進程的狀態、進程間的7種通信方式以及它們之間的區別、進程間的同步、線程間的通信、同步等問題,這些問題,華清的老師講的很明白,我們要做的就是上課認真把這些問題聽明白,并且把重點記錄下來,以便后續復習。
系統編程總結:深刻理解+練習
對于ARM硬件、系統移植課程,這部分的編程不是特別多,大部分的工作量就是修改代碼,所以學習方法相應也會 有一些不同,對于ARM硬件,理解為先,比如ARM核的設計思想、流水線的原理、指令集、ARM的工作模式、異常類型等知識點,要深刻理解裸機情況下程序的運行原理,尤其當異常發生時要弄明白程序的具體運行過程,這些知識點都是理解性的,另外,還需要學會datasheet的閱讀方法。
對于系統移植,首先還是深刻理解開發板的啟動方式、具體的啟動過程,這一部分的工作,同學們在學習的過程中可能大部分時間都是按照實驗手冊上的步驟去做,但是要真正掌握系統移植的精華,就必須知道移植手冊的每一個步驟是實現什么功能、具體的原理是什么?我感覺在系統移植的階段大家必須要知道:我要干什么?我該怎么做?首先明白,經過這一個實驗步驟之后我們要實現一個什么樣的效果,這是我們要達到的目的;其次,我們為了達到這個目的需要去修改哪些文件的哪些內容,具體的步驟是什么?
系統移植面對的是整個bootloader、kernel源碼,因此代碼量會非常大,但是我們并不需要去研究每一個文件,而是有針對性的修改,這就需要大家對整個bootloader和kernel的源碼的目錄框架進行學習,做到宏觀上把控、圍觀上研究,首先從宏觀上去理解整個系統的框架是什么樣的,然后定位到具體的文件的某一行去修改,給個小建議,修改系統的某一個文件之前,記得備份,不然,修改錯了,你的bootloader或者kernel直接掛了,你都不知道哪里錯了,要進行對比分析,對比學習。
在系統移植的過程中,我們經常要用到交叉開發工具,尤其對NFS、TFTP的使用多,因此對兩個服務一定要熟練應用,很多時候出現問題之后只需要重啟下服務就可以解決問題。另外,必須深刻理解FLASH的幾個分區都是存放了哪些代碼,這些代碼什么時候被加載到內存的,什么地方去運行等都是需要理解的地方,其次,就是我們的開發模型是交叉開發環境,我們自己移植好的bootloader和kernenl以及根文件系統有時候是通過TFTP和NFS等網絡的方式讓開發板運行,而有些時候又是通過從FLASH中讀取到內存中去執行等等,這些不同的方式的區別在哪里?其實代碼都是有一樣的,只不過把這些代碼終加載到內存中運行的方式不同,那這個時候就需要理解不同的方式啟動的時候區別在哪里?如何設置不同的啟動參數,以及在每一種啟動方式下,可能會出現哪些問題,出現了這些問題之后如何處理等等,這些問題只有深刻理解了整個系統移植的開發模型和系統的整個啟動過程之后你才能夠定位問題的原因,否則,學習系統移植大家會感覺比較茫然。
總結:深刻理解ARM核的設計思想 + 深刻理解交叉開發模型 + 深刻理解bootloader的作用以及啟動過程 + 深刻理解Kernel的啟動過程 + 深刻理解 + ……
大家也注意到了,以上都是深刻理解,如果不深刻理解,底層的東西是學不好的,因為底層的東西有時候你沒法驗證,你只能理解,在華清上課的過程中,老師會結合實際的情況把握以上說到的問題分析的非常透徹,大家要做的就是:
第一:認真聽講,深刻理解,跟上老師的思維,多思考,多提出問題;
第二:一定要做好筆記;
關于Linux驅動,大家可能會覺得驅動是難的,的確驅動相比前面的課程,是有一些難度,但是,總是有一些學習方法供大家參考。
Linux驅動的學習,大家必須要深刻理解Linux操作系統2.6內核的目錄結構、內核的編譯過程、系統調用原理、操作系統的用戶態和內核態的區別、Linux系統中文件的打開原理等核心知識點,然后需要學習Linux內核模塊、Linux文件系統與設備文件系統的一些關系,以及設備文件時如何反應到Linux的文件系統當中的,它們的組織方式是什么原理,這些知識點都是理解性質的,理解不清楚,后面的驅動都是沒法學習的,驅動的學習更加注重的是一種框架、一種模式,因此,對框架的理解一定要深刻,比如Linux系統是如何把每一個硬件都模擬成文件進行操作的,這個具體的模擬過程是怎樣實現的等等。
另外,一定要深刻理解內核中面向對象的具體應用,大家知道,操作系統是由C語言寫的,而C語言是面向過程的一種程序設計語言,這一點大家肯定已經體會到了,但是在操作系統中,利用C語言把面向對象的三大特性(封裝、繼承、多態)表現的淋漓盡致,現象對象的設計思想首先是描述對象,然后創建對象,后是調用對象,C++/Java的精華就是玩對象調方法,也是遵循以上的三個步驟,那么在驅動的學習過程中,我們會發現,對于一個需要能夠讓Linux識別的任何一個設備,這里的設備不僅僅是針對一個具體的設備,比如led、按鍵、觸摸屏、lm75溫度傳感器等才算是一個設備,其實我們的總線在Linux系統中也是被看成一個對象的,這也就是面向對象中的“一切皆對象”也對于我們Linux操作系統中的“一切皆文件”的說法。寫Linux平臺的設備驅動,其實就是按照操作系統規定的規則進行以上實現面向對象的三大過程:
1.描述設備(分為靜態描述:設備的靜態特性 動態特性:跟設備相關的操作)
2.創建設備(為設備分配內存,并且進行初始化)
3.添加設備(把設備添加到操作系統中,讓操作系統能夠識別這個設備)
以上工作做完了,設備就已經添加到系統當中,然后應用程序就可以通過我們自己寫的設備驅動訪問我實際的硬件設備了。這就是Linux環境下寫驅動的基本原理,當然這只是一個基本的思想,具體的很多細節性的東西還需要自己去仔細琢磨。
同時還需掌握Linux模塊編程方法,然后按照以上的大概步驟就可以寫一些簡單的驅動了,我們學習的字符設備驅動比較多,因此要對字符設備驅動框架有一定的理解,知道去哪里添加刪除代碼等。然后還理解設備驅動中的并發產生原因以及如何實現對并發的控制、Linux設備驅動中的阻塞與非阻塞方式、Linux設備驅動中的異步通知、中斷的上半部和下半部、內存與I/O訪問等,這些知識點都是需要理解,然后把自己理解的知識添加到自己的驅動模塊中進行驗證。
總之,Linux驅動的學習,框架占70%左右,真正的硬件操作只占大概30%左右,因此,掌握Linux內核的框架對于學習驅動是非常重要的。
在華清的培訓當中,老師會把這些框架的東西講的非常透徹,對我們的理解具有非常大的幫助,因此上課一定要認真聽講,多思考,多理解。
總結:深刻理解內核框架 + 深刻理解系統調用原理 + 深刻理解sysfs文件系統 + 深刻理解模塊框架 + 深刻理解字符設備框架 + 深刻理解并發 + 深刻理解設備驅動的異步通知 + 深刻理解中斷上下半部
以上是我對整個培訓課程的一個大概總結,因為我個人比較偏向底層,所以對java和Android應用方面的學習沒有給出一些建議。
以下再談談找工作方面的一些感受:
找工作目前來說有兩種情況,一種是通過社招,這一類針對往屆畢業生;另外一種是通過校招,這只針對于應屆畢業生。相對來說,社招的要求會更加高一些,對工作經驗的要求比較高,而校招更加看重的是學生的基礎,對經驗要求并不是很高,因此,扎實的專業基礎對于校招來說是具有很大的優勢。那么結合自己跑招聘會的經驗,給大家以下幾點建議:
首先,要認真的寫一份自己的簡歷,有很多同學只用了大概幾個小時就寫了一份簡歷,完全不重視簡歷,這是極其錯誤的做法,簡歷就是人家企業在沒見到你的真人時去“透視”你的唯一途徑,所以必須得引起重視,簡歷的寫法大家可以在網上看到一大堆的建議,但是我個人的建議就是一定要寫的大方得體,字跡不要太密集,讓別人看的輕松,基本信息應該清楚,專業技能一定要寫詳細,項目應該要根據自己的情況寫4-5個左右,而且一定要對自己的項目非常的了解,做到面試官隨便問,你能對答如流的境界。
一般企業在經過簡歷篩選之后,都會通知你去參加企業的筆試,筆試成績對應屆畢業生來說是非常重要的,因為筆試題相對來說考的都是非常基本的題目,企業會通過對這些基本題目的考察,以區分學生的基本功是否扎實,很難相信一個人筆試成績很差,但是能力很強,嵌入式是一個理論性和實踐性都非常強的技術,兩者缺一不可,因此筆試一定要考好。假如100分的試卷,你已經考了85分以上,這說明你已經被該企業錄取的可能性已經達到了95%,所以,在跑招聘會之前進行有針對性的筆試復習是非常關鍵的,筆試成績考的好首先會給企業留下一個非常好的印象。
關于如何準備筆試,市面上也有一些類似《程序員面試筆試寶典》之類的書籍,里面總結的比較全面,把一些比較坑的知識點都總結了,把這個看完,基本上就沒啥問題了,我之前就是這么準備的,后來發現,所有企業的筆試題就那么幾個考點,甚至原題都一大堆,有時候我感覺不是在做筆試題,而是在默寫答案,想想這是多么爽的一件事情。
如果你的筆試成績很好,你肯定會進入面試環節,面試環節的靈活性就比較大了,問的問題也因人而異,但是八九不離十,基本都是你簡歷上寫的東西,尤其是你做過的項目,因此對于自己寫上去的項目,自己一定要反復總結,把硬件原理和軟件架構甚至是大部分的代碼模塊都必須非常清楚,當別人面試官問你的時候,基本上你不需要思考就可以應答自如,這樣面試官會覺得你的思維比較敏捷,會覺得你真正的把這個項目搞明白了,因此,簡歷上寫的東西,要么精通,要么不寫,如果被問到之后你回答得模棱兩可,這樣影響反而不好,因此簡歷的書寫非常重要。
另外,對于整個面試環節,差不多我去過的企業都是1個小時多一點點,因此整個過程是比較長的,但是,實際上你會感覺時間過的非常快,那么在這一個小時的交流中,首先你要對簡歷上寫的項目完全明白,在回答這些問題的時候,給大家一個建議:那就是你的回答要讓面試官覺得你很厲害,另外你要對面試官表現出你對這個行業的熱衷和鉆研,要讓面試官覺得你是真真的想實現自己的技術夢想,而不是簡單的去他們企業混口飯吃,同時,在整個交流過程中應該堅持謙虛謹慎的交流態度,而且表現出毫不緊張的精神風貌。
如果技術面試通過了,就會進入HR面試,一般這個時候已經沒啥大的問題了,但是仍然要注意幾點:
第一:你要想HR表現出你非常想去他們企業工作,而且表現出要干一輩子的決心,當然這是扯淡的話,尺度自己把握。
第二:HR會問一些家庭的情況,這時候你要介紹你的家庭對你技術的支持,和諧的家庭環境,并且表現出家人非常支持你去該企業所在的城市去發展。
第三:關于薪資的話,我覺得你要跟你面試的情況來說,要是面試的非常成功,你可以多要一點,要是感覺面試比價懸,那么這時候可能就要要低一點了,其實,很多企業對應屆畢業生的薪資是規定死了的,所以你可以說沒啥具體的要求也行,你在乎的是企業的這個崗位剛好是你非常喜歡的,也是你特別擅長的等等之類的話。
以上是我對自己在華清培訓和找工作方面的總結,通過華清的培訓,我找了一份自己非常滿意的工作,我想,這離不開華清遠見每一位老師對我的關心和幫助,在整個培訓過程中,老師們對我的學習啟發很大,對于很多理解性的知識點,我感覺你自己看幾十遍都體會不到它本身的精華,但是在華清,老師們會把自己總結和學習了多少年的精華全部講解給你聽,這大大的縮短了我們原始積累知識的周期,使得我在短期之內積累了大量的知識,使得我對整個嵌入式開發有了更深層次的認識和理解。
后,感謝我身邊每一位同學對我學習的支持和幫助,再次衷心感謝華清的每一位老師對我的啟發和教育,也希望我的一些體會能夠對后來的學員在學習上提供一個參考,謝謝大家!