[转载]创造者的品味

一月 10th, 2011 评论关闭

本文是 Paul Graham 写于2002年的一篇文章,虽然经过了那么长时间,但这篇文章依然没有过时。恰恰相反,随着技术的高速发展和软件开发的日益工业化,文中的观点更显得有价值。现在越来越多的开发者变成了写代码的“机器”,而不是一个“创造者”,二者的区别就在于,“创造者”对美是有追求的,从而大大提高了软件质量。正如《Unix 编程艺术》中所说的那样:“美在计算机科学中的地位,要比在其他任何技术中的地位都重要,因为软件太复杂了。美是抵御复杂的终极武器。

原文地址 | 译文地址

翻译:王新米

“在美学上对地心说,是哥白尼拒绝托勒密天文学体系的重要原因。” ——托马斯·库恩,《哥白尼的革命》

“在凯利·约翰逊的训练下,我们狂热的相信他的主张:一架看上去很美的飞机飞的也会很美。”——本·里奇,《臭鼬工厂》

“美是第一道测验:对丑陋的数学而言,这个世界上没有永恒之地。”——戈弗雷·哈罗德·哈代,《一名数学家的辩白》

我最近和一位在麻省理工教书的朋友聊天。他教的领域很热门,每年都会被那些毕业要读研究生的学生的申请给淹没掉。“他们大部分看起来挺聪明的,”他说。“但我不能确定他们是不是有品味。”

品味。现在很少听到这个词了。但是无论我们怎么称呼它,我们依然需要明确这个概念。我朋友的意思是,他希望他的学生不仅仅是好的技术人员,还能够运用技术知识,去设计出美好的事物。

数 学家们直呼出色的工作是“美”的,过去或现在的科学家、工程师、音乐家、艺术家、设计师、作家、画家也如此。这仅仅是他们碰巧用了同一个形容词,还是他们 指的东西其实是有重合之处的?如果真有重合之处,那我们是不是能够利用在一个领域里对“美”的探索经验,去帮助我们在另一个领域里进行探索?

对我们这样的设计者而言,这不仅仅是理论问题。如果的确存在一个东西叫做“美”,我们需要有能力去辨识它。我们需要好的品味,去做出好的东西。与其将“美”视作抽象的概念进行喋喋不休的谈论,我们不如直接将它归纳为一个实际的问题——怎样才能创造出美好的事物?

如 今,当你提起“品味”这个词,很多人会告诉你:“品味是主观的”。他们相信美感对他们来说是一种直觉。他们喜欢某些东西,却并不知道为什么——可能是因为它很漂亮,或者自己妈妈曾经拥有一个,也  阅读全文...

《色.戒》

十一月 5th, 2007 评论关闭

     张爱玲的小说本是写的极好的,拍电影的人却太俗气,把好生生的一个故事,摆弄成了“少儿不宜”的限制级。

但这回看完《色戒》,散场的时候却不像上次看《狙击手》那么意犹未尽。上次是看的兴高采烈,过瘾,这次却没有任何的反应?旧上海的弄堂,奔驰的人力车,汤唯的旗袍,梁朝伟的毫无表情的脸,本都是好的,可是组合到一块,在萤幕上晃来晃去两个多小时,便倦了,乏了,无趣了,无聊了。

故事中不合情理的地方太多,到最后,结局却是最真实的一种。

阅读全文...

看病记

十月 10th, 2007 评论关闭

        从前天晚上看完李连杰的最新电影《游侠》开始,右眼就感觉有点发痒。到昨天上午对新视频搜索后台进行压力测试的时候,眼睛不停的流泪,几乎看不清屏幕。幸亏压力测试进行的还算顺利,通过修改一个 决定如何取得摘要的参数(从动态生成改成超过长度直接截断),检索后台的承压能力从10个并发每秒提升到40个并发,而且 io 的压力仍然不是很大,只是 cpu 不够用了(后台机器是一个普通的双核机器,硬盘都没有做 raid,只是把服务分散到 4 块不同的硬盘上而已)。这样我们能够确定等播客搜索的后台切换到新系统上来,后台还可以精简下 2 台机器(把当前 2 台独立的合并机器撤下来,合并服务放到检索服务机一起)。

测试结束后,我立即打电话问人事部门关于我的医疗保险卡的问题。幸运的是,医保卡刚刚发下来了。在一堆未整理的卡片中翻出自己的医保卡和条形码,自己往上面贴了照片,拿着就往中关村医院跑。

医院居然是下午 5 点下班,5 点以后就算急诊了——真黑!而且中关村医院这种社区医院急诊没有眼科!于是打车去北医三院。

挂号 5 块,诊疗费 6 块,开了一小瓶从日本进口的滴眼液,28.83 。一个小小的结膜炎,一下子就花去了 40 块。医生最后叮嘱道:如果这两天眼睛有发红或者发肿的现象,赶紧再来复查一下。心里想,医院真是个吃钱的地方,想想中关村修电脑一般都是检查不要钱,修不好也不要钱,可这医院,随便看看就算检查过了,开个药,也不管“修”的好“修”不好,先收了钱再说。

不过人去医院看病,图的就是个心安。开个药,也不管是不是真的管用,看了医生,用了药,心里踏实了,过一两天,病就真的好了。

周五去体检,好好检查一下。

阅读全文...

密码保护:流水账

七月 2nd, 2007 评论关闭

这是一篇受密码保护的文章。您需要提供访问密码:

密码:

阅读全文...

密码保护:毕业

七月 2nd, 2007 评论关闭

这是一篇受密码保护的文章。您需要提供访问密码:

密码:

阅读全文...

我们为什么吵架?

六月 22nd, 2007 评论关闭

有一位名人在博客上说:任何一种稳定关系都是奴役与被奴役的关系。在感情中同理,也是主动和被动的关系。如果还没有确定,就要通过吵架、离家出走等等手段来确定地位。

两个人明明相爱,往往最不惮以直接强硬的态度对待对方。大到经济大事、百年树人育儿方针,小到今天晚上吃馒头还是面条,都有可能发生激烈争吵,仿佛和自己最亲密的人针锋相对才显得格外有成就感,还是最在乎的人就彼此最挑剔?

据说,某些吵架是前戏的一种,似乎没有哪对儿男女不曾经历过。俗话有很多,什么上牙还有碰下牙的时候,大多数人还都认同小两口打架不记仇这一句。但 是,这并不意味着就可以肆无忌惮口无遮拦。有很多男女因为一件微不足道的小事,最后吵成劳燕纷飞的怨偶;还有的人吵起架来,就好象按下了REPLAY键, 在某些事件中反复循环播放,无休无止。亲爱的,难道我们不能吵一场有技术含量的架吗?

我们为什么要吵架?

那么那么爱,当初含在口里都怕化,为什么现在可以面目狰狞的吼叫或目中无人的冷战?难道还是因为过于爱。

两个人互相尊重爱慕,但不意味着在他们在所有问题上选择一致的态度。相遇之前,他们有不同的 生活背景;他们的学识、职业、气质都决定了看问题的角度并不一致,甚至,仅仅是男女有别,都会在一个看法上产生偏差。那么,两个人的生活该怎么过?于是每 个人都会提出自己的意见,但是对方并不同意,于是需要互相说服。当问题被看得比较严重尖锐的时候,说服的过程也比较激烈,那么,这个过程就叫吵架。说到 底,因为这个人是自己最爱的,因此希望他/她可以按照自己的生活方式和思维模式来认同服从—-跟外人说,人家才懒得理你呢。因此,吵架可以被视为批着 感情外衣的杀熟行为。仔细分析各种各样的吵架原因,难道不是都要求对方跟着自己的思路走听自己的话吗?

所以,回到前面所说的,当男女关系中一方以绝对优势压倒另一方占据主动权的时候,被动方百依百顺,两个人肯定是吵不起来的。只有势均力敌都觉得自己 有道理,并且觉得人家天经地义要听自己的话的时候,才会滔滔不绝的辩个不休。可是,爱人是用来宠爱心疼的,为什么一定要叫人家服服帖贴呢,应该还有另外的 婉转方式吧。

Continue reading »

开源搜索引擎简介

五月 29th, 2007 评论关闭

搜索引擎的工作流程主要分为三步:从互联网抓取网页→创建抓取网页的索引库→从索引库中进行搜索。

首先需要一个能访问网络的爬虫器程序,依据URL之间的关联性自动爬行整个互联网,并对爬行过的网页进行抓取收集。当网页被收集回来后,采用索引分析程序进行网页信息的分析,依据一定的相关度算法(如超链接算法)进行大量计算,创建倒排序的索引库。索引库建好后用户就可以通过提供的搜索界面提交关键词进行搜索,依据特定的排序算法返回搜索结果。因此,搜索引擎并不是对互联网进行直接搜索,而是对已抓取网页索引库的搜索,这也是能快速返回搜索结果的原因,索引在其中扮演了最为重要的角色,索引算法的效率直接影响搜索引擎的效率,是评测搜索引擎是否高效的关键因素。

网页爬行器、索引器、查询器共同构成了搜索引擎的重要组成单元,针对特定的语言,如中文、韩文等,还需要分词器进行分词,一般情况下,分词器与索引器一起使用创建特定语言的索引库。它们之间的协同关系如图1所示。

而开放源代码的搜索引擎为用户提供了极大的透明性,开放的源代码、公开的排序算法、随意的可定制性,相比于商业搜索引擎而言,更为用户所需要。目前,开放源代码的搜索引擎项目也有一些,主要集在中搜索引擎开发工具包与架构、Web搜索引擎、文件搜索引擎几个方面,本文概要介绍一下当前比较流行且相对比较成熟的几个搜索引擎项目。

开源搜索引擎工具包

1.Lucene

Lucene是目前最为流行的开放源代码全文搜索引擎工具包,隶属于Apache基金会,由资深全文索引/检索专家Doug Cutting所发起,并以其妻子的中间名作为项目的名称。Lucene不是一个具有完整特征的搜索应用程序,而是一个专注于文本索引和搜索的工具包,能够为应用程序添加索引与搜索能力。基于Lucene在索引及搜索方面的优秀表现,虽然由Java编写的Lucene具有天生的跨平台性,但仍被改编为许多其他语言的版本:Perl、Python、C++、.Net等。

同其他开源项目一样,Lucene具有非常好的架构,能够方便地在其基础上进行研究与开发,添加新功能或者开发新系统。Lucene本身只支持文本文件及少量语种的索引,并且不具备爬虫功能,而这正是Lucene的魅力所在,通过Lucene提供的丰富接口,我们可以根据自身的需要在其上添加具体语言的分词器,针对具体文档的文本解析器等,而这些具体的功能实现都可以借助于一些已有的相关开源软  阅读全文...

百度之星三

五月 27th, 2007 评论关闭

2007年5月26号

百度之星编程比赛 第二题 数7

#include
#include

//int maxa=10002, maxb=10002, maxc=240003, maxd=2001;
#define maxa 10002
#define maxb 10002
#define maxc 240003
#define maxd 2001

int a[maxa], ra[maxa], b[maxb], rb[maxb], c[maxc];

int main()
{
int digit[10];
int x,y,z,n,mc,mra,mrb;
int i,j,k,kk,flag,f;
char s[6];

memset(a, 0, sizeof(a) );
memset(ra, 0, sizeof(ra));
memset(b, 0, sizeof(b) );
memset(rb, 0, sizeof(rb));
memset(c, 0, sizeof(c) );

// calc for req1 and first half of query n
for (i=1, k=1; i 0)
{
if(kk % 10 == 7){
flag = 1;
ra[k] = -1;
break;
}
kk = kk / 10;
}
if(flag == 1) continue;
a[i] = k;
ra[k] = i;
++i;
}
mra = k-1;
// calc req2 and last half of query n
for (i=1,k=1; i 0)
{
f = kk % 10;
if(digit[f] == 1)
{
flag = 1;
rb[k] = -1;
break;
}
digit[f] = 1;
kk = kk / 10;
}
if (flag == 1) continue;
b[i] = k;
rb[k] = i;
++i;
}
mrb = k-1;
// calc req12
mc = 0;

for (i=1,j=1,k=1; (i<maxa) && (j<maxb) && (k<maxc); ++i,++j,++k)
{
while(a[i] != b[j])
{
while (a[i] b[j]) ++j;
}
c[k] = a[i];
}
mc = k-1;
// read in data and resolve
for (i=0;  阅读全文...

百度之星二

五月 27th, 2007 评论关闭

2007年5月27号

百度之星编程比赛 第四题 inurl 高级查询

#include
#include
#define maxn 9999
#define maxstrlen 258

int m,n;
char site[maxn][maxstrlen], inurl[maxn][maxstrlen];
char str1[maxstrlen], str2[maxstrlen];
char *pos;

int main()
{
int i,j,k;

memset(site,”,sizeof(site));
memset(inurl,”,sizeof(inurl));
scanf(“%d”, &n);
for(i=0; i<n; ++i)
{
scanf("%s %s",str1, str2);
strcpy(site[i], (str1+5)); // filter site:
strcpy(inurl[i], (str2+6)); // filter inurl:
//printf("n site[%d]:%s inurl[%d]:%s n", i,site[i],i,inurl[i]);
}
scanf("%d", &m);
for(j=0; j<m; ++j)
{
scanf("%s", str1);
strcpy(str2, (str1+7)); // filter http://
pos = strchr(str2, '/');
strcpy(str1, pos);
*pos = ''; // str1 is now inurl and str2 is only site
//printf("site: %s inurl: %s n", str2, str1);

k = 0;
for(i=0; i<n; ++i)
{
if(strcmp(str2, site[i]) == 0)
{
// printf("site %s write!n", str2);
pos = strstr(str1, inurl[i]);
//printf("strstr(%s, %s) func return: %sn", inurl[i], str1, pos);
if(pos != NULL)
{
k = 1; // found!
break;
}
else{
//printf("pos is %sn", pos);
}
}
}
if (k == 0) printf("0n");
else printf("1n&  阅读全文...

百度之星一

五月 27th, 2007 评论关闭

2007年5月27号

百度之星编程比赛 第一题 百度时间

#include
#include
#include
#define MAX 25

int y,m,d;
char str[25];
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int runnian(int yy, int flag)
{
int nian=0, i;
if (flag == 1) // after
{
for (i=2000; iyy; i+=flag)
{
if (i % 400 ==0 || (i % 4 == 0 && i % 100 != 0)) ++ nian;
}
}
return nian;
}

int daysafter()
{
int yy,dd,mm,days=0;
yy = y – 2000;
if(yy >= 1)
{
days += yy * 365;
days += runnian(y, 1);
}
for(mm=1; mm= 1)
{
days += yy * 365;
days += runnian(y, -1);
}
//printf(“before, year %dn”, days);
for(mm=m; mm<=12; ++mm)
{
days += month[mm];
if (mm == 2){
if(y % 400 ==0 || (y % 4 == 0 && y % 100 != 0)) ++ days;
}
}
//printf("before, month %dn", days);
days -= d – 1;
return days;
}

int main()
{
int i,j,k;
while (1)
{
scanf("%s", str);
if(strchr(str, '/') != 0 && str[2] == '/' && str[5] == '/')
{
sscanf(str, "%d/%d/%d", &m, &d, &y);
}
else if (strchr(str, '-') != 0 && str[4] == '-' && str[7] == '-')
{
sscanf(str, "%d-%d-%d", &y, &m, &d);
}
else
{
printf("Errorn");
continue;
  阅读全文...

无觅相关文章插件,快速提升流量