X11

あなたを気にしている企業

キャリアビジョン


「Web」x「解析数学」x「コンピュータサイエンス」x「企業経営の基礎」x「AI」で代替不可能なエンジニアになる

### これまでの経験と技術の総動員 #### 1. Web(フロントエンドの深淵と地力) AI の台頭によって、特に学習データの豊富な Web コーディング領域では「コードを書く能力」のみを武器にすることは難しくなると実感しています。私は Web フロントエンドエンジニアとして、10 年近くモダンな技術スタック(TypeScript, React, Next.js)でのシングルページアプリケーション開発を経験してきましたが、ボイラープレートのようなコード生成の多くは AI に任せられるフェーズに来ています。 しかし一方で、**非機能要件、Web アクセシビリティ、レンダリングパフォーマンス、セキュリティ**などに深く配慮されたコードには、依然として人間のエンジニアの地力が要求されます。 例えば `alt` 属性ひとつとっても、W3C の「An alt Decision Tree」という明確な決定フローがあるにもかかわらず、現場では間違った設定が多く見られます。5 年以上のキャリアを持つシニアエンジニアであっても、HTML の「コンテンツカテゴリー」といった基礎を知らない、Lighthouse での計測を常態化していないといった実態を、これまで 7 社以上の企業を経験する中で目の当たりにしてきました。 また、Web がドキュメントプラットフォームからアプリケーションプラットフォームへ転換を遂げる中、WebGPU などの新しい JavaScript API が日々 Working Draft として議論されています。これら黎明期の技術は学習データが少ないため、**「1 次情報(仕様書)を読み解き、実装へ落とし込む」**というエンジニア本来の地力が不可欠です。私は Web Audio API が Working Draft だった頃から仕様書ベースでの試行錯誤を重ねており、この「1 次情報をハンドリングするスキル」こそが AI に代替できない強みであると考えています。 #### 2. 解析数学 大学院での専攻は**音信号処理**であり、これまで業務外でもオーディオプロダクトの制作やドキュメント執筆を通して、**フーリエ解析やラプラス変換**などの数学を深く学んできました。これらは組み込みやローレイヤーにおいて必須となる信号処理数学です。 後述のコンピュータサイエンスの知識と合わせ、実務未経験ではありますが、組み込みに近いレイヤーのプログラミングが必要になった際にも即座にチャレンジできる強固な土台(インプットの高速さ)を持っています。また、この領域での AI コーディングの恩恵を最大化するには、Web 領域と比較してまだ少し時間がかかると考えています。 #### 3. コンピュータサイエンス 大学時代(建築学科)に構造計算のための Fortran プログラミングに触れたことをきっかけにコンピュータの仕組みそのものに魅了され、業務外の時間の多くをローレイヤーの探求に捧げてきました。 これまでに、現在の Unix 系 OS の始祖となる **Unix 6th edition のアーキテクチャ理解**、Verilog HDL による**論理ゲートおよび 5 段階パイプライン処理の実装**、Unix システムコールと curses ライブラリを利用した CLI ゲームの開発、Raspberry Pi と ALSA(Advanced Linux Sound Architecture)を利用したオーディオプレイヤーの実装、**DSL(Domain Specific Language)のインタプリタ実装**などを自主開発で行ってきました。 現在は unsafe Rust の学習を深めつつ、『コンピュータシステム 理論と実践(Nand to Tetris)』を通して NAND ゲートからテトリスを組み上げる実装を日々進めています。コンピュータシステムに近いレイヤーほど AI での代替は難しくなります。実務未経験という枠を超え、システムプログラミング以下のレイヤーに対処できる準備は常に整えています。 #### 4. 企業経営の基礎 大学時代に**簿記 2 級**(内容としては連結決算やキャッシュフロー会計など 1 級の領域まで)を取得しており、会社の「お金」の流れを正しく理解できます。これはエンジニアとしては稀有な視点であり、特にスタートアップにおいて「資金調達」や「キャッシュ燃焼率(バーンレート)」の重要性を誰よりもリアルに解釈できる自負があります。 今回、次なる環境を模索している動機も、在籍企業の公開された財務諸表を分析した結果、流動比率が 100% を大きく割り込み、事業継続性(ランウェイ)が事実上致命的な状態にあると判断したためです。実態として、開発 PC の支給見送りによる私物 PC の強制利用、AI ツールの個人契約依存など、組織のガバナンスやコンプライアンス意識の著しい低下が財務の困窮と連動して現れており、エンジニア個人として健全かつ安全にパフォーマンスを発揮できる環境ではないと論理的に結論付けました。 #### 5. AI AI ツールの単なる操作(プロンプトハックなど)は、数学やコンピュータサイエンスと比較すれば学習コストがほぼないに等しいと考えています。重要なのは「AI を使いこなせるか」ではなく、**「AI をいかにシームレスに組織・業務へ取り込んでいくか」を多角的に設計できる能力**です。上場企業から創業間もないスタートアップまで 7 社以上の多様な組織を見てきた経験が、ここで生きてきます。 AI は、これまでのコンピュータサイエンスにおける「純粋な技術的抽象化の歴史」とは一線を画します。なぜなら、AI はコンピュータの内部に閉じず、**法律や経済、人間の在り方にまで多次元的な変数を投げかけているから**です(モダンフロントエンドの台頭では法律や経済までは変わりませんでした)。 例えば、1 年後の法改正によって今日設計した業務フローや組織構造が破綻するリスクや、特定の AI モデルに依存することでその開発企業の撤退とともに事業が共倒れするリスクがあります。「AI を導入すれば作業時間が減る」といった単次元的な視点ではなく、法律・経済・技術の多変数を考慮したシームレスな組織導入設計において、私のバックグラウンド(CS × 経営基礎 × 多数の組織経験)は最も高い価値を発揮できると考えています。 --- ### 次の働く環境に求めること 自身の能力と経験を最大限に発揮し、持続可能かつ長期的に貢献するために、以下の環境を重視しています。 1. **強固な事業継続性とガバナンス** 直近で経験した環境が財務・経営不振に陥った経験から、何より「本業で利益が出ていること(あるいは極めて高い確度で利益が出る見込みがあること)」を重視します。また、その利益がエンジニアの適切な開発環境(ハードウェア・ソフトウェアへの投資)やセキュリティ担保に還元される健全な組織を希望します。 2. **AI 導入に対する多角的・本質的なスタンス** AI の導入を不可避としつつも、それが組織やコンプライアンスに与える影響を多角的に考慮していること。「全社にアカウントを配れば劇的に効率化する」といった単純化された思想ではなく、リスクと不確実性を見据えた本質的なアプローチを志向する組織に共感します。 3. **持続可能なワークライフバランス** 心身の健康を第一に保ちながら業務で高いパフォーマンスを発揮し、かつ業務外でのオーディオプログラミングやコンピュータサイエンスの探求時間を確保できる、精神的・時間的に健全な環境であること。

プロジェクト経験

2024年/1ヶ月以内

CoeFont 通訳デスクトップアプリケーションにおけるメモリリークの解消

# 概要 [CoeFont 通訳デスクトップアプリケーション](https://coefont.cloud/cir) において, 何も操作していない (例えば, 入力デバイスからの音声入力がないなど) にも関わらず, 使用メモリが 30 分ほどで GB 単位に増加していった問題を, アクティビティモニター (`top` コマンドの GUI アプリ) で検知して修正しました. # 原因分析 何も操作がないのに使用メモリが増加し続けていましたが, 線形的な増加の仕方ではなく, 通訳機能を利用していときはそれなりに増加して, それ以外の場合は, 少しずつ増加していることが, 入力マイクから不要なデータがアプリケーションに送信されているという仮説にいきつきました. 該当のコードを調査したところ, マイク入力がない場合でも, AudioWorklet (オーディオ処理専用のスレッド) が無音のデータ (要素が全て `0` の `Float32Array`) をメインスレッドに送信し続けている点を発見. メインスレッドに送信されたオーディオデータが何らかの原因で GC されずに使用メモリが増え続けているという事象まで分析しました. # 解決 ユーザーがマイク入力をしていない場合は, AudioWorklet (オーディオ処理専用のスレッド) から無音データをそもそも送信しないことで解決. 修正したアプリケーションでは, 通訳時以外は, 使用されていたメモリが解放されて, 30 MB 程度のメモリ使用に抑えることができました.

2023年/3ヶ月以内

nana Web アプリケーションのリニュアールリリース

# 概要 https://nana-music.com から, リニューアル版 https://beta.nana-music.com/ の Web フロントエンドの技術選定, 設計から実装, 保守・運用をすべて一人で担当 (現在も, 機能追加, パフォーマンス改善, バグ修正など進行中). # 既存コードとリニューアルデザインカンプから仕様を把握して技術選定・設計まで これまでに経験したことのない最も大変なことであり, 前任者などが誰一人いなく, ドキュメントもなく, コードも断片的につぎはぎされたような状態 (リリースプロセスなどもなく, ほぼ放置状態) から, 仕様を把握して, 技術選定・設計をおこなうことでした. そのためには, 既存のコードをリーディングするには限界があり, リニューアルにあたっての MVP (Minimum Viable Product) を以下のように整理して (また, ビジネス的な理由上, 2023 年 10 月にローンチして, 2023 年 12 月末までにリニューアル版としてリリースする必要がありました), それを補完するために既存のコードや挙動をかいつまんで進めました. - アカウント作成ができる - ログインができる - アカウント情報が編集できる - ユーザーページが閲覧できる - 検索やフィードなどコンテンツ回遊の導線ができる - 動画・オーディオの視聴ができる - オーディオファイルがアップロードできる また, MVP を意識して, UX 的なことは削ぎ落としたり (例えば, 検索では当初の予定では, さらにフィルタリングができる想定), デザインに時間を要するところはデザイナーと相談して簡素な UI に変更してもらう (例えば, カルーセルは横スクロールにしてもらうなど) などしてこれ以上削ぎ落とせば, nana の Web アプリケーションとして成立しないぐらいの実装コストを減らして, 実質 2 ヶ月の実装時間 (残り 1 ヶ月は QA 項目の作成, QA プロセスの主導) で MVP を実装し, リリースすることができました. # 技術選定 企業規模, また, 経営的にも人的リソースを確保できる状況ではないので, - フレームワークやライブラリは充分に枯れているのを選定する - 開発に関わる人が複数にならないと決められないようなこと (チームメンバーのスキルや経験) に依存しやすいことは避ける 上記の 2 点を意識しました. 具体的には, 既存の Web アプリケーションは Vue.js + Nuxt で実装されていましたが, 現状の Web フロントエンドの技術動向から React + Next.js の方がより枯れていると判断して, 既存資産は使うことをせずゼロベースで実装したり, API スキーマからの型生成もあくまで型定義のみを生成する薄いツール ([openapi-typescript](https://github.com/drwpow/openapi-typescript)) を選定したり (クライアントコードまで生成すると生産性は向上するが, 将来ジョインするメンバーのスキルや経験によっては逆効果になりうるので), ツールで制約できないコーディング規約は作らないといったことです. # そのほか 技術的理想に対して, 教条的になりすぎず, 後回しでよいことやあればよいぐらいのことはやらないようにしました. - Storybook は導入し, コンポーネントの Story ファイルは担保しても, VRT まではしない - そもそもセルフレビューの状態なので VRT の意味がそこまでない. Story ファイルさえあれば, Chromatic などを導入すればいつでもできる - pre commit フックは使わず, CI でフォーマットや型検査を担保する - commit 待ちの時間がもったいない - API スキーマファイルの更新は手動 (Swagger から定義ファイルのみコピーして `openapi-typescript` で生成する) - 将来的にはパッケージ化するなどして自動化したいが, 現状, バックエンドも人的リソースが少なく, 頻繁に API の更新があるわけではない. また, アプリで使われている API がほとんどのため, 新規に追加されるスキーマもほとんどないので.

2022年/3ヶ月以内

Web でのクレジットカード登録・決済システムの実装

# 概要 GMO PGマルチペイメントサービスを利用した, 各保険会社ごとの (マルチテナントごとの), Web でのクレジットカード登録・決済システムを実装 ## 実装上の大変だった点と属人化の防止 まず, クレジットカード決済に対する基本知識の習得を元に, GMO PGマルチペイメントサービスの決済フロー (例えば, 3Dセキュア2.0 対応と未対応での決済フロー (API リクエストのフローの違い) であったり, GMO が提供する SDK (クラインアント側での POST 処理の詳細の理解, 例えば, SDK では Fetch API などによる Ajax で `Content-Type: application/json` による POST リクエストではなく, `HTMLFormElement` による `Content-Type: application/x-www-form-urlencoded` が決済フローとして実行されていることをトレースしたり, またそれに合わせて, 自社側の API 側のコードをリーディングして, レスポンスの `Content-Type` を修正したり, 決済終了後の `iframe` へのレスポンスから, 親フレームへの `postMessage` で, 決済のウィンドウを閉じるなど, 非常に複雑な仕様を読み解きリリースまで問題なく遂行したこと, また, 一人での実装であったので, Web フロントエンドメンバーへの仕様・実装の共有をして, メンバーの誰もが, 最低限, 何を知っていればいいか, どこが実装において重要な点かを共有し, 属人化させずその後の追加対応などを他のメンバーに担当できるようにしました.

2021年/半年以内

Web アプリケーションのリニューアルと Web アクセシビリティの向上

# 概要 [TIPSTAR](https://tipstar.com) のリニューアル (主に, デスクトップ版対応) にあたって, Web アクセシビリティを Lighthouse の計測で 40 から 98 まで向上させました # 意識したアクセシビリティのポイント リニューアルに関わったメンバーは Web アクセシビリティにあかるいわけではなく, また, リニューアルも人数に対して工数がかなり多かったことから, できればこうありたい Web アクセシビリティの指摘よりは, マストな Web アクセシビリティを意識してコーディングしてもらえるように, レビューをとおして, 以下のポイントを主に重視しました. - 適切なマークアップ (例えば, クリックしてダイアログが開くなら, `button` を使うなど) - 画像の `alt` 属性 (説明が必要ならつける, 隣接する場所にテキストがあったり, 装飾的な画像であれば不要) - WAI-ARIA 属性 (特に, 装飾的なテキストでは `aria-label`, 装飾的な要素には `role="presentation"` をつけるなど)

2017年/2年以上

UI コンポーネントライブラリと動画ストリーミングライブラリを利用した HLS 動画プレイヤーの実装

# 主な成果 ## ブラウザの Autoplay Policy (ユーザーアクションがない場合, ミュート状態でないと自動再生不可) に対する対応 下記のような挙動の特徴を発見しそれに対応する実装をした結果, Autoplay Policy のあるブラウザでもベストエフェオートな自動再生を可能にすることができました. - Safari のみボリューム・ミュートともに 0・オフにしないとミュート状態とみなされない - 1 度自動再生に失敗しても何度か再生を試みると自動再生できることもある - SPA の場合, ページ遷移のためのユーザーアクションが動画プレイヤーへのアクションとみなされて, 事実上, ミュートしなくても自動再生可能 (ただし, 動画プレイヤーのページでリロードした場合は, ミュートが必要) ## Storybook を利用した動画プレイヤー UI コンポーネントの管理 個別顧客用に新規動画プレイヤーを実装することになった案件で, 既存のプレイヤーは技術負債のかたまり (テストコードもなし) だったのでそれをそのまま使うことはせず, [Storybook を利用しながら 1 つ 1 つの Vue Component の動作を確認しつつ, Atomic Design にそってリファクタリングしました](https://medium.com/paronym/%E3%83%91%E3%83%AD%E3%83%8B%E3%83%A0%E3%81%AE-web-%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%81%AE%E8%AA%B2%E9%A1%8C%E3%81%A8%E6%94%B9%E5%96%84-3311a3468ec7). その結果, 既存のコードでは video.js にべったり依存していたのが, 容易に他のストリーミングライブラリ (hls.js など) に差し替え可能になりました. ## hls.js へのコントリビュート - [v0.12.4 の hotfix](https://github.com/video-dev/hls.js/releases/tag/v0.12.4) - [webpack 4.x + TypeScript コンパイラへの移行](https://github.com/video-dev/hls.js/pull/1762)

2017年/1年以内

Web アプリケーションのアーキテクチャ刷新

# 概要 Flux フレームワークである [Flummox](https://github.com/acdlite/flummox) が開発停止になってしまい, そのままでは, React のバージョンアップに対応できないなどのリスクが生じたので, 別の Flux フレームワークを使い, アーキテクチャ刷新をすることになりました. # Redux 選定の理由 もっとも大きな理由は, Flummox から (`Store` が複数, or 1 つという違いなどはあれ) 移行しやすいということでした. 移行のしやすさを最大の理由にしたのは, ビジネス制約上, リソースを大きく割くことはできなかったことがあげられます (実際, このアーキテクチャ刷新と同時並行して, 新機能の実装も進んでいました). 他の候補としては, MobX がありましたが, すでにあるプロダクトを刷新する (新規プロダクト実装ではない) ということから, メンテナンス性が高いという点でも Redux に分がありました (記述は MobX より冗長になりますが, その分自由度が少なく, 誰が実装しても同じようなコードになる). 実際, このメリットは大きく, リリース時期が迫るにつれ, より多くのエンジニアが参入しましたが, コストをほとんど要さずに, スムーズなジョインを可能にしました. # 調整力と評価 リリースが迫るにつれ, ディレクターやテスター (実機確認者), インフラ担当者, また, プロダクトのリブランドが最重要で動いていたこともあり, 様々な人と協調する調整力が要求されました. 結果としては, 最重要のリブランドのリリースに支障をきたすことなく, また, 既存のバグ以外は, 一切のバグなしという無事故リリースを実現することができました. また, 既存コードには, テストコードが存在しませんでしたが, Action / redux-saga (Web API との通信処理) / Reduer のテストコードも追加し, 以前よりいっそうメンテナンスの高い Web アプリケーションにすることができました.

2017年/3ヶ月以内

Service Worker の導入と Web Push 通知機能の実装

# 概要 生放送サービスに関わっていたときに, デスクトップでもリアルタイムで番組開始通知を受信できることで番組視聴数を向上させることを目的に実装. ちなみに, わたしが社会人エンジニアになってから, 1 人でまとまった機能を実装したはじめての実績となります. # Service Worker Web Push に先立って, Service Worker の Cache を導入し, [パフォーマンス改善](https://developers.cyberagent.co.jp/blog/archives/6057/), また, サービスの PWA 化などを実現しました. 特に工夫したこととしては, CircleCI でビルドされたタイムスタンプをキャッシュ対象のアセットのパスに使うことで, リリースしたときには必ず Service Worker の Cache が更新されるように自動化しました. # 最も大変だった実装 実装した当時は, Web Push 自体は普及初期ともいえ, ブラウザ自体にバグがあり (特に, Web Push 通知許可を求めるダイアログの表示や, 通知許可・通知拒否をしたときの挙動が必ずしも仕様に沿っていなかった. 例えば, 通知はブロックされるが, `Notification.permission` の値が `'default'` (通知を許可している状態でも, 拒否している状態でもない) になるなど, 結果として, 通知状態と UI が整合しないということが最大の問題でした), それらの挙動を調べあげ, ユーザーが使用する上で問題のない, つまり, 通知状態と UI の整合が保たれた状態でリリースすることができました ([FRESH! における Web プッシュ通知機能 〜実装編〜](https://developers.cyberagent.co.jp/blog/archives/9662/)).

2012年/2年以上

Web Audio API ライブラリ XSound

# 概要 **オーディオ技術のないエンジニアにも, ブラウザでオーディオを扱える**というコンセプトで実装し始めた [Web Audio API ライブラリ](https://github.com/Korilakkuma/XSound). 現状, Web Audio API はある程度オーディオ処理を抽象化した JavaScript API ではありますが, (例えば, `BiquadFilterNode` のようにデジタルフィルタの詳細を知らなくても 8 種類のデジタルフィルタが利用可能となっています. ところが, 本格的なオーディオ処理をするためには, 結局のところ, オーディオ技術が必要になります (例えば, フェイザーというオーディオ処理を実装するには, 基礎的なオーディオ技術をもとに, `BiquadFilterNode` を組み合わせる必要があります) . XSound は, Web Audio API をさらに抽象化し, - 直感的な記述で実装できる - オーディオ技術がなくてもある程度の機能が実装できる 以上 2 つを実現したライブラリとなっています. また, 将来に渡って, 破壊的な変更を最小限にできるように, **ライブラリ・フレームワークに依存しない**実装となっています. # 機能リスト - サウンドの生成 - ワンショットオーディオ (ピアノの音など) の再生 - 楽曲データの再生 - WebRTC からの音声取得と加工 - MML (Music Macro Language) による自動演奏機能 - サウンドエフェクト処理 - 波形描画 - WAV ファイルの動的生成による録音機能 - WebSocket によるバイナリメッセージング機能 - Audio Sprite (オーディオの部分切り取り) [XSound.app](https://xsound.app/) はライブラリの機能をほとんど網羅した Web アプリケーションです. # プロダクトの内容と設計 - オーディオ信号処理の理解や Web Audio API のやや奇怪な API を抽象化し, 簡単に Web オーディオプログラミングを可能にする - ネイティブアプリケーションの移植ではない, Web Music アプリケーションの創造をサポートしたい - これまで, 多くの Web Audio API を利用した Web アプリケーションがネイティブアプリの移植に過ぎない - **Web** をオーディオプラットフォームにする理由として弱い (インストール不要, クロスプラットフォーム対応などは技術的優位性とは言えない. 特に, 音楽用途の場合, 0.025 msec ~ 0.05 msec 程度の精度が求められる. それよりレイテンシーが長くなると, 音楽として成立しなくなる) - **Web** をオーディオプラットフォームにする最大のモチベーションは, ネイティブアプリにとらわれないアイデアだと考えている (例えば, どんなに WebAssembly でネイティブに近いパフォーマンスを実現しても, Web であるが故の制限 (例えば, `SharedArrayBuffer` の複雑な制限) や, I/O 関連の最適化は難しい. 例えば, Web MIDI API などは Working Draft のまま長い間仕様すら更新されていない). そのアイデアの試行錯誤を形にするきっかけやヒントを与えることが目的 - したがって, 特定の目的があるプロダクト, 例えば, Web DAW などを作成する場合には向かない. それ専用のライブラリを使うことを推奨している (howler.js, Tone.js, Tuna.js など. たまに質問を受けることがあるが, そのように回答している) - しかしながら, 理由としてはあとづけで, もともとは [XSound.app](https://xsound.app/) の制作において, UI とオーディオ信号処理の分離, すなわち, ビューとロジックの分離を進めているうちに, いつしか (2013 年半ばぐらいから ?) ライブラリとして再利用可能なプロダクトになっていた (ちなみに, git でバージョン管理もできていない頃の[最初期のバージョンは公開している](https://xsound.app/v201210/index.html). ソースを見るとあきらかに, UI とオーディオロジックの分離ができていない) - 音源の抽象クラスである, `SoundModule` に必要なオーディオ処理を集約して, サブクラス (個別の音源, 例えば, オシレーターやノイズ, 楽曲データ, WebRTC からの音声など) において, 必要な処理を override, また, 個別に必要なオーディオ処理を実装 (例えば, ノイズサプレッサーなどは `StreamModule` (WebRTC からの入力音をソースとするモジュール) でしか使わないので, `SoundModule` では実装していない). これが基本設計であり, 結果として, テンプレートメソッドパターンになっている. 端的には, - 抽象クラス `SoundModule` のオーディオ信号処理をもたせる - サウンドソースに応じたサブクラスで必要に応じてメソッド定義 - MML (Music Macro Language) は例外的で, MML のパースと, 委譲された (DI された), `SoundModule` のサブクラスをパース結果の音楽演奏情報にしたがって, 自動演奏を実行する (また, `SoundModule` を継承しない). ## どういう考えでコードを書いたか、なにに注意したか - 音源は異なっても (`X` 関数で取得する `SoundModule` のサブクラス), 可能な限り同一の API (メソッド) を提供する - `setup` (アプリケーション起動時に必要な初期化処理) - `ready` (再生前に必要な処理. スケジューリングなど) - `start` (再生) - `stop` (一時停止) - `param` (パラメータの取得・設定) - `module` (モジュールを取得して, アクティブ状態にしたり, パラメータを設定したりする) - Web Audio API における `AudioNode` の複雑な `connect` (モジュラールーティング) を抽象化する重要なメソッド - これらは, サブクラスごとにシグネチャが異なるので, 抽象メソッドにして実装を強制できていないのは課題 - 実装もれを人力チェックするのは少々しんどい - `SoundModule` に共通するオーディオ処理を集約して継承する - 一般的には, 継承より委譲のほうが結合度が低くなり, モジュールの独立性としては高くなるが, アプリケーションコードが簡易になるように継承 (テンプレートメソッドパターン) を採用している (version 1.0 から, 現在のバージョンまで変わらない) - 委譲にすると, アプリケーションコード側で必要なモジュールを委譲 (DI) する必要があり, アプリケーション側で必要な実装が多くなる. また, 少なからず, オーディオ信号処理の理解が必要になる可能性が高くなる. - 開発開始当時 (2012 年), 一般的に使われていた jQuery のような記述で使えるようにしたいという漠然とした理由もある - ただし, 代償として, ライブラリ側では `SoundModule` が肥大化してしまっているので, サブクラスでボイラーテンプレートのようなコードや, ボイラーテンプレートのような単体テストがたくさんあるのは問題点としてある ## 工夫した点、苦労した点など ### アーキテクチャレベル - 継承関係を検討する - 例えば, `AudioModule` と `MediaModule` は同じような機能をもっているので, `MediaModule` を `AudioModule` のサブクラスにすることも考えたが, 継承の継承はさらに結合度が高くなる (モジュールの独立性が低くなる), また, 実装が増えても, アプリケーションコードには影響がない. - 委譲で問題ないモジュールは継承させない (例 `MML` クラス) ### Recorder - 録音データでメモリを不要に使わない (`number[]` ではなく, `Float32Array[]` に格納する) - ミキシング処理 - 各録音ラインの, 左右チャンネルで `Float32Array[]` のトラックを, `Float32Array` にフラット化 - 各録音ラインの, チャンネルごとの合成・平均化 (オーディオ信号処理におけるインターリーブ処理) - 量子化ビット 16 bit の場合の WAVE ファイル生成 (リトルエンディアンでデータを格納する必要がある) - ビット演算で, 下位 8 bit を先に配列に格納 - シフト演算して, 上位 8 bit を次の要素に格納 ### MML (DSL) - 大量のパラメータをアプリケーションから与えるのではなく, 言語を与えて目的を達成する - 正規表現の問題解決のアプローチと同じ - 自身が初めて実装した言語処理型 (正規言語, 有限オートマントで受理可能な文字列) - 初期の実装では, トークナイズや抽象構文木の生成はせず, 正規表現で音楽情報に変換していた - 抽象構文木の設計 - 左部分木は常に数値 - 右部分木に進むほど, 音楽的な時間も進む (木のレベルが大きくなる) - 一般的に, 探索に不利な木構造 (クイックソートが最悪計算量になるような木構造) であるが, 目的は (実行前の) 音楽情報への変換なので問題ではない - むしろ, 右部分木が深くなるほど, 音楽的な時間も進んでいるという情報を表現しているので適している - ABC 記譜法へのトランスパイル - abc.js によって SVG による楽譜が出力できる - ただし, このトランスパイルは正規表現による変換なので, こちらも抽象構文木を生成して変換できるようにしたい (ABC 記譜法のほうが, より多くの音楽表現ができるので, 言語仕様の拡張が十分にありうる) - ハイライト処理. 実装自体は難しくないが, HTML としてあつかう必要があるので, パフォーマンスを考慮して, ハイライト処理を OFF にできるようにしている (マシンスペックが低い場合などを考慮). - 同様の考えは, ビジュアライザーにもあり, Canvas や SVG への描画のアニメーションは, 少なからずパフォーマンスを落とすので, スペックの低いマシンでの利用を想定して, OFF にできるようにしている ### ScriptProcessorNode から AudioWorklet への移行 - ライブラリなので (CDN としても使えるようにしているので), 1 ファイルにまとめるためにハッキーな実装を試行錯誤 (バンドラーで `/^.+Processor$/` で終わるクラスを識別し圧縮しないようにする). - `AudioWorkletProcessor` のサブクラスを定義して, `toString` で文字列にして, Data URL で `addModule` する. - そのまま, バンドルすると, メインスレッドのコードとしてまとめられてしまうので, 上記のようなバンドラーの設定で解決 (できればしたくはなかったが). ### オーディオ信号処理の理解 TypeScript など Web フロントエンド関連の技術と Web Audio API を理解しているだけではここまでの実装はできないと思う. 少なからず, オーディオ信号処理を大学院での専攻としていたことが活きている ### 2012 年 10 月から現在まで モチベーションはその時々で変わってきたが, 12 年近く, 機能追加やバグフィックス, リファクタリングを続けて, また, Web フロントエンド技術のエコシステム (npm によるパッケージ管理, TypeScript による型システム・型検査, ドキュメントの自動生成や, ESLint による潜在的なバグの autofix など) をあわせてバージョンアップを続けてきたこと. #### 技術スタックの刷新 [Release note](https://github.com/Korilakkuma/XSound/releases/tag/v3.0.0) - TypeScript 100% - Enable to use ATA (Automatic Type Acquisition) - Improve code quality - Type check - Use Jest instead of Jasmine & Karma # 実績・評価 [v1.x.x のリポジトリ](https://github.com/Korilakkuma/XSound.js) のスター数と合算すると 200 を超えており, これはニッチな Web Audio API ライブラリというドメインにおいて, メジャーな部類に入ると言えます. 実際, [9 libraries to kickstart your Web Audio stuff](https://dev.to/areknawo/9-libraries-to-kickstart-your-web-audio-stuff-460p) で, 9 つの有用なライブラリの 1 つ取り上げられており, > XSound is a batteries-included library for everything audio. From basic management and loading through streaming, effects, ending with visualizations and recording, this libraries provides almost everything! It also has nice, semi-chainable API with solid documentation. - オーディオ処理のほとんどすべてを実装している - 堅実な [API ドキュメント](https://xsound.jp/docs/)がある 上記 2 点が評価されています. また, 国内を代表するエンジニアの方からも[評価を受けています](https://twitter.com/voluntas/status/1059810428199493637).

マネージメント能力

- 開発スケジュールと機能のスコープの選定 - QA プロセスのマネジメント
期日までに, 前任者などが誰一人いなく, ドキュメントもなく, コードも断片的につぎはぎされたような状態 (リリースプロセスなどもなく, ほぼ放置状態) から, 仕様を把握して, 技術選定・設計, 実装・リリースおこなうこと
既存のコードをリーディングするには限界があり, リニューアルにあたっての MVP (Minimum Viable Product) を以下のように整理して (また, ビジネス的な理由上, 3 ヶ月間でリニューアル版としてリリースする必要がありました), それを補完するために既存のコードや挙動をかいつまんで進めました. - アカウント作成ができる - ログインができる - アカウント情報が編集できる - ユーザーページが閲覧できる - 検索やフィードなどコンテンツ回遊の導線ができる - 動画・オーディオの視聴ができる - オーディオファイルがアップロードできる また, MVP を意識して, UX 的なことは削ぎ落としたり (例えば, 検索では当初の予定では, さらにフィルタリングができる想定), デザインに時間を要するところはデザイナーと相談して簡素な UI に変更してもらう (例えば, カルーセルは横スクロールにしてもらうなど) などしてこれ以上削ぎ落とせば, サービスとして成立しないぐらいの実装コストを減らして, 実質 2 ヶ月の実装時間 (残り 1 ヶ月は QA 項目の作成, QA 対象の OS とブラウザの選定, QA プロセスの主導) で MVP を実装し, リリースすることができました.

アピール項目


アウトプット

GitHub アカウント
あり
Qiita アカウント
未入力です
Zenn アカウント
未入力です
Speaker Deck アカウント
未入力です
SlideShare アカウント
未入力です
特にアピールしたいアウトプット
あり

今後、身につけなければいけないと思っている技術は何ですか?

1. 「AI 駆動開発」時代におけるソフトウェアエンジニアの必須スキル (ただ, 具体的にそれが何か ? まで, まだわかっていない. それがわかるようになるのも 1 つの技術) 1. 小さなドメインでも問題を解決できる, AI を実装できるスキル (作曲 AI など興味のある分野で最小限のものでいい) - 解析数学に追加して, 線形代数や確率統計の基礎数学 - 機械学習・深層学習のアルゴリズムの理解と実装 1. オーディオ信号処理とローレイヤーでのオーディオプログラミング (ALSA など), 音楽理論 (作曲生成 AI 自作のためでもある) *業務での関連が高い順にソートしています

あなたが一番パフォーマンスを出せるのはどんな環境ですか?

- AI 駆動開発が中心になりつつも, エンジニアが「学ぶ過程」の大事さを理解して, 自らコーディングする体験も大事にしている環境 - 勤怠の自由度が高い, マイクロマネジメントされない - 持病があるので, それに対して, ある程度の理解をしていただける

生成AIの活用状況

日常的な情報収集・業務活用
ChatGPTやGeminiなどのチャットツールを、情報収集、ドキュメント作成、翻訳に日常的に活用
業務でコード補完系の生成AIを活用
GitHub Copilot等のコーディング支援ツール
業務でコード生成、コーディングエージェント系の生成AIを利用
コードレビュー、テストコード生成、デバッグに生成AIを活用

キャラクター

直近で一番やりたいこと
現場にいたい
好きなスタイル
一人で黙々
どちらかといえば一人で黙々
どちらともいえない
どちらかといえばみんなでワイワイ
みんなでワイワイ
好きな規模
小さい会社
どちらかといえば小さい会社
どちらともいえない
どちらかといえば大きい会社
大きい会社
水とプログラミングどっちが大事?
自信を持って人より秀でていると言える点
学習能力 / プレゼン力 / 問題解決力
スキルのタイプ
ゼネラリスト
どちらかといえばゼネラリスト
どちらともいえない
どちらかといえばスペシャリスト
スペシャリスト
得意なフェーズ
0 → 1
どちらかといえば0 → 1
どちらともいえない
どちらかといえば10 → 100
10 → 100
会社を選ぶ一番の基準
プライベートとの両立
やりたくない分野
SI / 医療・介護 / 人材 / ファッション / アダルト
その他の特徴
レガシーな環境を改善できる / 多職種のバックグラウンドがある
その他のやりたいこと・やりたくないこと

- ギャンブル
- 受託開発
- ネイティブアプリケーション (iOS, Android アプリケーション)

やりたい事

手を動かして設計してコードを書きたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
価値あるプロダクトを作り成長させたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
学び続けて技術力でプロダクトに貢献したい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
意義があることや社会に貢献できる仕事がしたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
人や計画の調整・マネジメントをしたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
レガシーなシステムの保守・運用・改善をしたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
企画や仕様を考えるところから関わりたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
業務効率を改善して一緒に働く人のためになりたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
全社横断的な共通基盤作りや強化をしたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい
組織や文化を作る・成長させる仕事をしたい
絶対やりたくない
あまりやりたくない
別に普通
やりたい
絶対やりたい

基本プロフィール

年齢
今年で40代前半
好きなテキストエディタ
vim
希望勤務地
東京都 / 大阪府 / リモート勤務
集まる必要性がない場合は基本リモートが許可される環境が必要
希望年収
720万円
ご意見箱

要望、不具合報告、使いづらい点や感想など、お気軽にお寄せください。
いただいたご意見は、今後のサービス向上に活用させていただきます。

なお、このフォームは受付専用のため、返信を行っておりません。
返信を希望する場合はお問い合わせよりご連絡ください。

  • {{error}}
転職ドラフトを友人や同僚に薦める可能性はどのくらいありますか?