熟練エンジニアがUNIX系OSを選ぶ理由

僕は、Pythonコードをほどほどに触れるピヨピヨエンジニア(?)ですが、現代のエンジニアリング界では、多くのプロフェッショナルがUNIX系のオペレーティングシステム(OS)を選択しています。

この記事では、なぜ熟練のエンジニアがUNIX系のOSを選ぶのか、その理由を解説します。

バックエンドとフロントエンドを理解しよう

おそらく、この疑問を持っている方は僕を含め初心者のエンジニアの方かと思います。

本題に入る前に、バックエンドとフロントエンドの基礎をおさらいしましょう。

バックエンド

バックエンドとは、アプリケーションのサーバー側のことを指し、データの処理、ストレージ、アプリケーションのロジックを担当します。

これにより、ユーザーがフロントエンドを通じて行ったリクエストに対して、適切なデータやサービスを提供できます。

バックエンドのフレームワークには様々の種類があり、有名なものだとFastAPI、Django、Flaskなどがあります。

これらの名称は、初心者エンジニアの方でも聞いたことがあるのではないでしょうか。

FastAPI、Django、Flaskは、それぞれ異なる特徴を持つPythonのバックエンドフレームワークであり、プロジェクトのニーズや個人の好みに応じて適切なフレームワークを選択することがポイントになります。

FastAPI

  • 高性能: 非同期プログラミングをサポートし、非常に高速です。
  • モダン: Python 3.6+の型ヒントを利用し、自動的にデータ検証とシリアライゼーションを行います。
  • 自動ドキュメント生成: SwaggerやReDocを利用して、APIのドキュメントを自動生成します。
  • 適用範囲: RESTful APIやマイクロサービスの開発に最適です。

Django

  • フルスタック: 「バッテリー同梱」アプローチで、多くの組み込み機能を提供します。
  • セキュリティ: SQLインジェクションやクロスサイトスクリプティングなど、一般的なセキュリティ問題に対する対策が組み込まれています。
  • 管理インターフェース: 自動的に管理インターフェースを生成し、データベースの管理を容易にします。
  • 適用範囲: 大規模なアプリケーションや多くの組み込み機能を必要とするプロジェクトに適しています。

Flask

  • 軽量: 「マイクロフレームワーク」として設計され、必要最小限の機能を提供します。
  • 柔軟性: 必要に応じて機能を追加することができ、開発が柔軟に行えます。
  • シンプルで簡潔: APIが非常にシンプルで、Python初心者にも扱いやすいです。
  • 適用範囲: シンプルなウェブアプリケーションや小規模プロジェクト、プロトタイピングに適しています。
ポイント

どのフレームワークを選択すれば良いのか?

FastAPI: 高性能を必要とするRESTful APIやマイクロサービスの開発に最適です。
Django: 大規模で複雑なウェブアプリケーションや、多くの組み込み機能を前提とするプロジェクトに向いています。
Flask: シンプルさと柔軟性を求める場合、または小規模プロジェクトやプロトタイピングに適しています。

フロントエンド

フロントエンドとは、ユーザーが直接触れるアプリケーションのクライアント側のことを指します。

これには、ウェブサイトやアプリのユーザーインターフェイス(UI)やユーザーエクスペリエンス(UX)の設計が含まれます。

フロントエンド開発とは、ウェブブラウザで動作するユーザーインターフェイスの構築を指し、この領域では主にJavaScriptが使用されます。

そのため、React、Angular、Vue.jsなどの主要なフロントエンドフレームワークはJavaScriptまたはTypeScriptで書かれています。

React

  • ライブラリ: ReactはFacebookによって開発されたユーザーインターフェースを構築するためのJavaScriptライブラリです。
  • コンポーネントベース: UIを独立した再利用可能なコンポーネントに分割し、それぞれが自身の状態を持つことができます。
  • 学習曲線: 比較的学習しやすく、小規模なプロジェクトから大規模なアプリケーションまで幅広く対応できます。
  • バーチャルDOM: 効率的なUIレンダリングを可能にするためのバーチャルDOMを使用しています。
  • エコシステムと柔軟性: 大規模なコミュニティと豊富なエコシステムを持ち、ReduxやMobXなどの状態管理ライブラリと組み合わせて使用されます。

Angular

  • フルフレームワーク: Googleによって開発された、モデル・ビュー・コントローラー(MVC)パターンに基づくフルフレームワークです。
  • TypeScriptベース: 開発にはTypeScriptを使用し、静的型付けの利点を享受できます。
  • 組み込み機能: フォーム管理、HTTPクライアント、ルーティング、国際化、依存性注入など、豊富な組み込み機能を提供します。
  • 学習曲線: 豊富な機能性が学習曲線を高くしていますが、大規模アプリケーションの開発に適しています。
  • コミュニティとエコシステム: 大規模なコミュニティサポートと豊富なリソースがあります。

Vue.js

  • プログレッシブフレームワーク: Evan Youによって開発された、簡潔さと柔軟性を重視したフレームワークです。
  • 簡単な統合: 既存のプロジェクトにVue.jsを部分的に適用することが容易で、徐々に導入を進めることができます。
  • 詳細なドキュメント: 学習リソースが豊富で、ドキュメントが非常にわかりやすいです。
  • リアクティブかつコンポーネントベース: データバインディングとコンポーネントシステムを提供し、高速なレンダリングと簡単な状態管理を実現します。
  • エコシステム: VuexやVue Routerなど、Vue.jsエコシステム内の公式ライブラリが開発をサポートします。
ポイント

どのフレームワークを選択すれば良いのか?

React:大規模なエコシステムと柔軟性を求めるプロジェクト、またはコンポーネントベースの開発に興味がある場合に適しています。
Angular:フルフレームワークの一貫性と強力な機能を備えた、大規模で複雑なアプリケーションの開発に最適です。
Vue.js:シンプルさと柔軟性、簡単な学習曲線を求める中小規模のプロジェクトや、徐々にフロントエンドフレームワークを導入したい場合に最適です。

アプリケーションをビルドする

アプリケーションをビルドする際、フロントエンドとバックエンドは密接に連携します。

フロントエンドはユーザーからの入力を受け取り、そのデータをバックエンドに送信して処理します。

バックエンドは、データを処理し、必要に応じてデータベースから情報を取得・更新し、結果をフロントエンドに返します。

2つをつなぐものがAPI

フロントエンドとバックエンドのフレームワークを繋げるには、一般的にAPI(Application Programming Interface)を使用します。

APIは、フロントエンド(クライアントサイド)とバックエンド(サーバーサイド)間でデータを交換するための仕様またはプロトコルです。

フロントエンドフレームワーク(例:React, Angular, Vue.js)を使用して、バックエンドのAPIエンドポイントにリクエストを送信します。

APIエンドポイントのベースURLは、開発中は localhost のようなローカルアドレスであることが多いです。(例:http://localhost:8000 など)

http://localhost:8000 はAPIサーバーのベースURLを表し、それに続く /api/users や /api/users/{id} などが具体的なエンドポイントを形成します。

アプリケーションを開発する流れ

アプリケーションを開発する過程には、多くのステップが含まれます。

その中でも、特に重要なのがフロントエンドとバックエンドの開発です。

それぞれの開発プロセスには、特定のツールやコマンドが必要になります。

yarn startコマンド

yarn startコマンドは、フロントエンド開発において非常に重要なコマンドの一つです。

このコマンドを実行すると、ローカル開発サーバーが起動し、開発中のアプリケーションをブラウザでプレビューすることができます。

これにより、開発者はコードを変更した際の結果をリアルタイムで確認しながら開発を進めることができます。

ローカルサーバーはファイルの変更を監視し、自動的にブラウザを更新してくれるため、効率的にフロントエンドの開発が行えます。

バックエンド側 pythonで仮想環境の構築

Pythonの仮想環境の構築は、バックエンド開発において基本となるプロセスです。

python -m venv コマンドを使用して仮想環境を作成し、activate コマンドでその環境をアクティブにします。

仮想環境を使用することで、プロジェクトごとにPythonのバージョンやライブラリの依存関係を分離することが可能になります。

これにより、異なるプロジェクト間での依存関係の競合を防ぎ、プロジェクトの整合性を保つことができます。

APIの実装築

バックエンドでAPIを設計し、データのやり取りを行うエンドポイントを実装します。

フロントエンドからのAPI呼び出し

フロントエンドからバックエンドのAPIエンドポイントに対してリクエストを送信し、データを取得または送信します。

UNIX系のOSが選ばれる理由

中小企業が一般的に利用しているOSは、windowsがほとんどかと思いますが、熟練のエンジニアの多くはUNIX系のOS(MacやLinux)を使用します。

その理由を見ていきましょう。

バックエンドとフロントエンドが理解できていれば、UNIX系のOSのメリットを理解できるはずです。

結論、「UNIX系のOSでは、フロントエンドとバックエンドの上記の実装をする際に、専用のコマンドが用意されており、独自のカスタマイズが効いて開発しやすい」ということです。

sourceコマンド

source コマンドは、シェルスクリプトや環境設定ファイルを現在のシェルセッションで読み込み、実行するために使用されます。

このコマンドを使うことで、変更した設定を新たにログインせずとも反映させることが可能になります。

これは、開発環境の設定変更や、アプリケーションの環境変数を動的に管理する際に非常に便利です。

source コマンドは、UNIX系OSに共通の機能です。

batコマンド

bat コマンドは、cat コマンドの高機能版として機能し、ファイルの内容をシンタックスハイライト、行番号表示、gitの変更点の統合表示など、読みやすく表示します。

このツールは、コードのレビューやデバッグプロセスを容易にし、開発者の生産性を向上させます。

Windowsでも、WSL(Windows Subsystem for Linux)を通じて使用することが可能ですが、ネイティブのWindowsコマンドとは異なります。

curlコマンド

curl コマンドは、コマンドラインからウェブサーバーと通信するためのツールです。

APIエンドポイントへのリクエスト送信や、ウェブサイトの内容の取得、ファイルのアップロードやダウンロードなど、多岐にわたる機能を提供します。開発中にAPIの動作確認や、外部サービスとの連携テストを行う際に重宝します。

curl コマンドは、Linuxだけでなく、多くのオペレーティングシステムで使用可能なクロスプラットフォームのコマンドラインツールです。

macOSやWindows(特にWindows 10の後半のバージョンからはデフォルトで含まれています)でも使用できます。

例えば、curl http://localhost:8000 はローカルに実行中のサーバーからデータを取得する際に使われます。

独自にコマンドを実装

UNIX系のOS環境では、bashやPythonなどのスクリプト言語を用いて独自のコマンドやユーティリティを作成することができます。

これにより、繰り返し行う作業の自動化、プロジェクト特有の操作の簡略化、開発プロセスのカスタマイズなどが可能になり、開発の効率化に大きく貢献します。

例えば、開発するソースコードの置き場所を決めておいて、ホームディレクトリ配下の/dev/srcに置くことを想定します。

このディレクトリに一気に移動するコマンド「cdd」を実装することで、日常的な作業効率を高めることができます。

Fuzzy Finderであいまい検索し、すぐ目的のディレクトリに移動できるように実装する

Fuzzy Finder(fzfなど)を利用すると、全てフルパスを打たずに目的のディレクトリやファイルをあいまい検索し、迅速にアクセスすることが可能です。

cdコマンドと組み合わせることで、深いディレクトリ構造の中からも瞬時に目的の場所に移動することができます。

このスニペットは、現在のディレクトリからサブディレクトリをfzfで検索し、選択したディレクトリに移動する関数です。

この関数もシェル設定ファイルに記述することで、ターミナルから簡単に呼び出せるようになります。

VScodeを開くのも「code」コマンド一発

macOSにおいては、Visual Studio Codeを開くためのコマンドcodeがあります。

これと同様に、自分だけのカスタムコマンドを作ることで、より効率的な開発環境を構築できます。

たとえば、特定のテキストエディタを開くコマンドや、プロジェクトに特化したビルドスクリプトを簡単に実行できるようにすることなどが可能です。

これらの技術を駆使することで、開発プロセスを大幅に効率化し、より創造的な作業に集中できる環境を整えることができます。

Alacritty + Starshipでターミナルを高速化

AlacrittyはGPUを活用した高速なターミナルエミュレーターで、Starshipはクロスプラットフォーム対応のシェルプロンプトです。

これらを組み合わせることで、開発者の作業効率を大幅に向上させることができます。

まとめ

UNIX系のOSは、そのカスタマイズ性とセキュリティ、開発者向けの豊富なツールとコミュニティサポートにより、バックエンドおよびフロントエンド開発に最適な環境を提供します。

このため、多くの熟練エンジニアがWindowsではなく、UNIX系のMacやLinuxを選んでいます。

このレベルに至るまで日々研鑽を積み重ねていきましょう!