Javaのインタビューについて話をするビューのインタビュアーの視点に立って「コントロール(IOC)の反転」、

先週、私は、3〜5年間で集中的ないくつかのJavaバックエンドの仕事の経験のために候補者をインタビューしました。私の標準は本当に複雑ではありません。最初は働くことができる、第二のJava基盤が優れている、そして第三は、分散フレームワークの一部に精通していることが、私は他の企業がジュニアの開発者を募集する場合、この標準は輝く表面であるべきと考えています。

また、私は知っている多くの候補者の能力に実際には悪くないが、準備ができていないか、そのような人が実際に仕事にチームの後の期待に達するかもしれないが、それは面接に合格していないかもしれないが、インタビュアーは常に、インタビューの中で言っていませんのみ面接の状況に基づいて判断します。

しかし、現実には、ほとんどの人は、おそらく面接前の準備、または方法が扱われてはならない準備していなかった、です。あなたは私たちが通常のアルゴリズム、データ構造の数が多いと接触することはできませんが、ビジネス上のより多くの仕事、知っている、基礎となるコードなどのインタビューは言い換えれば、面接の準備のマッチポイントで、疑問点を聞いてきますし、通常の主なポイントは非常に小さいです。

インタビュアーとして、私は唯一の候補者が答えるインタビューの結果に応じて決定することができます。しかし、自分の利便性を容易にする人々と、そう、この記事では、私は一般的な問題の数によって面接のスキルを準備して紹介します。

我々は間違いなくため息の後になります。正しいアプローチはあまりいないと、最初のインタビューのために二回目を調製することは困難ではありません。

1つのフレームがキーですが、あなただけの人が他のコテージの誰かのコードを感じさせません

面接の前に、私はプロジェクトの経験、プロジェクトの候補の一部の導入の枠組みの中で候補者を見るために履歴書を読みますが、私は候補者の経験のための最近の枠組みに焦点を当て、より人気がSSMです。

しかし、候補者は、通常、5年間で働き、それらのほとんどは、唯一の「コテージ」他人のコードすることができ、それは、プロセス、新しい機能モジュールの拡張を書くために他の人によると、既存のフレームワークの基礎となり得ます。

例えば、機能モジュールの保留中の株式を書くために、バックアップして、データベースに、スーツは、コード関連の機能を取り除くためのポイントまで、再び書き込み従うことを、フロント、既存の注文プロセスを模倣します。

実際には、私たちのそれぞれがとてもオーバーですが、インタビューで、あなただけのような能力を示した場合、ほとんどの人は少なく、同じレベル、および、この時点であなたの利点を反映できなくなります。

私たちは、あなたがSSMフレームワークをしたい場合は、ほとんどのプロジェクトは、痛みのポイントがあることを知っています。たとえば、データベースのパフォーマンスが悪い、またはサービスモジュールは、ジャンプのニーズを満たすことができないコントローラでのSpring MVCを使用してより高い同時実行複雑です。

だから私は、通常は尋ねるためのイニシアチブをとるでしょう:あなたは、既存のフレームワークに従う場合を除きビジネスコードを書くのですが、また、変更内容をやって?

私は答えを聞いたことがあります:

  • 増加Redisのキャッシュは、頻繁に同じデータの一部を呼ばないようにするには

  • またはMyBitas条件ISNULL、すなわち値はパラメータが渡されたときに、これは、ISNULLのないクエリの増加が声明を避けるだろう、条件が増加している中、XML、select文ときはnull、全表スキャンを実行します。

  • それとも単にその、大量のデータは、バックエンドの非同期から長い時間が返され、私はプロジェクトの最大時間非同期リターンでアップになります

  • または伝送性能を向上させるために、情報圧縮処理を返すために作られました。


さらに言えば、私は、私が唯一の論理的な答えと一致しない文字を気にどのような答えを聞くために気にしません。

限り一般的な答えとして、私はそうでない場合、私は唯一の「与えるだけフレームワーク自体について多くを知るために、プロジェクトマネージャーのリーダーシップの下フレームワークのコードを書くことができ、「一定の理解があり、フレームワークレベルでの独自の経験を持っている」与えます。 "


実際には、面接の準備のために、彼が主なポイントのフレームワークは難しいことではありません、私はその蓄積されたプロジェクトのすべてを行う際に、限り、あなたはそれを言うと、この点であなたは競争の約7%をロールアップしている、と言うことができるしていないとは思わないまとめ人。

2単にいくつかの適切な理解が分散し、フレームワークのスタンドアロンバージョンを見てはいけません

また、あなたには、いくつかの分散技術と、再び、技術の枠組みの中でプロジェクトを記述する最高インチ 私は、分散技術のいくつかを列挙されているの下には、我々は準備することができます。


Javaのインタビューについて話をするビューのインタビュアーの視点に立って「コントロール(IOC)の反転」、




  1. 逆に作用するようにスティッキーセッションを設定する方法、Luaの言語でルールを設定する方法として、基本的な設定nginxの。もしそうなら、そのようなプロトコル、クラスタセット、フェイルオーバーなどの基礎となるのnginxの一部を見てみましょう。

  2. リモートコールダボの側面は、ダボ下の下のトランスポートプロトコルとシリアル化を理解するためにダボ飼育係と知識の統合、そして深いステップを見ることができます。

  3. メッセージキューの態様は、簡単な構成で、ワークグループの設定、その後さらにポイントを見てもよいルックカフカまたは任意のアセンブリポイントを使用することができ、クラスタはカフカ、永続的な方法を見て、メッセージを送信することは長いことができ接続または短い傍受。


これらは一例として、わずか3構成要素であり、我々はまた、Redisのキャッシュ、ログフレーム、myCatサブライブラリサブテーブルなどを見ることができます。

二つのカテゴリーの準備への道:

  • 最初は、設定ファイルは、機能モジュールに組み込むことができて、これは、比較的簡単で、使用する方法と言うことです

  • 第二是可以适当读些底层代码,以此了解下协议,集群和失效转移之类的高级知识点。


如果能在面试中侃侃而谈分布式组件的底层,那么得到的评价就会比较好了,比如“深入了解框架底层”,或“框架经验丰富”,这样就算去面试架构师也行了,更何况是高级开发。

3 数据库方面,别就知道增删改查,得了解性能优化

在实际项目里,大多数程序员用到的可能仅仅是增删改查,当我们用Mybatis时,这个情况更普遍。

不过如果你面试时也这样表现,估计你的能力就和其它竞争者差不多了。

这方面,你可以准备如下的技能。

  1. SQL高级方面,比如group by, having,左连接,子查询(带in),行转列等高级用法。

  2. 建表方面,你可以考虑下,你项目是用三范式还是反范式,理由是什么?

  3. 尤其是优化,你可以准备下如何通过执行计划查看SQL语句改进点的方式,或者其它能改善SQL性能的方式(比如建索引等)。

  4. 如果你感觉有能力,还可以准备些MySQL集群,MyCAT分库分表的技能。比如通过LVS+Keepalived实现MySQL负载均衡,MyCAT的配置方式。同样,如果可以,也看些相关的底层代码。


哪怕你在前三点表现一般,那么至少也能超越将近一般的候选人,尤其当你在SQL优化方面表现非常好,那么你在面试高级开发时,数据库层面一定是达标的

如果你连第四点也回答非常好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的级别。

4 Java核心方面,围绕数据结构和性能优化准备面试题

Java核心这块,网上的面试题很多,不过在此之外,大家还应当着重关注集合(即数据结构)和多线程并发这两块

在此基础上,大家可以准备些设计模式和虚拟机的说辞。

下面列些我一般会问的部分问题:

  1. String a = "123"; String b = "123"; a==b的结果是什么?这包含了内存,String存储方式等诸多知识点。

  2. HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解HashMap(甚至ConcurrentHashMap)的底层实现。

  3. ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码。

  4. volatile关键字有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别。

  5. CompletableFuture,这个是JDK1.8里的新特性,通过它怎么实现多线程并发控制?

  6. JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存。

  7. Java的静态代理和动态代理有什么差别?最好结合底层代码来说。


通过上述的问题点,我其实不仅仅停留在“会用”级别,比如我不会问如何在ArrayList里放元素。

大家可以看到,上述问题包含了“多线程并发”,“JVM优化”,“数据结构对象底层代码”等细节

大家也可以举一反三,通过看一些高级知识,多准备些其它类似面试题。

我们知道,目前Java开发是以Web框架为主,那么为什么还要问Java核心知识点呢?我这个是有切身体会的。

之前在我团队里,我见过两个人,一个是就会干活,具体表现是会用Java核心基本的API,而且也没有深入了解的意愿,另一位平时专门会看些Java并发,虚拟机等的高级知识。

过了半年以后,后者的能力快速升级到高级开发,由于对JAVA核心知识点了解很透彻,所以看一些分布式组件的底层实现没什么大问题。

而前者,一直在重复劳动,能力也只一直停留在“会干活”的层面。

而在现实的面试中,如果不熟悉Java核心知识点,估计升高级开发都难,更别说是面试架构师级别的岗位了。

5 Linux方面,至少了解如何看日志排查问题

如果候选人能证明自己有“排查问题”和“解决问题”的能力,这绝对是个加分项,但怎么证明?

目前大多数的互联网项目,都是部署在Linux上,也就是说,日志都是在Linux,下面归纳些实际的Linux操作。

  1. 能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息。

  2. 能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的话,就用grep 关键字1 文件名 | 关键字2 --color。最后--color是高亮关键字。

  3. 能通过vi来编辑文件。

  4. 能通过chmod来设置文件的权限。


当然,还有更多更实用的Linux命令,但在实际面试过程中,不少候选人连一条linux命令也不知道。还是这句话,你哪怕知道些很基本的,也比一般人强了。

6 通读一段底层代码,作为加分项

如何证明自己对一个知识点非常了解?莫过于能通过底层代码来说明。我在和不少工作经验在5年之内的程序员沟通时,不少人认为这很难。

确实,如果要通过阅读底层代码了解分布式组件,那难度不小,但如果是如下部分的底层代码,并不难懂。

  1. ArrayList,LinkedList的底层代码里,包含着基于数组和链表的实现方式,如果大家能以此讲清楚扩容,“通过枚举器遍历“等方式,绝对能证明自己。

  2. HashMap直接对应着Hash表这个数据结构,在HashMap的底层代码里,包含着hashcode的put,get等的操作,甚至在ConcurrentHashMap里,还包含着Lock的逻辑。

  3. 我相信,如果大家在面试中,看看而言ConcurrentHashMap,再结合在纸上边说边画,那一定能征服面试官。

  4. 可以看下静态代理和动态代理的实现方式,再深入一下,可以看下Spring AOP里的实现代码。

  5. 或许Spirng IOC和MVC的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。


其实准备的底层代码未必要多,而且也不限于在哪个方面,比如集合里基于红黑树的TreeSet,基于NIO的开源框架,甚至分布式组件的Dubbo,都可以准备。

而且准备时未必要背出所有的底层(事实上很难做到),你只要能结合一些重要的类和方法,讲清楚思路即可(比如讲清楚HashMap如何通过hashCode快速定位)。

那么在面试时,如何找到个好机会说出你准备好的上述底层代码?

在面试时,总会被问到集合,Spring MVC框架等相关知识点,你在回答时,顺便说一句,我还了解这块的底层实现”,那么面试官一定会追问,那么你就可以说出来了。


不要小看这个对候选人的帮助,一旦你讲了,只要意思到位,那么最少能得到个“肯积极专业“的评价

如果描述很清楚,那么评价就会升级到“熟悉Java核心技能(或Spring MVC),且基本功扎实”。

要知道,面试中,很少有人能讲清楚底层代码,所以你抛出了这个话题,哪怕最后没达到预期效果,面试官也不会由此对你降低评价。

所以说,准备这块绝对是“有百利而无一害”的挣钱买卖。

7 一切的一切,把上述技能嵌入到你做过的项目里

在面试过程中,我经常会听到一些比较遗憾的回答,比如候选人对SQL优化技能讲得头头是道,但最后得知,这是他平时自学时掌握的,并没用在实际项目里。

当然这总比不说要好,所以我会写下“在平时自学过SQL优化技能”,但如果在项目里实践过,那么我就会写下“有实际数据库SQL优化的技能”。

我々は1つが、作業を指示することができ、1の理論に重点を置いている、2の違いを比較することができます。実際には、多くのシーン、私は、SQLの最適化は確かに実際のプロジェクトでスキルを練習していないとは思いません。

この場合、私はあなたが多くのハードワークを取った前にスキルやレトリックの多くを準備する(実際には、方向性を得るための方法は、彼らは多くの努力を取らない)、そして最後に、あなたが実際のプロジェクトを実施すべきであるということであるお伝えしたいと思います。

たとえば、あなたが、私はとても乾燥していたプロジェクトの前に1を取ることができ記述するには、Linuxのログにクエリキーワードトラブルシューティングの経験を持っていました。

ここでも、あなたはあなたが前にのみTreeSetのに適用されるシナリオがある場合、あなたは、項目の下に思い出すことができ、基本的なコードを見て、TreeSetのとHashSetのとその適用範囲の違いを理解できますか?

もしそうなら、あなたは適切にプロジェクトの下で需要を記述することができ、その後、言って、基礎となるコードを読み込むことで、私は2つの違いを理解し、実際の需要に、私はTreeSetのを使用しますが、私はまた、特別なコントラストを作りましたXX%よりHashSetのTreeSetの持つ高いようにテストしてました。

お金の価値が「理論的経験」よりも優れている、とあなたのほとんどは確かにあなたのプロジェクトで使用される理論的な経験、を知っている必要があり、「経験」を覚えておいてください。

あなただけ作るのであれば、面接はあなたが唯一の「理論的な経験」、それはあまりにも負けていると感じています。

8概要:インタビューの準備の方法についての詳細この記事

フェイスの質問は、この論文はあまりありませんが、この論文では、あまりにも多くのインタビューの質問を与えることを意図していません。この記事から、私たちは多くの痛みのポイント面接候補に発見されたのより多くを参照してください。

この記事の意図は、誰もが他の人の過ちを繰り返さないでくださいようにすることです、それはないですが、紙はまた、多くの与え面接を準備する方法を

あなたの他の人よりも、おそらく優れた能力がありますが、面接や他人のために同様の方法を準備し、またはプロジェクトで乾燥あなたを取った場合、何かのために生きていますが、実際に面接、その後、プロジェクト内のハイライトを要約していませんでした私たちはあなたを軽蔑するだろう。

「Javaのコア知識.PDFを終えた」、「カバーJVM、ロック、など高い同時実行、反射、春の原理、マイクロサービス、飼育係、データベース、データ構造、」だけでなく、Java208舗装質問(インタビューブックを共有します)答えをへのアクセスを解放するためにグループ(Javaはピットロードを埋める)659 655 594に参加します!

おすすめ

転載: blog.51cto.com/13399166/2416229