今天面试的非常困惑,求各位大牛解惑
先说基本情况:
本人本科毕业,工作3年,最近在找工作,
面了不少试,也拿了几个offer,
定了下家已经在跳的状态了。
昨天接到韦伯森斯的面试电话,
看公司的简介还挺不错的样子,
今天下午就去面了下,回来一肚子气,求各位大牛解惑!
面试过程是上机做一道题,然后面:
上机题目就不泄露了,是道看起来很简单,感觉想做的好也不容易的题。
我用了不到20分钟就实现了,然后用了1个多小时修修补补,也没补完美,
觉得耗时太久也不好,就让他们过来面试了。
2个人面试,看起来都是30左右,
一个白白净净的,说话声音也不大,开始时老是听不清楚,
另一个黑黝黝的,看起来很壮实也很凶悍的感觉。
过来第一个问题是让我说说刚才那道题的思路。
我大致说了说自己的解决方法,
然后就说自己没解决的地方了。
(我自身的有个缺点,东西没做的完美的话就不太愿意说太多,经常太实在了)。
结果这俩哥们就一个劲的问我,打算这个问题怎么解决啊。
这个郁闷啊,我要是想好了怎么解决,还用得着在这跟你说么!!
(这是第一个困惑,但源于自身的缺点,也就忍了。)
然后聊项目。
一共没几个问题我就被“如果有消息,2周内会通知你”了。
一个是线程的:
线程和进程有什么区别?
(此困惑二:这道题到底在考察什么呢?不止1次碰到这个问题了,每次都不知道怎么答。
大学考试时这题基本能答得和标准答案一字不差,
可那时连pid是什么东西我都不知道呢!)
我说线程间共享内存空间,进程不,
编程时就是线程间全局变量啥的线程公用,
进程全局变量之类的都是各自的拷贝,
实现机制上linux线程和进程都一样。
那个黑幽幽的面试官,在旁边一个劲的拿简历捂着脸,露着眼睛,感觉一直在笑我,
有什么好笑的么?
一个是socket方面的。
问我client端连接server的socket编程过程。
我说socket、conect,然后recv、close就得了。
又问我server端的过程,
我说socket、bind、listen、accept,然后select、recv,最后close就得了。
(不太记得自己当时有没有说漏什么,因为两个人都一直在盯着简历,让我感觉没一个人是我的听众,思想集中不起来)。
又问我tcp连接client端不用bind么?
(我懵了一下,不是自动绑定端口的么?我记错了?)
我说不用吧,udp的我记得是不用,tcp的好像也不用吧,好像是自动绑定的。(原封不动的原话)
又问我listen的用处是干什么?
(我又懵了一下,监听呗,不听你怎么知道谁要连呢,还有什么用么?)
我说好像跟三次握手有点关系吧。(原封不动的原话,回来看看书,我说的没什么太大偏差啊,虽然也不完全正确)
黑脸的那个家伙又拿简历挡着脸,让我感觉他一直在偷着笑,
有什么好笑的呢?socket说白了只是个写的好点的api,觉得用着他不爽的都可以自己再实现一套,
就算我说错了又能证明什么呢?
(此困惑3:socket的题在考察什么?我承认我答题向来不精确,
但这些东西有个基本思路不就成了么,需要的时候man一下,
什么都死死的记脑袋里,有必要么?
考官们应试教育都学傻了么?给老外打工天天就整这些死板的东西么?)
还有个问题是www服务器让我写的话我怎么写。
我说没写过这方面的,不想答。
(此困惑四:当面试官问你这种一个人基本不可能完成的任务,大牛们应该怎么答呢?)
然后又问我项目的线程怎么用的,
我还没答完呢那个黑黝黝的面试官就说“我没什么问题了”,
白脸的想了一下也说“那我也没什么问题了”。
一下午的时间就这么浪费了,
被鄙视了,
还不知道到底哪里被鄙视了呢?
离开学校之后工作或学习就一直不喜欢死记硬背,
凡事理解为主,
面试的时候却总碰到麻烦,
但很多考官非常喜欢考理论的东西,
比如线程进程的区别,比如tcp和udp的区别,比如说说TCP/IP协议。。。。
记得以前面过一家叫宝兰德的,跟这个公司基本一摸一样,面试官牛哄哄的,上机+考理论,
给美国佬干的都这样么?
有点啰嗦,csdn第一次发帖竟然是个怨妇贴,心情实在郁闷不爽愤怒困惑窝火难受,见谅。
[解决办法]
黑暗的时代。
[解决办法]
不过有的内容,你真的答错了。。。
而且有时候别人问你一件你一个人完成不了的事情的时候,
只是在问你思路。
[解决办法]
有些问题想好了再回答
别太急,至少自己要能说服自己
[解决办法]
socket的client端不用bind,这个人就问你基础的,listen是设置监听队列的吧,跟tcp三次握手有关。
估计还想问你其他的编程模式select等非阻塞方式。
进程和线程区别,那你就针对windows和linux分别说吧。什么线程同步互斥都可以拿来说,线程池等技术。
如果人家要考书上的也没办法,抓紧补一下。
[解决办法]
首先,工作三年,答成这样,确实不太好。
其次,面试官也有问题。比如进程和线程问题,就说没区别咋了,你说linus就是这样实现的,就一个共享。
[解决办法]
汗。。。连我这种初学者都能看的出来LZ答的不怎么样。。。
我只试过在windows下的多进程/线程,就像书上说的。。。进程是静态的,而线程是动态的。
进程就像是一个箱子一样,里面装满了很多东西,有线程,资源,代码还有其他各种各样的东西, 而线程就如同是这个箱子里的小人一般, 根据箱子里的指令(代码)处理各种事务。
不过因为可以有多个小人所以就需要适当的分配工作不让他们发生冲突,于是线程同步,异步,信号量,各种各样的方法出现。。。
2个进程就如同2个没有联系的箱子一般,各自有各自的天地。如果想让2个箱子联系起来可以用到公共区域,或者管道, 或者在箱子里再做个箱子,也就是创建子进程的并且继承。。。我就知道这几种。
公共区域有dll, 内存映射文件,全局数据段== 不过其实全局数据段和内存映射文件的底层感觉应该是一样的。。。
也可以通过管道连接2个进程的输入/输出,或者通过创建新的进程来继承父进程的各种资源/句柄。
关于socket, client端的确是不用bind的。。。感觉是因为client不需要制定特定的端口来与服务端交流。也许因为是client发起的连接的关系吧。。。
感觉面试官还想继续问一些socket模型的问题。。。结果觉得你回答的不太好,所以就转到别的上了
至于listen。。。不太清楚,tcp/ip详解才看到udp部分。
我觉得这些东西是不需要背的,而是要清楚它到底是个什么结构,把它当作一个"人"来看待,在脑中建立起它的"身体(模型)"。。。 这样的话有什么特殊问题就可以根据这个"身体"来推论找办法。。。。 总之我都不特意去记而是在学习的时候建立起这种知识的"身体",继续学习就继续充实它的"身体"
不知道上面理解的有没有错。。。
------解决方案--------------------
楼主以后多看点书吧。
一个程序员,不能很好的完成头给的工作,几天被淘汰。
一个程序员,能很好的完成头给的工作,却不看书,几年之后被淘汰。
[解决办法]
他们可能想你自由发表更多的高见。。。