はじめに
こんにちは。
普段はフロントエンドの開発をメインでやっておりますmamiと申します。
最近バックエンドの方の勉強や、少しずつですがDB設計やAPI作成などの業務もやらせてもらえるようになったので、自分のエンジニアとしてのレベル感や、この先目指すべき道筋を明確にしたいな〜という思いでこの記事を書いております。
これは自分のための記事であると同時に、同じように駆け出し中のエンジニアさんや、ミドル層を目指す手前のエンジニアさんにも刺さる内容になっているかと思います。
今、自分がどのようにキャリアアップしていくべきなのか、どのような道筋でスキルを磨いていけばいいのか。そんなふうに悩んでいる方は是非読んでみてください。
※内容はバックエンドエンジニアが対象になりますが、フロントエンドの方もなにか通じるものがある…かもしれません。
ちなみにですがフロントエンドの方の記事は下記で執筆していますので、興味のある方はぜひ読んでみてください。
逆算したキャリア戦略の必要性
そもそも何故、キャリア戦略が必要なのかについてお話しします。
結論からお話しすると、時間は有限だからです。
おそらく、何も意識せずとも普通に開発経験を積んでいれば、未経験からでも2~3年でジュニアレベルを脱することは可能でしょう。
しかし、何も考えずにただただコードを打ち続けるのはつまらない。
どうせエンジニアになったのであれば、論理的に自分のキャリアを組み立て、逆算して努力を積み重ねる。そのプロセスが必要であると私は思います。
そうすることで、自分の理想とするエンジニア像への最短の道へ辿り着くはずです。
そして何より、目標を明確にすることで「今自分は何をすればいいのか」が明確になります。
この記事を読み終わる頃には、自分がバックエンドエンジニアとして足りないスキルと既に会得したスキルが明確になります。
明確に慣れば後は簡単で、自分に足りないと思うスキルを身につけていくだけになります。
前提
まず、私のこれからお話しする「ジュニアレベル」とは、いわゆる「メンバークラス」であるとお考えください。
そして基本的には、バックエンドのみにフォーカスしてお話ししております。
ジュニアレベルであってもフロントエンドも出来た方がいいとか、インフラの知識も必要だ、などのご意見もあるかと思いますが
それはバックエンドで求められる最低限のレベル=ジュニアクラスができた上で求められることかな、と思います。
バックエンドエンジニアと名乗っておきながら、簡単なAPIの機能実装すらままならない。ではお話にならないので、まずは自分の専門領域を最低限確保しよう、ということですね。
ではいよいよ、ジュニアレベルに求められる技術スタックを下記に記していこうと思います。
ざっくり定義
●ジュニア
- git/GitHub の仕組みを理解して適切に利用できる。
- リファレンス等を参照して不具合の調査ができる(英語のドキュメントを含む)
- シンプルで他人が読みやすく理解しやすいコーディングができる
- Linuxのコマンド操作が一通りできる
- Webについての基礎知識の習得
- DBについての基礎知識とSQL文法の習得
- APIについての基礎知識の習得
- プログラミング言語を最低1つ扱える
- フレームワークを駆使して開発ができる
- セキュリティについての基礎知識
- Dockerについての基礎知識
- 設計についての基礎知識
- アーキテクチャについての基礎知識
- デザインパターンと原則
- テストが書けるようになる
ジュニアに求められるレベルをまとめると
長々と箇条書きしましたが、簡潔にまとめると「周辺知識を理解した上で、指示された要件を満たす実装ができる」こと。これに尽きると思います。
それを細分化して言語化したものが上記の箇条書きリストになります。
結論
では実際問題、どうすればいいのでしょうか?
結論は、簡単。先ほど細分化した箇条書きリストを一つずつ自分のものにするです。
これらの箇条書きリストを見て、あなたはどれだけの項目が自分には出来て、どれだけの項目が自分にはまだ足りないなと思ったでしょうか?
この記事を書きながら、私自身にもこれはできると言えるけど、この項目はまだ難しいな…とか、これ勉強したことはあるけど実際にやれと言われてできるか怪しい…。
そういったものが可視化されました。
その可視化された情報をもとに、あとは自分に足りないスキルを一つ一つ習得していくだけになります。
本を読んだり、公式ドキュメントを読んだり、Udemyで学習するのもいいと思います。とはいえあくまで実務レベル
で出来ることが前提なので、是非そこを意識してみてください。
そして、これらすべてのスキルを習得できた時
「周辺知識を理解した上で、指示された要件を満たす実装ができる」
という先ほどの大きな要件も難なくこなせるレベルになっていることでしょう。
そして晴れて、ジュニアレベルを卒業して次のステップへ進めることができるのです。
具体的にどうすれば良いのか
では次は具体的にどうすればいいのかを考えていきましょう。
箇条書きしたものでもいいのですが、やや抽象的です。
どのような本や記事を参考に学んでいけばいいのかや、何故それを学ぶ意義があるのかについてそれぞれ深掘りしてみました。
ちなみにレベル感の定義ですが、いずれの条件も頭で理解するで終わるのではなく、実務レベルで実装できるレベルであること。
「仕様を理解」のみの項目に関しては「他人に説明できるレベル」を理解したレベルとして定義します。
①git/GitHub の仕組みを理解して適切に利用できる。
言わずもがなですが、開発現場においてgit/GitHubを利用しないなんてことはあり得ません。
初学者にとって何個目かの壁になる印象ですが、覚えてしまえばそんなに難しいことではないので、体で覚えていきましょう。
いろんなところでお勧めされていますが、やはりGit講座であれば下記講座が一番分かりやすいかと思います。
そしてGitの仕組みとコマンドを覚えたらGUIツールのSourceTreeなんかもおすすめです。
GUIなので視覚的に分かりやすいので、初学者でも扱いやすいでしょう。
慣れてきたら正直VSCode上で完結させる方が早いですが、慣れる意味では有用だと思います!
②リファレンス等を参照して不具合の調査ができる。(英語のドキュメントを含む)
エンジニアにとってエラーをどう解消するか、についての問題は永遠の課題と言えるでしょう。
エラーが出るたびに先輩エンジニアにいちいち聞いていては、お互いの時間を消費してしまいます。
最初のうちはしょうがないのですが、独り立ちできるようになるためには、自分でエラーを読み、それを理解し、コードに反映させる必要性があります。
そんな時に重要となるのが「公式ドキュメント」です。
なぜ公式ドキュメントを読むのが重要なのかというと、一言で言うと信頼性が高いからです。
作者か作者の意図を知っている人が公開しているので、信頼性が高いことが期待されます。
とは言え、エラー文でググっても解決方法は出てきますよね?
それで出てきたコードをそのままコピペしたら動いた!なんて経験は誰しもがあると思います。
ですが、それだと「なぜエラーが起きていたのか」、そして「なぜエラーが治ったのか」。
これが理解できないまま先に進むことになってしまいます。
それでは次また同じエラーが出た時にまた同じ検索をする羽目になるだけではなく、そのコピペしたコードが正しいものかもわからないので、また別の意図しないエラーが発生してしてしまう原因にもなってしまいます。
重要なのは「ググって解決方法を出す」のが悪いのではなく、その出た情報が本当に正しいのか。
またその情報をもとに、エラーの根本原因をドキュメントで読み解けるかがエンジニアとして重要になるわけです。
公式ドキュメントの読み方については下記記事が大変分かりやすかったです。
本題とは外れますが、ググり力に関連して英語での検索力も重要なスキルです。
プログラミングに限らず、英語の情報量はネット上で60%を占めているのに対して、日本語は2%ほどしかないため約30倍の差があるそうです。
日本語では出てこなかったけど、英語で検索したらStackOverFlowなどで似たようなエラーで議論されていた、なんてことはよくある話だと思います。
詳しい検索方法などに関してはこちらの記事を読んでみてください。
③シンプルで他人が読みやすく理解しやすいコーディングができる
とりあえず動けばいい、の精神でコードを書ける個人開発とは違い、仕事や実際の現場におけるコーディングでは、「他人が読むコード」を意識して書く必要があります。
他人が読むのですから、もちろんわかりやすいコードでなくてはなりません。でも、「わかりやすい」とは何でしょう。どうしたら実現できるのでしょう。
それをしっかり学んでおく必要があります。自分にしか読めないコードや、簡単なロジックなのにすごく複雑で難解なコードになってしまった…では意味がないのです。
また、ソースコードは作って終わりではなく、その後何年、あるいは何十年にもわたって保守開発が行われます。
また、保守開発を行う開発者もその間に入れ替わります。
ソースコードを作る際は、このことを踏まえて高品質・低コストで保守開発ができるようにする必要があります。
名著として有名な「リーダブルコード」もいいですが、
より近代的な下記本もおすすめです。初心者にも読みやすい本となってます。
「良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方」
④Linuxのコマンド操作が一通りできる
プログラミングの現場では、Linuxコマンドも非常によく使います。基本的なLinuxコマンドを理解し、操作できることが非常に重要です。これは、ローカルでの開発だけでなく、サーバー上での作業を行う際にも役立ちます。
Linuxコマンドを学ぶためには、まずは基本的なコマンド(例えば ls, cd, cp, mv, rm など)から始めるといいでしょう。これらは日々の作業で頻繁に使用され、Linuxの世界に慣れるための入門となります。
Web開発を円滑に進める上では必須なので必ず暗記するべしです。(WindowsではPowershell、macOSではbashの基本コマンドを扱えるようにすること)
⑤Webについての基礎知識の習得
Webの基本を理解することは、現代のプログラマーにとって不可欠です。インターネットの機能や役割、プロトコルやメッセージの送受信を深く理解することは、開発において重要な基盤を形成します。
特に重要なのは以下のポイントです:
-
HTTP(Hypertext Transfer Protocol)の概要と役割
- ウェブ上でのデータの送受信をどのように制御しているかを理解すること。
-
HTTPリクエストの種類とその役割
- GET, POSTなどのリクエスト方法と、それぞれの使用シナリオを把握すること。
-
クライアントとサーバの概要と役割
- インターネット上でどのように通信が行われているかを理解すること。
-
OSI参照モデルの概要
- ネットワーク通信の様々なレイヤーを理解すること。
-
DNSの概要と仕組み
- インターネット上でのドメイン名とIPアドレスの関連を理解すること。
これらの概念を学ぶためには、次の書籍が特に推奨されます。これらは初心者にも理解しやすい内容であり、Webの基本をしっかりと学ぶのに最適です。Web技術の全体像を俯瞰できる一冊です。
本を読む時間がない人は下記記事なんかもお勧めです。
⑥DBについての基礎知識とSQL文法の習得
さて、ここから本格的にバックエンドらしくなってきます。
DB(データベース)はバックエンド開発において中心的な役割を担います。データを効率的に管理し、アプリケーションの機能を支えるため、その理解と適切な利用は不可欠です。
1.データベースの基礎とSQL
データベースは、バックエンド開発において最も重要な役割を果たします。アプリケーション内のデータを構造化して保存し、データにアクセスして維持するために使われます。
まずは基本的な知識は下記記事などを参考にしてみてください。
よく使われるSQL文の解説なども丁寧に記載されてあるので幅広く学べます。
2.RDBとNoSQLの違い
RDB(リレーショナルデータベース)とNoSQLデータベースは、データを管理するための2つの主要なアプローチです。RDBは、テーブル形式でデータを整理し、SQL(Structured Query Language)を使用してデータを操作します。最も一般的な例はMySQLやPostgreSQLなどです。
一方、NoSQLデータベースは、スキーマレスであり、柔軟なデータモデルを提供します。これにはドキュメント指向(MongoDBなど)、キーバリューストア(Redisなど)、カラムファミリー(Cassandraなど)などが含まれます。NoSQLは大量のデータや非構造化データの処理に適しており、スケーラビリティと高速処理が求められる場合によく使用されます。
3.ORM(Object-Relational Mapping)概要
ORMは、オブジェクト指向プログラミング言語とリレーショナルデータベースを橋渡しする技術です。データベースのテーブルをクラスにマッピングし、SQLを直接書く代わりにクラスのメソッドを通じてデータベース操作を行うことができます。これにより、開発者はより高水準で直感的なコードを書くことができ、データベースの複雑さを抽象化します。代表的なORMには、RubyのActiveRecordやPythonのSQLAlchemyなどがあります。
⑦APIについての基礎知識の習得
API(Application Programming Interface)は、バックエンド開発の中心的な要素であり、アプリケーション間でのデータのやり取りを可能にします。バックエンドエンジニアにとって、APIの設計と実装は極めて重要なスキルです。APIを通じて、フロントエンドや他のサービスとの連携を実現し、データの処理やビジネスロジックの実行を行います。
API設計の重要性
バックエンドエンジニアは、APIの設計において、以下の点を特に考慮する必要があります:
-
RESTfulな設計
REST(Representational State Transfer)原則に基づくAPI設計は、ウェブ上での標準的なアプローチです。リソース指向のアーキテクチャを採用し、HTTPメソッド(GET, POST, PUT, DELETE)を適切に使用することが重要です。 -
エンドポイントの定義とドキュメント化
各APIエンドポイントの役割を明確に定義し、使用方法をドキュメント化することで、フロントエンド開発者や他の利用者が容易にAPIを理解し、使用できるようにします。 -
セキュリティと認証
APIのセキュリティは非常に重要です。認証機構を適切に実装し、データの安全性を保つ必要があります。 -
パフォーマンスとスケーラビリティ
大量のリクエストを効率的に処理できるように、APIのパフォーマンスとスケーラビリティに注意を払う必要があります。
初めにAPIとは何かを深く理解する上でオライリージャパンの下記本は良書です。
メインはAPI設計の話にはなりますが、そもそも部分のAPIの説明も丁寧にしてくださってます。
そこまで分厚い本ではないので、読んでおいて損はないでしょう。
また、OpenAPI(Swagger)などのツールを使用してAPIドキュメントを作成し、管理できるようになるのも重要です。
バックエンドエンジニアとして、APIはシステムの「顔」とも言えます。そのため、設計から実装、テスト、ドキュメント化まで、APIに関するあらゆる面についての深い知識と経験が求められます。
認証認可について
バックエンドエンジニアにとって、認証(Authentication)と認可(Authorization)は、API設計の重要な側面です。認証は、ユーザーが自分だと主張する身元を確認するプロセスです。一方、認可は、特定のリソースへのアクセスを制御するプロセスです。セキュアなAPIを設計する際には、これらの概念をしっかり理解し、適切に実装する必要があります。
認証には多様な方法があり、基本認証、OAuth、トークンベース認証などが一般的です。認証機構を選択する際には、セキュリティの強度、実装の容易さ、ユーザー体験などを考慮する必要があります。詳細な情報については、以下のリンクが参考になります。
JWT(JSON Web Tokens)とは
JWTは、JSONオブジェクトを使用してコンパクトでURLセーフな方法で情報を他者とやり取りするための一般的な手法です。特に、Webアプリケーションにおいて、ユーザー認証情報を保持するためによく使用されます。JWTは、認証情報やその他の情報をトークンの形式でクライアントとサーバー間でやり取りすることで、ステートレスな認証メカニズムを提供します。
JWTの利点は、その自己完結性にあります。つまり、JWT自体が必要な全ての情報を持っており、データベースなどへの追加的な問い合わせを必要としません。これは、分散システムやマイクロサービスアーキテクチャで特に有用です。JWTに関する詳細は以下のリンクを参照してください。
⑧プログラミング言語を最低1つ扱える
ようやく出てきましたね。我々はWebエンジニアなのでプログラミング言語を扱えないとお話になりませんね。
現代のバックエンド開発においては、複数の言語が広く使用されていますが、ぶっちゃけ言語は何でもいいです。やりたいことによっても大きく変わってくるのでその人の目的に合った言語を学ぶといいでしょう。
ここでは初学者の方にもお勧めできそうな3つの言語、Node.js、PHP、Rubyについて触れます。
Node.js
Node.jsは、JavaScriptをサーバーサイドで実行するためのランタイム環境です。非同期処理に優れ、イベント駆動型のアプローチを採用しています。これにより、高いスケーラビリティと効率的なネットワークアプリケーションの構築が可能になります。特に、リアルタイムアプリケーションやSPA(Single Page Application)のバックエンドに適しています。
Node.jsを学ぶメリットは、フロントエンドで広く使用されているJavaScriptの知識を活かせる点にあります。これにより、フルスタック開発の道が開かれます。よくフロントエンドがJSだからバックエンドも合わせてJSで揃える、みたいなお話はよく聞くのでNode.jsを覚えておくと活用できる機会も多いでしょう。
PHP
PHPは、Web開発に特化したスクリプト言語で、簡単なブログサイトから大規模なWebアプリケーションまで幅広い用途に使用されています。特に、WordPressなどのCMS(Content Management System)はPHPに基づいており、この分野でのPHPの重要性は高いです。
PHPの強みは、その学習曲線の低さと、豊富なドキュメンテーションです。また、共有ホスティング環境での設定が容易であり、多くのWebホスティングサービスがPHPをサポートしています。
学習ハードルもそこまで高くないので、初学者の方でも習得しやすい言語ではないでしょうか。
Ruby
Rubyは、シンプルで読みやすい構文が特徴のオブジェクト指向言語です。Ruby on Rails(Rails)という強力なフレームワークを用いて、高速にアプリケーションのプロトタイピングが可能です。Railsは「Convention over Configuration」の原則を採用しており、設定よりも規約を重視することで、開発者が迅速にアプリケーションを構築できます。
Rubyは、特にスタートアップ企業や小規模チームで人気があり、迅速な開発サイクルやメンテナンスの容易さから、多くのモダンなWebアプリケーションの開発に使用されています。
⑨フレームワークを駆使して開発ができる
フレームワークの習得は、効率的なバックエンド開発において不可欠です。フレームワークは、アプリケーションの構造を提供し、開発プロセスを標準化します。これにより、セキュリティ、データベース操作、セッション管理などの共通タスクを簡素化し、開発効率を高めてくれます。
NestJS
NestJSは、TypeScriptをフルに活用したNode.jsのフレームワークで、Angularの設計思想に影響を受けています。このフレームワークは、効率的なアプリケーションアーキテクチャを実現するための強力な依存性注入システムを提供します。NestJSは特に、大規模なエンタープライズアプリケーションの開発に適しており、モジュール化された構造によって、大規模なチームでも効率的な開発が可能です。
Laravel
Laravelは、PHP言語で書かれた現代的なフレームワークです。Eloquent ORM、Bladeテンプレートエンジン、ミドルウェア、ルーティング、セッション管理など、強力な機能を備えています。これらの機能により、Webアプリケーションの迅速な開発が可能になります。
Ruby on Rails
Ruby on Railsは、Ruby言語を基にしたフレームワークで、「Convention over Configuration」の原則により、開発者は余計な設定作業に時間を費やすことなく、アプリケーションの構築に集中できます。RailsはMVCアーキテクチャを採用しており、データベース操作、ビジネスロジック、UIの分離が容易です。また、ActiveRecord ORM、ルーティング、ビューのテンプレートなど、多くの機能を内蔵しており、開発の迅速化に貢献します。
➓セキュリティについての基礎知識
開発したサービスを保守するのも、バックエンドエンジニアの仕事の1つです。セキュリティについて正しく理解することで、サービスを安全に運用することができます。
サービスやWebアプリケーションを実装する際の注意点などをしっかりと理解しておきましょう。
下記著書で体系的に学べます。
「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践」
記事などがいい方は下記を読んでみてください。
11.Dockerについての基礎知識
開発者が使用しているコンピュータはMac OSX、Windowsなどの違いがあったり、人によって様々なソフトウェアが入っているなど、実行環境を共有するのは容易ではありません。
そこで、仮想化によってフラットな仮想マシンを作成し、その仮想マシンを作成する設定などを共有することで実行環境を共有することが考えられますが、従来のホスト型仮想化では、動作がとても重く、共有するためのファイルも軽量とは言えませんでした。
一方で、Dockerのコンテナ型仮想化は、軽量な動作と環境ファイル共有を実現しています。
プログラムの実行環境を管理するための仕組みとしてDockerがあり、それを共有するための仕組みとしてDockerHubなどのサービスがあります。
Dockerを使用することの一番のメリットは「ソフトウェアの実行環境を、複雑なアーキテクチャであっても、Dockerを使って管理することで、簡単にどんなマシンにでも共有できる」という点です。
最近はDockerで環境構築しているプロジェクトが非常に多いので、こちらもマストで使えるようになっておきましょう。
入門編として下記がイラスト付きで非常に分かりやすいです。
その次に下記で学習すると理解も捗ると思います。
12.設計についての基礎知識
駆け出しの頃は設計から任されることはあまりありませんが、それでも設計書を読みながら開発を進めていくことになりますので基礎知識をつけておくことは非常に重要です。
理想はパッと小さい設計をお願いされてもいいように、日頃から勉強しておくといいでしょう。
DB設計
データベース設計は、データの構造をどのようにデータベースに格納するかに関するプロセスです。良いDB設計は、データの整合性、効率的なデータアクセス、スケーラビリティを保証します。
言わずと知れた名著ですが紹介しておきます。設計に関わるのであれば必らず読んでおきましょう。
API設計
先ほどのAPIの項目でもAPI設計は出てきましたね。
具体的に何をどう意識して設計していけばいいかを学びましょう。
ER図
ER図(Entity-Relationship Diagram)は、データベースのエンティティとそれらの関係を図式化したものです。ER図を作成することで、データベースの構造を視覚的に理解し、設計プロセスを助けることができます。
13.アーキテクチャについての基礎知識
アーキテクチャとは、一般的には、システムや構造の設計や構築に関する概念を指します。主に、ソフトウェアアーキテクチャと呼ばれることが多く、これはソフトウェアシステムの構造に関するパターンのことをいいます。
適切なアーキテクチャを選択することで、システムの拡張性、保守性、性能、セキュリティなどの重要な品質属性を確保し、開発者や保守者が効果的に作業できるようにするために重要な役割を果たします。
クリーンアーキテクチャ
ソフトウェアアーキテクチャは、システムの基本的な構造を定義し、コンポーネント間の関係、配置、通信、動作原理を規定します。効果的なアーキテクチャは、拡張性、保守性、スケーラビリティなどの側面を強化し、長期的なソフトウェア開発プロジェクトの成功に不可欠です。以下のアーキテクチャスタイルは、現代のソフトウェア開発において特に重要です。
このアーキテクチャはソフトウェアをレイヤーに分けることで依存関係の分離を実現し高品質なシステムを構築するアプローチです。
マイクロサービスアーキテクチャ
マイクロサービスアーキテクチャは、アプリケーションを小さく独立したサービスに分割し、それぞれを独立して開発、デプロイ、運用するアプローチです。このアーキテクチャは、システムのスケーラビリティと柔軟性を向上させ、チームが個々のサービスに集中して作業できるようにします。
BFF
BFFは、特定のフロントエンドに最適化されたバックエンドサービスを提供するアーキテクチャパターンです。
このアプローチにより、フロントエンドのニーズに合わせたAPIを提供し、ユーザー体験を向上させることができます。
14.テストが書けるようになる
プロジェクトによってテストを書くか書かないかは様々です。
比較的小さいプロジェクトではあまりテストに重きを置いていない印象を受けますが、いずれにせよテストコードが書けるように学んでおきましょう。
そもそものテストの必要性や、テスト戦略について下記記事が非常に分かりやすいです。
具体的なテストについては下記記事なんかを参考にするといいかもしれません。
15.その他
少し余談にはなりますが、TDDやDDDのような開発手法についても知っておくといいと思います。
余談
すごくどうでもいい余談ですが、下記記事がすごく面白かったので共有しておきます。
先ほどもセキュリティの話題に触れたので、逆にセキュリティを考えずに実装した場合はこんなことになる…という実際にあったお話を面白く書いてくださっています。
記事を見てると笑えますが、実際に自分が関わるプロジェクトだと思うと笑えませんね…笑
終わりに
ここまで、バックエンドエンジニアのジュニアレベルに求められるスキルについて深掘りして見ていきましたがいかがだったでしょうか?
もちろん、プログラミングの世界は物凄く奥が深いので「これもマストだよ」とか「これもいるんじゃない?」というご意見もあるかと思います。
これらの内容はすべて、他の方の記事や実際の現場を見た上で必要とされている技術を私なりに示したものになります。
少しでも、この先のキャリアに悩む駆け出しエンジニアさんの力になれたら嬉しいです。
参考