软件开发方法论的二十六篇经典

短文奉上原文和译文地址,书籍则附上豆瓣读书的地址以便购买。
尽量为所有的读物都附上了维基条目,没有维基的附上作者的介绍,方便了解写作背景。

豆列请戳这里

1. 文章 1968 《Goto语句有害》 中文译文 英文原文 中文维基 英文维基
2. 书籍 1968 《计算机程序设计艺术》 豆瓣读书 Google图书 中文维基 英文维基
3. 书籍 1971 《程序开发心理学》 豆瓣读书 Google图书 n/a 英文维基
4. 文章 1972 《谦卑的程序员》图灵奖获奖演讲 中文译文 英文原文 中文维基 英文维基
5. 书籍 1975 《人月神话》 豆瓣读书 Google图书 中文维基 英文维基
6. 书籍 1979 《哥德尔、艾舍尔、巴赫》 豆瓣读书 Google图书 中文维基 英文维基
7. 书籍 1981 《计算机编程科学》 豆瓣读书 Google图书 n/a 英文维基
8. 书籍 1982 《追求卓越》 豆瓣读书 Google图书 中文维基 英文维基
9. 文章 1985 《战略防御系统的软件部分》 n/a 英文原文 n/a n/a
10. 文章 1986 《没有银弹》 n/a 英文原文 中文维基 英文维基
11. 书籍 1989 《软件失控》 豆瓣读书 Google图书 n/a 英文维基
12. 书籍 1994 《如何避免被计算机伤害》 亚马逊 Google图书 n/a n/a
13. 文章 1994 《不成熟的CMM》 n/a 英文原文 中文维基 英文维基
14. 文章 1996 《软件设计宣言》 n/a 英文原文 n/a n/a
15. 书籍 1997 《死亡之旅》 豆瓣读书 Google图书 n/a 英文维基
16. 文章 1997 《大教堂和市集》 豆瓣读书 繁体译文 中文维基 英文维基
17. 书籍 1999 《软件的极限》 豆瓣读书 Google图书 n/a n/a
18. 书籍 1999 《软件创新之路》 豆瓣读书 Google图书 中文维基 英文维基
19. 书籍 2000 《软件阴谋》 豆瓣读书 Google图书 n/a n/a
20. 文章 2001 《敏捷宣言》 中文译文 英文原文 中文维基 英文维基
21. 书籍 2001 《Getting Things Done》 豆瓣读书 Google图书 中文维基 英文维基
22. 文章 2002 《设计决策》 n/a 英文原文 n/a n/a
23. 书籍 2004 《黑客与画家》 豆瓣读书 Google图书 中文维基 英文维基
24. 书籍 2004 《苹果往事》 豆瓣读书 Google图书 n/a 英文维基
25. 书籍 2004 《Joel说软件》续篇《软件随想录 豆瓣读书 Google图书 中文维基 英文维基
26. 书籍 2007 《梦断代码》 豆瓣读书 Google图书 n/a 英文维基

【 2014每月一模块 】Word::Segmenter::Chinese::Lite中文分词

前段时间给聊天室写叶贝斯过滤的时候,发现CPAN上居然没有中文分词模块。
好吧,我来贡献一个。
支持一元分词,二元分词,词典分词。
词典是内嵌的。不用大家去找了。

地址在此:Word::Segmenter::Chinese::Lite

用法依然简单:


use Word::Segmenter::Chinese::Lite qw(wscl_seg wscl_set_mode);

# 默认使用词典分词 
my @result = wscl_seg("中华人民共和国成立了oyeah");
foreach (@result)
{
  print $_, "\n";
}
# got:
# 中华人民共和国
# 成立
# 了
# oyeah
 
# 交叉二元分词
wscl_set_mode("obigram");
my @result = wscl_seg("中华人民共和国成立了");
foreach (@result)
{
  print $_, "\n";
}
# got:
# 中华
# 华人
# 人民
# 民共
# 共和
# 和国
# 国成
# 成立
# 立了
# 了
 
# 一元分词
wscl_set_mode("unigram");
my @result = wscl_seg("中华人民共和国");
foreach (@result)
{
  print $_, "\n";
}
# got:
# 中
# 华
# 人
# 民
# 共
# 和
# 国

关于分词本身,没啥可说的,这次扯两句闲篇吧。

现在ES很火,以前lucene很火。其实多对于很小应用(比如说我们4000万日PV网站的搜索)来说,它们都过于杀鸡牛刀了。自己实现其实更加轻松写意。
最关键的是,牛刀在大多数时候,并杀不好鸡。

曾经GFS很火,现在golang又很火,凡是Google挺的东西都会很火。
曾经lucene很火,现在hadoop又很火,Doug Cutting的东西都会很火。
其实我想说lucene的实现并不咋地,性能也相当一般。
GFS在为我们所知的时候其实也就那样。Google放论文出来时,那架构已经并不先进了。
过两年,Google自己就放弃GFS了。可一堆舔臭脚的还在玩命捧。
现在的hadoop其实也一样。

我就不明白,干嘛总会有所谓“热门的技术”。
这些技术的火爆,到底是因为真的精准命中所有人的业务,还是因为Google和Apache主席双重爆点导致的呢?
干嘛总会有“用xxx软件就是所有人干xxx事不约而同的解法”。
难道咱们的世界里,需求同质化真有如此严重?

我就很烦这些事。其实太多东西有更简单解法。

以上就是今天凑字数的内容。

【 Perl 】序列化方法横向简评

以下模块是经测评后,每种序列化方法中速度最快的。
如:测试YAML::Syck和YAML::XS,后者比前者快,所以只列出后者。

JSON::XS

反序列化速度: 0.41 secs
序列化数据大小:3.6 M
序列化数据描述:一个大单行无二进制的字符串
主观评价:性能最优。但是大单行用vim处理起来压力略大。

Storable

反序列化速度:0.45 secs
序列化数据大小:4.1 M
序列化数据描述:包含二进制数据
主观评价:二进制数据不太方便手动修改和阅读

PHP::Serialization::XS

反序列化速度:1.55 secs
序列化数据大小:5.3 M
序列化数据描述:模样很像JSON,也是个大单行。但因描述数据的类型,比JSON大很多。
主观评价:平庸,速度略慢

YAML::XS

反序列化速度:2.08 secs
序列化数据大小:3.8 M
序列化数据描述:自带分行的非二进制数据,在n多分行符的前提下依然做到了第二名的体积,厉害。
主观评价:唯一一个序列化出来的字符自带分行的,这样vim编辑的时候压力很小。可惜反序列化速度实在有点慢。

Data::Dumper & Data::Dump

反序列化速度:3.28 secs
序列化数据大小:13 M
序列化数据描述:非二进制数据,也是分行的。但是中文会用’\x{56c1}’的形式表达。
主观评价:虽然使用是最最方便的,但速度实在太慢。

Google::ProtocolBuffers

反序列化速度:n/a
序列化数据大小:n/a
序列化数据描述:包含二进制数据
主观评价:不能任意序列化对象,需预定义数据结构。

Storable::AMF0 & Storable::AMF3

反序列化速度:n/a
序列化数据大小:n/a
序列化数据描述:包含二进制数据
主观评价:此模块年久失修

XML::Bare

反序列化速度:n/a
序列化数据大小:n/a
序列化数据描述:XML不用多说了
主观评价:

1、不能任意序列化对象,无初始化方法。
2、此模块虽然也有序列化功能,但更偏向反序列化。

【 2014每月一模块 】【MaxMind::DB::Writer::FromTextFile】打包MaxMind格式的IP库

猛一抬头,5月都快过完了。这个月里有三天用来写了个Varnish扩展,根据来源IP查所在地。

之前我们是用nginx的geo模块做的,这个插件能帮助我们去掉nginx这个组件,从而提高性能也减少句柄数。

调研时发现了以下情况:

1、GeoIP已经升级到了第二代。存储格式改名叫了MaxMindDB,C的API也从libgeoip改成了libmaxminddb;

2、分别用libgeoip和libmaxminddb的默认模式写了两个例程。单次查询前者耗时20ms,后者耗时2ms。新版性能优势明显;

3、它们有读文件模式,也有共享内存模式。

见过几个查IP的数据结构和算法实现,包括公司自己用的和一些其它公开的SDK。自己也曾实现过。

各方面libmaxminddb都是我眼界中最好的。果断基于它来实现Varnish扩展。

那么剩下的问题就是,如何把自己的IP库打包MaxMindDB格式。人家的IP库是收费的,而且就算买了,也不可能说就放弃修改之的能力。

所以本月的模块就是给Perl提供将文本格式的IP库打包成MaxMindDB的能力。

模块地址在此https://metacpan.org/pod/MaxMind::DB::Writer::FromTextFile。用法一如既往的简单。

use MaxMind::DB::Writer::FromTextFile;
mmdb_create($input_filename, $output_mmdb_filename);

其实MaxMind公司在Github上是托管了一个写MMDB格式的代码的,而且正是基于Perl的。本模块也依赖那代码。那代码坑挺多的,对环境的要求略严苛。编译的过程中给我找了不少麻烦。不知是不是因为这个原因没有发布到CPAN,我把这个模块传到CPAN后他们还给我发信要求我把namespace留给他们……希望他们可以尽快把代码整理好发布到CPAN吧。如果MaxMind迟迟没有行动的话,也许后面几个月,我还能再交一个关于他们的CPAN作业呢。^_^

好消息是,MaxMind公司已经把MaxMind::DB::Writer发布到了CPAN。

下期预告

前段时间做聊天过滤的时候发现CPAN上居然没有中文分词模块。

六月的作业我会把之前写的中文分词代码整理一下交上来。

mac编译ffplay备忘

1、ffplay用的是SDL,不是SDL2;

2、SDL依赖XQuartz,所以需要先安装它;

3、SDL在Mac os x 10.9上——”error: conflicting types for ‘_XData32′”,编译不通过。
还好这是个已知BUG,官方patch在此https://bugzilla.libsdl.org/show_bug.cgi?id=1769;

4、SDL还是不过——”error: unknown type name ‘CGDirectPaletteRef’”。
网友patch在此https://bitbucket.org/gennady/ja2-stracciatella/issue/54/sdl-1215-wont-compile-on-os-x-109;
和此http://www.emaculation.com/doku.php/compiling_sheepshaver_basilisk#tidbits;

5、这些patch也可以在我这里打包下载mac-ffplay-sdl-patch.tar到。

【 2014每月一模块 】【Carp::Perror】退出信息中去掉堆栈信息

4月公司事略多,搭进去不少周末。

而且,心态上有点失去激情……

眼看四月期限将近,只能交一个简单的作业了。

模块名字叫做Carp::Perror,程序示例如下:

#!/usr/bin/perl
#perror.pl
use Carp::Perror qw/perror pexit/;
perror("wrong argv given\n");

用起来就像这样:

[chengang@local]# perl perror.pl
wrong argv given
[chengang@local]#

略讲一下这个模块的动因。

无论是die还是Carp,都会带出一大堆堆栈信息。

如果你像我一样,检测到了错误想要退出程序,又不想爆出一大堆堆栈信息,无谓地让用户产生不稳定的感觉。

又不想重复地写很多两行的——

print "error msg\n";
exit 0;

试试Carp::Perror模块吧。

备注一下questhub.io地址:https://questhub.io/realm/perl/quest/52a55e519f567ab87a000016,登录邮箱:m163。

xcode5.1使用ffmpeg-lib

1、编译ffmpeg;
configuration: –enable-ffplay –enable-nonfree –enable-gpl –enable-version3 –enable-postproc –enable-swscale –enable-avfilter –enable-libmp3lame –enable-libvorbis –enable-libtheora –enable-libfaac –enable-libxvid –enable-libx264 –enable-libvpx –enable-hardcoded-tables –enable-shared –enable-static –enable-runtime-cpudetect –enable-pthreads –disable-indevs –cc=clang

2、加一个编译选项,如下图红框;

3、将下图蓝框中的内容拖拽进xcode,下面那个蓝色的部分有的需要从TARGETS – General – Linked Frameworks and Libraries里面添加;

ffmpeg-xcode51

这些文件拖拽之前都需要先拷贝到项目文件夹里面来。