去年剛畢業來公司後,作爲新人,發現不少東西都沒有文檔,各類工具和地址都是口口相傳的,並且不少時候都是不知道有哪些工具可使用,因此當時就想把本身接觸到的這些東西記錄下來,爲後來者提供參考,至關於一個路線圖,幫助新人儘快上手。html
本文介紹的我所在小組的一些開發流程及相關工具。作爲新人入門手冊,其中某些工具可能只有咱們這邊在用,但對於其餘公司的新人來講,同樣是具備指導意義的。linux
2015.4.11 更新:git
增長構建工具 Bazel, CMake介紹程序員
增長Linux下任務管理相關命令github
增長正則表達式調試的網址web
簡單介紹一下咱們組的開發背景:
咱們的業務對外是一個http的服務,開發主要是服務器端開發。
編程語言:基本以C++/Java爲主,有少許的perl, shell的腳本
程序發佈,部署方式:經過 ABS 來打出rpm包,放到公司內部 yum 源,而後經過 金字塔 來進行自動化發佈的正則表達式
有時候你在命令行裏執行拷貝大文件的命令,這個命令很耗時,會獨佔終端,此時能夠先使用 Ctrl+z 命令讓當前任務(job)掛起,此時能夠輸入命令了,而後使用 bg 命令讓當前掛起的任務去後臺(background)運行。shell
利用 jobs 命令能夠查看當前在後臺運行的程序及job-id,而後想讓它到前臺來運行,能夠執行 fg [%job-id] 來讓它恢復到前臺執行編程
若是想kill掉當前在後臺運行的某個任務怎麼辦?使用 kill %job-idvim
咱們這邊操做系統都是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 make: 編譯(compile)和構建(build)的自動化工具
* GNU 編譯器集合:GCC
* GNU 二進制工具:包含連接器(linker),彙編器(assembler)和其餘工具
代碼編輯
我一開始使用的vim,基本不安裝什麼插件,後來投入了emacs的懷抱,主要是emacs,eshell和gdb搭配起來,不只可以知足個人平常 需求,並且讓我感受效率大大提高,並且emacs環境安裝也比較簡單。可是在咋們公司的服務器上,vim是標配,emacs須要本身裝。用習慣了 emacs,再切回到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,而是使用cmake(cross platform make)來生成makefile,而後再按照make的方式構建軟件。
進階讀物:
如何調試Makefile變量
如何修改Makefile來編譯出帶/不帶gdb調試信息的版本
如何去掉/加上編譯器優化選項,如-O2參數
新加入頭文件(通常都是.h結尾的),源文件(通常都是.cpp結尾)後,如何在Makefile中加入相應的規則。新加入的這個文件可能最終是放到靜態庫.a裏面,也多是放到動態庫.so裏面,也多是直接生成可執行程序的
關於靜態庫和動態庫
須要瞭解的東西有
What: 什麼是靜態庫,什麼是動態庫
How: 如何生成靜態庫,動態庫
Why: 靜態庫和動態庫的差別,什麼狀況下使用靜態庫,什麼狀況下使用動態庫
以上問題均可以在LibraryArchives-StaticAndDynamic,shared libraries裏獲得解答
參考資料:
編程大牛老趙推薦的書 <<深刻理解計算機系統>>書很厚,能夠挑着看本身關心的章節
至少須要知道一些經常使用的選項參數:
能夠經過man gcc來得到上述問題的答案,也能夠自行google,google被牆了能夠用這個ask
定義輸出文件的名稱
產生gdb調試的信息
控制代碼優化級別
只進行預處理過程 能夠幫助調試一些宏定義/頭文件包含產生的問題
只進行編譯過程
只進行連接過程
GNU調試器gdb
程序執行結果錯誤怎麼辦?單測過不了怎麼辦?線上出Core了怎麼辦?彆着急,GDB來幫你忙。
新手如何在gdb中存活 經過一個小例子來讓新手快速上手,搞會了裏面的內容,就基本夠用了
一些我搜刮到的gdb命令[會持續更新進來,歡迎你們回覆]:
進階讀物:
陳皓的 用GDB調試程序系列, 介紹的很是詳細,全面
目前直通車這邊多線程機制使用的都是POSIX Theads
對於POSIX Theads,須要瞭解:
What:什麼是thread,pthread
How: 如何使用pthread
如何編譯多線程程序
如何建立/結束線程
如何等待子線程返回(join/detach)
多線程之間如何使用互斥鎖(Mutex)來同步、加鎖、避免競爭條件的出現?
Why: 爲何使用pthread,而不是其餘
以上問題,均可以在這個美國勞倫斯利弗莫爾國家實驗室的pthead教程裏面找到答案
想查找某個宏/函數的定義怎麼辦?
grep -r --include=*.{cpp,h} NGX_HTTP_VAR_INDEXED src/
本命令的意思是在src目錄下,以遞歸的方式在.cpp或者.h結尾的文件裏查找NGX_HTTP_VAR_INDEXED這個字符串
想找某個模糊記得名字的文件怎麼辦?
__find ./ -iname "*util.h"__
本命令意思是在當前目錄下,基於忽略大小寫的文件名稱來查找文件,文件名稱是正則表達式 *util.h
關於正則表達式,我只看deerchao的這個文章:正則表達式30分鐘入門教程
另外有一個web應用regexr特別好使,能夠幫助咱們調試正則表達式
文本處理
流式編輯器 sed
例如替換某字符串: sed -i 's/oldvalue/newvalue/g'
關於sed,能夠看酷殼上的sed 簡明教程
文本處理語言 awk
關於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命令,就能夠編譯構建工程了
因爲make自己的靈活性,而Makefile的可讀性又不強,是以文件爲單元,抽象層次不夠,Google開發了分佈式的構建系統Bazel,可以把程序員從make的語法和文件級別的構建上解放出來。
Bazel相關資料有:
Google Blaze原理及 Bazel的使用方法介紹
目前咱們這邊目前還在用RPM來進行包的管理
日常須要用到的rpm命令有:
rpm -qf file-name 來查看某個文件究竟是哪一個rpm包裏面的
rpm -qi package-name 來查看這個rpm包相關的信息,好比打包時間,svn地址等
rpm -ql package-name 來查看這個rpm包中到底有哪些文件
rpm -qV package-name 來驗證這個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