天然パーマです。

弟へ伝える、技術

うちの会社に 弟がジョイン した。「うちの会社」というのは父親と二人でやっていた「株式会社ワディット」のことだ。なんでこんなことが起こり、まさに「家内制手IT企業」となったのか?についてはどこかの場所で表現するとして、今回は彼に伝えたいことがテーマである。

以下の写真はとある会合で結構過激な同人誌を朗読する弟の後ろ姿。


弟は某大手メーカーの「文系的な仕事」をやってきたのであるが、今回弊社内では、僕がメインでやっているWebアプリケーションの開発も「手伝いたい!」もしくは「自分がメインの開発をしたい!」とのこと。実際、既にとあるアイデアを僕らの中で温めていて、その実装も弟が担うかもしれない。とはいえ、彼には、Webをつくる知識や能力はおろか、Webを含んだインターネットの仕組みを知らないようだ。せいぜい大学の授業で簡単なHTMLを書いて、時間の経過と共に忘れてしまっている、という感じ。これは無謀なことかもしれないが、彼には幸いにして「研修期間」のような時間を設けていているので「ゼロベース」から Webアプリケーション のつくり方を身につけたら素晴らしい。

そんなのは、学ぶもんじゃねー!自ら知識を得て、手を動かすんだ!

なんて言う意見もあるかもしれないし、自分も先生のような役割の人から学んだ覚えはない。しかし、時間は有限だし、弟は決して若くはない。ザックリとした道しるべを示して上げて「 高速道路 」に乗ってみよう。

本エントリーでは、弟をターゲットとして、Webアプリをつくるために必要ないくつかの項目をピックアップしてちょっとした解説をする。あえて公のBlog上でそれを行なう。さて、注意点としては以下がある。

  • Google検索を積極的にして分からないことを減らす
  • ただし出てきた技術記事が100%正しいわけではないことを肝に銘じる
  • レビューなどを参考に優良な書籍を探す
  • とりあえず手を動かすことを尊重しよう

それではいってみよう。


1. Webの仕組み

ブラウザからWebサイトを見る時に何が起こっているのか?一連の裏側を知っておこう。HTTPのプロトコルという意味のWebに限って言えば、Webを支える技術って本でまず学ぶのが良いと思う。ただし、それだけではない…

先日、弟がTumblrで独自ドメインを使ったBlogを開設したいと言って、諸々作業していた。ただ、彼には「お名前.comでドメインを取る」ってことは分かっても、それがレジストラの機能のみを利用しただけで、オプション設定でDNSサーバの機能を使えるようにしないとTumblrへのドメインマッピングが出来ない件が分かってなかった。

また、DNSの特定のドメイン状況を調べるためには dig コマンドを使ったりするけれども、当然、弟はそんなことを知らない。やりたいこと次第で「メール周り」も関係してくるんだけど「Webの仕組み」といえども知っておいた方が良いインフラの知識やそれらをいじるスキルは多岐に渡る。


僕の場合は、大学生の時に、研究室から余り物をもらってきてつくった自宅サーバを使い色々と実験をしていたから「最低限に限り」自然と「分かってきた感」はあったんだけど、今はそれがクラウドとかVPSなどの各種サービスの浸透でブラックボックス化されつつあるからなー。

Tumblrもいいけど、ありゃもうサービスになっているから、一台専用のVPSを立てるから、そこでApacheなりNginxなりのソフトウェアサーバを立ち上げることから始めて、ホームページでもつくればいいのかもしれないね。

2. Unix/Linuxを使いこなす

上記の通り、自分でLinuxサーバを立ち上げた場合、最低限のUnix/Linuxコマンドを知らないとなんも出来ないし、Viを使えた方がいい。エディタの話をするとVimもしくはEmacs、昨今のSublime TextやAtomなどを利用する必要もある。幸いにして、OSXはBSDが裏側で走っているので、おおよそのコマンドが共通している。弟にはMacBook Proを支給しているので付属のTerminalやiTerm2などを立ち上げれば、そこはもうCLI=Command Line Interfaceの世界だ。ローカルでもリモートサーバでもこれらの知識や使いこなしは要求されるので、強制ギプスかのごとく、OSXのターミナルで諸々の作業をしてみるといいかもしれない。

3. プログラミング概要

ここまで来ると、いよいよWebアプリ制作には欠かせない、プログラミングを身につける。当初はLightweight Language=LLと呼ばれる

  • Perl
  • Ruby
  • Python
  • PHP
  • JavaScript

などから言語を選んだ方が試しやすいし、先人たちの知恵が豊富なので良いだろう。プログラミングってのは抽象的に考えると、コンピュータに指示を出すための「言葉」だ。だから論理的思考さえ持っていれば、実はプログラムを書く行為は、弟がそうであるように「文系的」なプロセスに似ているかも。その際に、登場するのはたったの2つ「データ」と「操作」という概念。オブジェクト指向という言葉に踊らされることなく、この2つの概念を実際に手を動かすことで把握し「ピンっと」くれば、ある程度達成したことになるだろう。なお当初はターミナルから実行して、同じターミナル上で結果が出るCLIのプログラムを書くことをオススメする。

基礎が分かれば、特定の目的を持ったアプリをCLIでつくってみよう。各種LLにはそれぞれライブラリが存在する。例えばPerlにおけるCPANは著名なライブラリ群だ。アプリをつくる際にはライブラリの「ユーザー」としてライブラリを使うのが良い。つまり、ライブラリを作成する側がオーサー、使う側がユーザーなんだけども、ユーザーとして様々なライブラリを使っていくと、当然ながらアプリの実装は早くなるし、しばしば見かけるオーサーのことを覚えるかもしれない。「あのライブラリをつくった人だ!」という尊敬の念が生まれると、その人がロールモデルになる可能性もあり、それが更に能力取得のスピードアップにつながる。

4. Webアプリ入門

世の中には各言語ごとに便利な「Webフレームワーク」が存在するので、RubyだったらSinatraなど、なるべく「薄い」ものをチョイスして簡単なWebアプリをつくってみよう。上記で紹介した「Webを支える技術」で紹介されている知識が活かされ、自分がつくったプログラムがURIやHTTPという約束事もしくはプロトコルに則っていることを体感出来るだろう。

ちなみに、僕個人の趣味を、あえてこの場で披露するならば、一般的なWebアプリの場合、Perlを主な言語として使い、Mojoliciousというフレームワークで構成することが多い。


エディタはEmacsを使っている。どうやらEmacsはオッサンが使うものという風評があるらしいが、弟もおっさんに近い年なのでEmacsも悪くないとは思う。

5. RDBMS/SQLを扱う

Webアプリケーションの情報の保持にはデータベースが必要だ。特にMySQLは昔から存在しているという意味では枯れていて、世の中のノウハウも蓄積されているので、オススメ。リレーショナルデータベースの一種だからMySQLを操作するには「SQL」というクエリーを発行しなくてはいけない。例えばボケての「ユーザーIDが2の人」によるボケを先頭から10件取ってくる場合はこうだ。

SELECT * FROM boke WHERE user_id=2 LIMIT 10;

これはデータの取得=READだが、それ以外にも当然ながら、追加や更新、削除などがサポートされている。ま、エクセルの表のようなテーブルをいくつかつくって、SQLっていうので操作すればいいわけだ。また、最終的には、Webアプリケーションから呼び出すため、接続ツールやクエリービルダー、O/R Mapperなどのライブラリを使ってプログラムを書いたりする。

6. フロントエンド

4つ目の「Webアプリ入門」でピックアップしたプログラムがWebサーバの置かれているマシン内のアプリケーションだとすると、閲覧者のブラウザ側で実行されるものを「フロントエンド」と呼ぶ。

主に

  • HTML
  • CSS
  • JavaScript

から構成されている。HTMLはページの構造を定義しつつコンテンツが埋め込まれ、CSSがその見た目をコントロールする。JavaScriptはHTMLを動的に変化させることが出来るために、見た目以外も含んだ「動き」を与える作用がある。実はこの3つだけでもある程度Webアプリっぽいものはつくれるので、先行で勉強してもいい項目かもしれないね。

7. 運用

だいたいアプリケーションが完成してくる。ただ、Webのサービスは実装が終わった段階から、デプロイした後に、運用というフェーズが待っている。そもそもアプリをサーバ内でどのように動かすのか?という問題もあるし、パフォーマンスもある程度出したい。また、

  • リソース監視
  • 死活監視

と言ったWebが正常に動いているか?をモニタリングする必要が出てくる。もし、運用を続けることが出来れば、障害時に問題を解決する能力も鍛えられるだろう。

X. その他

Webサービスの企画が出来て、それをどのように構成し実装していくか?には設計をしないと手を動かすことは出来ない。僕の場合は

  • 外部設計はユースケース図もしくはその記述
  • 内部設計はモデルを分析して図を書く

という作業をやってから、DBスキーマ定義やURLのパスのキメなどに入る。これら設計法はあまり知見が共有されていないので気になるところだが、言えることは「あまり最高の設計を求め過ぎない」ことかもしれない。設計止まりになったら格好が悪い。


また、話変わってクラウドの活用。といっても個人的に役に立っているというAmazon Web Services=AWSなんかを使う際にはそれなりの知識が必要になってくるね。


わーー、やることがたくさんだ

確かにやることたくさんだし、上記には抜けてる事柄もあるんだけども、一歩ずつ 楽しんで やれば、わりかし早めに身につくと思う。さらに、自分がつくったWebアプリが実際に使われることは非常に嬉しいことなんで、ある種の「成功体験」を一度してみるといいでしょうね!


宣伝

独り語り「Podcast」やってます。よろしければ講読をどうぞ〜