マシン語とか

最近の若いもんはマシン語をしらん、けしからん、みたいな話が盛り上がってますね。

そんな若くもないのですが(22歳)、中学のころにはWindows95があって、携帯電話を持っていて、高校生のころには既にADSLなどの高速回線を普通に使っていた、そんな世代の俺の考え。まぁ俺はプログラマでもなんでもないんだけど。

全体的な結論

全体的な結論を先に言うと、個人的にこういう原点回帰的な話というのはそんなに好きじゃない。もっと高次で活躍する人が増えてもいい、と思っているから。一人の人間の時間は有限で、それを高次レイヤにつぎ込んでもっとおもしろいことができるなら、そっちにつぎこめばいいんじゃないかな。俺はそれは全然アリ派。たとえば、音楽でいうと、DTMしかできないやつは音楽できる顔すんな、みたいなのが嫌い。DTMしかできなくてもいい曲かく人なんていっぱいいるし、それでいいと思う。なんていうか、努力とかよりも、感性にあこがれるタイプだからかな。上のレイヤからはいっても、きっと基礎を固めてちゃんとやりたい、それが必要だ、と思えば人は勉強する。だからあえて言うこと(必要だと言い切ること)でもないんじゃないかなあ。現に、だいたいコンピュータ技術者というものは最終的に下のレイヤへ下がっていく人が多いですよね。

マシン語とかについて

きっと議論を呼んでいるのは「絶対必要」みたいに断定してしまったからで、知っていればこんないいことがあるんだよ、という感じならみんな納得するんじゃないかなあ。

上に書いたように俺の世代ってのは中学ですでにWindows95があってVBやらVCやらDelphiがあった世代で。そんなに苦労しなくても見栄えのいいGUIアプリがかける環境があったわけで。当然意識しないとマシン語とかアセンブラには触れない。俺はたしかJAVAからプログラミングに入ったけど、別にマシン語知らなくても全然大丈夫だった。

んでさらにはWebアプリの台頭。Webアプリを書いているときにマシン語をしらないから、という理由で困ったこともないし、新しい言語を覚えるときに困った覚えもない。つまりプログラマでも書くプログラムによってはそんなに必要ない、ということ。そういう時代まで、先人達の努力でやってきた、ということ。暇があるなら低レイヤを覚えておくにこしたことはないけど、他に覚えるべきことがあるなら、そっちを勉強したらいいと思う。

ただ、知っといたほうがいろいろいいことがあるのも事実。なので覚えたい人はがんばりましょう、ということで。

同じことを書いてる人もいるけど、むしろアセンブラとかにこだわりを持っている人のほうが、「ひどい」コードを書くこともあるよね。処理効率を優先しまくって可読性を落としたりとか、何をやってるのかわからないのがイヤ、と自分で必要ないものまで書いたりとか。

俺と低レイヤ技術

とそんなことを書きつつ、実は低レイヤも好きな俺。すみませんすみません。個人的に低レイヤの(特にCPUとか。ネットワークとかじゃなく。)ことを勉強したいなら、エミュレータは一度書いてみるべきだと思う。一個8bitCPUのエミュレータを書いて、そのCPUの逆アセンブラを書いて、デバッガ作って、できれば自分でアセンブラを書いて、アセンブリ言語をマシン語に落として、そのコードを実行させてみれば、CPUの基礎はかなりわかると思う。データがそろってる8bitCPUならそんなに苦労することなくかけるので、一度書いてみてはいかが。アセンブリ言語の書き方も、割り込みがどーたらも、なんMhzとかってなんなの、とかサイクルってなにとかメモリってどうなってんの、DMAってなにがうれしいんだよとかそういやビット演算ってなんの役にたつの、とか色々一気に疑問が解決する。それがわかっていればあとは順をおってCPU関連技術を勉強していけば理解もはやい気がする。自分で命令セットまで考えてそのCPUをソフトで実装すればもっと完璧。

実装言語はなんでもいいんじゃないかなあ。手前味噌だけど、Pythonでもエミュレータを書こうと思えばかけるわけで、PerlでもRubyでもJavascriptでもいいと思う。動作速度よりも理解する過程が楽しいかと。ちなみに自分の書いたPythonでのNESエミュレータだとCPU(6502)とメモリ関連で、簡易逆アセンブラ込みで1000行ほど。速度を犠牲にすればもっと短くかける。

あと、これも書かれてるけどむしろネットワークとか、DBとかのほうがよっぽど低レイヤの知識が必要だよなあ。10BASE-Tと100BASE-Tでなんでつなげるリピータハブの数が違うのかとか、これならどれだけスループットが確保できるか、それをわかるためにもCSMA/CDはなんたるかとか、実際どうやってケーブル上で衝突を検出してんのかとか色々わかってないと困るしねえ。他のネットワーク技術でも一緒。生のパケット(orフレーム)を見なけりゃいけないことも多々あるし。ソフト使ってちゃんと設定がかけます、だけだと意味ない。OSIの層を上から下までカバーしないと。そういった意味でもネットワークっておもろい。

07.27.08/12am

有能なプログラマチェック&雑感

__有能なプログラマの特徴を思いつくまま列挙してみる __

から。なんか流行ってるらしいし、就職という人生の転機も近いのでやってみます。文系のエセプログラマなんで、そんなにくわしくは書けないけど、まぁなんとかかろうじてできてるかな、って場合はどうやってるか、見たいなのも書いて見ます。

×要求自体をシンプル化する

たぶん、できてない。やろうとするんだけど、できてない気がする。

○メタレベルプログラミング

C#もLisp系も普段使わないので、普段使っている言語で考える。たぶん、これはやっているはず。というか前職(ドリコム)の頃には行き過ぎて分かりづらいコードを量産していた気がする。反省。

で、なんでこういうことをし始めたかというと・・・たぶんシンプルにしたかったんだと思う。そして、コードが動くことだけじゃなく、コードの中身にこだわっていたからだと思う。

○DSLをオンデマンドで自作する

どうだろう。Rubyを書いていたときにはそれっぽいことはしていた。Pythonでもするかなあ・・・。

これも、便利にしたい、とかいうよりは俺の場合はコードの中身の問題だったなあ。だってDSLだったり、DSLぽかったらカッコイイじゃないですか。これって結構大事なモチベーションだったりする。

△デザインパターン

あやしい。一応デザパタ入門、J2EEパターンあたりの本は持っていて、きちんと読んだ。たぶん、組み立て方のパターンは頭にはいっているはず。ただ名前とかは忘れた。ある意味無意識に使えるようになってきている・・・といいなあ。

またまたこれもコードの中身の問題。やっぱりデザパタつかってるとカッコイイ、なんて思っていた時代があったわけです。ぶっちゃけPHP書いてた時代です。Mojaviあたりが出てきた時代からPHPは書いておりまして。その頃のPHPのフレームワークなんてのはいかにJAVAのフレームワークをパクるか、みたいな感じで。だからJ2EEパターンあたりまで押さえていたわけです。

△英語

話せない。書くのは遅い。けどPCでなら読むのは結構読めると思う。英語に対する恐怖心とかはない。

このページ下部に翻訳中のドキュメントが放置してあるのは秘密(笑
というわけで英語。書くのはダメだけど、読める。昔どっかで読んだんだけど、その時もすごい人が「翻訳ソフト買ったり使ったりするくらいなら快適に辞書をひける環境を作れ」っていってた。

というわけでやっぱり辞書が快適にひける環境が大事ではないか、と。俺の場合「英辞郎」+「DokoPop!」です。これでどこでもctrl+右クリックで一瞬で引けます。翻訳サイトをブックマークレットから利用したりするより絶対こっちのほうがいいです。

また「Babylon」も同じようにどこでも辞書が引けるソフトです。こいつがすごいのはFlash上の文字(例えば歌詞閲覧サイトのFlashとか)でもその場でctrl+右クリックで辞書が引けることです。

というわけでこの辞書環境のおかげで安心して読めます。

△処理系やライブラリの動作原理の精密な理解

精密な理解・・・はしていないし、自分で実装するなんて考えてもみない。ただし、処理系のソースは読む。前にもPythonでgetattr__getattribute__の違いとかを読んでいた。

これはやっぱり、自分で調べたほうがはやいだろ、っていう気持ちからでしょうか。LLの場合、時として自分の予想と反することがおこるわけで、そういう場合ですね。

○ライブラリに関する知識

たぶん、大丈夫なはず。たぶん・・・

やっぱこれは情報収集をいかにしてるか、ってことだと思う。一応、そこそこRSSは購読してる。動くものを作るときが目的の時(それ自体の学習が目的じゃない場合)はとりあえずライブラリ化されていないか探す。

△基本的なコンピュータサイエンスの知識

宣言的記述と手続き的記述の違いを理解する。 : これは大丈夫。

トランザクション、ロールバック、正規化、外部結合、などなど、RDBの基本 : たぶん大丈夫。昔出会い系のシステムを作っていたときに、ログ集計とかそんなもろもろの部分をやっていていやになるほどやった。出会い系だから、入金とかもからんでいて、結構しんどかった。出会い系でも会員が10万とかになると結構しんどいものがあったし、勉強になったなあ、と思う。
その点、最近はO/Rマッパつかったりで生のSQLなんて全然書かないし、衰えている気がする。その出会い系のところでは10行以上のSQLをガリガリ書いて集計とかをしていた。

言語理論 : コンパイラ―原理・技法・ツール計算論 計算可能性とラムダ計算あたりは読んだ。でもこれは違うな。というわけでこれはダメそうだ。

プロダクションシステム、前向き推論、後ろ向き推論、フレーム、などの人工知能系の概念 : さわりぐらいはやっている。ので簡単なのなら分かる。俺のような文系のプログラマがここらへんのさわりをやるんだったら、Schemeによる記号処理入門がオススメ。
Schemeがわかる人ならすぐ読みきれる。薄いし。練習問題もあるし、コード例もあってわかりやすい。Schemeの解説も随時されているけど、やっぱりSchemeがわからない人にはちょっとオススメしかねるなあ。

ここはいかに本を読んでるかが勝負だと思った。

×セキュリティ技術の基本

これは、だめだ。今勉強したい分野のひとつ。

△プロトコルの詳細

これってどう仕組みか、長所は?短所は?とかっていうことだろうか?それだったらだいたい分かる。HTTP、FTPくらいかなあ、telnetで話せるのは。他はググりながら恐る恐るしゃべるんだろう(笑

これっていつ覚えたんだっけ。たぶん、昔本を読んだんだと思う。HTTPとかFTPはぶっちゃけ使うものってこと。使わないプロトコルなんて、絶対覚えられないとおもう。

○異質なプログラミングパラダイムを理解しておく

大丈夫なのではなかろうか。普段使ってるのはaboutに書いてあるとおりC、JAVA、Python、Ruby、Javascript、C、Delphiといったそこらへんの言語だけど、ふつけるも読んだし、Schemeはわりと好き。gaucheがWindowsで完璧に動くようになれば、メインにするかもしれない。最近はOcamlにすげえ興味がある。

これはただの興味(笑 なにも実用的な意味はなかったりする。単純に、新しい言語を覚えるのは楽しい。それだけ。

×汎用のキーカスタマイズツール

昔は窓使いの憂鬱で、Windowsのキーバインドをviにしていたけど、やめた。俺以外の人が触ると、「このWindows みたいなの 使いにくい」って言われるわ、学校行ったら全然思うようにPCが使えないわで散々だった。つまり俺ポータビリティが落ちすぎる。

Linuxならvim+zsh+screenでzshのキーバーインドもviにして、reverse-i-searchとか自分が使う機能を適当なキーにバインドして使っている。正直、これでなれると生bashでもつらくなるので、そうならないようにWindowsにbashを入れて両方使えるようにしている。

○開発環境の具体的な機能の理解と使いこなし、開発環境のマクロ言語、開発環境の正規表現

大丈夫。俺にとってはvimを使いこなしてるか、と等価だったりする(笑

もうvimを使い始めて3年くらいになるわけで、よく考えたら甘酸っぱい10代からvimを使っているわけで。それでも全然使いこなせている気がしない。

こういうvimを使いこなそうってのは、「気持ちよさ」からきている気がする。ずっと昔は俺も秀丸で書いていたりしたわけだけど、なんていうか、圧倒的に気持ちいい。キーボードを打つのが。

例えば、頭のなかでコードが出来上がっていて、あとはそれをゴリゴリ実装するだけだとする。他のエディタだとその過程がなんかもどかしい。んだけどvimだとその過程が楽しかったりするんだなあ、これが。

○スクリプト言語

自信をもって○を付けられるのがこれくらいな罠。

Rubyでご飯を食べていたこともあれば、Pythonでエミュレータを書いたりする変な人はそうそういないような気がする。RubyとPythonは票がわれそうだし。実際両方やっている身としてはどっちかやってればいいとつくづく思う。

せっかくなのでRubyとPythonについて、文系の素人プログラマが思っていることを書いてみる。どっちも完璧に好みにあうわけでは当然ない。文句を言いたい点は実はPythonの方が多い。でもRubyには決定的にどうもなあ、な部分があるのでPythonに傾いている。

それはRubyの特徴でもあるobj.methodというやつ。カッコつけなくてもメソッドが実行できるっていう。これがどうも俺には扱いにくくてならない。関数をオブジェクトとして扱いづらいし、メソッド呼んでることを忘れて、めちゃくちゃ重いコードを書いてしまう。

Pythonなら標準では()つけないと呼び出せないし、propertyを使えばカッコを付けずに呼び出すこともできる(ココらへん参照)。これがいいんだなあ。たしかPascalあたりから引っ張ってきたものだと思うんだけど。

そのほか、Rubyにはあんまり文句はない。Pythonと違って命名規約がわりと浸透していて統一感があるし、(pythonではgethoge,get_hoge,getHogeが混在している。)、メタプログラミングも統一感があるし(pythonはmetaclassとかデスクリプタとかややこしい)、ブロックは便利だし、call/ccあるし(笑

○プログラミングに飽きて、プログラマを辞めたくなったときの準備をしておく

大丈夫だ。そもそもPCにはDTMから入ったのでそこに戻るのだろう。


○:9(開発環境についての部分はまとめたので3つで数えた)、△:5、×:3。○とその他半々といったところ。文系のくせに、文系っぽいところがとことんダメな気がするのは気のせいか。

○の理由はだいたい「コードの美しさ」、「興味」の2点だったなあ。これは今後も維持していこう。逆にいえば×の部分は興味がもてないのが原因なんだろう。どうやってモチベーションをあげるか、が大事と見た。

こうやって改めて客観的に自分を見てみるのもよいものだなあ。

考えてみるとやっぱりコンピュータの基本があやしいなあ。こういう人はこれからもっと増えてくるはず。一般的なプログラマなら意図的にやろうと思わないと、やらないで過ぎてしまう。

「ゲーム機の変わりに○○を買ってもらって・・」とか「大学で初めて○○に触って・・・」みたいな世代とは根本的に違うんだろうな。俺の年齢ってちょうどPCがPCになった最初の世代なんだよなあ。だって、小学校の時にWindows95ありましたもん。だいたいのソフトはもう、一通りそろってましたもん。中学生から携帯もってましたもん。

というわけで、なんにもしらなくてもPC使えて、プログラムだって組める。そういう世代だからこそ、基礎をもっと勉強しないとなあ。

07.27.08/12am

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages