2015年5月、Oracle Java SE7 Gold合格に関して

今年2015年5月7日にJava SE7 Silver、5月17日に同Goldに合格した。

参考書

  • 「Exam Press スピードマスター Java プログラマ Gold SE7」
  • 「Exam Press スピードマスター Java プログラマ Silver SE7」

を主に利用した。

Goldに関してはほぼすべての例題のプログラムをコンパイルした。
Goldの前日の巻末の模試の結果は正答67/90で合格だった。

間違った問題は全て解き直し、この本であれば正答が選べるようにした。
試験結果はSilverは正答率88%で余裕しゃくしゃくだったが、Goldは正答率66%で紙一重で合格した。
紫本と呼ばれている教科書は使用しなかった。

その他

  • 「Impress Japan 徹底攻略 Java プログラマ Platform 5.0/6.0対応」は友人に借りて通読した。時々少しだけ問題を解いた。
  • 「Effective Java」はさらっと分からないなりに読んだ。
  • 5年前に購入したが使わなかった「日経BP Sun SJC-P認定ガイド 310-055対応」はインナークラスの部分と、Silverの時に参照としてあたった。問題は解いていない。
  • UMLのclass diagramのウィキペディアのページはよく書いて作法を学んだ。
  • OracleのJava Docは毎度読みました。読んだほうが良いです。
  • インナークラスの部分ではじめてjavapでバイトコードについて学んだ。同じくデコンパイラを利用した。 http://jd.benow.ca/

試験勉強機関

私の試験勉強期間は3月から5月17日です。そのうち、Silverは3週間程度しか使わなかったと思います。2ヶ月弱程度Goldに費やしています。

前知識

私の試験前のjavaの知識については、

  • かれこれ8年近く1年に数ヶ月javaでプログラミングをしている。趣味グラマ。
  • 仕事でjavaを使ったのは5年前にインターンで6ヶ月ほど。
  • クラス継承のことをほぼ知らないまま本Google App Engine上のウェブアプリケーション(wikiパーサーを含む)を作った。ある意味すごいと思う。
  • コンパイラはJava 1.5の基準に合わせていつもプログラミングしていたため1.6,1.7の新機能は今回の試験勉強で初めて知った。そのためNIO2,try-catchと、concurrentやtaskなど並列処理は全く初めて見聞きした。
  • assert文を書いたことがない。(テストケースもモジュール単位で作ったことがない)
  • SetやMapを使ったことがなかったと言っていい。
  • 自分で型パラメータをとるクラスを作ったことがない。
  • Enum, jdbc, Writer/Readerは使ってコーディングしていた。
  • Eclipse様々。私はJavaの開発環境はEclipse、Europa(3.3)とGanymede(3.4)を懲りなく使い続けていた。記憶では多分インターンの時はHelios。Indigoなんて見たことも聞いたこともない。
  • 基本情報技術者試験は受けていない。
  • 「プログラミング作法」読んでいない。

試験問題について

  • 私がGoldを受けた時にはSilverの時にもあった「資料」タブがなく、コードは比較的短かった。
  • スピードマスターに記載のないシリアライズの問題が1問出ました。
  • is-a,has-a問題が3問程度出ましたが、これは問題文の誤りとしか思えないんだけど…というのがあった。
  • printf構文については、テスト問題がスピードマスターより圧倒的に複雑なのでスピードマスターで勉強しても解ける問題ではなく勉強しても無駄だった。
  • Pathsの問題が得点源だったと思います。
  • スピードマスターに具体的な問題のないtransientの問題が1問出題された。
  • 下に書くようなスコープテストの問題がかなり多かったように思います。5、6問?
    よく覚えていませんが、メソッドと変数と継承のスコープが組み合わされていて、明らかにスピードマスターの範囲より難しいレベルでした。(テスト時はせいぜい4クラスしかない)
abstract class A {
	int x = 1;
	abstract int getX();
	abstract void setX();
	//abstract static void setX();//Compile Error
}
class B extends A{//extends A を抜いてmainメソッド中の参照変数AをBに変えても結果は変わらない
	int x = 2;
	int getX(){
		return this.x;
	}
	void setX(){
		this.x = 100;
	}
}
class C extends B{
	static int x = 3;
	int getX(){
		return this.x;
	}
	//static int getX(){ return x; }//Compile error
}
class D extends C{
	int getX(){
		return x;
	}
	void setX(){
		this.x = 0;
		//x = 0;をthis.x = 0;にしても結果は変わらない
	}
	//static void setX(){ x = 0; }//Compile error
}
class E extends D{
	int getX(){
		return super.getX();
	}
}
class F extends E{
	int getX(){
		return super.x;
	}
}
class G extends F{
}
class H extends G{
	static int x = 4;
	int getX(){
		return x;	
	}
}
class J extends H{
	int x = 5;
	public static void main(String[] args){
		A e  = new E();
		B eb = (B)e;
		C ec = (C)e;
		A ed = (D)e;
		C c  = new C();
		B bc = new C();
		System.out.println( e.getX());//3
		System.out.println(eb.getX());//3
		System.out.println(ec.getX());//3
		System.out.println(ed.getX());//3
		System.out.println( c.getX());//3
		System.out.println(bc.getX());//3
		A j  = new J();
		C cj = new J();
		B jb = (B)j;
		C jc = (C)j;
		D jd = (D)j;
		E je = (E)j;
		F jf = (F)j;
		G jg = (G)j;
		H jh = (H)j;
		System.out.println( j.getX());//4
		System.out.println(jb.getX());//4
		System.out.println(jc.getX());//4
		System.out.println(jd.getX());//4
		System.out.println(je.getX());//4
		System.out.println(jf.getX());//4
		System.out.println(jg.getX());//4
		System.out.println(jh.getX());//4
		System.out.println(cj.getX());//4	
		j.setX();		
		System.out.println( j.getX());//4
		System.out.println(jb.getX());//4
		System.out.println(jc.getX());//4
		System.out.println(jd.getX());//4
		System.out.println(je.getX());//4
		System.out.println(jf.getX());//4
		System.out.println(jg.getX());//4
		System.out.println(jh.getX());//4
		System.out.println(cj.getX());//4	
		System.out.println(jb.x);//2		
		System.out.println(jc.x);//0	
		jb.setX();
		System.out.println(jb.x);//2		
		System.out.println(jc.x);//0		
		System.out.println( j.getX());//4
		System.out.println(jb.getX());//4
		System.out.println(jc.getX());//4
		System.out.println(jd.getX());//4
		System.out.println(je.getX());//4
		System.out.println(jf.getX());//4
		System.out.println(jg.getX());//4
		System.out.println(jh.getX());//4
		System.out.println(cj.getX());//4
		System.out.println( j.x);//1	
		System.out.println(jh.x);//4
		System.out.println(jg.x);//0
		System.out.println(jf.x);//0
		System.out.println(je.x);//0
		System.out.println(jd.x);//0
		System.out.println(jc.x);//0
		System.out.println(jb.x);//2

		System.out.println( e.getX());//0
		System.out.println(eb.getX());//0
		System.out.println(ec.getX());//0
		System.out.println(ed.getX());//0
		System.out.println( c.getX());//0
		System.out.println(bc.getX());//0
		System.out.println( e.x);//1
		System.out.println(eb.x);//2
		System.out.println(ec.x);//0
		System.out.println(ed.x);//1
		System.out.println( c.x);//0
		System.out.println(bc.x);//2
	}
}

感想

javacの動作とJavaVMに興味を持てます。

究極的に言えば、当然次はThe Java Language Specificationを学び、最後にはThe Java Virtual Machine Specificationが待っているというのがOracleのテストの指針なのだと思いました。


 [計算機科学]
・エクセルマクロを記録できる
・htmlを書ける
・エクセルマクロで簡単なプログラムを書ける
・PHPコードを読める
=ここから素養に含まれない技術部門
→ネットワーク技術部門へ進む
↓このまま進む
・Java, C, Pythonなど何でもいいがで簡単なプログラムを書ける
・Oracle Java SE Certificate Gold ← 今ここ
→フレームワーク作成: 純粋なコーダーとしての能力部門へ進む
↓このまま進む
・Java Language Specificationを網羅する
=ここから純粋なプログラムコーダーに含まれない凖計算機科学
・ビット演算を駆使できる
・Java VM Specification1 JavaVM スタックフレームを理解する
・メモリ世界を理解する
・Java VM Specification2 VM命令セットを網羅する
=ここから計算機科学
・浮動小数点精度で最大精度を導く論理数学アルゴリズムを考察する
・暗号化技術の数学的理解
→計算機科学数学界へ進む
↓このまま進む
・JavaVM上で動作する新規言語コンパイラを作成する
・JavaVMを実装する
・Intelx86 CPU命令セットを網羅する
=ここからグレースホッパーの世界
・自己でLLVMを作成し、コンパイルしたDragon Fly BSDが正常に動作する
・自己でDragon Fly BSDを再実装する
・分散オペレーティングシステム: ベル研究所- inferno, plan9を再実装する

■LLVM

■inferno, plan9

■DragonFlyBSD

■Java 仮想マシンとオブジェクトキャッシュの構造と動作に関する理解


カテゴリー
Java
    last modified: 24 May 2015 [ View wiki source Close ]
     
SEARCH DIFFERENCE ATTACHMENT RECENT POST