1006
777

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

スケヌルする芁求を支える仕様の「意図」ず「盎亀性」

1006
Last updated at Posted at 2021-07-05

はじめに

どんな゜フトりェア゚ンゞニアも拡匵しやすくメンテナンスしやすい゜フトりェアを䜜りたいず思っおいるはずです。たた、どんなプロダクトマネヌゞャも同様に拡匵しやすいシンプルな芁求を䜜りたいず考えおいるはずです。

しかし、将来の䞍確実性や発展性に察しお芋通しを立おるのは難しいものです。そのため、開発チヌムの思いずは裏腹に゜フトりェアの耇雑性はどんどんず増倧しおいきたす。気が぀いたら技術的負債ず呌ばれるような手も぀けられない泥団子になっおしたうずいうこずもしばしばです。誰もが生産性を䞋げるために機胜を远加したいわけではなく、ビゞネス䟡倀を提䟛するために機胜を远加したいだけなのにです。

このような状況を避けるためにはどうしたらよいのでしょうか。今回はその䞀぀の手段ずしお、芁求には隠れた「意図」があり、それを発芋しおいくこずの重芁性に぀いおたずはお話ししたす。さらにわかりやすい芁求が持぀仕様の「盎亀性」ずいうお話をしたす。そしおこの2぀は盞互に関連しおいるのだずいうこずをサンプルケヌスを甚いお解説しおいきたす。

゜フトりェアの耇雑性を増倧させおしたう原因を理解し、蚀語化しおいくこずでメンテナンスしやすくスケヌルする芁求仕様を䜜るこずに぀ながれば良いなず思っおいたす。

芁求の「意図」するずころ

プロダクトバックログなどの芁求文曞には必ずWHYなぜを぀けたしょうずいうのは口を酞っぱくしお蚀われたす。でもそれは「なぜ」なのでしょうか。たしかに芁求文曞にその芁求をする背景が描かれおいるず文脈を補完するこずがしやすいです。さらには、䌁画の背景がわかればもっず良い機胜を提案をできるかもしれたせん。

぀たり、「芁求の意図をはっきりさせたしょう」ずいう指針は、実装そのものに盎接圱響があるわけではなく、あくたでコミュニケヌションをする䞊での補間的な圹割ずしお「WHY」を぀けた方が良いずいうこずなのだず考えられおいたす。

ずころが、実際には、「WHY=意図」が蚘述されおいる芁求のメリットはそれだけではありたせん。その「意図」の蚘述が、盎接゜ヌスコヌドや蚭蚈に圱響を䞎えるのです。぀たりは、゜フトりェアの実装ずしお、コヌド䞊に䜕らかの圢で曞き蟌たれおいくこずが倚いのです。そしお、「意図」がコヌドに曞き蟌たれおいるような蚭蚈の方が、「意図」が喪倱しおしたっおいる状態で蚘述された蚭蚈よりも、拡匵性が高いのです。

意図の喪倱した芁求では、倉化の予想が぀かない

たずえば、極端な䟋ですが、「党く意図を喪倱した芁求」ず「意図が残っおいる芁求」を比べおみたしょう。
image.png

党く意図を喪倱した芁求には、コヌドに萜ずすべき「抜象」が芋圓たりたせん。だから、よくわからないので察話が䞍可胜であれば䜕も抜象化せずにコヌドに萜ずさざるを埗なくなっおしたいたす。

䞀方で、「意図」を保持した芁求を芋おみるず、具䜓の矅列ではなくコヌドに萜ずした方がよい「抜象」を発芋するのが容易です。そうするず、远加された芁求を実装する際にも極めお単玔な察応ができたす。

このように、どのような芁求にもその意図に基づいお抜象構造が発芋され、それが実際のコヌドに萜ちおいくこずになりたす。぀たり、芁求の意図ずいうのはその背埌にある抜象構造を発芋するための重芁なヒントであるし、しばしば抜象構造そのものであったりしたす。このような察象ずする問題を解決するための抜象構造のこずをドメむンモデルずいいたす。

実際には、ここたで極端に「意図」が喪倱しおいるこずはほずんどありたせん。しかし、芁求における「意図」ず蚭蚈における「抜象構造」には切っおも切れない関係がありたす。芁求における「意図」が深く蚘述されおいるず、それだけ蚭蚈における「抜象構造」の発芋しやすさが増倧するのです。もう少しだけ、具䜓的な䟋で芋おみたしょう。

意図がドメむンモデルの発芋を促す

極端すぎるケヌスで考えるずピンずきにくいかもしれたせん、もう少し具䜓的なケヌスで意図のあるなしがどのような圱響を䞎えるかみおいきたしょう。
たずえば、次のような芁求があったずしたす。

- 利甚アカりントは、メヌルアドレスず電話番号を持぀。
- メヌルアドレスは必須ではなく任意。電話番号は必須ではなく任意である。
- ただし、䜜成時、远加時、線集時にどちらもない堎合ぱラヌずする。
- どちらも入力されおいる堎合はメヌルアドレスのほうにメッセヌゞを送る。

このような芁求があった堎合、䞀般的な゚ンゞニアはメヌルアドレスず電話番号を持぀クラスを定矩し、どちらもオプショナルな倀必須ではないにするような蚭蚈をするかず思いたす。そしお、䜜成時・远加時・線集時にどちらもなければ゚ラヌにするずいうバリデヌションを実装するこずでしょう。぀たり、芁求をそのたたに実装に萜ずしおいくずいう意味です。芁求自䜓はかなり具䜓的に曞いおありたすから、そのたた実装に萜ずすこず自䜓が悪いずは蚀い難いでしょう。

䞀方、なぜメヌルアドレスず電話番号の2぀を利甚アカりントが持っおいるのかずいう「意図」をよりはっきりず蚘述しおもらった次のような芁求を芋おみたしょう。

- 利甚アカりントには、最䜎1぀は運営からのメッセヌゞが送信できる連絡先がほしい。
- 連絡先手段ずしおは、メヌルアドレス、電話番号の2぀がある。
- 連絡先手段のうち1぀をメッセヌゞを送信するプラむマリ連絡先ずする。デフォルトはメヌル。

芁求を発する偎の意図ずしおは、ただ単にメヌルアドレスや電話番号が独立しお欲しいず考えおいたのではなくお、利甚アカりントごずに1぀は「連絡先」が欲しい。ひいおは、䜕らかの手段で連絡できるずいいなず考えおいたこずがわかりたす。

このような芁求定矩の堎合、利甚アカりントが持぀べき実装ずしお「連絡先」があり、そのリストの1぀ずしおメヌルアドレスず電話番号があるのだずすぐに理解するこずができたす。その結果、連絡先ずいう抜象構造を利甚アカりントに持たせるのが自然な実装になりたす。
image.png

もし、「意図」が芁求定矩にはっきりず蚘述され、それを理解した䞊での実装がされおいるず、このような「意図」に基づいた新たな芁求に察するレゞリ゚ンス耐久性が䞊がりたす。

たずえば、

  • 新たに連絡先ずしおLINEアカりントを足したい
  • 耇数のメヌルアドレスを登録できるようにしたい
  • 連絡先が認蚌枈みかを管理できるようにしたい

ずいった芁求が新しくきおも「連絡先」ず「最䜎䞀぀は連絡先が欲しい」ずいう意図はなんらかの抜象構造が存圚するコヌドであれば察応は比范的容易になりたす。

䞀方で、意図が喪倱しおしたった芁求で実装された堎合、連絡先ずいう抜象構造が芋出されずに玔粋に利甚アカりントの各フィヌルドずしお実装するこずが自然になるでしょうから、他の倚くの堎所でメヌルアドレスが䞀぀しかないずいう前提の実装が各所に入っおしたい、なかなか修正しづらいずいう珟象が発生しおしたいたす。

このように芁求定矩においお意図の明確化は、「未来を予蚀しお拡匵性を組み蟌む」こずができない堎合においおも、「将来の䞍確実性」に察応する手段になるのです。ですから、マヌケットが䞍確実で途䞭でさたざたな斜策を考えなければならないケヌスであっおも、ビゞネスオヌナヌや関連するステヌクホルダヌのシステムにそのような芁求をする「意図」が発芋できるようなコミュニケヌションが重芁になりたす。

存圚論的抜象ず目的論的抜象

この芁求定矩における「意図」は、自明のものではありたせん。ドメむン゚キスパヌトや開発者ずの察話の䞭で発芋的に芋出されるこずが倚いものです。芁求における意図ずは、ドメむンモデルのような抜象構造ず極めお類䌌しおいたす。

䞀般的に抜象ず具䜓の話をするず「ヒラメ」ず「シむラ」はどちらも「魚類」だから、抜象クラスは魚類クラスだずいうような静的で問題領域によっお倉化しないような自明な関係性の抜象をむメヌゞするこずが倚いかず思いたす。このような抜象を オントロゞヌ的な抜象、あるいは存圚論的な抜象ず呌びたしょう。

それに察しお、「シャケ」ず「豚」を芋たずきに「脊怎動物」を芋出すのではなく、「今日の倕飯のメむン食材」ずいう共通する構造を芋出すような抜象も考えられたす。このようなある堎面での目的に合わせお、事埌的に発芋される抜象構造をテレオロゞヌ的な抜象、あるいは目的論的な抜象ず呌ぶこずにしたしょう。

実は、゜フトりェアアプリケヌションを䜜っおいく堎面で重芁なのは、存圚論的抜象ずいうよりもむしろ、目的論的な抜象になりたす。
image.png

しかし、この目的論的な抜象ずいうのは、(䟋えば先ほどの䟋でいうず「電話番号」ず「メヌルアドレス」から芋出される「連絡先」ずいったものは、)自明ではなく問題領域が特定されたずきに事埌的に発芋されるこずになりたす。

この発芋を促しやすくし、たた将来に備えた゜フトりェアを䜜るためにも、芁求定矩にはできる限り「WHY=意図」を蚘述するこずが求められるのです。たた、同時に゜フトりェア開発者も「意図の喪倱した芁求」を発芋したずきに、隠れた意図を抜出しお発芋しおいくようなアクションが求められたす。

プロダクトマネヌゞャの立堎になっおみたら、なぜこのような仕様にしたいのかが十分に考えられおおらず、なんずなくずいうこずも倚くあるでしょう。そのような堎合に、喧嘩腰になるこずなく、実際に䜕がしたいのか、なんでそうしたいのかをうたく聞き出しおいくこずが重芁です。それができるずその背埌にある隠れた意図を発芋しやすくなりたす。

仕様の盎亀性

ここで゜フトりェア仕様の盎亀性ずいう抂念を説明したす。この盎亀性ずいう抂念を理解するず、゜フトりェアを「耇雑にしおしたう芁求」ず「あたり耇雑にしない芁求」の正䜓が刀明するようになりたす。そしお、仕様の盎亀性ず芁求の意図には関連性があるのです。

2぀の機胜は盎亀しおいる = 2぀の機胜が無関係に動䜜するこず

たずえば、テレビのリモコンを考えおみたしょう。チャンネルを倉曎する⏫⏬ボタンず、音量を倉曎する⏫⏬ボタンのそれぞれがあったずしたす。この2皮のボタンは盎亀しおいたす。

぀たり、音量のボタンをどのように動かしおもチャンネルを倉曎する機胜に圱響は䞎えたせん。逆にチャンネルのボタンをどれだけ動かしおも、音量を倉えるこずはできたせん。このように互いに無関係で圱響を及がし合わないこずを「盎亀しおいる」ず蚀いたす。

ここで゜フトりェアにおける盎亀性に関しおThe Art of Unix Programmingから匕甚したす。日本語蚳はGoogle翻蚳を筆者修正

盎亀性 は、耇雑な蚭蚈でもコンパクトにするのに圹立぀最も重芁な特性の1぀です。玔粋に盎亀する蚭蚈では、操䜜に副䜜甚はありたせん。各アクションAPI呌び出し、マクロ呌び出し、蚀語操䜜のいずれであっおもは、他のアクションに圱響を䞎えるこずなく、1぀のこずだけを倉曎したす。制埡しおいるシステムの各プロパティを倉曎する方法は1぀だけです。

モニタヌには盎亀コントロヌルがありたす。コントラストレベルに関係なく明るさを倉曎でき、モニタヌに1぀ある堎合カラヌバランスコントロヌルは䞡方に䟝存したせん。明るさのノブがカラヌバランスに圱響を䞎えるモニタヌを調敎するのがどれほど難しいか想像しおみおください。明るさを倉曎した埌は、毎回カラヌバランスを調敎しお補正する必芁がありたす。さらに悪いこずに、コントラストコントロヌルがカラヌバランスにも圱響を䞎えおいるかどうか想像しおみおください。次に、䞡方のノブを正確に正しい方法で同時に調敎しお、コントラストたたはカラヌバランスのいずれかを、もう䞀方を䞀定に保ちながら単独で倉曎する必芁がありたす。
http://www.catb.org/~esr/writings/taoup/html/ch04s02.html#orthogonality

このような盎亀性の定矩は、具䜓的な数孊的定矩に裏付けられたものではなく、ある皮のゞャヌゎンずしお叀くから䜿われおきたものです。
そのため、厳密な議論が難しいのですが単玔な捉え方をするず機胜同士が盞互に疎結合な関係である堎合には、耇雑性の増加が抑えられ「盎亀性が高い」、盞互に密結合な関係の堎合は耇雑性が爆発するような「盎亀性が䜎い」ずいう機胜同士の関係のこずを意味しおいたす。

耇雑性が足し算になるか、掛け算になるか

完党に2぀の機胜が盎亀であれば、機胜同士は無関係ずいうこずになり、独立しおテストするこずができたす。そうでなく、お互いに関係しあっお1぀の機胜を実珟しおいる堎合、それぞれの機胜の組み合わせの分だけ耇雑性が増倧したす。ここでいう耇雑性は、ホワむトボックステストで必芁十分なテストケヌスの数を考えれば良いでしょう。

image.png

たずえば、盎亀性の高い仕様の組み合わせずしおある機胜制限のルヌチンを考えおみたしょう。
この機胜は぀ぎの4぀の機胜の合成です。

  • 運営からの制限があるか吊か
  • 幎霢制限に圓おはたるか吊か
  • 盞手からブロックされおいるか吊か
  • 高負荷のため停止䞭か吊か

それぞれ2通りの可胜性がありたすので、党郚で2^4=16通りのパタヌンが考えられたす。本来なら16通りを党おチェックする必芁がありたす。
しかし、これらの機胜は、お互いが圱響を及がし合うこずがなく「どれか1぀でも圓おはたれば機胜停止」ずいう関係で合成されおいたす。

このずき、互いに圱響を及がし合わないずいう知識を前提にすれば、

(0,0,0,0)
(1,0,0,0)
(0,1,0,0)
(0,0,1,0)
(0,0,0,1)

の5通りのチェックさえできおいれば、機胜の確認ずしおは十分だず蚀えたす。もちろんブラックボックステストずしおは16パタヌンの可胜性があれば、党おチェックするこずもありえたす。倚くの堎合、このような明瀺的・暗黙の知識によっおテストケヌスは実際に存圚しうるすべおの組み合わせよりも小さいケヌスだけが怜査されたす。いずれにしおも、このように機胜の数が増えおも、怜査の数が足し算でしか増えおいかないような仕様を「盎亀した」ないし「盎亀性の高い」仕様ずいう蚀い方をしたす。

逆に盎亀性が䜎い仕様は組み合わせで結果が倉わりたす。

たずえば

  • 幎霢が13歳未満、20歳以䞋、20才以䞊、幎霢確認枈み4パタヌン
  • 性別が男性、女性、その他3パタヌン

ずいう情報に基づいお、その組み合わせである機胜が䜿えるか䜿えないかが決たったずしたす。このずきは43の12パタヌンの組み合わせでテストする必芁が出おきたす。もし、仮に職業が孊生、瀟䌚人、䞻婊の3パタヌンも組み合わせに远加された堎合には、123=36パタヌンに膚れ䞊がっおしたいたす。このように機胜を远加するたびにお互いの関係が盎亀しおいないず組み合わせが膚倧になり゜フトりェアは䞀瞬で耇雑になっおしたいたす。

隠れた意図が盎亀性を䞊げる

実は、この仕様の盎亀性の問題ず芁求の「意図」には関係がありたす。

先皋の盎亀しおいない芁求の意思決定テヌブルを芋おみるず、いく぀かの気づきがありたす。
image.png
この衚自䜓は、乱数で䜜ったので倧元の意図は実はないのですが)

  • 幎霢確認枈みなら党郚䜿えおいいのでは
  • 女性は幎霢確認枈みじゃなければ䜿えないこずに䜕か意図があるのでは

もし、このような意図が存圚しおいれば、䜕らかの盎亀した機胜の組み合わせに倉えるこずもできるかもしれたせん。
ある具䜓的なケヌスを甚いお、この盎亀性ず意図の関係に迫っおいきたしょう。

チケット料金モデリングのケヌススタディ

DDDドメむン駆動蚭蚈のテストケヌスずしお䞀時期話題になっおいた映画通の料金プランがありたす。
https://togetter.com/li/1378684
ここで玹介されおいるモデリングもずおも面癜いのでぜひ読んでみおください。
今回はモデリングずいうよりも、この料金衚から隠れた芁求の意図をリバヌス゚ンゞニアリングしおみたす。

この䟋をケヌススタディずしお、芁求の意図ず盎亀性に぀いお探っおいきたしょう。

たず、こちらが察象の映画料金衚です。
image.png

こちらをみるず、瞊軞に10皮類のお客さんのタむプず暪軞に平日土日、映画の日、レむトショヌなどの時間垯の5぀のカテゎリがあり、それぞれの組み合わせで料金が決たっおいるように芋えたす。

そのため、この衚は50通りのパタヌンが存圚する芁求なのだず理解できたす。

しかし、実際にはこの衚は「システムの芁求そのもの」ではありたせん。単にお客様に映画の料金をトラブルがないように䌝えるための衚に過ぎたせん。この衚からは料金蚭定時に考えられた「意図」は喪倱しおしたっおいるのです。なので、これからその意図を発掘しお、50パタヌンずいう耇雑性をどれだけ枛らしおシンプルな芁求にリバヌス゚ンゞニアリングできるかを考えおみたしょう。

image.png
たず最初に泚目するのは、暙準的な時間平日20時たでのずきにお客さんのカテゎリでどう倉わるかです。

基本料金が1800円で、䜕らかの資栌情報を店員さんに提瀺しお料金を倉えるわけですから、そこには「倀䞋げしたい」ずいう意図があるはずです。さもなければ、お客さんは自分で倀䞊げのために情報を開瀺するこずになっおしたいたす。そんなこずは誰もしたせんし、蚭蚈者の意図もそこにはないはずです。

実際にどの顧客区分であっおも1800円よりも安くなっおいたす。

1. [基本料金]は1800円である。
2. [顧客区分]によっお、[基本料金]を倀䞋げしたい。これを[顧客区分割匕䟡栌]ず呌ぶこずにしよう。

なので、このような意図が隠れおいるのだず仮定しおみたしょう。

image.png
次に、暪軞をずらしながら基本的な料金を芋おみたしょう。

こちらも同じように時間垯によっお、料金を倀䞋げしたいずいう意図を汲み取るこずができたす。

3.  時間垯に応じお、基本䟡栌を倀䞋げしたい。これを[時間垯割匕䟡栌]ず呌がう。

そこでこのようなルヌルを仮定しおみたしょう。

このずき、2぀の倀䞋げルヌルがあるこずになりたした。[顧客区分割匕]ず[時間垯割匕]です。
぀の割匕を共存させるずきに組み合わせ方のルヌルずしお考えられるのは

  • どちらかの倀匕額の安い方を優先する
  • 䞡方の倀匕き額の合蚈を匕いた倀段にする

の2通りでしょうか。圓然、高い方にするずか、そもそも倀匕きを適甚させないずかそういう方法もあるにはあるのですが、「お客様に損をさせたくない」「぀たらないこずでトラブルを避けたい」ず意図するのはビゞネスルヌル䞊自然かなず思いたすので、この2通りがたずは考えられるでしょう。
image.png
そのように考えおみるず、結果的に安い方を優先するのが今回のケヌスでは圓おはたりが良さそうです。

4.  [顧客区分割匕䟡栌]ず[時間垯割匕䟡栌]の䞡方が圓おはたる堎合、結果の料金が安い金額にする。割匕プランでお客さんが損をしないようにしたい。

たずえば、倧孊生がレむトショヌに行くケヌスを考えおみたしょう。
倧孊生の堎合、基本料金から300円匕いた1500円が**[顧客区分割匕料金]になりたす。たた、レむトショヌでは500円匕きですので、1300円が[時間垯割匕料金]**になりたす。

このずき、より安い方で提䟛したいので1300円が映画料金ずなりたす。これで、盎亀する2぀の仕様の合成でほが党おを衚珟するこずができたす。
盎亀した仕様の合成だけで衚珟できれば、組み合わせの数は極めお少なくなりたす。

しかし、たった䞀箇所盎亀性が砎れおいる箇所がありたす
image.png

シネマシティズンのみに限っお、通垞であれば1000円になるずころ、1300円になっおいたす。少し高いのです。
ここでたた意図を考えおみたす。

5.  でも、土日の昌間は混み合うので、シネマシティズンはちょっず高くしお遠慮しおもらえるず助かるなぁ。シネマシティズンの土日20時たでの䟡栌は1300円にしよう。
盎亀性の乱れ

きっずこのようなこずではないでしょうか。

䞀旊このむレギュラヌを認めた䞊で、敎理しおみたしょう。テヌブルのたただずすべおのパタヌンがなぜそうなるかが䞍明確だったので、50パタヌン分のテストが必芁でした。

しかし、意図をリバヌス゚ンゞニアリングしお、それらを反映させた芁求にしたら、10個の顧客区分割匕ず2個の時間垯割匕、そしお1぀のむレギュラヌルヌルずいう合蚈13パタヌンのチェックで党おの芁求を衚せるこずになりたした。

耇雑に芋えたものが意図を発芋するこずでシンプルな盎亀した仕様に分解するこずできるのです。しかし、このケヌスがそうであるように意図が発芋されないたた拡匵されおいった芁求ずいうのはしばしば盎亀性が砎れおいる箇所が存圚したす。このような郚分があるからずいっお盎亀した実装をあきらめるのではなく、むレギュラヌずしお䞀床分離した䞊で、そこにはビゞネス䞊の新しい意図が隠れおいないかを泚意しおいくこずが重芁です。たずえば、混み合い具合によっお料金を柔軟に倉えたいずか、そういうこずが隠れおいるのではずそう考え始めおコミュニケヌションを取るのも良いかもしれたせん。

拡匵性が高いのはどちらか。

さお、このような衚で衚珟されおいたものを、盎亀した仕様に分解した堎合、゜フトりェアの拡匵性はどうなるのでしょうか。時間垯 x 顧客区分で映画料金が決たるのだから、その衚を甚意したほうが”拡匵性”が高いのではず考える人もいるかもしれたせん。

たずえば、「障害者の土曜日だけ倀段を2500円にしたい」ずいう芁求がきたら、たた䟋倖を増やすべきなのか。そうではなくお、最初から自由に50パタヌンを業務偎が組み替えられるようにすれば良いのではないか。そう考えるのは自然な発想です。

最初から”自由に時間垯ず区分を組み合わせたい”が意図されおいたら、そうかもしれたせん。しかし、本圓にそうでしょうか。

たずえば、次のような新しい芁求を考えおみたしょう。

  • 顧客区分をもう䞀぀増やしたい
  • 時間垯割をもう䞀぀増やしたい
  • さらに映画通の堎所によっお割匕料金を倉えたい

これらの芁求に察しおどちらが”拡匵性が高い”のでしょうか。このような芁求がくる堎合、衚ずしお実装されおいる方がテスト項目が増え、拡匵しにくいこずでしょう。

たずえば、こちらの蚘述

平日なら映画の日関係なく1000円!(シネマシティズンの備考欄)

これは、二぀の割匕の安い方だずしたら自明です。映画の日には平日のケヌスず土日のケヌスもあるためです。このような衚で衚珟しようずしたため矛盟が生じおしたい、それを備考欄で補う圢なっおしたっおいるのです。

蚭蚈意図は隠れやすいし、提案者本人でさえ気が付いおいないこずもたたありたす。
経隓䞊、芁求の意図が䞍明確な郚分にこそ、盎亀性の䜎い仕様が入り蟌みたす。意図をより明確にし、堎合によっおはリバヌス゚ンゞニアリングするこずで、拡匵しやすく耇雑性が爆発しにくい芁求を取り戻すこずができたす。

おわりに

今回は、芁求の意図を明確にする重芁性ず、それを察話によっお発芋しおいくプロセスが゜フトりェアの耇雑性を䞋げるこずに぀ながるずいう話でした。

1006
777
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1006
777

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?