C/C++開発環境

Windows/Linuxで両方で動作する成果物を想定。
有償のツールは理解が得られる方が稀なので除外。

# 仕様書

## 外部仕様

Word/Excelが手軽だけど差分が追いにくい。
Markdown+PandocかSphinxでPDF提出がいいかな?

* [Pandoc - About pandoc](http://johnmacfarlane.net/pandoc/)
* [Sphinx-Users.jp :: ドキュメンテーションツール スフィンクス Sphinx-users.jp](http://sphinx-users.jp/)

## 内部仕様

きちんと書いてあればDoxygenで十分だと思う。
Cしか対応していないみたいだけどdocuriumの方がgitとの親和性が高くて(tag付された結果をまとめて解析してくれるみたい)出力結果も今風にできてる。

* [Doxygen](http://www.doxygen.jp/)
* [github/docurium](https://github.com/github/docurium)

## インセプションデッキ

作っておくと上司/部下/協力メンバで方針を合わせやすい。

* [ネスケラボ » インセプションデッキ](http://blog.nextscape.net/index.php/research/agile/inceptiondeck)


# 開発

## ソースコード規約・整形

規約は組織ごと、プロジェクトごとに決まりがあるのでそれに従う。読みにくいコードを書く人がプロジェクトに含まれる場合は[リーダブルコード](http://www.oreilly.co.jp/books/9784873115658/)を経費で買って読ませる。それでも直らなかったら直るまでレビューし続けるかソースコードを触れないように遠ざける。

整形はuncrustifyが痒いところに手が届いてよさそう。設定ファイルを作りこんで使いまわすのが良い。

* [Uncrustify - Source Code Beautifier for C-like languages](http://uncrustify.sourceforge.net/)


## 文字コード

VisualStudioがBOMありじゃないと動かないのでUTF-8(BOMあり)一択。
最近のgccだとBOMありでも動くらしいけど、古いgccの場合はビルドスクリプトにBOMの削除ルーチンを仕掛けておけば良い。

* [Add/Remove BOM — Gist](https://gist.github.com/386410) (Ruby版)
* [tune/bom_manage](https://github.com/tune/bom_manage) (Bat + nkf版)


## コンパイラ

* VisualStudio
* Eclipse + CDT
* gcc
* llvm-clang
* etc...

指定されたものを使う。

警告は最大限出すようにし(/W4 or -W -Wall)、地道に警告が出ないよう対処していく。
警告数が0になった段階で警告をエラーとして扱うようにする。

VisualStudioは独自のコンパイラしか使えないのかと思ってたけどMakefileも扱えるらしい([青の部隊 505小隊 ULZ - VisualStudio攻略](http://www6.atwiki.jp/we_hate_sunshine/pages/77.html#id_6e4e76b6))。
アサインされたプロジェクトでVisualStudioしか使ってなくても　VS -> VS+Makefile -> Eclipse+CDT+Makefile -> ... と段階を踏むことでマルチ環境でビルドできるように持っていけるかも。移植性があるように実装されてないとだめだけど。

好みの問題だけど、コンパイル結果の出力は色付けしたほうがいいかも。エラーはエラーらしく真っ赤に表示されるべし。
* [johannes/colorgcc](https://github.com/johannes/colorgcc)
* [窓の杜 - 【REVIEW】「Visual Studio」のビルド・デバッグ出力を色分けする拡張機能「VSColorOutput」](http://www.forest.impress.co.jp/docs/review/20120327_520592.html)


## Version Control System

Subversion以前のVCSは時代遅れ。
gitのリポジトリ管理はRhodeCodeがおすすめ。インストールがgitlabとかと比べて簡単そうだし、コードレビューも流行りのプルリクエスト形式でできるようになるし、誰でもリポジトリ作り放題!

* [Git](http://git-scm.com/)
* [RhodeCode](http://rhodecode.org/)

運用方法はさておいて、ビルドが壊れるコミット/テストが通らないコミットは許さないようにしたい。
git+hookスクリプト+Jenkinsで可能なのはわかるんだけど、どうしたら手軽に実現できるのかが分からない。

Gitのhookスクリプトはbleis-tiftさんのがよさそう。

* [bleis-tift/Git-Hooks](https://github.com/bleis-tift/Git-Hooks)

.gitignoreはgithubから持ってくるのがベター

* [github/gitignore](https://github.com/github/gitignore)


## Issue Tracking System

RedmineでもJIRA(有償)でも。Tracはマルチプロジェクトがデフォルトで扱えないのとリリーススピードがいまいち遅いので割引。コミットはチケット番号と必ず関連付けるようにする。

* [Overview - Redmine](http://www.redmine.org/)
* [課題管理、プロジェクト管理ソフトウェア | Atlassian](http://www.atlassian.com/ja/software/jira/overview)

Pivotal Trackerクローンの[fulcrum](https://github.com/malclocke/fulcrum)でもいいかも。


## Continuous Integration

JenkinsでOK。
最初はローカルPCで動かして、慣れてきたらサーバを用意してくるので十分。
ビルドスクリプトはJenkinsに保存できるけど、バッチファイル/シェルスクリプトを用意してJenkinsから叩くほうがビルドスクリプトの修正履歴も管理できていいらしい。

VisualStudioの場合はDebugとReleaseは最低限、gcc+makeの場合もうっかり壊れやすいオプションの組み合わせはテストする。

* [Welcome to Jenkins CI! | Jenkins CI](http://jenkins-ci.org/)


## ソースコード検索

milkodeが鉄板

* [メインページ - Milkode](http://milkode.ongaeshi.me/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)


# 性能・品質評価

## メトリクス集計

SourceMonitor以外にいいのがない… 定期的にメトリクスを取る方法を模索中。

* [SourceMonitor V3.3](http://www.campwoodsw.com/sourcemonitor.html)

見るべきメトリクスは下記の3つ。

1. 総行数
2. ネストの数
3. 関数の複雑度

総行数はプロジェクトの規模感を知るため。
ネストの数が多いと綺麗にかけていない可能性大。
関数の複雑度が高いところからリファクタリングを行うこと。どんなに複雑な処理でも30ぐらいまでは改善可能だと思う。


## カバレッジ

Linuxのgcov以外に選択肢がない… orz 
解析結果の可視化はlcovじゃなくて[gcovr](https://software.sandia.gov/trac/fast/wiki/gcovr)がよさそう。Coverture形式の出力を経ることでJenkinsでもきれいに表示させることができる。

* [Gcov - Using the GNU Compiler Collection (GCC)](http://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Gcov.html#Gcov)
* [gcovr – FAST](https://software.sandia.gov/trac/fast/wiki/gcovr)


## 静的解析

脆弱性やバグを見つけるタイプ、C++だとcppcheckがあるけど、C向けには鉄板ツールが無い気がする。いくつか見つけたけど実戦投入できてないので効果は不明。

* [cppcheck | Free Development software downloads at SourceForge.net](http://sourceforge.net/projects/cppcheck/)
* [オープンソースの静的解析ツール AdLint(アドリント) | オージス総研](http://www.ogis-ri.co.jp/product/1199335_6798.html)
* [Splint Home Page](http://lclint.cs.virginia.edu/)
    * C言語の静的解析ができるが、標準でも厳しすぎる印象。
* [Clang Static Analyzer](http://clang-analyzer.llvm.org/)
    * 実戦投入したことが無いので効果が不明。

コードの重複を判定するのに重きをおいた静的解析ツール。こっちも実戦投入してないので詳細不明。

* [CCFinder ホームページ](http://www.ccfinder.net/ccfinderxos-j.html)
    * ソースコードの重複解析。実戦投入したことが無いので効果が不明。
* [PMD](http://pmd.sourceforge.net/)
    * 一緒についてくるCPDでC/C++でも重複調査ができるらしい(参考:[重複コードを撃退！DRY原則をC言語で実践するためのCPDを調べた。 | Futurismo](http://hmi-me.ciao.jp/wordpress/archives/516))。
* [Duplo | Free Development software downloads at SourceForge.net](http://sourceforge.net/projects/duplo/)
    * ソースコードの重複解析。実戦投入したことが無いので効果が不明。

メモリアクセス系のチェックはvalgrindが鉄板だけどLinuxじゃないと動かない。

* [Valgrind Home](http://valgrind.org/)


## バグ密度/バグ予測

Gitを使っていればGoogle謹製ツールのbugspotsの恩恵に預かれる、Subversion版もあるけど。

* [igrigorik/bugspots](https://github.com/igrigorik/bugspots)
* [takanorig/bugspots-svn](https://github.com/takanorig/bugspots-svn)


## パフォーマンス

gprofしか知らない…

* [Man page of GPROF](http://linuxjm.sourceforge.jp/html/GNU_binutils/man1/gprof.1.html)


# テスト

## 単体テスト

*単体テストはLogicをテストする。*

手動でデバッガ止めるなんてアホ、xUnit Framework以外に選択肢はない。
どこでも使える無難なのはcUnit/CppUnitだけどあまり評判は良くないみたい。GoogleTestが今なら使えるか?

今現在xUnit Frameworkの仕組みが入ってないなら一番簡単な箇所(例えば2つの値を交換するとか)の関数に対して1つだけテストを足せば良い。1つテストを書くほうがテストを増やしていくよりもずっと難しい。

* [CUnit Home](http://cunit.sourceforge.net/)
* [CppUnit - C++ port of JUnit | Free Development software downloads at SourceForge.net](http://sourceforge.net/projects/cppunit/)
* [googletest - Google C++ Testing Framework - Google Project Hosting](http://code.google.com/p/googletest/)


## 結合テスト・システムテスト・受け入れテスト

*結合テスト・システムテスト・受け入れテストはFeatureをテストする。*

ツールはBDD(Behavior Driven Development)用のフレームワークを使うのがいいかも。

* [Are there any good open source BDD tools for C/C++? - Stack Overflow](http://stackoverflow.com/questions/193965/are-there-any-good-open-source-bdd-tools-for-c-c)
* [arnaudbrejeon/cspec](https://github.com/arnaudbrejeon/cspec)

swigを使ってRuby製のツール(CucumberとかCapybara)を使うことはできないか?


# その他/評価待ち

* [Sonar](http://www.sonarsource.org/)
    * pom.xmlがさっぱりわからない… orz
* [GitStats | Free Development software downloads at SourceForge.net](http://sourceforge.net/projects/gitstats/)
    * Gitのコミット履歴から活動状況を集計してくれる。導入は簡単だけどどう使っていいかが分からない。
* [gperftools - Fast, multi-threaded malloc() and nifty performance analysis tools - Google Project Hosting](http://code.google.com/p/gperftools/)
* [blackducksw/ohcount](https://github.com/blackducksw/ohcount)
    * ソースコードの行数カウンタ、SourceMonitorで十分か?