きしだのはてな このページをアンテナに追加 RSSフィード

2010-08-31(火)

そろそろIDEよりコマンドラインのほうが理解が深まるという有害な妄想は捨ててはどうか? 15:42 そろそろIDEよりコマンドラインのほうが理解が深まるという有害な妄想は捨ててはどうか?を含むブックマーク

Java入門ブックガイド(入門編)よりよき入門書と出会うために」を読んで。

第一印象として、よりよきJava入門ブックガイドに出会う必要があるなということ。


コマンドラインでは慣れ親しめない

サブタイトルに「慣れ親しむことが上達の秘訣」とあるけども、コマンドラインで慣れ親しむのは難しいと思います。

「慣れ親しむことが上達の秘訣」が正しいのであれば、IDEで慣れ親しんだほうが上達するのではないでしょうか?

現実問題として、書籍を買って勉強する人は強制されて勉強するわけではないです。自分の時間をやりくりして入門書を読んでいます。

そして、まだプログラムの面白さを知りません。

コマンドラインコンパイルエラーが出たとき、じっくりとそのエラーを読み解くのではなく、そこでくじけてやめる可能性が高いと思われます。

それよりは、IDEでエラーを入力段階で修正しつつ進むほうがいいと思います。


javac/javaコマンドはJava技術の本質ではない

このような記述があります。

煩わしい作業の中にこそ、その技術の本質があったりするからです。

けど、少なくともコマンドラインでのコンパイル作業にJavaの本質はありません。

ぼくは長いことJavaのプログラム作ってますが、記事用の動作確認以外では、ここ数年はjavacコマンドでコンパイルしてません。実行時にはコンパイルされることもあまり意識してません。

意識しなくてもずっと仕事をやっていけるような部分に本質はないと思われます。

それより、オブジェクト指向のほうがJavaの本質に近いと思われます。オブジェクト指向を腫れ物のように扱って2分冊にするということのほうが、本質をはずしている気がします。


間違い探しはプログラムを組む訓練にならない

入門書のサンプル入力では、失敗した数だけ時間が多くかかるだけで、ほとんど学べることは増えません。

例えば、何かエラーが出たとします。統合開発環境を使わないのであれば、原因と思われるものを列挙し、丹念に個々の原因と思われるものを調べるうちに、失敗していなければ学べないことを学べるのです。

とありますが、ほとんどのミスが大文字小文字のミス、スペルミス、中括弧の抜けです。全角スペースが入ってしまっているというミスも多いです。

このようなエラーなら、おそらく、IDEの入力時のエラー訂正で十分です。

また、失敗していなければ学べないことを学べるようなエラーの場合は、IDEでも学べます。むしろそういうところに絞って悩めるので、有効だと思います。


コンパイルエラーをプログラムのエラーだと誤解する

入門者にとってはエンドレスと思われるこの作業こそ、エラーの少ないプログラムを作るための大変大切な訓練なのです。

とありますが、プログラムで減らすべきエラーはコンパイルエラーではなく実行時のロジカルなエラーです。

コマンドラインで勉強している場合、コンパイルエラーをとるのにあまりにも時間がかかるため、そこがゴールだと勘違いする人を多くみかけました。

けれども、実際はコンパイルエラーがなくなってからが勝負です。

コンパイルエラーを取るのに時間をかけるのではなく、ロジカルなエラーを取るのに時間をかけるべきです。


IDEのほうが調査範囲を広げてくれる

自分の狭い学習範囲を飛び越え調査することを怠るようになります。

とありますが、コマンドラインで学習しているからといって学習範囲を飛び越えて調査するとは限りません。むしろ、その可能性は低いです。

IDEのほうが、補完候補に「学習範囲を飛び越えた」内容を出してくれるし、修正候補にも「学習範囲を飛び越えた」内容を出してくれます。

Javaやライブラリのバージョンがあがったときに、補完候補から新しいAPIの追加を知ったという経験がある人も多いんじゃないでしょうか。

こちらのほうが、学習範囲を飛び越えた調査に結びつきやすいと思います。


大切な概念を学ぶ時間がとれない

たとえば、ぼくはjavacコマンドよりもデバッガやJUnitのほうが大切だと考えています。

「創るJava」ではコマンドラインの解説がないのは、コマンドラインの解説に20ページも取るのであれば、デバッガやJUnit、バージョン管理の説明をしたほうがいいという判断です。

ロジカルなエラーを排除するには、デバッガやJUnitが不可欠です。

その代わりに失う代償を覚えておいてください。

という場合、コマンドラインでの勉強で失うものもちゃんと考えるべきだと思います。コマンドラインでの学習は、もっとも貴重な「時間」というリソースが失われてしまいます。


実際はコマンドラインでの入門のほうが理解度が低い

いろいろあげましたが、コマンドライン信奉者の人たちは、もっとも大切な事実をおそらく知らないのです。

それは、コマンドラインでの入門のほうが理解度が低いということです。

コマンドラインでの学習が時間がかかるものの理解が深まるということが事実であれば、ここまで強く批判はしません。実際には、時間がかかり理解も深まらないです。

プログラムを組んでることすら気づかないのです。

学校でのプログラムの授業の感想として「何をやっていたのかすら理解できない」というものを多く聞きます。プログラムが難しいというのではなく、その授業がなんだったのかすらわからないということです。

理解を深める以前の問題です。

コマンドラインのほうが理解が深まるというのは、もともと理解がある人だけがコマンドラインで学習できたというだけの話にすぎません。

コマンドラインで学習することができた数少ない人を見ての誤解です。

はっきり言って、この記事にあるような、コマンドラインで理解が深めれるというのは、実際の入門者を見たことがない人の妄想としか言いようがありません。

それを信じてしまってコマンドラインで入門してしまうと、多くの人はくじけてしまいます。

それでくじけるようならプログラムなどやらなければいい、という考えならかまわないですが、それは入門書ガイドでやることではありません。


コマンドライン使ってもコマンドラインの使い方しか覚えれない

よいプログラムを組めるようになるためには、アルゴリズムなどの勉強が必要です。

コマンドラインをいくら使ったところで、その勉強の代替にはなりません。

Javaの勉強はIDE使ってとっととすませて、アルゴリズムなどの勉強したほうがよいと思います。


プログラム言語を深く知らせたいなら(2010/09/01 3:05追記)

プログラム言語について深く教えたいなら、javacコマンドでなやませるより、JavaCCでも使ってスクリプト言語作らせればいいと思う


プログラムが組める人にしたいなら(2010/09/01 3:05追記)

プログラムがちゃんと組める人にしたいなら、javacコマンドでなやませるより、計算理論の基礎とかアルゴリズムデザイン読ませてTopCoderやらせまくったほうがいいと思います。

zz 2010/08/31 17:07 同感です。あの記事の結論には違和感。

TM_whispeTM_whispe 2010/08/31 19:35 記事の著者のような古いタイプの方には、煩わしい事を経験しておかないと効率よく体系的な知識を獲得する事を認めてはいただけないのでしょうか?
20代の私からすると、「取っ付き難くてめんどくさいなぁ」というのが本音です。

kjsuitedkjsuited 2010/08/31 21:12 元々vi使いでしたが、今はEclipseを使っています。
同感です。コンパイルエラーに関する調査で勉強になることってまず感じた事無いです。
現在のIDEってコンパイルエラーに関してはリアルタイムでストレスなくずっとチェックしている状態ですもんね。理想のエラー発見は実行時エラーではなく全てコンパイルエラーとして検出されるべきなら、静的言語とIDEはマッチしてるなあと感じています。
「学習範囲を飛び越えて調査」に関してはEclipseのほうが遥かに優れていると思います。キーボードショートカットで定義箇所を辿って行けますし。

aoisomeaoisome 2010/08/31 21:56 会社の新人研修の担当で、linux+vi+コンパイラの環境下で教えた年と、Windows+Eclipseの環境下で教えた年があったのですが、後者が必ずしも良かったとは感じませんでした。たとえば、Eclipseのデバッガの使い方を教えると、逆に煩雑で面倒だという反応の新人さんもいました。コマンドラインで苦労してコマンドを叩いた経験がないと、IDEの便利さやありがたさが理解できない人もいるようです。Eclipseは超多機能なので、Javaを覚えるというよりElicpseの操作を覚えただけになってしまったり。時間が許すならば、コマンドラインでの開発とIDE上の開発を、ステップを飛ばさず順番に教えるべきかなと感じました。

koiekoie 2010/08/31 22:30 Eclipse苦手な人です。どこに何を設定したらいいのかわかりません。コマンドラインはボトムアップでくみ上げていく感じなので、書いてあることだけが行われるという安心感があります。
補完が役にたつってのも理解できないです。直前の変数名の補完ならわかります。
定義場所にジャンプするのはviでも昔からできます。多重定義とか継承でシンプルには行かなくなってしまいましたが。

liquidfuncliquidfunc 2010/08/31 23:32 元ネタ記事に対する意見については激しく同意ですが、初心者にとってEclipseはなかなかエグい代物でした。コマンドラインにしろ業務用IDEにしろ、Javaの本質だけを集中的に学ぶには不向きですね。SmallBasicのようなユーザフレンドリーなJavaの教育用IDEがあったらいいな思いました http://htn.to/9ex6eG

nowokaynowokay 2010/09/01 00:18 まあ、Eclipseは使いにくいツールなのでNetBeansがいいですよ

saturday06saturday06 2010/09/01 01:03 全面同意です。
最近のIDEが初心者に使いやすいかどうかは謎ですが、「IDEよりコマンドラインのほうが理解が深まる」というのは初心者に対するプレッシャー以外の何物でもないと思います。

pixmappixmap 2010/09/01 02:21 両方やればええやん。で、好きなスタイルを選ぶべき。

nowokaynowokay 2010/09/01 02:58 時間がちゃんとあるなら、両方やればいいと思います。
IDEでひととおりやったあとでコマンドラインをやったほうが、コマンドラインからやるよりかなり効率が高いと思います。

tilfintilfin 2010/09/01 08:21 少しそれますがjavaコマンドに関しては本質云々より叩けないとプログラムを実行できないので必須だと思います。
IDEからしか実行できない人が平気でいることもあるので。

vmivmi 2010/09/01 10:53 そもそも、ユーザインターフェースの外にある概念を、ユーザインターフェース『だけ』で理解させようというのが間違ってるような気がします。必要なのは、
【ソースファイル→(コンパイル)→classファイル→(クラスローダ)→実行イメージ】
とか
【ソースファイル→(コンパイル)→オブジェクトファイル→(アーカイバ/リンカ)→ライブラリ→(リンカ)→実行ファイル→(OS)→実行イメージ】
とかを頭の中にイメージできるようにすることなんじゃないかと思うんですが。

そしてそれは、CLIを使えば理解できるというわけでもなければ、GUIを使ったら理解できなくなるというものでもないでしょう。

nowokaynowokay 2010/09/01 11:49 > tilfinさん
いま、javaコマンドでプログラムを起動する必要性はほとんどないですよね。
多くはWebアプリケーションだし、デスクトップアプリケーションならjarファイル作ってダブルクリックすれば起動するわけだし。
サンプルならIDEから実行すればいいと思います。
javaコマンドの説明は、時間があまったときのオプションのひとつで十分に思います。ぼくはjavaコマンドをしらなくて平気ということより、クイックソートをしらなくて平気ということのほうが問題と思っています。

tkurotkuro 2010/09/01 12:21 基本同意なのですが、「抽象化」という工学手法を理解してない場合、確かに「入門時」には弊害はあると思っています。低レベル情報への心理障壁が出来てしまうのですよね。それを理解したうえで上位概念をちゃんと押さえるべきなのはその通りだと思います。要するに一度は触っとけ、と。
僕はIDEはむしろ中級以降の人の作業効率を上げるためのツールの「一つ」としての側面のほうが大きいんじゃないかと思ってます。

sakurai_youheisakurai_youhei 2010/09/01 13:01 コマンドラインvsIDEは学習曲線の違いだろうね。あとJavaは文言が長いからコマンドラインは向かない、IDEの出来がいいしね。

javacjavac 2010/09/01 19:24 Eclipseに頼り切りのクソ重いプログラムを書く能なしプログラマを大量生産するか、プログラムの隅々まで理解することのできる優秀なプログラマを少量生産するかの違いやね。

nowokaynowokay 2010/09/02 16:33 コマンドラインで勉強したらプログラムの隅々まで理解することのできる優秀なプログラマを養成できるというのは、ファンタジーですね。

tockritockri 2010/09/03 01:19 はてブでもここのコメントでも、きしださんの目の前で「IDE=Eclipse」と言い切る人のなんと多いことよ。(NetBeansに乗り換え完了しました)

川久保智晴川久保智晴 2010/09/04 20:31 「Java入門ブックガイド(入門編)よりよき入門書と出会うために」の著者の川久保です。
異論反論が巻き起こると思い、IDEは補足とさせていただきました。いろいろな意見を聞けて非常に参考になりました。私自身、仕事ではEclipse、自宅ではNetBeansを使っています。ディベートと同じようにコマンドライン側で発言し、反論を待っていました。