记录梦境 5 – 在梦中开车

    一般来说:“日有所思,夜有所梦”。我想这是很有道理的,比如我经常梦见自己的牙齿掉下来。因为现实生活中我的牙齿的确很糟糕,我总是担心它们有朝一日会脱落。

    驾驶汽车也是经常被梦到的事件,但这件事似乎并不能用“日有所思,夜有所梦”来解释了。
    现实生活中,我已经拿到驾照六年多了。我对自己的驾驶技术非常有信心,并且,我还比较谨慎,开车不算快,尽量不超车,启动、刹车都很平缓。所以跟别人一同驾车外出时,我一般会要求我自己来驾驶,我相信自己开会更安全些。但是我的驾照是开小车的,不能开大客。我也不是经常开车,每年只开两个月:)
    在梦中,似乎一切都是和现实相反的:我总是驾驶着一辆大型客车,车上很多乘客;刹车永远是坏的,无论我怎么用力踩,车都停不下,还是往前面的东西上撞;换档杆特别复杂,怎么也换不到我想要的档位。我应该不会担心我的车技啊,怎么常做这样的梦呢?

生活随笔

编辑

选择结构

    选择结构相当于文本语言中的条件语句。LabVIEW 8 中新增加的 Diagram Disable Structure,Conditional Disabled Structure 类似 C 语言中的条件宏定义语句。

一. 程序框图禁用结构(Diagram Disable Structure)

    在调试程序时常常会用到程序框图禁用结构。程序框图禁用结构中只有 Enabled 的一页会在运行时执行,而 Disabled 页是被禁用、即不会执行的;并且在运行时,Disable 页面里的 SubVI 不会被调入内存。所以,被禁用的页面如果有语法错误也不会影响整个程序的运行。这是一般选择结构(Case Structure)无法做到的。



图1、2:使用程序框图禁用结构

    例如图 1、2 中的示例,如果我们在运行程序的时候暂时不希望将 test 写入到文件里,但又觉得有可能以后会用到。此时,就可以使用程序框图禁用结构把不需要得程序禁用掉。需要注意的是程序框图禁用结构可以有多个被禁用的框架,但必须有且只能有一个被使用的框架。在被使用的框架中,一定要实现正确的逻辑,比如上图的例子中,在被使用的框架中一定要有连线把前后的文件句柄和错误处理联接好。

二. 条件禁用结构(Conditional Disabled Structure)

    条件禁用结构则根据用户设定的符号(symbol)的值来决定执行哪一页面上的程序。其他方面与程序框图禁用结构相同。
程序中所使用的符号,可以在项目或是运行目标机器(例如“My Computer”)的属性里设置。


图3:条件禁用结构

    值得注意的是:程序框图禁用结构与条件禁用结构都是静态的,如果需要在运行时决定执行哪一部分的程序可以使用选择结构。

    程序框图禁用结构和条件禁用结构的一种实用案例可以参考:《其它常用调试工具和方法

三. 选择结构(Case Structure)

    在一般情况下,选择结构类似于 C 语言的 switch 语句。当输入为 bool 数据类型或 error 数据类型时,选择结构类似于 C 语言中的 if 语句。


图4:枚举类型的 Case Selector

    有输出时,则每一个框架中都必须连一个数据,当然也可以选择“Use Default If Unwired”。选择“Use Default If Unwired”会有一定的风险,因为你可能会忘记了连线,这时候 LabVIEW 并不会提醒你,程序就可能得到不可预料的结果。
    如图5所示,鼠标右击数据输出隧道,可以选择是否使用“Use Default If Unwired”


图5:选择 Use Default If Unwired

相关文章:
    我和 LabVIEW

编辑

顺序结构

一. 程序执行顺序

LabVIEW 是数据流驱动的编程语言。程序在执行时按照数据在连线上的流动方向执行。同时,LabVIEW 是自动多线程的编程语言。如果在程序中有两个并行放置、它们之间没有任何连线的模块,则LabVIEW会把它们放置到不同的线程中,并行执行。


图1、2:顺序执行 和 并行执行 的例子

顺序执行(图1):数据会从控制控件流向显示型控件,因此数据流经的顺序为“error in”控件,“SubVI A”,“SubVI B”,“error out”控件,这也是这个VI的执行顺序。
并行执行(图2):“SubVI A”,“SubVI B”没有数据线相互连接,它们会自动被并行执行。所以这个VI的执行顺序是“SubVI A”,“SubVI B”同时执行,当它们都执行完成以后,再执行“Merge Errors.vi”。

二. 顺序结构

如果需要让几个没有互相连线的VI,按照一定的顺序执行,可以使用顺序结构来完成(Sequence Structure)。


图3:Menu Palette

当程序运行到顺序结构时,会按照一个框架接着一个框架的顺序依次执行。每个框架中的代码全部执行结束,才会再开始执行下一个框架。把代码放置在不同的框架中就可以保证它们的执行顺序。
LabVIEW 有两种顺序结构,分别是层叠式顺序结构(Stacked Sequence Structure)、平铺式顺序结构(Flat Sequence Structure)。这两种顺序结构功能完全相同。平铺式顺序结构把所有的框架按照从左到右的顺序展开在 VI 的框图上;而层叠式顺序结构的每个框架是重叠的,只有一个框架可以直接在 VI 的框图上显示出来。在层叠式顺序的不同的框架之间如需要传递数据,需要使用顺序结构局部变量(Sequence Local)方可。


图4:层叠式顺序结构

三. 顺序结构的使用

好的编程风格应尽可能少使用层叠式顺序结构。层叠式顺序结构的优点是及部分代码重迭在一起,可以减少代码占用的屏幕空间。但它的缺点也是显而易见的:因为每次只能看到程序的部分代码,尤其是当使用sequence local传递数据时,要搞清楚数据是从哪里传来的或传到哪里去就比较麻烦。


图5:转换顺序结构

使用平铺式顺序结构可以大大提高程序的可读性,但一个编写得好的 VI 是可以不使用任何顺序结构的。由于 LabVIEW 是数据流驱动的编程语言,那么完全可以使用VI间连线来保证程序的运行顺序。对于原本没有可连线的 LabVIEW 自带函数,比如延时函数,也可以为其包装一个 VI,并使用 error in, error out,这样就可以为使用它的VI提供连线,以保证运行顺序。


图6:改进的延时 VI

 

相关文章:
博客版《我和 LabVIEW》

 

《魔鬼经济学》读后感

    这本《魔鬼经济学》是我在地铁口的书摊上买的,当时也是贪个小便宜。回家打开书一看,原来是盗版书,满篇都是错别字,好在还没达到影响理解内容的程度。看来小便宜不能占啊!

   《魔鬼经济学》也是一本非常值得一读的书,他和其它教材型的经济书相比,知识方面介绍得并不广泛,但娱乐性更强一些。这本书没有一个统一的主题,而是讨论了几个独立的很有趣味的话题,比如:哪一类人的诚信度比较差、人在什么环境下倾向于撒谎、3K党是如何组织的、黑帮的经济活动、堕胎与犯罪率之间的关系等等。
    虽然这本书没有一个统一的主题,但明显地可以看出作者所有的话题都在试图传递同一个思想:有些事件,看上去似乎是某个原因引起的,但实际上它却是另一个因素的结果而已:真正的更本质的原因往往是隐藏在其后的,也许是你从来未曾想到过的。

    在这本书讨论的众多话题中,给我印象最深的是关于关于黑帮成员是如何分赃的那一段。我是一个俗人,所以一看见和收入、分配相关的内容就格外兴奋,记忆力也仿佛好一些:)。下面,就以讨论影响某个人的工资水平的因素,来作为这本《魔鬼经济学》的读后感吧。当然我们讨论的将是在美国的情况,这比讨论中国现状来得安全。
    一个人的工资收入首先与他从事的行业有关,不同行业间工资水平的差距远远大于行业内不同个体之间的差异。所以才有“男怕入错行”这一说。
    一个行业收入的高低从根本上讲,是由劳动力供求关系决定的:职位数量少,求职的人多,工资就低;否则就高,这是符合经济学原理的。深入一点分析,有四个因素(这四条是《魔鬼经济学》中给出的)会影响到某个行业劳动力的供求关系:有多少人愿意从事这项工作、工作所要求的专业技能水平、工作让人产生的不快感、以及市场对这个行业所提供的产品或服务的需求量。
    用这四点可以很容易解释为什么妓女的平均收入比程序员还高(《魔鬼经济学》上给出的例子是建筑师,不过程序员更贴近我的生活啦):①基本上没有任何一个女孩子梦想着自己长大后去当妓女,愿意从事这个职业的人较少;②妓女的技能是要在非常具体的环境当中才能磨炼出来;③妓女所从事的工作让她们感到很不愉快,这份工作有潜在的威胁,并且她们很可能会因此失去获得幸福家庭的机会;④想找妓女的服务的人远远多于想找程序员服务的人。以上几点就导致了相对于程序员来说妓女可能是供不应求的,因而妓女这个行业的平均收入较高。(美国情况,其他国家情况可能不同)
    影响劳动力供求关系的另一个重要的因素是:是否有垄断存在。在大多数发达国家,劳动力都被一个叫做“工会”组织所垄断。雇主必须同工会协商讨论工资的高低。而全国只有一家工会,是绝对的垄断机构,可以在谈判中占尽优势。因此,拥有一个真正为劳动者服务的工会,就能大大提高工资水平。

    同一个行业内,个体之间也存在工资差距。原因是多方面的,原因之一是由于个人的业务水平不同,创造出的价值也不同,所以想要提高收入,必须提高自己的工作能力和水平。
    还有一个因素,是由于每个人对工资的期望不同引起的。这一点是我在读《经济学原理》中解释价格歧视一段时突然领悟的。

《生活随笔》

编辑

一个 XControl 的实例

XControl 与 .ctl 用户定义控件相比,其最大的提高就在于它不但可以定义控件的外观,还可以定义控件的行为。
在 XControl 出现之前,同样可以在程序中编写代码,控制程序的行为。在《用 XControl 实现面向组件的编程》一文中提到了,这种方法在程序模块划分上有缺陷。如果用户想发布一个带有特定行为的控件也是不可能的,因为控制控件行为的代码,是同其它代码混杂在一起的。

利用 XControl 可以解决上面提到的问题,这里以一个例子说明一下如何利用 XControl 实现一个有特定行为的控件。
Windows 风格的工具条上的按钮有一个特点,就是当鼠标移动到按钮上方,按钮就会变亮或浮起。LabVIEW 中默认的按钮没有这样的特性,但是实现这一点是很容易的。
以鼠标移上,按钮变亮为例:在程序中,当按钮的 Mouse Enter 事件发生时,把按钮的颜色设置为浅颜色;当按钮的 Mouse Leave 事件发生时,把按钮的颜色设置为深色即可。现在把界面上的按钮和控制颜色的代码都封装在一个 XControl 中。这样,其他人在使用这个 XControl时,就无需修改他的代码,而直接获得这种颜色变化的特性了。

一、简单行为的 XControl

首先创建一个空的 XControl。


图1、2:创建一个新的 XControl

新的 XControl 中有四个 VI。
Data.ctl 定义 XControl 的数据类型。比如我们要做一个按钮,数据类型应该是布尔型。如果要作一个工具条,数据类型就应该是布尔型数组了。
State.ctl 定义 XControl 内部要用到的一些数据,类似于类的私有变量。我们这个简单的例子用不到任何变量,所以可以不去动它。
Init.vi 类似于类的构造函数。在我们这个简单的例子中也不需要去改变它。
Facade.vi 是最主要的 VI,XControl 的外观和行为都是在这个 VI 中定义的。Facade.vi 的界面就是 XControl 控件的外观。控制控件行为的代码也是放在这个 VI 的程序框图上。

我们要做的是个按钮,所以就在 Facade.vi 的前面板上放一个按钮。如果希望用户在使用这个 XControl 时可以调整它的大小,在我们这个简单例子中,只要设置 Facade.vi 窗口尺寸属性中的“在窗口尺寸变化时,按比例调整控件大小”这个选项就可以了。对于复杂的 XControl 控件,要另写代码,在窗口尺寸变化后重新计算每个控件的大小和位置。


图3:窗口尺寸属性设置

控制按钮颜色的代码也需要放在 Facade.vi 中:把前文提到的按钮的 Mouse Enter 和 Mouse Leave 放在这里即可。具体实现方法,可以参考文章结尾给出的范例程序

二、有持续运动的 XControl

Facade.vi 不能够持续运行,只有在有事件发生时,LabVIEW 才会调用这个 VI。处理完这个事件,Facade.vi 就会停止运行。不要试图让 Facade.vi 持续运行,否则会导致整个 LabVIEW 被挂起。
有时候,需要控件能够循环地或者持续一段时间地作一个动作。比如说,需要做一个不停闪烁的小灯。控制灯光闪烁的代码就不能够放在 Facade.vi 中。实现这种功能的一个方法是:
把定时控制小灯颜色的代码放在一个可重入 VI 中,通过小灯控件的引用参考来定时更改它的颜色属性。在 XControl 的 Init.vi 中把这个定时 VI 动态加载并以异步方式运行;在 XControl 的 Uninit.vi 中再把这个定时 VI 卸载即可。Uninit.vi 不是一个必须的 XControl 功能定义 VI(Ability VI),新建的 XControl 没有这个 VI。可以在工程浏览窗口,鼠标右击这个 XControl 来为它添加新的功能定义 VI。
范例在这里,它只能在 LabVIEW 8.5 下打开。

XControl 是可以在 VI 的面板上放多个实例的,每个实例小灯的闪烁频率可能不同。我在这个例子里,每个 XControl 实例都有自己的一个专用定时 VI,因为这些 VI 是可重入的。定时的方法我采用的是加延时。
我做了一下测试,发现现在的 XControl 有个问题,就是在程序面板上放多个 XControl 实例之后,定时就变得非常不准确了,小灯闪烁速度明显减慢。这也许是 XControl 的 bug,也许是 LabVIEW 延时函数的问题。解决这个问题的方法就是使用一个定时 VI 控制所有的实例,当然这样的实现方法会比较麻烦一些。

下载文章中的示例程序:
http://decibel.ni.com/content/docs/DOC-1270
http://decibel.ni.com/content/docs/DOC-1098

相关文章:
博客版《我和 LabVIEW》

《百家讲坛》苏轼

    到昨天,《百家讲坛》10集的苏轼专题刚好讲完。《百家讲坛》是我最喜欢的电视节目之一,不过,从我开始收看它起,它的主体几乎都是历史题材的,可能是历史人物和故事最容易被大众所接受吧。到目前为止,我最喜欢的系列讲座是《明亡清兴60年》,究其原因,主要是因为袁崇焕是一个我比较钦佩的历史人物。只可惜这个主题是断断续续播出的,中间插了一些其它话题,到现在也还没有完全播完。

    这辑苏轼系列讲得也蛮不错的。以前我只知道苏轼是大文豪。我非常喜欢他的词,但对他的生平几乎毫无了解。听了这几期讲座,才知道他的人生竟是如此坎坷。不过,细想想也是,不经历一些这样的人生起伏,哪可能写得出那么多可以流传千古的字句呢?
    上高中的阶段,是我最喜欢诗词的时候:原本只是为了应付考试,却突然感悟到了那些词句中的美丽,于是差不多背诵了所有最著名的古诗词。到了大学,学的是工科,再就很少接触到诗了。现在,业余时间读的书不是计算机方面的,就是经济类的,管理类的,文学、艺术方面的就很少读了。看来,我似乎是个没太多情趣的人,可即便如此,还是有些诗句能够引起我的共鸣的。这也就是文学艺术的魅力所在了吧。
    “枝上柳绵吹又少,天涯何处无芳草”–前两天躺在床上,又听到了曾经如此熟悉的句子。以前,一直以为这首词是有关爱情的,专为失恋人士而做。但时隔多年,再次听到它,感受已经完全不同了。也许是因为年岁增长了,经历丰富了,我觉得越来越可以体会到苏轼这首词的意境了。毕竟,他写这首词的时候已过耳顺之年,又刚刚被贬至南疆。

    “枝上柳绵吹又少,天涯何处无芳草”–更多的应该是在感叹人生短暂,激励自己不论身处何种处境,都要保持乐观,随遇而安。我最近在读《高效能人士的七个习惯》一本书,刚好读到“人类的终极自由”(the last of the human freedoms),就是人有选择的自由:即便在最最最恶劣的环境下,人也可以选择不要痛苦,让心情不再受制于别人给的待遇。两篇文章时隔千年,道理却是相通的。
    我觉得我自己总的来说算是一个乐观的人吧,我相信生活会越来越好,偶尔还会尝试着超越自己。我也算比较随遇而安吧,什么样的饭菜都吃得下,多破烂的屋子也可以住得惯。
    不过,有的时候我也会显示出悲观的一面,尤其要对生活状态做改变的时候,还是有些畏首畏尾,犹豫不决。保持乐观豁达的情怀,说说容易,做起来还真难啊。

《生活随笔》


纪念一下苏轼:

    念奴娇 · 赤壁怀古
大江东去,浪淘尽、千古风流人物。故垒西边人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。
遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾谈笑间,强虏灰飞烟灭。故国神游,多情应笑我,早生华发。人间如梦,一尊还酹江月。

    水调歌头 ·  丙辰中秋欢饮达旦,大醉作此篇,兼怀子由。
明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又恐琼楼玉宇,高处不胜寒。起舞弄清影,何似在人间!
转朱阁,低绮户,照无眠。不应有恨,何事长向别时圆?人有悲欢离合,月有阴晴圆缺,此事古难全。但愿人长久,千里共婵娟。

    江城子 · 乙卯正月二十夜记梦
十年生死两茫茫,不思量,自难忘。 千里孤坟,无处话凄凉。 纵使相逢应不识,尘满面,鬓如霜。
夜来幽梦忽还乡。小轩窗,正梳妆。 相顾无言,惟有泪千行。 料得年年肠断处:明月夜,短松冈。

    蝶恋花
花褪残红青杏小。燕子飞时,绿水人家绕。枝上柳绵吹又少,天涯何处无芳草。
墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄,多情却被无情恼。

    定风波
莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。

    临江仙
夜饮东坡醒复醉,归来仿佛三更。家童鼻息已雷鸣,敲门都不应,倚帐听江声。
长恨此身非我有,何时忘却营营。夜阑风静彀纹平,小舟从此逝,江海寄余生。

    卜算子 · 黄州定慧院寓居作
缺月挂疏桐,漏断人初静。谁见幽人独往来,缥缈孤鸿影。
惊起却回头,有恨无人省。拣尽寒枝不肯栖,寂寞沙洲冷。

在程序中使用类型定义(type def)

    在 C 和 C++ 中,程序员可以使用 typedef 来定义自己的数据类型。typedef 的首要好处是使得程序具有更好的可读性,可以为某种数据类型起一个针对你的程序有意义的名字;另一个好处就是,如果这个数据类型需要作改动,只要在 typedef 语句处改动就可以了,程序中使用了这个数据类型的代码部分不需要作任何改动。

    在 LabVIEW 中可以使用类型定义,或者严格类型定义来实现类似的功能(参考:用户自定义控件中 Control, Type Def. 和 Strict Type Def. 的区别)。

    在 LabVIEW 中如果使用到某种自定义的 Cluster,并且还要把它的数据在子 VI 间传递,那么一定要为它做一个类型定义。经常出现的一种情况是,在你编写了一部分代码之后,发现需要添加或删除这个 Cluster 中的某个元素。如果没有类型定义,那么你就需要手工的打开每一个使用了这个控件的 VI,一个一个修改它们。如果使用了类型定义,只需要修改一下对应的 .ctl 文件,所有的类型定义实例自动会跟着更新,这样方便多了。
    类似的情况还有:要为 Ring 和 Enum 控件做严格类型定义。Ring 和 Enum 中的项目在程序开发过程中使经常被改动的。

 

相关文章:
   
我和 LabVIEW
    LabVIEW 代码中常见的错误

如何有效地在面试中考察应聘者的能力

又到一年的招聘季节了。这一年我又面试的不少人,也被别人面试了几次。所以再次总结一下自己的心得。

先说说被面试的感受:我的总体感觉是,中国的面试官喜欢问一些技术细节问题,最常见的一些问题包括类继承、虚函数、多线程同步、内存分配、字符串拷贝等等;而美国的面试官比较喜欢问你过去的一些经历,最常见的问法就是你有没有遇到过XXX的情形,你是怎么解决的,最后的结果如何等等。
我个人比较喜欢美国面试官的这种风格。

这些年来,由于公司的培训,再加上亲身体验和不断总结反思,我面试别人的风格也起了很大的转变。
最初,我问应聘者最多的也都是一些答案比较直接的问题,比如为某一问题设计一个算法、程序运行出现某一错误,可能原因有哪些、如何调试某种错误、喜欢什么样的公司、什么样的老板等等。问这类问题的好处是他们的答案对于我来说是有明显对错之分的,判断一个人答得好不好相对比较容易。
这类问题的缺点也很明显:答案好不好,不代表一个人适不适合我们公司。这些技术问题都太过于片面和细节:即使一个人答得很好,无法判断是他的水平高,还是因为他恰好看过这个题目;如果答得不好,也不能确定是他水平不够,还是因为他钻研的领域不在于此。问的非技术类的问题作用也不太大,应聘者很少有人答得太离谱的。而一般的答案又反映不出他太多的信息,对最后是否录取他没有太多参考价值。
更何况,这些问题的回答是有套路的,技术问题有专门的参考书,非技术问题也已经有人把标准答案都总结好了。面试前花一两天把所有问题学习一下,看看别人的面经,就可以把自己包装得比较完美了。

在我意识到这些问题之后,我就开始思考如何来改进这种面试方法了。换句话说,我希望把面试中对一个人技术的考察,转变为对这个人能力的考察。一个员工进入我们公司,平均干个 4,5 年应该不成问题吧。只要他的能力够用,没有什么技术细节是掌握不了的。
于是,开始做调整。首先,有关技术细节的问题就不再问了,改为问一些没什么确定答案的问题。比如,我听说有些公司喜欢问诸如一个城市有多少下水井、某动物种群有多少个体这样的问题。对于这类问题,不是直接就能给出最终答案的,面试官可以观察到应聘者的解题思路,更好得了解他解决问题的能力。
不过,这些问题还是有解题套路可循,总有那么一种思考方式是优于其它解题思路的。所以,考官有时还是分不清楚,应聘者给出了最佳答案是因为他平时的思考方式就是如此,还是因为面试前刚学到了这个套路。

那个阶段,我面试时主要跟应聘者了解他以前做过的项目。一般来说,如果应聘者可以清楚地解释他做过的项目,并且重点突出,就可以证明他非常关心自己的工作、曾做过深入研究、并且具有良好的表达能力。能满足这几方面的应聘者也正是我们所要寻找的。
其实,这样单纯谈论项目的面试方法也有弊病。最主要的是面试官对面试的方向掌控不够。应聘者如果懂得避实击虚,就可以只讲自己擅长的方面,因而面试官有时不能全面地了解应聘者。为了弥补不足,面试官还是需要主动问一些不同方面的问题的。

现在,一种比较被大家认可的面试方法叫做:SBO,它是三个英文单词的缩写:Situation, Behavior, Outcome。也有人提出 CAB, PAR,STAR 等方法,它们所代表的意思都是类似的。就是说先由面试官指定一个情景(或者挑战、问题、任务等),让面试者给出一个具体例子,说明他以前是如何应对这种情景的,最后结局又是如何。面试官还要适当询问应聘者经历中的一些细节,以此来判断应聘者的能力、性格等。面试过程中,面试官需要准备多个不同方面的 SBO 问题,针对应聘者的解决问题能力、学习能力、交流能力、是否有激情、是否乐于助人等等,尽量进行全面的考察。
这种方法也是我现在面试别人时主要采用的方法。他的优点是:
依据应聘者的真实的经历来评价他,比依据他对于假设的情形或题目的解答更加可靠;
不必区分应聘者以前研究的技术领域;
面试官可以问每个应聘者相同的问题,便于横向比较。而应聘者是否看过类似的问题并不会影响面试官对他的判断。

相关文章:
面试官的面经
生活随笔

编辑

洗澡的故事

    前几天去南京招聘去了,所以也没时间更新 blog。

    同去南京的是两男两女共四个人:me, 男同事, mma, mmb。
    到南京的头一天下午,我们就去学校做了宣讲会,收到了一大堆学生的简历。开完宣讲会已经到晚饭时间了,我们直接去吃晚饭。饭后散步回酒店的路上,恰好经过一个水果摊,于是我们又买了一个柚子,半斤青枣作为零食。
    回到旅馆,我们就开始忙着挑选简历。投递简历的学生太多了,但是我们只能从中选出一部分参加第二天的笔试。挑选简历主要由三个人负责,mma 相对清闲一些。大家正在认真挑简历的时候,男同事突然叫了 mma 一声,然后诚恳地对她说:“你要是不忙,就先帮我洗个枣吧。”

编辑

《经济学原理》读后感

    这本书的英文名是:Principles of Economics,作者:N. Gregory Mankiw。依我看来,这是一本每个人都应当读一读的好书,若你对经济学知之甚少,则尤其如此。我看的这个版本是它的第三版中文版,由梁小民翻译,分上下两册。现在最新的英文版已经是第五版了。我现在只读完了它的上册,即前十七章。我打算先暂停一段时间,看看其他的书,然后再继续学习它的下册。
    我这个人是比较缺乏经济头脑的:不会赚钱、不会投资、也不会花钱。从小,周围就没有真正懂经济学的人,所以没有受到过这方面的熏陶。因而对我来说,就不是单纯看看投资一类的书就可以学会赚钱的了,需要从头开始,首先培养自己最基础的思考问题的方法。
    读完这本书,果然收获不小。很多以前不是太明白的一些现象,现在都有了一些新的理解:大到国家的经济,比如,中美之间的贸易对谁有利,对谁有弊;英国当年为啥要搞圈地运动;小到个人经济,比如我的工资是如何被制定的等等。以后我会慢慢把这些想法都整理记录下来。

    这本经济学原理的开篇就提出了经济学的十大原理,其后的章节都是围绕着这十大原理对各种社会经济现象进行的分析论述。在这里,我就以重新复习一遍这十个原理的方式来作为自己的读后感吧。这十大原理中的头两条不单适用于经济学领域,而是对我们所做的任何决定都适用,所以我在这里对这两条做了评论。其它条目领会得还不够深,要过些时候单独写评论。

    1. People face tradeoffs. 人们面临权衡取舍。
    这一条作为十大原理之首,是因为每个人即便从未学过经济也会对它有最深刻的体会。经济学中所有的问题归根结底都是由这个权衡取舍引出来的;而经济学研究的意义也正是在于帮助人们在权衡取舍中选择最优的方案。
    我想大家应该都有过和我同样的体会:欲望很多,能得到满足的却很少。
    鱼和熊掌不可得兼,舍鱼而取熊掌,这是一个最熟为人知的权衡取舍。而我自己也是每天面对各种权衡取舍:早饭吃包子还是油条;多花点时间工作还是多花点时间锻炼身体;平时多学计算机还多学习经济;是买房还是投资;是愁眉苦脸地计划将来的每一步路,还是干脆啥也不想又傻又开心的过日子。

    2. The cost of something is what you give up to get it. 某种东西的成本是为了得到他所放弃的东西。
    假设我现在开始考虑是应该出去做搬运工还是去上大学,去当搬运工可以每月有1000元的收入,而上大学没有收入还要交学费。这样看来,还是当搬运工比较合算,但这是在没有计算成本之前。做搬运工是有成本的,它的成本就是因为没有去上大学而失去的一切,其中之一就是毕业后的工资收入。假设你这辈子工作30年然后退休,则做搬运工的成本是大学毕业后一辈子的收入,至少3百万元;而做搬运工的收益顶多只有它的1/3,收益减掉成本其实是亏损了2百万元的。所以,对于普通人来说,如果有机会上大学就千万别去做小工。
    上大学也是有成本的,它的成本不单是学费,还包括因为上学而失去的工作机会。对于不同的人来说,出去工作能赚到的钱数大不不同,因而人与人之间上大学的成本也有着天壤之别。比如说我,假如不上大学,也许就只能当搬运工,这个成本是非常低的,那当然是上大学比较合算。但比尔盖茨没有上完大学,就去开了一家软件公司并且占领PC机操作系统市场,收益相当于大约1000亿美元。这个成本实在是太大了,对于他来说显然读完大学是不合算的了。基于同样的原因,没有选择上大学的还有 Apple 的总裁,Oracle 的总裁,众多的体育明星等等。

    在金钱方面,人与人之间是非常不平等的,贫富之间差距巨大。但有些东西人与人之间基本平等,比如生命,每个人都只有一次;比如时间,大多数现代人都拥有60~80年。
    在时间与金钱之间做权衡取舍又是一个最常见的问题。时间这东西在不同的情形下,所对应的金钱是大不相同的。对于穷人来说,时间并不值钱,对于富人则正好相反;对于同一个人,时间剩得越少,越觉得它值钱。一个人在年轻的时候,做实习生,一个月有500块钱就可以乐得屁颠屁颠的;而当他即将去见上帝的时候,哪怕花5万块钱延长一天的生命,也觉得值得。
    我要去城里的另一边,可以打的,也可与坐公交。也就是说,除了舒适之外,更要在50块钱和多花费在路上的一个小时的时间之间权衡取舍。对于我来说,50块钱还不是一个可以想都不去想的数字,不过我经常这样说服自己:算了,就花50块钱吧。到我快死的时候,这50块钱也许连1分钟都买不来;而现在能买来1个小时,已经很合算了。

    有些权衡取舍非常容易做决定,因为成本比较低。比如是取鱼还是取熊掌。我决不会在饭桌上为这个问题多费脑筋,无论选什么,成本都不高。有些决定就难做了,比如当生和义不可得兼,取生还是取义?无论取什么,其成本都大的不可估量。

    3. Rational people think at the margin. 理性人考虑边际量。

    4. People respond to incentives. 人们会对激励做出反应。

    5. Trade can make everyone better off. 贸易可以使每个人的状况更好。

    6. Markets are usually a good way to organize economic activity. 市场通常是组织经济活动的一种好方法。

    7. Governments can sometimes improve market outcomes. 政府有时可以改善市场结果。

    8. A Country’s standard of living depends on its ability to produce goods and services. 一国的生活水平取决于它生产物品与劳务的能力。

    9. Prices rise when the government prints too much money. 当政府发行了过多货币时,物价上升。

    10. Society faces a short-run tradeoff between inflation and unemployment. 社会面临通货膨胀与失业之间的短期权衡取舍。

《生活随笔》