如何"有計劃,高效率,優簡歷"應對面試

zgxxx發表於2019-04-12

前言

前一篇文章講述了我在三月份毫無準備就去面試的後果,一開始心態真的爆炸,但是又不服氣,一想到每次回來後家人朋友問我面試結果的期待臉,越覺得必須付出的行動來證明自己了。

面經傳送門:一個1年工作經驗的PHP程式設計師是如何被面試官虐的?

下面是我花費兩個星期做的準備,主要分三部分:

  • 有計劃——計劃好每天要複習的知識模組(內容較多)

  • 高效率——從整體到細節,著重把知識點“手寫”到自己的電腦記錄本

  • 優簡歷——展示你的專案亮點,難點

下面的文章和網站連結我都會註明出處,如果有問題請聯絡我,我會及時修改或撤銷

有計劃

反思:為什麼好多知識看過後不能記住,面試一緊張更加想不起?一方面自己沒有深入學習,另一方面複習過程雜亂,和寫程式碼一個道理,如果你的業務邏輯和其他亂七八糟的都放在控制器上,程式碼一多你要呼叫某個方法可能就會讓你抓狂,所以一般採取controller和server分層,同理,我們最好提前做好計劃,分種類,分層次來學習。

複習前如果很迷茫,可以網上Google一下面試知識點,看到的無非都是作業系統,計算機網路,資料結構,mysql,設計模式,Linux,Redis,再者根據你所學語言方面的知識和簡歷,例如我求職PHP,簡歷上有寫Larvel框架,那就再加PHP基礎,框架Laravel,伺服器nginx。

第一天:作業系統

如果你是科班出身,那應該對作業系統不陌生,至少在高校裡面是學過這門課程的。但估計很多人像我一樣,後悔沒去好好學這門課,或者工作上用不上就拋棄它了(PHP更是如此),我要說的是作業系統很重要,就以我面試了幾家公司來說,基本如果你答出作業系統相關知識點基本都是加分的。

  1. 程式和執行緒的概念,以及兩者的區別

  2. 什麼是上下文切換

  3. 多程式和多執行緒各自的優勢(可以Google一下有關php-fpm和nginx程式)

  4. 程式通訊方式

  5. 程式基本狀態

  6. 搶佔式排程和非搶佔式排程

  7. 程式執行緒同步,死鎖

  8. 理解協程

附加幫助我整理這些知識的網站和部落格文章:

小土刀的面試刷題筆記——作業系統

併發技術·筆試面試知識整理

這裡推薦有精力的朋友可以看下《Linux高效能伺服器程式設計》,粗略看下8,9,10,13,14章,以及《深入理解計算機系統》的第1章和第12章,我就是結合這兩本書,記住並理解簡單的知識點,後續我還要花時間去深入閱讀。

第二天:計算機網路

計算機網路可以說是大多數程式設計師需要學習的大課程,特別是PHPer這些web打交道的程式設計師。當然,計算機網路太底層的東西很枯燥很難懂,我只針對一些比較常見,比較基礎的知識面來學習。

  1. 計算機網路體系包括TCP/IP體系結構,五層協議體系結構

  2. TCP,UDP

  3. 三次握手,四次揮手(過程要熟悉,能清晰描述)

  4. TCP協議如何保證可靠傳輸(包括重傳,流量控制,擁塞控制,定時器等知識點要了解)

附加幫助我整理這些知識的網站和部落格文章:

小土刀的面試刷題筆記——網路

TCP協議·筆試面試知識整理

複習完這些基礎的知識後,試著要去了解稍微底層一點的東西,因為很多面試官喜歡由淺入深地問,如果能答出一兩點基本都是加分的

推薦一篇很好的文章,仔細讀完會有很大的收穫:

TCP 的那些事兒(上)

第三天:資料結構

很多人在大學裡面都學過這門課程,也是很多程式設計師的啟蒙課程,自然很重要,(大學唯一一次掛科就是它了。。。)

從事PHP工作的朋友應該都用不上它,所以這也是一個很容易被忽視的基礎知識點,自然有很多大公司面試的時候很注重這方面的基礎,特別是應屆畢業生。我複習這方面的知識是重新翻開我大學的課本,把其中比較重要的東西手寫幾遍。

我不久前面試過一家要我手寫連結串列,結果早就忘了,沒寫出來

  1. 佇列,迴圈佇列,棧,單連結串列等,要理解,最好多手寫幾遍

  2. 樹和圖,著重複習二叉樹方面的知識,例如前中後遍歷;B樹,B+樹,紅黑樹最好要了解一下

  3. 排序演算法,氣泡排序必須很熟悉,其他幾種常見的演算法:簡單選擇排序,直接插入排序,快速排序也要知道

氣泡排序可以瞭解下如何最佳化改進,有些面試官會問,如果答不出他會提示你怎麼做,考察你的思考能力

關於資料結構的參考資料基本Google一下就有很多(順便說下,21世紀程式設計師還是少用某度),大學的課程書是最好的,一般大學的資料結構都是面向學生的,還是很基礎,很好理解的。

第四天:資料庫mysql

說實話,我覺得絕大多數程式設計師都是在CURD,學那麼多東西很大方面也是為了輔助最後的curd。所以資料庫知識的重要性毋庸置疑,後面我打算買本《高效能MySQL》來提升自己這方面的能力。

  1. 基礎的增刪改查操作

  2. 儲存引擎MyISAM和InnoDB

  3. 理解索引資料結構,即B+樹方面的知識 參考:InnoDB索引實現·MySQL索引背後的資料結構及演算法原理·看雲

  4. mysql語句最佳化,著重索引最佳化,explain檢視索引情況 參考:Mysql索引最佳化

  5. 事務四大特性

  6. 隔離級別

  7. 髒讀,不可重複讀,幻讀

  8. 瞭解共享鎖,排他鎖,死鎖

  9. 瞭解主從複製原理,分庫分表

第五天:nginx和PHP-fpm

nginx和php-fpm應該算是PHP程式設計師接觸比較多,但是可能沒有去深入瞭解過,有些面試官喜歡結合nginx,php-fpm和作業系統程式方面的知識來考察。

  1. 日常用到的nginx配置語法,常用的變數

  2. nginx常見的引數最佳化 參考:Nginx高併發下的最佳化

  3. nginx負載均衡,訪問控制,防盜鏈,設定靜態檔案過期時間等

  4. php-fpm工作流程

  5. php-fpm程式管理(靜態和動態)

可以Google瞭解下php-fpm和nginx各自的程式管理模式,參考文章:Nginx內部有使用多執行緒嗎?

面試過程可能會問到網站負載低,訪問慢怎麼排查,參考:論壇偶爾出現負載低但是訪問很慢排查思路

第六天:redis

工作專案不大,用到redis的地方並不多,所以一直也沒去學習redis,但是從面試情況看來,被問到redis的機率還是很大的,畢竟這款基於記憶體的資料庫功能強大,市場佔用率很高。

  1. 與memcached的區別

  2. 5種基本的資料結構以及各自的使用場景,最好能結合自己專案來描述

  3. 持久化,RDB和AOF 參考: 面試中經常被問到的 Redis 持久化與恢復

  4. 如何與mysql保持資料一致 參考:Redis和mysql資料怎麼保持資料一致的?

第七天:Laravel

由於我自己是一直用Laravel框架開發的,簡歷裡面的專案也多處標明Larvel,所以這裡就介紹Larvel相關的知識,你對哪個框架熟悉就去做相應的複習,基本Google和手冊都有。

  1. Laravel生命週期

  2. 什麼是服務容器,服務提供器,Facade門面

  3. 依賴注入

  4. 中介軟體,異常處理,ORM等手冊上的知識

第八天:設計模式

看一個人的程式碼水平,可以從是否靈活使用設計模式看出來的。寫程式碼也是一門藝術,好的程式碼低耦合,易擴充套件,設計模式的理解和使用也決定了你的程式碼水平。這裡推薦一本《大話設計模式》,目前我只看了一點點,對於我這樣的菜鳥覺得還不錯,後面需抽點時間好好看看。

  1. 六大原則,著重理解,最好能清晰口述

  2. 結合你的專案經驗描述幾個設計模式。常見的有單例,三大工廠,觀察者,策略等

有一次面試官問我簡單工廠模式是不是符合六大原則之一開閉原則?我答不出來,隨便選了個符合。。。實際簡單工廠是不符合開閉原則的,這就涉及到你開閉原則的理解。

第九天:PHP核心基礎知識

真正要讀懂PHP核心的人應該很少,大多數人都沒時間和精力去研究底層,畢竟PHP一直以開發效率高著稱,只要底層有人寫好給廣大程式設計師用就好了。確實是這樣,但是我記得有個面試過我的大佬跟我說,很多東西不要只會用,要多想想為什麼可以這樣用,PHP語言我覺得也是一樣,雖然現在能力有限,但我可以提前把一些比較基礎,容易理解的底層知識學習一下,這不也是一種自我提升?面試的時候你也可以拿出來炫一下,說錯也沒關係,至少你展示出你的好學,你的認知層面。

  1. PHP的生命週期和zend引擎

  2. 變數儲存結構

  3. 寫時複製和引用

參考文章:

深入理解PHP核心

PHP核心剖析

第十天:根據你的簡歷內容做複習

面試都是拿著你的簡歷來問問題的,你的簡歷內容會直接影響面試內容的走向,所以簡歷寫完還要做響應的複習。

我的簡歷有涉及rabbitMQ,elasticsearch等知識,我就對其進行簡單的複習。

另外很重要的一點:提前想好怎麼描述你做過的專案,其中遇到什麼問題,怎麼解決,儘量把你好的一面展示出來,這些都可以提前寫下了的,好記性不如爛筆頭,下面第二部分會說到。

高效率

複習的內容實在是太多了,單單寫上一部分內容都快把我的鍵盤打爛,手寫斷了。雖然有了十全的計劃,但如何高效率去記住上面那麼多東西是一個大問題,看看我是怎麼做的。

  • 例如第一天覆習作業系統的知識,我是早上Google了一下有關作業系統的面試知識點,然後開啟幾個標籤頁,選取內容比較齊全的。所謂“好記性不如爛筆頭”,沒有爛筆頭,只有爛鍵盤,所以我選擇把這些知識點一一整理到自己的電腦上,自己平時有寫部落格,用markdown比較多(推薦Typora),所以每天就用一個md檔案把知識整理下來,基本都是手打的,很少複製黏貼。這樣做,一方面讓自己印象深刻,另一方面鍛鍊自己摘取核心內容,描述能力,這也是我能寫下這麼多內容的原因。

  • 每天晚上計劃好明天的複習內容,可以選擇睡前回顧今天學習的知識,也可以在第二天早上回顧一遍

  • 最好選擇一個安靜的地方,能讓你認真學習的環境,我由於提交了離職申請需要一個月才能走,交接專案也很快,所以每天都在公司有計劃的複習(遠離手機)

總之,真想要離職,找一份好工作,必須對自己狠一點,找到心儀的工作再好好去放鬆幾天。其實有不少人一直在埋怨大環境不好,確實是,但有何用,想為自己菜,自己不努力找一個藉口?王小波說的好:人的一切痛苦,本質上都是對自己無能的憤怒。當然運氣也很重要,保持樂觀,別輕易放棄。

優簡歷

簡歷不用多說,就是很重要,怎麼寫?其實我也是參考一篇文章的:我本以為你們會寫簡歷

概括一下:

  1. 基本的,用PDF格式,個人資訊寫完整,別寫精通

  2. 技能亮點,圍繞 熟悉 , 有所 , 掌握 , 瞭解 , 有一定心得

    不要這樣:

    熟悉PHP , 熟悉YiiLavarel框架 ( 複製貼上 , CURD , 就是幹! ) 熟悉Linux使用 , 可以搭建XXXX環境 ( 會敲cd , ls命令 , 會apt install nginx ) 熟悉git或svn版本管理的使用 ( 會git push , 會git pull ) 熟悉MySQL以及對資料庫的最佳化 ( 會select update 和 delete , 會新增索引 ) 熟悉Redis或Memcache的使用 ( 會set key , 會get key )

    最好這樣:

    PHP : 熟悉PHP語法 , 熟悉PHP物件導向 , 可以根據業務邏輯結合合適的設計模式 . 熟悉PHP SPL標準庫 , 對PHP的一些高階用法有所心得體驗 , 諸如pcntl多程式模組 , socket模組 . 對SWOOLE所有涉獵 , 有一些自己的積累和經驗 . 對於底層 , ZendVM如何如何 。 Redis : 熟悉Redis常用資料結構的使用 , 可結合業務場景選擇合適的資料結構 . 熟悉Redis叢集 , 對叢集實現方案原理有一定掌握 , 對於市面常用的集中叢集方案的優缺點比較瞭解 . 對於底層 , 對Redis SET等底層資料結構的實現有所掌握。

  3. 一定要寫專案亮點和難點

    大多數人都是這麼寫的 : 負責使用者登入註冊模組 , 後臺管理 , 多角色許可權控制 , 負責廣告業務模組的管理和篩查(太普通,太泛了)

  • 亮點:你覺得這個專案中哪一部分值得自豪或學到新東西了 . 比如專案中用到ECDH , 使用了MySQL中介軟體等等。

  • 難點:你覺得這個專案哪一部分當時難了你幾天 , 然後你透過自己努力解決了以及解決方案是什麼。

總結

面試並不簡單,不要太輕敵,做好準備,打好基礎是關鍵。毫無準備就去投簡歷面試大多是浪費時間,甚至浪費進入好公司的機會。還是那句話程式設計師應該腳踏實地,不要眼高手低,用實際行動證明自己。

我是即將入職廣州一家遊戲公司PHP開發崗位的程式設計師,2018年畢業,畢業到現在確實收穫了不少,也讓我看清自己,需要惡補的知識還有很多很多。歡迎大家關注我的個人部落格https://zgxxx.github.io/,比較簡陋,還是希望能和萬千大神交流技術問題,一起成長!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章