コードを最小限に抑え、データ哲学を最大化することについての考え

StackOverflow https://stackoverflow.com/questions/4397883

  •  10-10-2019
  •  | 
  •  

質問

コードを最小限に抑えてデータを最大化するという概念を聞いたことがありますが、自分のシステムを構築するときに他の人がどのように/なぜこれを行うべきかについて、どのようなアドバイスを私に与えることができるのか疑問に思っていました。

役に立ちましたか?

解決

最新のソフトウェアでは、コードとデータの間のラインは非常に薄くぼやけている可能性があり、2つを区別するのは必ずしも簡単ではありません。結局のところ、コンピューターに関する限り、すべてが データ, 、既存のコード(通常はOS)によって決定されない限り、それ以外の場合。 CPUがそれらを実行する前に、プログラムをデータとしてメモリにロードする必要があります。

たとえば、注文のコストを計算するアルゴリズムを想像してください。 Cで書かれた店舗の大規模なソフトウェアシステムの一部です。

このアルゴリズムはCで記述されており、さまざまな項目ごとの価格と対応する順序サイズのしきい値で管理者が提供する入力テーブルを含むファイルを読み取ります。ほとんどの人は、単純な入力テーブルを持つファイルはもちろんデータであると主張するでしょう。

ここで、ストアが事前に選択されたしきい値ではなく、ある種の漸近機能にポリシーを変更し、非常に大きな注文に対応できると想像してください。彼らはまた、為替レートとインフレ、または管理者が思いつく他のものを考慮したいと思うかもしれません。

ストアは有能なプログラマーを雇い、元のCコードに素敵な数学的表現パーサーを埋め込みます。入力ファイルには、グローバル変数を含む式、次のような関数が含まれるようになりました。 log()tan(), 、およびそのようないくつかの単純なもの プランクコンスタント とのレート 炭素-14 劣化。

cost = (base * ordered * exchange * ... + ... / ...)^13

ほとんどの人は、テーブルほど単純ではないとしても、この表現は実際にはデータであると主張するでしょう。結局のところ、それはおそらく経営陣によってそのまま提供されます。

店は、費用を見積もるために脳をかきたてたクライアントから大量の苦情を受け取り、会計の人々から大量のゆるい変化について人々から受け取っています。店は小さな注文のためにテーブルに戻り、 フィボナッチシーケンス 大規模な注文の場合。

プログラマーはCコードの変更と再コンパイルに飽きるため、代わりにPythonの解釈を埋め込みます。入力ファイルには、部屋のようなポーリングを行うPython関数が含まれています。 Fib(n) 大量注文の費用のためのサル。

質問:これ 入力ファイルデータ?

厳格な技術的な点から、何も違いはありません。テーブルと式の両方が、使用前に解析する必要がありました。数学的な式パーサーは、おそらく分岐と機能をサポートしています - それは完全に完全に変化していなかったかもしれませんが、それでも独自の言語を使用していました(例:MATHML)。

まだ 多くの人々は、入力ファイルがちょうどなったと主張するでしょう コード.

それで、何ですか 特徴的な機能 これにより、入力形式はからです データ の中へ コード?

  • 修正可能性: 変化をもたらすためにシステム全体を再コンパイルしなければならないことは 非常に コード中心のシステムの適切な兆候。しかし、私は簡単に想像できます(まあ、私が実際に持っているように 見た)コンパイル時に入力テーブルが組み込まれているのをたとえて無能に設計されたソフトウェア。そして、多くのアプリケーションがまだアイコンを持っていることを忘れないでください - ほとんどの人がみなす データ - 実行可能ファイルに組み込まれています。

  • 入力形式: これは - 私の意見では、素朴に - 人々が考慮する最も一般的な要因です。 「プログラミング言語の場合、コードです」. 。罰金、Cはコードです - 結局のところそれをコンパイルする必要があります。また、Pythonもコードであることに同意します-IT 完全に吹き飛ばされた言語。なぜ そうではありません XML/XSLコード? XSL それ自体が非常に複雑な言語です - したがって L その名前で。

私の意見では、これらの2つの基準はどれも実際のものではありません 特徴的な機能. 。人々は何か他のものを考えるべきだと思います:

  • 保守性: 要するに、 ユーザー システムの第三者を雇うには 専門知識 利用可能なシステムの動作を変更するために必要な場合、システムはある程度コード中心と見なす必要があります。

これは、もちろん、システムがデータ駆動型であるかどうかを少なくとも考慮すべきかどうかを意味します ターゲットオーディエンスに関連して - ケースバイケースでクライアントに関連していない場合。

また、利用可能なツールセットによって区別が影響を受ける可能性があることも意味します。 uml 仕様は通り抜ける悪夢ですが、最近では私たちを助けるためのすべてのグラフィカルなUMLエディターがあります。自然言語を解析してXML/Python/を生成するある種のサードパーティのハイレベルAIツールがある場合、システムははるかに複雑な入力でもデータ駆動型になります。

小さな店には、おそらく第三者を雇う専門知識やリソースがないでしょう。したがって、労働者が平均的な管理コース(数学、チャートなど)で得られるという知識で行動を変更できるようにするものは、この視聴者にとって十分にデータ駆動型と見なされる可能性があります。

一方、数十億の国際企業は通常、給与にITスペシャリストとWebデザイナーの束を持っています。したがって、XML/XSL、JavaScript、またはPythonとPHPでさえ、おそらくそれが処理できるほど簡単です。また、より単純なものがそれをカットしないかもしれないほど複雑な十分な要件があります。

ソフトウェアシステムを設計するとき、ターゲットオーディエンスが彼らができることを行うことができる使用済みの入力形式でその微妙なバランスを達成するよう努力する必要があると思います 必要 に、 それなし サードパーティを頻繁に呼び出す必要があります。

アウトソーシングは線をさらに曖昧にすることに注意する必要があります。かなりの数の問題がありますが、現在のテクノロジーでは、レイマンがソリューションを親しみやすくすることはできません。その場合、ソリューションのターゲットオーディエンスは、おそらく操作が外部委託される第三者と見なされるべきです。その第三者は、かなりの数の専門家を雇用することが期待できます。

他のヒント

通常、データ駆動型のコードは読み取りと保守が簡単です。データ駆動型が極端に引き継がれ、非常に使用できないケースを見てきました(私が使用したSAPの展開を考えています)が、独自の「ドメイン固有言語」をコーディングして構築するのに役立ちますあなたのソフトウェアは通常、巨大な時間の節約です。

実用的なプログラマー 私が読んだ小さな言語を書くことの最も鮮明な支持者である私の心にとどまります。入力言語をほとんど実行できない小さな状態マシンは取得できます 多く スペースが非常に少ないことで達成され、修正を簡単にすることができます。

具体的な例:税括弧が1,000ドル、10,000ドル、100,000米ドルの進歩的な所得税システムを検討してください。 1,000ドル未満の収入は税が控えられません。 1,000ドルから9,999ドルの収入は10%で課税されます。 10,000ドルから99,999ドルの収入は20%で課税されます。 100,000ドルを超える収入は30%で課税されます。これをすべてコードで書いていた場合、疑うように見えるでしょう。

total_tax_burden(income) {
    if (income < 1000)
        return 0
    if (income < 10000)
        return .1 * (income - 1000)
    if (income < 100000)
        return 999.9 + .2 * (income - 10000)
    return 18999.7 + .3 * (income - 100000)
}

新しいタックスブラケットを追加したり、既存のブラケットを変更したり、ブラケットの税負担を変更するには、コードを変更して再コンパイルする必要があります。

ただし、データ駆動型の場合は、このテーブルを構成ファイルに保存できます。

1000:0
10000:10
100000:20
inf:30

このテーブルを解析するための小さなツールを書いて、ルックアップを行います(それほど難しくありませんよね?) 誰でも 税率の表を簡単に維持できます。議会が1000のブラケットの方が良いと判断した場合、誰でもテーブルをIRSテーブルと並べ、それを使用することができ、コード再コンパイルは必要ありません。同じジェネリックコードを1つのブラケットまたは数百のブラケットに使用できます。

そして今、少し明白なものについて:テスト。 Apparmor プロジェクトには、さまざまなプロファイルがロードされたときにシステムが呼び出すべきことについて何百ものテストがあります。 1つのサンプルテストは次のようになります。

#! /bin/bash
# $Id$

#   Copyright (C) 2002-2007 Novell/SUSE
#
#   This program is free software; you can redistribute it and/or
#   modify it under the terms of the GNU General Public License as
#   published by the Free Software Foundation, version 2 of the
#   License.

#=NAME open
#=DESCRIPTION 
# Verify that the open syscall is correctly managed for confined profiles.  
#=END

pwd=`dirname $0`
pwd=`cd $pwd ; /bin/pwd`

bin=$pwd

. $bin/prologue.inc

file=$tmpdir/file
okperm=rw
badperm1=r
badperm2=w

# PASS UNCONFINED
runchecktest "OPEN unconfined RW (create) " pass $file

# PASS TEST (the file shouldn't exist, so open should create it
rm -f ${file}
genprofile $file:$okperm
runchecktest "OPEN RW (create) " pass $file

# PASS TEST
genprofile $file:$okperm
runchecktest "OPEN RW" pass $file

# FAILURE TEST (1)
genprofile $file:$badperm1
runchecktest "OPEN R" fail $file

# FAILURE TEST (2)
genprofile $file:$badperm2
runchecktest "OPEN W" fail $file

# FAILURE TEST (3)
genprofile $file:$badperm1 cap:dac_override
runchecktest "OPEN R+dac_override" fail $file

# FAILURE TEST (4)
# This is testing for bug: https://bugs.wirex.com/show_bug.cgi?id=2885
# When we open O_CREAT|O_RDWR, we are (were?) allowing only write access
# to be required.
rm -f ${file}
genprofile $file:$badperm2
runchecktest "OPEN W (create)" fail $file

一部のヘルパー関数に依存して、プロファイルを生成およびロードし、関数の結果をテストし、ユーザーに報告します。これらの小さなテストスクリプトを拡張する方が、この種の機能を少し言語なしで記述するよりもはるかに簡単です。はい、これらはシェルスクリプトですが、実際のシェルスクリプトからこれまで削除されています;)それらは実際にデータであるということです。

これがデータ駆動型のプログラミングの動機付けに役立つことを願っています。私はそれについて書いた他の人ほど雄弁ではないのではないかと心配しています、そして私は確かに得ていません 良い それで、しかし私はしようとします。

下の5つの格言の1つ Unix哲学, 、によって提示されているように ロブパイク, 、 これは:

データが支配的です。 適切なデータ構造を選択し、物事をうまく整理した場合、アルゴリズムはほとんど常に自明です。アルゴリズムではなくデータ構造は、プログラミングの中心です。

多くの場合、「スマートデータを使用する愚かなコードを書く」に短縮されます。

他の答えは、特定の入力のパターンに反応する単純なコードで複雑な動作をしばしばコーディングする方法をすでに掘り下げています。データをドメイン固有の言語と考えることができ、コードは通訳者(たぶん些細なもの)と考えることができます。

たくさんのデータが与えられると、さらに進むことができます: 統計学 決定を下すことができます。ピーター・ノーヴィグは書いた 素晴らしい章 このテーマを示しています 美しいデータ, 、テキスト、コード、およびデータをすべてオンラインで利用できます。 (開示:私は謝辞で感謝されています。)pp。238-239:

データ駆動型のアプローチは、プログラマーが明示的なルールをコーディングするより伝統的なソフトウェア開発プロセスと比較してどのように比較されますか? ...明らかに、手書きのルールを開発して維持することは困難です。データ駆動型の方法の大きな利点は、データに多くの知識がエンコードされており、より多くのデータを収集するだけで新しい知識を追加できることです。しかし、もう1つの利点は、データが大規模である可能性があるものの、コードは簡潔であることです。 correct, 、ht:// digのスペルコードの1,500以上と比較してください。 ...

別の問題は、移植性です。ラトビアのスペル補助器が必要な場合、英語のメタホンのルールはほとんど役に立たないでしょう。データ駆動型を移植します correct 別の言語のアルゴリズム、必要なのはラトビア人の大きなコーパスだけです。コードは変更されていません。

彼は、Googleで収集されたデータセットを使用して、Pythonのコードとこれを具体的に示しています。スペルの修正に加えて、単語をセグメント化し、暗号造影を解読するコードがあります - ほんの数ページで、ここでも Grady Boochの本 それを終えることさえせずに数十を費やしました。

「データの不合理な有効性」 すべてのナットとボルトなしで、同じテーマをより広く開発します。

私はこのアプローチを別の検索会社のために取り上げてきましたが、テーブル駆動型/DSLプログラミングと比較して、それはまだ未熟さではないと思います。私たちのほとんどは過去10年か2年までデータをあまり泳いでいなかったからです。

コードをデータとして扱うことができる言語では、それは問題ではありません。ソリューションが必要とするように、データ、コード、機能、OO、または手続きに傾いて、明確で簡単な、保守可能なものを使用します。

手続き上では、区別がマークされており、データについて次のように考える傾向があります。 なにか に保存されています 明確 方法ですが、手続き上であっても、を隠すのが最善です データ APIの後ろ、またはOOのオブジェクトの後ろ。

a lookup(avalue) 関数として始まる限り、その生涯の間に多くの異なる方法で再現することができます。

...私は常に存在しないマシンのプログラムを請求し、「ここでプリミティブを含むマシンがあった場合、仕事は完了しました。」 ...実際には、もちろん、この理想的なマシンは存在しないことが判明します。そのため、次のタスク(元のタスクと構造的に似ています)は、「アッパー」マシンのシミュレーションをプログラムすることです...多くのプログラムは、おそらく確率が存在しないマシン用に書かれているため、次の仕事は次の低レベルのマシンなどのプログラムの観点からシミュレートすることです。私たちのハードウェア...

Ew Dijkstra構造化プログラミングに関するメモ, 、1969年、引用されています ジョン・アレン, 、 の LISPの解剖学, 1978.

私がかなり同意するこの哲学を考えるとき、最初に思い浮かぶのはコード効率です。

私がコードを作成しているとき、私はそれが常に完璧に近いものではないことを確実に知っています。必要なときにマシンから最大の効率に近づくのに十分であり、残りの時間(おそらくより良いワークフローのためにトレードオフ)により、高品質の完成品を生産することができました。

データ駆動型の方法でコーディングすると、コードのためにコードを使用することになります。ファイルへのすべての変数を「外部委託」するには愚かに極端になります。プログラムの機能はプログラムに含まれている必要があり、コンテンツ、設定、その他の要因はプログラムによって管理できます。

これにより、はるかに動的なアプリケーションと新機能が可能になります。

データベースの単純な形式さえある場合は、同じ機能を多くの状態に適用できます。また、ファイルヘッダーデータまたはおそらくディレクトリ、ファイル名、または拡張機能に基づいてプログラムが行っていることのコンテキストを変更するなど、あらゆる種類の創造的なことを行うこともできますが、すべてのデータがすべてではありません。 必要な ファイルシステムに保存されています。

最後に、単にデータを処理している状態にコードを保持すると あなたが実際に起こっていることを想像することに近い心の状態で。また、これにより、コードからの大量を排除し、ブロートウェアを大幅に削減します。

コードがよりメンテナンスしやすく、より柔軟で、より効率的なAAANANDを気に入っていると思います。

これについてもご意見をお寄せいただきありがとうございます。とても励みになりました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top