打破思维的疆界

评书《人类简史》,原发表于我的豆瓣

哲学能让人思考事物和世界的本质,而历史能拓宽人的视野,了解现代的各种现象并非自然而然,也有可能仅仅是偶然,但在某种程度上也是有迹可循的。尤瓦尔以哲学的视角来解读宏观历史,中间穿插的各种学科的知识,其跨界程度会让你惊叹于作者博学的深度和广度。

以前经常会假想如果有一个上帝视角,站在太空的高度,能跨越时间和空间,随时都能截取某个时空的切面,以这种视角来看待地球上发生的事。比如把时间切换到公元1世纪,看地中海地区的古罗马不断壮大发展成横跨欧亚非大陆的庞大帝国的历程。再切到下一个场景,16世纪,西班牙人不断征服美洲,直到印加帝国的覆灭。以这种视角来看历史的发展,我们能看到什么?尤瓦尔的《人类简史》就提供了这样一种视角,通常在这种视角下很容易给人一种沧海一粟的感觉,但是本书给我们看到的不仅仅是沧海一粟这么简单,还有很多让人耳目一新的知识和观点:生物学、人类学、历史、哲学、社会政治、文明的兴起和覆灭、经济学、新兴科学等等,而且各类学科的知识看起来都很专业。

阅读全文 »

灿烂的代价

0

评电影《灿烂人生》,原发表于我的豆瓣

大约在4~5年前我已经看过一遍这部电影,后来一直念念不忘,好的电影能让人回味,促使人去思考。于是这一阵又花了6个小时重温了一遍这部电影,关注到很多细节,以前观影时的一些模糊的想法逐渐清晰起来,我想是时候整理一下这些想法了。

用6个小时看一个意大利家庭近40年的悲欢离合,6个小时表达的东西非常之多,所以本文的篇幅也稍长。

影片中穿插了很多与社会政治相关的相关情节和细节,有必要先介绍一下当时的大背景。意大利是二战时期的法西斯的轴心国之一,战后的经济增长速度很快,仅次于当时的日本和联邦德国,故事在这个时间段拉开了帷幕。70年代的红色旅等恐怖组织以及当时的国际能源涨价的原因,意大利经济开始进入疲软阶段。90年代又遭遇了经济和政治危机,成为笨猪五国之一。同时,黑手党也猖獗起来,很多反黑手党的人被暗杀,意大利展开了打击西西里黑手党的斗争。

阅读全文 »

从 React 的组件更新谈 Immutable 的应用

在上一篇文章《Immutable 在 JavaScript 中的应用》 中主要介绍了 Immutable 之于 JavaScript。而基于 Immutable 的特性,将其应用在 React 项目的开发中非常合适,解决了 React 中的一些痛点,能进一步提升 React 组件的性能以及更好的管理组件的状态。

在介绍 Immutable 如何在 React 中应用之前,先来谈谈 React 组件是如何更新的。

React 是基于状态驱动的开发,可以将一个组件看成是一个有限状态机,组件要更新,必须更新状态。

通常说的组件的状态就是组件的 state 对象,state 是可以由当前组件自行修改更新的,这种自更新的状态的为了便于理解区分可以称之为“动态”的状态。但除了更新 state 外,组件还可以通过 props 来更新,props 属性不能由组件自行修改,必须由父组件来修改,然后再传递给当前组件,更新组件的 props 也能引起组件的更新,可以将 props 称之为“静态”的状态。这样的状态区分是广义上的,如果你不认可 props 也是状态也没关系,这里可以不用拘泥于文字。

阅读全文 »

谈谈 external 模式的打包

模块化在前端日新月异的工程化工具的推动下已经摆脱了前端模块加载器(SeaJS、RequireJS)的束缚,现在通常的方案是使用 browserify 或 webpack 来将模块化的文件打包,然后直接在浏览器端使用。

但是通常的打包策略是将整个项目打包成一个文件 bundle.js,默认情况下 bundle.js 中囊括了所有的依赖,包括第三方的从 node_modules 中加载的文件,这会造成 bundle.js 非常臃肿,而且在生产环境中不能很好的利用静态资源的缓存策略。这些打包技术在国外非常火,生产环境提供一个 bundle.js 的做法在国外的网络环境下毫无压力,但是国内的网络环境和国外的没法比,为了下载的性能还是建议分开打包。

分开打包还有一个好处就是,目前的前端开发环境现在都流行使用监测文件的变化而使用 livereload 技术,这也意味着会存在实时动态打包的需求,分开打包对于实时打包的速度有质的影响,对于基本不会变化的第三方模块没有必要每次做实时动态打包的时候都包含进去。

阅读全文 »

Immutable 在 JavaScript 中的应用

Mutable 对象

在 JavaScript 中,对象是引用类型的数据,其优点在于频繁的修改对象时都是在原对象的基础上修改,并不需要重新创建,这样可以有效的利用内存,不会造成内存空间的浪费,对象的这种特性可以称之为 Mutable,中文的字面意思是「可变」。

对于 Mutable 的对象,其灵活多变的优点有时可能会成为其缺点,越是灵活多变的数据越是不好控制,对于一个复杂结构的对象来说,一不小心就在某个不经意间修改了数据,假如该对象又在多个作用域中用到,此时很难预见到数据是否改变以及何时改变的。

var obj = { /* 一个复杂结构的对象 */ };

doSomething(obj);
// 上面的函数之行完后,此时的 obj 还是最初的那个 obj 吗?

针对这种问题,常规的解决办法可以通过将对象进行深拷贝的形式复制出一个新的对象,再在新对象上做修改的操作,这样能确保数据的可控性,但是频繁的复制会造成内存空间的大量浪费。

var obj = { /* 一个复杂结构的对象 */ };

// copy 出一个新的 obj2
// 但是 copy 操作会浪费内存空间
var obj2 = deepClone(obj);

doSomething(obj2);
// 上面的函数之行完后,无论 obj2 是否变化,obj 肯定还是原来那个 obj
阅读全文 »