每一个可以努力的日子,都是一份厚礼。
编程
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 账单,又例如下载网盘里的档案。这时,我们通常借助于脚本代码来实现,而这无疑会增加服务器的负担。