20 Jul 2014, 06:42

オブジェクト指向設計と並列プログラミングをAndoirdで学ぶ!Pattern-Oriented Software Architecturesを受けた

Courseraで Pattern-Oriented Software Architecturesを学びました。

[toc]

なぜPOSAを学んだか?

POSAを学んだ目的は、自分のオブジェクト指向設計能力を向上させるためだ。

デザインパターンを身につける

今年の目標の一つが、デザインパターンを身につけること。

去年はRubyやC++を学ぶことで、オブジェクト指向を身につけた。

そして今年は更なる成長のために、 デザインパターンを身につけることを本年度の目標にしたのだった。

アーキテクチャ・パターンという新しい考え方を身につける

今回学んだPOSAというものは、デザインパターンとは違う。 デザインパターンの上位に位置する、アーキテクチャ・パターンというものだ。

デザイン・パターンはクラス間の関係を示すのに対して、 アーキテチャ・パターンは、システムやモジュール同士の関係を示す。 アーキテクャ・パターンのなかに、デザインパターンが現れる。

あまりメジャーではないけれども、だからこそ人より抜きん出るためには、 デザインパターンとともに、アーキテクチャパターンをみにつけたいと思った。

並列プログラミングを身につける

これは棚からぼたもちだったのだけれども、 このCourseraのコースは平行プログラミングについても一通り説明されている。

今まで、平行プログラミングを真面目に学んだことがなかったため、 網羅的に学べるとてもよい機会だった。

Androidと平行プログラミング、そしてパターン

パターンだけが、学習の対象ではなかった。以下のことが学べた。

  • Android
  • 平行プログラミング
  • パターン

Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects

Douglas Schmidt先生は、以下の本の著者の一人。Schmidt先生、渾身の著作!

Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects

講義はこの本に書いてある内容、すなわち、

平行プログラミングに関するアーキテチャ・パターン

が中心的な話題となっている。

また、その学習のためのプラットフォームとしてAndroidOSが 採用されているという内容。 パターンが体系的に、順番に、解説されていくものを想定していたため、 このような進め方は予想外だった。

詳しく解説されたGofのパターンは以下。軽く触れたものはもう少しある。

  • Factory Method
  • Bridge
  • Command
  • Strategy
  • Template Method

また、POSAについては以下。

  • Half-Sync/Harf-Async
  • Active Object
  • Monitor Object
  • Producer-Consumer

とても熱い講義

Schmidt先生は、教えることにたいしてとても熱心に感じた。 やや早口だが、とても生き生きとはなしいている。 また、掲示板にしょっちゅう出没してコメントを精力的に書き込んでいるのにも驚く。

Douglas Schmidtさん本人のYoutubeチャンネルから、実際の動画を見ることができる。

そして、なぞのPDF群。いろいろなパターンに関する覚え書きがたくさんある。貴重な資料。

Assignmentは簡単

Assignmentは、とても簡単な内容。 githubから課題を落として、TODOとなっている場所を10箇所くらい修正する。

スケジュールの前半は、JavaのConcurrencyに関する話題が課題。

  • RentrantLock
  • ReadWriteLock
  • Semaphore
  • ConditionObject
  • CountdownLatch

Ping-Poigというプログラミングを作成した。

スケジュールの後半になって、ようやくAndroidの話題がでる。 Androidのライブラリを利用した並列処理について学ぶ。

  • HaMeR framework
  • AsyncTask framework

中級・上級を目指してガチにAndroidを極める人のための講義

ServiceやIntentがどういう思想のもとに設計されているかが、 パターンという観点から整理されて解説される。

並列プログラミングを題材にして、パターンが解説されていく。 実例を通して学べるところがよい。

市場にでているAndroidの参考書は、技術的な詳細よりも、 動くアプリを作成することに重点が置かれてかかれている。

この講義は、フレームワークの仕組みをJavaや設計の観点から詳しく解説しているので、 世の中の参考書にはない、貴重な学習材料だ。

中級・上級を目指して本気でにAndroidを学ぼうとする人に最適だと思う。

POSAをどう生かすか?

実例にそってパターンを学ぶ

正直、この講義だけではPOSAが分からない。Gofも部分的にしか紹介されない。

Androidと平行プログラミング、そしてパターン、いろいろ覚えることが多く、 頭の中で整理できないでいる。

思ったことは、パターンはパターンそのものとして学習するのではなくて、 コードや実例を通じて学んだ方がわかりやすいということだ。 そういう意味では、Androidが題材にされいてるところはよかった。

パターンは、折にふれてリファレンスを参照して、 繰り返し慣れ親しむことで覚えていくのがよいだろう。 普段のコードリーディングで、『これってパターンかも』と思ったら、 その度ごとにGoogleで調べるように心がけたい。

オブジェクト指向設計をもっく詳しく

パターンというのは、課題があってその解決策として導かれるもの。 GofやPOSAは、オブジェクト指向を大前提にしている。 オブジェクト指向の課題から、必然的に導かれたものがパターンとなる。

なので、パターンの本質を身につけるためには、 もっと深くオブジェクト指向設計を学ぶ必要を感じる。 オブジェクト指向設計の解説書として定評のある以下の本を買った。 これで、オブジェクト指向の本質的な部分を学びたい。

あと、POSA2の日本語訳、出版されないかな。

13 Jul 2014, 11:58

ソフトウェア・パターンへの情熱を現実生活へ注ぎ込めないか?

はじめに

ビジネスの世界でのフレームワークが、 ソフトウェアのパターンに近いことに気がついた。

自宅の本棚に勝間和代のフレームワークに関する本を見つけたので、読み返してみた。

ソフトウェア・パターンとビジネス・フレームワーク

この本では、フレームワークを以下のように定義している。

なにかの概念や考え方を自分なりに整理して、
考えやすくするもの、覚えやすくするもの。

このような定義は、ソフトウェアにおけるパターンと同じ考え方のように思う。 共通して現れる概念がカタログ化されて名前をつけられていることで、 より記憶に止めやすくなる。

フレームワークをたくさんもつということは、
頭の中でさまざまな情報を処理し、判断し、意思決定を行う際に、
その場に応じて最適な道具を使えるということ。

デザインパターンを身につければ、ソフトウェアの構造の理解が速くなる。 デザインパターンは思考のための道具だ。

問題解決フレームワークについてのまとめ

問題解決思考のフレームワーク、パターンについて、 読みながら調べたことを覚え書きとして書く。

問題解決の手法として、以下ががあげられている。

  • MECE
  • ピラミッドストラクチャ
  • 仮説思考

MECE

<div class="outline-text-3" id="text-3-1">
  <p>
    Mutually Exclusive and Collectively Exhaustive. (相互に排他的な項目」による「完全な全体集合」)
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/MECE">MECE &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    情報や分析対象をグループ分けする際に、 「重複なく・漏れなく」行うべきであるということを示した指針。
  </p>

  <ul class="org-ul">
    <li>
      最低限 2 x 2 のマトリックスで考える
    </li>
    <li>
      既存のMICE用フレームワークで考える
    </li>
  </ul>
</div>

ピラミッドストラクチャ

<div class="outline-text-3" id="text-3-2">
  <p>
    結論と根拠を多段に組み立てることによって作られる構造で、 ドキュメントの骨子全体の構造を表現するものとされる。
  </p>
</div>

<div id="outline-container-sec-3-2-1" class="outline-4">
  <h4 id="sec-3-2-1">
    ロジックツリー
  </h4>

  <div class="outline-text-4" id="text-3-2-1">
    <p>
      問題の分析や、課題の整理の結果をツリー構造として表現したものであり、 目的によって様々な種類がある。
    </p>

    <ul class="org-ul">
      <li>
        結果-原因(why)
      </li>
      <li>
        目的-手段(how)
      </li>
      <li>
        全体-部分(what)
      </li>
    </ul>

    <p>
      といった推論を繰り返して論理展開を行う場合、 その概念・事象間の論理的なつながりをツリー状に図示すること.
    </p>

    <p>
      問題解決などに使う場合には、上位概念から下位概念への分岐を2~3程度、 多くても5つぐらいまでにするのがよいとされる。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.itmedia.co.jp/im/articles/0609/01/news133.html">情報マネジメント用語辞典:ロジックツリー(ろじっくつりー)</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-2-2" class="outline-4">
  <h4 id="sec-3-2-2">
    MECEとロジックツリーの違い
  </h4>

  <div class="outline-text-4" id="text-3-2-2">
    <p>
      MICEは「もれなく、だぶりなく」数え上げるという考え方. ロジックツリーはMECEを実行するためのツール(フレームワーク)の一つ。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://oshiete.goo.ne.jp/qa/3869287.html">MECEとロジックツリーの違いとは? &#8211; 教えて!goo</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-2-3" class="outline-4">
  <h4 id="sec-3-2-3">
    ロジックツリーとピラミッドストラクチャーの違い
  </h4>

  <div class="outline-text-4" id="text-3-2-3">
    <p>
      以下のサイトでロジックツリーとピラミッドストラクチャーの違いが紹介されている。
    </p>

    <p>
      <a href="http://d.hatena.ne.jp/ohshi004/20080803/1217755608">ロジックツリーとピラミッドストラクチャー &#8211; Thinking Room で何想ふ。</a>
    </p>

    <ul class="org-ul">
      <li>
        ロジックツリー
      </li>
    </ul>

    <p>
      MECEを意識して、上位概念を下位の概念にトップダウン式に分解していく形式。 帰納的。
    </p>

    <ul class="org-ul">
      <li>
        ピラミッドストラクチャー
      </li>
    </ul>

    <p>
      具体的な情報や観察事項から上位の概念としてのメッセージを ボトムアップに抽出していく形式。演繹的。
    </p>
  </div>
</div>

仮説思考

<div class="outline-text-3" id="text-3-3">
  <p>
    仮説思考とは、何かに取り組む際に、 その時点で考えられる仮説(仮の結論)を置いて考える思考方法.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.nsspirit-cashf.com/logical/kasetsu_shikou.html">N&#8217;s spirit 仮説思考 仮説とは 仮説の立て方</a>
    </li>
  </ul>

  <p>
    仮説とはその時点で「こうすれば、こうなる」という結論をその理由とともに 設定すること。 一般的な「原因解明」次に「行動決定」の流れではなく、 「行動決定」次に「検証」の逆の順に進める。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://fk-plaza.jp/Solution/solu_kasetsu.htm">問題解決手法>仮説思考法</a>
    </li>
  </ul>

  <p>
    仮説は事実かどうか検証する。まちがっているかもしれないので。
  </p>

  <ul class="org-ul">
    <li>
      統計データやグラフ(定量的)
    </li>
    <li>
      ヒヤリング(定性的)
    </li>
  </ul>
</div>

現実問題をパターンで解き明かし、パターンを作り出す

フレームワークの活用方法について、以下のように言及されている。

大事なことは、自分でさまざまなフレームワークをさまざまな経験や
学びのなかから一つでも多く見つけだし、頭の中で整理して、
さらに新しいフレームワークを自分ででつくっていくこと。

フレームワークは思考を活発化し、助けるために存在するものであって、
思考をサボるためにあるのではない。

これも、ソフトウェア開発でも参考になる。 つまり、パターンをソフトウェアの構造から読み取り分類して整理する。 そこからはみでるものを、新しい構造のパターンとして記憶に止めていく。

パターンへの情熱を現実生活へ注ぎ込めないか

自分は、デザインパターンを熱心に学んでいる。 それは、デザインパターンを身につけることが、 自分の思考を加速させ、成長を促すと信じているからだ。 成長したい、ソフトウェアをはより速く、深く理解したいという動機が裏にある。

パターンへの情熱を現実生活へ注ぎ込めないか?

つまり、プログラミングと同じような情熱と好奇心をもって、 自分の生活に起こる様々な問題を解き明かせないか?

論理的な思考のフレームワークをみにつけることで、 目の前のことをより速く、深く理解することができる。

これは、ソフトウェア・パターンを身につけることよりも、魅力的に感じる。

というわけで、ロジカル・シンキングについて、もう少し学んで見ようと思う。

13 Jul 2014, 00:46

マイスターになるためには、型をにつけ、型を破る!パターン、Wiki、XP,を読んだ読書メモ

はじめに

ソフトウェアのパターンを集中的に学んでいる。また、以前Wikiを立ち上げた。

そんななか、パターンとWikiの概念の関係性を教えてくれる、興味深い本を手に取った。

内容

題名のとおり、以下の3つの関係性を時系列にそって書いている。

それぞれの概念をつくった3人の人物に注目して話が進んでいく。

時系列に歴史をかたり、各章のおわりで他の概念との関係を示す。 歴史は横のつながりで再解釈すると面白い。東洋と西洋、イスラムとキリスト、などなど。 そんなように、歴史的な縦軸のなかで横のつながりを示されると知的好奇心を心地よく刺激する。

パターンとWiki、XPというものがすべてアレクサンダーの思想から生まれたことに驚く。 それは、キリスト教とイスラム教が同じ旧約聖書を起源としているような驚き。

あとがきが大事

本のほとんどは史実を書くことに割かれている。 あとがきとして筆者の意見を垣間見る。とてもいいことをいっているので抜粋。

プログラマがプログラミングするさいに、
自分のプログラムにどのようなパターンが見出されるかを
自分自身で考えながらプログラミングすることが、
本当の意味でパターンをつかいこなす道なのです。

XPのプラクティスを入り口として、
自分たちの開発プロセスを改善する方法を自分たち自身で考えつづけ、
そこから得た経験をまたプラクティスとして抽出するようにする、
そのようなプロセスを続けることによってはじめてXPのプラクティスが有効に働くようになる。

パターンにとって、型にはまって考えることが大事なように考えられがち。 しかし、本当に大事なことは、型をみにつけ、型を破るという、こと。 古くから芸能の世界でいわれていることだ。

以下、簡単な読書メモです。

パターン

パターン

<div class="outline-text-3" id="text-4-1">
  <p>
    建築環境に繰り返し現れる課題を解決に導く具体的な方策を記述したもの。
  </p>
</div>

<div id="outline-container-sec-4-1-1" class="outline-4">
  <h4 id="sec-4-1-1">
    アレクサンダーのパターン形式
  </h4>

  <div class="outline-text-4" id="text-4-1-1">
    <ul class="org-ul">
      <li>
        パターン名
      </li>
      <li>
        写真
      </li>
      <li>
        上位パターンへのつながり
      </li>
      <li>
        本文
      </li>
      <li>
        下位パターンへのつながり
      </li>
    </ul>
  </div>
</div>

パターンランゲージ

<div class="outline-text-3" id="text-4-2">
  <p>
    建築において繰り返し現れる構造を再利用しやすい形式でまとめたもの。 あるいは、パターンを集めて一つの体系としてまとぬあげたもの。
  </p>

  <p>
    建築家クリストファーアレクサンダーが考えた建築手法。
  </p>
</div>

時を超える建築の道

<div class="outline-text-3" id="text-4-3">
  <p>
    パターンランゲージを記した建築理論。本の題名。
  </p>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/%E6%99%82%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%BB%BA%E8%A8%AD%E3%81%AE%E9%81%93-%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%83%BC-%E3%82%A2%E3%83%AC%E3%82%B0%E3%82%B6%E3%83%B3%E3%83%80%E3%83%BC/dp/4306043061%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4306043061' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/51VWYgOr6IL._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/%E6%99%82%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%BB%BA%E8%A8%AD%E3%81%AE%E9%81%93-%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%83%BC-%E3%82%A2%E3%83%AC%E3%82%B0%E3%82%B6%E3%83%B3%E3%83%80%E3%83%BC/dp/4306043061%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4306043061' rel='nofollow' target='_blank'>時を超えた建設の道</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.07.13
        </div>

        <div class='amazlink-detail'>
          クリストファー アレグザンダー
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/%E6%99%82%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%BB%BA%E8%A8%AD%E3%81%AE%E9%81%93-%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%83%BC-%E3%82%A2%E3%83%AC%E3%82%B0%E3%82%B6%E3%83%B3%E3%83%80%E3%83%BC/dp/4306043061%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4306043061' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F616798%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D616798%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <p>
    角谷信太郎さんのおもしろいはなしのyoutube動画も見つけた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.youtube.com/watch?v=SctvxjoKDGA">https://www.youtube.com/watch?v=SctvxjoKDGA</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-4-3-1" class="outline-4">
  <h4 id="sec-4-3-1">
    無名の質
  </h4>

  <div class="outline-text-4" id="text-4-3-1">
    <p>
      生き生きとした建築や街が備えている特性。古い街並みに潜む住みやすさや美しさ。
    </p>
  </div>
</div>

Wiki

ウォード・カンニガムがプログラムに関する、 パターンを記述して閲覧するためにはじめたのが起源。 WikiWikiWebというパターンブラウザ。

ブログとwikiの根本的な違い

<div class="outline-text-3" id="text-5-1">
  <p>
    ブログとwikiの根本的な違いは、以下。
  </p>

  <ul class="org-ul">
    <li>
      ブログは情報を日付で管理するシステム
    </li>
    <li>
      wikiはページ名で情報を管理するシステム
    </li>
  </ul>
</div>

XP

ケント・ベックがパターンの考えをソフトウェア開発のプラクティスに応用した。 プロセスのベストプラクティスをカタログ化したもの。プロセスへパターンを適用したもの。

アレクサンダー6つの原理とXPプラクティス

<div class="outline-text-3" id="text-6-1">
  <ul class="org-ul">
    <li>
      有機的秩序の原則 ・・・ フィーチャーに注目した開発
    </li>
    <li>
      参加の原則 ・・・ 顧客との対話を重視
    </li>
    <li>
      漸近的成長の原則 ・・・ インクリメンタルな開発
    </li>
    <li>
      パターンの原則 ・・・ UML, XPプラクティス
    </li>
    <li>
      診断の原則 ・・・ TDD, CI
    </li>
    <li>
      調整の原則 ・・・ PDCA
    </li>
  </ul>

  <p>
    その他、関係ないかもしれないけど、暗黙知と形式知についてのメモ。
  </p>
</div>

暗黙知と形式知

暗黙知

<div class="outline-text-3" id="text-7-1">
  <p>
    知識というものがあるとすると、 その背後には必ず暗黙の次元の「知る」という動作がある」ということを示した概念。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E6%9A%97%E9%BB%99%E7%9F%A5">暗黙知 &#8211; Wikipedia</a>
    </li>
  </ul>
</div>

形式知

<div class="outline-text-3" id="text-7-2">
  <p>
    形式知(けいしきち)は知識の分類の一つであり、 主に文章・図表・数式などによって説明・表現できる知識を指す。暗黙知に対する概念。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E7%9F%A5">形式知 &#8211; Wikipedia</a>
    </li>
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E8%A6%8B%E3%81%88%E3%82%8B%E5%8C%96">見える化 &#8211; Wikipedia</a>
    </li>
  </ul>
</div>

これからどうするか

今は型を学ぶとき

<div class="outline-text-3" id="text-8-1">
  <p>
    パターンに興味をもった動機は、プログラマとして成長したいからだった。
  </p>

  <p>
    プログラミングを身につけるということは、芸を身につけることだと思っている。 成長するためには、洗練された型を身につけることが近道だ。
  </p>

  <p>
    今は、型を身につけるとき。自分はまだまだ未熟なので、定石を身体に叩き込む時。 しかし、いつかは型を破らなければならないときもくるだろう。 そんなとき、この本を見直したい。
  </p>
</div>

いろんな分野のパターンを収集する

<div class="outline-text-3" id="text-8-2">
  <p>
    パターンは、建築とソフトウェア開発に限るものではない。
  </p>

  <p>
    どんなものにだってパターンが存在する。 そのような言語化されていないもやもやしたものを、 wikiとして拾い上げ、整理して、分類する。 そうすることは、他の分野にも応用できるとおもう。
  </p>

  <p>
    自分もWikiにいろいろな考えを書き溜めて、そのつどごとに整理していこうとおもう。
  </p>
</div>