Shell's Home

Nov 3, 2012 - 1 minute read - Comments

老大啊,你这是什么鬼名字

sbcl 不知道大家用没用过common lisp,这是一种语言,最早是为了计算理论而生的。这种语言以规模大,难掌握,实现多,标准不统一而著称。 Steel Bank Common Lisp,简称sbcl,就是其中一种实现。他派生于SMUCL,是目前为止我看到的最好的开源实现。反正我在求解N多问题的时候,sbcl在速度和内存占用比上的表现相当抢眼。在lisp系列中称第一,和go这种静态语言相比也不遑多让。 但是每次我看到这个缩写都忍不住想吐槽,这是什么鬼名字啊。SB Common Lisp? debian 大家也许听过,也许没听过,debian社区曾经为了中文名字的事情争吵过。 从我看到的材料上看,很多人对debian的默认念法是——大便。。。 lua 我就不吐槽了,号称屌丝语言。 LZ不哭,站起来lua。 go google的奇葩语言。每次我要查某个用法的时候,都很郁闷。为什么呢?因为几乎所有的网页都命中”go”。 以StartProcess为例,我这里搜素go StartProcess的第一个命中在MSDN,微软有个API就叫StartProcess。再后面就是财经新闻。在很后面才能看到go的API。 etc IT界还有什么奇怪的名字?

Oct 30, 2012 - 1 minute read - Comments

异常之殇

异常之殇 辗转开解 辗转开解(stack unwinding)说的其实是这么一个现象。当执行流从深层向浅层转移时,深层调用所产生的栈上对象(stack object)需要销毁,资源需要释放。对于面对对象语言而言,往往就会执行到析构函数。 辗转开解中的异常 辗转开解真正令人迷惑之处在于,如果在析构函数中发生错误怎么办?在异常处理中发生异常,我们可以继续向上抛出。但是在辗转开解代码中出现异常,上层应当收到两个异常呢?还是一个? 无论是哪种可能,都没有完美自恰的符合直觉,因此这一般是一个未定义的行为。在C++中,进程会整个彻底崩溃掉的。因此,千万不要在析构函数内抛出(或者可能抛出)异常。 如果分离析构和资源销毁 一种做法是,在析构时不做资源销毁,转而提供专门的函数来执行资源销毁过程。析构只处理简单的delete等操作。然而这种做法的杯具在于,你在任何时候,一旦使用对象,都必须使用finally来保证销毁函数的调用。在发生异常时,栈上对象的辗转开解是自动的,析构函数的调用也是自动的,但是销毁函数的调用就是手工的了。 拷贝构造和隐式转换 和构造相反,对于构造函数,我们不能限制异常使用。你必须捕获构造函数的异常。 假如构造函数出了错 普通函数出错,你有两种选择。1. 异常。2. 返回值。构造函数出错,是没有选项2的。因此构造函数凡是出错必定异常。 而如果构造函数可能出错,而你期望捕获他,你就不能栈上构造一个对象出来。因为这会导致栈上对象的作用域被限定在捕获他所用的try块之内。 分离构造的尝试 和析构函数类似,我们可以尝试在构造函数外,提供一个构造函数,来替代构造的初始化过程。这样可以很大程度上保证构造函数不出错。 然而,首先,这样的代码就会变的复杂。每次构造函数完成调用后,都必须调用初始化函数。而且,有两种特殊的构造函数你不可能使用这种方法来解决。 拷贝构造和隐式转换 是的,这两种构造函数分别叫做拷贝构造(copy construct)和隐式转换(implicit casting)。我们举例来说。如果你在函数内建立了一个对象,你希望返回这个对象,怎么做呢?第一个思路是引用返回。不幸的是,要做引用返回,这个对象必须是堆上对象,而非栈上对象。因为栈上对象在返回后会销毁掉。如果要返回栈上对象,唯一靠谱的方案是先将对象复制到堆上,然后再复制到调用者的栈里。 C++中有一类特殊的优化,叫做对象返回优化。当编译器察觉到你需要返回栈上对象时,那么编译器会直接获得调用者栈里的对象地址。这样可以避免两次的拷贝过程。然而,如果没有对象返回优化(或者没有识别出来),那么就需要两次复制以保证正确性。而C++里,默认的复制过程是内存拷贝。 对于很多对象,内存拷贝是错误的行为。例如字符串,一种字符串的加速方法叫做共享内存字符串。两个字符串对象会共享一个内存块,以避免重复内容的开销。直到其中一块需要修改时,复制才真的继续。对于这种情况,直接拷贝会明显的导致错误。因此C++有一种特殊的构造函数,叫做拷贝构造。 在拷贝构造的时候,调用是由C++隐式发生的,你根本没有先构造,再调用的机会和权力。因此,试图分离构造在技术上不可行。 隐式转换是另一种情况。当你传递的参数和实际被赋值对象的类型不一致时(例如调用了某个函数,其参数类型不一致),C++会试图将你的对象转换为目标对象。如果是内部类型,这个被称为内部隐式转换。unsigned char可以被无错的转换为unsigned long,这个大家都知道。但是如果是对象,转换行为就需要由构造函数定义,这个叫做隐式转换构造函数。 另外,隐式转换也是OO中的一大问题。我强烈建议你用explicit禁用所有隐式转换,改为显式转换。这会费一点事,但是却可以避免很多问题。 分离构造/析构的邪恶之处 ZMQ的作者曾经吐槽过这种在构造/析构之外再定义初始化/清除代码的努力。他的观点是,如果万一在构造函数中加入了代码,会引起半构造现象。为了解决这个问题,会使得整个类带上状态。我在上面已经假定这件事情不会发生了,否则代码会更加复杂,问题也更加严重。 二次异常 是的,你不应当在异常处理代码中抛出异常。当然,这里的异常指的是你的异常处理代码不应当发生异常。经过逻辑判定,当前的异常应当由更上层处理的情况不在此列。 如果在异常处理中抛出异常,很可能导致的结果就是异常处理没有完成。而未完成的异常处理会发生什么问题,那只有天晓得。这个在任何带有异常系统的语言中都是成立的。

Oct 29, 2012 - 1 minute read - Comments

面对对象的吐槽——类型之殇

继承之殇 讲继承问题,我们首先得定义什么是继承(inherit),他是用来干吗的。 所谓继承,就是当两种实体,满足其中一种必然全部都满足另一种的定义(is a)。一旦构成继承,可以带来以下好处(简单起见,我们直接就管这俩实体一个叫派生类一个叫父类): 派生类具备父类所有已经实现的方法,毋须再实现一遍——除非需要重写(override)。 派生类可以当作父类使用,凡是使用父类的地方给与派生类也对。 继承的最主要作用,是用于复用(reuse)。 内涵和外延 形式逻辑里面有一句话,内涵越大,外延越小。在继承上,如果我们严格按照定义来做,会发生很反人类的事情。因为类的定义是依赖于内涵的, 我们还是看平行四边形,长方形和正方形的例子。我们用两边长度,夹角来定义平行四边形。然后如何定义长方形?夹角为pi/2。然后如何定义正方形?两边长度相当。 不知道你是否看出了问题。是的,按照正统来定义,数据的约束只会越来越多。因为派生类必须是(ISA)父类,因此父类的约束必须全部满足。我们接着上面的例子,我们为平行四边形定义一个方法,设定夹角大小。那么在长方形中,这个方法如何处理?一旦用户调用方法设定夹角大小,必然会破坏长方形定义,因此这个方法只能重写抛错。 为什么?从逻辑的本源来说,平行四边形是“两组对边分别平行”,并没有说夹角的事情。到长方形的时候才说,长方形是夹角为90度的平行四边形。显然,长方形是不能设定夹角的。因此,我们要么承认,不是每个平行四边形都可以设定夹角的,例如长方形不行。要么承认,每个平行四边形都可以设定夹角,长方形不是平行四边形。显然,后者违背逻辑,我们只能得出结论,不是每个平行四边形都可以设定夹角。 同样,正方形的例子也说明,不是每个平行四边形都可以设定两个分离的边长。如果以此标准来定义类,那么必然得到的是正确而无用的逻辑玩具。平行四边形没有夹角,我们就不能定义面积计算的函数,也不能——基本什么都不可以。更过分的是,我们还不能定义两个分离的边长,因为定义并没有告诉我们,边长一定不等。照此下去,我们除了一个空空荡荡的“平行四边形”这个名字外,什么都定义不下去。 为了解决这个问题,实践中,我们采取的都是,平行四边形是可以设定夹角的,然后对特例做抛错处理。这其实在本质上就违背了继承的原初意义。 继承和聚合 继承的另一个容易混淆的地方,就是分不清继承和聚合。 其实从逻辑上说。继承和聚合根本就不是一回事情。例如你有(have a)一条狗,你可以让狗做任何狗可以做的事情,例如追猎物。我们可以说,你可以做的事情和狗没有区别,所以——你就是(ISA)一条狗?! 傻子都不会弄错其中的区别! 我们说,如果一个东西看起来像鸭子,叫起来像鸭子,走起路来像鸭子,我们就可以当他是一只鸭子,说的是弱类型语言。而且我们只能认为,我们不知道那个东西是什么(这是弱类型的特点),总之可以当他是一只鸭子用。但是这不代表那个东西就是一只鸭子,他也可以是鸭子的代理人,或者拥有一只鸭子。在静态类型语言中,为了复用就不管三七二十一,直接声明PNG图像是一种BMP图像的——这绝对是逻辑上错误的行为。 然而,你自己数数你在代码里面犯过多少次错? 多重继承 继承本身的问题我们先不说,我们再说一个很常见的问题——多重继承。 既然我们说,只要一种满足ISA谓词判定,就可以认为是继承。那么理论上,我们就不能否决双重继承。例如我们定义了平行四边形,又定义了中心对称图形。那么长方形就同时是(ISA)这两者。从逻辑关系上,我们说长方形可以合法的继承两者。 但是如果我们真的在程序内设定将长方形继承两者,马上会引起一连串的问题。 当多重继承发生冲突时 首先第一个是继承冲突。即当两个父类都具备同一个方法的时候,对派生类做方法调用会发生什么行为? 肯定不能只调用一个,这会因此另一个父类的方法间发生内在不一致。这违背了继承的好处2。 也不能两个都调用。两者的先后次序可能引发逻辑问题,因此先调用谁都是错误的。而且函数还有返回值问题——你返回谁的返回值呢?如果多值返回合并,这和函数原始的定义又发生了悖离,从而又违背了继承的好处2。 因此,我们只能宣布这是个错误。 既然是个错误,鉴于类间函数可能存在的内在联系,其他继承的函数也未必能够正常使用。 你看,明明是合法的多重继承,居然造成了不可复用的结果。这就是继承冲突。 菱形继承 如果说继承冲突还是一个比较好考虑的问题的话,菱形继承就是一个让人吐血的东西了。 所谓菱形继承,就是两个父类继承同一个基类。在这种情况下,对父类的调用会间接转到基类上。那么,基类的函数会调用几次呢? 继承冲突的几种解法 所有冲突的函数,父类必须都无实现。 不得多重继承。这是很扯淡的,不过也是大多数时候的做法。我的编程指南之一就是——在C++中,任何时候都不要使用多重继承。 使用其中一者。python是个典型的使用其中一者的例子,具体使用的按照继承编写顺序展开成MRO次序决定。然而这直接违背了继承类是(ISA)父类的定义。因此不要以为在python中,继承后总是没问题的。有的时候可能会出现继承后不能正常工作的情况。 强制用户解决。要求用户必须人工定义函数,解决继承冲突的问题。从逻辑上说,如果用户定义的函数可以同时兼容于两个父类,就可以彻底化解多重继承冲突问题。然而杯具的是,很多时候在逻辑上,继承冲突是无解的。 区分接口和继承 父类没有实现冲突的函数,那么派生类中就不必纠结于调用谁的问题了。但是这引发了另一个问题——这就无法复用了。作为这一解法的极限,java不允许多重继承——除非继承的父类都是没有实现的类。这其实不是继承,而是实现(implement)接口(interface)。 接口编程是一个很有道理的东西,COM里面大量着重于接口。但是接口也有自己扯淡的地方——接口是一个编写期的东西,他最大的用途就是编译期类型检查。接口并不能复用(reuse)代码。如果你有一个接口,叫做平行四边形。里面有个方法,用于计算平行四边形面积。然后你实现了长方形和正方形——那么杯具来了,你需要在两个里面通通实现一遍这个方法,即使他们基本没区别。 当然,接口本身的好坏各有评价。你看,接口的唯一作用,就是声明类提供了某些函数。当我们对方法传入一个新的类的时候,我们必须将新的类也实现一下接口——哪怕这个类其实已经实现了这些方法。只要不实现接口,方法就不认可。这是强制编译器类型检查(静态类型语言)的基础。因此一般来说,静态类型语言,使用接口。动态类型语言,duck typing。

Oct 28, 2012 - 1 minute read - Comments

高考和大学的选择

背景 最近很多家长在为了高考的事情争。非京籍家长要求北京市教委给予外地孩子公平待遇,京籍家长认为北京本地教育资源有限,应维持现有状态。 另外,我在weibo上和一个交大的特招生吵,他认为特招生deserve大学(原话),我认为归根到底是个利益问题。 OK,以上是背景。 大学是一个什么? 中国的大学扩招比例是所罕见,其中有一个很大的因素是因为各种家长都认为孩子应当上大学。上过大学的孩子就跳龙门了。在我的观点来看(当然,我也有很多佐证),上大学不是跳龙门,谁上什么大学才是。我的一位朋友,是从偏远的农村来的,他们那里有个有趣的现象。凡是没上大学,高中毕业就工作的,家里多半都盖起了小楼,娶了媳妇,在本地工作。上了普通大学的,一般都还住在很旧的老房子里面,孩子在远方的城市,没结婚,刚刚还完,或者还在还学校的贷款。而上了一流大学的,则家里又比较富足,有很大一部分家长直接去了孩子所在的城市,很可能这些城市甚至不在中国。最后一种是否幸福,如人饮水冷暖自知。但是我要说的是,为什么会产生这样的分层变化? 关键是大学是什么样的一个东西。 我们为大学付钱,大学给我们各种资源。当然,好不好,值不值,就是一个很关键的问题。很多大学并没有资源,或者说没有足够的资源。这样的大学就是来赚你的钱的。中国人千年以来都认为,学而优则仕,念书是能当官的。于是再穷不能穷孩子,都变着态的往大学送。这种人的钱不赚赚谁的?自然,孩子没有得到好的教育,工资和普通高中生拉不开差距,家里又很是交了一笔学费,不穷你穷谁? 这年头家长也不都是傻子,我们从来不为进入这种大学而争论。问题是,那些好的,能够给你资源的学校,谁在进?谁应当进? 谁进大学? 首先你应当明白,大学并不是象牙塔,他不天然是为了让好的学生变得更强而出现的。大学的出现,是他的设立者为了他的理想而建的。如果他的理想碰巧是,让好的学生变的更强。那么,是的,这也是一种可能。但是你应当明白,另一种可能性是,为各种有钱人世家教育子女,让他们的子女比别人的子女更强。我得说,这也是一个可能。 那么中国的大学是什么? 刚刚我们说了,一种大学是赚钱。我们从不争论谁应当进去挨一刀。至于那些能带给你什么的大学,一般都是国家掌握的。这些大学创立的目标是什么,他们选学生的标准就是什么。国家运作这些大学是为了什么呢? 还是赚钱。中国的大学培养了相当大的一批高级产业工人,这是个不争的事实。有产业工人才有GDP啊。既然是培养产业工人的,那么招人的标准就相当明白——增加产业工人培养的成功率。一般来说,好的学生比较容易培养成优秀的产业工人。但是这不是正向相关的,里面总要附加点什么。首先,政治必须正确。政治不正确的学生培养出来是危险品。其次,学生要足够好,不够好的不培养难度太高。于是你就知道高考是怎么一回事了。首先,你必须政治正确,否则根本不会有高考机会。其次,考试。 谁应当进大学? 当然,我们是没有办法对国家施加影响力的。我们只是从理论的角度说。如果全民可以投票,来决定进入大学的制度,谁应当进去? 当然你也应该想的到,谁应当进大学是个政治问题,而不是技术问题。本质上,决定谁进大学就是决定谁在将来拥有利益。这是一个利益之争,永远是。我和那位交大的特招吵,就是因为他觉得特招理所应当进大学,因为他们deserve。而且他不觉得这和利益有什么关系。我不觉得谁是理所应当进入大学的,大学不是赛跑,跑赢拿奖品。大学不是养鸡场,养出一批换一批。所以我觉得以考试为基础来决定谁进大学本身就是个问题,高考有问题,特招当然也有问题。 但是我们没法脱离高考,你们都知道为什么。既然谁进大学是个政治问题,那么一种无论听起来多么合理,却看起来不见得公平,操作起来更可能有黑幕的方案,是绝对不可能上的了台面的。而目前,问所有人,觉得还算公平的方案,就是高考,大家一碗水端平。即使是高考这么看似公平的方案,也有无数不公平的细节在争吵中。特招生多了,平衡发展的学生家长就要有意见。取消特招了,偏科生家长就要有意见。开放对地区的人数限制,招生比例高的城市家长有意见。不开放,外地家长有意见。你知道的——无论社会民主还是不民主,这是永远的利益之争。所谓民不民主,只是这个问题是由大家投票解决,还是领导拍板解决。 关于地区之争,我首先引述一篇文章民主的细节 – 谁有特权上大学,文章需要翻墙,我引述如下。 看了刘瑜《民主的细节》,我没觉得美国像天堂,但中国真的很像个炼狱。 一个简单的例子。 刘瑜引用罗尔斯《正义论》的解释说:只有当你不知道自己可能是谁时,才能想清楚什么是正义。“他有一个术语,叫“无知之幕”,也就是一个人在对自己的社会处境暂时失明的情形。一个站在“无知之幕”后面的人,既可能是比尔盖茨,也可能是一个非洲饥民。如果你觉得正义就是杀光富人瓜分他的财产,万一“无知之幕”一拉开,发现自己就是比尔盖茨,恐怕你会后悔得一头撞死。如果你觉得正义就是WINDOWS 2000卖5000美元一套,万一“无知之幕”一拉开,发现自己其实是非洲饥民,估计也要捶胸顿足。” 然后,她举了美国人关于“谁有特权上大学”的争论。自60年代的平权运动始,许多人主张给黑人和妇女在入学上优惠,以补偿之前遭遇的歧视,叫做“补偿性正义原则”;但是矫枉过正的结果,产生“逆向歧视”,70年代中,一个叫巴克的白人学生不满自己在考大学上屡屡败给各方面都比自己差的黑人学生,上诉最高法院,法院裁定对黑人学生实行定额制是违宪的,但原则上仍支持平权行动,这个叫“程序性正义原则”。后来的40年,美国人民一直在如何协调这两种正义间苦苦挣扎与思索……中国呢? “好了,终于可以回到咱们开头提的那个问题了――来自火星的你,被扔到大城市、内地、边疆的可能性各三分之一,你会如何设计高考分数线方案? 你可能会说:三个地方分数线一样嘛!大家公平竞争嘛! 你也可能会说:让边区分数线低一点,其他两个地方一样,因为那些地区贫穷,教育条件有限,人家北京上海的孩子用电脑打字,俺们这里还是凿壁借光呢。 你还可能会说:我选择让北京上海分数线低一点,其他两个地方一样。因为……因为……咦? 你们地球夏天真热啊? 我们知道,这三种选择,第一种叫“程序性正义原则”;第二种叫“补偿性正义原则”;第三种,姑且称之为“夏天总是很热”原则吧。” 元芳你怎么看? 大学值不值得进? 首先我给光知道赚钱的大学定个性吧。这种大学您就别去了,去了等于白去。 其次,对于指望搞研究的,真的对学术有兴趣的。我的建议是你尽快找好老婆,尽快走,出国读研究生。中国也是干活,外国也是干活。人家待遇比中国高不说,还没P事,能让你专心做研究。国内但凡是个院校都是一堆P事,搞行政的时间长过做学问的时间。 最后,您要是指望出人头地的——那就吵吧。。。 我的立场? 我其实是特招的受益者,当年我是物理竞赛的二等奖。但是,那毕竟是过去了。现在我物理方程都不记得几个了,要做计算更是要依赖程序了。而且——我也不会再高考了。 所以其实个我对高考的立场就是个无知之幕——谁知道将来会生儿子女儿,是偏文科还是理科。我连将来会不会在中国,想不想生都不知道呢。 所以我在偏科问题上的立场是随大流的,一般来说,强到特招的概率总比平均分数高的概率来的低吧。至于地区之争,我得说,原则上我支持向贫困地区倾斜。但是行动上支持北京和上海保持本地人低分数线。 听起来很悖论,但是这是诚实的想法。

Oct 25, 2012 - 1 minute read - Comments

cython编译细节

两点简述: 可以使用cython –embed来编译一个pyx,生成带main的代码,然后用gcc直接编译过去。大概样例是这样的: cython –embed $^ gcc $(shell python-config –includes) $(shell python-config –libs) -O2 -o $@ $^ pyx的文件名会被转换为变量,所以所有在变量中不应当出现的符号也别出现,例如-。

Oct 23, 2012 - 1 minute read - Comments

pycon2012

今天第一天在大型会议上演讲,其实挺紧张的。不过还不错,虽然临场反应并不热烈,但是至少不冷场。下面是我今天看到内容的回忆,有些印象不神,记得不清楚了。 第一天上午 视频播放 上来先是sting先给我们放了一堆视频,我基本啥都没记住。就记住一个在日本的pythoner说教孩子编程时大家的评语了——python穷三代,编程毁一生。我后面接的是,用scheme子子孙孙都完了。 python产品构建和发布指南 沈游侠的主题,彻底干货。基本要点就是利用cython和pypy来编译类python语言,变成C语言代码。这样不但速度快,而且C代码都是可以跨平台的。后面又列举了如何用cython和pypy来编译库。这样基本可以完成python到多数平台的移植。 我做了一下简单测试。cython对速度的增加主要是静态类型编译,如果保持代码不动,速度反而会略微下降。因此在速度提升上,作用并不如想像中那么明显。但是在跨平台上,效果就非常好。rpython则完全相反,经过rpython编译的代码,在基本不修改的情况下(当然,前提是你需要符合rpython),执行比C还快。 不过游侠在后面的答疑中也说了,pypy的rpython编译把握难度比较高,不建议在产品中使用。 另外,他后面也提了溜宝的例子,在python和js之间可以远过程调用,还可以回调。熟悉http的应该可以听出来,这个在现在浏览器中必然是要用到long pull技术的。因此底层框架不肖说,必然是Eurasia。 让程序运行更快 我们几个都在说,土豆的一贯风格是分享内容是和技术有关的干货,但是都和python不搭边。最多在最后说一句,这个技术在我们这里是利用python做的。上次黄东的演讲就是,讲如何算流量带宽费,最后来一句,这个是python实现的。这次李小红的分享也是,很技术,但是和python没啥关系。讲到一半还来了一句,“我对python不熟悉,前几天特意看了一下,dict是利用开放地址法实现而不是开链实现的,这让我对python顿时有了信心”。微薄上无数吐槽高级黑啊。 土豆的分享其实很简单,核心就是如何通过代理让网站的响应速度更快。干货是干货,但是不是非常熟悉http协议,能够将http本身优化到相当程度的,听了等于白听。因为上面讲的大部分,都是内存命中和交换,磁盘写出,cpu调度,poll和epoll内核模式差异之类的话题。在python下面,poll和epoll基本都看不出差别,大部分优化都围绕着模式打转。研究这种命中技巧不是南辕北辙么? 但是这不表示这个主题没用,只是如果你不把其他方面的问题解决的很彻底,先没头没脑在CPU和内存缓存命中上下功夫,多半是做不过别人的。 第一天下午 OpenERP 即将推出的第 7 版的功能和新的编程框架介绍 演讲者是个法国人,中文相当不错。不过和Thomas比起来还是差点。旁边的老外哥们说,那是因为Thomas有个好中国老婆。 基本是广告。除了让我们体验了一把openerp的风格外,啥都没看着。不过openerp看起来确实够屌的,直接去下一个插件,应用,然后就直接换掉了语言。这基本和php差不多。还有一堆的良好的交互特性,看起来非常像应用。此外,啥技术都没有。 元编程在 Redis ORM 中的应用 我自己的题目,会场反应并不很热烈。总共两个选项,我问认为是1的举手,几个。认为2的举手,几个。剩下的是啥? 其实元编程本身就不好讲,这个题目我写完文档算了一下,大概1个小时到一个半小时。问题是我问sting多要点时间,没有。好容易给我加到45分钟。我对着文档左砍右砍,还是紧紧张张的25分钟讲完。要在30分钟出头讲完整个题目,也难怪听众反应不良。 具体我也就不展开了,希望看到的可以看我的slide。另外我说一下,这个slide也是我用python做的。 用 Tornado 开发 RESTful API 应用 其实以这个应用而言,是适合GAE的项目。不过飞龙只是借这个题目讲Tornado而已。 阿里云之移动开发者上云 纯粹广告。不过既然是lighting topic,也不算太难受。我也顺便看了一下阿里云的架构。不过主讲完全没讲到要点,他们到底是卖IaaS业务,还是卖PaaS业务,还是云存储,还是三者都有?另外,用IaaS来做PaaS的可伸缩?我还真不觉得这是个好主意。。。 Python如何帮助「逆转三国」获得成功 广告中的广告。今天唯一一个妹纸上场的主题,我还在想,终于有妹纸上去做分享了,还是个美女。结果介绍完了心里就凉了半截——市场总监,这姐们是个非技术的角色。演讲的主要内容是,python很好,python没出过乱子。完了,总共15分钟不到,我连拍第二张照片的机会都没有。其余时间全在说游戏是如何成功,左右还有海报助阵。最后还出来一个美女发传单。 最后主办方出来道歉,他们也以为这个topic是正规演讲,没想到讲成了lighting topic。 网页游戏的跨界开发 董诣的题目,主要讲他如何训练公司的策划使用python。他用的方法基本就是元编程的路数。 策划将配置写入excel,然后他们的程序读取excel,写出一个python的文件,再由服务器加载。这是典型的字符处理型元编程的例子。早知道他们这么用,我满可以顺手拿来举例的。 最后他的例子倒是让我们吐槽了一把。print后面可以不加空格,这是他们公司美工教的。 实战游戏客户端 林伟每年来都是带来大量干货。今年他是特别从北京飞过来,在演讲前刚刚到场。 他的题目是用python做客户端,并不是很好讲。因为python做游戏客户端不是很多。他举了一个pygame的例子,超级玛丽的企鹅复刻版,玩的挺欢乐的。 后面他大概讲解了一下游戏界面编程的几代模式变化。不过我印象最深的还是说到flash在苹果上。后面他运行flash的那个模拟的时候,我彻底吓一跳。我偷偷和沈游侠说,林伟说的完全没错,乔帮主抹黑flash完全是为了抢app的地位。 大家可以想象一下,如果flash拿到了硬件驱动加速会如何?Apple Store上的程序还有谁会花钱?都直接用网页跑一个Flash游戏就直接玩了。PC上能跑的,在苹果上自然也能跑,效果还不差。那还用Objective C做什么?只有性能要求特别高的才会用到。如果不需要Objective C,那Apple Store还怎么赚钱?从Flash能够做到这点,还有Adobe的战略布局,以及Apple Store目前的情况。我们多半可以得出这么个结论,苹果抹黑Flash的主要目地是将Flash踢出移动平台。而只有将Flash踢出了移动平台,才能保护移动设备开发市场的封闭性,从而从中牟利。 另外,他讲到的FlashCC也很有意思。在一个语言内调用其他语言,这非常有利于Flash的开发。不过后面林伟的一句口误让全场都笑了。他说:“我今天来就是告诉大家,从今以后,大家可以用Flash开发python程序了。”得,又是一堆高级黑评价。 第二天上午 网游开发中的 Python 组件 赖总的topic,基本讲的其实是模式。 对我来说其实也挺有用的,尤其是关于对象可调用方法的那个idea。写程序到了一定程度,实现已经不是问题。只要有明确的实现方法,你给足够的时间干,肯定是干的出的。问题是思路,也就是idea。一个好的思路往往是经过很久的总结,在实践中不停摔倒,才能真正用上去。 另外,最后的吐槽,其实是自行实现语法,或者至少是语法糖。我和赖总说,scheme其实很容易嵌入,而且很容易实现这样的要求——lisp类语言的宏天下闻名。赖总在研究的是基于python自己的Parser的方案,我回头有空也看一下。 Python in Gentoo Linux Patrick Lauer的主题,主要是讲了Gentoo下面如何使用python,每个版本的python在gentoo下面的支持情况如何。按照数据来看,python3的支持接近完成了。而pypy大概只有2/3的支持比例。

Oct 18, 2012 - 1 minute read - Comments

没想法

前两天面了一个同学,是我在交大的学弟。平时印象挺不错,用过的技术也挺多的,和老板商量一下,就面试看看吧。 结果不能算糟,但是也谈不上多好。主要是,这同学没想法。 不知道和没想法 老板最恨的一件事情,就是在问你一个问题的时候,你手一滩,说”我不知道“。其实严格来说,他并不介意你说”我不知道“(I don’t know),但是绝对不要说“我没想法”(I have no idea)。 拿面试时候的例子来说吧。那位同学讲了一个实验室里面的项目,用web来控制小车。当然,那是个没做完的项目,有什么问题也不是值得奇怪的事情。我们开始的时候问了几个问题,感觉还可以。事情是从我随口的一个问题开始的:”如果两个人同时操作,会发生什么事情?“ 两个人同时操作在设计上是不允许的,完备的系统可以通过一些方法来排除这种可能。例如,见到第二个cookie就给一个空页面回去。项目没做完,没屏蔽掉第二个人,也不是什么值得奇怪的事情。但是我想知道的是,对于这么一个未定义的事情,被面试的人是如何分析的。 按照正常流程来说,分析这个问题首先需要知道基本的工作原理,然后拆分工作流程,最后分析,如果两个指令同时到达,会发生什么现象。问题是,该同学阻塞了半天,啥都没干。我和老板询问了整个系统工作的原理,发现他对基本原理都是了解的。我们按照他所说的原理,推断出了两个人同时操作会发生的结果。当然,是否正确,谁也不知道。但是我们的结论是,他在具备所有推论需要的知识的情况下,没有做出任何推论和结果。 这是一个很扣分的事。 不知道 所谓不知道,是指你的知识(knowledge)不足以解答当前的问题。例如,对于非程序员,我问你,python中用于逐次返回数据的关键字叫什么。你手一摊,告诉我,我不知道。这是因为你压根没学过python,当然不知道yield。 不知道并不是值得羞耻的事情,无论多强的程序员,总有什么东西是他不知道的。新的语法,新的框架,还有我们没听说过的技术。作为程序员,什么都知道反而是一件无比诡异的事情。 没想法 很多时候,没想法是因为不知道。例如,假定你对股票市场的工作机理一无所知,尽管你完全可以理解,作为正常人类都是希望高买低卖。但是当我问你,股票市场表现如何的时候,你也只能手一摊,我一点想法也没有。这不仅仅是你不知道,而且你都不知道该如何去分析这个问题。 因此正常程序员见到一个不知道的系统,第一个问题十有八九是,这系统干什么的。第二个问题就是,这系统怎么工作的。当你知道了系统的大致工作机理,就会想出如何分析这个系统的方法。 例如,我们有一个网络系统,老板说网页访问慢。元芳你怎么看? 这后面没什么天大的秘密。我们只要照着网页访问的流程来看就好。 DNS解析 tcp连接 http请求 http返回 DOM解析 js执行 网页慢,首先分析最慢的地方在哪里。这里的每一步,都是能够计量的。我们再假设,我们发现最慢的是http请求和返回,那么我们基本就把问题定位在了服务器或者网络容量达到极限。那我们又如何分析是对方服务器太慢还是我们自己网络太慢呢? 只要你没傻,都应该想的到,最简单的方法就是同时开一个比这个页面快的多的系统,一个不会慢的服务器。最合适的是google和baidu的首页。如果还是慢,那就是我们的网络问题。如果快了,就是对方服务器到极限了。 做出这个分析,并不需要什么惊人的知识,也不需要你有足够的经验。当然,经验可以帮助你快速的排查问题,当出现某些现象的时候,别人还在做诊断,你就可以直接做定性测试和结果了。 你可以不知道,不可以没想法 作为程序员,我可以接受你告诉我,你不知道。但是一般我不能接受你告诉我,你没想法,尤其是在一些情况很明白的核心问题上。如果这是一个很困难的问题,没想法也不奇怪。有些很妖怪的问题,例如为什么我们的系统在人少的时候OK,人多了就挂了,再多又没事了。通常的性能计数又没异常,问题随机出现,无法复现。像这种妖异的问题,我没想法,你没想法,我问别人也没想法。但是如果我问你,网页为什么慢,你告诉我,没想法。或者更夸张的,在不经过相关测试的情况下,随便看了看现象就告诉我——这是我们的网络带宽不够大——你丫当我村干部糊弄呐! 没想法表示你对这个系统没办法。你没办法做一些事,在可预期的成本和时间内解决问题。你能做的就是去网络上找出过这个问题的人,他们的解决方案,然后照做。coolshell管这个叫做散弹枪式编程,我管这个叫做博彩。散弹枪不是一个很坏的主意,对于一些你不关心又需要很快解决的问题,你可以散弹枪一把。但是如果你在头三个方案内都没解决问题的话,你就可以停手了——后续方案能解决问题的概率和头三个没有太大分别。 有的时候,散弹枪是一个非常糟糕的做法。例如我们上面那个——网络带宽不够大——的例子,你很容易在网络上看到这个解答,但是往往这不是正确的答案。我是说,很多人确实是因为网络带宽不够,所以出现了网页缓慢。但是网页缓慢的原因,还有一个是因为延迟和丢包率太高。而增加带宽可解决不了延迟和丢包率。甚至相反。我们可以想像这么一个可怜的例子。当技术瞎猜到——是你的带宽不足——时,老板就会对行政说,去给我换一个给力的带宽。于是行政要升级带宽——又要控制成本,十有八九,他们会找上一家小ISP。ISP的性价比非常可观,行政和老板都很满意。唯一的问题,是他们的延迟和丢包率比上一家更加糟糕。 你看,散弹枪不但没打中目标,还使得情况更加糟糕了。 类似的问题还出现在大型电商系统的架构上。如果架构师和SA的答案永远是——硬件不给力,你需要好好考虑一下,真的是硬件不给力,还是这只是一个拖延的借口。如果架构不合适,当规模达到一定量级后,无论你再堆多少的硬件,可支撑用户数都不会有太高的提升。

Oct 17, 2012 - 1 minute read - Comments

回到毛泽东时代

是否愿意回到毛时代 今天在酒席上,不少长辈讨论说毛泽东时代如何如何好。我想了半天,很好奇,于是问了一句——你愿意回到毛时代么? 提出这个问题的原因,是因为,我试图思考,在当前状态下,如果要效仿毛时代,会发生什么事情。一般来说,怀念毛时代的人最怀念的是工作分配,工资平均,没有住房问题。我们假定回到毛时代,至少要解决这些问题。 如何回到毛时代 作为这个假定的前提,我必须先说明。你在现代所犯的所有“罪行”,例如投机倒把,或者作风问题,都不会在毛时代得到清算。如果要清算的话,我估计第一个出的问题就是——全中国的人大半死光了。我不大相信在现在中国,有多少人没有投机倒把问题。所以,你在现在所犯下的所有“罪行”,都不会得到清算。在这个假定下,我们全民投票。如果一半以上赞成回到毛时代,我们就开始毛泽东时代的路线和政策。 下面的很多事情,是参照建国后历史预计的。我们不能说他一定会发生,也无法排除他不可能发生。。。 会发生的那些事情 八级工资制 首先进行的应当是全国统一工资制。所谓统一工资制,就是按照国家的职称评定,核算你的工资。以我为例:我只是大学本科毕业生,非党员,没有职称。工资大概比全国平均水平高一点。上海平均工资5000左右,全国平均工资大概只有1000出头,我假定进入毛时代后,我的工资是——2000人民币。 我家喵说过,在上海,没有住房,医疗之类的问题,2000也足够生活了。然而2000的计算依据是什么?是以全国平均工资为基础,重新分配所有人的收入。那么目前不覆盖的东西,也不能指望在这个工资下覆盖。如果要覆盖住房,医疗问题,我们的工资就要进一步降低。 因此首先发生的是活命问题。上海地区的消费水平不是一下子就能降低的,而工资2000,这在上海连活命都不够。首先会发生的问题是吉芬效应,生活必须物资随着收入的减少而迅速增加。换言之,米,粮,布,盐会快速涨价。因此政府只有设法稳定物价,将上海的城市生活物资价格降低到和全国其他地方差不多的水准,我们才能活命。 土改,住房统一分配 工资平均后,政府会做的第二件事情就是土地改革。按照上海市平均住宅面积分派住房。我查到的资料非常复杂,有说17平方的,有说30平方的。无论如何,目前我们两个人住100平方,铁定是超了。所以需要整理自己的东西,搬到政府指定的另一栋房子里面去。我们的房子大概会接待一对外地夫妻,有两个孩子和两个老人,按照平均面积差不多。不过作为补偿,我们不用继续缴纳住房贷款了。 公私合营 另一个政策大概就是公私合营。所有私营企业,必须由国家控制,私人入股。在多少年后,国家停止支付私人定息。例如你们公司,公司合营后,就归国家管了。国家会按照企业估价,支付你们老板每年5%的利息,支付20年。如果不同意,则宣布其为剥削资本家,没收其资产。 然后发生的那些事情 打击投机倒把,囤积居奇 为了降低上海物价,必须打击投机到把,囤积居奇。什么叫做投机倒把,囤积居奇呢?例如最近的食盐涨价。政府发布消息,凡是人均购买食盐500g以上的,属于投机倒把,要强制劳改。如果在禁令发布前已经购买的,需要向政府交代犯罪事实,并上缴不当所得,方能宽大处理。这就是打击投机倒把。如果超市有食盐不销售的,一律没收所有货物,店长枪毙。这个就叫打击囤积居奇。 如果你在回到毛时代,发现工资降低到2000后,立刻去超市搬了5箱方便面——OK,估计你离去青海玩不远了。 户口 在工资平均化后,如果不抑制人口流动,应当会发生人口逆向流动。即,人口从高度发达地区流向欠发达地区。也有可能从高度发达和欠发达向中度发达地区迁移。因为上海的物价无论如何降低,也比安徽的高。同样2000工资,在安徽生活的显然比上海更舒服。然而如果去过于偏远的地区,虽然钱够了,却没有足够的物资。 不过回顾毛时代,人口流动也是偏向北京的。这主要是由于北京这里享有了非常高的行政资源附加。北京的教育,医疗,市民获得的娱乐,都是最多的。如果大城市相对于农村有行政附加,则也可能产生和预料不同的人口流动。 幸好,我们已经存在了户口制度。这个制度可以很容易的控制人口流动,尤其是在毛时代。政府可以很容易的宣布流民为间谍,或者其他人,从而逮捕和宣判他们。 控制人口自由流动已经是中国的基本国策了。我不理解发生这种问题的原因,可能是因为要强制将农民捆绑在土地上。也可能是因为方便控制。无论如何,户口制度不大可能在回到毛时代后减轻,反而可能会更加复杂,厚重。 公司迁移 但是户口还是有点问题的。我们现在有大量的劳动力迁移到了沿海地区,而户口还在原地。因此他们可以完全合法的迁移回老家,政府对此没有任何办法。人口迁移会迅速增加中度发达地区的负载,这必须和工作迁移相匹配。因此,国家必须将大量企业向内地迁移。恰好,我们进行了公私合营,因此可以直接把一些企业搬到内地去。 公司迁移会迅速的降低其竞争力,这是当然的事情。例如以皮鞋生产为例,一家位于西安的企业,和一家位于广州的企业,在人力资源上有绝对优势,然而在出口管理能力上有绝对劣势。这个行为大概会引起一些企业的生产或销售出现不协调。 上山下乡 公司迁移后跟着会发生的事情很可能就是上山下乡。为什么?因为无论如何调整,城市化的工业和三产是不可能没有失业的,而中国目前农村劳动力实际不足。因此国家必然会做出调控,让部分人到农村去。 怎么实施? 正常家庭都不会希望子女到农村去吧,因此在谁去的问题上必须接受国家强制。一种可能的方案是成年后未找到工作的年轻人。另一种则是毕业后听从国家分配。无论哪种,你的子女都有可能被送到荒僻农村,和一个当地的农民/农妇结婚,大字不识,终老一生。 更深层的因素,我们可以把这一问题的原因归纳为——现在台上的是老毛。 我不知道会不会发生的事情 控制货物和人员的进出口 这个很大程度上取决于政治状况,而非相反。 问题是,中国目前靠出口养活了很多人口。如果控制货物进出口,中国会出现(可能的)部分物资短缺,和部分产能过剩。同时,控制人员出入的理由则更加明显,如果没有出国人员流动控制,各种国外的思想会严重影响整个国家“毛时代化”的稳定。因此人员出入控制显然是更加必要的。而严格的人员出入控制下,怎么可能保持货物贸易正常化呢?进出口限制势在必行。 然而中国现代工业的自给率很低。实际上,大部分现代国家也是如此。无论是美国法国还是日本,他们的硬盘滑块大部分都是来自于泰国。这是泰国大水导致全球硬盘价格上涨的原因。大部分国家不会自行生产工业链条上的每一个部件,这是国际贸易的基础。在控制货物进出口后,中国的现代工业是不能自给的。我们就需要研发全套的工业链体系,重新发明轮子。 而重新研发全套的工业链体系,则需要相当的人力投入。这可能弥补没有出口引起的产能过剩,缓解失业的状况。中国目前的状况和解放不同,解放时中国处于严重的农业时代和产能不足,目前则是明显的后工业时代和产能过剩。因此我们的首要问题是解决消费问题。 如何解决外国人在华投资和华人在外投资 华人在外投资很可能被主动收归国有,而外国人在华投资则复杂的多。多变的政治格局可能造成外国人资产的价值变化,而估算这个变化是非常困难的。不过总体来说,我预期大部分的外国人在华投资都会被政府回收(当然,还是要付费的)。 文化上的审核和互联网的终结 不消说,现在放的电视都是什么乱七八糟的,统统不准放。还有网线,也都拔了吧。 你真的敢回到毛时代么 从各种变化而言,回到毛时代并不一定直接导致上个世纪的各种惨剧的发生。例如文革,例如百家齐鸣。但是从因果层面推导,我们至少能够看出,如果要回到一切公平的年代,我们就要面对一切公平的问题。 在上文中,我还有一些东西没有写出来。例如工资平均化,工作铁饭碗后,可以预期的,工作热情下降,生产效率下降(别和我争辩不会,上世纪凤阳小岗村改革的原因是什么?)。你虽然和别人一样有钱了,但是你还是买不到你想买的车,想娶的人,甚至你本来可以在淘宝上买到便宜的衣服的,也没有了。这年头谁还上淘宝开网店阿,都国家统购统销了。 更深层的,越是解读那个年代,你就越能感觉到那个年代的折腾,和现在来之不易的自由。为了解决一个居于次要地位的问题,国家可能会在根本问题上做出让我们目瞪口呆的行为来。例如,为了解决城市劳动力过剩问题,居然将多余劳动力反向迁移到农村。这一行为直接导致了一个年龄层的青年们学业中断,人生受到影响。也导致了中国工业化积累不足(中国真正实现工业化,达到后工业时代,还是从90年代开始的)。 自由这个词虽然简单,看似和我们没有什么关系,然而却如同呼吸一般,有着不可辩驳的重要性。当你坐在家里打游戏的时候,你能够想像,自己无法预料明天的样子么?尽管现在我们依然无法预料明天,然而我却可以放心,我的子女不会突然被送到农村,我的公司不会突然不属于自己,我可以在城市里面随意的搬家,只要我高兴。 毛时代真正的悖论在于,他试图创造一个人人富裕的社会,然而却创造了一个人人平等的社会。在一个人人不富裕的社会中实现人人平等是什么概念?只有穷人才会觉得自在,富人会随时有不确定的丧失感。资本主义的基础,即是承认私人财产神圣不可侵犯。所谓“风可进,雨可进,国王不可进”,即是如此。作为其对立极端的社会主义,若不是在一个物质足够的社会上强行实施,只能让有产阶级变得如惊弓之鸟。 你是不是富人 也许很多人不认为自己是富人,我可以提供一个简单的判别标准,按照中国平均国民收入,你是在之上还是在之下? 能够看到我文章的大部分人,在中国平均国民收入中都肯定属于之上的位置。别的不说,收入不及平均收入的,你能够拉到网线再弄一个vpn来看我的blog?因此,在毛时代,你们可能被打为地主和富农,财产被没收。 谁是穷人 真正一无所有的穷人,如果不善待他们,很可能他们才是真正支持回到毛泽东时代的人。

Oct 11, 2012 - 1 minute read - Comments

国庆堵车

国庆堵车的原因 国庆堵车,乃至一切国庆拥堵的原因,是16亿人的时钟被调整到了同一节律上,除此之外别无其他。在国际上,大型节假日也会堵车,费用涨价,这不是什么值得大惊小怪的东西。要说中国和其他国家的区别,主要是三点。 大量的劳动力离开农村,来到远方的大城市谋生。他们希望有足够长的假期回家和亲人共渡。 中国的三大运输行业,主力的铁路还处于计划经济时代,公路则有巨量的过路费。飞机对于大多数人来说不是一个合理的选择。 中国的道路设计和运行,是按照收费状况来进行的。本次假日,价格降低了。 细分市场 对于解决国庆拥堵,市场经济下的标准做法有两种。 一种是保持免费,由质量的下降来控制人数。 第二种是增加价格,让部分人不愿意出行,换取通行畅通。 通常来说,我们更愿意取后者,因为堵塞在路上并不会产生经济效益。而增加出行价格不但会产生直接的经济收益,而且会让部分去不了的人做其他更有意义的事情,而不是呆坐在车上发呆。这种机制叫做市场价格机制。更进一步,我们可以根据出行时对拥堵的接受能力,分割出不同的市场。让愿意接受堵车的人便宜出行,不愿意接受堵车的人付费。这种方法叫做细分市场,即,对于市场的供需状况发生明显变化的区域或者时段,或者人群,采取完全不同的价格策略和服务策略。这样会优化资源配置,让不同的区域/时段/人群获得他们希望获得的结果。 然而,无论哪种方案,都不可能采取反向措施。在高峰时期降低出行价格,让拥堵的道路更加拥堵。本质上说,国庆道路拥堵是由于定价策略根本错误所导致的。他们细分了市场,可是针对高需求市场提供低价策略。你能抱怨发生短缺么?而很多人居然还抱怨到,”不敢占国家便宜了“,”高速收费有理“。对于后者,如果加上高峰时期的限制,我觉得还没说错。对于前者就是彻底的无语了。 同样的市场策略不解还发生在非常多的日常问题上。我曾经提出过分流解决市内经济拥堵的方案,包括非高峰期和高峰期的地铁和出租车价格差异化。很多人都表示不理解。我觉得在经济层面理解这个效应没有任何困难,只要你想想就能明白。简单来说,就是对市内拥挤时期和非拥挤时期差别定价。例如平时公交0.8,高峰期公交1.2。平时地铁3元,高峰期地铁5元。 从市场角度说,这很明显的会压缩高峰时期出行人数,缓解高峰时期的交通工具拥挤现象。而且这个方案并不难实施——地铁和公交基本都是刷卡收费,对收费装置改造,让不同时间收费不同价格并不困难。出租车更是本身就支持这个功能。作为一个合理的驳斥,你可以说这个方案有明显的缺点。这个方案会使得更多的人偏好在高峰期自驾出行,从而加剧道路拥堵。 然而抱怨”太复杂了“,”没道理“,都是属于无常识的。如果说复杂,出租车系统是如何支持夜间收费的?如果说没道理,你为何不投诉出租车夜间费用机制呢?还有个朋友坚持认为,无论票价如何变化,出行人数应当不会有太大变化。用术语来说,即,交通需求的弹性相当小。然而我很简单的问了一个问题,如果是这样,当交通免费的时候,乘车人数应当如何变化?她想当然的说——当然是不怎么变化。旁边另一个朋友同时也说,广州发生过这个事情,地铁瘫痪了。场面顿时冷了下来。 和我讨论的人中,有八成以上的人直觉的反对这个方案,却给不出合理的理由。大多都只能说,太复杂了,搞不起来,没道理。我知道你们的想法——八成的人都需要在高峰期出行,这个无疑是在加剧他们出行的成本。然而,城市的出行费用并不是单方决定的,这是一个供需问题。虽然我没有量化数据,然而根据我对目前状况的分析,我觉得正确的票价不但不会上升,反而应当下降。在高峰时段,我们的出行人数略高了。然而在非高峰时段,我们的出行人数可是远远不足。对此应当采取低票价,鼓励可以调节时间的人在非高峰时段出行。只要非高峰时段采取了低票价,高峰时段人数过多的问题也会适当缓解。 当然,这个方案也有固有问题,即自驾车的问题。从鼓励公众交通考虑,我们应当降低公共交通费用,甚至免费。然而从良好服务考虑,我们又应当调控公共交通费用。这是固有矛盾,没有什么万能的解决方案。比较好的方法是增加自驾出行成本——例如扩大高峰期非上海牌照限行范围(不过这又会拉高上海牌照价格),或者对市内拥堵路段ETC收费。然而,只有几个人,很合理的提出了自驾出行的问题,我认为这是一种理性的,经过思考的讨论。虽然大部分的80后的应当学过经济学,可是能够使用经济学,进行理性思考的人为何寥寥无几呢? 黑洞无毛 同样还有改善高峰期出租车数量的方案,高峰期时段牌照,也是基于细分市场定价。基本思路是发放针对高峰时期的特殊牌照,拟定不同的价格,使得高峰时期牌照的回报比比普通牌照略高一些。按照市场原则,很多司机可能放弃做普通出租车司机,而只开高峰牌照。这样会带来三个好处。 高峰时期出租车增加,打车容易。 平时出租车减少,减少浪费。 只开高峰车的师傅,完全可以在空下来的时候做别的事情,例如开网店,或者导游。 同样是个有各种好处的事情,收到的驳斥意见非常多。有人给我说了一通历史原因,然后分析当政者心理,总结为什么不可能。我觉得虽然这和市场没关系,然而这个分析本身还是有道理的。有人直接扯上了毛泽东时代如何如何,我直接闭嘴了。您要么看我的一篇《回到毛泽东时代》,看看您是不是真的愿意回到毛泽东时代。 其中说历史原因的人非常有意思。他说出租收管理费贵,主要是两个方面原因。一方面,是上海政府大量收取出租管理费作为政府开销。另一方面,则是早年出租运营公司在牌照上都是赔钱的,不让他们赚钱他们不干。 纷纷扰扰的原因,让我想起天体物理学的一个很重要观点——黑洞无毛。 黑洞无毛,意思是黑洞的外界性质,只有重量和角动量。两个重量和角动量完全一致的黑洞在对外上应当不存在区别。因为你既不能通过光观测他的表面特性,也无法做其他信息传出。这相当于一个从现实空间割裂的独立空间。唯一能证实其存在的特性,只有万有引力造成的空间扭曲。 而从经济分析角度来说,一个项目的经济学特性其实也只有一项——风险下的投资回报比曲线。当然,也许不止这一项。我不是经济学专家,所以并不清楚是否还有其他需要考虑的特性。然而,任何能够转化为上述特性考虑,并不引入外部性的特性,就不要出现在我的桌面上了。 不同投入资产,在不同风险级别上,会产生不同收益。虽然没有人精确测量和描绘过这条曲线(说曲线并不准确,绘制出来的话应当是一个面),然而我们都在无意识的使用这个观点。我们经常说“项目风险”,说的其实是投资回报比在XX以上的概率有多大。如果你不介意将投资回报比降低到近乎于无穷小,任何项目都是近乎于0风险的。我们说“低风险投资回报率“,指的是这个曲线在低风险情况下,在普通投资区间的平均回报比。我们说”公司价值“,”项目价值“,其实并不是指项目有多少资产。相反,我们是在评估,这个投资回报比的项目,某一个份额的转让市场价格是多少。 现在,我们可以说回到出租车牌照的问题。出租车牌照问题,我们可以认为是一个项目。而这个项目,无论是历史原因也好,还是什么其他的也好。其实都只是对他的未来回报曲线产生影响。我们可以抛开到底这个问题是什么的问题,转而专注另一个问题——当你最终存在了一条投资回报比曲线——可以是任何曲线——细分市场是否能够对这个市场产生影响,得到更优化的资源配置? 这个当作思考题,大家不妨考虑一下。 公平 国庆交通的另一个话题,则是有人说,中国解决了这么多人的交通问题,这是一个创举。英国的铁路是私营的,然而资本家完全没有改善铁路的打算,铁路依然破旧。网络购票问题本质是铁路运能不足,要加快铁路建设,等等。 我先不说英国的铁路到底好不好的问题,仅仅说另外一个问题——到底是谁?决定要不要修建基础设施。 私营老板出钱 我们知道,基础设施是要花钱的。如果是私营,这笔钱必然是老板出,然后转嫁到客户头上。他自然会考虑,是否可以愿意承担这个费用。如果他们觉得客户愿意承担,那么他们会修修看——同时将修建费用合并到票里面,卖给客户。如果客户不愿意,他们当然不会冒着亏本的危险自作主张。——当然,着有个前提,就是私营老板并没有垄断铁路业。 国家出钱 而如果是国家出,一样是转嫁到客户头上。如果不行,客户数量不足,就会转嫁到每个纳税人——即,你,或者我——头上。 问题来了。不是每个人,包括我,都需要大量使用铁路交通的。与其修建那么多基础设施,来增加高峰期运力。不如降低火车票价来的有吸引力。如果国家修建,然后由纳税人均摊,其实这是不公平的。 实际上,我可以肯定这个花销是无法由客户均摊的。如果可以的话,铁路系统为什么不自己组织修一条线呢?这固然是因为铁路修建的拆迁工作需要当地政府的大力配合,另一方面,也是因为铁路系统并不确定是否能在旅客收入——主要是非高峰收入上——拉平成本。其中也有可能因为国家目前从铁路系统获得大量税收,在不减少这个税收的情况下做不到。精确的说,修建一条铁路的开销无法由铁路带来的客运增量来平衡,因此才是铁路修建需要由国家拨款的原因。 公平论 既然是全民税收,公平就是一个核心问题了。我们首先排除铁路部门贪污腐败的问题,没有看到的事情,我们暂时不讨论。就公平上,是否应当采取这一行动,做一条讨论。 我记得我说过公平论。当你模糊你的身份时,你提出的结论才是公平的。如果我是不需要回家的本地人,为了春运修建大量铁路显然有悖于我的利益。然而如果我是需要回家的打工仔,春节不能回家又是一件很苦逼的事情。权衡两者,我觉得全民收费修建铁路还是一个可以接受的结论。 其他方案 其实在上文中,我们不断探讨各种技术问题,然而都没有涉及一个实质问题——16亿人的节奏在时空上高度同步。这本身是最大的问题。不解决这个问题,讨论细分市场也好,政策公平也好,都只能在技术上,让尽量多的人各得其所。只有让聚集问题彻底解决,才能彻底解决16亿人民的出行和游玩问题。 那这个核心的方案也就呼之欲出了——年假制和生产中心西迁。 目前我国有10天带薪假期,称为国定假日(顺便说一句,这个和其他国家比小气的可怜)。这些日子固定放假。一旦和前后连成长假,大客运高峰就随即发生。而国外很多是采用年假制的。每个人每年都有一定时间的假期,可以自行安排。很多企业还规定,当员工的工龄增加时,年假也随之增加。据说意大利人最长有一个月的年假(羡慕阿)。 年假制度可以减缓高峰的存在。从理论上说,采取年假后全年的交通量应当都是平均的。然而现实告诉我们——没那么美的事。由于传统节日的存在(例如感恩节,春节),很多人选择在节日附近回家。这还是造成了拥堵,不过显然比现在更轻。因为很多没有钱在假日回家的人,可以选择避开假日回家。 年假的一个问题,就是给与某些老板合法剥削员工的机会。因为如果是固定假日,工厂是否加班很明显。而年假则很难说,某人是否休了年假,除了他自己还有谁知道?但是与此同时,固定假日制度难道就不存在“剥削”员工的老板?员工留下来加班,却只支付正常工资,这种老板有没有?不希望休年假,希望多工作的员工,有没有? 我们不能只关注于年假造成的问题,而束手束脚不解决问题。作为一个可行的方案,部分的实行年假是一个很好的思路。鼓励部分企业实行年假制度,对年假不休的实行三倍工资。部分可行至少好过总体上一无所获。 而生产中心西迁,则是中国政府目前正在努力做的一件事。不过限于地理因素,目前效果好像不大明显。如果有时间,我希望对这一问题做一下全面了解和思考,看看到底是为什么。

Oct 9, 2012 - 2 minute read - Comments

Y Combinator

不动点理论 假定我们有一个函数f,例如,f(x) = x^2。对于某些点,f(x) = x。在这个例子里面,0和1很明显就是两个点。这样的点称为不动点。 不动点理论在各种领域有广泛应用,我记得其中之一就是在血型比例上。当ABO遗传规则固定后,存在一些ABO血型比例,这些比例的人随机通婚,生下来的孩子的血型比例亦保持不变。这是三种血型千百年来存在的基础,否则随着遗传规则比例转变,其中某些血型可能已经在地球上消失了。 也许你很好奇,当我们有了一个规则后,例如f(x) = x^2,或者ABO遗传规则(这也可以当作一个函数,将父代ABO比例转换为子代的),如何才能计算出函数的不动点。 答案是不动点算子。 高阶抽象函数的不动点 我们先不继续讨论不动点算子,让我们先讨论一下抽象函数。上面,我们的f都是具体的演算规则,x是一个数(例如x),或者一个矩阵(例如ABO,也可以当作一种数来考虑)。如果x是一个函数会如何? 我们先看一个递归的阶乘计算函数: (define fact (lambda (n) (if (< n 2) 1 (* n (fact (- n 1)))))) 这是一个典型的阶乘计算函数,没错。问题是,我们在lambda里面调用了fact。从语言层面上说,这样做合法。然而从语言的研究角度说,这难免会带来一个问题。函数的名字,到底是一个可有可无的别名,还是一个在递归中必须的东西。如果是前者,我们可以完全用lambda构造递归函数。而如果是后者,我们无论如何努力,也无法仅仅使用lambda来构造一个递归。 OK,这和不动点有什么关系?这时,我们先假定函数f,是真正的阶乘计算函数。即f(n) = n!。那么对于以下函数,((F f) n) = (f n)。 F = (lambda (h) (lambda (n) (if (< n 2) 1 (* n (h (- n 1)))))) 看不懂为什么?这是一个柯里化函数。当我们传递真正的阶乘函数f给F的时候,在函数体内,他叫做h。而按照f(n-1)的定义,我们得到的值和(f n)没有区别。因此,我们有(F f) = f,你也可以写作F(f) = f。 是不是觉得眼熟?是的,f是函数F的一个不动点。要获得真正的阶乘函数f,我们只要对F计算不动点即可。 Y算子 Y算子(或者叫做Y组合子)是另一种高阶函数,用于计算任意函数的不动点。 假定对于函数f,存在不动点x,有f(x) = x,那么Y(f) = x,这是Y算子的基础。按照上文代入,我们可以得到f(Y(f)) = Y(f),或者可以写作scheme格式:(f (Y f)) = (Y f),这就是Y算子。