方向一:分享你面试IT公司的小技巧
- 沉着冷静应对刁难:应试场上,考官往往会针对求职者的薄弱点提出一些带有挑战性的问题。面对这样的考题,你一定要心平气和,较为委婉地加以反驳和申诉,绝不可情绪激动,更不能气急败坏,以免引起考官的反感而招致应试失败。
- 考虑问题周到,准备充分:在面试中,有时考官提的问题并没有什么标准答案,这就要求应试者答题之前要尽可能考虑得周到一些,以免使自己陷于被动。面试在某种程度上就是一种斗智,你必须圆好自已的说词,方能滴水不漏。
- 话不能说得太死,要给自己留余地:面试当中,对那些需要从几个方面来加以阐述,或者“圈套”式的问题,你要注意运用灵活的语言表达技巧,不要一开始就把话讲死。否则,很容易将自己置于尴尬境地或陷入“圈套”之中。
- 思维丰富,但讲求实际:面试中,偶尔也会出现一些近乎怪异的假想题,这类题目一般都具有不确定性和随意性,这也使应试者在回答时有了发挥想象的空间和进行创造性思维的领域,你只要充分利用自己积累的知识,大胆地以“假设”对“假设”,就能够争得主动,稳操胜券了。
- 该讲的讲完,不该讲的不多说一字:你在面试时一定要注意把紧自己的嘴巴,如果认为已经回答完了,就不要再讲。最好不要为了自我推销而试图采用多讲话的策略,来谋求在较短的时间内让招聘方多了解自己,事实上这种方式对大多数人来讲并不可取。该讲的讲,不该讲的绝不要多讲,更不要采取主动出击的办法,以免画蛇添足、无事生非。
- 不要去那种痴迷于某种特定技术的公司(除非你也是这类人):首先你得明白的是,技术是一种手段而不是目的。过于专注于技术而不将眼光放到解决问题的方案上将是灾难的开端。特定技术并不是成功的保证。
- 不要去那种技术负债严重的公司:我们应该在第一点和第二点之间找到一个平衡。最好不要去那种完全允许员工自由使用技术的公司。因为没人愿意花一个周末去学习一个莫名其妙的系统,就因为会维护该系统的人已经离开了公司,而该系统又新发现一个关键漏洞。
- 不要去那种连面试官看上去都非常疲倦的公司:如果有员工看上去非常劳累的样子,那么你以后也会如此。
- 不要去那种说不出你初期工作量的公司:我们应该去那种能准确估计初期工作量的公司(至少 3-6 个月)。
- 避免那种严重影响生活质量的公司:生活质量很重要,我们的新工作不应该对此产生不利的影响。我敢打赌,这些个老板才不关心你需要熬多少夜经历多少通宵达旦才能完成工作。他们会做的就是尽量剥削你的劳动力,榨干你所有的价值。
- 高薪与少量的股权——选高薪:少量的股票其实没多大意义。很多时候,这只是用来安抚劳累过度的员工的一种形式。还不如钱更划算。Ps:此条仅适用于这些股票无法在交易所出售的情况。
- 不去那种没有正式培训过程的公司:每一位员工,无论经验有多么丰富,刚进入新公司总是需要学习的。所以我们在最初的日子里肯定需要大量「手把手」的培训和帮助。这很正常。
- 不要去那种取缔多样性的公司:倡导多元化的价值,求同存异,才能让人舒适地工作。
- 不要去那种不尊重你和你的财产的公司:举个例子,如果你的公司希望使用你的手机作为你工作的一部分,那么他们就应该在工资以外再支付给你一部分钱,或者给你配备公司提供的手机。
- 不要去那种缺乏系统流程的公司:流程和政策决定了一个公司的规模。缺乏某种形式的标准将导致各种各样的技术和后勤债务问题。
- 不要去那种没有办公室文化的公司:每家公司,无论其大小,都应该有某种形式的办公室文化。良好的氛围需要公司活动的培养。
- 不要去那种在面试时出现不受欢迎的小插曲的公司:如果你在面试中遇到这种情况,那么你可以预见以后你将会碰到多少这种「惊喜」。
- 不要去那种在面试的时候尽问些无用问题的公司:如果在面试时问你的问题和你的工作毫不相干,那就不要回答。
- 不要去那种在面试过程中要求你为他们的代码库做贡献的公司:你只是在面试而不是已经被雇用了。
- 不要去那种光是面试就要占用你大量上班时间却毫无补偿的公司:用人单位应该尊重每一位应聘者来面试的时间。如果他们要求你请一两天假来做面试,那就应该在金钱上补偿你的损失。
- 不要去那些没有道德守则的公司:道德准则非常重要。
- 不要去那种据说有无限带薪休假政策的公司:这只是「公司的休假政策到时候再依据具体情况而定」的另一种好听的说法罢了。知道有多少带薪休假时间,能让你有计划地安排假期。
- 不要去那种有可疑商业行为的公司:如果你面试的公司好像在做一些违法或者不道德的事情,那最好马上远离他们。
- 不要去那种强制个人「所有权」的公司:新的和现有的系统应该由整个工程团队所拥有。话说,谁都不想成为唯一一个有什么问题总是被传唤的人。而且这么一种文化将导致所有人都不愿意去创新,不愿成为某任务或者某技术的「所有者」。
- 不要去那种强迫你使用个人社交媒体账户来发布广告的公司:如果该公司请你发布一些公告或者招聘信息,那还好说。如果是强迫的,那心情就不爽了。
- 不要去那种离职率较高的公司:如果一家公司总是不能留住员工,那必然是有原因的。
- 不要去那种没有绩效考核的公司:如果一家公司不能对辛勤劳动的员工表示赞赏,那它就不值得这些劳动价值,你也最好不要进去。要知道,除了加薪和奖金,水杯和 T 恤衫也是很好的激励措施。
- 问问他们的员工对他们当前的工作有什么不喜欢的地方:这一点非常重要。近之则不逊,这些员工的回答会告诉你很多关于这家公司的「秘密」。
- 接触前雇员,询问他们的经验:谦逊有礼又要低调。让他们知道你正在考虑某某公司,你非常想听听他们关于在该公司的经验。他们将会提供很多宝贵的信息。
- 写下你想加入该公司的理由,然后做验证:比如说你想加入某某公司是因为他们使用 Python 语言。在面试工程中你就应该问问他们什么时候以及如何使用 Python。确保该公司使Python 的形式是你想要的。知己知彼,方能百战不殆。
- 如果此公司在 GitHub 上有公共代码,一定要仔细看一看:每家公司都有自己的工程流程。公开的代码必然是他们的骄傲。这是评估一家公司内部工程过程的最佳途径之一。
- 到一些技术问题,然后在面试中有礼貌地提一提:处理批评建议是每一份工作的重要组成部分,特别是技术岗位。无论是有用的还是无用的,能够虚心接受批评才是成熟的标志。此外,你还应该观察他们的回应。如果你不赞同他们对待批评的态度或者回答,那就不要选择这家公司。
方向二:IT技术面试有哪些常见的问题?
- 简单介绍一下您的情况?
- 您怎样描述自己?
- 您为何要选择我公司?
- 您为了这次面试做了哪些准备工作?
- 我们为什么要雇佣您?
- 为什么您要应聘这个职位?
- 您期望的薪金待遇是多少?
- 什么对您来说更加重要 ― 工作还是金钱?
- 您期望从此职业中获得什么 ― 金钱、声望还是事业成就感?
- 如果其他公司为您提供了更高的薪水,您会离开我公司吗?
- 您生活的最终目标是什么?
- 您怎样做好准备来实现这些目标?
- 您为何选择这类职业?
- 除了计算机之外,您还有什么其它兴趣?
- 您有哪些强项?
- 您的弱点有哪些?
- 您认为您能在我们公司发挥所长吗?
- 您是否全面了解您应聘的职位?
- 以前您是否经常变换工作地点?
- 您为何要离开以前的工作单位?
- 您上一个工作的职责是什么?
- 您上一个工作的薪水是多少?
- 为什么计算机突然之间变得如此重要?
- 为什么您感觉需要学习计算机?
- 您认为计算机会使人们变得无用吗?
- 计算机在未来的某个时候会发展到能够思考吗?
- 请你自我介绍一下:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验 ,这些在简历上都有,其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出积极的个性和做事的能力,说得合情合理企业才会相信。企业很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句“谢谢”。企业喜欢有礼貌的求职者。
- 你觉得你个性上最大的优点是什么:沉着冷静、条理清楚、立场坚定、顽强向上。乐于助人和关心他人、适应能力和幽默感、乐观和友爱。
- 说说你最大的缺点:这个问题企业问的概率很大,通常不希望听到直接回答的缺点是什么等,如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低,企业肯定不会录用你。绝对不要自作聪明地回答“我最大的缺点是过于追求完美”,有的人以为这样回答会显得自己比较出色,但事实上,他已经岌岌可危了。企业喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分。企业喜欢聪明的求职者。
- 你对加班的看法:实际上好多公司问这个问题,并不证明一定要加班。 只是想测试你是否愿意为公司奉献。
- 回答样本:如果是工作需要我会义不容辞的加班。我现在单身,没有任何家庭负担,可以全身心的投入工作。但同时,我也会提高工作效率,减少不必要的加班时间
- 你对薪资的要求:如果你对薪酬的要求太低,那显然贬低自己的能力; 如果你对薪酬的要求太高,那又会显得你分量过重,公司受用不起。一些雇主通常都事先对求聘的职位定下开支预算,因而他们第一次提出的价钱往往是他们所能给予的最高价钱。他们只不过想证实一下这笔钱是否足以引起你对该工作的兴趣。
- 回答样本一:“我对工资没有硬性要求。我相信贵公司在处理我的问题上会友善合理。我注重的是找对工作机会,所以只要条件公平,我则不会计较太多
- 回答样本二:我受过系统的软件编程的训练,不需要进行大量的培训。而且我本人也对编程特别感兴趣。因此,我希望公司能根据我的情况和市场标准的水平,给我合理的薪水。
- 回答样本三:如果你必须自己说出具体数目,请不要说出一个宽泛的范围,那样你将只能得到最低限度的数字。最好给出一个具体的数字,这样表明你已经对当今的人才市场作了调查,知道像自己这样学历的雇员有什么样的价值。
- 在五年的时间内,你的职业规划:这是每一个应聘者都不希望被问到的问题,但是几乎每个人都会被问到。比较多的答案是“管理者”。但是近几年来,许多公司都已经建立了专门的技术途径。这些工作地位往往被称作“顾问”、“参议技师”或“高级软件工程师”等等。当然,说出其他一些你感兴趣的职位也是可以的,比如产品销售部经理,生产部经理等一些与你的专业有相关背景的工作。要知道,考官总是喜欢有进取心的应聘者,此时如果说“不知道”,或许就会使你丧失一个好机会。最普通的回答应该是“我准备在技术领域有所作为”或“我希望能按照公司的管理思路发展”。
- 你朋友对你的评价:想从侧面了解一下你的性格及与人相处的问题。
- 回答样本:“我的朋友都说我是一个可以信赖的人。因为,我一旦答应别人的事情,就一定会做到。如果我做不到,我就不会轻易许诺。
- 回答样本:”我觉的我是一个比较随和的人,与不同的人都可以友好相处。在我与人相处时,我总是能站在别人的角度考虑问题“
- 你还有什么问题要问吗?:企业的这个问题看上去可有可无,其实很关键,企业不喜欢说“没有问题”的人,因为其很注重员工的个性和创新能力。企业不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?企业将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上进心。
- 如果通过这次面试我们单位录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办:一段时间发现工作不适合我,有两种情况:1、如果你确实热爱这个职业,那你就要不断学习,虚心向领导和同事学习业务知识和处事经验,了解这个职业的精神内涵和职业要求,力争减少差距; 2、你觉得这个职业可有可无,那还是趁早换个职业,去发现适合你的,你热爱的职业,那样你的发展前途也会大点,对单位和个人都有好处。
- 在完成某项工作时,你认为领导要求的方式不是最好的,自己还有更好的方法,你应该怎么做:①.原则上我会尊重和服从领导的工作安排;同时私底下找机会以请教的口吻,婉转地表达自己的想法,看看领导是否能改变想法;②如果领导没有采纳我的建议,我也同样会按领导的要求认真地去完成这项工作;③.还有一种情况,假如领导要求的方式违背原则,我会坚决提出反对意见;如领导仍固执己见,我会毫不犹豫地再向上级领导反映。
方向三:分享总结你遇到过的面试题
请你说说红黑数的特性,为什么要有红黑树?
因为平衡数要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡数的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树,红黑数具有如下特点:
- 具有二叉查找树的特点
- 根节点是黑色的
- 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存数据
- 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的
- 每个节点,从该节点到达其可达的叶子节点是所有路径都包含相同数目的黑色节点
请你说说对称加密和非对称加密?
得分点:密钥、公钥、私钥
对称加密:对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。常见的对称加密算法有:DES、AES、3DES等。
非对称加密:非对称加密指的是加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。常见的非对称加密算法:RAS,ECC等。
加分回答:对称加密和非对称加密相比安全性低,因为加密和解密是同一个密钥,数据包被拦截之后不安全。而非对称加密中,公钥用来加密,私钥用来解密。公钥可以公开给任何用户进行加密,私钥永远在服务器或某个客户端手里,非常安全,数据被拦截也没用,因为私钥未公开就永远无法打开数据包。
解释一下TCP/IP协议栈,并简要描述每个层的功能。
- TCP/IP协议栈是互联网通信的基础,它包括多个层级,每个层级负责不同的功能:
- 物理层:处理电信号传输和物理介质的连接。
- 数据链路层:负责在直接相连的节点之间传输数据帧。
- 网络层:提供数据包的传输和路由功能,例如IP协议。
- 传输层:负责端到端的可靠数据传输,常用的协议是TCP和UDP。
- 应用层:包括各种应用协议,例如HTTP、FTP、SMTP等。
在C++中,如何使用套接字(Socket)进行网络通信?请描述基本的套接字编程流程。
- 套接字编程使用C++的socket库函数来进行网络通信。基本的套接字编程流程包括以下步骤:
- 创建套接字:使用socket函数创建一个套接字,指定协议和通信类型。
- 绑定地址:使用bind函数将套接字与特定的IP地址和端口绑定。
- 监听连接:对于服务器端,使用listen函数开始监听连接请求。
- 接受连接:对于服务器端,使用accept函数接受客户端的连接请求。
- 发送和接收数据:使用send和recv函数在连接上发送和接收数据。
- 关闭连接:使用close函数关闭套接字。
什么是阻塞IO(Blocking IO)和非阻塞IO(Non-blocking IO)?请解释它们之间的区别和优缺点。
- 阻塞IO是指当程序进行IO操作时,如果数据没有准备好或无法立即写入,程序会被阻塞,直到IO操作完成。
- 非阻塞IO是指当程序进行IO操作时,如果数据没有准备好或无法立即写入,程序不会被阻塞,而是立即返回一个错误码。
- 区别和优缺点:
- 阻塞IO的优点是编程简单,适用于单线程环境,等待IO完成时不会占用CPU资源。缺点是如果IO操作耗时较长,会导致程序阻塞,影响其他操作。
- 非阻塞IO的优点是可以实现异步IO操作,提高程序并发性能。缺点是需要不断轮询IO状态,增加了编程复杂性,并且会占用较多的CPU资源。
如何使用C++实现基于TCP的服务器和客户端通信?请描述基本的实现步骤。
- 服务器端实现步骤:
- 创建套接字并绑定地址。
- 监听连接请求。
- 接受客户端连接。
- 使用接受的连接进行数据收发。
- 关闭连接并释放资源。
- 客户端实现步骤:
- 创建套接字。
- 连接服务器。
- 使用连接进行数据收发。
- 关闭连接并释放资源。
什么是多路复用(Multiplexing)?在网络编程中,如何使用select或poll函数实现多路复用?
- 多路复用是一种技术,允许程序同时监听多个文件描述符(套接字),以便在有数据到达时进行处理。
- 在网络编程中,可以使用select或poll函数来实现多路复用。基本的步骤如下:
- 创建并初始化fd_set(文件描述符集合),将要监听的套接字添加到集合中。
- 调用select或poll函数,等待套接字上的事件发生。
- 根据返回的就绪套接字,进行相应的数据收发操作。
解释一下TCP的三次握手和四次挥手过程。
三次握手过程:
- 客户端向服务器发送一个SYN(同步)包,请求建立连接。
- 服务器收到SYN包后,向客户端发送一个SYN-ACK(同步-确认)包作为响应。
- 客户端收到服务器的SYN-ACK包后,再向服务器发送一个ACK(确认)包,完成连接的建立。
四次挥手过程:
- 客户端向服务器发送一个FIN(结束)包,表示不再发送数据。
- 服务器收到FIN包后,发送一个ACK包进行确认,但仍可以发送数据。
- 服务器发送完数据后,向客户端发送一个FIN包,表示数据发送完毕。
- 客户端收到服务器的FIN包后,发送一个ACK包进行确认,然后关闭连接。
什么是异步IO(Asynchronous IO)?在C++中,如何使用异步IO进行网络编程?
- 异步IO是一种IO模型,允许程序在IO操作进行的同时执行其他任务,而无需等待IO操作完成。
- 在C++中,可以使用异步IO库(如Boost.Asio、std::experimental::net等)来实现异步网络编程。
- 使用异步IO时,可以将IO操作和回调函数绑定,当IO操作完成时,回调函数会被调用以处理结果。
请解释一下HTTP协议和HTTPS协议的区别,并描述HTTPS的加密过程。
- HTTP协议
- 是明文传输的协议,数据在网络上传输时不加密。
- HTTPS协议是HTTP协议的安全版本,通过使用SSL/TLS加密技术对数据进行加密传输。
- HTTPS的加密过程包括:
- 客户端向服务器发送HTTPS请求。
- 服务器返回证书,包含公钥和相关信息。
- 客户端验证证书的合法性,生成随机的对称密钥。
- 客户端使用服务器的公钥加密对称密钥,并发送给服务器。
- 服务器使用私钥解密收到的对称密钥。
- 客户端和服务器使用对称密钥进行加密通信。
什么是Web服务(Web Service)?在C++中,如何实现基于RESTful的Web服务?
- Web服务是一种通过网络进行通信的应用程序,使用标准的HTTP协议进行交互。
- 在C++中,可以使用库(如cpprestsdk、Poco等)来实现基于RESTful的Web服务。
- 实现基于RESTful的Web服务的基本步骤包括:定义资源、选择HTTP方法、处理HTTP请求、生成HTTP响应。
如何处理网络编程中的并发访问和线程安全性?请描述一些常见的线程同步和互斥机制。
- 并发访问和线程安全性可以通过以下常见的线程同步和互斥机制来处理:
- 互斥锁(Mutex):用于保护共享资源,同一时间只允许一个线程访问。
- 条件变量(Condition Variable):用于线程间的通信和同步,允许线程等待特定的条件。
- 信号量(Semaphore):用于限制同时访问共享资源的线程数量。
- 读写锁(Reader-Writer Lock):允许多个线程同时读取共享资源,但只允许一个线程进行写操作。
- 原子操作(Atomic Operations):提供原子性操作,保证操作的不可分割性,避免竞态条件。
- 条件变量和互斥锁的组合(Condition Variable with Mutex):用于实现更复杂的同步和等待机制。
C++基础
- C语言和C++的区别与联系
- struct和class的区别与联系
- extern "C"的作用
- 函数重载和覆盖的区别与联系
- 如何理解多态,运行多态的原理
- 如何理解虚函数机制,单继承、多继承、虚继承条件下虚函数表的结构
- 如果虚函数是有效的,那为什么不把所有函数设为虚函数
- 构造函数、析构函数能否是虚函数
- 纯虚函数使用场景及作用
- 介绍RAII
- 类的大小怎么计算
- volatile关键字的作用
- 实现一个线程池
- 强制类型转换的原理及使用
- 指针和引用的区别与联系及使用情况
- new和malloc的区别与联系
- malloc的内存是否能用delete释放
- new[ ]和delete[ ]必须配对使用吗
C++11新特性你都了解多少?
- 谈谈auto和decltype
- 谈谈左值和右值及其引用
- 移动语义和完美转发是什么
- 列表初始化是什么
- function、bind、lambda的使用场景
- 谈谈C++11的mutex和RAII lock
- C++11的智能指针是什么,能否独立实现一个智能指针
- enum 和 enum class的区别与联系
- 内存泄漏的出现场景及解决措施
- unique_ptr如何转换所有权
- 谈谈对面向对象的理解
- 继承方式及组合方式的使用场景
STL系列
- C++直接使用数组与std::array的利弊,std::array的实现原理
- std::vector和 clear 的特点及实,resize和reserve的区别
- deque的底层数据结构及内部实现原理
- map和unordered_map的区别及使用场景
- list的使用场景
- std::find能否传入list对应的迭代器
- string的常用函数
C语言
- 谈谈对const的理解
- char*、const char*、char* const、const char* const的区别
- 指针常量和常量指针的区别
- static的作用及使用场景
- 全局变量与局部变量的区别
- 宏定义的作用
- 内存对齐的概念及存在必要性
- inline 内联函数的特点及缺点
- 如何用C 实现 C++ 的面向对象特性(封装、继承、多态)
- 如何实现memcpy效率提升
- typedef和define的区别
- extern和 extern C的作用
- 如何避免野指针
- 计算结构体长度
- sizeof和strlen的区别
- 条件变量为什么要和锁配合使用
设计模式
- 饿汉线程、懒汉线程安全的单例模式
- 观察者模式类关系和优点
- 代理模式类关系和优点
- 工厂模式概念和优点
- 构造者模式概念
- 适配器模式概念
操作系统
- 进程和线程的区别
- 操作系统如何进行进程管理
- 操作系统如何实现进程阻塞
- 进程之间的通信方式
- 上下文切换是什么,操作系统如何实现上下文切换
- 线程的实现原理
- 线程之间私有和共享的资源
- 一般应用程序内存空间的堆和栈的区别
- 进程虚拟空间的布局
- 虚拟内存如何映射到物理内存,分页内存管理是什么
- 产生死锁的必要条件,如何避免死锁
- 大端字节、小端字节是什么,如何转换字节序
- 信号和信号量的区别
- 锁的性能开销,锁的实现原理
编译原理
- gcc hello.c 命令具体的执行过程,执行中内部究了什么
- 程序必须从main函数开始运行吗
- 如何确定某个函数有被编译输出
- 动态链接库和静态链接库的区别