バックエンド開発とは何か
バックエンド開発とは、基本的にユーザーがアプリから入力した情報を保存、加工など、さまざまなことに活用できるようにするプログラムを開発することです。
システムを開発するには、大きく分けて3つの種類の要素が必要です。
- ユーザーが実際に操作する画面(ブラウザ、スマートフォンのアプリなど)
- アプリの使用目的に応じて、ユーザーからの入力データを加工・保存する機能
- アプリの状態を保存しておくための保管庫(データベース、データウェアハウスなど)
バックエンド開発では主に2番目のアプリの使用目的に応じて、ユーザーからの入力やデータを加工する機能の作成を担当します。画面から送られてきたデータを加工したり、データベースやデータウェアハウスなどの保管庫へ保存したりする機能の開発も、バックエンド開発の一つです。バックエンド開発は、アプリケーションの頭脳とも言える機能の開発といえます。
バックエンド開発でどのようなことを学んだのか
バックエンドの開発で学んだことは、機能の実装をできるだけシンプルにすることの重要性です。複雑な条件や処理を含んだプログラムは、どうしても不具合がでてきます。また、機能の変更が必要になった際も、どこに変更を加えれば良いのかの調査に時間がかかります。実装のシンプルさがない場合、特に機能を変更する際には、関連した他の機能に影響がないかの調査に時間がかかり、調査漏れの可能性も高まります。シンプルな条件分岐や処理は複雑な条件分岐や処理よりも、短時間かつ漏れなく調査を実施することが可能となります。
機能をシンプルに実装するためには、役割ごとにプログラムを分けて作成することが重要になります。ユーザーの入力を確認する際には、その入力のみを確認するプログラムを作成します。データを加工する際は、データを加工するためだけのプログラムの作成、また、複雑なデータの加工が必要な時は、データ加工を小さなステップに分け、小さなプログラムで繋げて全体のデータの加工を行うようにします。このように、データを加工するステップを細かく分けることで、各プログラムをシンプルに作成することができます。さらに、一つ一つのプログラムの機能を限定し、プログラムを数珠繋ぎに構成することで、処理の流れが明確になります。その結果、変更時の影響範囲を漏れなく特定できるようになり、調査の精度とスピードが向上します。
ユーザーの要望をシステムとして実装するにはどうするべきか、を考えることもとても重要です。業務システムを作成する場合、業務フローは複雑な場合が多く、一つのデータを更新するために、複数のデータを参照して、どのデータに対して更新が必要かを判定し、どこにどのような内容を入力するのか、また入力できる内容を必要に応じて限定して…と、数々のステップを踏んで、やっとデータを更新する機能が成り立ちます。これらの複雑なステップをプログラム作成する時と同じように、場面ごとに細かく分解し、さらに、データベースで管理する値、プログラム側で管理する値、ユーザー側で管理する値などを順番に一つ一つ検討しています。細かく分けて、一つ一つ検討することが大切なのです。
業務に必要な順番でまとめて検討すると、どの値とどの値が繋がっているのか、どの機能はどの機能に影響があるのか等が順を追うごとに増えて行き、整合性の確認が煩雑になり、本当に必要な繋がりなのか見えにくくなってしまいます。小さく分解して個別に検討することで、この機能にはこのデータが必要、このデータはここで利用されるので利用しやすいようにしなければならない、などが見えやすくなります。
このように、機能を細かく分けて検討、プログラムしていくことは、違う部署のユーザーが違う目的で利用する可能性があるシステムの頭脳を担うバックエンド開発においてとても重要なのです。もちろんこの考え方はバックエンド以外のありとあらゆる開発でも応用することが可能です。
バックエンドエンジニアとして、どのようにプロジェクトに関わるようになっていったのか
初めは、バックエンドエンジニアとして、ただ先輩の設計通りに、先輩の書いたコードを参考にしながら作業するだけでした。ひたすら、プログラムを役割ごとに細かく分け、組み合わせ、機能を作成していきました。その過程で、どのような仕様の機能の場合は、どのような組み合わせでプログラムを書いていくのか、と言うパターンが次第にわかるようになりました。仕様とプログラムのパターンの組み合わせがわかると、仕様から設計書を作成するフェーズを任せてもらえるようになりました。
仕様から設計書を作成するには、まず、仕様を正確に理解しなければなりません。顧客は作りたいシステムの利用者であっても、システム作成のプロフェッショナルではないことが多いです。自分のやりたいことをシステムにする際、どのようにしたらいいのか、迷うことがたくさんあります。顧客がやりたいことを確認し、実際にシステムにする場合、「A案やB案があります。それぞれのメリットとデメリットを考えると、今回はこちらが良いと思います。」と言うような提案をする必要がある場面が多くあります。このように設計するようになり、顧客と作成するシステムにより深く関わることで、ユーザーに近い位置でプロジェクトに携わるようになりました。
バックエンドエンジニアとしての挑戦
バックエンド開発をする上で一番の挑戦だったことは、顧客とのやりとりです。
顧客は、必ずしもシステム開発の知識が多いわけではなく、要件もプログラムを設計するには情報が足りない場合が多くあります。バックエンドは、顧客に見える形で表示されるものではなく、いわばシステムの裏方のような立ち位置にあります。顧客にはイメージしにくく、話し合いをする際にもITエンジニア側はどうしてもシステム目線になりがちです。システム目線になりすぎず、要件を整理し、不足する情報を聞き出す工程で苦労したことも多かったです。また、元々の業務自体が複雑で、業務を理解すること自体が難しい場合もあります。このように、バックエンドの開発には、顧客との円滑なコミュニケーションが大切になってきます。幸い私が関わったプロジェクトでは、顧客側と一緒に、お互い助け合いながらプロジェクトを進めることができました。顧客と話しながら作成したシステムが「これがやりたかったことです!」と言ってもらえるととてもやりがいを感じます。
バックエンド開発において、ジュニアエンジニアから、シニアエンジニアになるには
ジュニアエンジニア、シニアエンジニアの定義はさまざまだと思いますが、私が感じる一つの違いは、プロジェクトの立ち上げ時に、プログラムが作成しやすい以下の環境や仕組みを設定できるかどうかです:
- テストコードの作成環境
※テストコードとは、作成したプログラムをテスト用のプログラムを使い、自動で実行し、テストするためのプログラム
- データベース接続の管理
※バックエンドからデータベースのデータを参照・編集するために必要なプログラム
- ログの出力
※決まったログを出力することで、一律でどの機能が実行されたのか、また、エラーが発生した場合、どこでエラーが発生したかなど、後から確認が可能
- データ入力チェックの仕組み
※ブラウザや、iPhoneのアプリなどから送られてきたデータが正しい形で送られてきているか確認するための全ての機能に対して一律で指定する仕組み
- エラーハンドリングの仕組み
※エラーが発生した場合、システムが完全に停止しないように処理し、エラーとしてログを出す仕組みなどを全ての機能に対して一律で指定する仕組み
バックエンドの開発にはさまざまな要素が必要です。この要素を一つ一つのプログラムごとに作成していたのでは、時間がかかりますし、個人個人が作成するので、不具合の発生も多くなります。そのため、うまくプログラムを分割し、作成したプログラムを簡単に利用できるように、ソースコードが複雑にならないように気をつけることが大切です。このように、プログラムを作成するのに必要な仕組みをはじめに作り、プログラマーが、各プログラム固有のロジック以外は、ほとんど気にする必要がない状態で作業できるように整えるスキルがシニアエンジニアには必要になってきます。
私はジュニアエンジニアから、シニアエンジニアになるにあたり、上記のような、一番初めに行うプログラム基盤の作成を勉強しました。先輩のエンジニアが作ったソースコードを読み、どのようなことをやっているのか、どのようなものを作れば開発がスムーズに進むのか、を常に考え、理解に努めました。先輩のコードを見て、どのようなことをやっているのかわからない箇所は、検索して調べたり、先輩に直接聞いたりして教えてもらいました。
もちろん、これまで、やりがい等で上げてきた、仕様整理能力やコミュニケーション能力も必要ですが、開発において、安定した品質のプログラムをスムーズに作成できる環境の構築能力はシニアエンジニアとしてとても重要です。
Avaxia Asiaでできること
Avaxia Asiaでできることは、なんといっても高い技術力を持った先輩エンジニアから、直接技術を学べることです。
技術書を読み、「正しいコードの書き方」を学んでも、実際のプロジェクトでは思うようにいかない場面も多く、「本当にこの方法で合っているのか?」という迷いが常にありました。しかし、先輩たちが書くコードを参考にすることで、問題が解消され、開発速度が目に見えて上がりました。実際に動いている優れた設計に触れることで、先ほどお話ししたような「バックエンドの仕組みづくり」が自分でも実践できるようになったのです。
Avaxia Asiaの先輩エンジニアに出会わなければ、シニアエンジニアと評価してもらえるだけの技術をこれだけ早く身につけることができなかったと思います。先輩たちのおかげで、Avaxia Asiaに入社して1年程度で、リードエンジニアとして、プロジェクトにアサインされるまでに至りました。
今、エンジニア界隈はAIの発展期に入り状況が大きくかわってきています。私自身もまだまだ勉強中ですが、AIに詳しい先輩エンジニアがいるので、これからAIによって大きく変わる需要にも対応できる安心感があります。AIが普及した今も、今だからこそバックエンドのプログラムは重要になってきています。AIが業務をこなすためには、バックエンドのプログラムが必要だからです。もちろんバックエンドのプログラム自体もAIが書ける時代はすぐそこまできているかもしれません。それでもこれまで培った技術力はAIをうまく利用する、という点において、一つのスキルになってくると考えています。AIを利用した開発を先輩エンジニアと一緒に行い、何か成果を出せる日も近いのではないか、と思っています。