【書籍紹介】Ruby on Rails3ポケットリファレンス

2012/01/23 15:56:27

Pocketreference

 英語ならいくらでも情報があるのだけど……、と言われがちだったRuby on Railsですが、日本語で読める入門書やレシピ本が増えてきました。2012年1月26日発売の『Ruby on Rails 3ポケットリファレンス』(山田祥寛著、技術評論社)も、そんな1冊です。528ページと分厚いですが、四六判(18.8cm×13cm)と片手で持てるので、持ち運びや机の上に置いておく本としてはよさそうです。CoffeeScriptやHerokuの解説が含まれるなど最新のトピックにも対応しています。

 似たような位置付けの本として『Rails3レシピブック 190の技』(高橋征義/松田明/諸橋恭介著、ソフトバンククリエイティブ)があります。両者を比べると、ポケットリファレンスのほうが、個々のトピックの粒度が細かく、記述がやや初心者向けという印象であるのに対して、レシピブックのほうは粒度が中ぶりで中級向けというのが私の印象です。リファレンスとレシピなので、当然の違いといえば当然の違いかもしれません。

 ポケットリファレンスのほうは、各項目について、まず「書式」が冒頭にあって、各メソッドについて解説されています。例えば、「関連するモデルを削除する」、「ログの出力を重要度に応じて絞り込む」といった具合です。コントローラ、モデル、ビュー、ルーティング、テストなど、章別に、それぞれの章で取り使うクラスやトピック群の概要解説もあるので、これまでにCakePHPなどほかのフレームワークを使ったことのある人なら、この1冊で先ずは必要十分ということころかもしれません。

Railsrecipe

 これに対して、レシピブックのほうは、「ネストしたレイアウトファイルを使う」「カラムに対応しない属性を保存可能にする」「フォームの二度押しを防ぐ」など、“やりたいこと”が項目として挙がっているという違いがあります。レシピブックのほうは、通読や拾い読みをしてRails力を上げるのに向いていそうです。逆に、いきなり開発プロジェクトに放り込まれて、取り敢えず手元に辞書的なリファレンスがほしいという人には、網羅感のあるポケットリファレンスのほうが良いのかもしれません。

 変な言い方かもしれませんが、ポケットリファレンスのほうは、英語なら存在しているドキュメントの、サンプルコード付きの優れた抄訳といった印象です。一方、レシピブックのほうは英訳すれば英語圏でも売れそうな本だと思います。

 Ruby on Rails 3ポケットリファレンスの著者、山田祥寛氏によるRails3本としては、『Ruby on Rails 3 アプリケーションプログラミング』(技術評論社)もありますね。いま見ましたらアマゾンの書評で13人が5つ星の高評価。これから入門という人は、コチラも要チェックだと思います。

Ruby/Railsのコードを読むにはroccoとrdefsが便利

2012/01/16 20:17:08

新年明けましておめでとうございます。今年こそRuby/Railsをやってみようという人もいるかと思います。ここではRubyのコードを読むのに便利なツールを2つほどご紹介したいと思います。

ドキュメント生成ツールのRD、RDoc、SDoc

ソースコードに埋め込んだコメントを、そのままドキュメントとして抽出するツールがRubyにはいろいろあります。いちばん古くからあるのは、RD(Ruby Document Format)と呼ばれるもので、Markdownなどと同様に構造を記述できます。

現在、Rubyに標準添付されているのはRDocです。RubyのソースコードからHTML+CSS+JavaScriptを吐き出して、ブラウザで閲覧しやすくしてれます。もう1つ、RDocに似たものにSDocがあります。Sはsearchableのことで、ブラウザ上でクラスやメソッド名をインクリメンタル検索できるのが特徴です。Railsapi.comに行けば、RubyやRailsの検索可能なドキュメントがあります。SDocは、「gem install sdoc」として、適当なファイルを食わせてローカルで使うこともできます。

Rdoc
RDocの例

Sdoc
SDocの例

全体を読みたいときにはrocco

RDocやSDocは、どんなクラスやメソッドがあって、どういうAPIになっているのかというのを調べるときには良いのですが、ソースコードを上から読むためのツールではありません。

最近のRuby/Rails文化では、コメントが丁寧に書かれる傾向があるように感じています。かなりの量の文書が埋め込まれていて、ファイルによってはコード量よりも文書のほうが多いことも珍しくありません。ぱっとエディタで開いて眺めたき、実質的なコードが3、4行しか目に入らないこともあります。こういうときに全体を眺めるのに良いのが、rocco、rdefsの2つです。

JavaScript界隈では最近、CoffeeScriptで書かれたドキュメント生成ツールの「Docco」の利用が増えいているように思います。ドキュメント部分をブラウザの左側、それに対応するコードを右にコードハイライトして表示するというツールですが、非常に読みやすいです。こういうツールを見ていると、ますますHTML+CSS+DOMは、もはや現代の標準入出力なんだなという気がします。

Docco
doccoは左右にドキュメントとコードを分離して表示

doccoはCoffeeScriptで書かれていますが、Rubyにも移植されています。それが「rocco.rb」です。コードハイライトにはPygmentsを使っていますので、ローカルにPythonを入れておきます(入れなくても、http://pygments.appspot.com/ のWeb APIでハイライトさせるようですが)。例えば、

$ rocco -l Ruby -o ~/Desktop/spork gems/spork-0.9.0.rc9/lib/**/*rb

などとやると、以下のようにHTMLファイルを生成してくれます。ドキュメントとコードが綺麗に左右に分かれていますね。

Rocco
doccoをRubyに移植したroccoの例

ブラウザ右上に表示される「JUMP TO …」にマウスカーソルをのせると、ドロップダウンメニューが出てきてファイル間の行き来もサクサクできて、いい感じです。

Menu
roccoではメニューでファイルの行き来も楽チン

ちなみに、rocco.rbを見ると、外部依存のMarkdownライブラリとして、RedCarpet、RDiscount、BlueClothのいずれかをrequireするようになっているように見えますが、私の環境(Mac OS X/Lion/rvm1.10.0/ruby1.9.3-p0)では、Markdown定数が初期化されずにエラーが出ました。なので、rocco.rbに手で

#### Prerequisites
require 'rdiscount'
Markdown = RDiscount

を書き加えました。

構造をぱっと把握したいときはrdefs

「Rubyソースコード完全解説」「ふつうのHaskellプログラミング」などの著書で知られる青木峰郎氏作の「rdefs」というスクリプトも便利です。rdefsはソースコードのclassやmodule、defといった宣言のラインを引っ張り出してくれるツールです。これをEmacsなどのエディタから呼んでコードハイライトさせる環境を作っておくと、*rbファイルを開いた直後に取り敢えずrdefsで全体を見るということが手軽にできます。

Rdefsemacs
rdefsをEmacsで使った例

rdefsは青木峰郎氏のサイトにありますが(リンク)、青木氏の事後承諾を得て私がGem化したものは、

$ gem install rdefs

でインストールすることもできます。このgemのetc/の下に、私が使っているEmacs用の設定をrdefs.elとして入れてありますが、ヘビーなEmacs使いの人であれば、ディノオープンラボラトリのkmoriさんが公開されているanything向けのanything-rdefs.elのほうが良いかもしれません。rdefsには、catのように行数を出力する-nオプションがあるのですが、anything-rdefs.elでは、この行数を見て定義場所にジャンプしてくれるそうです。

コードを読むといえば、このほかにもタグジャンプやデバッガを使ったりするというのもありますね。Rubyだと、そこまであれこれツールを揃える必要はないのかもしれませんけど。


素人がWebサービスを作ってみて分かった9つのこと

2011/09/09 20:30:06

 こんにちは、@IT編集部の西村賢です。IT系のオンラインメディアで編集・記者をしております。タイトルに「ど素人」と書くと、ちょっと嘘になるので「素人」と書きましたが、素人がWebアプリを作ってみた体験談と感想を書いてみたいと思います。「オレもプログラミングを勉強して何か作ってみたい!」と考えている人や、「自分でサーバを借りて何かやってみようと思っていたんだよね」という人の参考になれば幸いです。

 去年の夏、Webアプリケーション開発フレームワークのRuby on Railsのことを調べていて「面白そうだな」と思い、ドキュメントに従ってサンプルアプリをいくつか作ってみました。作ったり壊したりしている間に、こう思いました。

 「あれ? これなら自分が欲しかったサービスが作れちゃうんじゃないの?」

 で、「Worklista」(ワークリスタ)という名前のWebサービスを作りました。3カ月ほど前から親しい友人や同業者の何人かに試用してもらっていて、2カ月ほど前に、ひっそりオープンしました。ソースコードは、GitHubのレポジトリに置いてあります。

Worklista01

開発環境もサーバも手軽に入手できる恵まれた時代

 自分で作ったロゴがひどかったので、サイトロゴはパキスタンのデザイナーに発注して30ドルで作ってもらいました(クラウドソーシングのoDesk.comというサイトがスゴく便利です!)。それと、@ITの連載のネタとしてプロのRails開発者にリファクタリングを通してMVCの基本とは何かというのを実例で教えていただきました。その2点以外はゼロから1人で作りました。

 月並みな言い方ですが、とても良い勉強になりました。

 Railsの勉強を始めて約4カ月。週に4、5時間をかけて3週間ほどで基本機能は実装できました。その後もウジウジとデザインを変えたり、少しずつ機能を足したりで半年以上が経過しています。途中、すっかり存在すら忘れて放置していた期間もあります。

 ドメインを取って、さくらインターネットのVPS(512MBの月額980円のもの)に、Ubuntu、Nginx × 2、Thin × 2、MySQL、Ruby on Railsという構成でデプロイして動かしています。Rails3+Ruby 1.9.2で、Git+Capistranoの楽ちんデプロイです。

 私はプログラマではありませんし、Webアプリと呼べるほどのものを作ったのも今回が初めてです。さらに、「プログラマ35歳引退説」に従えば、すでに引退済みという三重苦みたいなところからのスタートでした。でも、考えようによっては、実に恵まれています。

 オープンソースの良質な開発ツールやフレームワーク、そして解説書籍、解説ブログ、QAサイト(コミュニティ)、サンプル実装(あるいは本番実装すら)など情報が溢れかえる時代に生きています。勉強会やコミュニティも活発。そして月額1000円とか2000円で自由に使えるサーバだって手に入ります。自分で使ってみてよく分かりましたが、オープンソースの教育効果は絶大です。人が書いたソースコードや開発ツール自体の中身が見えることほど、勉強になることはありません。英語まで含めると、ソースコード例も含めてRails関連情報はネット上に溢れかえっています。例えばいま、RSSリーダー機能を実装しようかと考えています(フィードのほうじゃなくて、サブスクライブする側です)。そのために、Livedoor Readerの英語版のオープンソース版、Fastladderのソースコードを眺めたりしています。複数ユーザーがいるプラットフォームでRSS受信をどうモデル化するかって自明じゃないと思うんですが、自分が普段お世話になっているアプリが参考にできるなんてすごい時代です(日本語版のLivedoor Readerはコードベースが違うという話ですが)。

 Worklistaというサービスで何ができるのか、そして何がしたいのかということと、Ruby on Railsで開発してみて分かったことを書いてみたいと思います。個人的な小さなプロジェクトですが、やってみないと分からないことってあるんだなと実感しました。

「これまでの仕事リスト」のCMSがほしかった

 Worklistaは自分のために作ったようなサービスです。記事やブログという仕事のアウトプットを一覧でリスト表示することができます。以下の画面の通りです。

Worklista02_2

 記事を書くと、その後の読者の反応が気になるわけですが、Worklistaに登録しておけば、はてブやTwitter上の反応を1カ所からたどれます。これは自分としては気に入って使っています。「あ、意外にブックマーク数が伸びてるな」とか「Twitterで良くクリックされてるな。どれどれ反応は……」といった具合です。

 フリーライターの人だと、よく自分のサイトに「これまでに執筆した記事一覧」というのを載せていますよね。これまでに自分がどういう取材をしてきたか(あるいは取材を受けたか)、どういう媒体に寄稿やコメントをしたことがあるのか、あるいは、どこでどういう講演をしたか示すことで、仕事の依頼につなげようというセルフマーケティングの一種です。自分用のメモという側面もあるかもしれません。

 こういう業績リストは、手書きのHTMLだと更新が滞りがちです。たとえブログエンジンを使ってエントリ化しているとしても、結構更新が面倒なものです。だから、そうした業績リストが楽に維持・管理できれば便利かもしれないと思ったのでした。

 自分を売り込む際にも「こちらのURLで、これまでの仕事がご覧いただけます」とメールで送れます。タグを使えば「Ruby関連では、こういう記事を書いています」ともURLで示せます。こういう感じの記事を書いています、という履歴書的な意味合いで最大10個のアイテムを1つのタブにまとめることもできます。

Tag
例えば、過去に私がRuby関連で書いた記事は「ruby」タグをクリックして一覧できます

社名や媒体名ではなく個々の「人」に光を!

 Worklistaでは、記事のURLを入れるとHTMLを取ってきて、タイトルや公開された日付を自動的に入れてくれます。対応するURLがある「仕事」であれば、「記事」でなくても構いません。Amazonの自著へのリンクでも良いですし、講演スライドや動画も一緒にリストアップしておけると思います。Amazon、SlideShare、YouTubeなどは書影やサムネイルを引っ張ってくる機能を付けるべきかな、などと考えています。

Add
アイテムの追加画面

 もし、Worklistaが広く利用されれば、これから誰かに仕事を依頼しようという側の人(プロデューサーや編集者、広報担当者、PR関連の人など)が、実際にその人の仕事のアウトプットを一覧できるサイトになるのではないかと思います。記者という仕事をしていると、「どういうジャンルを取材されているのですか?」という質問を、広報部やPR代理店の人に良く聞かれます。その答えがURL一発で分かるというわけです。もしかしたら、「うちの製品・サービスについて記事を書いている人を探したい」というニーズもあるかもしれません。

 個展を開くような“写真家”ではなく、コンスタントに質の高い写真を撮る商業カメラマンっていますよね。あるいはイラストレータ、Webデザイナーにも、そうした人がいくらでもいます。世間一般の誰もが名前を知っているわけではないけれども、良い仕事をしているプロというのはいます。組織に属しているかどうかは別として、そういうプロの1人1人に光を当てたい、というのがWorklistaを作った私の動機です。

 今のところ、コンテンツの多くは雑誌やWebサイトなどの媒体に強く紐付いています。それはそれでパッケージ商品としては良いのですが、それを生んだチームの個々のメンバーや個々の人間を軸としたコンテンツのまとめ方があってもいいのじゃないかと思うんですね。

 日本の媒体に載る記事って署名がないことが多いですよね。あったとしてもクリッカブルじゃないことがほとんどです。クリッカブルで記事一覧が出るとしても、それは、その媒体上の記事一覧であって、その人の仕事一覧ではありません。

 時代が変わりつつある予感があります。誰もが言ってることですが、コンテンツの信頼度や質を判断する指標として、これまでは放送局や出版社といった企業名、そして番組名、雑誌名が重要なシグナルの役割を果たしてきました。今後は、それに加えて「誰のコンテンツか」がシグナルになるように思います。

 例えば、私は日経新聞のIT関連記事をことさら読もうとは思いませんが、井上理さんの署名があるものは全部読みたいなと思います。もし井上記者にWorklistaを使ってもらえれば、そこに「井上記者のRSS」ができます。ですので、井上様、これをご覧のようでしたら、是非サービスを使ってみてくださいませ!

 もう1人、例を挙げると、元CNET記者の鳴海淳義さんがいます。以下を見てみてください。見覚えのある記事もあるでしょうし、彼が非常に優秀な記者だったことが分かります。

Narumin

 と、Worklistaにはそれなりに思い入れがあったりするのですが、それは置いておき、「初めてのRails開発」の体験談を書いてみます。

分かったこと1:Railsは想像以上に分かりやすかった

 Railsによる開発の流れ自体は、想像以上に分かりやすくてシンプルでした。ドキュメント通りに動かしたり、知っていることをやっている限りは非常にストレートです。動かすだけなら、難しいところはありませんでした。ただし、Ruby on Railsに触れるより前に、3年ほど細々とRubyやC(時々ClojureやHaskell)の勉強を続けていましたから、いきなりRailsに取り組んで作り始めたわけではありません。

 最初に『Head First Rails ―頭とからだで覚えるRailsの基本』という本を眺めて概念的なところが分かった後は、オンラインの解説や人のソースコードなどを読み漁りつつ、実践あるのみという感じです。初期化コードをboot.rbに書いて「それは……、斬新ですね……」と、Rails開発者に絶句されたりしつつ(ふつう、boot.rbはRailsフレームワークの初期化のコードが入っているので、ユーザーがいじるものではありません)、だんだんと全体像の理解が進んでいくという感じでした。

 Webアプリなので当然かもしれませんが、Railsで機能を追加していく作業は、HTMLやCSSを書く延長上にあるという感じすらあるなと思いました。ノートに手書きした「なんちゃってUML」を元に、モデルを追加し、マイグレーションを書いてアクションを定義し、ルーティングを設定する。画面で確認してHTMLを調整する。「あ、このへんにこういう機能がほしいな」と思ったら、まずHTMLを書き換えてボタンを作ってしまい、対応するアクションを作る。ボタン名が違うなーと思ったら、またHTMLをいじる。何だかWebページ制作のようです。あ、テストはモデル以外は全然書いていません……。

 モデルが全部で4つしかないシンプルなアプリだからということもあるかと思いますが、むしろ時間がかかるのはCSSやHTMLです。CSSを使ってナビゲーションバーをどうやって作るのが正しいのかとか、CSSの擬似クラスの挙動ってどうだっけと調べたりします。ロゴ画像へのリンクをCSSで指定するときにマイナスの値でオフセットを設定しているサイトがあるのはなぜだろうか……? というように、HTMLやCSSで悩んだりゴニョゴニョしている時間が長かったように思います(後にjQueryを使うようになってからは、CSSの悩みの半分は吹っ飛びましたけど)。そして、Web開発者が共通に嘆く「IE! なぜお前だけこうなる!」という気持ちが良く理解できるようになりました。

分かったこと2:Webアプリは想像以上に複雑だった

 私はIT系の記者・ライターとして、Webアプリやサービスのレビュー記事を書くことがあります。表層的とはいえ、技術トレンドもそれなりに追いかけています。ですから、Webアプリがどう振る舞うべきかということについては、それなりに分かっているつもりです。外から観察できるWebアプリについては結構知っているつもりでいたわけです。

 これはWebアプリに限らないと思いますが、外から見ているのと、中身を作るのとでは大違いです。実際にやってみて分かったのは、Webアプリというものが非常に複雑な構築物だということです。複雑というか、膨大な量の技術の上に成り立っています。その1つ1つについて、それなりに調べながら作っていると、個々のトピックは難しくはなくても、「知らなければならないこと」の量が多くて途方に暮れそうです。

 非常に長いですが、以下に引用の形であれこれ書いておきます。長いですので雰囲気だけ感じ取って読み飛ばして下さい。

 例えば、インジェクション、XSSやCSRFといったセキュリティ対策。Rails3では、デフォルトでテンプレートに埋め込む文字列はエスケープされますが、だからといってインジェクションのことを分かっていなくても良いということではありませんよね。CSRFについても、Railsはトークンを自動で生成してくれたりしますが、なぜそれが必要で、どう使うべきなのかということも、理解するには30分ぐらいはかかります。逆に、Railsなどのフレームワークなしに、素のPHPやPerlでCSRF対策をやるなどということを考えれば、わずか30分で先人のベストプラクティスを生かせるのは物凄いショートカットだなと思いました。いわゆる高速道路っぽいです。

 アプリケーションサーバを設定するにしても、ThinなのかMongrelなのかPassengerなのか、どれを使うべきか、調べだすとキリがありません。格安VPSではメモリが貴重なので、私はThinを選びましたが、ThinをNginxの背後に複数並べるとき、そのコネクションにUnixソケットを使うべきか、TCPソケットを使うべきか、そのメリット・デメリットとは何か? というようなことで、また30分ほど調べたりします。

 認証プラグインのDeviseがBasic認証と相性が悪いと思って調べてみたら、Nginxのリバースプロキシ設定で明示的にBasic認証のパスワードがアプリケーションサーバに渡らないようにしないとダメだった、などというハマりポイントもありました。そういうことで、すぐに30分ぐらい経過します。

 認証プラグインのDeviseの暗号方式や、ハッシュやソルトの保存方式についても、あれこれ調べていると時間がかかります。デフォルトで本当に大丈夫なのかと思えるのに、やっぱり1時間ぐらい時間を使います。

 Ubuntuって、ファイアーウォールの設定にiptablesだけじゃなくて、ufwというのが使えるんですね。で、ツールの使い方を調べたり、ポートの設定を考えたりで1時間。

 ストレージはMySQL一択でしたが、MySQLのエンジン選びも私には自明ではありませんでした。バックアップ方法と合わせて調べだすと、すぐに2時間ぐらい経過していました。

 MySQLのRubyライブラリと日本語のエンコーディング周りの設定も、「そういうことなのか」と理解して設定が終わるまでに2時間ぐらいかかりました。

 DBのインデックスってなんだったっけ? どうして速くなるんだっけ? ということで、B-Treeの図が載っているMySQL解説本なんかも読んだりします。

 「よし、じゃあcronでDBのバックアップタスクを書くかな。書式はこうだっけ? あ、エラーだ。どれどれ、man……、おお、Debianのcrondはsendmailで有名なPaul Vixieさんのやつが入っているのか。どうも書式がキモイな。うん、よし、そうそう、これでオッケー。げ、動かない……。え、cronって環境変数をシステムとは別に自分で設定するのか。そうだっけ、ママン。え、cronってRailsではwheneverというgemを使ってDSLで管理すると楽なの? おお、なるほど」とか言っていると、このへんだけでまた3時間ぐらいかかります。

 ActionMailerとPostfixのTSL設定でハマって8時間ぐらい悩みました。インフルエンザで高熱を出して会社を休んだのをいいことに、延々とやりました。そもそもSMTPでTSLをどう使うべきかを良く理解していなかったので、そうした基礎から調べると非常に時間がかかります。こういうのって、外からWebサービスを眺めていたときには「メールってローカルのMTAを25番で叩いてテキスト流しこむだけでしょ?」としか思っていませんでした。でも実際にはフレームワークの都合もあるし、設定は意外にストレートではありません。いえ、実際には必要だった設定は、たった1行で、後からサーバ管理者の友人に聞けば「一体Postfixの何につまずくの?」とバカにされたりもしたのですが、設定している最中はあちこちのドキュメントを読んだり、Postfix側、Rails側の設定を変えたりで五里霧中といった感じでした。

 長い文字列を画面に表示するとき、適当な長さでカットしたいものです。Railsには標準でtruncateというヘルパー関数がありますが、どうも表示結果がガタガタする。それもそのはずで、日本語とASCII文字では、同じ1文字でも表示幅が違います。じゃあ、ほかのサービスはどうやってこの問題に対処してるのだろうか、といろいろと見て回ってみると、文字種による表示幅を考慮したtruncateをしているサービスがあるじゃないですか。なるほど! というわけで、私も全角文字は2文字としてカウントするtruncstrというヘルパーを定義。こういう細かなところでも、1時間ぐらいかかります。

 途中からJavaScriptライブラリを変更しました。Prototype.jsを消して、jQueryを使い始めましたが、APIを眺めている間に、なぜか気づくとPrototype.jsやjQueryのコードを読み始めていて、なるほどなぁとか言ってるうちに、また2、3時間ぐらいがあっという間に過ぎます。jQueryを使ってAjax化してみたら、もっと早くやれば良かったと思うほど簡単だったのはいいのですが、いざ開発ブランチをマージしてサーバにデプロイしてみると、なぜかサーバ上ではデータロード中のアイコンがクルクル回り続けて画面がアップデートされません。調べてみると、rails.jsというJavaScriptライブラリのラッパーがあるのですが、この中のajax:successがコールバックで呼ばれていませんでした。怪しいと思ったのは、コントローラのrender :partialのオプション指定、jQueryのUJSドライバのバグ、Nginxのプロキシキャッシュの設定、Keep-aliveのタイムアウト設定などですが、私のスキルと時間コストの感覚に照らすと、この問題を特定して解決できる気がしなくて気が滅入りました。結局、この問題の原因は、Ubuntu(=Debian)のNginxのパッケージが古くてバグがあったことでした。バージョン0.8.32より前のNginxは、HTTPレスポンスで201 Createdを返すときに、Content-Lengthヘッダを付けてくれません。このため、HTTP1.1をしゃべるモダンなブラウザは、keep-aliveのときにDOMの描画アップデートを保留して「待ち」の状態に入ってしまうのですね。このことを調べて理解するのに3時間ぐらいかかりました。keep-aliveの挙動ということで、HTTP1.1の基礎が分かっていなかったのだということを悟って、RFCを1時間ぐらい眺めたりもします。

 Railsと直接は関係ありませんが、ソースコード管理ツールのGitも簡単ではありません。2冊ほど入門書を読みましたが、たぶん素振り不足なんでしょうね、いまだに操作が分からなくなるときがあります。「あれ? あっちのブランチのファイルをチェックアウトせずに一時的に参照するときってどうするんだっけ?」とか「マージを取り消すときって、HEADをチェックアウトしてから、追加されたファイルを消去……、あれ? 消去するときのコマンドってなんだっけ? 確か-fを付けないと実行できないやつで、えーと……」とか「一連のコミットをcherry-pickするにはどうするの? え、最近のバージョンは範囲指定できるの?」というように、検索しまくっています。git stashに名前が付けられることを昨日始めて知った、というようなことも続いています。GitHubの公開レポジトリにソースコードを置いたはいいけれど、DBのパスワードを間違ってコミットして世界中に公開してしまった!(注:実際には誰も見ていない。誰でも見れるというだけですね) どうすればいいんだ!! ということも起こりました。で、「ああ、やっぱりみんな良くパスワードをGitHubで公開しちゃうのでFAQなんだね」というのを調べたりで、またまた30分。開発ブランチに秘密情報を持っていると、masterにマージできないので、めんどくさいんだけど、これって普通どうするの? というようなことで、まだまだまだまだ悩みます。

 デプロイツールのCapistranoって、すごく便利そうじゃない! と思って、あれこれ調べて設定するだけで、これまた2、3時間ほどかかります。

 ほんのちょっとしたことでもつまずきます。ブラウザで画像アップロードを受け付けて、モデルのオブジェクトに画像を付加するためのプラグイン「Paperclip」を使っているのですが、このPaperclipが試作アプリでは問題なかったのに、Worklistaに組み込むと、最初はうまく動きませんでした。ImageMagickの問題かと思って手動でビルドしてみたりと頑張ってみました。ところが、ImageMagickを最新版にしても動きません。実は、モデルに書いたPaperclipのオプション文字列で、単数形と複数形を間違えていただけだったのでした。どうしてミスに気付かなかったのか、そもそもImageMagickの問題だなどと見当違いのアタリを付けたのかを考えると、やっぱりRuby/Railsが良く分かってないからカンが働かなかったんだろうなという感じです。ともかくこのときは、3時間ぐらいムダにしました。

 認証プラグインの「Devise」で招待コードを実装するために、どこに何を書けばいいのかと、Deviseのドキュメントやメーリングリストを漁るのにまた2時間ぐらいかかります。Deviseは凄まじく便利ですが、持ち込まれる構造的な複雑さが初心者にはつらいですね。

 複数のRubyやgemをバージョン別に管理できるrvmをいじったついでに、zshの設定に凝りだしてしまということも起こります。どうせならプロンプトにGitのステータス出したいよね、みんなやってるしね。と、適当にそれっぽいブログを検索して、なるほどなるほどとか言いながらコードをコピペ。でも動かない……。ええい! もうこの際、zshのマニュアルをダウンロードして読むか! と、これでまた貴重な朝の2時間が消えたりします。

 ついでにEmacsのGitモードを試してみて1時間……。そういえば、EmacsのRails開発環境だと、実はRails Reloadedじゃなくて、Rinariがいいらしいので入れ替えよう、ということでまた1時間。なんだよ、Emacsっていつからido-modeなんていう便利なものがあったんだ! これはすごすぎる! ん? あれ、なんかキーバインドが難しいな……、よし、ちょっくら練習するか! で、また1時間です。

 ……このへんは盆栽みたいなものですね。ツールをあれこれ調整するのは枝ぶりを調整する盆栽のようです。それ自体が楽しいのですよね。zshやEmacs、Screenのカスタマイズは、無限に時間を潰せます。いい加減20年も使ったし、Emacsを捨てたいと思い、TextMateを一生懸命頑張ってみたり、Redcarを入れてみたりということもやりますから、ツールに親しむのも時間がかかります。GNU Screenの挙動が気に入らず、パッチを作ったこともあります。本末転倒気味ですが、そういうものですよね。

 zshとRails開発は関係があるような無関係のような感じではありますが(たぶん無関係)、何が言いたいかというと、周辺のツールやミドルウェア、プラグインまで含めると、Webアプリの開発で知らなければならないことというのは非常に多く、ともかく時間が必要ということです。

 さらに追い打ちをかけるように、「テストを書かなきゃRuby開発者じゃないよね」という声が聞こえてきます。それで、RSpec、Cucumber、Capybara、Seleniumと、テスティングフレームワークだけで、またいろいろな知識が必要とされます(Seleniumに感動しました!)。いえ、実際にはどれもまあ使うだけかもしれません。しかし、手を動かして「なるほど」という程度に理解するだけでも結構時間がかかります。「個人プロジェクトならテストなんて書かなくていいんですよ、ジャンジャンやっちゃえば」という意見もいただきましたが、見よう見まねでDSLを書けばそれなりに動いてしまうのがRailsです。ドキュメントを眺めながら書けばいいんですよね、といいつつ、やっぱりRSpecやCucumberの本を買ってきて読み始めたりして、また何時間もかかったりするわけです。リファクタリング関連の本も、理論ぽいもの、実践ぽいものとで2冊ほど読みました。

 最近、だんだんとjQueryのコードが増えてきたので、JavaScriptの本を何冊か買い込んできて勉強したりもしています。jQueryの本もサラサラと2冊ほど読みました。jQueryのAPIはシンプルかつ対称性もあって難しいところはありませんが、例えば、jQueryを書くときの重要ポイントとして、DOMのトラバースを想像して効率を考えないと、レスポンスが重たくなりやすいというようなことは指摘されるまで分かりませんでした。実は今のところ、iPadでWorklistaを操作すると、とてつもなくモッサリとしか動作しません。あるいは.bind()と.live()の使い分けを調べていると、ブラウザ上のイベントの伝播のタイミングや規則というものの理解が足りていなかったことが分かったりします。調べだすと面白いなーとは思うのですが、本当に時間がかかります。

 Omniauthという認証ライブラリでFacebookとTwitterのログインに対応しましたが、FacebookのAPIのドキュメントを眺めたり、テストしたり、ということですぐに2時間ぐらい経ってしまいます。Facebookのデベロッパーページは、何というか、阿鼻叫喚ですね。10月1日が楽しみ?

 Facebookのユーザーアイコンは正方形じゃないケースがあります。あれ? じゃあみんなどうやってアイコンを流用してるの? と、いろいろと調べてみると、どうも正方形以外の写真だと、正方形の切り抜き位置をユーザーに選ばせるんですね。こういうのも自分のアイコンを変えながら調べたりすると1時間ぐらいかかります。

 ユーザーのアイコンはFacebookやTwitterがCDN上に持っている画像をURLとして直接埋め込む方式にしました。そのURLは実際にはそれぞれのAPIを叩いた結果、302 Movedで転送された先です。ということは、転送先URLを直接叩くのは微妙にアンドキュメンテッドな使い方っぽいです。ある時、ファイル名の命名ルールが変わるかもしれませんし、ユーザーがアイコンを変えるとどうなるのかよく分かりません。かといってGraph APIを毎回叩くのは遅いし、API制限に引っかかりそうです。API制限を調べてみると、公式には何も書いてありませんが、どうも1分間に600回というようなことがまことしやかに言われています。いずれにしてもアイコン表示の全てで、毎回Graph APIを叩く選択肢は、ちょっとないのかな、と思いました。さらに、よくよく調べてみるとCDN上の画像はユーザーが明示的に消しても何年も消えないまま残ることがあるようなんですね。プライバシー上の懸念がある一方、CDN上のオブジェクトをポイントするサードパティーアプリがあると考えると、この仕様は合理的にも思えます。いや、Facebook自身、あまりに巨大すぎてFacebook上の更新済みオブジェクトのポインタを張り替えることが非現実的なのかもしれません。そもそも302で転送されているというのは、301とは違いますよね。いや待てよ、HTTPのステータスコードの301と302はどう違うのか? と言い始めると、RFCやWikipedia、関連ブログエントリを読み出して、またまたこれは大変に時間がかかります。というように、単なるFacebook連携だけでも、調べ出すと、いろいろ難しい話があるんだなという感じで、そうこう言ってる間に3時間ぐらいかかっています。

 というように、いくらRailsがムダを省いてくれる高速道路(高速鉄道?)のようだとはいっても、前提として必要な知識量が膨大だなというのが感想です。知識もそうですが、振り返って考えると、「どういう仕組みで実現されていて、どうやって、なぜそれをやる必要があるのか」というメンタルモデルが脳内で形作られるのに時間がかかるのかもしれません。Gitが典型です。あるいはテストに関する諸々の概念(フィクスチャ、モック、スタブ)もそうです。だから、後から振り返ってみると、なぜそんなにそのツールやライブラリを理解するのに時間がかかったのか分からない、ということが多くあります。

 Worklistaを作っていく中で否応なく学んだ技術的トピックやノウハウの数々は、自分でも信じたくないぐらいの分量になっているように思います。仕事と家庭を持つサラリーマンが片手間にやるには厳しい感じです。平日の朝5時に起きて、そこから2時間、子どもが起きてくるまでが勝負という感じです。

 もちろん、次にRailsで同じようなものを作るのであれば、ずっと速く作れるだろうなという風には感じていて、それは良かったと思っています。実際、隣の部署が困っている問題に対して、シンプルなWebアプリを1つ作ってみました。特定のWebページをスクレイプした結果を元にTwitter APIを叩き、その統計情報を日々データベースに蓄積していき、Google Chart APIに数字を投げて可視化する、というようなカンタンなWebアプリです。そういうことは朝の2、3時間でできるようになりました。

分かったこと3:完成度を8割から9割に上げるのは大変

 どんな仕事でも「完成度を8割から9割に上げるのはとても大変」ということはよく言われますが、それを身を持って実感しました。

 ユーザーが入力したURLを元に、HTMLをフェッチしてくるという処理には、RubyのNET::HTTPを抽象化したライブラリ「open-uri」を使っています。今のところHTMLをパースするまでもないので、正規表現でtitleタグを切り出しているだけです。これはirb(インタラクティブなRubyの実行環境、いわゆるREPLですね)でちょこちょこ試せば1分で書ける処理です。

 1分で書ける処理でも、ちゃんとやろうと思うと、いろいろと問題があるものです。

 まず、タイムアウト処理が難しい。いえ、タイムアウト処理を書くこと自体は簡単です。でもopen-uriなどが依存しているCライブラリのlibcurlがブロックしていて、実は状況によってはタイムアウトさせることができません。つまり、Cレベルで何か対策するしかないんですね。名前解決が“刺さる”状況では、open-uriやNet::HTTPだけでなく、かなり多くのネットワーク関連ライブラリでタイムアウト処理がうまくいかないようです。調べてみると、CRubyには、それを解決するためのresolv-confという差し替え用ライブラリがあることが分かりました。ところが、このresolv-confを使うと、今度はActionMailerがエラーを吐くようになりました。

 ここで私は途方に暮れました。原因を調べるために必要なスキルが欠けています。あるいは、調べるのに必要と思われるコストと、実現したいことが見合わないのですね。

 文字コード問題も結構大変です。

 open-uriで文字列としてHTMLを読み込んだ場合、そのStringオブジェクトはexternal_encodingの設定に従いますが、それは困ります。UTF-8以外にも、Shift_JISやEUCで書かれたWebページは普通に存在しています。それで、いったん一律8ビットASCIIとして読み込み、HTMLやXML文書に書かれたcharsetを見てエンコーディングを変えるようにしてみました。ところが世の中にはcharsetで嘘をつくWebサイトというのがあるんですね。

 エンコーディングの判定で信じるべき情報には優先順位というのがあって、それはWeb開発者の常識ですよと、後になって教わりました。ついでに言うと、他人のサービスのAPIを叩くときには、HTTPヘッダにメールアドレスなど連絡先を入れておくのがマナーということも、プロの方に教わりました。

 charsetに指定するエンコーディング名として、歴史的経緯からx-sjisというものが残存しています。遠い昔にそういうものがあった気がしますが、これのために文字化けが起こりました。RubyはEncoding::name_listという組み込み定数に、Rubyで扱えるエンコーディング名が“全部入り”という感じ入っています。携帯電話キャリアのものも入っているので安心していたのですが、x-sjisは入っていません(規格上は存在していないので当然ですよね)。なので、x-sjisは明示的にShift_JISとして認識させるコードを書き足す必要がありました。うぐぐ、という感じです。

 さらに、最近のHTMLではASCII文字に入っていない、Unicodeのクオーテーションや記号類が使われます(「»」が典型です)。これらがエスケープされて実体参照(»)となってしまう挙動も、「文字化けしてますよ」と指摘されたことを受けて、明示的に変える必要がありました。

 これはまだやっていませんが、記事の本文の冒頭を引っ張ってきてデータベースに入れたいと思っています。調べてみると、Webページの中でどこが本文かを推定するのは、かなり難しいことであるのが分かりました。本文抽出処理は、終わりなき精度向上の道が待っているヒューリスティクスの世界。サイト個別のプラグインによるアプローチが必要なのだと知りました(一番単純で有効なのは、最も多くの句読点を含む最初のdivタグを本文だと推定する方法らしいです)。

 手元で書いて動くコードは1分でできるのに、例外処理をして9割の完成度に上げるのには、とてつもなく時間がかかる場合がある、ということかと思います。

 しかも、あまり楽しくありません。

 Webアプリにサービス(人に喜んでもらう)としての価値があるとしたら、こういう細かいことを積み上げていく“積分値”こそサービスなのかなという気もしていますけど。

分かったこと4:アプリ作りは思った以上に楽しい

 実際にRailsアプリを作ってみて分かったことの4つ目は、「アプリ作りは思った以上に楽しい」ということです。これには2つの側面があります。実現方法を考えるのが楽しいという面と、ユーザー体験やシナリオを考えるのが楽しいというサービス開発面があります。

 Worklistaでは、各アイテムに対して、はてブ数やTwitter上のクリック数をAPI経由で取ってきて、準リアルタイムに反映しています。この機能を実現しようとしたとき、こう思いました。

 「まさかテンプレート(ビュー)をレンダリングするたびに、はてなのAPIを叩いていいわけがない。相手がもし図書館だったらタイホされちゃう……」。

 では更新の戦略はどうあるべきか? はてブ数の伸びが速いときには頻繁にAPIを叩き、数字の伸びが鈍ってきたらAPIアクセスの頻度を下げる、ということにしました。まず初期更新間隔を180秒とし、この間に5%の伸びが観測できなければ更新間隔の秒数を4倍ずつ増やすようにしています。どうも追随性が悪いので5%という数字を3%ぐらいに変えてみようと思っています(5%というのは「ひとまず消費税率にしておくか」と適当に決めた数字です)。

 こういうことって、経験を積んだ人には、「ああ、そういうときはですね」というように、どうすべきかすぐに分かるのでしょうね。

 APIアクセスはユーザーのアクションとは同期させずに、バックグラウンド処理としましたが、このとき、キューを使った非同期処理の仕組みを何で実現するかもまた、選択肢がさまざまです。

 AmazonRDSのようなサービスを使うのか、MySQLでキューが実現できるQ4Mを選ぶのか、Redisと組み合わせて使えてWeb UIまである高機能なResqueを使うのか、はたまたRailsで標準的に使われるプラグインのdelayed_jobを使うのか、などといったことです。結局、実装をシンプルに保つことを何よりも最優先すべきという判断から、cronでrakeタスクを叩くようにしました。一番つまらないアプローチですが、選択肢を並べて、いろいろと調べたり検討する作業というのは楽しいものだなと思いました。

 ここにあるのは、システムを構築する楽しさで、レゴブロックのような喜びです。誰に文句を言われるわけでもなく、自分が思った通りにブロックを積み上げる子どもが感じる喜びだと思います。

 実装をどうするかということよりも楽しいのは、「ここに、誰でもコメントを付けられるようにするべきだろうか? それは何文字であるべきか? どういうユースケースにしたいのか? コメントと呼んでいるものは本当は何なのか? 誰が、何のためにコメントを付けるのか?」といったことを考えることです。

 やってみて良く分かりましたが、単純な機能1つ取っても、何も自明じゃないんですね。例えば「登録アイテムにタグを付ける」といっても、それは「特定ユーザーのもの」(つまり私が登録したrubyというタグがあるアイテム)と「全ユーザー」(rubyとタグが付いた全ユーザーのアイテム)の2つがあるべきで、そのナビゲーションやURLがどうあるべきか、ということも考えなくてはいけません。

 そうしたものを確定させていくのは楽しい作業です。なぜ楽しいのか、いま、この文章を書きながら、その理由が豁然とひらめきました。

 何を決めるにしても会議がないんですよ!

 Worklistaでは自分の記事を登録するようになっていますが、実は他人の記事を引っ張ってきてコメントや批評、キュレーション的な解説を付けられるようにするべきではないか、と思っています。はてなブックマークと同じく、一種のソーシャルブックマーク機能です。はてなブックマークと違って、

  • 文字を多く書けるようにする
  • コメントにコメントを付けられるようにする
  • 各コメントには「同意!」「同意しかねる!」ボタンを付ける
  • 登録アイテムの多くは情報の発信者自身
  • Twitter、Facebookと連携することで顔が見えるやり取りができる

ということをやると面白いのではないか?

 英語圏でいえば、RedditやDiggといったソーシャルアグリゲーションかもしれませんし、キュレーションプラットフォームかもしれません。Worklistaは、記事を書く人をユーザーとして想定していますが、テーマを持って記事を書いている人は、良きキュレーターでもあるだろというのが私の仮説です。

 「じゃあ最低限の機能でいいからキュレーション機能を付けてみよう」

 そう思ったある朝、タブを1つ追加してキュレーション機能を実装してみました。ところが、「サービスの軸がぶれませんか」と友人の1人に言われました。すぐに考え直し、結局、キュレーション機能は実装後12時間で削ってしまいました。

 この決定には、上司の承認も、関係部署の合意の取り付けも必要がなかったのです。実験的に実装し、実際に触ってみて「意外にいいじゃん! でも、これは別サービスとして切り出すべきかも……」ということが分かりました。オレオレWebアプリ開発って素晴らしいですね。もちろん、ユーザーがほとんどいないからできることではありますけど。

分かったこと5:Webアプリはプログラミングとしては退屈な面も

 Webアプリを書く前から、少しずつプログラミングを勉強しています。新しい言語や概念、アルゴリズム、データ構造、テクニック、ソフトウェア開発にまつわるもろもろを学ぶというのは、知的好奇心を満たしてくれる楽しいアクティビティです。

 一方、Webアプリは複雑で大きな世界ですが、全体像が分かってくるにつれて、プログラミングという感覚がどんどんなくなっていきました。Railsぐらい抽象度が高いと、ソースコードは“動く詳細設計書”という感じです。「こういう機能を作りたい」というのを最短時間で実現できるのは素晴らしいことですが、そこには「よっしゃ動いた!」というプログラミングの喜びは、あまりありません。WorklistaというのがトリビアルなWebアプリだからということもあるかと思いますが。

 フレームワークに乗っかってシンプルなものを作る作業は、実はプログラミングとしては退屈なのかもしれないな、と思えました。日々解決するべき問題というのも、ライブラリのAPIを調べたり、ライブラリの整合性を取ったり、外部APIの調査をしたりと、あまりプログラミングと関係がありません。何かを考えて作るというよりも、次々に現れるツールの使い方を学ぶことで精一杯という感じがします。Railsで学んだことには、ポータブルな知識もあると思いますが、それでも別言語、別フレームワークとなれば、また学び直しかと思うと、開発者の方々が自分が取り組んでいる言語に過剰に思い入れを持つのも分かる気がしました。スイッチングコストが大きいのですね。

 プラグインを作るとか、Railsというフレームワークの中身に踏み込むということをすれば楽しいのかもしれません。

分かったこと6:世の中のWeb APIの充実度

 TwitterのAPIにしろFacebookのAPIにしろ、あるいはGoogleが買収したCAPTCHAサービスのreCaptchaにしろ、実に簡単に実装できるように工夫されています。薄々は知っていましたが、これは新鮮な発見でした。

 使ってもらってなんぼだから当たり前といえば当たり前ですが、人気サービスのAPIは、これ以上はないというほど使うのが簡単です。ドキュメント、APIの実験ツール、ライブラリの提供具合と、凄まじい充実ぶりです。Google Font APIという新し目のものも使ってみましたが、実装するだけなら、検索してドキュメントを眺める時間を入れても10分程度で対応が完了という感じです。

 最初、CAPTCHAを実装しようと思ったとき、私はCのライブラリかImageMagickのスクリプトがあるだろうと当たりを付けました。ところが、思ったよりもそういうものは少ないし、洗練されていないんですね。何故だろうかと不思議に思ったのですが、今やWebサービスとしてAPIで実装する時代なんですね。

分かったこと7:セキュリティは非常に難しい

 FacebookでOAuth認証をすると、コールバックで、こちら側のサーバの任意のエンドポイントに対して、認可トークンを付加した形でHTTPで叩いてくれます。ところが、RailsのOAuthプラグインの「Omniauth」を使うと、標準では、このコールバックのプロトコルとしてHTTPSではなく、HTTPが使われます。

 OAuthで認証・認可したユーザー(のブラウザ)は、このコールバックのURLでリダイレクトされて、Worklistaのサーバを叩きます。このとき、URLに含まれるパスの情報は、HTTPだとリクエストヘッダに平文で含まれるわけですから、ユーザーの認可トークンが盗聴される可能性があります。トークンがあれば、そのユーザーが認可した権限に基づいてFacebookのAPIが叩けます。これはマズイのではないか、と思いました。

 公衆無線LANだと暗号方式にもよるでしょうけど、HTTPだと同一セグメントにいる人々のトークンやセッションは盗聴できますよね。オフィスなどのLANはスイッチングハブなのでパケットの盗聴は直接はできませんが、それでも同一セグメントに「arp spoofing」とググれるだけの知識と悪意のある人がいるかもしれません。平文で流れるトラフィックの盗聴は簡単です。

 セッション・ハイジャックというのは、HTTPでクッキーをやり取りしている限り、本質的に防ぎようがないように思うのですが、違うのでしょうか? 改めて調べてみると、日本の大手ECサイトやSNSサービスですら、全然ハイジャックが楽勝でできるように見えるのですよね……。それどころか、mixiを見て驚いたのですが、ログイン画面ですら、HTTP POSTでパスワードをユーザーに投げさせているではありませんか。

 えっ!? ガラケー対策? それにしても、ユーザーに平文でパスワードを投げさせるのは、ひどくないですか? なぜPCブラウザからのアクセスでSSLを標準にしないのか分かりません。明らかに危険だと思うのですが、大きな問題になったと聞いたことがありません。

 私はFacebookから飛んでくる認可トークンを「HTTPSで守らないと!」と思い、年額2900円のSSL証明書(ちなみに、RapidSSLです。大丈夫です)を取得し、NginxをSSLモジュール付きでリビルドし、HTTPS通信時のブラウザの警告を消すためにFacebookのCDN上の画像をローカルファイルにキャッシュするように一部コードを追加したりしました。でも、もしかしてこれらの作業は、YAGNI(You Ain’t gonna Need It)だったのではないかと思い始めています。すでに友人が何人も登録してくれているのだし、守るべきものは守ろうとは思います。でも、何千万人もユーザーがいるサービスですら、パスワードやセッション情報を守っていないのであれば、登録ユーザー数が40人しかいなくてパブリックな情報しか預かっていない私のサービスで、しかもFacebookのプロフィールが少し読める程度の認可トークンのためにSSLなんて使う必要があったのかどうか、と思わなくもありません。

 ともあれ、セキュリティは本当に難しいですね。調べても調べても分からないことが多いです。

分かったこと8:本当にRailsを学ぶべき人は誰か

 私はWeb(インターネット)には輝かしい未来があると思っています。だから動向がとても気になっています。Webベンチャーが好きで、よく記事も書きます(シリコンバレーのWebベンチャーを取材して記事を書いたりもしています)。そういう私にとって、Worklistaは習作です。自分で手を動かしてやってみれば、技術やサービスについて記事を書くときにも、より良いものが書けるだろうということです。

 習作なのですが、同時に本気だったりもします。

 プロじゃなくても、簡単なWebサービスは作れるということが私には分かりました。多分、やればやるほど上達もするだろうとも思っています。Railsで簡単なWebアプリを作ってみた結果、もっと多くの“非エンジニア”が実装スキルを学ぶべきではないかという気がしてきています。

 ITは、ほかの産業と違って、既存の経済活動に作用してレバレッジを効かせることが価値であるという特性があります。どうITを既存業務に作用させるか、どうやってITなしで不可能なことを実現するかが価値です。だからこそSEの皆さんは“業務知識”を蓄えるわけですよね。その逆のアプローチとして「もう現場のキミがいちばん分かってるんだし、キミが書いちゃえば?」というアプローチも、もっとあってもいいのではないかと思います。

 医療、会計、法律、教育、出版、旅行、ファッション……、いろんな産業がありますが、各分野で本当にイノベーションを起こすべき人々は、今からでもプログラミングを学ぶべきじゃないかと思います。30歳でも40歳でも遅くないと思います。1、2年ぐらい取り組んでみる価値があると思います。本番で使うプロダクトコードを書かないにしても、ITによって何が可能となるかが分かれば、それを適用すべき問題を抱えている人というのは世の中に多くいるはずだからです。

 セキュリティ対策のこと、SQLのチューニングのこと、クラウドを上手に使うというスケーラビリティのこと、あるいは、きちんとテストがあって一定品質のコードで維持・構築していくというメンテナビリティのことなどを除けば、プロじゃなくても簡単なRailsアプリは、比較的すぐに作れるようになると、私は思います。少なくともプロに依頼するために、何がどうやって実現できるのかを知っておくのはとても良いことでしょう。そのハードルは極めて低くなってきています。もちろん、「1週間で分かる!」という類のタイトルの書籍がばらまく幻想のように簡単ではありませんが、例えば外国語を学ぶのよりは簡単で、1000時間程度の取り組みでも十分に意味があると思います。

 ITは既存産業に作用します。この話を私に当てはめると、「IT+ネットメディア」です。

 ITとメディアの接点に、新しい価値を生み出せるものがあるという直観があります(ちなみに私が在籍する会社の社名はITmediaです!)。英語圏を見ていると、HuffingtonPostやQuora、StackOverflow、Ardvark、AsqAny、TechMeme、Redditなど、メディアとサービスの中間と言うべき領域で、新しいプラットフォームが次々に出てきています。自動処理や統計処理というITと、編集者・ライター・読者という人間の重なる領域です。日本でもNAVERまとめや、ザ・インタビューズなど、いろいろとサービスが出始めています。

 そういうものを横目で見ていて、いろいろとアイデアを思い付くわけです。「ザ・インタビューズ」を見ていて、「ちくしょう、オレだって、そういうプラットフォームを作ってみたい!」と思うわけです。

 思うだけではダメで、試行錯誤しながら「やってみる」ことが重要だと思っています。やってみないと分からない。それなら、いつまでも会議室で次世代メディアのあり方を議論していてもしょうがない。サービスの作り方の見当が付かないようでは、何が実現可能で、どうやって外注するべきかも分かりません。それが私の問題意識でした。WordPressを適当にカスタマイズすることがネットメディアなのか? まさか! という気持ちです。

 だから、自分1人だけであっても、まずはやってみようと思って最短距離を走れそうなRuby on Railsを選んだのでした。1人の人間が限られた時間でWebアプリを作るというとき、Ruby on Railsはベストの選択だと思います。過去に、PHPでWebコミュニティを作ろうと1カ月ほど頑張った経験があります。XOOPSベースです。簡単なCRUDアプリの追加が必要なだけだったのですが、目に見えてコードはスパゲティになりました。DBのスキーマも破綻しそうなことが明らかに思えて、すぐに行き詰まりました。反省から学びつつ前進できるとはいえ、どうして良いのか分からないことが多いんですね。その点、Railsは「Webアプリ設計、かくあるべし」というベストプラクティス集として1本のレールがあるので、初心者に優しいと思います。今なら素のPHPでも何とかできる気がしますが、それはRailsがMVCやDBのテーブル設計の基本を“教えてくれた”からです。Railsは「Webアプリ開発者養成ギブスだ」というのは本当だと思います。教えてくれたという意味では、Rubyがオブジェクト指向を教えてくれたということも感じています。

 ともあれ、Webアプリを作る上で、どの程度の工数でどういう機能が実装可能かということは、Worklistaを作ってみたことで、ずいぶん分かったように思います。

分かったこと9:サービス作りに関心がない開発者も多い

 ITを活かすべき現場の人々は、その分野における深い洞察や、将来へのビジョン、そしてパッションを持っていることでしょう。それは貴重な資源だと思います。

 Worklistaを作る過程で、多くのRails開発のプロに会ってきましたが、いちばん驚いたのは「特に作りたいサービスはない」という人が多いことでした。正確に言うと、作りたいのはイケてるライブラリや、開発者向けツールであることが少なくないのですね。開発コミュニティへの貢献が楽しくて、やりがいのあることだという印象です。これはこれで素晴らしいことだと思います。傍目にもオープンソース活動は楽しそうで、できることなら、私もあれこれのプロジェクトに対してパッチを書いてみたいと思い始めています。

 私が熱っぽく今後のネットメディアはどうなるだろうかという話なんかをしたところで、Rails開発者と呼ばれる人たちの多くは乗ってこないんですよね。そりゃあ、そうです。それが仕事ではないですし、特別注視しているわけでもありませんから。

 だからこそ、現場主導の開発には大きな価値が生まれる可能性があるのではないかと思うのです。人間誰しも自分の心配事でこそ必死になれるものです。私は何か新しいネットメディアのあり方がないだろうかと考え続けています。有り体に言って、このまま同じことを続けていても、オレ(たち)は食えなくなるのではないかと思っています。個人としても、企業に属する中堅社員としても現状に危機感を持っています。

 Ruby on Railsを本当に使ってアイデアを形にすべきなのは、開発を効率化したいWeb開発者ではなく、既存産業をITで変革したいと思っている人々なのではないだろうか。Railsに触れてみて、少しそんなこと考えるようになりました。

 ずいぶんいろいろと偉そうに分かった風なことを書いてきましたが、「RubyやRailsをやってみたい!」と思っている人の参考になれば嬉しいです。

優秀なエンジニア5人は二流の1000人を完全に凌駕する

2011/06/21 15:00:44

 1990年代後半のインターネットブームの火付け役といってもいいWebブラウザ「Netscape」の創業者で、現在シリコンバレーで投資家として活躍するMarc Andreessen氏が、あるインタビュー中で「優秀な5人のプログラマは、二流のプログラマ1000人を完全に凌駕する」(Five great programmers can completely outperform 1,000 mediocre programmers.)と発言したことで、ちょっとした話題となっているようです。インタビューはライターのBill Taylor氏(個人サイト)が、自著「Marvericks at Work – Why the Most Original Minds in Business Win」(アマゾンUSへのリンク)のためにインタビューした際の答えとして、Harvard Business Reviewのブログ記事の中で引用されています。

 Andreessen氏は、「生産性の非常に高い人ができることと、平均的な人ができることのギャップはどんどん大きくなっている」とした後に、5人が1000人に勝つということを言ったそうです。

 Taylor氏は、先月New York Timesに掲載された「For Buyers of Web Start-Ups, Quest to Corral Young Talent」という記事への反応としてブログ記事を書いています。New York Timesの記事のほうは、Facebook創業者のMark Zuckerburg氏の言葉を引用しています。Zuckerburg氏は、ある役割を果たすのに飛び抜けた存在であるような人は、非常に優秀な人より「少し良い」なんてものではないと言っています。だからFriendFeedの買収に4700万ドル(38億円)でも喜んで出そうとした、と。1人当たり3億円ちょっとという値踏みということになります。

 FriendFeedには、「Don’t be evil」という標語をGoogleで生み出したことでも知られるGmailの生みの親、Paul Buchheit氏などがメンバーにいます。FriendFeedというサービス自体は、登場時にこそ時流にマッチしていて騒がれた感があるものの、今となっては何だかスパミーなソーシャルサービスという印象しかありません。でも、そんなことはどうでもいいんでしょうね。買収の目的は人材であって、買ったらサービスなんて閉じてしまえばいいのですから。

 最近、こうした人材目的での買収は「acquire」(買収)と「hire」(雇用)を足した造語として、「acqhire」などと呼ばれているようです。GoogleやFacebookに多いパターンです。大枚をはたいて人を買うみたいな話で、ちょっとイヤーな感じもありますが、買われた人たちは合意してるというか、それで一種のゴールを果たせるし、しかも、引き続き自分たちが情熱を傾けるプロダクトの開発に携われるケースも少なくないわけで、それはそれで良いことだと思います。

 私は直接Googleのマネージャクラスの人に聞いたのですが、Googleがモバイル広告のAdMobを買収したとき、買収の目的はズバリ、チームだとハッキリと答えていました。優秀な人たちが、「モバイル広告とはどうあるべきか」を誰よりも先に考えて試行錯誤している。Googleがゼロから始めてテクノロジー的にAdMobに追いつけないなどということはない。しかし、すでに走り出している人たちがいるのだから、Googleから見れば、「仲間になって一緒にやろう」と言ったほうが早いという判断というわけです。つい先日もGoogleはSageTVというテレビのセットトップ向けにソフトウェアを作っていたベンチャー企業を買収していますが、これも人材とプロダクトの“まとめ買い”のうち、どうも前者が強そうなニュアンスです。

 さて、前記のHarvard Business Reviewのブログ記事は、こうした人材の買いあさりと、優秀なエンジニアは1人当たり5000万円から1億円払う価値があるなどというシリコンバレーの雇用市場でのエンジニアの高騰ぶりに対して、個々のプレイヤーの過大評価が起こっているのではないかと論じています。

 Taylor氏は、個々人の能力だけでは達成できないことがあるという例として、スポーツチームの話やウォールストリートの“スターアナリスト”を挙げています。スターとなるようなアナリストは、転職後に、むしろ成績を落とすというのです。なぜかというと、スターアナリストがスターでいられたのは、職場で利用可能な公開・非公開の種々のリソースや、企業文化、ネットワーク、同僚といった存在があってのことだから、というわけです。

 クラウド時代のソフトウェアエンジニアと金融アナリストを比べるのは、あまりにも雑駁です。人員規模と生産性は比例せず、むしろコミュニケーションコストの増大から負の相関となり得るというのは、30年以上も前から「人月の神話」などで指摘されてきたことですが、最近はこの傾向が加速しているようにも思えます。ソフトウェア開発、特にWebサービスの開発・運用において1000人でないと達成できないことで、5人でできないことって何でしょうね。

 確かに最近のシリコンバレーはバブル気味で、人材獲得合戦も加熱しています。でも私には、AndreessenやZuckerbergの言い分が言い過ぎかというと、どうもそんな風に思えないのですよね。皆さんどう思いますか?

【追記】皆さん個人的にはコメントを下さるのに、表には書かない! ちょっと勝手に引用してみます。まず、日●BPの記者で、個人的にとても尊敬しているHさんのコメントです。

1000対5という数字はともかく、ソフトウエア工学が事実上失敗している理由はそういった視点の欠如にあると思います。

冷静な評価です。1000対5は、確かに根拠がない飛び道具かもしれません。Andreessenは、本質的なことが、ちゃんと伝わるような形でズバリと言ってのけるのが上手です。

浅学なもので知らないのですが、ソフトウェア工学では個人の生産性の振れ幅をどの程度に仮定しているのでしょう。良く言われるように製造業などをモデルにしているのだとすると、そこに大きな齟齬がありそうです。

もう1つ、コメントを。こちらは某大手ICT企業にお勤めのGさん

面白いですね。個人的には人材タイプとしては「本人の力はたいしたことなくても、レバレッジを効かせるタイプ(ここでいうスターアナリスト)」と「本当に一人で何でもやっちゃうタイプ」がいると思っていて、ここで評価されているのは後者のほうですかねえ

そういう評価軸もありますよね。確かに、周囲の巻き込みが上手な人は確実にいます。個人の力の差が大きくなってきたとはいっても、世の中にインパクトを与える仕事は遅かれ早かれチーム戦になります。だから、レバレッジ型のプレイヤーは必要でしょうね。最近、シリコンバレー界隈では“product guy”という蔑称がよく議論されています。コードを書かない、アイデアの人のことです。コードが書けない人って何の役に立つの? ビジョン? アイデア? そんなの誰でも持ってるし(笑) という。「いいアイデアがあるんだけど、実装してくれる人いないかな? いや、アイデアの中身はNDAにサインしてからでないと言えないんだ、ふふふ」というのがproduct guyの決まり文句。誰も思い付かないアイデアにいいアイデアなんて、まずないし、勝負はアイデアじゃなくて技術・ビジネス面での実装だというのがシリコンバレーのテッキーな人々の共通認識としてあるように思います。一方で、最近ではその逆に、いややっぱりコードじゃなくても重要な役割を果たす人がいるという、ある意味では当たり前の論駁もあったりして、まさにそういう人がレバレッジ型の人材なんでしょうね。

もう1つ、最速で広告を配信している某ベンチャーの社長さん。

できるエンジニアのチームビルディングが出来る人はほんとにすごいと思います

このコメントも、レバレッジ型人材のことを指しているのだと思います。

どなたか存じませんが、id:tamtam3さんのコメントです。

これって別に、SEに限った事じゃなくてすべての事にいえるよね

クラウド時代のエンジニアで顕著というだけで、確かにあらゆる知的生産に関わる職業で起こりつつあることなのかもしれません。何人が何時間仕事をしたということで出されるアウトプットよりも、誰がどのぐらい創造性を発揮して頑張ったかが経済的なインパクトを持つようになってきているのかもしれません。

Twitter上のyoichi sudoさんのコメントです。

Windows作るとかそういうのは5人じゃできなさそうだな。

私も最初に思い浮かべたのは、Windows NTを作ったデーブ・カトラーのチームです。Linuxカーネルも、2000人とか3000人という規模ですよね。しかし、Linuxって2000人のチームで開発したというよりも、コアに何十人かいて、そのときどきで貢献する人がいるという印象です。今の時代にスクラッチから1000人が集まって作るソフトウェアって何でしょう?

【追記2】少人数で作るプロダクトによる価値が相対的に高まってきたということはあっても、実際には数百人で作るシステムやアプリケーションは今も、そしてこれからもたくさんある、という常識的な見方も付け加えさせていただきます……。相対的に高まってきた、というのは例えば、モバイル向けに画期的OSを作るという話でも、Palm(現在HPが買収済み)がwebOSを70人ほどのチームで作ったというんですね。LinuxやWebKitが下にあるからできることで、そういう点でも以前ほど「大規模」が必然でもなくなってきているのかな、と思ったりもします。

【追記3】acquireのスペルを間違えていました……、スミマセン。ほらね、TOEIC990点の英語力とかいっても、しょせんウンコその程度なんですよ!

【追記4】当たり前っぽい指摘を、もう1つ。何を作るのかが分かっているケース、つまり既存の帳票システムをOA化するというケースと、FriendFeedのような新規サービスをOSSのイケてそうなプロダクトとEC2を使って作るのでは意味が違う、ということもありますよね。作り方が分かっているものは工学となりやすく、そうでないものは、どちらかと言えばアートに近いというような話かもしれません。

GWにオススメのRuby on Rails 3の解説書籍

2011/04/30 7:45:20

 ゴールデンウィークに、まとめてRubyやRailsを勉強したいと思ってらっしゃる方も多いと思います。Rails3に対応した待望の日本語による解説書籍が新たに2冊出ましたのでご紹介したいと思います。

 1冊目は達人出版会から出た電子書籍、「はじめる! Rails3(1)」(黒田努著)です。A4のPDF換算で111ページ、価格は1000円です。PDFもしくはePub形式でダウンロードできます。新たに出た、と書きましたが、この本は実はベータ版という形で、すでに2月に出ていて、4月27日に正式版となりました。


Tatsujin

 全16章で、基礎知識やインストールから始まり、実際にタスク管理アプリを作っていく中で、MVCの基本と実践を学ぶという構成です(目次やサンプルは、ここで見られます)。最初の導入は別として、1章ずつ開発を進めていく中で試しながら学び、ひと通りRailsを使った開発を経験してみたいという初心者向けということです。ただ、この本はシリーズの第1巻で、モデルやビュー、テストについては続刊となる第2巻で解説予定とのことです。

 著者の黒田さんは、Railsのコンサルティングと教育に取り組んで来られた方で、2006年にRubyとRailsに出会って以来、「Rails関連の仕事しか引き受けない」というポリシーで仕事を続けているそうです。すでにRails関連書籍の著書もあり、今回の書籍も、安定感がある説明のテンポが印象的です。

 ちょっと余談ですが、同じ達人出版会から出ている「はじめる! Cucumber」(諸橋恭介著)は、Twitterのようなミニブログサービスを実装するという例を使ってBDDを解説してあって、手を動かしてやってみることが好きな方には、こちらも良いかもしれません。

 さて、もう1冊は、先日(4月28日)、@IT編集部に届いたばかりで、これから書店に並ぶ予定の「Ruby on Rails 3 アプリケーションプログラミング」(技術評論社、山田祥寛著)です。本文だけで460ページある大きな本で、解説の網羅性が高く、レファレンスとしても使えそうです。3500円です。まだざっと全体を見渡して読み始めたところですが、以下、どんな感じかご紹介したいと思います。


Rails3

 基礎知識やインストール方法の後は、ScaffoldでRailsの全体像、そしてMVCの解説とオーソドックスな構成という感じです。4、5、6章で順に、ビュー、モデル、コントローラと説明してあって、ビューが最初なのがちょっと意外な感じがしました。でも、確かに入口としてはビューをいじるのが分かりやすいのかもしれませんよね。M、V、Cの各章は、それぞれ80~100ページとボリュームがあり、基礎から応用まできっちりと解説してあるという感じです。7章はルーティング、8章はテスト、9章が応用編でAjax、国際化、キャッシングなどの解説です。

 特徴は、環境構築でWindows向けのRubyやSQLiteを使っているところでしょうか(もちろんLinuxもあります)。もう1つ、HTML5への言及もあり、最新技術への配慮があるところもいいなと思いました。例えば、Form関連のメソッドでは、実はHTML5のタグが吐き出せるんですね。HTML5非対応ブラウザでも問題なく表示されるので、こういうのって使っていいんですよね。

 図表が豊富で非常に丁寧に編集されているのも好印象です。特に図の量とクオリティには、ちょっと驚かされました。ささいなことですが、スクリーンショットについても、読者に見せるべきものは何か、どういう順番で見せるべきかをキチンと考えた上でリサイズや配置、矢印で工夫している、というのが、いちおう編集者でもある私としては頭が下がる思いです。

 ソースコード中には番号が振ってあるケースが多く、コードのどの部分が何をしているかという解説があるのもいい感じです。コマンドやメソッドを解説する構文解説は、必要な場面で本文に登場しますが、APIと簡単な解説、実際の使い方、オプションなどの追加情報がまとまっていて、後からリファレンス的に使えそうです。ただ、Ruby言語に関する解説は必要最小限で標準クラスのメソッドを説明するという程度のようですので、RubyとRailsの両方をこれから始めるという方は、Rubyの入門書も別途買ったほうが良いのかなと思います。

 著者の山田さんは、元々NECにお勤めで、2003年からはフリーライターとしてJava、PHP、JavaScript、ASP.NETなど幅広いジャンルで執筆されているそうです。


JavaScriptは初心者向けではなく“ハッカー言語”

2011/04/05 17:57:15

 先日、日本Rubyの会会長の高橋征義さんと雑談しているとき、以下の指摘に妙に納得しました。

「私の中ではハッカー言語という分類があって、PerlやLisp、JavaScriptはハッカー向けの言語だと思うんですよね」。

 その心は、これらの言語は多数のプログラミングのパラダイムをサポートしていて、自分が何がしたくて、どれを使えばよいか分かっている人には柔軟で良いのだけれども、初心者が使う言語としては自由度が高すぎて難しいのではないか、ということです。

JavaScriptは最初のハードルこそ低いけど……

 JavaScriptはどこでも動きますし、すぐに「Hello World」が表示できます。文字の色もすぐに変えられます。ほかのどの言語よりも最初のハードルが低く、入門に向きそうです。そういう意味で、初心者にオススメといわれることもあります。しかし、そこからちょっと先に進もうと思っても、「これ」というベストプラクティスがなく、今のところプログラマが決めるべきことが多いように思います。

 例えば、Prototype.jsやGoogle Closureのようなライブラリを使って継承ベースのオブジェクト指向っぽい使い方をするべきなのか、それとも素に近いプロトタイプベースでやるのかということとか、複数ライブラリをどう混ぜて使うべきで、そのときの名前空間の汚染やロード順序をどう管理するのかといったことを考えることになるでしょう。JavaScriptは標準だとコレクションが弱いので、Underscore.jsを混ぜるべきか、あるいは自分で最低限のところは実装してしまうのか、はたまたCoffeeScripのような荒業(?)を使ってしまうのか、というのも使う人の判断次第です。これらは現在、発展の真っ最中で“鉄板”と言えるものがありません。ライブラリを使わないという選択も当然あるでしょうけど、そうすると今度はブラウザごとの差異という本来言語処理系とは関係のない部分で苦労しそうです。

 単にjQueryやCanvasを使って、チカチカ動くものをWebページに埋め込む程度ならいいのでしょうけど、それ以上のものを作るとなると、よく分かった人でないとJavaScriptは使いこなせずに、スパゲティコードが量産される結果となるような気がします。Webフレームワークもまだ決定版がありませんから、MVCのような設計パターンについても深い理解がない状態ではコードが混沌としてしまいそうです。

 追加のメールで高橋さんにお聞きしたら、以下のような指摘が返ってきました。

JavaScriptについては、例えばRubyがRailsと一緒に、その作法や思想込みで広まったように、何かそういう背景となる作法や思想あふれるプロダクト(たぶんRailsよりも、もうちょっと低レイヤーの部品が多そうなもの)が出てくると、初心者から上級者までをきれいにつなげるいい形ができるかもしれません。jQueryやNode.jsはその未来につながる期待を持たせてくれるような(でも、その未来はそれらともまたかなり違うものになりそうな気も)。

 Ruby on Railsは大リーガー養成ギプスだという指摘があります。MVCパターンに則って、Webアプリを作って運用していくとはどういうことか、ということのベストプラクティスがRailsには詰まっています。周辺ツールや開発プロセスについても、何が良いかということがRubyコミュニティで緩やかに共有されています。

 一方、ハッカー言語というのは「こうあるべき」というようなことは何も言いません。そんなものは使う人が考えて場合によっては自分でサブシステム的に作るのであって、ツールとしては選択肢が豊富で生産性が高いことが重要だということかなと思います。LispのS式は道(タオ)、宇宙を生み出すのに必要な要素がすべて入っている、とか何とか……。

 Perlもオブジェクトシステムが後から拡張されていて、CPANではMooseやMouseなど、ほかのオブジェクト指向言語では最初から組み込まれているような言語機能が取り替え可能で、発展を続けています。「Mooseが良さそうなので使ってみたけど、遅くてね。ほかになんかないかなーと思うけど、まあ別に要らないかも」などというのがPerlハッカーっぽい気がします。

 高橋さんは指摘しませんでしたが、私にはC++も、いまやハッカー言語になりつつあるように思えます。Boostなんかを見ていると、「これで何でもできるし、もうこれでいいじゃん!」と一瞬思えたりもするわけですが、普通に考えたら使いこなすのは大変ですよね。ネイティブアプリやインフラ向けソフトウェアを作るのではなく、安定して高品質のコードを作るのが目的の業務系のプロであれば、C++よりもC#を選ぶのは当然でしょうし、そういう意味でもC++はハッカーの言語という感じがします。

Rubyはスッキリしていて初心者にお勧め

 「これからプログラミングを勉強したいけど、どの言語を選べばいいの?」というのはよくある質問です。実は私もときどき聞かれます。「私に聞かれてもなぁ」と内心思いつつ、そういうときに指摘したくなるのが、以下のようなことです。

 プログラミングの初心者はどの言語を学ぶべきかという質問をする人の想像には、「どうもJavaScriptが手軽そう。今後も伸びそうだし、Webのネイティブ言語だからね。良さそう」というのがあるように思えるのですね。でも、すでに書いたように、JavaScriptはハッカー言語なので、ちょっと試す以上の先に初心者が進むのは大変かもしれませんよ、と。私はうっすらそう感じていたので、高橋さんの“ハッカー言語”という言葉に妙に納得したのでした。

 ここでいう「プログラミング初心者」は、さしあたり非職業プログラマ的な人のことで、「新人職業プログラマ」や「未来のハッカー」では、また議論の前提が違って来るとは思います。新人職業プログラマならJavaをやればいいでしょうし、未来のハッカーなら、どの言語から入るかはあんまり問題になりませんよね。

 Rubyファンの私としては、単一継承とmixinというオブジェクト指向のパラダイムで世界観が統一されているRubyは、スッキリと分かりやすく、実は初心者に良いのではないかと思ったりしています。Rubyにはプリミティブ型とかボクシングの概念もありません(内部的にはVALUEというポインタに即値が埋めこまれたりしていて暗黙的にプリミティブ型もありますが)、むしろオブジェクト指向を理解する上では、初心者にとって混乱がなくていいように思います。「Rubyを使ってみて始めてオブジェクト指向が腑に落ちた」という感想は良く耳にします。

 今の時代、プログラミングを学んでいけば、どうせいずれは複数言語を扱い、いろんなパラダイムやデザインパターンを学ぶことになるのでしょう。ただ、最初に学ぶ言語が備えるべき好ましい性質というのは、「どうぞ好きなパラダイムで使ってください」というハッカー言語的なものではないのではないかと思うのですが、皆さんどう思われますか?

Ruby技術者認定試験シルバーを受けてみた

2011/03/10 14:51:45

 こんにちは、@IT編集部の西村賢です。先日、こっそりRuby技術者認定試験のシルバーを受けてきました。100点満点で88点、合格でした。合格ラインは75点。全50問なので13問落とすと不合格です。私は6問落とした計算です。

 感想をヒトコトでいうと、「Rubyのことが良く分かっていないことが分かって勉強になった」というところです。

 以下、体験談と感想を書いてみたいと思います。

試験対策は模擬試験をやれば十分かも

 試験対策は2つやりました。1つは、模擬試験が2パターン収録されている「Ruby技術者認定試験 公式ガイド」(伊藤忠テクノソリューションズ(著)、Rubyアソシエーション(監修)、ITpro(編集))を使って問題を解いたことです。Rubyの概要や文法の解説部分は、ざっと30分ほど眺めて、いきなり模擬試験をやりました。

 2パターンとも80点前後だったので、間違えたところだけを確認して試験対策は終わりにしようかと思ったのですが、せっかくの機会なのでと、Rubyの標準クラスのドキュメントを3時間ほど読みました。ちなみに模試も本番も、どちらも問題数は少なく、制限時間の半分もあれば回答自体は終えられると思います。考えてもしょうがないものですよね。本番では、自信がなくて後で見直そうと思った問題にチェックを付けておいて、後からまとめて再チェックしつつ回答を変更できる機能もあります。コンピュータベースの試験って良くできていますね。受験会場や受験日時の自由度も高いのが楽チンです。私の場合、平日の出社前に自宅から徒歩5分のところに立ち寄って1時間弱で終了、という感じでした。

 さて、試験対策は合計6時間ほどと少なめですが、もちろんそれまでにもRubyには触れていました。過去2年ほど、ゆるゆるとRubyやプログラミング一般を勉強しています。例えば「ぷよぷよの19連鎖を書け」という課題で、ぐちゃぐちゃとやってるうちに何とか2時間ぐらいで書けるぐらいにはなりました。ハフマンツリーを構築するクラスを作れと言われたら、Wikipediaを見ながら、Rubyを使って1時間ぐらいで書けるようにもなりました。自分としては、少しはRuby(あるいはプログラミング)が分かってきていたような気もしていたのです。

 ところが、模擬試験とドキュメントの通読で、いかに自分がRubyの基礎が分かってなかったのかということに気付きました。楽しい発見も多かったです。

遅延されていたものをイーガーに!

 私はIT系媒体の記者・編集者ですから、Rubyなどを通してプログラミングやWeb技術の世界がどういうものかを知っておくのは、基礎体力作りとして重要だと思っています。

 とはいえ、Rubyの勉強は趣味的にやっています。そうすると、どうしても遅延学習メソッドになりがちなのでした。遅延学習メソッドというのは、必要が出てきたときに調べて覚えるという泥縄式のアプローチのことです。私の感覚では、いろいろなテーマで目的が達成できるメソッドやイディオムが身に付くと、そこからの学習ペースがスローダウンするような気がします。だいたいのことはちょっと調べればできるようになるからです。

 遅延学習ではイディオムも偏りがちです。いつまでもfor文を書いていて、eachを使おうとしない人っていますよね。そういうのって遅延学習の弊害じゃないかと思うのです。mapなんか使わなくてもforでも同じことができますから、forだけでも生きていける、というのも似た問題かもしれません。

 そもそも面白そうと思うことばかりやっていると偏るのかな、とも思います。Rubyのまつもとさんが推奨する学習方法として言語処理系を作るというのがありますよね。そういうまんべんなくいろんな知識が必要とされる課題なら別でしょうけど、ちょろちょろと小さなプログラムを作る程度だと偏ってしまうということかもしれません。

 例えば、TwitterのAPIを叩いてXMLやJSONはパースすることはあっても、ファイルをシークして書き換えるようなことって、相対的にやる機会が少ないように思えます。でも、電子書籍のファイルフォーマットをいじろうと思ったら、ファイルぐらいいじるわけで、その基礎体力がないなんて、まあRubyが使えるとは全然言えないよね、ということだろうと思います。私は、FileクラスやIOクラス方面の理解がまったくお粗末だったんですね。FileとFileUtilsがどうして2つあるのかも、ちゃんとその理由を認識していませんでした。

 遅延学習メソッドになるのは切迫感がないからですよね。書籍にしろコードにしろ、どうしても面白いと思える部分しか読まないということになりがちです。

 それで、改めてRubyのドキュメントを読んでみると、自分がいかに基本的なメソッドすら知らなかったことかと思い知りました。改めてちゃんと調べてみると、標準クラスは、ある種の対称性と現実的妥協が混じり合っていて面白いです。各メソッドが破壊的か否か、何を返すかというのは自明で美しい世界のように見えて、実はそうでもないので、よくよく観察し直すのは良いことなのだろうなと思いました。

きっかけとしての資格試験

 実務にはほど遠いのかもしれませんが、「試験を受ける。落ちたら恥ずかしいし、お金が無駄になる」という状況を作ると、擬似切迫感が出てくるということはあるかもしれないなと思いました。1万5000円の受験費は安くありません(こういうのは自腹に限ります)。シグナルとして資格が役立つかどうかは別としても、私の場合はキッカケ作りやレベル感を確認できるものにはなったと思います。頭から順にクラスやライブラリを全部眺めてみたり、いい加減な理解だった部分や、あえて調べたり覚えたりしようと思わなかった「めんどくさいだけで面白くない部分」を潰していこうと思えたのは良かったな、と。キッカケ作りに1万5000円は高くない? と思う人もいるかもしれませんが、そんなことを言ったら食費を浮かせるだけでできるはずのダイエットに何万円もお金をかける理由もありませんよね。

 恥を承知で、もう少し実例を挙げてみます。

 私はファイルオープン時のオプションである「r、w、r+、w+、a、a+」によるオープン後のファイルポインタの位置の違いを、正確に把握していませんでした。必要になったときに調べて試せば分かることだし、覚える必要はないかなとも思っていました。いや、今でも趣味や業務効率化のスクリプト程度なら、それでいいのかもしれないと思っています。

 でも一方、こんなもの、ちゃんと理解して覚えてしまえば良いだけのことだったのだ、と試験を受けた後になって思いました。ファイル操作のセマンティクスというのは、OSごとに多少の違いがあるのかもしれませんが、言語以前の基礎知識としてそもそも知っておくべきことなんだろうと想像しています。LinuxのAPIもついでに調べつつ、こういうのが言語の使い方を学ぶことなのかなと愚考しております。

 そう考えるきっかけになっただけでも試験を受けて良かったな、と個人的には感じています。資格試験というのは、こうしたことをちゃんと分かっていないダメプログラマを見分けるためのものと考えれば、なるほどなという感じです。

「%Y」と「%y」の違いは重箱の隅つつきか?

 こんな例もあります。

 Time#strftimeのディレクティブなんて、「どうせドキュメントを見るんだし、覚える必要ゼロ。そもそも%mと%Mとか%yと%Yとか対称性がなくて意味が分からなくね?」ぐらいに思っていました。ところが試験対策として、この辺を自分でマトリックスを書いて整理してみたんですね。そうしたら、「♪パパパラッパッパー」とファンファーレが脳内で響いてレベルアップしたような感覚がありました。よくよくみると、ちゃんと合理的な理由がありそうだし、それなりの規則性があって覚えられました。

 strftimeのディレクティブって何だか一貫性や対称性がなくて変だと思っていたんですが、あれってUnix文化の一部なんですね。dateコマンドやEmacsでも同じだったのだと、丸覚えしてから気付きました。仕事では日々の面倒を楽にするためにEmacsLispの小さな関数を良く書くのですが、テキストに日付を挿入するようなケースで、もはや何も調べなくてもスパッと書けるようになりました。あるいは最近CapistranoでMySQLをダンプするtaskを書いたのですが、バックアップのファイル名に日付を入れようとして「なるほどな」と思いました。何も迷わずに「%Y-%m-%d」と書けるんですね。いちいち検索するようでは効率が悪いです。

 「%Y」「%y」「%M」「%m」の違いを問うなんて、重箱の隅つつきの知識問題で、試験のための試験でしかないのではないかと私は思っていました。でもそうじゃないかもしれませんよね。利用頻度が高く、ある程度の普遍性がある共通語彙が頭に入ってないのだとしたら、その程度のプログラマだということではないだろうか、と。私が開発を依頼する立場なら、いちいち検索するタイプの人よりも、時刻表現の各言語処理系やOSごとの違い、歴史的経緯、ISOとの関係、ロケールの難しさなどを30分ぐらい楽しそうに語ってくれる人に任せたいなと思います。それに、こういうのって知的好奇心の旺盛さや知的キャパシティの大きさを示すシグナルになり得ると思うんですよね。

試験のジンクス:迷うと間違える

 case~whenで100%自信を持って制御の流れを説明できないのだというとにも試験で気付きました。2つ以上のwhen節がtrueとなるとき、どういう動作になると思いますか? この辺りを問う問題について考えているとき、私の頭の中は以下のような思考が流れていました。

 「いや、コンパイラ技術が未熟だった時代のCじゃあるまいし、breakとか書かなくても、当然ほかの条件節は無視して抜けて出るよね?」「いやいや、でも、もし微妙な条件があって、複数の条件が合致する場合、本来どういう動作をするべきなんだろうか? 複数のwhenを実行すべきじゃないのか? もしその“本来”があるのなら、Rubyはそうなっているに違いない。これは頻出の引っ掛け問題?」「バカか? そんな挙動は聞いたことがないし、あり得ないよ。そもそも複数条件がマッチして実行を期待するなんて混乱の元。最低なコードだろ」「いやいや、これは……」

 私はしばらく考えこんでしまって、結局答えを間違えました。つまり、制御構造の基礎についても100%自信を持って答えられないという程度の理解だったのですね。

 もう1つ、似た例があります。例外処理のensure節が実行されないことってあると思いますか? rescue節に何を書けばそういう状況になると思いますか? 私は知りませんでした。試験終了後に調べてみて、なるほど、確かにこういう動作であるべきなのかもなと思いましたが、やはりこの設問も私は間違えて回答してしまいました。

 さて、ここまで書いてきたようなことは、実務でプログラミングしている方々なら常識なのでしょう。だから、実務でRubyを使っている人なら何も試験対策をしなくても受かるというのはそうなのだろうな、と思います。ただ、私の場合は試験を受けてみて初めて、基礎をきちんと理解して覚えることの意味が分かったように思います。

 こうした気付きを与えてくれるのは、試験を受けるメリットかなと思います。特に、これからRubyに取り組もうという方にはお勧めしたいと思います(私は類似の資格試験であるRails技術者認定試験の運営メンバーの1人なので、この辺はいくらか割り引いて読んでくださって結構です)。

資格試験は役立たないのか?

 日本人は資格試験が好きな国民性という話がありますが、その反面、「資格試験なんか役に立たない」という批判も常にあります。設計自体がヒドい試験も多数存在するようですし、そういう批判があるのも当然かもしれません。ですが、私は資格試験は利用すべき人が上手に利用すれば社会的意義はあるだろうと思っています。

 実務でバリバリ使えるとか、プロとして十分な能力を証明するという意味では、世にある多くの資格試験は不十分なのかもしれません。

 でも、だからといって「役立たない」は言い過ぎとも思います。バランスよく基礎知識や運用上のポイントを問う試験であれば、それは最低限の知識の証明になるでしょう。なので、足切りという意味はあるでしょう。TOEICなども同様で、800点ぐらい取れるのであれば、実務の会話は無理でも基本的な英単語ぐらいは知っていると分かるわけです。逆説的ですが、よく設計された試験であれば、試験対策の勉強をすること自体がスキルアップにつながるということもあります。

 逆にこうした客観指標が一般化する以前には、「オレは海外勤務経験があって英語はペラペラで業務もやってる! 試験なんか免除だ!」と、ぜんぜん通じないブロークンイングリッシュで開き直るおじさんに対して、眉をひそめるぐらしか対処法がなかったという話を聞いたことがあります。「オレは仕事でRubyを使ってるし、ちゃんと書ける!」という人の中に、そういう“自称”がいないとも限りません。

 大学時代の友人が外資系コンサル企業にいて良く言っていたのですが、MBAで学ぶ内容なんか大して役に立たないというのですね。実務を半年もやり抜くことができれば、MBA以上の力が付くのだから、と。まあ、彼女がいたのは「出世し続けるか、ドロップアウトするかの2つに1つしか道がない」という厳しさで知られる世界屈指の経営コンサル集団だったので、ちょっと例外的かもしれませんが。

 MBAで学ぶことは実務に比べたら大して役に立たないという彼女ですが、しかし一方、応募してくる履歴書を見るときに、MBAホルダーというのはある種のシグナルにはなっているというのです。一定以上の能力の証明になります。履歴書を選り分ける際には、やはりMBAという資格は参考にはされている、と。ただ、それは、いきなり履歴書をポイとゴミ箱に捨てられない程度の“お守り”というんです。

 MBAの例を、オープンソース技術者に置き換えてみましょう。

 「資格試験なんか役に立たない」という偉そうなことが言えるのは、RubyのVMやガベージコレクタは私が書きましたとか、Webサービスを10個ほど作った経験があってフレームワークやライブラリのパッチでOSSに日常的に貢献していますというような実績がある人です。オープンソースの世界には、そういう力のある人はウヨウヨいます。だから、実力を示したいエンジニアはオープンソースで何か貢献するのが近道だし、世の中的にも良いことじゃないかと思います。でも、いきなりそんなことができる人ばかりじゃないですよね。これからRubyに取り組もうという人や、企業の採用担当者にしてみれば、資格というのは、最低限のスキルがあることを示す良いシグナルになるように思います。

 開発案件を委託する側からしても、「うちはRubyのエキスパートが揃っています」と主観で言われるよりも、「Ruby技術者認定試験の保有者が5人います」というほうが客観性があって安心できると思います。資格試験を鼻で笑える実力があるのなら、よほど広く知られた実績でもない限りは受験して合格してしまったほうが物事がスムーズに進むことが多い。それが資格というものなのかなと思います。

 こういう視点でいえば、Ruby技術者認定試験のシルバーは、よく設計された良い試験なのではないかと思います。まあ私ごときが言っても説得力があるか分かりませんけれどね。

禅の公案(Koan)がプログラミング学習でプチブーム

2011/01/24 17:45:35

 ロンドンのRailsエンジニア、井上真さんに連載していただいている「Railsで目指せ、情熱エンジニア」の第3回、「DojoとKataでRubyを学ぼう」を公開しました。

 海外のRubyistの間では、Dojo(道場)や、Kata(空手のカタ)という言葉を使って、ある種ストイックに、そして方法論を持ってプログラミングスキル向上に取り組もうというのが、ちょっと流行っています。詳しくは記事をご覧いただきたいのですが、記事内で紹介しているDojo、Kataのほかにも、Koan(禅の公案)のような学習コンテンツが、1つのスタイルとして、ちょっとした広がりをみせているようです。公案というのは禅問答ですね。nilとは何か? 何もないことだ。何もないのにオブジェクトとはこれいかに……?

 Rubyistなら、ご存知の方も多いかもしれませんが、「Learn Ruby with Edgecase Ruby Koan」というサイトがあります。コンテンツをダウンロードして実行すると、「あなたはまだ悟りには到達していない。次のコードについて瞑想せよ」というようなノリで、次々とテストケースがfailします。「配列について」「nilについて」など、Rubyの基本仕様の結構細かいところを突っついてきます。例えば、nilオブジェクトで何らかのメソッドを呼んだときに上がって来る例外は? とか、「nil.nil?」はtrueかfalseか、nilをstringに変換すると何になるか? といったようなことです。「obj.nil?と書くのと、obj == nilと書くのはどちらがいいか、考えてみよ」と、思わせぶりなメッセージも随所に登場します。こういう感じで、約30個あるジャンル別のテストケースの空欄を埋めていくことで、Rubyの仕様を学習するというものです。本を読むよりもゲーム感覚でできるので、達成感があるのがいい感じです。

Koan01_2

 GitHub上で「koan」と名前がついたレポジトリは、すでに約100個もあります。JavaScript、Python、.NET、Objective-C、Groovy、Scalaなど、ほとんどどんな言語でもありそうな勢いです。関数型特有のイディオムをClojureで紹介する「Functional Koan」なんていうのもあります。

 Rubyのまつもとさんは、練習と反復による技術の向上があるのはプログラミングとスポーツの共通点と指摘しています。習うより慣れろの精神で、KataやKoanで練習するのもありかもですよね。


ddコマンドのラッパー「ddr」をRubyで書いてみた

2010/12/14 18:19:27

 さくらインターネットの田中社長が、ddコマンドの知られざる(?)機能をブログでご紹介されていました。ddコマンドって、ディスクイメージを流しこむとか、パーティションの引っ越しをする、というような実行時間のかかる作業に使うことがありませんか。どのぐらいコピーが進んだのかよく分からなくて、ああ、UNIXは本当に寡黙なシステム(問題なく実行できている限り何も言わない)だなと思ったりします。

 実は、manを見れば書いてあることだったらしいですが、ddのプロセスにUSR1シグナルを送れば途中経過が表示可能です。以下、田中社長のブログから引用。

[root@wwwxxxxu ~]# dd if=/dev/zero of=/dev/null &
[1] 31092
[root@wwwxxxxu ~]# kill -USR1 31092
7764899+0 records in
7764898+0 records out
3975627776 bytes (4.0 GB) copied, 6.02001 seconds, 660 MB/s
[root@wwwxxxxu ~]# kill -USR1 31092
25123042+0 records in
25123041+0 records out
12862996992 bytes (13 GB) copied, 17.8137 seconds, 722 MB/s
[root@wwwxxxxu ~]# kill -USR1 31092
43986419+0 records in
43986418+0 records out
22521046016 bytes (23 GB) copied, 31.3739 seconds, 718 MB/s
[root@wwwxxxxu ~]# kill 31092
[1]+ Terminated dd if=/dev/zero of=/dev/null
[root@wwwxxxxu ~]#

という感じです。

 で、この機能を元にプログレスバーを表示するスクリプトを使ってらっしゃるということです。10年来のPerlユーザーというお話を聞いてますので、きっとPerlスクリプトなのでしょう。私はこれをRubyで書いてみようと思いました。

 Ruby用のプログレスバーといえば、高林哲さん(migemoやNamazuの作者、あるいは「バッドノウハウ」という言葉の生みの親として知られていて、今はグーグルにお勤めのはず)が書かれた、ProgressBarというgemがあり、これが使えそうです。使い方は、以下のような感じです。

[Mac:ken]/Users/ken% gem install progressbar
Successfully installed progressbar-0.9.0
1 gem installed
[Mac:ken]/Users/ken% irb
ruby-1.9.2-p0 > require 'progressbar'
 => true 
ruby-1.9.2-p0 > p = ProgressBar.new("test", 100)
 => #<ProgressBar:0/100>
ruby-1.9.2-p0 > 100.times{sleep(0.1); p.inc}; p.finish
                                                               | ETA:  --:--:--
test:          100% |oooooooooooooooooooooooooooooooooooooooooo| Time: 00:00:38
 => 2010-12-12 18:08:05 0900 

 しかし、ddの対象となるデータのコピー進ちょくとなると、ちょっと面倒そうです。count=で渡されるブロック数から逆算するか、あらかじめ入力ファイルのサイズを知っておくなどしなくてはなりません。いずれにしても条件を分けないといけません。

 まあ、プログレスバーは置いておいて、ともかく、進ちょくの統計情報を表示するだけでも便利そうということで、以下のように書いてみました。

#!/usr/bin/env ruby
#
# dd command wrapper
#
pid = Process.spawn('dd', *ARGV)
Thread.new do
  loop do
    sleep 1
    info = IO.popen("kill -SIGINFO #{pid}")
    puts info.readlines
    puts
  end
end
Process.waitpid(pid, 0)

 実行結果は以下のような感じです。

[Mac:ken]/Users/ken/code/ddr% ./ddr if=/dev/zero of=/dev/null count=3000000
544077+0 records in
544076+0 records out
278566912 bytes transferred in 1.002903 secs (277760577 bytes/sec)
1089204+0 records in
1089203+0 records out
557671936 bytes transferred in 2.007118 secs (277847112 bytes/sec)
1633654+0 records in
1633653+0 records out
836430336 bytes transferred in 3.010989 secs (277792540 bytes/sec)
2179604+0 records in
2179603+0 records out
1115956736 bytes transferred in 4.014571 secs (277976572 bytes/sec)
2726554+0 records in
2726554+0 records out
1395995648 bytes transferred in 5.018349 secs (278178262 bytes/sec)
3000000+0 records in
3000000+0 records out
1536000000 bytes transferred in 5.523351 secs (278092040 bytes/sec)
[Mac:ken]/Users/ken/code/ddr%

 こういうのって、やってみるといろいろと勉強になります。やってること自体は単純ですが、Mac OS Xの実装ではddに送るべきシグナルは「USR1」ではなく「SIGINFO」でした。LinuxではUSR1ですね。FreeBSDはどうなんでしょう。

 最初、Process.spawnではなく、Process.forkを使ったのですが、このあたりはプラットフォーム依存で、Ujihisaさんのこのブログエントリが参考になります。

 waitpidがうまく子プロセス終了を待ってくれなくて、Rubyのkernelが終了してしまいます。何か変だと思って、結局waitpidについても調べたのですが、すると当然のように各種UNIXのCレベルでのAPIがたくさん出てきて、なるほど、Rubyではそれらをちょっと抽象化しているように見えて、ほぼそのまま見せていたのか、というのも寄り道的に勉強になりました。プロセスの終了を待つにも、単に直近に生成した子プロセスを待つものから、子プロセスをグループとして待つもの、直接pidを指定して待つものなどがあるのですね。

 とか何とかもっともらしい話を書いていますが、「そうだ、Rubyを使ってddのラッパーコマンド、ddrを作ろう……」と思いついたときにやりたかったのは、以下のようなことだったりします。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
#
# dd command wrapper
#
ddr = %w(← ↑ ↓ →)
pid = Process.spawn('dd', *ARGV)
Thread.new do
  loop do
    sleep 0.5
    puts ddr.map{|arr| arr = " " if rand > 0.5; arr}.join(" ")
    puts " Perfect!! " if rand > 0.9
  end
end
Process.waitpid(pid, 0)

これの出力は、

[Mac:ken]/Users/ken/code/ddr% ./ddr if=/dev/zero of=/dev/null count=9000000
    ↓  
 Perfect!! 
←     →
←     →
    ↓ →
 Perfect!! 
  ↑ ↓ →
       
← ↑    
←      
      →
←     →
 Perfect!! 
← ↑ ↓  
← ↑ ↓ →
  ↑ ↓  
   
← ↑    
←   ↓ →
    ↓  
← ↑ ↓  
_

 という感じです。次々と流れでてくるステップが、DDR(Dance Dance Revolution)っぽくないですか……。スミマセン、スミマセン。

 で、コピーしたバイト数を「23MB Combo!」と表示しようとして気付いたのですが、上のスクリプトは意図したことと違う動きをしています。IO#popenで標準出力がちゃんとキャプチャできてなくて、単に画面に出てきているだけです。open3とかSTYとか、それらしきライブラリがあったりしてかすかに試したり、IOバッファのflushの問題? など、いろいろ調べてみたのですが、そんなことしてる場合じゃないと気付いて、そろそろ仕事に戻ります……。

 あ、念のため。ddの途中経過を見るのは、田中社長のブログのコメントにありましたが「CTRL-T」を叩くのが正解だと思います。30分の転送処理がうっかりCTRL-Cで中断! みたいな恐怖感はちょっぴりなくもないですが、これで十分ですよね。

Rails Hubのコラムを始めます

2010/12/06 17:25:00

 こんにちは! @IT編集部の西村賢です。

 Ruby on Railsに特化した新コーナーを、「Rails Hub」という名前で12月22日に立ち上げることになりました。通常の解説記事や連載記事などに加えて、コラムによるRails関連情報の提供もしていければと考えています。というわけで、先にコラムだけ立ち上げました(隣の編集部の後輩に無理を言って、ここエンジニアライフに割り込ませてもらいました)。

 本当は今の時代、新規ドメイン(railshub.jpとか)を取って、いっそRailsベースでコミュニティ機能を組み込んだ媒体を立ち上げてみたいと思ったりしなくもないのですが、立ち上げ速度優先ということで、Coding Edgeというプログラミング関連コーナーのサブコーナーという位置付けでのスタートとなります。

 とはいえ、Rails Hubの正面玄関となるページには、新フォーラムらしくロゴを据えてオープンする予定です。以下、弊社精鋭デザイン部から上がってきたロゴ案をご紹介。今のところ5番を採用予定です。

Logos_2

 ちなみに、Twitter上で、どれがいいですかねとつぶやいたところ、日本Rubyの会の会長であらせられる高橋征義さんから「正直、どれも微妙……」という、大変にありがたくも失敬なお言葉を頂戴しました! るびまにdisられた! これはイケる!(取り乱しました、スミマセン)

Takahashim_2

 スミマセン、テスト投稿ということで。出直します。

@IT Special 注目企業
@IT Special ラーニング

エンジニアライフ 最新の投稿コラム

@IT自分戦略研究所 新着記事

コラムニスト プロフィール

西村賢
@IT編集部の西村賢がRuby/Rails関連を中心にブログしています。
Ruby on Rails情報の新コーナー「Rails Hub」をよろしく!

- PR -
@IT Special 注目企業
インデックス

イベントカレンダー

アクセスランキング

もっと見る

@IT Special ラーニング