2017年の目標のひとつとして掲げていた「OCJP SE8 Gold」という資格の取得があります。
昨日はこの資格を取得するためにオラクル認定Javaプログラマの試験を受験してきました。
オラクルの試験は昨年10月に受験したオラクルマスターBronze DBA 12cの試験以来、久々です。
会場は名古屋にしたんですがゴールデンウィークのシーズンということもあり、いつもよりも混んでいて動き辛いこと・・・。
幸いなことは天気が快晴で清々しい気分で受験できたことかな。
Goldの前提資格であるSE8 Silverは昨年の8月に取得し、今回に至るまでに半年以上も過ぎてしまいました。
本当は1月末までに受ける予定だったのですが、他の資格試験の勉強などでもたつきましたね。
念願のJava SE8 Goldの試験に合格
遂に念願の「OCJP SE8 Gold」を取得しましたよ!
試験後に速攻で帰宅し自室のパソコンを立ち上げ、合否結果を見て大いに喜びました!
「絶対に一発合格する」という気持ちが強かったので、合格したのを知った時非常に嬉しかったです。
正答率は82%と余裕の合格ではありますが、正直なところ試験中は不安だらけで、Silver試験とは比にならない難易度で焦っていました。
オラクルの試験は合否結果がすぐに確認できるのが嬉しいところ。他の資格試験なんて1ヶ月以上結果待ちなんて当たり前ですしね。
ただ帰宅するまでは合否結果が見れないのでその間は心臓バクバクで精神的にきつい。
私の場合、ガラケーを愛用しているので出先ではインターネットに接続ができません。
万一、不合格だった場合、再受験に高い受験料を払わなくてはならなく相当のプレッシャー。そんなことを考えている道中は本当にきつい。
早く帰宅して試験結果確認したい、という気持ちでいっぱいでした。
ともあれ無事に「Oracle Java SE8 Gold」を取得することに成功しました。
SE8 Goldの試験を受験してみて
ここからは私が受験した「1Z0-809:Java SE 8 Programmer II」の試験について書いていこうと思います。
まずこの試験は前提である「1Z0-807:Java SE 8 Programmer I」に合格している必要があります。
(つまりはJava SE8 Silver取得者であることが前提です。)
なのでOracle Java SE8 Goldを取得する条件は上記の2つの試験に合格しなくてはなりません。
試験の難易度
さて試験の難易度ですが一言で「そこそこ難しい」というのが感想です。
まず前提資格であるSE8 Silverで学習した内容は試験で当たり前のように出題されます。
それに併せてJava SE8の新機能であるラムダ式とストリームAPIなどが当然のように多数出題されるのでJavaの概念と進出部分の基礎が頭に入っていないと合格するのは難しいと思います。
もし学生時代に受験していたとしたら理解が追い付かない内容ばかりのもので、実務経験を少しでも持っていないとイメージがつかめない分野ですね。
私は学生時代からJavaに触れており、社会人になってからは2年ほど実務経験ありますが、正直他のエンジニアの方と比べれば経験は薄いでしょう。
それでも独学でJDBCやStruts2などのフレームワークに触れて開発は並みにはできるくらいには成長しました。
その状態での感想が「難しい」なので、実務経験が少しでもないと意味不明な試験かと思いますね・・・。
というのもこの試験の意図はコーディングができるというよりはJavaの概念を深く理解し高度な設計・開発ができる技術者を証明するものなので当然のことと言えば当然ではあります。
「デザインパターン」と聞いてピンと来ない人は受験するのは危ないかもしれません。
合格者の体験レポートが少ない?
確か昨年の12月頃かな。
いざSE8 Goldの試験勉強をしようと思い勉強方法などの情報取集をするも、合格体験の記事をあまり見かけませんでした・・・。
SE7 Gold取得者のUpgrade試験の記事は見かけたりはしますが、
前提資格であるSE8 SilverからのSE8 Goldの試験についての記事がほとんどありませんでした。
肝心の参考書・問題集の種類も少なく、購入者のレビューも決して納得のいけるほどの内容ではない、とありどのように学習を進めていけばいいのかわかりませんでした。
このまま時間だけが過ぎても無駄だからとりあえずSE8 Goldの関連書籍を数冊購入しました。
簡単にですが、SE8 Gold取得までの流れを書いていこうと思いますので、これから受験される方は是非参考にしていただけるとありがとうです。
Silver試験で正答率が90%台で合格できた人なら十分合格を狙えると思います。
試験勉強に使った参考書
とりあえずJava SE8 Goldの取得に向けて購入した書籍は4冊。
画像にある書籍はメインで使った2冊になります。
正直なところこの2冊の内容と問題を熟知すれば本番試験で合格は狙えると思います。
とりあえず購入した書籍4冊の特徴を載せておきますね。
書籍 | 特徴 | ||
---|---|---|---|
| 紹介する書籍の中では発売時期が一番新しいです。 問題の傾向は「SE8の新機能」が中心となっており、試験範囲の内容の理解をするにはピッタリの1冊でした。 SE8の内容に特化している印象に見受けられました。 書籍の質は悪くないですがこの1冊では正直不安かな、と。Gold入門にはおすすめです。 | ||
| 実力アップには欠かせない一冊がこの紫本。 SE7の仕様からの変更も踏まえた問題も整っており非常にバランスの取れた問題集です。個人差あるかもしれませんが黒本と比べると学習スピードが落ちる感じがします。 試験範囲の大幅な理解を求めるならこの1冊がおすすめです。 | ||
| SE7から8への変更点の理解を深めようとSE7の紫本も一応購入。 ラムダ式やストリームAPIなどの問題は当然含まれていません。 これまでのJava従来の仕様の演習問題がたっぷり詰まっているので、新機能以外の範囲の学習には重宝しました。 ただ注意点としてはやりこみ過ぎるとSE8との変更点と混同してしまうため、試験中に誤ってSE7の仕様で問題を読解し失点してしまうことだけは避けたい。 | ||
| 本場、米オラクル社が出版している試験対策の教科書。 全部英語表記なので英語が得意な人でないと読み進めるのは難しいです。 評判によると試験対策には非常に優れているらしいとのこと。 私は面白半分で購入しただけで今回の試験には使いませんでした。 英語の学習の一環としていつかは読書に挑戦するつもりであるが・・・。 |
の内、上位3冊を用いて試験勉強に臨みました。
反復練習が合格への道しるべ
オラクルの試験に限った話ではないですが試験勉強で一番大切なのは「反復練習」です。
反復練習ほど心強いものはないと思うほど重要な要素の一つ。
今回の試験ではまず解説を読まず、いきなり演習問題を時、少しでも行き詰ったら初めて解説を読んで理解を深めるという流れで進めました。
というのもだらだら長い解説を読んでいても、最初はよくても最後の方になると最初の方に読んだ内容って忘れてしまったりしませんか?
結局長い時間かけてやっても忘れてしまっては意味がありません。
なのでわかるわからない関係なく最初はひたすら問題演習に取り組むのがおすすめです。
ちなみに学習した書籍は
- 「SE8黒本」→「SE7紫本」→「SE8紫本」の順で進めました。
- SE8黒本は約4周、SE7紫本は約2周、SE8紫本は約4周。
- 最後にSE8の書籍だけ何回も相互に学習。
のように使いました。
SE7の書籍を用いる人は気を付けて
例えばインナークラスの問題。インナークラス内で使用するインナークラス外のメンバ変数及び、引数はSE7ではfinal修飾子を付けていましたが、SE8では自動でfinalされる為、記述が不要になりました。
本試験に出題された内容で「上記のソースコードでコンパイルが成功するように修正する選択肢を選べ」という問題で、選択肢に「final修飾子を付与する必要がある」とありました。
SE7ではつまり1.7のJavaコンパイラでの問題としては正解ですが、SE8では不正解となってしまいます。
SE8と7では仕様が大きく異なる箇所もいくつかありましたので、そういった違いに気付けるようにしたいですね。
答えの丸暗記は超危険
問題集を取り組んでいるとやってしまいがちな過ちとして「答えの丸暗記」がありますね。
用語や意味を覚えるには暗記は重要ですが、計算問題やコーディングの読解問題ではむしろ危険です。
学生時代に痛い目を見た方もいるのではないでしょうか?
例えば数学の試験勉強で丸暗記をしたがために計算方法が分からず何もできなかったという苦い経験。
特に書籍を何周も演習問題に取り組んでいると、問題文を読まなくても解答が分かってくるようになってしまうと思います。
時間がなかったり、焦っていたりするとよく問題を読まずに答えを導き出して覚えた気になるという一番やってはいけない学習スタイルに無意識のうちにシフトすることもあります。
そのまま学習を進めていざ試験に挑むと何もできなくなってしまうことも・・・。
なのでもし問題の解答を覚えてしまった時の為の学習方法として、
「何が正解で何が不正解なのかをしっかり説明できる」くらい理解を深める勉強になるようにすることを目標とします。
そうすれば問題を暗記してしまっても内容を深く理解することができるようになりますよね。
試験対策セミナーの受講はおすすめ
オラクル主催で「東京の青山一丁目」を会場に試験対策の要点解説セミナーを不定期で開催しています。
遠隔地の方は現地に行かなくてもパソコンを通してオンラインセミナーに参加することもできます。
私は受験までに3回受講しておきました。
まず最初に「Java SE 8 ラムダ式&Stream API 入門 セミナー」という初心者用のセミナーで新機能の概要が学べました。
次に「Oracle Certified Java Programmer Gold SE 8試験対策ポイント解説セミナー」というGold試験に向けた本格的なセミナーに2回受講しました。
1回目は昨年の8月にSilver試験合格後に受けました。
2回目は受験日1週間前に試験勉強のモチベーションアップの為に受けました。
セミナーを受講して良かったこと
- SE8の新機能の理解を深めることができる
- 書籍には載っていない情報(講師の生の声)が聞ける
- 試験問題とほぼ同じ問題が例題で登場することもある
書籍読破前と読破後に1回ずつ受講するのがおすすめでした。
試験対策の重要ポイントを聞けるのは当たり前ですが、文章ではなく直接講師の方が丁寧に説明してくれますので安心して学習できます。
恐らく講師の方も受験さえているんだと思います。
各所各所で試験の問題傾向や学習の進め方などのヒントを口頭で語られることもあるのでメモをしておくと良いでしょう。
ただオンラインセミナーで受講する場合、講師の方に質問することができず音声を聞くだけになってしまうので、質問したい方は余裕がれば現地の会場に向かうことをおすすめします。
セミナーは平日の定時後くらいに開催さえるので、社会人の方ですと半休やフレックスなどを取得しないと受講が厳しいところが難点かな(私は普通にフレックス使っていましたけど)。
説明資料はPDFで後日ダウンロードすることができますので、試験勉強時に併せて使えば効果倍増です。
再受験キャンペーンを利用しよう
オラクルの資格試験を何回か受験している方は知っていると思います。
年に1,2回くらい開催される「再受験無料キャンペーン」というものがありますよね。
期間中に試験に受験して万一不合格でも、その後1回だけは受験料が無料になるありがたい制度。
「オラクル試験の受験料が高くてなかなか受ける気にならない」「一発で合格する自信がない」など不安な人方は再受験キャンペーンを利用すると良いと思います。
私は一度も使ったことがないですが、試験申込時に認証コードを入力するだけで適用できるみたいです。
本当に不安な方は1回目を偵察回にしてしまい、問題の傾向を抑えてから2回目で合格を狙うというスタイルで挑むこともできます。
ただ受験する以上は一発で合格したいですよね~!
試験内容とポイント
試験名 | 1Z0-809:Java SE 8 Programmer II |
試験時間 | 150分 |
出題数 | 85問 |
合格ライン | 正答率65%以上 |
以下に記載することは私が今回受験して感じた内容とポイントのメモ書きです。
①高度なクラス設計
前提資格であるJava SE8 Silverの試験で出題されたクラス設計の範囲は当然のように出題されていました。
なのでこの辺りの基本設計の構造や概念を理解していないと詰みます。何も見ずにSE8 Silver試験がいつでも満点近い点数で合格できるくらいの実力はあった方がいいです。
- メソッドのオーバーライド時のスロー句の正しい記述。
- アクセス修飾子の適切な記述。
- カプセル化を実現するコード。
- 「is-aの関係」「has-aの関係」を理解できていますか。
- デザインパターン。主にシングルトンについて。
②コネクションとジェネリクス
Javaの基礎となるコネクションとジェネリクスに関する問題は3~4割くらい出題されました。
後述のラムダ式とストリームAPIとも深く関連性があるので熟知しておく必要があります。
- よく出題されるインターフェースとしてList、Map、Setがある。
- Listは要素番号でデータを管理でき、実装クラスにArrayList、LinkedList。などがある。
- Mapはキーと値をペアにデータを管理でき、実装クラスにHashMap、TreeMapなどがある。
- Setは重複を認めず一意なデータを管理でき、実装クラスにHashSet、TreeSetなどがある。
- TreeMapやTreeSetではオブジェクトが自然ソートされ、その際Comparable型に暗黙的に型変換されている。
実装クラスに対してcompareToメソッドが定義されていない場合はコンパイルエラーとなる(ClassCastException)。
但し、Comparetorオブジェクトをインスタンス時に指定している場合はOK。 - それに加えてDequeue、Stackなどあるので違いがわかるようにしておきます。
- 基本的にこれらはスレッドセーフになっておらずスレッドの並行処理に対応できません。
- ジェネリクスはSE6時代から導入されたもので、データ型の保証を行ないプログラムの安全性を高める目的。
実装する際は型に対してTなど変数のようなものを指定します。 - Tは実体がないため、new T()、T.classなどはコンパイルエラーとなる。
- 後述のラムダ式とストリームAPIと併用した問題もチラホラ出題されます。
③ラムダ式とストリームAPI
本試験の主役とも言えるJava SE8の新機能。
オンラインセミナー受講時に講師から聞いた試験問題の半数が「ラムダ式とストリームAPI」という情報も噂通りでたくさん出題されました。
ほとんどの問題がこのラムダ式とストリームAPIを基礎に派生した問題でした。
- ラムダ式の記述はアロー演算子(->)で表現します。
引数を()で囲み、戻り値がある場合はreturnさせます。引数の型やreturn文は省略できる場合もあります。
ラムダ式は関数型インターフェースとセットで用いるものです。 - 関数型インターフェースの定義は抽象メソッドが一つ。なしや複数は対象外。
- 関数型インターフェースの基本系として「Function」「Predicate」「Supplier」「Consumer」。
- これに合わせて引数戻り値が同じのUnaryOperator、引数が複数のパターンであるBiFunction、BiConsumerなど。
- 中間操作は遅延評価され、終端操作時に処理される。
また戻り値はストリームオブジェクトが返却されます。 - 終端操作はストリームにつき一つ。同一ストリームの再利用は不可能。よく出るのはforEachメソッド。
- その他覚えておきたいメソッドはmap、reduce、limit、distinct、sortedなど。
複数のリストを一つに集約するflatmap、コンソール出力などに用いる出力peekメソッドにも注意。
④例外処理
例外処理の実装とアサーションについて理解があれば内容自体は簡単です。
本試験では例外処理はそこそこ、アサーションは2,3問出題されました。
- 例外処理はtry、catch、finallyブロックによる例外の制御問題。
- multi-catchブロックには継承関係の例外クラスの親と子を両方記述しない。
- アサーションはassertという構文で実装し条件式がtrue出ない場合にAssertionErrorを返します。
- アサーション有効は-eaオプションを付与、無効は-daとする。
- AssertionErrorは例外ではなくエラーなので例外処理は不可能。
⑤日付と時刻API
JavaのDateクラスの扱いが難しく、簡略化するため高機能な時刻APIがSE8から導入されました。
慣れればそれほど難しい内容ではありませんので、理解を深めておくことをおすすめします。
試験では1割未満出題された気がします。
全体的に5~6問くらい時刻APIの問題が出題されたと思います。
- 日付オブジェクトとしてLocaleDate、日時オブジェクトとしてLocaleDateTimeインターフェースがある。
- 尚いずれも不変クラスであるため、date = LocaleDate.plusYear(10);のように指定しないと値が変わらない。
- タイムゾーン(時差)情報を含むオブジェクトとしてZonedDateTimeインターフェースがある。
- 日時オブジェクトから日付オブジェクトにパースは可能だが、逆は実行時エラーとなる(DateTimeException)。
- また、LocaleDate.of(2017, Month.MAY, 32)など存在しない日付を指定した場合も実行時エラー。
- Month(月) DateOfWeek(曜日)の列挙型Enumはセットで覚えておく。
- Instantオブジェクトを返すのはInstant.now()、ZonedDateTime.toInstant()、Instant.ofEpochMilli(long epochMilli)。
- Periodオブジェクトは日付に対しての情報、Durationは時刻に対しての情報を格納する。
- DateTimeFormatterの使い方はマスターしておこう。
⑥入出力とNIO.2
全体の1~2割ほどは普通に出題されるほど重要な範囲です。
上記で紹介してきた内容との複合問題が多く、細かく書くとキリがないので覚えている範囲で箇条書きにしています。
- try-with-resources文による自動クローズ処理(実装クラスにはAutoClosableインターフェース)。
tryに記述したクローズ対象のインスタンスは複数ある場合、後ろからクローズされる。 - FileInputStream、FileOutputStreamはファイルの入力ストリームオブジェクト。
- BufferedReader、BufferedWritterはファイルの行単位の入出力ストリームオブジェクト。
- PrintWritterはプリミティブ型を扱うオブジェクト。
- シリアライズとデシリアライズの処理の仕組み(実装クラスにはSerializableインターフェース)。
trasientとstaticはシリアライズ対象外になります。 - System.inはInputStreamクラスを、System.outとSystem.errはPrintStremクラスを返却。
- Paths、Files、FileSystemsによるファイルやディレクトリの制御処理。
Pathsのnormalize、resolve、relativiseはかなり出題されるまでのしっかりと理解しておく。 - BasicAttributeのサブインターフェースとしてUnix系のPosixAttribute、Windows系のDosAttributeがある。
いずれもファイルなどの属性値の取得に利用します。 - File.linesによるファイルの行単位のストリームオブジェクトの扱い方。
- File.copyはコピー元、コピー先を引数で指定し、コピー先にファイルもしくはディレクトリが存在する場合は例外がスローされる。
- walkによるディレクトリ配下のファイル操作も1問くらい出るので注意。
⑦スレッドと並行性
恐らくGoldの出題範囲の中でも一番理解しづらい内容が並行処理。
個人的にも苦手で実務経験があってもWEBアプリが主体だった私にとってはあまり馴染みがないんですよね。
なんとなくは分かっていても結局はフレームワーク本体がコンテナで自動的にスレッド管理してくれていたので、わざわざ自主的にスレッド処理を実装するということもなかったわけで・・・。
試験では1割程度?か数問出題されたと思います。
実務経験がないとかなり厳しい内容だと思いますし、Silverからの難易度の差が歴然で苦戦が予想されます。
ExecuteService関連の問題は5問くらい出題されたはずです。
- 主に出題されたのが複数のスレッド処理に対する実行結果を選ぶ問題。
- syncronized修飾子による同期処理化。
- RunableとCallableの違い、ExecuteServiceの使い方など。
- CycleBarierによるタスクの待機処理と同期処理の制御。
- ForkJoinによるマルチコアの制御処理。
- AtomicIntegerによる同期処理用のクラスオブジェクト。
- スレッドセーフがサポートされたコレクションオブジェクト。
CopyOnWriteArrayList、ConcurrentMapなど。
⑧JDBC
様々なデータベースエンジンに対して各種メーカーが提供しているJDBCドライバを用いることでJavaでは簡単にデータベースへのコネクション、クエリ発行を実現できます。
JDBCではその設計と仕組み、使い方を問われる問題です。
- JDBCドライバとは何かを覚えておく。
- JDBC 3.0の場合はドライバ読み込み時にClass.forNameを指定してクラスオブジェクトをロード。(よく出る問題)
セミナーの資料にもなぜか太字赤字になっているので要注意。
JDBC 4.0ではドライバの自動ロードで指定する必要がなくなりました。 - チェック例外として「SQLExceptuon」。
- executeはboolean型を返し、ResultSetオブジェクトが返却できる場合のみtrueとなる。
DELETE文は処理に成功してもfalseが返却される。 - executeQueryはReseletSetオブジェクトが返却されselectの結果やレコード更新などに利用。
行の取得にはnextやabsoluteなどを指定すること。 - executeUpdateは主にINSERT、UPDATE、DELETEなどのDML文に用いる。
戻り値はint型でクエリにより反映された行が返却される。 - カーソル位置は開始行前の「0」、取得行の行番号(例:1~10)、終了行の後ろ「-1」で表現。
- スクロールとカーソルのオプションに注意。
試験ではCURSOR_UPDATABLEとTYOE_SCROLL_INSENSITIVEの組み合わせで出題されました。 - 行の更新はupdateRowなどの記述がないと反映されません。
⑨ローカライズとフォーマット
ロケールとリソースバンドルについて押さえておけば正直点取り問題です。
実務経験があればかなり簡単な内容なので理解しやすいと思います。
- ListResourceBundleはこのクラスを継承したクラスにgetContentsメソッドを定義します。
戻り値をObject [][]とする。 - PropetyResourceBundle プロパティファイルから
- getProperyで置き換え 第2引数に指定することで
- プロパティファイルが見つからない場合はMissingResourceExceptionがスローされる
- 言語・地域情報など管理するロケールクラスとリソースファイルの読み込みについての問題です。
- classとproperties 読み込まれる優先順位にも注意。
Java合格者限定のオリジナルTシャツを入手
あとはおまけで今回Java SE8 Goldを取得したということで「オリジナルJava Tシャツ」が貰えます。
こちらのキャンペーンは期間内にJava資格取得者にオリジナルのJava Tシャツがプレゼントされるという企画なんですが、本当は2016年12月31日まででした。
ところが人気なくて在庫抱えているのか、よくはわからないんだけど2017年3月末までに延長され、先日には5月末までに、とキャンペーンの延長が2回も行なわれています。
おかげさまでJava SE8 Silver取得時に1枚と、今回のJava SE8 Gold取得によってもう1枚入手でき、晴れて2枚目になります。
既に持っているTシャツは調子に乗って申し込み時に「Lサイズ」を頼んでしまい、とんでもない大きさが届きました・・・。
よくよく考えればアメリカンサイズなので、日本のLサイズとは違うのに気が付けたはずなのに、うっかりしていました。
今回は着れるサイズをということで、Sサイズを申し込みました。
たぶん6月末頃には自宅に届くのではないかなと思っています。楽しみですね~!
長々と書いてきましたがJava SE8 Goldの試験の受験レポートは以上です!