Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アジャイルとテスト / Agile and Testing
Search
imtnd
December 15, 2019
Programming
1
2k
アジャイルとテスト / Agile and Testing
in WACATE 2019 Winter
https://wacate.jp/workshops/2019winter/
imtnd
December 15, 2019
Tweet
Share
More Decks by imtnd
See All by imtnd
QA/SDETの現在と、これからの挑戦
imtnd
0
150
グローバルなソフトウェアテスト組織における課題と戦略 / Challenges and Strategies in a Global Software Testing Organization #mf_techday
imtnd
0
560
WACATE 2022 夏 ワークショップの目的
imtnd
0
1k
テスト設計技法をなぜ&どのように使うのか体験しよう!
imtnd
0
1.5k
analyze the behavior with decision table
imtnd
0
4.3k
WACATE流テスト分析のワークショップを体感してみよう
imtnd
0
230
テスト技法作成のアプローチを考える
imtnd
0
760
テストの目的を考えよう
imtnd
0
830
やってみよう状態遷移テスト #xpjug
imtnd
0
1.1k
Other Decks in Programming
See All in Programming
[NG India] Event-Based State Management with NgRx SignalStore
markostanimirovic
1
170
「”誤った使い方をすることが困難”な設計」で良いコードの基礎を固めよう / phpcon-odawara-2025
taniguhey
0
170
DevOpsDaysTokyo2025社内副業で他部門へ_越境_して見えた価値再定義最大1か月のリードタイムを10分に短縮したDevOps実践.pdf
susumutomita
0
100
AIコーディングエージェントを 「使いこなす」ための実践知と現在地 in ログラス / How to Use AI Coding Agent in Loglass
rkaga
4
970
Empowering Developers with HTML-Aware ERB Tooling @ RubyKaigi 2025, Matsuyama, Ehime
marcoroth
2
810
fieldalignmentから見るGoの構造体
kuro_kurorrr
0
120
Cursor/Devin全社導入の理想と現実
saitoryc
25
18k
파급효과: From AI to Android Development
l2hyunwoo
0
140
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
480
Cursorを活用したAIプログラミングについて 入門
rect
0
110
状態と共に暮らす:ステートフルへの挑戦
ypresto
3
940
SwiftDataのカスタムデータストアを試してみた
1mash0
0
130
Featured
See All Featured
Producing Creativity
orderedlist
PRO
344
40k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.1k
Designing for humans not robots
tammielis
253
25k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
135
33k
Become a Pro
speakerdeck
PRO
27
5.3k
How to train your dragon (web standard)
notwaldorf
90
6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Navigating Team Friction
lara
185
15k
Visualization
eitanlees
146
16k
Typedesign – Prime Four
hannesfritz
41
2.6k
For a Future-Friendly Web
brad_frost
177
9.7k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Transcript
ΞδϟΠϧͱςετ 8"$"5&8JOUFS
ࣗݾհ • ֯ా ढ़ • ιϑτΣΞ։ൃऀ • ίϛϡχςΟ׆ಈ • 8"$"5&࣮ߦҕһ
• /B*5& ࡚*5ٕज़ऀձ ӡӦҕһ
͜ͷηογϣϯʹ͍ͭͯ •ΞδϟΠϧͷ֓೦ͷઆ໌ •ΞδϟΠϧ։ൃͷதͰςετʹؔΘΔࣄͷҰ෦Λ հ • ςετͷߟ͑ํ • ςετͷΓํ
࣍ •ΞδϟΠϧʹ͍ͭͯ •ΞδϟΠϧͷςετʹ͍ͭͯ •ϫʔΫ
ΞδϟΠϧͱςετ
ੈͷதͷྲྀΕ •ੈͷதͷมԽ͕ૣ͍ • ιϑτΣΞٕज़ͷมԽ • ιϑτΣΞͷχʔζ •χʔζΛͦͦᘳʹ֬ఆ͢Δͷ͕͍͠ • ιϑτΣΞͷࣾձͷ͕Γ •
ιϑτΣΞར༻ऀͷ֦େ
仕様変更や、要求の変更があまりない外部要因に左右されず、 新しい技術も使⽤していないような不確実性があまりないシステム 外部要因に⼤きく影響を受け、 新しい技術やなどを使⽤する不確実性が⾼いシステム ↑ アジャイル向きなシステム
https://agilemanifesto.org/iso/ja/manifesto.html
None
→ まだソフトウェアを完璧に開発できる⽅法論は⾒つかっていない
→ ⽅法論は⾒つかっていないけれど、⽅向性は⾒えてきた
None
→ 対話してどうしていくのがベストかを話し合おう
→ 完璧なドキュメントを作るよりも動くものを早く作ろう
→ 関係者みんなで協⼒して良いものを作ろう
→ 想定外の変化はあるし、変化へ対応できるようにしていこう
→ 左側も価値があること。だけど、右側をより重視する。
ソフトウェア開発をより良くするため考え⽅の提案
None
顧客満⾜を最優先し、 価値のあるソフトウェアを早く継続的に提供します。 → ソフトウェアを使う⼈を優先に考える。 価値を⽣むソフトウェアを早く提供するようにする。 また、ソフトウェアを継続的に改善していく。
要求の変更はたとえ開発の後期であっても歓迎します。 変化を味⽅につけることによって、 お客様の競争⼒を引き上げます。 → 競争⼒を上げるような仕様変更は歓迎する。 ソフトウェアの価値を第⼀に考える。
動くソフトウェアを、2-3週間から2-3ヶ⽉という できるだけ短い時間間隔でリリースします。 → 半年、1年という⻑期開発ではなく、 短いサイクルでソフトウェアを提供する。
ビジネス側の⼈と開発者は、プロジェクトを通して ⽇々⼀緒に働かなければなりません。 → ビジネスを達成するためにみんなで協⼒して ソフトウェアを開発していく。
意欲に満ちた⼈々を集めてプロジェクトを構成します。 環境と⽀援を与え仕事が無事終わるまで彼らを信頼します。 → 意欲のある⼈達を集めてチームを構成する。 開発者を信頼する。
情報を伝えるもっとも効率的で効果的な⽅法は フェイス・トゥ・フェイスで話をすることです。 → 対⾯でのコミュニケーションを⼤切にする。
動くソフトウェアこそが進捗の最も重要な尺度です。 → 動作するソフトウェアを確認することで 開発の進捗を判断する
アジャイル・プロセスは持続可能な開発を促進します。 ⼀定のペースを 継続的に維持できるようにしなければなりません。 → ⼀定のペースで開発していく。 詰め込んだり、だらだらした開発はしない。
技術的卓越性と優れた設計に対する 不断の注意が機敏さを⾼めます。 → 技術的に優れた設計をしていくことで、 変更強いソフトウェアを開発する。
シンプルさ(ムダなく作れる量を最⼤限にすること) が本質です。 → ムダを排除し、価値あるソフトウェアを より多く作れるようにする。
最良のアーキテクチャ・要求・設計は、 ⾃⼰組織的なチームから⽣み出されます。 → チームは⾃⼰組織的なチームを⽬指す (⾃⼰組織的=⾃律的でリーダーに依存しない)
チームがもっと効率を⾼めることができるかを 定期的に振り返り、 それに基づいて⾃分たちのやり⽅を最適に調整します。 → 振り返りにより、効率を更に上げて最適を⽬指す。
要求分析 設計 テスト 実装 ウォータフォールモデル アジャイル的開発モデル リリース リリース リリース リリース
半年、1年以上でリリース ⼯程はほぼ同時で⾛り 短期間でリリース 要求分析 設計 実装 テスト
https://www.industriallogic.com/blog/evolutionary-design/
アジャイル宣⾔ アジャイル プロセスモデル アジャイル プラクティス 原則 (ルール) 技術 価値 ・・・
より良いソフトウェアの開発⽅法論を⽬指しているのがアジャイル宣⾔ アジャイル宣⾔がより良くしようとしている分野は多岐に渡る
アジャイル プロセスモデル アジャイル プラクティス 原則 (ルール) 技術 価値 ・・・ アジャイル
プロセスモデルよらず、適応可能なものもある
ΞδϟΠϧํ๏ •91 F9UFBN 1SPHSBNJOH •εΫϥϜ •'%% ػೳۦಈܗ։ൃʣ •ΫϦελϧ •ϦʔϯιϑτΣΞ •Χϯόϯ
•ϞμϯΞδϟΠϧ
91 F9SFBN 1SPHSBNJOH •ϓϩάϥϛϯάٕ๏ɺ໌֬ͳίϛϡχέʔγϣϯɺ νʔϜϫʔΫͳͲΛΈʹར༻ͯ͠ɺΑΓྑ͘ι ϑτΣΞΛ։ൃ͢Δ։ൃελΠϧ •ᐆດͰٸʹมԽ͢Δཁ݅ʹ͖߹͏தখنͷ ιϑτΣΞ։ൃνʔϜͷͨΊͷܰྔڃͷํ๏
Ձ •ίϛϡχέʔγϣϯ •γϯϓϦγςΟ •ϑΟʔυόοΫ •༐ؾ •ϦεϖΫτ
ݪଇ •ਓؒੑ •ܦࡁੑ •૬ޓརӹ •ࣗݾ૬ࣅੑ •վળ •ଟ༷ੑ •;Γ͔͑Γ •ྲྀΕ •ػձ
•ੑ •ࣦഊ •࣭ •ϕΠϏʔεςοϓ •ͷҾ͖ड͚
ओཁͳϓϥΫςΟε •શһಉ੮ •νʔϜશମ •ใຬࡌͷ ϫʔΫεϖʔε •͍͖͍͖ͱͨ͠ࣄ •ϖΞϓϩάϥϛϯά •ετʔϦʔ • ि࣍αΠΫϧ
• ࢛ظαΠΫϧ • ΏͱΓ • ̍̌Ϗϧυ • ܧଓత ΠϯςάϨʔγϣϯ • ςετϑΝʔετ ϓϩάϥϛϯά • ΠϯΫϦϝϯλϧͳઃܭ
εΫϥϜͱ •ෳࡶͰมԽͷܹ͍͠ʹରԠ͢ΔͨΊͷϓϩ δΣΫτͷਐΊํͷϑϨʔϜϫʔΫ •ՄೳͳݶΓՁ ͷߴ͍ϓϩμΫτΛੜ࢈త͔ͭ తʹಧ͚Δ͜ͱΛతͱ͍ͯ͠Δ
εΫϥϜͷཧ •ಁաੑ •ݕࠪ •దԠ
ಁաੑ •ࢀՃऀશһ͕ڞ௨ೝࣝΛ࣋ͭ͜ͱ ྫɿ wϓϩηεͷ༻ޠΛࢀՃऀશһͰڞ༗͍ͯ͠Δɻ w࡞ۀͷʮʯͷఆٛΛڞ༗͍ͯ͠Δɻ
ݕࠪ •࡞εϓϦϯτΰʔϧͷਐḿΛසൟʹݕࠪ͠ɺ ·͘͠ͳ͍มԽΛݕ͢Δ •ݕࠪΛසൟʹߦ͍࡞ۀΛ͛ͳ͍Α͏ʹ͢Δ
దԠ •ϓϩμΫτΛड͚ೖΕΒΕͳ͍ͱݕࠪ୲ऀ͕அ ͨ͠߹ɺϓϩηεͦͷߏཁૉΛௐ͢Δ •ௐͰ͖Δ͚ͩૣ͘ߦ͏
εΫϥϜνʔϜ •ϓϩμΫτΦʔφʔ •։ൃνʔϜ •εΫϥϜϚελʔ
εΫϥϜΠϕϯτ •εϓϦϯτϓϥϯχϯά •σΠϦʔεΫϥϜ •εϓϦϯτϨϏϡʔ •εϓϦϯτϨτϩεϖΫςΟϒ
プロダクトバックログ スプリントバックログ スプリントプランニング 開発 スプリントレビュー デイリースクラム スプリントレトロスペクティブ
ΞδϟΠϧͱςετ
ΞδϟΠϧ։ൃͰͷςετҐஔ͚ •ΞδϟΠϧͰͷςετʹϑΟʔυόοΫΛಘΔ ͱ͍͏త͕͋Δ • ࣗୡ͕࡞͍ͬͯΔͷͷํੑ͍͋ͬͯΔ͔ • ࡞ͬͨͷҙਤ௨Γಈ࡞͢Δ͔ • ఆ֎ͷ͜ͱى͖ͳ͍͔ •ಈ͘ιϑτΣΞͱ࣮ͯ͠ࡍʹݟͯϑΟʔυόο
Ϋ͕ಘΒΕΔ
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
සൟͳίϛϡχέʔγϣϯ •ੵۃతͳൃݴ • ΠςϨʔγϣϯΛ௨ͯ͠ͷεςʔΫϗϧμʔνʔ Ϝϝϯόͱੵۃతʹର • ༷ʹର͢Δ࣭؍Ͱͷҙݟ • ෆेͳςετϕʔεʹରԠ͢ΔͨΊͷೝࣝ߹Θͤ •
վળͷఏҊ • ٙݒ೦ૣΊʹฉ͘ • ΠςϨʔγϣϯظؒʹґΔ͕࣌ؒͰϩε͕େ͖͍
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
ϖΞϓϩάϥϛϯά https://ja.wikipedia.org/wiki/ペアプログラミング Driver Navigator
Ϟϒϓϩάϥϛϯά https://ja.wikipedia.org/wiki/Mob_programming Navigator Driver
खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ 作業 レビュー 作業 レビュー 時間 フィードバックが遅れると ⼿戻りが多くなりムダな作業が 多くなる
ෳਓಉ࣌࡞ۀͰͷςετ • /BWJHBUPSͰ։ൃऀͷಉ࣌ฒߦϨϏϡʔ • ςετ؍ • ࣭؍ • ͦͷଞɺΑΓྑ͍ΞΠσΞ •
ෳਓಉ࣌Ͱͷςετ࡞ۀ • ςετܭը • ςετઃܭɺςετੳ • ϋΠϨϕϧςετέʔεΛϕʔεͱͨ͠ςετ࣮ߦ • ୳ࡧతςετ
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
ςετϑΝʔετΞϓϩʔν •ϓϩάϥϜΛ։ൃ͢ΔલʹςετઃܭΛߦ͏ • 5%%ʢςετۦಈ։ൃʣ • #%%ʢৼΔ͍ۦಈ։ൃʣ • ड͚ೖΕςετۦಈ։ൃ • ϢʔβετʔϦʔ
•࡞ۀͷୡ͢Δ͖ඪͷ໌֬Խ • είʔϓ • ࡞ۀΰʔϧ
ड͚ೖΕج४ͷ໌֬Խ •͍ΠςϨʔγϣϯͰͷΰʔϧΛ໌֬Խ͢Δ • ࣮͖͢ػೳͷ֬ೝ • ݱΠςϨʔγϣϯͰ࣮͠ͳ͍ػೳͷ֬ೝ • ୡ͢Δ͖ඇػೳཁ݅ •͜ΕΒͯ͢ςετέʔεͱඥ͘͜ͱʹͳΔ
ඇςετϑΝʔετΞϓϩʔνͱ ςετϑΝʔετΞϓϩʔν 開発 テスト設計 テスト実⾏ テスト設計 開発 テスト実⾏ テストが通るように開発を⾏う 時間
テスト設計で開発していた内容の 間違いに気が付くことがある
͍αΠΫϧͰͷ ςετϑΝʔετΞϓϩʔν テスト設計 開発 テスト実⾏ 時間 テスト実⾏で失敗すると原因の特定を⾏わなれないけない 対象となる範囲が広いと時間がかかる
https://en.wikipedia.org/wiki/Extreme_programming
http://www.agilemodeling.com/essays/costOfChange.htm
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
ࣗಈςετ •ΞδϟΠϧͰ܁Γฦ͠ૣ͘ϦϦʔε͢Δʹࣗಈ ςετ͕ඞཁʹͳΔ •ςετΛੵΈॏͶΔͱ͍͏ߟ͑ํ • ςετͷίʔυͱಉ͡Α͏ʹੵΈॏͶ͍ͯ͘ • ࣭ͷѱ͍ςετΛੵΈॏͶͳ͍
ࣗಈςετͷׂ߹ TestPyramid https://martinfowler.com/bliki/TestPyramid.html
https://lisacrispin.com/2011/11/08/using-the-agile-testing-quadrants/
୳ࡧతςετ テスト設計 テスト実⾏ 学習 フィードバック
୳ࡧతςετ •ࣝΛ࣋ͬͨςελʔ͕ߦ͏ख๏ • ςετͷٕज़ࣝ • ϓϩμΫτͷࣝ •ςετνϟʔλΛ༻ҙͯ͠ςετઃܭɺςετ࣮ ߦΛಉ࣌ʹߦ͏ •ηογϣϯϕʔεͳ୳ࡧతςετͰ͖ͬͪΓ࣌ ؒΛܾΊΔ
•ΞυϗοΫςετʹͳΒ͍ͳ͍Α͏ʹҙ͢Δ
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
ܧଓతΠϯςάϨʔγϣϯ ・静的解析 ・コンパイル ・テスト実⾏ ・デプロイ ・レポートの表⽰ コードリポジトリ ソースコードの コミット 結果の通知
ܧଓతΠϯςάϨʔγϣϯͰͷ ϑΟʔυόοΫ •ܧଓతΠϯςάϨʔγϣϯͰɺఆظతʹ੩తղ ੳɺϏϧυɺࣗಈςετͳͲ͕࣮ߦ͞ΕΔ •࣭͕ѱ͘ͳͬͨ͜ͱΛ։ൃऀʹૉૣ͘ϑΟʔυ όοΫ͢Δ͜ͱ͕େ • ੩తղੳͷߴϨϕϧΞϥʔτͷ૿Ճ • ࣗಈςετͷࣦഊ
•ܯࠂΛड৴ͯ͠ɺܯࠂΛ์ஔ͠ͳ͍͜ͱ͕େ
ׂΕ૭ཧ 「建物の窓が壊れているのを放置すると、誰も注意を払っていないという象徴になり、 やがて他の窓もまもなく全て壊される」という考え⽅ https://ja.wikipedia.org/wiki/割れ窓理論 継続的インテグレーションの静的解析やテスト実⾏失敗のアラートを無視し続けると その状況は蔓延していく
հ͢Δ͜ͱ •සൟͳίϛϡχέʔγϣϯ •खΓΛݮΒͨ͢Ίͷෳਓಉ࣌࡞ۀ •ςετϑΝʔετΞϓϩʔν •ࣗಈͱखಈͰͷςετͷ͚۠ •ܧଓతΠϯςάϨʔγϣϯ •ΠςϨʔγϣϯͱςετܭը
スプリント ΠςϨʔγϣϯͱςετܭը スプリントゼロ スプリント スプリント (リリーススプリント)
εϓϦϯτθϩ •࡞͢ΔγεςϜΛཧղ͢Δ •ϓϩμΫτͷϦϦʔεܭըΛ֬ೝͯ͠શମͷςε τܭըΛߟ͑Δ •ϢʔβετʔϦʔͷଥੑΛ֬ೝ͢Δ •༻͢ΔπʔϧڥΛ४උ͢Δ •ϦεΫੳΛߦ͏
εϓϦϯτ •εϓϦϯτͰ࡞͠Α͏ͱ͍ͯ͠Δͷͷ ςελϏϦςΟΛߟ͑Δ •εϓϦϯτͰͷςετܭըΛߦ͏ •εϓϦϯτͰͷϦεΫੳΛ࣮ࢪ͢Δ •ςετ؍ɺ࣭؍Ͱͷҙݟग़͠Λߦ͏
εϓϦϯτΛ௨ͯ͠ͷςετ •શମΛ௨ͯ͠ͷςετܭըΛৗʹݟ͢ •:"(/*Ͱ࣮ݱ͞Ε͍ͯͳ͍ͷΛ͍࣮ͭݱ͢Δ ͔ߟ͑Δ ˞:"(/*:PVBJObU HPOOB OFFEJU ඇػೳཁ݅ͳͲޙճ͠ʹͳΓ͕͕ͪͩɺͲͷ͘ Β͍ͷ࣌ظͷεϓϦϯτͰղܾ͖͢ͳͷ͔Λ໌ ֬ʹ͢Δ
•ϦϦʔεલ·ͰʹΔ͖͜ͱΛݕ౼͢Δ ผ్ɺϦϦʔεεϓϦϯτΛઃ͚Δ͔ݕ౼͢Δ
ϫʔΫ
લఏ •ΞδϟΠϧʹܾ·ͬͨϓϩηε͋Γ·ͤΜɻ •ࣗͨͪͰࣗୡʹ͋ͬͨϓϩηεΛݟ͚ͭͯߦ ͘͜ͱ͕େ
ৼΓฦΓϫʔΫ •ΞδϟΠϧએݴͱɺͷݪଇΛݩʹࣗͷۀ ͷΓํΛݟͯ͠ΈΑ͏ •ͲΜͳখ͞ͳࣄͰ͍͍ͷͰɺվળΛݟ͚ͭΑ ͏ • ݸਓϫʔΫ • άϧʔϓڞ༗
/&95
%FW0QT https://ja.wikipedia.org/wiki/DevOps
ϚΠΫϩαʔϏεΞʔΩςΫνϟ https://microservices.io/
ࢀߟจݙ • 'PVOEBUJPO-FWFM&YUFOTJPOγϥόε ΞδϟΠϧς ετ୲ऀ IUUQKTURCKQEM+452#4ZMMBCVT'PVOEBUJPO "HJMF&YU@7FSTJPO+QEG • ΞδϟΠϧιϑτΣΞ։ൃએݴ IUUQTBHJMFNBOJGFTUPPSHJTPKBNBOJGFTUPIUNM
• ΤΫετϦʔϜϓϩάϥϛϯά ΦʔϜࣾ • εΫϥϜΨΠυ IUUQTXXXTDSVNHVJEFTPSHEPDTTDSVNHVJEF W4DSVN(VJEF+BQBOFTFQEG