2013年3月29日金曜日

AngularJS リファクタリング コントローラーの継承

AngularJSで試作しているものはTDDで開発している。レッドー>グリーンー>リファクタリングのサイクルで回していくとコードも改良されて、いい感じになってくる。

リファクタリングではじめに行うのは重複コードの削除だ。AngularJSではコントローラーにコードを書く事が多いだろうから、まずコントローラーの継承方法を。


//BaseController
function BaseController($scope) {
 //ベースコントローラー
}

//Controller1
function Controller1($scope,$injector) {
 //継承されたコントローラー

 $injector.invoke(BaseController, this, {$scope: $scope});
}
BaseController.prototype = Object.create(Controller1.prototype);

AngularJSではこれでコントローラーの継承が行える。これだけのことなのにかなり時間がかかった。AngularJSというよりも、Javascriptでつまずいた感じだ。

参考にしたこのはここ

2013年3月28日木曜日

Agile459 2013年3月


Agile459主催のアジャイルサムライ読書会に行った。10章は本の記述量も少なく、内容もまとめみたいなものだったので、さっくりと終わりました。
 この章に書いてあるように、アジャイルサムライに書いてあることを忠実にやる必要はなく、自分達の組織にフィットしたものからやればいいので、気楽に始めればいい。原典主義に陥らなようにやれば導入できるのでは。あとダメなら止めると宣言してから始めると、いいかもしれない。
個人的には第一歩はユニットテストの導入&自動化からやればいいと思う。これで品質を確保して時間ができれば、他の事に手をつけれるのではないか。

以前DevLove四国やるので、喋ってもらえませんかと依頼を受けていた。安易にいいですよと答えておいたが、四国で喋るのは私一人だったらしい!

2013年3月27日水曜日

AngularJSでUnit Testを行う

AngularJSを使い始めて1週間になる。なんとなく理解できてきたので、AngularJSを使ってのUnit Testのやり方を書いておく。


  • angular-seedよりプロジェクトの元をダウンロードする。GithubなのでクローンでもZipでダウンロードでもどちらでもいいです。

  • Unit TestのrunnerとしてKarma(名前が変わったようだ。前はTestacularだった。)を使う。node.jsが必要なのでまずインストールする。その後Karmaをインストールする。テスト対象のソースコードが更新されたら自動的にUnit Testが実行される。これは便利だ。

  • angular-seedのフォルダ構成は以下の通り。

app/                --> all of the files to be used in production
  css/              --> css files
    app.css         --> default stylesheet
  img/              --> image files
  index.html        --> app layout file (the main html template file of the app)
  index-async.html  --> just like index.html, but loads js files asynchronously
  js/               --> javascript files
    app.js          --> application
    controllers.js  --> application controllers
    directives.js   --> application directives
    filters.js      --> custom angular filters
    services.js     --> custom angular services
  lib/              --> angular and 3rd party javascript libraries
    angular/
      angular.js        --> the latest angular js
      angular.min.js    --> the latest minified angular js
      angular-*.js      --> angular add-on modules
      version.txt       --> version number
  partials/             --> angular view partials (partial html templates)
    partial1.html
    partial2.html

config/testacular.conf.js        --> config file for running unit tests with Testacular
config/testacular-e2e.conf.js    --> config file for running e2e tests with Testacular

scripts/            --> handy shell/js/ruby scripts
  e2e-test.sh       --> runs end-to-end tests with Testacular (*nix)
  e2e-test.bat      --> runs end-to-end tests with Testacular (windows)
  test.bat          --> autotests unit tests with Testacular (windows)
  test.sh           --> autotests unit tests with Testacular (*nix)
  web-server.js     --> simple development webserver based on node.js

test/               --> test source files and libraries
  e2e/              -->
    runner.html     --> end-to-end test runner (open in your browser to run)
    scenarios.js    --> end-to-end specs
  lib/
    angular/                --> angular testing libraries
      angular-mocks.js      --> mocks that replace certain angular services in tests
      angular-scenario.js   --> angular's scenario (end-to-end) test runner library
      version.txt           --> version file
  unit/                     --> unit level specs/tests
    controllersSpec.js      --> specs for controllers
    directivessSpec.js      --> specs for directives
    filtersSpec.js          --> specs for filters
    servicesSpec.js         --> specs for services

test/unit以下にテストを書いていく。


  • Unit TestのフレームワークはJasmineを使っている。Jasmineでなければいけないことはいが、とくにこだわりがないのならJasmineでいいのでは。ControllersSpec.jsはこんな感じになっている。
'use strict';
/* jasmine specs for controllers go here */

describe('MyCtrl1', function(){
  var myCtrl1;

  beforeEach(function(){
    myCtrl1 = new MyCtrl1();
  });


  it('should ....', function() {
    //spec body
  });
});


describe('MyCtrl2', function(){
  var myCtrl2;


  beforeEach(function(){
    myCtrl2 = new MyCtrl2();
  });


  it('should ....', function() {
    //spec body
  });
});


  • テスト実行はコマンドラインから行う。script直下のtest.shを起動する。


npm config set https-proxy http://10.10.40.99:8080
./scripts/test.sh 

すると新しいUnit Test用のchromeが起動され、自動的にテストが実行される。すでにchromeを起動している場合は2つ目のchromeが起動される。テスト用chromeはバックランドで動いていればいいだけなので、小さくしてもいいし、隠してもいいので邪魔にならないところにおいておく。

test.shを起動したターミナルに結果が表示される。


Starting Testacular Server (http://vojtajina.github.com/testacular)
-------------------------------------------------------------------
INFO [testacular]: Testacular server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 25.0 (Mac)]: Connected on socket id kOH8yR-070Vtb5m8pwXt
Chrome 25.0 (Mac): Executed 5 of 5 SUCCESS (0.13 secs / 0.022 secs)

こんな感じで5件のテストが成功したと教えてくれる。

TDDで開発するならここからがスタートとなる。こんな感じでの開発開始となる。JavascriptのUnit Testは初めてだったが、使いだすと必須だ。やっぱり自動テストは書かないといかんでしょう。


2013年3月26日火曜日

AngularJS seed project

一通りAngularJSのチュートリアルをすませたら、自分のプロジェクトを作成したくなる。 そこで使えるのがAngular Seed Prpjectだ。これはAngularJSを使ってプロジェクトを作成する際に雛型を提供してくれるものだ。これを基に開発を始めれば、ディレクトリ構成など共通となるので、プロジェクト間のリソースなどは流用性は高くなる。あとUnit Test, End-2-Endのテストも組み込まれているため、すぐにTDDで開発もできる。
オススメです。

2013年3月25日月曜日

MongoLabでオブジェクトのアップデート

フロントエンドはAngularJSで作成し、バックエンドはMongoLabを使ってオブジェクトの永続化を行った。RESTfulに接続を行ったが、GET,POST,DELETEはつまらなくて行けたが、PUT(更新)がうまくいかなかった。何度やっても更新されない。

MongoLabにあるAPI仕様書を読んでわかった。


$.ajax( { url: "https://api.mongolab.com/api/1/databases/my-db/collections/my-coll/4e7315a65e4ce91f885b7dde?apiKey=myAPIKey",
          data: JSON.stringify( { "x" : 2 } ),
          type: "PUT",
          contentType: "application/json" } );

PUTの時はMongoDB用のidをURLパラメタとして引き渡すが、PUTデータとしてはidは渡す必要はないのではないか!

早速コード書き換えて試してみた。


var url = 'https://api.mongolab.com/api/1/databases/my-db/collections/my-coll/';
var key = '?apiKey=myAPIKey';
var updateId = $scope.obj._id.$oid;
delete $scope.obj._id;  //これが必要?
$http.put(url + updateId + key,$scope.obj).success(function(data)
 { 
});


更新できた。_idは必要ないようだ。

2013年3月23日土曜日

AngularJS $filterの使い方

AngularJSの$filterの使用方法。
$filterをインジェクションして、$filter('使用フィルタ')(処理);

function AppCtrl($scope, $filter) {
 
 var date = Date.now();
 date = $filter('date')(date, "yyyy/MM/dd");
}

dateフィルタを使うと簡単に現在時間のフォーマットができる。

2013年3月22日金曜日

AngularJSでのチェックボッス初期設定

JavascriptフレームワークのGoogleのAngularJSを使っている。
他のフレームワークと違い、直接DOMを操作するようなタイプではなく、モデルとビュー間データバインディングで動的なWebアプリを作成できる。

そこでチェックボックとモデルをバインディングして、初期値を設定する方法が分からなかったので調べてみた。

コントローラー内で以下のようなデータを初期化して、テンプレートに表示する。
checkboxの状態はchekedで表す。

function listCtrl($scope) {
 
 $scope.data = [
 {"date": "2013/12/31","no": "1","checked":"YES"},
 {"date": "2013/12/31","no": "2","checked":"NO"}
     ];
 
}

サンプルにあるような感じでモデルにバインディングしても、初期値に反映されない。

<input type="checkbox" ng-model="journal.checked">

オプションを追加することで初期値に反映される。


<input ng-false-value="NO" ng-model="journal.checked" ng-true-value="YES" type="checkbox" />

trueとfalseの値を指定するとモデルの内容がそのまま初期値として設定される。

2013年3月21日木曜日

Nodeパッケージ管理のプロキシサーバー設定


ネット環境がProxyサーバー経由なのパッケージ管理ソフトにはProxyサーバーの設定が必要となる。
各ツールによって設定方法が違うのでまた設定だ。今度は以下の通り。

npm config set https-proxy http://10.10.40.99:8080

これでホーム直下の.npmrcに設定される。
proxyばかり設定している。

2013年3月20日水曜日

Ruby On Railsをインストール

Ruby On Railsをインストールしたので、環境構築手順を残しておく。残しておかないと忘れてしまい同じような作業を繰り返さなければならないので、インストールとか作業手順を残しておこう。今回はWindows環境にインストールしてみた。


  • Rubyのインストール
Rubyが何かを説明することはないと思うが、Rubyはオブジェクト指向のスクリプト言語。これがなければ始まりませんので早速インストールする。

http://rubyinstaller.org/ にインストーラーがるのでダウンロードしてインストールする。最新バージョンが2.0のようなので、これをインストール。通常こんなメジャーアップデート版をそのまま使うとハマることがあるが、今回はあえてリスクをとってみる。

あとダウンロードしたプログラムはまとめて保存しておく。次に同じ環境を作ることがあるかもしれないので。なぜか2度やらないと思う作業は繰り返されることが多い。

インストールオプションを聞いてくるが、

「Rubyの実行ファイルへ環境変数PATH を設定する」

これをチェックする。PATHぐらい自動で設定してくれてもいいのに。

ターミナルを開いてちゃんとインストールされているか確認する。


ruby -v
ruby 2.0.0p0 (2013-02-24) [i386-mingw32]

  • RubyGemsの更新
 RubyGemsはRubyパッケージ管理ソフトでRubyライブラリを追加、更新、削除できる。

gem update --system
Latest version currently installed. Aborting. 

最新になっているようだ。
ダメだった。プロキシ環境下でパッケージの情報がとれていないだけだった。
なのでまずプロキシの設定


ユーザのホームディレクトリに

.gemrc

というファイルを作りProxyサーバーの設定を行う。

http_proxy: http://hostname:port




再度アップデート
gem update --system
Updating rubygems-update
Fetching: rubygems-update-2.0.3.gem (100%)
Successfully installed rubygems-update-2.0.



こんな感じでアップデートされた。
  • rakeの更新
rakeとはRuby版のビルドプログラムでUnix系に詳しい方はRubyのmakeだと思えばいい。

gem update rake
Updating installed gems
Updating rake
Fetching: rake-10.0.4.gem (100%)
rake's executable "rake" conflicts with C:/Ruby200-x64/bin/rake
Overwrite the executable? [yN]  y
Successfully installed rake-10.0.4
Parsing documentation for rake-10.0.4
Installing ri documentation for rake-10.0.4
Installing darkfish documentation for rake-10.0.4
Gems updated: rake

  • Development Kitのインストール
Development KitとはWindows環境下でCやC++のエクステンションをビルドしてくれる。Windowsユーザはインストールしておいたほうがいい。(らしい。Windows環境で使ったことないので。)

http://rubyinstaller.org/downloads/にDevelopment Kitのダウンロードリンクがあるのでダウンロードする。ダウンロードしたファイルを解凍するが、解凍先はC:\DevKitとする。

\Devkit\devkitvars.bat
Adding the DevKit to PATH...

を実行してPATHを設定する。

動作確認してみます。JSONライブラリでもインストールしてみる。


gem install json --no-ri --no-rdoc
Fetching: json-1.7.7.gem (100%)
Building native extensions.  This could take a while...
Successfully installed json-1.7.7
Done installing documentation for json (0 sec).
1 gem installed


  • Ruby On Railsのインストール
RailsとはRubyを使ったWebアプリケーションフレームワーク。とりあえずRailsをインストール。


gem install rails --no-ri --no-rdoc
Fetching: i18n-0.6.4.gem (100%)
Successfully installed i18n-0.6.4
Fetching: multi_json-1.6.1.gem (100%)
Successfully installed multi_json-1.6.1
Fetching: activesupport-3.2.12.gem (100%)
Successfully installed activesupport-3.2.12
     ・
     ・
     ・
Fetching: rails-3.2.12.gem (100%)
Successfully installed rails-3.2.12
 
29 gems installed

こんな感じでバージョン3.2.12がインストールされた。

rails -v
Rails 3.2.12

でインストールしたバージョンが確認できる。

2013年3月16日土曜日

Gitのプロキシサーバー設定

Gitのプロキシサーバー設定方法です。

git config --global https.proxy 10.10.40.99:8080
git config --global http.proxy 10.10.40.99:8080

こんな感じでターミナルから登録するとプロキシサーバーが指定できる。

 設定情報はユーザデフォルトの

.gitconfig

にある。このファイルをグローバル設定ファイルと呼ぶようだ。
これでGitの設定ができた。

2013年3月14日木曜日

Aptana Studio3でプロキシサーバー経由のアップデート

Apatana Studio3を使っているのだがネットがファイヤーウォールで固く閉ざされており、ソフトウェアのアップデートをチェックがエラーとなって行えない。
Webブラウザも外部へのアクセスはproxyサーバー経由なのでAptanaにもproxyサーバーの設定を行います。

「環境設定」-「General」- 「Network Connections」を開きます。

Active Provider:

  • Direct プロキシサーバーを使用しない。
  • Manual Aptanaで設定いたプロキシサーバーが使用される。
  • Native OSで設定されているプロキシサーバーが使用される。
Proxy entries:
  ホスト、ポート、認証をプロトコル毎に設定する。

Proxy bypass:
  プロキシサーバを経由したくないホストを設定する。

Mac OS Xで使用しているのだが、Active ProviderのNativeが設定できなようなのでManual設定をした。

Aptanaのアップデートはできたが、まだGitがConnection refusedとなってしまう。

2013年3月13日水曜日

JUnit勉強会 in 松山 - "REVIVAL" #season1


Agile459/アジャイルプロセス協議会四国支部の主催でJunitの勉強会があったので参加した。Junitはちょうど10年前に自分がアジャイルに興味を持ち始めたきっかけだ。 

自動テストってなんや?
そんなにコードばっかり書いて作業量が増えるやろ?

こんな感じで懐疑心丸出しで始めたのを覚えている。今となってはあの時始めて本当に良かったと思う。どうしたらJunitでテストが書けるようになれるかを勉強したおかげで、オブジェクト指向についての理解度が深まり、それ以前とは全く違うコーディングスタイルとなった。

なのでJunit勉強会にはぜひ参加したかったし、知っていることを共有しようと思っていたが、自分はJunit4.4など知らなかったので、assertThatなるものがあることを知らなかった。逆に教わることばかりだった。いつもassertEqualsで書いていたので知らなかったが、新しい技術が取り入れられているんだな。

途中誕生会などはさみ3時間でしたが、まだまださわりの部分だけだったので、次回はぜひテストを書きやすいアプリケーションアーキテクチャなどを題材にしてもらえれば、もっとテストを書くのが楽しくなるのでは。

最後に確認したいのだが、テストコードにはテストコードいらんよね。

2013年3月11日月曜日

Node.jsを使ってみる2

前回の続き

  • リクエストのルーティング化
ルーターを作成してルーティングできるようにした。匿名クラスはどうしても好きになれない。


Stardust:Node user$ node index.js 
Server has started.
Request for /start received.
Request received.
About to route a request for /start
Request for /favicon.ico received.
Request received.
About to route a request for /favicon.ico

ちゃんと動いている。


  • 本当のリクエストハンドラへのルーティング
とりあえずrequesthander.jsファイルにハンドラーを記述してみる。
javascriptは連想配列に関数を設定できるようだ。なのでこんなコードがかける。


var handle = {}
handle["/"] = requestHandlers.start;

function route(handle) {
  if (typeof handle[0] === 'function') {
    handle[0]();  ---> ここのこと!
  } else {
    console.log("No request handler);
  }
}

これで関数が呼び出せる。コードを修正して起動してみた。
http://localhost:8888/startでアクセス

Stardust:Node user$ node index.js 
Server has started.
Request for /start received.
Request received.
About to route a request for /start
Request handler 'start' was called.
Request for /favicon.ico received.
Request received.
About to route a request for /favicon.ico
No request handler found for /favicon.ico


今度はhttp://localhost:8888/のみでアクセスしてみる。

Request for / received.
Request received.
About to route a request for /
Request handler 'start' was called.
Request for /favicon.ico received.
Request received.
About to route a request for /favicon.ico
No request handler found for /favicon.ico

ちゃんと動いているようだ。


  • リクエストハンドラによる応答
nodeではノンブロッキング処理が基本で、イベント駆動に対応させる必要がある。非同期のCallback関数を設定した場合、responseを終了する場所を考えよう。server.jsのstartメソッド内でroute()メソッド後response.endを呼び出してしまうと、Callback関数が終了する前にレスポンスを返してしまうので、真っ白な画面が表示されるだけになる。注意が必要である。

function start(route, handle) {
  function onRequest(request, response) {
   var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    console.log("Request received.");
    
    route(handle,pathname,response);

    response.end(); ---> これだ!これがダメだった。
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}


  • 有益なものを提供する

この章問題なく、upload処理まで終わった。requestに対してListenerを追加するところなどは、Java,PHPなどのフレームワークと同様なので扱いやすい。あと外部モジュールを使って画像ファイルとPostデータ周りも他のフレームワークと変わりはない。


いまさらながら、Socket通信がなかったような。Nodeは簡単にSocket通信できるがウリだったような次はSocket.IOを試してみよう。

清掃


入居した創業準備室だが、長年にわたる酷使により、床がかなり汚れている。荷物の少ないうち掃除した方がいいとの忠告もあり、早速床を清掃することとした。(汚いので写真は小さ くした。)






ホームセンターでリンレイのオール床クリーナー、スポンジを購入し床のワックスはくりをおこなった。原液を床にまきスポンジでこすると、信じられないぐらいきれいになる。
成果がすぐにフィードバックされるので掃除はいい。

現代化学の素晴らしさを体験した後、水拭きして、ワックスをかける。

きれいになった!



ワックスがけに失敗したようで多少ムラがあるようだが、まあいいでしょう。
環境を変えると人間は変わる。良い環境で仕事することは大きな意味があると思う。

2013年3月8日金曜日

Node.jsを使ってみる

Node.jsを使ってみた。Node.jsはサーバーサイドの処理をJavascriptで書ける。あと非同期でリクエストが処理できる。これぐらいの知識しかないのでNodeビギナーズブックを一通りやってみることにした。

まずはインストール。ブックにはgitのリポジトリからソースコードをとってきてコンパイルするように書いてあるが、訳あってgitが使えないので公式サイトにあるINSTALLボタンよりインストール。Mac OS Xなのでインストールボタンを押すとnode-v0.8.22.pkgがダウンロードされるので、このパッケージをインストールする。
nodeは/usr/local/bin/nodeにインストールされた。

インストールされているか確認。

Stardust:~ user$ node -v
v0.8.22


まずはいつもの通りにHelloWorldから。コードはブックをみてください。

Stardust:Node user$ node helloworld.js 
Hello World


とくに問題なし。
今度はサーバーサイドを実装してみる。ブラウザでみてみると。

ERROR

The requested URL could not be retrieved


netstatで確認してみても確かに8888ポートでListenになっているものがない。

Stardust:~ user$ netstat -a -p tcp -L
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address         
0/0/128        *.ddi-tcp-1            
0/0/50         *.cslistener           
0/0/50         *.ndmp                 
0/0/50         *.9980                 
0/0/50         localhost.intu-ec-svcd 
0/0/100        *.61307                
0/0/128        *.49181                
0/0/128        *.49181                
0/0/128        localhost.ipp          
0/0/128        localhost.ipp          


と思ったが、/etc/servicesでみてみると

ddi-tcp-1       8888/tcp     # NewsEDGE server TCP (TCP 1)


となっているので、Listenはしているようだ。
ということは、Proxy設定かも。localhostをproxyサーバに投げているのかもしれない。
「システム環境設定」ー「ネットワーク」ー「詳細...」ー「プロキシ」を確認してみるとlocalhostが例外に設定されていなかった。localhostもプロキシに投げないように設定する。

再度ブラウザでアクセス。
出た! Hello World!


次はモジュール化を行う。index.jsとserver.jsに分けて実行してみる。

エラー発生。スタックトレースが表示される。


/Users/user/Documents/Aptana Studio 3 Workspace/Node/index.js:3
server.start();
^
ReferenceError: server is not defined
    at Object. (/Users/user/Documents/Aptana Studio 3 Workspace/Node/index.js:3:1)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:245:9)


serverって単語の単純なスペルミスだったが、Nodeってエラーのときこんなスタックトレースを吐くのね。javaっぽい。 これ長くなりそうので、続きは次回。

机1つですが

テクノプラザ愛媛の創業準備室に入居できることとなり早速引っ越した。
在宅勤務の気軽さも捨てがたいが、どうしても行動範囲が狭くなってしまうし、仕事専用の部屋などないので、自室にある誘惑にあっさりと負けてしまい、ダメ人間の見本みたいになっていた。

これではダメだろうと反省し、テクノプラザに入居させていただくこととなった。
机一つではあるが、これはこれでモチベーションがあがるのである。

2013年3月2日土曜日

ザッポス

以前このブログにも書いたザッポスのことだが、より興味がわいてきたので「ザッポス伝説」を読んでみた。
著者はザッポスCEOのトニー・シェイ。序文にこの本はゴーストライターを使わないで書いたので、読みづらかったごめんなさいと書いてある。正直である。自分も文章を書くのが苦手なので共感がわく。

他の伝記みたいに生い立ちから章は始まるが、面白くなってくるのはザッポスCEOになったぐらいから。トニーはザッポス以前にリンクエクスチェンジ社を経営していたが、マイクロソフトに買収されたあと、企業文化がチームワーク主体から個人主体の環境になってしまったことで、自分が創った会社なのに最後には会社に行くのがいやになり辞めてしまった。そこで次の会社を経営するなら企業文化を重視するのだと思い至ったそうだ。

そこでザッポスのコア・バリューとして


  1. サービスを通して「ワオ!」という驚きの体験を届ける
  2. 変化を受け入れ、変化を推進する
  3. 楽しさとちょっと変なものを創造する
  4. 冒険好きで、創造的で、オープン・マインドであれ
  5. 成長と学びを追求する
  6. コミュニケーションにより、オープンで誠実な人間関係を築く
  7. ポジティブなチームとファミリー精神を築く
  8. より少ないものからより多くの成果を
  9. 情熱と強い意志を持て
  10. 謙虚であれ
を定めた。

各コア・バリューについて細かな説明もあるが、どれも見習いたいことばかりだ。
日本にもコア・バリューや経営方針、経営指針など定めている会社はたくさんあるだろうが、それらよりはちょっと変わったものが多い。

しかしこれらのコア・バリューにしても一昔前の日本企業では普通に持っていたものもある。7など日本企業の典型的な形態だったのでは。新入社員として一斉に入社し、同じ寮に住み、仕事も遊びも同じ会社の人達と過ごす。今、日本企業では仕事とプライベートを明確にわけることがおおいので、7を推進している会社は少ないのではないか。逆にアメリカの企業が大切な事だと言っていることがおもしろい。

加えてザッポスは「社員は会社にとって最も大切な財産だ。」と言う事を実践するため、パイプラインと言うシステムを構築している。パイプラインとは自社で社員のレベルやスキルをあげるもので、新社会人を採用して会社が教育を提供して育てていくシステムだ。日本と違いアメリカではジョブ・スクリプションで仕事が明確になっているので、自分の担当以外の仕事はあまり行わない。なので昇格したれば自分でそのジョブ・スクリプションを満たすような資格、経験などを自分でつまないといけない。

でも、ザッポスではバイヤー希望で入社してきた新人をマーチャンダイジング・アシスタント、アシスタント・バイヤー、バイヤー、シニア・バイヤー、ディレクター、バイスプレジデントと会社が教育してレベルアップさせていくのだ。
これなどまるきり日本企業のやり方と同じで、新人をとって、主任、課長、部長、取締役のように育成していく。昔から日本で行っていたことだ。
経営のグローバル化が叫ばれるなかでも、日本型経営でもいいところはある。

あと一番印象深かったのは、ザッポスはザッポスに影響を与えた書籍を集めてザッポス・ライブラリーを設置している。ザッポスは社員にこの本を読むことを勧めていて、ザッポスの考え方をより理解してもらえるようにしている。これはいいかも。見習いたいところだ。


2013年3月1日金曜日

アジャイルサムライ読書会松山#11


久しぶりにアジャイルサムライ読書会に参加した。前から積極的に参加したかったのだが、諸般の事情でなかなか参加できなかった。

今回は「第9章イテレーションの運営:実現させる」で分析設計、ペルソナ、ペーパープロトタイプ、開発、確認、カンバンなど。次章以降のイントロダクションのような感じで、さっとしか書いていないが、アジャイル初心者にはおおまかな流れは理解できるのではないか。

一通り内容確認したあとカンバンの演習をした。折り紙を完成させる行程を3つに割りあてて、ボトルネックが全体のスループットにどのように影響するかをちょっとだけ体験できた。やっぱり本だけでなくて演習するとたのしい。

プロトタイプの意義、ペルソナ手法、イテレーションゼロ、チームの作り方とかいろいろ話させてもらった。

イテレーションゼロは結構忘れがちで、意外に時間がかかることが多いので、ここでビルドの自動化や、共通開発環境の構築(VM化するとなおいい。)などをがんばると後行程で時間がとれる。ビルドを日次で実行して品質向上に役立てたり、開発環境がすぐに準備できると人員追加時にとても有効だ。
開発を始めるとまずコードを書きたくなるのは分かるのだが、イテレーションゼロを頑張れば、必ず生産性が向上するので、浮いた時間でじっくり開発しよう。

プロトタイプからUXに話が飛び、ユーザ体験にからんだジャーニーマップなんかの話もあり濃い会合だった。

今回は平日夜の開催だったので懇親会もありディープな話が続いた。

やっぱり技術の話は楽しい。毎月やってますので、興味のある方はぜひ参加してみてください。