程序员幽默

1、程序猿最烦两件事,第一件事是别人要他给自己的代码写文档,第二件呢?是别人的程序没有留下文档。

2、程序猿的读书历程:x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—> 颈椎病康复指南。

3、还没上大学的时候,高三暑假,跑到家那边的图书城想买传说中的C++的书,然后看到一本C#,我一看,嘿,这个++还写得挺艺术的,重叠起来了,于是把C#买了回来……

4、问:程序猿最讨厌康熙的哪个儿子。答:胤禩。因为他是八阿哥(bug)

5、有一天,程序猿们突然发现他们要涨的工资掉到井里啦!大家都很害怕,连忙一个吊着一个,从树上伸到井里去捞工资。正好他们摸到工资的时候,一个老程序员忽然兴奋的大叫:别蠢了,要涨的工资还好好的挂在天上呢!

6、诸葛亮是一个优秀的程序猿,每一个锦囊都是应对不同的case而编写的!但是优秀的程序猿也敌不过更优秀的bug!六出祈山,七进中原,鞠躬尽瘁,死而后已的诸葛亮只因为有一个错误的case-马谡,整个结构就被break了!

7、生活中程序猿的真实写照、一款游戏一包烟,一台电脑一下午。一盒泡面一壶水,一顿能管一整天。

8、程序猿要了3个孩子,分别取名叫Ctrl、Alt 和Delete,如果他们不听话,程序猿就只要同时敲他们一下就会好的…

9、宪法顶个球!中国的法律都是.txt文件,不是.exe文件。

10、同事说,他在写i++的时候总觉的自己写的是 我艹………有木有同感????

11、程序员,年二十有二,始从文,连考而不中。 遂习武,练武场上发一矢,中鼓吏,逐之出。 改学IT,自撰一函数,用之,堆栈溢出。

12、《桃花庵–程序员版》写字楼里写字间,写字间中程序员; 程序人员写程序,又将程序换酒钱; 酒醒只在屏前坐,酒醉还来屏下眠; 酒醉酒醒日复日,屏前屏下年复年; 但愿老死电脑间,不愿鞠躬老板前; 奔驰宝马贵者趣,公交自行程序员; 别人笑我太疯癫,我笑自己命太贱; 但见满街漂亮妹,哪个归得程序员;

13、有一天某程序员去买肉,要了一公斤, 拿到公平电子秤上一称:”额。。怎么少了24克。。”

14、检验代码质量的唯一标准 = 代码review时骂的次数 / 代码review时间 。

15、杀一个程序员不需要用枪,改三次需求就可以了。

16、C++程序员看不起C 程序员, C 程序员看不起java程序员, java程序员看不起C#程序员,C#程序员看不起美工。周末了,美工带着妹子出去约会了,一群SX程序员还在加班。。。

17、问:如何生成一个随机的字符串?答:让新手退出VIM 。

18、“我给你出个脑筋急转弯,你说达芬奇密码的上面是什么?” “这。。太难了吧。。不知道。。。” “笨!达芬奇密码的上面就是达芬奇帐号啊,那达芬奇密码的下面是什么?”“我。。。这。。。还是不知道。。。”“是达芬奇验证码”。

19、随机函数可以帮你实现家庭和谐: Talk(){:top word(1)=”恩!”; word(2)=”好的!”;word(3)=”然后呢?”;word(4)=”有道理”;i=random(4); say word(i) goto top;}

20、程序员爱情观:爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

21、女同学们纷纷表示,这年头不找个程序员老公,还真是连节日低价购物权都没了。

22、Delphi象吉普车,什么路上都能开,却在啥路上也开不好;PB就象卡丁车,只能在固定线路上开,到室外就有些不稳;VC象跑车,你开得起却买不起,而且一旦发生故障,想修都找不到毛病在哪;Java象敞棚车,不管刮风下雨还是艳阳高照,都能照开不误;VB就是摩托车,骑的时间越长,你越痛恨它!

23、上联MYSQL明月三千里 下联: XHTML.信号他妈烂!

24、程序员的四大理想:南极有套房,澳大利亚有群羊,全世界电脑死光光,孩儿有个娘。

25、有一种崩溃叫密码输入有误;有一种惊慌叫做账号异地登陆;有一种感情叫隐身对其可见;有一种误会叫人机离线;有一种失落叫没有访问权限;有一种感情叫站点访问失败;有一种无奈叫bug无法复现。。。

26、黑体的锯齿,宋体的沧桑,崩溃的避头尾集。美工永远纠结于网站程序员的粗犷,就像MAC永远不懂PC的忧伤。。。。

27、程序猿追求MM不成,含泪追问:我在你眼里算什么?!MM答曰:真人版的windows优化大师……极客哥们莫伤心,小戴安慰递纸巾。

28、 据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。” 项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。” 软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”

29、【高效的程序员】当世界末日还有5分钟就要到来的时候。程序员: 让我们在这最后的时刻作些什么吧!女友: 那好,让我们在做最后一次吧!程序员: 那剩下的4分50秒做什么啊?

30、【开发时间】项目经理: 如果我再给你一个人,那可以什么时候可以完工?程序员: 3个月吧!项目经理: 那给两个呢?程序员: 1个月吧!项目经理: 那100呢?程序员: 1年吧!项目经理: 那10000呢?程序员: 那我将永远无法完成任务。

31、一个程序员对自己的未来很迷茫,于是去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”上帝说:“我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的”。于是他去问Lippman。Lippman说:“程序员的未来就是驾驭程序员”。这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”。上帝说:“我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的”。于是他去问Gates。Gates说:“程序员的未来就是榨取程序员”。这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”。上帝说:“我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的”。于是他去问侯捷。侯捷说:“程序员的未来就是诱惑程序员”。这个程序员对这个未来不满意,于是他又去问上帝。“万能的上帝呀,请你告诉我,我的未来会怎样?”。上帝摇摇头:“唉,我的孩子,你还是别当程序员了”。

32、面试官:“熟悉哪种语言”。应聘者:“JAVA”。面试官:“知道什么叫类么”。应聘者:“我这人实在,工作努力,不知道什么叫累”。面试官:“知道什么是包?”。应聘者:“我这人实在 平常不带包 也不用公司准备了”。面试官:“知道什么是接口吗?”。应聘者:“我这个人工作认真。从来不找借口偷懒”。面试官:“知道什么是继承么”。应聘者:“我是孤儿没什么可以继承的”。面试官:“知道什么叫对象么?”。应聘者:“知道,不过我工作努力,上进心强,暂时还没有打算找对象。”。面试官:“知道多态么?”。应聘者:“知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系?”。

33、IT工程师=加班狂+程序员+测试工程师+实施工程师+网络工程师+电工+装卸工+搬运工+超人,有同感的转走。

34、 用一句话总结了HTML,CSS,JS的关系。HTML是名词,JS是动词,CSS是形容词和副词。

35、我是个程序猿,一天我坐在路边一边喝水一边苦苦检查bug。这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱,然后接着调试程序。他可能生意不好,就无聊的看看我在干什么,然后过了一会,他幽幽的说,这里少了个分号。。。分号。。。分号。。。

36、女友对程序员说:“紫禁城占得地方好大呀!”程序员:“杀死那个子进程……”

37、从前有个全国管理系统,是孙中山做的设计,老蒋做的实现,结果老毛写了个病毒,趁着日本黑客对系统做攻击的当口,拿到了管理员权限,把原来那批程序员给隔离了。老邓接手以后,重构代码,出了个2.0版,为了开发速度,遗留了一堆BUG没处理。人们纷纷质疑:是不是核心构架太单一,双核会不会好点?

38、一程序员家的水管坏了,他打电话叫来一个水管工修理。 水管工鼓捣了一个小时,终于把管子修好了,他递给程序员一张600元的帐单。 “600元!”程序员愤怒地说:“我当程序员一天都赚不了这么多钱!” “是啊。”水管工平静地说,“我当程序员的时候也是。”

39、十年前,女:“对不起,我不会喜欢你的,你不要再坚持了,就好比让 Linux 和 Windows 同时运行在一台PC机上,可能吗?”男生听后默默走开,十年后,在一次虚拟技术大会上,我听到一名虚拟技术开发程序员给我讲述了这个故事。

40、程序猿问程序媛:”为什么要离开我,我做得还不够好吗?” 媛说:”别傻了,我们根本就是两个世界里的人,就像在JS里永远都无法调用JAVA类一样,我们之间也是不可能的。” 猿沉默了很久,转身离开了。一个月之后,他在开源社区公布了dwr的完整代码。

41、【程序员被提bug之后的反应】1.怎么可能; 2.在我这是好的,不信你来看看; 3.真是奇怪,刚刚还好好的; 4.肯定是数据问题; 5.你清下缓存试试; 6.重启下电脑试试; 7.你装的什么版本的类库(jdk) 8.这谁写的代码; 9.尼玛怎么还在用360安全 浏览器 ; 10.用户不会像你这么操作的。

42、敲一夜代码,流两行老泪;用三种语言,唯四肢受罪 ; 待五更鸡鸣,遇骤雨初歇;遂登门而去,伫十里长亭;欲望穿泪眼,无如意郎君;借微薄助力,愿寻得佳偶;成比翼双鸟,乃畅想云端;卷情网之内,做爬虫抓取;为连理桂枝,容数据分析;思千里子规,助框广天地; 念茫茫人海,该如何寻觅?

43、早晨一女生抱着一堆书进了阅览室,结果警报响了,大妈让女生看看是哪本书把警报弄响了,那女生把书倒出来,准备一本一本的测。大妈见状急了,把书分成两份,第一份过了一下,响了。又把这一份分成两份接着测,三回就找到了,大妈用鄙视的眼神看着女生,仿佛在说O(n)和O(log2n)都分不清。

44、发现程序员经常熬夜有三个弊端:第一,记忆力越来越差;第二,数数经常会数错;第四,记忆力越来越差。

45、医院回来的程序猿一脸的苦逼样。程序媛:怎么了?程序猿:得了类风湿性关节炎了,我怕会遗传给下一代啊。程序媛:谁说类风湿性关节炎能遗传的?程序猿一脸诧异:类不是继承的吗?

46、知道JAVA程序员和C程序员的差别吗?食堂里,吃完饭就走的是JAVA程序员,吃完饭还要自己 收拾的那就是是C程序员。至于为什么会这样、大家都明白(因为JAVA自带垃圾回收机制、、、C需要手动释放内存)←这就是原因

47、计算机系的男同学追班里一女同学,结果此女总是躲躲闪闪。 男的看没戏,就另找了一个去追,结果这女的不满意了,质问这男的为啥抛弃她。 男的问:“请教一个电脑问题,如果你点击一个程序,总是提示‘没有响应’,怎么办?” 女的说:“马上结束任务。” 男的:“对,我也是这样想的。”

48、一个程序员的吐槽:即要被当做修电脑的,也要被当作做网站的;即要被当作杀毒的,也要被当作盗号的。我要告诉大家,其实我们只是写代码的。

49、如果一个足球界的人“猝死”了,会被怀疑和赌球有关;如果一个官员“猝死”了,会被怀疑和贪腐有关;如果一个农民”猝死”了,会被怀疑和拆迁有关;而如果一个程序员猝死了,那他真的猝死了。

50、老婆是操作系统,一但安装卸载十分麻烦;小秘是桌面,只要你有兴趣可以天天更换;情人是互联网,风光无限花钱不断;小姐是盗版软件,用时记着先杀毒。

51、前台美女三宝:你好,找谁,倒饮料。产品经理三宝:山寨,改版,再推倒。项目经理三宝:进度,流程,做报表。团队经理三宝:团建,开会,评绩效。程序员三宝:闷骚,加班,修电脑。

52、对于程序员来说、没老婆不悲催。悲催的是、没老婆、控制台还不停的提示你Error:could not find the object

53、假如生活欺骗了你,不要悲伤不要心急。《代码大全》会一直陪伴着你……

54、有时候真觉得有些事情如同char*一般,从开始就注定,无法改变。

55、洛阳亲友如相问,就说我在敲代码。

56、”如果你ctrl+alt+del,蹦出任务管理器,你从上到下扫一眼,所有的进程你都认识,知道他们是干什么的,并且知道关掉有什么后果,而且你还能从CPU和内存占用的数字跳动上清楚的知道电脑现在什么状态,那么你应该没有女朋友”………..你妹啊

57、用IE6的吃方便面都没有调料包,你知道不知道……

58、普通青年用IDE(Visual Studio, Eclipse, XCode);文艺青年用VIM, Emacs;二逼青年将IDE设置成VIM模式。

59、程序员换IDE相当于搬家,换主力语言相当于改嫁,换操作系统相当于参加FBI证人保护计划…

60、有两个程序员钓鱼,其中一个钓到一条美人鱼,这个美人鱼上半身是美女,下半身是鱼,于是这个程序员 就吧她放了,另一个问他:Why,他回答说:没有API

61、阿里小米皆自主,百度排名最公平;京东全网最低价,当当爱国很理性;用户体验看新浪,网易从来少愤青;豆瓣从来不约炮,人人分享高水平;从不抄袭数腾讯, 开放安全三六零。

62、编程夜当午,手握小滑鼠。谁知编程辛,行行皆“心”苦;头昏不觉晓,使劲揉眼角。夜夜太辛苦,睡眠知多少;

63、热火朝天的办公室,一精壮青年一边啃着馒头,一边看着眼前产品,愁眉紧锁的他陷入了沉思:产品下一步应该怎么走?如何保证代码质量?如何缩短项目时间?如何控制项目成本?一个个难题需要他思索,抉择。此时,传来项目经理的吆喝:“程旭元,先别敲代码了!给我修下电脑……”

64、原来《人月神话》不是本奇幻小说! 原来《代码大全》不是一堆开源代码! 原来《鸟哥的Linux私房菜》不是教你做菜! 原来《边城》不是教你写代码的! 原来《深入浅出HTML》不是教你How to Make Love

65、文艺程序员写代码追求让别人看懂,普通程序员追求让自己看懂,2B程序员则追求让编译器能看懂;半年后看自己当初写的代码,文艺程序员不知道是自己写的但很容易看懂,普通程序员知道是自己写的但是不太容易看懂,2B程序员埋头看了半天后拍着桌子吼到:“这是哪个SB写的程序!”

66、我真的想让这个世界变得更好,但是他们不给我源代码……

如果像招聘程序员那样招聘木匠

面试官: 您是木匠了,对吧?
木匠: 是的,我就是干这个的。

面试官: 您做木匠有多长时间了?
木匠: 10 年。

面试官:嗯,很好。那现在我有一些技术问题想问问您,看看您是否适合我们团队。可以吧?
木匠: 没问题,问吧。

面试官: 首先,我们目前正在做很多棕色房子的构件。不知您之前建过很多棕色的房子么?
木匠: 我是个木匠,我当然会建房子。不过人们更愿意刷自己喜欢的颜色。

面试官: 嗯,我理解,不过您是否告知,您有多少建棕色房子的经验呢?
木匠: 囧,我真不知道啊。房子建好了,我又不关心刷什么颜色的漆。或许有六个月的经验吧

面试官:六个月?噢,我们在找有更多棕色房子经验的人了,但是否允许我再问问其他问题呢?
木匠:嗯,没问题。但粉刷是粉刷,你应该懂的。

面试官: 好。能聊聊胡桃木么?
木匠:您想了解什么呢?

面试官: 您做木匠时,经常用胡桃木的木材么?
木匠: 当然了,胡桃木、松树、橡树、桃花心木都用过。

面试官: 那您用胡桃木的时间,又多少年呢?
木匠:天哪,我真的不知道。难道我应该要统计胡桃木的数量么?

面试官:嗯,您估算一下吧。
木匠:好不,那我就说有一年半时间在用胡桃木。

面试官:那您认为您是处于一个什么级别?普通胡桃木木匠,还是胡桃木大师么?
木匠: 胡桃木大师?什么是胡桃木大师啊?当然了,我以前是用过胡桃木的。

面试官:那您不是胡桃木大师了?
木匠: 这个,我就是个木匠,所以我用过很多类型的木材了,你知道的,木材都是有区别的,如果您是一位出色的木匠……

面试官:嗯嗯,我懂。但我们目前在用胡桃木了,这没问题吧?
木匠: 胡桃木很好的!不管您要什么。我是一个木匠。

面试官:咱能聊聊黑色的胡桃木么?
木匠:怎么了?

面试官:虽然我们现在已经有了几位用过胡桃木的木匠,但他们都没有用过黑色的胡桃木。您有黑色胡桃木的经验吧?
木匠:当然了,有一些。如果我有更多的经验,是会更好吧。

面试官: 好的。请稍等,我查一下收件箱……
木匠:嗯,您查吧。

面试官:好了,今天还有件事要问您。我们在用 Rock 5.1 敲钉子。您用过 Rock 5.1 么?
木匠: [囧] 自从 Craftsman 买了一个石场,我知道很多木匠开始用石头敲钉子,但是你知道,说实话,我用射钉枪用的更多。铁锤也用过。我发现我用石头,经常伤到我手指,我手上其他地方也受过伤,因为石头太大了。

面试官:但是其他木匠都在用石头了。您是说石头不起作用么?
木匠:没有啊,我没说石头没用,确切地说,我认为我的射钉枪更好。

面试官:嗯。我们的建筑师全部都在用石头,并且他们都喜欢用石头。
木匠: 额,他们当然喜欢,但我整天都要敲钉子,这个…… 我需要工作,如果您想用我的花,我肯定愿意用石头。我尽量别禁锢我的思维吧。

面试官: 好的,我们还有其他一些应聘者,我还要……到时候会通知您。
木匠:嗯,感谢您。很荣幸与您会面。

第二天:

电话响了……

面试官:您好?
木匠:您好。还记得我么?您之前在找有黑色胡桃木经验的木匠,我是您之前面试过的那个木匠。我打电话是想看看你们是否已确认人选了。

面试官:嗯,实际上我们已有人选了。总体来说,我们喜欢您的经验,不过我们决定,还是雇用有很多棕色房子经验的木匠。
木匠:这样啊?那我就丢掉这份工作了,就因为我没有足够多的棕色(房子)经验?

面试官:嗯,这是部分原因,另外部分原因是,我们找到了薪资要求更低的候选人。
木匠:真的吗,那那位有多少经验呢?

面试官:其实他根本就不是木匠,他是一位汽车销售,不过他卖过很多棕色的汽车,并且他常和胡桃木内饰打交道。
木匠: [卡] (木匠同学挂了)

见李开复初印象

前几天去了趟北京,王尼玛让我跟手机app的开发人员深入交流一下,并要和创新工场的一些其他团队进行一些合作。

不巧的是我去的那天,李开复老师有事外出,当时说是我今天回来也见不着了。

昨天下午王尼玛神秘兮兮地让我和王尼美过去找人,一开始没注意,等到了办公室才知是大名鼎鼎的李开复老师来了,要跟我们暴走漫画的核心团队成员聊聊。

见到李开复老师第一眼的印象感觉文质彬彬,但比照片上感觉更瘦更高,上身着粉红色衬衫——刚巧我也是——下身黑色西装裤。

办公室不大,大约有十个平米多,中间是一张很大的L形办公桌,我们和开服老师隔着办公桌面对面坐着。左手边就是飘窗。办公桌上收拾地非常干净一丝不苟,靠窗有台iMac还有台Dell,边上的线都卷地很好。桌上还摞着一些书,有关于产品设计战略的等等,中间还有很多盒名片,名片整齐地排列着。还有个泡茶的壶,感觉是茶室这种地方用的。但老师本人用的是一个巨大的运动型水杯,好像有1L的容量。

右手边有一个简单的书柜,书柜上放了与家人的合影以及女儿的照片。书柜脚边是几扎牌子叫火山岩的纯净水。

左边飘窗后面还有三四盆盆植物,只认识一个虎尾兰。后面还有个一直在轰鸣的大约一米高半米长宽白色外壳的不知道是什么机器。

李开复老师对暴走漫画的情况提出了很多的意见和建议,也根据当前的互联网的形势给出了自己的见解和看法,并且也介绍了很多创新工场内可以交流合作的团队和个人。谈吐温文尔雅,确实非常配得上“老师”的称号。

程序员幽默:他们是如何过河的?

C程序员
每当有大问题,上帝都会跟C程序员进行磋商。
C程序员可以直接在水上行走。

VB 程序员
VB 程序员每天都会跟上帝吃午饭。
他是游泳奥运冠军。

Turbo Pascal 程序员
Turbo Pascal 程序员偶尔跟上帝交谈过几句。
他游泳很不错。

Fortran 程序员
Fortran 程序员曾和上帝碰过几次面。
他可以努力让自己漂浮在浅水中。

QBASIC 程序员
QBASIC 程序员认识哪个是上帝。
不过他连在自己的浴缸里不溺水都有困难。

LOGO 程序员
Logo 程序员唯一了解上帝的地方在于,“上帝”这个单词对他来说足够简短能念出来,但他拼写这个单词还有问题。
他需要其他人把他抬过河。

汇编语言程序员
其实汇编语言程序员就是上帝。
当他想过河的时候,他会分开水面。

Forth 程序员
Forth 程序员从来不会看他遇到的河流一眼因为这违背了他虔诚的信仰,于是他过河都是走桥的。

各种奇怪的中文编程语言(转)

1、易语言

这语言是本文中最不奇怪的语言了……所以不做介绍,只放上一段Hello World。

.版本 2
.程序集 程序集1
.子程序 _启动子程序, 整数型
标准输出 (, “你好,世界!”)
返回 (0)

2、丙正正

丙正正是啥?答曰C++。。。C排第三个,所以是丙,代码实例如下:

空 象棋檔::設定註解(字元 *s,整數 n)
{
若(n >= 最大註解數)
對於(;最大註解數 <= n;最大註解數++)
註解[最大註解數]=NONE;
若(s==NULL 或 字串長度(s)==0)
傳回;
若(註解[n]!=NONE)
刪除 註解[n];
註解[n]=新 字元[字串長度(s)+1];
字串複製(註解[n],s);
}

这不就是翻译么。。。

3、习语言

另一个类C语言……全中文关键字:

包含 “习语言系统.接口”

整数类型 主函数()
{
文件类型 *fp;
整数类型 ch; 【注意这里要定义为整数,以便接受文件结束符号】
如果((fp=文件打开(“练习13-2.文本”,”写+”))==空指针)
{
格式输出(“无法打开文件:练习13-2.文本! “);
暂停();
退出(1);
}
格式输出(“输入一串字符:n”);
ch=输入字符();
若符合条件 (ch != 宏_换行键 ) 重复
{
文件写字符(ch,fp);
ch=输入字符();
}
文件复位(fp);
ch=文件读字符(fp);
若符合条件(ch!= 宏_文件结束 ) 重复
{
输出字符(ch);
ch=文件读字符(fp);
}
格式输出(“n”);
文件关闭(fp);
暂停();
返回 0;
}

不由的想说这些字打起来肯定很费劲……

4、PerlYuYan

这个汉语编程是基于Perl语言的,不过它的语法号称是文言文!看如下一段代码

!/usr/local/bin/perl

use Lingua::Sinica::PerlYuYan;
用警兮用嚴。
印道
1..1
哉兮

印編曰雜申雜申矣
又曰ok矣
又曰1矣

亂曰
國無人莫我知兮 又何懷乎故都
既莫足與為美政兮 吾將從彭咸之所居

它其实是什么呢……如下翻译

用警兮用嚴。 use warnings; use strict;
印道 print ”
1..1 1..1
哉兮 “;
印編曰雜申雜申矣 print sprintf ‘%s %s’
又曰ok矣 ,’ok’
又曰1矣 ,’1′
亂曰 END

本文末,贴一段最恶心的PerlYuYan代码。。征求翻译达人:

!/usr/local/bin/perl

The Sieve of Eratosthenes – 埃拉托斯芬篩法

use Lingua::Sinica::PerlYuYan;

用籌兮用嚴 井涸兮無礙。
印曰最高矣 又道數然哉。
截起吾純風 賦小入大合。
習予吾陣地 並二至純風。
當起段賦取 加陣地合始。
陣地賦篩始 繫繫此雜段。
終陣地兮印 正道次標哉。
輸空接段點 列終註泰來。

/Autrijus/

SuperCache的lock选项性能测试

上次说到了SuperCache的lock选项可以解决DogPileEffect。那么效果究竟如何,我做了个简单的测试:

我使用了Ruby 1.9.3-p392,Rails 3.2.12,只建了my_controller.rb,其中模拟了一个10秒慢速请求,为了测试方便,缓存时间只设置为5s:

服务器端使用了unicorn,启动5个worker,测试端开100个并发,50000次请求。

不使用lock:

使用lock

结果很明显,启用了lock之后,SuperCache的长达10s的请求数明显更少,使得平均响应速度有明显的提升。

在实际的生产环境中,一般长达10s的请求很少,只缓存5s的请求也很少,但是通常长时间的请求伴随着都是较高的数据库负载,一旦大量出现,容易拖垮整个服务。通过这种机制,就可以明显地让缓存失效时负载曲线平滑。

暴走漫画的服务器使用了这个机制之后,使得平均响应速度从300ms左右降低至了200ms左右。

nginx+NFS vs nginx+memcached

前面我写了SuperCache的介绍之后,两位朋友都表示他们在生产环境中使用了NFS,我直觉是NFS性能并不如memcached好,因为NFS牵扯了一个文件系统,但是NFS可以很好利用nginx的gzip_static。于是我做了这个评测。

我准备了三台服务器,一台服务器A用于提供memcached和NFS服务,B服务器上有nginx,挂载了A服务器上的NFS,最后通过C服务器对B服务器进行压力测试。三台服务器都是某云服务上的三台VPS,4核8G内存。

为了模拟真实环境,我首先给NFS和memcached准备了200,000条4000字节的html文件,路径格式为/articles/.html,内容是一些随机字符。

首先单纯就写入的速度来看:

写入速度明显是memcached占优,这是很容易理解的。因为NFS走了文件系统,而memcached减少了文件系统所需的诸如磁盘操作以及索引等等额外的东西。

然后我使用了siege对其进行测试

NFS

NFS服务器端/etc/exports配置

使用NFS的nginx配置:

NFS后端的结果如下:

我还额外对所有文件进行了gzip压缩(过程非常缓慢),然后启用了gzip_static:

结果效率并没有提升,原因不明。

memcached

使用memcached的nginx配置:

memcached后结果如下:

访问速度上基本没有太大差异,memcached略胜一筹

结论

NFS基于文件系统,Memcached完全存与内存。

所以,在需要频繁更新缓存的场景中,NFS受限于IO和网络条件,更新的效率较低。
由于NFS不具备memcached这种自动过期的功能,必须额外写脚本进行Sweep,可能不够方便
同时局限于文件系统的结构,清理过程中需要遍历文件也是十分消耗时间和磁盘IO的。

但如果不需频繁更新,NFS基于文件系统的特性更能节省内存。

另外我对NFS配置不够了解,对于NFS如何做高可用性不太清楚,但如果是memcached的话,则相对比较方便,可以在upstream中添加多个节点,并配置memcached_next_upstream等选项。

还有本文没有测试的:

  • 如果AB机器是同一台服务器,那么结果如何
  • NFS有一些配置选项,比如async选项,我在这里配置的是sync选项,是否对性能有所影响

SuperCache:一个Rails缓存小组件

前言

SuperCache最早由我在负责糗事百科开发工作时,所使用的缓存手段发展而来。当时糗事百科使用了页面整个静态缓存,而页面上诸如登录信息、每个文章的分数评论等,由Ajax载入,这样可以最大化缓存的效率。
但在扩展到两台应用服务器之后,caches_pagecaches_action就显得比较局限了。于是我将页面缓存放入了Memcached,由Nginx直接根据页面地址为key在memcached中查找,如果没有对应缓存才访问Rails层。经过一系列优化,最后变成了现在的SuperCache。现在“暴走漫画”也用的是这套方式。

为什么不用caches_action

caches_action可以指定路径,通过:store_options参数也可以指定rawtrue(默认情况下会序列化,nginx无法读取)以及失效时间,然而caches_action使用了fragment的存储方式,会始终在key前面加上views/,这就使得nginx在处理上变得麻烦。导致caches_action必须走Rails层,导致效率变低。

为什么不用caches_page

caches_page是将页面内容存到磁盘上作为静态文件,这样可以直接通过nginx或者Apache等服务器进行存取,不通过Rails进程,可以极大提高速度。但是caches_page并不支持将页面存入诸如memcache,这样就把caches_pages的应用局限于一台服务器上,要求nginx和rails都在一台服务器上。而且缓存很难共享或者是进行清理。当然也许可以通过nfs或者fuse挂载memcache等方式实现,但这些的增加了部署的复杂度,同时也不知性能如何。

为什么不用rack-cache

rack-cache是符合HTTP标准的透明反向代理,其失效和过期都要使用HTTP头来操作,无法使用Sweeper来清理缓存。和rack-cache作用类似的有Squid和Varnish,但是本人并不了解他们的配置,所以

所以SuperCache的目的就是解决这些问题:可以在多服务器的环境下运作,可以直接由前端的反向代理直接读取缓存而不用经过rails进程。并且可以像Rails原有操作缓存一样进行清理。

使用方法

安装

Gemfile中加入以下

然后命令行下更新:

使用

caches_actioncaches_page一样在Controller中指定所需缓存的页面:

super_caches_page可以有以下参数:

  • cache_path 指定缓存的key,默认是请求的路径
  • expires_in 控制了失效的时间

nginx配置

如果要发挥SuperCache的能力,那必须还得通过nginx的配置:

这样,如果nginx后端有多台Rails服务器,也可以使用静态页面缓存了。

其他好东西

除了上述的简单功能之外,我还正在筹划以下功能:

Dog-Pile Effect

所谓Dog-Pile Effect是指当某个缓存失效的时候,同时有大量请求发现没有缓存,进而请求后端的应用服务要求建立缓存,从而导致服务器卡顿甚至系统宕机的现象。

事实上很多场景下,当缓存失效的时候,只需要其中一个请求去建立新缓存,而其他请求可以使用过期的缓存继续服务。在SuperCache中,我使用Memcache来建立一个锁机制:当缓存失效的时候,只有获得锁的请求可以向后端发送请求并建立新缓存,其他未能获得锁的请求,直接缓存过期的版本。
这样就可以使缓存失效时,系统负载不会突然提升而能平稳过渡。

当然还有一些别的方式来处理这种现象,比如可以在请求之后直接更新缓存(类似Write through机制),而不是等缓存失效之后再处理,但我认为这种方式比较复杂。

目前暴走漫画使用了SuperCache的这种机制之后大大提高了响应并发的能力。

Cache Meta Info

手工处理缓存的清理非常复杂,在SuperCache将来的版本中,我会加入对缓存依赖对象的跟踪,也就是记录和ActiveRecord相关的cache key,当记录发生变更的时候,只需遍历删除对象所影响的Cache key,就可以一次搞定所有问题。

暴走漫画网站已经应用了这套逻辑,相关代码已经提交在了cache_meta_info分支中。


将来我会不断完善SuperCache这个小组件,希望朋友么多多支持,不吝赐教。

哈佛「公平」的公开课听课随感(1)

最近有空,又接着看了《哈佛大学公开课:公正-该如何做是好?》。我认为这个公开课非常好,它的介绍上是这样说的“旨在引导观众一起评判性思考关于公正、平等、民主与公民权利的一些基本问题。每周,超过1000位学生来听哈佛教授兼作家迈克尔桑德尔的课,以拓展他们对于政治与道德哲学的认知理解,探究固有观念是与非。”
与过去我在中学、大学所接收的填鸭式的教学完全不同,教授是跟学生一起进行探讨,他并非直接告诉学生,X是对的,Y是错误的,而且跟同学一起探讨,互相辩论,更重要是思辨的过程。
如果我们国家的教育,能以这样的形式,就能够开启民智,开启国家复兴的道路。

我在看完了第一第二课之后,对其中讨论的“功利主义”和“自由主义”有一些额外的想法,我想记录下来:

我认为功利主义的困境在于,大家的幸福感是不同的,是难以简单相加的;同时我认为人是会变的,某人今天吃包子很幸福,但让他吃十天包子他就不觉得幸福了。现在对于某个问题的决策,能否在将来也让人继续感觉幸福,是难以精确计算出来的。其次人往往会放大自己的感受,而对于他人的感受,则常常会忽略。这就使得在实际的社会实践操作中,仅仅遵循功利主义处理问题会非常困难。由于不可能事事都所有人来一起计算,所以一旦让某小部分有权力来进行影响大多数人的决策时,那么这部分人就往往容易倾向于根据有利于他们的判断标准来进行决策,这显然就有失公平了。我们不能假定这部分进行决策制定规则的人一定是无私的,也不能假定他们是全知的。毫无疑问的是这两点通常都不可能。
同时,部分人——比如说A——也可以为了利己的目的,欺骗另一些人——比如叫B,鼓吹A的价值更大,让认为B为A贡献、让渡资源可以得到更大的幸福等等。这在各种专制国家非常常见,在这些国家的民众的眼中,比如如果出现灾难的灾难,用100个贫民的性命来保住1个领导的性命是值得的。
所以功利主义是难以保证公平的。

而后课堂上说讲授的关于自由主义的原则,我认为它过于理想化。通过教授的讲课,我了解到自由主义的大前提之一是「每个人都是他自己的主人」。然而我认为,从自然角度来看,人并非完全是自己的主人。人的生命是父母授予的,人出生时是没有行事能力的,又由父母养育,而其又依赖于社会存活,所以我认为人并不可能完全是其自身的主人。同时,人不能脱离社会存活,同时人也不断寻求能获得他人的认可,为此,人不得不在很多事情上妥协,也丧失了自由性。
当然我个人是非常期望随着社会进步是越来越自由的,因为只有自由才能创新,才能推动社会进步。

[转]关于“抛球悖论”的一点思考

原文地址 http://techneresearcher.wordpress.com/2011/03/19/%E5%85%B3%E4%BA%8E%E2%80%9C%E6%8A%9B%E7%90%83%E6%82%96%E8%AE%BA%E2%80%9D%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%9D%E8%80%83/

[注]此文是当年在吴国盛老师手下读书时写的,N年前的事情了。记得当初我写完后还直接发给吴老师看,不过倒没见他对此有什么反应。吴老师还是我的硕士论文指导老师,不知不觉很多年过去了……贴出这篇旧文,回忆下当初充满书香门第情调的那种初生牛犊般的求学感觉。

关于“抛球悖论”的一点思考

王 键

一、什么是抛球问题

在《自然本体化之误》(湖南科学技术出版社,1993年)一书关于芝诺悖论的一章中,该书的作者吴国盛教授谈到了一个与芝诺悖论相关的问题:即关于“无 限机器”(infinite machine)所产生的悖论,也被称为“超级任务”(super task)。 实际上也就是所谓的抛球悖论(问题)。

原书中的相关论述如下:“最有名的无限机器是抛球机器,它是这样设计的:一个小球从a处开始向b处抛动,令小球从a处抛到b处时花 1/2分钟,从b抛回a处花1/4分钟,依此类推,来回抛球的时间依次是:

1/2,1/4,1/8……,1/2n……

到第n次时所花全部时间是:

T=1/2+1/4……+1/2n=1-1/2n

现在要求机器在时间到达一分钟时停下来。可是问题出现了,人们发现无法确定小球最终落在何处。从上式看,当n取奇数时,落在b处,取偶数时落在a处, 可是小球越抛越快,只有在经过无限次之后才回到达一分钟,但一个无限数是没有奇偶之分的,因此,搞不清楚一分钟的时候小球处在什麽位置,也就是说,小球没 有终点,超级任务无法完成。”(参见该书第94页)

应该说,从逻辑上看这段分析是没有任何问题的。而对于这一类的问题,吴教授也表明了自己的态度:“许多人已经证明了,超级任务是不可能完成的,无限机器不存在。”(同上,第94页)

二、它的另一种表述形式

但上面这个“抛球机器”的例子有点别扭,因为它不够直观。我们很难想象一个有质量的小球可以无限加速,无穷摆动。那么很简单地,我们完全可以换个方式重新表达刚才的问题,把它转化一下:不妨暂且称其为“开关灯问题”:

假设有两盏灯,分别是a和b,现在让灯a先亮,过1/2分钟后让灯b亮,同时灯a熄灭,再过1/4分钟让灯a亮,同时灯b熄灭,依此类推,每次交换亮灯所间隔的时间依次是:

1/2,1/4,1/8……,1/2n,……

到第n次时所花全部时间的总和是:

T=1/2+1/4……+1/2n=1-1/2n

现在要考察的是:在时间刚好到达一分钟时,究竟是哪个灯在亮?是灯a还是灯b?实际上这个问题完全等价于刚才的抛球机器问题,重要的一点是:换一种不同 的表达方式可以从另一个角度使问题的实质显露的更加清楚一些。对于这个亮灯的问题,答案产生的矛盾显然是和抛球问题完全类似——在时间到达一分钟时,两个 灯不能都在亮,那么也无法最终确定到底是哪个灯在亮。

三、解释这一问题的尝试

但是,对 于那个“抛球机器”问题,悖论究竟是如何产生的呢?刚才已经说了,这段论述对问题的分析中的分析并没有逻辑上的错误。然而,它的出发点却可能是错误的—— 要产生悖论,所隐含的一个前提条件是:当时间到达一分钟时,小球只能具有一个固定的位置,要麽a,要麽b。这也就是说,如果“小球同时在a和b两个位 置”,则被认为是一种“不可能”出现的状态。而这就是所谓抛球机器悖论产生的一个基本前提。把小球换成灯泡的例子,道理也是一样的:它假定了在到1分钟 时,两个灯泡不能同时亮。由此引出悖论。问题在于,这个假定同问题的预设存在矛盾:按照题目的设计,既然到了一分钟,也就意味着次数n变成了超穷树,即 “无穷大”。那么在这个时刻,两次亮灯之间的时间差已经变成了趋零的“无穷小”。在这种情况下,两个等不能同时亮的假定已经开始失去意义。既然如此,悖论 不是自然被消解了么?

总之,这一“抛球悖论”初看起来的确有些自相矛盾,但其实却不是这个问题本身,而是这个悖论的产生:问题中出现 的小球速度无限大、违反惯性定律、加速过程如何可能等等本该颇受质疑的超经验现象都被不加怀疑地予以接受,然而当结果产生了一个超经验的现象时,它却被当 作是一个“悖论”而出现了。同样,换作灯泡的例子,两个灯泡同时亮的不可能性,却已经成为了题目预设的必然结果。而如果问题的前提本身就存在某些反常,那 麽由这些前提而产生的反常绝对不应该被当成一个“悖论”或者“反常”。

四、同芝诺悖论的区别

关于这两个悖论,我们认真思考一下就会发现它和芝诺悖论存在着一个很大的区别。当然,如果追根溯源,这几个悖论实际上在一定程度上都可以归结为数学问题。

这就仿佛同这样一个函数相类似:

f(x)=sin(1/x)

现在问此函数在0点取值是什麽?

从数学分析的观点来看,在0点, 函数值f(x)发散,且有界但并不收敛。因此从数学的观点看:问函数f(x)在0点取什么值 就是一个没有意义的问题(当然哲学家们也许并不这麽看)。

对于芝诺的悖论,关键在于一点:如果把芝诺问题化为数学函数,那麽当这个函数f(x)的变元x 趋向于某一定值时,函数值f(x)也是趋向于某一定值的(换句话说,它的数学模型是一个连续函数)。而对于无限抛球问题,将其化为数学函数后,我们会发现 此函数与芝诺悖论对应的函数完全不同:对于这个函数f(x),当变元x 趋于某一定值时,函数值f(x)将是有界的但不是收敛的(与我举的第一个函数的例子相类似)。

五、是否能得出一个结论?

我以为,出现以上悖论的实质在于赋予某些“看似矛盾”的数学结构以经验的内容。这些数学结构,也一度曾让数学家们感到困惑。但是随着数学分析基础理论的建立和奠定,它们逐渐不再被看成悖论。然而,在被赋予了某些具体经验内容之后,它们仍然是难以被理解和接受的。

如此说来,我更倾向于认为:至少可以说,从局限在数学内部的观点来看,无限抛球问题并不存在悖论。但是跳出数学的圈子、从其他的观点来看,是否也可以这麽说倒还可以存疑。

不过,我感觉提出的这个问题似乎还不够清晰——对这个问题的回答,我暂时只能保持沉默。