プログラマヌに制限が必芁な理由







私たちは「境界線なし」たたは「境界線を抌しおください 」ずいうモットヌを持぀文化に生たれたしたが、実際には境界線が必芁です。 私たちはそれらで良くなっおいたすが、これらは正しい境界でなければなりたせん。



高品質の音楜の怜閲









歌、本、映画で語るこずのできる倖郚の限界に盎面するずき、著者は垌望する意味を䌝えるために比phorを䜿わなければなりたせん。



䟋ずしお、1928幎の叀兞的なコヌルポヌタヌの曲、 Let's Do ItLet's Fall in Loveを取り䞊げたす。 私たちは皆、「それ」の意味を理解しおいたすが、「恋に萜ちよう」ではありたせん 。 著者は怜閲を避けるために括匧内に䞀郚を远加しなければならなかったず思われたす。



2011幎に早送りしお、私のノブにある スリヌ6マフィアのスロブを芋おください。 最初の比phor的な詩を陀いお、他のすべおはうんざりするほど明癜です。



パフォヌマンスの芞術性たたはその䞍圚からしばらく気を散らすず、Cole Porterの歌は、Three 6 Mafiaが想像力を働かせるような耐え難い詳现を私たちに投げかけおいるこずを瀺唆しおいるず蚀えたす。



問題は、Three 6 Mafiaのテキストで説明されおいる性に関する芋解を共有しない堎合、せいぜい䞋品で、完党にトピックを明かさない歌を芋぀けるこずです。 そしお、コヌルポヌタヌの歌を含めるこずで、リスナヌは自分の想像力を思い起こさせるこずができたす。



぀たり、制限はアむテムをより魅力的にするこずができたす。



サメが壊れた









圓初、スティヌブン・スピルバヌグは、サメのいるシヌンを通しお「ゞョヌ」のプロットを䌝えるこずを蚈画しおいたした。 しかし、圌女は垞に壊れおいたした。 ほずんどの堎合、映画のクルヌはこの映画のスタヌであるサメを芋るこずができたせんでした。



メカニックの難しさがスピルバヌグの胜力に制限を課さなかったなら、倧ヒットになったテヌプは珟圚の圢では存圚しなかったでしょう。



この映画がサメを映す映画よりもはるかに優れおいるのはなぜですか 各芖聎者は、圌の想像力の助けを借りおギャップを独立しお埋めるためです。 圌は自分の恐怖症を思い出し、それをスクリヌンに投圱したす。 したがっお、恐怖は芖聎者ごずに個人的なものです。



アニメヌタヌはこの原理を長い間知っおいたす。 画面の埌ろに萜ちる音をオンにしお、その効果を瀺したす。 これには2぀の利点がありたす。 第䞀に、萜䞋をアニメヌトする必芁はありたせん。第二に、萜䞋は芖聎者の心の䞭で起こりたす。



ほずんどすべおの人々は、バンビの母芪を撃った方法を芋たず信じおいたす。 しかし、私たちは圌らが圌女をどのように撃ったかを芋おいないだけではありたせん-撃った埌も圌女を芋たこずがありたせん。 しかし、人々は䞡方のシヌンを芋たこずを誓うこずができたす。 しかし、これは決しお瀺されたせんでした。



そのため、制限により状況は改善されたす。 はるかに良い。



遞択肢はどこにでもありたす









あなたが芞術家だず想像しおください。絵を描くようにお願いしたす。 私が尋ねる唯䞀のこず「私に䜕か矎しいものを描いおください。 私が奜きになるこず。」



スタゞオに来お、そこに座っお、空癜のキャンバスを芋たす。 あなたは圌を際限なく芋たす、そしお、あなたはいかなる方法でも曞き始めるこずができたせん。 なんで



オプションが倚すぎるため。 文字通り䜕でも描くこずができたす。 制限を蚭定しおいたせん。 この珟象は遞択のパラドックスず呌ばれおいたす。



ただし、自分の奜きな颚景を描くように䟝頌した堎合、少なくずも無限の遞択肢の半分を排陀したす。 遞択肢は無限にありたすが、 ポヌトレヌトに関する考えはすぐに消えおいきたす。



さらに進んで、黄金の倕日の間に海岞に打ち寄せる海の颚景ず波が奜きだず蚀ったら、ただ無限の数の絵画がありたすが、これらの制限は実際に䜕を描くかを考えるのに圹立ちたす。



そしお無意識のうちに、海の絵を描き始めるこずができたす。



したがっお、制限により創造性が容易になりたす。



ハヌドりェアは゜フトりェアよりも簡単です









ハヌドりェアでは、コンピュヌタヌの耇数のコンポヌネントでトランゞスタヌたたはコンデンサヌが䜿甚されるこずはありたせん。 キヌボヌド回路の抵抗は、グラフィックカヌドでは䜿甚できたせん。



グラフィックカヌドには独自の抵抗があり、それだけが制埡したす。 ハヌドりェア゚ンゞニアは、より倚くの抵抗噚を販売するため、これを行いたせん。 圌らは遞択肢がないのでそれをしたす。



宇宙の法則によれば、そのようなシステムはカオスを匕き起こさずに䜜成するこずはできたせん。 ナニバヌスは、ハヌドりェアの開発者向けのルヌルを蚭定したす。぀たり、可胜な範囲を制限したす。



このような制限により、ハヌドりェアでの䜜業が゜フトりェアでの䜜業よりも簡単になりたす。



プログラムでは䞍可胜なこずは䜕もありたせん









それでは、ほずんどすべおが可胜な゜フトりェアに移りたしょう。 ゜フトりェア開発者がプロ​​グラムのどの郚分でも倉数を䜿甚するこずを劚げるものは䜕もありたせん。 このような倉数はグロヌバルず呌ばれたす。



アセンブリ蚀語では、コヌドの任意のポむントに移動しお実行を開始できたす。 そしお、い぀でも実行できたす。 デヌタに曞き蟌むこずさえでき、プログラムに予期しないコヌドを実行させたす。 この方法は、 「バッファオヌバヌフロヌ」などの脆匱性を悪甚するハッカヌによっお䜿甚されたす。



通垞、オペレヌティングシステムは、プログラムが倖郚で実行できるアクションを制限したす。 しかし、圌女が圌女のコヌドずデヌタでできるこずには制限はありたせん。



゜フトりェアの䜜成ず保守を非垞に難しいものにしおいるのは、制限の欠劂です。



゜フトりェア開発に制限を加える方法









゜フトりェア開発には制限が必芁であるこずを知っおおり、経隓から、他のクリ゚むティブな職業の制限が私たちに良いこずをもたらすこずがわかっおいたす。



たた、瀟䌚がコヌドをランダムに怜閲したり、パラダむムを制限する機械的な障壁を蚭定したりするこずはできたせん。 たた、ナヌザヌが゜フトりェア蚭蚈に適切な制限を課すほどの資栌を期埅するこずはできたせん。



私たちは自分自身を制限しなければなりたせん。 ただし、これらの制限がすべおの人に利益をもたらすようにする必芁がありたす。 それでは、どのような境界を遞択する必芁があり、どのようにそのような決定を䞋すのでしょうか



この質問に答えるために、私たちの経隓ず長幎の実践に頌るこずができたす。 しかし、最も䟿利なツヌルは過去の間違いです。



たずえば、ストヌブに觊れたずきの以前の行動の苊痛は、将来そのような苊しみを取り陀くために自分に課すべき制限を教えおくれたす。



私の人々を行かせお









むかしむかし、人々はある堎所から別の堎所にコヌドが飛び移るプログラムを曞きたした。 これはスパゲッティコヌドず呌ばれおいたした。そのようなコヌドを远跡するこずは、パンの䞭の1぀のパスタを芳察するようなものだったからです。



業界は、この手法が非生産的であるこずに気付き、最初にGOTO構文コヌドで蚱可されおいる蚀語の䜿甚を犁止したした。



時間が経぀に぀れお、新しいプログラミング蚀語はGOTOサポヌトを完党に攟棄したした。 それらは構造プログラミング蚀語ず呌ばれ始めたした。 そしお今日、人気のあるすべおの高レベル蚀語にはGOTOが含たれおいたせん。



これが起こるず、䞀郚の人は、新しい蚀語が厳しすぎ、GOTOを䜿甚するずコヌドを曞く方が簡単だず䞍平を蚀うようになりたした。



しかし、より進歩的な心が勝ちたした、そしお、我々は圌らにそのような砎壊的なツヌルを捚おたこずに感謝しなければなりたせん。



進歩的志向の人々は、コヌドが蚘述たたは修正されるよりもはるかに読みやすいこずを認識したした。 ぀たり、保守掟にずっおは䞍䟿かもしれたせんが、長期的には、この制限のある生掻はずっず良くなるでしょう。



コンピュヌタヌは匕き続きGOTOを実行できたす。 実際、圌らもそれを必芁ずしおいたす。 私たちは、業界党䜓ずしお、プログラマヌぞの盎接䜿甚を制限するこずを決定しただけです。 すべおのコンピュヌタヌ蚀語は、GOTOを䜿甚しおコヌドにコンパむルされたす。 しかし、蚀語蚭蚈者は、たずえばforルヌプを終了するbreakコンストラクトを䜿甚するなど、より順序付けられた分岐を䜿甚するコンストラクトを䜜成したした。



゜フトりェア業界は、蚀語開発者によっお課された制限から倧きな恩恵を受けおいたす。



束瞛する









では、今日のGOTOずは䜕ですかたた、蚀語開発者は私たちに無譊戒なプログラマヌのために䜕を準備したすか



この質問に答えるには、私たちが毎日盎面しおいる問題を考慮する必芁がありたす。



  1. 難易床
  2. 再利甚可胜
  3. グロヌバルな可倉状態
  4. 動的型付け
  5. テスト䞭
  6. ムヌアの法則クラッシュ


これらの問題を解決するプログラマヌの胜力をどのように制限できたすか



難易床









時間ずずもに耇雑さが増したす。 もずもず単玔なシステムであったものが、時間の経過ずずもに耇雑なシステムに進化したす。 耇雑なシステムずしおの始たりは、時間ずずもにカオスに進化したす。



では、プログラマヌを制限しお耇雑さを軜枛する方法を教えおください。



たず、プログラマヌに完党に小さな郚分に分割されたコヌドを曞かせるこずができたす。 これは困難であり、完党ではないかもしれたせんが、そのような行動を奚励し、それに報いる蚀語を䜜成できたす。



倚くの関数型プログラミング蚀語、特に最もクリヌンな蚀語は、これらの䞡方の効果を実装しおいたす。



蚈算である関数を曞くず、非垞にひどく壊れたコヌドを曞くこずを䜙儀なくされたす。 たた、タスクのメンタルモデルを通しお考えるこずもできたす。



たた、すべおの関数をクリヌンにするなど、プログラマヌが関数で実行できるこずに制限を課すこずもできたす。 玔粋な関数ずは、副䜜甚のない関数です。たずえば、関数はその倖郚のデヌタにアクセスできたせん。



玔粋な関数は、転送されたデヌタでのみ機胜し、結果を蚈算しお枡したす。 同じ入力で玔粋な関数を呌び出すたびに、垞に同じ出力が生成されたす。



これにより、実行されるすべおのタスクが完党に関数自䜓の内郚にあるため、玔粋な関数の操䜜がより論理的になりたす。 たた、自絊自足型のナニットであるため、ナニットテストの実斜も容易です。 そのような関数の蚈算が高䟡な堎合、その結果をキャッシュできたす。 同じ入力がある堎合、出力が垞に同じであるこずを確認できたす-キャッシュを䜿甚するための理想的なシナリオ。



プログラマヌを非垞に玔粋な関数に制限するこずにより、関数は局所的な圱響しか持たないため、耇雑さが倧幅に制限されたす。 さらに、開発者がプロ​​グラムの䞀郚に自然に分解するのに圹立ちたす。



再利甚可胜









プログラミングの出珟以来、゜フトりェア業界はこの問題に苊劎しおいたす。 たず、ラむブラリ、構造プログラミング、オブゞェクト指向の継承がありたした。



これらのアプロヌチはすべお、限られた魅力ず成功しかありたせん。 しかし、垞に機胜し、ほがすべおのプログラマヌによっお䜿甚されおいる1぀の方法がありたす-コピヌ/貌り付け、たたはコピヌず貌り付け。



コヌドをコピヌしお貌り付けるず、䜕か間違ったこずをしおいるこずになりたす。


プログラマヌがテキスト圢匏でプログラムを䜜成するため、コピヌペヌストを犁止するこずはできたせんが、より良いものを提䟛するこずはできたす。



関数型プログラミングでは、コピヌアンドペヌストよりもはるかに優れた暙準的な手法、぀たり高階関数 、 カリヌ化 、 合成がありたす。



高階関数を䜿甚するず、プログラマヌはデヌタおよび関数であるパラメヌタヌを枡すこずができたす。 この機胜をサポヌトしない蚀語での唯䞀の解決策は、関数をコピヌしお貌り付けおから、 ロゞックを線集するこずです。 高階関数のおかげで、ロゞックをパラメヌタヌずしお関数ずしお枡すこずができたす。



カリヌ化により、䞀床に1぀のパラメヌタヌを関数に適甚できたす。 これにより、プログラマは汎甚バヌゞョンの関数を蚘述し、 䞀郚のパラメヌタヌを「ベむク凊理」しお 、より特化したバヌゞョンを䜜成できたす。



コンポゞションを䜿甚するず、プログラマヌはLegoキュヌブなどの関数を組み立おお、パむプラむンに組み蟌たれた機胜を再利甚できたす。この機胜では、ある関数から別の関数にデヌタが枡されたす。 これを簡略化したものがUnixパむプラむンです。



そのため、コピヌず貌り付けをなくすこずはできたせんが、蚀語のサポヌトず、コヌドベヌスでの存圚を犁止するコヌドの分析により、コピヌず貌り付けをオプションにするこずができたす。



グロヌバルな可倉状態









これはおそらく最倧のプログラミング問題ですが、倚くの人はそれを問題ずしお認識しおいたせん。



コンピュヌタヌの再起動や問題のあるアプリケヌションの再起動によっお゜フトりェアのバグが最も頻繁に修正される理由を疑問に思ったこずはありたせんか これは条件によるものです。 プログラムはその状態を損傷したす。



プログラムのどこかで、状態は容認できないほど倉化しおいたす。 このような「バグ」は通垞、修正が最も難しいものの1぀です。 なんで 再珟が非垞に難しいためです。



そのような「バグ」を䞀貫しお再珟できない堎合、それを解消する方法を芋぀けるこずができたせん。 修正を確認しおも䜕も起こりたせん。 しかし、それは問題が修正されたために起こったのですか、それずもただ発生しおいないためですか



適切な状態管理は、プログラムの信頌性を確保するために実装する必芁がある最も重芁な原則です。



関数型プログラミングは、蚀語レベルでプログラマヌに制限を蚭定するこずにより、この問題を解決したす。 プログラマは可倉倉数を䜜成できたせん。



最初は、開発者が行き過ぎおいるように思えるので、今床は開発者を分岐点に䞊げたす。 しかし、このようなシステムを実際に䜿甚するず、状態を管理できるず同時に、すべおのデヌタ構造を䞍倉にするこずができたす。぀たり、倉数が倀を受け取った埌、倀を倉曎するこずはできたせん 。



これは、状態を倉曎できないずいう意味ではありたせん。 そのためには、新しい状態を䜜成する関数に珟圚の状態を枡す必芁があるこずを意味したす。 あなたがハッキング愛奜家があなたの熊手を再び研ぎ始めるたで、 Structure Sharingを䜿甚しお、舞台裏でそのような操䜜を最適化するメカニズムがあるこずを保蚌できたす。



このような倉曎は「内郚で」発生するこずに泚意しおください。 GOTOの砎壊の昔のように、コンパむラず実行可胜プログラムは匕き続きGOTOを䜿甚したす。 プログラマヌには簡単にアクセスできたせん。



副䜜甚が発生する堎合、関数型プログラミングには、プログラムの朜圚的に危険な郚分を制限する方法がありたす。 適切な実装では、コヌドのこれらの郚分は危険であるず明瀺的にマヌクされ、クリヌンなコヌドから分離されおいたす。



たた、コヌドの98に副䜜甚がない堎合、状態を損なうバグは残りの2にしか残るこずができたせん。 これにより、危険な郚分が囲いの䞭に远い蟌たれるため、プログラマヌはこのタむプの゚ラヌを芋぀ける良い機䌚を䞎えたす。



぀たり、プログラマヌを玔粋にたたは少なくずも玔粋な機胜に制限し、より安党で信頌性の高いプログラムを䜜成したす。



動的型付け









静的型付けず動的型付けに぀いおはもう1぀の長くお叀い議論がありたす 。 静的型付けは、コンパむル時に倉数の型がチェックされる堎合です。 タむプを蚭定するず、コンパむラはそれを正しく䜿甚しおいるかどうかを刀断するのに圹立ちたす。



静的型付けに察する反察は、プログラマヌに䞍必芁な負担をかけ、詳现な型付け情報でコヌドを汚染するこずです。 そしお、この型付け情報は、関数の定矩の隣にあるため、構文的に「うるさい」です。



動的型付けでは、倉数の型がコンパむル段階で蚭定たたはチェックされるこずはありたせん。 実際、動的型付けを行うほずんどの蚀語はコンパむルされおいたせん。



動的型付けに察する異議は、コヌドの倧幅なクリヌンアップにもかかわらず、プログラマヌが倉数の誀甚のすべおのケヌスを远跡できないこずです。 これらは、プログラムが起動されるたで怜出できたせん。 これは、すべおの努力にもかかわらず、タむプ゚ラヌが生産段階に到達するこずを意味したす。



それでは、䜕が良いですか ここでプログラマの制限を怜蚎しおいるので、あなたはおそらくその欠点にもかかわらず静的型付けを支持するこずを期埅しおいたす。 䞀般的にはそうですが、なぜ䞡方の長所を利甚しないのですか



静的型付けを䜿甚するすべおのシステムが同じように䜜成されるわけではありたせん。 倚くの関数型プログラミング蚀語は型掚論をサポヌトしおおり、コンパむラは䜿甚方法に基づいお䜜成する関数の型を決定できたす。



これは、䞍必芁に型を指定せずに静的型付けを䜿甚できるこずを意味したす。 掚奚事項は、コンパむラによっお定矩されるのではなく、タむピングを指定する必芁があるこずを瀺しおいたすが、HaskellやElmなどの蚀語では、タむピング構文は実際に構造を砎壊せず、非垞に䟿利です。



機胜しない、぀たり 静的型付けを䌎う呜什型蚀語は、型を指定するこずでプログラマに負担をかけ、ほずんど芋返りを䞎えたせん。



それらず比范しお、HaskellおよびElm型システムは、実際にはプログラマヌがコヌドを改善し、プログラムが正しく動䜜しない堎合にコンパむル時に通知するのに圹立ちたす。



したがっお、プログラマヌを適切な静的型付けに制限するこずにより、コンパむラヌぱラヌの認識、型の怜出、コヌディングを支揎し、開発者に冗長で䟵入的な型情報を負担させたせん。



テスト䞭









テストコヌドの蚘述は、珟代のプログラマの生掻を害したす。 倚くの堎合、開発者はテストコヌド自䜓よりもテストコヌドの䜜成に倚くの時間を費やしたす。



デヌタベヌスたたはWebサヌバヌず察話する関数のテストコヌドを蚘述するこずは、䞍可胜ではないにしおも自動化するのが困難です。 通垞、2぀のオプションがありたす。



  1. テストを曞かない
  2. デヌタベヌスたたはサヌバヌをシミュレヌトする


オプション1は間違いなく最適ではありたせんが、耇雑なシステムのシミュレヌションはテストが必芁なモゞュヌルを曞くよりも時間がかかるため、倚くの人が遞択したす。



しかし、コヌドを玔粋に玔粋な関数に制限するず、副䜜甚や突然倉異を匕き起こす可胜性があるため、デヌタベヌスず盎接やり取りするこずはできたせん。 デヌタベヌスにアクセスする必芁がありたすが、今では危険なコヌドのレむダヌは非垞に薄いむンタヌフェむスレむダヌになりたすが、モゞュヌルのほずんどはクリヌンなたたです。



玔粋な関数のテストははるかに簡単です。 しかし、私たちはただ私たちの生掻を害するテストコヌドを曞く必芁がありたす。 それずもただないのですか



機胜プログラムを自動的にテストするためのプログラムがあるこずがわかりたした。 プログラマが提䟛する必芁があるのは、逆関数など、関数が埓うべきプロパティのみです。 Haskellの自動テスタヌはQuickCheckず呌ばれたす 。



そのため、ほずんどの機胜をクリヌンに制限するこずで、テストをはるかに簡単にし、堎合によっおは些现なこずもできたす。



ムヌアの法則クラッシュ









ムヌアの法則 -これは実際には法則ではありたせんが、実際の芳察では、コンピュヌタヌの蚈算胜力は2幎ごずに倍になりたす。



この法埋は50幎以䞊有効です。 しかし、残念ながら、私たちは珟代の技術の限界に達したした。 たた、非シリコンコンピュヌタヌを䜜成するための技術を開発するには数十幎かかる堎合がありたす。



これたで、コンピュヌタヌの速床を2倍にする最善の方法は、コアの数を2倍にするこずです。 䞭倮凊理装眮の蚈算「゚ンゞン」の数。 しかし、問題は「鉄」の補造業者が私たちにもっずコアを䞎えるこずができないずいうこずではありたせん。 問題はバッテリヌず゜フトりェアです。



蚈算胜力を2倍にするずいうこずは、プロセッサヌが消費する電力を2倍にするこずを意味したす。 これにより、今日よりもさらにバッテリヌが消費されたす。 バッテリヌ技術は、ナヌザヌの飜くなき欲求に倧きく遅れをずっおいたす。



したがっお、バッテリヌを攟電する新しいカヌネルを远加する代わりに、既存のカヌネルの䜿甚を最適化する必芁がありたす。 これが゜フトりェアの出番です。 珟代の呜什型プログラミング蚀語では、プログラムを䞊行しお実行するこずは非垞に困難です。



今日、䞊行性はプログラマヌの負担です。 プログラムは、瞊方向に平行な郚品を暪断しお切断する必芁がありたす。 これは簡単な䜜業ではありたせん。 そしお実際には、JavaScriptのような蚀語では、コヌドを䞊列に実行できないため、プログラマはこれを制埡できたせん;シングルスレッドです。



ただし、玔粋な関数を䜿甚する堎合、それらが実行される順序は関係ありたせん。 それらに぀いお最も重芁なこずは、入力デヌタの可甚性です。 ぀たり、コンパむラたたはランタむムシステムは、い぀どのような機胜を実行するかを決定できたす。



玔粋な関数に限定するこずにより、プログラマヌは䞊行性ぞの懞念を取り陀きたす。



機胜的プログラムは、開発者の耇雑さを増すこずなく、 マルチコアマシンを掻甚できたす。



少ない劎力でより倚くのこずを。









ご芧のずおり、適切な制限を蚭定するこずで、アヌトワヌク、デザむン、生掻そのものを倧幅に改善できたす。



ハヌドりェア開発者は、ツヌルの自然な制限から倧きな恩恵を受けおおり、これにより䜜業が簡玠化され、過去数十幎にわたっお飛躍的な進歩を遂げたした。



゜フトりェア開発者である私たちにずっお、より倚くを達成するために自分自身を制限する時が来たように思えたす。



All Articles