ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

リバーシ(オセロ)を部分的に実装して、ソフトウェア開発関係者であることを証明する ー その2

 前の記事では、右方向の石置き可否判定を実装しました(Excel関数で)。
 今回は、上下左方向の石置き可否判定について考えていきましょう。

www.kzsuzuki.com

「逆方向」の難しさ

 右方向さえできれば、左方向も本質的には同じ、簡単に実装できそうです。
 しかしここで、Excelの暗黙の前提が効いてきます。Excel関数は基本的に「左から右に」「上から下に」が前提で、その逆を行おうとすると複雑さが増していくのです。

 たとえば、カンマで区切られた2つの単語 apple,orange を、左と右に分けることを考えてみましょう。
 左側は、カンマの位置をFINDで探して、そのすぐ左までをLEFTで切り取ります。

=LEFT(対象セル,FIND(";",対象セル)-1)

 一方右側は、FINDの位置を見つけて対象文字列の長さLENから引いたうえで、RIGHTで切り取ります。ひと手間増えていることがわかりますね。

=RIGHT(対象セル,LEN(対象セル)-FIND(";",対象セル))

 返し判定についても同じで、OFFSETMATCHを逆方向に使うと、一気に複雑になってしまうんですね*1
 ここで少し、発想の転換が必要になります。

盤面を回す

 ジョジョ、それは無理矢理方向を変えようとするからだよ。逆に考えるんだ、『方向は固定、盤面を回しちゃえばいいさ』と考えるんだ。
 ということで、盤面を時計回りに90度回転させます。たとえばセルC4の座標(4, 3)で、回転後は(3, 5)に移動します。一般化すると、座標(x, y)(y, 8-x+1)に移動するわけです。これで、右方向への判定を上方向(-90度方向)に適用することができます。

03

 同じように、180度・270度回転させれば、上下左右方向すべてについて、同じロジックで石置き可否判定ができるようになりますね*2。 これをORで結ぶことで、上下左右のいずれかで返せればTRUE、とすることができました*3
 こんなイメージになります。左から4つの盤面がそれぞれ右・上・左・下方向の判定で、一番右の判定は上下左右方向を合わせた判定です。

04

斜め方向の判定

 さて、次は斜め方向です。普通に考えて、Excel関数で斜め方向に何らかの処理を行うのは、難しさが一気に増しそうです。
 ジョジョ、それは斜めに判定しようとするからだよ。逆に考えるんだ、『盤面を斜めに回しちゃえばいいさ』と考えるんだ。
 ただ90度回転とは違い、斜め回転には少し工夫が入ります。結論を言うと、盤面を分割する必要があります。百聞は一見にしかず、要は、こう。

05

 この分割後の盤面について、最初のロジックで判定すればいいわけです。シンプルな解法ですよね。

力尽きる

 単に石を置けるかどうかだけでこんなに苦労してしまいました。もしかして、Excelワークシート関数で実装するという判断は誤っていたのでしょうか?

 あとはExcel職人の皆さんにお任せしたいと思います!
 それでは良い週末を!

*1:「下」については、右とほぼ同じに作れます。

*2:前記事の条件1でISBLANKを使うと、回転後のセルが空白ではないため、石のないセルでも判定がFALSEになってしまいます。

*3:ORの中にエラーがあると全体がエラーになるので、ISERRORで0にしています。

リバーシ(オセロ)を部分的に実装して、ソフトウェア開発関係者であることを証明する ー その1

 ソフトウェアエンジニアならリバーシ(いわゆる、オセロ)の実装くらいできるだろう、というのが話題になっていたので、やってみることにしました。

 8×8マスの情報を保持するための「配列」、マスの状態を一つ一つ見ていく「繰り返し」、石をおける/おけない、返る返らないの「判定」など、プログラミングの基本概念を知っていれば、実装できそうです。
 では、わたしのような者にとって、ここで選ぶべき「言語」は何でしょう。

 そうです、Microsoft Excelですね。
 あ、いいえ、VBAではありません、Excelワークシート関数です。
 何しろワークシートを方眼紙状にすることで、盤面を即、表現できますから。

 といっても、全部やるほどの週末はないので、「そのセルに黒石をおけるかを判定する」部分を作ってみました。

自然言語で表現する

 あるマスに黒石をおくためには、そのマスの上下左右、斜めの計8方向のいずれかについて、以下の条件を満たしていることが必要です。

  1. 対象の位置に、石がない。
  2. 対象の方向に、黒石がある。
  3. 一番近い黒石との間がすべて白石である。

Excel関数で表現する

前提

 白石を「1」、黒石を「10」で表現します。Excelなら条件付き書式が使えるので、色も変えられますね! 薄い青は、石が置かれていないマスを表現しています。

01

条件1

 これは簡単です。たとえばセルD5であれば、

D5=""

で判定します。いやいやそこはISBLANK関数だろ?と思う方もいると思いますが、ISBLANKを使うと後で詰みます。

条件2

 たとえば右方向に「10」があるかどうかを判定するには、MATCH関数を使えばいいですね。 セルD5について判定するには、

=MATCH(10,E5:$J5,0)

とします。対象セルとすぐ右から一番右端までをチェックしています。第3引数を「0」にしておくと、一番最初に見つけた(つまり一番近い)位置を返してくれます。

条件3

 セルのすぐ右隣のセルと、条件1のMATCH関数で得たセルの間が、すべて白であることを確認します。そのために使うのは、OFFSET関数とSUM関数です。

=SUM(OFFSET(D5,0,1,1,MATCH(10,E5:$J5,0)-1))

 OFFSET関数は、基準となるセルから、第2・第3引数で起点を決め、第4・第5引数で高さと幅を決めることで、領域を指定することができます。わかりづらいですが、ここでは「対象セルのすぐ右のセルから、一番近い黒石のすぐ左のセルまでの領域」を指定しています。これはつまり、「黒と黒で囲まれた領域」ですよね。その領域がすべて白(「1」で表現される)であれば、領域の数字のSUMは、領域のセル数に一致するはずです。3マスなら、3。

 つまり以下のような判定がTRUEであれば、黒と黒にはさまれた領域はすべて白です。

SUM(OFFSET(D5,0,1,1,MATCH(10,E5:$J5,0)-1))=1*(MATCH(10,E5:$J5,0)-1

 なお、黒を「0」や「-1」にしていないのは、この「一致」の判定でしくるだろうなと思ったためです。

判定

 条件1~3をANDで結ぶだけですね。

=AND(
D5="",
MATCH(10,E5:$J5,0),
SUM(OFFSET(D5,0,1,1,MATCH(10,E5:$J5,0)-1))=1*(MATCH(10,E5:$J5,0)-1)
)

 とてもシンプルに表現することができました。

右方向を判定した盤面

 先の結果を、判定用の盤面全64マスに適用します。
 元の盤面は、判定用盤面の対応位置の判定が「TRUE」であれば、黄色に塗ることにしましょう。こんな感じになります。

02

 まだ「右方向」しか判定できないので、ちょっとさみしいですね。
 次回は、「上下左方向」をどう実装していくか見ていきましょう。

データサイエンスが今もなおセクシーだと感じるビッグデータの使い方

 2007年の米国で大規模な景気後退が始まったとき、ストレスにさらされた大人たちによる、児童への虐待が増加するのではないかと危ぶまれました。しかし公式データによると、虐待保護件数はむしろ減少。特に、不景気の影響が大きい州ほど減少の幅が大きかったそうです。
 そんなことがあるのだろうか・・・? 景気後退に伴い、本来報告を行う人が手一杯だったり、失業していたりしていただけではないか。
 Googleの検索データを調べると、「ママがぼくをぶつ」「パパに殴られた」という検索の件数は、景気後退の間に跳ね上がり、失業率データを一致していたというのです。

誰もが嘘をついている ビッグデータ分析が暴く人間のヤバい本性

誰もが嘘をついている ビッグデータ分析が暴く人間のヤバい本性

人々が情報を求める検索は、それ自体が情報なのである。人々が何かの事実、発言、ジョーク、場所、人物、物事、あるいはヘルプについて検索するとき、それは彼らの本当の考え、望み、あるいは恐れについてどんな推測より正確に明かすものとなる。

 本書はこのような事例をふんだんに盛り込んだものです。
 著者は、検索エンジンを「デジタル自白剤」と呼び、伝統的な調査では得られない質・量のビッグデータから、これまで読み取ることのできなかった知見が得られるとしています。

 たとえば2015年にアメリカで起きた、銃乱射事件。数日後のオバマ大統領が受容と寛容を説いた演説の裏で、「イスラム教徒」とともに複合検索されていた言葉は、演説の内容とは正反対のものだったそう。成功と言われたこの演説が、現実には逆効果をもたらしていた可能性が、データ分析からわかっています。

 個人的な感覚では、「データサイエンティストってセクシー!」って言われまくった数年後の今、みんなが機械学習の話をしている感があるのですが、「たくさんのデータ」を相手にするのにデータサイエンスはやはり強力、ということをあらためて思い知らされます。

 ちなみにこちらは、著者が検索データをビッグデータとして扱うきっかけとなった、Googleトレンド。「big data」と「deep learning」の検索の趨勢を比較してみました。

 ビッグデータを用いた斬新な分析に続き、後半では、ビッグデータの限界や、従来の分析との組み合わせ、そして「やってはいけないこと」について言及しています。「やってはいけないこと」は、機械学習の文脈でも似たような話が出てきますね。たとえば「人の趣味や言葉遣いなどのデータを用いて、人材採用や犯罪予測の手がかりにすることは正しいのか」といったものです。

 なお今「後半」と書きましたが、わたしはこの本を最後まで読みました。そのモチベーションは、目次に目を通したときに見てしまった、「ここまで読み通してきた人は何人?」という最終章のタイトルです。こんな皮肉を言われてしまったら、読むしかないでしょう。
 本書最後の文章も、とってもひねくれたものでした。みなさんもぜひ、「ここまで読み通して来た人」になりましょう。ちなみに著者らによると、トマ・ピケティの『21世紀の資本』を読了した人は3%未満、だそうです。読み始めただけでもえらいと思うけれど!

少しばかりの統計学の技術と山ほどの好奇心を持ち合わせているなら、データ分析の世界に足を踏み入れてほしい。

データサイエンティスト養成読本 登竜門編 (Software Design plus)

データサイエンティスト養成読本 登竜門編 (Software Design plus)

  • 作者: 高橋淳一,野村嗣,西村隆宏,水上ひろき,林田賢二,森清貴,越水直人,露崎博之,早川敦士,牧允皓,黒柳敬一
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/03/25
  • メディア: 大型本
  • この商品を含むブログを見る

 こちらは何だか不思議な本で、確かにデータサイエンティストになるために必要な素養を広く紹介してくれてはいるのですが、とても基本的なLinuxコマンドやExcel関数(!)にまで踏み込んだ記述があって、「とりあえず手を動かすために必要な知識を全部ぶっこみました」という感じがとても好きです。

【翻訳】モダンテスティングの原則

 同僚に紹介してもらった「Modern Testing Principles」、わかりやすくていいなと思ったので、許可を得て翻訳してみました。原文のブログ「AB Testing」は、ABテストとは関係なくって、PodcastとSlackを主宰しているAlanさんとBrentさんの名前からですね。

www.angryweasel.com

 なお、Work in Progressということで今後も変更されていくようなので、現時点での原文を引用しておきます。

  1. Our priority is improving the business.
  2. We accelerate the team, and use models like Lean Thinking and the Theory of Constraints to help identify, prioritize and mitigate bottlenecks from the system.
  3. We are a force for continuous improvement, helping the team adapt and optimize in order to succeed, rather than providing a safety net to catch failures.
  4. We care deeply about the quality culture of our team, and we coach, lead, and nurture the team towards a more mature quality culture.
  5. We believe that the customer is the only one capable to judge and evaluate the quality of our product
  6. We use data extensively to deeply understand customer usage and then close the gaps between product hypotheses and business impact.
  7. We expand testing abilities and knowhow across the team; understanding that this may reduce (or eliminate) the need for a dedicated testing specialist.

 では以下、翻訳です。
 誤訳や改善点あれば、Twitterなどでご指摘ください。

翻訳

モダンテスティングのミッションステートメント

 リリースに足る*1品質の達成を加速すること。

モダンテスティングの原則

 これらはまだ仕掛かり中であり、コメントを歓迎します。また、より踏み込んだ議論のために、slackグループに参加してください。
 モダンテスティングの7つの原則は、以下の通り。

  1. わたしたちは、ビジネスの改善を優先する。
  2. わたしたちは、チームを加速させる。リーンシンキングや制約理論(TOC)といったモデルを利用して、システム*2のボトルネックを特定し、優先順位をつけ、軽減するのを助ける。
  3. わたしたちは、継続的な改善の力である。欠陥を捕まえるセーフティネットを提供するよりも、成功するための適応・最適化を助けるのだ。
  4. わたしたちは、チームの品質カルチャーに十分注意を払ったうえで、さらに成熟した品質カルチャーに向かうために、チームを助け、導き、育てていく。
  5. わたしたちは、自分たちのプロダクトの品質を判断・評価することができるのは、唯一お客様のみであると信じる。
  6. わたしたちは、広くデータを用いてお客様の使い方を深く理解し、プロダクトの仮説とビジネスインパクトの間にあるギャップを小さくしていく。
  7. わたしたちは、テストに関する能力やノウハウをチームに広める。そのことが時に、テストのスペシャリストを専任でおく必要性を減らして(あるいはなくして)しまうことを理解したうえで。

所感

 これを読んで、「当たり前のことしか書いていない・・・」と感じる人と、「はあ?」と感じる人がいるかもしれません。カルチャーやコンテキストによっては、この原則と真っ向からぶつかると思います。たとえば以下のような風土・考え方をもつ組織とは、合いそうにないですよね。

  • テストチームの第一の目的は、できる限りたくさんのバグを見つけて、外部品質を高めることである。
  • 開発チームは自分たちで品質を判断できないので、テストチームが判断する必要がある。
  • QA組織は、開発組織と独立した部門であり、開発の最後に品質保証の活動を行うものである。

 どっちが正しいかはわかりませんし、状況によるのかもしれませんが、どっちが楽しそうかといえば、「モダンテスティング」の方が楽しそうだなーとわたしは思います。

 これらの原則から感じられるのは、「お客様」「チーム」という2つの視点ですね。
 特にわたしが好きなのは、7です。テストチームは、テストをする人のポジションを守るためにあるものではなく、お客様のビジネスとチーム全体をよくするためにあるもの。「テストチーム」を守るために、テストの技術を秘法にするのでは、チームの加速に寄与することなんてできない。7が、自分自身の否定につながると感じるなら、それは成長のための学習を怠っているからでは?と言われているように思います。

 あ、リーンシンキングとTOCですか? もちろん書籍を持っていますよ。

IMG-1985

 持ってはいます!
 ・・・成長のための学習を怠っているなあ。(ザ・ゴールの焼けた背表紙を見つめながら)

ザ・ゴール ― 企業の究極の目的とは何か

ザ・ゴール ― 企業の究極の目的とは何か

リーン・スタートアップ

リーン・スタートアップ

  • 作者: エリック・リース,伊藤穣一(MITメディアラボ所長),井口耕二
  • 出版社/メーカー: 日経BP社
  • 発売日: 2012/04/12
  • メディア: 単行本
  • 購入: 24人 クリック: 360回
  • この商品を含むブログ (95件) を見る

*1:「Shippable」(出荷可能な)意訳です。定訳あるでしょうか?

*2:ここでいう「システム」とは、コンピュータシステムではなく、開発チーム・プロセスのことを指していると考えています。

寿司とシャンパン、ディープラーニングとExcel、そんなマリアージュ

 『大予測 次に来るキーテクノロジー2018-2019』という本を読みました。野村総研のアナリストである城田真琴さんが、「次に来る」8つのテクノロジーの今とこれからについて、ふんだんな事例とともに解説したものです。 

大予測 次に来るキーテクノロジー2018-2019

大予測 次に来るキーテクノロジー2018-2019

  • 第1章 人工知能
  • 第2章 自動運転
  • 第3章 音声インタフェース
  • 第4章 チャットボット
  • 第5章 VR・AR・MR
  • 第6章 バイオメトリクス認証
  • 第7章 センシング、IoT
  • 第8章 ブロックチェーン

 多くの人にとってはほとんどが、聞いたことのあるテーマ・分野だと思います。タイトルに「2018-2019」と明示しているだけあって、「すぐに古くなることは承知で、今まさに旬な情報を詰め込んだ」という割り切り方で、先端企業の取り組みを幅広くカバーしています。たとえば音声インタフェースであれば、Amazon、Google、Appleといった巨大企業の覇権争いに、日本からはLINEが殴り込みにいき、音楽配信サービスとの連携でも火花を散らしていますね。

www.phileweb.com

 新しい技術がもたらす既存の社会システムとのズレについても、興味深いものがありました。ハイレベルな自動運転が実現され、運転の過失をユーザに問えなくなったとき、自動車保険はどのような形をとるべきか。音声認識端末がホテルの部屋に設置された場合、ユーザと、(録音のログを確認・管理できる)オーナーが一致しなくなるが、プライバシーはどう守るべきか。偏見なしで中立的な判断をしてくれるかのような人工知能に、人種差別的なバイアスが含まれるとしたら?などなど。

smartdrivemagazine.jp http://www.sekaiwoyakusu.com/entry/machineracismwww.sekaiwoyakusu.com

 また、チャットボットは「次に来る」イメージがわたしにはなかったため、取り上げられていたこと自体が意外でした。「なんとなく不自然な受け答えをして、結局正解にたどり着けないナニカ」という思い込みしかなかったので・・・。
 サービスを提供する企業にとってチャットボットは、スマホアプリやSNSの次の顧客チャネルという位置づけになっており、そこでのサービス展開が重要になってきているのだそうです。  

 チャットボットもそうですが、紹介されているテクノロジーの多くが、人工知能・ディープラーニングとともに語られているのも印象的でした。何らかの判定を行うための基幹技術としてディープラーニングが前提となっているのです。もはや、テクノロジーを成立させるための基盤技術なのですね。

 そんなディープラーニングを学び始めるのに適した本はたくさんあると思うのですが(ここから本題)、その中で異彩の放ち方が異彩すぎるのがコレ、『Excelでわかるディープラーニング超入門』。

Excelでわかるディープラーニング超入門

Excelでわかるディープラーニング超入門

 いやいや・・・。・・・いやいやいや! Excelでって!
 ってなりませんか?
 表紙でこんな風に煽ってきます。

難しい数学計算はExcelに任せて ディープラーニングのしくみを 動かしながら理解できる!

 「難しい数学計算」といいますか、本書は偏微分どころか行列もΣも出てきませんからね。ほぼ、加減乗除のみです。

 本書の目的は、数学やプログラミングの素養があまりない人が、「身近な」Excelを使ってディープラーニングを理解できるようになることです。なので、Excelの基本的な関数を丁寧に追っていけば、ディープラーニングが詰まるところ何をしているのか、がわかった気になります。重みづけとは、閾値は結局何なのか。どうやって文字を判定しているのか・・・。
 そして途中でExcelの限界につきあたり、その限界を畳み込みニューラルネットワークで一度超えて、「それでもやっぱりこれ以上は無理だよね」というところまで導いてくれる。それが本書。

 使う関数は、以下の通りです。特に難しいものはありません。

• SUM: 目的関数の計算
• SUMPRODUCT: 入力の線形和
• SUMXMY2: 平方誤差の検出
• EXP: シグモイド関数
• MAX: MAXプーリング、ReLU
• RAND: 初期値設定
• IF: 画像の判定

 3×4のビットパターンに対し、「〇」か「×」かを判定するアプローチは、こう*1

01

 ビットパターンをExcelの3×4マスを使って表現している・・・*2。 この発想、面白過ぎると思うんですよね。言われてみたらできそうな気はするけど、本当にやる?っていう。

 こちらが、入力層→隠れ層→出力層までを計算するExcelワークシート。

02

  • 隠れ層には3つのニューロンがあり、ビットパターン4×3セルに対応する重みづけの初期値がRAND関数で選ばれる。 閾値も同様で、ニューロン3つに対応して3つ設定されている。
  • 入力層のビットパターンと隠れ層の重みづけがSUMPRODUCTで掛け合わされたうえでシグモイド関数にかけられて、隠れ層の出力になる。
  • 隠れ層での出力と、出力層の重みづけ・閾値も同様に計算され、出力層の出力になる。
  • 誤差は、出力層の値と正解のゼロイチとの平方差分がとられる。
  • 各「画像」に対する判定結果に対する差分の和が、QT。

 最後に、上の絵でいう色塗りされたセル(最初にRAND関数でランダムに決めたもの)を変数とし、QTを最小化するようソルバーで計算させます*3
 これで確かに、「難しい数学計算はExcelに任せて」、最適なニューラルネットワークを求めることができました・・・・。

 Excelのサンプルワークシートがあるし、説明も冗長なくらい丁寧なので、Excelに慣れている人ならこの理解ルートは意外にたやすいのでは!?と思ってしまいます。ディープラーニングの本の数式に慄いてしまった方は、この道も考えてみてください!

*1:技術評論社の「サポートページ」に掲載された自習用Excelのキャプチャです。

*2:灰色セルには「1」が立っていて、計算に使われます。

*3:わたしのパソコンでは10秒ほどで計算が終わりました。