logo
Home

人間がバグのない ソフトウェアを 作ることは 不可能である

Y Combinatorをやってきて気づいた驚くことの1つに、最も野心的なスタートアップのアイデアの多くがいかに怖いものかということがある。. 人間は間違いを犯す生き物であるから、バグのないプログラムなどというものを作ることは不可能だ。 しかし、そう思ってあきらめてしまうのは. バグがないか試してみる、というのは不可能です。 バグがある可能性がゼロであることを証明することはできないので、 限りなくゼロに近いことを証明するために、時間をかけて、 たっぷりとバグチェックをおこないます。 さて、プログラマが. 「この期間に間に合わせるためにはどれだけ人が必要ですか?」 人を増やせば一度に沢山の機能が作れるという誤解は、どれだけ経ってもなくなりません。ソフトウェア開発は、畑を耕すように一斉に人が動けば同時進行できるような単純な労働ではないことを認めなければいけません。 ソフトウェアを設計し、それをプログラミングで表現するという行為をしたことがなければ、このことを理解することは難しいのかもしれません。ソフトウェアの開発をビルやダムを作るのと同じだと思っているのではないでしょうか。 ソフトウェア開発において、設計書通りに構築するという工程にあたるのはコンピュータのコンパイルやビルドに相当する部分です。ソフトウェアがどのように動けば良いのかを記した設計書とはソースコードのことで、プログラミングこそが設計です。 性能の良いコンピュータを使えば、コンパイルやビルドの時間は短縮出来るかもしれませんが、ただ人を増やせば高い生産性が出せる訳ではありません。 ソフトウェア開発において、もっとも一人当たりの生産性が高くなるのは、1人で開発をしている時です。コミュニケーションはコストだからです。人数を増やしていけばコミュニケーションにかかるコストが増していきます。そして、同時にそのコミュニケーションを管理していくための人が必要になり、それもコストになります。 実際に生産的な活動が出来る人間を3人いたとして、その3人をまとめる人間が必要になり4人となって、4人の意思疎通にかかるコストは、一人当たりの生産活動を二分の一以下に阻害するイメージがあります。テーブルに2人しかいない時と、4人いるときに、一人当たりの発言時間が同じだとしたら、4人のテーブルは共有するのに時間はかかるのは自明です。 人数が増えれば増えるほど、調整にかかる時間が増えていくことで、長い期間が必要になってきます。本当はリリースまでの期間が大事ならば、人を増やしてはいけません。. 「始める前にざっくりで良いんで見積もり出来ますか?」 ソフトウェアの見積もりは本当に難しい。 どんなライブラリが使えるのか、どんな問題で詰まってしまうのか、共通化していくコストはどれくらいかかるのか、人によって生産性は違うし、人の数が増えれば増えるほどコミュニケーションコストの係数も見えなくなってしまいます。 それでも見積もりをしたいというならば、やはり仕様や根拠が必要になるはずです。もしビルを建てるといったときに、設計もしないで見積もりをするというのは不可能ではないでしょうか。 ソフトウェアの場合、本当に正しい見積もりをしようとするならば、ビルの設計書にあたるものとして、どうやって作っていくかという設計書、つまりソースコードが必要となります。ソースコードを作らなければ見積もりが出来ないけれども、その時点であれば既に見積もりの意味がなくなってしまっているという齟齬がおこります。 ソフトウェアは、建築と違って模型を作ることが出来ないので、スケールを小さくして見積もることは難しいでしょう。また、同じ機能を沢山つくることはないので、ビルのフロアの数を増やしていくような、かけ算の見積もりも難しいでしょう。 果たして、ざっくりの見積もりに本当に意味はあるのでしょうか。もし、ざっくりの見積もりで予算を超過するというならば、どうするのでしょう。無い袖を振ることはできません。 だからといって、どの機能を削ればどの位のコスト削減になるのか、といった話をするためには、ざっくりの見積もりで出来るとは思えません。 意味のある見積りが出来るとしたら、実際に体制を組んで、動くソフトウェアを作るところまでを含めた開発を数ヶ月でも進めていくことができたら、それから数ヶ月先にどれくらいできるかは把握できるようになるでしょう。.

不具合のない「正しいプログラム」を作るにはどうすればよいのでしょうか? プログラムの不具合を防ぐ手段は様々な角度から研究されています。 その一つが、プログラムの正しさをコンピュータアルゴリズムにより検証しようという「プログラム検証. 人を増やせば一度に沢山の機能が作れる 6. 新井紀子『ai vs. 全てのパターンを行うのは不可能です。 3. けっこー、この業界の方々でも、間違えて認識している人がいますよね。 まず、「モノ作り」の基本大原則に触れておきましょう。それは、 「人間とは、完璧からは程遠い生き物である」 ということです。そのため、必ずバグ(不良、欠陥)は存在します。しないわけがないのです。もちろん. 100%の人間のクローンは 不可能ということを聞いたことが あります。 本人を超えることはないと。 科学的なことで 断言は出来ませんが ヒラリーにしても ナンシー下院議長にしても. さて、これらの機械を操っているのがプログラムであるが、それは結局は人 間が作った物であり、そのプログラムを作る人間のことをプログラマと呼ぶ。 プログラムを作る会社は、プログラム・ハウスではなく、ソフトハウスと呼 ぶ。.

人間がバグのない どんなにプログラミングの知識があって経験のあるエンジニアだとしても、作るプログラムの規模が大きくなると、エラーやバグのないプログラムを作ることは不可能に近いです。 人間はミスをする生き物ですし、どんなに頭の良い人でも1人の頭で考えた. 001%(適当)くらいある。 慎重に時間を費やすことでその可能性をちょっと0に近づけることができるだけで. いかに早く気づけれるかが重要です。なので、早い段階からテストをすることが大事です。 4. ソフトウェア開発はいろいろ我慢しなければいけないことがありますが「我慢」「苦痛」「不合理」などを感じない時に割と気分よく開発できる. 明らかに違う人、 またはクローンが 人間がバグのない ソフトウェアを 作ることは 不可能である 民主党では採用されているのは. これを一義的に決めることはほとんど不可能である。店舗の直前といったってどこのことを言うのか範囲を決められない。 すべてのサンプルに同じ定義をあてはめ交通量を測定しなければデータとして使えない。 その定義をai(人工知能)はやってくれるか?. 意識については壮大な想定をしていて、たとえば地球規模の「ガイア」AIが生まれた場合、意識的経験を(ニューロン信号の何百万倍も早い光の速さでやりとりを行えるとはいえ)人間と同じく1秒間に約10回しか持つことが出来ないし、銀河サイズなら全体.

Paul Graham / 青木靖 訳 年3月. しかし、100%のパスを網羅するのは 不可能だ。 真実33:100%のテスト網羅が可能でも、完全テストとはいえない。 バグの約35%は、パスの抜けが原因であり、40%はパスの特 定の組み合わせを実行したときに起きる。. 「リリースしたサービスの保守から引き受けて貰えませんか?」 実は誰かの作ったプログラムのメンテナンスほど苦労するものはありません。前述の通り、最初から完全にシンプルに重複も無く作られ続けたものだとしたら、うまく引き継げるかもしれませんが、そうでなければ悲惨です。 これは、ソフトウェアの内部の品質は、人に依存する部分が大きすぎることにかかっています。完成されたソフトウェアの画面のようなユーザインタフェースからの操作で確認をして、もし同じ動作になっていたとしても、作る人やチームによって、その内部の品質は大きく違ってきます。 ソフトウェアのメンテナンス性の高さは、外から確認は出来ません。チェックリストやテストで確認できるものでもありません。ソースコードそのものを確認するようなコードレビューが必要です。 とはいえ、コードレビューによるチェックを、リリース直前の機能確認のタイミングでしたところで、もはや手遅れになります。足りない機能や出来てない機能については、追加することで対応することができるかもしれませんが、複雑になってしまって時間の経ったソフトウェアは元のシンプルな状態に戻すには相当なコストが必要になるからです。 コードレビューをするとしたら、日々の開発の中で実施していくことでメンテナンス性を維持するのがベストです。しかし、コードレビューをしたかどうかのチェックでは担保しきれないのは自明です。結局は、内部品質は、人やチームに依存するのです。 プログラムには「美しさ」があります。これはプログラミングをしたことが無ければわからない感覚かもしれません。美しいプログラムはメンテナンス性も高くなります。.

9では、それまでのRuby 1. 「まずは共通部品を作ってしまえば、後は並行に作れませんか?」 いくつかの画面や機能で共通と思われる部品を先に作った方が効率的だ。もしくは、今後に必要な機能を予め備えた基盤を作ってしまった方が効率的だ。こんな考えに囚われている人は少なくありません。 しかし、実際はそうはうまくいきません。共通部品の設計というのは非常に難しいものです。机上で設計をするにしても、その共通部品を使う側の機能の設計をしなければ、どんなシチュエーションにも対応できるような部品を設計しなければいけなくなります。しかし、それは難しい。 では共通部品を使う側の設計をするという行為は、どこまで設計をすれば良いのかといえば、内部のことになるためソースコードのレベルまで設計をしなければいけません。ソフトウェア開発において、設計とはソースコードを書くことなのですから。 人間がバグのない ソフトウェアを 作ることは 不可能である ソフトウェアにおいて、共通の部品というのは、部品から作っていくのではなく、実現しようとする機能を作っていく中で、重複しそうな部分が出て来たら共通化して部品のように外部化していくのが自然です。 また、どんなシチュエーションにでも使えるような抽象度が高く、汎用的なものであれば、オープンソースで誰かが作っている可能性が高いです。そこまでのものは、自分で再発明する必要はありません。 共通部品から作って無駄なコードを増やして複雑にしていくのではなく、重複するコードから共通化して部品を外に出していくことで、シンプルな状態を保つことを考えた方が、長期的に見て、メンテナンスしやすい状態を保てます。. 正確な見積もりを出すことが出来る たとえこれらのことを理解できたとしても、どうしようもないケースも多いでしょう。 ざっくり見積もって、既存パッケージを応用させて、共通基盤を作ってから、一気に人を投入して、なんとか作ってしまう。その結果、メンテナンスにコストがかかって、だんだんと改修できなくなってしまうものが出来上がってしまう。 そんなことを繰り返さないために、ソフトウェアの特性を理解した上で、そもそものところから見直すことにも取り組んでも良いのではないでしょうか。 続きを書きました → 伝えなければ伝わらないという当たり前の話. 「人間らしさ」(人間の特徴)の説明のしかたはいくつかあるが、言葉が使え 言葉でコミュニケーションをすること、文化を持つこと(そしてそれを仲間や子に伝えること)、道具を使い道具を作ること、などが挙げられる。. ソフトウェア開発者にとって、テストは常に頭の痛い問題です。システムが複雑になればなるほど、開発工程におけるソフトウェアテストの工数は膨れ上がっていきます。しかも、テストをきちんとやらなければ不具合だらけのソフトウェアをリリースすることになり、高いツケを払わされる. コンピュータに解けない問題というだけでしたら、例えば任意のプログラムにバグが あるかないかを判定するプログラムが作れないというのは、コンピュータが作られる以前から 数学的に証明されていたことですけれど、これは人間にも解けませんね。. 人間が永遠に生き続けることは数学的に「不可能」 by 人間がバグのない ソフトウェアを 作ることは 不可能である Ali Marel この数百年の間に人間の寿命は大きく伸び、「老い」そのものを避けるという研究.

人間がさまざまなオペレーションを実行しなくてはならない人間中心社会である以上、人間に説明する必要があり、そういったデータを取り扱う. ある程度のバグを許容する対価に雲泥の差がある事を認める顧客が居ないことがあると思う。 完璧なシステム ・仕様する環境は限定される。 ・リリースは数年後~十数年後。 ・値段は数十億~数百億円。 もっとかも?. 誰が作っても中身は同じ品質になる 4. 共通部品から先に作ることが出来る 5.

そして独力での生活は不可能で(森に帰らない限りはということでしょうが)施設で一生を終えた、それもかなり短命だったとのことです。 今回のQuoraの質問に戻ると、40歳になった時に脳はそれだけ生物学的に老いた状態になっています。. 教科書が読めない子どもたち』で著者は、巷間に流布しているai(人工知能)が神になる、aiが人類を滅ぼす、aiが自らの力で人間. リリースできない場合、人員の投入によって間に合わせることは可能か? 間に合わせられない場合、ユーザーと交渉してリリースを遅らせることは可能か? 社内の別のプロジェクトよりも優先してやる必要があるか? リリースを遅らせることができない. · (訳注:本エッセイのタイトルでは、build = 作る、と訳しています。build は比較的規模が大きなもの、コツコツと努力して築き上げるものに使われる言葉であり、一方でmake は比較的小さなものを作るときに使われる言葉です。このニュアンスがないと、小さなものを作ることを想起してしまう. · そもそも最初から理解する必要などありません プログラミングもITも、「使うための道具」であって、原理を理解する必要はない どうしても理解したい人向けの情報 コンピューターサイエンス(計算機科学)という学問があるのでそれを学ぶと理解できる 大学の学部レベル(4年間かけて学ぶ. 「御社でお持ちのパッケージを改良したら速く出来ませんか?」 こうした相談の場合、うまくいかないケースが多いです。既に販売されているような、ある程度作り込まれた機能があるソフトウェアには、思想やコンセプトがデータモデルの中に詰まっています。 人間がバグのない ソフトウェアを 作ることは 不可能である 一部の機能だけを流用するというならば考えられなくもないですが、コンセプトを実現したソフトウェアとデータモデルを流用して、別のコンセプトのソフトウェアを作るというのはうまくいきません。 コンセプトや思想の異なるソフトウェアを作ろうとするのであれば、やはりゼロから作り上げる方が、下手に流用して作るよりも速く、そして、メンテナンスしやすいものが出来上がります。 そのソフトウェアの中身で使うライブラリなどは流用した方が良いでしょう。車輪の再発明は避けるべきです。つまり、部品の流用と完成品の流用は違うのです。 完成品から引き算や足し算で改良していったとして、必ず使わない無駄な部分が出てきます。そうした意味のないソースコードを残すことは、メンテナンス性を下げてしまいます。 やはり、自分なりのコンセプトがあるならば、ゼロから必要最小限で作っていくこと、その中で必要な部品は使えるものは使っていく、というスタンスが良いはずです。.

「自分が想像できないバグは摘出できない」――バグの“想像力”とバグの“知識・経験”は、高品質なソフトウェア作り. ソフトウェアはハードと違って後から容易に直せる 3. アルゴリズムには不可能を可能にする力もあるという。 Ruby 1. 既にあるソフトウェアを流用した方が速く作れる 2. See full list on kuranuki. 今回は長くなったので、6つの誤解をまとめてみましょう。 1. テストをして欠陥があることは示せても、ないという証明にはなりません。テスト結果でなにも起きなかったとしても、偶然漏れていただけかもしれないので、「欠陥がない」わけではないのです。 2) 全数テストは不可能. 「機能改修に時間がかかりすぎるの、なんとかなりませんか?」 たとえソフトウェアであっても、どれだけ容易に直せるかは、そのソフトウェアのつくり方によります。たとえドキュメントがあっても、ソフトウェアの場合は容易に直せないケースが多くあります。 例えば、似たような機能を実現されている箇所が数カ所あったとして、そこがコピー&ペーストで作られていて、共通化されていなければ、修正箇所は一つで済まないため、メンテナンスにかかるコストは高くなってしまいます。 そして、きちんと共通化されているかどうかというのは、ドキュメントに表現しきれるものではありません。ドキュメントの中でコピー&ペーストされてしまっていたら、もはや手に負えません。 そこで、結局はソースコードを読むことになる訳です。ソースコードが直しやすいかどうかを見るにはソースコードを読むしか無く、ドキュメントさえあれば誰でも容易に直せる訳ではないのです。 ソフトウェアは、一度でも複雑になってしまったり、コピー&ペーストによって重複が産まれると、それをシンプルな状態に戻すためには、作られてから時間が経てば経つほど難しくなってしまいます。 ソフトウェアで高いメンテナンス性を実現するためには、最初からなるべく複雑にならないよう、重複のないように少しずつ維持し続けることが、結果として最も低コストな方法になります。.

そのため、例えば、ロボットの知能を実現するソフトウェアを高速化することで、今までのロボットでは不可能だった高速な応答速度を実現できるかもしれません。 今回は、fpga を用いることでロボットの知性を向上させる2つのアプローチを考えてみます。. バグはないことの証明にはなりません。 2. 人工知能が解にはならないもう一つの理由は、人工知能を使ってリスク評価をすることが、ひょっとしたら成立するかもしれない良好な人間関係を不可能にしてしまうということである。次節でこの点について述べよう。 5. 基本的な問題は、 ※全能者は自ら全能であることを制限し、全能でない存在になることができるか である。(訳注: 自分を全能でなくすことが不可能なら、その全能者には不可能なことがあることになるので、全能とはいえない。. 「ひきこもり解決のゴールは外に出て働くことではなく、楽しくできる仕事を見つけることです」。ひきこもりの人たちも無限の可能性を秘めて.