SlideShare a Scribd company logo
© 2019 NTT DATA Corporation 1 © 2019 NTT DATA Corporation
NTTデータ テクノロジーカンファレンス 2019
まだプログラム手で書いて消耗してるの?
~入出力例からプログラムを自動生成する技術~
2019年9月5日
株式会社NTTデータ 技術革新統括本部 システム技術本部 生産技術部
インテグレーション技術センタ 岡田譲二
© 2019 NTT DATA Corporation 2
岡田譲二の自己紹介
R&Dスペシャリスト(専門:プログラム解析)
特許や論文執筆から実際の現場への導入まで
炎上案件の火消しも
関数型プログラミング大好き!
■ 主な外部発表
• “プログラミング言語基礎” ���手ITエンジニア最強の指南書 (2017).
• “Haskellにまつわるウワサを検証する” 日経ソフトウェア 2014年 11月号 (2014).
• “COBOL meets Haskell” 函数プログラミングの集い (2013).
© 2019 NTT DATA Corporation 3
2020年度から
プログラミング
教育必修に
© 2019 NTT DATA Corporation 4
まだプログラム
手で書いて
消耗してるの?
© 2019 NTT DATA Corporation 5
システム開発は
もう終わっている
© 2019 NTT DATA Corporation 6
ほぼプログラムのような
詳細設計書を手で書く
© 2019 NTT DATA Corporation 7
詳細設計書どおりに
プログラムを手で書く
画像引用元:Christopher KuszajewskiによるPixabayからの画像
© 2019 NTT DATA Corporation 8
意味があるのか
分からない
テストを打鍵する
© 2019 NTT DATA Corporation 9
テスト証跡として
画面キャプチャを
Excel に貼り付ける
© 2019 NTT DATA Corporation 10
システム開発は
もう終わっている
© 2019 NTT DATA Corporation 11
要件を書くだけで
プログラムが
できてくれれば…
© 2019 NTT DATA Corporation 12
銀の弾丸はない
画像引用元:Brooks Jr, Frederick P., et al. "人月の神話." ピアソン エデュケーション (2002).
銀の弾丸はない
© 2019 NTT DATA Corporation 13
だが 希望 はあるだが 希望 はある
画像引用元:フリー素材ぱくたそ(www.pakutaso.com)
© 2019 NTT DATA Corporation 14
入出力例だけで
プログラムが
できる技術
© 2019 NTT DATA Corporation 15
プログラム
合成
© 2019 NTT DATA Corporation 16
プログラム合成:
高レベルの仕様から
実行可能なプログラムを
自動生成する技術
(≠コンパイル)
© 2019 NTT DATA Corporation 17
代表的なアプローチ:
1. 自然言語理解
2. 形式手法
3. 入出力の例示
© 2019 NTT DATA Corporation 18
1. 自然言語理解
自然言語で書かれた
プログラムの仕様を理解し、
プログラムを合成する。
© 2019 NTT DATA Corporation 19
1. 自然言語理解
仕様書
何や分からんけど
ええ感じに
計算して
売上めっちゃ
増やしてくれる
機能
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
if(TMP) {
write(OUT-FILE);
}
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
© 2019 NTT DATA Corporation 20
1. 自然言語理解
仕様書
何や分からんけど
ええ感じに
計算して
売上めっちゃ
増やしてくれる
機能
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
if(TMP) {
write(OUT-FILE);
}
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
© 2019 NTT DATA Corporation 21
2. 形式手法
合成したいプログラムの
性質を論理式で表し、
それを自動的に証明する過程で
プログラムが合成される。
© 2019 NTT DATA Corporation 22
2. 形式手法
仕様書
1 : class ベルト監視制御
2 :
3 : instance variables
4 : private iベルト状態 : ベルト状態;
5 : private i光センサー : 光センサー;
6 :
7 : operations
8 : public ベルト状態を判定する : () ==> ベルト状態
9 : ベルト状態を判定する() ==
10 : is not yet specified
11 : pre
12 : i光センサー.黒線レベル値を読み取る() <> nil
13 : post
14 : cases mk_(i光センサー.黒線レベル値を読み取る(),
RESULT):
15 : mk_(<黒閾値以下>, <黒>) -> true,
16 : mk_(<白閾値以上>, <白>) -> true,
17 : mk_(-, <不明>) -> true,
18 : others -> false
19 : end;
20 : end ベルト監視制御
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
if(TMP) {
write(OUT-FILE);
}
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
画像引用元:http://dudka.cz/fss
© 2019 NTT DATA Corporation 23
2. 形式手法
仕様書
1 : class ライン監視制御
2 :
3 : instance variables
4 : private iライン状態 : ライン状態;
5 : private i光センサー : 光センサー;
6 :
7 : operations
8 : public ライン状態を判定する : () ==> ライン状態
9 : ライン状態を判定する() ==
10 : is not yet specified
11 : pre
12 : i光センサー.黒線レベル値を読み取る() <> nil
13 : post
14 : cases mk_(i光センサー.黒線レベル値を読み取る(),
RESULT):
15 : mk_(<黒閾値以下>, <黒>) -> true,
16 : mk_(<白閾値以上>, <白>) -> true,
17 : mk_(-, <不明>) -> true,
18 : others -> false
19 : end;
20 : end ライン監視制御
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
if(TMP) {
write(OUT-FILE);
}
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
画像引用元:http://dudka.cz/fss
© 2019 NTT DATA Corporation 24
3. 入出力の例示
プログラムへの入出力の例を
いくつか示すことで、
そのような入出力を生み出す
プログラムを合成する。
© 2019 NTT DATA Corporation 25
3. 入出力の例示
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
if(TMP) {
write(OUT-FILE);
}
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
# 入力 出力
1 100 108
2 0 0
3 1200 1296
4 -100 error
入出力例
?
© 2019 NTT DATA Corporation 26
3. 入出力の例示
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
if(TMP) {
write(OUT-FILE);
}
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
while(EOF) {
TMP.set(IN-FILE.X);
if(TMP) {
write(OUT-FILE);
}
read(IN-FILE);
}
# 入力 出力
1 100 108
2 0 0
3 1200 1296
4 -100 error
入出力例
?
© 2019 NTT DATA Corporation 27
Flash Fill
© 2019 NTT DATA Corporation 28
Flash Fill の
凄さが分かるデモ
© 2019 NTT DATA Corporation 29
Flash Fill の仕組み
既知の関数群の
組み合わせを
入出力例と同じ結果が
出るまで試す
© 2019 NTT DATA Corporation 30
無限の猿定理
“猿がタイプライターの鍵盤を
いつまでもランダムに叩き続ければ
シェイクスピアの作品を打ち出す”
© 2019 NTT DATA Corporation 31
無限の猿定理
“猿が 既知の関数 を
いつまでもランダムに組み合わせ続ければ
プログラムを打ち出す”
© 2019 NTT DATA Corporation 32
プログラム合成のポイント
無限の時間かかるのは困るので
なんやかんや工夫する
© 2019 NTT DATA Corporation 33
Devlin, Jacob, et al. "Robustfill: Neural program learning under noisy I/O." arXiv preprint arXiv:1703.07469 (2017).
■合成したプログラム
Concat(
ToCase(
GetToken(
input,
Type=Word,
Index=-1),
Type=Proper),
Const(", "),
ToCase(
SubString(
GetToken(
input,
Type=Word,
Index=1),
Start=0,
End=1),
Type=Proper),
Const("."))
①
人が与える
出力例
④
Flash Fillに
よる自動出力
②
出力例を満たすまで
既知の関数合成を試行
■既知の関数群
Concat(), ConstStr(),
SubStr(), GetSpan(),
GetToken(), ToCase(),
Replace(), Trim(),
GetUpto(), GetFrom(),
GetFirst(), GetAll()
③
合成したプログラムを
使って出力を計算
Flash Fill の仕組み
既知の関数を
12 ��に絞っている
© 2019 NTT DATA Corporation 34
プログラム合成
すごくね?
(Flash Fill の知名度ないけど)
© 2019 NTT DATA Corporation 35
じゃあ
最近のプログラム合成
何してるの?
© 2019 NTT DATA Corporation 36
テーブル変換の合成が
“熱い” らしい
© 2019 NTT DATA Corporation 37
Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017
month student A B
1 Amy 9 6
2 Amy 7 7
3 Amy 6 8
1 Bob 8 5
2 Bob 6 6
3 Bob 9 7
month Amy_A Amy_B Bob_A Bob_B
1 9 6 8 5
2 7 7 6 6
3 8 8 9 7
■人間が与える入力例 ■人間が与える出力例
TBL_1 = gather(input1,MORPH102,MORPH101,`A`,`B`)
TBL_2 = unite(TBL_1, MORPH110,`student`,`MORPH102`)
morpheus = spread(TBL_2,`MORPH110`,`MORPH101`)
■ 合成したプログラム(R言語)
入出力に与えるのは文字列ではなくテーブル
0.2 秒で
合成できる
© 2019 NTT DATA Corporation 38
大枠を作ってから、細かい条件を埋める
month student A B month Amy_A Amy_B Bob_A Bob_B
TBL_1 = gather(input1, ■, ■, ■, ■)
TBL_2 = unite(TBL_1, ■, ■, ■)
morpheus = spread(TBL_2, ■, ■)
Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017
6 行 4 列
3 行 5 列
行を減らして
列を増やすことが
できる関数の
組み合わせか?
■人間が与える入力例 ■人間が与える出力例
© 2019 NTT DATA Corporation 39
Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017
month student A B
1 Amy 9 6
2 Amy 7 7
3 Amy 6 8
1 Bob 8 5
2 Bob 6 6
3 Bob 9 7
month Amy_A Amy_B Bob_A Bob_B
1 9 6 8 5
2 7 7 6 6
3 8 8 9 7
■人間が与える入力例 ■人間が与える出力例
TBL_1 = gather(input1,MORPH102,MORPH101,`A`,`B`)
TBL_2 = unite(TBL_1, MORPH110,`student`,`MORPH102`)
morpheus = spread(TBL_2,`MORPH110`,`MORPH101`)
大枠を作ってから、細かい条件を埋める
値の内容を正しく
設定できる引数の
組み合わせか?
© 2019 NTT DATA Corporation 40
テーブル変換って、
基幹システムの
バッチ処理に似てね?
© 2019 NTT DATA Corporation 41
?
バッチ処理
ID 年齢 住所
102 34 Tokyo
103 19 Osaka
104 25 Nagoya
ID 氏名
102 Amy
103 Bob
104 Carol
氏名 年齢 住所
Amy 34 Tokyo
Bob 19 Osaka
Carol 25 Nagoya
month student A B
1 Amy 9 6
2 Amy 7 7
3 Amy 6 8
1 Bob 8 5
2 Bob 6 6
3 Bob 9 7
month Amy_A Amy_B Bob_A Bob_B
1 9 6 8 5
2 7 7 6 6
3 8 8 9 7
テーブル変換
?
© 2019 NTT DATA Corporation 42
バッチ処理の
プログラム合成
出来るんじゃね?
© 2019 NTT DATA Corporation 43
入出力例って
結局「試験データ」だから、
試験データさえ用意できれば
実装が合成できる!!!!
© 2019 NTT DATA Corporation 44
「プログラム合成」とは
いわゆる God
(実現したら)
© 2019 NTT DATA Corporation 45
NTT データ:
「乗るしかない
このビッグウェーブに」
© 2019 NTT DATA Corporation 46
目論見
プログラム合成を
バッチ処理に適用することで
バッチ処理の自動生成を実現し、
圧倒的な工数削減を目指す
© 2019 NTT DATA Corporation 47
開発プロセスを変える
■ 従来のシステム開発プロセス ■ プログラム合成を活用した開発プロセス
外部
設計書
内部
設計書
試験項目
ソース
コード
試験
データ
試験
証跡
①内部設���
②製造
③試験項目作成
④試験データ作成
⑤試験実施
外部
設計書
内部
設計書
試験項目
ソース
コード
試験
データ
試験
証跡
①試験項目作成
②試験データ作成
③プログラム合成
④設計書リバース④設計書リバース
③プログラム合成
© 2019 NTT DATA Corporation 48
外部
設計
内部
設計
製造・
単体試験
結合試験
外部
設計
結合試験
実現前
実現後
外部設計から
結合試験までの
工数 50% 減を
目指す
© 2019 NTT DATA Corporation 49
プログラム合成に
未来がありそうな気がしたので
作ってみる!
© 2019 NTT DATA Corporation 50
とは言え、いきなり
バッチ全部の合成は無理
(素人だし…)
© 2019 NTT DATA Corporation 51
伝統的なバッチ処理のアーキテクチャー
繰り返し
Item Processor
Item Reader
Item Writer
item’
item
item item item
item’ item’ item’
DB
DB
ID 価格
001 100
002 50
003 1200
ID 価格 税込
001 100 108
002 50 54
003 1200 1296
001 100 002 50 003 1200
001 100
001 108
001 108 002 54 003 1296
税込 = 価格 * 1.08
© 2019 NTT DATA Corporation 52
まずはバッチ処理の一部分である SQL 合成を試す
繰り返し
Item Processor
Item Reader
Item Writer
item’
item
item item item
item’ item’ item’
DB
DB
ID 価格
001 100
002 50
003 1200
ID 価格 税込
001 100 108
002 50 54
003 1200 1296
001 100 002 50 003 1200
001 100
001 108
001 108 002 54 003 1296
税込 = 価格 * 1.08
© 2019 NTT DATA Corporation 53
巨人の肩の上
に立つ
© 2019 NTT DATA Corporation 54
Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017
先ほどのテーブル変換の論文を再現実装してみる
© 2019 NTT DATA Corporation 55
できた
© 2019 NTT DATA Corporation 56
実案件の SQL と
試験データあるし、
合成できるか試してみよ
© 2019 NTT DATA Corporation 57
■ 実案件の SQL
SELECT b1, b2, b3, b4, b5, b6, b7, b8, b9, b10
FROM tableA, tableB
WHERE a3 = b1 AND a1 = ? AND a2 = ?
ORDER BY a2 DESC
a3 と b1 カラムをキーに
tableA と tableB を内部結合し,
a1 と a2 カラムを使った条件で絞り込み,
tableB のカラムだけを選択して,
a2 カラムでソートして出力する
© 2019 NTT DATA Corporation 58
■入力例:tableA
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
0008 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000
0009 2017/4/3 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000
0010 2011/1/1 03 2011/1/1 0 Null 2010/1/11 12:00:00 XX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17
01 22222 1 2 3 4 5 6 7 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
02 11122 1 1 1 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
03 11111 0 0 0 1 2 2 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
入力パラメータ 出力
a1 a2 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10
0008 2017/04/01 01 22222 0 0 0 0 0 0 3 35
0009 2017/04/01 01 22222 0 0 0 0 0 0 3 35
0010 2011/01/01 06 11112 0 1 1 0 0 0 3 35
※実際は108行
※実際は7行
※実際は108行
■入力例:tableB
■出力例
© 2019 NTT DATA Corporation 59
合成を試みた結果…
© 2019 NTT DATA Corporation 60
2時間回したけど返ってこない
© 2019 NTT DATA Corporation 61
Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017
month student A B
1 Amy 9 6
2 Amy 7 7
3 Amy 6 8
1 Bob 8 5
2 Bob 6 6
3 Bob 9 7
month Amy_A Amy_B Bob_A Bob_B
1 9 6 8 5
2 7 7 6 6
3 8 8 9 7
■人間が与える入力例 ■人間が与える出力例
TBL_3 = gather(p2_input1,MORPH102,MORPH101,`A`,`B`)
TBL_1 = unite(TBL_3,MORPH110,`student`,`MORPH102`)
morpheus = spread(TBL_1,`MORPH110`,`MORPH101`)
■ 合成したプログラム(R言語)
論文では 0.2 秒で合成できるって言ったじゃん
0.2 秒で
合成できる
© 2019 NTT DATA Corporation 62
遅くなる理由を
調べてみた
© 2019 NTT DATA Corporation 63
遅い理由
カラムが 5 個を超えると
計算が終わらない
© 2019 NTT DATA Corporation 64
Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017
month student A B
1 Amy 9 6
2 Amy 7 7
3 Amy 6 8
1 Bob 8 5
2 Bob 6 6
3 Bob 9 7
month Amy_A Amy_B Bob_A Bob_B
1 9 6 8 5
2 7 7 6 6
3 8 8 9 7
■人間が与える入力例 ■人間が与える出力例
TBL_3 = gather(p2_input1,MORPH102,MORPH101,`A`,`B`)
TBL_1 = unite(TBL_3,MORPH110,`student`,`MORPH102`)
morpheus = spread(TBL_1,`MORPH110`,`MORPH101`)
■ 合成したプログラム(R言語)
確かに論文でもカラムは 5 個くらい
0.2 秒で
合成できる
© 2019 NTT DATA Corporation 65
■入力例:tableA
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
0008 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000
0009 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000
0010 2011/1/1 06 2011/1/1 0 Null 2010/1/11 12:00:00 XX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17
01 22222 0 0 0 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
02 11122 1 1 1 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
03 11111 0 0 0 1 2 2 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
■入力例:tableB
実案件だと
平気で 20 カラムとか
あるんですけど…
© 2019 NTT DATA Corporation 66
再現実装の
弱点は分かった
© 2019 NTT DATA Corporation 67
カラムが多くても
合成できるように
改良したのがこちらです
© 2019 NTT DATA Corporation 68
© 2019 NTT DATA Corporation 69
■合成したいSQL
SELECT b1, b2, b3, b4, b5, b6, b7, b8, b9, b10
FROM tableA, tableB
WHERE a3 = b1 AND a1 = ? AND a2 = ?
ORDER BY a2 DESC
a3 と b1 カラムをキーに
tableA と tableB を内部結合し,
a1 と a2 カラムを使った条件で絞り込み,
tableB のカラムだけを選択して,
a2 カラムでソートして出力する
© 2019 NTT DATA Corporation 70
■入力例:tableA
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
0008 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000
0009 2017/4/3 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000
0010 2011/1/1 03 2011/1/1 0 Null 2010/1/11 12:00:00 XX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17
01 22222 1 2 3 4 5 6 7 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
02 11122 1 1 1 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
03 11111 0 0 0 1 2 2 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000
入力パラメータ 出力
a1 a2 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10
0008 2017/04/01 01 22222 0 0 0 0 0 0 3 35
0009 2017/04/01 01 22222 0 0 0 0 0 0 3 35
0010 2011/01/01 06 11112 0 1 1 0 0 0 3 35
※実際は108行
※実際は7行
※実際は108行
■入力例:tableB
■出力例
© 2019 NTT DATA Corporation 71
SELECT a1, b2, a3, a4
FROM A, B
WHERE A.a4 = B.b1
AND a2 = ‘01’
AND b2 <= 5
ORDER BY a1 DESC
SELECT a1, MAX(a2), MIN(a2)
FROM A
WHERE a5 = ‘XX’
AND a3 > ?
GROUP BY a1
非対応 (頻出でないと判断したもの)
サブクエリ,LEFT JOIN, HAVING, DISTINCT, CASE文 ...
プレースホルダに対応
比較演算子
=, >=, >, <=, <, IN
集約関数
MAX, MIN, COUNT
細かい条件に使える演算子や関数を絞った
対応した構文
SELECT, JOIN, WHERE, GROUP BY, ORDER BY
© 2019 NTT DATA Corporation 72
SELECT ■
FROM Table1
WHERE ■
SELECT X, Y, Z
FROM Table1
WHERE ■
⋮
SELECT X, Z, Y
FROM Table1
WHERE ■
SELECT X, Y, Z
FROM Table1
WHERE X <= 18
SELECT X, Y, Z
FROM Table1
WHERE Y = ‘01’
既存手法
提案手法
SELECT ■
FROM Table1
WHERE ■
SELECT X, Y, Z
FROM Table1
WHERE X <= 18
⋮
SELECT X, Z, Y
FROM Table1
WHERE X <= 18
SELECT ■
FROM Table1
WHERE X <= 18
SELECT ■
FROM Table1
WHERE Y = ‘01’
⋮
⋮


WHERE SELECT
SELECT WHERE
大枠作るときの選択順を替えた
© 2019 NTT DATA Corporation 73
詳しくは
で検索、検索ぅ♪
カラム数の大きなテーブルに対する
入出力例からの SQL クエリの合成
竹之内啓太, 岡田譲二, 坂田祐司, “カラム数の大きなテーブルに対する入出力例からの SQL クエリの合成” SES 2019 (2019).
© 2019 NTT DATA Corporation 74
せっかくなので
実案件で試してみた
© 2019 NTT DATA Corporation 75
実現性検証:
実案件の SQL を合成できるか
© 2019 NTT DATA Corporation 76
実現性:実案件の SQL を合成できるか
→ 63% の SQL を時間内に合成できた
選択した
SQL
選択した
SQL
受領した
SQL
選択した
SQL
選択した
SQL
ランダムに
選択した
SQL
選択した
SQL
選択した
SQL
時間内に
合成できた
SQL
選択した
SQL
選択した
SQL
時間内に
合成できな
かった
SQL
100本
63本
37 本
1,172本
※TimeOut は300秒
※全ての SQL の入出力例を
作成する工数が無かったため
© 2019 NTT DATA Corporation 77
時間内に合成できなかったのは
未対応の文法があったため
LEFT JOIN, OR, CASE, LIKE …
© 2019 NTT DATA Corporation 78
対応文法を増やすと
計算量も増えるため
その見極めやバランスが肝要
© 2019 NTT DATA Corporation 79
課題はあるものの
ド素人の実装でも
63% の SQL を合成できた
© 2019 NTT DATA Corporation 80
プログラム合成があれば
プログラムを手で書いて
消耗しなくても良い
(未来が見えてきた)
© 2019 NTT DATA Corporation 81
まだ道半ば
画像引用元:ピクト缶
© 2019 NTT DATA Corporation 82
より多くのSQLを合成できるように計算量を抑えつつ対応
文法を増やしたいけどバランスはどうとれば良いのか。そ
もそもやりたいのはバッチの合成だからそれやりたいけど
バッチに拡張しようとすると値の変更を許すことになるの
で新しいアルゴリズムを考える必要がある。複雑な仕様の
場合は入出力例作るよりも最初からプログラム書いた方が
早い気がするけどそういった場合も生産性を上げるにはど
うすればよいのか。与えられた入出力例を満たすけど意図
とは異なるプログラムが合成された時どうするべきか。プ
ログラム合成を使うと既存の開発プロセスとは全く異なる
開発プロセスになるが現場に受け入れてもらうためにはど
うすればよいのか。給料を上げるにはどうすれば良いのか
© 2019 NTT DATA Corporation 83
より多くのSQLを合成できるように計算量を抑えつつ対応
文法を増やしたいけどバランスはどうとれば良いのか。そ
もそもやりたいのはバッチの合成だからそれやりたいけど
バッチに拡張しようとすると値の変更を許すことになるの
で新しいアルゴリズムを考える必要がある。複雑な仕様の
場合は入出力例作るよりも最初からプログラム書いた方が
早い気がするけどそういった場合も生産性を上げるにはど
うすればよいのか。与えられた入出力例を満たすけど意図
とは異なるプログラムが合成された時どうするべきか。プ
ログラム合成を使うと既存の開発プロセスとは全く異なる
開発プロセスになるが現場に受け入れてもらうためにはど
うすればよいのか。給料を上げるにはどうすれば良いのか
© 2019 NTT DATA Corporation 84
まとめ
入出力の例示によるプログラム合成はホット
試験データさえ用意できれば実装が合成できるかも
プログラム合成はバッチ処理に適用できるかも
SQL 合成は現実的にできそう
© 2019 NTT DATA Corporation 85
【宣伝】
プログラム合成を
一緒に研究する
仲間を探しています
(共同研究、PoC、転職…)
Joji.Okada@nttdata.com まで
© 2019 NTT DATA Corporation

More Related Content

まだプログラム手で書いて消耗してるの?~入出力例からプログラムを自動生成する技術~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)

  • 1. © 2019 NTT DATA Corporation 1 © 2019 NTT DATA Corporation NTTデータ テクノロジーカンファレンス 2019 まだプログラム手で書いて消耗してるの? ~入出力例からプログラムを自動生成する技術~ 2019年9月5日 株式会社NTTデータ 技術革新統括本部 システム技術本部 生産技術部 インテグレーション技術センタ 岡田譲二
  • 2. © 2019 NTT DATA Corporation 2 岡田譲二の自己紹介 R&Dスペシャリスト(専門:プログラム解析) 特許や論文執筆から実際の現場への導入まで 炎上案件の火消しも 関数型プログラミング大好き! ■ 主な外部発表 • “プログラミング言語基礎” 若手ITエンジニア最強の指南書 (2017). • “Haskellにまつわるウワサを検証する” 日経ソフトウェア 2014年 11月号 (2014). • “COBOL meets Haskell” 函数プログラミングの集い (2013).
  • 3. © 2019 NTT DATA Corporation 3 2020年度から プログラミング 教育必修に
  • 4. © 2019 NTT DATA Corporation 4 まだプログラム 手で書いて 消耗してるの?
  • 5. © 2019 NTT DATA Corporation 5 システム開発は もう終わっている
  • 6. © 2019 NTT DATA Corporation 6 ほぼプログラムのような 詳細設計書を手で書く
  • 7. © 2019 NTT DATA Corporation 7 詳細設計書どおりに プログラムを手で書く 画像引用元:Christopher KuszajewskiによるPixabayからの画像
  • 8. © 2019 NTT DATA Corporation 8 意味があるのか 分からない テストを打鍵する
  • 9. © 2019 NTT DATA Corporation 9 テスト証跡として 画面キャプチャを Excel に貼り付ける
  • 10. © 2019 NTT DATA Corporation 10 システム開発は もう終わっている
  • 11. © 2019 NTT DATA Corporation 11 要件を書くだけで プログラムが できてくれれば…
  • 12. © 2019 NTT DATA Corporation 12 銀の弾丸はない 画像引用元:Brooks Jr, Frederick P., et al. "人月の神話." ピアソン エデュケーション (2002). 銀の弾丸はない
  • 13. © 2019 NTT DATA Corporation 13 だが 希望 はあるだが 希望 はある 画像引用元:フリー素材ぱくたそ(www.pakutaso.com)
  • 14. © 2019 NTT DATA Corporation 14 入出力例だけで プログラムが できる技術
  • 15. © 2019 NTT DATA Corporation 15 プログラム 合成
  • 16. © 2019 NTT DATA Corporation 16 プログラム合成: 高レベルの仕様から 実行可能なプログラムを 自動生成する技術 (≠コンパイル)
  • 17. © 2019 NTT DATA Corporation 17 代表的なアプローチ: 1. 自然言語理解 2. 形式手法 3. 入出力の例示
  • 18. © 2019 NTT DATA Corporation 18 1. 自然言語理解 自然言語で書かれた プログラムの仕様を理解し、 プログラムを合成する。
  • 19. © 2019 NTT DATA Corporation 19 1. 自然言語理解 仕様書 何や分からんけど ええ感じに 計算して 売上めっちゃ 増やしてくれる 機能 while(EOF) { TMP.set(IN-FILE.X); if(TMP) { if(TMP) { write(OUT-FILE); } } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); }
  • 20. © 2019 NTT DATA Corporation 20 1. 自然言語理解 仕様書 何や分からんけど ええ感じに 計算して 売上めっちゃ 増やしてくれる 機能 while(EOF) { TMP.set(IN-FILE.X); if(TMP) { if(TMP) { write(OUT-FILE); } } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); }
  • 21. © 2019 NTT DATA Corporation 21 2. 形式手法 合成したいプログラムの 性質を論理式で表し、 それを自動的に証明する過程で プログラムが合成される。
  • 22. © 2019 NTT DATA Corporation 22 2. 形式手法 仕様書 1 : class ベルト監視制御 2 : 3 : instance variables 4 : private iベルト状態 : ベルト状態; 5 : private i光センサー : 光センサー; 6 : 7 : operations 8 : public ベルト状態を判定する : () ==> ベルト状態 9 : ベルト状態を判定する() == 10 : is not yet specified 11 : pre 12 : i光センサー.黒線レベル値を読み取る() <> nil 13 : post 14 : cases mk_(i光センサー.黒線レベル値を読み取る(), RESULT): 15 : mk_(<黒閾値以下>, <黒>) -> true, 16 : mk_(<白閾値以上>, <白>) -> true, 17 : mk_(-, <不明>) -> true, 18 : others -> false 19 : end; 20 : end ベルト監視制御 while(EOF) { TMP.set(IN-FILE.X); if(TMP) { if(TMP) { write(OUT-FILE); } } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } 画像引用元:http://dudka.cz/fss
  • 23. © 2019 NTT DATA Corporation 23 2. 形式手法 仕様書 1 : class ライン監視制御 2 : 3 : instance variables 4 : private iライン状態 : ライン状態; 5 : private i光センサー : 光センサー; 6 : 7 : operations 8 : public ライン状態を判定する : () ==> ライン状態 9 : ライン状態を判定する() == 10 : is not yet specified 11 : pre 12 : i光センサー.黒線レベル値を読み取る() <> nil 13 : post 14 : cases mk_(i光センサー.黒線レベル値を読み取る(), RESULT): 15 : mk_(<黒閾値以下>, <黒>) -> true, 16 : mk_(<白閾値以上>, <白>) -> true, 17 : mk_(-, <不明>) -> true, 18 : others -> false 19 : end; 20 : end ライン監視制御 while(EOF) { TMP.set(IN-FILE.X); if(TMP) { if(TMP) { write(OUT-FILE); } } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } 画像引用元:http://dudka.cz/fss
  • 24. © 2019 NTT DATA Corporation 24 3. 入出力の例示 プログラムへの入出力の例を いくつか示すことで、 そのような入出力を生み出す プログラムを合成する。
  • 25. © 2019 NTT DATA Corporation 25 3. 入出力の例示 while(EOF) { TMP.set(IN-FILE.X); if(TMP) { if(TMP) { write(OUT-FILE); } } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } # 入力 出力 1 100 108 2 0 0 3 1200 1296 4 -100 error 入出力例 ?
  • 26. © 2019 NTT DATA Corporation 26 3. 入出力の例示 while(EOF) { TMP.set(IN-FILE.X); if(TMP) { if(TMP) { write(OUT-FILE); } } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } while(EOF) { TMP.set(IN-FILE.X); if(TMP) { write(OUT-FILE); } read(IN-FILE); } # 入力 出力 1 100 108 2 0 0 3 1200 1296 4 -100 error 入出力例 ?
  • 27. © 2019 NTT DATA Corporation 27 Flash Fill
  • 28. © 2019 NTT DATA Corporation 28 Flash Fill の 凄さが分かるデモ
  • 29. © 2019 NTT DATA Corporation 29 Flash Fill の仕組み 既知の関数群の 組み合わせを 入出力例と同じ結果が 出るまで試す
  • 30. © 2019 NTT DATA Corporation 30 無限の猿定理 “猿がタイプライターの鍵盤を いつまでもランダムに叩き続ければ シェイクスピアの作品を打ち出す”
  • 31. © 2019 NTT DATA Corporation 31 無限の猿定理 “猿が 既知の関数 を いつまでもランダムに組み合わせ続ければ プログラムを打ち出す”
  • 32. © 2019 NTT DATA Corporation 32 プログラム合成のポイント 無限の時間かかるのは困るので なんやかんや工夫する
  • 33. © 2019 NTT DATA Corporation 33 Devlin, Jacob, et al. "Robustfill: Neural program learning under noisy I/O." arXiv preprint arXiv:1703.07469 (2017). ■合成したプログラム Concat( ToCase( GetToken( input, Type=Word, Index=-1), Type=Proper), Const(", "), ToCase( SubString( GetToken( input, Type=Word, Index=1), Start=0, End=1), Type=Proper), Const(".")) ① 人が与える 出力例 �� Flash Fillに よる自動出力 ② 出力例を満たすまで 既知の関数合成を試行 ■既知の関数群 Concat(), ConstStr(), SubStr(), GetSpan(), GetToken(), ToCase(), Replace(), Trim(), GetUpto(), GetFrom(), GetFirst(), GetAll() ③ 合成したプログラムを 使って出力を計算 Flash Fill の仕組み 既知の関数を 12 個に絞っている
  • 34. © 2019 NTT DATA Corporation 34 プログラム合成 すごくね? (Flash Fill の知名度ないけど)
  • 35. © 2019 NTT DATA Corporation 35 じゃあ 最近のプログラム合成 何してるの?
  • 36. © 2019 NTT DATA Corporation 36 テーブル変換の合成が “熱い” らしい
  • 37. © 2019 NTT DATA Corporation 37 Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017 month student A B 1 Amy 9 6 2 Amy 7 7 3 Amy 6 8 1 Bob 8 5 2 Bob 6 6 3 Bob 9 7 month Amy_A Amy_B Bob_A Bob_B 1 9 6 8 5 2 7 7 6 6 3 8 8 9 7 ■人間が与える入力例 ■人間が与える出力例 TBL_1 = gather(input1,MORPH102,MORPH101,`A`,`B`) TBL_2 = unite(TBL_1, MORPH110,`student`,`MORPH102`) morpheus = spread(TBL_2,`MORPH110`,`MORPH101`) ■ 合成したプログラム(R言語) 入出力に与えるのは文字列ではなくテーブル 0.2 秒で 合成できる
  • 38. © 2019 NTT DATA Corporation 38 大枠を作ってから、細かい条件を埋める month student A B month Amy_A Amy_B Bob_A Bob_B TBL_1 = gather(input1, ■, ■, ■, ■) TBL_2 = unite(TBL_1, ■, ■, ■) morpheus = spread(TBL_2, ■, ■) Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017 6 行 4 列 3 行 5 列 行を減らして 列を増やすことが できる関数の 組み合わせか? ■人間が与える入力例 ■人間が与える出力例
  • 39. © 2019 NTT DATA Corporation 39 Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017 month student A B 1 Amy 9 6 2 Amy 7 7 3 Amy 6 8 1 Bob 8 5 2 Bob 6 6 3 Bob 9 7 month Amy_A Amy_B Bob_A Bob_B 1 9 6 8 5 2 7 7 6 6 3 8 8 9 7 ■人間が与える入力例 ■人間が与える出力例 TBL_1 = gather(input1,MORPH102,MORPH101,`A`,`B`) TBL_2 = unite(TBL_1, MORPH110,`student`,`MORPH102`) morpheus = spread(TBL_2,`MORPH110`,`MORPH101`) 大枠を作ってから、細かい条件を埋める 値の内容を正しく 設定できる引数の 組み合わせか?
  • 40. © 2019 NTT DATA Corporation 40 テーブル変換って、 基幹システムの バッチ処理に似てね?
  • 41. © 2019 NTT DATA Corporation 41 ? バッチ処理 ID 年齢 住所 102 34 Tokyo 103 19 Osaka 104 25 Nagoya ID 氏名 102 Amy 103 Bob 104 Carol 氏名 年齢 住所 Amy 34 Tokyo Bob 19 Osaka Carol 25 Nagoya month student A B 1 Amy 9 6 2 Amy 7 7 3 Amy 6 8 1 Bob 8 5 2 Bob 6 6 3 Bob 9 7 month Amy_A Amy_B Bob_A Bob_B 1 9 6 8 5 2 7 7 6 6 3 8 8 9 7 テーブル変換 ?
  • 42. © 2019 NTT DATA Corporation 42 バッチ処理の プログラム合成 出来るんじゃね?
  • 43. © 2019 NTT DATA Corporation 43 入出力例って 結局「試験データ」だから、 試験データさえ用意できれば 実装が合成できる!!!!
  • 44. © 2019 NTT DATA Corporation 44 「プログラム合成」とは いわゆる God (実現したら)
  • 45. © 2019 NTT DATA Corporation 45 NTT データ: 「乗るしかない このビッグウェーブに」
  • 46. © 2019 NTT DATA Corporation 46 目論見 プログラム合成を バッチ処理に適用することで バッチ処理の自動生成を実現し、 圧倒的な工数削減を目指す
  • 47. © 2019 NTT DATA Corporation 47 開発プロセスを変える ■ 従来のシステム開発プロセス ■ プログラム合成を活用した開発プロセス 外部 設計書 内部 設計書 試験項目 ソース コード 試験 データ 試験 証跡 ①内部設計 ②製造 ③試験項目作成 ④試験データ作成 ⑤試験実施 外部 設計書 内部 設計書 試験項目 ソース コード 試験 データ 試験 証跡 ①試験項目作成 ②試験データ作成 ③プログラム合成 ④設計書リバース④設計書リバース ③プログラム合成
  • 48. © 2019 NTT DATA Corporation 48 外部 設計 内部 設計 製造・ 単体試験 結合試験 外部 設計 結合試験 実現前 実現後 外部設計から 結合試験までの 工数 50% 減を 目指す
  • 49. © 2019 NTT DATA Corporation 49 プログラム合成に 未来がありそうな気がしたので 作ってみる!
  • 50. © 2019 NTT DATA Corporation 50 とは言え、いきなり バッチ全部の合成は無理 (素人だし…)
  • 51. © 2019 NTT DATA Corporation 51 伝統的なバッチ処理のアーキテクチャー 繰り返し Item Processor Item Reader Item Writer item’ item item item item item’ item’ item’ DB DB ID 価格 001 100 002 50 003 1200 ID 価格 税込 001 100 108 002 50 54 003 1200 1296 001 100 002 50 003 1200 001 100 001 108 001 108 002 54 003 1296 税込 = 価格 * 1.08
  • 52. © 2019 NTT DATA Corporation 52 まずはバッチ処理の一部分である SQL 合成を試す 繰り返し Item Processor Item Reader Item Writer item’ item item item item item’ item’ item’ DB DB ID 価格 001 100 002 50 003 1200 ID 価格 税込 001 100 108 002 50 54 003 1200 1296 001 100 002 50 003 1200 001 100 001 108 001 108 002 54 003 1296 税込 = 価格 * 1.08
  • 53. © 2019 NTT DATA Corporation 53 巨人の肩の上 に立つ
  • 54. © 2019 NTT DATA Corporation 54 Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017 先ほどのテーブル変換の論文を再現実装してみる
  • 55. © 2019 NTT DATA Corporation 55 できた
  • 56. © 2019 NTT DATA Corporation 56 実案件の SQL と 試験データあるし、 合成できるか試してみよ
  • 57. © 2019 NTT DATA Corporation 57 ■ 実案件の SQL SELECT b1, b2, b3, b4, b5, b6, b7, b8, b9, b10 FROM tableA, tableB WHERE a3 = b1 AND a1 = ? AND a2 = ? ORDER BY a2 DESC a3 と b1 カラムをキーに tableA と tableB を内部結合し, a1 と a2 カラムを使った条件で絞り込み, tableB のカラムだけを選択して, a2 カラムでソートして出力する
  • 58. © 2019 NTT DATA Corporation 58 ■入力例:tableA a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 0008 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000 0009 2017/4/3 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000 0010 2011/1/1 03 2011/1/1 0 Null 2010/1/11 12:00:00 XX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 01 22222 1 2 3 4 5 6 7 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 02 11122 1 1 1 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 03 11111 0 0 0 1 2 2 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 入力パラメータ 出力 a1 a2 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 0008 2017/04/01 01 22222 0 0 0 0 0 0 3 35 0009 2017/04/01 01 22222 0 0 0 0 0 0 3 35 0010 2011/01/01 06 11112 0 1 1 0 0 0 3 35 ※実際は108行 ※実際は7行 ※実際は108行 ■入力例:tableB ■出力例
  • 59. © 2019 NTT DATA Corporation 59 合成を試みた結果…
  • 60. © 2019 NTT DATA Corporation 60 2時間回したけど返ってこない
  • 61. © 2019 NTT DATA Corporation 61 Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017 month student A B 1 Amy 9 6 2 Amy 7 7 3 Amy 6 8 1 Bob 8 5 2 Bob 6 6 3 Bob 9 7 month Amy_A Amy_B Bob_A Bob_B 1 9 6 8 5 2 7 7 6 6 3 8 8 9 7 ■人間が与える入力例 ■人間が与える出力例 TBL_3 = gather(p2_input1,MORPH102,MORPH101,`A`,`B`) TBL_1 = unite(TBL_3,MORPH110,`student`,`MORPH102`) morpheus = spread(TBL_1,`MORPH110`,`MORPH101`) ■ 合成したプログラム(R言語) 論文では 0.2 秒で合成できるって言ったじゃん 0.2 秒で 合成できる
  • 62. © 2019 NTT DATA Corporation 62 遅くなる理由を 調べてみた
  • 63. © 2019 NTT DATA Corporation 63 遅い理由 カラムが 5 個を超えると 計算が終わらない
  • 64. © 2019 NTT DATA Corporation 64 Component-Based Synthesis of Table Consolidation and Transformation Tasks from Examples, PLDI2017 month student A B 1 Amy 9 6 2 Amy 7 7 3 Amy 6 8 1 Bob 8 5 2 Bob 6 6 3 Bob 9 7 month Amy_A Amy_B Bob_A Bob_B 1 9 6 8 5 2 7 7 6 6 3 8 8 9 7 ■人間が与える入力例 ■人間が与える出力例 TBL_3 = gather(p2_input1,MORPH102,MORPH101,`A`,`B`) TBL_1 = unite(TBL_3,MORPH110,`student`,`MORPH102`) morpheus = spread(TBL_1,`MORPH110`,`MORPH101`) ■ 合成したプログラム(R言語) 確かに論文でもカラムは 5 個くらい 0.2 秒で 合成できる
  • 65. © 2019 NTT DATA Corporation 65 ■入力例:tableA a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 0008 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000 0009 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000 0010 2011/1/1 06 2011/1/1 0 Null 2010/1/11 12:00:00 XX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 01 22222 0 0 0 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 02 11122 1 1 1 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 03 11111 0 0 0 1 2 2 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 ■入力例:tableB 実案件だと 平気で 20 カラムとか あるんですけど…
  • 66. © 2019 NTT DATA Corporation 66 再現実装の 弱点は分かった
  • 67. © 2019 NTT DATA Corporation 67 カラムが多くても 合成できるように 改良したのがこちらです
  • 68. © 2019 NTT DATA Corporation 68
  • 69. © 2019 NTT DATA Corporation 69 ■合成したいSQL SELECT b1, b2, b3, b4, b5, b6, b7, b8, b9, b10 FROM tableA, tableB WHERE a3 = b1 AND a1 = ? AND a2 = ? ORDER BY a2 DESC a3 と b1 カラムをキーに tableA と tableB を内部結合し, a1 と a2 カラムを使った条件で絞り込み, tableB のカラムだけを選択して, a2 カラムでソートして出力する
  • 70. © 2019 NTT DATA Corporation 70 ■入力例:tableA a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 0008 2017/4/1 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000 0009 2017/4/3 01 2017/4/1 0 Null 2017/4/1 12:00:00 XX XXXUSER 2017/4/1 12:00:00 XXX XXXUSER 20170401120000000 0010 2011/1/1 03 2011/1/1 0 Null 2010/1/11 12:00:00 XX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b15 b16 b17 01 22222 1 2 3 4 5 6 7 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 02 11122 1 1 1 0 0 0 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 03 11111 0 0 0 1 2 2 3 35 2010/1/11 12:00:00 XXX XXXUSER 2010/1/11 12:00:00 XXX XXXUSER 20100111120000000 入力パラメータ 出力 a1 a2 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 0008 2017/04/01 01 22222 0 0 0 0 0 0 3 35 0009 2017/04/01 01 22222 0 0 0 0 0 0 3 35 0010 2011/01/01 06 11112 0 1 1 0 0 0 3 35 ※実際は108行 ※実際は7行 ※実際は108行 ■入力例:tableB ■出力例
  • 71. © 2019 NTT DATA Corporation 71 SELECT a1, b2, a3, a4 FROM A, B WHERE A.a4 = B.b1 AND a2 = ‘01’ AND b2 <= 5 ORDER BY a1 DESC SELECT a1, MAX(a2), MIN(a2) FROM A WHERE a5 = ‘XX’ AND a3 > ? GROUP BY a1 非対応 (頻出でないと判断したもの) サブクエリ,LEFT JOIN, HAVING, DISTINCT, CASE文 ... プレースホルダに対応 比較演算子 =, >=, >, <=, <, IN 集約関数 MAX, MIN, COUNT 細かい条件に使える演算子や関数を絞った 対応した構文 SELECT, JOIN, WHERE, GROUP BY, ORDER BY
  • 72. © 2019 NTT DATA Corporation 72 SELECT ■ FROM Table1 WHERE ■ SELECT X, Y, Z FROM Table1 WHERE ■ ⋮ SELECT X, Z, Y FROM Table1 WHERE ■ SELECT X, Y, Z FROM Table1 WHERE X <= 18 SELECT X, Y, Z FROM Table1 WHERE Y = ‘01’ 既存手法 提案手法 SELECT ■ FROM Table1 WHERE ■ SELECT X, Y, Z FROM Table1 WHERE X <= 18 ⋮ SELECT X, Z, Y FROM Table1 WHERE X <= 18 SELECT ■ FROM Table1 WHERE X <= 18 SELECT ■ FROM Table1 WHERE Y = ‘01’ ⋮ ⋮   WHERE SELECT SELECT WHERE 大枠作るときの選択順を替えた
  • 73. © 2019 NTT DATA Corporation 73 詳しくは で検索、検索ぅ♪ カラム数の大きなテーブルに対する 入出力例からの SQL クエリの合成 竹之内啓太, 岡田譲二, 坂田祐司, “カラム数の大きなテーブルに対する入出力例からの SQL クエリの合成” SES 2019 (2019).
  • 74. © 2019 NTT DATA Corporation 74 せっかくなので 実案件で試してみた
  • 75. © 2019 NTT DATA Corporation 75 実現性検証: 実案件の SQL を合成できるか
  • 76. © 2019 NTT DATA Corporation 76 実現性:実案件の SQL を合成できるか → 63% の SQL を時間内に合成できた 選択した SQL 選択した SQL 受領した SQL 選択した SQL 選択した SQL ランダムに 選択した SQL 選択した SQL 選択した SQL 時間内に 合成できた SQL 選択した SQL 選択した SQL 時間内に 合成できな かった SQL 100本 63本 37 本 1,172本 ※TimeOut は300秒 ※全ての SQL の入出力例を 作成する工数が無かったため
  • 77. © 2019 NTT DATA Corporation 77 時間内に合成できなかったのは 未対応の文法があったため LEFT JOIN, OR, CASE, LIKE …
  • 78. © 2019 NTT DATA Corporation 78 対応文法を増やすと 計算量も増えるため その見極めやバランスが肝要
  • 79. © 2019 NTT DATA Corporation 79 課題はあるものの ド素人の実装でも 63% の SQL を合成できた
  • 80. © 2019 NTT DATA Corporation 80 プログラム合成があれば プログラムを手で書いて 消耗しなくても良い (未来が見えてきた)
  • 81. © 2019 NTT DATA Corporation 81 まだ道半ば 画像引用元:ピクト缶
  • 82. © 2019 NTT DATA Corporation 82 より多くのSQLを合成できるように計算量を抑えつつ対応 文法を増やしたいけどバランスはどうとれば良いのか。そ もそもやりたいのはバッチの合成だからそれやりたいけど バッチに拡張しようとすると値の変更を許すことになるの で新しいアルゴリズムを考える必要がある。複雑な仕様の 場合は入出力例作るよりも最初からプログラム書いた方が 早い気がするけどそういった場合も生産性を上げるにはど うすればよいのか。与えられた入出力例を満たすけど意図 とは異なるプログラムが合成された時どうするべきか。プ ログラム合成を使うと既存の開発プロセスとは全く異なる 開発プロセスになるが現場に受け入れてもらうためにはど うすればよいのか。給料を上げるにはどうすれば良いのか
  • 83. © 2019 NTT DATA Corporation 83 より多くのSQLを合成できるように計算量を抑えつつ対応 文法を増やしたいけどバランスはどうとれば良いのか。そ もそもやりたいのはバッチの合成だからそれやりたいけど バッチに拡張しようとすると値の変更を許すことになるの で新しいアルゴリズムを考える必要がある。複雑な仕様の 場合は入出力例作るよりも最初からプログラム書いた方が 早い気がするけどそういった場合も生産性を上げるにはど うすればよいのか。与えられた��出力例を満たすけど意図 とは異なるプログラムが合成された時どうするべきか。プ ログラム合成を使うと既存の開発プロセスとは全く異なる 開発プロセスになるが現場に受け入れてもらうためにはど うすればよいのか。給料を上げるにはどうすれば良いのか
  • 84. © 2019 NTT DATA Corporation 84 まとめ 入出力の例示によるプログラム合成はホット 試験データさえ用意できれば実装が合成できるかも プログラム合成はバッチ処理に適用できるかも SQL 合成は現実的にできそう
  • 85. © 2019 NTT DATA Corporation 85 【宣伝】 プログラム合成を 一緒に研究する 仲間を探しています (共同研究、PoC、転職…) Joji.Okada@nttdata.com まで
  • 86. © 2019 NTT DATA Corporation

Editor's Notes

  1. システム開発はもう終わっている.ほぼプログラムのような詳細設計書を書き,詳細設計書通りの内容をプログラムを手で書く. おまけに意味があるのか分からないテストを叩いて画面キャプチャを証跡として Excel に貼る.一昔前に流行った「自動化」は,結局ほぼプログラムを詳細設計書の様式で書くだけで本質的な解決策になっていない. 「要件を書くだけでプログラムができてくれれば…」そんな銀の弾丸は残念ながら未だ存在しないが,「テスト(入出力例)を書くだけでプログラムができる」という技術は存在する. 本セッションでは,システム開発の在り方を一変させるかもしれない技術である「プログラム合成」が,どのように入出力例からプログラムを自動生成するのかという技術の詳細と,そのデモツールをご紹介します.
  2. 本日お話ししたいのは「まだプログラム手で書いて消耗しているの?」ということです. 21世紀になってもう20年近く経ちました.元号も平成が終わり,令和になりました. でも,まだプログラムを手で書いているのですか? そして,消耗してしまっているのですか? 本日は少し刺激的なお話をしようと思います.
  3. システム開発はもう終わっている,そう私は思っています. 現在のシステム開発には不合理なタスクが多すぎます. システム開発における不合理なタスクをつらつら語ります.
  4. ほぼプログラムを書くのと同じような細かさの詳細設計書を書き,
  5. その詳細設計書に従って,ほぼ同じ内容をプログラムで書く.
  6. そして,意味があるのかどうか分からないテストを猿のように打鍵し,
  7. テスト証跡という名前で,テスト後の画面キャプチャを Excel に貼り付ける. SIer の開発現場ではありふれた光景です. 今日も日本のどこかにはこんなことをやっている SE が数万人はいるでしょう.
  8. こんな「システム開発の方法は終わっている」と言わずして何を終わっているというのでしょうか. もう一度言います. システム開発はもう終わっています. そんな終わっている状況で多くの人が思うのが
  9. 要件を書くだけでプログラムができてくれれば… そんな願いを持つ人は多いと思います. 確かに,要件を書くだけでプログラムが出来上がり,やりたいことができれば夢のようです. ですが
  10. 銀の弾丸はありません. システム開発にそんな都合の良い話はありません. 1986年にフレデリック・ブルックス先生が「ソフトウェア開発に魔法のように、すぐに役に立ちプログラマの生産性を倍増させるような技術はない」と主張されています. 確かに「要件を書くだけでプログラムができてくれる」そんな都合の良い銀の弾丸はありません.
  11. 自然言語理解 → 研究レベルでも難しい。実用化には遠い 形式手法 → 仕様を厳密に定義するため、仕様を書くのに数理的な素養が必要。 入出力の例示 → 実用化され始めている。アカデミックでもホットな領域。
  12. パラメータの部分の説明がされていなくて唐突
  13. 計算量が爆発してしまうので,アルゴリズムを変えたことによって解決できた 技術要素の内容も紹介する
  14. 計算量が爆発してしまうので,アルゴリズムを変えたことによって解決できた 技術要素の内容も紹介する
  15. 希望の光が見えてきた だが,まだ山があるのでそれを解決していくので! こういう新しいアイディア楽しいでしょ! アプローチ自体が面白いよね!と ソフトウェアエンジニアリング的に今までできなかったことをできるようになるところが重要 この先には夢が広がっている キラキラ感の一要素としてバッチの合成がある,という感じ 技術の課題をあげてそれを解決していくのだ! 色々なことを我々は試したいのだ!なので一緒にやろう!