2015年11月23日月曜日

システムにおける失敗プロジェクトの考察(見積り編)



良くある失敗項目

私がITプロジェクトで失敗しているなー、と感じている流れを整理してみました。

見積りから始まる失敗事例

まずは、見積りの失敗から始まる失敗パターンです。

さあ、新しいプロジェクトが始まります。
まずは、見積りを作成して交渉するのですが、
高いといわれ続け、値下げしていきます。
(最初から損をするような見積りをする人はいません)


費用が無ければ、必要な人員や機材を確保できません。
が、何かの理由で、この採算の取れない案件を受注してしまいます。
プロジェクト計画書を作りますが、理想論しかかけず、
その理想を遂行するためのビジョンが描けない状態です。
(要はまったく出来る気がしない状態です)


必要な人員や機材を確保できないので、品質や納期および生産性に影響が出る。
上流工程では、ドキュメントだけなので騙し、騙しでドキュメントを完成させるが
内容について要件漏れや、矛盾があるような状況です。
このごまかしが、製造工程で泥沼を引き寄せます。
(ここで、悪循環の種を植え付けてしまいます)

当然、今後の泥沼を回避するためのアイデアなんて考えている暇はありません。


常に進捗遅れ状態、間に合わないから残業をするけど、焼け石に水
このころになると、具体的な施策より、精神論が横行しだす。
また、あわてて人を入れるが、当然何も知らないド素人が入るので
新しく入った要員の対応に追われるが、思った成果は出ない。


品質が悪いので不具合が大量に発生する。
対応に追われ、さらに進捗の遅れが悪化する。
また、残業もさらに増えて徹夜なんてことも

不具合の対処も当然ですが、他にも横展開などの対策にも追われるハメになる。

当然不具合に対する、想定も当初の計画には盛り込まれていなかったりするし
単純な誤りが目立ち、外部からもにらまれる。
(リーダーの精神状態が心配になります)


突然会社に来なくなる人や、うつ病になる社員が出る。
ひどい場所では、リーダーが逃げるといった話も聞く。


サービスインに持っていっても
瑕疵だの言われながら、サービスイン後の不具合の改修
を続け、新しい案件にメンバーを回せない。
瑕疵では無いと抵抗をしたいところだが、今まで出した不具合やそもそも
そういった戦いを行う体力さえも無い状態

どうでしたか、皆さんのイメージと同じでしょうか?
「ある、ある」と感じた人がほとんどではないでしょうか。

大きな失敗をしているプロジェクトの大半が、見積り誤りです。
いろんな手法の見積りが出ていますが、あくまで参考に出来るだけで、IT業界では未だに、経験に勝る見積りは無いと感じています。
あらゆる見積り手法は、相手を納得させるための道具と割り切り、自分の経験に近い見積りを出すようにしましょう。
もちろん自分が蓄積してきた実績に基づく数値を使うのであれば問題はありませんが、他の会社が持ち込んだ指標は全くあてになりませんし、要員により大きく変わります。
今まで私が読んできた書籍でも、優秀な社員とそうではない社員の差は100倍あるとも書かれていますし、製造の生産性と言う意味では、人によっては、達成できないというケースもあり、100倍どころではない状況に追いやられたこともあります。
といっても、本当に理想的な体制は作れないものです、まずは理想から何が妥協できるかを考えるようにしましょう。

それでも受注するの?

 時には会社の戦略として、採算が取れなくても、受注しなくてはならないケースもあるでしょうがその際は、どうか、引け目を感じず、最初の初期投資はしっかり行うことをお奨めします。
 途中で安定してくれば、そのタイミングで要員を削るという手もありますが、途中で人を入れるのはランニングコストが高くつき、どんなに優秀な人でも力を発揮するのは難しい状況になります。
 この場合は、費用のことは考えず、プロジェクト達成するためのどうしたらいいかということに集中するべきと考えます。(立ち上がったら要員は返却するなど適当なことを言ってでもいったんキープした方が良いです。もし泥沼になれば、それが分かっていても要員を引っこ抜くような冷徹な人は私は少ないと信じています。)


十分な体制が取れなかったらますます酷くなります。
マスターマインド、同じ志を持つ仲間と十分に議論し、達せしいたプロジェクトに関しては問題が起きたことは今までありません。

2015年10月7日水曜日

大容量のアップロード、ダウンロードについて

どうだ!?、これで大容量のアップロードも可能になります。

って事で、今回は大容量のアップロードを可能にする方法を考えてみました。
JQueryを利用するとコーディングが取っても楽になるのですが、業務シーンにより利用できないケースもあるので、pure Javascriptで作成しました。

さて利用に当たってですが、以下の条件があります。

  1. HTML5 File APIを利用しているので、動作可能なブラウザのバージョンに制限があります。
  2. 一応SafariやIEも考慮していますが、動作確認を行ったのはChromeです。私の端末はvistaなので、IE9までしかなくて、HTML5に非対応なので、動作確認できていません。
  3. サーバ側のアプリケーションサーバはwildfly9.0で実装しました。
こんな雰囲気で作成しています。

  • FileAPIのsliceによりファイルを一定のサイズで分割
  • 分割したファイルをXMLHttpRequestにより、Ajaxによりサーバへ送信
  • サーバ側で受信したファイルを追記モードでファイルに書き出し
といった感じです。

まだまだ、異常系の考慮についてはこれからですが、ひとまず巨大なファイルを分割してアップロードすることにより理論的にはアップロードするファイルの大きさに対する制限はなくなります。
また、今回のスクリプトは順次アップロードする仕組みにしておりますので、サーバへの負荷も比較的低く抑えることができるかと思います。

JavaScript



入力用画面サンプル


サーバ側のサンプル


最後に

今回はmultipart form-data形式でアップロードにチャレンジしてみましたが、アップロードするファイルのサイズを大きくするにつれてXMLHttpRequest.send(form)で実際にサーバへ送信されるまでの時間がかかっている印象がありました。恐らく、formデータを送信するための電文に変換する処理に時間がかかっている印象です。
XMLHttpRequest.send()を調べてみると、どうやらblobも送信できそうな記述が見つかったので、次はformデータではなくバイナリをそのまま送信してみるとこのあたりのオーバーヘッドが減るかもしれません。
今回は実測値はないので、もう少しがんばって、更新していきたいと思います。

課題

  • 途中で失敗した際のファイルの後片付けとかはどうする?(一定時間応答が無ければ捨てるような仕組みでいけないかな...)
  • ロードバランサ等による振り分けには耐えられない(共有ディスクを使ってなんとかかんとかすると出来るかも)

2015年9月27日日曜日

言霊それは信念、今までに心を動かしたと感じた言葉

私のシステム開発人生の中で、きっとこの言葉は、人の心に響いたと感じた言葉をまとめてみます。

本当に人の心に響いたかは、本人から聞いたわけではないのですが、システム開発は一人でやるものではないので、人間重視の視点が必要です。

担当ではなく、リーダーの立場でプロジェクトを遂行しなくてはならない立場となったときに、どうやったらメンバーが納得して、仕事をやってもらうかを常に考えてきて、私なりに確立した言葉を列挙してみました。

言葉には重みがあり、相手に使うときは信念が必要です。利用する場合は必ず自分のものにして自分の言葉として利用してください。信念がこもっていない言葉は重みがありません。

もっとシンプルに(俺馬鹿だから、もっと分かりやすくして)


私は、昔から、記憶する勉強が苦手でした。
難しいことを難しいまま覚えるのは私には出来ないと考えた私は、何のためにそうするのかということを理解した上で、物事を覚えることにしました。
私の脳には、この記憶方法が一番良いようで、覚えたことを「何故?、何のために?」というコネクタで関連付けていくことにより、目的から結論を導けるようになりました。

さて、導くための方法も「何故?、何のために?」が分かれば、実は他の方法もあります。
そこで、覚えることを単純にするために、この導くための方法を考え直すと、実はもっと簡単な方法があることにも気づけます。

難しいことは人に理解できません > 理解できないことは他の人には利用できません > つまり、創造したもの自身の価値が下がるのです。

もっと人に使ってもらえるものを創造しましょう。

プログラムでは、分かりにくい1行より、分かりやすい10行のプログラムを書けとよく言ってました。


何故このような仕組みにしたのか、あなたの考えを聞きたい


システム開発にはレビューが欠かせません。
レビューで私は、疑問に思ったことは、こう聞きます。「なぜこのような仕組みにしたのか、あなたの考えを聞きたい」こう聞くと、他もこうしているからとか、ググッて検索して出てきたものをそのまま活用しているような人は、「ハッ!?」とします。(たまにポカーンとして、しない人もいますが...)

正直に言うと、まねでもいいのです。
真似る理由が分かればいいんです。

近年のシステム開発では、レビューアが何でも知っているわけではなく、レビューア自身も答えを知らない場合が多々あります。私もレビューアをよくやるのですが、何故こうしたのかをしっかりレビューしたものは、たとえ答えを知らなくても、バグが発生する可能性が非常に低い傾向があります。

また、この問答をやっていると自分の知らない事が情報として得られ知識が高まるのも実感できます。
禅の言葉で、「たとえ七歳の子であっても私より優れていれば教えを乞おう」というのがあります。知らないことを探求する興味も失わないようにしましょう。


役割には、いろいろある。あなたの価値はマネージャとメンバーの橋渡しを行えることです。


これは、ある飲み会で「俺はもうプログラムも書けない、かといって偉くもなれない」といった人に対して言った言葉です。この人は、「ハッとして、そんな考え方もあるのか」と驚いて、かなり喜んでくれました。
システム開発ではどうしても、マネージャ、SE、プログラマといったポジションが目に付きますが、組織に必要な役割というのはいろいろなものがあり、3つだけに分類されるものではないと考えていました。
良くある役割に惑わされず、目的を達成するために必要な事ができるというのは本当はすばらしいことです。


システム開発はアナログ→デジタルのコンバートです。なので人とシステムの両方を知る必要がある。


学校を卒業してこの仕事に就いたときは、本当は人付き合いが嫌いでした。
技術を追い求めて、就職しましたが受注型のシステム開発はやればやるほど、機械ではなくて人がやりたいことを理解することがまずは肝心ということが分かりました。(何故なら、やりたいことが出来ないシステムは価値が無いからです)
慌てて、苦手なコミュニケーションを積極的にとるようにしました。今では人付き合いが好きになっている自分がいます。

技術は、このやりたいことをどう実現するかという次のステップに利用します。
技術は不要という意味ではなく両方必要という、実は非常に厄介な職種と私は感じました。


NO


一言ですが、私はこれを言い続けて、システム開発で何度か、運用故障0件のシステムを構築しました。
スティーブ・ジョブズも細部にこだわり、この言葉を言い続けました。
この言葉の奥には、あなたがやりたいと考えていることを妥協せず貫けるかという意味があります。
これは、人の心を動かすためには即効性はありませんが、何かを達成した際にともに喜ぶことが出来る一体感が生まれます。
ただし、使い方は気をつけましょう。私の場合は、この言葉を使うときは、一緒に苦労する覚悟を持って使っていました。


個性は何も無いところから生まれない、人の物まねの集合体である。


学校ではなくもっと広い視野で勉強をせず、個性だと主張するのは間違っています。
そもそも、人間は生まれてから何かを学習して、得た情報を改善したり、情報同士を関連付けたりして新しい事を生み出してきました。
個性を生み出すための種が情報なのです。情報を得るための学習を怠らないようにしましょう。


サラリーマンは会社からの評価は遅れてくる。だからあきらめるな、気が付いたら現場の人たちが高い評価をしてくれる。そうなると会社も無視できなくなるから。


最初に注意です。結果が後から付いてくるという意味ではありません。スポーツ業界でのイチローも言っていますが、これは甘えです。結果はリアルタイムで出しましょう。

さて、ここで言いたいことは

やっていることに比べて給料が低いと感じたことはありませんか?
それが嫌なら、サラリーマンは止めるべきですし、そもそも、会社が利益を上げてから、ボーナスや昇給などで評価される仕組みをとっている以上、あなたへの評価は直ぐには現れません。

誰かの役に立つために仕事をやっていけばどんな現場でも、あなたのことを認めてくれる人は現れます。

私は、会社に褒められるより、一緒に目的を目指したメンバーから褒められるほうがうれしいです。
間違えないでください、現場で最善の結果を出すことに注力してください。
それがあなたの、スキルアップにつながり結果、会社に依存することなく生きていける能力が身につくのです。

2015年9月26日土曜日

個人的にEclipseでよく利用しているショートカット(更新中)

個人的に良く使うショートカット順に並べてみました。 EclipseのMarsを使っているので、古いバージョンでは使えないショートカットキーもあります。

エディタ編

動作 Windows Mac 利用シーン
ファイル名を検索して開く Ctrl + Shif + r + Shif + r ファイル名を覚えている人はここから開いたほうが速い
検索
次へ
戻る
Ctrl + f
Ctrl + k
Ctrl + Shift + k
⌘ + f
⌘ + k
⌘ + Shift + k
ファイル内の文字列検索です。
この3つのショートカットはセットで覚えましょう
インクリメンタル検索
次へ
戻る
Ctrl + j
↓
↑ + k
⌘ + j
↓
Shift + ↑
入力順にリアルタイムで検索してくれます。
ちょっと癖があるけどなれるとこっちの方が便利かも
次へ
戻る
Alt + ←
Alt + →
option + ⌘ + ←
option + ⌘ + →
ブラウザの戻る、進むのような操作が出来ます。
ctrl+左クリックで参照クラスやメソッドに飛んだ後、戻る際に利用しています。
指定行へジャンプ Ctrl + L ⌘ + L スタックトレースの情報から該当箇所に飛ぶ際に便利
ウィンドウの分割(水平) Ctrl + Shift + - 調査中 ひとつのソースを上下に分割して参考にしながらコーディング!!
ウィンドウの分割(垂直)
Ctrl + Shift + [
調査中 ひとつのソースを左右に分割して参考にしながら最近の液晶は幅が広いので結構使えます。
クイックフィックス
Ctrl + 1
⌘+ 1
import追加等

画面切り替え編

動作 Windows Mac 利用シーン
パースペクティブ切替 Ctrl + F8 ⌘ + F8 デバッグとJava EEの切り替えに良く使います。
検索
次へ
戻る
Ctrl + f
Ctrl + k
Ctrl + Shift + k
⌘ + f
⌘ + k
⌘ + Shift + k
ファイル内の文字列検索です。
この3つのショートカットはセットで覚えましょう

2015年9月24日木曜日

mevenによるJavascriptライブラリの自動取り込み【webjars編】

なぜ、webjars?

  1. jquery等のjsを毎回ダウンロードしてwebappに配置するのは少し面倒
  2. ライブラリ類は旨く配置しないと、自分がつくったjsなんかと混在して煩雑になっていく

実施環境

  1. java version "1.8.0_51"
  2. wildfly-9.0.1.Final

チュートリアル

今回はJqueryの2.1.4を利用できるようにしてみようと思います。
読み込む対象を以下のサイトから検索します。

mavenに依存関係を追記するので、mavenを選択してください。

バージョンの選択と、依存関係の記述をpom.xmlへ追加する。


pom.xmlの依存関係を追加




読み込んだjqueryの構造をチェック

webjars配下のディレクトリ構成をチェックしておきましょう。
ここではjquery/2.1.4/dist/にjquery関係のjsファイルが格納されているのが分かります。


サンプルHTML作成


動作検証

感想

若干便利さは感じましたが、正直以下の対応まで出来ればもっと良かったです。
  1. servlet3による追加方法を検証してみたのですが、bootstrap.min.cssを追加する必要があるので、出来ればこの記述もなくしたい。。。
  2. ディレクトリにバージョンが含まれてしまっているので、バージョンを変える場合は依存関係を変えるだけではなく利用しているソースも同様に修正する必要がある。


2015年9月22日火曜日

jsdoc3によるJavascriptドキュメント作成

はじめに

以前、YUIDocに関するJavaScriptのドキュメント作成方法について、このブログで紹介しました。
どうも、調べているとjsdocのほうが一般的?(何をデファクトスタンダードとするかは基準に迷うところです)のようなので、改めてjsdocの生成について行ってみようと思います。

Goals

さて今回の目標設定は以下としました。
  1. Eclipse上でドキュメント生成する。
  2. Eclipse上でコメント記入中にリアルタイムにプレビューしたい。(これは難しそう)
  3. JavaScriptのコーディング中に生成したドキュメント参照できるようにする。

実施環境

  • Eclipse  Mars Release (4.5.0)
  • java version "1.8.0_51"

1.Eclipse上でドキュメント生成

まずこの目標ですが、今回はMavenを利用してpom.xmからJavaScriptのドキュメントを自動生成するようにしてみようと思います。

プロジェクト構成

  HellowWorld
    │
    │   pom.xml
    └─src
          │
          └─main
                │
                └─webapp
                      │
                      └─js
                            │
                            └─jsdoc3sample.js

pom.xmlの定義


pom.xmlの構成のポイント

  • outputDirectory:
    言わずと知れた。ドキュメントを出力する場所です。今回はMavenのビルドパス上に作成するようにしてみました。
  • jsdocInput:
    ドキュメント作成するJavaScriptを指定します。


サンプルJavaScriptファイル

まだ、ドキュメント用のコメント記述が良く分かっていないところもありますが、とりあえず以下のサンプルを作成しました。

ビルド実施

Eclipseでプロジェクトを選択して、以下のコマンドを実行です。

コマンド

> mvn clean jsdoc3:jsdoc3

Eclipse上から実行する場合

EclipseのメインメニューからRun(R)-Configuretionsを選択するとRun Configurationsダイアログが表示されます。


左側のツリーにてMaven Build下に新しいビルドを追加

Name:ご自由に
Base directory:対象のプロジェクトを選択
Goals:jsdoc3:jsdoc3

上記の内容を入力し、Runをクリック


ドキュメントが生成が成功すると上記の内容がコンソールに表示されます。


成功するとProject Explorerのtargetフォルダを再描画(F5キーを押す)するとjsdoc3フォルダが表示されます。

jsdoc3フォルダ配下のindex.htmlをブラウザで開くとドキュメントが作成されていることが分かります。



以上で、ドキュメント作成までの流れは終了です。

2.Eclipse上でコメント記入中にリアルタイムにプレビューしてみる。

Javaだと以下の画面のように、作成中のドキュメントを簡易ではあるが確認できる。


こんな感じで、作成しながら確認できればうれしい!!

とりあえずEclipseのViewをあさってみると以下のようなものがったので使ってみる。
EclipseのメインメニューからWindow(W)-Show View-Other...を選択するとShow Viewダイアログが表示されます。


JavaScript - Documentationを選択してOKをクリックする。
Documentationビューの動作を確認してみる

表示される。

表示されない。

これだけでは表示されないケースがあるみたいです。これはJsDocの記述が悪いのか、そもそもJsDocにツールが対応していないのか...
引き続き調査して、何か見つかったら追って更新します。

3.作成したドキュメントとの紐付け方

探してみましたが、そもそも、EclipseからJavaScriptのHelpを呼び出すという仕組みは見当たりませんでした。
正直これが出来ないと、つくったドキュメントを一番活用するのはコーディング中です。つまり統合開発環境と連携できないとドキュメントを見てもらえるケースが激減するので、作成に気合が入らなくなってしまいます。

総評

以下の3つの目標を立てましたが、残念ながら今回はコンプリートできませんでした。
解決策が見えましたら、随時更新していきます。
  1. Eclipse上でドキュメント生成する。

    ⇒ mavenにて自動的に作成できるので、クリア
  2. Eclipse上でコメント記入中にリアルタイムにプレビューしたい。(これは難しそう)

    ⇒ コメントの記述方法が悪いのかjsdocが対応していないのかコツを掴むのに時間がかかりそう、とりあえず継続利用して何か分かりましたらページを更新しいます。
  3. JavaScriptのコーディング中に生成したドキュメント参照できるようにする。

    ⇒ 全く、見つけれませんでした。すみません。

2015年9月20日日曜日

ウェブ・ページにソースコードをスタイリッシュに表示する方法(GitHub編)

経緯

ブログを書いていてソースコードを掲載することがあるのですが、ページに記載することが多くなりタグで書くのは面倒だったので簡単に貼り付けれるような方法を探してみました。

Goles(いつものように目標設定)

  1. ソースコードをWebページにかっこよくハイライト表示できること。
  2. 出来れば、タグなどを付与せずそのまま貼り付けたい。
  3. Java、HTML,JavaScriptに対応しているいること。

選定

検索してみると条件を満たせそうなものとして、以下のものが見つかった。
  1. SyntaxHighlighter
  2. GitHubのGistを利用して、自分のページにScriptを埋め込む
今回は、GitHubを選定してみました。理由は、GitHubに興味があり、一度使ってみたかっただけです。

GitHubとは?

個人的には以下の理解です。(まじめには勉強していないので感覚的なものです。正しい理解をしたい方は、自分で調べてみてください)
  1. ソースコードがバージョン管理できる。
  2. 世界中の人がレビューしてくれる。
    今回サンプルをアップしましたが、1時間ほどで3人ほどレビューしてくれました。たいしたものをアップしなかったので、修正はありませんでしたが、すぐに見てくれる人がいるのはすごい!!
  3. ついでに、評価もしてくれる。(ソーシャルネットワークの「いいね!」にあたるものが用意されていますが、、、何でもかんでも「いいね!」には賛同できかねますが)
開発をかれこれ、20年ほどやっていますが、こんなに簡単にグローバルに開発が行えてしまう状況はには正直、感動します。いろいろと感じた点はあるのですが、話がそれそうなので、別の機会にします。

作業の流れ

  1. GitHubへユーザ登録
  2. GitHubへログインし、Gistでソースコードを登録する。
  3. 好きなページにスクリプトを埋め込む
上記の4ステップです。実際やってみましたが、私はGoogleのBloggerを利用しており動的ページを利用していると表示できないという罠にはまった以外はあっさりとうまくいきました。

1.GitHubへのユーザ登録

ここは省略します。
必要がある方は、ここから登録できます。

2.GitHubへログインし、Gistでソースコードを登録する。

ログインすると以下の画面が表示されます。


画面上にある、Gistをクリックします。

ソースコードを入力します。
ファイルの拡張子でハイライト表示が変わるみたいなので必ず拡張子を入力すること


作成したら、Create secret gistをクリック

3.好きなページにスクリプトを埋め込む

画面右にある、Embed URLのアイコンをクリックすると
クリップボードに貼り付けるScriptタグがコピーされます。

自分のブログやホームページに貼り付けると完成です。
ちなみにこんな感じです。

Eclipseでソースを見てるみたいです。かっこいいので、皆さんもブログなど自分のコードを公開する場合は利用してみたください。