kirikuzu-blog

アジャイルソフトウェア開発とは

明確な定義なんてものは別になくてよいと思ってますが、自分の考えを表明するのは悪くないと思い書いてみようと思います。

自分の中での定義

「ソフトウェア開発においてムダを排除する努力と態度」

※努力とは「現時点の技術力をもってチームが行える範囲での努力」

※チームができる範囲を超えた努力を求めるのは間違っています

何がアジャイルなのか?

“agile”の意味を調べると

敏しょうな、素早い、機敏な、身のこなしの軽い、しなやかな、機動的な、鋭敏な、
いきいきした、活気のある、頭の切れる、頭の回転の速い

といった言葉になるみたいです。 これだけ読むとアジャイルは短納期にソフトウェアを開発する手法なのでないかと思ってしまうかもしれません。

しかし実際には素早くソフトウェアを開発する手法なんてものはないと思います。あるといったらきちんとCI環境でテストコードを動かすなど単純作業の自動化であって、それ以上でも以下でもないのはないでしょうか。

それではアジャイルとは何に対して”agile”なのでしょうか?

それは変化への素早い対応であって、目的はムダを抑えることです。

なにがアジャイルではないのか?

  • 予算を低く抑える
  • 短納期で開発する
  • 品質を高める

(自分が考える)アジャイルソフトウェア開発では「ムダを抑える」ことに目的をおいているのでこれらの3点は目的ではありません。 取り組んだ結果として、少ない予算で済んだり、品質が高まったりすることがあるかもしれませんがそれらはあくまでも結果であってアジャイルの目的ではありません。

ソフトウェア開発におけるムダとは?

色々あると思いますが思いつく限りあげてみます。

  • お客さんの要望とは違うものを作ってしまった
  • リリースしたものの誰も使わない
  • 自動化できる作業を手動でしている
  • 人はたくさんいるけどチームとして機能していない
  • 過剰な品質への投資
  • 見積に含めるリスク工数
  • 社内政治
  • etc …

いかがでしょうか。みなさんでも考えてみてください。

アジャイルを支える技術

  • Extreme Programming(XP)
  • スクラム
  • リーン

ここで1つ1つを説明することはしませんが、「ムダを抑える」ための手法、プラクティス、フレームワークとして学んでみたらどうでしょう。 間違っても低予算、短納期、品質のためのアジャイルとして捉えないことをおすすめします。

結局何が言いたいか

というと、誰も使わないソフトウェアなんてつくりたくないし、余計な社内政治にも振り回されたくないし、アジャイルなんてキーワードに踊らされずに自分たちが持ってるチカラを最大限駆使してソフトウェアを開発したいですよね、そういう仕事をしたいですよね。ということです。

関連ブログ

「アジャイル開発」で解決できることは何か〜アジャイルは「速い・安い」のファストフードではない - Social Change!

「すごいHaskellたのしく学ぼう!」オーム社

すごいHaskellたのしく学ぼう!

Haskellを初めて触る人に向けた本がオーム社さんから発売されるのにあわせてレビュアーとして参加させていただきました。 元タイトルは「Lean you a Haskell for Great Good!」といいます。なんのこっちゃというタイトルですが良い本です。 原書はWebでも読めます。

この本の良いところをいくつかあげると

  • イラストがかわいい
  • カリー化関数と部分適用の説明がわかりやすい
  • 型クラスをしっかり説明している
  • ファンクター、アプリカティブ・スタイル、モナドをしっかり説明している

最後のファンクター、アプリカティブ・スタイル、モナドは自分でもまだしっかり理解しきれていないのでまだまだ読み込みが必要ですけど。。

逆に注意する点をあげると

  • 「束縛」という関数型言語に独特の言葉を特に解説もなく使うのでまったく知らない人はちょっと混乱するかも
  • オフサイドルールについてちょろっとしか説明されてないので初心者はハマったときに混乱するかも
  • イラストはかわいいけど丁寧に図解されてるわけではないので基本的にはしっかりと文章を読む必要がある

迷ったら他の本とあわせて読むと理解が進むでしょう。 こちらで紹介してる本を参考にしてみるとよいかも。

この本の読み方

関数型言語を知りたいけど忙しくて時間のない人

5章まではしっかり読みましょう。 この章まで理解できれば関数の構文、パターンマッチ、カリー化関数、部分適用といった基本的な知識は身につけられます。

Haskellの型クラスを理解したいけど忙しくて時間のない人

7章まで読めばわかった気になれるんじゃないでしょうか。 型クラスはこの後のファンクターやモナドでも大活躍するのでしっかり理解しておきたいですね。

Haskellにしっかり打ち込みたい、もしくは時間のある人

全部読みましょう。 (と書いておきながら自分もまだすべて読めてないんですけどね…)

まとめ

しっかり読んだだけ身につくものは多い本だと思います。 日本で有名なHaskellプログラマの人たちが翻訳して、それをまたすごい人たちがレビューしてるので質も高いです。 Haskellに限らず関数型言語は今後ますます重要度が高まっていくでしょう。 これからの一歩進んだ先を目指して、今のうちから取り組んでみてはいかがでしょうか。

こもればなし

  • asパターンの訳注がどうなるのか期待して見守ってましたが最終的には無難な感じに落ち着きましたね
  • ちょうど1年前に同じオーム社さん出版のアジャイルサムライのレビュアーをさせてもらいました、来年もなにかできたら嬉しいですね

ホントはこわくない関数型言語 〜関数型言語の学び方〜

関数型言語が気になるけど難しそう。そんなふうに思ってる人は多いと思います。 ここでは初心者に毛が生えた程度の自分が感じる関数型言語を使うメリットを説明したいと思います。

関数型言語の嬉しいポイント

ぬるぽがなくなる

「意識してれば」という条件付きですが、null参照が発生することはなくなります。 通常「値がない」ことを表現するためにnullを使用することが多いと思いますが、注意深くコーディングしないとすぐにnull参照してしまいます。

そもそも「値がない」ことを示すのにnullを便宜的に代用しているのが問題なのです。 ならば「値がない」ことを特別な方法によって表現できればより「値がない」ことを意識してプログラミングできると思いませんか。 関数型言語はoption型とパターンマッチによってこの問題を解決します。

パターンマッチ

パターンマッチをつかうことであるデータ構造から条件にあった値を取り出す、ということが柔軟で安全に可能です。 例えばうっかり配列(リスト)の境界外にアクセスしてしまって実行時例外になってしまう、ということもパターンマッチでは防げます。

それ以外でも様々な条件分岐を簡潔に強力にできる仕組みなので是非覚えてもらうことをおすすめします。

型推論による簡潔な記述

普段Javaを書いていると変数一つを宣言するにも型を書かなければいけません。 とても面倒な思いをしていませんか? Rubyみたいな動的型付のプログラミング言語を使えば記述が簡単になりますが、これでは実際に動かしてみないとどういうオブジェクトなのかわかりません。 そういった言語ではテストコードを書かなければ動作を保証できません。

関数型言語では型推論によって必要最低限(かは選択する言語によって代わりますが)の型を記述するだけでコンパイラがチェックしてくれます。 静的に型が付けられるメリットとソースコード上の記述量を削減できるという両方のメリットを受けられます。

関数型言語を理解するためのポイント

関数とはなにか

これは以下の書籍を読んでもらうのが手っ取り早いです。

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門

ポイントとしては関数は値と同じ扱いであるため、関数に引数として渡したり、戻り値として受け取ったりできます。

その結果、呼び出した先の関数内で行われる処理を、呼び出し側で指定することができるのです。 それらを組み合わせることで処理の抽象化ができるようになります。関数型言語を使うことでデータ構造と処理をきれいにわけて考えることができます。

再帰的とはなにか

これは以下の書籍を読んでもらうと理解しやすいです。

プログラミングの基礎 (Computer Science Library)

再帰的という言葉は関数とデータ構造に使われます。 「大きな問題を小さく分けて考える」ことがポイントです。

ドミノ倒しをイメージしてみてください。全体では大きなドミノも始まりは1つの牌を倒すことから動きます。 それと同じように再帰的な関数も、大きなデータ構造を小さな単位に分割して処理することで実現されます。

最初は気にしないほうがよいポイント

モナド

Haskellではちょっとした入出力をするのにIOモナド(アクション)という特殊な仕組みを使います。 初心者には意味不明、というか自分もよくわかっていませんが最初からモナドを理解しようとすると痛い目にあいます。 しかしそんな理由でHaskellひいては関数型言語に抵抗感をもつのは実にもったいないことです。 わからなかったら最初のうちはとりあえず脇においておきましょう。

副作用

副作用がないプログラムを書くことでテストも書きやすくなりバグも少なくなります。 しかし現実的なアプリケーションで副作用なしに存在することはできません。 そこの折り合いをつけてプログラミングすることが大切です。

数学的な知識

数学的な素養がなくてもパターンマッチや型推論は便利に使えます。 あった方が望ましいとは思いますがそれを理由に使わない理由はありません。

これから学ぶ人へのおすすめ

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門

Scalaを使って関数型言語を解説しています。 Amazonの書評では微妙な評価ですが初めての人が関数型言語を学ぶにはよくまとまっていると思います。 Javaとの対比で書かれているのでJavaプログラマの人におすすめです。

※間違ってもScala入門の本ではないと思います

プログラミングの基礎

プログラミングの基礎 (Computer Science Library)

まったくのプログラミング初心者の人を対象にしています。 おそらく日本の関数型言語の本ではもっとも丁寧に解説している一冊です。 Ocamlを例にしていますがOcamlに興味がない人でも関数型言語への入り口として十分有効な本です。

ただしoption型は最後の方でちょろっと触れられているだけなので注意が必要です。

プログラミングHaskell

プログラミングHaskell

なぜかサンプルコードがHaskellではなくてメタ記号が使われていたり、非推奨のn+kパターンを多用してたりといろいろ難しいところはありますが勉強になります。 最後の章だけはすごく難しいらしいので自分はスルーしました。 付録Cは最初に目を通してよくとよいかも。

ふつうのHaskell

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

難しいイメージのあるHaskellを実際にコマンドをつくって動かしながら理解しようという本。 最初の方の例で特に説明なくIOモナド(アクション)は関数とは違うと言われてなんのこっちゃと理解が進まなくなりそうですが、プログラミングHaskellと一緒に読んで理解しましょう。

実践F#

実践 F# 関数型プログラミング入門

.NETの人はF#というOcamlをベースにした言語がありますので使いましょう。 関数型言語を使いつつ.NETのクラスライブラリを使える素敵言語です。

Having-family

家族を持つということ、父親になるということ

ほんの数年前まで、自分が結婚していることすら想像できなかった。いずれはするんだろうくらいにしか思っていなかった。 それが今では妻がいて、1歳3ヶ月になる息子までいる。 特に2010年は年初に入籍して年末に出産という劇的な人生の変わり目を迎えた年であった。

その結果なにかが変わってきたように感じる。 それは身体的な変化ではなく気持ち面での変化である。 息子が産まれるまでは、自分が人の父親になることに、なんだか違和感を感じていた。今でもそんな気持ちをどこかで引きずっているかもしれない。 自分が子どもを教育して立派な大人にできるのか、と。

実際にはそんなことを考える余裕もないくらい、子どもにかかりっきりになる。 産まれてからというもの、毎日のオムツ、食事、お風呂、寝付けなどゆっくり休める暇はない。 (そんな中でも休日に勉強会とかで出かけるのは後ろめたい気持ちがある)

赤ちゃんというのは産まれてばかりの頃は本当に何もできない。泣いておっぱいを飲んで、おしっこして、うんこして、寝るだけである。 それが3ヶ月を過ぎたあたりから色んなことが(本当に少しずつ)できるようになる。 表情が出てきて笑顔がつくれるようになる。寝返りができるようになる。手で握ったり掴んだりできるようになる。 寝返りができるようになる。ずりばいができるようになる。ハイハイができるようになる。一人で立てるようになる。etc… 赤ちゃんの笑顔は裏表がないのですんなり受け止められる。意外とこれは面白くもあり、楽しくも感じる。

子どもは親にとっての存在理由

息子が少しずつ成長していく過程を日々見ていると、それだけで何かが自分の中で形作られていく。 「この子の成長のためになるのならできるだけのことをしたい」 「もしも自分と妻がいなくなったらこの子はどうなってしまうんだろう」 ときどきちょっと不安になる。

話の出処は忘れたが、妻は「1億円でもこの子は売らない」と言っていた。 ぼくとしてもいくら積まれても売ることはできないだろう。 もしも子どもを手放してお金を手に入れたとしても、そこに幸せはないと思う。

人の親になって初めてわかったことがある。 それは子どもは親にとって「生きる意味」に成りうる。 最近、DRIVE!モチベーション3.0を読んだときに気付かされたことがある。 人の幸せは「お金」ではなく、「自分が社会にどれだけ貢献できたか」ではないかと。

子どもをつくるのは最大の親孝行

もう一つ、思ったことがある。 それは「子どもをつくることは最大の親孝行である」 うちは両家にとって初めての孫であったため大変嬉しがられた。 結婚から妊娠までの期間があまりにも短かったので最初はびっくりされたらしいが産まれてしまえば大変な可愛がり様である。 自分の親に孫の顔を見せてあげる、ということがどれだけ嬉しいことか。 それを自分が感じることができるのは息子が孫を産んでくれるまで、わからないけれど、きっと今とは違った心境なんだと思う。

まとめ

ということで、長々と何が言いたいかと言うと、

  • 子どもの存在は親にとっての存在理由である
  • 親になるイメージができなくても子どもと一緒に成長できる
  • 子どもをつくるのは最大の親孝行である

そんなことを考えている最近です。

My-new-blog

数カ月に一度くらいしかブログを書く人間ではないのにgithub pagesを使ってブログを書いてみることにした。 この世界に対して特別影響力を持っているわけではないけれど、自分なりに楽しんでやっていきたいと思う。