你的网站 ICP 备案了吗?

写这篇文章的时候,是苦笑着的。

半年前,就为 perlchina.org 尝试备案,后来却告知审核不通过。既然可以访问,那就不了了之了。昨天一早到公司,气氛就非常紧张,两台虚拟主机的 IP 被封了。这是什么概念?几百个客户的站点都无法访问,连备份数据出来都不行。还好不是邮件系统的服务器,不然死得还要难看。我们还算好,edong.com 被封了 80 个 IP,不抓狂才怪。

备案的出发点是好的,不过方法绝对欠妥,效果呢,天知道。网上有人说“搞违法勾当的网站可以不备案,直接迁到国外的服务器,安分守己的网站备案了,可有什么意义呢?”,所以,强制封锁 IP 搞备案,结果就是分流,好人还在国内老老实实的混,坏人都到国外去了,那么是不是这样就能杜绝恶意冒名网站,色情网站呢?显然不是,互联网是全球的,所以这样做毫无意义。

中国人的一个传统思想,就是喜欢堵,不喜欢疏。不可否认,堵是有效果的,我今天就老老实实地再次提交了备案申请。电信如果不大面积下毒手,我依然不愿意去做这件无聊的事情。不过这件事情做的一点儿也不高明。毛泽东问:猫最讨厌辣的东西,如何才能让猫自己去吃辣,还要吃得高兴,吃得满足?身边的人无从作答,于是老毛说,很简单,把辣椒往猫屁股上抹,它辣的不行就会去舔,还舔得特别来劲。

去看看流量统计站点上对 miibeian.gov.cn 的图表,一天几百万次的 pageview,多么具有讽刺意义啊。所以我只好苦笑。这次封 IP 是蛮横的,只要某个没有备案的域名指向到某台服务器,只要这台服务器在 80 端口有所相应,就封。结果就是宁可错杀一万,也不放过一个。受害的都是好人。我们有个客户气急败坏的说,“我们的物流系统在上面,如果不能用,在海上的船只不能正常调度,是要死人的!!”或许有点夸张,可事实确实如此。除此之外,邮件系统被封掉的话,很多公司通过邮件往来业务,其损失决不是一两块钱的小事。所以这次动作,所造成的连锁反应不亚于一场自然灾害。唯一能从中盈利的就是电信–我们要电话通知客户,我们要接客户的怒气汹汹的电话,一个接一个,数不胜数,电信则站在旁边笑嘻嘻的看着我们两个,每一秒钟,它都有进帐。现在备案站点发送短消息也都已经阻塞,延迟得厉害。

你可以去看看这个备案站点,粗糙的不行。再看看源代码,还是粗糙的不行。简直让我看不下去。这也就罢了,既然要人家来备案,那就把这套系统作的专业一点,现在好多客户反映,因为没有受到相关的邮件或者短信,或者莫名的审核不通过,或者石沉大海。我也替客户着急,人家是好人,人家也低声下气得来交上自己的族谱了,你却不理不睬,置之不理,还不许解封。这是要急死人的。

我想这次真的搞大了,信产部骑虎难下,不知道有没有台阶下。这次风波尚未结束,唯一的好处就是,充分活跃了我们公司的气氛。

关于项目实施的思考

很多项目在我手里,大都超出时间计划。老婆说我虎头蛇尾。

不错,软件项目的特殊性,导致了许多不可预测的因素,包括技术以外的东西。有时候确实可用此来冠冕堂皇的宣称这不是我的错。而项目延期,对于任何一方,都是风险和成本的徒升。作为项目管理和项目开发于一身的我,在要求高质量和高速度之间,自己打自己的耳光 — 想想看,用自己的矛戳自己的盾,无论如何都不会使自己快乐。

不过,既然是存在的问题,我们就要去解决。实践或者市场决定一切。否则再完美的程序都不过是玩具,至多是比较高级的玩具罢了。

数据结构中,对于二叉树的搜索基本上可以分为广度优先搜索深度优先搜索。开发也与此类似。程序员通常都希望自己的作品尽善尽美,想得到的任何瑕疵都必须解决,而且实现方法要优雅睿智。个人项目没有人会来管你,商业项目就不能这样做了。这不是说,商业项目就不要求高质量,高度扩展性和灵活性等,只是说开发的目标并非质量第一优先级。最近实施的若干项目中,member.perlchina.org 和 gongdan.9speed.com 是在广度优先的理念下开发的。用时较短,目标明确,相对简单。在广度优先的前提下,项目可以快速开始,快速结束。如果有存活的需要,则再不断迭代修订发布。在项目管理中,这称为瀑布式开发 — 在一开始的时候就发布一个基本可用(可能是问题多多)的版本,然后不断根据新的目标,回转下来修订,立即发布。不断重复这个过程。这种做法,对于开发者,比较容易建立信心和成就感,不易疲劳,对于销售,也可以更好地与客户沟通或谈判,对于老板,也会更乐意给你更多的薪水。

说起来容易做起来难。这种方式在一年多前我就明白,却从未像现在这样明白得透彻。一方面是心理惯性,总希望完美,总希望不要出纰漏。另一方面由此而陷入深度优先的模式,于是扎在一口口深井中很难自拔。所以,要改变这种情况,就要不断告诉自己,先把东西做出来,框架和原型县都出来,然后发现问题了再来修订,现在存在问题没有关系,如果怕忘掉就记一笔 TODO。只要足够多的修订,最终可以无限逼近完美。要告诉自己,你永远都不可能达到完美,所以现实点,最需要什么,就先做什么。广度优先。

从技术上来说,一方面要尽量使用工具来生成代码。另一方面使用 trac + svn 工具,不断提交阶段性成果,可以建立良好的信心和成就感,也便于项目管理和监督。从工作方法上来说,在项目开始前,制定若干里程碑,定好到达这个里程碑的项目进展程度和时间进度,而后在每天的开发中,不断的设定短期目标。比如想想看,一个小时内可以完成什么,然后在接下来的时间里集中精力解决问题,逼近该目标。不断关注时间,看看还剩下多少时间,还有多少工作没有问题,适当的调整自己的目标。一旦完成后,就该立即 svn 提交到仓库,理清项目中的文件等。决不要拖,如果现在都懒得去整理,更不用指望将来某个时候比现在更清楚这些文件的用途和意义,所以,趁热结束这一阶段性开发。然后休息。然后继续这个往复的过程。实践下来,开发人员也比较容易处于兴奋的状态,生产效率比较高。

另外,为了确保质量,一定要重视测试先行。一般小的项目可能成本较高,但真正可用的测试却可以免除许多不必要的调试时间和人力。没有测试就没有质量。所以说测试先行。否则就不能称之为项目。同样的,web 应用的测试感觉比较难做,还有许多必须人工来做(比如界面效果),okey,没问题,有多少测试就先写多少 — 最基本的功能,连接等等。以后发现 bug 了,就加上对该 bug 的单元测试,以避免前天解决的问题,在今天改了别的东西后又出相同的问题,然后重复调试深入解决已经解决过的 bug 。同时养成习惯,在每次修改完代码后,都作一次完整的单元测试,没问题了才提交到仓库。

先说到这里吧。

Google Ads

一些 Perl 模块

Chatbot::Alpha

公司内部要做个简单的工单流转,我突然想到用 MSN 来提示接手人,MSN 的 bot 倒是可以用了,我又想把它弄得聪明些,正好看到这个模块。不过不知道对中文的解析判断如何,anyway,应该是个好的起点。这是个人工智能应答系统。

Class::Meta

通常自己构建对象都用 Class::Accessor ,简单实用,可以快速构建用来存储/读取对象数据的对象方法。也可以自己重载相应的 Accessor 然后对某些数据作验证。Class::Tangram 则是让你自己定义某些对象的数据结构,然后再用这些定义好的 scheme 生成的类来快速构建复杂的对象。而 Class::Meta 则把两者结合起来,加上 Params::Validate ,成为一个通用的,定义对象数据或者类属性,并带有数据合法验证机制的,代码生成工具。这样,我们可以更快的构建项目原型,只需告诉它我想要做什么,而不用考虑如何去做。

Unix::PID

系统管理员比较关心这个。一般大家的做法是用 ps 看当前运行的进程的 pid ,然后 kill 。如果情况比较复杂,比如有一堆进程需要处理,可能需要些个简单的 shell ,sed 后 awk ,想办法弄出 pid 然后再处理。或者有些进程会写个 .pid 的文件,保存着当前运行的 pid 。不过既然有了这个模块,我们应该更抽象地去做这些事情。让它来帮助处理常见的工作。更灵活,也更易扩展。

Catalyst Advent Chinese

http://catalyst.perlchina.org/calendar/

花了点时间,export 出官方版本,并 import 到 svn.perlchina.org 。并略做翻译和部署,中文版本的站点上线了。驱使我做这件事情的动力有三点:

  • 我不想每次都要从头传教。有了中文文档,我可以说,自己看文档先。
  • 我是懒人,总喜欢看到现成的、归纳过的中文版的资料。
  • Google 广告收入。虽然老婆埋怨我从没收到过钱,但我告诉她生活要有信念。

Agave

Agave – 用 Catalyst 做的 Blog 系统。源代码在这里

还没用过。值得关注一下。有多了个可以学习借鉴的例子。

Catalyst 的法语文档

http://dab.free.fr/perl/catalyst/doc/Catalyst.html

虽然我看不懂法语,不过这篇文档给出了许多具体的例子,这些例子多少也还是可以给人一点启示的。于是很有冲动做一个中文的。不过我这个人就是比较冲动,所以经常虎头蛇尾。先解决温饱再说。这个月开始交房贷了,20年每个月的支付的细目被打印出来很长的清单,足有7,8页。银行真黑,第一个月的3000有三分之二是利息。这使我不由得深刻同情起杨白劳来。扯远了。

昨天提到的 Catalyst Calender 推出了 RSS — 当今标准站点必不可少的元素之一,hoho~

Catalyst Advent Calendar

Catalyst Advent Calendar,Catalyst 开发团队新搞出来的东西。去年有个 Perl Advent 站点,按照时间为线索,记录了 Perl 世界里面比较有影响的若干模块。不过好像今年没人搞那个,Catalyst 团队自己搞了个简单的站点来做这件事情。当然还是用 Catalyst 来构建,源代码在 dev.catalyst.perl.org 的 svn 仓库的 trunk/examples/ 里面。大抵上就是度取 Pod 文档,然后转化为 XHTML 格式输出。刚刚推出,所以很多功能待完善,或许就这样简洁明了了。基本上每天都会有文章介绍相关的一个主题。

喜欢 Catalyst 的另一个原因,就是可以让你每天都会发现新的东西(惊喜)。这种蓬勃的生命力刺激并带动着一大批人和项目。曾疑惑,Catalyst 版本更新得如此迅速,会不会让人因为不断升级而感到烦恼,而反过来,倘若没有生命力,更多的人会怀疑是否该继续使用一个可能不会及时修复 bug 的基础构件。世界在演变,cvs 再好,当越来越多的人转向 svn 的时候,总有一天,cvs 会退出历史舞台,成为博物馆的一部分。可悲吗?该是可喜。完成一段历史使命就是它的荣耀,只有因为存在过 cvs 才会催生出 svn。世界在更替中演变得越来越美好。人类的演化也是如此,所以需要人生病死亡。Catalyst 也是如此,它结束了 Maypole,也必将催生一个更文明,更进步的 Catalyst。