“生死六重门”
无论你是在职,非在职,高级工程师,工程师,架构师,如果你正在面试阶段,请看完此文!
相信这篇文章对你的职业生涯和阶值观会造成重大的改变!
如果你是一名PM或者是管理者正在物色合适的开发人选,那么我相信这篇文章同样会在在你考虑如何挑选技术型人材上给你带来重大的帮助。
本系列不适合想去应聘PM,管理路线的人士!!!
作为一名技术型人材由其是程序员,用什么可以恒量自己是否合格或者我们怎么去恒量一个程序员是否质深、是否合格?
比如说:他可以适合一般的软件工程师岗位,还是适合高级工程师岗位,还是架构师、系统分析员这样的岗位呢?
作为一名JAVA开发人员来说,JAVA涉及到的面太广了,我们就拿企业级开发人员即J2EE开发人员的基本功来说事吧!
在面试前先问自己5个问题:
1. 我想要什么
2. 我会什么
3. 目前的市场需要什么
4. 目前我还缺什么
5. 如何去补缺
一个J2EE高级开发人员需要具备些什么技能?
或许你会说:我会SSH,我会工作流,我会JQuery, ExtJS,我参加过数个大型项目,我带过5,6个人的队,我有SCJP, SCEA证书,我工作经验达5年。
我会告诉你,其实你是Nothing,Nothing!!!
我这个Nothing的前提是指好的公司,好的项目组招人时的要求!!为什么这么说?
这样告诉你吧,越是好的公司,越是好的项目组在招开发人员时他们面的东西越是底层。
本人结合以前在公司负责JAVA开发人员的招聘与策划,和对新进JAVA人员的培训经验即自己本身近10年来50多次的面试经历总结,发觉:
越是工作年限长的人,技术越是倒退
尤其到了3年,5年,7年的工作经验的高级开发工程师群体们,往往发现自己在择业上碰到了一个瓶劲,上不上去,跳槽时工资能涨个1000,2000已经到顶了,几乎不太可能达到他们本身期望的的30%-50%的涨幅。这些原因主要源自于”基础”。
大部分人基础全忘了,或者以前做过几年程序,但是后面转向管理,TL等角色后,平时开发的时间下降到只占到本身工作的30-50%这样的量了;
或者有很多一批人,或者由于工作、项目等其它的原因,没有接触过一些正规的,系统化的知识;
或者平时不善于总结,只求我用技术时就google, copy & paste,忘记了代码基本功了;
您别不信,来,我们就来试一下
不许查网络,你现在就处在面试官面前,面试官问你这么一个问题:
面试官: 你有没有平时自己覆写过hashcode, equals两个方法?
回答:我写过的(可能很多人以前用的是eclipse或者是myeclipse里的×××
面试官:怎么写?
回答 :。。。。。。(大致讲出来什么原理)
面试官:你为什么要覆写hashcode & equals方法
回答:(如果准备过的人能够回答的出这个问题)
面试官:如果说两个对象equals它们的hashcode是否一定相同?如果两个对象的hascode相同它们一定equals吗?
回答:70%以上的人会挂在这个问题上
面试官:你知道在写hashcode时为什么要使用一个31这样的数,我用100,11,17是不是一样呢?有什么不一样的地方呢?
首先我们来了解一下hashcode,什么是hashcode?有什么作用?
hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象!
我们在使用容器来存储数据的时候会计算一串散列码,然后将数据放入容器。
如:String s =“java”,那么计算机会先计算散列码,然后放入相应的数组中,数组的索引就是从散列吗计算来的,然后再装入数组里的容器里,如List.这就相当于把你要存的数据分成了几个大的部分,然后每个部分存了很多值, 你查询的时候先查大的部分,再在大的部分里面查小的,这样就比先行查询要快很多!
一个对象的HashCode就是一个简单的Hash算法的实现,虽然它和那些真正的复杂的!Hash算法相比还不能叫真正的算法,但如何实现它,不仅仅是程序员的编程水平问题, 而是关系到你的对象在存取时性能的非常重要的问题.有可能,不同HashCode可能 会使你的对象存取产生成百上千倍的性能差别!
java String在打印这个类型的实例对象的时候总是显示为下面的形式
test.Test$tt@c17164
上面test.Test是类名$tt是我自己写的内部类,而@后面这一段是什么呢?他其实就是tt这个实例类的hashcode是的16进制!
它使用了Object 里面的toString()方法
return getClass().getName() + “@” + Integer.toHexString(hashCode());
继续看看java里 String hashcode的源码:
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
其实上面的实现也就是数学里:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
的实现!我们会注意那个狗血的31这个系数为什么总是在里面乘来乘去?为什么不适用32或者其他数字?
大家都知道,计算机的乘法涉及到移位计算。当一个数乘以2时,就直接拿该数左移一位即可!选择31原因是因为31是一个素数!
所谓素数:
质数又称素数
。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
素数在使用的时候有一个作用就是如果我用一个数字来乘以这个素数,那么最终的出来的结果只能被素数本身和被乘数还有1来整除!如:我们选择素数3来做系数,那么3*n只能被3和n或者1来整除,我们可以很容易的通过3n来计算出这个n来。这应该也是一个原因!
在存储数据计算hash地址的时候,我们希望尽量减少有同样的hash地址,所谓“冲突”。如果使用相同hash地址的数据过多,那么这些数据所组成的
hash链就更长,从而降低了查询效率!所以在选择系数的时候要选择尽量长的系数并且让乘法尽量不要溢出的系数,因为如果计算出来的hash地址越大,所
谓的“冲突”就越少,查找起来效率也会提高。
31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化,使用31的原因可能是为了更好的分配hash地址,并且31只占用5bits!
在java乘法中如果数字相乘过大会导致溢出的问题,从而导致数据的丢失.
而31则是素数(质数)而且不是很长的数字,最终它被选择为相乘的系数的原因不过与此!
到此为之,基本都挂了(如果在没有网络的情况下)
你看到这边或许会说:come one,有eclipse代码生成器,这个没必要。
OK,我们再来:
面试官:Oracle中的index有bitmap, btree两种索引,请比较它们
回答:70-80说自己Oracle用了3,4年的人首先就不知道这个bitmap和btree是什么,更无从谈起比较了
以上两道问题,可以作为一个面试官判断你是否在一直写代码和是否真正熟悉oracle的标准,可能因为这两道题,你就挂了,面试官不愿意再和你谈下去了。
真的,这两道问题其实基础了不能再基础了,就和你不会1+1=2一样,你说“我熟练掌握四则运算”是一个道理。
记住,越是好的公司,越是好的项目,面试的问题就越是底层,IBM, eBay, HP, 百度,MS,1号店,阿里巴巴,Oracle,starcite等都是这样。
一般,一个高级JAVA开发人员的面试,其实是分成3个部分
一、基础考核
二、J2EE相关知识和框架以及J2EE相关性能调优等的考核
三、综合考核,即给你1-2个CASE,让你说说你的设计和想法
其中,最难过的就是这个基础。
这个基础中,其实再可以分为四个部分的考核:
第一部分:笔试,45-60分钟笔试卷,基本都是多选
第二部分:SQL部分,一般是数据库基础,SQL统计函数等的写法是肯定逃不掉的
第三部分:然后是1-2道的问答类也可以是设计模式方面的题
第四部分:放入一道智力题(ebay, Oracle, MS, 百度)很喜欢干这种勾当
有的公司也会把这四部分都放在笔试题里,有的则会加上多线程,算法变成6道问答直接让面试者在面试时给面试者一些白纸,然后就此一问一答。
像一些外资类公司,会加入一道"电话面试“关,一般在30分钟,过了电话面试再去他们公司本部,然后就是3轮的f2f的面试,最后再和主管谈,HR谈,一般6轮面试是需要的。
这边请记住,这6轮面试9成的可能性都是全英语面试。。。。。。
很多搞IT的,首先英语本身没有重视,有的不能够很好的交流,基础又丢了不少,那基本这样的面试都会被挂,这也是为什么有些人总觉得这些大公司怎么怎么好,怎么怎么难进!其实不然,掌握了技窍,要通过这样的面试,易入反掌,因为你发觉吗,一般人都是伤在基础部分的面试,这关过了基本后面都很好过的,所以我们把基础部分4个部分的面试,即:
JAVA基础+SQL+设计模式+2EE+算法+智力题,总结成”6道题“,别看看这些都是基础,如果真的让你处在面试官面前时,你不能查GOOGLE,没有eclipse,相信90%的人都会挂掉。
这”6道题“其实就是考核一个高级开发人员是否真正适合高级开发人员岗位的标准,也是一个真正做技术的人必须要具备的能力,没有了这个基础,你的一切,你的工作经验,你的简历再漂亮,也都是浮云。
有些人会说,我能达这6个部分的50%左右的能力,有些人能达到70%,那有些面试官就会觉得:这个人我可以用了,只是招进来后砍砍价吧。
试问,你愿意被人砍价吗?对吧,被人砍掉2-3K,你不疯了,如果你工资本身就4,50万被砍个2,3K也无所谓,大部分人都是5K冲8K,更多的是8K冲13,15或者是12,15想冲20k的人,那么,我告诉你,你就必须,对,是必须这”6道题“至少,这边看清了哦,是至少能够回答到90%,如果是英语面试你还要准备全英语面试哦!!!
那么,我们说为什么一个企业要这么去考核一个开发人员呢?
首先,对于企业来说,招一个高级开发人员,是不容易的,中国人,做什么都喜欢一哄面起,96年房地产发展时,短短1,2年内到处都是房地产公司,设计所,设计公司,CAD盛行一时。
2000年初,IT开始盛行,这个更猛,到处都是IT公司,都是IT人员,学个IT就高档了,学个IT就高技术了,搞得连在6层楼居民住宅中租个2室户也能开个IT公司了。
从业人数一庞大,就造成了鱼龙混杂,层次参差不齐。
于是SSH满天飞,大有
“练好STRUTS,HIBERNATE,SPRING,货卖帝王家”的感觉,嘿嘿,你别不喜爱看,现在的市场还真TMD的是这个样。
但是,事实摆在那边,你要想进一个好的公司,要被一个好的项目组,你的工作想要有价值,可以学到真正知识、煅练到能力的项目、TEAM中去,你就得过这6道关,所以,无论你觉得现在如何,或者觉得不爱看我写的这些或者觉得“我这样挺好呗”,但你就是不能否认这6道关是摆在那边的,它是你提高一个层次的拦路虎,不打掉它,你永远上升不了。
啊。。。或许这就是许多人到了后来选择走管理的道路的原因吧,这也或许是中国的IT至所以还停留在初级阶段的原因吧,唉。。。中国式的一夜暴富梦想充斥着搞IT人们的头脑,建筑在沙滩上的城堡总有一天会倒塌。。。。。。
come on MAN!! 又来了,老套了,不好意思,发发牢骚。
下面我们就要讲如何来过这六道关,一道道我们来过,任何一个以技术为终生目标的开发人员,这些基础,其实不是通过看了我这篇文章,您临终抱一下佛脚就可以抱得出的,我告诉你,抱不出的,就算你死记硬背了我在这系列文章中提到的近百道例题,你如果不是真正把它们做为你一直需要修练的基本功的话你到头来还是要露馅的。
这就和我上面用1+1=2都不知道何谈四则运算是一个道理,这就和练武功一样,奇材很少,所有人都是从练马步开始的。
下面我们将慢慢来谈“面经”。
我这一阵超忙,小孩小照顾起来不易,工作上又是做的研发,没有时间概念,如果更新不及时,还往大家抱歉!
转载于:https://blog.51cto.com/longx/1351697