每一個可以努力的日子,都是一份厚禮。
編程
Code is Poetry.
Git tips: 合併 commit 保持分支幹凈整潔
2015 12月 25th
本文的讀者需要已經了解 基本的 Git 操作和開發流程。
在我們開發完分支後,一般分支上會有很多 commit —— 少不了諸如 “fix typo”, “sth wrong in the previous commit” 之類的 commit。在合併到主幹的時候,往往這類 commit 顯得臃腫多餘。為了方便別人做 code review,我們希望合併一些不必要的 commit 使我們的分支顯得乾淨一目了然,也方便管理。有 3 種方式可以做到。
在 Yii2 項目中使用 Composer 添加 FontAwesome 字體資源
2014 6月 21st
前天幫同事改個十年前的網站 bug,頁面上一堆 include require 不禁讓人抱頭痛哭。看到 V2EX 上的討論說,寫 PHP 不用框架等同於耍流氓。Yii Framework 是我使用了 2 年多的 PHP 框架,器大活好,皮實耐操。 Yii2 還在 Beta 中,不過不影響拿來預研。
這回要說的是,如何給 Yii2 項目添加外部資源(external assets),以 FontAwesome 為例子。
將代碼庫從 SVN 遷移至 Git 並保留所有 commit 記錄
2014 5月 15th
公司內部原本使用 SVN 進行版本控制,但隨着 Github 的流行我個人的代碼管理習慣逐漸轉變。雖然公司項目並非開源,SVN 所具有的標準 trunk / branches / tags 結構完全夠用,使用 Git 仍然有如下優勢:
- 類似 GitHub 的 GitLab 免費管理工具。將代碼託管在自己內部服務器上的同時,提供了優美的 web 界面,圖形化分支結構,更直觀的代碼審查,統計、issue 系統、wiki 等功能全面集成。
- 更方便主程做 code review,控制代碼質量。創建主倉庫,多人開發時使用 fork 模式,每個人擁有自己獨立的 repo,獨立的 trunk / branches,最後發送 pull request 進行代碼合併。
- commit 和 push 更快。體現在 push 到遠程倉庫時 Git 會先對所有需要上傳的文件進行 zip 打包壓縮,然後一次性傳輸,在遠程服務器解壓,全部自動完成。而 SVN 則是一個一個文件地上傳,代碼是純文本,總體積並不大,但是大量零碎的小文件頻繁建立網絡連接造成延遲。這在升級第三方的庫或者框架時,成千上萬的文件更新更加讓人難以忍受。
- hook 可以更方便做自動化部署。當然這個 SVN 也有。
權衡後我決定花時間進行代碼倉庫的遷移。代碼遷移並非簡單地創建 Git repo 把當前項目代碼一次性 commit 過去就夠了,因為 SVN 中存有長年累月的 commit 歷史記錄,丟失歷史記錄將對今後追溯 debug 造成非常大的麻煩,所以如何保留 commit 記錄就是遷移的關鍵。
基於 RESTful 接口的前端 MVC 架構
2013 6月 7th
該用 Abstract Class 還是 Interface?
2013 3月 30th
在編寫程序的時候我常常陷入糾結,一個抽象對象,到底應該定義成 抽象類(Abstract Class) 還是 接口(Interface) 呢?二者具有很大的相似性,甚至可以相互替換,難以選擇。在 Stackoverflow 上這個問題被問了很多次,各種編程語言的都有。而在 PHP 官網文檔 Abstract Class 和 Interface 章節下面的評論里,人們也是爭論不休。為了弄明白這個問題,必須仔細對比一下二者的區別和使用場景。
更多 >
作風問題
2013 3月 26th
測試驅動開發
2012 12月 9th
測試 是軟件開發中一個必不可少的環節。不管我們是否有意識到,其實我們經常都在做測試工作。比如最原始的在代碼中插入 echo $variable
查看變量值,簡單粗暴而有效。當然,PHP 也會有 XDebug 這樣的工具,可以做到單步調試,不過要在服務器上安裝再配合好本地一個 IDE 和瀏覽器一起運作,始終不是那麼方便。
我們實現了一些複雜邏輯後,總會要輸入一些數據,來確認程序是否能給出預期的結果,頁面是否正常展示。更高級的開發者會寫一些代碼來自動完成這個測試過程,這樣一來每當我們需要測試一些東西的時候,只需要調用測試腳本,就能直接獲知結果了。這就是所謂的 自動測試。
軟件測試已經發展為一個獨立的工種,黑盒、白盒、單元測試、功能測試……流程都比較規範化了。隨着軟件開發過程的不斷演變,各種方法論層出不窮,類似的名詞包括:敏捷開發、持續集成、XP極限編程、結對編程、TDD……一般談這些概念的時候都會被大牛黑出翔來,比如酷殼博主 @左耳朵耗子 發表過這樣一條微博:
不會寫程序的人來搞什麼軟件開發諮詢,SQA,流程設計,軟件項目管理,全是扯蛋。所以,程序員應該要像 Linus 一樣自信的對這些人說:“Talk is cheap, show me the code.”
習總書記教育我們:
空談誤國。
我想聊一下 TDD。我必須聲明我並非想借技術名詞炒作概念。自從上次一篇 關於MVC的討論 被新浪 SAE 的微博大號轉發後,引來口水無數,各種被噴。其實我也只是初學者,談談自己對編程的理解,希望能嘗試一下不同的實踐方式而已,最終想法和所有開發者一樣,都是要提高代碼質量和生產效率。
轉換 HTML 與 PDF 格式文檔的神器
2012 10月 31st
企業 Web 項目開發中經常會有生產 PDF 格式文檔的需求,例如 PDF 賬單下載,月末生成各種統計報表等等。我們要幫助企業實現自動化,也就是說無需人工干預,程序能夠按需從 DB 中拿數據自主生成。
項目使用 PHP 開發,於是調研了一下 PHP 的 PDF 類庫,有 dompdf,TCPDF 之流,總的來說,各個項目主頁上自誇的成分居多,基本思想都是類似的,即先用 HTML 寫一個模板,每次往模板里填上數據,就可以轉成 PDF 輸出。但真正用起來就會發現各種毛病各種坑爹,部分 CSS 屬性不支持啦,中文亂碼啦,諸如此類。最終讓我們拋棄 dompdf 的貌似是分頁的一個大坑,據說一個表格 <table> 標籤在跨頁的情況下,dompdf 就直接崩潰了……
約定優於配置——軟件開發的簡約原則
2012 9月 15th
工作快滿 1 年了。在剛從 CUHK 畢業的時候,我還滿懷悲壯地表示在中文大學飽受摧殘,各種 assignments projects 所寫的代碼已經超過了整個在武大的四年。而現在,wc -l 顯示的數字已經可以讓我十分蛋定,這一年的代碼量已經超過了過去所有學生時代的總和。回過頭來看一年前寫的代碼,真是慘不忍睹,恨不得把當時的自己拉出去暴打一頓。確實走了很多彎路,但我也因此收穫頗豐。
感觸之一就是怎樣編寫漂亮整潔的代碼。我曾經說過,我是個完美主義者,寫博客的時候我要檢查以防出現錯別字,寫代碼的時候我會特別注意變量命名是否規範,甚至代碼縮進是否對齊。這大概已經屬於強迫症的治療範圍了。在現實項目開發中,整潔漂亮 意味着用最少的代碼,實現完整的業務功能,同時代碼是易於理解的。然而隨着時間流逝代碼不斷被修改,系統設計的整體結構則逐漸衰弱。編碼從嚴謹的工程墮落為隨性地胡亂砍劈。不重構,軟件就會慢慢腐爛。這一切是如何發生的呢?
使用 Nginx 的 X-Sendfile 機制提升 PHP 文件下載性能
2012 6月 20th
很多時候用戶需要從網站下載文件,如果文件是可以通過一個固定鏈接公開獲取的,那麼我們只需將文件存放到 webroot 下的目錄里就好。但大多數情況下,我們需要做權限控制,例如下載 PDF 賬單,又例如下載網盤裡的檔案。這時,我們通常藉助於腳本代碼來實現,而這無疑會增加服務器的負擔。