SE(設計者)に忘れてほしくないこと

強固なものはシンプルな設計から

1.システムを構築する技術

現在のシステム開発ではベースとなる技術が幾つか用意されており、それらのどれかを採用し構築を行うことが殆どである。採用基準は業界によって異なるが、実績のあるもの、効率よく構築ができるもの、構築会社が得意としているもの、おおよそその様な選定基準で採用が決まる。

当たり前のことだが、採用したベースの技術のポリシーに沿った実装(工法)でシステムを作成していかなければ、良いものはできない訳である。

2.使いやすさと頑丈さの兼ね合い

使いやすいシステムを設計するために、顧客と打ち合わせを重ね、あらゆるケースに対応したシステムフローを作成する。その際設計者は、そのフローの裏で動いているデータに着目し、できること・できないことを判断する必要がある。データがぐちゃぐちゃになってしまっては、骨組みのバランスが悪い家と同じである。後々何が起こるのか想像に難くない。

人間の脳に記憶できるものには限りがあり、全てのデータを把握することは不可能であるため、把握可能な適切な範囲内で機能を設計し、データの管理を段階的に整理していくことが大切である。

結果論になってしまうが、案外重要なデータは数少ないものであり、それをしっかり抑えたフロー(機能分割)を作成することができれば、必然的に使いやすいシステムになると信じ、顧客との調整を重ねる勇気とコミュニケーション力が必要である。

一番やってはいけないのは、言われたままにフローを組んでしまうことである。これではSEとして顧客と打ち合わせをしている意味がない。プログラマーからも信頼を失い、SEとして仕事を行うことはできなくなる。

3.シンプルな設計とは部品の組み合わせ

ここまでのことを踏まえると、難しいことではあるが、やはり全体を見据えた上で機能を設計し、機能ごとにしっかりとした部品を使い構築することが重要であると言える。家でも車でも何でも、しっかりした部品・資材がなければ良いものはできないのと同じである。

ここで、しっかりとした部品を作成するのはプログラマーの役割であるが、各機能を設計し組み上げるのはSEの役割であろう。この役割を全うするために前提として必要なのが、はじめに「システムを構築する技術」で述べた、どの様な技術を採用し構築するのか?である。ここを見失っては強固なシステムにはならない。

SE(設計者)に求められるものは、採用した技術と顧客の望む使い勝手を総合的に判断し、適切な機能分割とデータ処理を実現させる技術を要していることである。少なくとも、この両面から設計することを常に頭の片隅において顧客との打ち合わせに望む心構えが必要である。

システム開発での言葉(共同作業の難しさ)

1.はじめに

長年システム開発にSEとして携わり、他人に作業依頼し、自分の思っていることを100%伝えることの難しさ(不可能への挑戦である)を毎回実感する。

そのことへの面倒くささも感じてしまう方も多いのではないか?

日本人といえども、使用する言葉に対してニュアンスも違えば、仕事のやり方(自分なりのやりやすさ)も違うので、絶対的な方法論がないのだと思う。

仕事上のストレスの殆どは人間関係にあるといわれているので、その意味では中々大変な仕事なのかもしれない。

 

2.言葉のニュアンスの違いによる難しさ

日本人であれば、同じ日本語を話し、単語の意味は同じ様に理解すると思われるが、必ずしもそうではない。まずは伝える側がそのことを理解し、しっかりと丁寧に説明をしないとダメだ。が、しかし、話し過ぎてもある時点から後ろの話は意味がない(恐らく聞き手はあまり長いと聞いてくれない)から加減が難しい。

では、作業をやらせてみて、結果をレビューしてフィードバックする方法をとるのだが、そもそも、あまりに伝わってないと結果的に進捗遅れが発生し、スケジュール管理が崩壊するので、レビューとフィードバックのタイミングが次のポイントとなるのだが、そこで問題として立ちはだかるのが、仕事に対する姿勢の違いによるコミュニケーションロスである。

 

3.仕事に対する姿勢の違いによる難しさ

人の性格は、大きく「犬派と猫派」がいると聞いたことがあると思うが、仕事のやり方を見ると、本当にそうだと感じる。犬派の人には、こまめな進捗確認と都度の指示、猫派の人には、作業のゴールを初めに共有したら、やり方については口出しせず、進捗確認も結果だけを確認するスタンスで、相手から質問がなければ細かい指示は不要である。これを逆の方法で実施してしまうと、担当者にすごくストレスが掛かり、仕事云々よりも人間関係で大変な現場となってしまう。

また、犬派猫派の前に、開発者としての意識の違いからくる仕事に対する姿勢も変わってくる。開発という仕事に対し、自ら考え結論を導き出す人、量産体制の工場の様に、確立した手順に則り作業をし、あまり自ら結論を出したり判断したりすることをしない人。である。一概には言えないが、この後の話を簡単にするために、前者は猫派、後者は犬派とする。

この犬派・猫派を意識した言葉使いをしないと、まー上手く行かない。そもそも言葉とは、相手が同じ様に感じ取るとは限らない訳だが、そのことが顕著に思い知らされることになる。

 

4.まとめ

20年近くSEを続け、新しいプロジェクト、新しいメンバーで仕事をする度に、人間関係の難しさを実感してきたが、一つ言えることは、どんなに技術力の高いメンバーを集めても、それよりも人間関係を良好に保つことの方が最終的には良いチームとなり、良い仕事が残せるということだと感じている。

日々進捗を出し結果につなげることは必達であるが、人間関係についておざなりになってはいけない。各メンバーに合った言葉を使用し、作業以外の人間関係でストレスを感じるような事がないよう丁寧に対応することが大切なのだろう。

仕事に対するストレスを感じている社会人は多いと思う、常に新しいメンバーと仕事をすることが多い、このシステム開発のSE現場から、そういった問題を解決するスキルを発信し社会貢献ができれば素晴らしいと思う。もしかしたら適任なのではないかとも感じている。

 

機械学習の開発に携わってみて

  1. はじめに
     DeepLearningの成功により、色々な機器にAIの導入が現実的に始まってきている。
     そこで、昨今注目されている機械学習(AI)の実装レベルの入門的索引となる様な情報をまとめる。
  2. 機械学習とは
     機械学習の目的は、十分に理解されているデータに理論分布を当てはめる統計モデルと同様にデータの構造を理解することですが、両者には大きな違いがあります。
     統計モデルの場合は、数理的に実証済みの理論がモデルの背後に存在していることから、データが特定の強固な前提条件を満たしていることが必須となります。
     一方、機械学習では、「たとえデータの構造に関する理論が明らかではない場合でも、コンピューターを使ってデータを精査すれば、その構造を探ることができる」という概念にもとづいてモデルを構築します。
     機械学習モデルにおけるテスト(検定)とは、新たなデータに関する検証エラーを見つけることであり、機械学習では反復アプローチを用いてデータから学習する場合が多いため、学習プロセスの自動化が容易です。
     確固としたパターンが見つかるまで、何度でもデータ処理を繰り返すことができます。
  3. 昨今機械学習が注目されるに至った背景
     機械学習のアルゴリズムは長年にわたり数多く存在してきましたが、ビッグデータに対して複雑な数値計算を自動的に、超高速で、何度も繰り返して適用できるようになったのは、近年のテクノロジーの発展のおかげです。
     ・多数のレイヤー(層)が深く重なったニューラル・ネットワークを構築するのに十分な超大量のデータを利用できるようになっています。モノのインターネット(IoT)のストリーミング・データ、ソーシャルメディアのテキストデータ、医師の臨床メモ、保険調査員の記録などは、そうしたデータのごく一部です。
     ・分散クラウド・コンピューティングおよびGPU(Graphics Processing Unit)という2つの領域における発展のおかげで、信じられないほど高度なコンピューティング・パワーを自在に操れるようになっています。ディープ・ラーニングのアルゴリズムの学習には、これらを最大限活用したコンピューティング・パワーが必要です。
  4. 機械学習の手法
     【ニューラル・ネットワーク】
     【決定木】
     【ランダムフォレスト】
     【アソシエーションとシーケンスの発見】
     【勾配ブースティングとバギング】
     【サポート・ベクター・マシン(SVM)】
     【近傍法マッピング】
     【k平均法クラスタリング】
     【自己組織化マップ(SOM)】
     【局所探索最適化手法(遺伝的アルゴリズムなど)】
     【期待値最大化法】
     【多変量適応型回帰スプライン法】
     【ベイジアン・ネットワーク】
     【カーネル密度推定】
     【主成分分析】
     【特異値分解】
     【ガウス混合モデル】
     【逐次的カバーリング・ルールの構築】
  5. ニューラル・ネットワーク(DeepLearning)
     ニューラルネットワークは、入力層、出力層、隠れ層から構成され、層と層の間には、ニューロン同士のつながりの強さを示す重み「W」がある。
     「人間の脳の中にあるニューロンは電気信号として情報伝達を行います。その際にシナプスの結合強度(つながりの強さ)によって、情報の伝わりやすさが変わってきます。この結合強度を、人工ニューロンでは重みWで表現します」
     データが入力層のXに入ってくると、その値に重みW1をかけ、Yに結果を出力する。
     そして今度は、先ほど計算したYの値を入力として重みW2をかけ出力層のZに書き出す。
     重みW1およびW2の値によって出力結果は異なってくる。
     「たとえば、z1が0.8という出力になったとします。しかし本当はz1の出力を0.5にしたい場合、一体どうすればよいでしょうか?その結果に近づけるために、重みのW1とW2を調整していけばよいのです」
     「ディープラーニングの学習では、ニューラルネットワークの入力層にデータを入力し重みをかけて出力するという操作を最終層までN回繰り返します。これをフォワード・プロパゲーションと呼びます」(村上氏)
     初期段階では、すぐに期待した通りの答えは出力されないため、正解ラベルと出力値の誤差をとり、誤差を各層に伝播させて正解値に近付くように各層の重みを調整する。この誤差を逆伝播させる事を
     「Back Propagation(バックプロパゲーション)」と呼ぶ。これが誤差逆伝播法の仕組みだ。
  6. 畳み込みニューラルネットワーク(Convolutional Neural Network,以下 CNN)
     (1)CNNの定義
      ・入力層
        特徴(次元数)分の入力データ
      ・隠れ層
       >埋め込み層
       >畳み込み層
         Relu(最新のモデルでも標準的な活性化関数として広く利用されている)など
       >プーリング層
         MaxPoolingなど
       >全結合層
      ・出力層
        1ユニットで回帰、多値分類:Softmax関数
     (2) 目的関数の定義
      ニューラルネットワークの学習は、学習時に出力層から出力される確率値と教師ラベルに属する確率値を大きくするように重みを学習する。その指標となるのが目的関数である。
     (3) データの学習((誤差逆伝播(バックプロバゲーション)))
      目的関数の微分による勾配を利用したアルゴリズムに従って目的関数の値を最小化する。
      >2乗誤差
      >クロスエントロピー
      >エントロピー
参考文献

はじめてのアジャイル開発

はじめてお客様システム開発にアジャイル開発を取り入れてみた感想

1.はじめに

顧客企業向けのシステム開発は通常ウォーターフォールモデルで行われることが殆どであり、アジャイルの有効性を認識しながらも中々実施することはできない現実がある。それば予算や開発するシステムの稟議手続きの問題が大きいからだと思うが、そんな現実にどうにか抗い、契約はウォーターフォール開発での納品、実際の開発は要件を五月雨で確定させウォーターフォールの工程で納品しつつ、同時に実装も行ってテストドリブン的な考えで、実質アジャイル開発を実施してみた。

 

2.ウォーターフォールからアジャイルへ

アジャイルでの開発は、実際うまく行った。やはり顧客要望がハッキリせず、開発側からも要件を明確に定義し説得することができない案件については、アジャイルは効率的だった。時間を掛けず動くものを見せることができるので、お客様も要望を絞るのにイメージしやすかったのだと思う。逆に要望が膨らむ部分もあったが、開発側もできるできないの判断がしやすかった部分もあった。

また、今回はアジャイルに合った技術者と体制規模がたまたま合ったからと言う理由も大きいと感じている。

そう感じる理由は、意思疎通が難しく、ある程度ツーカーの関係でないと、想定どおりのものができないし、開発速度をあげることもできなかったと感じているからだ。

ここまで、ポジティブに働いた部分のみを書いてきたが、逆に難しかったことについて、次に述べる。

 

3.アジャイルで難しいこと

まずは、開発者のマインド!なんでも新しいことに調整する、主体的な思考と姿勢を持った開発者があつまらないと、どこかでボトルネックが発生する。

次に、ドキュメントの残し方!先行実装から機能要件を明確にしていくので、その際の記録をしっかり残しておかないと、結局、後で揉める。

また、設計書については、先行実相寺に最低限のプログラム仕様は残しておかないと、後になってバグなのか?仕様なのか?悩む場面がでてしまう。

以上3点を克服できれば、後はマネージャーの人間性で上手くできる。

 

4.おわりに

ウォーターフォールにはウォーターフォールの、アジャイルにはアジャイルの良い点があり、開発するシステムの規模、お客様の状況、お客様との関係性を踏まえ、上手く利用していくことができれば、効率の良い、双方にとって満足いく仕事ができるのではないかと思う。

中々、アジャイルを採用できる案件は少ないと思うが、合う案件だと感じた際は、何とかチャレンジしてみたいし、そのための努力をしなければいけないと燃えている。