OSASK-WikiのKの落書きの過去ログ
- 本家:OSA:K
- 過去ログにコメントしたい人も、本家のこめんと欄に突っ込んでください。
- そのうちKによって下のこめんと欄に移動しますので。
必要になったら勉強
- (2004.09.13)
- これはTHE-BBLの件で思い出したので、忘れないうちにいろいろ書いておきます。
- たとえば、OSを作るにはアセンブラの知識が必要、と言われることがあります。基本的にはそのとおりといえるでしょう。しかしだからといって、「OSを作ろうと思い立ったらまずはアセンブラの勉強を」と考えるのは、僕はかなりよくないと思います。
- 僕がおすすめするのは、こういう方法です。まず、何でもいいので好きな言語で作ります。CでもC++でもJavaでもなんでもいいです。そしてどうしてもその言語ではできないことにぶつかることがあるでしょう。そのときになって初めて、勉強を始めるのです。
- これは学校の勉強でも言えることです。たとえばすごく英語が嫌いで、「もう僕は外人と話さないから英語の勉強はしたくないよ」と思ったとしましょう。そう思ったら、それ以上英語の勉強をやる必要はないと僕は考えます。不要だと思うものをやらなければいけないほど、効率の悪いことはありません。
- それよりも、たとえば好きな理科の勉強をどんどんやってもらって、その結果として、どうしても外国の文献を読みたくなったとか、外国の人と英語で話さなければいけなくなったとか、そういう「必要」が生じたときに、英語を勉強すればいいのです。これですと、必要に迫られていますから、やる気満々です。倍くらい効率がいいでしょう。
- もちろん英語が嫌いでも、進学のためには英語が必要、なんていう場合もあるでしょう。この場合も「必要」だからやるべきです。まあこの場合はそれほどやる気は出ないかもしれませんが。
- 僕は大人が(それはえてして教師だったりするわけですが)「今はそうは思わないかもしれないけど、あとでやっておいてよかったと思うはずだから」とかいって勉強させるのをみるとひどいと思います。しかもそういうことを言う大人に限って恩着せがましいです。結局死ぬまで一度も活用されることなく、しかもいやいや覚えたことってたくさんあると思うんですが、そういう経験がない幸せな人なんでしょうか。
- プログラミングの話に戻ると、たとえばC言語のポインタと構造体が分からなくて・・・なんていう場合があると思いますが、それでも構わずがんがん書くべきです。ポインタや構造体なんて使わなくなって何とかなるんです(そりゃあダサいプログラムにはなりますが)。forやwhileがなくても、ifとgotoだけでどうにでもできるとか、そういうレベルの話です。
- もちろん、こんな強引な方法でプログラムしていたら悪い癖がつく、と言う人もきっといるでしょう。しかし、僕はむしろ、非構造化で苦労してから構造化プログラミングを学ぶべきだと思っています。オブジェクト指向も同じで、非オブジェクト指向なプログラミングで散々苦労してからオブジェクト指向を学ぶべきです。苦労したからこそありがたみが身にしみて分かります。最近のプログラマの中にはそういう苦労がないせいで、かえって構造化やオブジェクト設計のセンスがない人がいて悲しいです。・・・そしてもし一生苦労しなければ、そのまま非構造化でいていいと僕は思います。
- ここで確認しておきますが、僕は「必要になるまでやるな」とは言っていません。必要なくても、ポインタや構造体がかっこいいと思っていて、ぜひとも習得したい、と思うなら勉強していいのです。というか楽しいならどんどん勉強してください。楽しいときに勉強するのが一番効率がいいのです。必要も感じない、興味もない、なんていうときに無理してやるのが有害なのです。人生は有限なんですから、是非効率よく時間を使ってください。
- OSを作ろうとすると、すぐにやれカーネルがどうだの、シェルがどうだの、デバイスドライバがどうだのといいますが、そんな風に理詰めで考えていってきちんとOSが作れるのは、既存のOSの構造を真似る場合か、もしくはプログラマが超天才な場合だけです。もっと即物的に考えるほうがはるかにはかどります。たとえば、まずは起動メッセージです。その次にはプロンプトですね。プロンプトができたら、とりあえずclsコマンドをつけてみるとか、echoコマンドをつけてみるとか、そういう風にやっていけばいいと思います。
- OSASKのようにいきなりGUIでいくなら、画面を背景色で埋めて、適当なウィンドウ枠を描画して、マウスカーソルがひょろひょろと動けばいいんです。・・・どこからどこまでがカーネルなのかとか、どこからどこまでがデバイスドライバなのかとか、そんな高級なことを考える必要は全くありません。そんなことはあとで「必要になったら」考えればいいのです。大事なことはOSはこういう動作をするべきだと自分が信じることを一つずつやっていくことであって、内部の仕組みなんてものはあとで直していけばいいんです。
- IPLに何を書くかとか悩む人もいますが、自分のプログラムが512バイトに収まるなら、IPLがどうのこうのと悩む必要はありません。超えたときに、残りの部分を読み込む方法を考えるのです。
- まあ結局、僕が言いたいのは、つべこべ言わないで、とにかく「書け」ということですね。書くことで次に何を勉強するべきかが分かります。書くことで確実にプログラミングの技術が身につきます。知識の獲得ばかり優先していると、いらんことばかり覚えたり、既存の知識に考えが縛られてしまって斬新なアイデアを思いつけなくなったりするばかりです。もちろん知識の不足のせいで苦労することはあるでしょうし、失敗もするでしょう。でもそれでいいのです。その苦労や失敗でいろいろ学べるんです。苦労や失敗のないプログラマは型にはまったどうでもいいものしか作れません。これはOS開発に限ったことではありません。
- ここからは、学ばせる側の考え方を書きたいと思います。
- 必要になったら勉強という考えが正しいのは分かるけど、でもやっぱり最低限これくらいは知っておいてほしい、ということはやっぱりあるものです。その場合、それを勉強してもらうには、「必要だと感じさせる」か「かっこいいと思わせる」という方法があると思います。無理やり強制すれば、それは反感を招くだけです。またお願いすれば貸しを作るだけです。そんなのはどちらも敗北だと思います。
- たとえば僕はOSASKコミュニティにコンパクトなプログラムを書かせることに成功しています。コンパクトにするためのテクニックもみんなよく使いこなしています。僕は小さいプログラム以外を書いてはいけないとか、このテクニックを使わなければいけないとか、そんなことは言っていません。小さくないプログラムを書いてもいいけど僕はバンドルしないよとか、小ささを競うようなコンテストの開催をするなどして、「小さいことはかっこいい」という価値観を共有しているだけです。
- そしてもし自分がやってほしいと思っていることをするように仕向けられなければ、それは自分の力不足を認めてあきらめるべきです。無理強いしてもいいことはありません。英語の必要性を感じさせないまま英語の勉強を強要すれば、まあ勉強が面白いと思う生徒は問題ありませんが、面白くないと思ったら、英語が嫌いになるでしょう。嫌いになったら逆効果ではありませんか。
|