本文介紹的是阿裡媽媽搜索直通車這邊的一些開發流程及相關工具。做為新人入門手冊,其中某些工具可能只有直通車這邊在用,但對於其他公司的新人來說,一樣是具有指導意義的。
簡單介紹一下直通車這邊的開發背景:
直通車業務對外是一個http的服務,直通車這邊的開發主要是服務器端開發。
編程語言:基本以C++/Java為主,有少量的perl, shell的腳本
程序發布,部署方式:通過 ABS 來打出rpm包,放到淘寶內部 yum 源,然後通過 金字塔 來進行自動化發布的
直通車這邊操作系統都是Red Hat Enterprise Linux 5,機器都是X86架構,64位機器。這邊代碼文件默認都用GBK的編碼
登錄機器的配置
集團的跳板機,ssh的配置是會在一段時間不操作之後自動斷掉的,而且每次登錄上去都需要輸入密碼+token,利用ssh的ControlMaster,就可以解決,方法見我的ssh配置
在linux下,有很多窗口管理器,可以在一個窗口裡進行多個獨立的會話[不需要開多個終端],進行會話恢復[即使網絡連接中斷,用戶也不會失去對已經打開的命令行會話的控制],推薦screen
默認的screen配置有些蹩腳,而且跟shell快捷鍵有些沖突。配置好了之後界面顯示就很強大了,可以參考我的screen配置
對應上述配置的screen快捷鍵:
Ctrl+j,c 創建新會話
Ctrl+j,d detach
GNU工具鏈
在刻的操作系統裡已經有了,常用的是:
* GNU make: 編譯(compile)和構建(build)的自動化工具
* GNU 編譯器集合:GCC
* GNU 二進制工具:包含鏈接器(linker),匯編器(assembler)和其他工具
代碼編輯
我一開始使用的vim,基本不安裝什麼插件,後來投入了emacs的懷抱,主要是emacs,eshell和gdb搭配起來,不僅能夠滿足我的日常 需求,而且讓我感覺效率大大提升,而且emacs環境安裝也比較簡單。但是在咋們公司的服務器上,vim是標配,emacs需要自己裝。用習慣了 emacs,再切回到vim時,好多快捷鍵都忘了,十分痛苦!
Vim新手入門資料和一些Vim實用小技巧
Linux環境下shell和vim中亂碼原因及消除辦法 新手經常被亂碼問題困擾,這篇文章探究了一下shell和vim中亂碼原因及解決辦法
emacs安裝及使用 ,現在這裡挖個坑吧,後續有時間再寫
如果在Windows下看代碼,推薦Source Insight,非常好用,誰用誰知道。
目前直通車這邊代碼版本管理使用svn
常用命令:
查看本地代碼做了哪些改動
svn st -q
提交代碼
svn ci filepath/ -m "svn comments"
查看另個版本之間的改動有哪些
svn diff -r r1:r2
svn diff -r r1:r1 --summarize #此命令是摘要模式,只展示哪些文件改動,不展示具體的文件內容diff
創建分支
svn cp http://destpath/trunk http://destpath/branches/my-branch/ -m "create branche for xxx"
合並分支代碼到主干
__svn merge -r 14829:HEAD my/branch http://path/to/trunk__
上述命令表示把本地的my/branch所代表的svn路徑的14829到最新版本的代碼,merge到http://path/to/trunk路徑下。如果是正常拉出來的分支,也可以不加版本參數,svn能自動計算出分支的起始版本號
新人合並代碼的時候一定要注意一下,提交之前再確認下合並的代碼是否OK,如果有不明白的地方,多請教師兄
查看某段代碼最後是誰改的
svn blame filename
更新指定文件到某個指定的版本
svn up -r rev file
撤銷某文件本地的改動
svn revert file #這條命令要謹慎使用,使用之後自己的改動就找不回來了
解決沖突的命令
如果svn merger後提示:
local add, incoming add upon merge
用如下命令來采納本地的修改來解決:
svn resolve --accept working -R [--recursive]
在Mac下,推薦使用圖形界面的Meld來作為svn的merge工具,可以很方便的處理沖突,減少合錯代碼的可能性
開發之前,最好了解如下這些東東:
Makefile 用來完成自動化編譯的東東
相關資料可以參考陳皓寫的跟我一起寫 Makefile系列,網上可以搜到熱心網友整理的pdf版本。看完前面4章就夠用了,後面的章節可以在遇到疑惑的時候再去查閱。
可以通過以下幾個常見問題來檢驗自己有沒有理解整個工程的Makefile
進階讀物:
如何調試Makefile變量
關於靜態庫和動態庫
需要了解的東西有
1. What: 什麼是靜態庫,什麼是動態庫
2. How: 如何生成靜態庫,動態庫
3. Why: 靜態庫和動態庫的差異,什麼情況下使用靜態庫,什麼情況下使用動態庫
以上問題都可以在這篇資料裡得到解答
參考資料:
菜鳥在C語言編譯,鏈接時可能遇到的兩個問題
編程大牛雲風推薦的書 <<程序員的自我修養--鏈接、裝載與庫>>
編程大牛老趙推薦的書 <<深入理解計算機系統>>書很厚,可以挑著看自己關心的章節
GNU編譯工具GCC
至少需要知道一些常用的選項參數:
控制代碼優化級別
可以通過man gcc來獲得上述問題的答案,也可以自行google,google被牆了可以用這個ask
GNU調試器gdb
程序執行結果錯誤怎麼辦?單測過不了怎麼辦?線上出Core了怎麼辦?別著急,GDB來幫你忙。
新手如何在gdb中存活 通過一個小例子來讓新手快速上手,搞會了裡面的內容,就基本夠用了
GDB中應該知道的幾個調試方法
一些我搜刮到的gdb命令[會持續更新進來,歡迎大家回復]:
通過gdb啟動程序後,如何調試fork出來的子進程:set follow-fork-mode child
直通車這邊的服務基本都是多進程的模型,首先啟動一個daemon父進程,然後再fork出多個執行業務邏輯的子進程。如果子進程掛掉,父進程會重啟一個子進程。
進階讀物:
陳皓的 用GDB調試程序系列, 介紹的非常詳細,全面
目前直通車這邊多線程機制使用的都是POSIX Theads
對於POSIX Theads,需要了解:
How: 如何使用pthread
Why: 為什麼使用pthread,而不是其他
以上問題,都可以在這個美國勞倫斯利弗莫爾國家實驗室的pthead教程裡面找到答案
想查找某個宏/函數的定義怎麼辦?
grep -r --include=*.{cpp,h} NGX_HTTP_VAR_INDEXED src/想找某個模糊記得名字的文件怎麼辦?
__find ./ -iname "*util.h"__
本命令意思是在當前目錄下,基於忽略大小寫的文件名稱來查找文件,文件名稱是正則表達式 *util.h
關於正則表達式,我只看deerchao的這個文章:正則表達式30分鐘入門教程
文本處理
流式編輯器 sed
例如替換某字符串: sed -i 's/oldvalue/newvalue/g'
關於sed,可以看酷殼上的sed 簡明教程
文本處理語言 awk
進階讀物:
單測十分重要,它能夠讓你對你的代碼更加有底氣和信心,而且能夠幫助你更早的發現問題,解決問題。在開發的各個階段,問題發現的越晚,解決問題的成本就越大。直通車這邊C++的單測都用的Google的gtest框架,即使之前不了解gtest框架,看著別人的代碼照貓畫虎也可以寫出單測來,但是最好去看一下gtest官方文檔,去全面了解一下gtest,去拓展一下自己的思維。
寫著寫著代碼,就發現自己的代碼越來越復雜,不容易閱讀,設計混亂怎麼辦?可以參考這本巨著:
<<代碼大全第二版>>
編譯之前的准備工作
需要把編譯依賴環境搞定,基本就是裝好編譯依賴的包就可以了。可以在rpm目錄下找到對應的spec文件,然後使用 t-abs 命令[用於本地調試spec文件和自動部署編譯環境],來幫助我們裝好編譯依賴的包,即spec文件中的 BuildRequire 部分指定的包
關於rpm和spec文件,可以通過閱讀這篇來了解:How to create an RPM package編譯
找到對應工程的Makefile,然後執行make命令,就可以編譯構建工程了
直通車這邊目前還在用RPM來進行包的管理
平常需要用到的rpm命令有:
UI界面:reviewboard,提交的時候使用 rbt命令:
rbt post r1 r2 來提交r1和r2這兩個版本之間的diff做為code review
提交之後可以得到一個reviewboard地址,然後需要在這個地址裡填上codereview的人員和相關的描述等
CISE為用戶提供自動化的環境部署和測試服務
這塊兒每個公司使用的都是不同各地
對於構建出來的rpm包,使用yum來安裝。
淘寶rpm包查詢UI 這裡可以查看到淘寶yum源裡面現存的各個包版本 可以從裡面看到對應包的abs地址
使用如下命令安裝:
sudo yum install -b test t-imatch-kgb-updated
-b 參數用來指定當前安裝包t-imatch-kgb-updated在test分支還是current分支裡面
上線時候的包必須轉成current
原文:http://www.cnblogs.com/Jack47/p/4321494.html