谈谈今天的一次Nodejs相关面试...

谈谈今天的一次Nodejs相关面试…

我们最近在招聘nodejs方面的人才。所以,今天有位求职者过来面试,34岁,年纪不小了,8年工作经验,看上去也是很资深的样子。于是跟他聊了一些技术话题,发现很多问题:

  1. 对一些基本概念理解有太多的误差。 1.1 混淆第三方包和标准库 这位求职者用socket.io写了个类似webQQ的聊天工具,然后把所有的功劳都归到nodejs上面,对siocket.io是一个第三方包含混不清。 1.2 混淆HTTP协议和webSocket协议 导致此兄认为C/S与B/S间的差异就在于可否长连接上。
  2. 对语言没有认真思考 2.1 对js语言特性没有概念 此兄在nodejs和java/C#之间的区别上不知所云。也不能详述nodejs的优劣。也就是说:我会用js编程,但不知道为什么要用js编程!
  3. 也犯些常见性毛病 3.1 拿着锤子,看什么都是钉子 这对很多程序员都很类似,对自己掌握的一门技术,爱它爱得要死,干什么都用它。但这跟前一个问题很相关,如果不清楚这种工具的好处,那有时候干活儿就很笨拙,就像拿了把钳子去拧螺丝一样,虽然能勉强拧动,但那不是最合适的工具,效率会大打折扣!甚至会把螺丝拧坏。 3.2 学习不够 一个人工作了7、8年,如果没有对IT技术有个全面而又深刻的认识,那就很难有什么竞争力了!那些后起之秀将很快上来超越,这些后浪在知识、经验、认知、性价比、可用性等方面具备更大的优势。而对IT技术的全面认识可以从两种渠道获得:工作经验和自我学习,有时需要以行业交流来补充
  • 工作经验跟自己所在公司有关,公司业务如果很单一,那员工技能就很难扩展。
  • 自我学习是不受限的,自我学习可以自由安排,挑选自己感兴趣、有价值的知识内容。
  • 行业交流往往是通过头脑风暴的形式进行,可以快速扩展眼界。 所以,如果在20~30岁间没有经过大量阅读,广泛学习,那么后面的路就很难往下走!招聘方绝对不会因为你简历上写着10年+的工作经验就直接招聘进来。相反,他的要求会更高,因为很自然的会觉得你应该懂得更多,涉猎更广,技术更扎实,工作作风更规范。

在这里跟大家聊这些,并不是为了批评这个人,或者展示我的高明,而是希望陈述一些IT人常见的问题,表达我对IT从业者的观点。在我读别人批评的文章时,常常会自我对照,看看是不是自己有他批评的那些问题,以便弥补。因为自己常常看不到自己身上的缺点,不交流就不知道外面的世界还很宽广。 我们还在招聘,有效期至2014年7月底。如果你技术不错,可以发送简历过来。详情见:http://cnodejs.org/topic/53141c252a5b081d6c0cd6ce


20 回复

谈谈今天的一次Node.js相关面试

面试背景

我们最近在招聘Node.js方面的人才。今天有一位求职者前来面试,34岁,有8年的工作经验。从外表上看,他显得比较资深。然而,在面试过程中,我发现了很多问题。

基本概念理解偏差

1.1 混淆第三方包和标准库 这位求职者用socket.io写了一个类似Web QQ的聊天工具,并且认为所有功劳都归功于Node.js。但实际上,socket.io是一个第三方库,而不是Node.js的标准库的一部分。例如:

// 错误示范
const http = require('socket.io'); // 错误:socket.io 是一个第三方库,而不是标准库

// 正确示范
const io = require('socket.io')(server);

1.2 混淆HTTP协议和WebSocket协议 求职者认为C/S(客户端/服务器)与B/S(浏览器/服务器)的区别仅在于是否支持长连接。实际上,HTTP是一种请求-响应协议,而WebSocket则允许全双工通信,即客户端和服务器可以同时发送数据。

对语言缺乏深入理解

2.1 对JavaScript语言特性缺乏概念 求职者在Node.js与Java/C#之间的区别上表现得很模糊,也无法详细说明Node.js的优势和劣势。例如,Node.js的非阻塞I/O模型使其非常适合处理高并发场景,而JavaScript的异步编程模型使得代码编写更为简洁。

// Node.js 的异步编程示例
fs.readFile('file.txt', (err, data) => {
    if (err) throw err;
    console.log(data.toString());
});

常见性错误

3.1 拿着锤子,看什么都是钉子 有些程序员倾向于使用他们熟悉的技术来解决所有问题,即使这并不是最佳选择。例如,使用Node.js处理不适合异步编程的任务,可能会导致性能瓶颈。

3.2 学习不足 尽管求职者有8年的工作经验,但未能表现出对IT技术的全面理解和深刻认识。这表明他在自我学习和行业交流方面做得不够。

总结

这次面试让我意识到,对于IT从业者来说,不仅需要掌握具体的技术,还需要对基础概念有清晰的理解,并且能够深入理解所使用的编程语言。此外,持续的学习和行业交流也是必不可少的。只有这样,才能在竞争激烈的IT行业中保持竞争力。

招聘信息

我们仍在招聘中,有效期至2014年7月底。如果你技术过硬,欢迎发送简历给我们。详情请见:招聘链接

通过这次面试经历,我希望能够提醒各位求职者和招聘方,持续学习和技术的全面理解是至关重要的。


学习了!

只会 CoffeeScript 的表示省去了对比不同语言之间纠结的麻烦…

coffeeScript只是通过新增很多语法糖的方式,解决一些ECMAScript语法复杂的问题,其本质还是js。而且不支持除js外的其他语言。

希望你能实践下去!也祝你成功!

学习了一段时间,不过看了你对这位面试者的描述,感觉我比他强很多了。 已经写了一个多人博客了,不过还在慢慢的更新中,上班没时间好好写啊。当我完成了这个博客就要换工作了…

楼主年轻气盛啊,楼主的路以后会很短! 招聘的目的是什么?不是你把各个应聘人员的技术比下去,然后在这里德比德比,找到你需要的人就OK了。

欢迎过来试试!

有的人是请来做一线开发的,能磊代码就行,薪水给个7,8K就不错了。但我们是要请人过来做高级的工作,解决复杂问题,创造并实施符合业务需求的服务的。 把某人比下去,达到心理满足,那就永远找不到人!

文字很中肯!

  1. 其实大部分人并不适合干程序员,只是因为好找工作、工资高就进来了!

  2. 7-8年的程序员,如果全职转nodejs,只有2种情况,

    1. 特别牛跨学科多语言混编。
    2. 在原来领域混不下去了,停止不前。
  3. 中国的程序员,大都是实用主义者,只用会,而不知道为什么用。这也是生存压力大,所带来的非常不好现状。天天加班忙着改代码加功能,而没有时间去学习和理解原理。

  4. 中国的程序员,在大学里浪费了太多的时间,很多是毕业以后上个培训班就业的,底子太差,但自我感觉良好。

  5. 编程语言的使用门槛在降低,特别是Node,花个1-2天时间,新手就能实现一个web。本来应该知道的通信层、协议层、设计模式等的基础知识,都被框架封装了。所以,真正挑出来的高手,有1%就不错了。

很赞成您的观点。 我曾问我们公司的前辈 什么是 依赖注入,他们都会讲一些漫天不相关的,搞得我更迷惑了。他们工作上也仅是能完成功能,但是底层知识很少会很深入的讲出来

你的大部分观点我都很同意! 其实很厉害的IT从业者还是不少的,在一些知名的公司里,那里有很高的进入门槛,很好的技术氛围,更多的学习、实践和交流的机会、也有更多的高水平同事,环境与个体良性促进,成长出一批优秀的人。 那些不在优秀公司里的精英也有,他们往往是有强烈的追求,坚持不懈的奋斗,这种由内而外的驱动力也可促使自己成长为精英!我们很欣赏这类型的精英!

水一句 1.喜欢并愿意持续深入 2.有能力应用 感觉面试者能证明给面试官这两个问题就足够了,但往往又不那么简单

我好像认识一个这样的人,啊哈哈

挺好的,这里面也有我不足的地方,赶紧充电去了~

总结的很好!我毕业工作有八九个月了,学校学习的C/C++,后来工作用了几个月的C#,现在在用JS做nodejs的开发,个人感觉确实nodejs的应用门槛很低,很容易上手,但是深入下去就会觉得在很多问题上会有限制,因为把很多实现方法、思路都封装好了,反而需要花很多功夫调研一些问题的产生原因或者是否有第三方包能很好实现想要的功能。这和以前学习C++的感觉明显不一样,C++可能有繁杂的开发过程,较多的底层处理,但是正因为足够底层,实现功能的逻辑和方法都可以较自由的控制,所以大部分问题都可以很快确定能否解决以及如何解决。 另外,,,工作这段时间深深体会到了加班的危害,因为自我学习是需要时间和精力的。您面试的人不一定没想过要好好学习新的知识,扎实理论基础,实际上他很可能是被加班耽误了青春。 人之过,己之鉴,不能放弃学习啊。

像你这样刚刚工作的新人,如果能先进行些底层的接触,对个方面基础知识掌握牢固,后面的工作就很容易。这种自下而上的认识过程,对后面的理解速度有很大的帮助。相反,自上而下的认识会相对慢很多。 加班是个问题,所以自己一定要掌握好时间。无论如何也要抽出些时间来学习。以前听闻松下辛之助(也许记得不准确)深夜酒后回家还要读一段时间的书。这多难得! 另外,加班还是要适当拒绝。一是要正确认识自己的价值,不能将自己的宝贵时间全放在公司上面;二是要为自己健康着想;更好的方式是将时间用在加速增长自己价值的事情上。以最快的时间登到顶峰!

挺好的。 这个行业本来就是这样 。有些人所谓的10年经验,不过是一个经验用了10年而已 。其实什么语言都不简单,要看你做到什么程度了。 如果你只是为了输出个hello,打开vs的时间,node.js已经运行好了。 你不懂基本的原理,那你永远都只是一个使用者,而不是开发者。楼主也没有看不起谁,抬高自己的意思,就是说说整个行业的现状,给年轻人一些进步的经验。语言本身没有强弱之分,强弱在于使用的人。

根据你的描述,这次面试反映了一些IT从业者在Node.js技术领域中常见的问题。下面是一些针对这些问题的建议和示例代码,帮助你更好地理解和应用Node.js。

示例代码

示例 1: 区分第三方包和标准库

问题描述: 求职者混淆了第三方包(如socket.io)和Node.js的标准库。

解决方案: 了解Node.js标准库和第三方包的区别。

// 使用Node.js标准库
const http = require('http');
const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
});
server.listen(3000, () => console.log('Server running at http://localhost:3000/'));

// 使用第三方包socket.io
const io = require('socket.io')(server);
io.on('connection', (socket) => {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', (data) => {
        console.log(data);
    });
});

示例 2: 理解HTTP协议和WebSocket协议

问题描述: 求职者混淆了HTTP协议和WebSocket协议的概念。

解决方案: 理解HTTP是无状态协议,而WebSocket是持久连接的双向通信协议。

// HTTP服务器示例
const http = require('http');
const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('This is an HTTP request');
});

// WebSocket服务器示例
const io = require('socket.io')(server);
io.on('connection', (socket) => {
    console.log('A user connected');
    socket.on('disconnect', () => {
        console.log('A user disconnected');
    });
});

示例 3: JavaScript语言特性

问题描述: 求职者对JavaScript语言特性缺乏了解。

解决方案: 了解JavaScript的异步编程模型、回调函数、Promise等。

// 异步操作示例
function fetchData(callback) {
    setTimeout(() => {
        callback('Data fetched!');
    }, 2000);
}

fetchData((data) => {
    console.log(data); // 输出 "Data fetched!"
});

// 使用Promise
function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => resolve('Data fetched!'), 2000);
    });
}

fetchData().then(data => console.log(data)); // 输出 "Data fetched!"

总结

这次面试反映了求职者在基本概念理解、语言特性和常见错误方面的不足。建议加强基础知识的学习,并深入理解Node.js及其生态系统。希望上述示例代码能够帮助你更好地理解和应用Node.js。

回到顶部