<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>きのこる庭 &#187; 連載企画</title>
	<atom:link href="http://kinokoru.jp/archives/category/%e9%80%a3%e8%bc%89%e4%bc%81%e7%94%bb/feed" rel="self" type="application/rss+xml" />
	<link>http://kinokoru.jp</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jan 2019 03:18:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>【Git入門者向け】イメージで理解するGitコマンド事始め</title>
		<link>http://kinokoru.jp/archives/1017</link>
		<comments>http://kinokoru.jp/archives/1017#comments</comments>
		<pubDate>Wed, 14 Jan 2015 10:00:56 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[連載企画]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1017</guid>
		<description><![CDATA[<p>ご無沙汰です。連載企画を書き進めると豪語しておきながら かなり経過してしまいました。連載企画の方は時間を見つけつつ少しずつ書き進めていければと思います、申し訳ございません。 さて、最近周囲の方にGitの解説をする機会が増 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1017">【Git入門者向け】イメージで理解するGitコマンド事始め</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>ご無沙汰です。連載企画を書き進めると豪語しておきながら かなり経過してしまいました。連載企画の方は時間を見つけつつ少しずつ書き進めていければと思います、申し訳ございません。<br />
さて、最近周囲の方にGitの解説をする機会が増えてきたため、今回は<strong>Gitの基本コマンドに関連する説明</strong>をします。</p>
<h2>対象読者</h2>
<p>・何らかの理由でGitを使う事になったが、コマンドが多くてよくわからない方。<br />
・コマンドごとの意味は何となく理解しているけど、イマイチピンと来ない方。<br />
(※「そもそも何故Gitを使う必要があるのか」「バージョン管理とは何か」といった点については ノンプログラマ向けの連載企画として後日記載させていただければ幸いです)</p>
<h2>解説するコマンド</h2>
<p><strong>git init, git add, git commit, git status, git log, git branch, git checkout, git merge, git clone, git pull, git push, git fetch</strong></p>
<p>他にも <strong>remote</strong>, <strong>cherry-pick</strong>, <strong>rebase</strong>, <strong>reset</strong> 等 色々ありますが 本記事ではまず 最もよく使うであろう上記コマンドに絞って解説します。<br />
<span id="more-1017"></span></p>
<h2>進め方</h2>
<p>何かを学ぶ上で 適切な比喩となるものを想起して イメージを持たせる事はとても大事だというのが個人的な考えです。<br />
ので、今回は Gitを「<strong>工場</strong>」に見立てて、一人の工場管理者を主体にお話を進めていければと思います。</p>
<p>それでは早速見ていくことにしましょう。</p>
<h2>1. 自社工場を建てる</h2>
<h3>git init: 自社工場を建てる</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_init1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_init1.jpg" alt="git_init" width="600" height="360" class="aligncenter size-full wp-image-1106" /></a></p>
<p>「git init」という呪文と共に 魔法の杖を一振りすると工場が現れました( 「どうみても爆破しているようにしか見えない」とか言わないで下さい )。</p>
<p>これで製品を開発するための環境が整いました(ただし工場の中身はまだ空っぽです)。この工場の下で 製品の開発を行います。</p>
<h3>git add: 開発・修正を行った点の届出</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_add1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_add1.png" alt="git_add" width="500" height="300" class="aligncenter size-full wp-image-1084" /></a></p>
<p>製品をつくる上で、工場ではどの部分を修正・追加・削除したかを届出する必要があります。これが git add にあたります。届出をしないと 出荷用の製品を工場内で登録する際に 変更分が登録されないので注意が必要です。</p>
<p>届出後の製品登録は 責任者であるコミットおじさんにお願いをします。コミットおじさんは git add で上がって来た変更分を出荷用製品として登録する役目を担います。</p>
<h3>git commit: 出荷用製品の登録</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_commit.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_commit.png" alt="git_commit" width="500" height="300" class="aligncenter size-full wp-image-1028" /></a></p>
<p>変更の届出も一通りできたので、今度はコミットおじさんにお願いをして 変更した製品を出荷用に登録します。<br />
これで 変更履歴が正式に工場に記録され、今後製品を自社工場から出荷する際は 変更分を加えた製品が出荷されることになります。</p>
<h3>git status: 現状の確認</h3>
<p>addによる届出忘れを確認したり、どこまで届出したかを確認したりするために使用します。</p>
<h3>git log: 製品を変更してきた履歴を見る</h3>
<p>これまで工場内でどういう製品の変更をしてきたかを問い合わせます。<br />
git logでは コミットおじさんに登録してもらった製品登録の履歴が残っており、各履歴には特有のIDがついています。<br />
これにより、「あ、ID番号○○の所まで戻したいのでよろしく」というような事が可能になります。</p>
<h2>2. 複数の製造ラインをつくる</h2>
<h3>製造ラインが一つの場合…</h3>
<p>工場内でロボットをつくる際、もしも製造ラインが一つの場合 何が起こるか確かめてみましょう。<br />
早速オーダーがきました。どうやら今回のオーダーはロボットに対して角と羽根をつくるオーダーのようです。実際に作り進めていきましょう。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/kowareru1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/kowareru1.png" alt="kowareru" width="500" height="300" class="aligncenter size-full wp-image-1101" /></a></p>
<p>「ぎゃー不具合がでた！」<br />
「一体羽根と角のどっちの変更でこうなっちゃったんだ？？」<br />
「と、とりあえず羽根を一旦元に戻そう」<br />
「ああ、これ羽根じゃなくて角をつくる時にいじった場所だった！」<br />
「もうこんがらがってわけがわからん！」</p>
<p>ということで、複数機能を同時に並行して開発する場合は 機能ごとに製造ラインを増やした方が良さそうです。そこで…</p>
<h3>git branch: 製造ラインを増やす・確認する</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_branch3.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_branch3.png" alt="git_branch" width="500" height="300" class="aligncenter size-full wp-image-1093" /></a></p>
<p><strong>「角」用の製造ライン<br />
「羽根」用の製造ライン</strong></p>
<p>二つを分ければ 不具合が出た時に どちらが原因か分かりやすいですね。</p>
<p>git branch では、現在いる製造ラインにおける製品をベースにして 別の製造ラインをつくります。<br />
git では、一般的には「<strong>master</strong>」という名前の製造ラインがデフォルトで使用されます。色々な製造ラインの分け方がありますが、一例を下に示しておきます。</p>
<p>1. master<br />
2. 角・羽根統合用の製造ライン ( masterからつくる )<br />
3. 角用の製造ライン<br />
4. 羽根用の製造ライン</p>
<p>2をつくるのは、角と羽根の製造ラインを再度がっちゃんこした際に問題が発生した場合、統合用の製造ラインがあると問題が発生した際のトラブルに対応しやすいためです。メインの製造ラインでいきなりがっちゃんこしてしまうと 後々問題が発生した際に面倒な事態に陥ったりすることがあります。</p>
<p>新しい製造ラインをつくる場合は「<strong>git branch 製造ラインの名前</strong>」を使用しますが、「<strong>git branch</strong>」のみを入力すると 現在の製造ラインの状況を確認することが可能です。</p>
<p>なお、製造ラインを分けた後の作業は、一つの製造ラインでしていた事と一緒で、基本的には開発作業 → add → commit のサイクルとなります。</p>
<h3>git checkout: 作業を行う製造ラインの移動</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_checkout4.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_checkout4.png" alt="git_checkout" width="500" height="300" class="aligncenter size-full wp-image-1097" /></a></p>
<p>僕達は人間なので、一般的に一度の時間で一つの作業にしか着手できません(言い換えれば、右手でタスクAを進めながら左手でタスクBを進めるようなことは一般的にできません)。</p>
<p>つまり、<strong>一度に一つの製造ラインにしかつけない</strong>事になります。<br />
ここで、製造ラインを分けた際、別の製造ラインに移動する方法が必要になります。</p>
<h3>git merge: 別の製造ラインの変更をがっちゃんこ</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_merge.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_merge.png" alt="git_merge" width="500" height="300" class="aligncenter size-full wp-image-1031" /></a></p>
<p>「角」も「羽根」もできたので、あとはくっつけるだけです。こういう時には git merge を使用します。git merge では、ある製造ラインの製品に別の製造ラインの製品をがっちゃんこすることができます。</p>
<h3>修正箇所が衝突した場合</h3>
<p>例えば、もし角がこんな感じで背中にくっついている…という仕様だった場合どうでしょう。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_conflict1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_conflict1.png" alt="git_conflict" width="500" height="300" class="aligncenter size-full wp-image-1099" /></a></p>
<p>角の部分と羽根の部分がもろ被りです。<br />
このままではがっちゃんこできない…こういう状態を「<strong>衝突(コンフリクト)</strong>」と言い、お互いの製造ラインが話し合いをしてうまくがっちゃんこできるようにすることを「<strong>衝突(コンフリクト)を解消する</strong>」と言ったりします。</p>
<p>コンフリクトの解消に関しては本記事の題意を越えてしまうため割愛させていただきます。</p>
<h2>3. 複数の支社間で連携する</h2>
<p>規模が大きくなってくると自社工場だけでは生産・開発のサイクルを回すのが難しくなってきます。<br />
そこで、いよいよ複数の工場を立てて連携する必要が出てきました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/environment1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/environment1.png" alt="environment" width="500" height="300" class="aligncenter size-full wp-image-1078" /></a></p>
<p>こんな感じで、異なる開発作業を支社ごとに分けて それぞれで 開発を進めて 本社で変更分を統合する形にしましょう。</p>
<h3>git clone: 本社から工場の環境をそのまま引っ張ってくる</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_clone1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_clone1.png" alt="git_clone" width="500" height="300" class="aligncenter size-full wp-image-1090" /></a></p>
<p>「git clone」という呪文を唱えると、clone元(この場合本社工場)の環境(製造ライン・製品)がそのまま再現された新たな工場が建ちます。<br />
git init では中身が空っぽの状態の工場が建ちましたが、これが git init と git clone との違いです。</p>
<p>引っ張ってきたら あとは個人で作業していた時と基本的には一緒です。<br />
建設した支社工場の中で製品の追加機能をいじったり 製造ラインをがっちゃんこしたりします。</p>
<h3>git pull: 本社の製造ラインから最新の製品を取り寄せがっちゃんこ</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_pull1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_pull1.png" alt="git_pull" width="500" height="300" class="aligncenter size-full wp-image-1075" /></a></p>
<p>本社の特定の製造ラインから最新の状態の製品を取り寄せます。さらにその上で自分の工場にある特定の同様の製造ラインの製品にがっちゃんこ(つまり merge)します。<br />
複数の工場で分担して作業をする場合、本社の一つの製造ラインに必ずしも一人だけしかつかないとは限りません。<br />
つまり、あなたが支社工場の特定の製造ライン(Aとしましょう)で作業している最中にも、誰か他のメンバーが本社工場の製造ラインAに最新の製品を登録しないとは限らないということです。<br />
そこで、基本的には 自分の工場で製品を開発した後は 一度 pull して本社の最新の状態の製品とがっちゃんこする必要があります( なお、この際も勿論 衝突が発生することがあります )。</p>
<p>なお、ただ闇雲にがっちゃんこするのではなく「どの機能をいつ開発したか」など順番を意識してがっちゃんこする際には git pullに加えて「<strong><code>--rebase</code></strong>」という重要なオプションがありますが、こちらでは本記事の範囲を超えてしまうため 触れるのみに留めておきます。</p>
<h3>git push: 本社の特定の製造ラインに 自社で開発した製品を出荷</h3>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/01/git_push1.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/01/git_push1.png" alt="git_push" width="500" height="300" class="aligncenter size-full wp-image-1076" /></a></p>
<p>git pushを行う事で自分の工場の特定の製造ラインでつくった出荷用製品を本社に送ります。基本的に、宛先となる工場の場所と製造ラインを指定して送ります。</p>
<h3>git fetch: 本社の製造ラインから最新の製品を取り寄せる</h3>
<p>本社から最新の状態の製品を取り寄せます。ただし、がっちゃんこはしません。( 言わば、<strong>git pullは fetch + merge を同時に行う</strong>コマンドということになります )</p>
<p>&#8212;</p>
<p>これで一通りコマンドの解説が終わりました。ここまで読んで下さりありがとうございました。間違っている点・アドバイスなどございましたらどしどしご指摘いただければ幸いです。よろしくお願いいたします。</p>
<p>最後に、それぞれの作業工程における比喩の意味を解説して本記事を終えたいと思います。</p>
<h2>比喩の意味</h2>
<h3>1. 自社工場を建てる</h3>
<p><strong>自分の開発環境でバージョン管理を始める</strong>こと。</p>
<h3>2. 複数の製造ラインをつくる</h3>
<p><strong>複数の機能を並行してつくる</strong>こと。実際、Webサービスを運用する場合、つくるものが同じ時期に1つの機能だけとは限りません。<br />
そういう時に、作業内容がこんがらがらないような仕組みが必要です。</p>
<h3>3. 複数の支社間で連携する</h3>
<p>これは<strong>実際のチーム開発</strong>に他なりません。<br />
開発メンバーは各自の開発環境で機能の開発を進めていき、自分の環境で機能がうまく動く状態をつくったらそれを一箇所に集めます。<br />
こうして複数のメンバがそれぞれ異なる開発をしても規律の取れた開発体制が実現できるようになります。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1017">【Git入門者向け】イメージで理解するGitコマンド事始め</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1017/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【ノンプログラマ向け】プログラマの仕事内容を理解する ～「テスト」という工程が必要な理由</title>
		<link>http://kinokoru.jp/archives/965</link>
		<comments>http://kinokoru.jp/archives/965#comments</comments>
		<pubDate>Sun, 16 Nov 2014 04:21:33 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[連載企画]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[プログラマ]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=965</guid>
		<description><![CDATA[<p>前書き 「一緒に働いている以上、プログラマのことを理解して仕事をしたい」そう考えている企画・ディレクションの方は経験則的に少なくない。 ノンプログラマから見て、プログラマの仕事はイメージが湧きづらく、何故その工程にそこま [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/965">【ノンプログラマ向け】プログラマの仕事内容を理解する ～「テスト」という工程が必要な理由</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<h2>前書き</h2>
<p>「一緒に働いている以上、プログラマのことを理解して仕事をしたい」そう考えている企画・ディレクションの方は経験則的に少なくない。<br />
ノンプログラマから見て、プログラマの仕事はイメージが湧きづらく、何故その工程にそこまでのコストをかける必要があるのかわからない事が多い。<br />
プログラマは作業の必要性を説明してくれるかもしれないけれど、専門用語も多いしイマイチピンとこなかったりする。</p>
<p>ここで重要なのはまさに「イメージ」だと思う。すなわちイメージを提供するための良質なメタファーだと思う。<strong>メタファーが良質であれば より直感的に理解できる</strong>。<br />
実際メタファーの力はバカにならない。「Chef」も「Jenkins」も それぞれ 統一的な世界観が学習者の直感的な理解を後押ししてくれる。</p>
<p>というわけで、今回から数回に分けて <strong>なるべく「技術的な話」をせずに</strong> イメージを想起しやすいストーリーを導入することで プログラマの具体的な仕事の内容についての説明を試みる。</p>
<h2>対象読者</h2>
<p><strong>・企画、ディレクター等 プログラマと直接コミュニケーションを取る機会の多い人達</strong><br />
<strong>・プログラミング初学者</strong></p>
<h2>現時点での執筆予定</h2>
<p>< 具体的な作業工程 ><br />
・「<strong>テスト</strong>」について (今回)<br />
・「<strong>アジャイル開発</strong>」について<br />
・「<strong>TDD(テスト駆動開発)</strong>」について<br />
・「<strong>バージョン管理(Git / SVN)</strong>」について<br />
・「<strong>CI(継続的インテグレーション)</strong>」について<br />
< スタンス・文化 ><br />
・「<strong>プログラマのスタンス／経営者のスタンス</strong>」の重要な違い<del>、ハッカー文化について</del><br />
・「<strong>プログラマがよく使用する用語</strong>」について<br />
・「<strong>自社で採用するべき言語</strong>」について(人事向け)<br />
・「<strong>炎上</strong>」について</p>
<p>※ ニーズにより目次は前後・変更する可能性があります。<br />
また、若干 宗教論争になりそうな所は テーマ・対象を厳密に熟考した上で できるだけ主観が入らないよう注意します。<br />
※ 最近は企画の方もGitをいじられるそうなので、そのうちGit詳解編もつくる予定です。<br />
(<strong>11/16 21:50 追記</strong>) ※ ↑ブコメにて「いわゆる&#8221;ハッカー文化&#8221;を語るのはWeb系に多く、他分野ではそうではない」という重要なコメントを頂きました。確かにWeb系を中心に考えすぎており他分野に対して盲目的でした。申し訳ございません。文化的な部分を語る際は 認識の誤りが無いよう、対象を限定するように注意いたします。<br />
(<strong>2015.04/09 追記</strong>) ※ 私都合により少々執筆の目処が立たないため シリーズとのたまったものの一時休止させていただいております、申し訳ございません。<br />
<span id="more-965"></span><br />
長くなりましたが、それではこれからテストをめぐるAくんのストーリーを見ていくことにします。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<h2>オープニング</h2>
<p>20XX年――― ある小さな町に A君 という若者がいました。<br />
A君は 自宅で自作のロボットを設計しては組み立てて売ることで 生計を立てていました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/11/robo11.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2014/11/robo11.jpg" alt="robo1" width="550" height="317" class="aligncenter size-full wp-image-973" /></a></p>
<p>最初は友達に小さなロボットを見せたりして、細々とロボットをつくっていたA君でしたが、<br />
次第にA君のつくったロボットの評判は町中に広がり、ロボットを買いに来てくれる人が多くなりました。</p>
<p>ロボットを買ってくれる人が多くなるにつれて、買ってくれる人から色々な意見を貰うようになりました。</p>
<p>「<strong>手足が動くようになればもっといい</strong>ね」<br />
「<strong>装飾としてアンテナをつけた方が格好良い</strong>と思う」</p>
<p>できるだけ多くの人を満足させたいA君は、貰った意見を基に ロボットに対して色々な機能をつけながらロボットの改善を重ねていきました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/11/robo2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2014/11/robo2.jpg" alt="robo2" width="550" height="317" class="aligncenter size-full wp-image-974" /></a></p>
<p>こうして、最初はシンプルだった ロボットには色んな機能がつきました。<br />
それでも買ってくれる人からの要求は絶えません。A君にとっては常に改善の日々です。</p>
<p>そんなある日、A君は あるお客さんからいただいたアドバイスを基に部品の追加をしようとした所…。<br />
部品を追加したい場所に、結構前につけた別の部品がくっついています。<br />
この部品がクセモノで、他の沢山の部品と接続されているため なかなか取り外しづらそうです…。</p>
<p>「困ったなあ・・・。でもお客さんの要望にこたえなきゃいけないしなあ」</p>
<p>暫く悩んだA君は、元々くっついていた部品を改造した上で 新しい部品をつけてみました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/11/robo3.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2014/11/robo3.jpg" alt="robo3" width="550" height="317" class="aligncenter size-full wp-image-975" /></a></p>
<p>「うん、何とか動きそう」</p>
<p>部品が動く事を確認したA君は さっそく追加した機能をお客さんに見せます。<br />
お客さんは非常に満足して、ロボットを買って帰っていきました。</p>
<p>数日後、A君のもとにぽつりぽつりとクレームが届き始めます。</p>
<p>「なんかアンテナのランプが光らなくなったんだけど・・・」</p>
<p>何ということでしょう。<br />
今回A君が追加した部品とは違う部分で問題が起きていました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/11/robo4.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2014/11/robo4.jpg" alt="robo4" width="550" height="317" class="aligncenter size-full wp-image-976" /></a></p>
<p>A君は 追加した部品が動くかどうかだけに気ををとられてアンテナのランプが光らなくなっていた事を見落としていたのです。<br />
(これは余談ですが、人間別の事に集中していると 他の事に対する注意力が落ちるものです。例えば「何回パスが渡されたか数えて下さい」と指示があり、バスケットの試合が映し出される動画(<a href="https://www.youtube.com/watch?v=vJG698U2Mvo" target="_blank">こちら</a>)があるのですが、皆パスの回数を数えるのに夢中になるあまり、途中でゴリラが乱入しても全く気が付きません。是非友達に試してみて下さい)</p>
<p>アンテナは 今回追加した部品と直接繋がってはいないものの 間接的に別の部品を経由して動いている部分でした。<br />
大切なお客さんに対して 不具合のあるロボットを渡してしまったことで A君はひどく落ち込んでしまいました。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<h2>そこで「テスト」の工程を導入</h2>
<p>これだけ複雑なロボットになってしまったわけなので、そろそろ 目視や何となく動くかチェックするだけでは先ほどのような抜け落ちが出てきてしまうことに気がついたA君は、ロボットをお客さんに出す前に「この部分の機能がちゃんと動いているかどうか」という項目を上げて かならずテスト作業をすることにしました。項目は以下のようなものです。</p>
<p><strong>「ボタンを押した時に 手足が正常に動くか」<br />
「胸元のランプを押した時に 胸元のランプが光るか」<br />
「ロボットの電源を起動した時に アンテナのランプが光るか」</strong></p>
<p>毎回 部品を追加した後にテスト工程を含めることで お客さんに新しいロボットを提供するスピードは以前より落ちてしまいましたが、これで 大きな不具合を出して沢山のお客さんを困らせてしまうことはなくなりました。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<h2>解説</h2>
<p><strong>・ロボット</strong><br />
Webアプリケーションやソフトウェアなどの「システム」そのものです。<br />
一般的に規模が大きくなるにつれて、お客さんの要求によってどんどん色んな機能がついていって構造が複雑になります(一見サービスとしてはシンプルなシステムに見えてもです)。</p>
<p><strong>・お客さん</strong><br />
企画の方や、顧客のことです。<br />
内部構造がいかに複雑で 機能の変更が難しいかは彼らには関係ありません。<br />
彼らは色んな要求をしてきますが、本当は何が欲しいのかを自分たち自身が気づいていないケースもあるため あらゆる要求を飲む事はせず しっかりとコミュニケーションをとることが大切です。</p>
<p><strong>・アンテナのランプが光らなくなった</strong><br />
開発現場ではこのように「既存機能に変更を加えた結果として 元々の部分に予期しない変更が起きる」ことを「<strong>デグレ(デグレード<del datetime="2014-11-17T09:39:57+00:00">・デグレーション</del>)</strong>」と言います。<br />
(例) 「●●の部分デグレってる」</p>
<p><strong>(11.17 追記)</strong> 「デグレーション」という言葉も一応存在するみたいですが、正しくは デグレード、またはデグラデーション(degradation) のようで、こちらの言葉が一般に使用されるみたいです。ブコメにてご指摘下さった方、ありがとうございます )</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>以上です。テストを導入することで確かにロボットを提供するスピードは少し落ちてしまいますが( とはいえ、実はテストを書いた方が 導入時こそ大変なものの後からスピードが速くなるのですが )、「テスト」という作業がどれだけ大切な作業かご理解いただけたら幸いです。</p>
<h2>「テスト作業」について</h2>
<p>ここからは ちょっと踏み込んだ部分になりますので、より詳細に技術者の仕事を理解したい！という有志のみご覧下さい。</p>
<h3>概要</h3>
<p>「●●をした時、●●という結果が返ってくるか」という形でテスト項目をつくっておき、機能の追加・修正が発生した段階で項目にしたがってテストを行います。</p>
<h3>種類</h3>
<p><strong>単体テスト・ユニットテスト</strong><br />
プログラマの作成したシステムの断片的な機能を、テスト用のコードを書いてテストします。<br />
部品を組み合わせる前に、その部品が本当に正常に動いているかを見るわけです。<br />
例) square関数(二乗のための関数) のテスト<br />
「数字 4 を渡した時に 16 という結果を返すか」<br />
「数字 0 を渡した時に 0 という結果を返すか」<br />
「数字 -5 を渡した時に 25 という結果を返すか」<br />
「文字列 を渡した時に エラー &#8220;数字を入力して下さい&#8221; を返すか」</p>
<p><strong>統合テスト(インテグレーションテスト)</strong><br />
システムについて、複数の機能をそれぞれ何人かで分けて開発している場合、どこかの時点で「部品を組み合わせる作業」が必要です。<br />
その際、個々の部品が不具合無くしっかり動いていたとしても、組み合わせた時点で不具合が発生しないとは限りません。<br />
そのため、部品がしっかり組み合わせられているかを保証するために 部品を組み合わせた状態でのテスト作業を行います。</p>
<p><strong>エンドツーエンドテスト(E2Eテスト/受け入れテスト)</strong><br />
単体テスト・ユニットテスト・統合テストは主に不具合が無いかを保証するための「プログラマ」寄りのテストでしたが、こちらのテストは技術的な話を抜きにして「追加・変更した仕様がしっかりと要望通りに動くか」をテストするためのものです。<br />
こちらのテストは 実際に要望を出す 企画・ディレクション の方がつくるのが一般的です(認識のずれによって間違った物を開発してしまわないためにも、企画の方は どんな要望なのかを間違いなくプログラマに伝える必要があります)。</p>
<p>例) ECサイトの購入確認ページ かごの中の商品を表示するようにシステムを変更した場合のテスト例(飽くまで一例。実際はもっとテスト項目が多いので注意)<br />
テスト1・単数条件<br />
「1. テスト用のURLに遷移し、『テスト本』を買い物かごに入れる<br />
　2. &#8220;購入&#8221;ボタンを押し、確認ページに遷移する<br />
　期待する結果: 確認ページに『テスト本』の情報が表示されている」</p>
<p>テスト2・複数条件<br />
「1. テスト用のURLに遷移し、『テスト本』『テスト本2』をそれぞれ買い物かごに入れる<br />
　2. &#8220;購入&#8221;ボタンを押し、確認ページに遷移する<br />
　期待する結果: 確認ページに『テスト本』『テスト本2』の情報がそれぞれ表示されている」</p>
<p>テスト3・購入する商品がない場合<br />
「1. テスト用のURLに遷移し、&#8221;購入&#8221;ボタンを押し、確認ページに遷移する<br />
　期待する結果: &#8220;かごの中に何も入っていません&#8221;と表示されている」</p>
<h3>そもそもテスト項目の結果が変わるような変更が起きた時は？</h3>
<p>テスト項目自体を変更します。<br />
これが「ユニットテストでどこまでの範囲をテストするのか」という問いにも繋がってきます。<br />
( 100%全てのシステムを網羅してテストコードを書いても、仕様変更の度にテストコードを沢山書き換えなければいけないようであれば コストがかかりますから )<br />
なので、ソースコード全体のうちどれくらいの範囲のテストを書くのか(<strong>「カバレッジ」ともいいます</strong>)は そのサービスの規模によって変化させるべきです。<br />
ただし、システムの規模が小規模であれ大規模であれ、コアな機能(その機能に不具合があればサービスが成り立たないような機能)に関しては必ずテストを行うべきです。<br />
スピードを大事にしすぎるあまり本当にテストが必要なコア機能すらしっかりテストしないとかそれサバンナでも同じ事言えんの？</p>
<h3>テストの方法</h3>
<p><strong>単体テスト、ユニットテスト、統合テスト の場合</strong><br />
テスト用の便利なフレームワークが世の中には沢山存在します( xUnit と呼ばれるものが有名です )。<br />
このフレームワークの規則に沿ってテスト用のコードを書くのが一般的です。<br />
元々テストを導入してこなかった場合: 急にテストを全て書くのは至難の業なので長い年月が必要になりますが、そのあたりは僕よりもテストに詳しい方が 昔からよく議論されている部分なのでそちらを参考に。</p>
<p><strong>エンドツーエンドテストの場合</strong><br />
意見が分かれる所だと思います。<br />
最近の技術体系だと E2Eテストですらソースコードで導入できるようになってきてはいますが、<br />
まだまだ Excelが多い印象です。<br />
理由としては、企画・ディレクション職のノンプログラマに E2Eテスト用のコードを書くための若干の学習コストを強いることになる点、部署をまたいだ組織的な取り決めのプロセスにコストがかかる点等が挙げられると思います。</p>
<h3>テストを導入することの難しさ</h3>
<p>(<strong>11/16 21:50 追記</strong>) ブコメにて貴重なコメントを頂きました。ありがとうございます。<br />
ここまでを見ると、「ああ、じゃあテストを導入すれば品質が上がるんだな」となりますが、テストの工数に関しても触れないわけにはいきません。<br />
テストは導入してしまえば終わりではなく、追加・変更にもそれなりのコストがかかります( 特に開発初期に関しては 導入にかなりの時間を要します )。そのコストは<strong>実際にテストを設計し、落とし込む作業が入るため、開発作業と同等のコスト・もしくはそれ以上の工数が発生する可能性を考慮しておく必要があります</strong>。<br />
( とはいえテストを導入しない場合は導入しない場合で、どのみち開発工程の多くの時間を 正体不明のバグの対応で埋めることになりますので、長期的に品質、不具合の規模・頻度、不具合対応の速さを考慮するのであれば テストの導入は不可欠となります )</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>以上です。<br />
ここまで読んで下さりありがとうございました。<br />
僕もまだまだひよっこなので、「ここ間違ってるよ」という部分がございましたら是非ご指摘・アドバイスいただければ幸いです！</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/965">【ノンプログラマ向け】プログラマの仕事内容を理解する ～「テスト」という工程が必要な理由</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/965/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
