7つの最も不快なプログラミングの問題

画像






古い地図では、未知の領域で不吉な警告がしばしば出されたことが知られています:「ドラゴンはここに住んでいます」。 おそらく 、この警告の意味は、恐ろしい敵と戦う準備ができていない状態で、この世界の空間に入るべきではないということでした。 これらの神秘的なオープンスペースでは何でも起こり得、多くの場合、そのような「何でも」は非常にひどく終わります。



プログラマーは中世の騎士よりやや文明的かもしれません-しかし、これは現代の技術世界が予期せぬ場所で私たちを待っている技術的なドラゴンを持っていないという意味ではありません:特に高い負荷と責任ある仕事の瞬間; マニュアルを読み、それがうまく実装されていないことを知っている競合他社。 完全に除去されていないプログラムのバグや欠陥の使用方法を知っている悪の「悪魔」であり、プログラムが使用された直後に発見することがよくあります。



コンピューターが完全に予測可能であり、ストリームでたゆみなく正しい答えを与えるという素朴な自信に温かく、夜は静かに眠る人々がいます。 彼らはほとんど知らない! チップ開発者、言語の作成者、および数百万人のプログラマーの真剣な努力にもかかわらず、プログラミングには依然として最先端のプログラマーと開発者でさえも破壊する危険な茂みがあります。



プログラミングの世界で恐ろしい7つのコーナーを簡単に記述できます。「ドラゴンはここに住んでいます。」



マルチスレッド



良いアイデアのように見えます。 プログラムを独立したセクションに分割し、オペレーティングシステムがそれらを個別の小さなプログラムとして処理できるようにします。 プロセッサに4、6、8、またはそれ以上のコアがある場合、すべてのコアを独立して使用する4、6、8、またはそれ以上のスレッドを持つプログラムを作成してみませんか?



アイデアは機能します-すべての部品が実際に完全に分離されており、互いに接続されていない場合。 ただし、同じ変数にアクセスしたり、同じファイルにビットを書き込む必要がある場合は、ゲームオーバーです。 一部のストリームは最初にこのデータに送られ、どのデータを予測することは不可能です。



そのため、同期モニター、セマフォ、およびその他の手段を作成して、マルチスレッドの混乱を合理化します。 彼らが働くとき、物事は行きます。 単純に異なるレベルの複雑さを導入し、変数にデータを保存するアクションを、追加の知的努力を必要とする操作に変えます。



うまくいかない場合は、カオスが支配します。 受信したデータは意味がなくなります。 列が合わない。 口Moneyで口座からお金が消えます。 そして、それがすべてです-メモリのほんの一部。 そして、それらのいずれかを決定できれば幸運です。 ほとんどの場合、開発者はデータ構造の大きなセクションをブロックして、1つのスレッドのみがそれらとやり取りできるようにします。 これにより、混dataを止めることができますが、同じデータで複数のスレッドを実行することの肯定的な側面のほとんどを排除することによってのみです。 このようなプログラムを「シングルスレッド」として書き直すことができます。



短絡



途中で誰かが、関数をデータであるかのように渡すことが有用であると判断しました。 これは単純なケースではうまくいきましたが、プログラマーは、関数が自分自身の外に出て、しばしば「自由変数」と呼ばれる他のデータにアクセスし始めると問題があることに気付き始めました。 この場合、どのバージョンが正しいですか? 関数呼び出しの初期化時のデータ? それとも彼女の実際の仕事の時? これはJavaScriptにとって特に重要です。JavaScriptでは、これらのモーメントを非常に間隔を空けることができます。



ソリューション「クロージャ」は、JavaScriptプログラマー(そして現在はJavaとSwift)にとって最大の頭痛の種の1つです。 初心者や多くの経験豊富なプログラマーでさえ、このいわゆる閉鎖の境界がどこにあり、どこにあるのかを理解することはできません。



名前は役に立たない-それは、パブの訪問者が最後の注文をする(閉じる前に)ように申し出ているような、アクセスの永久的な閉鎖に関する警告のようには見えません。 いずれにせよ、アクセスは開いていますが、データ時間連続体の「ワームホール」を介してのみです-タイムシフトの奇妙なメカニズムは、SFシリーズに触発されたに違いありません。 しかし、「複雑なスタックアクセスメカニズム」または「データ管理操作システム」という名前は長すぎるようであるため、「クロージャ」が選択されました。 そして、誰が非フリー変数に支払うべきかについての会話を始めません。



データが大きすぎます



RAMがオーバーフローし始めると、すべてが落ちます。 消費者データの高度な統計分析を行っているか、使い慣れた古いスプレッドシートを使用しているかは関係ありません。 マシンがRAMを超える場合、いわゆるマシンを指します。 仮想メモリ。(RAMと比較して)非常に遅いハードドライブまたはソリッドステートドライブで動作します。 もちろん、これはタスクを停止または完了するよりも優れていますが、いずれにしても作業は遅くなります。



問題は、ハードドライブのパフォーマンスがRAMのパフォーマンスの20〜30倍低く、市場で大量販売されているドライブがさらに遅いことです。 この時点で他のプロセスがディスクへの書き込みまたはディスクからの読み取りを試みる場合、これらのドライブは一度に1つのタスクしか実行できないため、状況は単純に劇的になります。



仮想メモリのアクティベーションは、ソフトウェアのその他の隠れた問題を悪化させます。 ストリームの欠陥がある場合、ハードディスク上の仮想メモリに落ちるストリームは他のストリームよりもはるかに遅く処理されるため、それらはより強く現れ始めます。 他のスレッドは、敗者スレッドがこのメモリにある間だけ「ハング」します。 プログラムがうまくいけば、結果は顕著な減速になります。 プログラムに欠陥がある場合、すぐに災害につながります。 そして、これはほんの一例です。



この状況を管理することは、大きなデータセットを操作するプログラマにとって深刻な課題です。 大きなデータセットの構造を設計するときに少なくとも少しリラックスした人は、必然的に、受け入れがたいほど遅いプログラムになります。 彼女は正常にいくつかのテストに合格することができますが、実際の負荷はコルク抜きで失敗することになります。



NP完全問題



コンピューターサイエンスの大学の学位を持っている人は、「非決定的チューリングマシンの検索と意思決定の問題の多項式」、またはNP完全問題など、ほとんど説明されない略語の背後に隠された謎の問題について知っています。 それらの詳細な研究には、コンピュータサイエンスコースの学期全体が必要ですが、この場合でも、多くの学生があいまいなアイデアを出します。 基本的に、これらの問題は並外れた難しさのために誰も解決できないことです。



NP完全問題の問題は、しばしば非常に複雑です-単純に無作法で強力なアプローチを使用してそれらを解決しようとする場合。 たとえば、「 巡回セールスマン問題 」に対する解決策の期間は、ルートポイントの数が増えるにつれて指数関数的に長くなります。 Nの特定の値に最も近い数のサブセットを見つけることによって「 バックパック問題 」を解決するには、可能な限りすべてのサブセットを反復処理する必要があり、その数は非常に大きくなります。 これらの問題は、最悪のコンピューター「モンスター」の1つである非スケーラブルアルゴリズムの例であるため、誰もがこれらの問題から逃れるために恐れて努力しています。



ニュアンスは、NP完全問題のいくつかの問題が、いくつかの近似解法で簡単に解決されることです。 対応するアルゴリズムは正確な解を約束するものではありませんが、正確な解に非常に近い結果をもたらします。 彼らはセールスマンに理想的なルートを与えないかもしれませんが、彼らの決定は数パーセントだけ正しいものと異なります。



そのようなかなり良い解決策の存在は、「ドラゴン」をより神秘的にするだけです。 これらの問題が本当に難しいのか、それとも比較的簡単に解決できるのか、前もって誰にも確信が持てません-答えに満足していれば、それは良いことです。



安全性



「私たちが知っていることを知っている知識があります」と、ジョージ・W・ブッシュ米大統領第二国防長官ドナルド・ラムズフェルドは記者会見で語った 。 「無知を知ることもあります-私たちが知らないことを知っていること。 しかし、無知な無知もあります-それは私たちが知らないこと、私たちは知らないことです。」



ラムズフェルドはイラクでの戦争について話しましたが、コンピューターのセキュリティについても同じことが言えます。 最大の問題は穴です。穴がある可能性すらわかりません。 誰もが、パスワードを推測しにくくする必要があることを理解しています。 それは既知の知識です。 しかし、ネットワークハードウェアには、内部に深く隠された独自のソフトウェアレイヤーがあると言う人はいますか? OSをハッキングせずに、代わりにこの「秘密」レベルを目指す能力は、無知であることを知らないことです。



そのような侵入の可能性は今では「不明」とみなすことはできませんが、他に存在することはできますか? 穴が存在するかどうかさえ知らなければ、穴を塞ぐことが可能かどうかはわかりません。 パスワードは慎重に保護できますが、想像すらできないクラッキング方法があります。 コンピュータセキュリティの操作は間違いなく喜びの海です。 プログラミングに関しては、セキュリティ指向の考え方がますます重要になっています。 作成した混乱を解消するために、セキュリティの専門家に伝えることはできません。



暗号化



法執行官が議会の前に立って、それを克服するために公式プログラムのエントリを提供するように頼むとき、暗号化は強力で近づきにくいようです。 問題は、暗号化の大部分が不明瞭な霧の雲に基づいていることです。 本当に大きな数を因数分解したり、離散対数を実行するのが難しいという事実など、不明確な仮定に対してどのような数学的証拠がありますか?



これらの問題は本当に難しいですか? 誰もそれらを解決するためのアルゴリズムを公に説明していませんが、これはそのような解決策が存在しないことを意味しません。 すべての会話を盗聴して銀行に入る方法を見つけることができたら、すぐに全世界に知らせますか?穴を塞ぐのに何が役立ちますか? それとも沈黙しますか?



本当の課題は、独自のコードで暗号化を使用することです。 基礎となるアルゴリズムが安全であっても、パスワード、キー、および接続を処理するには多くの作業が必要であると考えています。 少なくとも1つの間違いを犯し、一部のパスワードが保護されていない場合、すべてが無駄になります。



アイデンティティ管理



1993年にThe New Yorkerに掲載された写真のような多くの人々は、「インターネット上では、あなたが犬であることを誰も知らない」という碑文を付けています。 4つの詳細なセクションがある独自のWikipediaページもあります 。 (インターネット上では、ユーモアの分析とカエルの解剖についての古いジョークを知っている人はほとんどいません。)



良いニュースは、匿名性が解放され、報われることです。 悪いことは、匿名通信以外のことを行う方法がほとんどないことです。 一部のプログラマーは「2要素の識別と認証」について話しますが、より高度なものは「N要素」の傾向があります。



パスワードと、場合によっては携帯電話へのテキストメッセージに加えて、信頼できるものはほとんどありません。 指紋リーダーは印象的に見えますが、多くの人はそのような識別をハッキングする方法を教えて示す準備ができているようです(初心者はこちらこちらこちらをご覧ください)。



SnapchatやRedditのアイドルトークの世界にとって、これはそれほど重要ではありませんが、多くのハッキングされたFacebookページは少しがっかりしています。 一般的なトピックに関する「世俗的な」会話を除いて、財産、金銭、医療、その他ほとんどすべての人生の深刻な問題にオンラインで取り組む簡単な方法はありません。



ビットコインのファンは、ブロックチェーンがどれほど信頼できるかを言うのが大好きですが、どういうわけか彼らはビットコインを盗み続けています( こちらこちらをご覧ください)。 ここでは、実際の識別方法はありません。



測定の信頼性



もちろん、プログラミングに関しては問題が発生します。少なくとも問題の複雑さを測定する方法はありますか? 誰もこれを本当に知りません。 いくつかの問題を解決するのは簡単ですが、それがどれほど難しいかを判断することは別の問題です。 NP完全性は、アルゴリズムとデータ分析の複雑さを体系化する複雑な試みのほんの一部です。 この理論は有用ですが、保証はできません。 問題が難しいかどうかさえ知るのは難しいと言いがちですが、これはもちろん冗談です。



All Articles