如何快速熟悉項目

前言

不少程序員朋友在入職都會面對一個問題,就是熟悉項目。那麼熟悉項目就須要培訓,老同事講解,文檔查閱。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請求,tcpwebsocket, 自定義rpc請求。

這裏我聯想到 ServerLess,只關心輸入輸出

輸出

SQL,Redis, Curl, RPC,文件寫入,應用對外發出的請求都是輸出。

配置Debug模式

Http 日誌

  • 在瀏覽器端開啓請求記錄

例:
image.png

這裏只是抓了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"';
...
}

nginxaccess_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;
...

例:
image.png

圖中最後一行POST,日誌請求記錄了提交的內容。

SQL日誌

MySQL舉例,數據庫軟件會有日誌記錄,爲了debug,咱們把通常的操做日誌打開。這樣就能,記錄全部提交到該數據庫的sql記錄。

## file /etc/mysql/my.cnf
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
log_output              = FILE

配置好,重啓數據庫,再運行項目就能記錄代碼的SQL操做了。

例:
image.png

至於bin-log,這個只記錄編輯操做,不記錄查詢操做。

Redis日誌

monitorredis的調試命令,輸入後,當前窗口會返回redis處理的每個命令,它能幫助咱們瞭解在redis上發生了什麼操做。redis是沒有任何配置可以將操做命令記錄到日誌。

Redis 可以記錄一些服務狀態改變日誌,以及慢日誌。

登錄到redis-cli,而後鍵入monitor,\n
image.png

這裏咱們能夠用這個命令將日誌操做日誌記錄到文件裏。

nohup redis-cli monitor > /var/log/redis/redis_op.log 2>&1 &

Memecached日誌

在啓動memcaced是帶上參數-vv

memcached -vv

image.png

經過以下配置把Memcached的日誌記錄到文件裏。

memcached -m 64 -l 0.0.0.0 -p 11211 -u memcache -vv > /var/log/memcached.log 2>&1

RPC 日誌

若是該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

效果以下:
image.png

好的這裏就是經過日誌,配置請求來熟悉代碼。

任務管理軟件

Jira/RedMind/Tower/禪道/Teambition 等也存有不少信息,不過這太依賴於公司制度和員工態度,有的人全是口頭交流,軟件只是用來記錄狀態的;有的員工事無鉅細都記錄在案,經手過的任務,都自帶Wiki。

代碼,於任務管理工具之間的聯繫,通常是在提交記錄或分支名命名帶有任務ID號。這樣能夠經過代碼找到任務ID,再查閱當時的備註信息。

最後

經過如上操做,你已可以經過日誌,瞭解到這段代碼作了什麼,梳理出主要業務。快速上手。至於參數校驗,邏輯判斷,最總都會落實到I/O操做的不一樣上。

祝願你早日熟悉公司業務,扛起大梁。

相關文章
相關標籤/搜索