<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>NDiS Tech</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/" />
    <link rel="self" type="application/atom+xml" href="http://www.ndis.co.jp/blog/tech/atom.xml" />
    <id>tag:www.ndis.co.jp,2007-12-10:/blog/tech//1</id>
    <updated>2010-04-08T01:05:58Z</updated>
    <subtitle>NTTデータセキスイシステムズ（NDiS）技術スタッフがお届けする広報ブログです。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.01</generator>

<entry>
    <title>Java の 列挙型</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2010/04/java-1.html" />
    <id>tag:www.ndis.co.jp,2010:/blog/tech//1.49</id>

    <published>2010-04-06T01:20:20Z</published>
    <updated>2010-04-08T01:05:58Z</updated>

    <summary>かなり間が空いてしまいましたが、前回に引き続き、現在読んだいるテキスト「Effe...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="勉強会便り" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>かなり間が空いてしまいましたが、前回に引き続き、現在読んだいるテキスト<a href="http://www.amazon.co.jp/dp/489471499X">「Effective Java 第2版」</a>からの話題を取り上げたいと思います。</p>

<p>今回は Java の列挙型 (Enum) についてです。</p>

<p>前回のジェネリックスと同様に、列挙型も Java5 以降に追加されました。<br />
Java5 がリリースされてから、もうずいぶん経ちますが、意外と列挙型をよく知らないという人も多いのではないでしょうか。</p>]]>
        <![CDATA[<p><a href="http://www.amazon.co.jp/dp/489471499X">「Effective Java 第2版」</a>で列挙型について解説されている項目は以下の通りです。</p>

<ul>
 <li>項目30 int定数の代わりにenumを使用する</li>
 <li>項目31 序数の代わりにインスタンスフィールドを使用する</li>
 <li>項目32 ビットフィールドの代わりにEnumSetを使用する</li>
 <li>項目33 序数インデックスの代わりにEnumMapを使用する</li>
 <li>項目34 拡張可能なenumをインタフェースで模倣する</li>
</ul>

<p>恥ずかしながら、この本を読むまで、Java の Enum がここまで強力なものとは知りませんでした。<br />
Enum の使いどころや利点を紹介したいと思います。</p>

<h3>Enumとは</h3>

<p>C言語では、列挙型というと、「名前付きの整数定数を定義するもの」ということになると思います。</p>

<p>C# などの .NET の言語でも、基本的には enum の実体は int 値ですが、Java の enum はこれらとは異なります。</p>

<p>Java での enum はインスタンス数が制限されていることを実行環境が保証している本格的なクラスです。</p>

<p>Effective Java では、このことを「インスタンス制御されている」と記述しています。<br />
別の言い方として、enum は「シングルトンを汎用化したもの」とも書かれています。<br />
（シングルトンとは、デザインパターンの1つで、インスタンス数が1つであることを保証するクラス設計のパターンです。）</p>

<p>この説明だけでも、勘のよい人は Java の enum が非常に有用なものだと直感していただけると思います。</p>

<p>Effective Java では固定数の定数が必要な場合には、常に enum を使用すべきだと断言されています。</p>

<p>業務プログラムでよくある「～区分」というデータなどは、まさに enum を使用すべき場面なのではないかと思います。</p>

<p>以下では、本の中で挙げられている、具体的な使いどころを紹介します。<br />
もちろん、詳しくは書籍を読んで下さい。</p>

<h3>基本の使い方</h3>

<pre class="prettyprint">
public enum Sex {
  MALE, FEMALE
}
</pre>

<p>これで Sex クラスはインスタンスが MALE と FEMALE の2つしか存在しないクラスであることが保証されます。</p>

<p>Sex クラス型の変数に MALE と FEMALE 以外の値を入れることはできませんし、MALE を表す場合は常に同じインスタンスなので == で等価比較を行うことができます。</p>

<p>また、以下のようにすると、内部的に値を持たせることも可能ですし、インスタンスを適切に文字列化することやその逆も可能です。</p>

<pre class="prettyprint">
public enum Sex {
  MALE("M", "MALE"), FEMALE("F", "FEMALE");

<p>  private final String shortName;<br />
  private final String longName;<br />
  Sex(String shortName, String longName) {<br />
    this.shortName = shortName;<br />
    this.longName = longName;<br />
  }<br />
  @Override<br />
  public String toString() {<br />
    return longName;<br />
  }<br />
  private static final Map<String, Sex> stringToEnum<br />
    = new HashMap<String, Sex>();<br />
  static {<br />
    for (Sex e : values()) {<br />
      stringToEnum.put(e.shortName, e);<br />
    }<br />
  }<br />
  public static Sex fromString(String shortName) {<br />
    return stringToEnum.get(shortName);<br />
  }<br />
}<br />
</pre></p>

<p>このように、Enum は完全なクラスなので、インスタンスフィールドを持たせることも、コンストラクタや static メソッド、インスタンスメソッドを定義することも可能です。</p>

<p>ただし、Enum は不変であるべきですので、インスタンスフィールドは final とするべきです。<br />
コンストラクタは、Enum のクラス定義以外では呼び出せません。<br />
(上記の例では Enum の定数定義を括弧付きで記述しているところでコンストラクタが呼び出されています。)</p>

<p>利用先(クライアント)のコードを再コンパイルすることなく、enum に定数を追加することも、定数の順序を変更することも可能です。これは int の定数で表す場合と比べて大きな利点です。</p>

<h3>ビットフィールドの代替(EnumSet)</h3>

<p>1つの変数で複数のフラグ等の状態を表したいときに、ビットフィールドと呼ばれる方法を利用することがあると思います。</p>

<pre class="prettyprint">
// 古いコードの例
public class FlagSampleOld {
  public static final int FLAG_A = 1;
  public static final int FLAG_B = 2;
  public static final int FLAG_C = 4;
  public static final int FLAG_D = 8;

<p>  private int state = 0;<br />
  public void turnOn(int flag) {<br />
    state |= flag;<br />
  }<br />
  public void turnOff(int flag) {<br />
    state &= ~flag;<br />
  }<br />
  public boolean isOn(int flag) {<br />
    return (state & flag) != 0;<br />
  }<br />
}</p>

<p>FlagSample flag = new FlagSample();<br />
// A と B と C のフラグを ON<br />
flag.turnOn(FLAG_A | FLAG_B | FLAG_C);<br />
// A と C のフラグを OFF<br />
flag.turnOff(FLAG_A | FLAG_C);<br />
// A のフラグが立っているか<br />
flag.isOn(FLAG_A);<br />
</pre></p>

<p>上記のようなコードは、turnOn や turnOff に渡される値を保証できないことや、フラグを文字列化する適切な方法が無いことや、使用可能なフラグを列挙することなどができません。渡される値を保証できないことは予期しないバグの元になりますし、文字列化できないことはデバッグの時の解析を難しくします。</p>

<p>Enum と EnumSet というものを使用すると、こういった問題を解決できます。</p>

<pre class="prettyprint">
public enum FlagEnum {
  A, B, C, D
}

<p>Set<FlagEnum> flag = EnumSet.noneOf(FlagEnum.class);<br />
// A と B と C のフラグを ON<br />
flag.addAll(EnumSet.of(FlagEnum.A, FlagEnum.B, FlagEnum.C));<br />
// フラグの状態を文字列化<br />
flag.toString() // => [A, B, C]</p>

<p>// A と C のフラグを OFF<br />
flag.removeAll(EnumSet.of(FlagEnum.A, FlagEnum.B));<br />
// フラグの状態を文字列化<br />
flag.toString() // => [C]</p>

<p>// A のフラグが立っているか<br />
flag.contains(FlagEnum.A)<br />
</pre></p>

<p>標準的な Java の Set のインターフェースのままで記述しているので、少し記述量が増えていますが、これで型安全なビットフィールドを表現することが可能です。</p>

<p>パフォーマンスについても、Enum定数の個数が64個以下の場合、EnumSet は内部の状態を long で表現するため、ビットフィールドのパフォーマンスと比べても遜色ないそうです。</p>

<h3>振る舞いを持つ定数</h3>

<p>すでに、メソッドの追加を行っているので Enum に振る舞いを持たせることができるのは分かると思いますが、それぞれの Enum 定数でメソッドをオーバーライドすることも可能です。</p>

<p>本の中に書いてある具体例を挙げます。</p>

<pre class="prettyprint">
public enum Operation {
  PLUS("+") {
    double apply(double x, double y) { return x + y; }
  },
  MINUS("-") {
    double apply(double x, double y) { return x - y; }
  },
  TIMES("*") {
    double apply(double x, double y) { return x * y; }
  },
  DIVIDE("/") {
    double apply(double x, double y) { return x / y; }
  };
  private final String symbol;
  Operation(String symbol) {
    this.symbol = symbol;
  }
  @Override
  public String toString() {
    return symbol;
  }
  abstract double apply(double x, double y);
}
</pre>

<p>この定数ごとに振る舞いを持たせる Enum は、内部で使用するロジック(アルゴリズム)を切り替えることができる、ストラテジパターンというデザインパターンに利用することができます。</p>

<h3>シングルトンパターン</h3>

<p>これは、最初に挙げた enum の項目ではなく、下記の項目で説明されています。</p>

<ul>
 <li>項目3 private のコンストラクタか enum 型でシングルトン特性を強制する</li>
</ul>

<p>シングルトンとは、そのクラスのインスタンスが1つしかないことを保証するクラス設計のパターンですが、Java 1.4 までは、private なコンストラクタを用意して実装するのが一般的でした。</p>

<p>Java 1.5 以降では、シングルトンは下記のように、Enum を使用して実装するのがベストです。</p>

<pre class="prettyprint">
public enum SingletonSample {
  INSTANCE;

<p>  public void xxx() { ... }<br />
}<br />
</pre></p>

<h3>終わりに</h3>

<p>Java の Enum は、他の言語での同様の概念から想像していた以上に便利だと思います。</p>

<p>この本で、その便利さを知ってから、業務のプログラムでもいくつか Enum を使用するように置き換えました。</p>

<p>初心者～中級者でありがちなのは、新しい概念を勉強すると、使い方をよく分からないうちに何でもそれを使おうとするので、結果的に使わない方がよいものまで使ってしまって困ったことになる、というのがありますが、Enum についてはどんどん使ってみてもよいのではないでしょうか？</p>

<p>（もちろんプロジェクトの他のメンバーも Enum を理解していることが前提になりますが。。。）</p>

<p>これからも、勉強会で出てきた話題の中から役立ちそうなものを紹介していきたいと思います。お楽しみに。</p>]]>
    </content>
</entry>

<entry>
    <title>社員インタビュー　社長編　Vol.3</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2010/03/vol3.html" />
    <id>tag:www.ndis.co.jp,2010:/blog/tech//1.47</id>

    <published>2010-03-18T06:00:00Z</published>
    <updated>2010-03-16T10:09:58Z</updated>

    <summary>弊社社長インタビューの記事も3本目となりました。今回で社長編のインタビューの記事...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="特別企画" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>弊社社長インタビューの記事も3本目となりました。今回で社長編のインタビューの記事は最後ということで質問の方も「NDiSに欲しい人材」といった会社的なことから、「落ち込んだ時の立ち直り方」といった素朴な疑問までバリエーション豊かにとりそろえて聞いてみました。<br />
それではどうぞ！</p>]]>
        <![CDATA[<p><strong><big>* NDiSに欲しいと思う人材</big></strong></p>

<p>―― 若手やこれから入社してくる人に向けて、NDiSに欲しいと思う人材像を教えてください。</p>

<p>弊社社長向阪(以下略 K)： ほしいと思う人材・・・もちろん今もおるんやけど自分で考えて動ける人間かな。</p>

<p>―― さきほどのお話から一貫してらっしゃいますね。</p>

<p>K：自分から質問するときでも、わかってるひとに聞くくらいやから自分に正解なんてもってないと思うんやけど、「自分はこう思うんやけどどうですか」と言える人間。</p>

<p>―― 提案してくる人間ですね。その点ではよくない意味で思い当たる節があったりもします。代替案を言わずに「この件は難しいですね」、という話をしてしまって、難しいのはわかったんだけどどうすんだよということになったことが・・・。</p>

<p>K：別にアイデアがなかったらこういうこと考えたんですけど全然いいアイデアうかばないんですわ、というのでもええのやけどね。</p>

<p>―― そうですね、何か一言がないと・・・いきなり無理ですといってしまってはだめですよね。</p>

<p>K：おまえどないしたんや、となるわな（笑）</p>

<p><br />
<strong><big>* NDiSの社長になるとわかったときの気持ち</big></strong></p>

<p>―― NDiSの社長になるとわかったときどう思いましたか？というかNDiSってどこやねんという感じだったのでしょうか？</p>

<p>K：言われたときは正直びっくりした。</p>

<p>―― やっぱりそうですよね（笑）</p>

<p>K：元々積水化学のある工場の工場長で、春から晴れてNDiSにきたんやけど、NDiSにくるってことを言われたんが2/3やってん。1ヶ月前やったから、そりゃびっくりしたよ。え、どこです？って（笑）</p>

<p>―― じゃあやっぱりNDiSのことはご存知なかったんですか？</p>

<p>K：いや知ってたよ。そらシステムも工場に関係するからそれは知ってるよ。NDiSのメンバーも化学ソリューションのメンバーは来て知ってる人間もおったけどこっちきて顔と名前あうのは７～８人やな。けど楽しいよ、楽しい言うたら怒られるかもしれんけど。</p>

<p>―― どのへんですか？</p>

<p>K：いや、まさかこの年になって言葉を一生懸命覚えることになるとは思えへんかった。</p>

<p>―― なるほど</p>

<p>K：スクラッチやSaaSやASPやなんだかんだって。新鮮やね、それとやっぱり生産系の工場にいるメンバーとシステム系におる皆さんのメンバーとやっぱり違うやん、タイプが。</p>

<p>―― 確かにそうかもしれません（笑）</p>

<p>K：まだ名前がなかなか覚えれんからそこはつらいなぁと。</p>

<p>―― 覚えてもらおうとでてくる若手が少ないのかもしれませんね。</p>

<p>K：いやまぁこっちからいかなあかんねんけど、そやからこないだいくつか部内会議にいかせてもらったりとかしたんやけどそれでもまぁ二人ぐらい覚えたらええとこやね。ただやっぱそうしていかへんとすすまへんし。社員の写真もって歩いてるよ。</p>

<p><br />
<strong><big>* 上司に言われて落ち込んだこととそのときの立ち直り方</big></strong></p>

<p>―― 若手のころ、上司に言われて落ち込んだ時はありますか。そんなときどんな方法で発散したり、立ち直ったりしましたか。</p>

<p>K：こっちが間違っていたら他のところで見返すようなことをやった、仕事上。確かにここは間違ってたけど、あんたの言うてることはここがちゃうよと、性格的に悪いんかな（笑）</p>

<p>―― 他人に愚痴るとかいうのではなくてということでしょうか。</p>

<p>K：いやまあ、酒飲んで愚痴りまくっとったよ。</p>

<p>―― なるほど、それで次の行動を起こすと。気分の立ち直りは早いほうだったんですか？わりと後々までひくということもなく、飲んでも次の日はみたいな感じでしたか？</p>

<p>K：基本的にはそうなんやけど、ものによってはずっとひいてるのもあるけどね。</p>

<p>―― あー、そうなんですか。</p>

<p>K：言われた中身というよりは、やっぱりその人との人間関係やな。ドッカーンと言われても関係によっては後にひかなかったりもするし。<br />
　確かに現場でも言われたことあるよ、一回。信頼しとった人に言われて、確かにそのときは落ち込んだけど、その人にも別のところで「あんたここちゃうで」ということをやったんや。仕返しとかではなくて、やっぱり自分の存在っていうのを見せたいやん。そういうのは後にはひいてはないけど、やっぱりネチネチっとやられてんのはなんとなくメンタル的に、、、やっぱりその人との関係やろうね。まぁいろいろありましたわ（笑）</p>

<p>―― NDiSの人はあんまりガーッって言わないですけどね。</p>

<p>K：まぁどっちか言うたら言い方はみんなやさしいよね。</p>

<p>―― そうですよね、気を遣っていただいてるのかわかんないですけど</p>

<p>K：まぁまぁ、だけど強く言うていいか場面かどうかもあるやろうし。こっちきてからきつい言い方したことは何回もあるよ。会議で何回も！じゃなくて何回か、かな（笑）</p>

<p><br />
<strong><big>* インタビューする立場だったら誰にどんなことを聞いてみたいか</big></strong></p>

<p>―― 向阪さんがインタビューする立場だったとしたら、誰にどんなことをインタビューしてみたいですか？<br />
今後のインタビューの参考にとかいうことも考えています。誰って言うのが抽象的でもいいんでしょうけど、例えば若手にとか管理職にとか・・・。</p>

<p>K：若手にあなたのキャリアプランはなんですかって聞きたいな！</p>

<p>―― 普通に業務的になってしまいそうです（笑）</p>

<p>K：そやなぁ(笑）難しいなぁ、誰にどんな質問をしたいか・・・。</p>

<p>―― 向阪さん自身が知りたいことではなくても、次はおまえらあーいう感じの人にこういうこと聞いてこいよっていうのもあれば・・・。</p>

<p>K：すぐには思いつかんけど、例えば若手の技術屋さんに、まぁさっきいうたことに近いんやけどね、「あなた他に比べて一番勝ってるのは何や」と。<br />
　強みっていうとなんかこう漠然としてるから、自分が一番自信をもって他には負けていないことはなんなんや、と。強みっていうとなんか広い意味になってしまうんよね。何が自信あるんやいうのは独りよがりでいいんよ、別に他のを全部分析したとかでなくていいんよ。それはもう自分が思っていることでいいと思う。<br />
　ただ会社としての強みっていうのは…なんかNDiS見とったら独りよがりなところがあるんよ。ここが強いですいうけど、ほんならあんたどこの市場で考えてるのん、と。それは競合ってどこにおるの、と。（それに対して）どこが勝ってんのと聞いたらあんまり答えがでてこないんやね。だから独りよがり、思い込みなんよ。もっと広いところで戦おうとしたら強みって強みにみえるんやけど、ものすごく漠然としてるんやね、どんどんどんどん絞っていったら見えてくるやん、相手とか得意点が。<br />
　シフト君なんかでも強いのは、特殊なややこしい看護士のスケジュール管理とかそういうところで強みがでてくるわけで…ただシフト管理だけだと強みって目立たないよね。そこで狙いを絞ったところが上手く成功してる理由だと思うねんけど。<br />
　まあ、個人に対してはそんな難しい話ではなくて、「他の人に何勝てるんや」というレベルの話が聞きたい。「いやいや体力ですわ」とかね。</p>

<p>―― 思い込みですすんじゃう人もいますからね、ずっと。</p>

<p>K：そこはそれでもいいと思うよ。まぁずっとそれで一生いかれたら困るけどな（笑）</p>

<p>―― 確かに(笑）それでどんどん成長していってくれればいいんですけどね。</p>

<p>K：やっぱり自分をどう意識するかやろうね。無難に仕事をしようと思ったら僕ものすごい得意やからね。</p>

<p>―― （笑）</p>

<p>K：No2なんてめちゃめちゃ得意なんよ。上からいわれた仕事、あんまりやりたくない仕事を適当に手抜いてやってるように見せるなんてものすごい得意なんよ。(笑)そんなんわかってるだけに嫌なんよ。別にそれを否定するわけではないけどね、そういうのも大事やから。<br />
　おもしろないのはやれへんけどね、やっぱり自分の意識ってあるやんか。もちろん組織の人間やからそんなめちゃ逆らったことはできないけど、やっぱり自分のやり方とか思いとか自信とかがあるやん。それと自信の反対というか不得意やと思ってるとこってあるやん。やっぱりそういうとこってかなり意識しながら仕事してると思うんよ、そういうことを意識するのは大事やな、と思うね。こんな偉そうなこと言うとったらこの先「おまえはちゃんとやってんのか」って言われそうやな。</p>

<p>―― とんでもないです（笑）以上でインタビューは終わりとなります。長い時間ありがとうございました。<br />
</p>]]>
    </content>
</entry>

<entry>
    <title>社員インタビュー　社長編　Vol.2</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2010/03/vol2.html" />
    <id>tag:www.ndis.co.jp,2010:/blog/tech//1.46</id>

    <published>2010-03-17T06:00:00Z</published>
    <updated>2010-03-16T10:09:32Z</updated>

    <summary>今回はNDiSの社長になられた今感じる仕事に対するやりがいや苦労について、熱く語...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="特別企画" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>今回はNDiSの社長になられた今感じる仕事に対するやりがいや苦労について、熱く語っていただきました。</p>]]>
        <![CDATA[<p><strong><big>*  一番やりがいを感じる仕事、作業</big></strong></p>

<p>――  一番やりがいを感じる仕事、作業は何でしょうか？</p>

<p>弊社社長向阪(以下略 K): 若い頃、学生のときは化学工学を勉強していた。勉強したことを活かせるところがいいと思って、積水化学に就職した。<br />
　積水化学といったら、技術を使い、設備を導入して使う側、ユーザね。実際にプラントを作って、それを輸出するとか、作るのはメーカー。私はユーザへ行きたかった。<br />
　自分が設計した設備が目の前で動いて、すぐ実績が出る。いい悪いがすぐでる。そういうのがやりたくて入ったら、たまたまそういう仕事をさしてもらって…自分の設計したやつが、思うとおりに動いたときは、めちゃめちゃうれしい。</p>

<p>――  立場が上になってくると、抽象度の高い仕事、上流工程とか、直接結果が見えないような仕事が増えてくると思うんですが、そこならではのやりがいというのはあるんでしょうか？</p>

<p>K: １０年ぐらい前から、何がおもしろいかって言ったら、結果じゃなくて、メンバーの人たちが、今でいうとあなたたちが、やりがいを感じてくれたときが、一番うれしいですね。<br />
　今の僕の仕事って自分がなんか手を出して、なんかしらの成果物を作るというものじゃない。工場長のときから、みなさんがやりがいを持って仕事してくれってずっと言い続けてたんやけど、誰かが『やったー！できました！！』って言ってたら、そんときはやっぱうれしいな。それが今の僕のやりがいかもしれへんね。</p>

<p><br />
<strong><big>* 管理職、またはリーダの最大の苦労</big></strong></p>

<p>――  管理職、またはリーダの最大の苦労とはどんなものでしょうか？</p>

<p>K: 自分で全部できないこと。</p>

<p>――  もどかしくなるってことですか？</p>

<p>K: というときもあった。工場で働いてたとき、上の立場になっても、作業をやりたくてしかたないんやね。でもあんまりやりすぎると、下も育てへんから、仕方なくやってもらう。やってもらって出来栄え見たら、自分でやった方がええのできるわって思うんやけど、そらぁ、経験が違ったら、出来栄えも違うわな。</p>

<p>――  まさに今、それを感じます…<br />
上の人たちがやったらさっと終わるのに。僕らがやったら遅いし、出来も悪い。</p>

<p>K: でもおんなじ人がおんなじやり方でやってたら、組織が成長せんからなぁ。<br />
同じやり方でやらんとあかん作業ももちろんあるやけど、全部を引き継ぐ必要はないな。</p>

<p>――  部下の育成方法とか、気をつけていることとか、どうしようかなとか学んだこととか、ありますか？</p>

<p>K: 部長ぐらいの立場から、そういうことで悩んでてたわ。例えば工場で現場まわって、いろんな人と話をする。そのとき、不満を言ってくる人もおれば、仕事の話をする人もいて、色々言われたり言ったりするけど、全てを覚えてない。それから手帳をもつようにした。自分が言ったことを書くようにした。でも絶対無理ってすぐわかった。全部なんて書ききれんし、時間的にも無理やわな。<br />
　で、何をしたかって言ったら、『自分の判断の軸をずらさない』、それしかないなとわかってきた。これが一番大事。そうすると、だいたい前に言ったことに近い、正反対な話はしないってことに気がついた。今できてるかはわからないが、上の立場になったらそういうことが大事やな。</p>

<p>――  まさに私達もそうですが、上の人に報告したときに、前と全然違うことを言われることがあるんです。前打ち合わせしたときは、それはやらんでいいって言ってたのに、後で報告にいったりすると、あれはまだ出来てないんかとか…</p>

<p>K: 違うことは絶対あるんよ。</p>

<p>――  それは仕方ないですよね。</p>

<p>K: この立場になって思うけど、そんなん全部覚えてるなんて無理。</p>

<p>――  ささいなことが違ってもいいけど、本質的なところが違ってなければ…てことですねぇ。他にもありますか？</p>

<p>K: １０年ぐらい前…４５ぐらいのときに、悩んでたことがあった。僕が上の立場になって、僕らと世代が違う人達と仕事をするようになったとき、なんかマニュアル人間みたいな人らばっかりやねんな。課長とかの立場のときで、例えば、部下らがデータとって、なんかのグラフを書いてきたとする。僕が「こうゆう絵書いてきた方がわかりやすいんちゃう」って言ったら、絶対後でその通り書いてきおんねん。今でもそうやけど、「こんな考え方でけへんか？」って言ったら、必ずそういう見方されるから、「例えばやで。例えばこうゆうときにこうゆうアプローチするとかあるやん、例えばやで！」と、考えが固定されへんように意識して言ってる。<br />
　さっきと同じ話で、同じ人間作ってもしゃーない。上が言うことに従いつつ、さらにいいものをどう作ったらええか考える、そういうのは僕ら世代は得意やった。絶対こうしろっていう指示はあるよ。それはもちろん守らんとあかんけど、でもそういうのは割とすくないやん。</p>

<p>――  若手は気をつけないといけないですよね。気をつけるというより、たぶん何やりゃいいかさっぱりわかんない状態で、そういう風にいわれるともうそれ以外思いつかない状態になるんでしょうけど。</p>

<p>K: 上から言われた実験をやってるときも、僕らの時代はただ作業としてやるんじゃなくて『これは違うなぁ、こっちの方がいいと思うんやけどなぁ。』って考えたりしてたよ。だからさっさと言われた実験は終わらせて、自分の考えたのを試したりしてた。言われたとこはやらんなあかんと思うけど、こうしたらええんちゃうかなぁと思ったら、絶対試してみたいんよ。ほんだらやらなあかんことは、さっさと終わらせたいからものすごいはよできる。生産性めっちゃあがるで。<br />
　それで、「言われたことはやりましたが、実はこんなこともやってみたんです。こんな成果もでます。こっちの方がよくないですか？」って上司に言うんや。やってみた事実、結果がなったら、「こういう方がいいんじゃないですか？」と仮説を言ったって、経験ある上司が言ってきた実験やから、だいたい下の者が間違ってること多い。こういうのあるんですけどって考えたなら、やってみて結果だして、成果をみせんとしゃーない。もちろん人によるけど、そういう人たちが減ってきた気がするなぁ。</p>

<p><br />
<strong><big>* キャリアプラン</big></strong></p>

<p>――  新人のころに思い描いていたキャリアプランどおりでしょうか？また、思い描いていた自分になれていますか？</p>

<p>K: さっき言ったように、実際ものが目の前でできるのが好きやったから、工場希望やって、積水時代はずっと工場やってん。積水化学技術屋で６０人ぐらい同期おったけど、ずっと工場でしか勤務していないのは私だけ。</p>

<p>――  それは異動の願いがきても断ったんですか？</p>

<p>K: そんなんできません（笑）たまたま。NDiSにくるまでずっと工場で働いて、その中で立場がかわっていって、一番下から一番上まで経験さしてもうた。<br />
　本題に戻ると、キャリアプランは本格的には思い描いていません（笑）だけどやりかったのは、ものづくり。ちゃんとは思い描いていないけど、やっぱり上の立場になりたいとかはあった。立場が上になったら、自分がやりたい、できる範囲っていうのが広がる。入った頃から上の人たちを見とってそう思ったから、上の立場になりたいとは思っていた。</p>

<p>――  何十年後とかまで思い描いていましたか？</p>

<p>K: （首を横に振る）</p>

<p>――  そんな先のことをちゃんと描いても、状況もかわるでしょうし。この質問っていかにも就職雑誌に書いてあるような質問で、普通はそういう風には考えないもんですよねぇ。<br />
　でも最近私達は期末の面談の度に聞かれますよ。５年後１０年後のキャリアプランどうするのとか。</p>

<p>K: こんな仕事がしたいとか、こういうことやりたいからあの部署行きたいとかは思ってたよ。</p>

<p></p>

<p>（続く）</p>]]>
    </content>
</entry>

<entry>
    <title>営業奮闘記 Vol.5</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2010/03/-vol5.html" />
    <id>tag:www.ndis.co.jp,2010:/blog/tech//1.48</id>

    <published>2010-03-16T09:05:00Z</published>
    <updated>2010-03-16T09:02:02Z</updated>

    <summary>NTTデータセキスイシステムズのコマタです。 タイトルは、【1人対6万人の戦い】...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="営業奮闘記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>NTTデータセキスイシステムズのコマタです。</p>

<p>タイトルは、【1人対6万人の戦い】です。<br />
それでは、Vol.5の始まり～始まり～。</p>

<p>お客様先で、お客様のニーズに合わせてデモをする。<br />
躊躇こそなくなったものの、<br />
これだけで既にお腹一杯のコマタです。</p>]]>
        <![CDATA[<p>どんなに一杯のお腹でも、お昼ご飯はモリモリ食べる。<br />
いつもなら、ご飯をおかわりして、上司に呆れられているのですが、<br />
今日はそんな余裕がなく、先ほどから殺伐とお弁当をたいらげています。</p>

<p>目の前にはたくさんの人、人、人。<br />
誰かと来ていたら、ほんの一瞬目を離したら見失ってしまいそうです。</p>

<p>今日は、コマタが販売している、快決！シフト君の展示会です。</p>

<p>実は、配属されてからコマタに与えられた試練は、<br />
客先でのデモではなく、ある大きな展示会への参加でした。</p>

<p>東京ビックサイト。</p>

<p>このひろ～い会場に、医療関係のあらゆる器具・システムが<br />
集まっています。<br />
3日間に渡って行われるこの展示会では、全国各地から医療関係<br />
のお客様が何万人と来場します。</p>

<p>その膨大な数のシステムの中の1つに、快決！シフト君のブースがあり、<br />
カタログの配布や、製品のデモをしながら、<br />
たくさんのお客様にシステムの良さをアピールする<br />
それはそれは絶好の機会なのです！！</p>

<p>ただ、お客様先でのデモと違い、今回の相手は、<br />
シフト君のみに興味があって来場する訳ではありません。<br />
「シフト君の話を聞いてみたい！」と要望されておらず、<br />
限られた時間の中、何百とあるシステムの中から、<br />
いかにしてシフト君に興味を持ってもらえるかが勝負です。</p>

<p>シフト君のデモは、少しずつ出来るようになってきています。<br />
アピールポイントをおさえて、短時間で「これすごいね。」<br />
と思ってもらえるよう、プレゼンテーションの練習もしました。<br />
私のデモデビュー。いざ、本番です。</p>

<p>私の経験は、まだとても経験とはといえないほど浅く、<br />
社会人としての経験でさえほぼ皆無の状態です。</p>

<p>しかし、お客様から見れば、そんな私も「会社の一員」です。<br />
私が放つ言葉は、会社の顔としての責任もあります。<br />
自分の勝手な認識で情報を伝えてしまえば、<br />
それが後で大きなトラブルとなることも有り得ます。</p>

<p>とはいえ、ビクビクしながらデモの対応をしても、<br />
頼りなく、あまりいい印象とは言えません。</p>

<p>経験を積むことが一番の近道ですが、<br />
積むためには、まず動き出すことからです。</p>

<p>動き出すための気合は、お弁当の効果もあって十分です。<br />
どうなるコマタの展示会デビュー？！</p>

<p>結果は次回をお楽しみに。</p>]]>
    </content>
</entry>

<entry>
    <title>社員インタビュー　社長編　Vol.1</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2010/03/vol1.html" />
    <id>tag:www.ndis.co.jp,2010:/blog/tech//1.45</id>

    <published>2010-03-16T09:05:00Z</published>
    <updated>2010-03-16T09:07:07Z</updated>

    <summary>若手社員にとって、ベテランを見て「どうしたらあんな風になれるんだろう」 「なにを...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="特別企画" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>若手社員にとって、ベテランを見て「どうしたらあんな風になれるんだろう」<br />
「なにを勉強するとああいう仕事ができるんだろう」などの疑問を持つことも多いでしょう。</p>

<p>そこで、NDiS Techでは実際にベテランにそのような質問をぶつけてみることにしました。<br />
どうせお話を伺うならトップが良いだろう、と今回は弊社社長へのインタビューです。<br />
まずはウォームアップとして本の思い出話から。</p>]]>
        <![CDATA[<p><strong><big>* 年代別に感銘を受けた本</big></strong></p>

<p>―― ではまず、今いきなりというのは難しいかもしれないんですけども、年代別に感銘を受けた本というのを。</p>

<p>弊社社長向阪(以下略 K):もう覚えてる範囲でいいでしょ？(笑) どんな本読んだか？んーとね、若いころ…２０代？高校のときはほとんど本読んでなかってん。大学になってから一部読みだして、社会人になってからのほうがよく読んだと思うけど、最初のころはね、普通の文学書。まあ、簡単にいうたら北杜夫とかね、五木寛之とか、大江健三郎やとか、あるいは安部公房とか。</p>

<p>――  砂の女とか？</p>

<p>K: 砂の女とか。結構面白いんねん。そういう本を読んでた。それと、今でもあるNEWTONがあるね。あれがちょうど創刊されたときで、35年くらい前かな、あれも結構古いんや。竹内均さんの。これ読みたいなと思ってあれは定期購読。そういう時代があって、それから推理小説、海外のアガサ・クリスティとかにハマって。そっからはもう適当やね。ここ20年ぐらいは、だいたい新書が多くなってきた。で、あんまりその、それでなにかを得たいとかは思ってない。もうずっと買ってるもんはただ題名見て買ってる。</p>

<p>―― ああ、新書の棚で『さおだけ屋はなぜ潰れない』を見かけて、とか？</p>

<p>K: そうそう、その本はベストセラーになる前に買って読んどった。面白いなと思って。</p>

<p>――  社長は理系、ということでよろしいですか？</p>

<p>K: そうそう。化学工学といって、化学と機械の中間みたいな、プラントとかコンビナートとか蒸留とか濾過とか、そういうような…。</p>

<p>――  ニュートンとかはその流れですよね。</p>

<p>K: そうそう。あと理系ということで「生物と無生物とのあいだ」というのが面白かったから、結構理科系の本よ。でも文章力あるし面白い。その一個前が…。(さまざまな話題に華が咲きましたが残念ながら割愛)</p>

<p>K: …けど、もうあんまり小説とか読まなくなった。マニュアル本は読みたくないしね。</p>

<p>――  よく経営者の方で歴史ものにハマるケースが多いようですが…。</p>

<p>K: 昔ははまったよ。陳舜臣とか三国志とか…。そういう時期もあった。なんかをずーっと読み続けることはなくて、そのときの気分で。ひとつそういうジャンルを読みだすと面白いからそればっかり結構読みますやん。ところがそのうちに飽きてきて、一時ハードボイルドもの読んだり…だからあんまりそんなに歴史ものには詳しくない。</p>

<p><br />
<big><strong>* 身に付けておくべきスキル</strong></big></p>

<p>――  若いうちに身に付けておくべきスキルはどのようなものでしょうか？お前らこんなのつけとけよという…まあ技術的なものはそれぞれやらないといけないと思うんですけど。</p>

<p>K: 技術的なことも技術的以外のことも含めて、自分が「これは勝てる」というものを。</p>

<p>――  強み、みたいなものですか。</p>

<p>K: うん。それはべつに「長時間仕事ができる」でもかまわん。ずっと集中できる時間が長いとか。あるいは「こういう言語のこういうところは絶対に強い」とか、自分の作ったプログラムはあとで誰が見ても絶対にわかりやすいんやとか。そういうものを持つべきやな、と。で、金太郎飴はだめなんですよ私。要らない。どう切ってもいっしょっていう人間なんて組織におってもしゃあないから。だから個性は必要やろうなと思うし、それはやっぱり若いうちでないと。歳いってくるとだんだんだんだん、収束してくるからね(笑)<br />
　で、全部（のスキルを）真ん中にする必要はない。自分の劣ってるところとか、他人に対してできてないところって誰でもあるやん。たとえばプレゼン能力がものすごく悪い、と。仮にね。でもそれだけを上げることを一生懸命やったとして、その代わりなんかの強いところが下がってもしゃあないし。ただあんまりにもそれが悪かったら、自分の仕事とか人生が、やりにくい。自分が損するから、そこの部分はある程度上げようという、そういう話はみんなにしてるけど。まあ、そんなことは、若いうちはまあいいやと。</p>

<p>――  底上げはまあ底上げとして…</p>

<p>K: だから、５点満点で言ったら全部３点にする必要はないと。ただ1点のやつは、せめて２点にしないと自分困るやろと。そんなことは若いうちはいいから…まあ2点ぐらいにはやらないといけないだろうけど…まずは4.5のやつを、5にするとか。自分が自信持てるやつを絶対に作る。</p>

<p>――  はい。</p>

<p>K: で、その若い頃を思い出して一番歳取ったなあと感じたのは、僕一応技術屋やったから、プラントのシーケンス制御をやってて。プラントの順番に反応機があってそこに原料仕込んでバルブが開いて…シーケンス制御ってわかるよな？</p>

<p>――  あんまりわからないです…。</p>

<p>K: あの、順番にここのバルブ開きますこここうやります次撹拌器に回ります、と設計していく仕事なんだけど、ある程度中の反応の技術もわからないといけないし、インターロックつけなかあかんわけね。あるプラントの制御を考えようと思ったら、じーっと頭の中で考えないとあかんわけ、まだモノができる前なんだから「次はこうやってこうやって…」と。<br />
　それが、二十代は30分続けて真剣に考える。それだけじゃ絶対完成しないから5分休憩してまた30分考える。ところが三十代後半になったら、10分考えたら5分休憩せなあかんのね。頭の回転が続かない。やる気はまんまんよ。でも続かないんよ。そうすると…生産性って多分…どのくらいになるやろな。多分半分以下よりもっと悪い。それが嫌になってくる。だから若いときには集中したらそれだけのことができる。年を取ってくると確かに物理的な体力も落ちるし記憶力が落ちてくるのもあるんだけど、それより真剣に集中して考える時間がなくなるようになる。</p>

<p>―― 集中できる若いうちに強み、個性を磨いておけ、ということですね。では、向阪さん自身が、若いときに「これだけは負けない」と自慢できるような個性的なスキルにはどのようなものがありましたか？</p>

<p>K: おー、…ちょっと待って（笑）そういわれると難しいね…。僕のやってる技術領域はもともとやる人が少なかったんだ。だから、制御システムもある程度わかります、現場作業もわかります、化学的なことも機械的なこともわかります、それがトータルでわからないとできないような仕事なんだけど、そういうことが大丈夫、うまくできる、という感じだったね。そういう仕事をずっと19年間ひとつの工場でやってた。もうそこではなんでもできるようになってるわけ。そのころには技術課長ぐらいになってたんだけど、で、移った工場になって今度は中身全然知らない。その時に何ができるようになってきたかというと、人の目を見て「こいつに賭けようか」と。(笑) そういうのがわりと当たるようになってきたなあ。</p>

<p>―― つまり歳を取ってくると「誰に任せればいいか」という目が鍛えられてくるんですね。</p>

<p>K: そう、技術を覚えても立場が変わると役に立たないんだな、と19年目に異動したときにハタと感じた。</p>

<p><br />
<big><strong>* 若いころ行っていた自己研鑽（技術的なことでも、精神的なことでも）</strong></big></p>

<p>―― では次に、若いころ行っていた自己研鑽を教えてください。</p>

<p>K: 入社して最初の1年目2年目は同期のメンバーや4,5年上のひとも含めて勉強会しようや、といって何回も本を買ったりしてやったり、そういうことをやってたなあ。自己研鑽しようとしてやった感じではあまりやってなかったなあ。</p>

<p>―― 今の若い社員に大して「自分たちのころはあんなことやったのに、なんでやらないんだろう」みたいなことはありませんか？</p>

<p>K: ああ、「あんまり議論しているところを見ないなあ」とは思う。「それおかしいやんなんでこうなんのや」みたいな。例えば自分のときは、技術検討会みたいなのあるわけ。そこで議論もするし終わってからあとでタバコ吸いながらしゃべったり、また酒飲みに行ったらまたその話の続きになったり…とか。別に上下関係も部署も関係なくそういうことをよくやったんだけど、なんか今のみんなは粛々と仕事しているみたいで。やってる仕事を互いにあまり知らないんじゃないかな。同じ部内でもそうだし、ましてや東京・大阪の間など…。まあそのために今はワーキンググループみたいに横断的にやっている活動もあって、あれはいいことだと思うけど、ともかくあまり横断的な議論が多くないなあと思う。</p>

<p><br />
(続く)</p>]]>
    </content>
</entry>

<entry>
    <title>営業奮闘記 Vol.4</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/12/-vol4.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.44</id>

    <published>2009-12-25T02:00:00Z</published>
    <updated>2009-12-25T01:21:45Z</updated>

    <summary>NTTデータセキスイシステムズのコマタです。 タイトルは、【鳴らない！コマタの携...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="営業奮闘記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>NTTデータセキスイシステムズのコマタです。</p>

<p>タイトルは、【鳴らない！コマタの携帯電話】です。<br />
それでは、Vol.4の始まり～始まり～。</p>

<p>まずは、一人で行って、一人で帰ってくること。</p>

<p>7月中旬。ドキドキの一人デモデビューから、<br />
無事独り立ちを果たしたコマタですが、<br />
まだ、営業としての始めの１歩に過ぎません。</p>]]>
        <![CDATA[<p>少しだけ慣れた名刺交換を交わし、<br />
販売店様のご協力のもと製品のデモ（商談）をする。<br />
まだまだぎこちないですが、大まかな流れはわかってきている。<br />
うん。これでいいんだ。</p>

<p>わからないことだらけだった社会人生活も、<br />
がむしゃらに走り回っているうちに、少しずつ流れは理解しはじめている。<br />
そんな気がしていました。<br />
一人で帰ってこれたことに安心したのでしょうか。</p>

<p>さぁ。デモよかかって来い！向かうところ敵なし！<br />
･･･数回終わっただけで、この調子です。</p>

<p>そんな有頂天コマタの隣のデスクで、<br />
普段は外を飛び回っている先輩が、珍しく社内で仕事中です。<br />
1日中鳴りっぱなしの携帯で、忙しそうに話をしています。</p>

<p>「はい。Nです。あ～どもども！！お世話になっております～･･･」<br />
親しげな口調から察するに、相手はおそらく販売店様です。</p>

<p>配属時、営業には不可欠との理由から、<br />
コマタにはピカピカ新品の会社携帯が貸与されました。<br />
目立たない色が良かったのですが、在庫が無かったとのことで、<br />
届いたのは赤い携帯でした。。</p>

<p>手にした赤い色の携帯。色んな意味で重みがありました。<br />
これから、自分がやっていくべきこと。それに不可欠な道具。<br />
「責任持って頑張んなさいよ！」と携帯から聞こえてきそうでした。</p>

<p>そんなことを思い出しながら、<br />
改めて、無造作に机に置いている赤い携帯を見た時、<br />
ふと違和感を感じました。<br />
･･･この携帯と先輩の携帯、何かが違う。<br />
色の違いだけではありません。</p>

<p>そんな折、先輩の電話が終わりました。</p>

<p>「コマタ。デモ依頼があったから行って来い。」</p>

<p>デモ依頼！それは、また一人でデモに行くということ。<br />
突然の言葉に、さっきまでの調子はどこへやら、<br />
以前のデモでの緊張感を思い出し、思わず躊躇。</p>

<p>「えっ？あー･･･。はい･･･。行ってきます･･･。」</p>

<p>っておい！コマタよ。<br />
言ってる事とやってる事が違うのではないか？</p>

<p>そして、更に追い討ちをかけられるかのように、<br />
先輩からアッパーを食らいます。</p>

<p>「デモの依頼電話が俺にかかってくるようじゃあかんな。<br />
コマタが販売店様から信頼されてない証拠だぞ。」</p>

<p>ぐはぁっ。</p>

<p>そうです。先ほど自分の携帯を見たときに感じた違和感は、<br />
これだったのです。</p>

<p>鳴らない、電話。</p>

<p>コソコソと携帯をかまうと、<br />
コマタの携帯の着信履歴は、部署のメンバーのみ。<br />
件数も、10件に満たない数でした。</p>

<p>あぁ、そうか。<br />
信頼は、待っていて得られるものではない。<br />
出来たことに安心するのも必要だと思います。<br />
しかし、そこで立ち止まっている暇はないのです。<br />
常に自分から動き出さなければ。<br />
そう思いました。</p>

<p>まずは、<br />
コマタという人間がここにいるぞ！！<br />
という意思表示をすること。<br />
知ってもらうことから始めよう！</p>

<p>大きな目標に躊躇する前に、<br />
目の前に、自分が出来る範囲で、<br />
前向きな目標を作ることって大切ですね。</p>

<p>考え方を切り替えてからというもの、<br />
不思議とデモに躊躇することはなくなりました。</p>

<p>とは言っても、始めの一歩の始め。まだまだ先は見えません。<br />
新人コマタの奮闘記、ドタバタと続いています。</p>]]>
    </content>
</entry>

<entry>
    <title>営業奮闘記 Vol.3</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/10/-vol3.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.43</id>

    <published>2009-10-27T04:20:00Z</published>
    <updated>2009-10-27T04:10:31Z</updated>

    <summary>NTTデータセキスイシステムズのコマタです。 タイトルは、【独り立ち、カツ(且つ...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="営業奮闘記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>NTTデータセキスイシステムズのコマタです。</p>

<p>タイトルは、【独り立ち、カツ(且つ)一期一会。】です。<br />
それでは、Vol.3の始まり～始まり～。</p>

<p>「もう無理です。」<br />
「お前、ここで諦めるのか？」</p>

<p>「でも、もう自信がないんです。」<br />
「まだ始まったばかりだぞ。もうちょっとふんばれよ。」</p>]]>
        <![CDATA[<p>いえ、決して「営業」を諦めた訳ではありません。</p>

<p>目の前には、頭がすっぽり入るほどのどんぶりに、<br />
頭がすっぽりはみ出すほどのご飯の盛られた器。<br />
その上には、コマタの顔の2倍ほどの大きさのトンカツが<br />
器を優しく包み込むようにのっています。</p>

<p>現在、半分程度たいらげたものの、<br />
たまらず吐いた弱音に、カツをいれているこの方は･･･</p>

<p>･･･シャレを言っている場合ではありません。</p>

<p>カツを入れているのは、上司ではありません。<br />
快決！シフト君の拡販にご協力頂いている、販売店のWさんです。</p>

<p>先日のデモデビューが終了するということは、<br />
私の部署では「営業としての独り立ち」を意味します。<br />
新人として配属されてわずか2ヶ月での独り立ちは、不安で一杯でした。</p>

<p>そんな中で私の支えとなったのが、<br />
担当エリアとなった東北地方での数々一期一会でした。</p>

<p>今回は、その一例です。</p>

<p>シフト君の販促活動は、NDiSの営業メンバーのみが<br />
行っているものではありません。<br />
シフト君をお客様に紹介して下さる販売店の方を中心とした<br />
営業体制をとっています。</p>

<p>冒頭でカツを入れて下さったWさんとの出会いは、<br />
岩手県にシフト君のデモ同行をした時のことでした。<br />
生まれて初めての東北新幹線。<br />
緑色の新幹線に揺られること2時間半。</p>

<p>東北への移動は、時間がかかるため、<br />
一件のデモの為に一日を費やすこともあります。<br />
ですが通常は、販売店様に何件かデモ希望を<br />
集めて頂き、同じ日に2件、3件とデモをさせてもらっています。</p>

<p>今日は午前と午後に1件ずつデモがあったため、<br />
こうして空いた時間にお昼ご飯を食べているという訳です。</p>

<p>お腹はカツで一杯ですが、ご飯を食べながら、<br />
次のお客様をどう攻略するかを話し合うのは面白いです。<br />
こんな観点で話をしてみてはどうか？<br />
もし、お客様がこんなことを言われたら、どう答えるのか？<br />
何だか、「営業してる！」って感じです。</p>

<p>もちろんそれだけではありません。<br />
恋の話、お酒の話。などなど、</p>

<p>ベテランWさんの様々な営業経験から、学ぶことはたくさんあります。<br />
「なるほど！」と思ったことを忘れないために、<br />
コマタは必死でメモを取ります。</p>

<p>これが、いつか「コマタ流」営業活動に役立つように。</p>

<p>今回の同行を含め、コマタが経験したデモ同行はわずか数回。<br />
その数回でも、学ぶことはたくさんありました。</p>

<p>しかし、その「たくさん」は、先輩や上司からとってみれば、<br />
わずか数パーセントにすぎません。<br />
その数パーセントの範囲で、「仕事をこなしているんだ！」と酔いしれていたコマタは、<br />
早くに独り立ちを迎えたことは「認められた証拠」なんだと考えていました。</p>

<p>この後、それが大きな勘違いだったことを<br />
コマタは身をもって経験するのですが、</p>

<p>･･･今日はここまでで時間切れです。</p>]]>
    </content>
</entry>

<entry>
    <title>Java のジェネリックス</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/09/java.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.41</id>

    <published>2009-09-16T04:11:45Z</published>
    <updated>2009-09-16T04:05:16Z</updated>

    <summary> 最初の話題として、現在読んでいるテキスト「Effective Java 第2版...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="勉強会便り" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p><br />
最初の話題として、現在読んでいるテキスト「Effective Java 第2版」から Java のジェネリックスについて取り上げます。</p>

<p>「Effective Java 第2版」は Java を仕事に使うプログラマなら、是非読んでおきたい書籍です。</p>

<p>とは言っても、日々の業務で忙しかったりすると、なかなか新しい本を1冊読むことは難しく、私もこの本の初版は新人時代に読みましたが、第2版は読んでいませんでした。</p>

<p>第2版は初版にはない、Java5 以降に追加されたジェネリックスや列挙型についての情報が充実しています。<br />
ジェネリックスを使うとなぜかコンパイルエラーや警告が発生して困る、という人はこの本を読むと解決策が分かると思います。</p>]]>
        <![CDATA[<p>「Effective Java 第2版」でジェネリックについて解説されている項目は以下の通りです。</p>

<ul>
 <li>項目23 新たなコードで原型を使用しない</li>
 <li>項目24 無検査警告を取り除く</li>
 <li>項目25 配列よりリストを選ぶ</li>
 <li>項目26 ジェネリック型を使用する</li>
 <li>項目27 ジェネリックメソッドを使用する</li>
 <li>項目28 APIの柔軟性向上のために境界ワイルドカードを使用する</li>
 <li>項目29 型安全な異種コンテナーを検討する</li>
</ul>

<p>今回は、この本を読んで気付いたジェネリックスをうまく扱うためのポイントを何点か紹介したいと思います。<br />
詳細については書籍を読んで下さい。</p>

<h3>ジェネリックスとは</h3>

<p>まずジェネリックスとはどういうものでしょうか。</p>

<p>例えば、java.util.List や java.util.ArrayList といったコンテナ型を使用する場合、Java 1.4 以前であれば</p>

<pre>
List list = new ArrayList();
list.add("one");
list.add("two");
// ...
String one = (String) list.get(0);
</pre>

<p>というように、取り出すときに格納されている要素の型に応じて、String型であれば String にキャストしなければいけませんでした。</p>

<p>これをジェネリックスを使用するとこう書けます。</p>

<pre>
List&lt;String&gt; list = new ArrayList&lt;String&gt;();
list.add("one");
list.add("two");
// ...
String one = list.get(0);
</pre>

<p>最初の変数 list の宣言と、ArrayList インスタンスの生成時に指定している &lt;String&gt; の部分がジェネリックスの型パラメータです。</p>

<p>これだけ見ると、ジェネリックスは取り出すときにキャストを書かなくていいから便利、くらいにしか思いませんが、裏を返せば取り出すときにキャストを書かなくても、実行時にキャスト例外が発生しないことをコンパイラが保証してくれている、ということです。</p>

<p>ジェネリックスをうまく使うためには、実行時にキャスト例外が発生しないとコンパイラが判断できるための情報をすべてコードに埋め込んであげないといけません。</p>

<p>このことをちゃんと意識することがジェネリックスをうまく利用するためには重要です。</p>

<p>Web開発の現場などでは、Perl や Python、Ruby といったLL(Lightweight Language)などの動的型付言語(変数の型を指定しない言語)が注目されていますが、ジェネリックスは静的型付言語である Java の静的な型チェックをより強力する手法ですので、ある意味 LL とは真逆な方向です。</p>

<p>ソースコードに情報を付加することで、今まで実行するまで分からなかった型チェックによるエラーがコンパイル時に判定できるようになったということです。</p>

<h3>ジェネリック型を使わないと警告</h3>

<p>Java5 以降では、型パラメータを指定せずに java.util.List などのジェネリック型を使用するとコンパイル時に警告が発生します。</p>

<p>これは、型パラメータを指定しない型(原型といいます)を使用すると、値を取り出すときのキャストがチェックできないので、実行時に例外がでちゃうかもしれないということです。</p>

<h3>ジェネリック型と配列との違い</h3>

<p>Java 1.4 までであれば、キャストが面倒なので List ではなく配列を使ったということがあったかもしれません。(というか、私はありました。。。)</p>

<p>ジェネリック型とちがい、配列は実行時の型安全性をコンパイラが保証することはできません。</p>

<p>例えば、次のようなコードを見て下さい。</p>

<pre>
String[] strArray = {"one", "two"};
Object[] objArray = strArray;
objArray[0] = Integer.valueOf(1); // 実行時例外: ArrayStoreException
</pre>

<p>上記のコードはコンパイルが通りますが、実行時に例外が発生します。</p>

<p>これがコンパイルを通るのは、String[] が Object[] のサブタイプであるためです。この性質を<strong>共変(covariant)</strong>と言います。</p>

<p>一方、ジェネリック型は共変ではなく<strong>不変(invariant)</strong>です。<strong>List&lt;String&gt; は List&lt;Object&gt; のサブタイプではありません。</strong><br />
List&lt;Object&gt; の変数に List&lt;String&gt; の変数を代入しようとするとコンパイルエラーになります。</p>

<pre>
List&lt;String&gt; strList = new ArrayList&lt;String&gt;();
List&lt;Object&gt; objList = strList; // コンパイルエラー: 互換性のない型
</pre>

<p>この性質は少し直感に反するように思うかもしれませんが、この性質により ArrayList&lt;String&gt; のインスタンスが List&lt;Object&gt; の変数に代入されて String 以外の要素を代入されるといった実行時例外を防ぐことができます。</p>

<p>まとめると、キャストが不要な点は配列もジェネリックスも同じですが、ジェネリックスの方がより安全です。</p>

<h3>ワイルドカード</h3>

<p>List&lt;String&gt; は List&lt;Object&gt; のサブタイプではないということですが、では、要素の型にかかわらず List オブジェクトを受け取るメソッドを定義するときにはどうすればよいのでしょうか？</p>

<p>原型である List を使用すると、コンパイル時に警告が出てしまいますし、List&lt;Object&gt; とするとコンパイルエラーになります。</p>

<p>こういう場合は、型パラメータに ? を使用することができます。? をワイルドカードと呼びます。List&lt;String&gt; や List&lt;Object&gt; は List&lt;?&gt; のサブタイプになります。</p>

<pre>
void printAll(List&lt;?&gt; list) {
  for (Object o : list) {
    System.out.println(o);
  }
}
</pre>

<p>上記の printAll メソッドには、List&lt;String&gt; や List&lt;Integer&gt; などを渡すことができます。この List&lt;?&gt; の部分を List&lt;Object&gt; と書いてしまうと、この printAll メソッドには List&lt;Object&gt; 型しか渡せなくなってしまいます。</p>

<p>ワイルドカードには境界型ワイルドカードと非境界型ワイルドカードと呼ばれる2種類のものがあります。上記の例は非境界型ワイルドカードです。境界型ワイルドカードでは要素の型のスーパータイプを指定することができます。</p>

<p>例えば、List&lt;? extends java.util.Date&gt; と宣言した場合、java.util.Date のサブタイプである java.sql.Timestamp などの List を受け取ることができます。</p>

<p>例えば、次のようなメソッド定義が可能です。</p>

<pre>
void printDateList(List&lt;? extends Date&gt; dateList) {
  for (Date d : dateList) {
    DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
    System.out.println(format.format(d));
  }
}
</pre>

<h3>終わりに</h3>

<p>今回紹介したポイントを押さえると Java のジェネリックスをうまく利用できるのではないかと思います。</p>

<p>これからも、勉強会で出てきた話題の中から役立ちそうなものを紹介していきたいと思います。お楽しみに。</p>]]>
    </content>
</entry>

<entry>
    <title>「勉強会便り」内容紹介</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/09/post-9.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.40</id>

    <published>2009-09-16T04:10:53Z</published>
    <updated>2009-09-16T04:03:37Z</updated>

    <summary>初めまして。NTTデータセキスイシステムズの植原です。 本日より「勉強会便り」を...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="お知らせ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>初めまして。NTTデータセキスイシステムズの植原です。</p>

<p>本日より「勉強会便り」を開始いたします。<br />
私の所属している部署では若手を中心に週に1回程度定時後に集まって、<br />
技術力の向上を目的とした勉強会を開催しています。</p>

<p>勉強会といっても講師役を決めたり準備をして発表したりというものではなく、<br />
テキストとなる書籍をみんなで決めて、それをみんなで読んでいく、という形式で気楽に行っています。<br />
このカテゴリでは勉強会での話題をピックアップしてお伝えしていきたいと思います。</p>

<p>以上、「勉強会便り」をよろしくお願いいたします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>営業奮闘記 Vol.2</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/09/-vol2.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.42</id>

    <published>2009-09-15T09:40:46Z</published>
    <updated>2009-09-15T09:20:46Z</updated>

    <summary>NTTデータセキスイシステムズのコマタです。 今回は外回りだけが、営業の仕事では...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="営業奮闘記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>NTTデータセキスイシステムズのコマタです。</p>

<p>今回は外回りだけが、営業の仕事ではないということを書きたいと思います。</p>

<p>それでは、Vol.2の始まり～始まり～。</p>]]>
        <![CDATA[<p>【動かずできることもある。】<br />
足と口だけでなく、あいているなら手も使え。<br />
ということで、社内日は資料作成のプロを目指しています。</p>

<p>資料をつくるのは、本当に骨が折れます。<br />
見る相手のニーズと、こちらのウリやポイントをまとめ、<br />
相互に共通させながら、「この情報が欲しかった！」「読みたい！」<br />
と思わせるようなインパクトを持たせることが大切です。<br />
それには、文字使い、色使い、そして図の配置などが<br />
複雑に絡み合っています。</p>

<p>パズルを組み立てるイメージで、伝えたいことを画面に表現していく訳ですが、<br />
現時点で、我がグループ直伝、そして自慢のノウハウを注ぎ込んだ<br />
何種類もの資料が存在します。それを目の当たりにし、圧倒されたコマタは、<br />
「現存しているもののイメージを崩してはいけない」<br />
と考えて資料を作成していました。</p>

<p>しかし、目的は「前からあるものを引き伸ばす」ことではありません。<br />
そこに、いかに自分らしさを取り入れ、今あるものを更に良くしていくか、です。</p>

<p>最終的には、「この資料、誰が作ったの？！すごい！」といわせるまでに<br />
成長したいものです。</p>

<p>そんな野望を抱き始めた折、上司からも<br />
「今あるものをそのまま使うことはない。コマタらしくはじけてみろ！」<br />
と助言を頂き、コマタらしさあふれる資料を目指すこととしました。</p>

<p>挿絵の配置を考えるだけでなく、挿絵自体も自分で作成し、<br />
色使いなど、「見たい！」と思ってもらえるよう、力の限りを尽くしました。</p>

<p>そうして出来た、自分らしさ全開の資料。<br />
紙にしてたった２枚の資料ですが、感慨深いものがありました。<br />
ジーンと胸に溢れる達成感を味わい、大満足です。<br />
頑張って作ったし、褒めてもらえるに違いない！<br />
と、うきうきしながら見せた先輩は、まぶしげに資料を眺めています。<br />
してやったり！</p>

<p>しかし、目を細めながら資料を見た先輩の一言は、<br />
別意味で胸にジーンと突き刺さるものでした。</p>

<p>「コマタ。なんだか家電量販店のチラシみたいだぞ。」</p>

<p>やりすぎてしまったのでしょうか。</p>

<p>しかし、コマタはめげません。<br />
外回りの後はデスクに座り、自分らしさいっぱいの資料作成に<br />
手をせかせかと働かせています。<br />
</p>]]>
    </content>
</entry>

<entry>
    <title>営業奮闘記 Vol.1</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/07/-vol1.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.38</id>

    <published>2009-07-28T07:45:00Z</published>
    <updated>2009-07-28T07:52:25Z</updated>

    <summary>新シリーズ開幕です！ 現在、営業配属も少しずつ慣れ始め、 快決！シフト君と共に東...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="営業奮闘記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>新シリーズ開幕です！<br />
現在、営業配属も少しずつ慣れ始め、<br />
快決！シフト君と共に東日本を駆けずり回っています<br />
営業担当のコマタです。</p>

<p>人生初の営業、汗と涙、そしてネタと笑顔の奮闘記を<br />
ついでに過去を振り返りながら書き上げます。</p>

<p>それでは、Vol.1の始まり～始まり～。</p>]]>
        <![CDATA[<p>【初めからデモまで～】<br />
営業になって初めて与えられたのは、ちびパソコンでした。<br />
外を飛び回るイメージだった営業。<br />
その仲間入りが出来た気がして嬉しかったのを覚えています。</p>

<p>以来、<a href="http://products.ndis.jp/shift/">快決！シフト君</a>担当のコマタですが、<br />
販促活動以前に、業務の流れも把握せねばなりません。<br />
何もわからない私にとって、<br />
「わかった！」という気持ちが自分を奮い立たせる唯一の材料でした。<br />
今後の自信と、自分づくりのため、当初は呆れるくらいの質問攻めでした。</p>

<p>さらに、シフト君の「単なる製品デモ練習」に緊張し、<br />
社内発表にも関わらず前日はなかなか寝付けない始末。</p>

<p>会社の「顔」として、初めてだろうが何だろうが、<br />
礼儀正しく、分かりやすく、尚且つ受注に繋がるデモを<br />
しなければなりません。</p>

<p>そして、ついにやってきた「初！対お客様デモ。」</p>

<p>初の一人デモデビュー（金曜日）に、月曜日から緊張のコマタでしたが、<br />
金魚のフンのごとく先輩のデモについて回っていたために、<br />
何とかなると気合をためてはいたのですが、<br />
それでも、１人で出張のプレッシャーは容赦なく襲ってきました。</p>

<p>当日は雨。しかし雨も蒸発の勢いで燃えていました。<br />
初が重なると、人は通常より諦めがよくなるみたいです。<br />
現地で販売店の方と待ち合わせし、いざ戦場へ。<br />
そこで待っていたのは。。般若のような形相、、、</p>

<p>とは裏腹に、とても優しいお客様でした。<br />
その雰囲気のおかげで、緊張することなくデモが行えました。</p>

<p>そこはよかったのですが、やはり、一人ではまだまだ頼りないです。。</p>

<p>「たくさんのデモに同行し、先輩を見て勉強した」<br />
と、新人ながらにそう思っていました。<br />
しかしそれは、デモ当日のおろおろぶりを考えると、<br />
「そのつもりだった」のだと苦笑いを隠せません。</p>

<p>しかし、まずは、一人で行って、一人で帰ってくること。<br />
卵の殻がやっとはがれたデモデビューでした。</p>

<p>何かをしようと決めたとき、初めから不安だ嫌だと考えることは得意でした。<br />
しかし、「考えるだけでは何も進まない」と気付いたのは、もう少し後のお話。</p>

<p>快決！シフト君のリンクは<a href="http://products.ndis.jp/shift/">こちら</a></p>]]>
    </content>
</entry>

<entry>
    <title>「営業奮闘記」内容紹介</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/07/post-8.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.39</id>

    <published>2009-07-21T07:30:00Z</published>
    <updated>2009-07-21T07:28:13Z</updated>

    <summary>本日より「営業奮闘記」を開始いたします。 「営業奮闘記」では、新人として営業に配...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="お知らせ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>本日より「営業奮闘記」を開始いたします。</p>

<p>「営業奮闘記」では、新人として営業に配属されたコマタが、<br />
 自身の営業活動から生の声をお届けします。ご期待ください。</p>

<p>「営業奮闘記」は今後シリーズ連載として掲載していきます。<br />
 お客様と接することで得た知識や経験、社会人の卵としての苦悩や喜びをバネに、<br />
 少しずつ成長していくコマタを是非見守って下さい。</p>

<p> 新人として泣き、笑い、激走してきた1年間を書き上げます。<br />
 お楽しみに！　</p>

<p> 以上、「営業奮闘記」をよろしくお願いいたします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>fold村散策（その３）</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/03/fold-2.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.37</id>

    <published>2009-03-30T09:30:00Z</published>
    <updated>2009-03-30T09:23:45Z</updated>

    <summary>前回は foldl と foldr の二人の性格の違いをみました。 今回は彼らの...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="Haskell途中下車の旅" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[前回は foldl と foldr の二人の性格の違いをみました。<br/>
今回は彼らの親戚達（scan系、mapAccum系）を紹介しましょう。<br/>
<p>]]>
        <![CDATA[まずは foldl の弟分 foldl1 からです。<br/>
foldl は<br/>
<pre>
    foldl f z [x1,x2,x3,...x_n]
が
    (...(((z `f` x1) `f` x2) `f` x3) `f` ...) `f` x_n
</pre>
となる計算でしたが foldl1 はこれの初期値 z に関する部分がない
<pre>
    foldl1 f [x1,x2,x3,...x_n]
が
    (...((x1 `f` x2) `f` x3) `f` ...) `f` x_n
</pre>
となる計算です。リストが１要素だけの場合と空リストの場合はそれぞれ<br/>
<pre>
    foldl1 f [x1] = x1
    foldl1 f [] = error "Prelude.foldl1: empty list" -- エラー
</pre>
となります。<br/>
foldl1 を使っている典型的な例はリスト中の要素の最大値を求める maximum と最小値を求める minimum です。<br/>
<pre class=prettyprint>
maximum xs = foldl1 max xs
minimum xs = foldl1 min xs
</pre>
foldl に弟分 foldl1 がいるように foldr にも弟分 foldr1 がいます。<br/>
<pre>
    foldr1 f [x1,x2,x3,...x_n]
が
    x1 `f` (x2 `f` (x3 `f` (... `f` x_n)))
</pre>
となる計算です。<br/>
<br/>
<p>
次に紹介するのは foldl より年上格の scanl です。<br/>
foldl は計算の最終結果だけを返しましたが scanl は計算途中のすべての値をリストにまとめて返します。初期値もこのリストの先頭に入るので要素数 n個のリストに対して scanl が作るリストの要素数は (n+1)個になります。<br/>
<br/>
scanl で (+) を使った例を見てみましょう。<br/>
<pre class=prettyprint>
> scanl (+) 0 [1..5]
[0,1,3,6,10,15]     -- [0, 0+1, (0+1)+2, ((0+1)+2)+3, (((0+1)+2)+3)+4, ((((0+1)+2)+3)+4)+5]
</pre>
scanl にも弟分 scanl1 がいます。scanl の初期値に関する部分がないバージョンです。<br/>
<pre class=prettyprint>
> scanl1 (+) [1..5]
[1,3,6,10,15]    -- [1, 1+2, (1+2)+3, ((1+2)+3)+4, (((1+2)+3)+4)+5]
</pre>
<p>
scanl と scanl1 がいるなら scanr と scanr1 もいます。<br/>
<pre class=prettyprint>
> scanr (+) 0 [1..5]
[15,14,12,9,5,0]    -- [1+(2+(3+(4+(5+0)))), 2+(3+(4+(5+0))), 3+(4+(5+0)), 4+(5+0), 5+0] 
> scanr1 (+) [1..5]
[15,14,12,9,5]    -- [1+(2+(3+(4+5))), 2+(3+(4+5)), 3+(4+5), 4+5, 5] 
</pre>
<br/>
<p>
最後に紹介するのは長老格の mapAccumL です。<br/>
（mapAccumL と次に紹介する mapAccumR は Preludeモジュールに入っていないので使うときには Data.Listモジュールを import しておく必要があります）<br/>
scanl は計算途中の値をリストにまとめましたが mapAccumL は計算していく値とは別の値をリストにまとめることができます。実際に返す値はそのリストと計算の最終結果をタプルにしたものです。<br/>
foldl,scanlに比べてインタフェースが複雑なので例を見て確認してみましょう。<br/>
初期値 0 に [1..5] を順に加えていきリストとしてまとめるのは計算する値の２倍という例です。<br/>
<pre class=prettyprint>
> mapAccumL (\b a -> (b+a,2*b)) 0 [1..5]
(15,[0,2,6,12,20])
</pre>
(\b a -> (b+a,2*b)) の部分の意味は<br/>
・ b が一つ前の計算ステップで計算されてきた値<br/>
・ a がリストの現ステップで使う要素の値<br/>
・ b+a の部分が次の計算ステップに渡す値<br/>
・ 2*b の部分がリストにまとめる値<br/>
です。<br/>
要素数 n個のリストに対して scanl が作るリストの要素数は (n+1)個でしたが mapAccumL が作るリストの要素数は n個です。<br/>
<br/>
mapAccumL がいるなら mapAccumR もいます。<br/>
<pre class=prettyprint>
> mapAccumR (\b a -> (b+a,2*b)) 0 [1..5]
(15,[28,24,18,10,0])
</pre>
<br/>
最後に fold系高階関数に与える関数の引数についてまとめておきましょう。<br/>
<br/>
・foldl,foldl1,scanl,scanl1 に渡す関数の引数は<br/>
　　第１引数が一つ前の計算ステップで計算されてきた値<br/>
　　第２引数がリストの現ステップで使う要素の値<br/>
・foldr,foldr1,scanr,scanr1 に渡す関数の引数は<br/>
　　第１引数がリストの現ステップで使う要素の値<br/>
　　第２引数が一つ前の計算ステップで計算されてきた値<br/>
です。<br/>
「一つ前の計算ステップから渡ってくる値は<br/>
　left系ならleft側（第１引数）、<br/>
　right系ならright側（第２引数）」<br/>
という覚え方だと思い出しやすいでしょう。<br/>
ただし mapAccumL と mapAccumR は両方とも<br/>
　　第１引数が一つ前の計算ステップで計算されてきた値<br/>
　　第２引数がリストの現ステップで使う要素の値<br/>
という left系順番なので気をつけてください。<br/>
<br/>
<p>
次回は fold,scan,mapAccum のパワー比較と高階関数の効能について説明します。<br/>
]]>
    </content>
</entry>

<entry>
    <title>あなたの作ったロジックはおいくら、、、？</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/03/post-7.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.36</id>

    <published>2009-03-17T01:00:00Z</published>
    <updated>2009-03-17T01:04:52Z</updated>

    <summary>これまで数回にわたって制約プログラミングの最大の特徴である「宣言性」に関連して実...</summary>
    <author>
        <name>Masashi Yamazaki</name>
        
    </author>
    
        <category term="制約プログラミング落穂拾い" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="制約プログラミング" label="制約プログラミング" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>これまで数回にわたって制約プログラミングの最大の特徴である「宣言性」に関連して実用システムの開発に用いる際の課題について書いてきました。今回もその続きを、と思ったのですが、ちょっと寄り道をして、制約プログラミングを用いたシステム開発の見積について書きたいと思います。</p>
<p>ソフトウェアの見積が困難なことや、見積手法として様々な方法が提案されていることはご存知のことと思います。制約プログラミングを用いたシステム開発の場合、見積をする上で何が変わってくるのでしょうか。<br /></p>]]>
        <![CDATA[<p>まず考えなくてはならないのは、<strong>制約プログラミング技術そのものに起因するというよりは、むしろ適用対象となる分野の方が備えている特性の寄与を考慮しなくてはならない</strong>ということです。例えば要員や資源のスケジューリング分野を考えてみると、問題解決手法に何を用いようと要員や資源のスケジューリングシステムの開発をする場合に考慮すべき特性というのがあるでしょう。</p>
<p>もう一つ、見積作業には2つの側面があることも考えるべきかと思います。</p>
<p>すなわち、お客様に納得していただける積算根拠を提示するという側面と、予算の範囲内で必要な作業を完了させる見通しを得るという側面です。見積の方法が同一であればこの両者は一致することもあるでしょうが、そうでない場合もあるでしょう。</p>
<p>一般に見積の方法の妥当性は、開発手法と強い関係があります。過去のデータの蓄積に基づいた積算が信頼できる精度を持つのは、開発手法が標準化されており、具体的な運用の詳細に至るまで、概ね同じような条件で実施されている場合です。</p>
<p>もしあなたが、「自分達が持っていない技術を持っている」という点をお客様に評価していただいて見積をしようとしているのであれば、お客様の持っている積算手法とあなたのそれは一致しないことを覚悟すべきでしょう。そしてここではその「技術」が制約プログラミングであるわけです。</p>
<p>では、スケジューリングシステム開発の場合を具体的に見ていきましょう。</p>
<p>スケジューリングシステム開発の特性としてまず挙げられるのは、</p>
<ul>
<li><strong>外部仕様として「見える」部分に比較して、外部からは見えない問題解決ロジックの部分の工数およびプログラムのコード量の割合が極端に大きいこと</strong></li></ul>
<p>ではないでしょうか。</p>
<p>積算による見積を実施する場合には、雑駁な言い方をすれば画面、帳票、データベースのテーブル数や項目数、機能や画面の部品の数を数えてそれらを積み上げていくわけですが、そうしたやり方をスケジューリングシステムに適用すると、そのような<strong>外部から観察できる仕様の項目数に現れないロジックの複雑さが落ちてしまいます。</strong></p>
<p>勿論、スケジューリングシステムは計画を作成するエンジンだけでできているわけではありません。生産システム、要員管理システム全体から見れば、スケジューラは一部品に過ぎず、トータルで見ればロジックの複雑さなど、誤差の範囲内になってしまうのでは、という意見もあるかも知れません。もっともな考え方だとは思いますが、ここでの問題設定からすればこれは単に問題を見えないようにしただけで、根本的な解決にはなっていません。幾らインタフェースができたところで、スケジューラがまともに動かなければ、スケジューリングシステム導入の意味はありません。（それゆえ、高度なスケジューラなしのシステムを開発するという発想は選択肢として有効ですが、ここではその選択肢は考えないことにします。）</p>
<p>更に具体的な開発プロセスに添って考えていくと、別の問題も見つかります。スケジューリングシステムの開発を行なうに際して、スケジューラのロジックをどうすれば良いのか、予めわかっていることはほとんどないのではないかと思います。<br />（もしわかっていれば、後は普通のソフトウェアと同じように開発すれば良いわけですが。）</p>
<p>現実の課題を把握して、解くべき問題を定義し、大枠で決まった予算と期間の範囲内で解決方法を考え出す。そしてそれを実装して検証し、実用的になる水準にまでもっていく。こう書くと如何にも成り行き任せに見えるかも知れませんが、実際にやっていることは、あまり遠く離れてはいないと思います。否、これすらできずに動かないプログラムを作ってしまう例が、スケジューリングシステムの場合、何と多いことでしょう。</p>
<p>スケジューリング結果の質についての明確な基準がないことも、上記のようなやり方になる大きな理由でしょう。現実の課題に即した目的関数が予め明確に定義できているケースほとんどありませんし、現実の課題から乖離したモデルを押し付けて要求されていない問題を解けたところで、学術的な意義はあったとしても実用上の意義は限定的でしょう。</p>
<p>そして、上記のようなプロセスでいつも問題になるのは、</p>
<ul>
<li><strong>ロジックを開発するに際しての試行錯誤の部分</strong></li>
<li><strong>最後の品質向上のための作業の部分をどのように評価するか</strong></li></ul>
<p>だと思います。少なくとも予め、そうしたファクターを織り込まずに見積をしたり開発計画を作るのは、無謀といっても誇張でないほど危険なことだと思います。</p>
<p>このようなことから、<strong>スケジューリングシステムの開発には、ウォーター・フォール型の開発プロセスは適さず、プロトタイピング手法を用いるべき</strong>だと考えられます。実際、これまでやってきた開発においても大抵の場合には、開発プロセスについては予め説明をし、納得していただいた上で<strong>プロトタイピング・本開発・チューニング</strong>といったフェーズを踏んで開発を進めてきました。特にチューニング・フェーズを設けることは、出来上がったスケジューラが出す解の品質についてお客様に納得していただくためには欠かせないと感じています。</p>
<p>ただし、その場合でも、特に<strong>開発初期のロジックを固める際に生じる試行錯誤を見積にどのように反映させるかの問題</strong>は残ってしまいます。最終成果物には生かされない、捨ててしまう部分は、通常のソフトウェアでは設計ミスとして扱われ、開発者が負担することになるのでしょうし、ある程度は経験の蓄積によってロスを減らすことが可能でしょうが、そうした試行錯誤をゼロにできるかどうかについては、率直に言って私は懐疑的です。場合によっては、<strong>複数案を並行して試作して評価する</strong>ようなやり方だって考えられなくはない。</p>
<p>ところで、スケジューリングシステム以外の開発で類似したシチュエーションがないかといえば、決してそうではないように思えます。アーキテクチャとか方式の設計にあたって、そのような評価プロセスを踏むことは、特に大規模なシステムの場合、しばしばあるのではないでしょうか。ですが、その場合、評価プロセス自体の工数見積はどのようにして行なうべきでしょうか。評価用に作成するプログラムの行数を積算するのでしょうか。</p>
<p>そもそも最終成果物となるプログラムのコード量に行き着くような積算の場合には、制約プログラミング技術のような生産性の高い手法はかえって不利になるといった皮肉な結果にもなりかねません。<strong>色々な戦略を作ってみて、評価しては捨て、だんだんと洗練させていくというやり方は、いわば「最終成果物主義」的とでもいうべき積算手法には馴染まない</strong>のではないでしょうか。</p>
<p>あなたのお客様が、ごく一般的な積算の方法論しか持ち合わせていない場合に、あなたはお客様に納得していただく積算根拠を示すのに何をしなければならないでしょうか。</p>
<p>それに加えて、ここでは「制約プログラミング」を用いるという条件が更に加わります。喩えて言えば、<strong>お客様にとっては未知の新しい工法での工事を提案</strong>しているようなものです。</p>
<p>否、お客様への説明以前に、例えば新しい開発メンバーが加わったら、あなたがそれまで使っていた「勘と経験」はそれまでと同様に役立ち、リスクへの対処が充分にできるでしょうか。<strong>「誰々さんがやるからこれくらいの手間でこれくらいのレベルのもの」という属人的な発想を離れた積算</strong>の手がかりはないものでしょうか。一般のソフトウェアと同等まではいかなくても、少しでもそれに近づくような積算の方法論を考えることができないでしょうか。</p>
<p>もちろん、ここでそれに対する完全な答えが提示できるとは思っていませんが、手がかりのようなものは幾つかあるように感じています。</p>
<p>だらだらと書き続けてきましたが、ブログだからということでご勘弁いただくこととして、今回はこれくらいで打ち切ることとして、今後、この場で少しずつではありますが、それらを検討していければと思います。</p>
<p>その途上で、私の知りえた狭い範囲ではありますが、関連する研究や話題についても触れていければと考えています。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>宣言性の光と影（４）</title>
    <link rel="alternate" type="text/html" href="http://www.ndis.co.jp/blog/tech/2009/03/post-6.html" />
    <id>tag:www.ndis.co.jp,2009:/blog/tech//1.35</id>

    <published>2009-03-09T02:13:45Z</published>
    <updated>2009-03-09T02:12:58Z</updated>

    <summary>さて、前回に引き続き、制約プログラミングを用いて実用的な問題に取り組んだときに直...</summary>
    <author>
        <name>Masashi Yamazaki</name>
        
    </author>
    
        <category term="制約プログラミング落穂拾い" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="制約プログラミング" label="制約プログラミング" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.ndis.co.jp/blog/tech/">
        <![CDATA[<p>さて、前回に引き続き、制約プログラミングを用いて実用的な問題に取り組んだときに直面する課題を具体的に見ていきます。今回扱うのは以下の問題です。</p>
<ul>
<li>問題を表現できたとして、解をうまく求めることができるだろうか。ここで「うまく」というのには、(a)実用上許容できる時間内に、(b)実用上許容できる品質の解を求める、という2つの側面が含まれます。</li></ul>]]>
        <![CDATA[<p>制約プログラミング技術は、解くべき問題の表現方法を提供するだけではなく、問題解決の効率的な手法も提供します。「宣言性」は前者に直接関係しますが、その一方で、後者に関係するのが前回も触れた<strong>「制約伝播」</strong>機構です。<br />いわば制約が存在することを積極的に用いて、制約を充たさない値を事前に削ることによって無駄な候補を調べる手間を省くようになっているのでした。</p>
<p>ここで注意したいのは、<strong>制約伝播の仕組みは、それだけで解が求まる（※）ことを保証するものではない</strong>ことです。制約伝播の仕組みでは完全性が保たれる限りで候補の絞込みを行ないます。どの程度の絞込みが起きるかは問題依存です。より詳細には、問題空間にある変数の領域の大きさ、制約の種類、そして勿論、個別の処理系における制約の実装の仕方に依存します。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p><font style="FONT-SIZE: 0.8em">※厳密には制約プログラミングにおいて「解を求めること」の定義は必ずしも自明ではありません。項書換などのプログラム変換につながる流れで、ある種の標準形に変形することを「解を求めること」とする立場も考えられます。ではありますが、ここでは普通に制約を充足する変数の値の組を求めることを「解を求めること」とします。</font></p></blockquote>
<p>制約伝播のメカニズム自体にもコストが発生しますから、極端な場合には、かけたコストほどの効果が得られない、つまり無駄な伝播ばかりして候補の絞込みがほとんど起きないような場合も考えられます。</p>
<p>その一方で、制約伝播のみでは解が求まらないのだとしたら、制約伝播の機構は、<strong>探索</strong>の手法と組み合わせて用いなくてはならないことになります。</p>
<p>ここでは探索の技術については詳しく述べませんが、探索が解を求める方法としては一般性・汎用性は高いけれど、効率の点では良くないのは明らかなことです。<br />ここからわかることは、<strong>既知のより効率的なアルゴリズムで解くことができる問題としてのモデル化が可能なら、制約プログラミングを用いる必要はない</strong>ということです。<br />制約プログラミングが効率的なのは、いわゆるナイーブなdon't know nondeterminismに比べての話であり、従って、探索して解くしかない場合に有効であると考えるべきなのです。</p>
<p>裏返せば、制約プログラミングで解をうまく求めるためには、様々な工夫が必要になると考えるべきなのです。制約伝播機構はうまく働けば非常に強力ですが、学習用の例題ならともかく、<strong>実用的なプログラムが制約伝播機構だけで開発できることはほとんどありません。</strong></p>
<p>それでは制約プログラミングは実用にならないのでしょうか。</p>
<p>決してそんなことはありません。既知の効率的なアルゴリズムでのモデル化がいつも可能なわけではありません。現実の問題は複雑なので、エレガントなモデル化が可能なケースは決して多くはないでしょう。開発期間や予算などリソースの制限があって、充分な調査ができないかも知れません(※2)。環境の変化によって問題が途中で変わるかも知れません。それ以前に、いわゆるスケジューリングに関する<strong>知識獲得</strong>（ここではかつて人工知能で扱われていた意味合いで用いています）の限界で、途中でモデルの変更が必要になるかも知れません。制約プログラミングが用いられる計画系のシステム開発は、そもそも典型的なウォーター・フォール型の開発プロセスに必ずしもフィットしないのです。</p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p><font style="FONT-SIZE: 0.8em">※2.学会などで実務家の発表に対して、大学で研究されている優秀な先生が調査不足を指摘されるケースを時折見かけますが、同じ実務家として我が身を振り返って自分の勉強不足を反省させられる一方で、現実のプロジェクトの諸条件の厳しさを想像するにつけ、そうした指摘を受ける実務家の方に同情してしまいます。</font></p></blockquote>
<p><strong>制約プログラミングは、現実のプロジェクトでこそ力を発揮します。<br /></strong>今回見てきたとおり、<strong>制約プログラミングを実用的な問題に適用するには、探索手法の工夫が必要</strong>になります。処理系が提供しているプリミティブでは間に合わないことの方が多いというのが私の実感です。<br />そしてほとんどの場合、<strong>探索の完全性も放棄して、実用上許容できる時間内に、実用上許容できる品質の解を得るための試行錯誤をしていく</strong>ことになるのです。そうしたことを受け入れてしまえば、制約プログラミングは非常に生産性の高いツールであると言えるのではないかと私は思います。</p>
<p>次回は今回の議論を踏まえて、再度、制約プログラミングを実用システムの開発に用いる際の課題を整理しようと思います。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

</feed>

