跳到主要内容

《寻路中国》读后感

· 阅读需 4 分钟

沉寂了一段时间,我重新拾起了阅读的习惯。最近,我找到了一个较为理想的阅读时段 - 上下班的地铁通勤时间。为了便于携带,我还特意购置了一部 Kindle 电子书阅读器。入手 Kindle 后,我便下载了几本书来阅读。《寻路中国》是近期的畅销书之一,因此也进入了我的视线。

我阅读的是该书的英文原版《Country Driving: A Journey Through China from Farm to Factory》,作者是彼得·海斯勒(Peter Hessler),这也是我读过的第一部非技术类的英文原版书籍。技术类书籍通常侧重于介绍专业内容,其词汇和语法相对基础,即使英语水平不高,也比较容易理解。而文学类作品,语言本身便是其重要的艺术表现手段之一,往往辞藻华丽、文采斐然,阅读难度自然也相对较高。我至今还记得大学刚过英语四级时,曾天真地以为自己可以轻松阅读英文原著,便兴冲冲地在书店买了一本《基督山伯爵》。结果回到宿舍翻了几页,发现一半的单词都不认识,这让我深受打击,从此便对阅读英文原版小说敬而远之。幸运的是,《Country Driving》属于纪实文学,其语言风格相对朴实,没有过多华丽的辞藻和修饰。而且,书中所描写的都是发生在中国的故事,不存在明显的文化隔阂,因此我读起来还算比较流畅。

《Country Driving》记录的是一位美国作家在中国的真实经历,书中的人物均为实名。全书分为三个部分:第一部分是作者两次沿着长城进行自驾游的见闻,描绘了中国广袤的乡村风貌;第二部分则聚焦于北京附近的一个小村庄,记录了当地村民在几年时间里的生活变迁,展现了中国农村在改革开放浪潮下的时代缩影;最后一部分将镜头转向浙江的一家民营工厂,真实地记录了工人们的生活状态,揭示了中国经济高速发展背后农民工群体的生存现状。

书中以翔实的笔触描绘了村民和工人们的生活环境、经济收入、日常作息,乃至他们的内心世界和思想斗争等细节。虽然我生长在中国,但由于生活环境的差异,也从未真正深入地接触过中国农村和农民工的生活,因此书中的内容对我来说充满了新鲜感。例如,书中描述了一次村基层换届选举的过程:这种选举通常情况下普通村民是没有参与资格的,但即便是有选举权的党员,也对当时那位无能且腐败的村支书表示强烈不满,希望能选出更合适的人选。然而,镇政府在了解到这一情况后,却派人到村里与党员逐个谈话,要求他们必须投票给现任支书。最终,这场选举沦为了一场彻头彻尾的走过场,毫无民主可言。

外国人书写中国,一个显著的优势或许在于他们能够以一种旁观者的视角,敏锐地发现我们早已习以为常、甚至视而不见的不合理之处。纵观全书,我并不认为作者对中国抱有偏见,但他对于一些落后的思想观念和制度弊端的嘲讽却是毫不留情的,笔锋犀利,发人深省。不知道这些意味深长的讽刺和批判是否会在中文译本中得到充分的体现。

查看或添加留言

中国人的起源

· 阅读需 3 分钟

据说汉族人中有一种独特的身体特征 - 复型小趾甲:即一只脚或双脚的小脚趾甲呈现分裂为左右两片的形状。我出于好奇,观察了一下身边的亲人,看看他们是否符合这一特征。根据我有限的样本观察,发现:我爸那边的亲戚中复型小趾甲较为常见,而我妈那边亲戚中则不明显。至于我自己,我清楚得记得,我小时候是有复型小趾甲的,但今天抬起脚丫一看,竟然消失得无影无踪了。老婆完全没有这种特征,豆豆也没有。

关于人类的起源,科学界主流观点是“单一起源说”。这一理论认为,现代人类的所有祖先均起源于非洲。大约在7万年前,人类祖先开始从非洲向世界各地迁徙和扩散。然而,中国官方却持一种独特的观点,也就是教科书中沿用的“多地起源假说”。按照这一理论,世界上的其他人种或许源于非洲的猴子,唯独中国人是由“土生土长”的中国猴子演化而来。

如果从这个视角看问题,一些奇怪的现象似乎可以解释得通了。比如,为什么有些国家的人能坦然走在康庄大道上,而中国人要摸着石头过河?也许这和祖先的起源有关:别的民族是旱猴子变的,而中国人是从水猴子进化来的。

不过,玩笑归玩笑,我个人更倾向于世界主流的单一起源说,因为这一理论有坚实的科学依据 - DNA 的对比分析。通过比较不同人群 DNA 之间的差异,可以推算出他们最近的共同祖先生活的年代;综合全球各地人类的 DNA 数据,还可以绘制出人类迁徙的完整路径。

前几天,我看了一部 BBC 的科教节目,其中详细介绍了人类祖先的扩散路径。研究表明,中国境内的现代人类祖先实际上来自两次大的迁徙浪潮,这也是南北方人基因差异显著的原因之一。

现代智人在大约 7 万年前,离开非洲后,其中一支沿着印度洋海岸一路向东,直到亚洲大陆的最东端,然后折向北方。在大约 5 万年前,进入中国南部。这一支迁徙者皮肤较深,颧骨较高,成为了南方人基因的基础。

另一支从智人走出非洲后,一路向北,直达西伯利亚,然后就在那定居了。直到 2 万年前地球气候开始变冷,西伯利亚的大部分地区被终年冰封,迫使一部分当地居民南下进入中国北方,逐渐成为北方蒙古人种的祖先。由于寒冷的气候,他们的皮肤变浅,脸部轮廓更加扁平,眼睛也逐渐变小。这些特征不仅是北方基因的标志,更在现代中国人的外貌中占据了主导地位。

尽管南方的原始人先一步定居中国,但从今天中国人的外貌特征来看,北方迁徙者的基因明显占据了主导地位。这种基因优势的确立,或许与北方人群的繁衍模式、社会组织结构,以及后来的诸多历史事件有关。

查看或添加留言

豆豆是运动健将

· 阅读需 2 分钟

胎动每小时3到5次即达到正常,豆豆在妈妈肚里那会儿,一小时动上三五十次都没问题。医生说这类小宝将来适合做运动员。

豆豆体力超好,每天上串下跳,一刻不停。前两天给他洗澡的时候,他又开始疯狂的踢水。我说咱们这回就让他玩个够,看看他到底能坚持踢多久。于是,他考在我手臂上,两腿交替蹬水蹬了七八分钟,终于累了。我想,这下累到你了吧,可以歇下来好好洗澡了。结果他脚累了玩手:身子往前一倾,开始用手扑腾水。一会手累了,再往后一靠,开始踢水。如此往复几次,地板上水漫金山,爷爷实在受不了了,一把按住他的脚丫,开始强行给他洗澡。

豆豆现在狂爱举高高,只要我朝他伸开双臂说一句“举高高”,他马上就会兴奋的尖叫,然后俩腿猛蹬。由于举高高哄的他很开心,他现在跟老爸感情极好,常常抱着我又啃又亲。

豆豆学会玩手了。现在如果让他“挠”一个,他就会举起小手握拳,张开,握拳再张开。豆豆是个右撇子,目前还只会挠右手。

豆豆抱着爸爸的大腿:
DSC02088

天黑了以后给我租住的房屋窗外照了张像,上海的夜晚亮如白昼
DSC02070

查看或添加留言

满七个月的豆豆

· 阅读需 1 分钟

再过几天豆豆就满七个月了,他的第四颗牙也终于长出来了。

DSC02008

豆豆淘的要命,不睡觉的时候,浑身乱动,没有一刻停歇的。不过睡着的时候,还是蛮安静的:)

DSC02049

今天,我试着把豆豆快速举起来再放下再举起来,玩了几次。哪知道他一下子就喜欢上这个新玩法:一听见“高高”两个字就兴奋,整天搂着我的脖子,不停的撅起他的小屁股表示还要玩。但是据说小宝不适合剧烈晃动,我也不敢跟他玩的太疯。

豆豆现在的主要辅食是米粉和蒸熟了的香蕉。香蕉蒸熟以后闻起来酸溜溜的,我看着就没食欲,豆豆却视若珍馐。所以家里总少不了摆着几串香蕉。

DSC01986

查看或添加留言

豆豆又长出两颗牙

· 阅读需 1 分钟

昨晚我抱着豆豆散步,豆豆突然就很委屈的大哭起来。豆豆从来不会无缘无故的哭闹,我们哄了他半天也不见好。我确定当时没有碰到或弄疼他,所以很担心他是不是生病了。豆豆哼唧了半个小时,心情才开始转好,可一家人整晚都在担心他。

早上,爷爷抱着豆豆出去散步,回来兴冲冲的说找到原因了。爷爷给豆豆擦口水的时候,一眼看到豆豆上牙床露出了两个白色的小尖尖,原来昨晚是冒头的小牙弄疼了豆豆。

一般小宝长牙都是一对一对的长,可是豆豆第一波只长出了左下方一颗门牙。一个月时间过去了,那颗小牙已经高高耸立于牙床之上,但它旁边的伙伴还是一点动静都没有。最后还是两颗上门牙占了先。豆豆现在有三颗牙啦!

查看或添加留言

普陀山游记

· 阅读需 2 分钟

周末公司组织去普陀山旅游。周五晚上从吴淞码头出发,第二天一早驶达普陀山。我们很不幸,因为周六正赶上台风袭击,整天都在下雨,而我们只能穿着雨衣打着伞游玩了。

DSC01759

不过台风也带来了意外的好处:由于短途的渡船都已停航,来参观的游客比较稀少,不会因为太过拥挤而影响旅游的心情。

DSC01784

普陀山这里自然风光很有限,所谓旅游就是看庙。我对烧香拜佛不感兴趣,所以我很少进入室内,每到一处就在庙外面练练摄影。

DSC01816

有些庙宇藏在深山里,安闲宁静。

DSC01814

有些寺庙临海而建,惊涛拍岸,颇有气势。

DSC01832

岛上最显眼的还是这尊铜制观音像,还没去参观她的时候,远远的就看到了。

DSC01843

台风只持续了一天就过去了,天气突然就从狂风暴雨转为风和日丽。

第二天的行程还是以看庙为主,首先去的是岛上规格最高的那座寺庙(庙太多,名字都没记住)。果然富丽堂皇,远远看去,和宫殿也可媲美。

image

除去寺庙,我们玩的唯一一处景点是千步沙,景色不错,唯一缺憾是海不够蓝。

DSC01906

我借用大家看庙的时间,脱离队伍去周围走了走,岛上颇有点幽静的田园气息,要是能生活在这里就爽了。

image

行程的最后一站是岛上最高的那座寺庙。寺庙都是大同小异的,然而登山途中的风光还是值得一看的。

DSC01943

DSC01950

查看或添加留言

关于相对论没搞明白的问题

· 阅读需 3 分钟

最近我在准备公司每周的技术讲座,主题是相对论。狭义相对论相对直观,大学物理课上就学得差不多了。但一提到广义相对论,我就有些犯难,毕竟我不是物理专业出身,面对那些弯曲的高维时空,总感觉像是在雾里看花。

广义相对论告诉我们,所谓的万有引力其实并不存在,它只是时空弯曲的一种表象。质量使时空弯曲,而物体在这种弯曲的高维时空中沿着“直线”运动 - 只不过,这种“直线”在四维时空中看起来是弯曲的,于是我们误以为有某种力在作用。乍一听,这是一个很有趣的解释,但越琢磨,越觉得其中的细节让人困惑。

广义相对论的核心是,物体在弯曲的时空中沿“最短路径”运动。然而,这并没有很好地解释原本“相对静止”的两个物体如何会开始运动起来。比如,树上的苹果和地球在我们看来是相对静止的,那么苹果为何会掉落到地面上呢?

我能想到两种可能的解释:

其一是,还有一种隐形的“力”依然存在。即便万有引力本身被否定,但质量可能引发了某种类似于力的效果,导致物体间的相对加速度。尽管广义相对论否认了这类“力”的存在。

另一种可能是高维空间中的绝对运动。假设苹果和地球在更高维的空间中本身就处于运动状态,而它们在四维时空中的投影呈现出相互趋近的结果。这意味着四维时空里的“静止”只是一种表象,而在更高维度中,运动是绝对的。按照这种解释,四维时空中的相对运动与高维空间中的绝对静止存在某种对偶关系。这种解释违背了我们的直觉,因为它强行引入了一个难以验证的高维世界。

广义相对论强调质量会扭曲周围的时空,但没有进一步解释为何会扭曲。这似乎跳过了一个重要问题:既然质量能够弯曲时空,为何不能将这种现象看作某种力的作用?换句话说,是否可以重新定义“力”,将其视为质量对时空的某种直接影响?

根据广义相对论,运动中的质量会导致时空弯曲的变化,这种变化以光速传播,称为引力波。引力波携带能量,因此物质在运动过程中,即使未受外力,也会因辐射引力波而损失能量。这种现象让我想到一个有趣的推论:

如果物质的能量可以通过引力波传递给时空,那么时空本身是否也具有能量,甚至“质量”?如果时空具备能量,那么它是否依然只是一个“背景”?或者说,时空本身就是物质的一种表现形式,物质与时空的界限是否从根本上就不存在?

如果时空是无限的,所有运动的物体都会因引力波辐射逐渐损耗能量,动能趋于零,最终达到一种“绝对静止”的状态。这样的结局听起来颇具宿命感:运动本身终究会熄灭,万物归于静寂。如果宇宙是有限的,引力波在某种意义上可能达到一种平衡,类似于黑体辐射的状态。

查看或添加留言

Silverlight程序中显示帧数的方法

· 阅读需 3 分钟

接到一个需求:要在 Silverlight 程序的界面上放置一些控制选项,可以开关 Silverlight 的 EnableFrameRateCounterEnableRedrawRegions 等和显示效率相关的一些设置项。我开始在网上查了一下,发现这几个与显示性能相关的设置主要用于承载 Silverlight 控件的 HTML 页面中,作为初始化参数进行设置。

这些属性(EnableFrameRateCounterEnableRedrawRegionsEnableGPUAcceleration)在 Silverlight 程序启动后仍然可以通过 JavaScript 代码在浏览器端进行修改,但并非所有修改都能立即生效。正如你所说,EnableGPUAcceleration 属性必须在 HTML 文件中设置为 trueEnableCacheVisualizationEnableFrameRateCounter 才能正常工作。这是因为这两个属性依赖于硬件加速,如果硬件加速没有启用,它们也就失去了意义。微软提供这几个属性的主要目的是为了帮助开发者调试和优化使用显卡加速的动画和图形效果。

EnableFrameRateCounter 被设置为 true 时,Silverlight 界面左上角会显示一些与 GPU 相关的数据,其中包括动画的刷新帧数 (FPS)。这个内置的帧数计数器对于快速查看性能很有用。然而,Silverlight 并没有直接提供 API 可以在程序代码中读取这个帧数数值。

为了在程序中获取帧数,通常需要使用 CompositionTarget.Rendering 事件。Silverlight 在每一帧渲染完成后都会触发这个事件。通过对该事件进行计数,并计算单位时间内事件发生的次数,就可以近似地得到每秒帧数。

但正如你发现的,通过 CompositionTarget.Rendering 事件计算出来的帧数,与 EnableFrameRateCounter 显示的帧数通常是不同的。这是因为两者统计帧数的机制有所差异:

  • EnableFrameRateCounter 显示的是 Silverlight 实际 渲染 的帧数,它反映了 GPU 的实际工作情况。如果 Silverlight 认为界面没有变化,不需要重绘,就不会触发渲染,显示的帧数就会较低,甚至为 0。例如,如果界面上只有一个静态图像,没有动画或用户交互,帧数就会很低。
  • CompositionTarget.Rendering 事件的触发次数与用户设置的 MaxFrameRate 和系统的繁忙程度密切相关。即使界面没有变化,只要时间到达了 MaxFrameRate 设定的间隔,CompositionTarget.Rendering 事件仍然会被触发。因此,通过该事件计算出的帧数,更接近于 Silverlight 尝试 渲染 的最大帧数,而不是实际 完成 的渲染帧数。

此外,还有一些细节需要补充:

  • MaxFrameRate 属性用于限制 Silverlight 应用程序的最大帧速率。默认情况下,Silverlight 的最大帧速率是 60fps。可以通过设置 MaxFrameRate 来降低帧速率,以节省 CPU 和 GPU 资源。
  • 使用 CompositionTarget.Rendering 计算帧数时,需要注意性能问题。频繁的事件处理可能会对程序性能产生一定的影响。因此,通常需要使用一个定时器来周期性地计算和更新帧数,而不是在每次事件触发时都进行计算。
  • 除了 EnableFrameRateCounterCompositionTarget.Rendering,还可以使用一些性能分析工具来更全面地了解 Silverlight 应用程序的性能,例如 Visual Studio 的性能分析器。

总而言之,EnableFrameRateCounter 提供了一个方便的快速查看帧数的方法,而 CompositionTarget.Rendering 则提供了一种在程序中计算帧数的途径。但需要理解它们之间的差异,并根据实际需求选择合适的方法。

查看或添加留言

Scrum

· 阅读需 5 分钟

我居然没能在网上找到这个词的中文翻译(也许可以称为迭代开发?)。Scrum 是一种敏捷开发框架,并非简单的“迭代开发”就能完全概括。虽然迭代是 Scrum 的核心组成部分,但 Scrum 还包含许多其他重要的概念和实践。直接使用英文“Scrum”是比较常见的做法。

Scrum 的核心思想是将大型、复杂的项目分解成小的、可管理的迭代周期,称为“Sprint”。每个 Sprint 的长度通常为 1 到 4 周(最常见的是 2 周)。在每个 Sprint 中,团队完成一部分可交付的产品增量。你用 LabVIEW 举例,如果采用 Scrum,并非一定要每月发布一个版本,而是每个 Sprint 结束时交付一个可用的增量。这个增量可能是一个新功能、一个 bug 修复,或者对现有功能的改进。重要的是,每个 Sprint 结束时,产品都应该有所进步,并可以进行演示和评估。因此,一年 12 个 Sprint,并不意味着一定有 12 个对外发布的大版本,而是 12 次内部的迭代交付和评审。

Scrum 的流行,一定程度上受到了 Google 等公司的影响,但并非完全是“示范效应”。更重要的是,Scrum 能够更好地应对快速变化的需求和市场环境,提高软件开发的效率和质量。Google 的“永远的 Beta 版”策略,更接近于持续交付和精益创业的理念,与 Scrum 有相似之处,但并非完全等同。持续交付强调更频繁的发布,甚至每天多次发布,而 Scrum 则更侧重于 Sprint 内的迭代和增量交付。

你提到“软件的很多新功能都是程序员或者经理拍脑袋想出来的,它们或许并不符合用户的需求”,这正是 Scrum 想要解决的问题之一。Scrum 强调以用户为中心,通过频繁的沟通和反馈,确保开发团队始终在构建用户真正需要的产品。尽早将产品展示给用户,并根据用户反馈进行调整,是 Scrum 的核心原则之一,这有助于减少浪费和提高用户满意度。

Scrum 流程并非适用于所有领域,你的盖楼例子很好地说明了这一点。盖楼的工序之间有严格的依赖关系,无法像软件开发那样进行灵活的迭代。将挖坑、地基、墙体等工序强行拆分成按月交付的“增量”,显然是不切实际的。Scrum 更适合于需求变化频繁、复杂性高、需要快速反馈和调整的项目,例如软件开发、网站开发、市场营销等。而对于一些流程固定、工序依赖性强的项目,例如建筑工程、大规模生产制造等,传统的瀑布式开发方法可能更为合适。

实际上,并非所有采用了 Scrum 的公司都获得了成功,例如,引入 Scrum 之后的诺基亚。Google 的成功和诺基亚的失败或许表明,开发流程并非决定企业成败的唯一因素,甚至不是主要因素。企业的成功与否受到市场、战略、产品、管理等多种因素的综合影响。也有可能,Scrum 并非万能药,它只在某些领域才能发挥出最佳效果。任何方法论都有其适用范围和局限性。

回到我熟悉的 LabVIEW。LabVIEW 的主要应用领域仍然是工业测控。这个领域的用户与互联网用户的一个明显差别在于,工业领域的客户通常更加谨慎,对稳定性的要求远高于对新功能和快速迭代的追求。他们更倾向于经过充分验证和测试的成熟技术。LabVIEW 每年升级一次,居然还有很多用户抱怨说升级太快了。与之对比,某个拼音输入法的用户们天天在论坛上抱怨:“都几个星期了,怎么还不更新?”如果让 LabVIEW 的用户每个月更新一次,他们恐怕难以接受。我估计 LabVIEW 在这一点上是无法完全照搬 Google 的模式的。工业领域的用户需要的是长期稳定可靠的解决方案,频繁更新反而可能带来不必要的风险和兼容性问题。

对于不能频繁从外部客户那里收集反馈的软件来说,如果一定要采用 Scrum 流程,那就只能更多地依赖内部反馈,例如从产品经理、测试人员、甚至是高层管理那里获取反馈。每个 Sprint 交付一个内部版本,然后给他们评审,再基于反馈进行下一个 Sprint 的开发。但我个人认为,敏捷开发的核心精髓在于最终用户的快速反馈,这使得软件可以紧跟用户需求的变化。内部人员,无论是谁,他们的需求都必然与最终用户有所偏差,都无法完全代表最终用户。因此,仅仅依靠内部反馈的“敏捷”,效果会大打折扣。至于 Scrum 流程中的其他实践,例如每日站立会议、用户故事、燃尽图等,都只是辅助手段,形式大于内容。没有最终用户的深度参与,新的开发流程可能只是换汤不换药,并不能真正发挥敏捷的优势。这种情况下,可能需要对 Scrum 进行一定的调整和裁剪,使其更适应内部驱动的开发模式。例如,可以更侧重于内部的迭代评审和测试,以确保产品质量和内部需求的满足。

查看或添加留言

豆豆的爬行姿势

· 阅读需 1 分钟

周末突然发现豆豆可以肚皮离地,仅靠手和膝盖把身体支撑起来。不过豆豆的爷爷奶奶说,他两星期前就可以支起来了,只不过我白天都不在家,没有看到而已。

尽管豆豆力气是够了,但神经系统还没发育好呢,所以还不能进行真正的爬行。他现在每次先把手放在胸前,撑起身体来,接下来向后使劲,把屁股撅得老高,然后再伸直腿,身体就嗞溜一下滑到后面去了。

DSC01575

查看或添加留言