面试,为什么总问些没用的,及emacs支持正则表达式替换* 题外话李记者辞职了,纪念一下。李记者不是记者,这是他的绰号。李记者辞职前是某二三线城市IT公司的技术负
责人。李记者和我相识,是一起参加一个吃不好睡不好啥也不好的比赛,我们都
获了吉林省的奖,所以,都是取得了高级技工资格。想李记者也面试人无数,肯定背地里被人骂过"面试,为什么总问些没用的"。今
天我试着解答一下。对了,李记者,高级技工证,我有两个。你有两个么?* 先说一个例子,emacs支持正则表达式替换Emacs,如同李记者这个名字,众所周知,是伪装成编辑器的操作系统,能完成
基本的编辑器功能,比如文本替换。替换这个功能没啥稀奇的,连WORD都有。如果你确信匹配条件是对的,那么尽可
能大胆地不搜索不一个个确认,直接替换全部。但有时候,世界不那么美妙简单,或者简单的事情都被别人做完了。比如,你想
进行下面这样的替换。有一段文字,其中的一段如下:
----引文开始----
14. 'This is a private conversation!'课文2 早餐还是午餐?
15. It was Sunday.
----引文结束----明眼人一看便知,这是我们背诵了无数遍,如此熟悉的《新概念2》的...第一课
结尾和第二课的开头。也许整本书,你就只熟悉这两课,不过并不影响我们的讨
论。现在的要求是,把整个文件中的每一课的标题,如"课文2 早餐还是午餐?"这样
的文字,后面都加个回车。面试提出这样的问题,有的同学可能会说:哈,不过就是90几课么,我一个个回
车下去。面试官就会问:如果文件非常非常长呢?当然,找很多人,把文件切割了,每人分一小块,处理完再合并,也算是个办法。
不过,也许你去应聘管理岗位的时候这么答效果更好。我们技术人员是这样解决的:找到那一行的特征,然后替换那一行,替换的方法
是原来的内容不变,在最后加个回车。1. 特征凡东西,你不先指出特征,就找不到它。马丁叔叔说:"如何藏起一棵树呢?把它
放在森林里。"这就是用大量的共性掩盖特性。这一行的特征是,开头有"课文"二字。还有别的特征,但是这个特征足够我们完
成任务了。齐同学请注意。为什么考试的时候要考概念,因为按我上面的这种描述特征的方
法,是不专业的,不方便技术人员之间沟通,也不方便与机器沟通。我们这样描述:课文.*这就是大名鼎鼎的正则表达式。学过编译原理的同学都如遇故人,因为这是我们
熟悉的领域,终于又回到我们的知识结构之中。数学家的方法是值得赞扬的,他们把未解决的问题转化为已解决的问题。典型的
例子是消防员的那个故事。队长问:如果你看到胡同口着火了怎么办?答:用灭
火器。再问:如果你看到胡同口没着火怎么办。答:点着它,接下来就是我们熟
悉的问题了。正则表达式 课文.* 的意思是,前面是"课文"二字,然后是任意个 (*的含义)任
意字符 (.的含义)。凡符合这样的特征的行,都会被搜索出来,准备被替换。2. 替换替换成什么呢?替换成 (1) 还是这样一行, (2)后面接一个回车。写作:&^J其中,"&"的意思是,匹配的文本的全部,上例中,即"课文2 早餐还是午餐?"
这一行;"^J"是这么键入的"C-q C-j",其中C-q相当于转义,C-j就是回车。你
可以试一下,在windows下,C-j就是ctrl-j也是回车。3. 命令在emacs下,M-x执行下面的命令:replace-regex RET 课文.* RET &^J然后,任务完成了。凡是符合特征"开头是课文二字的行",找到它们,在每一行
后面加个回车。4. 补充[http://www.emacswiki.org/emacs/ReplaceRegexp]提到
M-x replace-regexp
Replace regexp: (w+)
Replace regexp with: ,(capitalize 1)这里, 1 代表的是第一个括号分组里的部分,, 代表后面跟的不是要用来替
换的东西,而是一段lisp程序。上例执行的结果,会把一个或多个单词,替换为
把 它们中的第1部分 (刚好就是全部) 大写开头字母的结果。这个故事告诉我们,emacs很强大。马利同学,及其他尊敬的vim使用者们,我猜
vim一定也有这样的功能 :)这个故事还告诉我们,无论emacs还是vim,还是类似强大的编辑器,必然会以某
种方式支持 正则表达式 这种强大工具。(1) 因为正则表达式是计算机学科的基本概念,所以,很多方法 (包括gaga新的
.net)都建立在它的基础之上。它已经诞生很久了,我刚刚查了下,1950年代,相
信咱们没几个人比它的年龄还大的。许多人抱怨计算机学科学习的东西太古老,
答案在于,这些东西从来都没有过时,而且所有的新东西,都建立在它们的基础
之上。《故事 : 材质、结构、风格和银幕剧作的原理》告诉我们,叛逆是可以的,前
提是你已经充分了解和纯熟运用你准备叛逆的东西。(2) 对正则表达式支持得好的,必然会提供某种方式,允许你深入到其中,操控
所有的一切,只要你愿意。对.net的诟病之一,正是因为它走向了这一原则的反面。有位老外牛人,一时忘
了是谁,他说:如果.net是一个烤炉的话,它是这样的,特别容易就能做出比如
6.5英寸的汉堡,按标着6.5的那个钮就行 (请准备面试的同学考虑,公司为啥要
为一个只能按某个钮的员工付很多钱呢) 。但是,如果你想做,比如7.4英寸的汉
堡,对不起,不行。原因非常简单,没有那个按钮。它引导你规范你,按它的要求去操作,去完成它特别擅长完成的工作。这一部分
非常友好。但是,如果你打算做点特别的格路的,对不起,壳子拆不开,汉堡供
料仓与烘焙的部分是焊死的,汉堡来的时候是一箱一箱的,把箱子放在供料仓里
就行,不过你想放点别的,不行。用崭新的包装把一切遮盖起来,仿佛一切就真的简单的。如果理论上没有突破,
仅靠小技巧,这只是梦想。有的同学可能会说,.net具有重要的意义,它降低了编程的门槛。当然,是的,
完全正确。那么,我们是否能够重新思考一下这一段话呢?它降低了编程的门
槛, (1) 它会让一些某些工作变得简单--因此更不值钱, (2)那些不容易解决
的工作,仍然不容易解决,因此仍然值钱。这就是面试的时候,很多打算长久使用你的公司并不太关心你对新技术了解程度
的原因。因为,那一点也不重要。* 面试1前几天看到有同学问,为什么面试的时候,我明明应聘前端,却要问我些乱七八
糟的东西,而jquery啊html5啊,这些新的非常有前途的技术,这些我非常熟悉
和感兴趣的技术,他们完全不问。因为,那些东西对于理论基础正常的同学,学起来非常之快,可能两周之后就开
始使用,虽然深入某种技术,往往需要N年的时间,而如此精确有时并无必要。他
们学起来如此迅速的原因非常简单,因为手册、书籍 (我 没有、没有、没有 提
到网上短文中的示例)都使用了相同的术语和基本技术,这些术语和基本技术正是
计算机专业学习的内容。是的,计算机专业学习的内容是术语和基本技术,而不是什么新鲜的热气腾腾的
东西。关于计算机专业课程设置,很多年前偶像曾经开过一个玩笑,他说:现在oracle
dba这么值钱 (当时是4万?2万?) ,咱们还教什么专业课,专门培养他们得了。我说:那四年以后,oracle黄了怎么办?oracle没有黄,似乎日益飞黄腾达了。不过,谁知道呢。我们希望培养的是这样
的同学,他们在毕业以后可以在短时间内学会任何一种新的技术,而所有的新技
术对他来说,区别都不大。另一个关于计算机专业课程设置的讨论。姜同学是北京某大公司的头头,手下二
三百人。他希望高校毕业的学生能够熟练,j2ee hibernate struts spring,当
年的对话,大致相当于现在的这些技术吧。一个优秀的毕业生,当在一个月内了解所有这些的使用。当然,我们的培养很多
都失败了,那是另一回事,且不能作为把高校改为技工学校的理由。为什么面试的时候问你那些特别基础的问题,而不涉及新技术?因为新技术会过
时,而拥有基础的同学,能够学习所有的新技术。新技术,不是建立在旧一点的新技术基础之上,而是建立在理论和非常旧的技术
基础之上。* 面试2可能有同学还会质疑,只问理论,会不会让那些实践强的同学失去机会呢?以前CCNA考试流行的时候,对通过考试的同学有个分类方法。一种叫paper过去
的,他们只读了书,没有做过实验;一种叫bible过去的,他们背了题,甚至书也
没看懂;还有一种,真正有实践的--不过,你相信一个有实践经验的同学,他从
来没看过书么?微软和思科,和所有网络考试中最基础的部分,关于osi七层模型,关于tcp/ip
协议,都是完全相同的。这就是基础。对于了解基础理论的同学,如果,如果他拥有实践的精神,那么,一旦他解决过
一次这样的问题,相同原因的问题,无论故障现象看起来多么不一样,他都可能
解决。而对于只有实践,见过这个故障,见过如何解决的同学,再次见到另一个
故障,他一定无法解决,因为即使原理相同,那也是一个完全不同的故障。我们所要注视的,根本不是故障现象本身,而是导致它的原因。只有理论基础,
才能给予解释。我们把理论基础较好的那些,称为学院派。这很多时候是个贬义词,尤其在工业
应用中。但是,我看到很多学院派后来接触实践以后成长起来,我还看到很多野
路子的同学后来开始钻研理论。* 面试3还有同学提到,为什么我有这么好的想法公司却不用我,或者不用我的想法。你的确很有想法,可能非常杰出,但是企业招的却是员工,不是老板。我们都有
把别人当工具的倾向,不过如果想实施 (且不论是否正确),得先有自己身为工具
的觉悟。好想法,应该讲给风险投资商听,或者你自己有钱的话,讲给自己听。* 考试齐同学动手能力挺强的,他抱怨,为什么考试的时候要考概念。因为,我们将使用这些概念进行交流。比如,正则表达式,这是个严格清晰的概
念,一点也不像文科同学说的什么...那些乱用词。我们不能使用诸如"开头两个字是课文",这样的说法只能在跟人类跟用户这样有
限的交流范围使用。之所有要考概念的另一个原因,你真的以为自己清楚地掌握了它么?的确,这样,有的同学靠背诵就能得到很高的分数。这是考试技术低下造成的,
我们却不能因此放弃对概念的掌握。从难度上看,背诵 < 举例 < 使用 < 复述。有的时候,即使你偶而能正确使用 (在有限的场合下,有时还受到技术主管的辅
导或限制,因此不易失控),也不见得总能正确使用。而复述,可以考察出你是
否了解其中所有的要点。齐同学还提到,背概念真没意思。大意如此。概念从来就不是背的。不要使用别人的词汇,而应该使用自己的。如果你对要
点有所遗漏,当你应用它的时候,你如何确保充分注意到这一技术的优点、缺点、
使用的限制?使用的时候再查书?这确实是个答案,而且是个不错的答案。不过有些东西,我们要求的是 熟练,而不仅仅是掌握和理解。在水里理解自由泳
的精要,而不会熟练地扑腾 (还需要足够的心肺功能和肌肉耐力吧) ,也是白扯。要求"熟练"的一个结果,就是那些你最经常用到的知识,绝不会不理解,虽然不
能确保你的理解没有编差。谁说的来着:不了解自己的文章中的词意的作者应该枪决。同样,只会抄网上示
例,甚至不知道调的那个函数原型,没有读过手册的程序员,也...* 李记者你辞职,我对你还是挺有信心的。相同的技术和理论,总可以应用于不止一家公
司和不止一个领域。这个故事告诉我们,新技术等等,都是浮云。我们内心深处的,能长久停留的,
才可能成为我们自己的一部分,永不失去。祝你顺利。