「はてなサマーインターン2009」レポート

#2 はてなでの開発の第一歩とは?……インターン第一週

この記事を読むのに必要な時間:およそ 4 分

前回に続き,本レポートでは,(株)はてなのはてなサマーインターン2009の第一週に行われた,エンジニア向け講義の様子を中心にお届けする。

第一週:2日め~5日め,講義と演習

第一週の講義では初日のウォーミングアップを終え,2日め~5日め(8月4日~8月7日の4日間)は,はてなのWebサービスの基本形を学ぶ。はてなで実際に使われているフレームワーク,内製ツールなどを使いながら,本インターンの後半2週間で行われる新機能の実装に必須の開発ノウハウを習得するのが目的で,はてな流の作法を含め,はてなで開発を行うためには欠かせない基本となる。

毎日午前中から,以下のテーマごとに2時間程度の講義が行われた。Webアプリケーションの基本的な考え方,作り方を,第一線のエンジニアである講師陣から直接学べる機会はなかなかない。参加者の学生にとって,はてなサマーインターンならではのうれしい経験ではないだろうか。

第一週の講義:
  • 2日め:id:cho45氏の「Perlによるオブジェクト指向プログラミング」
  • 3日め:id:onishi氏の「ORマッパによるデータベース操作」(DBIx::MoCo)
  • 4日め:id:nanolia氏の「MVCによるWebアプリケーション開発」(Ridge)
  • 5日め:id:chris4403氏の「ユーザインターフェースプログラミング」(Ten.jsとRidge+MoCoでAjaxアプリ),

午前の講義の後,午後は演習。講義の最後に,毎回テーマに合わせて厳選考案された課題が3問程度出題される。参加者は翌日の講義開始10:30までに,答案のソースコードをgitリポジトリにpushする※1)。すると,講師は,翌日の13:00過ぎには演習の評価ならびに講評を参加者にフィートバックする。実際に手を動かすことに重点が置かれたこの猛特訓に,参加者達は一時は苦戦となったこともあったようだったが,講師陣に加えて,id:antipop氏やid:motemen氏,id:secondlife氏,id:nanolia氏,id:birdie7氏らも適時サポートやTAとしてアドバイスにあたり,周りの参加者とちょこちょことやり取りしながら日ごとにこなしていった様子であった。

※1
コミット。分散バージョン管理システムgitにおいては,リモートのリポジトリに反映することを指す。

2日めの講義メモ

本格的な開発講義の第一弾,2日め午前は,id:cho45氏※2による「Perlによるオブジェクト指向プログラミング」。

  1. (1) オブジェクト指向自体について
  2. (2) Perlでそれをいかに実現しているか(PerlにおけるOOP)
  3. (3) どうやって設計するか(実践! オブジェクト指向設計)

という3本柱で解説が行われた。ちなみに,参加者は,Perl以外の言語を含めるとOOP(Object-Oriented Programming,オブジェクト指向プログラミング)は経験があり,Perlそのものの開発経験はあまりない,とのこと。(1)(2)の概論については開始10分ほどで解説を完了し,全編を通して,チームでの開発に必要な感覚,理解しやすいコードという観点から解説が展開されていた。

※2
『WEB+DB PRESS』(Vol.48)特集1「[言語別]モダンプログラミング入門」「第6章:JavaScript編 ……誰もが使う,Webプログラミングの必修言語」で寄稿いただきました。ぜひご参照ください。

写真1 id:cho45氏による「Perlによるオブジェクト指向プログラミング」

写真1 id:cho45氏による「Perlによるオブジェクト指向プログラミング」

(1)オブジェクト指向と(2)PerlにおけるOOP

まず,OOPそのものについては「手続きとデータ構造」が結び付いている,というポイントが強調された。手続きとデータ構造を一緒に扱えるのがなぜいいのかというと,スコープの分離ができるようになるから。OOPの場合はグローバル変数,ローカル変数のほか,クラスに関連付いているデータとしてクラス変数,データ構造に格納されるデータとしてのインスタンス変数と段階が4つくらいあって,それぞれの段階で共有の範囲が決まっている。スコープを使い分けられると理解しやすいコードになって,スコープを段階的に管理してできるだけ狭くできればそれだけ安全にできる。このメリットは大きい。

そして,データ構造に結び付いている手続き「メソッド」「クラス」(データ構造と手続きの定義のまとまり)に結び付いていて,実装するときにはそのクラスのデータ構造を見ればよい。スコープが限定されていてそこだけ見ていればOK,つまり,実装するときにはほかをあれこれ考えなくても,そこだけ実装して動いていれば,あとは使う側の問題になる。別の言い方をするなら,ほかのクラスの振る舞いについて考えないといけないとか,なんだか簡単に書けないような個所がある場合は,まずい部分があるんじゃないかと考える。そんな,実際の開発においてOOPをどう活かしていくか,とった考え方を織り交ぜながら解説が行われていった。

また,PerlにおけるOOPとしては「パッケージ」(オブジェクト指向一般でいうところのクラス)「bless」(ブレース。データ構造とパッケージ/クラスを関連付けるしくみ)を中心に,Perlオブジェクト指向のシンプルな機構,その他細かなしくみについて言及された。途中,インターン参加者のPerlそのものの習熟度に合わせて,Perlにおけるデータ構造の種類,配列(アレイ)リファレンスとハッシュリファレンス,リストコンテキストとスカラコンテキストで困ったときは? など,細かな文法や小ネタも交えてさらに解説は進んでいった。

(3)実践! オブジェクト指向設計

続いて,オブジェクト指向設計を解説。何のためにOOPするのかというと,突き詰めるとわかりやすい実装のため。できるだけ複雑にならないよう,設計でのポイントを挙げるなら2つ。

  • APIについて考える。シンプルでわかりやすく。こんな風に使いたいというのを念頭に置いてユースケースを描いて軽くコードにする。このコードが後のテストコードにつながるように意識しておく
  • 登場人物と,登場人物が持つ責務を考える

責務はメソッド呼び出し元との約束。責任をどう委譲してあげる,責任を分散して守らせるかというところも,使う側にとってのわかりやすさになる。守れない責任は例外を投げること。そんなところを踏まえつつ,設計にかかるまでにあらかじめ責務を洗い出しておく。

いよいよ,実装編。名付けてImageExtractorなる画像URL抽出モジュールを例に,ソースコードを追いながらポイントが解説された。

  • とりまとめる。まずは入口から着手
  • 自分でよくよく考えてもデザインパターンっぽくなるのがオチなので,はじめから使えば良い
  • コードを頭から書き下すのではなく,はじめから実行イメージを動くコードにして,そこからテストを作る
  • Perlでテスト。Test::Moreのほか,Test::Exception,Test::Base,Test::Class
  • テストとリファクタリングの関係

そして,さらなるステップは作ったモジュールの問題点は何か,再び考えることから始まる,として2日めの講義の結びとされた。

コメント

コメントの記入