Release Notes 撰寫說明
當一個項目升級時,需要寫一個文檔紀錄這次變動,內容包括,新增了什麼,更改了什麼,修復了什麼,未解決得問題,改善了什麼,忽略了什麼
常用信息類型
New Changed Fixed Unresolved Improved Ignore
例 1.1. Example - Release Notes
NEW - xxxxxxxxxxxxx CHANGED - xxxxxxxxxxxxx FIXED - xxxxxxxxxxx UNRESOLVED - xxxxxxxxx IMPROVED - xxxxxxxxx
你也同樣可以參考很多開源組織編寫的Release Notes,例如apache, mysql, php 等等
一種很蠢目錄規劃:
project project/library project/log project/tmp project/...
目錄規劃原則,臨時檔案分離,日誌分離,配置檔案分離;這樣有利於在負載均衡環境中克隆節點。
項目目錄/workspace/project
臨時目錄 /workspace/tmp/
日誌 目錄/workspace/log/
配置檔案/workspace/conf
版本庫佈局
多項目版本庫佈局
/-> branches .---> project 2 ---> trunk / \-> tags / / /-> branches repositories -------> project 1 ---> trunk \ \-> tags \ \ /-> branches `---> project 3 ---> trunk \-> tags
trunk 主幹,作為主幹你要保證他的代碼是可運行的。
branches 分支,代碼來自主幹,可以有很多分支,分支用於多個團隊同步開發,最終要將代碼合併到主幹。例如:branches/member, branches/blog, branches/shop 分別來自不同的團隊
tags 一般用於做快照,一旦建立永不更改
releases 發行本版,代碼來自主幹, 與tags功能一樣,命名更直觀。例如每個月為一個周期,發佈一次代碼 releases/v1.0, releases/1.5
.-----------------------------------------------------------------------> cart r100 ---> ... / ^ .----------------------> blog r3 ---> r4 ... ... r(10) ---> r(n) ---> r(...) --->/---> ... / ^ \ / .-> branches r1 ---> member r2 ---/---------> r4 ... r(10) --\----> r(14) ---> r(...)--/---> ... / ^ / \ \ \ / repositories ----> trunk r1 -----/----------/--------------> r(11) ---> r(12) ---> r(15) ---> r(...) ---> ... \ \ \ \ `-> tags r1 ------------------------------------------> v1.0.0 r(13) \ \ \ \ `--------------------------------------------------------------> v1.0.1 (r16) \ `--------------------------------------------------------------------------> v1.0.2 r(n)
.> unstable 2.1.1 / \ unstable 1.1 unstable 2.1 unstable 3.1 ^ \ ^ \ / \ .-> branches ---> unstable 1.0 ---/ \ unstable 2.0 ---/ \ unstable 3.0 unstable---> ... / ^ \ ^ \ ^ \ ^ repositories ----> trunk --------/-----------------> stable ---/-----> stable ---/---> stable ---/-> stable ---> ... \ \ \ \ `-> tags ----------------------------> stable 1.0 \ \ \ \ \ `-------------------------------------------------------> stable 2.0 \ `-------------------------------------------------------------------> stable 3.0
怎樣訪問版本庫
美工、頁面人員採用WebDav訪問Subversion。Photoshop,Dreamwaver 軟件對WebDav有很好地支持,他們不需要學習如何使用Subversion。
開發者通過Svn客戶端訪問代碼庫,既可以使用開發IDE整合工具也可以使用單獨工具。像TortoiseSVN等等。
Code Review
一對一代碼審查可以提高程序質量.
developer neo ---> coding ---> commit --->. / \ developer zen ---> review ' \ ---> svn repos developer neo ---> review . / \ / developer zen ---> coding ---> commit --->`
格式 ABCD
A: 編碼
1 用戶錯誤
2 網絡錯誤
3 系統錯誤
4 應用伺服器錯誤
5 應用程序錯誤
6 緩存錯誤
7 資料庫錯誤
8 搜索引擎
B 編碼
0 成功
1 失敗
剩餘 C D 用戶自行編碼
https://code.google.com/p/google-styleguide/ http://lxr.linux.no/linux/Documentation/CodingStyle http://perldoc.perl.org/perlstyle.html http://www.gnu.org/prep/standards/
http://www.php-fig.org
使用 UNIX 風格換行, 請在你的編輯器內調整
UNIX (LF或"\n") MAC OS (CR 或"\r") Windows CRLF \r\n
源碼檔案使用 UTF-8
有些IDE環境 UTF-8 BOM
if, while, for, foreach, do ... loop, switch... 等的嵌套必須小於等於3層
如下面的例子,可讀性極差。
if (xxx){ if (xxx){ if(xxx){ if(xxx){ if(xxx){ } } } if(xxx){ if(xxx){ } } } if (xxx){ if(xxx){ if(xxx){ } } if(xxx){ if(xxx){ } } } }
加以改造
func aaa(p){ if(p){ if(xxx){ } } } func bbb(b){ if(b){ if(xxx){ if(xxx){ } } } } if(xxx){ aaa(xxx) } if(b){ bbb(b) }
<?php /** * Project Name * * @author $Author: netkiller $ * @copyright Copyright (c) 2012 Company * @version $Id: chapter.coding.xml 584 2013-05-15 05:13:17Z netkiller $ */ <?php /** * Project Name * * @author $Author: netkiller $ * @license GNU General Public License 2.0 * @version $Id: chapter.coding.xml 584 2013-05-15 05:13:17Z netkiller $ */
雙引號要處理字元串轉義,性能上不如單引號,如果你不需要轉義字元串,或者字元串中不含原轉譯字元,建議你使用單引號
print("string")
每次輸出會檢索特殊字元串如: \r, \n, \t, \0xFF 等等
print('string')
使用pdo_mysql替代mysql
錯誤的寫法,通過字元串連結拼接sql語句極容易出現注入漏洞
$sql = "select * from table where id=".$id; $sql = "select * from table where id='".$id."'"; $sql = "INSERT INTO fruit(name, colour) VALUES ('".$name."', '".$colour."')";
正確的寫法
$sql = "select * from table where id=?"; $sql = "INSERT INTO fruit(name, colour) VALUES (?, ?)";
$sql = <<<____SQL CREATE TABLE IF NOT EXISTS `ticket_hist` ( `tid` int(11) NOT NULL, `trqform` varchar(40) NOT NULL, `trsform` varchar(40) NOT NULL, `tgen` datetime NOT NULL, `tterm` datetime, `tstatus` tinyint(1) NOT NULL ) ENGINE=ARCHIVE COMMENT='ticket archive'; ____SQL;
返回資料庫查詢結果有幾種形式
數組形式
Array ( [0] => banana [1] => yellow ) Array ( [NAME] => banana [COLOUR] => yellow )
對象形式
Object ( Obj->NAME Obj->COLOUR )
正確的使用方式
print($row[name]) print($row->name)
錯誤的使用使方式
print($row[0])
避免使用 "*"查詢,一會影響性能,二增加頻寬開銷
$sql = "select * from tab where status=0 limit 1";
如果程序使用$row[1]讀取結果,有可能當資料庫結構改變,增加欄位,欄位順序發生變化,輸出數據都會出錯
下面的例子,不會使用索引
$sql = "select id, name, created from tab where id != 100";
EXPLAIN select * from members where id != '1010'; 索引失效 EXPLAIN select count(*) from members where id != '1010'; 索引有效