便利なコードパーツ集!

やまろうのプログラミングTips

Java

Javaを学ぶ理想的な道のりを考える

投稿日:

スポンサーリンク



2003年
僕はJavaを使い始めてかれこれ3年になりますが、Javaは次々に
新しい技術が生み出され進化を続けてきました。その為、Javaの
学習に終わりはありませんでした。

「これで、大体コアな部分は覚えたな」

と思っても、次々と核となる物が生み出されました。
私の学習の歴史は↓

Javaの文法
applet & awt
java.lang・java.util・java.ioの主要なクラスを使う。
サーブレット
JDBC(DBアクセス)
サーブレット & JSPのMVC連携
GoFのデザインパターン
XMLプログラミング
EJB
JUnit
LDAPアクセス
リフレクション
J2EEパターン
Struts(フレームワーク、TagLib)
XP(エクストリームプログラミング)
EJBデザインパターン

ってな感じです。大体この順番なのですが、完全にこの順通りではなく
ちょっとかじっては他のをかじってというのを繰り返してきました。

僕は今までJavaの他には主にVisual C++とVisual Basicを使ってきました。
C++を使っていてもオブジェクト指向は理解出来なかったですし、
VBではGUIで簡単なツールを作れる程度でした。

しかし、Javaではオブジェクト指向を使いこなし、分散環境で動く
Webアプリケーションまで作れるようになりました。

「なんでだろう?」

1つは「Javaが簡単だから」
何言ってんだ?!と思った人もいるかもしれませんが、
これは紛れもない事実です。僕はJava以外で分散環境で動く
Webアプリケーションなんて作ることは出来ません。

一般的にJavaが難しいと言われているのは以下のようなことに
起因していると思われます。

1.Javaではオブジェクト指向プログラミングをしなければならない(すべきだ)から
2.昔よりも今の方がより高度なアプリケーションを短期間で求められているから。

まず1.は、Javaはオブジェクト指向言語なので、
オブジェクト指向プログラミングをすべきです。オブジェクト指向プログラミング
をするとプログラムの独立性が増し、処理が局所化して、再利用や
メンテナンスのしやすいプログラムを作ることが出来ます。
処理の局所化は手続き型言語でも関数とかプロシージャに共通部分を切り出せば
出来るじゃないか?と思われるかもしれませんが、手続き型言語以上に処理の
局所化が出来るのです。手続き型言語では共通の機能を関数にすることが
出来ます。オブジェクト指向言語ではそれに加えて、処理を呼び出す側の
コード、つまり処理の流れを局所化することが出来るのです。これらは
GoFのデザインパターンで、Templete Methodパターンや、Strategyパターン
としてカタログされています。今話題のフレームワークとはこれらのパターン
を組み合わせて、処理の流れを再利用するものなのです。

このように、オブジェクト指向はより柔軟なプログラミングを与えてくれる
というのに、オブジェクト指向というだけで、難しいと考えてしまう人がいます。
会社の先輩でかなりのベテランの方がいるのですが、その人は
「オブジェクト指向だとそうなのか?」とか
「それがオブジェクト指向なのか?」とか
「オブジェクト指向だと何がいいんだ?」等と言います。
この人はとても豊富な開発経験を持っている人なので、その人が
理解出来ないってことは

「オブジェクト指向ってそんなに難しいのかなぁ?」

と思ってしまいましたが、長く仕事をしていくうちに、原因が分かりました。
この人は「とにかく仕事が片付けばいい」という考えをしていました。
僕は、
「このアプリケーションはこのように実装すべきだ」とか
「コーディング規約はこうすべきだ」とか
「このクラスはこう実装するのが良い気がするけど、もっといい方法も
ありそうだなぁ」
等ということを考えるのですが、
この人は、
「なんでもいいから、お客の言うとおりやればいいじゃねーか」
と言います。そして、なにかと自分の責任にならないことを気にします。

つまりは、
「よりよい方法はないのか!」「もっとプログラミングが上手くなりたい!」
というような上を目指す気持ちがない人にはオブジェクト指向は理解し難い
ということです。ただ仕事が片付けばいいと思ってる人はオブジェクト指向
なんてすることはありません。いつまでもへぼいプログラムを書いてやがれ!?

ある雑誌で以前こんな記事を見かけました。
「Pascalでだってオブジェクト指向は出来るんです。要は考え方です」
PascalとはC言語のライバル的な手続き型言語です。
この記事はPascalの達人にインタビューしたものだったのですが、
この達人はコーディング規約にこだわり、設計が大事だと言っていました。

そして、ある記事には
「オブジェクト指向は、常日頃から良いコーディングを心がけてる
人にとっては、宝の山となるでしょう!しかし、そうでない人に
とっては宝の持ち腐れとなるでしょう。」

とありました。つまり、オブジェクト指向を使いこなすには常に
「もっと良い実装方法はないか?」という探求心が重要だということです。

2.は一般的に言われていますが、ホストの開発よりも、現代のWeb開発
の方が納期が短く高度なアプリケーションを求められています。
そして、Javaは現代のWeb開発に使用されることが多いため、
Javaでは短い期間で高度なアプリケーションを開発しなければなりません。
その為Javaは難しいと思われてしまいます。

しかし、同じ開発をJava以外で行ったらどうでしょうか?もっと大変だと
思います。たとえばWeb開発をJavaの代わりにC言語のCGIで行ったら?
しかも、Javaで行うのと同じ用件の物を作るとなると・・・・、
間違いなく難しいでしょう。Javaには豊富なクラスライブラリが標準で
ありますがC言語には低レベルで扱いにくい(その分高速だが)標準関数が
あるのみです。必要なライブラリを作るか、どこかから用意して使い方
を覚える必要があります。

Javaは便利で簡単で標準化された言語なのです。ただ、
求められる開発用件が厳しいだけなのです。しかし、Javaだからこそ
厳しい開発用件を打破することが出来るのです。
もちろんマイクロソフトの.NETだって同様です。現代のプログラミング
言語は以前のものより、便利で使いやすくなっています。あまりに機能が
豊富な為、全てを把握出来ないだけなのです。

そして、このような言語はこれまでの開発で発生したいくつもの問題
を言語レベルで解消しています。例えばメモリーを解放し忘れてて
、メモリーリーク(メモリーの空き容量が足りなくなる)になるという
バグはこれまで、多くの開発者を苦しめてきましたが、Javaでは参照
のなくなったメモリーはJavaVMが自動的に回収してくれます。この為
メモリーリークは起こりにくくなっています。(完全に起きないわけで
はない)

ということで、Javaは難しいのではなく、便利で機能が豊富過ぎるのです。

それでは、どのようにしてJavaを学んだらよいのでしょうか?

私が今まで学んできたものの中で重要だと思うものを抜き出し
最も良い道のりを考えてみました。(Webアプリケーション開発を
想定しています)

Javaの基本的な文法や言語仕様を学ぶ。

java.lang・java.util・java.ioの主要なクラスを使う。
Javaに慣れ、JavaAPIの調べ方等を学ぶ。

JDBC
DBアクセス!
AccessやMySQLに接続してみよう!

サーブレット & JSPのMVC連携
これがJavaでWebの基本。
フレームワークを使ったときにこの基本が
分かってないとうまくいかない。アセンブラを使ってみないと
コンピュータの根本が理解出来ないの似ている。

GoFのデザインパターンでオブジェクト指向のコツを掴む。
オブジェクト指向の実例ノウハウ集!!
僕がオブジェクト指向のコツが分かったきっかけ。結城浩さんの本がお薦め!
目からうろこ!新たなる世界へ!
先人の知恵を学ぶことで一気にレベルアップ!!

EJB
企業アプリケーションのコアテクノロジー!トランザクションや
リモート呼び出し等!!
動かすまでに苦労しましたが、今は細かい手順まで載ってる本がたくさん
あるので簡単!J2EE RIやJBossのようなフリーのJ2EEサーバで動かしてみよう!

J2EEパターン
サーバーサイドJavaの設計パターン集!!
アプリケーションに層を設けることによって、
クラス間の役割を明確化、依存関係を減らす → 良いアプリが出来る!

Struts(フレームワーク、TagLib)
Webアプリケーションフレームワーク!
Web開発でお決まりの部分をフレームワークに任せることで開発を効率化!
さらに画面遷移を外部ファイルに記述することが出来るのでメンテナンス性
が向上!

そして、これらを学ぶなかでプログラムのテストにJUnitを使ったりXPの
考え方を取り入れていけたら最高だと思います。

「それじゃぁ、その先には何があるの?」

この先の展望として重要なのはまずフレームワークです。
現在は、フレームワーク戦国時代です。
フレームワークはStrutsで決まり!とは行きません。今最も有力なのは
Strutsですが、Struts以外にも素晴らしいフレームワークは数多く
存在します。その一つがWebWork。まだ実際に使ったことはないので
なんとも言いがたいのですが、ActionクラスがWebのAPIに依存しない
そうです。なのでサーブレットコンテナ以外の実行環境でも利用する
ことが出来るそうです。

そして、数あるフレームワークの中、最も注目なのが、
JSF(Java Server Faces)です。JSFはマイクロソフトの.NETフレームワークの
Webフォームに対抗するものらしく、WebアプリケーションをWindowアプリのような
イベントドリブン型の開発を行えるようにするそうです。
JSFはJCP(Java Community Process)で提唱されているので、
標準フレームワークとなる大本命です。JSFの仕様定義にはStrutsの
作者も参加されてるそうです。そしてStrutsはJSFの機能の一部を取り込む
であろうと言われています。ということでフレームワークは、開発者にWebを
意識させない方向へ向かっています。

そして、フレームワークの他に注目の技術はというと、
Webサービスでしょう!WebサービスとはXMLによってデータの受け渡しを
行う技術です。これによりサービスの統合、再利用を行おうというものです。
大分前から騒がれていて、.NETはこのWebサービスを簡単に作れる
という振れ込みでしたが、Webサービス自体普及するのがこれからのようです。

そして、もう一つ重要な分野があります。それがオープンソースのライブラリ
です。Javaには無限と言っていいほどオープンソースのライブラリが
存在します。Jakarta Projectをはじめ、使い方を覚えれば僕らの
プログラミングを助けてくれるライブラリが満載です。これらを
うまく活用する能力を付けたいと思います。

その他に、View技術も注目です。JSPの基本を押さえたら次はTagLibでしょう!
JSTLを使いこなせるようになるべきかと思います。しかし、いつまでも
JSPが主役の座にいるとは限りません。VelocityやXSLT等、有力な
テンプレートエンジンは数多く存在します。動向をうかがいましょう!

それから、O/Rマッピングも注目です。O/RマッピングとはObject Relational Mapping
の略でオブジェクトとリレーショナルデータベースを関連付けるものです。
つまり、DBから読み込んだデータをオブジェクトに格納したり、オブジェクトに
格納されてる値をデータベースに格納したりといったことを行います。
O/Rマッピングを使わずにJDBCで自力で行うというのもありますが、O/Rマッピングを
使うとより簡単にオブジェクトの永続性を実装することが出来ます。
EJBのエンティティBeanもO/Rマッピングのひとつです。JakartaのTorque等
オープンソースにもたくさんあります。そして、JDO(Java Data Objects)
と言う技術が計画されています。O/Rマッピングの標準化を狙っています。
このように、JavaのオブジェクトとDBとのマッピングは選択肢がたくさん
あります。この中からシステムに合った技術を選択できるよう、注視して
いこうと思います。

ということでいかがだったでしょうか?Javaの学び方から始まって
これからの展望を独断と偏見に基づいて述べてみました。
今回取り上げた様々な技術は今後のメルマガで取り上げていきたいと
思います。特にオブジェクト指向のコツなどは、あることがきっかけで
急激につかめることがあります。このメルマガがそのきっかけになれたら
うれしく思います。

んじゃ
やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2020 AllRights Reserved Powered by AFFINGER4.