社員ブログ
HOME  社員ブログ

アーカイブ

‘社員:プリースト’ カテゴリ

オブジェクト指向プログラミングと関数型プログラミング – 最適な組み合わせは何か?

2015年01月19日 0時16分33秒

こんにちは、プリーストです。

個人的な出来事ですが、去年の夏にSoftware Designの2014年9月号のきしださんの記事を立ち読みして衝撃を受けました。

SoftwareDesign9月号でオブジェクト指向の記事を書きました

詳しくは覚えていないけれども、現在の技術動向はオブジェクト指向プログラミングを正しく使えば常に最適解が得られるのというのは幻想で、関数型プログラミングやステートレスなアーキテクチャの方が最適解を得られることが多くなってきているという話だった気がします。

関数型プログラミングについては、Scalaの研修でコレクションの処理や大量データを並列に処理する場合にはシンプルに記述できるなぁという程度の理解でした。 オブジェクト指向プログラミングとは絶対的な思想ではなく、単にシステム要件や扱うデータをソースコードとして整理する時に綺麗に整理できる技術、という理解を自分もしていて、そこはきしださんに共感できました。

衝撃を受けたのはシステムに状態を持たない事が最適というケースが増えてきているということでした。Webシステム実装の動向などについて知り合いの開発者からセッション管理についてのことなどをちらっとは聞いていましたが、きしださんの記事では保守性や変更に対する柔軟さも言語機能で複雑に共通化して管理するより、TDDやCIなどを実現するミドルウェアやツールで改修時の品質を担保した方が効率が良くなってきているとのことたっだと思います。

その記事を読むまでは、顧客要求に無関係の開発・保守効率のみを考慮した場合の技術的な最適解はクラスを用いてドメインを正しく設計すること、RDBなどのデータストアのモデルとシステム内ドメインモデル更にUIのデータ構造間の変換を適切な粒度で共通化しコントロールすることと考えていたので、きしださんの記事を読んでから最適解を判断する時の軸が分からなくなっていました。 その時は最終的にはドメイン駆動開発的に業務で使用するデータモデルとシステム内ドメインモデルを同期させ続ける方向とは別の最適解があるらしいとぼんやり理解して半年経った今もそれはいまだに分からないままです。

ただ、最近では何が分からないかがなんとなく分かってきた気がします。

オブジェクト指向プログラミング以前のシステムの組み方は、要求された処理を階層的に分解して整理する構造化プログラミングというやり方でした。それだと処理は整理できますがシステムの状態(変数)が管理できずに改修時に影響する変数を使用している箇所を全て洗い出して調査し、全ての箇所を新要件に合わせて改修しかつ既存のシステム要件に影響を与えていないか網羅的にテストをする必要がありました。現在の開発現場でも残念ながらほとんどいまだにこの苦労をしている現場が多いのが現状です。

オブジェクト指向プログラミングが目指したのは、処理を分解して整理するのみではなくシステムの状態(変数)をオブジェクトに閉じ込めてオブジェクト同士のネットワークとしてシステムを構築することでシステムが持つ状態(変数)の定義変化に対する影響範囲を限定しシステム全体の見通しも良くするということだと理解しています。

それと比較して関数型プログラミングのパラダイムは処理を関数として分解して整理することは構造化プログラミングと同じですが、構造化プログラミングとは異なり関数型言語自体がそもそも状態をシステムに持たないことを前提として設計されています。UIやDBは状態を持ちますが、UIからDB間の処理の時に使用するデータは引数として受け渡すということだと思います。 それならUIをVBで設計して処理は全てSQLで書き下すような設計と大差ない気がしますが、恐らく状態の変化を禁止するという関数型言語の特性と関数型言語が持つ表現力が、状態を管理せずとも見通しが良くなることを実現可能にするんじゃないかなと思います。

システム要件をUI設計及びシステムのソースコードとDB構造として抽象化する時に、インプットとアウトプット間の状態変化を禁止し処理を関数のネットワークとして整理することが最適解となるかもしれないということかなと想像しています。そういうことができたら状態を持たないことを強制することができ確かにテストや管理は格段に楽になる可能性があります。

そう考えた時に、ではなぜオブジェクト指向プログラミングではシステム内でモデルを定義して状態を保持する必要があったのか、まだきちんと理解していない事に気が付きました。 この問題は今までもトランザクションスクリプトとしてユースケースやユーザのアクション毎に処理を分けて書き下すか、ドメインモデルとして要件が必要とするデータ構造をシステムが扱いやすく見通しやすく抽象化してモデルに対して処理を記述していくかという選択の問題として存在していた気がします。 実際の現場でも、各画面毎に意識的に共通化せずに処理を分けているようなシステムがあり、それはそれで大規模なシステムを大人数で分業する場合には影響範囲がシンプルで管理しやすいなと感じたりしています。 関数型プログラミング的な書き方とオブジェクト指向プログラミング的な書き方を使い分ける時になぜシステム内にモデルが必要だったのかを理解することが必要だと感じています。 システムで処理しやすいデータ構造の定義とシステム内でのデータの保持がいったいどのケースで有効でどのケースで不利となるかということでもあるかなと。

もうひとつ分からないのは単なる勉強不足ですが、関数型言語の機能です。関数型言語が備える機能が、手続き型言語で単に状態を持たせずに実装した場合と比較して恐らくとてもシンプルに見通し良く整理できるのだと思います。その機能の概念と意義を理解しないと使い分けられないなと思いました。

それから、ビッグデータを扱う場合などに使用する非構造型データストアや分散型のプラットホーム、ブラウザでのHTML5などによる最新のデータ表現方法、最新のWebでのセッション等の状態管理の方法など、どこでどういう状態(変数)の変化と保持が必要なのかもしくは不要なのかが分からないと判断できないと感じます。

今、ようやく分からないことが見えてきて、まぁ僕は全く分かっていなくて勉強不足なことが改めて自覚できてなんとなく面白くなってきました。 本当に刺激を与えてくれたきしださんには感謝したいです。

やはり、JavaやC#、Rubyといった汎用プログラミング言語から更に抽象化を進めて効率化するにはケースバイケースの選択が必須なんだなーと感じております。

顧客要求やシステム要件を抽象化する時に、システム構造、プログラミング言語、フレームワーク、プラットフォーム、開発環境などに加えて、どのパラダイムで実装すべきも顧客要件や機能、システムの種類や機能・処理の種類毎に使い分ける必要が出てくるということです。 選択肢が広がってますます難しくなりますが、開発・保守を楽にする為にいろんな人が新しい技術を開発し選択肢が広がっているはずなので、今後はプログラミングの実装自体のスピードよりも、きちんとした技術概念の理解と顧客要求や開発要員スキルの理解に基づいて適切な判断と選択ができるかどうかが、楽に開発できるかどうか開発コストがどれだけかかるかをますます左右していくんだなぁと予想しています。

まずは、きちんときしださんの記事を読み返すところから始めようかな。

それではまた♪


社員:プリースト, 開発言語 , , ,

Grailsを動かしてみる-パッケージ管理システムを使ったインストール(Windows)

2014年12月9日 6時25分18秒

こんにちはプリーストです。

今回はずっとやろうと思っていたGroovy/Grailsを動かすことをやってみようと思います。

以前にこんな記事を書きましたが、やっと手をつけられました(^_^;)

そろそろ Groovy / Grails やってみようかな

最近、Windowsにアプリケーションをインストールする時にはコマンド一発でインストールしてくれる
Chocolateyというパッケージ管理システムを使っているのでこれでインストールしてみようと思います。
Linuxを使っている人にはお馴染みのパッケージ管理システムがWindowsでもあるんだよということで紹介です。

この方もChocolateyでのGrailsインストールを試しています。
Windowsで10分かからずGrailsの環境を作る

まず、Chocolateyのインストールから

Windowsソフトを管理!パッケージ管理システムChocolateyでインストール、アップデートを簡単にする

コマンドプロンプトに以下のコマンドをコピーし実行します。

>@powershell -NoProfile -ExecutionPolicy unrestricted -Command “iex ((new-object net.webclient).DownloadString(‘https://chocolatey.org/install.ps1’))” && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
 

PowerShellがインストールされていない場合にはインストールしてから実行してください。
コマンドは以下のHPにあります。
https://chocolatey.org/



そして、次にJDKをインストール
>choco install java.jdk

Grailsをインストール
> choco install grails

これで完了です。

次にGrailsを動かしてみます。

>grails create-app myapp
| Created Grails Application at C:\Users\sophia\myapp

>cd myapp

>grails run-app myapp
| Server running. Browse to http://localhost:8080/myapp


表示されたURLにアクセスすると、Grialsアプリのデフォルトページが表示されます。
これを見ると、tomcatなどの動作に必要なものが既にインストールされていることが分かります。

Grails version: 2.2.1
Groovy version: 2.0.7
JVM version: 1.7.0_60
jquery – 1.8.3
tomcat – 2.2.1


次はeclipseを使って少しずつアプリを作ろうかなと思います。

それではまた♪


社員:プリースト

ITエンジニアの多能工化について - ビジネスかIT技術かの論争に思う

2014年10月1日 6時35分09秒

こんにちは。プリーストです。


今回は別のことを書こうと思っていたのですが、思いついたことがあったのでITエンジニアの多能化について書こうと思います。

以前に日本の金型職人が不況に見舞われた際に職人の多能工化、つまり職人の仕事と営業の仕事など複数の職能を身につけることで農閑期を短縮し稼働率を上げピンチを乗り切ったという話を聞いたことがあります。

私も以前にIT技術者も同じような手法で不況を乗りきれるのではないかと考えたことがありましたが、自分の中ではそれほど重要なアイディアではありませんでした。

最近、私としては珍しく上流工程に関わる事が多かったこともあり、技術だけではない交渉や調整、組織や人間に関わることが多くなりました。
そこで感じたことは、ビジネスに関わる業務、人、組織はわりと面白いなということでした。元々私にとってITはブラックボックスで、学んでも学んでも知り尽くすことはできないという所がとても魅力的でこの業界を目指したということがあります。
でも、組織や人間、ビジネスはITより更にパターンが豊富で更に知り尽くすことができない興味深いものだと感じました。

そういう自分の変化もあり、IT技術者は技術だけではなく、業務、人、組織といったビジネスにも興味を持ち、交渉や調整、提案やドキュメンテーション等のスキルも身につけ多能工化すると良いのかなと感じています。それはIT企業のビジネスとしても安定したものにもなりますし、ITエンジニアの育成という意味でも必要な力がついていくのかなと思いました。

この業界には業務知識を知っている事がエラくて技術知識は低級なモノというおかしな風習がありますが、そうではなく、ビジネスもIT技術も、「どちらも」捨てない。

ITエンジニアの方であれば、ITを使った新しいビジネスや既存ビジネスの問題解決にも興味があるでしょうし、最新のIT技術にももちろん興味があると思います。
そもそもITエンジニアは多能が求められる職種なのだと思います。

企業システムを作るSIerはもちろん、Webサービス等を運営するにもビジネスや人に深く関わり更にビジネス上の課題をIT技術で解決するということがお仕事のはずです。
どちらかがエラい訳ではなく、恐らく「どちらも」諦めてはいけないモノなのだと思います。

ビジネスを諦めればIT技術をどう活かすかが分かりませんし、IT技術が分からなければ多少業務を知っているできないコンサルのようになってしまいます。

もちろん、両方を捨てないというのは容易いことではありませんが、ITエンジニアはどちらにも興味が持って仕事ができる面白い職業なのかもしれませんね(^^)

それではまた♪




社員:プリースト