KisoJava 8

改訂版 基礎 Java を執筆するにあたって意識した事 その8

"改訂版基礎Java"でGoogle検索すると、そのものがヒットし、本サイトも1ページ目に表示されます。Amazonを越えることができないのは仕方がないにしても、もう少し上に行きたいところです。

さて、KisoJava 7ではPart1の内容を総括しましたので、ここからはPart 2の内容について簡単に説明をしてみようと思います。Part 2では、「Javaコーディングのための基礎知識」ということで、JDKがいよいよ登場します。JDKを使わないで「プログラミングの常識」を学習するスタイルというのは、結構めずらしいと思いますが、プログラミングやソフトウェア開発を初めて経験する人にとっては、やはりコンパイル作業とかは手間だと思うわけです。とはいえ、Javaプログラミングではさけて通れませんから、Part 2から使い始めることにしました。

Chapter 8 「JDKを使ってみよう」では、JDKのインストール、javacコマンドの使いかた、native2asciiコマンドの使いかたなどを解説しつつ、パッケージの説明もしています。パッケージについては、詳細は別途説明しています。他の項目でもそうなのですが、一度簡単な説明をしてから、必要なら後で詳細を説明する、という方針で執筆しています。最初の方で必要な内容と、Javaを理解してから必要となってくる内容に差があるからです。使えればいい、というレベルと、使いこなす必要がある、というレベルでは要求されることが違うと考えています。独習者にとっては、ステップ式に進めていくのがわかりやすいだろう、ということでこのようにしています。

KisoJava 7

改訂版 基礎 Java を執筆するにあたって意識した事 その7

KisoJavaをキーワードとして、Google検索をすると本サイトがトップになるのは前回と変わっていません。KisoJavaで検索する人はほとんどいませんから、どうでもいいことなのですが、とりあえずトップ維持ということでよかったです。

KisoJava 6」ではファイルの入出力について、取り上げた理由について説明をしました。ここでは、Part 1の内容について総括をしてみようと思います。

Part 1のタイトルは「Javaプログラミングの常識」とあるように、プログラミングを理解するにあたって常識として知っておくべき基本中の基本について、まずは理解してもらおうと考え、常識といえる内容について説明をしています。コンピュータへ命令をして、処理を実行させることは、それほど難しいことではないということを、まず最初に感じてほしかったので、BeanShellを使って手軽にプログラムを作って実行する方法を紹介しています。後半のファイル入出力や文字コードの話は難しい内容ですが、コンピュータ技術者を目指す人は避けて通れない部分ですから、取り上げました。Javaに限らず、他のプログラミング言語でも役に立つ共通の内容なので、ここにある内容はよく理解してから次に進んでもらいたいところです。

Chapter 1 Javaの特徴を理解しよう
Chapter 2 Javaプログラムを動かしてみよう
Chapter 3 コードはコンピュータへの命令です
Chapter 4 プログラムの動作をコントロールしよう
Chapter 5 プログラムからファイルの読み書きを行おう
Chapter 6 2進数と数値の表現
Chapter 7 文字の表現

個人的に、最初はコンピュータでプログラムを動かすことさえも、ドキドキしながらだったので、Javaプログラムを動かしてみるというところから話を始めています。どうしても、コンピュータに慣れてしまうと、初心者だったころのドキドキを忘れがちなのですが、初心者だった頃のことをできるだけ思い出しながら説明を書きました。それでも、本当の初心者にとっては敷居が高い部分もあると思います。プログラミング自体が簡単ではないので仕方ないのですが、BeanShellを使うことで、少ない入力コードで動作確認ができることを紹介しましたので、疑問に思うことはどんどん実行してみて、結果を見て理解を深めるのが近道ではないかと思います。

KisoJava 6

改訂版 基礎 Java を執筆するにあたって意識した事 その6

KisoJavaをキーワードとして、Google検索をすると本サイトがトップになることに気がつきました。稀少なキーワードとはいえ、トップというのは、なかなか凄い事ではないか、と勝手に思う事にしたいと思います。

KisoJava 5」では文字や数値の表現について取り上げた理由を述べました。今回は、ファイルの入出力について、取り上げた理由についてです。

プログラミングの基礎という観点からすると、実はファイル入出力というのはできてもできなくても、それほど重要ではありません。メモリにあるデータを扱うプログラムの方が、データをプログラム中で用意できるので、実装するべきプログラムの処理をどうすればいいのかを考えることに集中できます。最近はやっているJUnitでも、テストデータはテストクラスに持たせて、そのクラス内でテスト用のデータを初期化したりするのが普通でしょう。これは、ちょっとしたプログラムを作成するなら、そのままプログラム内でデータを用意する方が手っ取り早いからです。そう考えてみると、ファイル入出力については説明しなくてもプログラミングの基礎を学ぶ事は十分可能なのです。

では、なぜわざわざファイル入出力のサンプルプログラムを採用したのかというと、まずは、プログラムの処理結果を補助記憶装置へ保存するためには必要な機能だということが挙げられます。こういった実用的な機能は是非一度は見ておくべきですし、電気を切ったら計算結果が消えてしまうプログラムしか作成できないというのは、ちょっと寂しいと思いました。

また、コンソール画面を使った対話的な処理を実装するためには、標準入出力を利用するプログラムが必要です。GUIアプリケーションの作成についてはあきらめましたが、CUIアプリケーションの作成についてはきちんとできるようなJavaプログラマに読者にはなってもらいたいと考えたので、採用したのです。

標準入出力などというのは、UNIXやWindowsなどのOSを勉強したことがないと、わかりにくいものかもしれませんが、CUIアプリケーションを作成するためには避けて通ることはできません。クラスやメソッドなどについて、Part 1ではまともに説明していないため、難易度的にはかなり高いような気がしますが、できるだけ、プログラミングが初めての人でも理解できるような説明を心がけたつもりです。

ところで、ファイル入出力用のプログラムを解説するにあたって、ここでもBeanShellを使っていて良かったことがあります。それは、BeanShellを使っていると、例外については基本的に考える必要がないという点でした。Javaプログラムでファイル入出力について話をしようとすると、かならず例外がつきまとうので、それについて簡単に説明するとか、throws Exceptionをメソッドへつけてtry文がでてこないようにして文法の説明を後回しにしたりする対応が必要でした。ところが、BeanShellではそういった説明は必要なく、とにかくファイル入出力用プログラムを作成するために重要だと考えられる点だけ説明をすれば済むので、初心者にはわかりやすいと思っています。もちろん、内容の難易度としては難しいので、簡単だとは言えませんが、例外などについて考える必要がない分、Part 1の内容を勉強する人にとっては負荷が低いはずです。

KisoJava 5

改訂版基礎Javaを執筆するにあたって意識した事 その5

KisoJava 4」ではPart 1のサンプルについて考えた事を述べました。今回は、数値の表現や文字の表現について説明した理由について述べます。

プログラミングを意識するまでは、なぜ2進数しか扱えないコンピュータが文字を表示することができるのかを考えた事もない人が多いはずです。そのせいか、コンピュータ画面に表示される「1」は、内部でも1の値だと勘違いしてしまう人が多いようです。何を言っているのか難しいですね。説明がしにくいのですが、文字としての「1」と数値としての「1」は違うものなのですが、それがなかなか理解できないのです。

プログラミングを理解するにあたり、このことについて理解することは、実は必須ではありません。計算ができればいいということなら、JavaであればIntegerなどを使って計算すれば何の問題もなく計算できますから、わざわざコンピュータ内で数値や文字がどのように表現されているのかというのは知らなくても、とりあえず、こう書けばいい、と覚えてしまえば、なんとかなるのです。

では、なぜわざわざ書いたのかというと、日本語を扱うにあたっては必ず文字の表現方法については理解が必要となる場面に会いますし、そのときに文字コードの原理だけでも知っておけばずいぶんと違うだろうと思ったのと、整数や小数点数もどうやって2進数で表現しているのかを原理的に知っておけば応用がききますから、避けて通るべきではないと考えたのです。こういった表現方法がいろいろあるということを理解できると、データ型がなぜ存在しているのかも理由がわかるはずです。データ型を導入することにより、メモリをどうやって使うのか、どの領域に文字をいれるのか、数値をいるのか、といった計算を人間がしなくても済むようになりました。こういった計算は、ソースコードをコンパイラがコンパイルするときに行って、問題がないかチェックしてくれるようになったのです。

また、単純なプログラムを使う事で、2進数の世界を簡単に表現できるのも、ぱっと見は地味なのですが奥が深くて良い例題だと思っています。「ファイルにどんな値が入っているのかをバイナリデータとして表示するプログラム」というのは、ファイルを生成するプログラムなどで文字化けが発生していた時に確認のために使えたりします。もちろん便利な既存のツールを使ってチェックすることもできますが、そういったツールがどうやって実装されているのか想像できるようになるという点が重要だと考えています。

問題解決のためにダンプデータをとるといった作業を、学習の最初の方で経験しておけば、次にそれが必要な場面に出会ったときに、それほど難しい作業だとは思わないのではないでしょうか。そういったプログラムはプログラミング学習とは別の機会に勉強すればいいのかもしれませんが、せっかくプログラムを作るのだから、後でも役に立つプログラムをと思ったのです。もちろん、プログラム自体よりは、アイデアというか、考え方が後でも役に立つというのが重要だと思っています。そういう意味で、地味ですがいいプログラムをサンプルとして提示できていると自負しています。

ところで、残念だったのは、画像ファイルを解析するプログラムも提示したかったのですが、都合により採用にいたらなかったという点です。ここのブログで、BMPファイルを解析するためのCで書かれたプログラムを紹介しているのですが、それのJava版も紹介したかったのです。ところが、そこまで気力がでなかったり、紙面の都合もあったりで、ボツとなりました。画像ファイルのフォーマットは、それはそれで面白いので、また機会があったら紹介してみたいところです。

KisoJava 4

改訂版基礎Javaを執筆するにあたって意識した事 その4

KisoJava 3」ではIDEを採用しなかった理由について説明をしました。今回はPart 1のサンプルプログラムについて考えた事を整理してみます。

実際にプログラミングができるようになるためには、興味深いテーマを扱うのが一番なのですが、これは読者にとって様々であるため、これ、と決めるのは難しいものです。できるだけ色々な文法事項を説明できるもので、しかもシンプルな題材ということで、「テキストファイルを読み込んで、行番号つきで表示するプログラム」というものにしました。

Part 1では、「逐次処理」、「繰り返し処理」、「条件分岐処理」といった処理を基本単位として、これらの「基本となる処理」を組み合わせることにより、プログラムが作成できることを説明しています。ゴールとなるプログラムを完成するためには、こういった処理が必要、そのために、こういった文法が用意されている、といった形で説明をするように意識しています。厳密な文法の説明をしているわけではありませんし、ステップ方式で説明をしているので、それほど難しいと思うことなく、学習を進める事ができるはずです。ですから、順に読んでいけば、本書に書いてある通りのプログラムを作る事はできるようになるはずです。

本書のPart 1の内容を理解できれば、基本的には好きなプログラムが作れるようになるはずですが、そうなれる読者は一般的には多くはないと思います。本書で紹介してあるプログラムを真似して動かすだけではなく、自分で考えてプログラムを創り出すことができるようになるためには、壁があるのです。この壁を乗り越えるのは難しいのですが、こればっかりは自分で乗り越えてもらうしかありません。野球で言ったら、「ボールの投げ方は教えた」という段階であり、この後、自分で何度もボールを投げる練習をすることによって、はじめてボールを投げられるようになるというのと同じです。

話をサンプルプログラムに戻します。扱っている題材や、実際に行っている処理は、きわめてシンプルなものなので、サンプルプログラムを実行するところまでやってみても、大きな達成感はないかもしれません。読者としては苦労して達成感のあるプログラムを作成してみたいと思うかもしれませんが、執筆者としては、初心者が苦労することもなく、サンプルプログラムを実行できてPart 1を終わる事ができるなら、その方がいいと考えています。一番心配なのは、「ファイルを読んで行番号をつけて表示するプログラム」の有用性がよくわからないまま読み進んでしまうことです。そうすると、サンプルで提示しているプログラム全体が文法事項を説明するためだけのサンプルのように感じてしまい、内容的につまらないプログラムだ、と感じてしまうはずだからです。

「ファイルを読んで行番号をつけて表示するプログラム」が有用だと思う理由は、プログラムの仕様は「入力、出力、処理内容」で定義することができ、それを実現しているからです。このサンプルは、テキストデータについて、「データを読み込んで、加工処理をして、データを出力する」という基本的なデータ処理プログラムであり、処理内容自体は難しくありませんが、考えれば考えるほど味がでてくる例なのです。これを理解できれば、テキスト処理のプログラムを作成する事は、それほど難しくありません。

サンプルプログラムの題材については、厳選したつもりですが、ゲームを題材にしたり、GUIアプリケーションを題材にしたりした方が面白いはずだ、といった意見もあるでしょう。機会があれば、そういったテーマを使った書籍も執筆してみたいところですが、今回は比較的固めのテーマを採用しました。

KisoJava 3

改訂版基礎Javaを執筆するにあたって意識した事 その3

BeanShellを使う事についてのメリットを「KisoJava 2」で書きましたが、実は統合開発環境(IDE)と言われるEclipseやNetBeansを使うと言う選択肢もありました。しかし、今回はそれらを採用しませんでした。編集部さんが別途Webサイトにページを用意してくださり、そこにIDEを使う場合の解説をしてくれています。(改訂新版 基礎Java−統合開発環境。ちなみに、impress Direct:改訂新版 基礎Javaでは立ち読みもできると書いてありますね。iBookのFirefoxではうまく動作しませんでしたが…)

IDEを使ったJavaプログラミングの入門としては、Eclipseを使ったものを@ITで記事(@IT:Eclipseではじめるプログラミング)として執筆した事があります。そのときに、意外とEclipseについての説明が多くなってしまうため、プログラミングについての説明が減ってしまうと思いました。また、学校などでは、いろいろな開発環境を使って教えているので、Eclipse、NetBeansを使うと絞ってしまうと、Javaプログラミングの参考書として推薦されにくいという事情があります。また、IDEは結構頻繁にバージョンアップされるため、それに依存するような入門書にしてしまうと、学校のように毎年のカリキュラムが決まっていて、毎年大体同じように教えているところでは使いにくいということになりそうです。とはいえ、最近またJDKがバージョンアップされた事からもわかるように、JDK自体も頻繁にバージョンアップされるので、書籍についているもので完結しておく、という割り切りも必要なのかもしれません。

いずれにせよ、使っているIDEに強く依存していると、読者が限定されてしまいますので、本書のようなスタイルになりました。とはいえ、本書ではPart1はBeanShellに依存しているので、この部分の評価が大きく影響しそうです。そのことを考えると、「BeanShellで学ぶプログラミングの常識」、「Javaで学ぶプログラミング入門」、「Javaで学ぶオブジェクト指向プログラミング」という3分冊にすることにより、BeanShellに依存する部分を切り離すことも考えられたのですが、分冊形式は読者にとっては割高感がありますし、3冊持ち歩くことになるのも嫌だろうと思って、Part1、Part2、Part3構成の1冊にまとめたのでした。

BeanShellは、クラスの説明やメソッドの説明をすることなく、Javaの文法を使ってプログラミングの常識を理解してもらえるベストソリューションだと、個人的には思っています。学校で参考書指定をもられると一番良いのですが、本屋さんで独習のために良い本がないかと探す読者も多いはずですから、そういう人が地道に理解を深めるためには、コンパイラ方式よりもインタプリタ方式で確認できた方がいいはずです。

もちろん、プログラミング経験がどれくらいあるのか、コンピュータをどれくらい使ったことがあるのか、そういった点が影響してくるので、他の方法と比較してこれがいい、と断言するのは難しいものです。実際のところ、Visual C++などを使った事がある人は、EclipseやNetBeansから入った方が効率的でしょうし、実際に使用するIDEが仕事場などで決まっているなら、それを使う入門書を読んだ方がいいかもしれません。ただし、個人的には、Javaプログラミングの入門については本書のような学習用参考書を、Eclipseについて知りたい場合はEclipse解説本を、それぞれ購入することを推薦します。つまり、目的に応じて選ぶということです。その結果、Eclipseを使ったプログラミング入門書を1冊購入すればいいという結論になることもあるでしょう。

KisoJava 2

改訂版基礎Javaを執筆するにあたって意識した事 その2

しばらく、このネタでいこうと思っています。今日、東京駅の近くにある丸善に行ったところ、嬉しい事に目立つところに置いてもらってありました。帯が見えるように置いてもらえると、やはり嬉しいものです。

さて、本書はJavaプログラム初心者のために、Javaプログラムを実行するところから説明を始めています。なぜそうしたのかは、「KisoJava 1」で説明しましたが、実はBeanShellというJavaプログラムをここで紹介しておきたかったというのもあります。本書で詳しく説明していますが、これはJavaプログラムをインタプリタ実行するアプリケーションです。これを使う事により、プログラムを入力したらすぐに実行することができるようになりました。初心者にとっては、入力した命令がすぐに実行されて結果が出るという事がわかりやすいだろうと考えて採用したのです。

オブジェクト指向プログラミングを理解するまでには、「プログラミングの常識」とも言えるいくつかの事項を先に理解する必要があるので、それをインタプリタを使って説明したいと考えました。インタプリタを採用するメリットとしては、すでに説明をした「入力後にすぐ実行できる」ということの他にも、「入力するコードが短くて済む」ということもあります。Javaプログラムはクラスというものを基本単位とするので、例えば「class A { public static void main(String[] args) { System.out.println(0); }」と書かないと動作させることができません。しかし、プログラミングの常識を学習するにあたって、ここで実行したいのは「System.out.println(0); 」のプログラムの部分だけなのです。キーボード入力がなかなかうまくできないうちは、入力が必要なコードが多いと大変です。そんな人にとっては、入力をしたらプログラムを動作させることができるわけではなく、コンパイルしてからでないと動作させることができない、というのはかなり辛いことでしょう。さらに、コンパイル中にエラーがでたときには、サンプルとにらめっこしながら、どこがおかしいのかと文字の比較をしないといけません。こういった作業はもちろんプロフェッショナルになるなら乗り越えないといけませんから、避けることはできませんが、本書ではこの作業はずっと先にいってからになります。

ということで、Javaの文法を使って書いたプログラムを実行できるインタプリタを探したところ、ちょうどBeanShellという素晴らしいJavaアプリケーションがあったので使わせてもらう事にしたのです。このアプリケーションのおかげで「1行から実行」を実現する事ができました。感謝、感謝です。また、知る人ぞ知る、ですが、BeanShellはJDK6から導入されたScriptingFrameworkにも対応しているはずなので、これを知っていて損をする事はありません。もっと有名になってもおかしくないJavaプログラムのうちの1つだと個人的には思っています。とはいえ、このあたり、Eclipseがいい、NetBeansがいい、JDKだけでいい、BlueJがいい、と色々な意見があると思いますので、好みで分かれるのだと思います。