okama

アジャイルな旅とソフトウェア開発に関する考察

東北をぶらり一人旅してきました。
二泊三日で総走行距離は約2000km、食事も美味しく景色もキレイで素晴らしい旅でした。
写真はこちら:
https://goo.gl/photos/ZP827L1UC5Q6hMwWA

さて、私はぶらり旅が好きです。綿密に計画を練って旅に出るより、期間と場所とかだけ決めて、後はその時のノリで旅を楽しむことが多いです。
ふと思いました。これは「アジャイルな旅」と言えるのではないか、と。

そんなわけで、今回のアジャイルな旅とソフトウェア開発について考察してみました。

まず今回の旅については…

要求:

  • あまり行ったことのない東北エリア(青森・秋田)を旅する
  • 綺麗な景色を見る
  • 美味しいものを食べる

必須要件:

  • 蔵王の御釜を見る
  • 白神山地の青池を見る

制約条件:

  • 期間は二泊三日
  • 初日は予約済みの青森の宿に泊まる
  • 二日目は予約済みの秋田の宿に泊まる

手法:

  • 自分の車を使用

結果:

綺麗な景色をたくさん見れたし、美味しいものもたくさん食べられたので、満足できる旅でした。
得られた成果は以下のとおり

  • (一日目:蔵王・御釜 -> 山形冷やしラーメン -> 弘前で鮪)
  • (二日目:恐山 -> 海を見ながら海鮮丼 -> 千畳敷 -> 白神山地 -> 日本キャニオン -> 横手風焼きそば)
  • (三日目:男鹿半島 -> 海鮮丼(二度目) -> 鳥海山)

では、成功した要件を振り返ってみます。

要求が理解できていること:

(寂しくも)一人旅だったので、クライアントは自分自身です。自分の旅の好みはわかっていて、綺麗な景色(雄大な大自然系が特に好み)を見ること、美味しいものを食べること、ドライブを楽しむこと、が要求の元になります。これがしっかりわかっているので、現地で次に何をしようと考えた時に、素早く判断を下せます。

手法・ツール:

自分の車であれば、荷物も積めるし、時間的な制約を受けずに自分の好きなところへ行くことができます。また、Google Mapを使えば、ナビにもなるし移動時間の見積もりにも使えます。ガイドブックがあれば、スポットやオススメの食事処とかの情報も手に入れられます。
ただこれらは使えばいいってわけではなくて、使いこなせる必要があります。知らない土地、その場で決めたルートでも問題なく運転できるスキル。また今回について言うと、長時間・長距離でも問題なく運転できるスキル。またGoogle Mapは移動時間の見積もりに使えますが、休憩時間などは当然含まれていないので、その辺も勘案して実際の時間を見積もれる必要があります。

勘(経験値):

実はコレが結構大事かもしれないと思ってます。
現地で次に何をするかを決めるとき、「このスポットは無視していい」「ここは寄ったほうが良さそう」「車でこれくらいの時間がかかる」という判断を瞬時に下すにはある程度勘が働く必要があって、それには経験値が必要になるのではないか、と思ってます。自分の場合はかなり一人旅をしているので(寂)、そういった勘は鍛えられていると思います。

これらの経験値が少ないうちは、綿密に計画を立てたり、ツアーを利用したほうが間違いないかもしれません。

では、この話がソフトウェア開発にも通ずると仮定して、成功した要件をソフトウェア開発についてあてはめて考えてみます。

要求について:

旅の場合も、一人旅、二人旅、集団の旅、と人数が増えれば増えるほど、要求も多種多様になって、その旅に求められるものを把握するのは大変になっていくと思いますが、みんなが満足する旅を実現するためには、それらをなるべく汲み取っていく必要があります。さらには、目に見える要求(例えば、蔵王の御釜を見る)だけではなく、要求の元(綺麗な景色(雄大な大自然系が特に好み)を見ること、美味しいものを食べること、ドライブを楽しむこと)を理解する必要があります。
ソフトウェア開発もここは同じでしょう。

手法・ツールについて:

柔軟なソフトウェア開発を実現したかったら、まずそれ相応の手法を選択する必要があります。ソフトウェア開発でいえば、ぱっと思いつくのはやはりスクラム等のアジャイル開発手法でしょうか。私の旅で言うところの、「その時のノリで旅を楽しむ」が相当します。ただ、手法を決めただけではうまくいかないので、それをサポートするためのツールが必要になります。旅の場合は、柔軟に動くため、車・Google Map・ガイドブックを利用しました。ソフトウェア開発で柔軟に開発を進めていくためのツールは色々有りますが、オブジェクト指向・自動テスト・自動デプロイ、などなどでしょうか。これらを導入しておくことで、柔軟なソフトウェア開発が実現性を帯びてきます。逆に言えば、適切なツールや仕組みを導入せずに柔軟なソフトウェア開発を行うのは無謀じゃないでしょうか。

勘(経験値)について:

ここは賛否両論になるかも知れませんが…ソフトウェア開発にも、経験値による勘というのはやはり効果があると感じています。設計や実装での一つ一つの判断でも、後々の保守性や拡張性を考えたよりよい選択をするのに、経験値は効いてくると思います。もちろん勉強して得られることもありますし、逆に経験していれば良いというものでもありませんが…、成功でも失敗でも、実践経験は多くのことを教えてくれると思います。

まとめ

柔軟なソフトウェア開発を成功させるためには、

  • 要求(クライアントが求めるもの)がしっかり理解できていること
  • 相応な手法(スクラムのようなアジャイル開発手法)を採用していること
  • 選択した手法を支えるための適切なツールが導入できていること
  • ある程度経験値を持つメンバーが居ること

が改めて大事なのかなーと思いました。「ある程度経験値を持つメンバーが居ること」は、ソフトウェア開発自身の経験と、アジャイル開発の両方の経験が該当します。アジャイル経験者が身近にいない場合はクリアすることが難しいかもしれませんが、その場合はコンサルを頼むというのも手かもしれませんね。

それらがクリアできない場合、綿密な計画を立てた旅行やツアーを利用するみたいに、まずはウォーターフォール開発でソフトウェア開発の経験を積むのが良いのかもしれません。

綿密な計画を立てた旅行やツアーがウォーターフォール開発に相当するか、というと賛否両論ありそうですが…。前者は結構近い気がします。ツアーは、計画部分をプロに委託することになります。ウォーターフォール開発では上流をプロに委託することができれば、同じような話に…なるかな?

 

…なーんてことを、500km強の帰り道を運転しながら考えてたのでした。ホントは更にモチベーションの話とかリスクマネジメントの話とかも考えたんですが、長くなってきたのでこのくらいで。。


6/1 NSStudy No.7 機械学習入門CloudVisionAPI & TensorFlow report に参加してきました!

機械学習とかTesorFlowとか勉強してみたいなーとずっと思っていた所、以下の良いイベントを発見したので、参加してきました:
「機械学習入門CloudVisionAPI & TensorFlow」 #NSStudy No.7

以前、発表者の佐藤さんの別の発表(BigQuery)を聞いたことがあったのですが、とてもわかりやすかった印象があったので、いいチャンスだなと思いました。

今回のイベントは、Build2016に関するLTと、機械学習に関する講演、という内容でした。
ちなみにBuild2016というのはMicrosoftのカンファレンス。

ではでは、以下メモと感想が入り混じったものです。

続きを読む


読了:aico 株式会社ディレクターズ 村井純「小悪魔女子大生のサーバエンジニア日記 ― インターネットやサーバのしくみが楽しくわかる」

Webメインの会社に移るに辺り、サーバ系の知識を復讐したりしようと思い、ずっと積んでいた

小悪魔女子大生のサーバエンジニア日記 ― インターネットやサーバのしくみが楽しくわかる

を読み終えました。

インターネットの仕組みから、DNS、メール、Webサーバや暗号化辺りの概要を学ぶことができます。絵や文字が特徴的で、好みが分かれそうなところですが、自分は慣れてきたらダイジョウブでした。

わかっていることもあれば、曖昧な知識のままだったところ(DNSまわりとか)が自分の中でアップデート出来て良かったです。


読了:小川 雄大 柄沢 聡太郎 橋口誠「パーフェクトPHP」

PHPメインの会社に移るにあたって、PHPのことを体系的に勉強しておこうと思い、

パーフェクトPHP

を読み終えました。
結構な分量がありましたが、通勤電車の中でKindleで読みました。

期待していたとおり、PHP自体について体系的に学ぶことができたうえ、フレームワークを自分で実際に作ってみる例やセキュリティの話など実践的な話も載っており、PHP界に入っていくうえで、大変良い本でした。

 


Android(Nexus7)のファイルがWindows(エクスプローラ)から見れない

とあるpdfファイルをNexus7から読みたかったので、ひさしぶり~にWindowsにつないでみたところ、マイコンピュータにNexus7は表示されるものの、ダブルクリックしてみても何も表示されない…。

あれ…前は普通に見えていたんだけどなぁ。

Windows7で試しても、Windows8で試しても、結果は同じ。

うーん、前はどっちからつないでも、特にアプリとか使わずに見れていたんだけどなぁ。

違いといえば、Androidのバージョンが6に上がったことくらい…??

ネットで色々調べてドライバ更新とかも試してみたけど、変化せず…。

たまたま発見した以下の方法でうまくいったんだけど、これどうなんだろうなー

  1. Nexus7とWindowsマシンをUSBでつなぐ
  2. Nexus7 -> 設定 -> 開発者向けプション -> USBデバッグはオン(元々なってた) 、USB設定の選択はMTPになっててOKのはずなんだけど、一旦「充電のみ」を選択する
  3. MTPを選択し直す

としてみたところ、Windows8からもWindows7からもNexus7の内部ストレージにアクセスできるようになった。

うーん。


Androidアプリ開発中に[INSTALL_FAILED_UPDATE_INCOMPATIBLE]と表示された

Androidアプリを開発中、Android Studioから端末に転送して動作を確認しようと思ったら、

Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]

と表示されて、何度試しても端末上でアプリを起動できませんでした。
いろいろ調べたところ、以前の開発中のゴミデータが残ってしまっていたようで、端末から

設定 > 端末 > アプリ

から、開発中の該当する名前のアプリをアンインストールしたら、無事に、開発中のアプリを端末上で起動することができました。

 


社内LT(部署内LT)を開催しました!

独りLTしました!
のエントリで載っけたスライドで「現在部署内LTを企画中!」と書いていたのですが、この度やっと開催にこぎつけました。

社内LT(部署内LT)を行う主な狙いは、

  • 部署内での技術交流促進
  • 技術者への発表の機会提供

です。
技術交流促進に関しては、現在でもわからないことがあれば聞く(受動的な技術交流)、ということは気軽にできているけど、「こんな便利な技があるんだぜ!」みたいな能動的な技術交流があまりないと思っていました。せっかく部署にはベテランと若手が入り交じっているのに、これはもったいないと思ってました。

なお、裏テーマとしては、独りLTしました!で書いているように、部署の文化を切磋琢磨する方向に持って行きたい、というのがあったりします。

続きを読む