読者です 読者をやめる 読者になる 読者になる

ホワイトプログラマー

40歳からSEを辞めてプログラマになりました

ソースコード解析ツールに頼ってもいいんじゃないか

ソースコード解析ツールは普段利用してますか?

  • 利用している
  • 使ってみたい
  • 興味ない
  • 使ったけど効果があまりなかった

などいろいろありますね。

ここで紹介するツールはCOBOL/​C/C++/Java​​/Pascal/​C#/JavaScript/CSSなど普段SIerがアプリケーション開発で使用している言語をおおよそ網羅してる。ホスト系/オープン系を問わず利用可能だ。(あっ、本記事は当該製品の宣伝記事ではありません)

understand.techmatrix.jp

ソースコード解析ツールはいくつかの企業が開発しているけど、私は過去に異なる現場でUnderstandの利用を目にしてきた。

この製品の特徴は、一言で言うと高速解析とそれを活かしたグラフィカル表示となります。100万行程度のソースコードであれば数分で解析できる。コードは毎日更新されるので、この高速性は運用担当者にはとても扱いやすいものではないかと考える。

最近、あるアプリケーションの解析を行う必要があったので、Understandの評価版をダウンロードし早速解析を行った。そこでのこのツールを使って発見できたことを中心に記載してみようと思う。

​メリット1:ステップ数、複雑度が容易に出力できる

これはソースコード解析ツールであれば当たり前の機能だけど、一応紹介。 ステップ数はアプリケーションの規模を計る指標として最初に用いますね。もちろん、Understandはこれを高速に実施できる。 下図のように対象プロジェクトのコメント行数、宣言行数、実装行数、空行がグラフィカル及び表形式ですぐに出力できるし、もちろん、特定のフォルダ単位での計算も可能。 f:id:sabburo:20161223145036p:plain ​ また、複雑度の計算も可能。この複雑度とはアプリケーション全体のソースコードの複雑性を一瞬で表示してくれる。ただ、この機能は概要を知るというレベルでの利用をおすすめする。複雑度については以降で再度紹介する。

メリット2:ディレクトリ(パッケージ)の依存関係が一発でわかる

ソースコードの依存関係というのは、開発を行うにあたり極めて重要な要素である。EclipseVisual StudioなどのIDE(統合開発環境)を使用して開発している人はIDEの機能を使用し、クラス、メソッドごとの依存を確認しているはず。

Understandを使用して解析するとなにがよいかというと、​全体の依存関係をグラフィカルに表示することができる。以下の例はJavaで開発されたWebアプリケーションである。Web開発はいくつかのデザインパターンに沿って構築されるが、以下のアーキテクチャMVCS with DAO と呼ばれ、上位から順にコードが依存している。このデザインパターンに従うことで、アプリケーションの影響を踏まえた修正や開発が容易となる。

以下の図ではControllerとDAOが結ばれているのがわかる。これはDAOの変更が予期せぬControllerの改修に直結することを意味する。(これはまだまだ軽症だけど、俗に言うスパゲッティの始まり)​正しく作っていれば、Serviceの改修だけで改修影響を抑えることができる。

f:id:sabburo:20161223145037p:plain

このようなチェックを開発の途中で週単位で実施することにより、疎結合なアプリケーションが継続して作ることができる。これをシステム開発の終盤で修正することはとても難しい作業となる。

メリット3:複雑なソースコードが一発でわかる

Understandにはソースコードの複雑さを示す指標として、CycloMatic、Essentialなどが存在する。この指標をアプリケーションに対して俯瞰表示させることができる。

アプリケーション中のクラスやメソッドに対して計測することができるため、まずはクラスに実行し、重そうなクラスを見つけたり、メソッドを対象とすることで、問題のあるメソッドを見つけることができる。下図の濃い青色の部分が複雑なメソッドを表している。

f:id:sabburo:20161223145039p:plain

これはアプリケーションを改修する時に、手を出しては行けない場所、手を出すときはリスクをきちんと積むということが業務に精通していない人でもある程度認識することができそうだということがわかるだろう。

また、運用に携わっている人であれば、現場のアプリケーションにUnderstandを実行することで改修提案を計画することの手助けになるのではないだろうか。

Understandには他にも有効な機能はあるが、特に気に入った機能をまずは紹介した。

関数型言語としてのJavaScript(2)

最近のJavaScriptはなんか読みにくい。

括弧ばかりが目についてしまう。手続き型プログラミングを学んできた私にはとても理解し難いと感じていた。

1: var length = (array) => {
2:     return reduce(map(alwaysOne)(array));
3: };
4: length([1,2,3]);

​私はずっとJavaの開発をしてきたので、JavaScriptは少し読めればいいやぐらいに思って流していた。SIは分業制なので、JavaScriptはWebフロントエンドの方々にご対応いただけばよいと考えていた。
しかし、最近ではJavaにもラムダ式と呼ばれる形で括弧の化物が登場してきている。SIの現場ではJava8の本格採用はまだだけど、来年以降の新規開発では間違いなく採用されていく。もう、括弧の化物から逃げられないことを改めて感じている。

そんな私が関数型言語としてのJavaScriptに少し取り組んでみたので何回かに分けて記事を書いてみる。

この記事で学習できること

括弧の正体​

括弧のメリット

​​

1.括弧の正体とは

括弧の正体は一言で書くと関数である。関数には恒等関数、多項関数、無名関数、定数関数などが存在する。そして、それを活用する形としてクロージャ、サンク(thunk)、モナド、カリー化などが存在する。こういった理解の難しい概念がコメントもなくソース上で用いられていることが、初学者にとって高い壁になってしまっている。

なので、いったん上記で書いた難しい言葉は忘れてみよう。括弧は関数である。このことは覚えておくこと。

それでは、括弧(関数)のメリットについて進んでみる。

2.括弧を使うと何がいいのか?

括弧は関数だと先に記載したが、「関数とは処理をまとめることによって、共通的に利用できるものである」 と考える人が多いと思う。それは確かに一部はあっているのだけど、JavaScriptで用いられる関数では少し意味合いが異なる。c言語Javaでプログラムを書いてきている人はこの考えが強いため、関数型言語としてのJavaScriptが理解しにくいと思う。

まず、1つだけ覚えてみる。関数型言語の機能を持つJavaScriptの関数は変数に格納できる。これはJavaScriptの関数は​第一級オブジェクト(ファーストクラスオブジェクト)と言われる理由だ。難しい言葉だけど、「第一級オブジェクト=ただの値(変数)」であると考えてみよう。

これを理解するだけで、読みにくかったJavaScriptが少し読めるようになるはず。

例えば、以下のプログラムはconstantという名前の関数を作成している。また、6行目ではその関数に対して実引数"1"を渡してalwaysOneという変数を宣言している。
これにより、alwaysOneには赤字部分の関数が実引数"1"で格納されている。

ここで大事なことはalwaysOneというのは必ず"1"を返す関数であるということ。

var constant = (any) => {
    return (_) => {
        return any;
    };
};
var alwaysOne = constant(1);<200b><200b> 

​このような「関数を格納した変数がいろいろな箇所で使用されている」ことを知ることが、最近のJavaScriptを読み解く一歩となる。

でも、「この関数ってどんなメリットがあるの?」と思うかもしれない。この単純な関数でも使いみちは多岐に渡る。以下のプログラムを実行すると、配列の要素をすべて1に変換できる。これはmapという配列の中身を処理する関数に、さきほどの全てを1にする関数を引数渡ししているからである。

1: [1,2,3].map(alwaysOne);

結果→[1,1,1]​​

JavaScriptを読んでいく時には、その内部で使われている変数は関数であり、その関数をブロック({})単位で見ていくことで、意外とすんなりと読んでいくことができる。 ​上記のコードにさらにreduceという要素の値を結合していくメソッドと組み合わせることで、[1,1,1]の配列の要素を足し算し、配列のサイズを計算する関数が作成できる。

1: var length = (array) => {
2:     return reduce(map(alwaysOne)(array));
3: };
4: length([1,2,3]);

結果 → 3

JavaScriptの関数についてまとめると、JavaScriptでは関数は値と同じように扱えるため、以下のような特徴をもつことができる。

関数を引数に持つことができる

数を返す関数がつくれる

​この仕組みを高階関数と呼び、JavaScriptでは多用されるため、括弧が多くなる。 しかし、それはソースを読みづらくするものではなく、プログラムの再利用性を高めたり、障害への耐性を高めることに役立つのだ。

なお、私は以下の2冊を用いて学習した。 関数型プログラミングの基礎 JavaScriptを使って学ぶ JavaScriptで学ぶ関数型プログラミング

関数型言語としてのJavaScript(1)

JavaScript

JavaScriptは関数だらけ

10月初めのこと 久しぶりにJavaScriptをのぞいて見ると最近はカッコばかりで記述されていて読み方がわからない。
そういえば、Java8でもラムダが登場してきているので、関数型からはもう逃げられない。
​そこから2ヶ月と少し、関数型プログラミングについて学習したので何回に分けて書いてみようと思う。

学習量

以下の2冊の本を2周程度読んだのと、書籍中のプログラムをいくつかのパターンで実装した。
最終的には関数型プログラミンを使用して、データベースからデータを抽出し、webサイトに表示するプログラムをループ文なく記述することができている。

関数型プログラミングの基礎 JavaScriptを使って学ぶ JavaScriptで学ぶ関数型プログラミング

続きは次回に整理して書いて見ます。

はてなブログで書き始める

その他

ブログが続かない訳

ブログを書いてみようという人は毎日星の数ほどいる。そして、ほとんどが1週間ともたずに書くことを止めてしまってる
それは目的がアフィリエイトだったり、匿名でやろうとするからなんだよね

ブログを書く側が閉鎖的になってしまうと当然ながら、そのブログは面白くないので、読者の関心も薄れていき、ブロガーのモチベーションも消えていくって感じ

こう考えてみる

アフィリエイトという考えは捨てること

どうせやってももうかることなんてない。考えるだけ時間の無駄だと思ったほうが良い。始めてから1年後にそのことを思い出してもよいかもしれない。

オープンでいく!

大事なことはオープン。読者は記事の内容だけではなくて、どういう人が書いたかを知りたいことが多いと思う。それに応えることが必要。
所属、顔写真はできれば書いたほうがよい。 顔写真はちょっと恥ずかしいという人はPrisma Labsのアプリで加工すれば結構いけるはず。ちなみに私もそれに頼っている。

それでは、これから気が向くタイミングで書いていくことにしよう。