2013年11月10日星期日

阮一峰的网络日志

阮一峰的网络日志


向着未来而生----《黑客与画家(精装本)》序言

Posted: 09 Nov 2013 07:00 AM PST

《黑客与画家》再版了,刚刚上架。

内容没变,但是升级成了精装本,纸张好了许多。

《黑客与画家(精装本)》

《黑客与画家(精装本)》

《黑客与画家(精装本)》

想要收藏和送人的朋友,可以考虑购买(京东当当亚马逊china-pub)。

下面是我为再版写的序言。另外,《软件随想录》有希望明年再版。

=============================================

向着未来而生

阮一峰 / 2013-03-29

《黑客与画家(精装本)》

不久前,收到朱巍编辑的来信。她说《黑客与画家》即将出版精装本,希望我作为译者,能写一些感言。

我这才惊觉,距离我动手翻译,已经过去了3年。真是时光催人老,三年前我坐在同一张书桌前,使用同一个键盘,一字一字地输入译文,宛如发生在昨日。

回想起来,那时心里没有把握,不知道中文版会不会被中国读者接受。因为IT图书的生命周期很短,三四年前的出版物往往已经过时,《黑客与画家》的英文版出版于2004年,其中不少文章写于2001年。现在推出中文版会不会太迟了?

事实证明,我的担心是多余的。中文版上市后,引起了巨大的反响,在国内IT业界受到广泛的肯定,很多程序员和项目经理读后表示深受启发,很多计算机系的老师将此书列为学生的推荐读物。我也收到了许多读者来信,摘录几封:

"......我这两天一直在看,有醍醐灌顶的感觉。"

"......我觉得自己看得好还不过瘾,又向学校图书馆荐购了。"

"......我们团队人手一本《黑客与画家》,并且至今共赠送了近百本给我们的用户。"

我一方面很高兴,另一方面也很赞叹Paul Graham。他是怎么做到的,让一本技术类书籍吸引10年后的读者?

后来,我总结出两个原因。第一,他写的不是技术,而是技术背后的思想。就像数学一样,正确的思想是不会过时的。第二,他的着眼点是长远的未来。文章内容主要不是分析现状,更不是总结过去,而是展望未来,以未来指导现在。举例来说,第11章《一百年后的编程语言》就是研究一百年后人们会怎么编程,从而推导到我们现在应该如何编程。除了他以外,我没见过其他人有这种视角。另一个证据是,Paul Graham最大的成就就是建立创业孵化器Y Combinator。这说明他对未来有精准的眼光,只有知道未来会怎样,才能选出最值得投资的创业公司。

正是因为这两个原因,《黑客与画家》完全没有过时。10年后的读者,一方面被已经实现的预言震撼(比如,Paul在2001年说,如果苹果公司将iPod升级成能上网的手机,就能战胜微软公司),另一方面又被那些还没实现的预言说动(比如,Lisp语言将成为主流),思考自己的选择。这是此书成功的最大原因:这是一本能帮你看清道路的书。

德国哲学家海德格尔说过一句著名的话:人应该"向死而生"(Being-toward-death)。意思是人面对死亡,才会停止那些无谓琐碎的关注和困扰,体会到什么是重要的事情,从而达到真正的存在。借用这种说法,我觉得Paul Graham的哲学是"向着未来而生"(Being-toward-future)。也就是说,我们的目光应该盯着未来的世界,以此决定人生应该怎么走。

说到未来的世界,我想起去年年底,美国国家情报委员会(National Intelligence Council,缩写NIC)发表了提交给总统的报告《全球趋势2030》下载)。其中一个主要结论是:

"......到了2030年,没有一个国家----无论是美国、中国或任何其他大国----将成为超级霸权。相反地,权力在国家之间变得分散,而且会从国家手中向非正式的网络、以及个人扩散,产生深刻的影响。......个人和小团体的力量将进一步被增强,更易获得各种调用资源的能力,在解决全球性挑战方面可能更有力。"

如果这种预测是正确的,就意味着未来20年里,政府的力量将缩小,个人和小团体将崛起,成为推动社会前进的主要力量。在这个过程中,互联网和计算机必然将扮演重要角色,因为正是它们将个体的影响力指数式地提升。

对于网络创业者来说,这是最好的时代。只要把握大趋势,技术会把个人送到难以想象的高度。

未来就在眼前,伸手可及。《黑客与画家》就是这次旅程的指南,为你指出通往那扇门的方向。正如Paul Graham所说,你要做的就是"活在未来,然后造出现在还没有的部分"(Live in the future, then build what's missing)。

(完)

文档信息

2013年11月4日星期一

阮一峰的网络日志

阮一峰的网络日志


柯文哲《生死的智慧》

Posted: 03 Nov 2013 07:13 AM PST

三天前,柯文哲医师在今年Ted Taipei的演讲《生死的智慧》,放上了Youtube

这段短短18分钟的演讲,异常精彩,发人深思。我忍不住把它整理出来,希望更多的人看到。

=================================================

生死的智慧

演讲人:柯文哲

时间地点:2013年9月28日 / 台北

视频:Youtube / 优酷 / 土豆

[介绍]

柯文哲(1959-),外科医师,台湾大学医学院附设医院"创伤医学部"主任,台湾大学医学院教授,专长为外伤、急救、器官移植等。

[正文]

1.

01.jpg

我大概是见过死人最多的台湾医生,很合适来谈生死的问题。

2.

02.jpg

让我从叶克膜开始讲起。

有一个笑话,谁是台湾最有名的医生。一个民众跑到柳营奇美医院,说要找叶医师。急症处的人说,没有啊,我们这里没有姓叶的。民众说,有的,他叫叶克膜,当年邵晓玲就是被他救起来的。

叶克膜其实很简单,就是静脉血引流出来,经过一个血液泵(人工心脏),再经过一个氧合器(人工肺脏),送回身体。它用来暂时取代心肺功能。

3.

03.jpg

真正的叶克膜大概就是这个样子,一个主机当人工心脏,旁边是一个氧合器,把血液送回去。

4.

04.jpg

叶克膜的确有非常成功的案例。这是一个周杰伦的舞群,有一天突发猛暴性心肌炎,心脏不跳了。

5.

05.jpg

当时,她的眼睛大大地看着荧幕,荧幕上的信号全是平的。

6.

06.jpg

这是她的心肌病理切片,放大了100倍。

7.

07.jpg

100倍还不是看得很清楚,放大400倍就很明显了,一个个蓝点就是淋巴球。这是很厉害的猛暴性心肌炎,整个心脏都被淋巴球浸润了。

8.

08.jpg

可是,九天之后,她就进行了心脏和肾脏移植。不到一个月,又回去跳舞了。

医学文献上,CPR(心肺复苏术)时间最长、还能被救回来的,就是这个案例。她从国泰医院一路CPR到台大医院,要装叶克膜的时候,发现强心剂已经打了100支了,股动脉和股静脉已经缩得比铅笔还细了,管子放不进去,只好继续用CPR,到开刀房直接锯胸,从上面放叶克膜。

这个案例听起来很神奇,我每次都说这是现代医学的奇迹。一个人经历了4个小时的CPR,九天没有心脏功能,还能救回来。

9.

09.jpg

这是另外一个案例,报纸写"全球首例,台湾奇迹,男无心脏活16天"。

10.

10.jpg

这是一个56岁的男子,因为蛀牙,细菌跑到血液里面,再跑到心脏,后来就化脓。在其他医院,打开心脏一看,发现有的地方烂掉了,就给他剪一剪,最后整个心脏都被剪掉了。

怎么办?只好转到台大医院。

11.

11.jpg

到台大医院的时候,因为几乎没有心脏功能,就用了两台叶克膜。图片上有两台主机。

12.

12.jpg

刚才那个案例是有心脏不会跳,这个更厉害,连心脏都没有了,剪掉了,心电图干脆就一条线了。

13.

13.jpg

这是他的电脑断层扫描,理论上,胸腔里应该有一颗心脏,可是现在没有心脏,只看到一些管子。

14.

14.jpg

十六天以后,我们给这个病人做心脏移植。

这是心脏外科教授王水深给我看的。他说,锯胸以后,没有看到心脏,只看到一些塑胶管子,接到外面的叶克膜上。

15.

15.jpg

这个病人做了心脏移植,最后还是很清醒地回家了。这是新加坡《海峡日报》的报道《Sixteen Days Without A Heart》。

16.

16.jpg

还有一个案例。一个26岁的原住民,酒醉以后去游泳,被水呛到,得了严重的肺炎,叶克膜用了117天。

17.

17.jpg

可以看到,他得了很严重的肺炎(又称急性呼吸窘迫征),整个肺都白掉了。

18.

18.jpg

他用了117天叶克膜。这个图可以看得很清楚,差不多长达一个月,他的肺通气量不到100cc。不过,最后还是慢慢恢复了。

上面这些案例,使用叶克膜以后,可以撑到9天、16天、甚至100多天,然后再进行心脏移植、心肺移植,或者自己好起来。这实在是太神奇了。所以,在媒体的炒作下,叶克膜在台湾变得这么有名,确实有一些很成功的案例。

19.

19.jpg

可是,媒体通常只报道成功的案例,不报道失败的案例。作为一个医生,看到成功的案例当然很高兴,但是也不能不看到失败的案例。

这是一个出生一个半月、先天性心脏病的婴儿,心脏手术以后,没有办法脱离心肺机,所以就装了叶克膜。

20.

20.jpg

可是不到三天,他的脚就黑掉了。这时候,医生就面临一个选择。你是要把他的双脚剁掉,继续再救,还是算了,不再努力了?这是很大的压力。

21.

21.jpg

如果上面的案例,你都很困难做决定。那么这一个案例,就更难了。

这是一个七岁的男孩,得了肺炎双球菌败血症,引起呼吸窘迫,后来装了叶克膜。

22.

22.jpg

装了以后,出现并发症,四肢都黑掉了。他眼镜大大地看着你,意识清楚,会讨水喝。可是作为一个医生,你面临选择。如果要救他,就要把四肢剁掉,如果不救,就要把机器关掉。

你想想看,在生死之间,病人头脑清楚,我怎么跟他讲:"小弟弟,如果你要活下去,我们要剁掉你的四肢。或者算了,你不要再活了。"你如何跟一个7岁的男孩,讲这种生死的问题?

23.

23.jpg

这就是我当一个重症医学专家的心路历程。

三十几岁,我就当上了主任,觉得医学很厉害,什么都可以解决。可是到了40岁以后,常常有装了叶克膜还是失败的案例,家属问我:"为什么别人救得回来,我们的亲人救不回来?"我也不晓得怎么回答。为什么病人的四肢会黑掉?我要是知道,就可以避免了,就是不知道啊。

24.

24.jpg

慢慢地到了50岁以后,我终于想通一个道理。医生是人不是神,我们只能尽力,仅此而已。

不管医学如何发达,还是有其极限。以现在的科技,没有心、肺、肾,还可以存活,但是难道就这样装着机器过一辈子吗?

大自然有春夏秋冬,园丁能不能改变这种规律?当然没有办法,园丁只能让花在春夏秋冬里面开得好看一点。一个医生有办法改变生老病死吗?很困难。医生只是让人在生老病死之间活得好看一点,仅此而已。

25.

25.jpg

医师只是生命花园的园丁,他到底如何面对草木的枯荣,面对死亡呢?

从科学上讲,一切物理化学反应,都应该趋向最低能量、最大乱度,也就是越来越混乱。人的存在是违反这种趋向的。这是一个很重要的概念,任何有组织的团体都是不稳定的,必须破坏环境,才能使得总的趋向是最低能量、最大乱度。有一天,我再不能破坏环境,就只好破坏我自己,这就叫死亡。

26.

26.jpg

有一天,我在巡房的时候,突然大彻大悟。人生的结局只有两种:插管和不插管,但都是死。

你问我,什么是死亡?我的回答是,怎样才算活着?你问我,什么是人生,我的回答是,追求这个问题的答案就是这个问题的答案。

因为人一定会死,所以死亡不是人生的目的,人生就是一个过程,我们在这个过程中不断去追寻一个问题,这就是人生。

27.

27.jpg

最近,我常常讲"一坨大便"的启示。

有一次,我的老师退休了,我就请老师和学长吃饭。我们三个人到喜来登饭店二楼的法国餐厅,结果吃了26000元,平均每人9000元!我看到帐单的时候,脸都绿了,怎么这么贵!我没有去过这种地方,都是乱点的,也不晓得点了什么菜要26000元。第二天早上,我上厕所,一直在看我的大便,这个花了我9000元才制造出来的东西,看来看去,跟我平时去台大医院地下室吃70元一顿的自助餐,看不出差别。我在厕所里面,突然悟到,人生的荣华富贵不过就是一坨大便。

28.

28.jpg

中国人最重要的思想是儒家学说,可是《论语》说"未知生,焉知死"、"未能事人、焉能事鬼"、"生,事之以礼;死,葬之以礼,祭之以礼",总之就是不想谈论死亡。如果你一直追问,它就说"舍生取义"、"朝闻道夕可死矣"。儒家对生死问题采取一种逃避的态度,就是不想讨论。

这种做法积极的一面,当然是让人们重视活着的时候,可是终究没有回答死亡。

29.

29.jpg

我的个人看法是"置于死地而后生",我们唯有面对死亡,才能看清人生到底是什么。人终究会死,人生只是一个追求人生意义的过程。

人生应该像a的n次方。如果a大于1,a的n次方就无限大;如果a小于1,a的n次方很快就趋近于零。你知道这是什么意思?我对社会的付出多于索取,就代表a大于1,每个人都如此,社会就会越来越好,如果每个人对社会都是索取大于付出,就代表a小于1,社会很快就会崩溃。

我用下面这句话,作为今天的结束语:"最困难的不是面对各种挫折打击,而是面对各种挫折打击,却不失去对人世的热情。"

谢谢各位。

(完)

文档信息

2013年10月25日星期五

阮一峰的网络日志

阮一峰的网络日志


比特币的用途

Posted: 24 Oct 2013 07:23 PM PDT

这两周,比特币(bitcoin)的价格大幅上涨,我也凑热闹关注了一阵。

比特币价格走势

首先说明,我对比特币所知甚少,从未参与过生产/交易,对它的了解仅限于新闻报道和维基百科,但我有一些不成熟的想法。

看着比特币的价格节节上升,我就在想,它有什么用?

想来想去,我突然悟到,比特币的最佳用途是转移资产!

假设我有100万人民币,需要转移到美国,比特币是最方便的方法。我在国内市场上用人民币买入比特币,然后立刻转手在美国市场上卖出,将所得的美元转入美国银行账户,就一切OK了。

整个过程只要点几下鼠标就行了,非常方便快捷,不需要任何其他手续或证明文件。而且,比特币是24小时连续交易,不要手续费,成本几乎为零。保密性也非常好,中国政府和美国政府都不会察觉这笔交易,更不要提追踪了。

唯一的风险是,持仓期间价格下跌。但要是买入后立即抛出,价格波动幅度应该不会太大。另外,比特币的价格是全球统一的,中国市场和美国市场几乎没有价差,不用担心汇兑风险。

虽然还没有试验过,但是我越想越觉得,这种转移资金的方法可行。于是,我马上想到第二个问题,如果比特币真的成为资金转移的首选渠道,会发生什么结果?

它会供不应求!每个人都想买入,所以价格还会不断上涨。比特币总共只有2100万个,它的价格最后很可能会是天价。

但是,我也意识到,任何数字资产其实都可以充当这种高效、快速、低成本的交易中介,只要它被广为接受,且有足够的市场容量和流动性。比特币在这方面只不过反映了数字货币的优势,只是一个代表而已。说实话,如果腾讯公司有足够的公信力,我觉得Q币也能起到比特币的作用。

当然,腾讯公司或者任何其他商业公司,都很难让人完全信任,所以Q币取代不了比特币。分布式、不受任何机构或个人控制,正是比特币的一大卖点。

比特币的真正缺点,我现在只想到一个,这也是我想问的第三个问题。如果比特币的价格不断上涨,意味着什么?

很简单,没有人会使用比特币!因为持有者只要一直持有,就能享受价格的不断上涨。在比特币的世界,根本不会发生通货膨胀,只会发生通货紧缩。今天一个西瓜是1比特币,明天可能是0.5比特币,一年以后也许会到0.05比特币。只要你一直持有,它的购买力就在不断增加,所以你不会使用/出售比特币,只会囤积它。另一方面,对生产者来说,通货紧缩就是噩梦,它意味着同样的产量换回的货币越来越少。

因此,我得到了一个悖论:比特币的用途是货币,但是它不可能当作货币用。

如果比特币能够克服这个缺点,就好了。如果发行量能够在2100万的基础上,每年固定增加一个百分比(比如5%),那我就会比较肯定,它就是未来人类社会的货币。

不过,谁也没有说比特币是完美无缺的,本质上它只是一种分布式算法,完全可能做出改进,也许不久以后就会有人提出比特币 2.0算法,或者其他数字货币的算法。事实上,我认为最大风险来自这里。

再次声明,我没研究过比特币协议,也没有实际操作过。上面只是我的一点臆测,很可能没有考虑周全,结论也可能是错的,希望与大家共同探讨。

(完)

文档信息

2013年10月21日星期一

阮一峰的网络日志

阮一峰的网络日志


什么是 Event Loop?

Posted: 20 Oct 2013 07:33 PM PDT

Event Loop 是一个很重要的概念,指的是计算机系统的一种运行机制。

JavaScript语言就采用这种机制,来解决单线程运行带来的一些问题。

Event Loop

本文参考C. Aaron Cois的《Understanding The Node.js Event Loop》,解释什么是Event Loop,以及它与JavaScript语言的单线程模型有何关系。

想要理解Event Loop,就要从程序的运行模式讲起。运行以后的程序叫做"进程"(process),一般情况下,一个进程一次只能执行一个任务。

如果有很多任务需要执行,不外乎三种解决方法。

(1)排队。因为一个进程一次只能执行一个任务,只好等前面的任务执行完了,再执行后面的任务。

(2)新建进程。使用fork命令,为每个任务新建一个进程。

(3)新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务。(进程和线程的详细解释,请看这里。)

以JavaScript语言为例,它是一种单线程语言,所有任务都在一个线程上完成,即采用上面的第一种方法。一旦遇到大量任务或者遇到一个耗时的任务,网页就会出现"假死",因为JavaScript停不下来,也就无法响应用户的行为。

你也许会问,JavaScript为什么是单线程,难道不能实现为多线程吗?

这跟历史有关系。JavaScript从诞生起就是单线程。原因大概是不想让浏览器变得太复杂,因为多线程需要共享资源、且有可能修改彼此的运行结果,对于一种网页脚本语言来说,这就太复杂了。后来就约定俗成,JavaScript为一种单线程语言。(Worker API可以实现多线程,但是JavaScript本身始终是单线程的。)

如果某个任务很耗时,比如涉及很多I/O(输入/输出)操作,那么线程的运行大概是下面的样子。

synchronous mode

上图的绿色部分是程序的运行时间,红色部分是等待时间。可以看到,由于I/O操作很慢,所以这个线程的大部分运行时间都在空等I/O操作的返回结果。这种运行方式称为"同步模式"(synchronous I/O)或"堵塞模式"(blocking I/O)。

如果采用多线程,同时运行多个任务,那很可能就是下面这样。

synchronous mode

上图表明,多线程不仅占用多倍的系统资源,也闲置多倍的资源,这显然不合理。

Event Loop就是为了解决这个问题而提出的。Wikipedia这样定义:

"Event Loop是一个程序结构,用于等待和发送消息和事件。(a programming construct that waits for and dispatches events or messages in a program.)"

简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。

asynchronous mode

上图主进程的绿色部分,还是表示运行时间,而橙色部分表示空闲时间。每当遇到I/O的时候,主进程就让Event Loop进程去通知相应的I/O程序,然后接着往后运行,所以不存在红色的等待时间。等到I/O程序完成操作,Event Loop进程再把结果返回主进程。主进程就调用事先设定的回调函数,完成整个任务。

可以看到,由于多出了橙色的空闲时间,所以主进程得以运行更多的任务,这就提高了效率。这种运行方式称为"异步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)。

这正是JavaScript语言的运行方式。单线程模型虽然对JavaScript构成了很大的限制,但也因此使它具备了其他语言不具备的优势。如果部署得好,JavaScript程序是不会出现堵塞的,这就是为什么node.js平台可以用很少的资源,应付大流量访问的原因。

(完)

文档信息

2013年10月15日星期二

阮一峰的网络日志

阮一峰的网络日志


为什么寄存器比内存快?

Posted: 14 Oct 2013 06:41 AM PDT

计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。

存储层次

同样都是晶体管存储设备,为什么寄存器比内存快呢?

晶体管

Mike Ash写了一篇很好的解释,非常通俗地回答了这个问题,有助于加深对硬件的理解。下面就是我的简单翻译。

原因一:距离不同

距离不是主要因素,但是最好懂,所以放在最前面说。内存离CPU比较远,所以要耗费更长的时间读取。

以3GHz的CPU为例,电流每秒钟可以振荡30亿次,每次耗时大约为0.33纳秒。光在1纳秒的时间内,可以前进30厘米。也就是说,在CPU的一个时钟周期内,光可以前进10厘米。因此,如果内存距离CPU超过5厘米,就不可能在一个时钟周期内完成数据的读取,这还没有考虑硬件的限制和电流实际上达不到光速。相比之下,寄存器在CPU内部,当然读起来会快一点。

距离对于桌面电脑影响很大,对于手机影响就要小得多。手机CPU的时钟频率比较慢(iPhone 5s为1.3GHz),而且手机的内存紧挨着CPU。

原因二:硬件设计不同

苹果公司新推出的iPhone 5s,CPU是A7,寄存器有6000多位(31个64位寄存器,加上32个128位寄存器)。而iPhone 5s的内存是1GB,约为80亿位(bit)。这意味着,高性能、高成本、高耗电的设计可以用在寄存器上,反正只有6000多位,而不能用在内存上。因为每个位的成本和能耗只要增加一点点,就会被放大80亿倍。

A7

事实上确实如此,内存的设计相对简单,每个位就是一个电容和一个晶体管,而寄存器的设计则完全不同,多出好几个电子元件。并且通电以后,寄存器的晶体管一直有电,而内存的晶体管只有用到的才有电,没用到的就没电,这样有利于省电。这些设计上的因素,决定了寄存器比内存读取速度更快。

原因三:工作方式不同

寄存器的工作方式很简单,只有两步:(1)找到相关的位,(2)读取这些位。

内存的工作方式就要复杂得多:

(1)找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)

(2)将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。

(3)将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。

(4)确定数据在哪一个内存块(chunk)上,从该块读取数据。

(5)数据先送回内存控制器,再送回CPU,然后开始使用。

内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。

为了缓解寄存器与内存之间的巨大速度差异,硬件设计师做出了许多努力,包括在CPU内部设置缓存、优化CPU工作方式,尽量一次性从内存读取指令所要用到的全部数据等等。

(完)

文档信息