JDKのインストール(Windows)と Java 関連用語の説明

今回は Java の開発キットである JDK(Java Development Kit) の Windows へのインストール方法についての紹介です。
ただ Java は JDK, JRE, Java SE など略称がいっぱいです。これらのJava に関連する用語についても説明しています。

JDK は Java による開発はもちろん JVM 言語 の開発にも必要です。 私の場合はむしろ JVM 言語用としてインストールしました。
Java は用語がいっぱいあり、何をインストールするのか、何がインストールされたのか、 よくわからないといったことがありました。 そこで、それらの用語について私なりにまとめたものをインストール方法と一緒に紹介したいと思います。

Java アプリケーションの実行の仕組み

Java アプリの実行の仕組みから先に説明します。

まず、 比較として通常(Native)のアプリケーションでの実行の説明から行きましょう。
Native では gcc, VC++ といったコンパイラーで人間が書いたソースファイルを機械が読みやすいマシン語(機械語) に変換した実行ファイルを作成します。 このファイルは 0, 1 で書かれたバイナリーで、これを OS が読み取って実行します。
lang_jvm_compile.png

一方、 Java ではソースファイルをコンパイルするとバイトコードと呼ばれるファイルが作成されます。これはソースコードと機械語との中間言語のファイルです。
これを Java の仮想マシン JVM(Java Virtual Machne) が読み取り、実行します。
lang_jvm.png

この JVM の環境を提供するのが、 JRE(Java Runtime Environment) というソフトウェアのセットです。
この中の java.exe にバイトコードを渡して、実行します。
このため、Java 製アプリを実行するには JRE が必要です。 通常 Java のインストールというとこちらを指します。

Java アプリ作成に必要なソフトウェアのセットが JDK (Java Development Kit)で、 Java の SDK といったところです。
JDK の中の Java コンパイラー(javac.exe) を使って、 ソースファイル(*.java) からバイトコード(*.class)を作成します。 Java の配布パッケージとしてよくある jar ファイルは class ファイルを単に zip で固めたファイルです。

なお、 JDK をインストールすると JRE も一緒にインストールされます。
ただし、こちらはプライベート JREといって、 JDK 用のフォルダー内にインストールされます。 このため、通常使っている JRE に影響を与えることなく、別バージョンの JRE 用のアプリを開発する ということもできるらしいです。


なんでこんな仮想マシンという仕組みをとっているかというと、もちろんメリットがあってやっています。 ただ、その説明はインストールの解説の後に行うことにします。

JDK のダウンロード

Java プラットホーム

Java の開発環境をインストールしていくわけですが、 ここでまた、Java にはいくつかの開発環境(Java プラットホーム)があります。 Java プラットホームをまとめると次のような感じです。 JDK はこのうちの標準版である Java SE の開発キットです。
略称 名称 説明
Java SE Java Platform, Standard Edition 標準版。主なターゲットはデスクトップ(PC)。
Java EE Java Platform, Enterprise Edition 企業向け。主なターゲットはサーバーサイド。
Java ME Java Platform, Micro Edition 組み込みシステム、モバイル用。

JDK の選択

いよいよ JDK のダウンロードです。
以下の Java SE のダウンロードページから行います。 lang_jdk_dl.png

3 種類のダウンロードリンクがありますが、 "JDK" または "NetBeans 付きの JDK" を選択します。
NetBeans は Visual Studio に当たる IDE です。 IDE も一緒に入れたければ、 JDK + NetBeans を選択して下さい。
Java の IDE では NetBeans 以外にも EclipseIntelliJ IDEA あたりが有名どころです。 というよりもシェアとしては Eclipse が圧倒的人気で、 2 番目が IntelliJ です。
追記 2013-10-02
画像では 3 種類になっていますが、 次節で説明する JavaFX が JDK と一緒にインストールされることになったので、 現在は 2 種類です。

JavaFX

もう一個残った JavaFX についても説明しておきます。
分かれていますが、今のバージョン(7u21)では JDK と一緒に JavaFX もインストールされるみたいです。

JavaFX というのは Rich Internet Application (RIA) の GUI ツールキット(API)です。
といっても、"それ何?" という人も多いと思います。 RIA は Adobe Flash や Microsoft の SilverLight といった類のものです。 ブラウザーにプラグインとしてインストールし、 よりリッチなコンテンツや Web アプリを提供するための技術です。

Web のクライアント側スクリプトとしては JavaScript で統一されてしまった感がありますが、 Java もデビュー時は クライアントサイドの言語でした。その Java で作ったものが Java アプレット です。
JavaFX は次世代の Java アプレットに当たります。

ちなみに JavaFX は 1.0 として出た頃はスクリプト言語でした。 しかし、 Sun が Oracle に買収されたあたりで方針転換し、 2.0 から今の API の形態になっています。


また、方針変換に伴い JavaFX はブラウザー上だけでなく、デスクトップアプリの GUI ツールキットとしても使えるようになりました。 Java では AWT, Swing, SWT といった GUI ツールキットがありますが、 その最新版とも言えます。
Windows(.NET) では WPF と SilverLight に分かれていますが、それが合わさった感じです。

JDK インストーラー

前節 で "JDK のみ" を選択したとして進めたいと思います。 "NetBeans 付き" でもほとんどやり方は同じです。

JDK のみを選択するとプラットホーム(OS)別のインストーラーのダウンロードページとなります。

lang_jdk_dl2.png
ここで、ライセンス条項に同意して、 インストーラーをダウンロードします。
32 ビット PC であれば jdk-XXX-windows-i586.exe、 64 ビット PC なら jdk-XXX-windows-x86.exe です。

このページでは、その他にもデモやサンプルのファイルがおいてあります。 お好みでダウンロードして下さい。

JDK のインストール

インストールはダウンロードしたインストーラーを実行します。

lang_jdk_inst.png
ここで、インストール先を変更していた方がお勧めです。
デフォルトでは "C:\Program Files" 以下なのですが、 たまにパスにスペースを含む場合に正常に動作しないプログラムがあるためです。 また、 "C:\Program" というフォルダーを作るのは問題があり、後で変えるように言われるので、 そちらもやめておきましょう。

その後はウィザード従えば、インストールされます。
オプションで [公開用の JRE] を外していなければ、 そのまま JRE のインストールが続けられます。 こちらは開発時に使う プライベート JRE ではなく、普段使う JRE です。 こちらのパスは変えなくても大丈夫だと思いますが、気になる人は変えておきましょう。


この状態で、 javac (コンパイラー)などをフルパスで指定すれば、実行できるのですが、 環境変数 PATH に実行ファイルのある bin フォルダーを追加していた方が使いやすくなります。
また、ツールや JVM 言語の中には次で説明する JAVA_HOME を設定しておく必要があるものも多いです。
環境変数の設定画面の呼び出しは Windows のバージョンによって違うのですが、 基本的に [(マイ)コンピューター] を右クリックして [プロパティ] を選択し、 [詳細設定] を選ぶと出てくると思います。

単に bin フォルダーを PATH に追加するのではなく、 JAVA_HOME の変数を介して追加します。
環境変数
JAVA_HOME インストール先のフォルダー(C:\Programs\Java\jdk1.7.0_21 など)
PATH (追加) %JAVA_HOME%\bin
%..% というのは他の環境変数を展開して入れる記号です。(Unix の ${..} に当たる記述)
新しいバージョンをインストールした場合、 環境変数を設定し直す必要があります。 前の PATH の記述を消すのは面倒ですが、 このように設定しておけば、 JAVA_HOME の値を変更するだけでよくなります。


以上でインストールの説明は終わりです。
これ以降は、 JVM の仕組みについて気になった人のために、もう少し JVM のメリット、デメリットについて説明をしておきます。

仮想マシン(JVM) のメリット、デメリット

コンパイル型と比べたメリット

メリットとしては次のようなものが考えられます。
  • クロスプラットフォーム
  • 構文解析と最適化処理の分離
  • クロスランゲージ

クロスプラットホーム :
もともと Write once, run anywhere(一回書けば、どこでも動く) がスローガンでしたし、 これは売りなのでしょう。
ただ、 C++ でも Qt といったクロスプラットホームのフレームワークを使えば、 同じようなことはできます。
もちろん、 Qt ではプラットホーム別の処理を書く必要が全くないということは ありません。しかし、それは Java も同様です。

また、バイトコード等の仕様は公開されているので、 JVM を独自につくることができます。
新しく OS などの環境をつくったとして、そこで JVM さえ作れば、 すでにたくさんある Java のアプリがそのまま動くようになります。
実際には、そのまま動くほど、おいしい話ではありませんが、 速度向上の目的のものを含めると多くの JVM が開発されています。
構文解析と最適化処理の分離 :
コンパイラーの仕事のうち、大きなポイントが 2 つあります。
一つが言語の仕様に基づき、ソースを解釈する処理です。 この言語の仕様を決めるところが言語作成者の腕の見せ所であり、 センスを問われる部分でしょう。
もう一つはプログラムをいかに速く動かすかという最適化の部分です。 こういうところに情熱を燃やす人もいます。
この特性の違う二つをコンパイラーと JVM で分けて開発できるようになります。


クロスランゲージ :
前述の分離により、 中間言語へと変換するコンパイラーさえ作れば、 新しい言語でも最適化の恩恵を受けることができます。
また、一旦中間言語に直すので、違う言語間でのやり取りが簡単にできるようになります。

本来、 JVM は Java 用ですが、これらのメリットにより、 ScalaGroovy を始めとした 200 を超える新しい言語が生まれています。 これらの JVM 上で動作する言語を JVM 言語 と言います。
この多くの JVM 言語を生み出す環境を用意したことが、 Java の一番の功績ではないかと個人的には思います。

コンパイル型(Native)と比べたデメリット

逆にデメリットもあります。
  • 重い、メモリー消費量が多い
  • リバース エンジニアリングされやすい
  • システムへの JRE のインストールが必要
重い、メモリー消費量が多い :
C, C++ といった言語では事前にコンパイルします。 それに対して Java では、 実行時にコンパイルします。 これは JIT コンパイル(Just In Time) と呼ばれています。
実行の際にコンパイルするので、その時間がかかりますし、 コンパイル結果のマシンコードをメモリー上に確保するので、メモリーを大量に消費します。
このため、初期の Java は「使い物にならない」といわれるほど、 遅いものでした。 実を言うと、私は Java が嫌いなのですが、 この第一印象の悪さが一因となっています。

しかし、 よく使うところだけコンパイルするなどの技術が盛り込まれ、大分改善されています。
最近では条件によっては事前コンパイルよりも高速になることもあるそうです。 ただ、そうはいっても基本的には遅いし、メモリーも使います。


リバース エンジニアリングされやすい :
これは商用アプリに限った問題です。
実行ファイルから元のソースコードの情報を得ることをリバース エンジニアリングと呼びます。 これは Java に限った技術ではありませんが、中間言語の形式でリリースする Java では特にやりやすくなってしまいます。

これを防ぐための難読化という技術もあります。
JavaScript の難読化 は速度を上げるために空白等を取り除いて、結果読みにくくなるものですが、 Java の難読化はわざとソースコードを読みにくくします。 しかし、これには新たな不具合が生じたり、速度が低下したりといった危険性があります。
最近のアプリでは減ってきていますが、アルゴリズムで勝負しているような部分は、 C, C++ といった Native な言語で実装する必要があります。


システムへの JRE のインストールが必要 :
インタープリター型と比べたコンパイル型のメリットとして、 "コンパイルした実行ファイルだけで動作する"というものがあります。
しかし、 Java のアプリは JVM(JRE)が必要で、そのメリットがありません。

インタープリター型(スクリプト)との違い

仮想マシンを使う仕組みはインタープリター型の言語とよく似ています。
しかし、人が書いたコードを事前にマシンが読みやすい中間言語にコンパイルしているため、 その分、速度の向上が望めます。

コンパイル型との比較で挙げた JIT コンパイルなどの技術などもあり、 Java のアプリは大抵のスクリプト言語よりも 5 倍程度、速いらしいです。

ただ、 Ruby は Ver. 1.9 から RubyVM を内蔵していますし、 Python の PyPy や JavaScript の V8 エンジンなどは JIT コンパイルの技術が使わており、 速度の点に関しては、スクリプト系も向上していっています。
追記 - 2013-05-13
DartVM にいたっては JVM の速度を超えたらしいです。

また、コンパイルが不要ということは、 手軽というインタープリター型のメリットとも言えます。

まとめ

最後に仮想マシンのシステムについてまとめてみます。

速度に関しては、条件にもよりますが、概ね次のような関係となっています。
インタープリター型  <  仮想マシン  <  コンパイル型

また、 コンパイル型の"実行ファイルだけで動作する点"やインタープリター型の"コンパイルが不要な点" と両方の利点をともに失っています。

こうまとめるとあまり良い点はないように見えます。
しかし、 Micorsoft も Java と同じような .NET CLR のシステムを採用しました。 それだけ、 構文解析と最適化の分離やクロスランゲージといったメリットが大きいということでしょう。

ただ、これは開発サイドのメリットで、純粋にユーザーの視点からはコンパイル型が一番です。 しかし、速い技術進歩を求められるソフトウェア開発では必要な技術だと思います。
例えば、プログラミング言語が成熟するまで 10 年以上必要だと言われてきましたが、 Java や .NET を使えば、できてすぐ、高機能の最適化や豊富なライブラリーが使えるようになります。 また、既存のアプリに部分的に適用していくといったことも可能です。


スポンサーサイト
 

Scala のインストール(Windows)と Emacs モードの設定

Scala はオブジェクト指向と関数型プログラミングのマルチパラダイムの言語であり、 JVM(Java 仮想マシン)上で動作する JVM 言語です。
今回はこの Scala の Windows へのインストールと簡単な使用法、および Emacs の scala 用モードの設定についての記事です。

Scala
最近、 Scala を始め、 Haskell, F#, Erlang, Clojure といった関数型プログラミング言語が注目を集めています。 Java は古いはいいとしても、 関数型でオブジェクト指向が古くなるということないでしょう。 しかし、適材適所で使えばかなり有用そうですし、 新しいパラダイムを覚えることはプログラミング力の向上にもなります。
何か 1 つちゃんと身につけたいなと思うのですが、どれがいいかは悩みます。 そこで、主要なものは試してみようということで、第一弾を Scala にしました。
『7つの言語 7つの世界』 に出ていたという理由もあります。
7つの言語 7つの世界7つの言語 7つの世界
(2011/07/23)
Bruce A. Tate

商品詳細を見る

その試した際のインストール方法などをまとめて記事にしてみました。

Scala とは

関数プログラミング言語の中でも Scala の特徴はマルチパラダイムJVM 言語です。

マルチパラダイム :
C++ はオブジェクト指向言語ですが、 C と同じ手続き型で記述することができます。 このパラダイムのつなぎとなれるというのは大きなメリットでしょう。
Scala は大枠はオブジェクト指向の言語ですが、関数型プログラミングが可能な能力を持っています。

JVM 言語:
Java はソースコード(*.java)をコンパイルして、 バイトコードと呼ばれる中間言語のファイル(*.class)を作成します。それを JVM(java.exe) が実行します。
Scala も同様にコンパイルで、バイトコードを作成し、 JVM 上で動作します。(スクリプトとして動作させることもできます)
JVM 上で動作するので、 Java の豊富なライブラリーを使うことができます。 また、 逆に Scala で作成したクラスを Java から利用することもできます。
lang_scala_descipt.png
Scala の名前の由来は "SCAlable LAnguage" (移植性、拡張性のある言語) であり、 オブジェクト指向、 Java と関数型の連結の高さからきています。
また、 イタリア語で "階段、はしご" を意味しています。 Scala のマークは開発者であるマーティン・オーダスキー教授の職場にある螺旋階段が素になっているらしいです。

インストール

JDK のインストール

バイトコードを生成するのに Java 開発キット(JDK) を利用します。 このため、まず JDK をインストールする必要があります。

簡単にいうと、以下の手順になります。
  1. インストーラーをダウンロード
  2. インストーラーを実行
  3. 環境変数を設定
    環境変数
    JAVA_HOME インストール先のフォルダー(C:\Program Files\Java\jdk1.7.0_21 など)
    PATH (追加) %JAVA_HOME%\bin
JDK のインストール方法についての詳しい説明は以前の記事をご覧下さい。 なお、 JDK のインストール記事では環境変数の設定はオプション的な位置づけで説明しましたが、 scala を使用する場合には、 JAVA_HOME の設定は必須です。
(JAVACMD で java.exe のフルパスを設定でも可)

Scala のインストール

ダウンロードページからインストーラー(scala-X.X.X.msi) または圧縮ファイル(scala-X.X.X.zip) をダウンロードします。 lang_scala_dl.png

ちなみに、 [Scala tool support] の中身は gEdit と Emacs 用のモードです。 Emacs に関しては後述しますが、使用する場合でもここでダウンロードする必要はありません。


以降はインストーラーをダウンロードしたとして説明していきます。
圧縮ファイルの場合はインストール項目を選択できないのと、 手動で bin フォルダーを PATH に追加する必要がある点を除けば、中身は同じです。

まず、ダウンロードしたインストーラーを実行します。

実行し、進めていくと [Custom Setup] の画面になります。
ここで、必要であれば、 [Browse] でインストール先を変更します。
lang_scala_inst_loc.png

また、 インストール項目も選択出来ます。 といっても、 サンプルコードや Scala のソースを選択するぐらいですが。
lang_scala_inst.png

後は、そのまま進めていけば、インストールは完了します。

ただし、 PATH に設定された値は "C:\Program Files\Java\scala\\bin" のように \ 記号が余分に追加されています。(Ver. 2.10.1)
大抵はこのままで問題無いのですが、 eshell のように対応していないものもあるので、修正しておいた方がいいでしょう。

IDE のプラグイン

Java の主要な IDE 用のプラグインが用意されていて、 IDE での開発もできるようになっています。
Emacs 派の私としては IDE は使いませんが、リンクだけ紹介しておきます。
IDE リンク
Eclipse Scala IDE for Eclipse
IntelliJ IDEA JetBrains Plugin Repository :: Scala
NetBeans Scala - NetBeans Wiki

なお、 IDE の中では、今のところ IntelliJ のプラグインが評判がいいみたいです。
また、 scala サイトのダウンロードページにあるのは、 gEdit と Emacs だけですが、 Vim 、 TextMate など様々なエディターのプラグインが作成されています。

使用方法

scala は 3 つの方法で使用することができます。
  1. 対話モード (REPL)
  2. スクリプト
  3. コンパイル
それぞれの使用方法について説明していきます。
なお、詳細は scala -help, scalac -help で確認してください。 (scalac のオプションはすべて scala で使用できます)

対話モード (REPL)

REPL と呼ばれるもので、 1 行づつ結果を確認することができるモードです。 動作確認などで使用します。

scala(.bat)引数なしで実行すると対話モードとなります。
終了する場合は :quit と入力します。
lang_scala_internal.png

Perl や Ruby のように -e オプションで式の文字列を渡して、 実行することも可能です。

スクリプト

scala(.bat)ソース(*.scala) を直接渡すとスクリプトとして動作します。
次節のコンパイルではエントリーポイントを定義する必要がありますが、 スクリプトの場合はファイルを上から順に実行します。

hello.scala :
println("Hello, World!")
println("Hello, Japan!")
println("Hello, Tokyo!")
実行結果 :
~/seven/scala $ scala hello.scala
Hello, World!
Hello, Japan!
Hello, Tokyo!
ただし、 Perl や Ruby の -c のような文法チェックだけのオプションは無いみたいです。 また、文法エラーのファイルを実行するとエラーが出ずに固まることも多いです。
私としてはコンパイルの方がお勧めです。

コンパイル

コンパイルの場合は次の手順になります。
  1. scalac(.bat) でコンパイルして、 class ファイルを作成
  2. scala(.bat)class ファイル(拡張子は除く) を渡す
スクリプトでも触れましたが、 コンパイルの場合はエントリーポイントの関数を作成しておく必要があります。
Java の場合は main という名前のクラスメソッド(static)がエントリーポイントとなります。 Scala も同じですが、 クラスメソッドはシングルトンオブジェクトで作成します。

helloWorld.scala :
object HelloWorld {

  def main(args: Array[String]) {
    println("Hello, World!")
    // コマンド引数を表示
    args.foreach(arg => println(arg))
  }

}
コメントを含め、日本語を使用したい場合は BOM(シグネチャー)なしの UTF-8 で保存する必要があります。

実行結果 :
~/seven/scala/sample $ scalac helloWorld.scala
~/seven/scala/sample $ ls
HelloWorld$$anonfun$main$1.class  HelloWorld$.class  HelloWorld.class  helloWorld.scala
~/seven/scala/sample $ scala HelloWorld foo bar
Hello, World!
foo
bar

実際のアプリでは、ソースファイルがひとつということはなく、 複数ファイルからなるプロジェクトということが多いでしょう。 このプロジェクトのビルドは sbt を使うのが、 Scala では一般的のようです。
ただ、こちらは本格的に使うようになってからということにしたいと思います。

Emacs モードの設定

scala-mode の選択とインストール

[Options] -> [Manage Emacs Packages] メニュー等でパッケージのリストを開きます。 ここで、 scala 用のモードは 2 つ見つかります。
  • scala-mode
  • scala-mode2
最初の scala-mode は scala のサイトにある [Scala tool support] と中身は同じです。
scala-mode2 は作者によると scala-mode に比べて、インデントやハイライトが賢くなっているらしいです。 インデントやハイライトを重視して、 scala-mode2 を使うことにします。
scala-mode の方も括弧の electric モードやスニペットの使用など魅力的な機能はあります。 ただ、部分的な機能であれば、本格的に使うようになった時、後から自分で移植するということもできるかもしれないので、 とりあえず気にしないことにします。

どれを使うか決めたら、後はパッケージを選択して、 install を実行すればいいだけなので、簡単です。

ENSIME のインストール

編集用のメジャーモードとは別に ENSIME(the ENhanced Scala Interaction Mode for Emacs) という拡張用の Lisp もあります。 こちらのインストール方法も紹介します。

こちらはパッケージとして登録されていないようなので、ダウンロードページから取得します。 ダウンロードした圧縮ファイルを任意のフォルダーに展開します。 ここでは、 ~/elisp/ensime 以下に展開したとします。

(インストールフォルダー)/elisp を load-path に追加する設定と scala ファイルを開いた時に一緒に起動する設定を ~/.emacs.d/init.el に記述します。
(add-to-list 'load-path "~/elisp/ensime/elisp")
(autoload 'ensime-scala-mode-hook "ensime"
  "Conveniance hook function that just starts ensime-mode." t)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
ENSIME のサイト等での説明では require で記述されていますが、 起動時に常にロードするのは嫌だったので、 autoload に変えています。
また、 hook に hook をかけているのが、おかしく感じるかもしれません。 名前が紛らわしですが ensime-scala-mode-hook は実際にはホックではなく、 モード呼び出し用の関数です。


ENSIME は主な機能はプロジェクト開発用みたいなので、まだちゃんと使っていません。 使用方法などは他のサイトなどを参考にしてください。
 

良いコードを書くためには

今回は良いコードを書くための私の考え方を書いてみたいと思います。

はじめの一歩

まず、世の中のプログラマーのうち、ちゃんとしたコードを書く人はほんの一握りで、 大半は設計を含めたコーディング、プログラミングが下手くそです。
いろいろ反論はあると思います。しかし、ソクラテスの無知の知のように
  "自分はコーディングが下手なのではないか"
と疑うことが良いコードを書くための第一歩です。

良いコードとは

では、その"良いコード"とは、何でしょうか ?

良いコードの答え

これは文章やプレゼンといったものと同じです。 良い文章、下手な文章というものは確かに存在します。しかし、何をもって良い文章とするかは難しいところです。
同様に "良いコードとは何か" も、人それぞれで明確な答えは出ません。


良いコードについて、 『達人プログラマー』のような書籍や DRY のように一般的に言われていることがあります。
こういった"権威"や"みんながいうこと"に黙って従うのも悪いとは思いません。何もしないよりはいいでしょう。 しかし、細かいところまで応用が効きにくいです。


良いコードの答えは人それぞれですが、自分なりの考えを持つ ことが大事だと私は思います。

良いコードを求める

良いコードを自分の基準で決めるので、"そりゃ、全部良いコードになるだろ" と思われるかも知れません。 しかし、これがなかなか思うようには行きません。


"時間がないから、とりあえずの修正で" とか "元が下手くそすぎるプログラムの修正だから" などいろいろ理由を付けて妥協してしまいがちです。 しかし、それも自分の下手なコードと認めなければなりません。
そうすれば、自分で自分のコードを恥ずかしいと感じるので、 どんな時でもなるべく良いコードにする努力をするようになります。

また、人の考え方は日々変わります。
そのため、書いている時は "これがベスト" と思っても、 しばらくしてみると "下手くそだな" と思うことは往々にしてあります。
これは成長と捉えることもできます。 逆にそう思うことが全く無い方が問題です。

良いコードかどうか判断できることが良いコードを書くことにつながります。
  "良いコードとは何か?"、 "自分のコードが良いコードになっているか?" を考えて書く
ということ自体が良いコードを書くための道だと思います。

ひとりよがり にならないために

自分の考えをしっかり持つということは、得てして ひとりよがり にも陥りやすいです。
このために書籍やプログラミング原則などの情報にアンテナを立て取り入れていくことも重要です。
ただし、そこで鵜呑みにするのではなく、ちゃんと自分の考えとして取り入れる必要があります。

情報について考える

最初に聞いたときにはなんとも思わなかったけど、しばらくして "ほんとにそうだな" と思った言葉が私にはあります。 それは高校の英語の授業に出てきた次の言葉です。
Books are to the mind what food is to the body.
本と精神の関係は、食物と肉体の関係と同じだ。

食物を食べるだけで運動しなければ、余分な脂肪になります。
また、食物をちゃんと食べずに運動だけしても、体は健康的に育ちません。

この運動に対応するのが精神(頭)にとっては "考える"、"実践する" ことだと思います。
ただ本を読んだだけでは、それは知識です。 それに対していろいろ考えることによって、身についた知恵となります。

また、人が日常で触れるものは狭い世界です。それだけでは誤った考えに行き着く可能性が高いです。 本では古今東西のいろいろなものに触れることができます。 それらについて考えることはより良く、深い知恵につながります。

本を読むこと自体も頭の運動になるとは思います。 ただ、昔の言葉なので "本" ですが、今ならばテレビ、インターネットなども情報源と捉えることができるでしょう。

取り入れるときの方法

ただ、 "情報について考えるといってもどうすればいいのか" という人もいるかもしれません。
そこで、 私がよくやる方法を一つ紹介します。


それは、
  本や常識に対して、一度反対の立場をとる
という方法です。 一度反論し、今度は自分なりに元の情報の擁護を行います。 自分の頭の中での仮想的な論戦です。

反対の立場で、そちらの方がいいと思えば、それはそのまま自分の考えです。
擁護した結果、やっぱり元の方がいいとなれば、それは取り入れます。 そのまま受け入れるよりも、元の情報はより自分のものになっているでしょう。

コードを読む

よいコードを書くためには、もう一つ いろんなコードを読む ことも大切です。

読書の場合

コードと文章の読み書きには共通する多くの点があると思います。
文章の読解力をあげるために、よく言われている(私の考えでもある)方法があります。
  • 乱読 : いろんな本をざっと読んでいく
  • 精読 : 少数のものをじっくりと読む
  • 自分でも書く
乱読と精読は両方ともやることが大事です。 基本的に乱読し、気になるものを精読します。

コードの場合

コードを読む力、良いコードかどうか判断する力をあげる方法も文章と同じだと思います。

プログラマーであれば、自分で書くということは当然行います。
精読に関しても、自分の作っているプログラムやその周辺のコードをじっくり読むことはやるでしょう。


ここで大切なのは乱読です。これは先ほどの話にも通じます
自分の仕事に関連する狭い世界でのみコードを読んでいると、 その部署特有の悪習などを普通と思い、いびつな成長をすることがあります。
特に周りにコーディングの上手い人が一人もいない場合は最悪です。

今はオープンソースで公開されるものも多く、読むコードには事欠きません。
"この機能はどうやって実装しているのだろう"とか、"自分のプログラムに取り入れたい"とか思った時は、 積極的に読んでいくことをお勧めします。

多言語のコードを読む

自分が普段使う言語以外も勉強し、様々な言語のコードを見るともっと良いと思います。

英語の学習は、単に英語を身に付けることだけが目的ではありません。英語の文化に触れ、日本語以外の思考方法を学ぶことも考えを広げる勉強です。
同じことはプログラミング言語にも言えます。

C 言語を使っている場合でも、オブジェクト指向の考え方は役に立ちます。 同じように C++, C# などを使っている場合も関数型プログラミングのスタイルを知っていることは有益でしょう。

"日常使っている言葉は人の思考方法に影響を与える"と言われています。
プログラミングでも、より多くの言語を使えるほど、 より柔軟な思考ができ、より良い構成、問題の解決策を得ることができると私は思います。

7つの言語 7つの世界7つの言語 7つの世界
(2011/07/23)
Bruce A. Tate

商品詳細を見る

まとめ

最後に今までの内容をまとめます。
  • まず、自分のコードが下手ではないか疑う
  • 自分なりの良いコードの基準を持つ
  • 書籍などの情報を自分の考えとして取り入れる
  • 自分の関連分野だけでなく、他言語を含め、様々なコードを読む


 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
44位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
6位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

04月 | 2013年05月 | 06月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。