アイビスの
モバイル事業部とは?
モバイル事業部では、世界でダウンロード数4億※を超える大人気お絵描きアプリ「ibisPaint(アイビスペイント)」と、その公式作品投稿サイトである「ibispaint.com」の運営を行っています。
※2024/05時点の数値
ibisPaintアプリとサービスの品質を高めるための専門的技術を持つスペシャリストであると同時に、設計・アプリ開発・Web開発・テスト・サーバ構築と運用など、様々な種類の業務をこなすことができるジェネラリスト(フルスタックエンジニア)でもある、高度な能力を持つ人材を育むことを目指しています。
ミッションは
〝多くの人にお絵描きの楽しさを届ける〟
こと
「多くの人にお絵描きの楽しさを届ける」ことをミッションに、私たち開発エンジニアはibisPaintの開発・運営を行っています。
私たちが目指すポイント
- ほぼすべての機能が無料で使えること
- (ibisPaintは広告収益モデルを採用)
- 多くの言語にアプリをローカライズすること
- (日英含め19ヶ国語にローカライズ)
- 多くのスマートフォン、タブレットで動作すること※
- ※:例えば、Androidではバージョン5.0以降に対応しています。Android 5.0は2014年にリリースされた古いバージョンですが、世界で見るとAndroidユーザの0.1%は今だバージョン5.0を使っています。OSのバージョンが低い端末は計算能力や搭載RAMサイズが低い場合が多いですが、そうした端末でも快適に動作するよう性能の良いプログラムを書くようにしています。
- 初心者が挫折することのない、使いやすいアプリであること
- 初心者でもヘルプを参照することなくアプリを使えるよう配慮された、直感的なユーザインターフェースであること
- アプリに慣れてきた中級者が快適に絵を描けるよう配慮された、効率的なユーザインターフェースであること
- 上級者が必要とする高度な機能の提供を行うこと
- イラストの制作工程が閲覧でき、絵の書き方が学べる公式作品投稿サイト「ibispaint.com」を充実させること
これらを実現すべくトライ&エラーを重ねた結果、ibisPaintの累計ダウンロード数は2024年に4億回※を突破し、世界中の様々な国のユーザを持つアプリへと成長することができました。
※2024/05時点の数値
ibisPaintの開発エンジニア
の具体的な業務
- ❶ ibisPaintアプリ、あるいはWebサイトの新機能の実装
- 新機能の設計書をもとに、実装を行います。
- ❷ ibisPaintアプリ、あるいはWebサイトの不具合修正
- 社内でのテストやユーザの報告、クラッシュレポートにより発見された不具合の調査・修正を行います。
- ❸ テスト
-
他の開発者が実装した機能の単体テストや、既存の機能を含めたアプリの様々な機能を使いつつ不具合を探すアドホックテストを行います。※2
※2:ibisPaintの開発チームには、テスト専門の「テスター」はおらず、プログラマ自身がテストを行います。プログラマのほうが不具合発見率が高く、不具合を見つけてから調査までの流れもスムーズであるためです。 - ❹ コードレビュー
- 他のプログラマが作成したプルリクエストをレビューし、問題のある場合は修正指示を行います。
- ❺ メンター、研修トレーナー
-
主に、後輩の教育です。
プログラミングのノウハウについて教えるのはもちろん、IDEやGitの使い方、開発フロー(ブランチやチケットの管理方法)、会社のルール、コミュニケーションの方法等、業務を円滑に進めていくために必要な様々な知識について指導します。 - ❻ 設計
- プロダクトマネージャから与えられた要件を元に、機能の設計(ユーザインターフェースの設計、ファイル設計、クラス設計、アルゴリズムの検討など)を行います。
- ❼ 技術勉強会への参加・発表
- 開発チームを盛り上げるため、技術勉強会での発表を行います。聴講者として参加する場合は、発表をよく聴き、発表後の質疑やディスカッションに積極的に参加することが求められます。
ibisPaintの開発のやり方とは?
<開発>
ibisPaintアプリ開発のメインのプログラミング言語はC++です。OSのAPIを呼び出すために、Objective-CやJavaを利用する場合もあります。また、並列性の高い画像処理を実装するためにOpenGLを使用しています。Webサイトの開発では、JavaとTypeScriptを使用します。データベースはMySQLで、フロントエンドのフレームワークとしてReactを使用します。
ibisPaintアプリ、Webサイト、いずれもチームでの開発であるため、第一に可読性・保守性・拡張性の高いコードを書く必要があります。次に重要なのが、仕様通りに動作するプログラムであることです。
「順序が逆では?」と思われるかもしれませんが、この順で意図通りです。ibisPaintは既に軌道に乗っているプロダクトのため、長期間に渡って開発を続けていくことが確定しています。仮に、誰かが「他の人の半分の時間で実装できるから」と可読性・保守性・拡張性の低いコードを書いてしまうと、将来に渡って残りのメンバーの足を引っ張り続ける負の遺産となり、「時間が倍かかってでも、他の開発者に実装してもらったほうが良かった」という事態になってしまいます。
また、性能の良いアプリケーションを目指しているため「適切なデータ構造・アルゴリズムを選択しているか」などの計算量オーダーの最適化と、「無駄なコピーを発生させていないか(適切にムーブされているか)」、「無駄にメモリ確保をしていないか」、「無駄にキャッシュミスを発生させていないか」といった計算量の係数に配慮しながらコードを書きます。
現在のスマートフォン、タブレットでは、メモリを確保するとメモリスワップが発生するのではなくアプリがキルされるものが多いため、計算速度だけではなく、メモリ効率についても注意を払う必要があります。
可読性・保守性・拡張性とパフォーマンスがトレードオフになるような箇所では、書いている関数の呼び出し頻度などを基に、ちょうどよい塩梅を選択するバランス感覚が必要とされます。
<コードレビューと教育>
品質の高いコードを生産するため、共有ブランチへマージする前に、必ず先輩の開発者のコードレビューを受けることになります。そして、良いコードが書けるようになってきたら、コードレビューする側にまわり、後輩の育成、社内教育にも携わってもらいます。
<不具合修正>
社内でのテストやユーザの報告、クラッシュレポート等により発見された不具合の調査・修正を行います。再現性のある不具合であれば修正をするのは比較的簡単ですが、ほとんどが再現方法不明な状態からスタートします。ログを見て再現手順を確立したり、起こり得ないと思われているスタックトレースとコード(場合によってはコンパイル後のアセンブラコード)を照らし合わせて、何が起きているのかを突き止めたります。
一見、地味な仕事に見えるかもしれませんが、ユーザ体験を高めるためにとても重要な作業です。また、少ない情報を元に不具合の原因を推理する作業は、実際にやってみると楽しいものです。C++やclangやメモリ確保戦略について、知識を総動員して原因を突き止められると、まるでハッカーになったかのような気分を味わうことができます。
<設計>
ibisPaintのモットーは「高度な機能を、使いやすいユーザインターフェース(UI)で提供すること」です。そのために、機能の設計、特にUIデザインに全力を注ぎます。
UIデザインを行う際は、ユーザの行動や心理をよく推測しなければなりません。
- ある操作を行うための操作の回数を一回でも減らせるように配慮する
- 各種コントロールの使用頻度を推測し、よく使われるものを目立つ場所に配置する
- 操作ミスをしづらいようにボタンを並べる、操作ミスをしたときの取り消しが容易になるようにする
- 画面に表示される文字列を1単語ずつ丁寧に選択する
直感的にわかりやすい平易な単語を選択すべきか、それとも専門的だが画像処理業界で標準となっている単語を選択すべきかを考えます。
このようにユーザの目線に立って設計を行います。
また、ツールの快適性にはUIへの高速なレスポンスが必要不可欠なため、設計の段階でアルゴリズムの方針や処理を実行するスレッドについても検討します。最後に、こだわりすぎない、作り込み過ぎないことにも注意して仕上げます。常にコストパフォーマンスに配慮します。
<コミュニケーション>
チームで仕事をするにあたって、コミュニケーションはメンバーのスキルやモチベーション、ひいては製品のクオリティにも大きな影響を与えます。
特に、ibisPaintの開発チームは東京本社と名古屋本社に分かれているため、チャットやWeb会議を使った頻繁かつ迅速なコミュニケーションが欠かせません。ツールはMicrosoft Teamsを使用しています。
<技術勉強会>
チームメンバーが仲良くなる場、雑談をする場、興味の対象について共有する場、向学心を掻き立てるための場として、技術勉強会を開催しています。
発表者が自身でテーマを選択し、30分程度の発表を行ったあと、参加者からの質問を受けたり、テーマについての議論を行ったりします。大学のゼミでの発表のようなものが近いイメージです。
勉強の場というよりコミュニケーションの場であると考えているので、テーマ選択についての制限はかなりゆるく設定しています。「趣味でこんなプログラムを書いています」「今こういう論文を読んでいます」「こんなアルゴリズムを発明しました」など、最近の自分の技術的アクティビティを紹介する発表が多くなっています。
とは言え、個々人が自分の得意な分野からテーマを選ぶため、発表内容のレベルはかなり高くなっており、時に話の内容についていくのが大変なこともあります。ですが、たとえ内容が理解できなくても「周りの人はこんなに勉強しているなら自分も勉強しないと…!」という焦りや緊迫感を持つだけでも、メンバー全員の学習意欲が高まり、良い効果を与えるのではないかと考えています。
【勉強会テーマ例】
<理論>
- ディープラーニングからトップダウンでみる脳の仕組み
- イラスト画像に特化した画像圧縮アルゴリズム
- 非斉次距離マップ計算のアルゴリズム
- 線画抽出のアルゴリズム
- ハミルトニアン・モンテカルロ法
- 量子アルゴリズム
- プログラミング言語と圏論
- 論文紹介:Linear Haskell
- 論文紹介:Exponential expressivity in deep neural networks through transient chaos
- ブロックチェーン
<実験・実装>
- C++ベンチマーク
- Rustでモンテカルロ・パストレーサーを書いてみた話
- パーサコンビネータについて
- サウンドエフェクト
<技術解説>
- Gitについて
- UWPアプリについて
- C++/WinRTについて
- IPv6について
- Reactについて
- Vue.jsについて
- C++のムーブセマンティクス
- C++のメモリモデル
- C++のコルーチンAPI
- C++の同期プリミティブ
- プログラミング言語Rustの紹介
- JavaScript V8エンジンと最適化
<お絵描きアプリ開発>
- 絵画の理論
- 『誰のためのデザイン』を読む
- 色覚異常について