🔰

駆け出しエンジニアのための新規領域の学習方法と実装の流れ

2024/11/18に公開

はじめに

こんにちは、クラウドエース第一開発部所属の上原です。

本記事では、駆け出しデータエンジニアである私が、会社からの課題である
データ分析基盤構築課題 (以下、基盤構築課題) に取り組む中で感じたり実践したりした
おすすめの学習方法と、実際の課題への取り組みについて紹介していきます。

この記事の目的は、新規領域全般に触れる際のおすすめの学習方法を共有することです。
ただし、記事の全体として、筆者にとっての新規領域であるデータエンジニアリング
(基盤構築課題) をベースとした内容になっています。

本記事はこんな人におすすめ

本記事は次のような方々をターゲットに想定しています。

  • 触れたことのない技術領域にチャレンジしたい方
  • これからデータエンジニアを目指したい方
  • プログラミング自体初心者の方

本記事の前提

まずは、本記事の前提となる筆者自身についてと、基盤構築課題について紹介します。
どんなレベル感の人が何を作るのかによって、詰まる箇所やキャッチアップに必要なものが変わってくるはずなので。

1. 筆者のスペックについて

筆者である私自身についてはじめに触れておきます。
入社時点での筆者のスペック、および経験は以下の通りです。

  • 2024 年 4 月にクラウドエースに新卒入社
  • データエンジニアとしての経験はゼロ
  • web アプリ開発経験が約 2 年 (実務経験あり)
  • Git や基本的なコマンドなど、開発の土台となる知識は業務に困らない程度にはあり
  • データエンジニアに役立ちそうなものとして、SQL やデータベースの基礎知識あり

2. 基盤構築課題について

続いて、基盤構築課題についてです。

課題内容はざっくり説明すると、
Cloud Storage に定期的にアップロードされる CSV ファイルを BigQuery にロードする
というものになります。

以下、補足情報です。

  • インフラは Google Cloud を使用 (弊社は Google Cloud に強みのある会社のため)
  • 対象データはメジャーリーグの試合データ
  • 毎日、ロードされたデータをもとに、各チームの順位を集計し順位テーブルを更新 (作成) する
  • 要件ではないが使用言語は Python

基盤構築課題の学習と取り組み

ここからは、実際にどのように基盤構築課題を進めていったのかについてです。
設計、ロード機能、順位集計機能において、それぞれ事前の学習と課題として行なったことを
書いていきます。

1. 設計

学習

設計の学習として行ったものとしては、主に Google Cloud のサービスについての勉強です。
厳密には、基盤構築課題のために行なったものではなく、Google Cloud 認定資格のために行なった
勉強なのですが、設計を考える上でもかなり役に立ちました。

ちなみに、この時点での筆者の Google Cloud のサービスの知識感としては、
各サービスの機能やユースケースを全般的に薄く把握していて、

あたりを問題なく取得できるくらいです。
(この課題の設計を考えるくらいなら ACE くらいの知識感で十分かも?)

また、具体的に学習したものとしては、

の 2 つが挙げられます。

エンジニアの種類によって使用するサービスには偏りが出てくると思うので、
サービス全般を把握しておく必要があるかというとなんとも言えませんが、
駆け出しエンジニアの方にとっては、サービスを広く浅く把握できるような教材はおすすめです。

設計を考える

基盤構築課題の中で、

  • データレイクに Cloud Storage
  • データウェアハウスに BigQuery

を使用することは指定されていたので、私が考える必要があったのは

  • ロード機能
  • 順位集計機能

にそれぞれ何のサービスを使用するかについてでした。

幸いこの設計については特に詰まることはありませんでした。
というのも、先述した通り、資格のための勉強を通して、
各サービスの内容や特徴、ユースケースなどは薄く把握していたからです。

そこで、設計として

  1. ロード機能に、 Cloud Run 関数
  2. 順位集計機能に、BigQuery の Scheduled Query

を使用することを選択しました。

設計を図に起こしたものがあるので、一応載せておきます。

基盤構築設計図

2. ロード機能

学習

ロード機能の学習は、以下のプロセスで行いました。

  1. Google Cloud Skills Boost
  2. 生成 AI による解説確認
  3. 社内コード確認

Google Cloud Skills Boost

前提として、筆者が実装に係る教材に求める条件は、

  • サンプルコードが記載されていること
  • 順を追ってコードの解説がされていること

の両方を満たしていることです。

ということで、Cloud Run 関数のいい感じの教材を探していてまず見つけたのが、
Google Cloud Skills Boost のラボでした。

しかし、Google Cloud SKills Boost のラボ全般に当てはまることなのですが、
コードに対する解説がほとんどありません。
どちらかというとラボは深く理解するためというより、実装の全体像を掴むためのもの
だと思います。

生成 AI による解説確認

ラボのサンプルコードを軽く確認し、実装のイメージをつけたところで、
次に解説ありの教材も探すことにしたのですが、見つけることができませんでした。

そこで、解説は生成 AI の力を借りることにしました。

生成 AI には、ラボのコードを課題の要件に合うように直してもらい、
そこに解説をつけてもらいました。

出力されたコードを確認すると、ラボのものとは細かい点は異なりますが、
やっていることはほぼ同じで、試しにデプロイしてみても正常に機能したので、
コードとして誤りなどはないと判断しました。

参考までに、以下が生成 AI が出力したコードです。

main.py
import functions_framework
from google.cloud import bigquery

# Triggered by a change in a storage bucket
@functions_framework.cloud_event
def main(cloud_event):
    data = cloud_event.data

    bucket = data["bucket"]
    file_name = data["name"]

    # BigQueryクライアントの初期化
    client = bigquery.Client()
    dataset_id = 'YOUR_BQ_DATASET' #あなたのBigQueryデータセットIDに置き換え
    table_id = 'YOUR_BQ_TABLE' #あなたのBigQueryテーブルIDに置き換え
    table_ref = client.dataset(dataset_id).table(table_id)

    # ジョブの設定
    job_config = bigquery.LoadJobConfig(
        source_format=bigquery.SourceFormat.CSV,
        skip_leading_rows=1,  # ヘッダー行をスキップ
        autodetect=False
    )

    uri = f'gs://{bucket}/{file_name}'

    # CSVファイルをBigQueryにロード
    load_job = client.load_table_from_uri(
        uri,
        table_ref,
        job_config=job_config,
    )

    # ジョブの完了を待つ
    load_job.result()

    print(f'Loaded {file_name} into {dataset_id}.{table_id}')

解説については、上記コードであればたとえば、functions_framework や cloud_event
あたりについて教えてもらいました。

しかし、生成 AI の解説には誤りが含まれる可能性があるため、
ドキュメントなどの一次ソースをもとに、解説が本当に正しいか確認も行いました。

社内コード確認

最後に社内コードの確認も行いました。

理由としては、今までの web アプリ開発の経験上、
「動くだけのコードとしては問題ないけど、実際の業務ではそんな書き方しないよ」
というケースがあるためです。
私の体感では、完全な初学者向けの学習サービスに多い気がします。

ということでリポジトリを覗くと、案の定ラボや生成 AI のコードとはかなり違いました。
どう違うかというと、参考にしたリポジトリのコードはいい感じのモジュールに分割されて
いました。

ロード機能実装

ロード機能の実装は、生成 AI に出力させたコードを社内コードのように
モジュール分割することがメインとなりました。
また、今回の課題の要件的に必要のないコードを削ったり、諸々の変更に対応する修正
についても行いました。

コードの修正すべき箇所の特定や、実際の修正については、ラボや生成 AI の学習プロセス
を経ていたおかげで、比較的スムーズに行うことができました。

3. 順位集計機能

学習

順位集計は SQL のクエリで行うため、SQL の知識が必要となりました。
筆者のスペックで紹介した通り、SQL の基本的な知識はあったので、
ゼロから学習するというよりは知らない知識をピックアップしていく形で学習しました。

使用した教材は以下の 2 つです。

筆者は知らない知識だけを拾う方法を取りましたが、SQL が全くわからないという人は、
その場で必要なものだけを拾っていくのではなく、一度体系的に学習すると後に応用が
効きやすいのかなと思います。
体系的に学習できる教材が揃っているもの限定ですが、SQL 以外にも当てはまるはずです。

順位集計機能実装

順位集計機能については、 SQL の基礎的な知識はインプットできていたので、
苦労はしましたが時間をかけて地道に作りました。
(サブクエリを単独で実行して結果を確認してみたり)

ただ、作ったクエリは単に順位を集計できるというだけであって、クエリの効率などは
考慮されていません。
そのため、機能としては問題なくても業務で使えるレベルではなさそうなので、
出来としては要修正といったレベルだと思います。
ロード機能のように似たものがどこかのリポジトリに落ちていて手軽に探せるとかはないので、
ここは純粋な SQL 力や BigQuery の知識を身につけていくしかなさそうです。

最後に、作ったクエリを Scheduled Query としてデプロイする必要がありました。
こちらに関しては、Google Cloud コンソールで、BigQuery の Scheduled Query
をポチポチしていたら簡単に設定できました。
画面で案内される通りに操作していけば難しいこともないので、繰り返しになりますが、
知らないものでもとりあえず触ってみることも大事だと感じました。
(ちなみに、ロード機能では BIgQuery の Data Transfer Servise の使用も検討しており、
これも BigQuery のコンソールを触っていて偶然知ったもの)

コンソールはこんな感じ ↓

BigQuery の Scheduled Query コンソール画面

4.その他 (テスト)

その他として、課題の中で単体テストと結合テストを行ったのですが、
自分の中でまだあまりまとまっていないので (特に単体テスト)、本記事では内容については
特に触れません。

実施自体はしているので、課題への取り組みの流れを知ってもらうために、「実施したよ」
ということだけ一応書いておきます。

まとめ

ここまで、筆者にとっての新規領域である基盤構築課題をベースに、
おすすめの学習方法と、実装について説明してきました。

まとめると、

新規領域を学習する際のおすすめの学習方法は

  • まずは体系的に学習できる教材を探そう
    (サンプルコードと、コードの解説があるものがいい)
  • ものによってはいい教材が見つからないかもしれないので、生成AIに補助してもらうのがお勧め
    (裏どりも忘れずに)
  • 動くだけのコードを卒業して、業務コードも確認してみよう
    (必須というわけではないが、ステップアップのため)
  • 時間をかければできるものは、自力でやってみるのも練習としてはあり
  • よくわからないものでもとりあえず触ってみるとわかってくることもあるはず

ということになるのかなと思います。

(あくまで筆者個人の考えなので、「この学習方法の方がいいよ」みたいなのを教えてもらえると
嬉しいです)

Discussion