前言
前一篇文章講述了我在三月份毫無準備就去面試的後果,一開始心態真的爆炸,但是又不服氣,一想到每次回來後家人朋友問我面試結果的期待臉,越覺得必須付出的行動來證明自己了。
下面是我花費兩個星期做的準備,主要分三部分:
-
有計劃——計劃好每天要複習的知識模組(內容較多)
-
高效率——從整體到細節,著重把知識點“手寫”到自己的電腦記錄本
-
優簡歷——展示你的專案亮點,難點
下面的文章和網站連結我都會註明出處,如果有問題請聯絡我,我會及時修改或撤銷
有計劃
反思:為什麼好多知識看過後不能記住,面試一緊張更加想不起?一方面自己沒有深入學習,另一方面複習過程雜亂,和寫程式碼一個道理,如果你的業務邏輯和其他亂七八糟的都放在控制器上,程式碼一多你要呼叫某個方法可能就會讓你抓狂,所以一般採取controller和server分層,同理,我們最好提前做好計劃,分種類,分層次來學習。
複習前如果很迷茫,可以網上Google一下面試知識點,看到的無非都是作業系統,計算機網路,資料結構,mysql,設計模式,Linux,Redis,再者根據你所學語言方面的知識和簡歷,例如我求職PHP,簡歷上有寫Larvel框架,那就再加PHP基礎,框架Laravel,伺服器nginx。
第一天:作業系統
如果你是科班出身,那應該對作業系統不陌生,至少在高校裡面是學過這門課程的。但估計很多人像我一樣,後悔沒去好好學這門課,或者工作上用不上就拋棄它了(PHP更是如此),我要說的是作業系統很重要,就以我面試了幾家公司來說,基本如果你答出作業系統相關知識點基本都是加分的。
-
程式和執行緒的概念,以及兩者的區別
-
什麼是上下文切換
-
多程式和多執行緒各自的優勢(可以Google一下有關php-fpm和nginx程式)
-
程式通訊方式
-
程式基本狀態
-
搶佔式排程和非搶佔式排程
-
程式執行緒同步,死鎖
-
理解協程
附加幫助我整理這些知識的網站和部落格文章:
這裡推薦有精力的朋友可以看下《Linux高效能伺服器程式設計》,粗略看下8,9,10,13,14章,以及《深入理解計算機系統》的第1章和第12章,我就是結合這兩本書,記住並理解簡單的知識點,後續我還要花時間去深入閱讀。
第二天:計算機網路
計算機網路可以說是大多數程式設計師需要學習的大課程,特別是PHPer這些web打交道的程式設計師。當然,計算機網路太底層的東西很枯燥很難懂,我只針對一些比較常見,比較基礎的知識面來學習。
-
計算機網路體系包括TCP/IP體系結構,五層協議體系結構
-
TCP,UDP
-
三次握手,四次揮手(過程要熟悉,能清晰描述)
-
TCP協議如何保證可靠傳輸(包括重傳,流量控制,擁塞控制,定時器等知識點要了解)
附加幫助我整理這些知識的網站和部落格文章:
複習完這些基礎的知識後,試著要去了解稍微底層一點的東西,因為很多面試官喜歡由淺入深地問,如果能答出一兩點基本都是加分的
推薦一篇很好的文章,仔細讀完會有很大的收穫:
第三天:資料結構
很多人在大學裡面都學過這門課程,也是很多程式設計師的啟蒙課程,自然很重要,(大學唯一一次掛科就是它了。。。)
從事PHP工作的朋友應該都用不上它,所以這也是一個很容易被忽視的基礎知識點,自然有很多大公司面試的時候很注重這方面的基礎,特別是應屆畢業生。我複習這方面的知識是重新翻開我大學的課本,把其中比較重要的東西手寫幾遍。
我不久前面試過一家要我手寫連結串列,結果早就忘了,沒寫出來
-
佇列,迴圈佇列,棧,單連結串列等,要理解,最好多手寫幾遍
-
樹和圖,著重複習二叉樹方面的知識,例如前中後遍歷;B樹,B+樹,紅黑樹最好要了解一下
-
排序演算法,氣泡排序必須很熟悉,其他幾種常見的演算法:簡單選擇排序,直接插入排序,快速排序也要知道
氣泡排序可以瞭解下如何最佳化改進,有些面試官會問,如果答不出他會提示你怎麼做,考察你的思考能力
關於資料結構的參考資料基本Google一下就有很多(順便說下,21世紀程式設計師還是少用某度),大學的課程書是最好的,一般大學的資料結構都是面向學生的,還是很基礎,很好理解的。
第四天:資料庫mysql
說實話,我覺得絕大多數程式設計師都是在CURD,學那麼多東西很大方面也是為了輔助最後的curd。所以資料庫知識的重要性毋庸置疑,後面我打算買本《高效能MySQL》來提升自己這方面的能力。
-
基礎的增刪改查操作
-
儲存引擎MyISAM和InnoDB
-
理解索引資料結構,即B+樹方面的知識 參考:InnoDB索引實現·MySQL索引背後的資料結構及演算法原理·看雲
-
mysql語句最佳化,著重索引最佳化,explain檢視索引情況 參考:Mysql索引最佳化
-
事務四大特性
-
隔離級別
-
髒讀,不可重複讀,幻讀
-
瞭解共享鎖,排他鎖,死鎖
-
瞭解主從複製原理,分庫分表
第五天:nginx和PHP-fpm
nginx和php-fpm應該算是PHP程式設計師接觸比較多,但是可能沒有去深入瞭解過,有些面試官喜歡結合nginx,php-fpm和作業系統程式方面的知識來考察。
-
日常用到的nginx配置語法,常用的變數
-
nginx常見的引數最佳化 參考:Nginx高併發下的最佳化
-
nginx負載均衡,訪問控制,防盜鏈,設定靜態檔案過期時間等
-
php-fpm工作流程
-
php-fpm程式管理(靜態和動態)
可以Google瞭解下php-fpm和nginx各自的程式管理模式,參考文章:Nginx內部有使用多執行緒嗎?
面試過程可能會問到網站負載低,訪問慢怎麼排查,參考:論壇偶爾出現負載低但是訪問很慢排查思路
第六天:redis
工作專案不大,用到redis的地方並不多,所以一直也沒去學習redis,但是從面試情況看來,被問到redis的機率還是很大的,畢竟這款基於記憶體的資料庫功能強大,市場佔用率很高。
-
與memcached的區別
-
5種基本的資料結構以及各自的使用場景,最好能結合自己專案來描述
-
持久化,RDB和AOF 參考: 面試中經常被問到的 Redis 持久化與恢復
-
如何與mysql保持資料一致 參考:Redis和mysql資料怎麼保持資料一致的?
第七天:Laravel
由於我自己是一直用Laravel框架開發的,簡歷裡面的專案也多處標明Larvel,所以這裡就介紹Larvel相關的知識,你對哪個框架熟悉就去做相應的複習,基本Google和手冊都有。
-
Laravel生命週期
-
什麼是服務容器,服務提供器,Facade門面
-
依賴注入
-
中介軟體,異常處理,ORM等手冊上的知識
第八天:設計模式
看一個人的程式碼水平,可以從是否靈活使用設計模式看出來的。寫程式碼也是一門藝術,好的程式碼低耦合,易擴充套件,設計模式的理解和使用也決定了你的程式碼水平。這裡推薦一本《大話設計模式》,目前我只看了一點點,對於我這樣的菜鳥覺得還不錯,後面需抽點時間好好看看。
-
六大原則,著重理解,最好能清晰口述
-
結合你的專案經驗描述幾個設計模式。常見的有單例,三大工廠,觀察者,策略等
有一次面試官問我簡單工廠模式是不是符合六大原則之一開閉原則?我答不出來,隨便選了個符合。。。實際簡單工廠是不符合開閉原則的,這就涉及到你開閉原則的理解。
第九天:PHP核心基礎知識
真正要讀懂PHP核心的人應該很少,大多數人都沒時間和精力去研究底層,畢竟PHP一直以開發效率高著稱,只要底層有人寫好給廣大程式設計師用就好了。確實是這樣,但是我記得有個面試過我的大佬跟我說,很多東西不要只會用,要多想想為什麼可以這樣用,PHP語言我覺得也是一樣,雖然現在能力有限,但我可以提前把一些比較基礎,容易理解的底層知識學習一下,這不也是一種自我提升?面試的時候你也可以拿出來炫一下,說錯也沒關係,至少你展示出你的好學,你的認知層面。
-
PHP的生命週期和zend引擎
-
變數儲存結構
-
寫時複製和引用
參考文章:
第十天:根據你的簡歷內容做複習
面試都是拿著你的簡歷來問問題的,你的簡歷內容會直接影響面試內容的走向,所以簡歷寫完還要做響應的複習。
我的簡歷有涉及rabbitMQ,elasticsearch等知識,我就對其進行簡單的複習。
另外很重要的一點:提前想好怎麼描述你做過的專案,其中遇到什麼問題,怎麼解決,儘量把你好的一面展示出來,這些都可以提前寫下了的,好記性不如爛筆頭,下面第二部分會說到。
高效率
複習的內容實在是太多了,單單寫上一部分內容都快把我的鍵盤打爛,手寫斷了。雖然有了十全的計劃,但如何高效率去記住上面那麼多東西是一個大問題,看看我是怎麼做的。
-
例如第一天覆習作業系統的知識,我是早上Google了一下有關作業系統的面試知識點,然後開啟幾個標籤頁,選取內容比較齊全的。所謂“好記性不如爛筆頭”,沒有爛筆頭,只有爛鍵盤,所以我選擇把這些知識點一一整理到自己的電腦上,自己平時有寫部落格,用markdown比較多(推薦Typora),所以每天就用一個md檔案把知識整理下來,基本都是手打的,很少複製黏貼。這樣做,一方面讓自己印象深刻,另一方面鍛鍊自己摘取核心內容,描述能力,這也是我能寫下這麼多內容的原因。
-
每天晚上計劃好明天的複習內容,可以選擇睡前回顧今天學習的知識,也可以在第二天早上回顧一遍
-
最好選擇一個安靜的地方,能讓你認真學習的環境,我由於提交了離職申請需要一個月才能走,交接專案也很快,所以每天都在公司有計劃的複習(遠離手機)
總之,真想要離職,找一份好工作,必須對自己狠一點,找到心儀的工作再好好去放鬆幾天。其實有不少人一直在埋怨大環境不好,確實是,但有何用,想為自己菜,自己不努力找一個藉口?王小波說的好:人的一切痛苦,本質上都是對自己無能的憤怒。當然運氣也很重要,保持樂觀,別輕易放棄。
優簡歷
簡歷不用多說,就是很重要,怎麼寫?其實我也是參考一篇文章的:我本以為你們會寫簡歷
概括一下:
-
基本的,用PDF格式,個人資訊寫完整,別寫精通
-
技能亮點,圍繞 熟悉 , 有所 , 掌握 , 瞭解 , 有一定心得 等
不要這樣:
熟悉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等底層資料結構的實現有所掌握。
-
一定要寫專案亮點和難點
大多數人都是這麼寫的 : 負責使用者登入註冊模組 , 後臺管理 , 多角色許可權控制 , 負責廣告業務模組的管理和篩查(太普通,太泛了)
-
亮點:你覺得這個專案中哪一部分值得自豪或學到新東西了 . 比如專案中用到ECDH , 使用了MySQL中介軟體等等。
-
難點:你覺得這個專案哪一部分當時難了你幾天 , 然後你透過自己努力解決了以及解決方案是什麼。
總結
面試並不簡單,不要太輕敵,做好準備,打好基礎是關鍵。毫無準備就去投簡歷面試大多是浪費時間,甚至浪費進入好公司的機會。還是那句話程式設計師應該腳踏實地,不要眼高手低,用實際行動證明自己。
我是即將入職廣州一家遊戲公司PHP開發崗位的程式設計師,2018年畢業,畢業到現在確實收穫了不少,也讓我看清自己,需要惡補的知識還有很多很多。歡迎大家關注我的個人部落格https://zgxxx.github.io/,比較簡陋,還是希望能和萬千大神交流技術問題,一起成長!
本作品採用《CC 協議》,轉載必須註明作者和本文連結