看「百度都能一分钟搜索的面试题」帖子有感

会员 发布于 2015/08/11 10:43
阅读 4K+
收藏 16

楼主想必是对该面试官提问百度都能搜出答案的嗤之以鼻。

虽然我不太清楚该面试官的题目有多简单,但是我有必要为这个可怜的面试官辩解说两句。

我也算是面试过很多人了,答题也是自己编写的,也姑且自诩在这个行业里面混了10年吧。

那我就拿出我题库中一道百度也能搜到的题目说说吧:

javascript获取服务器时间

百度链接为:https://www.baidu.com/s?wd=javascript%E8%8E%B7%E5%8F%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%97%B6%E9%97%B4&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=5&rsv_sug1=5

其实这题的是因为这个问题衍生:「秒杀倒计时,所有用户显示的倒计时时间都一样,确保数据都是在同一秒拥入。」

获取服务器时间,百度一搜一大把,对吧,楼主,

但是提供的答案基本上都是:使用服务脚本将时间打印到页面上。比如PHP:var serverTime = new Date(<?php echo time() * 1000;?>);

这解决了问题,对,如果不考虑服务器解析执行脚本的时间、浏览器对页面解析到加载到本段Javascript的时间、网络传输的时间、是否有缓存头等、或者跨域。

(仔细想一下这些延时)

那你解决了问题吗?

其实这是一个认知层面的问题,当你觉得百度出的答案解决问题的时候,你停留在哪个阶段?

上面的话,对部分人来说,很尖锐。也许他们会拿出各种各种的理由来反驳你,什么公司没那么高的要求,只要解决问题就好了,我的任务很重没时间,等等。

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

但是,如果你能答出下面的答案,对你和面试官而言,都是一个很高的提升

百度第一页中chinaunix有了一个较为高级的答案:http://bbs.chinaunix.net/thread-3675366-1-1.html

如下:

使用Ajax(cache: false)去GET当前外联的js文件,然后读取其HTTP的Date头,根据此头计算时间。

//获取外联的js文件路径
var scripts = document.getElementsByTagName("script");
var thiscript = scripts[ scripts.length - 1 ];
var ajaxURL = thiscript.src;
var deltaTime = 0; //得到deltaTime 之后,随时可以用 客户端时间 + deltaTime,从而得到服务器时间
$.ajax({
	url:ajaxURL,
	type:'GET',
	cache:false, //禁止缓存
	async:false, //同步
	dataType:'text', //不解析内容
	success:function(data,textStatus,XMLHttpRequest){
		deltaTime = (new Date(XMLHttpRequest.getResponseHeader('Date'))).getTime() - (new Date()).getTime();
	},
	error:function(XMLHttpRequest, textStatus, errorThrown) {
		deltaTime = (new Date(XMLHttpRequest.getResponseHeader('Date'))).getTime() - (new Date()).getTime();		
	},
	timeout:5000
});

(以上代码经过T公司N次秒杀线上测试,80%的秒杀数据在00秒整点拥入(一秒上万并发),可放心使用)

这个答案其实并不是太高深,但是重点体现在细节部分,需要你融会运用Ajax、HTTP头的知识,无Cache、同步提交以便得到delta值

当然,这个答案也并不完美,也会有毫秒级别的误差(Date头无法输出毫秒),但是相比之下,服务器返回静态页面的速度更快、无动态脚本执行时间、以及无浏览器执行到Javascript的时间,等延时问题有很大的提高。

这里有HTTP协议的知识,有apache、nginX处理机制的理解,也有浏览器的渲染逻辑等。

大家可以看到,这些并不是技术难题,但是需要你深入了解B/S、HTTP的运作机制,

一个优秀的程序员不仅体现在他的编码能力,更体现在他对该功能实现的深度和高度。

同样是百度的问题,你答出了面试官想要的吗?


===========================完=============================



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


其实,还有一种方式:SSI,这个相比服务器脚本有一定的提升,但是没有ajax精度高

if ('<!--#set var="simpletimer" value="Server Side Includes"--><!--#echo var="simpletimer"-->' == 'Server Side Includes') //SSI support
<!--# config timefmt="%A, %d-%b-%Y %H:%M:%S %Z" -->
var serverTime = new Date('<!--#echo var="DATE_LOCAL" -->');

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

如果大家对倒计时感兴趣,可以访问http://mat1.gtimg.com/hb/js/common/jquery/jquery.simpletimer.js

<div id="a" target="08/11/2015 20:00:00">00:00:00</div>Javascript日期格式:月/日/年 时:分:秒
<script>
$('#a').simpleCountdown('%D天%H小时%M分%S秒 总秒数为:%s');
</script>
去掉%D 会自动将天累加到时
去掉%H 会将时累加到分

不过这个代码年久失修,但是可以用,最新的代码暂未发布。


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

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

这个题目,经过面试N个人,回答的答案有4种:

1. 不知道 --------- 应该是仔细看了题目

占比 70%,中级以下

2. new Date()  -----------答题者心里还在骂面试官,怎么这么简单

初级,此类人绝对是菜鸟,我的题目中已经用上下文、粗体强调了调取服务器时间

3. 使用服务器端语言,<?php echo time();}> ------------- 可是我的题目明确说了只能使用js

占比 29%

中级,此类人算的上是有一定经验的人群,但是仍然处于「会用」这个层面,谈不上高手

4. Ajax取Header

高级,占比 1%,能答出这个答案的,应该是处理过相应问题,最不济也是在网路上研究过这些帖子,或者经过思考。

如果还能答出unix时间戳转换js时间需要乘以1000,这可以肯定,此人注意细节,可用!

----------------------------------------------

其实面试人群中也有很多工作年份比较长,但是很多深入的题目都答不出来的情况,因为每个人的职业生涯也不尽相同,多年工作的菜鸟的人也大把存在

面试时,大部分人群都是普通水平,而这群人中很大部分有一些共性:浮躁,眼高手低。

其中不乏有些狂妄之辈,掌握这个语言,用CRUD写了几个项目,便以为了解了全部

深入理解,融会贯通。中级成为高级的秘诀,便在于此!

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

比如PHP面试题:

目前网络上有违禁词10多万条,请处理一篇文章,将这些词语替换成为*,要求最快的运行速度


加载中
2
guor
guor

我想说,不要为了做题而出题,此法虽陌生,不过只是恰好你在特定的时间处理了特定的问题而已,任何语言都有数不尽的生僻语法,还记得在刚毕业时,我处理过一个回车导致的bug,当时整个公司没人找到,却被我找到了,但是能因此说明我是高级货么?No,我只是在特定的时间发现了特定的问题,仅此而已...

术业有专攻,凭简单的几个题目去看一个人未免太草率

多年工作的菜鸟的人也大把存在”,这个可能,但是请相信这个只能说明你会的他不会,他不适合一份工作而已,而且肯定的说他会的你不一定会

巴顿
巴顿
确实,只是特定时间处理特定的问题而已,真的实力,是需要经历了实践才出来的,所以试用期这个概念是有必要的。
0
xsySunny
xsySunny
  如何根据这个服务器时间做一个时钟呢? 通过JS的计时器功能会有误差吗?
0
会员
会员

引用来自“xsySunny”的评论

  如何根据这个服务器时间做一个时钟呢? 通过JS的计时器功能会有误差吗?

已经更新原文,可以看下倒计时部分。 即使当前页面因为其它js过程导致卡死数秒,只要再次触发Timer的时候,实时获取本地Date + delta 即可,这不会有误差。

这也是一个小细节,如果只$i = 300;setInterval(function() {$i--;},1000); 

这样的写法,肯定是误差很大,因为你无法保证中间没有其他的js在操作,这是Timer的实现机制问题,所以你需要去了解这个细节。

因此,需要实时去取当前时间来操作。具体看源代码。

0
江南若水
江南若水

您老想多了。

他们的过程大概是这样的:

面:用过jQuery吗?

被:用过,每个项目都用。

面:说说常用的xxx api。

被:api都是平时百度查一下,一秒钟就够了,我不记得。

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

这类型的题目答出来不能说明问题,答不出来就能说明问题了。

其实也可以这么考,刷菜鸟用的。意义就在于此。

m
magiclogy
api都是snipplet自动完成的好么?
0
梅开源
梅开源

引用来自“江南若水”的评论

您老想多了。

他们的过程大概是这样的:

面:用过jQuery吗?

被:用过,每个项目都用。

面:说说常用的xxx api。

被:api都是平时百度查一下,一秒钟就够了,我不记得。

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

这类型的题目答出来不能说明问题,答不出来就能说明问题了。

其实也可以这么考,刷菜鸟用的。意义就在于此。

前几天我这边面试人就这样的

我在旁边听了后来忍不住问

考这个会不会简单了点……

回答也是刷菜鸟用。

MZHS
MZHS
回复 @纠结名字 : document.getElementById(),这个是我用的最多的,其他的的确用的不多
纠结名字
考这个是简单了点,如果这个还要百度,就有问题了。。。
0
护士的小黄瓜
护士的小黄瓜
  那要是服务器比较繁忙(一秒上万并发),ajax请求到返回中间也有时间差的吧?
0
会员
会员

引用来自“LAJS”的评论

  那要是服务器比较繁忙(一秒上万并发),ajax请求到返回中间也有时间差的吧?

并发上万,我猜测这种牛X的环境下,肯定会启用:负载均衡,或静态文件CDN。毕竟T公司只有在推送Tips的时候,才会有如此高的单篇稿件并发量

既然是多服务器,肯定有ntp时间同步确保网内服务器均在统一时间

1. 负载均衡、CDC:系统会自动分配到空闲服务器处理,这时间差可以忽略

2. 任何方式,都有时间差,只是时间差多少的问题,如果网络已经慢成那么逑样了,那基本很难一起玩耍了。

在网络良好的情况下,ajax方式也有时间差,因为HTTP不能输出毫秒,但是你可以改进算法,比如250/500/750毫秒之后再次请求,计算这些的差集,以确保时间精度在250毫秒内

3. 秒杀是先打开的页面,然后静静的等待倒计时,这个不存在如此高并发去读取时间的情况。

 

0
滴答答答
滴答答答
好流弊  尽然是个女的  更流弊啊
0
mirai_
mirai_

获取静态文件 DATE 头的确不错,节省掉解析 PHP的时间

但是直接写在php脚本里面更好些吧,毕竟 PHP 解析执行时间基本差不多,基本固定在几十毫秒,

脚本里面补上就行了,

不好确定的是,每个用户的网络延迟不同。

而解析php的时间差基本都是一致的

所以:<?php echo time() + 延迟时间;}>,更方便,而且不比那个ajax的差

0
会员
会员

引用来自“o__o”的评论

获取静态文件 DATE 头的确不错,节省掉解析 PHP的时间

但是直接写在php脚本里面更好些吧,毕竟 PHP 解析执行时间基本差不多,基本固定在几十毫秒,

脚本里面补上就行了,

不好确定的是,每个用户的网络延迟不同。

而解析php的时间差基本都是一致的

所以:<?php echo time() + 延迟时间;}>,更方便,而且不比那个ajax的差

那你计算了从php输出时间,然后发送给浏览器,然后到浏览器渲染页面 然后到解析到该行Javascript的时间吗?

如果是ie,它会把很多css/图片下载了之后才开始解析js,chrome可能会好一点

你此条js的位置,如果放置在body中,那要计算上head中获取css、js等文件的时间,以及页面的渲染时间等。

如果客户电脑卡呢?

而ajax就解决了这个问题,只有当解析到该js时,才去调取服务器时间。

所以,我只看到了这个方法的方便,而不是这个方法的「不比ajax差」

mirai_
mirai_
回复 @会员 : 哦,确实这种方案确实差些,导致时间不精确主要是网络请求各个客户端不一样, PHP解析啊html解析这种,每个客户端时间也差不了多少
会员
会员
回复 @o__o : DOM解析的时间呢?ie 6 7 8的同步加载呢?难道将你这行js写到head的第一位?将这些不可控的误差交给HTML开发人员,和用户浏览器才真的叫糟糕。其实退一万步说,这误差大部分人都可以容忍!
mirai_
mirai_
DOM加载完就解析js,图片和css异步加载的。
返回顶部
顶部