不少程序員朋友在入職都會面對一個問題,就是熟悉項目。那麼熟悉項目就須要培訓,老同事講解,文檔查閱。php
相信你們都在看到一座代碼大(shi)山放到本身面前,都不知從何下手。那麼本篇文章就是從在文檔不全;你一入職,老同事就甩手(對,你是去接鍋的);除了HR姐姐的入職培訓,沒有人給你講項目;這種狀況下,該如何快速入手項目。html
這裏代碼部分拿PHP項目舉例,其餘語言的讀者也可借鑑思想。
這裏咱們抽象一下,參考 馮·諾伊曼結構 mysql
不論咱們的http服務,Api服務,Rpc服務,均可以抽象成如上模型。nginx
http服務的輸入就是http請求
,運算器是php-fpm
程序,控制其表現的是php
代碼,儲存是磁盤,內存,或是redis,輸出是http響應
。程序員
Rpc服務的輸入就是TCP
報文, 運算器是php
常駐程序。web
MySQL服務也能這樣抽象,輸入是MySQL格式編碼的TCP
報文,運算器,控制器是MySQL
程序,存儲是磁盤,內存。輸出也是TCP報文
, 而後在php
程序解碼出數據。redis
一個項目運算器,控制器,就是這個項目的程序
和代碼
。存儲器就是數據
。這就比如一個線團,不知從哪開始理,若是你立馬就能看懂咋回事,那麼這篇文字你看到這裏就能夠關了。sql
在抽絲剝繭時,咱們會先找到一個線頭做爲開始,而代碼,就須要找到輸入。
網頁,APP是項目裏所見即所得的輸入
,也是最容易理解的,從這個方向輸入
能夠看到用戶用例。shell
php
我麼這裏把它做爲運算器,php代碼
做爲控制器。數據庫
php內部本身實現了一個Zend虛擬機,能編譯php代碼成opcode並運行。能夠把它比作運算器
產生的日誌,圖片等文件寫入,做爲項目裏面的存儲器
。
數據,不論本地仍是遠程的,咱們都做爲輸出
。(輸出數據保存,輸出數據查詢請求)。特別是關係型數據庫,從關係結構可推測出系統建模。
一個具體的項目對用戶提供服務,在多服務的架構裏,一樣它也會是一個請求發出者,此時它發出的請求做爲輸出
。例如:Rpc請求,Redis操做。
本身熟悉項目時,第一時間就開始啃代碼是很難的,這是把它看成一個黑盒,從什麼樣輸入,會獲得什麼樣的輸出,開始理解系統,只有這中間代碼作了什麼不用第一時間關心。
就像TDD
同樣,接到的是需求,不那麼關心中間實現過程。這樣的參數輸入能獲得那樣的數據返還,這個代碼的happy-path
就算過關了。
因此接下來,我開始從項目,輸入,輸出,存儲開始給你們講解快速熟悉項目。
有哪些輸入呢?
http
請求,tcp
,websocket
, 自定義rpc
請求。
這裏我聯想到
ServerLess
,只關心輸入輸出
SQL
,Redis
, Curl
, RPC
,文件寫入,應用對外發出的請求都是輸出。
例:
這裏只是抓了http請求,還有個websocket容易被忽略,能夠經過WS
標籤過濾查看。
在瀏覽器端開啓產看http請求是相較於抓包,避免了添加https證書問題。
## file: /etc/nginx/nginx.conf http { ... ## 這是默認的日誌 log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; ## 注意這裏新增了一個 $request_body log_format log_requets '$remote_addr - $remote_user [$time_local] ' '"$request" "$request_body" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; ... }
nginx
的access_log
會記錄GET請求以及參數,POST請求就須要額外配置,這裏咱們新增了一種日誌格式——log_requets
。
## file: /etc/nginx/conf.d/www.conf server { ... root /usr/share/nginx/html/xiunobbs/; ## 這裏使用新的格式日誌 access_log /var/log/nginx/access_xiuno.log log_requests; error_log /var/log/nginx/error_xiuno.log; ...
例:
圖中最後一行POST
,日誌請求記錄了提交的內容。
拿MySQL
舉例,數據庫軟件會有日誌記錄,爲了debug,咱們把通常的操做日誌打開。這樣就能,記錄全部提交到該數據庫的sql記錄。
## file /etc/mysql/my.cnf general_log_file = /var/log/mysql/mysql.log general_log = 1 log_output = FILE
配置好,重啓數據庫,再運行項目就能記錄代碼的SQL操做了。
例:
至於bin-log,這個只記錄編輯操做,不記錄查詢操做。
monitor
是redis
的調試命令,輸入後,當前窗口會返回redis
處理的每個命令,它能幫助咱們瞭解在redis
上發生了什麼操做。redis是沒有任何配置可以將操做命令記錄到日誌。
Redis 可以記錄一些服務狀態改變日誌,以及慢日誌。
登錄到redis-cli,而後鍵入monitor
,\n
這裏咱們能夠用這個命令將日誌操做日誌記錄到文件裏。
nohup redis-cli monitor > /var/log/redis/redis_op.log 2>&1 &
在啓動memcaced
是帶上參數-vv
memcached -vv
經過以下配置把Memcached
的日誌記錄到文件裏。
memcached -m 64 -l 0.0.0.0 -p 11211 -u memcache -vv > /var/log/memcached.log 2>&1
若是該Web項目依賴了RPC,須要也須要進行記錄。
捕獲到以上日誌後,就能知道這個Web項目,接收到到了什麼請求,查了什麼DB,操做了Redis什麼,請求了什麼RPC
可是在3個窗口來回切換,有些不便,接下來咱們想辦法讓他們在展現在一個窗口內。
tail -f -q /var/log/nginx/access_xiuno.log /var/log/mysql/mysql.log /var/log/redis/redis_op.log /var/log/memcached.log
效果以下:
好的這裏就是經過日誌,配置請求來熟悉代碼。
Jira/RedMind/Tower/禪道/Teambition 等也存有不少信息,不過這太依賴於公司制度和員工態度,有的人全是口頭交流,軟件只是用來記錄狀態的;有的員工事無鉅細都記錄在案,經手過的任務,都自帶Wiki。
代碼,於任務管理工具之間的聯繫,通常是在提交記錄或分支名命名帶有任務ID號。這樣能夠經過代碼找到任務ID,再查閱當時的備註信息。
經過如上操做,你已可以經過日誌,瞭解到這段代碼作了什麼,梳理出主要業務。快速上手。至於參數校驗,邏輯判斷,最總都會落實到I/O操做的不一樣上。
祝願你早日熟悉公司業務,扛起大梁。