Tabelog Tech Blog

食べログの開発者による技術ブログです

スマホアプリエンジニアからバックエンドエンジニアへ領域横断して得たもの

この記事は 食べログアドベントカレンダー2024 の5日目の記事です🎅🎄


こんにちは。食べログ開発本部 アプリ開発部 の高山です。
私は現在食べログオーダーのバックエンド開発のメイン担当をしております。それ以前はスマホアプリの領域を専門としておりましたが、ここ3年間はバックエンドを中心に開発しております。
今回はその経験を元に、スマホアプリ開発の考え方を活かしつつ、バックエンド開発へ乗り出していった際の考え方を記載させていただきます。

目次

スマホアプリ開発を専門領域にしてきた

私は長年にわたり、スマホアプリ開発を専門としてきました。ソーシャルサービスアプリの開発や組み込みAndroid、クロスプラットフォームアプリなど、幅広く携わってきました。この領域での仕事は非常に楽しく、やりがいを感じていました。また趣味の面でも、ゲームプラットフォームを用いての開発など、スマホアプリ開発に関することを楽しんでいます。

バックエンド開発という新たな領域へ踏み出す

そんな中、バックエンド開発に挑戦する機会をいただきました。フルスタックエンジニアとしてのスキルを身につけたいという憧れがあり、この挑戦を受けることにしました。
ただ、新しい領域に足を踏み入れることは、不安が伴うものです。特に、スマホアプリエンジニアとして安定して働けている状況にあったため、新たな領域に踏み出すことに対して消極的だった時期もありました。
しかし、キャリアの中盤に差し掛かるにつれて、年齢を重ねるほどに新しい挑戦が必要だと考えるようになりました。ただしゼロベースでチャレンジしても効率が悪く、機能しないリソースとして終わってしまう懸念もあります。そこで可能な限りスマホアプリでの開発経験を活かしてキャッチアップを早くする必要があります。

今回の記事では、スマホアプリ開発(特にAndroid)を中心に経験してきた私が、Railsを用いたバックエンド開発に取り組む際に気をつけたことや感じたことをお話し致します。

バックエンド開発の攻略法を考える

ここでは、専門書的な視点ではなく、個人的な見方でバックエンド開発の攻略法についてお話ししますのであらかじめご了承ください。

同僚のエンジニアに「今からRailsをできるようになりたい」と相談したところ、「しっかりとエンジニアリングできるようになるには大体2年は必要だよ」と言われました。
確かに、iOSやAndroidのアプリ開発を習得するのにも2年かかると言われているので、バックエンド開発にも同様の時間がかかるのは妥当と考えます。
しかし、2年は長すぎると感じるため、キャッチアップを早めるための工夫と作戦を考えたいと思います。
初めはバックエンド開発が強大で難解に見えるかもしれませんが、困難を少しずつ分解して取り組むことで、なんとかなるはずです。以下はシンプルですが私が考える攻略法です。

  1. 今できているだろう点をたくさん見つけて、心的なハードルを下げる。

    すでに培われている感性や観点は、すでに使える武器として自身に装着されているものとして学習のウェイトを下げます。

  2. できてない点を早期認識して集中的に学習する。

    逆にできていない点は学習のウェイトを上げて学習を進めます。

この2点です。特に1番が重要で、今自分が持っているものをできるだけ見つけてあげるのがポイントです。

スマホアプリ開発との類似性を見つける

スマホアプリ開発とバックエンド開発には、設計の考え方や技術的な共通点があります。これまでスマホアプリ開発で培った技術や感性は、武器としてすぐに活用できます。

以下はあくまで私の場合ですが共通点を示します。新しい領域に挑戦する際には、こうした観点が多ければ多いほどハードルが下がると考えています。

  • 設計パターンを知っている

    設計パターンには共通点があります。バックエンドではMVCアーキテクチャ、アプリではMVVMアーキテクチャが一般的です。
    どちらにおいても、コントローラやビューが肥大化するのは共通の課題です。これを避けるために、最初から意識して設計することが重要であり、スマホアプリ開発者は自然にこの点を意識できているのではないかと思います。
    例えば、Modelの役割やMVCアーキテクチャでカバーされないコンポーネントの設計方針、共通のビジネスロジックの再利用性について押さえておけば、設計に迷うことは少ないでしょう。

  • パフォーマンスの重要性を知っている

    スマホアプリ開発では、ユーザーが快適にアプリを利用できることが重視されます。
    画面描画に時間がかかるとユーザーはストレスを感じるため、描画のレイテンシに注意を払います。また、メモリの効率的な利用も重要です。私も開発時はプロファイラーといったツールを頻繁に活用してきました。
    バックエンド開発でも、サーバーの負荷やレスポンス時間など、システム全体のパフォーマンスに影響を与える要素が多くあります。大規模なデータ処理や複雑なクエリの実行時には、パフォーマンスの最適化が求められます。こちらでもプロファイラーに相当するものが存在するので同じような観点でソースコードの最適化を行います。サーバーの負荷やレスポンス時間は、例えばNew Relicといった監視ツールでチェックできます。
    こうした観点はほぼ共通しており、知識が浅くても最初からパフォーマンスを意識したコーディングが可能です。

  • テスト駆動開発(TDD)の効果を知っている

    テスト駆動開発は非常に効果的です。
    新しいモジュールを作成する際にテストをしっかりと構築しておけば、経験が浅くても「できている」と自信を持てます。特に知識が浅い段階では、テストが最大の頼りになります。不具合修正時には、不具合が再現する条件のテストを書き、それを修正することで問題が解決されたことを確認します。これは基本的な手法ですが、意外と実践されていないこともあります。
    どの領域でも、テストケースを先行で書くと手戻りがなく、安心感が得られます。

  • Frameworkの知識が重要であることを知っている

    Frameworkの知識は、開発において最も重要な要素の1つです。
    スマホアプリ開発では、AndroidやiOS、クロスプラットフォームのFrameworkを正しく使いこなすことが求められます。少しの使い方の誤りが特定のユーザーで障害を引き起こしているが、その原因が全くわからないという事態は開発者にとって非常に苦しい経験です。このため、スマホアプリ開発者は利用するツールに対して非常に慎重になります。
    この感性は、バックエンド開発においても非常に重要です。私自身もバックエンド開発の初期に、他のコードを真似して書いた結果、バグを発生させた経験があります。その原因は、Frameworkに対する知識が浅かったことでした。
    ツールを理解せずに使うことは非常に危険であり、この点はスマホアプリ開発とバックエンド開発の共通点であり、最優先で学習すべきポイントです。

他にも細かい部分で多くの共通点がありますが、こうした共通点を見つけ、「できそうなところ」として認識するのが重要です。なんとなくわかっているというレベルでOKです。
このような分析を自分で行うのは難しい面もありますが、知識のある他者からのフィードバックを受けると非常に楽です。

では次に、自分ができないところを見つけていきましょう。

自分ができないところを見つける

自分の弱点を早期に見つけて克服することは非常に重要です。以下は私ができていないと感じた部分です。

  • Frameworkの知識が無い

    Frameworkの知識は非常に重要であり、最初に学習すべき項目です。
    各Frameworkにはガイドが出版されていることが多いので、それを読んで理解することが必要です。早期にこの知識を身につけることで、開発作業が大幅に効率化されます。

  • データベースの基礎知識が無い

    データベースの基礎はソフトウェア開発の重要な要素です。
    スマホアプリ開発ではkey-valueストアを多用するため、データベースに触れる機会が限られがちです。しかし、バックエンド開発ではデータベースの設計やクエリの最適化が不可欠です。ミスクエリがシステム全体に悪影響を与えることもあるため、基礎をしっかりと学ぶ必要があります。学習方法としては、書籍や生成AIを活用し、さらにデータベースの運用や管理についての書籍を読むことが有効です。

  • トランザクション管理がわからない

    バックエンド開発ではデータ処理の複雑さが増すため、トランザクション管理が重要です。
    スマホアプリ開発ではトランザクションという言葉があまり出てこないため、この概念に疎くなってしまいます。バックエンド開発では、トランザクションの管理・設計が重要であり、APIメソッドを適切に利用するだけでは不十分です。

これらの基礎を固めることは、スケーラビリティや非機能要件への対応にもつながります。まずは基礎をしっかりと学び、知識を深めることが重要です。

できそうなところは後回しにする

自身の「できそうなところ」と「できないところ」の仕分けができたら、「できそうなところ」は労せずキャッチアップできるので「できないところ」の学習を進めます。
「できそうなところ」については、私も実践に入ってすぐに設計やソースコードへ落とし込めたので、この方法は非常に有効だと感じています。
「できないところ」の学習は、一般的な学習と同じになりますので、ご自身の学習方法に合わせて進めてください。 学習方法については、特に生成AIを活用することが効果的です。実際に私がトレーニングした新卒のメンバーの立ち上がり方をみても、非常に効果的であることがわかりました。 具体的には、Framework技術書の補完としての利用や、作成したコードのレビュー、テストコードの生成など、さまざまな局面で迅速かつ有益なフィードバックを得ることができます。 これにより、学習の質と速度が向上し、より早く目標を達成できます。

領域を横断して得たもの

領域横断を始める前、私はアプリ側とバックエンド側の細分化されたタスクを柔軟に消化でき、それを自らリードすることを目標としていました。現行のプロジェクトの都合上、理想とは少し異なる形になりましたが、多くの成果を得られました。
まず、開発者としての視座が高くなり、判断速度が向上したと感じています。これにより、開発のアウトプットの質と量が増加し、成長実感と達成感を得ることができました。この経験を通じて、他の領域にもチャレンジしてみたいという意欲が強くなりました。
また、スマホアプリとバックエンド間の情報パイプラインに強い関心を持ち、効率化に向けた技術更新への意欲が高まりました。技術の相互作用を理解することで、各領域の強みと限界を把握しようとする意識も高まっています。
これらの経験は、私の将来の開発活動においても大いに役立つと考えています。

おわりに

今回の経験を通じて、今までに培った観点や感性が新たな環境でも活かせることを実感しました。これにより、短期間で効果的なリソースとして機能できたと感じています。
特に重要なのは、「これは今の自分でもできている」と思える部分を見つけ、それを土台に次に取り組むべき課題を明確にすることです。このプロセスを通じて、新しい領域に挑戦する際の心理的なハードルを下げることができます。
本記事では、コンフォートゾーンを抜け出し、新たな領域へと踏み出す際の1つの考え方を紹介しました。似たような状況にある方々にとって、この内容が少しでも励みになれば幸いです。

また、食べログオーダーについては以下の記事を是非ご覧ください。

明日は aaknskさん の「生成AIを使ったらAPIの開発が捗った話」です。お楽しみに!