编程随想

编程随想,中国互联网时代的英雄,匿名反抗党国的先驱,注定将载入史册。他不仅仅是“翻墙教父”,更是一个伟大的启蒙者。从信息安全到政治学、心理学等领域,广博的知识令人叹为观止。… 如网友 co-memory 所说,“编程随想就是数字时代的坦克人,甚至更伟大,因为一时的勇气和长期的成功坚持是没法比的。”

从2009年1月15日的第一篇博文起,到2021年5月9日最后一篇博文止,编程随想十几年如一日地坚持反抗,这种精神正是我们所要纪念的。面对党国的残酷统治,身在国内的他既没有走向虚无,也没有放弃他的同胞。”

– 网友“47小管家”,《编程随想失踪一周年:当我们纪念时,我们在纪念什么?》

编程随想 | 回顾 六..四 系列[12]:4月18日,从悼念到请愿

前一个帖子 ,俺介绍了胡先帝的悼念活动3天内席卷天朝各地。到了4月18日这天,帝都的大学生们已经不满足于纯粹的悼念。他们想借助这次声势浩大的悼念,提出进一步的政治诉求。所以,18日这天出现了(六.四.运.动中)第一次 政治性 的抗议活动——人民大会堂静坐请愿。 ★”北大七条”的出台   话说17日晚间,有几位北大的学生制作了一块10米长2米宽的横幅,上书”中国魂——部分北大校友暨师生敬挽”。然后拿着这个长条幅在校园内游行。到了深夜时分,参与校内游行的学生越聚越多。大伙儿就提议,干脆到广场上去。于是,一干人等(据说有上千人)就从北大校园一路走到天.安.门(到达广场的时候已是次日凌晨4点,精神可嘉)。   那会儿还是大清早,广场上除了学生,大概也没多少市民。于是这拨学生就开始考虑接下来该咋办?估计很多学生对2年多以前的 八.六.学.潮 还是记忆犹新。八.六.学.潮没有持久,有很多原因(俺的分析在” 这里 “),其中之一就是:缺乏明确的,统一的政治诉求。所以,纪念碑周围的学生们就开始讨论他们的政治诉求。最终商定了七条要求——也就是后来闻名海内外的”北大七条”。 ★”北大七条”的两个版本   为了写这个系列,俺特地参考了不少相关的资料(书籍、网站),以求尽量真实。关于”北大七条”,俺发现有两个版本,流传较广。 ◇版本1 一,公正评价胡耀邦的政绩,肯定民主自由的宽松的政治环境; 二,彻底否定”清除精神污染”与”反自由化”运动,并为这次运动中蒙受不白之冤的人平反; 三,要求党和国家领导人及其子女向全国人民公布其财产状况; 四,允许民办报纸,开放报禁,制定新闻法; 五,增加教育经费,提高知识分子的待遇; 六,取消北京人大常委会违反宪法而制定的限制游行的”十条”; 七,对此次活动作出公开的报道,见诸党政机关报。 ◇版本2 一,重新评价胡耀邦同志的是非功过,肯定其民主、自由、宽松、和谐的观点; 二,彻底否定清除精神污染和反对资产阶级自由化,对蒙受不白之冤的知识分子给予平反; 三,国家领导人及其家属年薪及一切形式的收入向人民公开,反对贪官污吏; 四,允许民间办报,解除报禁,实行言论自由; 五,增加教育经费,提高知识分子待遇; 六,取销北京市政府制定的开于游行示威的”十条”规定; 七,要求政府领导人就政府失误向全国人民作出公开检讨,并通过民主形式对部份领导实行改选。 ◇哪个版本是真的?   这两个版本的头6条大同小异。但是 第7条完全不同 。那么,到底哪一个版本是真实的捏?   版本1的出处比较丰富,有如下几个: 香港记者协会出版的《 人民不会忘记 》(相关页面在” 这里 “) 当事人之一 张伯笠 的个人网站(相关页面在” 这里 “) 当事人之一 李进进的文集 (相关页面在” 这里 “) 《”六 • 四”事件民间白皮书》第30页(书中的备注称:提及的”北大七条”引自李进进文集)   版本2的出处比较单一,主要来自于《 天.安.门文件 》(又名《中国”六 • 四”真相》)。   另外,维基百科的 “六四事件”词条 不知何故也采用此版本。不过维基百科还算客观,在该词条的备注中,注明了”北大七条”存在多种版本,维基引用的是《中国”六 • 四”真相》的版本。   从资料出处来看:版本1有多个比较可信的来源。比如:张伯笠是那天参与讨论北大七条的学生之一;李进进是当天向人大常委会递交请愿书的学生代表之一。   从当时形势来看:18日那天,大学生刚开始准备政治请愿,学生和政府之间的矛盾还没有激化,不太可能提出像”版本2″这么激进的政治要求。   综上所述,俺倾向于认为: 版本1是真实的 。 ★《天.安.门文件》为何失实?   至于《天.安.门文件》一书,为啥会出现如此严重的失实,俺顺便来聊一下:   在 前一个帖子 ,俺大致介绍过这本书的来历。此书很大一部分内容,是当时的党国爪牙(比如国安人员)发给裆中央的报告。照理说,”北大七条”是学生提出的最主要的政治诉求,当时广场上肯定有便衣人员把这一幕给详细记录下来。这帮爪牙连某某大学在几月几日几点几分贴出几张大字报,都数得一清二楚。如此敬业的爪牙,没道理把”北大七条”这么重要的东西给搞错了。   所以,比较大的可能性是:爪牙们提交报告之后,在到达裆中央之前,中途被人篡改了。那么,会是谁干的捏?   为了说清楚这个问题,俺先来聊一下当时朝廷高层的情况。 本系列 的头几个帖子,俺已经花了很多口水,介绍当时朝廷中的两大派系——改革派和保守派。这两派的关系,可谓水火不容。想当初老胡就是因为八.六.学.潮没处理好而下台。老胡被废之后,保守派本来想趁机拿下总书记的宝座,可惜老邓又扶了赵.紫.阳,让保守派美梦落空。如今,大学生借着悼念老胡,掀起新一轮学.潮。对保守派而言,这是个天赐良机。如果八.九.学.潮老赵没处理好,也很可能下台并导致改革派元气大伤,那保守派就可以从中得利。   而当时帝都的市长是陈希同,市委书记是李锡铭。此2人恰好都属保守派,据说他俩跟李鹏的关系还挺密切。而李鹏这个人,一直不满足于总理这个位置,老想把赵.紫.阳挤掉,自己当总书记。所以,当这份报告送到北京市政府手中的时候,很可能就被篡改了。   篡改者的目的,就是故意夸大学生的要求,让高层(主要是八元老)觉得学生很激进。大伙儿想想看,”北大七条”的最后一条被改为: 要求政府领导人就政府失误向全国人民作出公开检讨,并通过民主形式对部份领导实行改选 。这样一种说法,无疑会激怒八元老,尤其会激怒老邓。后续的帖子,俺还会提到保守派的另外一些伎俩——通过这些伎俩,保守派逐步地让老邓觉得,这帮大学生已经不是”人民内部矛盾”,而是”敌我矛盾”。 ★人民大会堂的请愿   分析完”北大七条”的真伪,接下来稍微介绍一下那天的请愿过程。   话说那天拟定出7条政治诉求后,还没到上班时间。于是学生们就到人民大会堂门前等着(人民大会堂就在天.安.门.广.场边上)。等到里面上班了,就选出4个学生代表( 王丹 、李进进、 郭海峰 、张志勇)进大会堂提交请愿书。   当时和学生代表交涉的,是人大信访办的官员。这些官员根本就没把这些学生放在眼里,拿到请愿书之后,只是简单说了句”要研究一下”,就想把学生们打发走。大会堂门口的这些学生,当然晓得政府官员在敷衍了事。但是他们都比较犟,一定要全国人大派出正式代表,接受学生的请愿书。而全国人大的官员,在上级没有指示之前,又不敢轻举妄动。于是双方就这么耗着——从上午耗到下午,再从下午耗到晚上。很多学生是17日深夜从北大徒步走到广场,然后又在大会堂门口不吃不喝,静坐到18日晚上,实在是毅力惊人。 (香港《亚洲新闻周刊》89年5月那期的封面,地上铺的是”中国魂”横幅,横幅上放的白纸写着”北大七条”,拿话筒的是李进进)   随着时间的流逝,大会堂门口的学生越来越多,各个大学的人马都加入进来——很多学生本来要到纪念碑搞悼念活动的。搞完悼念,也顺便加入到静坐的队伍中。据李进进回忆,他当时已经做好连续静坐几天几夜的准备,还叫人回北大拿些棉衣棉被。   到了晚上7点多,随着静坐队伍迅速扩大,官方终于做出让步——人大常委会派出几个知名的代表(宋世雄、刘延东、等)到大会堂外面跟学生见面,并当面接受了请愿书。顺便说一下:刘延东当时任全国青联主席,如今已高升政治局委员;至于宋世雄,央视体育频道的名嘴,90前的网友应该很熟悉。   既然人大已经派代表接受了学生的请愿,一部分现场静坐的学生认为目的已经达到,纷纷散去;但还有一部分学生不满意——毕竟刘延东当时只是个小官,宋世雄虽然名气大,也还是个小官。这部分学生认为,政府应该派出级别更高的官员出来跟学生见面并接受请愿书。于是,这群不甘心的学生就高举着”中国魂”的大横幅,一路奔向中南海(朝廷重量级的官员都住在那儿)。之后,就发生了六四运动中,第一起流血事件——新华门事件。   下一个帖子,俺介绍一下新华门事件的经过。 回到本系列的目录 版权声明 本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者” 编程随想 “和本文原始地址。 学习翻墙 发信给 help_gfw@yahoo.com 可获取翻墙教程 (用国外邮箱以免被墙) 如有其它问题, 用 program.think@gmail.com 联系俺

阅读更多

编程随想 | 求质数算法的N种境界 (N > 10)

★引子   前天,俺在《 俺的招聘经验[4]:通过笔试答题能看出啥? 》一文,以”求质数”作为例子,介绍了一些考察应聘者的经验。由于本文没有政治敏感内容,顺便就转贴到俺在CSDN的镜像博客。   昨天,某个CSDN网友在留言中写道: 老实说,这个程序并不好写,除非你背过这段代码 如果只在纸上让别人写程序,很多人都会出错 但是如果给一台电脑,大多数人都会把这个程序调试正确 出这个题目没啥意义 只能让别人觉得你出题水平低   首先,这位网友看帖可能不太仔细。俺在文中已经专门强调过了,评判笔试答题, “思路和想法”远远比”对错”更重要 ,而他/她依然纠结于对错;其次,这位网友居然觉得这道题目没啥意义,这让俺情何以堪啊?!看来,有相当一部分网友完全没有领略到此中之奥妙啊!   算了,俺今天就豁出去了,给大伙儿抖一抖这道题目的包袱。当然,抖包袱的后果就是:从今天开始,就得把”求质数”这道题从俺公司的笔试题中去掉,然后换上另外一道全然不同的。这么好的一道题要拿掉,真是于心不忍啊 :-( ★题目   好,言归正传。下面俺就由浅入深,从各种角度来剖析这道题目的奥妙。   为了避免被人指责为”玩文字游戏”(有些同学自己审题不细,却抱怨出题的人玩文字游戏),在介绍各种境界之前,再明确一下题意。    前一个帖子 已经介绍过,求质数可以有如下2种玩法。 ◇需求1 请实现一个函数,对于给定的整型参数 N,该函数能够把自然数中,小于 N 的质数,从小到大打印出来。 比如,当 N = 10,则打印出 2 3 5 7 ◇需求2 请实现一个函数,对于给定的整型参数 N,该函数能够从小到大,依次打印出自然数中最小的 N 个质数。 比如,当 N = 10,则打印出 2 3 5 7 11 13 17 19 23 29 ★试除法   首先要介绍的,当然非”试除法”莫属啦。考虑到有些读者是菜鸟,稍微解释一下。   ”试除”,顾名思义,就是不断地尝试能否整除。比如要判断自然数 x 是否质数,就不断尝试小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是质数。   显然,试除法是最容易想到的思路。不客气地说,也是最平庸的思路。不过捏,这个最平庸的思路,居然也有好多种境界。大伙儿请看: ◇境界1   在试除法中,最最土的做法,就是:   假设要判断 x 是否为质数,就从 2 一直尝试到 x-1。这种做法,其效率应该是最差的。如果这道题目有10分,按照这种方式做出的代码,即便正确无误,俺也只给1分。 ◇境界2   稍微聪明一点点的程序猿,会想:x 如果有(除了自身以外的)质因数,那肯定会小于等于 x/2,所以捏,他们就从 2 一直尝试到 x/2 即可。   这一下子就少了一半的工作量哦,但依然是很笨的办法。打分的话,即便代码正确也只有2分 ◇境界3   再稍微聪明一点的程序猿,会想了:除了2以外,所有可能的质因数都是奇数。所以,他们就先尝试 2,然后再尝试从 3 开始一直到 x/2 的所有奇数。   这一下子,工作量又少了一半哦。但是,俺不得不说,依然很土。就算代码完全正确也只能得3分。 ◇境界4   比前3种程序猿更聪明的,就会发现:其实只要从 2 一直尝试到√ x ,就可以了。估计有些网友想不通了,为什么只要到√ x 即可?   简单解释一下:因数都是成对出现的。比如,100的因数有:1和100,2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。至于严密的数学证明,用小学数学知识就可以搞定,俺就不啰嗦了。 ◇境界5   那么,如果先尝试2,然后再针对 3 到√ x 的所有奇数进行试除,是不是就足够优了捏?答案显然是否定的嘛?写到这里,才刚开始热身哦。   一些更加聪明的程序猿,会发现一个问题:尝试从 3 到√ x 的所有奇数,还是有些浪费。比如要判断101是否质数,101的根号取整后是10,那么,按照境界4,需要尝试的奇数分别是:3,5,7,9。但是你发现没有,对9的尝试是多余的。不能被3整除,必然不能被9整除……顺着这个思路走下去,这些程序猿就会发现:其实,只要尝试小于√ x 的 质数 即可。而这些质数,恰好前面已经算出来了(是不是觉得很妙?)。   所以,处于这种境界的程序猿,会把已经算出的质数,先保存起来,然后用于后续的试除,效率就大大提高了。   顺便说一下,这就是算法理论中经常提到的: 以空间换时间 。 ◇补充说明   开头的4种境界,基本上是依次递进的。不过,境界5跟境界4,是平级的。在俺考察过的应聘者中,有人想到了境界4但没有想到境界5;反之,也有人想到境界5但没想到境界4。通常,这两种境界只要能想到其中之一,俺会给5-7分;如果两种都想到了,俺会给8-10分。   对于俺要招的”初级软件工程师”的岗位,能同时想到境界4和境界5,应该就可以了。如果你对自己要求不高,仅仅满足于浅尝辄止。那么,看到这儿,你就可以打住了,无需再看后续的内容;反之,如果你比较好奇或者希望再多学点东西,请接着往下看。 ★筛法   说完”试除法”,再来说说筛法(维基百科的解释在” 这里 “)。俺不妨揣测一下:本文的读者,应该有2/3以上,从来没有听说过筛法。所以捏,顺便跟大伙儿扯扯蛋,聊一下筛法的渊源。   这个筛法啊,真的是一个既巧妙又快速的求质数方法。其发明人是公元前250年左右的一位希腊大牛—— 埃拉托斯特尼 。为啥说他是大牛捏?因为他本人精通多个学科和领域,至少包括:数学、天文学、地理学(地理学这个词汇,就是他创立的)、历史学、文学(他是一个诗人)。真的堪称”跨领域的大牛”。   他最让俺佩服的是:仅仅用简单的几何方法,测量出了地球的周长、地球与月亮的距离、地球与太阳的距离、赤道与黄道的夹角……而且,这些计算结果跟当代科学家测出的,相差无几。要知道他生活的年代,大概相当于中国的春秋战国。而咱们的老祖宗,一直到明朝还顽固地坚信:天是圆的、地是方的、月亮会被天狗给吃喽……   好了,扯蛋完毕,言归正传。   估计很多人把筛法仅仅看成是一种具体的方法。其实, 筛法还是一种很普适的思想 。在处理很多复杂问题的时候,都可以看到筛法的影子。那么,筛法如何求质数捏,说起来很简单:   首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数……   上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。维基百科上有一张很形象的动画,能直观地体现出筛法的工作过程。   明白了”筛法”的原理,大伙儿应该看出,筛法在速度上是明显优于”试除法”的。当然,筛法的程序实现也分为不同的境界。而且,筛法可讲究的门道更多了。下面,俺分别从不同角度,聊一聊筛法都有哪些讲究。 ◇如何确定质数的分布范围?   这是采用筛法首先会碰到的问题。文本开头给出的那两种需求,其处理的方式完全不同,俺分别说一下。 需求1   对于需求1,这个自然不是问题。因为在需求1中,质数的分布范围就是 N,已经给出了,很好办。 需求2   但是对于需求2,就难办了。因为需求2给出的 N,表示需要打印的质数的个数,那么这 N 个质数会分布在多大的范围捏?这可是个头疼的问题啊。   但是,来应聘的程序猿如果足够牛的话,当然不会被这个问题难倒。因为素数的分布,是有规律可循滴——这就是大名鼎鼎的 素数定理 。   稍微懂点数学的,应该知道素数的分布是越往后越稀疏。或者说,素数的密度是越来越低。而素数定理,说白了就是数学家找到了一些公式,用来估计某个范围内的素数,大概有几个。在这些公式中,最简洁的就是 x/ln(x) ,公式中的 ln 表示自然对数(估计很多同学已经忘了啥叫自然对数)。假设要估计1,000,000以内有多少质数,用该公式算出是72,382个,而实际有78,498个,误差约8个百分点。该公式的特点是:估算的范围越大,偏差率越小。   有了素数定理,就可以根据要打印的质数个数,反推出这些质数分布在多大的范围内。因为这个质数分布公式有一定的误差(通常小于15%)。为了保险起见,把反推出的素数分布范围再稍微扩大15%,应该就足够了。   可能有同学会质疑俺:谁有这么好的记性,能够在笔试过程中背出这些质数分布公式捏?   俺觉得:背不出来是正常滴。但是,对于有一定数学功底的应聘者,假如他/她知道质数分布公式,即便不能完整写出来,只要在答题中体现出:”此处通过质数分布公式推算范围”,那么俺也是认可滴。   再啰嗦一次:关键是看idea! ◇如何设计存储容器?   知道了分布范围,接下来就得构造一个容器,来存储该范围内的所有自然数;然后在筛的过程中,把合数筛掉。那么,这个容器该如何设计捏?不同层次的程序猿,自然设计出来的容器也不同啦。 境界1   照例先说说最土的搞法——直接构造一个整型的容器。在筛的过程中把发现的合数删除掉,最后容器中就只剩下质数了。   为啥说这种搞法最土捏?   首先,整型的容器,浪费内存空间。比方说,你用的是32位的C/C++或者是Java,那么每个 int 都至少用掉4个字节的内存。当 N 很大时,内存开销就成问题了。   其次,当 N 很大时,频繁地对一个大的容器进行删除操作可能会导致频繁的内存分配和释放(具体取决于容器的实现方式);而频繁的内存分配/释放,会导致明显的CPU占用并可能造成内存碎片。 境界2   为了避免境界1导致的弊端,更聪明的程序猿会构造一个定长的布尔型容器(通常用数组)。比方说,质数的分布范围是1,000,000,那么就构造一个包含1,000,000个布尔值的数组。然后把所有元素都初始化为 true。在筛的过程中,一旦发现某个自然数是合数,就以该自然数为下标,把对应的布尔值改为 false。   全部筛完之后,遍历数组,找到那些值为 true 的元素,把他们的下标打印出来即可。   此种境界的好处在于:其一,由于容器是定长的,运算过程中避免了频繁的内存分配/释放;其二,在某些语言中,布尔型占用的空间比整型要小。比如C++的 bool 仅用1字节。 境界3   虽然境界2解决了境界1的弊端,但还是有很大的优化空间。有些程序猿会想出按位(bit)存储的思路。这其实是在境界2的基础上,优化了空间性能。俺觉得:C/C++出身的或者是玩过汇编语言的,比较容易往这方面想。   以C++为例。一个bool占用1字节内存。而1个字节有8个比特,每个比特可以表示0或1。所以,当你使用按位存储的方式,一个字节可以拿来当8个布尔型使用。所以,达到此境界的程序猿,会构造一个定长的byte数组,数组的每个byte存储8个布尔值。空间性能相比境界2,提高8倍(对于C++而言)。如果某种语言使用4字节表示布尔型,那么境界3比境界2,空间利用率提高32倍。 ★总结   看到俺写”总结”二字,很多网友心想:总算看完了,知道该怎么求质数才是最优的了。   其实,你们又错了,本文才写了不到一半。考虑到篇幅已经有点长,而且俺打了这么多字,也有点累了,暂时刹住话匣子,下次接着聊。   希望看了今天这个介绍,大伙儿应该明白一个道理:山外有山、天外有天。每一个技术领域里面的每一个细小的分支,深究下去都有很多的门道与奥妙。在你深究的过程中,必然会学到很多东西。深究的过程也就是你能力提高的过程。   本文后续的内容,会介绍刚才提到的按位存储法还有哪些缺陷,该如何解决。另外,还会介绍其它一些求质数的方法。 版权声明 本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者” 编程随想 “和本文原始地址。 学习翻墙 发任意邮件到 help_gfw@yahoo.com 获取翻墙扫盲教程 (用国外邮箱以免被墙) 如有其它问题, 用 program.think@gmail.com 联系俺

阅读更多

编程随想 | 俺的招聘经验[4]:通过笔试答题能看出啥?

前两天,有好心的网友在博客和Google+留言,催促俺赶紧写 招聘系列 的下一帖。被这一提醒,猛然发现这个招聘系列已经中断半年之久。今天赶紧补上。按照原先的计划,本帖应该开始聊面试的话题,但俺觉得笔试的话题还缺了一块,今天就继续聊俺在笔试方面的经验。 ★笔试的目的   在 前面的帖子 ,已经跟大伙儿聊了笔试和面试的优缺点以及这两者该如何搭配。考虑到很多网友比较健忘,再略微回顾一下。笔试的成本(这里指时间成本)比较低,所以应该安排在第一轮。通过笔试,至少要能淘汰掉80%以上的应聘者(还记得《 无处不在的二八原理 》吗)。这样一来,面试官才有足够的时间和精力,去筛选剩下的这些人。   因此,笔试题目要有足够好的 区分度 ——能够比较明显地体现出应聘者的差别。否则的话,笔试就起不到筛选的效果。 ★笔试题的形式   俺出的(针对开发人员的)笔试题,大都只有问答题和程序题,没有选择题或填空题。因为选择题以及大多数的填空题都属于封闭性问题。封闭性问题不但区分度很差,还有诸多缺点(《 开放性问题 vs 封闭性问题 》一文已介绍过,此处不再啰嗦)。   为了让大伙儿有一个直观的认识,俺后面谈的话题,都会拿同一个例子来说事儿。这个例子就是:求质数。(质数也叫素数,小学数学就教过了,俺就不解释了)。为啥要拿这个例子捏?因为这是一个老掉牙的面试题目,貌似国内外很多软件公司的面试题都有它的身影。想必很多人对它都不陌生,俺就不必浪费口水多作解释了。 ★思路/想法   说到思路和想法,俺发现不少招聘者在给笔试题打分的时候,都有一个毛病:”只看对错,不管其它”。其实, “思路和想法”往往比”对错”更重要 ——它可以反应出一个人的知识面、创造性等多种素质。而这些素质对于一个开发人员是很重要滴。   举例说明:   假如有两个应聘者A与B来做这道”求质数”的题目。A用最普通的”试除”来判断质数并且程序实现正确无误;B使用”筛法”来求质数(没听说过筛法的同学,请看” 这里 “的介绍),总体思路对头但程序有些小Bug。那么,俺会更看好B同学。为啥捏?   假如B同学之前就听说过筛法,那说明此人数学的知识面应该比较广;如果B同学之前没听说过筛法,是自己独立想出来的,那这个人应该很有才。反之,用”试除”求质数的思路,太过于普通,小学生都能想到。 ★规范性   俺拿到应聘者的答卷时,总是先花几秒钟时间,粗略扫一眼程序题。因为从一个人写的代码,可以很容易地判断出:此人是否养成良好的编码习惯。在筛选程序猿的时候,俺宁可要那种虽然技能差但是习惯好的,也不要那种习惯差但是技能好的。因为”习惯”是一种很顽固的东西——很难通过培训加以改变的;而技能相对来说,比较容易通过培训加以提升。   关于编码的规范性,大致有如下几个方面: ◇排版是否规范   比如:应该缩进的地方是否有缩进?该留空格或空行的地方,是否留出来?   假如某个应聘者写的程序,连最基本的”作用域缩进”都没有体现出来。那么,大致可以判定此人的基本素质很成问题。 ◇命名是否规范   比如:命名变量名的时候,是用无意义的单字母变量名,还是用具有可读性的英语单词。说到英语单词,顺便提一下:有些应聘者写的程序里,居然用拼音来命名,真是让人大跌眼镜。 ◇是否有恰当的注释   前面2条,大多数人都会留意到。但是很多人都忽略了注释。   通过代码注释,可以看出代码作者的编码功底。新手写代码,要么不写注释,要么注释里尽写些废话,犹如画蛇添足;而优秀的程序猿写的注释言简意赅、恰到好处,有画龙点睛之妙。 ★细心   和刚才提到的编码习惯类似,细心也是很难通过培训加以改变的。要看出应聘者是粗心还是细心,只需在面试题目中留一些隐蔽的陷阱即可。   俺在招聘”初级软件工程师”的笔试题中,也用了”求质数”这道题,题目是这样说的: 请实现一个函数,对于给定的整型参数 N,该函数能够打印出自然数中的头 N 个质数。   请大伙儿把题目仔细看喽!然后,大伙儿猜猜看,有多少人审题出错?   据俺保守估计,大概在95%以上!绝大多数的答题者,都把题目错误地理解成: 请实现一个函数,对于给定的整型参数 N,该函数能够打印出头 N 个自然数中的质数。   列位看官扪心自问一下,你是不是也属于看错题目的那95%的人?   这两句话,只不过有3个字挪了一下位置,意义全然不同(再次感叹,汉语真是一门模糊的语言)。俺当初设计这道题目的时候,就是故意留个坑,但是没想到有这么多人掉坑里。 ★严密性   可能有同学认为严密性和细心是一回事,其实两者有点区别(当然,细心的人通常也比较严密;反之亦然)。对于软件工程师而言,严密性体现在:编写出的代码是否尽可能地考虑到各种非正常的情况。   一个严密的程序猿,写出来的代码自然也比较严密。严密的代码会带来两大好处:其一,代码的Bug率通常比较低;其二,代码通常比较安全,不易被入侵。关于Bug率,搞开发的应该都晓得;但是代码的安全性,貌似很多开发人员不太清楚。俺简单聊一下。   大概是在安全界混的时间比较长,俺对代码安全性的好处深有体会。大部分入侵者对某个软件系统(比如Web服务器,数据库服务器)的攻击,都是利用了软件代码中隐含的漏洞。而这些漏洞往往是因为编写代码的人考虑问题不严密而留下的安全隐患。   大伙儿不要误会,以为代码安全的问题很遥远,跟自己无关。其实这是一个很普遍的、跨行业的问题。无论是放在互联网上的网站、还是企业的内部系统,或者是大众化的桌面软件,都存在被入侵的风险。因此,编写安全的代码是每个程序猿都面临的问题。   说了这么多,就是想让各位明白,严密性的重要所在。   那么,如何看出应聘者是否具有严密性捏?俺继续以”求质数”作为例子。   在”求质数”的题目中说了:函数参数N是一个整型。那么,一个严密的程序猿,会在函数开头,就检验该参数的有效性。一旦发现参数有问题(比如说,N为0或者N为负数),就给出相应的处理(比如,断言失败或者抛出异常)。因为在这个场景里面,N

阅读更多

编程随想 | 回顾 六..四 系列[9]:山雨欲来的 1.9.8.9 年

最近几周,又是普及赛风翻墙,又赶上 Google Reader 改版,然后又扯到了郎咸平的演讲。结果一眨眼的功夫,距离上一个帖子《 十三大重新排座次 》已经过去整整一个月了。再次对关注本系列的网友表示抱歉!   话说历史的车轮,终于行进到1.9.8.9年。在天朝,大规模的政治运动(尤其是那种自下而上的政治运动),往往都有其深刻的社会背景。通常是天朝的屁民产生普遍的(对社会现状的)不满情绪,并累积到一定程度,然后某个事件起到了导火索的作用,于是自下而上的政治运动就在短时间内爆发了。北洋时期的 五四运动 是如此(这事儿大伙儿应该挺熟悉),文革时期的 四五运动 是如此(这事儿大伙儿应该较陌生),8九年的 6..4 运动亦如此。此规律不仅适用于天朝,老外也一样(不信请看今年中东流行的 茉.莉.花.革.命)。   所以,今天俺要跟大伙儿聊一聊:在1.9.8.9年的年初,天朝社会所呈现出来的山雨欲来风满楼之势。 ★全球政治形势 – 共.产.阵.营开始瓦解   先说说8九年的国际政局。跟天朝关系最密切的大概就是:共.产.主.义阵营开始土崩瓦解。 ◇苏联   共.产.阵.营的瓦解,首先开始于苏联。   大伙儿都知道,当时的苏共总书记是戈尔巴乔夫(脑门上有胎记的那哥们)。他面对苏联内外交困的局面,被迫推行政治改革。在1988年夏天的苏共党代会上,戈同学提出了” 苏联的改革应沿着深入且持续的民主方向前进 “。同年,戈同学还宣布释放苏联所有的政治犯,并且为斯大林在历次大清洗中的遇难者建立纪念碑(说到大清洗,苏联的斯大林、纳粹的希特勒以及及天朝的毛太祖,并称20世纪三大刽子手)。   到了1.9.8.9年的3月份,苏联进行了一次具有历史意义的全国大选(类似天朝的人大代表选举)。其重大意义在于:自十月革命以来,第一次允许共.产.党以外的政党参加选举。那次大选中,苏共的保守派候选人多有落选,反而像叶利钦这种激进改革派以高票(89.4%)当选。另外,很多知名的党外民主人士(比如萨哈罗夫)也高票当选。很明显,苏共作为执政党,已经失去了很多民心。   除了允许党外人士参加人民代表选举,戈同学的另外一个重大举措是:放弃对东欧国家的控制。按照当时苏联外交部发言人的说法:让每个国家决定自己的道路。原先东欧那些个社会主义国家,大都是苏联老大哥的附庸国。好几个东欧小国,都是靠着苏联的武力来维持共.产.党的统治。一旦苏联放弃干预,东欧的共.产.党就纷纷垮台。 ◇波兰   在东欧剧变中,波兰共.产.党(全称是波兰统一工人党,以下简称波共)是第一个倒下的多米诺骨牌,它是被波兰的 团结工会 击败的。   团结工会成立于1980年,在八十年代的大部分时间,它一直是非法组织,只能在地下活动。到了88年,由于失去了苏联这个靠山,波共再也无法压制团结工会,只好承认其合法地位。于是团结工会就从地下组织变为公开活动,并迅速壮大。到了1.9.8.9年,波兰的1200万工人中约有900万人加入团结工会。   顺便说一下,波兰在 1.9.8.9年的 6 月 4 日 举行全国大选,团结工会彻底击败波共。而就在同一天,在地球的另一边,另一个共.产.政.权调动野战部队,开始在自己的首都杀人… ◇匈牙利   在1.9.8.9年2月,匈牙利政府宣布为1956年的 匈牙利事件 平反,并称其为”人民起义”。在平反之前,所有的社会主义国家都把匈牙利事件定性为,反革命动乱(天朝对 6..4 事件也是这么定性的)。匈牙利政府的这一声明,着实让天朝政府尴尬。因为当年就是天朝的毛太祖极力怂恿,才让苏联总书记赫鲁晓夫下定决心出兵匈牙利。   顺便说一下,发生在1956年10月的匈牙利事件,同 6..4 事件有诸多相似之处:都是由大学生最先发动,社会各界都积极响应,都震惊世界,当局都动用正规军(包括坦克)进行镇压。不过,匈牙利的老百姓还是比天朝的屁民牛B一些,他们遭到血腥镇压之后,很多人跑到军火库抢武器,然后跟军方展开巷战。如果不是苏联老大哥在最后关头派出精锐部队,光靠匈牙利本国的军警,还未必能摆平。 ★国内政治气氛,民主人士重新活跃   介绍完国际形势,再来说说国内政治形势。 ◇知识分子联名上书   大概是受到了苏联改革的鼓舞,天朝的一些民主人士再度活跃起来。俺在《 八.六.学.潮始末 》一文提到的方励之,就是其中的代表。这位方校长在八.六.学.潮后,已经被罢官并且被邓太上皇点名开除党籍。这样一来,他反而更没有顾忌,经常在公开场合批评”四项基本原则”,提倡”全盘西化”。有可能是受到戈尔巴乔夫释放政治犯的启发,8九年元旦刚过没几天,方励之就发表了《 致邓.小.平的公开信 》,呼吁释放朝廷关押的政治犯。   方励之的公开信,引发了连锁反应。到了2月初,著名诗人北岛,联络了33位文学界的知名人士,发了另一封公开信《北京文化界致人大常委及中共中央的公开信》。在上面签名的名人有:吴祖光、冰心、萧乾、李泽厚、包遵信、王若水、陈军等人。然后,在二月底是《北京科教界致中央领导的公开信》,联名签署的有王淦昌、许良英、茅于轼、包遵信、吴祖光等42人。再然后是三月底的《文化界给第七届全国人大二次会议的公开信》,联署人有戴晴、徐友渔、史铁生、严家其、李银河等43人。(上述公开信的内容在” 这里 “)   上述这些公开信的共同点,就是希望党的高层能够推动政治改革、释放在押的政治犯。公开信的联署人,很多都是天朝各界的著名知识分子(有些人名,大伙儿应该常听说),有不小的影响力。 ◇大学生心潮未退   虽然八.六.学.潮没有掀起太大动静就平息了。但是国内很多高校的学生并未善罢甘休。正所谓学潮退了心潮未退。朝廷官方在1988年搞的一份名叫《当代大学生的思考与选择》的万人问卷调查,很能说明当时大学生的思想状况。以下是俺从问卷调查结果中摘录的部分数据: 对共.产.主.义.社.会的看法 39.7%  纯粹是一种空想,永远无法实现 25.0%  这个问题说不清楚 对共.产.党的看法 53.4%  不想入党 45.65%  党风越来越差 15.85%  党风差的根源是”上梁不正下梁歪” 对八.六.学.潮的看法 53.56% 根本起因是国家体制的弊端和不正之风引起的 14.27%  八.六.学.潮,学生根本没有错 42.32%  今后如果出现类似八六年的学潮,参不参加要视情况而定 5.7%  今后如果出现类似八六年的学潮,要积极参加 对改革开放的看法 41.71% 必须坚持走社会主义道路 45.65% 管它什么主义,只要富起来就行 8.77%  应该补资本主义的课并全盘西化   从上述调查看,当时的大学生,不满情绪很明显。而且,考虑到很多人在问卷中不敢公开自己的真实想法,所以这个问卷调查应该还是偏乐观的——实际的不满情绪应该更严重。除了这个问卷,党国官方也搞了其它一些调查。据说在团中央和国家教委1988年下半年提交的相关报告中,都警告了大规模学潮的潜在风险。 ★国内经济形势 – 基层屁民意见很大   说完政治层面,再来说说经济层面。 ◇物价飞涨   1988年,天朝经济出现的主要问题就是物价飞涨。物价猛涨的同时,也就意味着人民币贬值。于是屁民们纷纷去银行取钱抢购商品。很多地方因此出现挤兑(银行挤兑这种事情,在天朝是很罕见滴)。仅1988年的第三季度,居民储蓄存款额就降低了300亿(当时全国居民存款额是4000亿)。对88年的抢购潮,年纪大一些的网友,应该都有印象。80年之后出生的网友,可以问问你的父母。   朝廷官方为了稳定人心,赶紧让国有银行开办保值储蓄的业务。保值储蓄的意思,就是确保长期存款利息能够略高于通胀率。否则的话,在当时那么高的通胀水平,存在银行里的钱会越来越缩水。   被物价问题这么一闹腾,很多老百姓手头的钞票都贬值了,心里非常不爽。 ◇腐败严重   另一个让屁民很不爽的事情,就是党国的腐败问题——这已经是天朝的老问题了。自从经济改革之后,腐败之风日渐盛行。有权有势的官员,想尽办法玩权钱交易的把戏,以此来大捞一把。   说到八十年代的官员腐败,其特色现象之一是”官倒”。可能80后、90后的同学,不太明白”官倒”是咋回事,俺大概解释一下。   那会儿,天朝正在从计划经济向市场经济转型。市面上的一些重要的商品实行双规制。双规制就是说商品有两种价格,一种是官价、一种是市价。市价,大家比较好理解,就跟现在的市场价格一样,是由供求关系决定的;而官价则是官方硬性制定的。当时的一些国有企业实行计划供应,根据官价来采购商品。   由于市价通常远远高于官价,某些具有物资调拨权力的官员,就可以把某些商品(比如钢材)以官价调拨给自己的亲属,然后其亲属再拿到市面上以市价出售。这一转手就可以赚取2到3倍甚至更多的差价。 ◇屁民很生气,后果很严重   在天朝的屁民中,虽然不乏热血青年及理想主义者,但是大多数的屁民,都是很实在、很功利的。只要他们的切身利益不受到明显伤害,通常是不会闹事滴。关于这一点,在俺上次推荐的的《中国的性格》一书,有详尽的分析(俺的书评在” 这里 “)。   然而,1988年的通胀以及日益严重的腐败问题,终于让这些屁民感觉到自身利益受损。这也就是为什么8九年的学潮,有如此深厚的群众基础,社会的各个阶层都参与进来。   顺便发散一下。   眼下的天朝:通涨水平,貌似也不低;高房价貌似也让很多人不爽;至于腐败问题,显然比八十年代还要严重得多。这一切的不爽,都会在屁民的心中累积。没准哪天就爆发了。肯定有人会问:何时会爆发?抱歉,俺不是算命的,说不上来。或许现在的天朝,就差某个导火线而已。 回到本系列的目录 ================================ 版权声明 本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者”编程随想“和本文原始地址。 学习翻墙 发任意邮件到 help_gfw@yahoo.com 可获取翻墙扫盲教程(国内邮箱会被墙, 慎用)! 如有其它问题, 用 program.think@gmail.com 联系俺

阅读更多

编程随想 | 聊聊阴谋论及其流行的原因

★引子   前天写了 一篇帖子 ,推荐并解读了郎咸平同学在沈阳的演讲。然后就收到很多网友在博客和 Google+ 上的评论,批评郎同学的阴谋论观点,还有人认为俺是在宣扬阴谋论。   这也怪俺前天写帖子的时候,对郎的阴谋论观点仅仅做了隐晦的讽刺。结果很多网友看帖不仔细,没察觉出来。后来,俺在原文中又补了一段声明,强调了俺对阴谋论的态度(还加了粗体以醒目)。   其实捏,俺推荐这个演讲,主要用意是:郎的演讲中列举了不少事实和数据,这些可以帮助网友从另外一个角度来看天朝眼下的经济状况,顺便也了解一下党国高层的无能。大伙儿在看演讲内容时,要取其精华,弃其糟粕。   好,言归正传。由于这两天老是在扯”阴谋论”这个词,今天就开一个帖子,跟大伙儿聊一聊阴谋论那些事儿。 ★”阴谋论”是啥?   所谓的”阴谋论”,就是把重大的历史事件,或者当代的一些重大事件,归结为某些秘密的团体策划的阴谋。   为了让各位读者有个具体的印象,俺举几个例子。   比如前几年很畅销的《货币战争》。在此书中,作者塑造了一个巨牛B的”罗斯柴尔德家族”。据作者说,从拿破仑战争、到第一次世界大战、到第二次世界大战、一直到现在,地球上所有重大的政治事件和经济事件,都是这个牛B家族在幕后事先操纵的。   比如前几年好莱坞拍的大片《达芬奇密码》(改编自同名小说),很多人应该都看过。也是以阴谋论为主题。说是从古至今,一直有个光明会(共济会)的秘密团体,在操控世界。   比如9-11已经过去10年了,依然还有很多人认为,9-11是美国政府自导自演的苦肉计,以此来达到不可告人的目的。 ★为何阴谋论很有市场?   如果大伙儿仔细观察,会发现:周围有很多人相信形形色色的阴谋论。所以,俺有必要解释一下,其中的缘由。 ◇心理因素   俺个人觉得,心理学层面的因素是阴谋论广泛存在的主要原因。对于阴谋论的心理学因素,俺总结了如下几点。 1、满足”简单性偏好”   什么是”简单性偏好”捏?在我们的潜意识里,总是企图用尽可能简单的概念来构建我们的知识体系。而阴谋论,恰好可以满足这种心理倾向。比如刚才提到的《货币战争》,就用”罗斯柴尔德家族”来解释所有重大的政治事件和经济事件。确实足够简单! 2、消除对”未知和不确定性”的恐惧   在人的潜意识中,存在一种对未知和不确定性的恐惧。这个应该是进化产生的。当初猿人在丛林中游荡的时候,周围的环境充满危险。而这种”对不确定性的恐惧”,有助于避免个体的冒险,从而提高生存的概率。   而阴谋论的存在,可以大大消除这种不确定性。通过阴谋论,世界上所有的重大事件,都可以得到很好的解释。 3、为情感因素找到接口   这回,俺换一个例子,拿奥巴马同学来说事儿。   话说奥同学当选总统后,很多美国佬之间流传着一种说法,说奥同学不是在美国夏威夷出生的。根据美国法律,只有在美国本土出生的人,才能当总统。所以,这个阴谋论在质疑奥同学出生地的同时,也在质疑他总统身份的合法性。后来,美国官方给出了很多确凿的证据,证明奥同学确确实实在夏威夷出生,但有不少美国民众宁可相信阴谋论,也不愿相信那些确凿的证据。   为什么会这样捏?在这些人当中,有很大比例的人,在感情上无法接受”黑人当美国总统”这一现实。而接受阴谋论可以令他们逃避这一现实。 4、满足猎奇心理   为什么很多人热衷于娱乐圈八卦捏?这就是猎奇心理的作用。而阴谋论在某种程度上,很类似于娱乐圈八卦——同样给人惊奇、刺激、劲爆的信息,让受众觉得很爽。 ◇政治因素   除了心理学因素,另一个对阴谋论推波助澜的,就是政治因素。   很多政客或者某些国家的政府,喜欢用阴谋论来操纵舆论,进而影响公众,以达到自己的目的。这样的例子,极权国家有,民主国家也有。   比如天朝这种极权国家,官方经常鼓吹:帝国主义忘我之心不死。把很多原本不相关的事情,都扣上”帝国主义颠覆天朝”的大帽子。近几年,天朝还流行另一个比较傻B的阴谋论——党中央在下一盘很大的棋——把伟光正吹得神乎其神。   即便像美国这样的民主国家,在50年代也出现了臭名昭著的麦卡锡主义,鼓吹赤色分子渗透到美国各界。很多科学家(比如爱因斯坦、奥本海默)都受到牵连,好在麦卡锡风光的时间不长。 ◇经济因素   最后,再来说说经济因素。   由于阴谋论具有广泛的心理学基础,因此,很多阴谋论的调调,很吸引眼球。在当今互联网时代,吸引眼球就能意味着经济效益(眼球经济)。所以,就会促使某些人为了经济利益,大肆鼓吹阴谋论。   俺不妨邪恶地揣测一下,《货币战争》的作者应该借卖书,赚了不少银子。 ★阴谋论的弊端   信奉阴谋论,会导致如下的弊端。 ◇变得消极   如果一个人信奉阴谋论,认为所有的的重大事件都是阴谋集团在背后操纵,潜意识里就会觉得自己无法与之抗衡,有可能会让自己变得消极,事事随波逐流。 ◇不善把握机会   在现实世界中(尤其在眼下这个信息时代),时常充满着偶然性,充满着突发事件。而这些偶然的,突发的事情,往往意味着机遇。善于抓住机遇的人,更容易为自己争取到利益,也更易达成自己的目标。   而那些信奉阴谋论的人,认定凡事都有人在背后操控。因此,这种人不相信偶然性,也不相信突发事件。自然也就不懂得去抓住机会。 ★俺如何对待阴谋论观点    大部分的 阴谋论,有一个共同特点——既无法证实又无法证否。也就是说,你找不到确凿证据来证实它,也找不到确凿证据来否定它。所以,对这类阴谋论,俺持保留态度,既不相信它,也不去否定它;或者也可以说,持忽略的态度。对俺来说,一个既不能证实又不能证否的命题,是一个没有意义的命题。 ================================ 版权声明 本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者”编程随想“和本文原始地址。 学习翻墙 发任意邮件到 help_gfw@yahoo.com 可获取翻墙扫盲教程(国内邮箱会被墙, 慎用)! 如有其它问题, 用 program.think@gmail.com 联系俺

阅读更多

CDT/CDS今日重点

【CDT月度视频】十一月之声(2024)——“一路都被撞没了,估计一圈都没了”

【年终专题】“13条生命换不来1条热搜”……2024年度“每日一语”

【年终专题】“中文互联网上的内容每年都以断崖式的速度在锐减”……2024年度404文章

更多文章总汇……

CDT专题

支持中国数字时代

蓝灯·无界计划

现在,你可以用一种新的方式对抗互联网审查:在浏览中国数字时代网站时,按下下面这个开关按钮,为全世界想要自由获取信息的人提供一个安全的“桥梁”。这个开源项目由蓝灯(lantern)提供,了解详情

CDT 新闻简报

读者投稿

漫游数字空间