web-dev-qa-db-ja.com

高レベルの管理者に関数型プログラミングを検討するように説得するための良い事実の議論は何でしょうか?

関数型プログラミングが良いアイデアである理由についての「理論的な」議論のトン (未解決の質問としてとどまるには多すぎます、そして正しくそうです)。

ただし、それらのほとんどは、理論(「エレガンス」など)から作成された、または開発者向けの引数です。

問題は、その目的がアイデアを大企業の上級管理職に提示すること(--- /// =)である場合、それらのほとんどがまったく役に立たないことです。主に誰がビジネス引数を気にかけているか:コスト、人的資本管理、製品配送、クライアントサービスと収益;事実だけでは十分に裏付けられない理論上のポイントに関する定量的事実。

関数型プログラミングを概念(特定の言語ではなく)として採用することを検討する限り、これらのビジネス上の懸念に対処するために提示する説得力のある議論はありませんか? OOP、例えばJava/C++ /(Perl | Python)。

できれば、定量的であるか、研究やケーススタディに基づく議論を探しています。例えば。 「このリファレンスによると、LISP/F#のマルチスレッドシステムのバグ率はJavaの10%です」または「上位3の関心事として関数型プログラミングと呼ばれる望ましいテクノロジーの好みを表明しているトップ卒業生の80%」。

私は知っています グラハムはスターアップのための関数型プログラミングの使用例を提示しました 、そしてそれらがより大きな確立された会社に有効であると仮定すると彼の議論のいくつかに門戸を開くでしょう。

psPerlで関数型プログラミングに近いこと、おそらくPythonを、そして(おそらく)Java 8またはC++ 14を実行できることを完全に知っています。しかし、それは、Perlを使用している組織がC++またはJavaは、これらの言語でも機能的アプローチとOOP /手続き的アプローチを推奨します

この言語の目的のために、「大」は、専用の開発エンジニアリング/ツールグループを持つのに十分な大きさと定義されています。これにより、すべての開発者が使用/実行を許可されます。そしてローエンドの少なくとも数百人の開発者

15
DVK

少なくとも経営陣を楽しませる1つの非常に単純な議論があります。

現在のところ周波数スケーリングが限界に達しているため、最近のコンピューターは以前ほど「高速」になっていません。コアを追加することにより、潜在的な生産性が向上します。

これは、このアーキテクチャのメリットを最大限に活用するには、プログラムを並列化する必要があることを意味します。しかし、並列プログラミングは、逐次プログラミングよりもはるかに困難です。それは、並列プログラミングがもたらす多くの新しい課題のためです(包括的な概要については、コンサルト Wiki記事 を参照してください)。

関数型プログラミングは、これらの課題のいくつかを取り除くのに役立ちます。副作用のない不変の変数とメソッドのみを使用する場合、競合状態は適用されません。多くの場合、関数型プログラミングの学習曲線は急勾配ですが、並列プログラミングの学習曲線はより急でさえあり、まったく直感的ではありません。

したがって、より効率的な方法でより効率的なプログラムを作成することが課題である場合、並列プログラムを作成するためのトレーニングの費用と、関数型プログラミングを学ぶためのトレーニングの費用を比較することができ、両方のアプローチがもたらすリスクがあります。

(関数型プログラミングと命令型プログラミングの両方をサポートする)混合言語に関して:ある時点から、それらは移行に便利かもしれません(人々は「慣れ親しんだ」方法でそれらを使用し始め、徐々に新しいアプローチを学ぶかもしれません)。別の点から見ると、関数型プログラミングがもたらす潜在的な利点が誰かの不器用なコードによって取り消される可能性があるため、これは偽装の祝福かもしれません。明確なコーディングガイドラインを確立することでこれを軽減できます(たとえば、「 Effective Scala by Twitter」を参照)。ただし、ガイドラインに従うには、ある程度のチーム成熟度が必要です。この観点から、純粋な関数型言語は、設計によって課されたより厳しい規則のために、ソフトウェア開発にとって「より簡単」かもしれません。

7
Ashalynd

あなたは間違った側からこれに近づいています。ほとんどの企業では、経営陣は「プログラミングパラダイムの選択」に責任を負いません。彼らは、チームの作業を効率化する責任があります(または少なくとも責任があります)。チーム全体で関数型プログラミングが作業の速度や品質を向上させると確信している場合は、管理を説得することも難しくありません。さらに、チームが確立されたプログラミング言語で関数構造を使い始めたばかりで、誰もがそれで満足している場合は、許可を求める必要すらありません(非プログラマーは、機能的および機能的構造、それでなぜあなたは彼とその問題を話し合いたいのですか?).

ただし、他のチームメンバーがFPについて別の見解を持っていて、他のチームメンバーが理解していない自分の機能コードについて不平を言う場合は、経営陣に問題が発生する可能性があることに注意してください。場合、チームは効率を失います。

要点は、他のチームメンバーやチームリーダーを説得することですが、高レベルの管理者ではありません。

編集:あなたのコメントのために-実際には、これはですあなたの質問への答えです;-)。私が話している1つの事実の議論は "チーム全体がFPが仕事をするのに役立つであると考えている)だと思います。高レベルの管理者に受け入れられる可能性があり、実際に適用可能です。技術者以外の人々に技術的な議論を使用しようとすることは、「技術的な理由を理解するのが難しい」という理由ではなく、十分に賢明なためです。技術的な決定は技術的な専門家によって行われるべきであり、1人の専門家だけの意見に依存しないように十分に賢いことも知っています。

40
Doc Brown

関数型プログラミングがなぜ世界に浸透していないのかを理解するには、プログラミング言語の決定の背後にある企業の考え方を理解する必要があります。 Javaを少しの間選択するには:

  1. 通常のJavaコードの連を書くことができるプログラマーの軍隊がいます。これはLISPやHaskell(あるいはScala)のプログラマーには当てはまりません。
  2. 他のすべての人がJavaを使用しているので、Javaは良いはずです。コロラリー:マネージャーは、Javaの選択を正当化する必要はありません。これに対して、コマンド構造の誰も聞いたことのないあいまいな言語に対して。

組織がすでに Kingdom of Nouns に定着している場合、関数型プログラミングに大規模な変更を加えるだけでは起こりません。言語の選択(およびそれを取り巻く他のすべての選択)は、すでに企業文化に深く組み込まれています。

あなたの目標がソフトウェア開発者として成長することであると仮定すると、あなたの最善の策は

  1. 機能的概念を既存のプログラムに組み込み、それらが有用で適切な場合
  2. 言語に追加された新しい関数型言語機能を使用します。
  3. OO関数型言語には存在しない言語の言語不足を克服するために存在するオブジェクト指向のデザインパターンを学ぶ。

Paul Grahamの議論 は本当に新興企業にのみ当てはまり、純粋に関数型言語を使用して始めた企業の多くの注意書きがありましたが、彼らは最初のビジネスの注文があった別の会社に買収されました既存のソフトウェア開発者が理解できるように、機能コードベースをOO言語にすぐに変換します。

16
Robert Harvey

私の(やや皮肉な)経験では、関数型プログラミングを使用しているショップで働いていて、他の数人にインタビューしたことがあります。

  1. CTOや、関数型プログラミングの経験があり、技術的でない幹部に納得させることができる他の高レベルの技術者が常にいました。 (そして、偶然にも、これらの人々は私よりあなたの質問に答える資格があります。)
  2. これらの人々が会社を辞め、この傾向のない人々に置き換えられると、事態は南下します。新しい人たちは、以前に起こったことを構築するために使用された奇妙なプログラミング言語とパラダイムで、うまくいかないことすべて(特に彼ら自身の失敗を含む)を非難するでしょう。彼らは、関数型プログラミングのスキルを持つ残りの人々を取り除き、彼らを会社から追い出します。関数型言語で構築されたシステムは、メンテナンスされていない状態で劣化します。このようなことは、私の考えでは、関数型言語を採用する場合にビジネスが受ける最大のリスクであり、過小評価してはなりません。
  3. これを機能させるには、組織が「購入する代わりに構築する」文化を持つ必要があります。関数型言語を採用すると、「購入」オプションが少なくなるためです。
  4. ほとんど常にsomeアイデアの技術的および非技術的中傷者への妥協がありました。これらの妥協の中で最も一般的なのは、JVM以外の言語は検討対象外だったことです。 ClojureとScalaが提案され、HaskellとO'Camlはすぐに出ました。
9
sacundim

上級管理職がプログラミング言語の選択に関与している場合、または上級管理職が関与している場合の考慮事項(奇妙なことに、彼らはそれを信頼できる知識豊富な人々(テクノロジーとビジネスの両方に精通している人)に任せる必要があります。

  • 生産性
    • 現在および将来の従業員
    • すべての役割(アーキテクト、開発者、テスター、OPなど)
  • サポートされるプラットフォーム
    • オペレーティングシステム(ハードウェア?)
  • 言語/プラットフォームの発行元
    • ライセンス
  • 言語/プラットフォームの成熟度
    • 出版社および/またはコミュニティの/によるサポート
    • 図書館
  • 現在のコードベースの移行
    • またはとの統合

これらは関数型プログラミング言語に固有のものではないことに注意してください。これらのデータを提供しない限り、これらも引数にはなりません。ビジネスの環境に完全に依存しているため、データを提供することはできません。私たちができる唯一のことは、特定の言語についてどれだけの知識と関心があるかを示すためにWebからデータを収集することです。 StackOverflowの多くの質問やLinkedinの多くのタグを人気のある言語に翻訳するときは注意してください。

4
Erno

良い方法の1つは、それが業界で良い結果を示し、採用されていることを示すことです。

以下からデータを取得できます。

理想的には、上場企業のマネージャーと、特にあなたの業界の場合は、マネージャーと話をして、それらから数字と証言を入手するようにしてください。

Googleには、Haskell、OCamlなどの他の多くの同様のリンクがあります。

3
LispGood

議論や事実は役に立たないと思います。そして、確かにあなたが解決したい問題を述べることなしにではありません。

一般的な信念と典型的な自己評価に対して、多くの決定は直感に基づいて行われます。そして、多くの場合、これらの決定は非常に良い決定です。なぜなら、それらは潜在意識レベルで、決定を下す個人の多くの経験を組み込んでいるからです。

「すべてのコンピューターの終わりまでC言語のように固執する」などの決定に異議を唱えたい場合は、いくつかの引数を提供するだけでは不十分です。

最初のステップはおそらく、上級管理職がそのような技術的決定において発言を行うべきであるという決定の背後にある人物と理由を明らかにすることです。もちろん、私はここで推測することしかできませんが、技術担当者が下した決定のかなりの実績がある可能性が非常に高いです。それに直面しよう:ほとんどの開発者は、会社レベルで(技術的であっても)決定を下すのがあまり得意ではありません。

あなたがこれらの人々を見つけたら、そこに信頼を得るために彼らと話します。おそらく最良のアプローチは、それらに耳を傾けることです。彼らが何を心配しているか、彼らが目にするリスクとチャンスは何ですか?彼らが挑戦している問題は何ですか。ここから、テクノロジーの人々をこの種の決定に関与させるために移動するかもしれません。多くの場合、経営陣はこれらの決定を下したくはありませんが、他の人を信頼しません。したがって、あなたのチームがアーキテクチャの決定に関与し始め、提案した決定が健全な管理であることを実証した場合、あなた/あなたのチームを信頼してくれるかもしれません。

適切なアーキテクチャ上の決定を行うために重要なのは、次のとおりです。

  • 利害関係者(管理、ユーザー、管理者、販売、クライアントなど)からの情報を収集する
  • その入力に基づく決定
  • 明確に伝える:(提案された)意思決定とは何か;彼らが緩和することを目指しているどのようなリスク;相反する利益とは何か、そして少し遅れて:彼らがどれだけうまく働いたか。

たとえば、1万人以上の従業員を抱える大企業で働いている場合は、次のレッスンのいくつかを学ぶ準備をしてください。

  • コーディングの速度は、実際の収益とは関係ありません。
  • 数十年規模の保守性のようなものです。
  • 関数型言語を使用して解決できると思われる問題は、実際の収益とは関係ありません。
  • 1000人の開発者をトレーニングするなどの問題、変更への自然な抵抗、および使用するテクノロジーの経験が5年未満の開発者によって記述されたコードベースを維持することです。

議論が聞かれ、検討されるという信頼のレベルに達すると、自分、チーム、および経営陣が信頼する要件を収集して検討する方法も確立されます。

このプロセスで、特定の領域で機能的アプローチを使用するよう推奨する場合は、これで完了です。

このプロセスで、現在のメインプログラミング言語が提供する機能を超えた機能的アプローチを無視するという推奨事項が表示された場合も同様です。

悪いニュースは次のとおりです。会社の規模とスタイルによっては、数年から数十年かかることもあります。

良いニュースは:あなたは途中で多くを学ぶでしょう。

最初のステップは話し始め、特に上級管理職に耳を傾けることですので、まず Just Listen を読むことをお勧めします。

3
Jens Schauder

あなたは間違った方向からこれに来ています。

あなたは自分の娯楽のための機能的パラダイムへの切り替えの管理を説得しようとしている、そしてあなたはそれを望んでいる本当の理由とは何の関係もない、これをサポートするための議論を掻き集めようとしている。そうでなければ、質問をする必要はありません。頭上から引数をリストできるからです。

むしろ、あなたが考えるべきことは、現在のビジネスニーズが何であるか、そしてそれがどのように最善に提供されるかです。機能的なパラダイムを使用して提供するのが最も良い場合は、そうです。 -あなたがプレイするようになります。しかし、運用上のビジネスニーズ、同僚の必要なトレーニング、将来のプログラマーのバックグラウンド、メンテナンスなどを考慮に入れて、公平な分析を行うと、多くの場合そうなりません。

2

技術スキルのない上級管理職は、機能的パラダイムの使用などの技術的側面を気にする必要はありません。これは彼らの専門知識の領域ではなく、マイクロマネージメントの匂いがします。彼らが実際に必要なスキルを持っている人にそれらの決定を委任しないのはなぜですか?

そうは言っても、技術的な背景を持つ人々(最初のケース)とそうでない人々(2番目のケース)を説得するためのヒントをいくつか紹介します。

最初のケース

プログラミングを知っている人と話している場合、関数型プログラミングパラダイムなしで記述されたコードと関数型スタイルで記述された同じコードを比較すると十分説得力があるかもしれません。

命令型スタイルを使用するサンプルC#コード:

var categorizedProducts = new Dictionary<string, List<Product>>();

// Get only enabled products, filtering the disabled ones, and group them by categories.
foreach (var product in this.Data.Products)
{
    if (product.IsEnabled)
    {
        if (!categorizedProducts.ContainsKey(product.Category))
        {
            // The category is missing. Create one.
            categorizedProducts.Add(product.Category, new List<Product>());
        }

        categorizedProducts[product.Category].Add(product);
    }
}

// Walk through the categories.
foreach (var productsInCategory in categorizedProducts)
{
    var minimumPrice = double.MaxValue;
    var maximumPrice = double.MinValue;

    // Walk through the products in a category to search for the maximum and minimum prices.
    foreach (var product in productsInCategory.Value)
    {
        if (product.Price < minimumPrice)
        {
            minimumPrice = product.Price;
        }

        if (product.Price > maximumPrice)
        {
            maximumPrice = product.Price;
        }
    }

    yield return new PricesPerCategory(category: productsInCategory.Key, minimum: minimumPrice, maximum: maximumPrice);
}

関数型プログラミングを念頭に書き直された同じコード:

return this.Data.Products
    .Where(product => product.IsEnabled)
    .GroupBy(product => product.Category)
    .Select(productsInCategory => new PricesPerCategory(
              category: productsInCategory.Key, 
              minimum:  productsInCategory.Value.Min(product => product.Price), 
              maximum:  productsInCategory.Value.Max(product => product.Price))
    );

次に、彼らに尋ねます:

  1. プログラマーは最初のサンプルでいくつの間違いをすることができますか? 2つ目はどうですか?

  2. 間違いを見つけるのはどれほど難しいですか?

  3. コードを変更するのはどれほど難しいですか?

3つの要因すべてが生産性に影響を与えるため、製品のコストにも影響します。

2番目のケース

プログラミングを知らない人を扱っている場合、彼らに伝えることができる技術的なことはあまりありません。説得力のある方法の1つは、自分の仕事と同僚の仕事に対する機能的パラダイムの実際の影響を示すことです。

たとえば、同じチームが作成した2つのプロジェクトを比較します。1つはFPを使用し、もう1つは使用していません。バグの数がはるかに少ないこと、またはこれが会社が実際に時間どおりに提供した最初のプロジェクトであることを十分に納得させる必要があることを示す。

1