SPES2003ソフトウェアプロセスエンジニアリングシンポジウム
大規模収集データに基づいた
ソフトウェアエンジニアリング
井上克郎
大阪大学大学院情報科学研究科
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソフトウェア開発は工学?
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソフトウェア開発の現状と問題点
• ソフトウェアの信頼性
– 多数のバグを含んだソフトの流通
– 一度ダウンすると多大な社会的損失
• ソフトウェアの生産性
– 開発期間の短縮要請
– 人海戦術による限界
• 経験的なノウハウや非科学的な手法,ツールを
使う場合が多い
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
科学的手法に基づくソフトウェア開発
• 多くの他の科学、工学分野では、計測して定量
化し、評価を行い、それをフィードバックして
改善を行うのが普通(フィードバックループ)
• ソフトウェア開発の分野では?
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Zelkowitz-Wallaceによる評価法分類
• 観測型(Observational)
実際に行われているプロジェクトを横から観測して評価
• 履歴型(Historical)
過去に行われたプロジェクトのデータや発表された論文に基づ
いて評価
• 制御型(Controlled)
目的とするデータを得るために環境を整えてプロジェクトを行
い評価する
V. Zelkowitz, D. R.Wallace, "Experimental Models for Validating
Technology", IEEE Computer, pp.23-31, May 1998.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
観測型評価
• プロジェクトモニタ
– 対象を漠然と観察。目標不明確な場合も。簡単
• 事例研究
– 対象をより深く解析。まだ、変動要素の制御が不十分だが、
比較的簡便
• アサーション
– 主張がなりたつことを簡単なプロジェクトで実証。厳密な評
価としては不十分。
• 野外調査(Field Study)
– いろいろなプロジェクトを見て回る。条件を揃えるのが困難
だが追証しやすい。
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
履歴型
• 文献調査
– 過去発表された論文を探す。条件や視点の統一不可能。簡単
• 事例調査
– 過去のプロジェクトデータをひっくりかえす。条件不統一でデータ限
られている
• 経験
– 過去のプロジェクトの定性的なデータを調べる。定性的な議論できな
い。やりやすくて簡単に傾向がわかる
• (静的解析)
– 作ったプロダクトの解析をする。方法には適用できない。評価の自動
化できるかもしれない。
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
制御型
• 繰返し
– 条件を揃えていくつものプロジェクトで繰り返す。高価。
• 実験室
– 条件を揃えて実験室で繰り返す。スケーラビリティ。条件を制御し
やすく比較的安価。
• (動的解析)
– プロダクトの効率を実行させて計測。方法には適用できない。
• (シミュレーション)
– 仮想データで実行。
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
発表された論文の分類(他の科学)
方法\論文種類 デバイス
物理
臨床医学
人類学
評価なし
16%
プロジェクトモニタ
事例評価
40%
アサーション
8%
野外調査
58%
6%
31%
16%
4%
6%
8%
8%
文献調査
事例調査
経験
静的解析
11%
繰返し
実験室
動的解析
シミュレーション
4%
18%
24%
6%
5%
5%
32%
23%
23%
8%
12%
29%
5%
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソフトウェア工学の現状
• 30年に亘って,いろいろな技法,システム,
ツールなどの提案がされてきた.
• あまりにも,言いっぱなしの提案が多い
– 評価するために手間暇かかる -> 歴史で評価
(ICSE n-10)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソフトウェア工学の論文が使っている評価法
実験なし
プロジェクトモニタ
事例研究
アサーション
評価法
野外調査
文献調査
1985
1990
1995
事例調査
経験
-ICSE
-TSE
-IEEE
Software
静的解析
繰返し
実験室
動的解析
シミュレーション
0%
5%
10%
15%
20%
25%
論文の割合
30%
35%
40%
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
45%
Empirical Software Engineering
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
エンピリカルソフトウェア工学
• 定量的なデータに基づいてソフトウェア工学に
おけるいろいろな手法、技術、ツールなどの評
価を行う
• データの収集が必須
– 実際の開発現場のデータ
– オープンソース開発プロジェクトのデータ
• エンピリカルソフトウェア工学に関する雑誌、
国際会議、研究機関ができつつある
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Journal by Kluwer
Empirical Software Engineering
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2002 International Symposium
on Empirical Software Engineering
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Fraunhofer IESE Model
•
•
•
•
•
•
Fraunhofer財団(政府系研究支援)
Institute for Experimental Software Engineering
大学工房モデル
Kaiserslautern大学を基礎
大学から車で10分
仕事内容
–
–
–
–
–
ソフトウェア開発に関わる技術評価
ソフトウェア品質向上システムの設計
品質規格認証への支援
ソフトウェア技術者教育の支援
ソフトウェア購入・発注・開発管理の支援
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Fraunhofer Institute for
Experimental Software Engineering
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
これからの
ソフトウェアエンジニアリング
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
データの粒度による分類
計測・検索
粒度
粗
対象
評価・分析
目的
プロジェクト群(企業内全
資産、全オープンソース
等)
フィードバック
形態
パターンや部品、知見の抽出、
利益予測
部品共通化、リファレンスモデ
ル・標準化
25.0%
3,500,000
3,000,000
20.0%
2,500,000
15.0%
2,000,000
10.0%
1,500,000
1,000,000
5.0%
0 .9 .4 .1
0 .9 .5
0 .9 .6
0 .9 .7
0 .9 .8
0 .9 .9
1 .0
1 .0 .2
1 .1
1 .1 a
1 .1 b
1 .2 .1
1 .2 a
1 .2 b
1 .3 a
500,000
m1 0
m1 1
m1 2
m1 3
m1 4
m1 5
m1 6
m1 7
m1 8
0 .6
0 .7
0 .8
0 .9
0 .9 .1
0 .9 .2
0 .9 .2 .1
0 .9 .3
0 .9 .4
0.0%
0
version
単一プロジェクト
進捗把握、コスト管理
Away
O n lin e
O n lin e
Busy
プロセス改善、資産再利用
N A R A P ro je ct
J u l.
2002
O n B u s in e s s trip
I’m b u s y...
Task XX
既
存
の
ソ
フ
ト
ウ
ェ
ア
工
学
技
術
Task XX
Task XX
Task XX
Task XX
Task XX
各開発者の作業や生産物
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
M assage:
ta sk 1
It w ill fin is h s o o n ...
C u rre n t ta s k
A n a lys is U se -ca s e
Send
C a te g o ry
R e q . D e v.
s ta rt
d e live ry
MD
0 2 .0 6 .2
4
0 2 .0 7 .2
9
32h
U n fin is h e d
O rd e rM rg
P ro d u c tM rg
ta sk 2
R e la te d file
S to c C o n t
C o u to m e rD a ta
o p e ra tio n
ta sk 3
F ile
M assage
Chat
ユーザビリティ・問題把握
ヘルプ、ツール・ガイドライン
( 4 )ソ フ トウ ェ ア の 状 態
マウスカーソル
( 1 )人 間 の 状 態
ソ フ トウ ェ ア
細
Task XX
I u p lo a d th e file .
S oftw ar e
rtifact
プAロ
ダクト
( 5 )プ ロ ダ ク ト の 状 態
注視点
④
( 3 )ソ フ トウ ェ ア か ら 人 間
への呈示情報
( 2 )人 間 か ら ソ フ ト ウ ェ ア
への入力
人間
①
②
③
粗粒度データを対象としたSE
* (実用化はまだまだだが)ソフトウェア工学として細・
中粒度はかなり研究されている
→ Local Software Engineering
*粗粒度を陽に意識したソフトウェア工学まだない
→ Global Software Engineering
* 組織の利益に直結する結果が得やすい
* 基礎となる技術の種はいろいろある
* 計算機のパワーアップ、ネットワークの高速化によって、
実現できそうな気配
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ターゲットとなる研究・開発
• プロジェクトにまたがった大規模データの収集,蓄積技
術(Inter-project Data Collection)
• 得られたデータを大域的に解析・評価技術(Global
Analysis)
• 評価結果に基づいて経験や知識を資産化する技術
(Software Asset Management)
• 粒度間の情報交換技術(Knowledge Circulation)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
目指すシステム
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システム使用イメージ
• プログラムの生産性が、社内的な再利用やオープンソー
スの利用で劇的に上がる
• 管理しきれなかった膨大な社内資産が、見通しよく整理
できた
• 過去の同類のプロジェクト情報を有効利用して、コスト
管理が厳密になった
• 蓄積した欠陥情報を利用して、信頼性を大幅に改善され
た
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
関連基礎技術(1)
コードクローン検出
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
コードクローン
 ソースコード中に類似したコード片があるとき、
それらをコードクローンという
コードクローンはソフトウェア保守を困難にする
クローンペア
クローンクラス
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
コードクローン検出ツーCCFinder
 ソースコードをトークン単位で直接比較することにより
クローンを検出
 数百万行規模のシステムにも実用時間で解析可能
 実用的に意味のあるクローンのみを検出
– 名前空間の正規化(ユーザー定義名の置き換えに対処)
– テーブル初期化部分を取り除く
– モジュールの区切りを認識する
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
CCFinderの処理概要(1)
ソースコード
CCfinder
字句解析
トークン列
変換処理
変換後トークン列
検出処理
クローン情報
出力整形処理
クローンペア位置情報
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
CCFinderの処理概要(2)
1. static void foo (
ソースコード
字句解析
) throws RESyntaxException {
1. static void foo() throws RESyntaxException {
[ ] = new String [ ] { "123,400" , "abc" , "orange 100" } ;
2.
String
a[] = new String [] { "123,400", "abc", "orange 100" };
3.3.org .org.apache.regexp.RE
apache . regexp . RE patpat= =new
org org.apache.regexp.RE("[0-9,]+");
. apache . regexp . RE ( "[0-9,]+" )
new
4.4.int sum
0 =; 0;
int=sum
5.5.for ( for
int (int
i i= = 00; i; < ia.length;
< a . ++i)
length ; ++ i )
6.6.if ( pat
. match ( a [ i ] ) )
if (pat.match(a[i]))
7.7.sum += Sample
. parseNumber
( pat . getParen ( 0 ) ) ;
sum +=
Sample.parseNumber(pat.getParen(0));
+ sum);
8.8.SystemSystem.out.println("sum
. out . println ( "sum = " =+ "sum
) ;
9.9.} }
10.staticstatic
void( goo(String
RESyntaxException
{
10.
void goo
String a [ []] a)) throws
throws RESyntaxException
{
11.
= new
RE("[0-9,]+");
11.
RE expRE
= exp
new RE
( "[0-9,]+"
) ;
12.int sumint= sum
12.
0 ;= 0;
13. for (int i = 0; i < a.length; ++i)
13. for ( int i = 0 ; i < a . length ; ++ i )
14.
if (exp.match(a[i]))
14. if ( exp . match ( a [ i ] ) )
15.
sum += parseNumber(exp.getParen(0));
15. sum += parseNumber ( exp . getParen ( 0 ) ) ;
16. System.out.println("sum = " + sum);
16. System . out . println ( "sum = " + sum ) ;
17. }
2. String a
;
トークン列
変換処理
変換後トークン列
検出処理
クローン情報
出力整形処理
17. }
クローンペア位置情報
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
CCFinderの処理概要(3)
ソースコード
字句解析
1. static void
$p $pfoo ( ( ) ) throws
throws$pRESyntaxException
{
{
2. String
$p $p a [ [ ] ] = =newnew$pString
[ ] [ { ] $u{ "123,400"
}$u ; } ; , "abc" , "orange 100" }
;
3. RE
org
$p pat
$p. apache
= new RE
$p
. regexp
( "[0-9,]+"
$p . ) RE; )pat ; = new org . apache . regexp . RE ( "[0-9,]+" )
;
トークン列
4. int
$p sum
$p == $p0 ;;
5. for ( int
$p $p
i = $p
0 ; $p
i < $p
a . length
$p ; ++
; ++
$p i)
6. if
)
変換処理
( pat
$p . match
$p ( ($p a [ [$p i ] ] ) ) ) )
7. sum
$p +=
+= $p
Sample
. $p. parseNumber
( $p . $p ( ( pat$p . ) getParen
) ; (
8. System
$p . $p
. out
. $p
. println
( $p (+ "sum
$p =) " ;+ sum )
0
)
)
;
;
変換後トークン列
9. }
10. static void
$p $pgoo ( ( $pString
$p [a ][
)] throws
) throws
$p RESyntaxException
{
{
11. RE
$p exp
$p == new
new $p
RE (( $p
"[0-9,]+"
) ; )
;
検出処理
12. int
$p sum
$p == $p0 ;;
13. for ( int
$p $p
i = $p
0 ; $p
i < $p
a . length
$p ; ++
; ++
$p i)
14. if
( exp
$p . . $p
match( $p
( a[ $p
[ i]
])
))
クローン情報
)
)
15. sum
$p +=
+= $p
parseNumber
$p . . $p
parseNumber
( ( $pexp. (.$pgetParen
exp( $p
. getParen
)( 0) );(
16. System
$p . $p
. out
. $p
. println
( $p (+ "sum
$p =) " ;+ sum )
)0 ;)
)
;
出力整形処理
;
17. }
クローンペア位置情報
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
CCFinderの処理概要(4)
***
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * * * ** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
*** * **
**
** *** ** * *** * * * * *
* *** *
* * *** ***
* * *** *
*****
* **
**
** ** * ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
*
*
* *
**
**
*
*
*
*
**
**
*
** **
** ** **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
**
****
** *
** * * ** *
** * * * * * * * * * *
* * * * * *
* * * * *
** **
****
** *
** * * ** *
** * * * * * * * * * *
* * * * * *
* * * * *
**
* *** ***
** * * ** *
** * * * * *
* * ***
* * * * * *
* * * * *
** ***
* *** ***
** * * ** *
** * * * * *
* * * **
* * * * * *
* * * * *
*
*
*
*
*
*
*
**
* ** ***
*** * * ****
** ** * * * *
* * * *
* * * * * *
* * * * *
** **
* ** * **
*** * * *** *
*** * * * * *
* * * *
* * * * * *
* * * * *
**
* *** ***
** * * ** *
** * * * * *
* * ***
* * * * * *
* * * * *
** ** * * ** * ** *
** * * ** *
** * * * * *
* * * **
* * * * * *
* * * * *
*
*
*
*
*
*
*
*
**
*
*
**
*
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
**
*
**
**
** ** ** ** ** ** ** ** ** **
** ** ** ** **
**
** **
**
** ** ** ** ** ** ** ** ** **
** ** ** ** **
**
* **
** ***
**
*** *
* *
* **
****
*
***** ** ** ** **
** **
**
** ***
**
** * ** ** **
** *** **
** *** ** ** ** **
*
*
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** *** *
*** * **
**
** *** ** * *** * * * * *
* * * ** * **
* * * ** *
** ***
* **
**
** * ** ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
*
**
**
*
*
**
**
*
*** * ***** ** ** *** * ** **
* ** * *** ** ** ** ** * * ** **
**
* **
**
* * * *
* * * * * * * * * * * * * ** **
* **
**
* * * *
* * * * * * * * * * * **
**
* ** ***
*** * * ****
**** * * * *
* * * *
* * * * * *
* * * * *
** **
* ** ***
*** * * ****
**** * * * *
* * * *
* * * * * *
* * * * *
**
* **
**
**
*
*
**
*
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
**
*
**
**
**
*
*
**
*
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
*
*
*
*
*
*
**
*
*
*
*
* * ** * *
*** * **
**
** *** ** * *** * * * * *
* * ** * ** *
* * ** * *
*** **
* **
**
** ** * ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
**
* ** ***
*** * * ****
**** * * * *
* * * *
* * * * * *
* * * * *
** **
* ** ***
*** * * *** *
*** * * * * *
* * * *
* * * * * *
* * * * *
**
* **
**
** * * *** ** ** *** * ** *
* * * *
* * * * * * * * * * * * * ** **
* **
**
** * * *** * * ** * ** * * * *
* * * *
* * * * * * ** * * * * *
*
*
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
**
* **
**
** * * ** *
** * *** * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * *** * *
* * * *
* * * * * *
* * * * *
**
* **
**
** * * ** *
** * * *** *
*** * *
* *** * ** *
* ** ** * *
** **
* **
**
** * * ** *
** * * ** * *
** * * *
* ** * ** * *
** ** * * *
*
*
*
*
**
*
*
*
*
*
*
**
*
*
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
* *
*
**
**
**
*
* *
*
**
**
**
*
*
*
**
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
**
* **
**
** * * ** *
** * * *** *
*** * *
* ** * ** * *
** ** * * *
** **
* **
**
** * * ** *
** * * ** * *
** * * *
* ** * ** * *
** ** * * *
** *** *
** * ** *
*** * **
**
** *** ** * *** * * * * *
* * *** ***
* * *** *
*****
* **
**
** *** ** * *** * * * * *
* * * ** * **
* * * ** *
**
* **** ****
** * * ** *
** * * * * *
* * **** * * * * * *
* * * * *
** **** * **** ****
** * * ** *
** * * * * *
* * ** * * * * * * * *
* * * * *
*
*
**
**
**
**
**
**
**
**
**
**
*
*
**
**
**
**
**
* **
**
** * * ** *
** * * * * *
* * * *
*** * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
** * * * * *
* * * * *
**
* **
**
** * * ** *
** * * *** *
* ** * *
* * ** * ** *
* ** ** * *
** **
* **
**
** * * ** *
** * * * ** *
* ** * *
* * ** * ** *
* ** ** * *
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** *** *
** *** *
*** * **
**
** *** ** * *** * * * * *
* * *** ***
* * *** *
*****
* **
**
** *** ** * *** * * * * *
* * *** ***
* * *** *
*
*
*** * **
**
** *** ** * *** * * *** *
* *** ** ** **
* ** ** ** *
** ***
* **
**
** * ** ** * *** * * * ** *
* * ** ** ** **
* ** ** ** *
** *** *
** * ** *
** * * **
**
** * ** ** *
** * * * * **
* * * * *** * * * * *** * * * * **
** ** * * **
**
** * ** ** *
** * * * * **
* * * * ** * * * * * *** * * * * **
*
**
**
***
**
*
**
**
** *
**
*
*
*
* *
*
*
*
* *
* ** * * ** *
** * * * * * ** **
* ** * * ** *
** * * * * *
**
* **
**
** * * * ** *
* ** * *
* * ** * ** *
* **
**
** * * * ** *
* ** * *
* * ** * ** *
* *
* *
**
* **
**
** * * ** *
** * * *** *
*** * *
* *** *** *
***** * *
** **
* **
**
** * * ** *
** * * ** * *
** * * *
* ** * ** * *
** ** * * *
*** * **
**
** *** ** * *** * * * * *
* * *
* * * ** * **
* * * ** *
** ***
* **
**
** * ** ** * *** * * * * *
* * * *
* * * ** * **
* * * ** *
**
**
* **
**
** * * ** *
** * * * * *
* *** *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * * * * ** * *
* * * * * *
* * * * *
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * ***
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * ***
*
**
**
***
**
*
**
**
** *
**
*
*
*
* *
*
*
*
* *
*
*
**
*
*
*
***
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
*** * **
**
** *** ** * *** * * * * *
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
**
*
**
**
**
*
*
**
*
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
*
**
**
**
** **
**
** **
**
** ** ** **
** ** ** ** ** ** ** ** ** **
** ** ** ** **
**
* **
**
**
** *
* *
* **
** *
*
** *
* *
* *
* *
* *
*
** ** ** ** ** ** ** ** ** **
** ** ** ** **
**
** **
**
** ** **
** ** ** ** ** **
**
**
* *
**
**
**
* *
*
*
*
**
**
*
*
*
*
**
**
*
** **
** ** **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
* **
**
****
**
** *
** *
* *
* **
** *
*
** *
* *
* *
* *
* *
* * *
* *
* *
* *
*
* *
* *
* ** ** **
** **
**
** *
** ** ** **
** ** **
** ** ** ** ** ** * ** ** ** ** ** ** ** ** ** **
** ** ** ** **
**
*
**
**
**
*
** ** ** ** **
**
** **
**
**
**
**
* *
**
** **
* *
**
* ** ***
*** * * ****
**** * * * *
* * * *
* * * * * *
* * * * *
** **
* ** ***
** * * * ** **
** ** * * * *
* * * *
* * * * * *
* * * * *
**
* *** ***
** * * ** *
** * * * * *
* * * **
* * * * * *
* * * * *
** ** * * ** * ** *
** * * ** *
** * * * * *
* * * **
* * * * * *
* * * * *
*
*
*
*
*
*
*
*
**
*
*
**
*
**
**
*
*
*
*
**
**
*
*
*
*
**
**
**
* **
**
**
**
**
** ** ** **
** ** ** ** ** **
** ** ** ** **
**
** **
**
**
** ** ** **
** ** ** ** ** **
** ** ** ** **
**
*
*** ** ** **
*****
***** ** ** ** **
** **
**
** ***
**
** * ** ** **
** ***
** *** ** ** ** **
***
**
* **
**
** ** * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** ** * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
**** * **
**
** **** ** * *** * * * * ** ** * ** * *** * * ** * **** * * * ** **
** *** * * **
**
** ** ** ** * * ** * * * * ** * * ** * * ** * * ** * ** * ** * * ** * * *
*** * * *** ** ** *** * ** *
* ** * * * ** ** ** ** * * ** *
**
* **
**
* * * *
* * * * * * * * * * * * * ** **
* **
**
* * * *
* * * * * * * * * * * * *
**
* ** ***
*** * * ****
**** * * * *
* * * *
* * * * * *
* * * * *
** **
* ** ***
*** * * *** *
*** * * * * *
* * * *
* * * * * *
* * * * *
**
* **
**
**
*
*
**
*
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
**
*
**
**
**
* * *** * * ** * ** * * * *
* * * *
* * * * * * ** * * * * *
*
*
**
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * ** * *
**
* ** ***
** * * * ** **
** ** * * * *
* * * *
* * * * * *
* * * * *
** **
* ** ***
** * * * ** **
** ** * * * *
* * * *
* * * * * *
* * * * *
**
* **
**
* * ** *
** * * * * *
* * * *
* * * * * * * * * * * * * ** **
* **
**
** * * * ** ** ** ** * * ** *
* * * *
* * * * * *
* * * * *
***
***
**
* **
**
** * * *** ** ** *** * ** *
* * * *
* * * * * *
* * * * *
** **
* **
**
* * ** *
** * * * * *
* * * *
* * * * * * ** * * * * *
**
* **
**
** * * ** *
** * * ** * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * ** * * *
* * * *
* * * * * *
* * * * *
*
*
**
* **
**
*** * *
* *** *** * * ***** * * * ** **
* **
**
*** * *
* *** *** * * ***** * * *
*** * * *** ** ** *** * ** *
*** * * *** * * ** * ** * * * *
**
* **
**
** * * ** *
** * * * * **
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * **
* * * *
* * * * * *
* * * * *
* *
*
**
**
**
*
* *
*
**
**
**
*
*
*
*
*
*** * **
**
** *** ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
*** **
* **
**
** ** * ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
**
* **
**
** * * ** *
** * * *** *
*** * *
* *** *** *
***** * *
** **
* **
**
** * * ** *
** * * * ** *
* ** * *
* * ** * ** *
** ** * * *
* * ** * *
*** * **
**
** *** ** * *** * * * * *
* * ** * ** *
* * ** * *
*** **
* **
**
** ** * ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
**
* **** ****
** * * ** *
** * * * * *
* * **** * * * * * *
* * * * *
** **** * **** ****
** * * ** *
** * * * * *
* * * *** * * * * * *
* * * * *
*
*
*
**
**
**
**
**
**
*
*
*
**
**
**
**
**
**
**
**
* **
**
** * * ** *
** * * * * *
* * * *
*** * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
*** * * * *
* * * * *
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
*
*
*
*
*
*
*
*
*
*
*
*
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * *
** * ** *
*** * **
**
** * ** ** * *** * * * * *
* * * ** * **
* * * ** *
*** **
* **
**
** ** * ** * * ** * * * * * * * ** * *
* * ** * ** *
* * ** * *
*
*
*** * **
**
** *** ** * *** * * *** *
* *** **** **
***** ** *
** ***
* **
**
** * ** ** * *** * * *** *
* * ** ** ** **
* ** ** ** *
** * ** *
** * ** *
** * * **
**
** * ** ** *
** * * * * **
* * * * *** * * * * *** * * * * **
** ** * * **
**
** * ** ** *
** * * * * **
* * * * ** * * * * * *** * * * * * *
*
**
**
** *
**
*
**
**
** *
**
*
*
*
* *
*
*
*
* *
* ** * * ** *
** * * * * * ** **
* ** * * ** *
** * * * * *
**
* **
**
** * * *** *
*** * *
* *** *** *
* **
**
** * * *** *
*** * *
* *** *** *
* *
* *
**
* **
**
** * * ** *
** * * *** *
*** * *
* *** *** *
** ** * * *
** **
* **
**
** * * ** *
** * * ** * *
* ** * *
* * ** * ** *
* ** ** * *
*** * **
**
** *** ** * *** * * * * *
* * *
* * * ** * **
* * * ** *
** ***
* **
**
** * ** ** * *** * * * * *
* * * *
* * * ** * **
* * * ** *
**
**
* **
**
** * * ** *
** * * * * *
* * ** *
* * * * * *
* * * * *
** **
* **
**
** * * ** *
** * * * * * * * ** * *
* * * * * *
* * * * *
**
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * ***
** **
* **
**
** * * ** *
** * * * * *
* * * *
* * * * * *
* * * * **
*
**
**
***
**
*
**
**
** *
**
*
*
*
* *
*
*
*
* *
*
*
*
*
*
*
ソースコード
字句解析
トークン列
変換処理
変換後トークン列
検出処理
クローン情報
出力整形処理
クローンペア位置情報
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
CCFinderの処理概要(5)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
static void foo() throws RESyntaxException {
String a[] = new String [] { "123,400", "abc", "orange 100" };
org.apache.regexp.RE pat = new org.apache.regexp.RE("[0-9,]+");
int sum = 0;
for (int i = 0; i < a.length; ++i)
if (pat.match(a[i]))
sum += Sample.parseNumber(pat.getParen(0));
System.out.println("sum = " + sum);
}
static void goo(String [] a) throws RESyntaxException {
RE exp = new RE("[0-9,]+");
int sum = 0;
for (int i = 0; i < a.length; ++i)
if (exp.match(a[i]))
sum += parseNumber(exp.getParen(0));
System.out.println("sum = " + sum);
}
ソースコード
字句解析
トークン列
変換処理
変換後トークン列
検出処理
クローン情報
出力整形処理
クローンペア位置情報
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
適用例#1 JDKのライブラリ
• JDK(Java Development Kit) 1.2.2(サンプル
とデモプログラムを除く)
• 入力ファイルは1648個,約50万行
• ツールの実行には,Pentium III 650MHzおよび
1GBのRAMを持つPCで約3分を要した
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
JDKのコードクローン散布図
• 両軸はソースファ
イルを辞書順に並
べたもの
• 20行以上のコード
クローンを図示
• 多くのコードク
ローンが密集して
いる(A)
• 最長のコードク
ローン(B)
B
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
A
コードクローンが密集している部
分(A)
• src/javax/swing/plaf/multi/*.java(29個)
– クラス名を除いてまったく同じクラスの定義
– コード生成ツールによって生成された
31| */
32| public class MultiButtonUI extends ButtonUI {
33|
160|
161|
162|
163|
164|
165|
public static ComponentUI createUI(JComponent a) {
ComponentUI mui = new MultiButtonUI();
return MultiLookAndFeel.createUIs(mui,
((MultiButtonUI) mui).uis,
a);
}
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
最長のコードクローン(B)
•
•
•
•
最長のコードクローン(349行)
src/java/util/Arrays.javaの18の“sort”メソッド
シグネチャ(引数の型と数)が異なる
アルゴリズムは同一
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
FreeBSD, Linux, NetBSDの比較
• 3つのOSの比較
– FreeBSD 4.0 (C 220万行)
– Linux 2.4.0 (C 240万行)
– NetBSD 1.5 (C 260万行)
• FreeBSDとNetBSDは同じソースコードから,
Linuxは異なるソースコード
• 実行には108分を要した
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
UNIXカーネル間のコードクローン
Linux 2.4.0
NetBSD 1.5
NetBSD 1.5
Linux 2.4.0
FreeBSD 4.0
FreeBSD 4.0
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
FreeBSDとLinuxのコードクローン
•
•
sys/net/zlib.c
sys/pc98/boot/
kzipboot/misc.c
arch/ppc/coffboot/
zlib.c
drivers/net/zlib.c
fs/cramfs/inflate/
{adler32.c,
infblock.c,
infcodes.c,
inffast.c,
inflate.c,
inftrees.c,
infutil.c }
lib/inflate.c
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
lib/inflate.c
fs/cramfs/inflate/
{adler32.c,
infblock.c,
infcodes.c,
inffast.c,
inflate.c,
inftrees.c,
infutil.c }
drivers/net/zlib.c
arch/ppc/coffboot/
zlib.c
sys/pc98/boot/
kzipboot/misc.c
sys/net/zlib.c
sys/kern/inflate.c
FreeBSD 4.0
共通のソースから分
岐したソースファイ
ル
名前が付け替えられ
たソースファイル
あるソースファイル
を複数のファイルに
分割している →
Linux 2.4.0
sys/i386/boot/
kzipboot/misc.c
Linux 2.4.0
•
sys/i386/boot/
kzipboot/misc.c
• ドライバ部分に
多くのクローン
「ファイル」が
存在する
sys/kern/inflate.c
FreeBSD 4.0
関連基礎技術(2)
ソフトウェアシステムの類似
度
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
類似度の定義
Q
P
• 二つのプロダクトP={p
1,…,pm},Q={q1,…,qm}に対
し、等価な要素の対応R⊆P×Qが得られるとする
• PとQのRに対する類似度S(0≦S≦1)を以下のよ
うに定義する
S(P,Q) 
|{p i |(p i ,q j )  R}|  |{q j |(p i ,q j )  R}|
P  Q
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
CCFinderを利用したシステム間類似度
SMMT
P
前処理後のP
Step1
Step2
前処理
Q
Step3
CCFinder CCFinder
diff
の実行結果
の実行
の実行
前処理後のQ
diff
の実行結果
Step4
対応の
抽出
抽出結果
Step5
類似度
類似度の
計算
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
実験
• UNIX系OSを用いて類似度を計算した
–
–
–
–
4.4BSDLite, 4.4BSDLite2
FreeBSD2.0, 2.0.5, 2.1, 2.2, 3.0, 4.0
NetBSD1.0, 1.1, 1.2, 1.3, 1.4, 1.5
OpenBSD2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8
• 23個のOSのすべての組み合わせで類似度を求め
た
• カーネル部分のC言語のソースのみ
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
同一種類のOS間での類似度
• FreeBSD 2.2との間の類似度
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
異なる種類のOS間での類似度
• FreeBSD3.0とNetBSD1.3で4.4BSDLite2が取り込まれている
0.5
NetBSD 1.0
0.45
NetBSD 1.1
0.4
NetBSD 1.2
0.35
NetBSD 1.3
0.3
0.25
0.2
0.15
0.1
0.05
0
FreeBSD 2.0 FreeBSD 2.0.5 FreeBSD 2.1
FreeBSD 2.2
FreeBSD 3.0
FreeBSD 4.0
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
類似度を距離とした系統樹
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
関連基礎技術(3)
ソフトウェア部品検索
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソフトウェア部品の再利用
• 膨大なソフトウェアが毎日開発され続けている
• 同様なソフトウェア部品 (ライブラリやコード片、抽象的な
アルゴリズム ...) が異なるところで独立に開発されているか
もしれない
• 高信頼性、高生産性の鍵
– 再利用
• ソフトウェアライブラリを探し回るのは大変
– サーチ機能が貧弱
– 整合性を保った管理は困難
• 人手を介さない、自動的に保存、検索ができる部品ライ
ブラリが必須
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
部品ランクモデル
• 検索結果の表示順を決めるためのモデル
• プログラム部品(component)群をグラフ化
• 部品の重み計算
• 重みの順序:部品ランクComponent Rank (CR)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
部品グラフ
システム Y
システム X
A
B
F
C
D
G
E
H
I
部品
利用
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
類似部品の集約
C
G
B
F
A
D
C
G
BF
E
AD
E
A  D, B  F
部品グラフ
集約化した部品グラフ
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
部品の重み
0.4
0.2
0.2
A
B
0.2
0.4
0.2
0.4
C
安定した重み配置は、隣接行列の固有値計算による
部品ランク : 頂点の重みの順 1:A, C 3:B
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
部品ランクモデルの意味
0.02
0.01
0.01
0.05
0.03
0.001
0.1
• ユーザの視点移動をマルコフモデルで表したもの
• 単位時間ごとにユーザ視点が利用関係に沿って移動
• 頂点の重みはユーザ視点の存在確率
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
部品ランクの適用例
JDK1.3(約1800ファイル)を対象として部品ランクを計算
• 言語仕様上、直接的、間接的に利用しなければならないクラスが上位を占
めている
順位
部品名
評価値
1 java.lang.Object.java
0.130842077
2 java.lang.Class.java
0.070779904
3 java.io.EOFException.java
0.051143644
・・・
3 java.io.IOException.java
0.051143644
66 .org.w3c.dom.Node.java
0.034599252
67 java.lang.Throwable.java
0.03047256
68 java.lang.StringBuffer.java
0.014695051
69 javax.naming.NamingException.java
0.013914379
70 java.lang.VirtualMachineError.java
0.010906467
71 org.w3c.dom.NodeList.java
0.010547134
72 java.io.InputStream.java
0.010030122
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
S P A R S-J
Software Product Archiving, Analyzing and Retrieving System for Java
Analyzer and
Evaluator
Component
Collector
インターネット・イントラネット
Query Handler
ソフトウェア検索者
Component
Archive
SPARS-J
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
エンピリカルソフトウェア工学
プロジェクトESEP
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プロジェクト概要
• 文部科学省リーディングプロジェクト
– e-society基盤ソフトウェア総合開発計画
• 2003年4月開始で5年計画
• 奈良先端科学技術大学院大学/大阪大学
• 産学連携の大学工房モデル
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
大学工房モデル
実践的ソフトウェア工学のための産学協力方式
人材派遣
問題提供
予算提供
人材派遣
新しい技術
技術の評価結果
研究資金
新しいテーマの発見
大学
大学工房
問題解決
ノウハウ吸収
人材育成
産業界
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
エンピリカルソフトウェア工学ラボ
• 千里中央にオフィス
• 専任研究員、企業出向者、大学研究者、事務員滞在
• 研究開発のみならず交流の拠点
– 多様なソフトウェア工学に関する技術委員会
– 常に内外の市場調査
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
海外との連携
グローバルな
エンピリカル
ソフトウェア工学研究グループ
各企業
フラウンホッファー
実験的ソフトウェア工学研究所
IESE
フラウンホッファー
実験的ソフトウェア工学研究所
(独:Kaiseralautern)
所長:Dr.Dieter Rombach
( Kaiseralautern大学)
共
同
研
究
技術委員会
エンピリカルソフトウェア工学ラボ
(大阪・千里中央)
データに基づいたソフトウェア開発支援システム
大阪大学
奈良先端科学技術
大学院大学
文部科学省
e-Society基盤ソフトウェア総合開発計画
IESE : Fraunhofer Institute for Experimental Software Engineering
FC-MD: Fraunhofer Center for Experimental Software Engineering, Maryland
CAESER: Center for Empirical Software Engineering Research
協力
メリーランド、フラウンホッファー
実験的ソフトウェア工学センター
FC-MD
(米:Maryland)
所長:Dr.Victor Basili
( Maryland大学)
エンピリカルソフトウェア工学
研究センタ
CAESER
(豪:シドニー)
Dr.Ross Jeffery
(ニューサウスウェールズ大学)
Dr.B.Bohem
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ベースとなるシステム
• オープンソース開発管理システムを基本
– CVS:レポジトリ構築、バージョン管理
– MailMan:メール蓄積、管理
– Gnats:バグ追跡
• 既存のWebインターフェースの利用
– Corporate
Source
(ZeeSource)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
System Architecture
グローバルSEのためのデータの標準化
• プロダクトデータ
– CVSを使った各種プロダクトの履歴
– プロダクト間の種々の関係定義をXMLで標準化
• プロセスデータ
– XMLを使った標準形式のイベント系列を蓄積
• CVS、MailMan、Gnatsのログなどから自動抽出(粗粒度情報)
• 各作業者の作業環境からの標準形式での情報提供(細粒度情報も可
能)
• プロセス・プロダクト間関連データ
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プロダクトデータに関して
•
•
•
•
•
関連情報の自動抽出
プロダクトの自動分類
再利用部品の抽出
プロダクト情報のインデキシング、蓄積手法
検索、ブラウジング手法
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プロセスデータに関して
プロダクトデータからプロセスデータの抽出法
プロセスデータの自動報告
プロセスデータの正規化手法
組織レベル、プロジェクトレベル、個人レベル
それぞれの解析
• プロセス比較、評価手法
•
•
•
•
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムの使用イメージ(プロジェクト
内)
予想進捗
投入コスト
トータルサイズ
完成モジュール数
成功テストケース
ドキュメント章数
バグレポート数
...
t
work
平均作業量
開発者Xの作業量
t
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムの使用イメージ(プロジェク
ト比較)
progress
Project A
Project B
進捗度の比較
バグ、信頼度の予測
Project C
t
cost
コストの比較
1
2
3
4
5
project
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムの使用イメージ(プロダ
クト)
ソフトウェア部品、コード片検索
キーワード入力
コード片(クローン)
類似プロダクトの分類、整理
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
今後の計画
• 11月始めに、連携海外研究者と共同WS
• WSで本システムの初期バージョンの公開
• 初期バージョンの利用促進
– 評価に参加する協力企業の募集
• それ以外の一般参加企業の募集
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
受託開発と開発データ
• この種の開発データの添付がソフトウェア受託
開発の契約に重要になってくる
– クリティカルシステムのみならず、一般のソフト
ウェアシステムでも社会的なインパクトが大きく
なってきている
– ちゃんと開発しているかの把握、フェイクしにくい
直接データ
– ちゃんと開発しているところにとっては容易なこと
– ISO9000やCMMのための基礎データとしても有用
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Descargar

大規模収集データに基づいた ソフトウェアエンジニアリング