技術開発部で主にバックエンド開発をしている浜田(@hamchance0215)です。
弊社では下記の通りバックエンドエンジニアを絶賛募集中なのですが、募集要項を読んでも実際どのような働き方をするのかイメージしづらい部分もあると思います。
この記事では具体的なイメージが湧きやすいように、募集ページに記載されている【必須スキル】や【歓迎スキル】と私がバックエンドエンジニアとして普段やっている業務を紐付けて紹介しようと思います。
※「バックエンドエンジニア」という肩書でも担当しているプロダクトによって使う技術や役割が異なるため、一例として読んでいただけると幸いです。また、こちらの記事は執筆時点(2021/07)の状況を基に記載しており、募集内容などは変更される可能性があります。
私が担当しているプロダクトについて
私が担当しているプロダクトのバックエンドはRailsを使ったAPIアプリケーションとなっています。
また、データを格納するためにリレーショナルデータベース(MySQL)を使っています。
本番環境はAWSまたはGCPを使っています。1つのプロダクトがAWSとGCPを両方使っているのではなく、AWSを使っているプロダクトとGCPを使っている別のプロダクトがあるイメージです。
【必須スキル】
Webアプリケーションの開発経験、及び1年以上の運用経験
開発しているプロダクトはWebアプリケーションなのでWebアプリケーションに関する知識が必要になります。
Webの知識と一言で言っても多岐にわたるため、どこまで知っていればOKという区切りが明示しづらいのですが、Webの仕組みやHTTPメソッドやステータスコードなど基礎を抑えているレベルでよいと思っています。
私の場合、API設計をするときに適切なHTTPメソッドやステータスコードを決めたり、CORSやCookieなどの制御を行うときなどにWebの知識が役に立っていると感じています。
また、「運用経験」と記載している通り、ただ作るだけではなく継続して運用していくための知識も必要になります。
運用の知識も多岐にわたり、机上で学ぶというより実践でのトラブルシューティングなどを通して学ぶことが多いので、「1年以上の運用経験」と記載しています。
私の場合、過去の運用経験があることで、異常検知した際の調査など、原因を推測できたり、対策を立てやすくなったりしていると感じています。
Ruby on Railsを利用した開発経験
バックエンドはRuby on Railsで作られているため、開発する上で言語やフレームワークに関する知識が必要になります。
また、既存のRailsアプリケーションに機能追加していくだけではなく、新規開発で0からRailsアプリケーションを立ち上げることもあるため、既存コードを参考にしながら開発する以外にアプリケーションを0から構築したり、ライブラリ等を選定することもあります。
こう書くと難易度が高そうに感じますが、よほどマイナーな言語やフレームワークを使っていない限り、先駆者の役に立つ情報が世の中にたくさん公開されているので、それらを適切に調べてプロダクトに反映させるスキルがあれば十分です。
一方、0からのアプリケーション構築やライブラリの選定などは、すでに既存プロダクトが育っている企業ではやる機会が少なかったり制約が多かったりすると思うので、このあたりを裁量持ってできるところはスタートアップで開発する醍醐味だと思います。
また、継続して運用していくプロダクトのため、言語やフレームワーク等のバージョンアップは必須です。そのため、言語やフレームワークが使えるだけではなく、最新情報のキャッチアップができていると更に良いです。
私もメインで使っているRubyやRailsの新着情報を中心に周辺技術(フロントやインフラなど)の情報もキャッチして、必要に応じてプロダクトに反映するようにしています。
リレーショナルデータベースのテーブル設計を行った経験
開発しているプロダクトのデータはMySQLに保存しています。そのため、リレーショナルデータベースに関する知識が必要になります。
私も開発時にテーブルを新規作成したり変更することがありますが、その際に正規系やインデックスなどの知識は必要だと感じています。
【歓迎スキル】
データベースのクエリーチューニングや大量データを扱った開発経験
プロダクトを運用していくと、データがどんどん増加していきます。
データが増えたときに今まで動いていたクエリーが突然実行時間が数倍かかるようになったり、アプリケーションでデータ取得時にデータが多すぎてメモリが溢れたりすることがあります。
私の場合、開発時にデータの増加を想定した実装をしたり、リリース後にパフォーマンス劣化を検知してチューニングが必要になったときにこれらの経験が役に立っていると感じています。
とはいえ、クエリーチューニングや大量データを扱う経験は、ある程度規模の大きなプロダクト開発に携わらないと経験できないことと、必須スキルのリレーショナルデータベースの経験を持っていれば開発・運用しながらキャッチアップ可能と考えているため歓迎スキルとしています。
セキュリティ / 脆弱性対策に関する知識、経験
Webアプリケーションの場合、SQLインジェクションやクロスサイト・スクリプティングなど有名な脆弱性がいくつかあります。
Railsなどのフレームワークを使っていると意識しなくても脆弱性を回避できることが多いですが、知識として知らないと、例えばActiveRecordを通さずSQLを直接書くなど低レベルの実装が必要になったときに脆弱性を埋め込んでしまう可能性があります。
ただし、先に書いた通りWebの脆弱性対策はRailsなどのフレームワークを使っていると意識しなくても回避できることが多く、Brakemanなど脆弱性をチェックしてくれるGemもあります。また、脆弱性対策はベストプラクティスが確立されているものが多く、業務を通してキャッチアップ可能だと考えているため歓迎スキルとしています。
HTTPやREST API、GraphQLに関する知識、経験
こちらは「Webアプリケーションの開発経験」の記載したWebの基礎部分から一歩踏み込んだ知識のことを指しています。
私が担当しているプロダクトのバックエンドはPIアプリケーションとして実装しているので、REST APIやGraphQLを採用しています。
REST APIで作っているプロダクトでは、OpenAPIを使ってAPI設計しているため、OpenAPIなどの知識がある方は歓迎です。また、現在開発しているプロダクトはGraphQLを使っているため、GraphQLを使った経験がある方も歓迎です。
とはいえ、どちらも業務を通してキャッチアップ可能だと考えており、特にGarphQLは新しい技術であり経験している方は少ないため歓迎スキルとしています。
新規サービスの立ち上げ経験
「Ruby on Railsを利用した開発経験」のところで触れましたが、0からのアプリケーション構築する機会があるため記載しています。
私が今開発しているプロダクトも、0から開発しており、rails newから開発を始めています。
アプリケーションを0から構築する経験は、所属している開発チームの状況に左右されることが多く、既存のアプリケーションに機能開発しているだけでは身につけづらい経験だと思うので、歓迎スキルとしています。
歓迎スキルとしていますが、先程書いた通り新規開発を行うかは開発チームの状況に左右されるため、必ずしも0から開発する機会があるというわけではないのでご注意ください。
Docker / Kubernetesを使った開発経験
私の担当しているプロダクトの開発環境はDockerで構築しています。そのため開発時にDockerの知識があるとスムーズに開発に入ることができます。
ただし、Dockerを使うだけであれば1日もあればキャッチアップ可能なので歓迎スキルにしています。
また、本番環境はkubernetesで構築しています。
初期構築や大きな改修はインフラ専門のエンジニアの方にやってもらっていますが、インフラはコード化されており、簡単な設定変更などはバックエンドエンジニアが修正することもあります。また、サーバーに直接接続して操作したり運用時の障害調査などを行うこともあるので基本的な構成は知っておく必要があると感じています。
とはいえ、基本的にはインフラエンジニアに中心となって対応してもらっているので歓迎スキルとしています。
CI / CDに関する知識、経験
継続的に開発していくためには、自動テストや静的コード解析などを定期的に実行するCIの設定や、簡単にデプロイするためのCDが必要になります。
必要なものではありますが、ある程度定型化されており調べればすぐにわかることや、一度設定したらあまり変更することもないため歓迎スキルとしています。
Pythonを利用した開発経験
私の担当しているプロダクトでは、弊社特許技術であるCI技術を利用しています。
CI技術に関しては下記公式ホームページを御覧ください。
Railsで開発しているバックエンドプロダクトとCIの繋ぎこみ部分をPythonで開発しているため、Pythonを利用した開発経験を歓迎スキルにしています。
とはいえ、CI技術自体は専門のチームが開発しており、繋ぎこみ部分の開発のみのため、あまりPythonを使うことはありません。
最後に
この記事では募集ページに記載されているスキルと実際の業務を紐付けて説明しました。募集ページを見るときに参考になると幸いです。
少しでも興味がある方はカジュアルな面談も随時行っていますので気軽に声をかけてください!