关于界面的价值观与方法论
6789101112131415

诚聘有设计感的美工

28February2009

上次有讲过招前端的段子。这次再说说招设计师吧。

坦率的说,对设计师的要求更难用文字描述。所以也不能太苛责,不然你自己试试看,很不好写的呢~不过,下面这些就不是技术性问题了:

熟练使用PS、AI、CD、FW、FLASH… 等图形设计工具
要求会的软件还挺多。我觉得CD就算了吧,很少听说网页设计用这个的。而且,Flash不算是“图形设计工具”吧?

有较强的色彩感和创造力,有良好的视觉设计感觉,丰富的创意头脑,对图片渲染和视觉效果有深厚认识
我有经历过面试的时候,面试官讲的话比自己多一倍。我能想象如果去参加他们的面试,也会如此。翻来覆去的讲四遍,不就是要求“优秀的设计能力”嘛?
呃,另外,谁对“图片渲染”有深厚认识的,请举手~我有个同学在美国读博学图像处理专业,准备去Adobe,他大概对此有深厚认识吧~

作品新颖、有创意、很好的色彩感、时尚感、布局观
前面都好说。只是,什么叫“布局观”?这个词挺滑稽的,呵呵。

熟练操作网页三剑客
没记错的话,三剑客是指“Dreamweaver 4”“Firework 4”和“Flash 5”?那得再给配一台Windows 98的电脑哦。

北京水立方附近高薪招聘网站美工!
这只是个标题,我没点进去细看……

精通Adobe各类设计软件
是在代招Adobe用户体验测试志愿者?

能够使用Photoshop之类的软件,创建页面中使用的常见背景,如圆角边框,LOGO。
是因为上一个被贵公司开掉的人不会做圆角边框吗?
不过,有个细节值得注意哦。这段话里讲说,圆角边框和LOGO都是“常见背景”,可见对CSS sprite精神有深刻理解。

设计师(要求用AI,男生优先)
这个…一定非得用AI么?
而且,单凭“男生优先”这句话我就想告他们。

当然,我们公司多是电脑肓,有个什么硬件软件问题的,也需要这位同仁出手帮助一下。
据我所知,大多数的设计师对电脑软硬件都一窍不通。这就是为什么他们都喜欢用不大会出问题的Mac。

诚聘“DIV+CSS”制作人员

21February2009

忽略掉这个题目吧,我是标题党。

我最近不停的被猎头骚扰,不明白为啥我这么低调的一个人也能被猎到。猎头MM们一开口就问招前端开发,去不去啊~我就只能礼貌的找个借口,比如“杭州太远啦”之类的(偷笑~~好啦,我真的没有不尊重谁的意思,确实目前不想挪窝啦)。

最近这段时间,貌似前端开发很很吃香,到处都见在狂招。这两天发烧在家躺着,无聊就逛了下经典的招聘版。忽然突发奇想把我觉得好玩的招聘语句搜罗了一下。

先说哦,我就事说事,我也不记得这些词句是从哪一则消息上找来的。而且只是技术上来考量,至于有些1500块就想招个人我就不去评论了,日子各有各的过法嘛~

精通DIV、CSS, 熟悉W3C标准,需要兼容PC:IE6.0、IE7.0、Firefox2.0、Firefox3.0、Safari。 MAC:Firefox2.0、Firefox3.0、Safari
光精通“DIV、CSS”就能兼容这么多浏览器,也够难为人家了。说起来,“精通DIV、CSS”也算是当下前端招聘最标准的措辞了。所以我决定,土豆网的前端招聘也要用这一说法:

下面是“精通DIV、CSS”的面试题:
1. 哪些标签里是禁止放DIV的?如果放了会有什么后果?
2. 哪些CSS属性对DIV标签是无效的?

这才叫做“精通DIV+CSS”嘛~~哇哈哈

熟悉AJAX,能够熟练使用一种AJAX框架,如YUI/jQuery等
它们是“AJAX框架”?

DOM应用熟练,对页面重点元素有一定理解,如select等
其实这个我还真没明白。为什么select是“页面重点元素”?难道,不是“DIV”么?(哈)
另外“DOM应用熟练”也不是太懂。

熟悉Web 2.0标准
啥都不说,这个就直接拜吧~~

精通Ajax、JavaScript、Xml、DOM等前端技术,掌握面向对象编程思想
这个排比句很有趣。而且,为啥要求“Xml”?连“DIV”都不要求吗?
另外,要求精通带有面向对象思想的JS,这倒让我相信他们确实在寻找世界一流的前端。

了解程序编码对html代码规范的要求
其实,我也不知道程序编码对HTML代码规范有什么要求…望指点。

1. 两年以上UI设计从业经验,具有商业软件产品UI设计经验,能独立完成软件界面的设计;
2. 精通HTML,XML,CSS,Javascript, 熟悉JSP,AJAX等;

这是同一则招聘信息里的。它好像招的是软件UI设计师。姑且不说软件UI设计师为啥需要会HTML和CSS(或许是Web应用吧),还要人家熟悉JSP,就太为难了。

不过呢,这让我想起我刚毕业的时候写的简历。啥经验都没有,只能把自己所有的鸡毛蒜皮都写上,其实绝大多数都跟应聘职位完全无关的。所以比较能理解那些要求人家什么都会的招聘信息。

如果一个像素的误差会让你寝食难安,所有职位要求都可以降低一档
我是明白他看重对细节认真的态度。但是后面半句实在让人费解。其他的职位要求就这么不堪一击么?再说了,“精通DIV+CSS”再往下降一档是什么?熟悉?

另外还有两个比较知名的公司,招聘信息本身还OK,只是职位名称有点好玩:一个叫“网页重构工程师”,这大概是拜那本Web标准开山之作所赐吧,不过人家是叫“网站重构”啊~~

还有一个叫“UI/UE开发工程师”。UI开发,我能理解。但是UE开发就实在觉得太八竿子了。让开发人员来做UE,想把Alan Cooper气死么?

好啦,只是娱乐一下。但如果要说我在看低谁,其实没有。我觉得每个公司情况不同,所需的人才也不尽一致。只是不要像我刚毕业写简历那样把什么有得没的都堆上去。像下面这一则我就挺喜欢:

熟悉通用设计软件并掌握其中的一种或几种,并能够完成处理PSD2html
什么叫PSD2HTML?翻译成中文就是“切页面”。这条信息我就很欣赏,因为它很实在,没有堆砌那些自己都一知半解的技能要求。其实,你还别看不起“切页面”这个工作,并不是所有的PSD都能很容易的2HTML的哦~
而且还有专门以这个为专职的网站呢,看:www.psd2html.com收费还不便宜~

作用域链 词法作用域 与闭包(三)

15February2009

在经历了漫长的作用域链、调用对象和词法作用域之后,终于可以讨论闭包了。

对于闭包这个概念,有各种各样的解释。我比较喜欢的是闭包是《Java 理论与实践: 闭包之争》中的定义:可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。

听起来很抽象,但它指出了闭包定义的两个要素:允许自由变量,由定义环境而不是执行环境决定。

先说说自由变量。凡是不是在该代码块中定义的变量就叫做自由变量。如

function g() {return x;}

其中的x并不是在这个函数中定义的,它的值是存储在函数外部的。所以它就是一个自由变量。

那么一个代码块中的自由变量该到哪里去取呢?这个问题即是决定了这个代码块是否属于闭包。闭包定义要求,这个代码块中的自由变量,应该到定义它的环境中取。这也就是说,这个代码块的作用域应该是词法(静态)作用域。

由于同一个代码块,无论被调用多少次,或是在何处调用,它的定义只会在同一个环境中(否则就不能被认为是“同一个代码块”,因为定义环境不同)。闭包要求其自由变量的读取是在定义环境中决定,也就得到它的一个特性:闭包的自由变量永远指向同一处,无论它在何处被调用。

或许这样说,还是有点抽象。我做一个现实中的比喻。我之前为这个blog做模板的时候,需要在本机中装一个PHP+MySQL的环境。这就遇到一个问题:我白天在公司,晚上在家。如果白天做的时候对服务器配置做了一些调整,那么即使把所有的wordpress程序都copy回家,也无法在家接着做。如果把Wordpress程序文件看作是一个函数,它明显是受它的执行环境所影响的。换句话说,Wordpress有一部分“变量”,不是它自身定义的,而是从外部(PHP服务器或MySQL数据库)中得到的。

后来就找到一个很不错的软件,叫Uniform Server。它是一个文件包,里面包含了Apache和MySQL的环境。把它Copy到U盘上之后,点击Start.bat,就会自动在机器上建立一个服务器环境。更关键的是,下班回家时,关掉电脑,拔出移动硬盘带回家,在家里的电脑重新启动它,它就又可以在家里的电脑上重新建立一个服务器环境,而这个环境跟办公室电脑里一模一样,之前在公司作的改动,回到家里后还存在。

所以呢,可以认为这个Uniform Server就是一个闭包。它的变量(服务器配置)是在它被定义(也就是当我解压到U盘上)的时候就确定了的,而跟它在什么地方被调用执行(开启这个软件)无关。

其实从这个比喻中也可以看出,闭包的好处:作用域始终保持一样,不用担心执行环境不同导致的作用域不同。

最后举一个很简单的例子,来帮助理解闭包(我这里用jquery的写法,以简化代码):

var t = $('input#text').val()     //取得文本框的值t
$('input#btn').click(function() {
     doSth(t);                 //把t传给某个函数
   //... 其他操作
});

这个例子稍微有点怪怪的,因为它的文本框的值是在绑定点击事件之前去取,而不是在点击的时候。我们姑且就把它当作是因为某些特殊的要求不得不这样做吧。所以呢,绑定到点击事件上的那个匿名函数中,t其实使用的是它上一层作用域里的变量t。

这个时候呢,需求有点改变:要求在点击按钮之后,先弹出来一个对话框,和用户进行某些交互(比如要求登录),之后再按原来的步骤继续。为了通用性,我们需要建一个函数:

function openDialog(f) {
     // ... 对话框要作的一些操作
   f()                 //再执行后续的操作
}

这里的openDialog函数是打开一个通用的对话框,完成对话框的操作之后呢,再执行后续操作。这里的后续操作可以是一个函数,通过f变量传进openDialog里,让它来决定什么时候调用。

而之前的第一段代码就可以改为:

var t = $('input#text').val()     //取得文本框的值t
$('input#btn').click(function() {
     function f() {
         doSth(t);
       //... 其他操作
   }
    openDialog(f);
});

和第一段代码比较一下,我们只是简单的把原先的代码用一个函数装起来,然后传给openDialog,就搞定啦。

可能有人会觉得,这个本来就是自然而然的事情啊。其实这里面的关键在于,doSth(t);以及其他语句的执行,已经由原来的点击事件的地方,换到openDialog函数里去了,而后者的代码却是写在不知道什么地方的。之所以可以“自然而然”的随便把代码到处“扔”,就是因为闭包的特性(再想想我那个U盘)。

事实上,如果有兴趣,再仔细琢磨一下jquery的那个click函数,会发现,其实它也是因为有闭包,所以才可以把那个匿名函数扔进去(click函数本身的定义和执行,也是在遥远的未知的地方),从而实现绑定点击事件。