Huawei ODオンラインテスト+技術面接の完全体験:問題練習からオファーまでの全プロセス振り返り

技術面接著者: BeautyResume チーム

2年経験Java開発者のHuawei OD面接完全振り返り。オンラインテスト3問、技術1次・2次、HR面接の実際の問題を網羅。Java基礎、Spring、MySQL、アルゴリズム等の問題まとめと対策アドバイス付き

背景紹介

まず私の状況から説明します。Java開発2年の経験で、現在は従業員50人未満の小さな会社でエンタープライズSaaSシステムの開発に携わっています。技術スタックはSpring Boot + MyBatis-Plus + MySQL + Redis + RabbitMQです。正直なところ、小さな会社での生活はかなり快適ですが、技術的な成長には限界があり、プロジェクトもあまりチャレンジングではありません。ずっと大きなプラットフォームに移りたいと思っていました。

今年の3月、大学の同級生がHuawei ODで半年ほど働いていると教えてくれました。ODは正社員ではないものの、業務内容、技術スタック、プロジェクトは正社員と基本的に同じで、正社員への転換機会もあり、中途採用よりもハードルが低いとのことでした。以前はODに対する偏見があり、単なる外注だと思っていました。しかし調べてみると、ODはHuawei独自の外注システムであり、第三者の外注とは全く異なり、オフィス環境も技術研修も正社員と共有していることが分かりました。

3月15日、Huaweiの採用サイトに履歴書を提出し、Cloud BUのJava開発ポジションを選択しました。提出後、オンラインテストの通知を受け取るまで1週間以上待ちました。その間、履歴書が通らなかったのかと思っていました。後で分かったことですが、ODの履歴書審査は比較的遅く、Huawei社員の推薦またはチャネル審査の通過が必要です。

オンラインテストの前、約2週間かけて問題を練習しました。主にNowcoderのHuawei OD問題バンクを使用し、LeetCodeも少しやりました。正直なところ、アルゴリズムの基礎は普通で、大学のデータ構造はギリギリ合格、仕事後はアルゴリズム問題をほとんど書いていませんでした。そのため、この2週間は毎晩退社後に3〜4問、週末に8〜10問を練習し、簡単な文字列と配列の問題から始め、徐々に中程度の難易度のDFSとBFSの問題に移行しました。

オンラインテスト(3問、150分)

テストは3月28日土曜日の午後2時から、Huawei独自のオンラインテストプラットフォームを使用しました。試験前には監視ソフトをインストールする必要があり、ウェブカメラで全行程を録画し、デスクトップの切り替えも禁止されていました。150分で3問、満点600点。一般的に150点以上で合格ですが、部門によって要件が異なり、Cloud BUは200点以上必要と言われています。

最終的に350点を獲得しました。第1問は100点満点、第2問は200点満点、第3問は50点のみ(一部のテストケースが通過せず)。各問題について詳しく説明します。

第1問(100点、簡単):文字列圧縮

問題説明:小文字で構成される文字列が与えられ、以下の規則で圧縮してください。連続して繰り返される文字は「文字+繰り返し回数」で表し、繰り返し回数が1の場合は省略します。例えば、"aaabbc"は"a3b2c"に、"abc"は"abc"に圧縮されます。

この問題は比較的簡単でした。ダブルポインタのアプローチを使用し、1つのポインタで文字列を走査しながら、もう1つのポインタで現在の連続文字の開始位置を記録しました。異なる文字に遭遇した時点で連続長を計算し、結果を結合します。約5分で書き終え、全テストケースを一発で通過しました。

第2問(200点、中程度):会議室スケジューリング

問題説明:N個の会議があり、各会議には開始時刻と終了時刻があります。すべての会議をスケジュールするために必要な最小の会議室数を求めてください。ただし、同じ会議室では会議時間が重複してはなりません。

この問題は本質的に古典的な最大重複区間問題です。私のアプローチ:すべての時点をソートし、開始時刻は+1、終了時刻は-1とし、ソート後の時点を走査しながらカウンターを累積し、最大値が必要な会議室数になります。ソリューションを書いた後、テストケースを実行し、1つの境界ケースを処理していないことを発見しました — 1つの会議が終了し、同時に別の会議が開始する場合、終了を先に処理する必要があります。ソートルールを調整し、終了時刻を開始時刻の前に配置するよう変更して通過しました。この問題には約25分かかりました。

第3問(300点、難しい):都市連通の最小コスト

問題説明:N個の都市とM本の道路があり、各道路は2つの都市を接続し、建設コストがあります。一部の道路はすでに建設済み(コスト0)です。すべての都市を連通させるための最小コストを求めてください。すべての都市を連通できない場合は-1を返してください。

この問題を見た瞬間、最小全域木問題であり、Kruskal法+Union-Findを使うべきだと分かりました。しかし問題は、Union-Findの実装に慣れていなかったことで、パス圧縮の部分でしばらく詰まってしまいました。最終的に書き上げましたが、一部のテストケースしか通過しませんでした。Union-Findのマージ操作にバグがあったのではないかと疑いましたが、デバッグする時間が足りませんでした。この問題は50点のみ獲得しました。

テスト終了後、第3問を解けなかったので不合格になるのではないかと不安でした。しかし4月2日に合格通知を受け取り、面接に進めることになりました。後で知ったことですが、350点はODオンラインテストでは平均以上の成績とのことです。

第1ラウンド 技術面接1回目(ビデオ面接、約60分)

1回目の面接は4月8日水曜日の午前10時から、HuaweiのWeLinkビデオ会議を使用しました。面接官は30歳くらいの男性で、Cloud BUのエンジニアとして6年間働いていると自己紹介しました。まず自己紹介を求められ、その後技術的な質問に入りました。

1. Javaの==とequalsの違いは何ですか?

==は参照アドレスを比較し、equalsは内容を比較すると説明しました。プリミティブ型では==が値を比較し、参照型では==がアドレスを比較します。Objectのequalsはデフォルトで==と同じ動作ですが、Stringはequalsをオーバーライドして文字ごとに比較します。面接官がIntegerキャッシュプールの範囲についてフォローアップし、-128から127までと答え、それを超えると新しいオブジェクトが作成されると説明しました。

2. HashMapとHashtableの違いは何ですか?

いくつかの違いを挙げました:HashMapはスレッドセーフではなく、Hashtableはスレッドセーフ(メソッドにsynchronized使用);HashMapはnullキーとnull値を許可するが、Hashtableは許可しない;HashMapのデフォルト容量は16、Hashtableは11;HashMapは赤黒木でリンクリストを最適化するが、Hashtableはしない。面接官がConcurrentHashMapのスレッドセーフの仕組みについてフォローアップし、JDK 1.7ではSegmentベースのセグメントロック、1.8ではCAS + synchronizedでヘッドノードをロックすると説明しました。

3. Springの@Autowiredと@Resourceの違いは何ですか?

@AutowiredはSpringのアノテーションで型による注入、@ResourceはJDKのアノテーションで名前による注入だと説明しました。@Autowiredは@Qualifierと組み合わせて名前による注入が可能で、@Resourceのname属性でBean名を指定できます。面接官が@Autowiredの注入方法についてフォローアップし、フィールド注入、コンストラクタ注入、Setter注入の3つを挙げ、不変で循環依存を検出できるコンストラクタ注入を推奨すると述べました。

4. Spring Bootの起動プロセスを説明してください

mainメソッドから説明を始めました:SpringApplicationオブジェクトの作成、アプリケーションタイプの推論(Servlet/Reactive)、ApplicationContextInitializerとApplicationListenerの読み込み、runメソッドの実行、ApplicationContextの作成、コンテナのリフレッシュ(Bean定義の読み込み、自動設定、Beanの作成)、CommandLineRunnerの実行。面接官はフォローアップせず、「まあまあ理解していますね」と言いました。

5. MySQLのインデックスが効かなくなるシナリオは何ですか?

一般的なものをいくつか挙げました:1)インデックス列での関数や演算の使用;2)暗黙の型変換、例えばvarchar列をintで検索;3)ワイルドカードで始まるLIKE;4)OR条件でインデックスのない列が含まれる;5)複合インデックスが最左前方一致原則を満たさない;6)IS NULLとIS NOT NULLが特定のケースで効かなくなる。面接官が複合インデックス(a,b,c)でb=1を検索する場合インデックスが使えるかフォローアップし、最左前方一致原則を満たさないため使えないと答えました。

6. Redisのデータ型とそれぞれのユースケースは?

5つの基本型を説明しました:Stringはキャッシュとカウンター、Hashはオブジェクトの保存、Listはメッセージキューと最新リスト、Setは重複排除と積集合・和集合演算、ZSetはランキングと遅延キュー。面接官がZSetの基盤実装についてフォローアップし、圧縮リストとスキップリストで、要素が少ない場合は圧縮リスト、多くなるとスキップリストに転換すると説明しました。

7. プロジェクトでRabbitMQをどのように使用していますか?なぜKafkaではないのですか?

非同期通知と遅延メッセージにRabbitMQを使用していると説明しました。選定理由は、プロジェクトのメッセージ量が多くなく、RabbitMQの管理UIが使いやすく、複数のエクスチェンジタイプで柔軟なルーティングが可能だからです。Kafkaは大容量のログシナリオに適しています。面接官がRabbitMQでメッセージの損失を防ぐ方法についてフォローアップし、プロデューサー確認機能、メッセージの永続化、コンシューマーの手動ACKを説明しました。

8. アルゴリズム:リンクリストの反転(LeetCode 206)

この問題は練習済みでした。3つのポインタ(prev、curr、next)を使う反復法で5分で書き終えました。面接官が再帰でも書くよう求め、それも書きました。面接官は「基礎問題は問題ありません」と言いました。

面接1回目のまとめ

1回目の面接は全体的に基礎重視で、Java基礎とSpringが多く、MySQLとRedisはそれぞれ1問ずつでした。アルゴリズム問題は簡単で、リンクリストの反転は必須練習問題です。面接官の態度は良く、答えられないところではヒントをくれました。4月11日に2回目の面接通知を受け取りました。間隔は3日でした。

第2ラウンド 技術面接2回目(ビデオ面接、約65分)

2回目の面接は4月15日水曜日の午後3時から。面接官は1回目よりレベルが高く、「技術の話をしましょう」と切り出し、自己紹介の時間はありませんでした。

1. JVMのガベージコレクションアルゴリズムとそれぞれの長所・短所は?

マーク・スイープ(シンプルだがメモリ断片化が発生)、マーク・コピー(断片化なしだがスペースの無駄、新生代に適している)、マーク・コンパクト(断片化なしだが効率が低い、旧世代に適している)を説明しました。面接官がG1コレクターの特徴についてフォローアップし、G1はヒープを等サイズのRegionに分割し、最も利益のあるRegionを回収する優先度リストを維持し、停止時間を予測可能にすると説明しました。さらにG1がいつFull GCをトリガーするかについて、並行マーク段階で回収速度が割り当て速度に追いつかないことが判明した場合、Serial Oldに退化してFull GCを行うと答えました。

2. volatileキーワードの役割と原理は?

2つの役割を説明しました:可視性の保証(変更後すぐにメインメモリにフラッシュ)と命令の並べ替えの禁止。メカニズムはメモリバリアによるものです — 書き込み前にStoreStoreバリア、書き込み後にStoreLoadバリア、読み取り前にLoadLoadバリア、読み取り後にLoadStoreバリアを挿入します。面接官がvolatileで原子性を保証できるかフォローアップし、できないと答え、i++の例を挙げてAtomicIntegerやsynchronizedが必要だと説明しました。

3. SynchronizedとReentrantLockの違いは?

いくつかの違いを挙げました:SynchronizedはJVMレベル、ReentrantLockはAPIレベル;Synchronizedはロックを自動的に解放するが、ReentrantLockは手動でunlockが必要;ReentrantLockはフェアロック、割り込み可能ロック、複数の条件変数をサポート;Synchronizedはロックのエスカレーション(バイアスロック→軽量ロック→重量ロック)をサポート。面接官がどのような場面でReentrantLockが良いかフォローアップし、フェアロックが必要な場合、tryLockでロックの取得を試みたい場合、複数の待ちキューが必要な場合にReentrantLockを使うと答えました。

4. Springのトランザクション伝播動作には何がありますか?

7つを挙げました:REQUIRED(デフォルト、既存トランザクションに参加、なければ新規作成)、REQUIRES_NEW(常に新規作成、現在のトランザクションを一時停止)、NESTED(ネストされたトランザクション)、SUPPORTS(あれば参加、なければ非トランザクション実行)、NOT_SUPPORTED(非トランザクション実行、現在のトランザクションを一時停止)、MANDATORY(トランザクション内でなければ例外スロー)、NEVER(トランザクション内であってはならない、例外スロー)。面接官がREQUIREDとREQUIRES_NEWの違いについてフォローアップし、REQUIRES_NEWは独立したトランザクションで、外側のロールバックが内側に影響せず、内側のロールバックも外側に影響しないと説明しました。

5. MySQLのスロークエリをどう最適化しますか?

いくつかのステップを説明しました:1)EXPLAINで実行計画を確認し、type、key、rows、Extraフィールドに注目;2)インデックスが使われているか確認し、使われていなければインデックスを追加またはSQLを書き直し;3)SELECT *を避け、必要な列のみ検索;4)大きなテーブルではOFFSETの代わりにカーソルベースのページネーションを検討;5)非常に大量のデータの場合はシャーディングを検討。面接官がEXPLAINのtypeフィールドの値についてフォローアップし、良い順にsystem > const > eq_ref > ref > range > index > ALLと答えました。

6. プロジェクトで遭遇した本番環境の問題と、そのトラブルシューティング方法は?

実際のケースを共有しました:デプロイ後、APIのレスポンスが遅くなり、P99が200msから2sに上昇。トラブルシューティングのプロセス:1)監視を確認し、データベースクエリが遅いことを発見;2)スロークエリログを確認し、フルテーブルスキャンが発生しているSQLを発見;3)EXPLAINでインデックスが効いていないことを確認、原因は新しいクエリ条件での暗黙の型変換;4)SQLのパラメータ型を修正して正常に復旧。面接官がこの種の問題の予防方法についてフォローアップし、コードレビューでのSQLチェック、デプロイ前のEXPLAIN検証、スロークエリアラートを挙げました。

7. アルゴリズム:二分木のレベル順走査(LeetCode 102)

キューを使ったBFSで実装し、各レベルのノード数を記録してレベルごとに出力しました。この問題は練習済みで、8分で書き終えました。面接官がDFSでどうやるかフォローアップし、深さパラメータを持つ再帰で、深さごとに結果をグループ化すると説明しました。

面接2回目のまとめ

2回目の面接は1回目より明らかに深く、JVMと並行処理の質問がより詳細でした。Springのトランザクション伝播では少し詰まり、NESTEDとREQUIRES_NEWの違いを最初はうまく説明できず、面接官のヒントで整理できました。本番環境のトラブルシューティングの質問は実際の経験に基づいていたので、うまく答えられました。4月18日にHR面接の通知を受け取りました。間隔は3日でした。

第3ラウンド HR面接(約30分)

HR面接は4月22日水曜日の午前11時から。面接官はCloud BUのHRで、声が優しく、全体的にリラックスした雰囲気でした。

1. 自己紹介

職務経歴、技術スタック、Huawei ODに入りたい理由を簡単に説明しました。

2. なぜ他社ではなくHuawei ODを選んだのですか?

3つの理由を挙げました:Huaweiの大きな技術プラットフォームで、エンタープライズクラウドサービスの実際のシナリオに触れられる;ODには正社員への転換機会があり、長期的なキャリアの保障がある;友人がODで働いていて良い体験をしており、推薦してくれた。

3. ODと正社員の違いを理解していますか?

ODはHuaweiの外注システムで、Adeccoと契約を結びますが、業務内容、オフィス環境、技術研修は正社員と同じだと説明しました。主な違いは報酬構造、ストックオプション、正社員への転換チャネルにあります。

4. 給与の希望はどのくらいですか?

希望月給の範囲を伝えました。HRはオンラインテストのスコアと面接のパフォーマンスに基づいてレベルを決定し、約1週間で結果を出すと言いました。

5. 残業は受け入れられますか?

プロジェクトが切迫している時の残業は受け入れられるが、形式的な残業ではなく生産的な残業であってほしいと答えました。HRは笑いながら、Huaweiは確かに忙しいが、Cloud BUの全体的なペースは管理可能だと述べました。

6. 何か質問はありますか?

2つの質問をしました:ODから正社員への転換率はどのくらいですか?HRは毎年評価があり、優秀な成績の人にはチャンスがあると答えました。チームの技術文化はどうですか?HRはチームで毎週技術共有会があり、学習を奨励していると答えました。

面接問題まとめ

  1. ==とequalsの違い — Java基礎 — 簡単
  2. HashMapとHashtableの違い — Java基礎 — 中程度
  3. @Autowiredと@Resourceの違い — Spring — 簡単
  4. Spring Boot起動プロセス — Spring — 中程度
  5. MySQLインデックスが効かなくなるシナリオ — MySQL — 中程度
  6. Redisデータ型とユースケース — Redis — 簡単
  7. RabbitMQの使用とメッセージ信頼性 — ミドルウェア — 中程度
  8. リンクリストの反転 — アルゴリズム — 簡単
  9. JVMガベージコレクションアルゴリズム — JVM — 難しい
  10. volatileキーワードの役割と原理 — Java並行処理 — 中程度
  11. SynchronizedとReentrantLockの違い — Java並行処理 — 中程度
  12. Springトランザクション伝播 — Spring — 難しい
  13. MySQLスロークエリ最適化 — MySQL — 中程度
  14. 本番環境トラブルシューティング経験 — プロジェクト経験 — 中程度
  15. 二分木のレベル順走査 — アルゴリズム — 簡単
  16. 文字列圧縮 — オンラインテスト — 簡単
  17. 会議室スケジューリング — オンラインテスト — 中程度
  18. 都市連通の最小コスト — オンラインテスト — 難しい

気づきとアドバイス

1. オンラインテストは最初の関門です。真剣に準備しましょう:Huawei ODのオンラインテストは150点で合格ですが、部門によって要件が異なります。Cloud BUや2012ラボなどのコア部門では200点以上が必要な場合があります。NowcoderのOD問題バンクを練習し、文字列処理、ソート、DFS/BFS、動的プログラミングに重点を置くことをお勧めします。Java、Python、C++が使用可能で、最も慣れている言語を選べば大丈夫です。

2. 技術面接は基礎重視で、マニアックな問題は出ません:Huawei ODの面接の難易度は、AlibabaやByteDanceより1ランク下です。Java基礎、Spring、MySQL、Redisという主要な技術スタックをマスターすれば十分です。アルゴリズム問題も中程度の難易度で、ハードな問題は出ません。しかし基礎は確実にする必要があります — HashMapの基盤実装やSpringトランザクション伝播などを表面的に知っているだけでは不十分です。

3. プロジェクト経験を明確に説明でき、本番環境のトラブルシューティング経験があると理想的です:面接官は実際に問題を解決できる能力を重視しており、暗記した回答だけでは不十分です。プロジェクトの技術選定、課題、最適化プロセスを整理することをお勧めします。特に本番環境のトラブルシューティングは、面接官が非常に興味を持つリアルな経験です。

4. ODはゴールではなく、スタートラインです:多くの人がODに対する偏見を持ち、外注は劣っていると考えがちです。しかし、ODはHuaweiエコシステムへの入り口として確かに機能しています。業務内容は正社員と基本的に同じで、技術的な成長も悪くありません。現在、小さな会社にいるなら、ODは良い足がかりになります。

最終結果:4月28日にオファーを受け取り、D2レベルに分類されました。提出からオファーまで合計44日間でした。給与は前職から約40%増加し、全体的に満足しています。

FAQ

Q:Huawei ODのオンラインテストは何点で合格しますか?
A:一般的に150点以上で合格ですが、コア部門(Cloud BU、2012ラボなど)では200点以上が必要な場合があります。テストは満点600点で、3問がそれぞれ100点、200点、300点です。

Q:Huawei ODの面接は何ラウンドありますか?
A:一般的に3ラウンドです:オンラインテスト + 技術面接1回目 + 技術面接2回目 + HR面接。一部の部門では技術面接が1回のみの場合もあります。詳細は部門によります。

Q:ODから正社員への転換は難しいですか?
A:転換には一定の条件を満たす必要があります:一定期間の勤務(通常1〜2年)、パフォーマンス基準の達成、転換審査の通過です。転換率は部門によって異なりますが、優秀な成績を収めていればチャンスがあります。

Q:ODと正社員の待遇差はどのくらいですか?
A:基本給の差はそれほど大きくありません。主な違いはストックオプション、年終ボーナス、福利厚生にあります。ODにはストックがなく、年終ボーナスは通常1〜2ヶ月分ですが、正社員は3〜6ヶ月分の可能性があります。

Q:Huawei ODの面接経験は役に立ちますか?
A:ODの面接経験は今後の転職に非常に役立ちます。面接内容は大手の中途採用と大きく重なるためです。Java基礎、Spring、MySQL、Redis、アルゴリズムはどの会社でも避けられません。また、ODでの勤務経験は履歴書にも一定の価値があります。

関連テンプレート

#Huawei OD#Java Interview#Written Test# Algorithms#面试 Real Questions