key | value |
---|---|
Name | Yosuke Tamaoki |
@tamapppe | |
Qiita | tamappe |
Blog | Tamappe Life Log |
-
プログラミング言語
- Objective-C(2013年〜)
- Swift(2015年〜)
- Dart/Flutter(2020年〜)
- Java(2017年〜)
- Kotlin(2018年〜)
-
日本語
- ネイティブ
-
英語
- Reading: ビジネス英語/技術英語が読める
- Writing: ビジネス英語/技術英語が書ける
- Listening: ディスカッション以外の1on1の英会話ならできる
- Speaking: かんたんな日常会話ができる
iOSDC 2021
async/awaitの性能をDartとSwiftとの比較で読み解く
iOSDC 2020
目次
番号 | プロジェクト名 | 期間 |
---|---|---|
No. 8 | モバイルSDKの保守運用 | 2022/4 - 現在 |
No. 7 | オンライン英会話系アプリの開発 / AI活用のスピーキング測定アプリの開発 (レアジョブ) | 2019/4 - 2022/3 |
No. 6 | 大手医療系メディアのアプリ開発 | 2018/5 - 2019/3 |
No. 5 | 動画配信系アプリの開発 | 2017/10 - 2018/4 |
No. 4 | マッチング系アプリ開発 | 2018/1 - 2018/10 |
No. 3 | IoT系iPadアプリの保守と運用開発 | 2017/4 - 2017/12 |
No. 2 | コンシューマー向け電子書籍のマンガアプリ開発 | 2016/5 - 2017/1 |
No. 1 | 新規事業向け新規アプリ開発 | 2015/5 - 2016/3 |
2022/4 - 現在(2024/12)
モバイルSDKの開発プロジェクト (LINEヤフー)
正社員
モバイルアプリケーションエンジニア
Swift (iOS)
Kotlin (Android)
- 常に両方
全体のチーム: 10名規模
SDKチーム
アプリエンジニア 3名(iOS 1.5名, Android 1.5名)
BEチーム
データエンジニア 6名以上
全体のチーム: 15名規模
SDKチーム
アプリエンジニア 5名(iOS 2.5名, Android 2.5名)
BEチーム
データエンジニア 9名以上
Xcode, Android Studio, Github Enterprise, Slack, fastlane, Screwdriver.cd
Jira
メインタスクは社内モバイルSDKの保守・運用であり、以下のカテゴリに分類されます。
- 通年の業務
- 2022年 Android SDK の開発・運用
- 2023年 iOS SDK の開発・運用サポート
- 2024年 チームビルディングと改善
- 通年のOSやライブラリのアップデート作業
- CI/CDの整備: Snykの見直しを実施し、依存ライブラリのライセンスを全てチェックすることで、配布SDKの品質を保証。SnykをCI/CDに統合することで、不具合やセキュリティ問題がないことを自動チェック可能に。
- SDK不具合対応: 問い合わせに迅速対応し、意図しない挙動を修正。
- コードレビュー: チームメンバーが作成したコードの品質を保証し、開発効率を向上。
- SDKリリース前の検証: 綿密なテストプロセスを確立し、品質リスクを削減。
- 開発フロー改善: 効率的な開発プロセスを継続的に見直し。
- コミュニケーション: SDK導入サービスの開発者や共同開発チームと緊密に連携。
- 不具合対応: Android SDKにおける想定外の挙動を迅速に修正。
- コードレビュー: 業務委託メンバーの作業も含めたレビューを通じて品質を向上。
- 技術サポート: 業務委託メンバーに対して、SwiftからObjective-Cを呼び出す技術的サポートを提供。
- Swift Package Manager導入: CocoapodsやCarthageから移行し、開発環境準備を簡略化。依存関係管理の効率が向上。
- Deprecated APIの改修: 最新iOS仕様への適応を実現。
- Objective-Cコードの削除: モダンなコードベースに移行し保守性を改善。
- Async/Awaitの導入: 非同期処理を効率化。
- PoC的開発: SDKのデータ取得量を10%増加させ、プロトタイプでの仕様検証を可能に。エンジニアや専属POでないメンバーでもスムーズに仕様策定が可能となり、最適な仕様でのリリースを実現。
- スキル向上支援: 開発メンバーの成長を促進。
- アジャイル開発導入: ウォーターフォール型からスプリント形式へ移行し、開発中の不具合や想定外の問題を改修してからリリースできる体制を構築。不具合件数を大幅に削減。
- ドキュメント整備: リリース作業や継続的開発を支える文書を整備。
-
OSアップデート対応: 毎年のiOSおよびAndroidのOSバージョンアップに対応。
-
iOS 18とAndroid 15への対応:
- iOSではSwift Package Managerの下限OSサポートの調整を実施。
- AndroidではtargetSDKVersionやCompileSDKVersionの更新を行い、対応範囲を最新化。
- 工夫: 他の社内ライブラリとの依存関係で発生する可能性のある問題を事前調査。アプリ内DBのアップデート時クラッシュ防止、ライブラリの難読化対応も考慮。
-
Android SDKのKTSサポート: GroovyだけでなくKTSも対応するよう導入手順書を更新。エンジニアからのフィードバックを基に、より柔軟なSDK導入が可能に。
2019/4 - 2022/3
オンライン英会話系アプリの開発 / AI活用のスピーキング測定アプリの開発 (レアジョブ)
正社員
モバイルアプリケーションエンジニア
Swift(iOS + UIKit)
Kotlin(Android)
Dart(Flutter).
全体のチーム: 30名規模
アプリチーム
アプリエンジニア 2名
サーバーサイドエンジニア 10名以上
Xcode12.3, Android Studio, Github, Redmine, Slack + チャットワーク
Redmine, Jira
メインタスクはレアジョブアプリの保守・運用になります。
タスクの内容をカテゴリー分けすると次のようになります。
- iOSアプリのメンテナンス
- 新規機能開発
- 技術的負債の返済
- OSやライブラリのアップデート作業
- Flutterでのスピーキング測定アプリのフルスクラッチ開発
順を追って説明します。
それぞれ会社の会社のテックブログに投稿しています。 結果的には Swift 3.2 から Swift 5.3まで担当しました。
保守・運用をしながら同時に新規機能を開発していきました。
SkyWayを使ったリアルタイムなオンライン英会話サービスを提供していますので、SkyWayの仕様を把握しながら機能を開発して行く必要があります。
レアジョブアプリは外部ライブラリを多数利用しています。 また、年々iOSがメジャーアップデートしていきますので開発中のコンポーネントのAPIが古くなっていきます。 そのため、こういった古くなったAPIをアップデートするかなければ別のものにリプレイスする必要がありました。 そういった経験を記事にまとめています。
新規事業のスピーキング測定用のアプリをゼロからフルスクラッチで開発しました。
使用した技術は Flutter + MVVM (Riverpod) でのクロスプラットフォームです。
リード兼、メインエンジニアとして開発、リリースしました。
ゼロからリリースまで3ヶ月、そこから6ヶ月間メンテナンス。
このアプリにおける技術選定の話は会社のテックブログでまとめています。
開発で苦労した点.
- 最初はプロトタイプ的に開発し、正式のデザインのない状態での開発スタートで進めましたが途中からデザインが入りました。iOSスマホ用/iOSタブレット用/Androidスマホ用のフォントの調整でだいぶ苦労しました。大きなフォントサイズで当てはめるとスマホでレイアウトが収まらず、小さなフォントサイズで当てはめるとタブレットで小さく表示されてしまうなどしてデザイナーの要求通りのUIの実現が大変でした。
- メインコンテンツに関係する機能が、音声の「再生」「録音」部分でこの部分がライブラリ依存になるためライブラリ側でクラッシュする問題が発生するなどが起きてしまいました。
- 画面遷移がとても厳しく、端末がバッググラウンド復帰した時にトップ画面に戻る遷移を調整したりすることがあるのですが、その戻す遷移が思った通りに実現できないなどの問題がありました。
2018/5 - 2019/3
大手医療メディアのアプリ開発
業務委託
iOS / Android
OS | 言語 |
---|---|
iOS | Swift, Objective-C |
Android | Java8, Kotlin |
サーバーサイド | Seasar2によるJava8 |
全体のチーム: 20名規模
アプリチーム
アプリエンジニア 5名
サーバーサイドエンジニア 5名
Xcode10.1, Android Studio, GitLabCI, Slack + チャットワーク
Confluence, Jira, GitLab
メインタスクはアプリの保守・運用でした。
タスクの内容をカテゴリー分けすると次のようになります。
- Objective-CのSwift化
- Androidアプリの新規機能開発
- iOSアプリの新規機能開発
- モデルクラスのユニットテストの導入
- 技術的負債の解消
一部、アサイン当時一部にObjective-Cコードが残っていました。Swift: Objective-C = 80: 20。
残っていたObjective-CのクラスをすべてSwift化対応する業務を行いました。
当時一番難しい移行作業だったことが、ビットフラグの対応でした。
Alamofireで通信を行われていました。また、JSONのパースをSwiftyJSONで対応されていました。
このモデルクラスにCodableへ書き換えるためにデグレが発生してはいけないので、モデルクラスにユニットテストを導入してリプレイス前後でテストが成功することでデグレが起きることなくCodableへの書き換え作業を完了させました。
実際のコードのサンプル例はQiitaに記事として残しています。
SwiftのAlamofire+CodableでAPIクライアントの作成からUnitTestまでを実装する
本当はモック化させるところまで行えばベストですが、リソースが足りませんでしたので最小限の対応に留めました。 また、一部のクラスでAPI通信にAFNetworkingで行っているところがありましたので、Alamofireに置き換える作業も行いました。
一部にUIWebViewのUIKitコンポーネントが残っていましたので、WKWebViewへのリプレイス作業をしました。 この頃はStoryboardからWKWebViewが使えない頃でしたので、コードでWKWebViewを生成して表示させるといった工夫をしていました。 またアプリ側でJavaScriptを実行したり、ユーザーエージェントを取得する必要があるなど、同期処理から非同期処理に書き換えるといった工夫をしなければなりませんでした。
2017/10 - 2018/4
動画配信アプリの開発
業務委託
iOS
OS | 言語 |
---|---|
iOS | Objective-C |
Android | Java |
サーバーサイド | Ruby |
全体のチーム: 6名規模
アプリチーム
アプリエンジニア 4名 (iOS 2名, Android 2名)
サーバーサイドエンジニア 関連会社が担当
動画配信アプリの設計から開発を担当致しました。決められた仕様に従ってリリースまで担当します。 開発はiOSについてはObjective-C、AndroidはJavaでの開発でした。 できる限り既存の機能が変わらないようにコンバートするため、テストを行ってバグが起きないように努力しました。
2018/1 - 2018/10
マッチング系アプリ開発
業務委託
iOS
OS | 言語 |
---|---|
iOS | Objective-C, Swift 3.2 |
全体のチーム: 30名規模
アプリチーム
アプリエンジニア 10名 (iOS 4名, Android 3名)
サーバーサイドエンジニア 10名ほど
Xcode 9, Github Enterprise
iOSの追加機能開発とSwift化をメインに担当しました。 既存のソースコードの80%がObjective-Cでチーム全体の合意でSwift化を進めたいという希望でしたのでひたすらSwiftへの書き換え作業を行いました。 特に難しいと感じた部分がUtil系のクラスのSwift化でした。 Util系のクラスは色々なクラスから呼び出しがされている傾向が高いためここのSwift化が失敗すると色々な箇所でデグレが発生してしまいます。 こちらのソースコードはまだUITestを導入していなかったフェーズのため手作業でUIのテストをする必要があり多大な時間を費やしました。 この経験からUITestとUnitTestの重要性を感じ始めてテストに関するノウハウを自主的に調べる習慣を身に着けるようになりました。
タスクの内容をカテゴリー分けすると次のようになります。
- Objective-CのSwift化
- iOSアプリの新規機能開発
当時はSwift 3.2の頃でした。比率は Objective-C: Swift = 8: 2。
Objective-Cが残っていると採用面で不利になることが多い理由によりSwift化を推進するプロジェクトを担当することになりました。
当時一番Swift化移行が難航した箇所はビットフラグを使っているクラスでした。
MVCモデルのため、各画面ごとのModel、ViewをSwift化してから、最後にViewControllerのSwift化を行うといった手順を踏みました。
他のメンバーのリソースが足りない新規機能についても担当しました。
デザイナーからSketchファイルを頂き、その仕様に基づいてデザイナーと連携しながら開発を進めました。
2017/4 - 2017/12
IoT系iPadアプリの保守と運用開発
業務委託
iOSアプリケーションエンジニア
業務内容: 既存のiOSアプリの追加機能の開発
iOSはObjective-C
Xcode8
github Enterprise, Confluence, JIRA, チャットワーク
B向けのiPadアプリの追加機能開発のプロジェクトでした。 Bluetoothを使ってプリンターと連携できる機能を搭載しているアプリで私がジョインした時にはプリンタのSDKバージョンが古くなっていたため新バージョンSDKへの書き換え作業を担当しました。 当時はまだObjective-CのコードであったためSwiftとのブリッジが大変手間がかかりました。 このプロジェクトで辛かったことは旧バージョンのSDKの既存クレームでWiFiの接続が悪かったのですが、SDK提供メーカーから新SDKに書き換えたらその性能が上がるという噂がありました。 ですが、実際は期待していたほどの改善が見られませんでした。そこで新SDKへの書き換えからさらにいかにしてWiFi接続不良を改善させるタスクが入ってきたことが非常に大変でした。 大変だったのですが、新SDKのドキュメントを丁寧に確認するとWiFi接続用の新しい関数がこっそり試しにそれを使ってみると仕様をなんとか満たす成果が得られたのでギリギリタスクを完了させることができました。
このプロジェクトを通して得られた知見としてはドキュメントを隅々まで見る習慣をつけることが大切なのだということを体験しました。
2016/5 - 2017/1
コンシューマー向け電子書籍のマンガアプリ開発
業務委託
iOSアプリケーションエンジニア
業務内容: 新規事業のiOSアプリの新規開発
Objective-C
Xcode
Redmine, Subversion
電子書籍アプリの設計から開発、結合テストまでを担当致しました。 開発はObjective-Cでゼロから開発しました。 電子書籍のデータはC++で書かれている外部ライブラリを使用するためアプリに組み込みました。
特に難しいと感じた部分はマンガの画像ファイルをC++のライブラリから取得してネイティブ側に反映させるためObjective-CとC++の連携が非常に大変でした。 そのライブラリを利用してバイナリデータとしてダウンロードしたファイルを 画像に変換して画面に表示させました。
また、画像データのダウンロードの時には暗号化されているためそこでセキュリティについて学ぶきっかけになりました。 このアプリではソーシャルログイン機能が必要でしたのでFacebookとTwitterのSDKを利用して ソーシャルログインの機能を実装しました。
2015/5 - 2016/3
新規事業向け新規アプリ開発
正社員
iOSアプリケーションエンジニア
・企画・デザイン以外の全ての工程を担当 ・一人1アプリで初回リリースまで全て一人で担当
ディレクターから上がってくるチケットに基づいてアプリを機能を設計・実装しテストまで行っていました。 詳細仕様書を元にデザイナーと連携しながら一つずつ機能を開発します。アジャイル開発で開発 ニュースアプリ、放置系ゲームアプリ、カメラアプリ、メモリの解放アプリなどを制作いたしました。