嵌入式技術面試指南

2021-05-27 10:25:50 字數 3631 閱讀 2179

僱傭合適的人對於fog creek軟體公司來說是非常關鍵的。在我們這個領域,有三類人可以挑選。在乙個極端, 是哪些混進來的, 甚至缺乏最基本的工作技巧. 只要問這類人兩三個簡單的問題,再讀一下他們的簡歷,就可以輕易地剔除他們。另乙個極端的型別是 才華橫溢的超級明星這些人僅僅為了好玩就用組合語言為palm pilot(一種手掌電腦)寫了乙個lisp(一種人工智慧程式語言)編譯器。在這兩種極端型別中間的是一大群不能確定水平的候選者,也許他們中的某些人能幹些什麼?這裡的關鍵是明白超級明星和那一大堆屬於中間型別的人的區別,因為fog creek軟體公司只僱傭超級明星。下面我要介紹一些找出超級明星的技巧。

fog creek公司最重要的僱傭標準是:

有頭腦, 並且

完成工作

就是這些了。符合這樣標準的人就是我們公司需要的員工了。 記住這條標準。 每天**前背誦這條標準。我們公司的目標之一就是僱傭擁有這樣的潛質的人,而不是僱傭懂某些技術的人。任何人所擁有的某些具體技術都會在幾年內過時,所以,僱傭有能力學習新技術的人,要比僱傭那些只在這一分鐘知道sql程式設計是怎麼回事的人對公司更划算一點。

有頭腦確實是乙個很難定義的品質。但是讓我們看一些在面試時能提問的一些問題,通過這些提問,我們可以找出擁有這種品質的人。完成工作非常關鍵。看起來有頭腦但是不能完成工作的人經常擁有博士學位,在大公司工作過,但是在公司中沒有人聽他們的建議,因為他們是完全脫離實際的。比起準時交活兒,他們寧願對於一些學院派的東西沉思。這些人由以下特性而可以識別出來。他們總是愛指出兩個根本不同的概念間的相似性。例如,他們會說「spreadsheets是一種特殊的程式語言」,然後花乙個禮拜寫一篇動人的,智慧型的***。這篇***論述了,作為乙個程式語言,spreadsheet關於計算語言特性的方方面面。聰明,但是沒用。

現在,我們來談談完成工作但是沒有頭腦的人。他們愛做蠢事。從來也沒有考慮過將來得靠他們自己或者別的什麼人來亡羊補牢。通過製造新的工作,他們成為了公司的負債而不是資產。因為他們不僅沒有為公司貢獻價值,還浪費了好員工的時間。這些人通常到處貼上大堆的**,而不願意寫子程式。他們是完成了工作,但是不是以最聰明的方式完成工作。

面試時最重要的法則是:

做決定

將乙個字串逆序

將乙個鍊錶(linked list)逆序

計算乙個位元組(byte)裡有多少bit被置1

搜尋給定的位元組(byte)

在乙個字串中找到可能的最長的子字串,該字串是由同一字元組成的

字串轉換成整數

整數轉換成字串(這個問題很不錯,因為應試者要用到堆疊或者strev函式)

注意,通常你不會希望他們寫的**多於5行,因為你沒有時間理解太長的**。

現在我們來詳細看一看其中幾個問題: 第乙個問題: 逆序乙個字串。我這輩子還沒有見過那個面試者能把這題目一次做對。所有的應試者都試圖動態生成緩衝區,然後將逆序的字串輸出到該緩衝區中。問題的關鍵在於,誰負責分配這個緩衝區?誰又負責釋放那個緩衝區?通過這個問題,我發現了乙個有趣的事實,就是大多數認為自己懂c的人實際上不理解指標和記憶體的概念。他們就是不明白。這真叫人吃驚,無法想象這種人也能做程式設計師。但他們真的就是!這個問題可以從多個角度判斷應試者:

他們的函式執行快嗎?看一下他們多少此呼叫了strlen函式。我曾經看到應試者寫的strrev的演算法竟然只有o(n^2) 的效率,而標準的演算法效率應該是o(n),效率如此底下的原因是因為他們在迴圈中一次又一次呼叫strlen函式。

他們使用指標運算嗎(譯者按:原文為pointer arithmetic,指的是加減指標變數的值)?使用指標運算是個好現象。許多所謂的「c程式設計師」竟然不知道如何使用指標運算(pointer arithmetic)。當然,我在前文說過我不會因為應試者不掌握一種特定的技巧而拒絕他。但是,理解c語言中的指標不是一種技巧,而是一種與生俱來的才能。每年一所大學要招進200多個計算機系的新生,所有這些小孩子4歲就開始用basic語言在atari 800s寫冒險遊戲了。在大學裡他們還學pascal語言,學得也很棒。直到有一天他們的教授講了指標的概念,突然,他們開始搞不懂了。他們就是不能再理解c語言中的任何東西了。於是90%的計算機系學生轉系去學政治學。為了挽回面子,他們告訴朋友,他們之所以轉系是因為他們計算機系英俊貌美的異性太少。許多人注定腦子裡就沒有理解指標的那根弦。所以說理解指標是一種與生俱來的品質,而不是一種單純的技巧。理解指標需要腦子轉好幾個彎,某些人天生不擅長轉這幾個彎。

第三個問題可以考考面試者對c的位運算的掌握,但這是一種技巧,不是一種品質,所以你可以幫助他們。有趣的等他們建立了乙個子函式用來計算byte中為1的位的數目,然後你要求他們優化這個子函式,盡量加快這個函式的執行速度。聰明的應試者會使用查表演算法(畢竟這個表只有 256個元素,用不了多少記憶體),整個表只需要建立一次。跟聰明的應試者討論一下提高時間/空間效率的不同策略是十分有意思的事情. 進一步告訴他們你不想在程式啟動時初始化查詢表。聰明的面試者可能會建議使用緩衝機制,對於乙個特定的byte,只有在第一次被查詢時進行計算,然後計算結果會被放入查詢表。這樣以後再被查詢時直接查表就行了。而特別特別聰明的面試這會嘗試有沒有建立查詢表的捷徑,如乙個byte和它的置1的bit數之間有沒有規律可循?

當你觀察應試者寫c**時,以下一些技巧會對你有幫助:

事先向應試者說明,你完全理解,沒有乙個好的編輯器光在紙上寫**是困難的,所以你不在乎他們手寫的**是否看上去不整潔。你也完全明白沒有好的編譯器和偵錯程式,很難第一次就寫出完全沒有bug的程式,所以請他們不必為此擔心。

好程式設計師的標誌:好程式設計師寫完「」符號,然後再在當中填上**。他們也傾向於使用命名規則,雖然這個規則可能很原始。如果乙個變數用作迴圈語句的索引,好程式設計師通常使用盡可能少的字元為它命名。如果他們的迴圈語句的索引變數的名字是currentpagepositionloopcounter,顯而易見他們寫**的經驗還不夠多。偶爾,你會看到乙個c程式設計師寫下象if (0==strlen(x))一樣的**,常量被放在==的左邊。這是非常好的現象。這說明他因為總是把=和==搞混,已經強迫自己養成這種習慣以避免犯錯。

好的程式設計師在寫**前會訂乙個計畫,特別是當他們的**用到了指標時。例如,如果你要求逆序乙個鍊錶,好程式設計師通常會在紙的一邊畫上鍊表的草圖,並表明演算法中的索引指標當前移動到的位置。他們不得不這樣做。正常人是不可能不借助草圖就開始寫乙個逆序鍊錶的程式的。差的程式設計師立刻開始寫**。

不可避免的,你會在他們的程式中發現bug,於是我們現在來到了第五個問題:你對**滿意嗎? 你可能想問,「好吧,bug在**?」這是來自地獄的一針見血的問題,要回答這個問題可要大費口舌。所有的程式設計師都會犯錯誤,這不是問題。但他們必須能找到錯誤。對於字串操作的函式,他們通常會忘記在輸出緩衝區加上字串結束符。所有的函式,他們都會犯off-by-one錯誤(譯者按:指的是某個變數的最大值和最小值可能會和正常值差1)。他們會忘掉正常的c語句結尾的分號。如果輸入是零長度字串,他們的函式會執行錯誤。如果malloc呼叫失敗而他們沒有為此寫好錯誤處理**,程式會崩潰。一次就能把所有事情做對的程式設計師非常,非常,非常地少.不過要是真的碰上乙個的話, 提問就更有意思了. 你說,"還有bug"。他們會再仔細地檢查一遍**。這個時候, 觀察一下他們內心是否開始動搖了, 只是表面上勉強堅持說**沒有問題。總之,在程式設計師寫完**後,問一下他們是否對**滿意是個好主意。就像regis那樣問他們!(譯者按,regis philbin是美國abc電視網的遊戲電視節目主持人,他的口頭禪是「這是你的最後的答案嗎?」)

第六部分:關於設計的問題。讓應試者設計某樣東西。jabe blumenthal,excel的原始設計者,喜歡讓應試者設計房子。jabe說,曾經有乙個應試者跑到白板前,畫了乙個方塊,這就是他的全部設計。天哪,乙個方塊!立刻拒絕這樣的傢伙。你喜歡問什麼樣的設計問題?

嵌入式面試

的別人,還不錯 預處理器 preprocessor 1.用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 我在這想看到幾件事情 1 define 語法的基本知識 例如 不能以分號結束,括號的使用,等等 2 懂得預處理器將為你計算常數表示式的值,因此,直接寫出你是如何計算...

嵌入式除錯技術

嵌入式除錯方法 1.模擬器。比如qtopia core可以用奇趣提供的frame buffer模擬工具qvfb,arm硬體模擬可以用skyeye開源專案。2.遠端除錯。偵錯程式還在pc上,偵錯程式與被除錯的程式通過網路通訊。3.通過log和core dump等檔案事後分析。stdprm標準印表機lp...

關於嵌入式分享技術

出來工作快1年了,在這裡分享一下我這些時間的工作感想吧 往後會分享技術 我們公司是做智慧型家居的,提供方案,提供工程,提供維護,就是典型的三包公司啦!我在裡面負責的是客戶端的開發,主要是ios平台 我是電子資訊工程系的,剛開始接觸寫應用的時候,總是把我自己的需求當作是客戶的需求,走了不少彎路,後來有...