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
1.9k
アジャイルとテスト / 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
グローバルなソフトウェアテスト組織における課題と戦略 / Challenges and Strategies in a Global Software Testing Organization #mf_techday
imtnd
0
360
WACATE 2022 夏 ワークショップの目的
imtnd
0
970
テスト設計技法をなぜ&どのように使うのか体験しよう!
imtnd
0
1.5k
analyze the behavior with decision table
imtnd
0
4k
WACATE流テスト分析のワークショップを体感してみよう
imtnd
0
210
テスト技法作成のアプローチを考える
imtnd
0
720
テストの目的を考えよう
imtnd
0
800
やってみよう状態遷移テスト #xpjug
imtnd
0
1k
Agile Japan 2019 Report
imtnd
0
1k
Other Decks in Programming
See All in Programming
From Translations to Multi Dimension Entities
alexanderschranz
2
130
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
770
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
200
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
350
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
160
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
130
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
190
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
Refactor your code - refactor yourself
xosofox
1
260
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Mobile First: as difficult as doing things right
swwweet
222
9k
Building Your Own Lightsaber
phodgson
103
6.1k
Side Projects
sachag
452
42k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Typedesign – Prime Four
hannesfritz
40
2.4k
A designer walks into a library…
pauljervisheath
204
24k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
94
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
How STYLIGHT went responsive
nonsquared
95
5.2k
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