エフスタ in aizu...

Post on 11-Jul-2015

620 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

「やっててよかったこの仕事」 と言えるようにやってきたこと

株式会社セカイネット 河野康隆

自己紹介• 名前:河野康隆(こうのやすたか)

• 株式会社セカイネット

• 主にGoogle App Engine / Javaでの

開発をしています。

• Facebook: kouno.yasutaka

略歴

• 18歳まで福島県郡山市で過ごしてました。

• 27歳まで東京でSI系の会社に所属

• ~現在 仙台で起業

AGENDA1. 初日に発覚した危険な兆候

2. チームをひっくり返す

3. 短納期で開発するために

4. まとめ

注意事項• 他の方はマジメなお話の様ですので、すこし砕けた感じにしました。

• フィクションです。

• あえて悪役が登場します。

• 写真の人物はイメージです。

• 笑って聞いていただければ幸いです。

1. 初日に発覚した危険な兆候

2013年 10月 プログラマの募集が来る

プロジェクトについて• 地震等の災害発生時に、職員の安否状況を報告・確認するためのサービスの作成

• マルチテナント・Webサービスとして提供する

• 災害時の急激なアクセス増加に対応するため、スケールアウトして分散処理を行う必要がある

面談に行ってみよう

プロジェクト参入時の前情報• Java EEによるWebシステムの開発 • 開発リーダーはJava EEの経験が豊富

• クラスタ構成の設計・製造ができる • 既存メンバーもJavaのスキルがある • 基本設計はほぼ終了している • 工数は25人月程度の見込み

よくあるプロジェクトみたいだし問題無いだろう

いざ、参入!

※ 写真の人物はイメージです。

しかし、早くも初日に発覚する真事実

※ 写真の人物はイメージです。

参入後に発覚した事実:1

基本設計はほぼ終了している ← はずだったが

実質は要件定義書(5p)のみ

参入後に発覚した事実:2開発リーダーはJava EEの経験が豊富← はずだったが

以前にJavaでどんなシステム作ってたんですか?

……まぁ、いろいろと

フレームワークとか何使ってました?

……特には

Java書けます?

書いたりはしないかな※ 写真の人物はイメージです。

チーム・リーダー

なんか怪しい

参入後に発覚した事実:2既存メンバーもJavaスキルがある ← はずだったが

COBOL一筋20年!

組み込みのCを数年

COBOLとVBを少し、Javaは1周間研修しました!

スキルがぜんぜん マッチしてない!

参入後に発覚した事実:2

全員HTMLやJavaのスキルがない!

参入後に発覚した事実:3工数は25人月程度の見込み ← はずだったが主にやること

• ビジネス・ロジックの設計・製造 • UIのデザイン・実装 • 複数台のサーバーによる分散システム設計・構築 • サーバーの死活監視・運用方法の確立・文章化 • メールの一斉配信・受信 • マルチテナント対応

この工数で足りてるの?

参入後に発覚した事実:3

実質は予算から逆算した人月

工数は25人月程度の見込み ← はずだったが

他にも、書けないことが多数…

なにより、問題なのは 誰も危機感を抱いていないこと

この状況を見て、感じました

デスマの臭いがする…

※ 写真の人物はイメージです。

デスマーチとは次のいずれかに該当するもの

1. 与えられた期間が、常識的な期間の半分以下である

2. エンジニアが通常必要な人数の半分以下である

3. 予算やその他のリソースが必要分に対して半分である

4. 機能や性能などの要求が倍以上である

※ Wikipediaからの引用

デスマーチとは

平たく言えば明らかに失敗しそうなのに、

継続している(せざるを得ない)プロジェクトのこと

初日にして、絶望

しかし

パンドラの箱の底には ひとつの希望が…

プ  ロ  ジ  ェ  ク  ト

それは

まだ、何も作っていない!

昔、失敗したデスマ案件は、 プロジェクト末期で対処できなかった。

今回のプロジェクトは 始まったばかり。

これからの設計や管理次第で どうにかできないか?

面白い!

やってやろうじゃないか!

※ 写真の人物はイメージです。

2. チームをひっくり返す

とはいえ、今の自分に発言権はあまりない。

プロジェクト体制

←イマココ

プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

開発チーム・メンバー

A社

B社

C社

どう見ても外様です。 本当にありがとうございました。

と、諦めたら試合終了なので

プロジェクト体制プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

開発チーム・メンバー

A社

B社

C社

←イマココ

偉い人の信頼を勝ち取る 作戦を開始

作戦1:目的を確認する

ステークホルダーが 何を気にしているか確認する

A社のプロジェクト・マネージャーと相談

今回の案件で気にしてることって何ですか?

リリース後の運用とか保守だね。 あまり大きな体制はとれないから

あと、管理もアジャイルとか やってみたいんだけど、 経験がないから考え中だね

なるほど

A社 プロジェクト・マネージャー

※ 写真の人物はイメージです。

B社のプロダクト・オーナーに相談

今回の案件で気にしてることって何ですか?

3月にプレゼンやるから、 それまでにデモが出来るようにしてほしい

3月以外はなにかあります?

B社 プロダクト・オーナー

特に無いよ。逆にリリース日は 決まってないから少しくらいなら調整できるかな

※ 写真の人物はイメージです。

この情報を元に、 提案資料の作成を開始

作戦2:危機感を共有する

重要な問題点を 認識してもらう

B社のプロダクト・オーナーに相談

メンバーって全員Java開発要員なんですよね?

C社の営業さんからはそう説明うけてるけど

みんなJavaできないらしいですよ?

B社 プロダクト・オーナー

えっ?

ちょっと確認してみますか

※ 写真の人物はイメージです。

全員でJavaコーディング規約 読み合わせ会を実施

当然、ボロが出る

ちょっとC社営業と話してくる…

※ 写真の人物はイメージです。

A社のプロジェクト・マネージャーと相談

スケジュールについて、確認したいことが…

どうしたの?

過去の経験からみて、スケジュールに かなり無理がありそうです

…わかった、確認してみる

根拠だけでも確認してもらえませんか?

A社 プロジェクト・マネージャー

※ 写真の人物はイメージです。

2時間後

なんの根拠もなかった

※ 写真の人物はイメージです。

そして

プロジェクトは序盤で早くも緊張状態に!

これで次の作戦の 土壌が整った!

※ 写真の人物はイメージです。

作戦3:解決策を提案する

ひとしきり問題共有した ところで

今後の方針について 検討しよう

A社 プロジェクト・マネージャー

※ 写真の人物はイメージです。

待ってました!

今回の要求に合わせて 提案書を用意しました

※ 詳細は次章で説明します

※ 写真の人物はイメージです。

その結果

それをベースに進めよう

※ 写真の人物はイメージです。

そして、体制も変化

プロジェクト体制プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

開発チーム・メンバー

A社

B社

C社

プロジェクト体制プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

開発チーム・メンバー

A社

B社

C社↑イマココ

アーキテクト

その時、事件が

メンバーを残して まさかの 出社拒否

C社 チーム・リーダー

※ 写真の人物はイメージです。

しかし

これはチャンス!

よろしければ いいリーダー 紹介しますよ

※ 写真の人物はイメージです。

自社メンバーの参入に成功

※ 写真の人物はイメージです。

プロジェクト体制

↑イマココ

プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

開発チーム・メンバー

A社

B社

C社

アーキテクト

New! →

しかし、また事件が

開発メンバーも 全員撤退させます!

※ 写真の人物はイメージです。

その結果

プロジェクト体制

↑イマココ

プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

A社

B社

開発チーム・メンバーC社

アーキテクト

New! →

プロジェクト体制

↑イマココ

プロジェクト・マネージャー

プロダクト・オーナー

開発チーム・リーダー

A社

B社アーキテクト

New! →

……

ひっくり返しすぎた?

※ 写真の人物はイメージです。

3. 短納期で開発するために

長い前振り失礼しました

ここからは わりとマジメな話です

コントロール権は得ましたが、まだ、不安要素が山積みです

現状の主な課題

1. 開発・運用コストを減らすための検討

2. 開発メンバーの調達・教育

3. 3月までにデモができるようにする

4. 短納期だが品質は落としたくない

不安を解消するために リスクを取る

課題1:開発・運用コストを減らす

方策1:PaaS / IaaSを利用する

初期段階の構想とか要求とか• サーバーのホスティングサービスを利用する

• 耐障害性等を考慮してクラスタ構成にする

• サーバーの死活監視等が行える

※ ただし、インフラエンジニアはいません。

サーバー構成のイメージDBサーバーAPサーバーロードバランサー

死活監視

時間も予算も無いんだよ

ぜったい無理!

なので

Google App Engineを使用する

Google App Engineの特徴

• 勝手にスケールアウトする

• 自動で複数データベース・サーバーに保存

• 同じ環境がすぐに、いくつでも作れる

• 使いやすい管理コンソールがある

なにより、自分たちが得意

インフラのことは 何も考えなくていい

が、実装できない機能も

それらはAWSを使用

AWSを使用して実装した機能

• 気象庁から地震情報を受信するための

FTPサーバー機能

• 携帯キャリアメールへの一斉配信

PaaS / IaaS を使用した結果

• インフラの設計・構築コストがほぼ0に

• 基本的に運用監視対象は

EC2インスタンス1つだけに

課題2:開発メンバーの調達

いろいろあって消えた3名分 メンバーを集める必要があります

方々に募集をした結果 Java技術者2名採用できました

メンバー教育の課題

• フレームワークと

Google App Engine データベースの習得

• HTML / JavaScript等のスキル不足

方策1:1周間ペアプログラミング

なぜ、1週間なのか

プロジェクト・マネージャーとの会話

ペアプロでやってみようと思うのですが…

作業効率が半分になりそうで怖いな。期間も短いし、リスクとれないよ

では、教育のために一週間だけやらせてください

A社 プロジェクト・マネージャー

※ 写真の人物はイメージです。

教育やレビューのコストとトントンなのかもしれないけど…

1周間ペアプログラミング• 参入後1周間だけペアプロする

• 教える側は、ツール、フレームワークの使い方や

なぜこのように作るのかなどの背景も

説明しながらコーディングする

• その人のクセや特徴を知る

• 1周間で完了できるストーリー(機能)※を選択する

やってみた感想

チームに早く馴染むことができた

ドキュメントを読まされるより理解が早くて深い

コーディングの方針とかルールが共有できた

新メンバーのスキルレベルが分かった

1機能を通して作成の過程が見えたので、不安が減った

新メンバー 既存メンバー

なかなか好評

ペアプログラミングが 認められない場合に効果的

方策2:作業範囲の限定

新メンバーは HTML / JavaScript スキルが無い

勉強してもらう時間もない ペアプロもできない

ぶっちゃけ

JavaScriptを多人数で いじりたくない

なので

Javaでビジネスロジックだけ 作ってもらうことに

UIとビジネスロジックの分離UI : HTML / JavaScript Logic: Java

JSON-RPC

ビジネスロジックの呼出 ↑

メソッドを呼ぶだけ

ビジネスロジックの提供 ↑

メソッドを作るだけ

疎結合にすることで 作業をシンプルに

ログイン情報以外は ステートレスな(状態を持たない) 機能として提供する。

POINT

課題3:3月までに デモができるようにする

プロダクト・オーナーの要求

3月にユーザーが 実際に操作するデモを行う

プロダクト・オーナー

リスケは不可

デモで使用する機能に バグがないこと

※ 写真の人物はイメージです。

実際のリリース予定は5月なので 3月は開発の中盤となる

ウォーターフォール型だと ほぼ確実にできない!

プロジェクト・マネージャーが 前に言ってたこと

管理もアジャイルとか やってみたいんだけど、 経験がないから考え中だね

プロジェクト・マネージャー

※ 写真の人物はイメージです。

アジャイル開発で行こう!

Scrum? XP?

……

経験者が一人もいない!

……失敗しそう。

なので、

プラクティスを一部だけ適用

開発イテレーション (1週間~2週間の期間)

���

• ���� �• ��'(�

���

• ���• �����• ��!1-87���

• PG/��.,0�• ��!�

��

• *.58+47/3�

&(#"(�

• �����• 26+.)�

• $%�� �

適用プラクティスNo� fjY`W]� $1�

1� 3*[og� ���?I2,V0:7%�X`lo\inH"��CS]bokoV(�CS8�

2� "�� '"rs�+�H7��PFE@I7��PS@I7�5V�!CS8�

3� OR=<R� X`lo\inL �K7X`lo\inK�CSOR=<RV0;8�

4� `]b/ �� JUnit-V�)B7`]bL/ �V0;8�

5� �DONE� ]bokoP^]YM�K��BG:J?TN��I2JAJ:8p&�#>9S��M7DL^]YM.UFG:J:q�

6� X`lo\inah� X`lo\inL �K7��BEfmZjgLahV0:7"6�=QLeWocd_YV�S�

7� r�t�4� &#BJ:8�

これだけ

大切なのは混乱しないこと

• 今、何をすべきか明確にする

• 今、出来る作業量を明確にする

• 今、どこまで出来ているか明確にする

• 今、対処すべき問題があるか明確にする

課題4:短納期だが 品質は落としたくない

品質を保つために

• テストの自動化する

• メンテナンスできるコードを書く

方策1: Spockの導入

JUnit 書くのスゴくダルい

ここがイヤだよJUnit

• 実コード以上に、読みやすいコードを

書くのが大変。メンテしづらい。

• パターンテストやデータ準備等の

凝ったテストを書くのが大変。

• 純粋に記述量が多すぎる。

中盤ダレてくるとJUnitを 書かない・手抜きする人が続出

そこで

Spockを導入!

Spockとは• Java・Groovyアプリケーション向けの

テスト・仕様フレームワーク

• 美しく表現力の高い仕様記述言語

• JUnitとして動作する。

既存のJUnitの機能は全て使える。

Spockによるテストコードclass Math extends Specification { def “2つの値から、大きい値を取得できること" { expect: Math.max(a, b) == c ! where: a | b | c 1 | 3 | 3 0 | 0 | 0 7 | 4 | 4 } }

条件ミス (cは7が正解)

Spockによるエラー通知2つの値から、大きい値を取得できること FAILED !Condition not satisfied: !Math.max(a, b) == c | | | | 7 4 | 4 false

Groovyの習得に関して

• Javaのコードがほぼそのまま動くため、

とりあえず、すぐ使うことができた

• なれてくると、Groovyらしいコードが

書けるようになり、コード量が少なく

見やすいテストが書けるようになった

本当にすばらしいので ぜひ実践してみてください

方策2: リーダブルコード読書会

しばらく開発していて 発覚した問題点

コードレビューの 成果が出ない

正しく動くけど、読みづらい、 変な設計のコードが増えていく

このままだと メンテできなくなってしまう

なので

読書会の方針

• 毎日、定時後に1章ずつ(一時間程度)

• 持ち回りで担当者を決めて、解説してもらう

• 読んだ章について、ディスカッションする

読書会の効果• 各メンバーが自分で読みやすいコードを

考えるようになった

• レビューの指摘の意図や根拠が

伝わりやすくなった

• 学習意欲の向上

4. まとめ

その後もいろいろな問題が 発生しましたが

残業やトラブルもなく 無事、5月末にリリース できそうです。

いろいろご紹介しましたが

やっててよかった と言うためには

積極的に動くこと!

役割に縛られる必要は無い

積極的に動くと 責任ばかり増えるのでは?

ダメだとわかってて 放置するほうが無責任

でも、がんばったって 給料は変わらないよ

仕事の報酬は お金だけじゃない

それは

信頼

次の仕事

悪い仕事は、信頼を質にしてお金を借りているようなもの

でも、失敗したらどうするの?

失敗したって 100%ダメになる訳じゃない

実際のところ 100%の成功も失敗もない

大事なのは連敗しないこと

プロジェクトの改善に 大鉈を振るう必要はない

最初から完璧を目指すと 大抵、失敗する

まずは、小さな信頼を 得るところから始めよう

ご清聴、ありがとうございました

写真素材についてこの資料は、ぱくたそ(http://pakutaso.com)の写真素材を一部利用しています。この写真を継続して利用する場合は、ぱくたそ公式サイトからご自身でダウンロードしていただくか、ぱくたそのご利用規約(http://pakutaso.com)に同意していただく必要があります。同意しない場合は写真のご利用はできませんのでご注意ください。

top related