应届生面试所需技术基础

技术基础(偏软件)

以下的内容描述了技术基础的几个方面,以及在这些方面,如何才能算是“基础扎实

语言基础

语言的种类极多,不一一列举了。就语言本身而言,只是个工具而已,并不重要,不过它作为开发手段,承载了很多软件开发的思想。比如垃圾回收 机制、面向对象、异常处理机制等等,这些思想,在很多语言中都有体现,建议同学们对此做些了解。因为我只对C/C++比较熟悉,各大公司在招聘时候也比较 喜欢考C/C++的东西,所以就此多说几句吧,如果能够做到以下几点,说明对C/C++掌握的比较扎实:
了解static extern typedef这几个关键字的含义以及用法,知道堆、栈的含义,知道malloc free的实现原理,知道struct union的内存对齐规则,知道大端模式和小端模式的区别,了解libC中常用的函数,了解面向对象机制,知道多态的实现方法(virtual function的实现机制),知道深浅拷贝的区别,了解STL中的至少两种容器的实现方式,了解STL中迭代器的实现机制,会使用placement new,知道引用的实现方法。
面试中有可能会被要求现场写一段代码,通常是C代码,以下的函数经常用来考察写代码的能力:strcpy strcmpstr系列函数,memcpy memcpymem系列函数,单向链表转置、二叉树遍历等等。

最后说说代码量的问题,代码量是衡量语言熟练程度的重要指标之一,我记得google有一篇非正式宣传稿里称招收的员工在校园里都有至少10万行的代码 量,当然,能够达到这一标准的,只是少数牛牛。这里建议各位有时间统计一下自己的代码量,有些面试官会对这个感兴趣的,千万不要在被问到的时候再做统计。

数据结构

数据结构是基础中的基础,据不完全统计,笔试题中数据结构的内容是最多的。
数据结构应当了解以下的内容:
基本的:单向链表、双向链表、hash表、队列、栈、二叉树、堆的实现方式以及应用场景,以及在这些数据结构上的常用操作,比如链表的排序、堆的建立、二叉树的遍历,对hash表,要至少两种以上的实现方式和冲突检测策略。
高级一些的:cache的实现方法,动态hash的方法,红黑树、B树、线段树,以及线程安全的数据结构(单向链表、队列、hash表)。

算法

首先是排序算法,这是考察频率最高的,对各种排序算法要了然于胸,例如:冒泡、插入、希尔、快速、堆、归并,要做到一口气报出来不会打结,对时间复杂度、空间复杂度要对答如流,对快速排序要特别清楚,包括算法实现、复杂度计算方法。
高级一些的:对外部排序要有了解,知道外部排序的实现方式和复杂度计算方法,了解基数排序、桶排序的实现方法以及复杂度。
其余的是一些常用算法,比如贪心、动态规划、搜索、图论、计算几何等等,在这些方面都应该有所了解,不用非常深入,但对于课堂上讲过的常用算法都应该了解。
最后是给研究生的一些建议,很多同学在研究生期间钻研某个特定领域,对于其他方面不太关注,造成基础比较薄弱,一个实际情况是,很多研究生如果去参加本科 的数据结构考试是通不过的。也许你对某个专业的确非常了解,但往往面试官并不了解,而且他们关心的,也不是这个专业相关的内容,于是面试的时候面试官会问 一些基础性的知识,在这种情况下,可能你的表现还不如本科生。所以,建议研究生同学们在找工作之前补一补功课,夯实基础总是没有坏处的。

计算机网络。

不可否认,现在IT民工中最风光的就是这帮网络民工了,起薪高、创业机会多、还常常批量生产百万富翁(不过也很不牢靠,比如去年杭州就损失了数千名百万富翁,万恶的次贷、万恶的华尔街、万恶的美帝!!!)。但不管怎么说,网络民工的起薪比起其他IT民工平均高不少是个不争的事实,所以对网络了解较多还是很有好处的。

下面是些具体的东西:

首先是网络模型,OSI的七层模型,不用说了,至少知道每层的名称以及主要工作。

其次是协议,TCP/IP协议是最常考察的,要了解TCP UDP的区别,TCP建立、断开连接的方式,TCP如何实现可靠传输(滑动窗口),IP地址的分类、分配方法。除此之外也需要了解路由协议,路由算法,二三层协议等等。

其三是局域网、广域网的构成方式、网络拓扑结构,整个internet的架构。

最后是网络编程方面的,最好了解一些套接字编程的方法,比如建立关闭连接、读写数据、超时控制等等,了解同步、异步模型,知道IO复用的方法,知道windows的完成端口机制。

以上说的是一些基本的要求,如果要应聘构建网络方面的职位(比如网络系统工程师之类),除此之外,最好再钻研一下那些比板砖还厚重的资料了(原谅我,我一直认为那些资料拿来防身最为合适-_-!

操作系统

一些原理性的东西:多任务实时操作系统的概念,任务调度的方法,虚拟地址映射到物理地址的方法等等,线程的实现原理与主要实现方法,资源分配的方法,如何解决资源冲突(银行家算法)。

具体一些的,windows系统方面,了解页面调度算法,如果可以知道一些驱动开发的方法会很有帮助。linux方面,了解linux内核(找一两本讲linux内核的书来看看),如果了解协议栈或者做过驱动开发会很有帮助。

以上这些通过看书或者资料就可以达到了解的目的。不过,如果应聘底层系统开发的职位,最好深入了解一下linux内核

计算机体系结构
一些基本的概念:CPU 内存 磁盘 总线 网卡等等,知道它们是如何协同工作组成一个完整的计算机系统的。对于CPU,需要知道寄存器、高速缓存的作用,最好可以了解一些汇编语言;对于内存,需要 了解内存管理单元的工作原理;对于磁盘,需要知道扇面、转速、寻道时间等概念;对于总线,要知道总线的作用。
一些综合性的东西,也是面试中可能出现的问题:
原子操作,一写经常被询问的面试题是:C中的i++是原子操作么?答案是否;C中的赋值语句是原子操作么?答案也是否,基本上C中的语句都不是原子操作, 记住。那么如何实现原子操作呢?很简单,使用现成的接口(linux提供了一套这样的接口,windows我不是很清楚,但也有),或者使用特殊的CPU 指令,或者使用锁(要注意效率问题)。
性能优化:如何优化一段程序的执行效率,方法有很多,比如取消互斥操作,使用高效的指令,提高CPU的高速cache效率等等;如何提高磁盘的读写效率,方法也很多,合理的使用cache,将磁盘数据组织在一起连续读取,将随机写转变为并发写等等。

数据库编译原理

编译原理在面试中考察的比较少,因为理论性太强,面试官本人也未必掌握的很好,呵呵。不过了解一些基础概念还是很好的,比如动态语言和静态语言的概念,函数式语言的概念,编译器工作的基本步骤等等。不过有一个问题可能会被考察:实现一个简单的词法分析器,其实就是一个简单的状态机,这个问题还可以顺便考察一下代码

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值