コーディングの機能的なスタイルをチームに紹介するにはどうすればよいですか?


10

私のグループのほとんどの人が、関数型プログラミングをほとんどまたはまったく理解していないオブジェクト指向プログラミングのバックグラウンドを持っている状況にあります。クロージャーのような基本的なことすらありません。

それらを関数型コーディングスタイルに導入する良い方法とは何かについて何か提案はありますか?私たちが行う多くのコーディングは、特定のケースに対して機能的な方法を実行する場合、短縮することができます。

機能とコーディングのパラダイムについては、すでにいくつかのプレゼンテーションを行っています。残念ながら、Haskell(基本的にレガシーコードはC、C ++、Java)のような適切な関数型プログラミング言語を使用していないため、これらを使って何でもする必要があります。


11
方法を尋ねる前に、理由を尋ねてください。オブジェクト指向スタイルよりも機能スタイルで簡単に解決できる問題に取り組んでいますか?OOは多くのこと(本当に成功しているのはそのためです)に対して非常にうまく機能し、他の人にとってはあまりよくありません。あなたの質問から、「関数型プログラミングはクールだと思うので、それをサポートする言語がなく、チームが方法を知らなくても、関数スタイルでコードを実行したいそれを行うには!" それは非常に悪い考えです。覚えておいてください、適切な仕事に適切なツール。
メイソンウィーラー、

2
@MasonWheeler:機能性が必要な理由を知っています。今月のクールな言葉ではありません。そのためには古すぎる。
Fanatic23

1
誰かがHaskellを知っているとしましょう、あなたのシステムで動作させることができますか?
JeffO 2012

4
関数型プログラミングは、チームが抱えていない問題を解決しているようです。彼らは、関数型プログラミングの自然な候補ではないC、C ++ Javaのコーディング方法を知っています(クロージャーの実装は、これらの言語ではひどい恐ろしいものです)。
Jamesアンダーソン、

回答:


8

Luca Bologneseがこの素晴らしいプレゼンテーションを行い、コーヒーの例を使用して(F#を提示するために)関数型プログラミングを紹介しました。これは本当に素晴らしいもので、友人や同僚に関数型プログラミングを紹介するのに大いに役立ちました。

また、Petricekによる現実世界の関数型プログラミングを見ることができます。これは、私の考えでは、関数型の考え方を始めるための優れた方法です。


そのプレゼンテーションは素晴らしいです。特にそれは吸血鬼によって与えられるので!笑!!j / k ..男たちはカリスマを得た..
ハンゾロ

7

同僚は仕事以外でコードを書いていますか?

会社でFPをまったく行っていないことを考えると、直接の仕事以外で何もしないときに誰かに新しい言語やパラダイムを学ばせることは、ほぼ不可能です。

もしそうなら、関数型プログラミングに関連する、彼らが気に入るであろう興味深いプロジェクトを見つけて、それらを見せてください。あなたは変更を強制する立場にないので、個人的なレベルで興味があれば種をまく必要があります。これが私に紹介された方法です-確かに、たまたま一緒に働く親友から。

それ以外では、ほとんどの人が小さなタスクを簡単にするための社内ツールを書いています。それらのいくつかを関数型言語で記述してみてください。コードを見たい人は誰でも、(できれば/おそらく)コードの美しさにさらされ、そうしたときにあなたにたずねるでしょう。それはアイデアを販売する機会です。

スタックで機能する関数型言語があることを覚えておいてください(Scala /クロージャーは両方ともJVMで実行されます)。Haskellのように「完全に機能する」わけではありませんが、長い旅の良いスタートです。

採用を管理できる場合は、関数の経験がある人(または少なくとも関数型プログラミングに興味がある人)を雇ってください。

そして最後に...関数型コードを書くことに情熱を傾けているなら、あなたは間違った会社にいるかもしれません。会社全体でソフトウェアを作成する方法を変更するつもりはありません-特に彼らがお金を稼いでいる場合はなおさらであり、さらに合理的には短時間ではありません。

これはすべて開発者に販売することです...管理はまったく別の獣です。


2

命令型プログラミングから純粋な関数型プログラミングへの切り替えは、学習曲線が急激に変化する大きな変化です。私はそれほど迅速でない移行を試みることをお勧めします。その場合、多くのオプションがあります。たとえば、Pythonはリスト内包表記とジェネレータ式をサポートし、Rubyはコードブロックなどを介して高次関数をサポートします。Javaについて述べたので、Javaのバックグラウンドがあり、完全な関数型プログラミングサポートが必要な場合は、Scala試すことができます。


2

関数型プログラマを雇う(または上司に雇わせる)

結局、これはあなたのチームの他のメンバーをこすり落とすことになります。

また、前に述べたように、オフタイム中に関数型言語でコードを書くように奨励しても、害はありません。


2

関数型プログラミングが実際にあなたの場合をはるかに楽にするなら、私はそのようなケースを分離し、OOと関数型言語の両方で同等の実装を同僚に示すことをお勧めします。

複雑さの違いがあなたが言うほど広い場合、これはそれ自体が物語るはずです。


2

Scalaについて言及するための+1からfaif:これは、その回答に対するコメントとして始まりましたが、大きくなりすぎました...

私は関数型プログラミング(C / C ++、一部のPython、錆びたJavaからのもの)について何かを学びたいと思いました。私はOcamlを使ってディープエンドに飛び込み、それからHaskellに飛び込みました。次に、Scalaを試してみたところ、機能的なアプローチが私を回避したときに、慣れ親しんだ命令スタイルに簡単にフォールバックできる快適なOOP / Java-ey環境で機能的なものを使い始めることができました。言語の「マルチパラダイム」、「ハイブリッド」の性質に文句を言う人もいるかもしれませんが、「純粋な関数型」に移行することを強制されることは決してありませんが、実際に物事に取り組み、理解できることを意味します。必要なときに、なんとかして実際の作業を簡単に行うことができます。

数年後(およびScalaでの200以上のProject Euler Scalaソリューション)、Functionalとの遭遇は間違いなく私のPythonに影響を与えました(マップ、フィルター、リデュース、ラムダ、イターツール、リスト内包表記、および関数の受け渡しをはるかに使用) d以前に考えられていた)および程度は低いがC ++:STLの機能トラッピングを使用する試みがもう少し多いかもしれませんが、主な影響は、TBBのmap / reduce構成を使用する方がはるかに快適で、不変性を利用して複雑さを緩和できることですマルチスレッドコード。

個人的には、私があなただったら、Javaワールドの開発の一部にScalaを導入することを主張します。できれば、Scalaの例を大幅に簡略化して、主張するメリットを生み出すことをお勧めします。次に何が起こるかは、新しいアイデアを「推進」し、変化を推進するという事業全体にかかっています...これは、はるかに大きな問題であるように思えます。


1
@timeday非常によく言った。私はJava / OOの人です。私は1年前にScalaを入手しました。そして私がFPを学ぶことは私にとって非常に困難でした。私は少しずつやっていて、それに座っています。私は一度にそれをすべて取得しようとはしていません。
chaotic3quilibrium

1

Scalaを使用した段階的なアプローチをお勧めします。そして、私はScalaの作者の本、「Programming in Scala、2nd Edition」から始めることをお勧めします。この本は、Scalaを使用した(FP)関数型プログラミングの1つをゆっくりと紹介する点で素晴らしいです。そして、FPへの移行を示す際に、OOを拒否しません。実際、それを活用しています。現在、2回目の通過を行っています。

基本的に、Scalaでは「セミコロンなしで」Java / OOを実行できます。そして、独り占めする必要なく、FPを少し試すことができます。たとえば、FPを行うためのトレーニングでは、通常、クラスメソッドレベルでの参照透過性に焦点を当てますが、最初のパスを行うために必要な変数、可変性、命令性をメソッドに持たせます実装。次に、各メソッドをゆっくりと再加工して純粋なFPに移行することに焦点を当てます。また、私はStackOverflowの姉妹サイトであるCodeReviewを使用して、私の精神的/思考の移行を支援しています。これが私がこれをまさにやった最近の投稿のです。

とにかく、あなたのFPの旅で最高の幸運を。:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.