[TOC]
# 提問的藝術
******
在開發過程當中,難免會遇到一些問題,而提問是最不費腦并且可能是最快的一種方式,但是,你的問題不一定會被人家所理解,但是你應該學會怎么提問。
<br />
## 提問之前
在提問之前,首先要確保以下幾個點:
* 有做好可能解決不了的心理準備
* 或許應該準備好付費的情況
* 確定這個問題是因為實現什么而出現的,是否可以換種實現方式
* 有認真思考過該問題的解決方案
* 有嘗試過搜索該問題的解決方案
* 確定 開發手冊/文檔中 沒有該問題的解決方案
* 確定你有該問題的基礎知識
* 有做一系列的排查,并將問題確定在一個范圍內
<br />
### 解決不了
當你的問題難度太大時,可能沒有人能回答你的問題,你得做好解決不了的準備,解決不了請不要惱羞成怒,做出一些不理智的事情,或許可以嘗試下付費解決,也或許可以換一種解決的方式(放棄問題的源頭,用另一種方式實現你的邏輯)
<br />
### 認真思考問題的解決方案
當問題特別明顯,只要有動腦就能解決這個問題時,沒有人會喜歡回答這種基礎問題,
例如:
當你知道echo "hello world"語句,卻不知道怎么輸出"EasySwoole天下第一"時
當你知道如何移動文件到/tmp目錄,卻不知道移動到指定日期的目錄時
當你知道 mysql 有解釋器可以查看是否有使用到索引,卻不知道如何看組合索引是否有效時
當報錯信息出現的情況,卻不知道去搜索時
<br />
### 搜索問題的解決方案
同樣,當一個問題直接搜索就能出現答案,卻一直拿出來問時,沒有人會給`伸嘴黨`喂飯,這是對回答者的一種侮辱
請在提問的時候,先嘗試在搜索引擎中搜索,或許答案就在第一頁
<br />
### 開發手冊
當你在搜索引擎沒有找到一些 生僻/不知名/不公開 的一些問題時,或許你得考慮下是否有一份文檔還沒有看完
既然搜索引擎都找不到的問題,那你問對該項目毫不知情的人有什么用呢?
既然有開發文檔,那你為什么不嘗試下在開發文檔中發現這個問題的解決方案呢?
<br />
### 問題的基礎
千萬不要問你對該問題一無所知的問題,當你沒學過php時,請不要問為什么`if(){}`括號里不加條件就會報錯的問題
當你提出一個問題的,該問題相應的基礎你應該要會,否則你會被人恥笑。
例如:
當你沒看完新手教程,問swoole為什么運行之后改代碼要重啟
當你沒看完面對對象,問為什么不use命名空間就會報錯
當你連接websocket時,問為什么會發起一個http請求
<br />
### 排查問題
在提問之前,首先你得學會排查這個問題,確定問題的一個大致范圍。否則會讓人無從回答。
例如:當你上傳文件這個邏輯出現問題時,你問:"為什么我沒法上傳文件",是沒有人能回答的了你的,你得自行排查,直到一個小范圍。例如:
* 上傳文件,選擇文件之后,發生錯誤.
* 選擇文件成功,發起http請求時出錯.
* 發起http請求成功,到后端接收不到文件信息.
* 接收文件信息成功,無法保存上傳文件.
將一個大問題分解成一個個步驟,自行測試每個步驟.直到某個步驟出錯(如果每個步驟都有錯,那就一個個步驟慢慢解決)
<br />
## 提問 (首先確保你看完了上面的`提問之前`小節)
在提問時,我們應該避免以下幾種問法:
* 在嗎?
* 大神救我
* 你好
* 大佬求帶
* 有沒有人用過xxx(說一個框架,或者一個不知名的項目)
* 大神這個是怎么做的(直接要代碼)
* 可以問個問題嗎?(不說問題,等別人回答可不可以)
* 這個代碼有什么錯?(發出一串代碼,不說問題)
* 這個代碼怎么改?(發出一串代碼,不說怎么改,不說問題)
* 為什么我這個有問題?(截圖一段"xxxxx"自行判斷輸出的錯誤信息不截圖代碼)
* 能不能咨詢一下(某種語言,某種框架,某種項目 一個大范圍的概念)
> 當然,沒有人會跟錢過不去,只要給錢,可無視一切
正確的提問包含以下幾點:
* 描述準確,準確描述你要實現的功能,問題出現之前以及出現之后的現象
* 截圖準確,不要截一些和問題無關,或者對解決問題沒有任何幫助的圖
* 態度端正,虛心請教,沒有人有義務幫你.
問題可分為以下幾種:
* 概念問題,某種抽象概念的不理解
* 代碼問題,代碼出現非預期的情況,報錯等
* 框架問題,出現框架報錯,運行出錯,運行邏輯不理解等問題
* 邏輯問題,對某種功能實現的邏輯不理解
* 性能優化問題
每種問題的提問方式如下:
### 概念問題
概念問題,我們必須要描述準確,并且有自行了解過概念的基礎,例如:
* 我不太清楚為什么要用面對對象,直接函數封裝不行嗎?
* 為什么協程要是用mysql連接池 等
### 代碼問題
代碼問題,我們需要截圖代碼,以及報錯信息,并且說明自己要實現什么功能,例如:
* 我想要實現文件上傳,我已經嘗試了修改權限,但是不知道為什么代碼會報錯(附上錯誤信息,以及代碼) 等
### 框架問題
框架問題,我們需要詳細的說明框架的哪個部分,以及發生了什么問題,例如:
* 使用EasySwoole時,發現在生產模式下,調用配置文件錯誤
* 使用tp3.2時,上傳文件總是報文件夾不存在,但是文件夾存在
* 使用tp3.2時,session生存時間無法配置
### 邏輯問題
邏輯問題,我們需要詳細描述某個功能的哪部分邏輯,例如:
* 請問session過期是怎么實現的?
* 請問mysql連接池是怎么實現的?
### 性能優化問題
性能優化問題,需要先確認慢的地方,然后截圖,例如:
* 我發現這段代碼執行特別慢,有什么錯誤嗎?(附上代碼截圖)
* 這段sql我想實現xxxxx查詢,但是非常慢,能優化嗎?(附上sql語句,表結構,解釋器截圖)
> 可查看[https://github.com/tioncico/How-To-Ask-Questions-The-Smart-Way](https://github.com/tioncico/How-To-Ask-Questions-The-Smart-Way)
- 引言
- Introduction
- 運行模式
- php-fpm
- php-cli
- 基礎介紹
- 網絡協議
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 會話管理
- cookie
- session
- api/token
- linux基礎
- lnmp安裝
- 命令
- 進程管理
- 擴展安裝
- 端口監控
- 防火墻說明
- php7.0
- 部分新特性
- php回調/閉包
- 回調事件
- 閉包/匿名函數
- php多進程
- 多進程開啟
- 進程通信
- 進程信號
- 僵尸進程
- 孤兒進程
- 守護進程
- 同步/異步
- 阻塞/非阻塞
- 協程
- Swoole
- 初始Swoole
- 運行機制
- 生命周期
- composer使用
- EasySwoole
- 設計理念
- 組件說明
- 運行過程
- demo
- 提問的藝術