島までは遠い

佐藤正志@サークルアラウンドのことが少しわかる場所。プログラマーを育てるトレーナーとして、現役のソフトウェア技術者として、経営者の端くれとして、想うことをつづる予定。しばらくは工事中。

システム開発とプログラミングの狭間

はじめに

プログラミングを知らない人がプログラミング教育をする危険性 - WirelessWire News(ワイヤレスワイヤーニュース)

こちらを拝見していたのですが、内容自体に関してはちょっと置いておいて、少し前からひっかかっている言葉のことが脳裏によぎりました。実はこの言葉の感覚について他人と話したことはないので、私だけが勝手に思っていることかもしれませんし、ひょっとしたら誰かが既にちゃんと整理してくれているのかもしれません。もしも何かシッカリした解説があったら教えて欲しいです。

私の思うこと

下の写真のイメージ感が伝わればなあと思っているのですが、プログラミングはコードを書くことを中心にした部分だと私は捉えているので、システム開発のごく一部の部分です(「プログラミング」という言葉の示す領域を一旦表現したい)。

f:id:ms2sato:20160703000123j:plain

まず最初に「プログラミングの根幹になっているアルゴリズムなどはあるものの、システムを開発するという文脈からすると普段これらはかなり抽象化されて気にしないレベルにされている」という感覚を伝えさせてください。

例えば、WEBシステムを作成している方はSQLを書いている時にorder byを使ってソートすると思いますが、これの中身がどんなソートになっていて、どういうSQLの場合にどれがふさわしいかとか理解している人はそれほど多くないと思います(私も勉強不足のため、存じ上げません)。 また、自分でソートアルゴリズムを実装する場合、ネットワークの方がメモリ上のアルゴリズムの速度よりもはるかに遅い現在の(あくまで現在の話です)WEBシステム運用環境において、ソートのアルゴリズムを何にするかは多くの場合優先度は下がっていると言えるでしょう。もしも既に何かのソートが提供されているならそれを使う(開発効率を上げる)ことを望まれることが多いと思います。 当然ですが、それはソートがどんなものか知らなくて良い理由にはなりませんけれども。

さらにRailsのような秀逸なフレームワークのおかげで、開発において考えなければいけない設計や、よく利用する実装の部分もどんどん考える必要がなくなってきています。「Railに乗るようにする」という言葉が表すように、最近の私たちはオリジナルのクラス構造を編み出す事が少なく、型に嵌ったようにシステムを作ることが良いとされてきていると思います。昔の自分ならそれを設計することが当たり前だった部分が既に提供されているのですね。楽になったけれど一番面白かった部分は無くなってしまったとも感じています。

そうして「プログラミングの根幹」たる部分はどんどんフレームワークに隠されています。システムのコードはフレームワークに乗っかって作成されるので、フレームワークを上手に操作することが良いシステム開発だと暗黙に了解している節があります。開発の効率を目指すならばこれは正しい判断なのでしょう。

ところで改めてシステム開発全体を見ると、プログラミングが担う部分の他に、サーバの扱いやネットワークを構築すること、CIやデプロイに関すること、運用を効率化するための仕組みづくりなど、周辺の要素が多数あります。RailsのようなWEBフレームワークを初学者が学ぶ際には、フレームワークの学びからどんどんプログラミングの根幹へ向かう方向性よりも、周辺の要素の方が重要になります。まずシステムを動かす体験を得てもらうことが大切になるためでしょう。

元記事では「プログラミングを教える」と称して営業されている話が書かれていますが、某T(どこかは存知あげませんが、当たりはつきそうです)の実態としては「システム開発を教えようとしている」だろうと私は理解しています。ですからフレームワークの操り方を中心に教え、簡単なデプロイまでを行うようなカリキュラムではなかろうかと推察します。

営業としては世間によく知られている言葉を使う方が顧客にリーチできるので、「プログラミングを教える」という言葉を使うのは当然なのかもしれませんが、本来は「システム開発を教える」ではないでしょうか。自分のところでやっているトレーニングに「WEBプログラミング」と付けているのも同じような理由ですしね。

ちなみに私が今回の違和感に最初に気づいたのは、どんなものが作りたいかをトレーニングの受講生からヒアリングした時です。プログラミングがどんなものか知りたいだけであれば、私のオススメはJavaScriptです。環境構築せずにブラウザさえあればプログラミングをすることができ、HTMLがどんな風に変化するのかを見た目で確認しながら学ぶことができます。システム開発がどんなものか知りたければ、Ruby(いきなりRailsかどうかは置いておいて)やPHPを薦めるでしょう。言語をどれにすべきかはその人がゴールとしてやりたいことで決まります。脱線するのでこの話はここで止めます。

おしまいに

自分の考えている言葉のニュアンスの違いを示そうと努力してみました。

でも実際「プログラミング」という言葉の領域って私が思っているよりもズッと広いのかな。それとも分けようとし過ぎ?世間でも「プログラミング教育」なんていう時に、それがどこまでを示そうとしているのかなと思ったり。もやっとしたまんまで終わりますが、誰に伝えるでもないブログなので答えがなくても勘弁してくだされ。

私について

言葉の話は持っている背景や文化によって違うと思います。 一応私の技術のバックグラウンドと考え方をだらだら書いておくと、中学生の頃にMSXでBASICをいじったのが最初で、大学の一般教養でC言語やったけどつまらなくてVisualBasicでWindowsアプリ作ったりしてるうちにVC++など弄り始めて、学校出てからPerlでCGI書いたらWEBは結構楽しくて、仕事始めたらWEBのJavaが中心で業務の為のフレームワークのコードばっかり書いて、phpのWEB開発の手伝いしつつガラケーのアプリのプロトをC++で書いてみたり、リッチクライアント的な流れでFlexやら.NETやらやってJSでSPA的なの書いてるうちにnode.jsとかも手を出してめっちゃカオスだけど、二年くらい前にJS中心はちょっと置いといて最終的にはチーム開発をRails使ってやっていたりする、そんな奴です。

言語はあんまり選り好みしません。「ロジックちゃんと書けるなら別になんでもいいんじゃない?」くらいに思っています。チームメンバーが使いやすいのに合わせます。チームの成果の最大化が自分のミッションになることが多いので、自分の開発効率だけで物事判断しません。ちなみに自由気ままにやれるなら、まずフレームワークを作らせて欲しいと駄々こねるでしょう。

人を育てることが会社の方向でもあって自分もやりたいことなので、最近は「お客様に提供するでもなく、趣味でもない」という領域でプログラミングすることも増えてきました。レビューばかりする事も増えたので、たまにガッツリ好きな趣味のコードを書きたくなります。