程序員,去面試

程序員,去面試
圖片取自頻道“好戰紫水晶»

我作為 Linux 系統程式設計師工作了大約 10 年。 這些是核心模組(核心空間)、各種守護進程以及與用戶空間(用戶空間)中的硬體一起工作、各種引導程式(u-boot 等)、控制器韌體等等。 甚至有時會碰巧切斷網頁介面。 但更常見的情況是,我必須坐在烙鐵旁與印刷電路板設計師互動。 這類工作的問題之一是評估你的能力水平相當困難,因為你可能對一項任務非常了解,但你可能對另一項任務根本不了解。 要了解該去哪裡以及現在的潮流,唯一充分的方法就是去採訪。

在這篇文章中我想總結一下我面試Linux系統程式設計師職位的經歷,面試的具體情況,工作,以及如何透過與未來雇主的溝通來評估你的個人知識水平以及你不應該做的事情從中期待。

本文將包括一個有獎品的小型競賽。

這個職業的特點

在我工作的特定領域,系統程式設計師是一個完全的多面手:我必須既編寫程式碼又調試硬體。 通常需要自己焊接一些東西。 有時,我對硬體的調整會轉移給開發人員。 因此,要在這一領域工作,您需要在數位電路和程式設計領域擁有相當好的知識基礎。 因此,系統程式設計師職位的面試通常看起來像是尋找電子專家。

程序員,去面試
系統程式設計師的典型工作站。

上圖是我調試驅動程式時的典型工作場所。 邏輯分析儀顯示傳輸訊息的正確性,示波器會監視訊號邊緣的形狀。 此外,jtag 偵錯器未包含在框架中,當標準偵錯工具不再適用時,將使用該偵錯器。 您需要能夠使用所有這些設備。

通常情況下,自己重新焊接某些元件並糾正拓撲錯誤比將產品交給安裝人員更快更容易。 然後焊台也會出現在您的工作場所。

驅動和硬體層面開發的另一個特點是Google不幫忙。 通常,您必須查找有關您的問題的信息,並且有三個鏈接,其中兩個是您自己在某個論壇上提出的問題。 或者更糟的是,當您遇到 5 年前在內核郵件列表上提出的同一個可憐人提出的問題但從未收到答案時。 在這項工作中,除了硬體和軟體設計上的錯誤之外,還經常遇到文件錯誤——這些可能是最嚴重和最令人不快的問題。 有時寄存器的描述不正確,或者根本沒有對它們的描述。 此類問題只能透過科學地將隨機數放入某些暫存器(一種逆向)來解決。 經常會發生這樣的情況:處理器包含某些功能,但除了您之外沒有人實現此功能(特別是如果處理器是新的)。 這意味著要帶著耙子走過田地,其中 70% 是為兒童準備的。 但當有文檔時,即使有錯誤,這也已經是進步了。 很多時候,根本沒有任何文件,就是當鐵在燃燒時開始穿越雷區。 是的,我也成功解決了這類問題。

訪談

我的觀點是,即使您熱愛自己的工作並且不想改變它,您也應該至少每六個月去面試一次。 面試可以讓您了解您作為專家的程度。 我相信最有價值的面試就是那些失敗的面試。 他們是最準確地表明您的知識瓶頸需要改進的人。

另一個有趣的特點是採訪的品質。 這是我的觀察,並不真實,我承認我只是運氣好。 如果面試按照場景進行:

  • 向我們介紹你自己;
  • 我們有這樣的任務;
  • 你喜歡?

如果在這次對話之後你們彼此喜歡,然後去工作,那麼通常,公司和任務都會變得非常愉快和充足。 如果面試就像經歷十二圈地獄:第一次面試HR,然後面試一群程式設計師,然後面試主管,更多的作業等等,那麼通常這些都是失敗的組織,我沒有在其中工作過很長一段時間。 再次強調,這只是個人觀察,但一般來說,過多的官僚主義和冗長的招募流程表明,公司內部也發生著同樣的流程。 決策緩慢且低效。 也有相反的情況,當面試地獄一圈圈的時候,公司卻是偉大的,而當一巴掌打過去之後,公司卻變成了一片沼澤,但這些都是罕見的。

如果您認為這樣的場景:見面、介紹自己並被錄用,只存在於小公司中,那麼不存在。 我在擁有數百名員工並在全球市場上佔有一席之地的大型公司中看到了這一點。 這是一種正常機制,特別是如果您擁有豐富的業績記錄並且有機會致電您以前的雇主並詢問您的情況。

對我來說,當一家公司要求展示其專案和程式碼的範例時,這是一個很好的指標。 申請人的訓練等級立即顯示。 而且,對我來說,從選拔候選人的角度來看,這是比秀面試最有效的選拔方法。 事實上,你可能會因為興奮而在面試中失敗,或者相反,因為腎上腺素的增加而失敗。 但在實際工作中,你無法應付真正的任務。 我自己採訪人的時候也遇過這種情況。 一位專家來了,表現出自己很優秀,我喜歡他,他也喜歡我們。 我在一個最簡單的問題上苦苦掙扎了一個月,結果另一位程式設計師在幾天內就解決了它。 我不得不和那個程式設計師分手。

我特別看重面試中的程式設計任務。 還有那些必須在會議期間、在壓力下和做作業時解決的問題。 第一個顯示您是否準備好在壓力情況和緊急情況下快速且準確地解決問題。 第二個顯示您的能力水平以及搜尋資訊和解決當前問題的能力。

我最有趣的工作是在我國的國防綜合體。 在工作過程中,我必須解決商業程式設計師從未夢想過的奇妙問題。 超級電腦、設計路由器、各種節點戰鬥系統——這非常令人興奮。 當您在遊行期間看到一個儲存您的程式碼的綜合體時,這真的很棒。 奇怪的是,這類公司的面試通常都很簡單,字面上來,喜歡,接受(可能是軍方的具體情況,他們不喜歡說太多),都是疊加的。 我在那裡面臨的挑戰確實有趣且具有挑戰性。 事實證明,隨著經驗的積累,他們非常適合學習成為高素質的系統程式設計師。 缺點也有,這還不算低薪。 目前,國防綜合體的薪資相當不錯,還有獎金和福利。 一般來說,官僚作風很多,工作時間長,工作無休無止,工作壓力很大。 在某些情況下,不能排除保密性,這給出國旅行增加了一定的問題。 當然,還有老闆的暴政,唉,這種情況也會發生。 儘管我與客戶代表一起工作的經驗非常愉快。 這是三個不同的國防訂單相關研究機構和企業的集體印象。

面試任務

為了避免誤解,也為了不暴露我採訪過的公司,我不會冒險透露他們的細節。 但我很感激每一次採訪,感謝人們花在我身上的時間,感謝有機會從外部審視自己。 我只能說,這些任務是針對在不同國家設有代表處的大型國際公司的。

我會告訴你最有趣的事:面試時會給哪些任務。 一般來說,系統程式設計師和微控制器程式設計師的空缺最常見的問題是位元操作,以及所有可能的變化。 因此,請在這方面做好充分準備。

第二個最兩極化的話題是路標,這真的應該會讓你大吃一驚。 這樣他們就會在半夜叫醒你,你就可以講述並展示一切。

我從一些採訪中偷來的問題在我的腦海裡,我將在這裡呈現它們,因為我發現它們很有趣。 我故意不給出這些問題的答案,是為了讀者可以在評論中自己回答這些問題,並在真正的採訪時有一點粉。

問題 1

一、SI知識。 以下條目的含義是什麼:

const char * str;

char const * str;

const * char str;

char * const str;

const char const * str;

所有條目都正確嗎?

二. 為什麼這個程式會拋出分段錯誤?

int main ()
{
       fprintf(0,"hellon");
       fork();
       return(0);
}

三. 變聰明。

有一根一公尺長的棍子。 十隻螞蟻隨機落在她身上,朝著不同的方向爬行。 一隻螞蟻的移動速度是1m/s。 如果一隻螞蟻遇到另一隻螞蟻,它會轉身朝相反的方向爬行。 等待所有螞蟻從棍子上掉下來最多需要多長時間?

接下來的面試對我來說是失敗的,但我認為它對我的程式設計實踐來說是最有用的。 這顯示了我的無能之深。 在這次訪談之前,我對這些問題都很熟悉,在我的實踐中也經常出現,但不知何故我對它們不太重視,因此我對它們的理解也不是很好。 因此,我這次考試恥辱地失敗了。 我很慶幸發生了這樣的失敗;它給我帶來了最清醒的影響。 您認為自己是一位很酷的專家,您了解電路設計、介面以及使用內核。 然後你有了真正的問題,你就浮起來。 那麼讓我們來看看。

面試問題#2

硬體問題。

  • Linux 系統呼叫如何在 x86 的 ARM 處理器上以組合語言排列。 有什麼不同?
  • 有哪些同步工具? 哪些同步工具可以在中斷上下文中使用,哪些不能,為什麼?
  • i2c匯流排和spi匯流排有什麼差別?
  • 為什麼 i2c 總線上有終結器以及它們的值是什麼?
  • RS-232 介面只能在兩條線上工作:RX 和 TX 嗎? 這裡我給答案:結果是不好,在9600,但可以!!!
  • 現在第二個問題:為什麼?
  • 在多層板上佈置訊號線和電源的最佳方法是什麼?為什麼? 層內有電源,還是層內有訊號線? (問題通常純粹是關於電路設計)。
  • 為什麼差分線的走線到處都在一起?
  • RS-485 匯流排。 通常這樣的線上有終止符。 然而,我們有一個星形電路,具有數量可變的插件模組。 應採取哪些措施避免碰撞和乾擾?
  • 什麼是紅樹和二元樹?
  • 如何使用cmake?
  • 有關構建 yocto Linux 的問題。

本次訪談的目的:

1. 寫一個反轉函數 uint32_t 所有的位。 (在面試中使用bits很受歡迎,我推薦它)
2.

int32_t a = -200;
uint32_t b = 200;
return *(uint32_t) * (&a)) > b;

這個函數會回傳什麼? (紙上解決方案,無需計算機)

3.計算兩個數的算術平均值的函數 int32_t.

4. 程式中的輸出方式有哪些,包括? 變成錯誤流。

第三個選擇是最近的,如果還有這樣的問卷,我不會感到驚訝,所以我不會透露公司,以免暴露他們......但總的來說我會舉一個例子可能的問題,如果您認識到您的問題,那麼我會問好:)。

面試問題#3

  1. 給了一個樹遍歷程式碼的例子;需要說明這段程式碼做了什麼,並指出錯誤。
  2. 編寫 ls 實用程式的範例。 使用最簡單的選項“-l”。
  3. 舉例說明如何進行靜態和動態連結。 有什麼不同?
  4. RS-232 是如何運作的? RS-485 和 RS-232 有什麼不同? 從程式設計師的角度來看,RS-232 和 RS-485 有什麼不同?
  5. USB 是如何運作的(從程式設計師的角度來看)?
  6. 將技術文本從俄文翻譯成英文。

面試成功不能保證工作成功

本章甚至可能不適合程式設計師(儘管也適合他們),而更適合 HR。 最有能力的公司不會仔細查看面試結果。 犯錯是很正常的;大多數情況下,他們會檢視一個人如何知道如何解決問題和推理。

其中一個關鍵問題是,候選人在面試中成功解決了問題,表現出自己是優秀的專家,但在第一個真正的任務中卻失敗了。 我不會說謊,這也發生在我身上。 我成功地走過了所有的地獄,解決了所有的測試任務,但在實際情況下,由於缺乏經驗,這項工作太艱難了。 上船並不是最困難的任務。 最困難的是留在這家公司。

因此,我相信更多的公司會對候選人進行簡單的面試並說:工作第一個月後,你是否適合我們就很清楚了。 這是最合適的方法,是的,也許有點貴,但可以立即清楚誰是誰。

面試還有另一個選擇:當你成功通過面試時,但根據面試結果,你了解到雇主完全不合格。 如果有人向我承諾以個別企業家的身份提供高收入,我會立即拒絕。 這是營運組織逃稅的一種形式,雇主的問題為什麼要讓我這個程式設計師擔心呢? 另一個選擇是各種政府機構。 我去面試了,結果給了我不錯的薪水,但是他們說以前的程式設計師辭職了,生病了,死了,因為工作量大而暴飲暴食,而你的工作日是早上8點開始。 從這樣的地方他也跑得鞋跟閃閃發光。 是的,人力資源部,請注意​​,如果工作日必須一大早開始,程式設計師就準備好拒絕即使是最美味的工作。

最後我會給出一個優秀的程式設計師選拔視頻,本文開頭給出了該視頻的截圖。 我也不只一次接受過這樣的訪問。 如果你在提問階段看到暴政,那麼尊重自己,起身,拿走你的東西然後離開——這很正常。 如果HR和經理在面試時以你為代價來維護自己的利益,這表明這家公司有毒,你不應該在那裡工作,除非你喜歡不合格的老闆。

發現

程式設計師們,去面試吧! 並且始終努力升職。 假設你拿到了N塊,那麼去面試至少要N*1,2,或者更好的是N*1,5。 即使您不立即接受這個職缺,您也會了解這個等級的薪資需要什麼。
我的觀察表明,良好的英語知識、足夠豐富的行業經驗和自信決定。 後者是主要品質,生活中隨處可見。 一般來說,一個更有自信的候選人在面試中可以比一個優秀但更害羞和積極主動的候選人表現得更好,即使犯了更多的錯誤。 祝你面試順利!

P/S 競賽

如果您有 HR 給您帶來的有趣問題範例,歡迎在評論中留言。 我們準備了一場小型競賽- 條件很簡單:你寫下你在採訪中遇到的最不尋常的任務,讀者對其進行評估(加號),一周後我們總結結果並用有趣的好東西獎勵獲勝者。

程序員,去面試

程序員,去面試

來源: www.habr.com

添加評論