网页栅格化布局之我见

上周,hou 同学给我们组内分享了一下网页栅格布局的理念,虽然因为时间关系只能“浅析”一下,但是对于我个人而言收获还是很大的。对于网页栅格化布局一直有所耳闻,只是从来没有真真实实地落到实处,也没有把它和 CSS 框架联系在一起。

首先,我前所未有地听说了栅格布局的分门别类有这么多,包括960 Grid System、YAML CSS Framework、YUI Grids CSS 等数十种栅格技术思想,而且各有各的特点,至今还有很多门户网站正在使用这一快捷高效的网页布局方式,比如说:Yahoo、淘宝、MySpace、新浪、网易等等。

当然,方法是有很多,也无所谓优劣,只有最适合自己的、最适合项目的才会是最好的。所以我决定采取全面撒网,重点捕鱼的学习策略,先对 hou 介绍的几种网页栅格布局方式进行比较,选择其中一种便于学习便于上手的方法应用实践到自己的项目中去。

本文的体会也就主要谈一下对淘宝DPL-栅格生成器使用的一些体验。

相比较之下,我更倾向于 hou 分享的那款淘宝DPL-栅格生成器,可以设定我们最常用的两栏、三栏布局,还有自定义宽度,在不改变其 HTML 结构的基础上,只需要改一个class,就可以实现两栏互换,主栏自适应宽度等效果,同时也不用担心在各浏览器下的表现问题,完美兼容。

个人观点:

1、 淘宝DPL-栅格生成器就是网页栅格思想的提炼工具,它比960 Grid System、YAML CSS Framework、YUI Grids CSS那些框架更精简,因为栅格生成器无需事先加载一段CSS框架库,它是按需生成的,所以小巧且实用。

2、很遗憾但很幸运的是,栅格生成器这样的工具只能协助我们完成大的结构布局。遗憾的是,很多细节的布局我们还需亲力亲为;幸运的是,我们不能受工具摆布,网页栅格化甚至便捷化的工具只能提供给我们一个很好的思路,但是绝不能成为依赖于它的理由。

3、栅格化和面向对象的 OOCSS 是一个相对的概念,前者是从大的整体布局框架而言,后者是从细节的样式上来说,如果是大型项目开发,这两者结合使用也许是个不错的选择。

那天晚上还在和任平生GG讨论网页栅格化布局的优势与劣势,当然结果还是没有争出个胜负,可以说栅格化是一个比较古董级的网页布局方法,但是还不至于被淘汰,我觉得无论是网页设计师还是前端架构师都应该了解网页栅格化这个概念,对我们做网站是会有所帮助的。

与此文有关系的插足小三 面向对象的 OOCSS (98) 浮动元素的水平居中 (111) 你看这个链接2不2? (183) 自适应树型结构的 HTML (111) 杂谈 CSS 实现的图片放大效果 (90) 导航垂直滚动条的两种实现方法 (117) 让浏览器的私有属性通过 W3C 验证 […]

Amazon的书为什么卖到了$2000万

最近,Amazon的新闻比较多,除了Amazon的云平台宕机外,还有一个被热炒的新闻是在Amazon的书店里,有一本书要买$23,698,655.93美元,相当于1亿5千万人民币(如下图所示),这个事情是由UC Berkeley的生物学家Michael Eisen发现的,然后他在他的博客上写了一篇文章来说明这个事情。

这本书是1992年,现在绝版了,生物学家决定上Amazon找一下,结果看到了有两本新书,还有一些二手的,二手书价比较正常,但是那两个新书的价都上了百万。这个生物学家还写了邮件给原作者和原作者开了玩笑。呵呵。

一般人可能就把这个事当成个笑话了,不过,教授就是教授,它还认真的研究了一下为什么会这样。

首先,这个不是Amazon的订价的问题,这是Amazon的第三方商户平台两个商户报价,一个商户叫profnath,另一个商户叫bordeebook。我们的生物学教授观察这两个商户的书价了几天,看到了下面的结果:

从上面的表中,我们可以看到,profnath商户的价格总是bordeebook的99.83%,而bordeebook的总是比profnath的高27.059%,很明显,这两个商户用的是程序在自动定价——“自动竞价”。

profnath商户想把书买出去,所以,其订价要比最高价要低一些(99.83%),这个很容易理解。 bordeebook商户为什么要比最高价要高1.27倍呢?合理的解释是,bordeebook并没有这本书,这个商户只是想用更多的选品来吸引买家,这样可以让人觉得他和竞争对手有一样多的选品。所以,他要把价订得高一点,这样就算是被人下单,他可以从别人手里把书买过来,然后再卖给卖家。27%的空间,够他赚了。

因为两个商户订的比例不一样,所以,这两个商户的自动订价系统就成了相互涨价的程序——profnath以差0.17%差价跟上,而bordeebook以27%的幅度甩开,profnth再跟上,bordeebook再甩开……。于是最后的价格就到了$23,698,655.93美金。呵呵。

下面,我说说我的收获——

能力:我非常欣赏这位生物学教授的求甚解的态度,这和Linus要求其团队成员的能力如出一辙。赞一个! 商业:从这两个商户的行为看到了一种相反的商业技巧。profnath 和 bordeebook  都是聪明的商家。 电商:自动定价系统可能会成为未来电子商务的一个重要的方向。电子商务还有很多东西可以做啊。 程序:程序设计中需要加上边界条件,最高值和最低值(当然,我能理解为什么这两个商户没有回,因为不同的商品价格差得太大,也许他们也在卖一些几百万的商品)。

最后,这本书的网址在这里《The Making of a Fly: The Genetics of Animal Design》,你可以看到价格又在攀升了,昨天我看的是200多美,我写这篇文章此时的价格是近1000美金了。呵呵。

(全文完)

(请勿用于商业用途,转载时请注明作者和出处)

相关文章 2011年06月20日 — 一个空格引发的惨剧 2011年04月27日 — 关于Amazon云宕机的网贴收集 2011年04月27日 — Linux 2.6.39-rc3的一个插曲 2011年04月25日 — 一些软件设计的原则 2011年02月28日 — 打印质数的各种算法 2010年09月25日 — 代码重构的一个示例 2010年09月21日 — […]

Apache的rewrite要点

Apache的rewrite模块功能强大,但是想要把它用顺需要注意几点,不然你会很痛苦!

RewriteCond在RewriteRule条件之后判断

apache的rewrite规则是,先判断是否匹配RewriteRule的条件,成功后再判断是否匹配RewriteCond。假设我们想要把不存在的页面redirect到另外一个地址,我们可以用这样的规则:

1 2 3 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://www.example2.com/$1 [R,L]

这里首先用(.*)$这一正则表达式来匹配所有的url,然后再判断这个url指向的文件是否存在。

DocumentRoot设定后‘/’永远存在

继续上面的例子,假设我的一个域名没有首页,我希望把针对这个域名的访问也转发到另外一个地址,比如www.example.com跳转到www.example2.com,那么上面的规则就不够了,因为‘/’目录是存在的,无法通过条件

1 RewriteCond %{REQUEST_FILENAME} !-d

我们需要在后面再加一条规则

1 RewriteRule ^$ http://www.example2.com [R,L]

这样我们就能成功地把www.example.com下的首页和不存在的页面都转发到www.example2.com下了。

.htaccess里的规则不能直接放到httpd.conf或VirtualHost里

.htaccess的规则只是针对其文件所在目录下而言的,其效果和放在Directory里一样,然而当把这些规则挪到httpd.conf或VirtualHost里时,就需要做出调整了。继续上面的例子,假设我们把DocumentRoot设为”/var/www”,那么上面介绍的两个规则放在/var/www/.htaccess文件里,或者放在httpd.conf或VirtualHost的<Directory /var/www>中,效果一样。然而这两个规则其实都是Server级的,我们完全可以把它放到VirtualHost下,而不是<Directory /var/www>中,新的规则如下

1 2 3 4 5 RewriteCond %{LA-U:REQUEST_FILENAME} !-f RewriteCond %{LA-U:REQUEST_FILENAME} !-d RewriteRule ^/(.*)$ http://www.example2.com/$1 [R,L] RewriteRule ^/$ http://local.sgj [R,L]

这里有两点区别需要注意,首先REQUEST_FILENAME前加了‘LA-U:’,这是因为当处理VirtualHost下的Rewrite规则时,apache还处在一个url对应文件的翻译阶段(URL-to-filename translation),apache这个时候还不知道该访问哪个文件或目录,自然也就无从得知这个文件或目录是否存在了,这里的‘LA-U:’就是让apache先去获取这个变量,知道自己该访问哪个文件或目录,然后才能判断其是否存在。 第二点是两个正则表达式里都多了一个‘/’,这是因为VirtualHost和<Directory /var/www>不同,它提供给RewriteRule判断的是完整的url,及www.example.com/index.html里的‘/index.html’,而<Directory /var/www>下提供的是目录‘/’之后的内容,及‘index.html’。以此类推,www.example.com/abc/index.html,在VirtualHost下判断的是‘/abc/index.html’,在<Directory /var/www>下则是‘abc/index.html’,而在<Directory /var/www/abc>下则是‘index.html’了。

前端开发的电话面试

感谢外地的前端同学,给我锻炼自己的机会。 昨天进行了一场电话面试,发出来给大家点评,看有哪些问题是不合适的:

提出的问题如下:

平常访问哪些论坛/博客/读过哪些书? 做过哪些web项目,遇到了什么问题,如何解决? 如何做网站优化? 感兴趣的新技术?未来发展趋势的看法?

针对这个人,拓展问了一下:

json数据格式和xml格式的优劣? yui、jQuery、Prototype这些框架各自的优缺点

最后

请教一下各位前端的同行,这些题目拿来做“电话面试”,有什么不妥当的? 或者说,有没有更好的问题可以拿出来问? 或者说,大家对哪类问题比较反感?

腾讯牌操作系统离我们还有多远?

在 w3ctech 组织的拥抱HTML5的交流大会上,来自腾讯的前端工程师于涛童鞋就对 WebQQ3.0 的新功能有所透露,他说近期就将面市的,没想到这个最近就真的这么近,就在刚刚几个小时前 WebQQ3.0 就正式上线了,相对于之前的 WebQQ2.0 而言,3.0版本可以说是一个华丽而又循序渐进的升级。

如果已经有对 WebQQ3.0 体验过的童鞋就会发现,WebQQ3.0 基本上已经是“偏题”了,因为它不仅仅再是一个基于 Web 客户端的 QQ 软件,而是更趋向于 WebOS!是的,这简直就是一款基于 Web 浏览器的操作系统!并且结合了 Windows 左边菜单、右边输入法的用户习惯的界面,以及 Linux 操作系统的多桌面模式,可见野心不小。

WebQQ3.0 给我们带来了什么?1、多桌面操作。2、讨论组功能。3、音视频功能。这些可以从腾讯的官方得到更多详尽的介绍,我就不多费口舌了。那么腾讯搞这些的目的是什么呢?我相信绝对不只是一个简单的 2.0 至 3.0 的升级这么简单。去年10月份,我们应该还记忆犹新,那时候腾讯和360正打得火热,因为360的流氓手段,腾讯曾一度关闭 WebQQ 的通道以此作为抵抗,但是腾讯、360、还有我们用户都知道那绝不可能是长久之计,腾讯恨360已经恨到了骨子里,为了出这口恶气,也为了自己(应该是不会为了用户),腾讯要为他的 WebQQ 转型,于是就有了 WebQQ2.0(它俩吵架的时候就已经有了,不过正与 WebQQ1.0 并行),等吵架吵累了,WebQQ2.0 就明正严顺地转正了,接着就是现在的 WebQQ3.0。

基于 Web 的 WebOS,最多只能是拉拢合并者,比如说那些五花八门的应用(包括在 QQ2011 客户端上的应用盒子也是)大多是以合作的方式加入进来,但是要彻底摈弃竞争对手,只是基于 WebOS 是做不到的。我想腾讯的下一步,也许已经正在进行中的,就是推出腾讯牌的操作系统!

在技术上腾讯不是问题,山寨了这么多网站和平台,再山寨一个 Windows 操作系统又有何难?山寨不了 Windows,山寨一个 ylmf OS 总是可以的吧。对于腾讯山寨不了的,大不了砸钱买下就可以了,比如说那个啥康盛来着是吧。

以上只是个人遐想,谢绝腾讯跨省追捕~╮(╯3╰)╭

[…]

黑客的含义

首先,很高兴地宣布:我翻译的《黑客与画家:硅谷创业之父Paul Graham文集》,终于在本周上市了!

目前,各大网上书店(China-Pub,当当,卓越亚马逊,京东)都可以下单。

我还为这本书做了一个专题网页(http://www.ruanyifeng.com/docs/pg/),欢迎访问!在那里可以看到,我的网志上与Paul Graham有关的所有文章。

下面是我为该书写的《译者序》,这应该是目前对”Hacker”(黑客)这个词分析得最深入的中文文献。

遗憾的是,由于当时赶着交稿,这篇文章的很多地方写得比较粗糙,论述得不充分,衔接得不好。要是送印刷厂之前,我能想起再修改一遍就好了。

===============================================

黑客的含义 —-《黑客与画家》的译者序

作者:阮一峰

2010年12月25日 / 上海

一、

您现在拿在手里的,是一本非常重要、也非常独特的书籍。

它的作者是美国互联网界举足轻重、有”创业教父”之称的哈佛大学计算机博士Paul Graham。 本书是他的文集。

这本书的内容并不深奥,不仅仅是写给程序员和创业者的,更是写给普通读者的。Paul Graham最大的目的,就是通过这本书,让普通读者理解我们所处的这个计算机时代。

1968年–1972年期间,美国出版过一本叫做《地球商品目录》(Whole Earth Catalog)的杂志,内容从植物种子到电子仪器,无所不包,出版目的据说是要帮助读者”理解整个系统”(Understanding Whole Systems)。多年后,苹果公司的总裁乔布斯盛赞它”有点像印刷版的Google”。从某种意义上说,《黑客与画家》也是如此,这本书试图从许许多多不同的方面,解释这个时代的内在脉络,揭示它的发展轨迹,帮助你看清我们现在的位置和将来的方向。

二、

电子技术的发展,使得计算机日益成为人类社会必不可少的一部分。

每个人的日常生活,很大一部分都在与计算机打交道。家用电表是智能的,通信网络是程控的,信用卡是联网的,就连点菜都会用到电子菜单。越来越多的迹象表明,未来的人类生活不仅是人与人的互动,更多的将是人与计算机的互动。

想要把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。表面上,这是一个机器的时代。但是实际上,机器的设计者决定了我们的时代。程序员的审美,决定了你看到的软件界面;程序员的爱好,决定了你有什么样的软件可以使用。

我们的时代是程序员主导的时代,而伟大的程序员,就是黑客。

《黑客与画家》这本书,就是帮助你了解黑客、从而理解这个时代的一把钥匙。

三、

在媒体和普通人的眼里,”黑客”就是入侵计算机的人,就是”计算机犯罪”的同义词。但是,这并不是它的真正含义(至少不是原意),更不是本书所使用的含义。

要想读懂这本书,首先就必须正确理解什么是”黑客”。

为了把这个问题说清楚,有必要从源头上讲起。1946年,第一台电子计算机ENIAC在美国诞生,从此世界上一些最聪明、最有创造力的人,开始进入这个行业,在他们身上,逐渐地形成了一种独特的技术文化。在这种文化的发展过程中,涌现了很多”行话”(jargon)。60年代初,麻省理工学院有一个学生团体,叫做”铁路模型技术俱乐部”(Tech Model Railroad Club,简称TMRC),他们把难题的解决方法称为hack。

在这里,hack作为名词,有两个意思,既可以指很巧妙或很便捷的解决方法,也可以指比较笨拙、不那么优雅的解决方法。两者都能称为hack,不同的是,前者是漂亮的解决方法(cool hack或neat hack),后者是丑陋的解决方法(ugly hack或quick hack)。hack的字典解释是砍(木头),在这些学生看来,解决一个计算机难题,就好像在砍下一棵大树。那么相应地,完成这种hack的过程就被称为动词hacking,而从事hacking的人就是hacker,也就是黑客。

从这个意思出发,hack还有一个引申义,指对某个程序或设备进行修改,使其完成原来不可用的功能(或者禁止外部使用者接触到的功能)。在这种意义上,hacking可以与盗窃信息、信用卡欺诈或其他计算机犯罪联系一起,这也是后来”黑客”(hacker)被当计算机入侵者的称呼的原因。

但是,在六十年代这个词被发明的时候,”黑客”完全是正面意义上的称呼。TMRC使用这个词,带有敬意,因为在他们看来,如果要完成一个hack,就必然包含着高度的革新、独树一帜的风格、精湛的技艺。最能干的人会自豪地称自己为黑客。

这时,”黑客”这个词不仅是第一流能力的象征,还包含着追求解决问题过程中产生的精神愉悦或享受。也就是说,从一开始,黑客就是有精神追求的。自由软件基金会创始人Richard Stallman说:

“出于兴趣,解决某个难题,不管它有没有用,这就是黑客。” (Playfully doing something difficult, […]

再谈“我是怎么招聘程序员的”(上)

我以前写过一篇“我是怎么招聘程序员的”的文章(在CSDN那里有很多人进行了回复)。今天,我想再谈谈关于招聘和面试这方面的东西,主要是以下这些原因:

近半年来我在进行了大量的招聘工作,对面试有一些新的体会。 酷壳最近发布了几篇趣味面试题(面试题一,面试题二,面试题三),从回复中让我有一些思考。 我有一个同事最近面试了一家公司,他和我分享了一个博士专家对他的面试,也让我思考了一些。 在豆瓣上看到“知乎上某人写面试豆瓣产品经理的经历,很欢乐”(亮点是面试官现身知乎亲自作答)

所以,我很想把自己的这些新的想法再次写下来的。还是和以前一样,这篇文章同样是献给面试官的。我认为,面试的好坏完全在面试官而不是面试的人。下面是我对“我是怎么招聘程序员的”一文中的一些加强性的观点。(关于一些点评,请参看本文下篇)

为了让我的文章有连续性,请允许我重申一下前文的几个重要观点。

只有应聘者真实和自然的表现,才能了解到最真实的东西 重要的不是知识,重要的是其查找知识的能力 重要的不是那个解题的答案,而是解题的思路和方法 操作,知识,经验,能力

我们有很多的面试官似乎分不清,什么是操作能力,什么是知识,什么是经验,什么是能力,这导致了我们的面试官经常错误地对面试者下结论,我认为分不清这些事的人是没有资格做面试官的。所以,我有必要在这里把这个问题先讲清楚。

操作。我们的面试官分不清楚什么是操作技能,什么是知识,他们甚至认为操作技能就是知识甚至经验。比如他们会 问如下的问题,请问Java中的 final是什么意思?怎么查看进程的CPU利用率?怎么编写一个管道程序?怎么查看进程的程序路径?VI中的拷贝粘贴命令是什么?包括面向对象的XX模 式是什么。等等。我以为,这些能够通过查况相关操作手册或是能够google到的东西只能说明这个人的操作技术,并不能说明他有知识或有经验。 知识。知识是一个人认知和学习的体现,可能会是一些基础概念和知识。比如这些问题:TCP和UDP的优缺点比 较,链表和哈希表的优缺点的比较。什么是堆什么是栈?进程间是怎么通信的?进程和线程的优缺点?同步和异步的优缺点?面向对象的XX设计模式的主要原则是 什么,等等。我以为,“知其然”只是操作技术,“知其所以然”才是真正的知识。知识不够并不代表他不能工作,会操作技能就可以应付工作,但是知识的欠缺一定会限制你的经验和能力,同样会影响你的开发质量。 经验。经验通常跟一个人的经历有关系。一个人的知识范围,一个人经历过的事,通常会成为一个人经验的体现。面 试中,我们会问这些问题:你解决过最难的问题是什么?你是怎么设计这个系统的?你是怎么调试和测试你的程序的?你是怎么做性能调优的?什么样的代码是好的 代码?等等。对于工作年限不长的人来说,经历和做过的事的确会成为其经验的主要因素,尤其是业务上的有行业背景的东西。但是,我更以为,经验可能更多的是你对知识的运用和驾驭,是你对做过事情的反思和总结,是你对他人的学习,观察和交流。 能力。一个人的能力并不会因为知道东西少而不行,也不会因为没有经验而没有能力。一个人的能力是他做事情的一种态度,性格,想法,思路,行为,方法和风格。只要有热情,有想法,有好的行为方法,以及好的行事风格,那么知识和经验对他来说只是一个时间问题。 比如:学习能力,专研精神,分析能力,沟通能力,组织能力,问题调查能力,合作能力等等。所以,对于一个新手来说,也许他的知识和经验有限,但并不代表他 能力上有问题,但是对于一个老手来说,如果其存在知识和经验欠缺的问题,那么通常都是其能力的问题。你可能暂时怀才不遇,但我不相信你会长期怀才不遇。如 果是的话,那么你必然些问题其让你的能力发挥不出来。而此时,“没有经历过”只会是你“没有能力”的一个借口。

我不否认这四样东西对于一个优秀的程序员来说都很重要。但是,通过上述的分析,我们可以知道,能力和经验和知识需要分开对待。当然,这些东西是相辅相成的,你的能力可以让你获得知识,你的知识可以让你更有经验,你的经验又会改变你的想法和思路,从而改善你的能力。在面试中,我们需要清楚的认识到,应聘者的操作技能,知识和经验只是其能力的必要条件,并不是充要条件,而我们更应该关注于应聘者的能力。

如果面试只是考查这个人的操作技能的话,那么这个面试完全失败。这是一个没有资格的面试官。 如果面试只是在考查这个人的知识和经验的话,那么成功了一半。因为你了解了基础知和做过的事,但这并不代表你完全了解他的真正能力。 如果你能够在了解这个人的知识和经验的过程中重点关注其能力(态度、性格、想法,思路,行为,方法和风格),并能正确地评估这个人的能力,那么你的面试算是非常成功的。

也许用这四个词来描述定套东西并不太合适,但我相信你明白我想表达的。

不要肤浅地认识算法题和智力题

很多公司都会在面试的时候给一些算法题或是一些智力题或是一些设计题,我相信算法题或是智力题是程序员们在面试过程中最反感的事了。很多人都很BS面试官问的算法题,因为他们认为面试官问的这些算法题或智力题在实际工作当中用不到。但我想在这里说,问难的算法智力题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试中的难题的目的。他们认为,能做出算法题和智力题的人就是聪明的人就是有能力的人,这种想法实在是相当的肤浅。

其实,能解难题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就有实际工作能力。你可 以想一想你们班考试得高分的同学并不一定就是聪明的人,也不一定就是有能力的人,相反,这样的人往往者是在应试教育下培养出来的书呆子。

所以,我认为解难题的过程更重要,你要主要是通过解题查看这个应聘者的思路,方法,运用到的知识,有没有一些经验,和你一起交互时和沟通得是否顺畅,等等,这些才是你重点要去观察的。当然,最终是要找到答案的。

我想,让面试者解决一个难题的真正思路是:

看看他对知识的应用和理解。比如,他是否会用一些基础的数据结构和算法来解决算法题? 看看他的整个解题思路和想法。答案是次要的,他的想法和行为才是重要的。 看看他是如何和你讨论交流的。把面试者当成你未来的同事,当成你的工作伙伴,一起解题,一起讨论,这样可以看看大家是否可以在一起工作。

这些方面才是考查应聘者的能力(思路,方法、态度,性格等),并顺带着考查面试者的经验和知识。下面是一些面试的点:

应聘者在解算法题时会不会分解或简化这个难题。这是分析能力。 应聘者在解算法题 时会不会使用一些基础知识,如数据结构和基础算法。这是知识。 应聘者在解题 时和你讨论的过程中你有没有感到应聘者的专研精神和良好的沟通。 应聘者在对待这个算法题的心态和态度。如,面试面是否有畏难情绪。 应聘者在解题时的思路和方法是否得当,是否是比较科学的方法? 等等。

在解难题 的过程中考查应聘者的能力才是最终目的,而不是为难应聘者,不然,你只是一个傲慢而无知的面试官。

模拟实际中的挑战和能力

作为面试官的你,你应该多想想你的工作,以及你的成长经历。这会对你的面试很有帮助。你在工作中解决问题的实际情况是什么?你写代码的实际情况是什么?你的成长经历是什么?你是怎么获得知识和能力的?你喜欢和什么样的人工作?相信你不难会发现你工作中的实际情况和面试的情况完全是两码事,那么,你怎么可以用这种与实际情况差别那么大的面试来评估一个人的能力呢?

[…]

再谈“我是怎么招聘程序员的”(下)

<<<再谈“我是怎么招聘程序员的”(上)

在上篇中,我们说到了一些认识人的方法(操作,知识,经验,能力),还有一些面试的方法(算法题,实际生产活动中的挑战),下面我们来说说,面试的风格,还有一些点评。

把应聘者当成你的同事

有些公司的面试官,在面试过程中问你一个算法题,然后等着你解答了,如果你给出一个答案,然后就会问你有没有更好的答案,如果你给出了正确的答案,他们就会问你一个更难的问题,如此循环下去。他们基本上很少给你提示,甚至不停地质问你,挑战你,搞得应聘者很紧张。

另外,有很多问题是没有标准答案的,或者说是,同一个答案的描述方法有多种,很多面试官会觉得你没有回答到他想要的答案,因此表现得有对你不屑,并表现出你不行的样子,并觉得你的能力有问题。真是可笑了。比如我一个朋友在回答什么是异步的问题时,举例说明了异步调用就是不能处理完就返回,并且需要传递一个回调函数给调用方以便完成后回调通知结果。这样的回答并没有错,但是这并不符合面试官心里想要的答案,面试官对此并不满意,进而认为我这个朋友还需要去多读读书。

我相信大多数面试官都会这样干的。我想问问这样的面试官,你们有没有用面试的方式对过你的同事?在你的工作场景中,你会不会用面试的风格和你的同事进行交流和说话?不妨让我们来问我们自己下面几个问题:

你在工作当中遇到难题时你是怎么解决的?你会和人讨论吗?你只用15分钟就能得出最优解吗? 你在工作当中解决难题时是否会有一个人在旁边质问你并给你压力吗? 你在工作当中会为难你的同事吗?会让你的同事紧张吗?你觉得在紧张的状态下能做好工作吗? 你在工作中觉得同事的回答并不是你想要的答案,不是符合你的答案,你会认为你的同事不行吗? 你的成长过程是什么样的?在是压力和天天被人质问的情况下成长的吗? 大家都知道学校里应试教育的弊端,你觉得你的面试是不是一种应试呢? (看看这么多的应聘者们都在做各种各样的算法题,这不就是一种应试吗?)

想一想你的日常工作,问自己一下上面这些问题,想一想你自己的成长过程,想一想你和你的同事是怎么相处的,想一想你的日常工作中是什么样的,相信你自己也能得出结论的。

如果你把应聘者当成自己未来的同事,那么你的面试会有下面的收获:

面试的气氛会很不错,应聘者会放松,表现自然,更接受于真实的状态。 面试中的交流和互动(而不是一问一答)会让你更全面的考查和了解一个人。 非应试的面试,会让你了解得更多。 真实的了解一个人,你才能做出真正正确的结论。 向应聘者学习

下面有几个观点

面试的过程是一个相互学习的过程,并不是你为难面试者的过程。 一问一答是很一种呆板死板的过程,相互讨论相互学习,有良好的互动才是好的面试过程。 面试官要证明的不是你有多强有多聪明,而是要挖掘应聘者的优势和能力。 面试官用为自己的问题预设好一个标准答案,看看应聘者能为你带来什么。 向来应聘的人学习,而不是刁难。

无论你多牛,要难倒你实在是太容易了。出难题不是目的,难倒人也很容易,出难题只不过是用来了解应聘者能力的一个手段,而不是面试的全部。

我不知道你喜欢不喜欢一些竞技类的运动?比如踢球,打篮球,羽毛球,下象棋等,你一般想和什么样的人玩?是差的,还是强的?所以,能够从面试者那里学到东西,喜欢和面试者一起工作,这才是面试真正的目的。

对于一个团队来说,如果大家都是一样的想法,一样的主张,一样的倾向,那么这个团队最终会是一个闭塞的团队,你如果不能真正接纳不同想法的人,不同主张的人,那么你也将失去进步的机会。如果你的团队总是在招入和你一样的人,那么你的团队怎么可能会有out-of-box的想法呢?世界因为不同而美好。

另外,对于公司来说,如果你招进来的人还不如已经有的人,作为一个公司,你又怎么能有更好的人让你的公司进步呢?

所以,面试应该是向面试者学习的一个过程。当然,如果你从他身上学不到什么,那么你就教他一些吧。这样,就算是面试不通过,面试者也会欣然接受的。不然,让面试者产生一些负面情绪,出去说一些不好的话,也有损你和公司的形象。

一些相关的点评

下面是我根据酷壳的一些面试题的文章后的回复、还有我朋友的经历,还有这篇有关豆瓣的产品经理的这篇文章的一些点评。大家可以看看我从这些地方看到东西靠不靠谱。

酷壳的面试题中的答复

先说酷壳的那篇“火柴棍式的面试题”,这个面试题其实很没什么意思。主要考查你对代码逻辑的了解程度。因为设置了回复可见答案,所以这篇文章的回复量达千把条。从回复中,我看到:

一些朋友想不出来就直接看答案了。我可以看出,有一些朋友习惯获得知识,而不习惯独立思考。甚至有畏难情绪,从另一方面来说,可以看出我国的教育还真不是一般的差。 一些朋友想不全。从这点来看,我觉得很正常,尤其是想出两种来的,我可以感觉到他们的努力思考了,可能还做了一些尝试。挺不错的。可惜我看不到你思考的方式,是在纸上画了画,还是编译了个程序跑了跑,还是别的什么。这样我会了解你更多。 一些朋友给出的答案中有错的。这说明了这类朋友可能不喜欢做测试,时常想当然,或是做事比较冲动,并不足够严谨。这么简单的程序,验证能花多少精力呢? 还有少数的朋友没有看明白题目要求。这说明了这类朋友太粗心了,在工作当中可能会表现为误解需求和别人的话。沟通有问题。

再说说那篇“火车运煤”的问题,这个面试题我觉得主要是看看大家的解题思路,表达能力。

首先,我很惊喜有人很快就用数学做了解答,很不错,这个人的数学功底很不错。能用数学解题的人一般来说都是算法比较强的人。 有人说抱怨我没有说火车可以调头回去,所以没有想到这样的方法。如果是在面试中我会做提示的。我不会因为你不知道调头这个潜规则而否定你的。当然,如果你能想到的话说明你的脑袋还是比较灵的。 还有很多人说他的方法比较土,只运了400吨煤,416吨的或333吨,一看就是没有看提示的,我觉得这些人能够通过独立思考找到方法,这类的人其实已经不错了。顺着这个思路优化也只是时间的问题了。 更可喜的是,我看到了有一些朋友在看到别人的更好的方法后和自己的方法进行了比较,并找到了为什么自己的方法不如他的原因。这样的人我认为是懂得“总结”和“比较”的,这样的人总是在不断地学习和改善自己的。 还有人说到了动态规划,如果是在面试的时候,我很想向这位朋友学习一下用动态规划来解这题。 还有朋友说到了火车调头只能在有站的地方。这个朋友一看要么就是搞需求分析的人,要么就是较真的人。需要进一步了解。但不管怎么样,这样的朋友的观察能力是很不错的。 还有一些朋友给出的答案是正确的。但是表达方面比较复杂,有些没有看懂。可见,解题 的能力是有的,只是表达能力还有待提高。

豆瓣产品经理的面试

再说说豆瓣上的这篇文章,那篇文章里,面试官问了一个比较大的问题,那是仁者见仁,智者见智的问题,并且面试官并不满意应聘者给出的答案,并在用其主观意识强加一些东西给应聘者,并不断地和应聘者纠缠。后来,面试官回复到“重点测了两个问题:一是判别事情的标准和方法;二是在多种PK下产品经理的压力反应”。

下面是我观察到的:

其一、这种似事而非的仁者见仁,智者见仁,一万人有一万个答案。所以,这种怎么答都可以的问题是很难有标准的,我认为豆瓣的面试官以这种问题来考查面试者的标准太有问题了。更好的问题是:比较一下新浪和twitter这两个产品。 其二、多种想法PK的压力反应。这点没有问题,如果有机会我想问问这位面试官,豆瓣产品经理们的PK各自的想法时是以这种纠缠的方式吗?如果是这样的话,那我很为你们担忧啊。 […]

每一位想有所成就的程序员都必须知道的15件事

原文地址:How to advance your career? Read the Passionate Programmer!

我刚看完Chad Fowler的Passionate Programmer(中文版《我编程,我快乐:程序员职业规划之道》),这本书讲的是如何在软件开发行业中取得非凡的成就。

以下是根据这本书总结的,作为程序员,要取得非凡成就需要记住的15件事。

1、走一条不一样的路 在有利于自己的市场中竞争,如果你满足于“泯然众人矣”,那恐怕就得跟那些低工资国家的程序员们同场竞技了。

2、了解自己的公司 以我在医院、咨询公司、物流企业以及大技术公司工作的经验来看,这一点所言不虚。

不同公司的运营模式差异极大。如果你理解企业的运营模式,那你就不一样了!在这家公司中(或者对客户而言),你是参与业务运营的资产,你的工作能直接产生效益!

3、与最优秀的人为伍 很早以前,我喜欢打篮球,被分配到一个水平比较高的队里。一开始适应的确很困难,但环境的压力越大(重大比赛),我的长进也就越明显。

每个领域其实都一样:你周围人的水平(以及对你的期望)越高,你就会变得越优秀。

4、制造差异 每年学习一门新编程语言。为什么不呢?不断尝试新事物,你关注的技术种类越多,脚下的路就越宽广,你的职业生涯就会日新月异。不知道几年后Java的趋势如何?那就学习Clojure。学Ruby还是Python?这两种语言都可以试试啊。然后你才能知道哪种语言更适合某个特定的项目。看,掌握的语言多了,才能在需要的时候信手拈来吧。

5、畏惧,是最大的敌人 还是直接从书中摘一句吧:“在畏惧中做出的职业规划,很可能会让自己后半辈子就一直被‘圈禁’在小隔断里,永远不会有创造明天辉煌的时刻。没错,那样是安全,但有意思吗?”

6、要成为多面手 如果你掌握了所在领域的知识,那你只能是一名专业人士。用PHP编程?花点时间设置一台Apache服务器,让PHP和MySQL都跑起来。一直在用jQuery?试试Prototype。你懂了吧。

7、一个字:做 别指望别人过来教你该怎么做,出去,自己学着去做! 8、找一位好老师 找一位好老师可以让你在学习技术的时候有的放矢。作者给我们讲述了别人是怎么指导他学习的(顺便说一句,作者在这本书里讲了很多个人经历的小故事,他居然从一位演奏家转行来做软件开发!):“好好研究一下目录服务,熟悉一种UNIX变体,然后再掌握一门脚本语言。”

请记住这句禅宗谚语:“循路觅宗师,形影不相离,师知吾亦知,吾乃成宗师。”

9、主动教会别人 教会别人是一种最好的学习方式。写一篇博客能帮你搞清楚一个问题。为此,你必须先掌握很多材料,同时还要有条有理地讲给别人听(写作技能)。如书中所言:“要想知道自己是不是真的明白,你就讲给别人听听。”

10、实践,实践,再实践(训练) 只有进行大量实践(花大量的时间)才能掌握某种技术。看的很多,写的很少,遇到问题,改一改,又去读代码,……(这样下去是不行的)。

要特别警惕拖延症。其实,往往只要有了开头就好办了。

自我加压,效果会更好。我曾在一篇博客中提到帕金森定律:紧张的时限可以让你提高工作效率。为什么不把这个定律用到学习上呢,比如说在y时间内学会x?

11、从小处入手 每天都取得一项小成果,每天都要坚持做(写在博客上?)。这样一来,你只能让自己比昨天更进步,而不能说自己比上星期进步了一点。

12、享受过程 关注当下,而不是目标,享受那些在追逐未来目标的途中可能无暇顾及的小胜利。人总要生活在当下。我享受编程的过程,就像享受编程的结果一样。

13、不要丧失危机感 越是成功,就越容易犯重大错误。永远不要忘了危机感,特别是要认识到你今天所知道的,到了明天可能就会一文不值。过去的荣耀不能保你永远无虞。

据书中所说,你最好是要让自己能够“通用”,而不要对哪种技术或哪个公司产生依赖。你所掌握的某些技能,甚至你的工作,到了明天都可能会变得毫无价值。因此要不断提高/丰富/扩展自己的技能。

14、推销自己 为某个项目贡献自己的一份力量,写一篇博客,共享自己的源代码,成为对某个社区有用的人。

当然,做这些事可能需要激情,要看你的爱好,但这些事也会间接地推广你的工作成果,证明你的实力,提高你的知名度。

15、关注市场 书中还提到了“预警极客”,也就是那些始终引领技术发展的人。这些人说过的话往往带有预见性,他们提到事物也许过几天就会成为头条新闻。关注这些人,常看他们的Twitter和博客。

[…]

谷歌用户体验设计准则

 谷歌的愿景

  Googl用户体验团队致力于创建有用的(useful)、快速的(fast)、简单的(simple)、有吸引力的(engaging)、创新的( innovative)、适合大众的(universal)、有用的(profitable)、漂亮的(beautiful)、值得信赖的(trustworthy)、个性化的(personable)的应用。

Google用户体验的十大准则

1.将焦点集中在用户的生活,工作,和他们的梦想上。

Google 用户体验小组努力发现用户的真正需求,包括那些他们自己都无法阐明的需求。有了这些信息,Google 就可以创建解决现实问题的产品并激发所有人的创造力。Google的目标不仅仅是按部就班的工作,而是改善人们的生活。总之,一个精心设计的 Google 产品在日常生活中是非常有用的。他并不是靠花哨的视觉效果和技术打动用户的,虽然也有具备这些特性。他不会强迫用户去使用他们不想要的特性,但是他会引导有兴趣的用户自发的去使用他们。他不会入侵别人的生活,但是回想那些想要探索世界信息、工作的更加快速和便捷、分享想法的用户敞开大门。

2.每一毫秒的价值

没有什么比用户的时间更加宝贵。Google页面的快速加载得力于精简的代码和精心挑选的图片。为了让用户更加容易的找到想要的内容,Google将最重要的功能和文本放在最显眼的位置。一些不必要的点击、输入、步骤和其他操作都被Google去除了。Google 的产品只会请求一次信息并且包含了智能的默认选项。所有任务都是高效的。速度为用户带来便利。如果没有充足的理由,Google 绝对不会牺牲速度。

3.简单就是力量

简单造就了良好设计中的许多元素,包括易用性、速度、视觉效果和可访问性。一个产品从设计之初就应该保持简单。Google 不打算创建功能繁复的产品,我们最好的设计只包含那些用户完成目标过程中所必需的功能。即使产品需要大量的特性和复杂的视觉设计,也要看起来简单而强大。在以牺牲简单为代价去追求一个不太重要的功能之前,Google 会三思而后行。Google希望将产品推向新的发展方向,而不仅仅是增加更多功能。

4.引导新手和吸引专家

为多数人设计并不意味着为降低标准设计。最好的 Google 设计表面上看起来很简单,但是却包含了强大的功能,可以让需要的用户很容易地访问到。Google的目标是为新用户提供美妙的初始体验,同时也吸引那些经验丰富的用户,他们会让其他人也来使用这个产品。一个精心设计的 Google 产品会让新用户很快熟悉,在必要的时候提供帮助,并且保证用户可以通过简单符合直觉的操作使用产品的大多数有价值的功能。逐步披露高级功能会鼓励用户去扩展他们对产品的使用。在适当情况下,Google 会适时地提供一些智能功能来吸引那些资深网络用户——那些在多个设备和电脑之间共享数据的人、在线上和线下工作的人、以及需要存储空间的人。

5.敢于创新

设计上的一致性是 Google 产品获得信任的基石,它令用户舒适并提高他们的工作效率。但是要想把设计从沉闷乏味变得令人愉快就要依靠想象力。Google 鼓励那些创新、冒险的设计,只要它们符合用户需求。团队鼓励新的想法并发展它们。不是为了去适应现有的产品功能,Google 更着眼于改变整个游戏规则。

6.为全世界设计

万维网已经向世界各地的人们开放了互联网上的所有资源。例如,很多用户通过移动设备来使用 Google 的产品,而不是坐在桌子前面通过电脑。我们设计出的产品应该在用户随意选择的任何一种媒介上都可以适时调整和使用。在可能的情况下,Google 会适时地支持较慢的连接速度和旧版的浏览器,而且 Google 会允许用户选择如何浏览信息(屏幕大小,字体大小)和如何输入信息(智能查询分析)。用户体验团队会研究世界上用户体验的根本差异,为每一个用户、每一个设备和每一种文化设计出合适的产品。简单的翻译,或者功能上的“优雅降级”,都不足以满足人们的需要。Google 还致力于改善产品的可访问性。Google对简单和具有包容性产品的渴望,以及Google 让全世界的信息普遍可访问的使命,都要求产品支持辅助技术,向包括有身体和认知缺陷在内的所有用户提供愉悦的体验。

7.安排今天和明天的业务

那些盈利的 Google 产品竭力做到以有助于用户的方式赚钱。为了实现这一崇高目标,设计师将和产品团队一起确保商业计划能够和用户的目标无缝集成。他们会确保广告具有相关性、有用并可以明确地识别出是广告。 Google 也会注意保护那些广告客户和其它靠 Google 谋生的人的利益。如果靠某个产品增加收入会减少 Google 未来的用户数量,那么 Google 绝对不会做这种尝试。如果一个有利可图的设计没有让用户满意,它就会被打回重做。不是每个产品都需要盈利,但是不能有产品对业务不利。

8. 愉悦用户的眼睛,但不分散注意力。

如果人们看到一个 […]

Category

Archives