Weitere ähnliche Inhalte Ähnlich wie OSS ソースコードサーチツールの効能、有効活用方法 (20) Mehr von Open Source Software Association of Japan (19) OSS ソースコードサーチツールの効能、有効活用方法1. “Nature does not reveal itself as it is, but only through the
questions we put to it.” (Heisenberg)
検索によるOSSを活用する方法
葉 雲文 (Ye, Yunwen)
(株)SRAニュービジネス戦略本部
2009年12月14日
ye@sra.co.jp
2. ソフトウェア開発企業から見たOSS
一般ユーザとしての利用環境
– Linux, Firefox …
開発品質と効率を向上させるリソース
– 開発環境と言語
• Eclipse, Ruby …
– フレームワーク
• Sprint, Struts …
– ミドルウェア
• Tomcat …
– サブシステム
• PostgreSQL …
– ライブラリ
• Apache-commons, Jun
©Software Research Associates, Inc. 2
3. 競争力向上としてのOSS
よく知られているOSSを利用する
活用知識の蓄積により効果的に利用
先手を取って、まだ知られていないOSSを利用
Free Beerではなく、Free Speechとして活用
– プログラムを通して、プログラミングの知識を共創、共有する
– OSSを開発知識の媒体として活用
©Software Research Associates, Inc. 3
4. OSSを活用する課題
必要となるOSSを発見する
– 知らないOSSプロジェクトの検索
• How? (sourceforge.netには230,000プロジェクトがある)
– OSSの一部機能や実装を自分のシステムに取り入れる
(Black-box reuse)
OSSを活用する知識の蓄積
– 評価:品質、ライセンス
– 利用知識を会社範囲での共有
OSSから開発知識を学習(Glass-box reuse)
– アルゴリズムの実装
– APIの利用方法
©Software Research Associates, Inc. 4
5. A motivating example: JSONの利用
データ交換のフォーマットとして、JSONを利用
JSONを読み込みと書き出しのJavaプログラムを作成
JSON (Javascript Object Notation) の記述例
{ username: “Barack Obama”,
password: “tacklegloblewarming”,
inauguration: {year: 2009,
month: 1,
date: 20 }
}
©Software Research Associates, Inc. 5
11. 検索駆動型ソフトウェア開発
検索エンジンを含む様々な情報検索ツールを利
用し、「いま目前にある」開発作業に必要となる知
識と情報を調査、活用しながら、ソフトウェア開発
諸活動を効率よく進める方法
検索される対象
外部のウェブ 社内のリソース
開発済みのシステム メーリングリスト
各種文書 開発中のシステム
etc. etc.
©Software Research Associates, Inc. 11
12. The WHY: 検索駆動型ソフトウェア開発
ソフトウェア開発の本質
– ソフトウェアシステムは一つの情報空間(Information
Space)
– ソフトウェア開発は知識労働である
• 農業労働:なにもないところから物質を生産する
• 工業労働:複数の物質を別の物質に変換させる
• 知識労働:なにもないところから物質的な存在ではない情報空間を創出
– ソフトウェア開発者は情報収集と情報創出を繰り返す
• 原材料は知識と情報である
• 全ての知識は開発者の頭にあるとは限らない
必要な情報を適時に収集、獲得する能力はソフト
ウェア開発の品質と効率に多大な影響を与える
©Software Research Associates, Inc. 12
13. ソフトウェア開発には検索は欠かせない
よく使われるUnixコマンド
top cd ls
ln clear find
tar/zip/gzip cp man
nano/vi/emacs grep vi
grep lpr cat
chmod ls more
dmesg mkdir grep
kill more chmod/chown
man mv ps
mount pwd cp/mv/rm
©Software Research Associates, Inc. 13
14. 検索駆動型に関する研究動向
ソフトウェア開発における検索の重要性を確認
– 開発活動の24%-40%は、ソースコードから情報を検索
– 同僚との打ち合わせの40%はソースコードに関する情報
を求める
ソフトウェア開発者の情報検索プロセスの解明
– ファイル名や識別子は重要な手がかり
– Just-in-time comprehension
– コメントはindirect communicationの役割を果たす
検索技術を利用して開発の諸活動を支援する方法
– 学習、理解、要求追跡、バグ発見、再利用、
Intelligent Editor、ライセンス管理、
プログラマー同定、タスクアサインメント
©Software Research Associates, Inc. 14
15. 検索の重要性
数百万行のリアルタイムOSシステム
を開発する開発者を観察
あるベテラン開発者の14日間の開発活
動を観察した結果
(合計 157 イベント)
サーチ 37回
ソースコード閲覧 33回
43%ぐらいは検索活動
Singer, J., Lethbridge, T., Vinson, N.,
and Anquetil, N., "An examination of
software engineering work practics,"
in Proceedings of the 1997
conference of the centre for advanced
studies on collaborative research
©Software Research Associates, Inc. 15
16. 検索の重要性
数百万行のリアルタイムOSシステム
を開発する開発者を観察
8人の開発者の開発活動の観察結果
(合計 356 イベント)
UNIXコマンド 54回
ソースコード閲覧 52回
ハードウェア 36回
デバッガ 32回
サーチ 31回
ソースコード編集 30回
24%ぐらいは検索活動
Singer, J., Lethbridge, T., Vinson, N.,
and Anquetil, N., "An examination of
software engineering work practics,"
in Proceedings of the 1997
conference of the centre for advanced
studies on collaborative research
©Software Research Associates, Inc. 16
17. 開発者の情報検索プロセス
検索のきっかけとなる行為
– 40人がタスク記述中の単語でサーチ
– 8人がEclipseのPackage Explorerでブラウジング
関連性の判断
– fileの名前で関連性を判断
– 識別子を見て、関連性を判断
– 関連ありそうなコード断片だけを注目
依存性のトレース
– 70分間で65個の依存性を追跡
• 58% direct dependency
• 42% indirect dependency
A. Ko, B. Myers, “An exploratory study of how developers seek, relate, and collect relevant
information during software maintenance tasks,” IEEE ToSE 32(12), 2006
©Software Research Associates, Inc. 17
18. ソースコード検索研究プロトタイプ
第一世代: Black-boxのライブラリ再利用
LATTIS (1987, F. William, Virginia Polytechnic
Institute and State University)
CodeFinder (1993, S. Henninger, U. of Colorado)
第二世代: 多様な目的に応じる検索
CodeBroker (2000, Yunwen Ye, SRA-KTL/U. of Colorado)
Spars-J (2003, 大阪大学)
Prospector (2005, Mandelin et al., UC Berkley)
Merobase (2006, Hummel et al. ドイツMannheim大学)
Sourcerer (2006, Bajracharya et al., UC Irvine)
Examplar (2007, Grechanik et al., Accenture Lab)
ParseWeb (2007, Thummalapenta, Xie, North Carolina
State Univ.)
©Software Research Associates, Inc. 18
19. 産業界の動向:次のGoogleへの争い
general purpose search
social desktop
search search
vertical enterprise
search search
©Software Research Associates, Inc. 19
20. ソースコード検索エンジン
ソフトウェア開発者に特化した検索エンジン(vertical
search)
ソフトウェア開発企業に特化した検索エンジン(enterprise
search)
Players in the market
– krugle (Aragon Consulting Groupに買収, enterprise版あり)
– google/codesearch
– koders.com (Blackduckに買収, enterprise版あり)
– JExamples.com
– codase.com
– codefetch.com
– my.safaribooksonline.com (o’Reilley 検索)
– kickjava.com
– docjar.com
– merobase.com
– www.grepcode.com
©Software Research Associates, Inc. 20
21. ソフトウェア開発者の検索エンジン利用
米国最新調査結果
よく利用 59%
たまに利用 39%
koders.com 2007年一年間実績
全部言語 Java言語
検索件数 1千万件 1,055,105
ダウンロード回数 755,588
ユーザ数 3百万件 291,839
©Software Research Associates, Inc. 21
22. “turn your source
into the force”
CodeDepot
a vertical and enterprise code search engine
©Software Research Associates, Inc. 22
23. CodeDepot
目的
– ソースコードを知識のアセットとして管理、活用
– ソフトウェア開発の生産性と品質の向上に資する
– 開発者の技術スキルの習得と共有を支援
アプローチ
– 全社のソースコードを検索可能なポータルに集約
– 利用可能な膨大なOSSも同一なインタフェースで検索
– ソースコードにノート(メモ)を加える機能により、保守システ
ムと外部ライブラリに関する知識を蓄積、共有
©Software Research Associates, Inc. 23
24. CodeDepotの高度且つ高速な検索機能
ソースコードに特化した検索方法
– 文法アウェアな検索
• コード、コメント
• ファイル名、クラス名
• メソッドの利用、定義
• シグネチャー
– コードクローン検索
– 強力なフィルター機能
• プロジェクト別、ライセンス別、パッケージ別
©Software Research Associates, Inc. 24
25. CodeDepot機能説明
シナリオ
指定した長さの範囲のパスワードを生成するコードを再利用する
ためにCodeDepotで検索
©Software Research Associates, Inc. 25
27. powered by CodeDepot :再利用
②検索キーワード
①検索対象を random string を
関数に指定 指定
©Software Research Associates, Inc. 27
28. powered by CodeDepot :再利用
②検索キーワード
①検索対象を random string を
関数に指定 指定
③キーワード
を含む場所を
メソッド定義に指定
©Software Research Associates, Inc. 28
29. powered by CodeDepot :再利用
②検索キーワード
①検索対象を random string を
関数に指定 指定
③キーワード
を含む場所を
メソッド定義に指定
④入力タイプを2個
のint(“int int”)を指
定
©Software Research Associates, Inc. 29
30. powered by CodeDepot :再利用
②検索キーワード
①検索対象を random string を
関数に指定 指定
③キーワード
を含む場所を
メソッド定義に指定
④入力タイプを2個
のint(“int int”)を指 ⑤出力タイプを
string を指定
定
©Software Research Associates, Inc. 30
31. powered by CodeDepot :再利用
②検索キーワード
①検索対象を random string を
関数に指定 指定
③キーワード
を含む場所を
メソッド定義に指定
④入力タイプを2個 ⑥ライセンスを
のint(“int int”)を指 ⑤出力タイプを
string を指定 ASFを指定
定
©Software Research Associates, Inc. 31
36. lucene 過去プロジェクトZ
過去プロジェクト 現在プロジェクトZ
過去プロジェクトB
過去プロジェクトA
commons 過去プロジェクト
過去プロジェクトB
source code Jun4Java source code
過去プロジェクトA
source code CVSリポジトリ
source code
source code
source code source code
source code
source code source code
現在プロジェクトB
インデクス作成 SVNリポジトリ
イ
と ン
自 デ 現在プロジェクトA
動 ク
社内ソースコード 更 ス
利用可能なOSS 新 作 コードディレクトリ
成
検索コントロール
ウェブブラウザーによる検索とノート追加
品質管理 部門長 開発者
©Software Research Associates, Inc. 36
37. powered by CodeDepot :アルゴリズム実装例
最長共通部分文字列のアルゴリズム。
common longest (substring or subsequence)で検索
©Software Research Associates, Inc. 37
38. powered by CodeDepot :デバッグ&学習
URL url = new URL("http://192.168.24.128:8080/search");
URLConnection conn = url.openConnection();
//検索キーワードを送る
conn.setDoOutput(true);
OutputStreamWriter wr = new
OutputStreamWriter(conn.getOutputStream());
wr.write("q=string"); wr.flush(); wr.close();
//検索結果を受ける
conn.setDoInput(true);
BufferedReader br = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line;
while ((line=br.readLine()) != null) {
System.out.println(line);
}
©Software Research Associates, Inc. 38
39. powered by CodeDepot :デバッグ&学習
URL url = new URL("http://192.168.24.128:8080/search");
URLConnection conn = url.openConnection();
//検索キーワードを送る
conn.setDoOutput(true);
OutputStreamWriter wr = new
OutputStreamWriter(conn.getOutputStream());
wr.write("q=string"); wr.flush(); wr.close();
//検索結果を受ける
conn.setDoInput(true);
BufferedReader br = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line;
while ((line=br.readLine()) != null) {
System.out.println(line);
}
©Software Research Associates, Inc. 39
40. powered by CodeDepot :デバッグ&学習
URL url = new URL("http://192.168.24.128:8080/search");
URLConnection conn = url.openConnection();
//検索キーワードを送る
conn.setDoOutput(true);
OutputStreamWriter wr = new
OutputStreamWriter(conn.getOutputStream());
wr.write("q=string"); wr.flush(); wr.close();
//検索結果を受ける
conn.setDoInput(true);
BufferedReader br = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line;
while ((line=br.readLine()) != null) {
System.out.println(line);
}
©Software Research Associates, Inc. 40
41. powered by CodeDepot :デバッグ&学習
URL url = new URL("http://192.168.24.128:8080/search");
URLConnection conn = url.openConnection();
//検索キーワードを送る
conn.setDoOutput(true);
OutputStreamWriter wr = new
OutputStreamWriter(conn.getOutputStream());
wr.write("q=string"); wr.flush(); wr.close();
//検索結果を受ける
conn.setDoInput(true);
BufferedReader br = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line;
while ((line=br.readLine()) != null) {
System.out.println(line);
}
Exception in thread "main" java.lang.IllegalStateException:
Already connected
at java.net.URLConnection.setDoInput(Unknown Source)
at ye.example.URLExample.main(URLExample.java:18)
©Software Research Associates, Inc. 41
42. powered by CodeDepot :デバッグ&学習
URL url = new URL("http://192.168.24.128:8080/search");
URLConnection conn = url.openConnection();
//検索キーワードを送る
conn.setDoOutput(true);
OutputStreamWriter wr = new
OutputStreamWriter(conn.getOutputStream());
wr.write("q=string"); wr.flush(); wr.close();
//検索結果を受ける
conn.setDoInput(true);
BufferedReader br = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line;
while ((line=br.readLine()) != null) {
System.out.println(line);
}
Exception in thread "main" java.lang.IllegalStateException:
Already connected
at java.net.URLConnection.setDoInput(Unknown Source)
at ye.example.URLExample.main(URLExample.java:18)
©Software Research Associates, Inc. 42
44. 利用例No.1
openConnection
setDoInput
getOutputStream
の順で呼び出している
©Software Research Associates, Inc. 44
45. 利用例No.2
openConnection
setDoInput
getOutputStream
の順で呼び出している
©Software Research Associates, Inc. 45
46. 利用例No.3
openConnection
setDoInput
getOutputStream
の順で呼び出している
©Software Research Associates, Inc. 46
47. powered by CodeDepot :デバッグ&学習
URL url = new URL("http://192.168.24.128:8080/search");
URLConnection conn = url.openConnection();
//検索キーワードを送る
conn.setDoOutput(true);
OutputStreamWriter wr = new
OutputStreamWriter(conn.getOutputStream());
wr.write("q=string"); wr.flush(); wr.close();
//検索結果を受ける
conn.setDoInput(true); 原因:
BufferedReader br = new BufferedReader(new
openConnection
InputStreamReader(conn.getInputStream()));
String line;
setDoInput
getOutputStream
while ((line=br.readLine()) != null) {
System.out.println(line);
の順で呼び出すべきだが、いまは
}
openConnection
Exception in thread "main" getOutputStream
java.lang.IllegalStateException:
Already connected
setDoInput
at java.net.URLConnection.setDoInput(Unknown Source)
の順で呼び出している
at ye.example.URLExample.main(URLExample.java:18)
©Software Research Associates, Inc. 47
48. powered by CodeDepot :検収と問題発見
原則:
equalsを上書
きすると、
hashCodeも
上書きすべき。
検収するプロジェク
トsolrに
equalsだけを上書
きしているコードが
入っているかを調べ
る
©Software Research Associates, Inc. 48
49. powered by CodeDepot :検収と問題発見
原則:
equalsを上書
きすると、
hashCodeも
上書きすべき。
検収するプロジェク
トsolrに
equalsだけを上書
きしているコードが
入っているかを調べ
る
5個のクラスが見つ
かった
©Software Research Associates, Inc. 49
50. powered by CodeDepot :検収と問題発見
原則:
equalsを上書
きすると、
hashCodeも 確かに問題コード
上書きすべき。
検収するプロジェク
トsolrに
equalsだけを上書
きしているコードが
入っているかを調べ
る
1個のクラスには問
題がある
©Software Research Associates, Inc. 50
51. powered by CodeDepot :影響分析
クロスプロジェ
クト影響分析
JSONObject を
利用ているプログ
ラムを調査する
44個のクラスが
利用している
©Software Research Associates, Inc. 51
52. powered by CodeDepot :保守支援(デモ)
デモシナリオ:
– 文字検索機能により、不具合を起こす場所を発見
– クローン検索により、修正するコードと同じ構造を持っているコードも一緒に修
正
デモ想定状況:
– antのClear Caseのunlock機能に不具合があるとする
デモステップ:
1. unlock prj:antで検索、7個のクラスを発見
2. 一番目のCCUnlockクラスをクリックして、コードを見る
3. 82-111行を修正する必要があると分かった。その部分をコピーする
4. クローン検索画面にペーストし、検索する
5. 14個もあり、eclipseとantの両プロジェクトに跨っていると分かった
6. 全てを修正する。今後も同じことが起こるかもしれないので、クローンが存在し
ていることをノート(メモ)に加える
©Software Research Associates, Inc. 52
55. CodeDepotにより開発効率と品質向上
再利用 学習 保守 プロジェクト管理と製品検収
– 組織横断的な再利用を簡単にする
• 初期コストなし、既存コードを登録するだけ
• OSSも再利用の対象となる
– 再利用する開発者を支援
• black-box ライブラリとして組み込み
• white-box 一部のコードを修正して再利用
• glass-box 認知負荷の低減によりバグが減る
– 共通コードを割り出し、コンポーネント化
©Software Research Associates, Inc. 55
56. CodeDepotにより開発効率と品質向上
再利用 学習 保守 プロジェクト管理と製品検収
– アルゴリズムの実装方法
– APIの利用方法の学習と共有
– プログラム・イディオム (call chain)
– 利用しているOSSシステムのコードを理解
©Software Research Associates, Inc. 56
57. CodeDepotにより開発効率と品質向上
再利用 学習 保守 プロジェクト管理と製品検収
– 修正する場所の把握と発見
– 修正の影響範囲の把握
– ソースコードにノートを付けることにより、保守知識
を蓄積、共有
©Software Research Associates, Inc. 57
58. CodeDepotにより開発効率と品質向上
再利用 学習 保守 プロジェクト管理と製品検収
– 社内アセットを一元的なアクセスインタフェースを通
して、プロジェクトの提案と見積もり段階でも活用
– 製品検収で望ましくないコードの検出
– 問題コードをプロジェクト横断的に一気に同定
©Software Research Associates, Inc. 58
59. おわりに
検索によりOSSを活用するアプローチ
– 情報の収集と獲得はソフトウェア開発の基本活動
– 効率向上、品質改善、スキル向上の新しいアプローチ
CodeDepot:Vertical and Enterprise Search Engine
– 高速、強力な検索機能
– 大規模なコードにも対応
– ウェブベースシステムなので、利用がシンプル
– 再利用、学習、保守、管理といった多様なタスクに利用可能
“Software may be invisible, but gets revealed through
the questions we put to it.”
©Software Research Associates, Inc. 59