開発完了したシステムであったり、開発中のシステムの規模を算出しようとした場合、ソースコードの行数を算出する場面が非常に多いです。ソースコードには各プログラミング言語毎にコメント記法が異なっていたり、言語によってはコードを複数行に渡って記述されている場合もあります。実質的なソースコードの行数やコメント行数などを算出するのは大変です。そのような場合にソースコードを解析して、プログラミング言語毎にソースコードの行数を算出してくれるツールを利用しましょう。
様々なツールが存在していますが、この記事で紹介する「scc」という無料のツールが最も使い勝手が良く、結果が分かりやすかったので使い方や、実際にシステムを解析した結果を共有します。私が実際に携わったプロジェクトのソースコードもほぼ正確に解析できていましたので、非常に信頼できるツールだと思います。
Sloc Cloc and Code (scc)というソースコード解析ツール
「Sloc Cloc and Code (scc)」というツールは、ソースコードの行数を計算し、推定されるソースコードの複雑さに基づいて開発工数や所要期間を見積もってくれるツールです。開発工数や期間を見積もるのにCOCOMO (ココモ法)が利用されています。COCOMO (ココモ法)というのは、 ソフトウェアのソースコードを基にシステムの工数や期間を見積もる手法のことです。これによってソースコードを解析すると共に、推定される工数と期間も表示してくれるツールです。
sccツールのインストール
Windows / MacOS / Linux のいずれのプラットフォームでもsccツールは利用可能です。インストール方法は公式サイトにも記載されていますが、いくつかのプラットフォームでのインストールは次の通りです。
Ubuntuにインストールする場合、snap経由でインストールできます。
$ sudo snap install scc
MacOSであればHomebrewで次のようにインストール可能です。
$ brew install scc
Windowsの場合にはインストール方法はいくつかありますが、主要なものを記載します。
# Scoopでインストールする場合
scoop install scc
# Chocolateyでインストールする場合
choco install scc
WinGetコマンドでインストールする場合
winget install --id benboyter.scc --source winget
sccツールの使い方
実際に何らかのプロジェクトを用意して、ソースコードの行数を数えてみます。公式サイトでも紹介されていますが、Redisというメモリ上でデータを管理するインメモリデータべースのプロジェクトのソースコードをダウンロードして解析してみます。
Redisプロジェクトのソースコードをダウンロードする
まずはRedisプロジェクトのソースコードをダウンロードします。
$ git clone https://github.com/redis/redis.git
これでローカルマシンにredisというディレクトリが作成され、その中にRedisプロジェクトのソースコードが保存されます。
sccツールを実行してみる
それではsccツールを使ってRedisプロジェクトのソースコードを計算させてみましょう。Redisプロジェクトのソースコード容量は、2024年12月18日時点で162MBです。sccコマンドの引数に、解析させたいディレクトリ名を指定することで、そのディレクトリ内のソースコードを解析してくれます。
$ scc redis
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
C 425 253709 29425 42638 181646 45460
JSON 402 24651 2 0 24649 0
C Header 283 47977 5412 10745 31820 2900
TCL 212 62480 6854 4055 51571 3586
Shell 75 1624 239 343 1042 185
Markdown 24 3635 913 0 2722 0
Autoconf 22 11729 1123 1419 9187 1015
Lua 20 525 68 70 387 65
Makefile 19 1799 342 150 1307 83
YAML 18 2561 138 47 2376 0
Plain Text 10 1106 193 0 913 0
gitignore 10 174 18 0 156 0
Ruby 9 813 73 101 639 123
C++ 8 546 85 43 418 43
Python 7 1609 125 54 1430 157
HTML 5 9658 2928 12 6718 0
License 3 90 17 0 73 0
CMake 2 298 53 5 240 14
CSS 2 107 16 0 91 0
Systemd 2 80 6 0 74 0
BASH 1 143 16 5 122 38
Batch 1 28 2 0 26 3
C++ Header 1 9 1 3 5 0
Extensible Styleshe… 1 10 0 0 10 0
JavaScript 1 31 1 0 30 5
MSBuild 1 11 0 0 11 0
Module-Definition 1 11239 2094 0 9145 167
SVG 1 1 0 0 1 0
Smarty Template 1 44 1 0 43 5
m4 1 951 218 64 669 0
───────────────────────────────────────────────────────────────────────────────
Total 1568 437638 50363 59754 327521 53849
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $11,819,427
Estimated Schedule Effort (organic) 35.16 months
Estimated People Required (organic) 29.87
───────────────────────────────────────────────────────────────────────────────
Processed 15463675 bytes, 15.464 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
Redisプロジェクトのソースコードを解析結果が表示されるまでに、私の環境では1秒もかかりませんでしたので非常に高速にソースコードが解析できました。
sccツールの結果の見方
それではこの結果の一部を詳しく見ていきます。一番左列の「Language」はプログラミング言語を指しています。Redisプロジェクトでは様々なプログラミング言語を使用しています。下記に一部抜粋した情報を記載していますが、C言語、JSONデータ、Ruby言語、Python言語、HTMLなどなど、様々な言語が使用されています。
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
C 425 253709 29425 42638 181646 45460
JSON 402 24651 2 0 24649 0
Ruby 9 813 73 101 639 123
Python 7 1609 125 54 1430 157
HTML 5 9658 2928 12 6718 0
(一部省略)
次に「Files」列には、プログラミング言語毎に検出されたファイル数が表示されています。C言語であれば425ファイル存在しています。次に「Lines」列ですが、これは各プログラミング言語毎の行数の総計です。C言語で記述された425ファイルの総行数ということになります。ですのでC言語で記述されたソースコード行数は、253,709行ということになります。この中には空行やコメント行も含まれていますので、空行は「Blanks」という列に表示され、コメント行は「Comments」列にそれぞれの合計数が表示されています。この「Blanks」と「Comments」以外の残りが実際のプログラムコードが書かれた行数になります。それが「Code」という列に表示されており、C言語の場合は45,460行です。
まとめると、C言語の場合、425ファイル存在し、総合計行数は253,709行、その中の空行の合計数は29,425行、さらにコメント行数は42,638行、空行とコメントを除いたプログラムのコード行数は181,646行となります。
最後の列の「Complexity」はCOCOMO(ココモ法)で開発工数や期間などを見積もるための複雑さの情報が表示されています。RedisプロジェクトのC言語の複雑さの値は45,460となっています。
COCOMO(ココモ法)の詳細については本記事では詳しく触れませんが、sccツールではCOCOMO(ココモ法)で算出した推定される開発コスト、開発所要期間、必要人数も同時に表示してくれます。
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $11,819,427
Estimated Schedule Effort (organic) 35.16 months
Estimated People Required (organic) 29.87
───────────────────────────────────────────────────────────────────────────────
Redisプロジェクトをの場合、推定される開発コストは$11,819,427ドル(日本円で約18億円くらい[1ドル=150円の場合])、推定される開発期間は35.16ヶ月、必要人数は29.87人ということになります。
これらの結果にはそれぞれ「organic」と表示されています。organicとは、COCOMO法のプロジェクトタイプの中の1つで、比較的小規模な体制で行うもので熟練した開発者が携わったりすることのあるプロジェクトタイプです。sccツールではorganic以外にも、semi-detached, embeddedというプロジェクトタイプを指定することもできます。
organic | 小規模の開発チームによる開発 |
embedded | 大規模な開発チームによる開発 |
semi-detached | organicとembeddedの中間規模の開発チームによる開発 |
見積もり方法を変更するには、sccコマンドに「–cocomo-project-type embedded」あるいは「–cocomo-project-type semi-detached」というオプションを付けると見積もりタイプを変更できます。以下はそれぞれのCOCOMO法におけるプロジェクトタイプを変更した場合の結果です。それぞれのプロジェクトタイプによって、推定開発コストや推定開発期間、推定必要人数が大きく変わることが分かります。
$ scc --cocomo-project-type embedded redis
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
C 425 253709 29425 42638 181646 45460
JSON 402 24651 2 0 24649 0
C Header 283 47977 5412 10745 31820 2900
TCL 212 62480 6854 4055 51571 3586
Shell 75 1624 239 343 1042 185
Markdown 24 3635 913 0 2722 0
Autoconf 22 11729 1123 1419 9187 1015
Lua 20 525 68 70 387 65
Makefile 19 1799 342 150 1307 83
YAML 18 2561 138 47 2376 0
Plain Text 10 1106 193 0 913 0
gitignore 10 174 18 0 156 0
Ruby 9 813 73 101 639 123
C++ 8 546 85 43 418 43
Python 7 1609 125 54 1430 157
HTML 5 9658 2928 12 6718 0
License 3 90 17 0 73 0
CMake 2 298 53 5 240 14
CSS 2 107 16 0 91 0
Systemd 2 80 6 0 74 0
BASH 1 143 16 5 122 38
Batch 1 28 2 0 26 3
C++ Header 1 9 1 3 5 0
Extensible Styleshe… 1 10 0 0 10 0
JavaScript 1 31 1 0 30 5
MSBuild 1 11 0 0 11 0
Module-Definition 1 11239 2094 0 9145 167
SVG 1 1 0 0 1 0
Smarty Template 1 44 1 0 43 5
m4 1 951 218 64 669 0
───────────────────────────────────────────────────────────────────────────────
Total 1568 437638 50363 59754 327521 53849
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (embedded) $42,264,288
Estimated Schedule Effort (embedded) 34.82 months
Estimated People Required (embedded) 107.84
───────────────────────────────────────────────────────────────────────────────
Processed 15463675 bytes, 15.464 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
$ scc --cocomo-project-type semi-detached redis
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
C 425 253709 29425 42638 181646 45460
JSON 402 24651 2 0 24649 0
C Header 283 47977 5412 10745 31820 2900
TCL 212 62480 6854 4055 51571 3586
Shell 75 1624 239 343 1042 185
Markdown 24 3635 913 0 2722 0
Autoconf 22 11729 1123 1419 9187 1015
Lua 20 525 68 70 387 65
Makefile 19 1799 342 150 1307 83
YAML 18 2561 138 47 2376 0
Plain Text 10 1106 193 0 913 0
gitignore 10 174 18 0 156 0
Ruby 9 813 73 101 639 123
C++ 8 546 85 43 418 43
Python 7 1609 125 54 1430 157
HTML 5 9658 2928 12 6718 0
License 3 90 17 0 73 0
CMake 2 298 53 5 240 14
CSS 2 107 16 0 91 0
Systemd 2 80 6 0 74 0
BASH 1 143 16 5 122 38
Batch 1 28 2 0 26 3
C++ Header 1 9 1 3 5 0
Extensible Styleshe… 1 10 0 0 10 0
JavaScript 1 31 1 0 30 5
MSBuild 1 11 0 0 11 0
Module-Definition 1 11239 2094 0 9145 167
SVG 1 1 0 0 1 0
Smarty Template 1 44 1 0 43 5
m4 1 951 218 64 669 0
───────────────────────────────────────────────────────────────────────────────
Total 1568 437638 50363 59754 327521 53849
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (semi-detached) $22,160,175
Estimated Schedule Effort (semi-detached) 35.56 months
Estimated People Required (semi-detached) 55.37
───────────────────────────────────────────────────────────────────────────────
Processed 15463675 bytes, 15.464 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
まとめ
これまで見てきたように、sccツールを使うと非常に高速に既存プロジェクトのソースコードを瞬時に解析してプログラミング言語毎のソースコード行数、コメント行数、空行数、複雑さの度合いを見ることが出来ます。さらにCOCOMO法による推定見積りも得られます。実際の開発現場でも利用できる無料ツールですので、非常に役に立つと思います。