技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

誰かの作ったビルド環境だけで仕事してた人も、ビルド環境構築を覚えるべき理由

Java を例に挙げますが、大体他の言語でも一緒。
半分ライブラリの紹介。

環境構築を覚える理由

ビルド環境をIDEとかに頼らず自前で作ることには大きな意味があります。
それは、自動ビルド、自動テスト、CI への入門になります…のも大きな理由ですが、

何を言ってるかわからない?なら実例で行きましょうか。

Webアプリを作成したあと、本番環境へのリリース。
あなたは何をしますか?

  1. Eclipse を立ち上げる
  2. ビルドタスクを実行する
  3. 出来上がった war をFTPソフトに食わせて Tomcat へアップロードする

これ、 死ぬほどめんどくさくないですか?
UT やり忘れててギャーとか、他の人の環境でコンパイルできないとか、操作ミスってギャーとか、そんな地獄を見たことないですか?

それは 自動化しないから、出来ないから発生する問題なんです。

開発環境を自力で構築するというのは、ビルドやテストのコマンドを、完全に自分の管理下に置くと言う事です。
そこまで来れば、コンパイル/テスト実行/ビルド実施/サーバへのデプロイ 全てがコマンドにできる(手作業でやらなくてもシェルで解決できる)。

ミスをせず、楽ができる のです。

だから開発者はビルド環境を自分で作れるのが重要なのです。

めんどくさくないか?

なるほど覚えるのはめんどくさいかもしれません。
そんな環境を作るのも自動でできるわけじゃありませんから。

ではそんな人にモチベーションを与えましょう。

自分でコードを書かないため というのもこれまた大きな理由です。
これは他人に書かせるとか言ってる訳ではなく、いろんなライブラリをうまく使って、お任せしようと言っています。

例えば有名どころでは Lombok とかは大体どこへ行っても大活躍する。

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class TestBean {
    private long id;
    private String name;
}

これだけで Getter/Setter/toString や、使ってないけど equals も実装。
しかも全要素を引数に持つコンストラクタまで作ってくれる。

        TestBean test = new TestBean(35L, "Azalea");

        System.out.println(test);  // TestBean(id=35, name=Azalea)

        test.setName("Welcome");
        System.out.println(test);  // TestBean(id=35, name=Welcome)

        System.out.println(test.getId()); // 35

これを組み込むのは、gradle であれば

plugins {
    id 'java'
    id 'application'
    id 'io.franzbecker.gradle-lombok' version '1.14'
}

lombok {
    version = '1.18.4'
    sha256 = ""
}

これで済む。
でもこれはプロジェクトにおいては大抵、ビルド環境を作る側の人が、知らなきゃできないことです。

これに慣れてしまうと、Getter/Setter の IDE による自動生成すらクソコードに見えてくる(そもそも自動生成のコードが美しい訳はないのだが…)。

因みに Scala 好きな私は Vavr とか勧めるけど、関数型はまた別世界の話なので、気が向いたら試す事をお勧めします。
もしそれに目覚めたら、Scala とか関数型の門を叩きましょう。綺麗に実装できれば、Java+Lombok をさらに 60% 位までコード削減できます。

どうやって覚えるか?

これは正直やってみる以外の選択肢がありません。

勉強会や、このブログを見て「知る」だけでも確かに違いますけど、「知っている」ことと「理解している」事は似て非なるもの。
「理解」しなければ応用はできません。

覚えるものも、「仕事で一度でも使ったものを自分で構築する」だけでも随分違うでしょう。
そして理想を言えば使ったことの無いものを試してみるのが望ましいです。

因みに Javaer の人なら、DI/Aspect なんてものを基板設計で使えると、一気に世界が変わるので、未経験であれば SpringBoot を試すのが良いかもしれません。

spring.io

Spring は難しそうなイメージがつきますが、SpringBoot になってから大分楽になりました。

  • アプリケーション開発の初期基盤をブラウザ上で自動生成+ダウンロードできる
  • デフォルト動作がしっかりしているので、細かい設定なしにいきなりアプリが作れる
  • チュートリアルが充実しているので、英語が読めれば公式だけでやりたいことがほぼできる
  • Spring ファミリーのライブラリが死ぬほど充実してるので、公式のライブラリを探して組み合わせ(組み合わせ方のチュートリアルもある)するだけで大体できる

特に初期のビルド設定が、複雑なカスタムもなく吐き出してくれるので、これを入門にビルド環境構築を始めても悪くないように思います。

ビルド環境を覚えた先

自分でビルド環境が構築できるようになれば、ここで初めて自動化の道が開けます。

  • テストフレームワークや、カバレッジ設定、FindBugsCheckstyle等を試してみましょう。
  • コマンドラインからテスト/ビルドできることを利用して、Git/SVN など、サーバ上のソース更新をトリガーに動くよう仕掛けてみよう。
  • Jenkins/CircleCI/AzureDevOps など、CI 環境を試してみよう。因みに挙げたやつの左の方が安い(てかJenkinsはOSS
  • Chef/Ansible/Puppet/Capistrano 等リリース環境を自動でくみ上げる系のツールを使ってみる(Linux マシンにデプロイする場合等)
  • Docker/K8s 等をアプリケーション実行用のマイクロOSイメージを作成、デプロイを弄ってみる

そう、我々はエンジニアです。
その美徳はなんだ?

  • 短期
  • 傲慢
  • 怠惰

ですよ、怠惰するために色々覚えようじゃないですか