<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>自転車とプログラミングと</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/" />
    <link rel="self" type="application/atom+xml" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/atom.xml" />
    <id>tag:el.jibun.atmarkit.co.jp,2019-03-18:/bicycleprograming//120</id>
    <updated>2016-04-28T00:45:56Z</updated>
    <subtitle>明らかに状況が変わってきている今日のプログラミングとは？</subtitle>

<entry>
    <title>増19．V字モデルと新人</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/08/19v-cb53.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4743</id>

    <published>2013-08-08T04:46:54Z</published>
    <updated>2016-04-28T00:45:56Z</updated>

    <summary>●今回の発端 　筆者は今まで誤解していたことが有りました。それは、V字モデル（引...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　筆者は今まで誤解していたことが有りました。それは、V字モデル（引用：<a href="http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB">http://ja.wikipedia.org/wiki/V%E3%83%A2%E3%83%87%E3%83%AB</a>）についてです。<br /><a href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2013/08/07/vmodelconcept3.png" onclick="window.open(this.href, '_blank', 'width=328,height=187,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img width="300" height="171" border="0" alt="Vmodelconcept3" title="Vmodelconcept3" src="http://el.jibun.atmarkit.co.jp/bicycleprograming/images/2013/08/07/vmodelconcept3.png" /></a>


</p>

<p>　誤解していたこととは、<strong>「V字モデルは『基本設計⇔システムテスト』が頂点だと思っていた」</strong>ことです。自分が誤解していたから言うわけではないですが、案外、この件については皆そのように思っているのではないかと思います。</p>

<p>●誤解に気付いたきっかけ</p>

<p>　誤解に気付いたきっかけは、仕事でプログラムの修正に関する合意文書をお客さまと作っていたときのことでした。筆者は意気込んでUML 2.0のアクティビティ図を書き、最も上位の概略から説明しようとしました。</p>

<p>　しかし、「このような内容は、お客さんの関心事ではない」とばっさり切られてしまいました。そして、代わりに模範例として提示されたのは、いくつかの<strong>散文的で網羅されていないルールのような記述</strong>でした。もちろんそれが「ビジネスルール」とか「業務知識」とかで括られる内容だというのはすぐ分かりましたが、納得はいきませんでした。</p>

<p>　その後、「そのような内容が最も根本的だとしたら、V字モデルの2つの上は『基本設計⇔システムテスト』では変ではないか」と思い、「しめしめ、これでコラムに書く内容ができた。タイトルはさしずめ『V字モデルの2つの上』だろう。もっと別の何かが2つの上に来なければおかしいではないか！！」「よく最終テストになってから、聞いても居ない指摘がごっそり入り、費用が嵩むのは、『基本設計⇔システムテスト』が頂点だと思い込んでいるからではないか！！&nbsp; これでコラムもう一本！！」とか思ったのですが、その直後Wikipediaの内容を見て、「早まったことをしなくて良かった」と思った次第です。</p>

<p>　『要求分析⇔受け入れテスト』がV字モデルの2つの頂点だとしたら、確かにお客さまとの合意文書でまず書くのは「ビジネスルール」とか「業務知識」とかで納得です。</p>

<p>●過去の経験を振り返って</p>

<p>　そう考えると、得心がいくことがありました。それは、初めて仕事に就いた新人の一部に共通した振る舞いです。</p>

<p>　筆者は受注ソフトのアプリケーションプログラマなので、もちろん最重要なものは「ビジネスルール」や「業務知識」です。ですから、新人にもそれを主に伝えることになります。しかし、すべての新人は判を押したように、それに対して「そんなことを聞きたいのではない！」「商用の現行システムなのだから、もっと基本的なことを教えるべきだ！」と、（ぼそっと）言って、こちらの言うことには耳を貸さないのが普通です。</p>

<p>　「ビジネスルール」や「業務知識」は、</p>

<ul><li>どんなに他の知識が普及したとしても、こればかりはオープンにならない（ただし、「こことここを足してここに書き込め」程度の内容の「決めごと」なので、秘密にしたとしても人類に対する不義理だというものではありません）。</li>

<li>少なからず、頭を下げて、気まずい思いをして得た知識であることも多い。</li>

<li>隠しておいた方が古株にとって有利であるようなことでも、「属人的にならないように」との覚悟で教えている。</li></ul>

<p>など、それらを新人のころに教えられるというのは、最高のもてなしで遇されたと解すべきものです。あーそれなのに、それなのに……。</p>

<p>　まぁ、そもそも、わけも分からずソフト開発に対して切磋琢磨せず、無目的に入ってきた大人の未経験者に何かアドバイスをして、ものになる人間ができると思う時点で傲慢（ごうまん）なのかもしれませんが、それにしても悔しい話です。</p>

<p>　その悔しい話ですが、それら新人も（筆者と同じように）V字モデルすなわち、システムの概略について、（筆者と同じような）誤解をしていたとしたら、たしかにつじつまが合います。要するに<strong>システムの頂点とは『基本設計⇔システムテスト』だと思い込んでいるとしたら</strong>、です。</p>

<p>　第一、普通の業務ソフトで、そんな目の覚めるような「基本設計」があると思うのが間違いです。DevOpsなどを持ち出すまでもなく、システムは運用をできるようにするのが大前提で、それゆえ、プログラムはまず同じタイミングで行われる複数の動作の渾然一体（こんぜんいったい）の塊です。プログラムを「システム」として見たいのなら、いちいちスライシングしないとまったく見えないでしょう。毎回毎回、そのようなないものをねだるのは、合法的にサボろうとしているようにしか見えないのは年のせいでしょうか？</p>

<p>まぁ、今回はこんな所です。</p>

<p>●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>ですので、このコラムで、 </p>

<ul><li>わたしは基本的にコメントに答えない </li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>とさせていただきます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>増18．ビッグデータによるプログラマの復権</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/05/18-e6a8.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4737</id>

    <published>2013-05-01T06:15:57Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●プログラマの日報 　昔は、「プログラマも日報を書いていたな」と、ふと思い出しま...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●プログラマの日報</p>

<p>　昔は、「プログラマも日報を書いていたな」と、ふと思い出しました。もちろん、いまでも「今日、何をやったか」というような日報は書いています。「何をやったか」は収支計算上のプロジェクト名だったり、工程名だったりします。それに対して、「プログラマの日報」は、もっと技術的な細かい内容を指します。</p>

<p>　ある時期から「書かなくてもよい」と指示されて日報を書かなくなったのですが、理由は以下のことだったのではないかと考えます。</p>

<ul><li>（特に初心者の）リーダーが技術的な細かい日報を見ても、「意味のないもの」「技術者の自己満足で、無駄」としか思えなかった</li>

<li>日報として提出されてしまうと、リーダーは対応を求められるが、とても対応できる数ではなかった</li>

<li>経験豊富な、管理職扱いの、今までの実績から収支に責任を持たない（多少の赤字を認められる）仕事をしても誰も文句を言わない、ぶっちゃけ暇な、技術系の人間がたくさんいてレビューしていたため、プログラマの日報のようなデータの蓄積はさほど必要なかった</li></ul>

<p>　しかし、今振り返ってみますと、以下のように考えられます。</p>

<ul><li>初心者のリーダーならそう思ったかもしれないが、同じ人が経験を経て、もう一度同じ内容を見たら、意味を見いだすに違いない（と筆者は考えます）</li>

<li>すべての提出物を同等に処理する必要はなく、直属の上司は「データを蓄積する」だけとし、別工程（テスト作成など）で使用する資料としての利用でもいいはず</li>

<li>「経験豊富な、管理職扱いの……」人間がいなくなっていて、彼らがやってくれていたこと（識者の経験による問題点の洗い出しという、現行の開発のやり方で当てにしきっている部分）がなくなってきている為、簡単に作れる資料なら必要</li></ul>

<p>●ビッグデータとインバリアント分析</p>

<p>　先日、雑誌を見ていると、「建造物などにセンサーをたくさん付けて、ビッグデータとして記録し、何か違いがあったら問題があるのではないかと疑う」という手法が書いてありました。筆者が「昔、日報を書いていた」ことを思い出したのも、その記事を読んで以下のように考えたからです。</p>

<ul><li>付ければ簡単に情報が取れるセンサーを作ることは、現在の技術では難しく、その情報に代わるものは「昔書いていた、技術的な日報」ではないか？</li>

<li>ビッグデータなら、資料のストレージとして最適でないか？</li>

<li>筆者が言う昔とは、「経験豊富な、管理職扱いの……」人間がまだあまりいなかったころのことで、（技術的な日報作成のような）その“昔”にやっていたことなら、これからの状況に合致するのではないか？</li></ul>

<p>●どうするか</p>

<p>　インバリアント（プログラムで、何が同じで何が違うか←今の技術でこれを認知できるのはプログラムを書いた当人か、そのプログラムを精査した経験豊富な人間のみ）を考慮に入れて、とにかくつぶやけばいいと思います。もちろんオンプレミスなシステムへのつぶやきでいいと思います（さすがにパブリックのソーシャルメディアにつぶやくのは行き過ぎです）。</p>

<ul><li>いままで同じ処理を50個書いたが、51個目と52個目と53個目で初めて、違う処理方法が必要だった。</li>

<li>今日、自分はこのようにすごいHACKをした。</li></ul>

<p>とかいちいち書くのです。</p>

<p>●なにが得なのか</p>

<p>　同じ処理なら何百個あろうと、テストは同じでいいと思います。しかし、何かが違う場合（例えばその処理にif文が1つかぶさるだけとか）でも、テストは格段に難しくなると思います。今までは、その困難さを経験豊かな技術者が陰から支援してくれていて、どこが問題なのかを指摘してくれるのは当たり前だと信じ切っていたと思います。しかし筆者の実感からして、間違いなくそのような素晴らしい世界はなくなってしまっていると思います。</p>

<p>　もちろん、このような細かい日報だと、とても見切れないものだとは思いますが、それはビッグデータの要約技術を使って、1つでも2つでもテストの方向付けとなる結果が得られるなら、素晴らしくない世界で1つの指針となると思います。</p>

<p>　また、筆者の経験から言って、「自分がその日寝る前に思い返して酔ってしまうような、すごいHACK」の過半数は改めて考えてみると、もっと単純な方法に書き直すべき内容だと気づくのが普通です。そのような細かい記録は、他人のためでもあると同時に、本人の振り返りにもなると思います。</p>

<p>　さらに、（いくら経っても具体的にどうやったらいいか書いておらず、もしやるとしてもどう考えてもプログラマに過度の負担がかかることが容易に予想される）テストファーストか、（昔、当たり前のようにやっていた）技術的な細かい日報かどちらか選べと言われたら、プログラマは大抵、後者を取ると思います。</p>

<p>　まぁ、今回はこんなところです。</p>

<p>●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>　ですので、このコラムで、 </p>

<p></p>

<ul><li>わたしは基本的にコメントに答えない</li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増17．ポストモダンとプログラム（断章）</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/03/17-0252.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4734</id>

    <published>2013-03-27T10:50:26Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　「パロール」と「ラング」（『増15補足.実行可能って』で言及）に...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　「パロール」と「ラング」（『増15補足.実行可能って』で言及）について調べていたら、この本を見つけました。『「知」の欺瞞―ポストモダン思想における科学の濫用』アラン・ソーカル ジャン・ブリクモン著 岩波現代文庫です。読んでみたらなかなか面白かったので紹介します。</p>

<p>●内容</p>

<p>　ポストモダニズム（「モダニズムを批判する文化上の運動のこと」 Wikipedia 日本語版「ポストモダン」の項より）で語られる主張において、比喩は簡単な言葉を用い、誰でも分かるようにしないとならないのに、分かりにくい物理学などの理論を比喩として用い、権威付けをしているのはおかしいのではないかという内容です。</p>

<p>●面白く感じた点</p>

<p>　このコラムでは、今に至るまでプログラマである筆者がプログラムについて持論を述べてきたのですが、（特に増15や16など）<strong>ポストモダンの指導原理と似てきたように思います（相対主義だとか）。</strong></p>

<p>　自分は一貫して理系で、高校のころエピステーメー叢書を2、3冊買って読んだ程度なのに、自然とそちらの方向に向かってしまうのは、もしかすると、ポストモダンと（“がりがり書く”狭義のでない、社会とのつながりも含めた）プログラミングに相通じる面があるからなのかもしれません。</p>

<p>　まぁ、今回はこんなところです。</p>

<p>●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>　ですので、このコラムで、</p>

<ul>
<li>わたしは基本的にコメントに答えない</li>
<li>コメントを書く人は、回答がない前提で議論を進めていただく</li>
</ul>
<p>とさせていただきます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>増16.プログラマが見た「かけ算の順序」</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/02/16-d4b7.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4730</id>

    <published>2013-02-04T03:51:12Z</published>
    <updated>2021-05-14T11:15:43Z</updated>

    <summary>●今回の発端 　先日、設計者と仕様について少々議論をしました。その際、「かけ算の...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　先日、設計者と仕様について少々議論をしました。その際、「かけ算の順序」（Wikipedia 日本語版「かけ算の順序問題」など）の問題が話題になりました。</p>

<p>　Wikipediaの説明では、「『6人のこどもに、1人4こずつみかんをあたえたい。みかんはいくつあればよいでしょうか』という設問に対する、6 × 4 = 24 という式と答えを不正解にすべきか」という話です。わりと、有名な話だと思います。</p>

<p>　もちろん、筆者がその問題の理非を問う資格とかはないですし、<strong>当コラムではそれについて一切述べません。</strong>そうではなく、自分たちの中で話題になったのは、「この問題の起こり方が、<strong>仕様書を介した設計者とプログラマの間の悶着（もんちゃく）の起こり方</strong>と瓜二つだ」という点です。</p>

<p>　このところ、連投気味ですが、これについて意見をご披露いたします。</p>

<p>●原因は</p>

<p>　今回の議論は、</p>

<ul><li>値の範囲を整数と指定された。</li>

<li>しかし、その「整数」とはどう考えても1以上の整数のことを言っているとしか思えない。</li></ul>

<p>というものです。それに対して、</p>

<ul><li>やっぱりこれは「自然数」であり、言っていることが変ではないか？</li></ul>

<p>という（出るべくして出た）反論が起きました。</p>

<p>　要するに、<strong>“数学の言葉を再定義している”</strong>のが原因です。そして、「かけ算の順序」も同じことが原因だと思います（「×」の再定義が原因だと思います）。</p>

<p>●「間違いである。以上！」では何が問題か？</p>

<p>　まだ、小学校の授業のやり方は柔軟な対応が可能で、「こちらのやり方がだめならあちら」というふうにできるかも知れませんが、IT分野の設計者の作る仕様の場合、そうもいかないことがあります。</p>

<p>　たとえば「NULL」という言葉ですが、</p>

<ul><li>RDBでいうNULLを表す（試験での正解はこれだと思います）</li>

<li>RDBでいうNULLまたは、空文字を表す（MSAccessなどで、テーブルを表示した場合、NULLが意図せず空文字に更新されてしまうことがあり、またテーブルをCSVを介して移動した場合にも、NULLが空文字になってしまう場合があるので、両方を同一視したい。VARCHAR2とかならこの問題はクリアされる）。</li>

<li>RDBでいうNULLまたは、空文字または、半角全角スペースのみの文字列を表す（画面などで、左記3つは同じに見えるため、それらは同一視したい）。</li></ul>

<p>というふうに、場合によって再定義<strong>しなければならない</strong>場合が頻繁に出ます。</p>

<p>　ここで「数学の言葉の再定義はあり得ない」とされてしまうと、設計者は動きが取れなくなりますし、プログラマも自由を奪われることになります。</p>

<p>●解法の自然な拡張なら……。</p>

<p>　これが「再定義」でなく、「解法の自然な拡張」なら何の問題もありません。</p>

<ul><li>応答日を考慮した、日付と月数の足し算。</li></ul>

<p>とか</p>

<ul><li>月末日を考慮した、日付と月数の足し算。（Oracleの“ADD_MONTHS 関数”のような）</li></ul>

<p>とかなら、単なる「＋」と共存できると思います。</p>

<p>ただ、そのためには</p>

<ul><li>名前を別の（もっと限定的な）ものにする</li></ul>

<p>とか</p>

<ul><li>引数の型で区別する</li></ul>

<p>とか複雑になります。プログラミングではもちろん常套手段としてやりますが、設計段階ではかえって分かりにくくなるので、やらないと思います。小学生に教える際にも同じような配慮がいるのかもしれません。</p>

<p>●プログラマの一員として</p>

<p>　プログラマの一員としては、</p>

<ul><li>自治の範囲で数学の言葉の再定義は認める。</li>

<li>その際、責任者はその再定義について十分な配慮をする。</li></ul>

<p>程度の落としどころにしていただけると、本当に助かります。ITをなりわいとしている他の人も、そうだと筆者は思います。</p>

<p>まぁ、今回はこんなところです。</p>

<p>●コラムのコメント欄の方針 </p>

<p>コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>ですので、このコラムで、 </p>

<p></p>

<ul><li>わたしは基本的にコメントに答えない </li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増15補足.実行可能って</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/01/15-393c.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4729</id>

    <published>2013-01-28T03:01:38Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　前回、『増15.逆問題の良さ』で、上流工程を「実行可能でない」、...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　前回、『<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2013/01/15-6662.html">増15.逆問題の良さ</a>』で、上流工程を「実行可能でない」、下流工程を「実行可能」と位置付けました。そして「実行可能でない」分だけ上流工程が俊敏であるとしました。どうもこの話は、「自転車とプログラミングと」というコラム全体に関わる問題のように思えてきました。それについて、少々説明します。</p>

<p>　なお、今回はこのコラムの以前の文書を多く参照しますので、</p>

<ul><li>“文参照〔回の番号〕”</li></ul>

<p>でそれを表すこととします（例：“「有用性の高いコメント」とは〔増15〕”）。</p>

<p>●確率関係と因果関係</p>

<p>　“「お客さんの話は確率関係に近く、それを因果関係に変換することにより、電算機システムとして実装可能になる」〔<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2012/07/post-89d4.html">増10</a>〕”としましたが、「実行可能でない」は「確率関係」に、「実行可能」は「因果関係」にそれぞれ相当すると思います。</p>

<p>　そして、“専門家でない限り「聞かないと分からない」というのもあります。プログラミングの文脈に応じた圧縮があまりに高効率である〔<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2010/10/post-a85e.html">3</a>〕”と書きました。それは「確率関係」より「因果関係」の方がどうしても微に入り細に入る関係上、後者は、見やすさを（悪い言い方ですが）ある程度ないがしろにしているためだと思います。</p>

<p>　そしてその圧縮方法として、「実行可能でない」が「“文脈自由〔<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2012/12/post-af03.html">増13補足</a>〕”」のに対し、「実行可能」は「文脈依存」であり、そのことにより圧縮を実現している、その代わり後者はその分、逐次読み進めていかないとわけが分からず、“結果（プログラム）が「一目見て分かる」ように直感的でない〔<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2010/10/post-3af9.html">2</a>〕”ようになってしまっていると思います。</p>

<p>　もちろん、見やすい方を扱う方（一目見て分かる方）が俊敏だと思います。</p>

<p>●文脈自由と文脈依存</p>

<p>　このコラムのそもそもの発端である、“「自転車などに乗っているときの『見方』の違い」〔<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2010/09/post-a694.html">1</a>〕”とプログラミングの類似ですが、</p>

<ul><li>クロスバイクのような早い自転車は歩行者にない「車線」という概念を利用して情報を圧縮していることで速く走る</li>

<li>プログラミングは設計段階にない「文脈依存」という概念を利用して情報を圧縮し「実行可能」としている</li></ul>

<p>と定式化できると思います。</p>

<p>　クロスバイクは速いですが、「曲がれない、止まれない、縁石を乗り越えられない」といった感じで、とても俊敏かというと違うと思います。「実行可能」というのもそれと似たようなものではないでしょうか？</p>

<p>●他に</p>

<p>　文系の方で歴史的にある概念の、「パロール」と「ラング」というのももしかすると、「実行可能でない」と「実行可能」と対応付くかも知れません。この件は知ったかですが、もしこれが成り立つとすると、プログラミングについて昔からある議論を援用できる可能性も出ます（本当に知ったかですが……）。</p>

<p>まぁ、今回はこんなところです。</p>

<p>●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>　ですので、このコラムで、 </p>

<p></p>

<ul><li>わたしは基本的にコメントに答えない</li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増15.逆問題の良さ</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/01/15-6662.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4728</id>

    <published>2013-01-21T11:30:42Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　前回、『増１４補足.分担してプログラムを作る』で、「逆問題」につ...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　前回、『増１４補足.分担してプログラムを作る』で、「逆問題」について（割と否定的に）言及しました。しかし、後から考えてみると、逆問題も有用ではないかと思えてきました。</p>

<p>　それについて、それについて少々説明します（なお、「1.→2.」などの記法は前回の通りです）。</p>

<p>●上流工程の人は<br />前回、</p>

<ol><li>お客さんは、「なになにを満たすすべて」がうまくいくことを要求。</li>

<li>上流工程の人は、それでは他人に伝わらないので、指示を出す形式（仕様書のような）に変換。</li></ol>

<p>とさらっと言いましたが、</p>

<ol><li>要求</li>

<li>仕様</li></ol>

<p>で、1.→2.のみの順問題を解くだけで仕様書が出来るとは考えづらいです。仕様を作るに当たって、ぶち当たった制限や、整理した結果得たひらめきなどから、1.←2.の逆問題も解いてお客さんの要求をリファインしているはずです。</p>

<p>　下流の人間に対しては、<strong>「（逆問題的なことにはかかわらず）言われたことだけやっていればいい」</strong>的な言い方しかされません。もちろん、別にそれはそれでいいのです。必要な「正しさ」を供給し続けてくれるなら。</p>

<p>　当然ですが、最後まで必要な正しさを供給してくれるなんてことはありません。ですから、下流の人間としても（表だってはしないとしても）裏で、ぶち当たった制限や、整理した結果得たひらめきなどから、2.←※3.の逆問題を解いて仕様をリファインし具申して、<strong>上流の人間の意欲が枯渇するのを少しでも遅らせる</strong>必要があります。</p>

<p>　※3：下流工程の人は、「その指示を満たす特定の」実装を作成（<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2013/01/post-af87.html">前回のコラム</a>参照）。</p>

<p>　心の中だけで逆問題を解くのに、それまで妨げることのできる人間はいないと思います。</p>

<p>●やっぱ、この逆問題最高じゃん！</p>

<p>　しかしながら、衷心から申しますが、<strong>プログラムを入力とし逆問題を解いて得た知識のみから、個別の設計を超えるスコープの問題について発言</strong>するのは、絶対にするべきではありません。</p>

<p>なぜなら、</p>

<ul><li>上流の人が1.→2.（時々1.←2.）の順問題（時々逆問題）で仕様を得るのと、下流の人が2.←3.の逆問題で仕様を得るのでは、労力に格段の差がつくため。もし10倍差が付くとすると、常時下流の人は9倍のただ働きを強いられることになり、絶対続かない。</li>

<li>仕様として同じ結果が得られるなら、設計のやり方で記述し結果を得る方が、プログラムのやり方で記述し結果を得るよりも、より俊敏である（ここで「設計」とは「実行可能でない設計」のことです。「実行可能な設計」はどう考えてもプログラム作成と同義です。「実行可能でない」分だけ「設計」が俊敏なのは当然です。UMLの規格で「定義されたポンチ絵としてのUML」を「実行可能により近いUML」に昇華させようとして、あまりに大変なことになったという例もあります）。</li>

<li>下流の人が2.←3.の逆問題を解いて仕様を得ても、その入力は“閉じた、発展しない”対象であるプログラムであり、「頭の固い技術者の考えそうな」仕様しか得られない（「実行可能」である為には、必然的に“閉じさせ、発展を止めさせる”必要があります）。</li></ul>

<p>という不利を背負い込むことになるからです。この分野では、下流の人間が「言われたことだけやっていればいい」とされるのは、至極もっともです（残念ですが）。</p>

<p>　以前、『<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2011/10/2-beeb.html">増 2．デスマ考</a>』で、</p>

<ol start="5"><li>その内、「権限がない中で仕様に介入する」ことが常態化し、安定的にデスマが発生する。権限がないので、営業の無理な発注にも対抗できない。</li>

<li>プログラムは「閉じた発展しない」ものなので、実情に合わなくなってくる。</li></ol>

<p>と書いたのは、このことです。</p>

<p>●ではどうしましょう？</p>

<p>　プログラムのコメントの有用性を高めるのに<strong>「逆問題」という概念は使える</strong>と思います。そして有用性の高いコメントは他のプログラマに対しても、他工程に対しても、有利な結果をもたらすと思います。</p>

<p>ここでおれおれ定義です。</p>

<ul><li>「有用性の高いコメント」とは、そのプログラムの（コメントの対象となる）部分について逆問題を解く時、助けになるコメントのこと。</li>

<li>なお、ここで「助け」とは、より楽により正確にそれが解けること。</li></ul>

<p>とします。</p>

<p>その「有用性の高いコメント」の作り方ですが、</p>

<ol><li>プログラムを作る、今作ったプログラムを直す、前に（自分／他人が）作ったプログラムを直す</li>

<li>それをしたらすぐ、今したコーディングについて逆問題を解く。つまり、今作ったロジックを入力とし、その仕様を考える。</li>

<li>それをコメントに書く（考えたすべてでなく、後で助けになる程度に簡略化する方が望ましい）。</li></ol>

<p>です。1を代入したロジックのコメントとして、「1を代入」ではなく、「初期値である1を代入」とか「こういう意味を持つ1を代入」とか書けば、より有用性が上がりますが、後2つを得るためには、どうしても逆問題を解く必要が有ります。</p>

<p>　しかし、今まさに作ったロジックの逆問題を解くことは、<strong>後で解くより圧倒的に有利</strong>だと思います。それをロジックを入力する度にやるのです。これなら、上流の人にも「余計なこと」だと言われないと思います（心の中だけの問題なので、文句の言いようがない）。</p>

<p>　まぁ、今回はこんなところです。</p>

<p>●コラムのコメント欄の方針 <br />コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>ですので、このコラムで、 <br />　・わたしは基本的にコメントに答えない <br />　・コメントを書く人は、回答がない前提で議論を進めていただく <br />とさせていただきます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>増14補足.分担してプログラムを作る</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2013/01/post-af87.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2013:/bicycleprograming//120.4727</id>

    <published>2013-01-07T10:12:30Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　前々回、『増14．“テストファースト”と言われて』で、 一人でプ...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　前々回、『<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2012/10/post-d753.html">増14．“テストファースト”と言われて</a>』で、</p>

<ul><li>
一人でプログラムを作成する場合</li></ul>

<p>
と、</p>

<ul><li>
複数人で分担して作成する場合</li></ul>

<p>
を対比して提示しましたが、その（筆者の中での）背景の説明がなされていませんでした。年をまたぎましたが、それについて少々説明します。</p>

<p>
●役割分担</p>

<p>　複数人で分担してプログラム（システム）を作る場合、<strong>全員が同じ仕事をするわけではありません。</strong></p>

<ol><li>
お客さんは、「なになにを満たすすべて」がうまくいくことを要求。</li>

<li>
上流工程の人は、それでは他人に伝わらないので、指示を出す形式（仕様書のような）に変換。</li>

<li>
下流工程の人は、「その指示を満たす特定の」実装を作成。</li>

<li>
テスト工程の人は、「その指示から正解値を実装と独立して得、その通りか調べる」。</li></ol>
<p>ことになると思います。</p>

<p>　大抵、上流工程以上での議論は企業秘密、それに対し、下流工程での議論は世の中にこれほどのことは類例を見ないというほどオープンで、インターネット上でいろいろな知識が得られると思います（ただ、実際、下流工程で作成されたアプリケーションソフトの結果は、上流工程以上での情報を含んでいるので、どうしても秘密になります）。</p>

<p>　実は、上流工程以上と下流工程は、うまくかみ合っていません。オブジェクトモデルと、リレーションモデルのミスマッチなんて屁でもないほどかみ合っていないです。設計書などで、何でこんなことを思いついたのか、下流工程の人間にはさっぱり分かりません（逆に、かみ合っているならば、とっくにプログラムの自動生成が可能だったはず）。</p>

<p>　かみ合っていないので、下流工程の人間は「気を利かせる」ことができない、下流工程の人間は自発的に「何が正しいか」を思い付くことができない、という状態になります。</p>

<p>　もちろん、「なになにを満たすすべて」を知っていれば思いつきますが、それは企業秘密です（オープン化全盛の時代、そちらまでオープンにすれば済むじゃないかとも言えますが、さすがにそこをオープンにしてしまうと儲けのネタが無くなり、ITの会社にも発注してもらえなくなるので、さすがにそれは<strong>永久に無理</strong>だと思います）。</p>

<p>　ですので、少人数（しかも、上流工程以上に携わっている人間の数の方が少ない）の場合、上流工程の人がくたびれて、緊張が途切れた途端、急激に不具合が発生することがよくあります。</p>

<p>
●権限と逆問題</p>

<p>　1.←→2.、2.←→3.は順問題、逆問題の関係にあるかも知れません。1.→2.より1.←2が、2.→3.より2.←3.が困難だということになります。プログラムを読み解いて仕様を作成するというのはできなくはありませんが、逆問題であり、困難なので普通はしません。特に、ITに関する費用が昔のようにじゃぼじゃぼ出なくなった今日では、したくてもできない問題です。</p>

<p>　もちろん時間をかければ（＝お金をかければ）プログラミング分野の逆問題は、人間わざとして解けます（レガシープログラムの保守なんてそればかりでした（笑））。ただ最近はお金がないので、原則として2.→3.の流れにするのが普通です。</p>

<p>　ここで、1つ、このコラムの前段落で言ったことと矛盾があるのではと思われるかも知れません。</p>

<ul><li>
下流工程の人間は「気を利かせる」ことができない、下流工程の人間は自発的に「何が正しいか」を思いつくことが出来ない</li></ul>

<p>
と言ったはずなのに、</p>

<ul><li>
（2.←3.の様な）逆問題は、人間わざとして解ける</li></ul>

<p>
というのは矛盾ではないかということです。</p>

<p>　それに、絡むキーワードが「権限」です。現在普通に行われているプログラム（システム）作成のプロセスでは、「文書」を作って承認を得るのが普通です。それに反して、苦労して「2.←3.」を解いても、（たとえ1字1句違わぬ大正解を導き出していたとしても）<strong>それは「正しい」ことではありません。</strong>大規模（複数人で分担して作る）の場合、「権限」を顕わにして「逆問題」を廃するのが、ソフトウェア工学の進歩の流れだと筆者は解釈しています。</p>

<p>
●そして、始めに作るテスト</p>

<p>　ここまで書いていて思ったのですが、仕事でプログラミングをしている人間の危惧は、</p>

<ul><li>
テストファーストで「いつでも動かせるテストを作る」ことは、「権限」、「文書」にそわずプログラムを作成し、その結果、テストを作った以外の人間にそのテストを読み解かせる「逆問題」を強いる</li></ul>

<p>　結果になる（のでは）という点ではないかと思えてきました（このことは今、思いついたので、『増14．“テストファースト”と言われて』には書いていません。念のため）。</p>

<p>　これは困ります！</p>

<p>　この点から言っても、</p>

<ul><li>
本当に“テストファースト”を望むのなら設計者、それもアーキテクトクラスの設計者に言うべき</li></ul>

<p>
というのは正しいと思います。なお、ここで「上級の設計者に言え」と言ったのは、普通の設計者はビジネスルールの維持で手一杯で、さらなる技術的な要素の追加まで背負うことは不可能だろうからという、一種テクニカルな問題に過ぎません（上流工程の人間がくたびれると、前述の通り下流の人間も困るのです）。他意はありませんでした。</p>

<p>　そうした上で、テストファーストも、「権限」に沿い「逆問題」を避ける方向でやっていただくならば、幸甚至極です。</p>

<p>　まぁ、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針</p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
ですので、このコラムで、 </p>

<p></p>

<ul><li>わたしは基本的にコメントに答えない</li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>
とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増13補足．「慌てろ」といわれても……</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/12/post-af03.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4726</id>

    <published>2012-12-17T04:00:36Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　「増13．『プログラミングのメンタルモデル』についての一考察」で...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　「<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2012/10/post-9ec7.html">増13．『プログラミングのメンタルモデル』についての一考察</a>」で、「プログラミングは慌てないとできないのではないか？」と書きました。それなりに時間を置いて見てみても、筆者はそれが正しいと思っています。</p>

<p>　しかしながら、言葉足らずだったことは否めないとも思うようになりました。ですので、補足をしたいと思います。自分にとっての「プログラミング時の定言命法」ともいえるものを紹介します。つまり、「慌てるとはいえ、取りあえず習慣的に行っている規則のようなもの」です。もちろん、事務計算の応用プログラマの言っていることですので、その背景や限界はお察しください。</p>

<ul><li>
n個を目指せ</li></ul>

<ul><li>
あえて計算を軽んじ、制御を重んじよ</li></ul>

<p>
●1個でも2個でもなく</p>

<p>　事務計算の応用プログラムは、</p>

<ul><li>
扱う量が多い（100万件なんて少ない方、もちろん今はやりのbigdataなんかと比べれば小さい）</li></ul>

<ul><li>
個々のレコードは均一（というより、均一でないとやっていられなかったので、無理にでも均一にしたというのが現状）</li></ul>

<p>
です。</p>

<p>　1個でも2個でも100個でも1000個でも2GBに収まる個数でもなく、n個を目指す必要があります。</p>

<p>　n個を目指す具体的なやり方としては、レコードの集まり（レコードセットとかデータテーブルとかいわれているようなもの）を文脈自由言語と見なし、それを受理できる（最小の）ロジックを書く方法があります（文脈自由言語はn個を扱うのに適しています）。具体的には「前処理→主処理（終わるまで繰り返す）→後処理」です。もちろん入力が1個や2個の場合、あまりにオーバースキル的なロジックになってしまいますが、そこは大は小を兼ねるです。</p>

<p>　さらに、n個を目指すためには、逆に記憶領域（一時、永続問わず）に持つ状態は定数個になるようにする必要があります。ここを「可変」個にすると、その物理的な限界によりパンクするからです。</p>

<p>
●もっと制御を！</p>

<p>　もう1つの規則ですが、</p>

<ul><li>たとえその計算が作ろうとしているシステム全体の99.9999％を占めるものだとしても、あえて軽んじて脇に寄せ、その計算を滑らかに呼び出すためのロジック（制御ロジック）を重んじて正面に出す。</li></ul>

<p>という意味です。</p>

<p>　これも、計算対象が1回や2回の場合、オーバースキルになりますが、たとえ本番実行が1回2回とはいえ、テストはその回数では済まないわけで、決して“オーバー”ではないと思います。さらに「脇に寄せる」ということは、関数化やインスタンス化にもつながり、形式的に軽んじているだけで、決して“脇に寄せる＝心の底から軽んじる”ではありません。</p>

<p>　さらに、制御を重んじることは、処理にシミュレーション的な要素がある場合、非常に重要になります。一般にレコードの集まりは事実を表します。事実のみから事実でないこと（未来の予測とか）を創り出すのは非常に困難で、どうしても「前処理→主処理（終わるまで繰り返す）→後処理」のループ処理が必要となります。シミュレーション的な要素がない場合でも、あると思ってプログラミングをすると、（虚数まで考えると見通しが良くなるように）見通しが良くなる場合が多々あります。</p>

<p>
●この規則の使える範囲</p>

<p>　バッチ処理なら使えると思います。もちろんそれだけでなく、Webブラウザ上のJavaScriptの複雑な処理でも結局同様の規則で済んだこともありました。もちろんSelect文のSumやMinなどの集計一発で済む場合に「前処理→主処理（終わるまで繰り返す）→後処理」を持ち出されては鼻白まれるかも知れませんが、何度も言いますが<strong>大は小を兼ねるの考え方をすると、慌てているときの一種のワンパターンとして支えになる</strong>と、筆者は強く信じます。</p>

<p>　まぁ、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
ですので、このコラムで、 </p>

<p></p>

<ul><li>わたしは基本的にコメントに答えない </li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>
とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増14．“テストファースト”と言われて</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/10/post-d753.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4724</id>

    <published>2012-10-29T03:32:56Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　筆者は直接は言われたことはありませんが、別の所で仕事をしている人...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　筆者は直接は言われたことはありませんが、別の所で仕事をしている人などは、「テストファースト」でプログラムを作るのが良いと言われたことがあるそうです（その人は「緑の文字」と言われただけで嫌そうな顔をしていました）。Webの記事などでも見かけます。</p>

<p>　<strong>もちろん、人間の価値観で軽重の無いプログラムの成果を、<span style="color: #ff0000;">人間の価値観に引き込む</span></strong><strong>唯一といっていい方法がテストです。テストは必要です。</strong></p>

<p>　しかしながら、“仕事で分担して作業しているプログラマに直接”“「テストファースト」をしろ”と、言われると、まるで「労せず実務上の権限をごっそり奪取しよう」としているように聞こえます。多分、周りの人が手をこまねいていると本当に奪取されるかもしれません。</p>

<p>　なぜ、良いことのはずが、こんなにひどいことになるのか？ その辺りを描写したいと思います。</p>

<p>
●背景説明</p>

<p>　学生のプロジェクトなどで、</p>

<ul><li>
自分一人でやっている</li></ul>

<ul><li>デザイン担当はいるが、ノリでそれを改変しても問題なし、むしろ意欲があってよろしい</li></ul>

<p>
という環境なら「テストファースト」は非常に良いかもしれません。究極の少人数で手掛かりもないところに、それが見つかるのですから、悪いはずがありません。</p>

<p>　ただし、仕事でプログラミングをしている場合、</p>

<ul><li>
大枠を誰かが作る（誰が作るかは割と自由で、そこそこ書けるようになった新人の場合もあれば、ベテランの場合もあります）</li></ul>

<ul><li>
個別の機能を誰かが作りつつ、必要な共通機能を誰かが作る</li></ul>

<p>ということになると思います（複数人数で個別の機能を作ってもばらばらになるだけです）。ここで問題なのは、<strong>どこがファーストか？ </strong>ということです。上記の例では「大枠を作る」のがファーストに見えますが、ほぼ中身は作らないので、テストしようがありません。しかしながら、テストしがいのある個別の機能に着手できるころには、勝手なテストソースを混ぜ込むだけの余地は残っていなくなります。</p>
<p><strong>　できるタイミングが無いのに、</strong>指示を出すことは無責任であり、無責任な人間に対して周りの人間が手をこまねいていることは、社会の成員として不誠実です。もちろん、相当の金額を投資して、対価をもって権限を得た場合でしたら別ですが、その場合の金額は家計レベルでなく、事業レベル（2桁は高い）となると思います。</p>

<p>
●さらに説明</p>

<p>　さらにそもそも、プログラミングはファーストではありません。その前に、設計があります。そして、その設計内容は「ノリで改変する」ことあたわざるものです。</p>

<p>　もちろん設計は（アニメでいう動画と原画の原画に当たる）大まかな物で、（動画に相当するものの担当の）プログラマも質問したり、すりあわせをしたりしてコミュニケーションを取る必要がありますが、その際、設計者に対して意見をしたりする知見の元は、<strong>実際にやってみた実体験</strong>です。少なくとも１度は実体験をしないと、<strong>前々から準備してきた設計者を揺り動かすだけ</strong>の知見は得られません。</p>

<p>　（自分の置かれた制限の中で闇雲に何かをやる）実体験がファーストだと思います。何もやらずに手を動かさずに設計者の意図とは独立してテスト内容を「ファースト」で思い付くのは人智を超えていると思います。</p>

<p>
●本当に“テストファースト”を望むのなら</p>

<p>　本当に“テストファースト”を望むのなら設計者、それもアーキテクトクラスの設計者に言うべきだと思います。<strong>そここそがまさに「ファースト」です。</strong></p>

<p>　VBなど「任意の箇所で任意の資源にアクセスできて当然」みたいな作りのシステム（作りやすい代わりに、確定的なテストをするためには、すべて画面から手で打ち込まないと×）を、設計段階からもう少し“不自由”にしてもらって（MVCパターンとか）切れ目を利用してテストしやすくするなど、できたら最高ですが、そのような全体の決定は高位の設計者の役割です。<br />
プログラミングの段階で個別のプログラマに、そのような決定を強いるのは、間違いなく<strong>権限の簒奪</strong>です。</p>

<p>　まぁ、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針</p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
ですので、このコラムで、 <br />
　・わたしは基本的にコメントに答えない <br />
　・コメントを書く人は、回答がない前提で議論を進めていただく <br />
とさせていただきます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>増13．「プログラミングのメンタルモデル」についての一考察</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/10/post-9ec7.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4723</id>

    <published>2012-10-09T04:56:43Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　某スラッシュドットで前に「プログラマは誰もがなれるものではない？...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　某スラッシュドットで前に「プログラマは誰もがなれるものではない？」という記事があり、「メンタルモデルを一貫して適用できる能力」が重要だとありました（本当はもっと原典がありますが、ぱっと見て分かる解説付きなので、こちらを参照しました）。</p>

<p>　そこでは「実際のメンタルモデルとは何なのか」は書かれていませんでしたが、そのメンタルモデル（と思われる）の1例を思いつきましたので、披露致します。なお、メンタルモデルについては、筆者は複合的に絡み合った一筋縄ではいかないものだと考えています。なぜなら、「一筋縄でいく」ような簡単なものなら「銀の弾丸はない」などと難しく考えなくてもいいからです。しかし「銀の弾丸」うんぬんは正しそうに思えます。故に一筋縄ではいかないと思います（あくまで一考察です）。</p>

<p>
●「慌てるな！」</p>

<p>　自分が仕事をしていて、本番データの扱い（本番VSSのアナライズ）でうまくいかず、見かねたリーダーに「慌てるな！」と言われてしまいました。</p>

<p>　本番運用で「慌てるな！」と言うのはまったく正当なことです。「すみません」と謝って、落ち着いて最初からやり直したのですが、その際、ひらめきました。</p>

<ul><li>
（確かに本番運用や、機器設置・インストールなんかでは「慌てるな！」が正解なのは事実ですが）<strong>プログラミングは「慌てないとできない」</strong>のではないか？</li></ul>

<p>
です。</p>

<p>　それは、（本番運用などではなく）プログラミングフェイズで筆者が「慌てるな！」と言われるたびに、妙な違和感を覚えたからです。自分としてはノリノリで普通に作業していただけです。別にアナライズのコマンドを（本番データベースに対して）何回も何回も試行錯誤で間違えていた（ようなフォールトがあった）わけではありません。</p>

<p>　プログラマ職からリーダー職が分離されて少なくとも10年は経っていると思いますが、リーダーのありふれたアドバイスである「慌てるな！」で、逆にプログラマが育った試しはないと思います。それどころかデモリッションマンよろしく、新人がプログラマに育つのを1つ1つ着実につぶしている感さえあります。</p>

<p>　彼ら新人がプログラムをできないのは「慌てて」いるからではなく、<strong>「慌てが足りない」から</strong>だとしたら、着実なプログラマ取り壊し効果も理解できます。外国人しかプログラムが作れなくなって、将来、そのレアスキルを買うお金がなくなった暁には困るように思います。（まじで思います）</p>

<p>
●「慌てる」のおれおれ定義とその適用</p>

<p>　久しぶりのおれおれ定義です。</p>

<p>　「慌てる」とは</p>

<ul><li>
事の軽重を考えず、やみくもに（何かを）やること</li></ul>

<p>
とします。それほど違和感のある定義でもないと思います。</p>

<p>　そうすると、何でプログラミングでは「慌てないとできない」のかの実態が見えてきます。プログラミングの世界の住人たるオブジェクトたちは、「別のエスニック」と言っていいほど、人間やほ乳類や鳥類などとかけ離れていると筆者は認識していますが、その違いの1つに、</p>

<ul><li>
1つ1つのオブジェクトは人間の価値観で軽重がない</li></ul>

<p>ことが挙げられます。</p>

<p>　キーAのみを軸とするオブジェクトも、キーAとキーBを軸とするオブジェクトも、プログラマにとっては等価です。どちらが価値が高く、どちらがより“有意義”かなどプログラマには考えようもありません（「プログラミングをきちんとする手段としてのテスト」というのに筆者が疑問を持っているのも、その理由です。価値観を持ち得ない立場の人間が、なんでテストを主導的に考えられるのか不思議でなりません）。</p>

<p>　もちろん、少数の指導的価値観（『データを先に決めてロジックはその後、ロジック次第でデータを直すのはあり』とか、『入出力をおさえるのは大切』とか）はあると思いますが、少数だし、少しでもプログラミングにかかわった人間には一目瞭然です。</p>

<p>　プログラマのプログラミング行為のフェイズで、事の軽重など分かりません。やみくもと思われるようにひたすらやっていくだけです。そこでプログラミングの手法のはやり廃りはあれ、どんな時代にもはやりがあり、はやりはなくならないのも、それだと思います。“やみくも”の中でも第一にまずやることの全体的了解があれば、間違いのない光明です。</p>

<p>
●さらに考えるなら</p>

<p>　さらに考えるなら、このプログラマの窮状は人間によって仕組まれた可能性があります。それは、</p>

<ul><li>
プログラマ職からリーダー職が分離された際に、人間の価値観で軽重がある部分はプログラマの範疇でないとされた</li></ul>

<p>ことです。これは事実だと思います。</p>

<p>　プログラマは「慌てる」ことについて仕組まれている可能性があります。この難しさがあるため、プログラマは日本で衰退していっているのかもしれません。その中で他のエスニックと仲良くなり、思いを果たしていくには、<strong>「慌てる」ことを恐れない</strong>ことが必要かもしれません（もちろんこれは、プログラマを志すならであって、みんなにプログラマをすすめているのではないことは、強い口調で併せて申し上げます）。</p>

<p>
まぁ、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針</p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>　ですので、このコラムで、 </p>

<ul><li>わたしは基本的にコメントに答えない </li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>
とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増12．「人月の『実』話」について</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/09/post-90ca.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4722</id>

    <published>2012-09-10T04:14:58Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　いにしえのブルックスより現在に至るまで、ソフトウェア開発に対する...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　いにしえのブルックスより現在に至るまで、ソフトウェア開発に対する報酬は人月単位で払われています。</p>

<p>　成果に基付く報酬など、別案もありますが、かちんとして受け付けられません。</p>

<p>　１つ理由みたいなものを思い付きましたので、披露致します。</p>

<p>
●頭としっぽ</p>

<p>　また、アンビバレントな話です。</p>

<ul><li>
ソフトウェアは簡単である。</li></ul>

<ul><li>
ソフトウェアは学んでも尽きないほど高度である。</li></ul>

<p>　どちらも正しく聞こえます。そうすると、例によってまた、隠れた構造があることが予測されます。</p>

<p>　筆者は、それが「束構造」ではないかと思いました（図は、束 (代数学) wikipedia 日本語より）。</p>

<p><a onclick="window.open(this.href, '_blank', 'width=193,height=195,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false" href="http://el.jibun.atmarkit.co.jp/photos/uncategorized/2012/09/08/lattice_of_partitions_of_an_order_4.png"><img width="300" height="303" border="0" src="http://el.jibun.atmarkit.co.jp/bicycleprograming/images/2012/09/08/lattice_of_partitions_of_an_order_4.png" title="Lattice_of_partitions_of_an_order_4" alt="Lattice_of_partitions_of_an_order_4" /></a>


</p>

<p>　つまり、ソフトウェアは<strong>“要求は簡単で、作っている最中は難しく、できたら簡単になる”</strong>と考えると、上記のつじつまが合うということです（もちろん上流工程の要求も、下流と実情は同じで“できたら簡単になる”のだと思います。<u>上流工程の要求は常に簡単だといっているわけでは</u><strong>ありません</strong>）。</p>

<p>
●成果に基付く報酬なんてとんでもない！</p>

<p>　これ以降、上記の構造が妥当だとして話を進めます。</p>

<p>　要するに、成果物で推し量られると、やっていけないほど損になるのです。どうしても成果物で量ることをされると、多分作る側は半製品を完成品だとして納品することになると思います。</p>

<p>　人間の根源的・部族的感情からしても、できた簡単な成果物より、途中までの難しい成果物の方に価値があり、学術的にも優れているように見えると思います。筆者も職業的立場から離れてみるなら、そうだと思わざるを得ません。</p>
<p><strong>　しかーしっ！！！</strong>それはどう考えても「技術的負債」以外の何者でもありません。</p>

<p>
●（突然ですが）資格審査報告</p>

<p>　この次の段で、ある侮蔑的な言葉を言いますが、筆者は言っても問題ないだろうことを示すエピソードを述べます。</p>

<p>　筆者は前に、汎用機のデータをRDBに変換するプログラムを作ったことがあります。その際の条件として、</p>

<ul><li>
VSAMのマスタは読むだけ</li></ul>

<ul><li>
特定のVOL=SERで中間ファイルは作り放題</li></ul>

<ul><li>
もう、その汎用機はあまり使っていないので、SUBMITもし放題</li></ul>

<p>
で、結局、2本マッチング、3本マッチングをぐちゃぐちゃに織り交ぜて、何とかRDBの世代データにすることができました。</p>

<p>　その際、つい同僚にその言葉を言ったのですが、同じフロアに居た別の会社の人が、ものすごい形相でにらんできました。しかしながら次の日、（多分筆者の作ったソースを見たのだと思いますが）「まぁ、おまえなら言ってもいいや」とかぼそっと言ってくれました。</p>

<p>　もちろん、これで万事とは言いませんが他社さんの（ある意味）ピアレビューとして、取りあえずこの場で、その侮蔑的な言葉を言うだけの根拠にはなると思います（その人は名前も存じ上げませんし、その後もお会いしたことはありませんが、この場で感謝したいと思います。）</p>

<p>
●コボラーとはなんだったのか</p>

<p>　あーあ、言っちゃった（笑）</p>

<p>　しかしながら、このコボラーという侮蔑も、「束構造」で考えると見通しが良くなります。そしてもちろんかなりの部分が不当なものだと反論できるようになります。</p>

<p>
●コボラーに対する典型的な非難</p>

<p>　思いつく限りでも、</p>

<ol><li>
コピペである。ソースを表か何かのように画一的に作る</li>

<li>
変数を階層的に長く作る</li>

<li>
部品化しない</li></ol>

<p>　とかありますが、すべてネタは同じです。それは<strong>コボラー側には「難しい作っている最中」の状態を割り当て、非難する側は「簡単なできた」状態を割り当てている</strong>ということです。上図を見ていただくと分かりますが、プログラミングが（当コラムの仮定により正しいとした）「束構造」であるならば、1．も2．も最適中の最適ですし、部品化とは出来てからが部品化で、作っている最中に部品化言われても「なんのこっちゃ」です。</p>

<p>
●もう1つ、別の話ですが</p>

<p>　不案内な分野なので、ご案内にとどめますが、ソフトウェアの「見積もり」というのも、「簡単な要求」から「難しいものを作っている最中」を推し量るものだと整理できるのではと思います。もしそうなら（筆者はそうだと思っていますが）確かに大変な仕事だと思います。</p>

<p>
まぁ、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>　ですので、このコラムで、 </p>

<ul><li>わたしは基本的にコメントに答えない</li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく </li></ul>

<p>
とさせていただきます。</p>

<p></p>]]>
        
    </content>
</entry>

<entry>
    <title>増11．技術的負債について</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/07/post-8f3e.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4721</id>

    <published>2012-07-30T03:15:31Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　保守や旧システムを見本にした類似機能を作るときには、どうしても現...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　保守や旧システムを見本にした類似機能を作るときには、どうしても現ソースの技術的負債について考えざるを得ません。</p>

<p>
　もちろん、あまりに負荷が高すぎて、否応なく負債を残すことはあると思いますが、どう見てもそれだけではありません。</p>

<p>
　その平時の負債発生のメカニズムについて、考えたいと思います。</p>

<p>
●技術的負債とは</p>

<p>　Wikipediaの「技術的負債」の項目には、例として、「組織で共有されない知識や、複雑すぎて変更が難しいコードなど」とあります。ここでは、プログラムの保守作業などの時点で、後の人が困ること一般を考えます。</p>

<p>
●どこで起きるのか</p>

<p>　テーブルなどではあまり起きないと思います。それは、</p>

<ul><li>
縦横か、せいぜいキューブ程度の構造なので、そもそも起きにくい。</li></ul>

<ul><li>
テーブルで技術的負債的なことが起きたら、関係者全員に耐え難い問題を引き起こす。だから負債を負債のままにしておけない。</li></ul>

<ul><li>
必ず使うアクセスメソッド的なプログラムで補償が可能。</li></ul>

<p>
だからだと思います。</p>

<p>　どこで起きるのかというと、間違いなく第一義的にプログラムでだと思います。マジックナンバーとはよくいわれますが、ここでの問題は「マジックロジック」といっていいと思います。</p>

<p>
●何が起きるのか</p>

<p>　
保守や旧システムを見本にした類似機能を作っていて思うのは、プログラムにおける技術的負債は、プログラムの難読化と通じるものがあるのでは、ということです。</p>

<p>　MS　MSDNのVisual　Studio　2008の資料で、バンドルされている難読化ツールについての文書には、</p>

<ul><li>
名前の変更（名前を、通常、1 文字に短縮）</li></ul>

<ul><li>
文字列の暗号化（特定の文字列を検索して戦略的なロジックを探し出すことの回避）</li></ul>

<ul><li>
制御フローの難読化（スパゲッティのように複雑にからみ合うロジック）</li></ul>

<ul><li>
拡張オーバーロード誘導（メソッド名およびフィールド名の重複性を高める）</li></ul>

<p>
とあります。1つめの「名前の変更」は最近ではさすがに悪い例として回避されていることはあるとしても、間違いなく、筆者が「技術的負債」で「マジックロジック」だと感じている点と合致します（注：もちろんこれは「技術的負債」の一例であり、これ以外にもいろいろあると思います）。</p>

<p>
●なぜ起きるのか</p>

<p>　
これについては筆者は目算があります。</p>

<ul><li>
「文字列の暗号化」はマジックナンバーを回避しようとして、定数一覧をただ1カ所に決めて定義したのはいいけれど、大量の定数ができてしまい、その定数の変数名の命名方法が実情に追いつけなくなる。大量なのでリネームも無理な場合、それは<strong>かえってマジックナンバーに近くなってしまう</strong></li></ul>

<ul><li>
制御フローの難読化と拡張オーバーロード誘導を行うと、<strong>ソースを修正・追記する際に、Diffツールで判別しやすいように修正することを奨励され、</strong>その結果、プログラムがバランスの悪い入れ子になってしまう</li></ul>

<p>ためです。</p>

<p>
　この内、2つめの「文字列の暗号化」は、個々のプログラマではどうすることもできない問題ですが（“ただ1か所”という規約を無視して、サブ機能ローカルの定数一覧を作ってしまうことも、実際行われては居ますが、もし品質管理の監査が入った場合、ただでは済まなくなると思います）、制御フローの難読化と拡張オーバーロード誘導はプログラマで何とかしうる、実際に作譜しているプログラマにしかなんとかできない問題だと思います。</p>

<p>
●なぜ起きるのを止められないのか</p>

<p>　これは、実際に作譜しているプログラマが、<strong>プログラムは難しい</strong>と思い込んでいるからだと思います。難しいと思い込んでいたら、実際の譜面もそれに引きずられて難しくなるのは道理です。</p>

<p>　プログラムなんて簡単もいいところなのですよ。筆者は、就職する前から一応（Tiny Pascalでありましたが）プログラムはできていましたので、逆に1週間もしない内に、「どう考えてもプログラム以外の要素（なにが正しいのかとか全体のアーキテクチャとか何とか）があって、プログラムなんて全体から見ると<strong>微々たる</strong>ものだ」と気付いたりもしました。社会に出てからプログラムを学ぶとそれに気付くチャンスが失われるのかも知れません（気付いたときには、もう職業上致命的な言説を吐いていて、来世に期待するしかなくなっているような……）。</p>

<p>
●起きるのを止める手立てはないのか</p>

<p>　これは、「他人の目」だと思います。自分はプログラマで、他人から仕様をもらいテスト担当者に引き渡す役割ですが、技術的負債が有るプログラムを渡すと、テスト担当者の態度が一変します。<strong>ぎちぎちの遵法闘争を始めるのです</strong>（これはプログラマの感想であり、特定の組織の効果・効能を表すものではありません）。</p>

<p>
　（特にブラックボックスをテストの基本としている所はそうですが）テスト担当者は、プログラムの内部について意見できません。できないのは確かですが、彼らも内々ではソースについてもしっかり理解しているはずです。</p>

<p>　意見できないため、その代わりにねちねち言ってきて、プログラマに反省を促しているのだと思いますが、実際に作譜したプログラマとテスト担当者は直接接することはないのが普通なので、そんな反省が生まれるはずもありません。</p>

<p>
　しかしながら、ここは1つ、テスト担当者を「他人の目」として認知した上、彼らの態度に注意し、<strong>自主的に</strong>技術的負債を除いていく必要があります。</p>

<p>
●自分一人で、起きるのを止める手立てはないのか</p>

<p>　よっぽど簡単なプログラムならともかく、難しく煮詰まってくると、プログラマには個人個人に「信念」が芽生えてきます。そしてそれはその当時の自分にはまったく分かりません（空気のように、魚の水のように）。</p>

<p>
　SFで脳梁を切断して、脳の効率をアップさせるなんて話もありますが、その位でもしない限り、自分1人では止められないと思います。</p>

<p>
　まぁ、今回はこんな所です。</p>

<p>
●コラムのコメント欄の方針</p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
　ですので、このコラムで、 </p>

<ul><li>わたしは基本的にコメントに答えない</li>

<li>コメントを書く人は、回答がない前提で議論を進めていただく <br />
とさせていただきます。</li></ul>]]>
        
    </content>
</entry>

<entry>
    <title>増10．確率関係と因果関係と（断章）</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/07/post-89d4.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4720</id>

    <published>2012-07-03T02:46:09Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　仕事中に、某ブックマークを見ていたら、AI分野で、チューリング賞...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p>●今回の発端</p>

<p>　仕事中に、某ブックマークを見ていたら、AI分野で、チューリング賞を取ったすごい人（後世の人に肩を貸す“GIANT”に擬せられている程）の書いた、「統計的因果推論：モデル・推論・推測」Judea Pearl著 共立出版について、記事がありました。読んでみると、なかなかなので紹介します。</p>

<p>
●良かった点</p>

<p>
　筆者は、</p>

<ul><li>「お客さんの話は確率関係に近く、それを因果関係に変換することにより、電算機システムとして実装可能になる」という方向で応用できるのでは？</li></ul>

<p>
と思いました。</p>

<p>
●「わたしも、伝えたいことがある」</p>

<p>　大規模開発の際によく、</p>

<ul><li>
本当はきちんとやらないといけないのかもしれないけれど、大規模開発だからきちんと追ってはいけない。</li></ul>

<p>
と言われたり、</p>

<ul><li>
統計的に不具合の有無を推定。</li></ul>

<p>
されたりします。</p>

<p>
　しかし、ソフトウェアは人間が主幹となって作るものであるため、</p>

<ul><li>
因果構造が（統計的に何とかできる範囲を超えた）不均一となる。そればかりか、もし何らかの均一さができてしまった場合、少々不利でもわざと不均一を選好することすらある。</li></ul>

<ul><li>
（結局の所、根が単純な）人間が満足しさえすればOKなので、因果グラフの深さはそれほど深くならない。</li></ul>

<p>
とか直感的に考えました。</p>

<p>
　事実として、<strong>統計的にソフトウェアを管理しても、当てずっぽ以下の成果しか得られないこともある</strong>のは、上記2点が原因ではないか！！！</p>

<p>
　とか、かの本にインスパイアされて思ったりもしました。</p>

<p>
　短いですが、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針 </p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
ですので、このコラムで、 </p>

<p>
　・わたしは基本的にコメントに答えない <br />
　・コメントを書く人は、回答がない前提で議論を進めていただく </p>

<p>とさせていただきます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>増9．「インターフェイスの使用」について</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/05/post-6418.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4719</id>

    <published>2012-05-06T08:53:00Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　以前、TDDについていろいろ言いましたが、なぜこのような概念が生...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p><strong>●今回の発端</strong></p>

<p>　以前、TDDについていろいろ言いましたが、なぜこのような概念が生まれたのか考えるようになりました。すこし、文書になるぐらいになったので、公開します。</p>

<p>
<strong>●インターフェイスの問題点</strong></p>

<p>　インターフェイスは、かなり自由度があります。</p>

<ul><li>
メソッドがいくつかある。呼び方についての制限の記述方法は（どんな言語でも）ない。</li>

<li>メソッドのパラメータは大抵、普通の数字や文字列である。範囲指定された型はあい。（VB、.NETなどはString型が「NotInheritable」で、部分範囲型のようなものが作れない）</li></ul>

<p>
　そのためか、まとわりついて離れない“不吉なにおい”があります。いかにも失敗しそうな自由度です。</p>

<p><strong>
●インターフェイスのさらなる問題点</strong></p>

<p>　メソッドのパラメータとしてのコード設計方法には、大きく2つのやり方があると思います。</p>

<ul><li>
オブジェクトローカルのコード（内部の処理の都合のみで決めた）を用いる。オブジェクトの利用者が、呼ぶ度いちいちグローバルコード⇔ローカルコードの変換をする</li>

<li>グローバルのコードを用いる</li></ul>

<p>　前者の場合、オブジェクトの設計の側からすると、

</p>

<ul><li>
コード1～コードm。以上。</li></ul>

<p>
ですが、後者の場合、</p>

<ul><li>
コード1～コードn　＋　名状しがたいそれ以外。</li></ul>

<p>
となります。オブジェクトの設計者からすると、グローバルコードがなにとなにを取るかは、まったくわからず、ましてや将来にいたって分かるはずもありません。
さらに、その「名状しがたいそれ以外」は、</p>

<ul><li>
オブジェクトの現状のロジックで対応可能。</li>

<li>オブジェクトの現状のロジックで対応不能。</li></ul>

<p>
の２つに分かれます。</p>

<p>
パラメタのコードの設計については、RDBの作法に端を発し、グローバルなコードを圧倒的に選ぶであろう今日、たまさか「現状のロジックで対応可能」な部分があるため、伝統的な「assert（実行中にテストし、不合格の場合無条件に異常終了する）」は適用しがたく、その代わりに<strong>「これこれはテストしましたが、名状しがたい部分はテストしてませんよ！」</strong>ということを、プログラム内に記述するTDDを思いついたのだと思いました。</p>

<p>
<strong>●利用者の問題／保守担当者の問題／初心者の問題</strong></p>

<p>　そうはいっても、今まで実績のある入力のみでオブジェクトを使おうとしない、<strong>わがままな利用者が、TDDによるテストの記述を尊重してくれるとは到底</strong>思えません。</p>

<p>　また、グローバルコードのコードの拡張について、通知を得られない立場の人間が、オブジェクトを保守しようとするのもあまりに無理があると思います。<strong>グローバルなコードの保守責任は、オブジェクトの利用者側</strong>とすべきです。</p>

<p>　さらに、TDDに沿ってテストを書くと、仕様を意識することになり、初心者にとって有意義だという点も、それを「腹の底から理解しないと記述できない、別の言語である、自然言語」でなく、「同じ言語なので、うわべだけ理解していれば記述可能な、プログラム言語」で書くという事が、本当に教育的なのか<strong>心の底から</strong>疑問です。</p>

<p>
<strong>●別案</strong></p>

<p>　どこでもグローバルなコードを使う事はあきらめ、</p>

<ul><li>
共通で使うオブジェクトでは、オブジェクトローカルのコードを使う。</li>

<li>それを使う側は、自システムのどこかに（基底クラスやFriendクラス）「インターフェイスの使用」メソッド群を作る。そこで、グローバル⇔オブジェクトローカルコードの変換をする。</li>

<li>オブジェクトを直に使う事は禁止、「インターフェイスの使用」を使う事で間接的に利用する。</li></ul>

<p>
というのはどうでしょうか？　「インターフェイス」だけを概念上の実体とするのでなく、「インターフェイスの使用」も実体とするのです。実体の数が増えるのですから、当然制御できる範囲も増え、“不吉なにおい”を押さえ込む助けになると思います。</p>

<p>
　まぁ、今回はこんなところです。</p>

<p>
●コラムのコメント欄の方針 <br />
コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
ですので、このコラムで、 <br />
　・わたしは基本的にコメントに答えない <br />
　・コメントを書く人は、回答がない前提で議論を進めていただく <br />
とさせていただきます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>増8屋上屋．加速度考</title>
    <link rel="alternate" type="text/html" href="https://el.jibun.atmarkit.co.jp/bicycleprograming/2012/04/8-fb9d.html" />
    <id>tag:el.jibun.atmarkit.co.jp,2012:/bicycleprograming//120.4717</id>

    <published>2012-04-02T05:33:26Z</published>
    <updated>2016-04-28T00:45:55Z</updated>

    <summary>●今回の発端 　今回の話は、前回の「増8．プログラマの困難について」を前提として...</summary>
    <author>
        <name>くわぢ</name>
        
    </author>
    
        <category term="スキル" />
    
    
    <content type="html" xml:lang="ja" xml:base="https://el.jibun.atmarkit.co.jp/bicycleprograming/">
        <![CDATA[<p><strong>●今回の発端</strong></p>

<p>　今回の話は、前回の「<a href="http://el.jibun.atmarkit.co.jp/bicycleprograming/2012/03/post-1ed6.html">増8．プログラマの困難について</a>」を前提としています。ですので、その前提が崩れてしまえば、この話も崩れる理屈です。そういう前提で読んでみてください。</p>

<p>
<strong>●加速度その1</strong></p>

<p>　以前から述べていますが、自然現象や、交通などの現象に比べてみると、人間が行う動作の加速度は、比べものにならないほど高いです。時間は短く、力も少ないですが、その代わり、他では類を見ない加速度を日常で生み出します。</p>

<p>　特に異性に対して気を引こうとする際の動作は、特別に強い加速度を持っています。手をひらひらさせたりして、それを見るのがいやで目をそむけると執拗に追ってきたりするなど、私にとっては非常に苦痛です。</p><p>
　前回、「きちんと見る人間＝リア充」だと書きましたが、このような理屈がありました。「リア充」という言葉の誤用・拡大解釈というつもりではなく、両者に通底したなにかがあるのでは、という意図です。このような強度の加速度にさらされていながら普通に対応できるのは、異性を「きちんと見」ているからではないでしょうか。</p>

<p>
　とはいっても、筆者のように、加速度に悪慣れしてしまった人間には、プログラミングの初学者がどう対処すればいいか、とうてい分かりません。それについては各自、良い方法を見つけていただくしか無いと思います。</p>

<p>　さらに、ただ1人黙々とプログラミングをする場合は別ですが、仕事の場合、「加速度禁止」とするのは現実的ではありません。それゆえ、プログラミングに特化したプログラマの他に、プログラミング的な要素を抑える代わり、他人と長くコミュニケーションを取り続ける、リーダー的存在が必要なのも必然だと思います。</p>

<p>　ただ、どうも最近のリーダーは、うすうすプログラマが加速度に弱いことを知り、彼らを服従させるために加速度を利用しているとしか思えない節があります。配下の人間の思考を鈍らせれば、御しやすくなるからです。</p>

<p>　自分の非力さ、生産性の限度を考えると、それはいけないことだと言い切れない面もあります。最終的な結果責任を負ったリーダーが最終的結論に異を唱えさせないために、そのようなプログラマの生態を利用するのも（個人としての自分は非常に腹が立ちますが）プロジェクト遂行を考えると、ありとせざるを得ないと思います。</p>

<p>
　問題はその後です。リーダーは、何年かするともう少し上の地位に就くはずです。それは、「自分で結果責任を負う」のでなく、リーダーを配下に置き「部下に結果責任を任せる」立場になると思います。その時、今までのように、加速度などを使って、配下がいやがることをして服従させようとすると、まずいことになります。それは、自分の責任が自分1人で頑張ればできる範囲を超えているからです。</p>

<p>　ペンを回したり、ノック式ペンをかちゃかちゃさせたりするのは、なにからなにまで仕事を引き取って<strong>「最終的に自分がすべてできる」場合</strong>のみ許されることで、そうならなくなった時点でそれはまずい話になります。</p>

<p>　また、そういう人間に限って「（机に）壁を作るな」とか余計なことを言いますが、人間が日常的に強い加速度を生み出すのは仕方がないことで、それを少し遮るだけで生産性が上がるのなら、それをとがめるべきではありません。</p>

<p>
<strong>●加速度その2</strong></p>

<p>　「きちんと見」ない場合の、加速度というのは、目から見えるものとは限りません。特にプログラミング初学者の場合、別の加速度により強いストレスを感じるはずです。</p>

<p>　それは、<strong>「思考の速度の変化が生み出す加速度」</strong>です。まさにSFだと思われるかもしれませんが、筆者は自信をもって「あり」だと思います。</p>

<p>　実際の経験ですが、</p>

<ul><li>
なにかプログラムについて学んでいる時、</li></ul>

<ul><li>
さらに何かすごいことを考えようとし、</li></ul>

<ul><li>
さらに何かすごいことを考えようとした時</li></ul>

<p>
脳みそがバチッといって（実際は肩の筋がいったのだと思いますが、実感としては「脳みそ」でした）すごく疲れ、すぐ横になっても残ったままでした。</p>

<p>
　その時は自室で1人でしたし、カーテンを引いた薄暗い部屋で、外は夕暮れでカラスが寝どこへ帰る様な、のどかなようでした。加速度など見えませんでした。そう感じたのです。</p>

<p>
　プログラミングは即興性を要求されるものではなく、積み重ねができます。また、（構造化など）積み重ねがしやすいよう、研究がなされています。さらに、知識を増やしていけば、思考の速度一定でより多くの事柄について考察できるようになります。焦らずに着実に学ぶべきです。</p>
<p>
<strong>●最近の「手法」</strong></p>

<p>　「上流」「下流」とか言われ、「下流」の人間が下に置かれているのは歴史的事実だと思います。しかし「下流」の人間から見て、（実際はともかく）たてまえ・理念・使命感としては、「上流」の人間が大多数の加速度分（開発における困難）を背負おうとしていたのも事実だと思います。</p>

<p>　ひるがえって、アジャイルやTDDなどの最近の手法ははじめから、単価の安い人間に大多数の加速度分に関する責任を転嫁する気まんまんに見えます。手法の改良も結構ですが、「机に鉛筆を立て、その上に鉛筆を立てている」状態で、「さらに鉛筆を立てようと」している様に見えます。前回の改良（行程を分ける）は（個人的にはともかく、業界全体としては）ありとしても、今回の改良はすでに、限界をまたいでいる様に見えます。</p>
<p>
　まぁ、今回はこんなところです。</p>

<p>
<strong>●コラムのコメント欄の方針 </strong></p>

<p>　コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。</p>

<p>
　ですので、このコラムで、 <br />
　・わたしは基本的にコメントに答えない <br />
　・コメントを書く人は、回答がない前提で議論を進めていただく <br />
とさせていただきます。</p>]]>
        
    </content>
</entry>

</feed>
