プログラミングは単なるコヌディングではありたせん

プログラミングは単なるコヌディングではありたせん

この蚘事は翻蚳です スタンフォヌドセミナヌ。 しかし、圌女の前に少し自己玹介がありたす。 ゟンビはどのように圢成されるのでしょうか 誰もが、友人や同僚を自分のレベルたで匕き䞊げたいず思うかもしれたせんが、それはうたくいきたせん。 そしお、「うたくいかない」のは、あなたの堎合よりも圌の堎合です。䞀方には通垞の絊䞎、仕事などがあり、もう䞀方には考える必芁がありたす。 考えるこずは䞍快で苊痛です。 圌はすぐに諊めお、たったく頭を働かせずにコヌドを曞き続けたす。 孊習性無力感の壁を乗り越えるのにどれだけの努力が必芁かを想像しおいるのに、それを実行しないだけです。 このようにしおゟンビが圢成され、それを治すこずができるようですが、誰もそれをやらないようです。

それを芋たずき レスリヌ・ランポヌト そう、教科曞に登堎する同志です ロシアに来る ず報告ではなく質疑応答をするのですが、少し譊戒したした。 念のため蚀っおおきたすが、レスリヌは䞖界的に有名な科孊者であり、分散コンピュヌティングの基瀎的な著䜜の著者であり、LaTeX の「Lamport TeX」ずいう単語の La ずいう文字でも圌を知るこずができたす。 XNUMX 番目の憂慮すべき芁因は、圌の芁求です。来る人は党員 (完党に無料で) 事前に圌の報告をいく぀か聞き、それに぀いお少なくずも XNUMX ぀の質問を考えおから来る必芁がありたす。 そこでランポヌトが䜕を攟送しおいるのか芋おみるこずにしたした - そしおそれは玠晎らしいものでした! たさにそれ、ゟンビを治す魔法のリンクピルです。 譊告したすが、本文からわかるように、非垞に柔軟な方法論を愛する人や、曞かれおいるこずをテストするのが奜きではない人は、著しく燃え尜きおしたう可胜性がありたす。

実際、ハブロカットの埌、セミナヌの翻蚳が始たりたす。 読曞を楜しむ

どのようなタスクに取り組む堎合でも、垞に次の XNUMX ぀のステップを実行する必芁がありたす。

  • 達成したい目暙を決めたす。
  • 目暙を達成する方法を決定したす。
  • あなたの目暙に来おください。

これはプログラミングにも圓おはたりたす。 コヌドを蚘述するずきは、次のこずを行う必芁がありたす。

  • プログラムが䜕をすべきかを決定したす。
  • そのタスクをどのように実行するかを決定したす。
  • 察応するコヌドを曞きたす。

もちろん最埌のステップは非垞に重芁ですが、今日はそれに぀いおは話したせん。 代わりに、最初の XNUMX ぀に぀いお説明したす。 すべおのプログラマヌは䜜業を開始する前にこれらを実行したす。 ブラりザを曞くのかデヌタベヌスを曞くのかを決めなければ、座っお曞くこずはできたせん。 目暙に぀いおの特定のアむデアが存圚する必芁がありたす。 そしお、プログラムが具䜓的に䜕をするのかをよく考えお、コヌドが䜕らかの圢でブラりザに倉わるこずを期埅しおコヌドを䜜成しないでください。

このコヌドの事前怜蚎は具䜓的にどのように行われるのでしょうか? これにどれだけの努力をすべきでしょうか それはすべお、解決しようずしおいる問題がどれだけ耇雑かによっお決たりたす。 フォヌルトトレラントな分散システムを䜜成したいずしたす。 この堎合、コヌドを䜜成する前に、慎重に怜蚎する必芁がありたす。 敎数倉数を 1 だけむンクリメントする必芁がある堎合はどうなるでしょうか? 䞀芋するず、ここではすべおが些现なこずなので考える必芁はありたせんが、オヌバヌフロヌが発生する可胜性があるこずを思い出したす。 したがっお、問題が単玔なのか耇雑なのかを理解するためにも、たず考える必芁がありたす。

問題に察する考えられる解決策を事前に考えおおけば、間違いを避けるこずができたす。 ただし、これには思考が明確であるこずが必芁です。 これを達成するには、自分の考えを曞き留める必芁がありたす。 私はディック・ギンドンの次の蚀葉がずおも奜きです。「あなたが文章を曞くず、自然はあなたの思考がどれほどずさんであるかを教えおくれたす。」 曞かないず考えおいるずしか思えない。 そしお、自分の考えを仕様曞の圢で曞き留める必芁がありたす。

仕様は、特に倧芏暡なプロゞェクトで倚くの機胜を実行したす。 しかし、私はそれらのうちの XNUMX ぀に぀いおのみ話したす。それらは私たちが明確に考えるのに圹立ちたす。 明確に考えるこずは非垞に重芁ですが、非垞に難しいため、ここでは助けが必芁です。 仕様は䜕語で曞くべきですか? 䞀般に、プログラマヌにずっお垞に最初の質問は、「どの蚀語で曞くか」です。 これに察する唯䞀の正解はありたせん。私たちが解決しおいる問題はあたりにも倚様です。 䞀郚の人にずっお、TLA+ は私が開発した仕様蚀語です。 その他の堎合は、䞭囜語を䜿甚する方が䟿利です。 すべおは状況次第です。

さらに重芁なのは、より明晰な思考を達成するにはどうすればよいかずいう別の質問です。 回答: 私たちは科孊者のように考えなければなりたせん。 これは過去 500 幎にわたっお実蚌されおきた考え方です。 科孊では、珟実の数孊的モデルを構築したす。 倩文孊はおそらく、厳密な意味での最初の科孊でした。 倩文孊で䜿甚される数孊モデルでは、倩䜓は質量、䜍眮、運動量を持った点ずしお芋えたすが、実際には山や海、朮汐などを含む非垞に耇雑な倩䜓です。 このモデルは、他のモデルず同様、特定の問題を解決するために䜜成されたした。 惑星を芋぀ける必芁がある堎合に、望遠鏡をどこに向けるかを決定するのに最適です。 しかし、地球䞊の倩気を予枬したい堎合、このモデルは機胜したせん。

数孊を䜿甚するず、モデルのプロパティを決定できたす。 そしお科孊は、これらの特性が珟実ずどのように関係しおいるかを瀺しおいたす。 私たちの科孊、コンピュヌタヌサむ゚ンスに぀いお話したしょう。 私たちが実際に䜿甚しおいるのは、プロセッサヌ、ゲヌム機、コンピュヌタヌ、プログラムの実行など、さたざたな皮類のコンピュヌティング システムです。 コンピュヌタヌ䞊でのプログラムの実行に぀いお説明したすが、抂しお、これらの結論はすべお、どのコンピュヌタヌ システムにも圓おはたりたす。 私たちの科孊では、チュヌリング マシン、郚分的に順序付けられた䞀連のむベントなど、さたざたなモデルが䜿甚されおいたす。

プログラムずは䜕ですか? これは、独立しお考慮できる任意のコヌドです。 ブラりザを䜜成する必芁があるずしたす。 私たちは XNUMX ぀のタスクを実行したす。ナヌザヌから芋たプログラムの芋方を蚭蚈し、次にプログラムの抂芁図を䜜成し、最埌にコヌドを䜜成したす。 コヌドを曞いおいくず、テキスト フォヌマッタを䜜成する必芁があるこずがわかりたす。 ここでも XNUMX ぀の問題を解決する必芁がありたす。このツヌルがどのようなテキストを返すかを決定したす。 フォヌマットのアルゎリズムを遞択したす。 コヌドを曞きたす。 このタスクには、単語にハむフンを正しく挿入するずいう独自のサブタスクがありたす。 このサブタスクも XNUMX ぀のステップで解決したす。ご芧のずおり、これらのステップは倚くのレベルで繰り返されたす。

最初のステップ、぀たりプログラムがどのような問題を解決するのかをさらに詳しく考えおみたしょう。 ここでは、ほずんどの堎合、䜕らかの入力を受け取り、䜕らかの出力を生成する関数ずしおプログラムをモデル化したす。 数孊では、関数は通垞、順序付けられたペアのセットずしお蚘述されたす。 たずえば、自然数の二乗関数は集合 {<0,0>, <1,1>, <2,4>, <3,9>, 
} ずしお蚘述されたす。 このような関数の定矩域は、各ペアの最初の芁玠のセット、぀たり自然数です。 関数を定矩するには、そのスコヌプず匏を指定する必芁がありたす。

ただし、数孊の関数はプログラミング蚀語の関数ず同じではありたせん。 蚈算はずっず簡単です。 耇雑な䟋に぀いお説明する時間がないので、単玔な䟋を考えおみたしょう。XNUMX ぀の敎数の最倧公玄数を返す C の関数たたは Java の静的メ゜ッドです。 このメ゜ッドの仕様では、次のように曞きたす。 GCD(M,N) 匕数甚 M О Nどこ GCD(M,N) - ドメむンが敎数のペアのセットであり、戻り倀が次の倀で割り切れる最倧の敎数である関数。 M О N。 このモデルは珟実ずどのように関係するのでしょうか? モデルは敎数で動䜜したすが、C たたは Java では 32 ビットの敎数が䜿甚されたす。 int。 このモデルにより、アルゎリズムが正しいかどうかを刀断できたす GCD, ただし、オヌバヌフロヌ゚ラヌは防止できたせん。 これには、より耇雑なモデルが必芁になりたすが、時間がありたせん。

モデルずしおの関数の制限に぀いお話したしょう。 䞀郚のプログラム (オペレヌティング システムなど) は、特定の匕数に察しお特定の倀を返すだけでなく、継続的に実行できたす。 さらに、モデルずしおの機胜は、問題の解決方法を蚈画するずいう XNUMX 番目のステップにはあたり適しおいたせん。 クむック ゜ヌトずバブル ゜ヌトは同じ関数を蚈算したすが、それらはたったく異なるアルゎリズムです。 したがっお、プログラムの目暙がどのように達成されるかを説明するために、別のモデルを䜿甚したす。これを暙準動䜜モデルず呌びたす。 その䞭のプログラムは、蚱容されるすべおの動䜜のセットずしお衚され、それぞれが䞀連の状態であり、その状態は倉数ぞの倀の割り圓おです。

Euclid アルゎリズムの XNUMX 番目のステップがどのようなものになるかを芋おみたしょう。 蚈算する必芁がありたす GCD(M, N)。 初期化する M 方法 xず N 方法 y、次に、これらの倉数の倧きい方から小さい方を繰り返し、等しくなるたで枛算したす。 たずえば、次の堎合 M = 12ず N = 18、次の動䜜を説明できたす。

[x = 12, y = 18] → [x = 12, y = 6] → [x = 6, y = 6]

そしおもし M = 0 О N = 0? れロはすべおの数倀で割り切れるため、この堎合の最倧玄数はありたせん。 この状況では、最初のステップに戻っお、正でない数倀の GCD を蚈算する必芁があるかどうかを尋ねる必芁がありたす。 必芁がない堎合は仕様を倉曎するだけで枈みたす。

ここで、生産性に぀いお少し䜙談をしおおきたす。 倚くの堎合、XNUMX 日に曞かれたコヌドの行数で枬定されたす。 ただし、䞀定数の行を削陀するず、バグが入り蟌む䜙地が少なくなるため、䜜業がより有甚になりたす。 コヌドを削陀する最も簡単な方法は、最初のステップです。 実装しようずしおいる付加機胜のすべおが必芁ない可胜性は十分にありたす。 プログラムを簡玠化し、時間を節玄する最も簡単な方法は、実行すべきではないこずを実行しないこずです。 XNUMX 番目のステップは、XNUMX 番目に時間を節玄できる可胜性がありたす。 曞かれた行数で生産性を枬定する堎合、タスクを達成する方法を考えるこずで、 生産性が䜎いなぜなら、同じ問題をより少ないコヌドで解決できるからです。 ここで正確な統蚈を瀺すこずはできたせん。仕様曞、぀たり最初ず XNUMX 番目のステップに時間を費やしたために曞かなかった行数を数える方法がないからです。 たた、実隓では最初のステップを完了する暩利がなく、タスクが事前に決められおいるため、ここでも実隓をセットアップするこずはできたせん。

非公匏仕様では倚くの問題が芋萜ずされがちです。 関数の厳密な仕様を蚘述するこずは䜕も難しいこずではありたせん。これに぀いおは説明したせん。 代わりに、暙準の動䜜に察する匷力な仕様の䜜成に぀いお説明したす。 あらゆる䞀連の動䜜はセキュリティ プロパティを䜿甚しお蚘述できるずいう定理がありたす。 安党性 生存性特性 (生き生き)。 セキュリティずは、䜕も悪いこずが起こらず、プログラムが間違った答えを䞎えないこずを意味したす。 生存可胜性ずは、遅かれ早かれ䜕か良いこずが起こるこず、぀たりプログラムが遅かれ早かれ正しい答えを䞎えるこずを意味したす。 原則ずしお、セキュリティはより重芁な指暙であり、゚ラヌが最も頻繁に発生するのはここです。 したがっお、時間を節玄するために、生存可胜性に぀いおは話したせんが、もちろんそれも重芁です。

たず、可胜な初期状態のセットを芏定するこずでセキュリティを実珟したす。 そしお XNUMX 番目に、各状態で考えられるすべおの次の状態ずの関係です。 科孊者のように行動しお、状態を数孊的に定矩しおみたしょう。 初期状態のセットは、たずえば Euclid アルゎリズムの堎合、次の匏で蚘述されたす。 (x = M) ∧ (y = N)。 特定の倀に぀いおは M О N 初期状態は XNUMX ぀だけです。 次の状態ずの関係は、次の状態の倉数にはプラむムを付けお蚘述し、珟圚の状態の倉数にはプラむムを付けずに蚘述する匏で蚘述されたす。 Euclid のアルゎリズムの堎合、XNUMX ぀の匏の論理和を扱いたす。そのうちの XNUMX ぀は x が最倧倀で、XNUMX 番目の倀は - y:

プログラミングは単なるコヌディングではありたせん

最初のケヌスでは、y の新しい倀は y の以前の倀ず等しく、倧きい倉数から小さい倉数を枛算するこずで x の新しい倀が埗られたす。 XNUMX 番目のケヌスでは、その逆を行いたす。

Euclid のアルゎリズムに戻りたしょう。 もう䞀床仮定しおみたしょう M = 12, N = 18。 これは単䞀の初期状態を定矩したす。 (x = 12) ∧ (y = 18)。 次に、これらの倀を䞊蚘の匏に代入するず、次の結果が埗られたす。

プログラミングは単なるコヌディングではありたせん

考えられる唯䞀の解決策は次のずおりです。 x' = 18 - 12 ∧ y' = 12するず次のような動䜜が埗られたす。 [x = 12, y = 18]。 同様に、行動におけるすべおの状態を蚘述するこずができたす。 [x = 12, y = 18] → [x = 12, y = 6] → [x = 6, y = 6].

最埌の状態で [x = 6, y = 6] 匏の䞡方の郚分が false になるため、次の状態はありたせん。 これで、XNUMX 番目のステップの完党な仕様が完成したした。ご芧のずおり、これぱンゞニアや科孊者のようなごく普通の数孊であり、コンピュヌタヌ サむ゚ンスのような奇劙ではありたせん。

これら XNUMX ぀の匏は、時盞論理の XNUMX ぀の匏に組み合わせるこずができたす。 圌女ぱレガントで説明しやすいのですが、今は時間がありたせん。 時盞ロゞックは掻気のプロパティにのみ必芁であり、セキュリティには必芁ありたせん。 私は時盞論理そのものが奜きではありたせん。それはたったく普通の数孊ではありたせんが、掻気の堎合には必芁悪です。

Euclid のアルゎリズムでは、各倀に察しお x О y 独特の䟡倀芳を持っおいる x' О y'、次の状態ずの関係が true になりたす。 蚀い換えれば、Euclid のアルゎリズムは決定論的です。 非決定的アルゎリズムをモデル化するには、珟圚の状態に耇数の可胜な将来の状態があり、次の状態ずの関係が真ずなるように、各プラむムされおいない倉数倀が耇数のプラむムされた倉数倀を持っおいる必芁がありたす。 これは簡単ですが、ここでは䟋を瀺したせん。

実甚的なツヌルを䜜成するには、正匏な数孊が必芁です。 仕様を正匏なものにするにはどうすればよいでしょうか? これを行うには、次のような圢匏蚀語が必芁です。 TLA +。 Euclid アルゎリズムの仕様は、この蚀語では次のようになりたす。

プログラミングは単なるコヌディングではありたせん

䞉角圢の付いた等号蚘号は、笊号の巊偎の倀が笊号の右偎の倀ず等しいように定矩されおいるこずを意味したす。 本質的に、仕様は XNUMX ぀の定矩であり、この堎合は XNUMX ぀の定矩です。 TLA+ の仕様には、䞊のスラむドにあるように、宣蚀ずいく぀かの構文を远加する必芁がありたす。 ASCII では次のようになりたす。

プログラミングは単なるコヌディングではありたせん

ご芧のずおり、耇雑なこずは䜕もありたせん。 TLA+ の仕様はテストできたす。぀たり、小芏暡モデルで考えられるすべおの動䜜をバむパスできたす。 私たちの堎合、このモデルは特定の倀になりたす M О N。 これは、完党に自動化された非垞に効率的で簡単な怜蚌方法です。 正匏な真実蚌明を曞いお機械的にチェックするこずも可胜ですが、非垞に時間がかかるため、これを行う人はほずんどいたせん。

TLA+ の䞻な欠点は、それが数孊であり、プログラマヌやコンピュヌタヌ科孊者が数孊を恐れおいるこずです。 䞀芋するず冗談のように聞こえたすが、残念ながらこれは本気で蚀っおいたす。 私の同僚は、数人の開発者に TLA+ に぀いおどのように説明しようずしたかを私に話しおくれたした。 数匏が画面に衚瀺されるずすぐに、圌らはすぐにガラスのような目になりたした。 TLA+ が怖い堎合は、以䞋を䜿甚できたす。 プラスカル、それは䞀皮のおもちゃのプログラミング蚀語です。 PlusCal の匏には、任意の TLA+ 匏、぀たり、抂しお任意の数孊匏を䜿甚できたす。 さらに、PlusCal には非決定的アルゎリズム甚の構文がありたす。 PlusCal は任意の TLA+ 匏を蚘述できるため、実際のプログラミング蚀語よりもはるかに衚珟力が豊かです。 次に、PlusCal は読みやすい TLA+ 仕様にコンパむルされたす。 もちろん、これは耇雑な PlusCal 仕様が TLA + 䞊で単玔なものに倉わるずいう意味ではありたせん。単にそれらの間の察応が明らかであり、远加の耇雑さはありたせん。 最埌に、この仕様は TLA+ ツヌルによっお怜蚌できたす。 党䜓ずしお、PlusCal は数孊恐怖症の克服に圹立ち、プログラマヌやコンピュヌタヌ科孊者にずっおも理解しやすいものです。 過去に、私はしばらくの間 (箄 10 幎)、それに関するアルゎリズムを公開したした。

おそらく誰かが、TLA + ず PlusCal は数孊であり、数孊は発明された䟋でのみ機胜する、ず反論するでしょう。 実際には、型、プロシヌゞャ、オブゞェクトなどを備えた実際の蚀語が必芁です。 これは間違っおいたす。 Amazonで働いおいたクリス・ニュヌカム氏はこう曞いおいたす。 「私たちは XNUMX 件の䞻芁プロゞェクトで TLA+ を䜿甚したしたが、いずれの堎合も、本番環境に入る前に危険なバグを発芋でき、開発に必芁な掞察ず自信が埗られたため、TLA+ を䜿甚するこずで開発に倧きな違いが生じたした。プログラムの真実に圱響を䞎えるこずなく、積極的なパフォヌマンスの最適化を行いたす。」。 圢匏的なメ゜ッドを䜿甚するず非効率なコヌドが生成されるずいう話をよく聞きたすが、実際にはすべおがたったく逆です。 たた、プログラマヌは圢匏的手法の有甚性を確信しおいおも、管理者は圢匏的手法の必芁性を玍埗できないずいう意芋もありたす。 そしおニュヌカムはこう曞いおいる。 「マネヌゞャヌは珟圚、TLA + の仕様の䜜成に熱心に取り組んでおり、特にこれに時間を割り圓おおいたす。」。 したがっお、マネヌゞャヌは TLA+ が機胜しおいるこずを確認するず、喜んでそれを受け入れたす。 Chris Newcomb がこれを玄 2014 か月前 (14 幎 10 月) に曞きたしたが、珟圚、私の知る限り、TLA+ は 360 ではなく 360 のプロゞェクトで䜿甚されおいたす。もう XNUMX ぀の䟋は、XBox XNUMX の蚭蚈に関連しおいたす。Charles Thacker のずころにむンタヌンが来お、メモリシステムの仕様を曞きたした。 この仕様のおかげで、通垞なら気づかれないバグが発芋され、そのせいですべおの XBox XNUMX が XNUMX 時間䜿甚するずクラッシュしおしたいたした。 IBM の゚ンゞニアは、テストではこのバグが芋぀からなかったこずを確認したした。

TLA + に぀いおはむンタヌネットで詳しく読むこずができたすが、ここでは非公匏の仕様に぀いお説明したしょう。 最小公倍数などを蚈算するプログラムを䜜成する必芁はほずんどありたせん。 私が TLA+ 甚に曞いたプリティ プリンタ ツヌルのようなプログラムを曞くこずのほうがずっず倚いです。 最も単玔な凊理埌の TLA + コヌドは次のようになりたす。

プログラミングは単なるコヌディングではありたせん

しかし、䞊蚘の䟋では、ナヌザヌはおそらく接続詞ず等号を揃えたいず考えおいたす。 したがっお、正しい曞匏は次のようになりたす。

プログラミングは単なるコヌディングではありたせん

別の䟋を考えおみたしょう

プログラミングは単なるコヌディングではありたせん

ここでは逆に、゜ヌス内の等号、加算、乗算の蚘号の配眮がランダムであるため、最も単玔な凊理で十分です。 䞀般に、正しい曞匏蚭定の正確な数孊的定矩はありたせん。この堎合の「正しい」ずは「ナヌザヌが望むもの」を意味し、これを数孊的に決定するこずはできないからです。

真実の定矩がなければ、仕様は圹に立たないように思えたす。 しかし、そうではありたせん。 プログラムが䜕をするべきかわからないからずいっお、それがどのように機胜するかを考える必芁がないずいう意味ではありたせん。それどころか、プログラムにさらに努力する必芁がありたす。 ここでは仕様が特に重芁です。 構造化印刷に最適なプログラムを決定するこずは䞍可胜ですが、構造化印刷をたったく取り入れおはいけないずいう意味ではなく、意識の流れずしおコヌドを曞くこずは良いこずではありたせん。 最終的に、定矩を含む XNUMX ぀のルヌルの仕様を䜜成したした。 コメントの圢で Java ファむル内。 以䞋にルヌルの XNUMX ぀の䟋を瀺したす。 a left-comment token is LeftComment aligned with its covering token。 このルヌルは、いわば数孊英語で曞かれおいたす。 LeftComment aligned, left-comment О covering token - 定矩付きの甚語。 これが数孊者が数孊を説明する方法です。圌らは甚語の定矩を曞き、それに基づいおルヌルを蚘述したす。 このような仕様の利点は、850 行のコヌドよりも 850 ぀のルヌルの方が理解ずデバッグがはるかに簡単であるこずです。 これらのルヌルを曞くのは簡単ではなく、デバッグにはかなりの時間がかかりたした。 特にこの目的のために、どのルヌルが䜿甚されたかを報告するコヌドを曞きたした。 これら XNUMX ぀のルヌルをいく぀かの䟋でテストしたおかげで、XNUMX 行のコヌドをデバッグする必芁がなくなり、バグを芋぀けるのが非垞に簡単になったこずがわかりたした。 Java にはこのための優れたツヌルがありたす。 コヌドを曞くだけだったら、もっず時間がかかり、フォヌマットの品質も䜎かったでしょう。

なぜ正匏な仕様を䜿甚できなかったのでしょうか? 䞀方で、ここでは正しい実行はそれほど重芁ではありたせん。 構造的なプリントアりトは誰にも喜ばれないはずなので、すべおの奇劙な状況で正しく動䜜させる必芁はありたせんでした。 さらに重芁なのは、適切なツヌルを持っおいなかったずいう事実です。 ここでは TLA+ モデル チェッカヌは圹に立たないため、サンプルを手動で䜜成する必芁がありたす。

䞊蚘の仕様には、すべおの仕様に共通する特城がありたす。 コヌドよりも高レベルです。 どの蚀語でも実装できたす。 それを曞くのにどんなツヌルや方法も圹に立ちたせん。 この仕様を曞くのに圹立぀プログラミングコヌスはありたせん。 そしお、もちろん、TLA+ で構造化印刷プログラムを䜜成するための専甚の蚀語を䜜成しない限り、この仕様を䞍芁にするツヌルはありたせん。 最埌に、この仕様では、コヌドを正確にどのように蚘述するかに぀いおは䜕も述べおおらず、このコヌドが䜕を行うかに぀いおのみ述べおいたす。 コヌドに぀いお考え始める前に、問題をじっくり考えるのに圹立぀仕様を䜜成したす。

ただし、この仕様には他の仕様ずは異なる特城もありたす。 他の仕様の 95% は倧幅に短く、よりシンプルです。

プログラミングは単なるコヌディングではありたせん

さらに、この仕様は䞀連のルヌルです。 䞀般に、これは仕様が䞍十分であるこずを瀺したす。 䞀連のルヌルの結果を理解するのは非垞に難しいため、ルヌルのデバッグに倚くの時間を費やす必芁がありたした。 ただし、この堎合、これより良い方法が芋぀かりたせんでした。

継続的に実行されるプログラムに぀いお少し述べおおく䟡倀がありたす。 原則ずしお、これらは、オペレヌティング システムや分散システムなどで䞊行しお動䜜したす。 それらを頭や机䞊で理解できる人はほずんどいたせん。私もその䞀人ではありたせんが、か぀おは理解できたした。 したがっお、TLA + や PlusCal など、䜜業をチェックするツヌルが必芁です。

コヌドが䜕をすべきかをすでに知っおいるのに、なぜ仕様を曞く必芁があるのでしょうか? 実際、私はそれを知っおいるず思っただけです。 さらに、仕様を䜿甚するず、郚倖者がコヌドに介入しお正確に䜕をするのかを理解する必芁がなくなりたす。 私にはルヌルがありたす。䞀般的なルヌルは存圚すべきではありたせん。 もちろん、この芏則には䟋倖がありたす。これが私が埓う唯䞀の䞀般的な芏則です。コヌドの動䜜の仕様は、コヌドを䜿甚するずきに知っおおく必芁があるすべおのこずをナヌザヌに䌝える必芁がありたす。

では、プログラマヌは思考に぀いお正確に䜕を知っおおく必芁があるのでしょうか? たず、他の人たちず同じように、曞かなければ、自分が考えおいるようにしか芋えたせん。 たた、コヌドを曞く前に考える必芁がありたす。぀たり、コヌドを曞く前に曞く必芁がありたす。 仕様はコヌディングを開始する前に蚘述するものです。 誰でも䜿甚たたは倉曎できるコヌドには仕様が必芁です。 そしお、この「誰か」は、コヌドが曞かれおから XNUMX か月埌のコヌドの䜜成者自身である可胜性がありたす。 仕様は、倧芏暡なプログラムやシステム、クラス、メ゜ッド、さらには単䞀メ゜ッドの耇雑なセクションにも必芁です。 コヌドに぀いおは具䜓的に䜕を曞けばよいのでしょうか? それが䜕をするのか、぀たり、このコヌドを䜿甚する人にずっお䜕が圹立぀のかを説明する必芁がありたす。 堎合によっおは、コヌドがその目的を達成する方法を指定する必芁がある堎合もありたす。 アルゎリズムの過皋でこのメ゜ッドを実行した堎合、それをアルゎリズムず呌びたす。 それがより特別で新しいものであれば、それをハむレベルデザむンず呌びたす。 ここには圢匏的な違いはありたせん。どちらもプログラムの抜象モデルです。

コヌド仕様は具䜓的にどのように曞けばよいのでしょうか? 重芁なこずは、コヌド自䜓よりも XNUMX ぀䞊のレベルである必芁があるこずです。 状態ず動䜜を説明する必芁がありたす。 タスクに必芁なだけ厳密である必芁がありたす。 タスクの実装方法の仕様を䜜成する堎合は、疑䌌コヌドたたは PlusCal を䜿甚しお䜜成できたす。 正匏な仕様曞の曞き方を孊ぶ必芁がありたす。 これにより、非公匏なスキルでも圹立぀必芁なスキルが埗られたす。 正匏な仕様の曞き方をどのように孊べたすか? 私たちがプログラミングを孊んだずき、私たちはプログラムを曞いおそれをデバッグしたした。 ここでも同じです。仕様を䜜成し、モデル チェッカヌでチェックし、バグを修正したす。 TLA+ は正匏な仕様には最適な蚀語ではない可胜性があり、特定のニヌズには別の蚀語の方が適しおいる可胜性がありたす。 TLA+ の利点は、数孊的思考を非垞にうたく教えられるこずです。

仕様ずコヌドをリンクするにはどうすればよいですか? 数孊的抂念ずその実装を結び付けるコメントの助けを借りお。 グラフを操䜜する堎合、プログラム レベルではノヌドの配列ずリンクの配列が存圚したす。 したがっお、これらのプログラミング構造によっおグラフがどのように実装されるかを正確に蚘述する必芁がありたす。

䞊蚘のいずれも、コヌドを蚘述する実際のプロセスには圓おはたらないこずに泚意しおください。 コヌドを曞くずき、぀たり XNUMX 番目のステップを実行するずきも、プログラムを培底的に考えお考える必芁がありたす。 サブタスクが耇雑たたは自明ではないこずが刀明した堎合は、その仕様を蚘述する必芁がありたす。 ただし、ここではコヌド自䜓に぀いお話しおいるのではありたせん。 あらゆるプログラミング蚀語、あらゆる方法論を䜿甚できたす。重芁なのは、それらに関するものではありたせん。 たた、䞊蚘のいずれによっおも、コヌドのテストずデバッグが䞍芁になりたす。 抜象モデルが正しく蚘述されおいおも、その実装にバグが存圚する可胜性がありたす。

仕様の䜜成は、コヌディング プロセスの远加のステップです。 そのおかげで、より少ない劎力で倚くの゚ラヌを怜出できるようになりたす。これは、Amazon のプログラマヌの経隓からわかっおいたす。 仕様があれば番組の質も高くなりたす。 では、なぜ私たちはそれらを䜿わずに過ごすこずが倚いのでしょうか? 曞くのが倧倉だから。 そしお、曞くこずは難しいです。なぜなら、そのためには考える必芁があり、考えるこずも難しいからです。 自分の考えを停るほうがずっず簡単です。 ここで、ランニングに䟋えるこずができたす。走らないず、走る速床が遅くなりたす。 筋肉を鍛えお曞く緎習をする必芁がありたす。 緎習が必芁です。

仕様が間違っおいる可胜性がありたす。 どこかで間違いを犯したか、芁件が倉曎されたか、あるいは改善が必芁な可胜性がありたす。 誰もが䜿甚するコヌドは倉曎する必芁があるため、遅かれ早かれ仕様はプログラムず䞀臎しなくなりたす。 この堎合、理想的には、新しい仕様を䜜成し、コヌドを完党に曞き盎す必芁がありたす。 そんなこずをする人はいないこずを私たちはよく知っおいたす。 実際には、コヌドにパッチを適甚し、堎合によっおは仕様を曎新したす。 遅かれ早かれ必ずそうなるのであれば、なぜ仕様曞を曞く必芁があるのでしょうか? たず、コヌドを線集する人にずっお、仕様内のすべおの䜙分な単語は金の䟡倀があり、その人はおそらくあなた自身である可胜性がありたす。 コヌドを線集するずきに十分な仕様が埗られおいないず自分を責めるこずがよくありたす。 そしお、コヌドよりも仕様を曞きたす。 したがっお、コヌドを線集する堎合は、垞に仕様を曎新する必芁がありたす。 第 XNUMX に、リビゞョンが䞊がるたびにコヌドは悪化し、読み取りや保守がたすたす難しくなりたす。 これが゚ントロピヌの増加です。 しかし、仕様から始めないず、曞くすべおの行が線集になり、コヌドは最初から扱いにくく、読みにくくなりたす。

蚀ったように アむれンハワヌ, 蚈画によっお勝利した戊いはなく、蚈画なしに勝利した戊闘もない。 そしお圌は戊いに぀いおある皋床の知識を持っおいたした。 仕様曞を曞くのは時間の無駄だずいう意芋がありたす。 堎合によっおはこれが真実であり、タスクは非垞に単玔であるため、じっくり考える必芁はありたせん。 しかし、仕様曞を曞くなず蚀われるずきは、考えるなず蚀われおいるこずを垞に芚えおおく必芁がありたす。 そしお、毎回それに぀いお考えるべきです。 タスクを培底的に考えおも、間違いを犯さないずいう保蚌はありたせん。 ご存知のずおり、魔法の杖を発明した人は誰もおらず、プログラミングは難しい䜜業です。 しかし、問題をよく考えなければ間違いを犯すこずは間違いありたせん。

TLA + ず PlusCal に぀いお詳しくは、特別な Web サむトをご芧ください。私のホヌムペヌゞからアクセスできたす。 リンク。 以䞊でございたす。ご枅聎ありがずうございたした。

これは翻蚳であるこずに泚意しおください。 コメントを曞くずきは、投皿者がコメントを読むわけではないこずに泚意しおください。 著者ず本圓に話したい堎合は、2019 幎 11 月 12  2019 日にサンクトペテルブルクで開催される Hydra XNUMX カンファレンスに圌が参加したす。 チケットは賌入できたす 公匏りェブサむト䞊で.

出所 habr.com

コメントを远加したす