Archive for the '编程' Category

也算是敏捷开发的初步

比较早有敏捷开发的概念,或许也是不太正确的概念,是从那本经典的Ruby on Rails的教程上。至少体会到了快速开发的魅力,设计和开发几乎可以同步,包括测试。

ruby on rails的学习告一小小的段落,例子和实际的开发总还是有很大的差距。

最近在做一个不算太大的软件项目,在第一个版本发布后,给自己订下了一个目标,一周发布一个版本。而我需要在每周都完成功能设计、开发、测试、发布这些工作,有时候测试时候发现一些bug或者很好的建议,则流程就变得有所交叉。

很高兴之前基本做到了,连续三周发布了3个版本,目前我已经将周期降到2周一次了,的确软件越来越复杂,需要花费在开发上的时间也越来越多。

我用了以下的方法来保证完整既定的目标:
1 严格的执行特性列表管理,所有本版本要完成的记录在本版本(我用的是build)的特性列表中,然后另外有一个bug and fix来记录可以稍后完成或者还不知道能不能完成的特性。当本版本的特性基本完成后,就可以开始测试了。
2 内部测试小组。自己测试几乎是不太可能发现某些错误的,所以我现在有一个20个人左右由志愿者组成的测试队伍,每次都会有至少几位给我提出不少bug和建议,建议记录到下一个里程碑,bug记录到bug and fix,致命的bug是一定要修改的。这样的测试大概从内部测试版发布后每天一次,修改完错误后,将更新的版本再发布,这时候对于新的特性建议是冻结的,也就是不会进行任何新功能的开发。只有在第一次内部测试和第二次内部测试之间,允许进行新功能的开发,之后所有的时间只能进行bug的纠正。目前来看,最多3个内部测试版本基本就够了。然后就是发布。
3 在内部测试的过程中,我自己也会进行测试,windows软件的麻烦就是在不同的环境下可能会有不一样的表现,在开发环境中正确只能证明正确了一半。我建立了一个由四台电脑组成的测试网络,测试版本的同步是通过在每一台电脑上安装dropbox来容易的做到。我只要在一台电脑上将测试用的安装程序拖放到本机的dropbox文件夹,其他几台电脑就会在开机后的几分钟里同步下载好。当然,我也在本机建立了复杂的测试环境,模拟各个版本的升级操作,这个暂时还没有太好的办法。
4 版本管理是非常重要的事情,永远不要相信硬盘。所以每天将修改过的版本上传svn是必须的。为了保证开发工作的延续,需要准备至少一个后备的开发环境。

相关内容

不要犹豫,时间是不等人的

我有过很多梦想,却在一次次的犹豫中,错过了。

午夜的时候,望星空,同样的星群下,从前的错过就是错过了。

看到一篇文章说,一个人要成功,需要花费10000小时,每天努力3小时,坚持10年。人和人之间的智商区别不大,但这个1万小时,太伟大了。

想想这应该是有道理的,我做的一个软件,目前花费了2个月的业余时间,大概平均每天花费2小时,一共用了120小时,目前已经有了700位用户,如果我努力1200小时,可能有7000位用户,如果我努力12000小时,就可以有70000位用户,至少,我这个梦想实现了。当然,我现在采用了120小时,路还很长。如果这个软件6年前我不轻易放弃,那么按照每天1小时计算,我失去了2000小时,后悔药没有买的。

记得在2001年的时候,有过一个freedelphi.net的域名,2005年又开始用indelphi.net的域名,2007年又买了phpdelphi的域名,想做一个delphi的分享者或者布道者,毕竟在第一份工作的时候,主要是delphi让我完成了那些项目,让我有一点点的工作成就。可惜,都没有坚持下去,而这些域名也都不属于我了。今天下午,我用了4个小时,重新开始这个梦想,每天大约30分钟,如果从2001年坚持到现在,我又浪费了1000小时,也就是2000篇关于delphi的blog,这是惊人的数字啊,而恰恰这几年,delphi发生了那么多天翻地覆的变化。

有梦想,评估一下,努力一下,坚持一下,可以做到的,不要犹豫。我们的生命和星群相比,实在是微不足道,但是我们的那些梦想,可以伴随人类一直长久,像星光一样闪烁。

delphi forever_1226241455451

相关内容

delphi下teeChart显示中文的怪问题解决

teeChart是delphi下最强的图表控件,这几年也已经发展到了dotnet等环境下。teeChart在8.0版本中提供了简单的使界面中文化显示的功能,你只要在FormCreate事件中加入TeeSetChineseSimp;就可以了。

但是在实际使用中碰到一个怪问题,就是当程序运行后,第一次显示的使用teechart的窗口不能正常中文化,而第二次显示及以后就可以了。程序中包含teechart的窗口是每次需要的时候动态生成的。

我现在用这样的方法来解决,在主窗口生成的时候,先创建一次包含teechart的窗口,骗一下,之后程序内的调用就都是第二次之后了。当然要用show,这样才能马上关掉。

try
    frmChart := TfrmChart.Create(Application);
    frmChart.Show;
    frmChart.Close;
 finally
    frmChart.Free;
 end;

相关内容

转载:高效能编程的七个好习惯

转载自这里

1. 使用工具帮你找 Bug, 而不是人工找.

工具包括用单元测试, assert语句, 代码测试容器. 人工指用 print 和 debugger 一行一行跟踪. 我们知道, 编程中绝大部分时间是耗费在除 bug 上. 不同的人有不同的 debug 的方法. 我个人比较喜欢”极限编程(XP)” 学派的主义, 也就是说, 代码未动, 测试先行.

单元测试中的红棒绿棒(熟悉 JUnit 的读者知道我在说什么)一出现, 哪里出了问题就一目了然. 单元测试的另外一个好处在于增加写程序的自信. 以前没用单元测试之前, 每天晚上改代码改到很晚的时候脑子常常不灵活, 把代码改错, 然后第二天来还要重头弄. 有了单元测试之后每天晚上保证测试全部过掉, 这样心理踏实, 睡觉也香, 早晨也不忙, 吃饭也棒.

一般的语言都有 assert, 但是很少有人用. 其实 assert 是一个非常好的DEBUG 工具, C 的 assert 能够把哪一个文件哪一行出了错都告诉你. 不过我一般会自己写一个这样的 assert 宏:

#define ASSERT(value, msg) if (!(value)) {fprinft(stderr, “At file %s, line %d: \n message: %s\n”, __FILE__, __LINE__, msg); exit(-1);}

这样的 ASSERT 可以带一个信息出来, 比起原来只告诉你哪个文件哪一行更加有价值.

第三个是用容器帮你找 Bug. 这一点以 C/C++ 程序最为突出, 因为编译之后直接就是可执行代码, 运行时的信息不像 Java 和 Python 这样有 VM 的语言容易得到. 这时候, 我推荐 valgrind. 这个工具能够把 C/C++ 程序放到一个容器中执行, 记下每一个内存访问. 被这样的容器 debug 一下, 基本上指针指飞了 (Segmentation Fault) 的情况几乎就没有了. 想像一下是用 GDB 追踪非法指针和内存泄露方便, 还是用容器告诉你哪一个指针非法, 哪一个内存没释放方便 :)

2. 选用自动化工具构建

用 gcc 或者简单的 IDE 来编译和运行程序在编程初期是很快速的, 可是越到后来, 会越臃肿. 在编译的时候, 不同的参数, 不同的目标, 在 IDE/gcc 里面每次都要设定. 而且一般的 IDE 也不能做到自动解决依赖等高级方法. 因此, 最好的方法是用 Ant 或者 Makefile 管理项目. 这方面教程很多, 而且我估计编程的个个都知道. 不管项目大小, 注意频繁使用就是了.

自动化测试也有很多工具, 特别是 GUI 和命令行测试的自动化, 工具链都很完整. 大公司里的程序员走这方面的流程都比较规范(我在西门子实习过), 但是小一点的公司中, 或者个人搞小项目的时候, 就不一定想得起来了(大部分我见到的程序员就手工来测试). 手工测试看上去快, 但是要是积累的次数多了就比较浪费时间了. 其实自动化测试工具的学习成本很低的, 事半功倍.

3. 买本小书做参考, 而不是用 Google.

这是大实话. 我大三开始学 Python 的时候, 语言特性并不熟悉, 手头也没有书, 因此常常连取个随机数都要上 Google 查一下库. 我发现, 不管网络多快, 自己搜索技术多牛, 还是没有手头一本书方便. 后来打印了一个7页的标准库的 cheatsheet, 编程立即行云流水. 我在实习的时候也观察到, 大部分时候程序员不可能记住一个框架所有的API, 所以他们要不等 IDE 几秒钟做代码补全, 要不一边翻文档一边做. 或许MSDN 这些本地文档系统比查书快吧, 但是用 Google 和网络搜索绝对比书慢. 现在因为工作原因, 常常要学一些新的语言, 我做的第一件事情, 就是把他的库接口的网页全部打印了下来.

4. 用脚本语言开发原型

人月神话的作者 Brooks 说: 准备把第一版扔掉, 因为第一版必然要被扔掉. 这是大实话和真理. 既然第一版要被扔掉, 咱们就让第一版扔掉得越早越好. 说白了就是, 原型要快速的被开发.

所谓的快速原型开发, 大致有两个捷径, 第一是只做核心的功能, 输入输出都是构造好的简单的例子. 第二是只做最简单的情况, 对于性能和健壮性什么的都不太考虑. 这两点, 恰好是脚本语言最擅长的. 脚本语言擅长于用精简的几行构造出复杂的功能, 并且语法很松散, 潜在假设程序是正确的.

即使在代码编写阶段, 一些功能的实现, 也是要先写个简单的, 再慢慢打磨成复杂的. 脚本语言此时依然有用. 比如我在用 Java 的时候, 常常不确定一个函数返回的对象究竟某个属性是什么样的值. 这时候我就会用 Java 的 bsh 脚本写一行打印, 而不会写一个复杂的 out.println 再编译再运行再把那行删除掉. 当然, 这几年很流行动态语言, 原型和产品之间的差距已经变得很小了.

5. 必要的时候, 程序要使用清晰的, 自我解释的文本文件作为日志输出.

不知道各位调试程序的时候是不是和我一样, 看到不确定的和要跟踪的变量就直接插入一行 print. 我以前一直这样做, 但是频繁的插入这样的打印会使得屏幕的输出很乱, 不知道哪行是什么意思. 一个更加好的办法是写一个日志函数, 可以分也可以不分优先级, 总之保证 Debug 的时候的输出以一种统一的, 可管理的方式出现. 这样, 在最后发布稳定版本的时候, 只需要简单的几行命令就可以从代码中剔除所有的日志打印行.

如果必然要输出日志, 最好要分配一个单独的命令行参数, 用来控制程序究竟输出不输出日志, 输出哪些日志. 一开始看上去这个是费时费力, 越到后来日志越多的时候, 就体会到方便之处: 有时候你只想要某一类日志, 可是其他的记录偏偏来捣乱. 多加一个参数可以使得程序更加灵活, 根本不需要去修改代码或者条件编译就能得到不同级别的程序日志.

日志和程序的输出结果一定要清晰且能自我解释, 否则不如没有日志. 我切身经历是这样的: 几个月前, 我一个程序跑了大约一天, 最后输出了很大的日志和结果. 但是很不幸的是, 结果里只有数字, 没有任何说明. 我自己都忘了每一行是什么意思. 而且更加麻烦的是程序的输出藏在重重判断和循环之内, 使得根本没有办法分析这一行输出对应的输入是什么. 于是, 最终只能再次浪费一天的时间让程序再跑一次. 经过这次教训, 我的程序日志和结果中插入了不少让人可读的内容. 这样, 即使程序丢失了, 结果还是能够被人解读的.

更多的关于数据和程序结果要能自我解释的精彩论述, 可参见 More Programming Pearls 第四章.

6. 使用命令行小工具操控分析你的结果和代码, 而不是用自己的眼睛和手.

我发现, 人有一个固有的习惯, 就是喜欢自己去”人工”, 而不喜欢用工具. 因为人工让人感觉工作更加刻苦, 更加快, 更加有控制感. 比如说吧, 上面我说的测试, 我就不只一次见到为了测一个交互式的命令行, 一个程序员宁愿老是每次打相同的三个命令, 而不愿意用一个简单的 expect. 再比如说, 面对长长的日志文件, 我见到很多人都是用文本编辑器直接打开, 用鼠标滚轮一行一行的往下翻, 而不是使用 grep. 包括看网页, 很多人从来不用查找功能, 而是一行一行的往下瞄. 包括打游戏也是, 好的UI脚本(不是外挂)一大把, 可是玩 WoW 的人很少用, 都喜欢自己重复点鼠标.

别看上面说的这些好像程序员没有, 其实我们常常陷入这个误区. 举个简单的例子, 一个 python 程序里面有十几个 print 函数, 我们想把这些打印全部灭掉, 一般人会打开文件慢慢瞄, 稍微高级一点的用查找, 找到了, 用快捷键删掉整行. 其实最好的方法根本都不要编辑器, 应该用 grep -v. 或者 sed, 但是这样的方法极少会有人用的. 我也是强迫自己无穷多次之后, 才渐渐的用这套快速的方法.

7. 程序能跑就是万岁. 除非万不得已, 尽量不要在性能上优化你的代码

Knuth 名言: Premature optimization is the root of all evil. (提前优化是万恶之源). 一般我们写代码的时候, 不知不觉的就会觉得, 哎呀, 这样写效率不高, 我要构造一个数据结构啥啥. 随机访问一定要哈希表, 排序一定上快排, 查找一定要二分, 强连通分量一定要用 Tarjan 算法, 动规一定比穷举好等等, 这些竞赛的时候极限情况下正确的论断其实在实际环境中并不重要, 因为做编程的一开始关键是能跑, 而不是跑得快. 往往这么以优化, 程序很难 debug, 倒是还要去翻算法导论和TAoCP 看人家的二分怎么写的等等.

在程序能跑的情况下, 优化也要特别小心. 我曾经有一个程序, 大约有 90% 的运算是查表, 只有 1% 的是乘法, 另外是一些判断和把插到的结果插入到一个集合中. 我的查表是用的最土的 list.index. 按照正常的想法, 应该把这个优化成哈希表. 而实际上我用 profile 工具一看, 才知道, 原来是插入到一个集合的操作费时间, 因为每次都需要 extend, 涉及到很多内存分配的操作. 我做过非常多的 profile 测试, 没有一次不出乎我预料的. 程序运行时间总是在自己不认为浪费的地方被浪费掉. 因此, 就算万不得已优化, 也务必要先做一下 profiling. 我喜欢 python 的地方就在于, 他的 profiling 只需要一行语句就完成了, 而且结果具体干净. 其他的语言, 至今没见到这么简单的 profiling 工具.

另外: 用两个或者大于两个显示器. 不要用或者少用鼠标.

相关内容

Delphi Prism 要来了

Delphi Prism就是在visual studio中直接使用delphi语言进行dotnet开发的项目。Borland和微软斗了那么多年,最后居然产品这样的合作,反正delphi也不是Borland的了,再说分久必合,这道理用在国外也一样,没有永远的敌人,只有永远的利益。

更多信息请看这里

相关内容

谁家语言将成为Google App Engine的下一个宠儿?

转载自这里

* Service for storing and serving large files
* Datastore import and export utility for large datasets
* Billing: developers can pay for more resource usage
* Support for a new runtime language
* Uptime monitoring site

顺便看看社区的民意,Java、PHP和Ruby名列三甲!

从技术角度来讲,PHP和Ruby应该较Java在现阶段更易于实现;但从业界支持的角度来看,Java占据了企业级应用的主流,而PHP代表着Web开源社区的倾向,似乎是两难的选择呀;纯粹从语言本身来看,Java应该更适合Google的战略布局。

这个语言想必Google内部早已有了定论,并且已在紧锣密鼓的赶工中,留给大家YY也不会改变任何东西了。虽然从感情上更倾向于Java,但我还是认为PHP的可能性最大。

相关内容

主观,和其他

晚上写一个程序的时候,碰到一个奇怪的问题,原本一个没有问题的地方,突然出现了错误,具体来说,分节号呈现的数据会莫名其妙的缩小,比如1,200会变成1,而小数也不能正常输入。我首先想到的是使用的edit控件有问题,我用的是raize,上周我将raize从4升级到最新的5.0,可能raize控件有bug,查了一下官方网站,没有报告。于是又测试了文本控件没有问题,而其他类似的可以输入float类型的控件也不能正常输入小数。于是拆下raize 5,重新安装raize 4,中间还重启了windows一次。奇怪的是一切没有变化,还是不对。将近3个小时过去了,试了很多方法,包括调试跟踪,一无所获。突然我发现原来应该是1200.00的数字是被错误的呈现为1200,00。会不会是小数点的默认符号被修改了,而在windows的区域设置中可能有这方面的设置,打开控制面板一看,果然不知道最近安装的那个程序干的,将默认的小数点的那个点修改成了逗号,造成了前面出现的种种怪问题。因为从来没有想到过小数点这个点还会有问题,绕了一个大圈子。

突然感悟到,生活中面对很多结果,我们有时候会很主观,总认为是这样或者那样的,而真相可能完全出乎意料,很简单,很偶然,但是不是我们想象中的那样子。而因为我们的主管和武断,即便是内心中的,也会造成猜忌、隔阂、嫉妒等等。

平常心,包容心,宽容心。不要以为自己总是对的,用自己的有色眼镜来看待别人看待事物。

相关内容

delphi将以插件形式支持visual studio

从这里看到,很难说这是不是一个好消息,总的来说还不算坏吧,至少像我这样的delphi铁杆粉丝以后就可以用delphi语言在vs下开发dotnet应用了。

YES,你没有看错!刚刚看到的这个消息,综合整理一下 Marco Cantu 和 Dr.Bob 的 Blog 文章如下:

1 下一版 Delphi.NET 名为 Delphi Prism。Nick 在论坛中证实这是正式名称,而非代码名;
2 这是一个全新的产品,用 Visual Studio Shell 开发,将是一个 Visual Studio 插件;
3 Delphi Prism 将是 RAD Studio 2009 套件的一部分(Delphi 2009 + C++Builder 2009 + Delphi Prism);
4 他将是新一代的 Delphi 在 .NET 平台上的解决方案,完全支持 .NET Framework 3.5,包括 WinForms, WPF, Silverlight, WCF, ASP.NET, LINQ;
5 整合 Datasnap 2009,支持 dbExpress for ADO.NET;
6 Delphi Prism 只以订阅方式销售,在订阅期内可自由升级新版本;
7 在本月末的 PDC 上可能会对外公布这一产品,年底前会上市

我几乎没用过 Delphi.NET,但看到这个消息,有点吃惊,也有点兴奋,吃惊的是很意外,想必 CodeGear 做这个决定也不容易啊,呵呵~~;兴奋的是这是一个正确的确定,因为在 .NET 下,Visual Studio 就是 NO.1;Delphi Prism 成为 Visual Studio 插件以后,市场拓展将更加容易些,同时产品开发上也能紧跟 .NET 步伐,同时也可以使用 Visual Studio 自身强大的 IDE 功能和很多的第三方资源,比如说扩展、控件等。

这个产品应该很早在 CodeGear 内部开发了,之前的开发代号好像是 Clemson;正式版离上市最多也就只有两个月,Beta 测试也已经开始了,有兴趣的可以去 CodeGear 网站申请。

相关内容