Web 開發進階指南

chenos發表於2018-03-23

因為對面試技巧特別感興趣,過去的一段時間我也一直在總結一些面試題,也恰巧看到社群有人寫了一系列關於《PHPer 面試指南》的文章,號稱“史上最全、最具有指導”,我很感興趣的點進去看了一些,文章梳理了很多知識點,我挺贊同作者的一些觀點,年輕有為,激起了我寫這篇文章的興趣。下面對應《PHPer 面試指南》各章節標題,整理我認為面試中應該準備的重點(基礎、進階、實戰和高階),如有不足之處,歡迎指正。

WEB 篇 -> 前端篇

作者總結的第一篇叫 WEB 篇,我以為會講全球資訊網相關知識點,比如協議之類的,但是講的卻是一些前端知識點,所以這篇內容改成前端篇會更適合,但是即使作為前端篇,內容也太少了,很多方面都沒講述到。如果是前端篇,可以從 HTML、CSS、JavaScript 三方面著手,另外瀏覽器也是前端開發必須熟悉的 HTTP 客戶端工具,當然還有其他工具,PHP 的 HTTP 客戶端會在協議篇略有提及。

HTML

HTML 由元素組成,可以被多個屬性修飾。元素和屬性是 HTML 裡最重要的兩個概念。

  1. HTML 元素的初級劃分:塊級元素行內元素,初學者必須非常瞭解這兩則的區別,能夠識別常用的元素到底是塊級還是行內元素。
  2. 但是上述劃分並沒有從語義化上進行區分,所以可以從語義化、功能化上進行分類,見 HTML 元素參考 章節。
  3. 再高階一點從 Content Model 上劃分,見 Content categoriesHTML 規範
  4. 另外可以查缺補漏,看看 HTML 屬性參考 章節的內容,熟悉常用的屬性,並且瞭解一些冷門的屬性的使用技巧。
  5. 結合上述參考,需要懂得 HTML 在段落、表格、表單、多媒體(影片、圖片等)、SEO 上的應用。

1 基礎,2 進階,3、4 Code Review 必備,5 實戰。

CSS

相比較 HTML 來說,CSS 重要很多,大致劃分為:

  1. 選擇器
  2. 資料型別(單位)
  3. 文字 & 字型
  4. 佈局
  5. 盒模型
  6. 動畫,包括兩方面 transition(過渡)animation(時間軸和關鍵幀)

1、2、3 基礎,4、5 重點,6 進階

重點說下佈區域性分的內容,佈局可以劃分為:

前四點是 display 的概念,再後面兩點是位移相關,最後兩點是變種,懂得其中的概念,懂得根據專案情況靈活運用即為基礎紮實。

盒模型,從裡到外相關的屬性有:

  • width 和 height,包括 min 和 max
  • padding
  • border/box-sizing/box-shadow
  • margin
  • overflow
  • outline

JavaScript

與 HTML 和 CSS 相關的 DOMCSSOM重點研究物件)的相關 API 是初級開發需要掌握的。篇幅有限,而且 JavaScript 這門程式語言比較特殊,細節就不多說了,以後有空,另起一篇再說吧。

協議篇

WEB 是透過 HTTP 協議進行客戶端和服務端間通訊的,對於 WEB 應用開發,理解 HTTP 協議非常關鍵,其次要了解整個 TCP/IP 協議族,如果是遊戲開發,理解 TCP 協議也非常關鍵,這部分建議看書:

重點講下 HTTP 協議

URL

URL 部分需要了解 URL 的結構組成部分,尤其需要知道如何處理編碼的問題。

報文

報文的結構,包括請求報文和響應報文,重點考察的知識點包括:請求方法,響應狀態碼和首部欄位。首部欄位,考察重點主要在 Cookie、Authorization 還有 CORS 相關問題。

SSL & TLS

HTTP + 加密 + 認證 + 完整性保護 = HTTPS

進階看《HTTPS權威指南 : 在伺服器和Web應用上部署SSL/TLS和PKI

HTTP/2.0

我看了些 MDN 的 HTTP 章節,其他的我也沒有了解太多。

實戰相關

實戰的重點在於 HTTP 的實際應用,大致分兩點:HTTP Server 和 HTTP Client。

HTTP 服務端其實就是 WEB 伺服器,初步可以從 Nginx + php-fpm 和 Apache + mod_php 著手,後續的可以搗鼓 Socket 相關的擴充套件,國內比較推薦 swoole,小眾的 reactphp、amphp 程式碼寫的也非常優雅,這方面主要是 Socket,有時間可以重點看看 《TCP/IP詳解 卷1:協議》和《UNIX網路程式設計 卷1:套接字聯網API(第3版)》。

PHP 沒有官方標準的 HTTP 類庫,但是有個 PSR-7 標準,自己動手實踐,實現這個標準的介面能大致理解 HTTP 的實戰應用到底體現在哪裡,這裡會初步涉獵 I/O Streams 方面的知識,為以後進階 Socket 程式設計奠定基礎。

HTTP 客戶端,PHP 只提供了 cURL 擴充套件,基本無敵,能搞定很多跨平臺資料呼叫,進階可以感受下 Socket 實現,不侷限與應用層(HTTP),還可以直接走傳輸層(TCP/UDP),這方面重點考察 REST 的應用,進階可以考察 RPC 之類。

另外 HTTP(還有一些相關協議) 應用,如果沒有各種 SaaS 平臺的使用和開發經驗那是非常吃虧的,這方面的經驗積累是長期的也是進階的關鍵。

PHP 篇

需要說明的是,以下純粹從程式語言的角度出發,考察更多的是程式語言的硬實力,而並非花哨的各種應用。

基礎

基礎來說,翻閱 PHP 官方文件,翻兩年就差不多了。如果是考察程式語言的硬實力主要體現在三方面:

  • 資料結構
  • 演算法
  • 設計模式

資料結構與演算法

資料結構與演算法是密不可分的,初級開發熟悉 string 和 array 的各種增刪改查排比操作是重點,感興趣的還可以瞭解一下 PHP 的資料結構擴充套件庫,除了 SPL 標準庫還有個 ext-ds 擴充套件。

如果想學習資料結構與演算法,首推《演算法(第4版)》一書,比《演算法導論(原書第2版)》好理解多了,中高階 PHP 開發必讀,可以針對性的寫一些 PHP 實現。

另外,推薦一本刷演算法的《程式設計師程式碼面試指南:IT名企演算法與資料結構題目最優解》,同樣可以針對性的寫一些 PHP 實現。

遊戲應用演算法會涉及的比較多,WEB 應用資料結構會涉及的比較多,尤其在各種解析器、編譯器的實現上。感興趣的可以自己去寫一些模板引擎、編輯器的實現,個人比較推薦大家自己動手實現下 YAML 解析,YAML & JSON 在網際網路跨平臺上有廣泛的應用。

設計模式

對於初學者來說,先從物件導向開始著手,致力於寫可讀性、可維護性程式碼就行了,設計模式對於初級開發我的建議是忘了它吧。 實際一點,堅持 GitHub 上翻兩年程式碼也差不多了,培養 Code Review 能力。實戰可以自己去實現框架的方方面面,從這個過程中去理解設計模式,對於設計模式來說不要為了用而用

如果你已經寫了足夠多的程式碼,那接下來可以看幾本設計模式的書掃盲,雖然不是 PHP 版的,但是也非常推薦。

程式碼庫方面 DesignPatternsPHP 非常不錯,非常值得學習,中級開發必備。

進階

多程式、多執行緒相關,非同步思維的培養。

  • swoole 全套
  • libev 和 libevent 之類的 PHP 擴充套件庫(PHP 7 之後就剩 ext-event 擴充套件庫了)
  • PHP 的多執行緒 ext-pthreads 庫,目前正在發展中,PHP 7.2+,需要開啟 zts。

在這個過程中,勢必會不斷的瞭解 C/C++ 編寫的擴充套件庫,為以後進軍高階開發帶來很大幫助。

高階

高階 PHP 開發不懂 C/C++ 是非常吃虧的,個人建議 PHP 開發也有必要學習 C/C++ 程式設計,不求精通,但是要有一定的理解和閱讀 C/C++ 程式碼的能力。

初步可以從瞭解 PHP 核心著手,PHP 5 和 PHP 7 有很大的不同,建議直接看 7 的。盤古大叔的《PHP7核心剖析》總結還不錯的,建議入門的人看看。

擴充套件庫:國外的 PHP-CPP 和國內的 PHP-X,另外還有 phalcon 的 zephir

Laravel 篇 -> 框架篇

與其說 Laravel,不如說框架篇

首先說個現在 PHP 裡也流行起來的 IoC 容器,IoC 的概念簡單的說來:

IoC(控制反轉)目前比較流行的兩種方式 DI(依賴注入模式,被動) 和 SL(伺服器定位模式,主動),DI 是遵循 DIP(依賴反轉原則)的,SL 是 anti-pattern(反模式)的,不遵循 DIP。因為注入的形式五花八門,為了程式碼複用性和擴充套件性出現了 IoC 容器這麼個東西,它是遵循各自 DI/SL 模式實現的容器,IoC 容器會大量運用反射機制來實現。

Laravel 中 Container(illuminate/container)是 DI/SL 的混合體。關於這個概念,可以多讀幾遍下面這篇文章(Java 版):

Inversion of Control Containers and the Dependency Injection pattern [譯文]

基礎

說回到框架,核心主要有三部分:HTTP、Routing 和 MVC,推薦看 Slim 框架的底層程式碼。

  • HTTP 的 Request、Response 是必備,其次還有 Cookie & Session,這些都是面試的考點。
  • Routing 核心其實就是 Event Dispatching 的概念,Lumen 和 Slim 都用的 FastRoute,底層實現寫的非常不錯。不過,如果想規範化的學習 Routing,建議看 symfony/routing 的實現。
  • MVC 方面:Model 是核心,View 和 Controller 有各種變形。Model 分 Active Record 和 Data Mapper,對於的有 Eloquent(AR)和 Doctrine 2(DM)兩大陣營(其他框架的使用者不要噴我)。

進階

初步,可以從學習和閱讀框架原始碼開始,symfony 的元件化思路是非常值得推薦和學習的。
其次,可以從 swoole 全套著手瞭解非同步思維。
另外,ext-event 擴充套件庫相關的 PHP 類庫,如 reactphp、amphp、workerman 等等也是非常值得學習使用。

MySQL

初級

重點放在 SQL,用好相關 ORM 就可以了,在實踐中出問題,面向 Google 程式設計來解決。

另外的重點,表結構設計,從我個人淺薄的經驗來總結,大致有:

  • 文章類
  • 評論類
  • 日曆相關,課程表、日曆事件等
  • 時刻表,運動健身相關,或者是一些小程式
  • 票務相關,電影票、火車票、機票等等(與時刻表相關聯)
  • 訂單類,只要有支付就有訂單。
  • 使用者相關,尤其是涉及許可權時的處理。

篇幅有限,以上就不擴充了,以後獨立寫一篇文章,表結構設計有空的大牛們可以幫我完善。

進階

進階的重點在於經驗的積累,尤其實戰中 MySQL 的配置、除錯與最佳化。

高階

大型網站還可以從資料庫讀寫分離下功夫,解決資料庫高負載的問題。再高階一點把資料庫抽象為資料訪問的相關服務平臺,那內容可以引申出多個方面:

  • 資料庫
  • 檔案儲存
  • NoSQL
  • 快取
  • 搜尋引擎

再有就更多了。。。

Docker

這個部分是我另加的。

Docker 的出現實在是太讚了,以前需要透過 VM 來搗鼓的東西,現在 Docker 就可以做了。非常有利於培養 Service 思維。

初級

從實戰著手,尤其是瞭解 Linux CLI 和 shell 程式設計,重點推薦《Linux命令列與shell指令碼程式設計大全 第3版》一書,入門首選。原理方面《現代作業系統(第3版)》可以看看,重點看程式與執行緒I/O死鎖三個章節。

實戰

英文不錯直接上手官方文件就可以了,中文方面可以看書《Docker — 從入門到實踐

Docker 初級的重點在於 Dockerfile 映象,Linux CLI 和 shell 程式設計在這裡就非常有用了。會涉及到 Nginx、PHP、MySQL、Redis 等配置問題。

如果自己不知道怎麼配,可以學習 LaraDock,不過 LaraDock 有點臃腫,但是用來學習和提高認知是非常有幫助的。

高階

培養大型網站架構思維,瞭解叢集,推薦大家看書一本適合入門的書籍《大型網站技術架構:核心原理與案例分析》,這方面我的認識也不多,目前正在翻閱 GitHub 上的一些 examples,針對性做一些實踐。

如果想了解理論,書本推薦:

總結

篇幅有限,以上多為泛泛而談,更多的只是方向性建議,細節的學習還需要靠自己努力鑽研。另外,技術的進階讀書是非常有必要的,而不只是在網上搜刮一些零碎的資料。雖然看一本書不會直接學會某個技能,但是讀書可以提升一個人技術的造詣。上面各個章節我推薦了一些技術叢書,感興趣的可以翻閱,也可以換一些簡單易懂但是同類的書籍作為入門。

文中介紹了很多技術叢書,不是每一本我都讀完了,但是我會針對性的看幾個章節,目前還有諸多不懂之處,不過我會在一段時間的實踐之後,回來翻閱。

暫時寫這麼多吧,其實還可以有很多補充的,等有空吧。以上每個章節大致整理了基礎、進階和高階三個部分,大家可以較全面的自我評估(可能是高標準),如有遺漏,也歡迎大牛幫我點出。

最後,面試時需要擺正姿態,尤其需要對自己有個準確的評估,不要漫天要價。我對自己的評估:一個合格的中級 PHP 工程師(可能還可以高一點點),但是現在很多公司更需要一個豐富經驗的高階工程師,所以我也只能不斷學習爭取能夠早日步入高階工程師行列。

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

相關文章