rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【ベンダー資格】Java SE 8 Programmer Ⅰ挑戦記

去る12月上旬の某日、Java SE 8 Programmer Ⅰを受験してきた。
ギリッギリだが、なんとか合格しました!

f:id:rmrmrmarmrmrm:20191216010926p:plain


 

はじめに

もともと受けてみたいベンダー試験の一つだったのだが、受けよう受けようと思いつつ重い腰が上がらず、この歳になるまで放ったらかしの状態だった。
あまり乗り気になれなかった理由の一つには間違いなく高額な受験料(¥26,600)があると思っており、これが情報処理試験レベル(¥5,700)ならもっと気軽に挑戦したのに、というのは間違いなく思うところである。
まあベンダー試験ってどこの資格試験も大体これくらいするけどね。。。
どこの企業だっていっぱい儲けてるんだから個人向けのサービスとしてはもっと安くすりゃいいのに、という気もするがな…特にオラクルなんてAllways Freeとかいってクラウド資産を無料配布するくらいなんだから試験くらいもっと安くしてもいいんじゃねえのとか(ry
そういやPHPはもう少し安いんだよね。
PHPに関してはにわか知識しかないので多分無理なんだが…受験料だけ見るとベンダー試験の中では魅力的である。

今まで10年以上JavaのWeb・業務アプリケーションに携わってきており、仕事においては、協力会社さんに頼む人が多い中、自分でPG改修や開発することが割とあったり(そっちの方が早く終わりそうだったからというのもあるが)、仕事を円滑に進めるためのちょっとしたツール作ったり、個人においても、Javaでちょっとしたツール作ったりとか、趣味プログラム組んだりとかしてたので、ぶっちゃけていうとJavaプログラムにはそこそこ自信があった。
テキストファイルやバイナリファイルを読み書きするプログラムや、特定のサイト等にHTTPリクエストするプログラム、OracleJDBCで接続してDML投げるプログラム程度なら一切ググらずに空で書けるし、実際書いても来た。
そうした背景もあったので、「まあ正直余裕っしょwww」とナメていたのは実際のところである。
しかし実際に試験勉強してみて、これは今振り返ると本当にナメてたなあと反省する。

ちなみに、個人的には、恥ずかしいことに言語仕様が1.6くらいの時代で止まっており、1.7以降に組み込まれた言語仕様をそもそも知らない。
このブログで紹介している記事にもちょこちょこ見受けられるが、個人的に1.6時代の知識でコーディングしてるのでイマイチコードが「古臭い」のである。
(さすがに慣れてきたが、未だに拡張for文より標準for文のほうが分かりやすいと思って芝うレベルの人間である)
ちなみに、1.4→1.5での変遷はリアルタイムで経験しており、その時にArrayList list = new ArrayList();とだけ書いてればOKだったやつが、ArrayList<Object> list = new ArrayList<Object>();と型指定しないと警告出るようになってて、それにぶち当たったとき、「なんだこの糞面倒くせえバージョンアップは…」とげんなりした(印象的で記憶に強く残っている)のだが、逆に言えばこのときはJavaの言語使用のバージョンアップを肌で感じており、時代の変わり目をちゃんと自分で経験していた(ちょうどそのころに1.4で動いていたシステムを1.5にバージョンアップする案件が走っていて、調査をしたのだ)
だがそれ以降、レガシーコードをそのままにしたがる保守的な会社の性格も相まって、1.6より先にはそもそもそうした経験に遭遇することがなく、どんどん時代から遅れていった。
風のうわさ(?)で1.8からラムダ式が導入されたとかなんとか聴いたような記憶があるが、あくまでその程度で、実際に試してみたりする場面はなかったし、自分から試す機会も減っていた。

というか、バージョンの話で言えば、最新では11の試験がリリースされているし、Oracle JDKとしての最新バージョンは執筆時点(2019年12月)で13だ。
1.8というバージョンは、最早レガシーになりつつある(というかもうとっくにレガシーか)。
早いとこProgrammer Ⅱを取らないと試験制度自体廃止になりそうな感じすらする。
11の試験(最新バージョンに近いほうの試験)がリリースされているにも関わらず、あえて1.8という昔の時代の試験を選択したのには、↑に書いたような背景があり、そもそも知識の前提が昔の言語仕様で止まっているので、11なんて挑んだところでダメに決まっている、という思考に基づいている。
この辺はナメてる割にはビビッて日和ったという情けなさ満載の挑戦で、今振り返ってもダセぇな…と思う…(すいませんでした)

Java Programmer Ⅰは「初心者向け(上級者の指示の元、単独でコーディングができる人)」という位置づけの試験である。
上述したような背景があるので
「いやJava10年選手の僕に初心者向けってwww馬鹿言っちゃいけませんよwwなんならいきなりGold(Programmer Ⅱ)からでもいいくらいなんですよwwまあGoldの受験資格がSilver(Programmer Ⅰ)取得してることっていうならwwwとりあえず受けてみてもいいですけどねwww結果は見えてますがwww」
って態度だったのが試験勉強を始めようとする手前の正直な心境だった。
実際、目標としてはProgrammer Ⅱにあるというのは試験が終わった今も変わっておらず、これは通過点だと思っている。
なので、近いうちにProgrammer Ⅱも受験する。(お金の工面をする必要があるのだが)
むしろ最初はProgrammer Ⅱとるまではブログ記事を書くことすらやめようと思っていたくらいである。
しかし、実際に試験勉強してみて、自分の知識のなさ、脇の甘さというのを痛感し、余裕ぶっこいてた自分の過去の態度を大きく恥じたので、反省の意味を込めて記事とする。
また、これから受験する人の参考に少しでもなればとも考えている。

試験勉強について

この本↓を一通り解いた。

 

オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集

オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集

 

 



情報処理試験の午前試験に関しては、過去問道場(これは情報処理安全確保支援士のだが他も全部そろっている)という素晴らしいサイトがあるおかげで大変助かるのだが、こっちに関してはそういうのがなく(あるにはあるが、知ってる限りでは仮にあってもボリュームが圧倒的に少ない)、したがってこういう本に頼らざるを得ない。
基本的に「ナメてた」人間だったので(何度も言うがこれに関しては猛省している)、まず解いてみて、結果NGだったときだけ解説を読む、という方針。
つまり基本的に問題集としてしか使っていない。
ただ解説はスゴイしっかりしており、問題にもよるが、体感的には、問題のスペースに対して解説のスペースが平均2~3倍は広く、この点に関して言えば最早解説本と言えなくもない。
まず要点をパッと書いて、その後で詳しい解説に行く、という流れも分かりやすい。
これは初心者の人に対しては大変助かるだろうと思った。

この本には各分野別の問題に「重要度」という枠があるのだが(3段階で★マークついてて、★3つだと超重要、★1つだとそれほど重要じゃない)、どういう観点で付けているのか不明だが、個人的には★3と★2しか相手にしていない。
たまに勢い余って★1も解いちゃったりしたが、基本的には★1(それほど重要じゃない)は無視して解いた。
あまり時間がなかったから…である。
ナメていたというのもある(何度も言うが猛省を(ry)
ただこれで結果的に合格しているので作戦的には間違ってなかったような感じもする。

最終頁に「模擬試験」として、実際の本番にとても近い形式の77問が用意されており、これで実力の程が試せるというのも良い。
ちなみにこの模擬試験の結果と実際に結果はほぼほイコールだった。
全般的に解き終えたら、これに挑み、解いてみることで、自分の実力を試してみるというのが良いだろう。

余談だが、情報処理試験の過去問道場と違い、本なので、スペースの都合上、(模擬試験は除くが)問題が載ってるページ内に答えと解説が載っていることがあり、問題解く前に答えが意図せずわかってしまう(目に入ってしまう)ということが時々ある。
これは「気を付ける」以外に対策がないので個人的に結構厄介だった。
(こんなところに気を使ってられねえぞ…という)

例えば試験勉強の過程で以下のような内容を覚えられ、知識として得ることができた(まあ基本知識らしいので俺が知らないまま10年過ぎてたのがおかしなだけかもしれないが…)

  • static変数はクラスで共有の変数だから、同一クラスで複数インスタンス作って、static変数書き換えると、生成した全インスタンスで書き換えた値が共有される
  • インタフェースはextendsして別インタフェースを定義できる(implementsしかできないもんだと思ってた)
  • プリミティブ型のラッパークラスは暗黙の型変換でプリミティブ型として扱われる

 

試験に対する感想

内容については口外出来ないのでabstractなw言い方になってしまうが、やはり上述したように、基礎知識の部分が結構重要だ。
static変数(特にインスタンス変数との違い)、プリミティブ型の種類、暗黙の型変換、配列、標準/拡張for文、switch(caseの判定に使える型/case内のbreakの有無等)、三項演算子、クラス継承、インタフェース実装/継承、抽象クラス、例外処理(RuntimeExceptionのcatchは任意とか)、基本API等。
正確な出題範囲に関してはOracleの公式ページに載ってるので参考にされたし。

ただ、実際に試験勉強してみるとわかるが、「そんなコード書くやついねえだろ…」って問題は結構な頻度で出てくる。
問題が問いたい領域(上述したような分野)にフォーカスして意図的にそういうコードにしているためなのだろうが、現場では見たことない(普通の感覚ならまず書こうとすらしない)コード、というのが多い。
俺は上述した通りで、基本的に「経験」の中で得た知識を第一の武器に戦おうとしていたので、「経験外」になるこうした分野に対しては地力が問われる分、弱い。
この辺、「ナメて」かかってた俺みたいな人間の面を引っぱたくものだ。。。

あと、「コードはちゃんと読もうね」というのは肝に銘じておきたい。
特定のジャンルに関する題意の問題なのかと思いきや、一部がバグってて「そもそもコンパイルできない」とか「実行エラーになる」とかが正解という、斜め上の思考を求められる問題も存在しており、コードをちゃんと読まないとこのあたりの見極めができない。
全体からするとそんなに多くはなかったように思うが、とにかくそういう問題が潜んでいる点も認識しておかなくてはならない。

試験制度に関する感想(情報処理試験との対比)

資格試験といえばここ数年全て情報処理試験だったので、決まった日時に指定された場所へ向かう形式だったが、この試験は(というかベンダー試験はみんなそうだと思うけど)自分で受けたい日時と場所を指定する形式なので、情報処理試験とは大きく異なる。
個人的にはIPA側の都合で決められた日程と適当な試験会場に振り分けられるより、場所も日時も自分で自由に指定できるこっちの試験形式のほうがはるかに使い勝手が優れている。
その分、情報処理試験との勝手の違いで最初は戸惑うこともあるかもしれない。

試験そのものの実施形態も、情報処理試験のような集合試験形式ではなく、パーティションで区切られた一人用のスペースのブースに入って(「一蘭」に近い)パソコン操作して解いていくだけのワンマン形式。
情報処理試験のように退出可能時間が決められているわけでもなく、終わったら好きな時間に退出していい。
一応予約するときに時間は指定するが、試験官の説明が終わればそれより前に開始してよい(実際俺は3分くらい早めに開始した)。

その自由さの裏返しなのだろうが、テストの実施要領にも書いてあるが、試験室内へのモノの持ち込みが異常に厳しい。
腕時計やハンカチすら持って入れないという徹底度合い。
受験開始前に、テストセンターの受付に用意されているロッカーに入れておくよう求められる。
ワンマンで試験させるからこそのルールなのだろう。

全問題が多肢選択式なので、結果(合否)もその日のうちにわかる。
合否が出るまで最高2か月ちょい待たなきゃならない情報処理試験より圧倒的に早く、気持ちの切り替えがしやすいというような気はする(まあこの辺は個人個人で違いそうだが)
ただ、情報処理試験になれていると、「多肢選択式」と言えば4つの中から正解を1つ選ぶ、というのが身に沁みついてるが、この試験は、選択肢が5つ、6つあったり、正解が1つではなく、「2つ選べ」「3つ選べ」というのも普通にある。
また、問題の題意に対して、対応する答えが必ず一つだけある、というものだけではなく、題意とは全く別の部分に引っかけがあり、「そもそもコンパイルできない」「実行時エラーが発生する」といった選択肢が正解であることもまれにある。
このため情報処理試験の「多肢選択式」と同じ考えで臨むと面食らう部分が往々にしてあると思う。
これは事前に(↑に挙げたような問題集等で)問題に慣れておいたほうが良い気がする。

それと、試験問題の管理が厳格で、内容を一切口外できない(受験前に、そのための秘密保持契約みたいのに同意させられる)
問題用紙が配布され、持ち帰ったうえで、後で受験者同士で喧々諤々と出来る情報処理試験とはこの部分で大きく異なる。
この点は正直個人的に不自由さを感じており(まあ俺のブログの書き方というか性格の問題なんだろうが)試験さえ終わればおっぴろげ(?)になる情報処理試験のほうに軍配が上がる。

とはいえ、総合的に見て、情報処理試験よりもこっちの形式の受験のほうが、合理的で利便性の良いイメージがあって、好印象である。
外資の試験っぽいというか。
情報処理試験もそうならんもんかね。
午前・午後問題共に、いちいち紙にマークさせたり文章や論文記述させるより、遥かに答えが正確に伝わりやすいし、問題解く側としても書きやすい感じするんだがな。

おわりに

結果だけ見ると、Silverに関しては、「ナメてた」という反省はあるものの、10年以上Javaのシステムに携わってきたという「経験」が過半数の割合で効果を発揮して合格につながっているという自覚もあるので、やはり実際の業務経験は結構重要だなと感じる。
勿論、ただ単に、「中身がJavaで書かれたプロジェクトにアサインされていただけ」というのではなく、自分から積極的にコードに触れる機会を増やす仕事の仕方は必要だと思うが。
加えて、自分で何かプログラムを作ってみるのというのもやはり重要だったと感じる。
仕事で与えられたコードでは得られない知識を自分自身の個人的な経験から得て補強することで、総合的な知識になる。
それでも自ずと自分の得意分野に限られた知識になることが多いから、やはり基礎知識の学習は必要になる。
「経験がある」からといって一概にナメてかかってはいけないのだ。

上述したが、目標はGoldであり、ここは通過点である。
とにかくこれでGoldのためのProgrammer Ⅱ受験資格は得たので、これで終わりにせず、次の資格取得に向けて勉強する。
ただ、正直、Silverをナメていたというのは事実で、「Goldも無勉で余裕っしょww」と思っていた態度が今回完全に打ち砕かれたので、ちゃんと勉強しなきゃな…という気分になっている。
情報処理試験と違った脳みそを使うことが求められる試験なので、普段の思考回路を改める必要があるというか、今まで慣れていた考え方を変える必要があり、ここが結構大変だったりする。
ちゃんと勉強しなきゃなあ…(溜息)。