为什么想到开发BQYAHOO
8月份的一天,我从网上得知雅虎中国开通了1G邮箱。当我把这个好消息告诉周边的同事时,他不以为然的说,他早就申请了好几个。我不甘落后,几分钟后,我的第一个雅虎中国1G邮箱到手了。
从今天看来,已经有很多邮件服务提供商开通1G邮箱,不过,总的来说,还是雅虎中国最为痛快,申请最为方便,不像有些邮件服务商还要求收集什么网络邮票之类的把戏。
面对这个我有史以来所拥有的最大邮箱,我不知该做些什么,平时都使用公司的邮箱,基本需求都已经得到满足。另外雅虎中国邮箱还不支持OUTLOOK(后来我听说有办法让它支持,不过我没有去尝试),很是不方便。
我在网上试图寻找一些和雅虎邮箱相关的信息的时候,无意之中看到了软件:YahooPOPs!。这是一个很酷的软件,对于雅虎服务器来说,它是一个网页浏览器;对于OUTLOOK来说,它是一个邮件服务器。我个人认为,它的创意和功能都是一流的(网上也有传言说它工作不稳定)。
当我知道它还是一个开源软件时,一个想法在我的脑袋里面产生,我可否用它的源代码做点事情?最终,我想用它的功能之一(对于雅虎服务器来说,它是一个网页浏览器)写一个共享文件软件。我的同事对我的想法依然不以为然:“不就是一个网络优盘软件,网上多的是!”。
其实,我个人认为BQYAHOO和网络优盘软件有着很大的不同:
l 目的不同。网络优盘软件是给自己用;BQYAHOO用来朋友间共享文件。
l 速度不同。这个是最关键的要素,网络优盘软件大多使用POP3协议,在速度上上不去!而BQYAHOO的速度则只取决于你和雅虎中国之间的速度,这和HTTP下载差不多(其实还是差一些,无法多线程下载)。
抱着这个不成熟的想法,我开始了BQYAHOO的开发。
如何共享
目前存在着很多文件共享机制,比如FTP、BT和Maze等等。应该说这些共享机制已经相当成熟稳定了,那为什么我还要插上一脚了。最现实的原因就是,这些共享方式我都用不上。且不说共享文件给别人下载,就是下载别人共享出来的文件都很困难,其中最主要的原因就是我在内网,而且这个内网的管理相当苛刻(或者应该说相当安全)。最终,我发现如果是HTTP下载的话,我这里倒是没有问题。
在下载雅虎邮件的附件时,我惊奇的发现这个过程是由IE来完成的,也就是说它是一种HTTP下载,这也是BQYAHOO最本质的地方。
为了使用雅虎邮件共享文件,我“杜撰”了一套加密解密“手续”,可以保证下载者只能下载你愿意让他下载的附件却不能进入你的邮箱。这样,你只要将信息发布在某个网页上,别的网友就可以下载你邮件中的附件,此时无所谓你是否在线,这也是和那些P2P软件的差别。总的来说,我希望BQYAHOO成为一个使用HTTP协议的类FTP软件。这么说是不是很酷?
艰难的开始
为了编写BQYAHOO,我必须先阅读开源软件YahooPOPs!,弄清楚它是怎么和雅虎服务器进行交互的。在阅读源码的过程当中,最大的困难就是源码无法在VC中正常编译。我琢磨了很久,唯一的原因就是缺少相关头文件和库文件。最后我只能用记事本来阅读源码。
紧接着第二个困难来临了,YahooPops!使用了各种开源的函数库,其中大部分我以前都没有听说过。当时我确实产生了放弃了想法,因为熟悉这些函数库也是一件很麻烦的事情,而且没有必要。最终我选择:只参考程序基本过程,使用微软公司提供的常见的类库来重写代码。
不一样的本地化
在开发BQYAHOO的过程当中,我突然意识到YahooPops!的源码对于雅虎中国来说不一定使用。在中国的服务器不一定和美国的服务器反应完全一致(出于简化考虑,BQYAHOO只针对雅虎中国开发)。最后,我不得不使用一些获取网络封包的软件对雅虎中国服务器的HTTP信息进行分析。这正印证了中国的一句老话:“师傅领进门,修行靠个人”。
实际上,BQYAHOO只使用很少的YahooPops!源码,大约30行,其它内容要么被改写,要么就被本地化(你可以在BQYAHOO源代码当中看到相关标示)。
痛苦的测试
为了尽快的证实自己的想法可行,我首先写了一个命令行程序。经过一个星期的自愿加班,终于走到测试阶段。当我在自己的机器上运行成功后,感到无比的高兴,一个星期的付出总算有回报。可是接下来的几天,我有从天堂跌落到地狱,在网友的帮助下,我不断的发现BUG,最让人无可适从的就是,明明在自己的机器上没有问题的程序,在别人的机器上漏洞百出。
测试过程让我明白了什么叫做质量。红红火火的只考虑功能的编程方式很显然不是获得高质量的好办法。不过在那个时候,功能优先是我不二的选择。为了方便测试,我又设计了日志类,并且将它嵌入到已有的代码当中,获取程序运行时的各种数据。因为程序是在别人的机器上出错,没有办法调试,只能靠日志。
不断的分析网友传过来的日志文件,不断地修改程序,终于一位网友成功地在一间网吧机器上测试成功,测试阶段才算告一段落。在测试过程当中我获得以下两点认识:
l 最难发现的错误就是那些想当然的错误。比如说:我在自己的机器上一口气申请了五个雅虎中国邮箱作测试,可偏偏这五个邮箱的邮箱网址都一样,类似http://cn.f157.mail.yahoo.com/ym/login?.rand=******,于是我认为别人申请的邮箱和我也一样,或者说整个中国大陆地区的用户都一样。事实上,这个想法完全错了,许多网友申请的邮箱与我的不同,比如:http://cn.f156.mail.yahoo.com/ym/login?.rand=******。正是这个原因导致许多网友抱怨可以下载我共享出来的歌曲,却无法自己共享文件。当我在查看网友发过来的日子文件时,“新奇”地发现这个f156,只能目瞪口呆。
l 测试可以使自己更了解自己的程序,提高和完善自己的编程水平。这个没有什么新意,但确实是我亲身体会。多次的对同一段代码进行“鸡蛋里面挑骨头”,让我总结出许多个“以后再也不XXX”。
不情愿的美化
当我把可以正常工作的BQYAHOO V1.0发部在网上时,我感到很兴奋,还特地为它写了一份很长的帮助文件。可是,网络上的反响让我很失望。事后分析,这种反响太正常了,我竟然期待别人会去尝试使用一个命令行程序。
其实我不是完全不会写GUI,只是一想到自己要去使用MFC类库,就有一种无法抑制的心烦。倒不是我不懂MFC(《深入浅出MFC》是我的启蒙读物),只是在了解它之后,被它的复杂性所吓倒。而且对于这样一个昨日黄花的庞然大物,我实在提不起兴趣去使用它。这个时候我再一次打起了退堂鼓,反正功能实现了,没有人用也无所谓,只要自己高兴就得了。冷落了BQYAHOO几天,我还是鼓起勇气为它写一个GUI。有时候想,BQYAHOO就像我的孩子(生活上,我还是单身L),为它作件花衣裳也是应该的。
排除了MFC类库,我所面对的选择似乎只剩下WTL了。对于这个微软非官方类库,以前我略有耳闻,当时没有想到,我会有使用它编程的可能性。看完了经典的网络教程《WTL for MFC Programmers》,我便开始制作“花衣裳”。
一切都很顺利,我故伎重演,从网上下载了一个类OUTLOOK界面的WTL源码。为了简化编程,我把那些复杂的功能(例如自动隐藏)一一砍去。最后,当我将整个消息网“编织”完成,剩下的就只有填充代码了。
在这个过程当中,我感到扎实的技术功底的重要性(我不是只说自己)。我曾经花了很长时间去阅读一个WIN 32 API帮助文件(英文版,从微软网站上下载的)。当时完全就是凭兴趣,没有想到会用上。但是在学习和使用WTL的过程当中,它们帮了我很大的忙。WTL本质上就是“封装”,如果你对它想封装起来的内容有所了解,自然不容易迷失。
看到窗口版的BQYAHOO V2.0,对比以前的命令行BQYAHOO V1.0,确实让人感觉亲切多了。连我自己也很愿意和BQYAHOO V2.0打交道。在编写GUI的过程当中,我认识到以前轻视用户界面编程有多肤浅,使用VC写一个花样新颖的界面也是一件很不容易的事情。
让人难堪的安全问题
BQYAHOO当中存在着一个简单的加密解密过程。很多网友对这个环节感兴趣,不断的询问是否安全,我的回答当然是“很安全”(为自己脸红一下)。可是,一天早上,一位网友实在忍受不了我的自我感觉良好,亲自为BQYAHOO写了一个外挂,最终这个外挂居然可以自动地给出邮箱的用户名和密码,此时BQYAHOO还可以正常工作!
“人外有人,天外有天”。面对这种情况我不知道是该高兴还是该沮丧,高兴的是有人居然会为我的软件写外挂;沮丧的是我的软件太脆弱了。痛定思痛,我找到问题的原因(实际上是外挂编写者给我指出的)。在编写BQYAHOO时,为了方便编程,减少负担,我将所有的加密解密功能统统制作成动态链接库。这样做往大了说就是模块化编程,通俗的说就是为了写主体功能时省心。
解决问题方法就是将所有的动态链接库去掉,将加密解密功能放到主体执行文件里面。这样做多少增强了安全性。
借力打力
BQYAHOO中有一个很有趣的功能,那就是利用OUTLOOK来上传文件。很明显,对于BQYAHOO来说,下载容易,上传麻烦。为了共享一些文件,你需要按照一定的要求来向自己雅虎邮箱发送邮件。掌握其中的规则对于最终用户来说既繁琐又没有必要。这样,一个需求产生了,BQYAHOO需要自己来发送邮件。
其实发送邮件的功能,有很多控件都已经实现。我想那些网络邮盘软件也或多或少使用了这些控件(我猜的)。可是,我不想这么做,这样,我又要为发送邮件“负责任”。这个时候我想到了MAPI。它非常符合我的需要。其整个过程就相当于BQYAHOO告诉OUTLOOK该发送哪些邮件,然后由OUTLOOK来发送邮件。打个比方来说,BQYAHOO负责填表格,OUTLOOK类似于打印机,负责打印表格。这样一来,既方便了用户,又利用现成的OUTLOOK提供了有保障的发送电子邮件功能。不过,在实际使用当中,很多用户表示自己不会配置OUTLOOK。看来微软公司在软件易用性还需再接再厉啊。
BQYAHOO除了借用OUTLOOK的功能之外,还借用了WinRAR,使用它来分解大文件。
总结
本文只是简单的对BQYAHOO的开发过程进行了叙述,下面的文章会对这个软件进行更加深入的讲解。总的来说BQYAHOO是一个很讨巧的软件,实际上,它的最为核心的功能都是由雅虎中国提供,BQYAHOO只是为用户作了一个“壳”。不过这也说明了为什么有人总是说“好的想法很重要”。
如果你看到这里,对怎样编写这个软件感兴趣,我建议你到“天空下载”网站去下载BQYAHOO,并且试用它。另外,压缩包里面的帮助文件《共享雅虎,交流乐趣》也很有用,阅读它对于你了解接下来的文章很有用处。