[{"data":1,"prerenderedAt":354},["ShallowReactive",2],{"content-query-DzMXjqQ76h":3,"link-card-/articles/tech/development/portal-with-claude-code":343,"og-https://qiita.com/jsakamoto/items/67d089cd95a35e8bc1d8#%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B":346,"og-https://github.com/AutumnSky1010/SoundMaker":350},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"rowTypeId":16,"sitemap":17,"body":18,"_type":337,"_id":338,"_source":339,"_file":340,"_stem":341,"_extension":342},"/articles/tech/development/oss-dogfooding","development",false,"","OSSを公開したら使いにくかった話｜ドッグフーディングで改善する","OSSライブラリ「SoundMaker」の開発を通じて、自分で使い倒す「ドッグフーディング」の重要性を痛感しました。利用者視点を理解しているつもりでも、実際に使ってみないと気づけない問題があるという体験談です。","2026-03-22",[12,13,14,15],"OSS","個人開発","マインドセット","SoundMaker",1,{"loc":4,"lastmod":10,"priority":16},{"type":19,"children":20,"toc":318},"root",[21,29,35,40,49,55,60,67,73,87,93,99,112,117,121,126,135,140,146,151,164,169,182,187,192,197,202,207,212,217,255,261,266,271,277,282,287,293,298],{"type":22,"tag":23,"props":24,"children":26},"element","h2",{"id":25},"はじめに",[27],{"type":28,"value":25},"text",{"type":22,"tag":30,"props":31,"children":32},"p",{},[33],{"type":28,"value":34},"「利用者の視点に立つことが大事」",{"type":22,"tag":30,"props":36,"children":37},{},[38],{"type":28,"value":39},"これは誰もが理解していると思います。そして、自分は利用者の気持ちを理解していると考えがちだと思います。この記事は、実際は全然理解していなかったということを反省した記事となります。",{"type":22,"tag":41,"props":42,"children":43},"summary-box",{},[44],{"type":22,"tag":30,"props":45,"children":46},{},[47],{"type":28,"value":48},"OSSライブラリ「SoundMaker」の開発を通じて、自分で使い倒す「ドッグフーディング」の重要性を痛感しました。利用者視点を理解しているつもりでも、実際に使ってみないと気づけない問題があります。テストでは見つからない使い勝手の問題を発見するためには、開発者自身が一番のユーザーになることが大切です。",{"type":22,"tag":23,"props":50,"children":52},{"id":51},"開発中のoss",[53],{"type":28,"value":54},"開発中のOSS",{"type":22,"tag":30,"props":56,"children":57},{},[58],{"type":28,"value":59},"C#でチップチューンサウンド（昔のゲームのようなピコピコするサウンド）を生成するためのライブラリ、「SoundMaker」を開発しています。",{"type":22,"tag":61,"props":62,"children":66},"external-link-card",{"to":63,"description":64,"image":65,"title":15},"https://github.com/AutumnSky1010/SoundMaker","8bit風サウンドを簡単に作成できる.NETライブラリ","https://opengraph.githubassets.com/1/AutumnSky1010/SoundMaker",[],{"type":22,"tag":68,"props":69,"children":71},"h3",{"id":70},"なぜ作ろうと思ったのか",[72],{"type":28,"value":70},{"type":22,"tag":30,"props":74,"children":75},{},[76,78,85],{"type":28,"value":77},"高校生の時に基本情報技術者試験の勉強をしていた際、",{"type":22,"tag":79,"props":80,"children":82},"tooltip",{"content":81},"音声波形をそのままデジタル数値に変換する方式。WAVファイルなどで使われる",[83],{"type":28,"value":84},"リニアPCM",{"type":28,"value":86},"の仕組みを学びました。そこで、息抜きを兼ねて音を生成してWAVファイルで書き出せるプログラムを書いてみよう！となり、爆誕しました。",{"type":22,"tag":23,"props":88,"children":90},{"id":89},"致命的やらかしポイント使いづらくね",[91],{"type":28,"value":92},"致命的やらかしポイント：使いづらくね？",{"type":22,"tag":68,"props":94,"children":96},{"id":95},"使いづらポイント初期バージョンはファイル出力のみに対応",[97],{"type":28,"value":98},"使いづらポイント①：初期バージョンはファイル出力のみに対応",{"type":22,"tag":30,"props":100,"children":101},{},[102,104,110],{"type":28,"value":103},"何故か当時は",{"type":22,"tag":79,"props":105,"children":107},{"content":106},"ファイルやネットワークなどへデータを順次読み書きするための仕組み。メモリ上で直接扱えるため、ファイル保存を経由せずに処理できる",[108],{"type":28,"value":109},"Stream",{"type":28,"value":111},"への出力に未対応。利用者の方に指摘頂いて初めて修正しました。",{"type":22,"tag":30,"props":113,"children":114},{},[115],{"type":28,"value":116},"以下のリンクはStream未対応を指摘してくださったQiitaの記事です。",{"type":22,"tag":61,"props":118,"children":120},{"to":119},"https://qiita.com/jsakamoto/items/67d089cd95a35e8bc1d8#%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B",[],{"type":22,"tag":30,"props":122,"children":123},{},[124],{"type":28,"value":125},"なんと、このライブラリはニーズなどを一切考慮せず",{"type":22,"tag":127,"props":128,"children":129},"punchline-box",{},[130],{"type":22,"tag":30,"props":131,"children":132},{},[133],{"type":28,"value":134},"完成したからとりあえず公開しちゃえ",{"type":22,"tag":30,"props":136,"children":137},{},[138],{"type":28,"value":139},"というノリで公開したのです。今回は「運が良く」指摘いただきましたが、もしこの指摘がなければ、長い間使いづらい状態で放置することになっていたと思います。",{"type":22,"tag":68,"props":141,"children":143},{"id":142},"使いづらポイント楽譜をそのままデータ構造にしてしまった",[144],{"type":28,"value":145},"使いづらポイント②：楽譜をそのままデータ構造にしてしまった",{"type":22,"tag":30,"props":147,"children":148},{},[149],{"type":28,"value":150},"ファイル出力の問題は指摘で気づけました。では、ドッグフーディングで自力で見つけた問題は何か。それが楽譜構造の問題でした。",{"type":22,"tag":30,"props":152,"children":153},{},[154,156,162],{"type":28,"value":155},"見つけた内容は、音を鳴らさない時間を作るために必ず休符を入れる必要がある仕組みにしてしまったという内容です。つまり、本来なら「4小節目から音を鳴らす」と時間を直接指定したいのに、そこまでの空白をわざわざ休符データで埋めないといけない構造になっていました。このような構造では、",{"type":22,"tag":79,"props":157,"children":159},{"content":158},"Digital Audio Workstation: 音楽制作ソフトウェアの総称。任意のタイミングで音を配置・編集できる",[160],{"type":28,"value":161},"DAW",{"type":28,"value":163},"ソフトのようなユースケースに対応できません。",{"type":22,"tag":23,"props":165,"children":167},{"id":166},"自分でライブラリを使い倒すことが重要",[168],{"type":28,"value":166},{"type":22,"tag":30,"props":170,"children":171},{},[172,174,180],{"type":28,"value":173},"これがこの記事の主旨となります。実際に使い倒さなければわからなかったということです。\nこのように、自分(達)の製品を自分(達)で使い倒すことを ",{"type":22,"tag":175,"props":176,"children":177},"strong",{},[178],{"type":28,"value":179},"ドッグフーディング",{"type":28,"value":181}," と言います。",{"type":22,"tag":68,"props":183,"children":185},{"id":184},"経緯",[186],{"type":28,"value":184},{"type":22,"tag":30,"props":188,"children":189},{},[190],{"type":28,"value":191},"気軽にチップチューン音楽を作成できるWEBアプリ「PICOM」を開発し始めました。PICOMの音声生成エンジンとして、自作したSoundMakerを組み込んだ流れです。",{"type":22,"tag":30,"props":193,"children":194},{},[195],{"type":28,"value":196},"下記動画はPICOMの宣伝動画です。動画内BGMは実際にPICOMを利用して作成したもので、チップチューンのイメージがわかない方は、どのような音楽か聞いてみてください。",{"type":22,"tag":198,"props":199,"children":201},"youtube",{"id":200},"F09hLEyYo_4",[],{"type":22,"tag":30,"props":203,"children":204},{},[205],{"type":28,"value":206},"このアプリにピアノロールを実装する際に、「このAPIでピアノロール実装無理じゃね？」となったのが経緯です。",{"type":22,"tag":68,"props":208,"children":210},{"id":209},"自分で使い始めて変わったこと",[211],{"type":28,"value":209},{"type":22,"tag":30,"props":213,"children":214},{},[215],{"type":28,"value":216},"これをするだけでなんでこんな手順を踏まないといけないんだ？みたいな改善点が見つかりやすくなったことが一番のメリットだと思います。一応結合テストでAPIのテストはしていましたが、このテストはそのAPIが存在していることが前提なので、こういったことに気づくことができませんでした。",{"type":22,"tag":30,"props":218,"children":219},{},[220,222,233,235,245,247,253],{"type":28,"value":221},"また、ライブラリ開発時は内部の",{"type":22,"tag":79,"props":223,"children":225},{"content":224},"そのクラス内からしかアクセスできないアクセス修飾子",[226],{"type":22,"tag":227,"props":228,"children":230},"code",{"className":229},[],[231],{"type":28,"value":232},"private",{"type":28,"value":234},"や",{"type":22,"tag":79,"props":236,"children":238},{"content":237},"同じプロジェクト（アセンブリ）内からのみアクセスできるアクセス修飾子",[239],{"type":22,"tag":227,"props":240,"children":242},{"className":241},[],[243],{"type":28,"value":244},"internal",{"type":28,"value":246},"なプロパティ、メソッドを確認できます。しかし、利用する際は",{"type":22,"tag":79,"props":248,"children":250},{"content":249},"ライブラリが外部に公開しているクラスやメソッドの集合。利用者はこれだけを使ってプログラムを書く",[251],{"type":28,"value":252},"公開API",{"type":28,"value":254},"のみを利用できます。この時に初めて「このプロパティを外部に公開して欲しいな」とかにも気づくことができました。",{"type":22,"tag":68,"props":256,"children":258},{"id":257},"とはいえ実際は多くの人に利用してもらえたほうが楽では",[259],{"type":28,"value":260},"とはいえ、実際は多くの人に利用してもらえたほうが楽では？",{"type":22,"tag":30,"props":262,"children":263},{},[264],{"type":28,"value":265},"ほぼ自分だけが使っていたら自分のユースケースに特化してしまうというのは仕方がない側面もあります。ただ、この記事ではそういうことを言いたいのではなく、開発者サイドで利用者視点に立つためには実際に使い倒すことが大事だと言いたいです。できることなら、利用者には「使いやすい」とだけ感じられることが理想です。利用者からするとFBすることもコストです。",{"type":22,"tag":30,"props":267,"children":268},{},[269],{"type":28,"value":270},"そして、これは二者択一の問題ではなく、両取りすることで相互作用を生み出せると思います。「利用者からのFB✖️自分のFB」を組み合わせることで、改善点が見つかりやすくなるのだと感じました。",{"type":22,"tag":23,"props":272,"children":274},{"id":273},"ossに限らず個人開発全般に言えること",[275],{"type":28,"value":276},"OSSに限らず個人開発全般に言えること",{"type":22,"tag":30,"props":278,"children":279},{},[280],{"type":28,"value":281},"ドッグフーディングの考え方はOSSに限った話ではなく、個人開発全般に当てはまります。自分で作ったものを日常的に使い続けることで、「動くけど使いにくい」部分が自然と浮き彫りになります。",{"type":22,"tag":30,"props":283,"children":284},{},[285],{"type":28,"value":286},"例えば、私がClaude Codeを活用して開発した家計管理アプリ「Portal」でも、実際に毎日の家計管理に使い始めてから多くの改善点に気づきました。AIエージェントに実装を任せれば「動くもの」は簡単に作れますが、使い勝手の良し悪しは使ってみないとわかりません。",{"type":22,"tag":288,"props":289,"children":292},"link-card",{"label":290,"to":291},"Portalの開発についてはこちら⬇️","/articles/tech/development/portal-with-claude-code",[],{"type":22,"tag":23,"props":294,"children":296},{"id":295},"まとめ",[297],{"type":28,"value":295},{"type":22,"tag":299,"props":300,"children":301},"ul",{},[302,308,313],{"type":22,"tag":303,"props":304,"children":305},"li",{},[306],{"type":28,"value":307},"「利用者の視点に立つ」ことは、頭で理解しているだけでは不十分で、実際に自分で使い倒して初めて本当の課題が見える",{"type":22,"tag":303,"props":309,"children":310},{},[311],{"type":28,"value":312},"自動テストは正確性を証明できても、使いやすさは証明してくれない。ユースケースを実際に動かして初めてわかる問題がある",{"type":22,"tag":303,"props":314,"children":315},{},[316],{"type":28,"value":317},"ドッグフーディングと利用者からのフィードバックは二者択一ではなく、両方を組み合わせることで改善の質が上がる",{"title":7,"searchDepth":319,"depth":319,"links":320},2,[321,322,326,330,335,336],{"id":25,"depth":319,"text":25},{"id":51,"depth":319,"text":54,"children":323},[324],{"id":70,"depth":325,"text":70},3,{"id":89,"depth":319,"text":92,"children":327},[328,329],{"id":95,"depth":325,"text":98},{"id":142,"depth":325,"text":145},{"id":166,"depth":319,"text":166,"children":331},[332,333,334],{"id":184,"depth":325,"text":184},{"id":209,"depth":325,"text":209},{"id":257,"depth":325,"text":260},{"id":273,"depth":319,"text":276},{"id":295,"depth":319,"text":295},"markdown","content:articles:tech:development:oss-dogfooding.md","content","articles/tech/development/oss-dogfooding.md","articles/tech/development/oss-dogfooding","md",{"title":344,"description":345},"AIで個人開発の価値は死んだのか？","Claude Codeを活用して家計管理PWAを約1週間で開発した体験をもとに、AIで爆速開発できる時代における個人開発の価値や、エンジニアとして力を入れるべきポイントについて考えます。",{"image":347,"title":348,"description":349},"https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg%3Fixlib%3Drb-4.0.0%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnFpaXRhLWltYWdlLXN0b3JlLnMzLmFtYXpvbmF3cy5jb20lMkYwJTJGNTg0NTAlMkZwcm9maWxlLWltYWdlcyUyRjE0NzM2OTQ2NDA_aXhsaWI9cmItNC4wLjAmYXI9MSUzQTEmZml0PWNyb3AmbWFzaz1lbGxpcHNlJmJnPUZGRkZGRiZmbT1wbmczMiZzPWNlZjljMTQ3YTc1ZTEwMjBmYjU3YWQ2Nzc5ZWVhNjUz%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3Dce059bec08f81e8195f2c29b3172e12e?ixlib=rb-4.0.0&w=1200&fm=jpg&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk2MCZoPTMyNCZ0eHQ9QyUyMyVFMyU4MSVBMCVFMyU4MSU5MSVFMyU4MSVBNyVFNyU5RiVBOSVFNSVCRCVBMiVFNiVCMyVBMiVFMyU4MyVCQiVFNCVCOCU4OSVFOCVBNyU5MiVFNiVCMyVBMiVFMyU4MSVBRSVFOSU5RiVCMyVFMyU4MiU5MiVFNyU5NCU5RiVFNiU4OCU5MCVFMyU4MSU5NyVFMyU4MSVBNi53YXYlRTMlODMlOTUlRTMlODIlQTElRTMlODIlQTQlRTMlODMlQUIlRTMlODElQUIlRTYlOUIlQjglRTMlODElOEQlRTglQkUlQkMlRTMlODIlODElRTMlODIlOEIlRTMlODMlQTklRTMlODIlQTQlRTMlODMlOTYlRTMlODMlQTklRTMlODMlQUElMjAlMjJTb3VuZE1ha2VyJTIyJTIwJUUzJTgyJTkyJTIwQmxhem8lRTIlODAlQTYmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtcGFkPTAmcz03YjdhZDFjYzUzN2IyYTQxYzVlODEzNDc0ZjY1OWM2Ng&mark-x=120&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTgzOCZoPTU4JnR4dD0lNDBqc2FrYW1vdG8mdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtcGFkPTAmcz1iNzI3OWRhNjM4ZGQxODBmODQ3NDUwNmE3MDlkN2E2Ng&blend-x=242&blend-y=480&blend-w=838&blend-h=46&blend-fit=crop&blend-crop=left%2Cbottom&blend-mode=normal&s=35cd63621c7f305ba53c17d1b14ec6fd","C#だけで矩形波・三角波の音を生成して.wavファイルに書き込めるライブラリ \"SoundMaker\" を Blazor WebAssembly 上で実行してみた - Qiita","ライブラリ \"SoundMaker\" 先月、Twitter で面白そうな投稿を見つけました。 「C# だけで矩形波・三角波の音を生成して.wavファイルに書き込めるライブラリ」、\"SoundMaker\" だそうです (GitHub リポジトリは下記リンク先)。 ...",{"image":351,"title":352,"description":353},"https://opengraph.githubassets.com/2fdd4359acbcb38ea360d8a42834458b25b0c1e912258985831b8a45d86c30b3/AutumnSky1010/SoundMaker","GitHub - AutumnSky1010/SoundMaker: You can do The following content with this library.   1. make the sound of chiptune(old game sound)  2. export sound to a file of wave format.","You can do The following content with this library.   1. make the sound of chiptune(old game sound)  2. export sound to a file of wave format. - AutumnSky1010/SoundMaker",1776356306134]