🌦️

言語とフレームワーク

2023/07/27に公開

面接を受けるたびに早く、
現役のエンジニアの方と対等に話せるようになりたいという
思いが強るこの頃です。。

これまで、ただ人気な言語だから、
という簡単な考えでしか言語やフレームワークを選択できていなかったかも、
それぞれの違いやメリットデメリットってきちんと理解できていなかったかなと
思うことがあったので、やっていきます。


まず、どの言語が最適かは、具体的なプロジェクトの要件や目的、開発チームのスキルなどによります。

JavaScript

ブラウザで動く唯一のプログラミング言語であり、動的なウェブページを作成するために必須。
近年ではフレームワーク(React、Vue.js、Angularなど)のおかげで、
大規模なアプリケーションの開発も可能になりました。
また、Node.jsの出現により、バックエンド開発も可能になりました。

メリット

  • クライアントサイドで実行でき、インタラクティブなWebページを作成するのに最適。
  • フレームワークやライブラリが豊富。

デメリット

  • 言語設計に一貫性がなく、学習が難しい部分もある。
  • また、大規模なプロジェクトではコードの管理や品質保持が難しくなることがある。

TypeScript

Microsoftが開発したJavaScriptのスーパーセット(上位互換)であり、
JavaScriptに静的型付けとクラスベースのオブジェクト指向を追加します。

大規模なプロジェクトでは、静的型付けのおかげでバグを早期に発見し、
コードの理解を助けるために利用されます。

CoffeeScript, Dartなど

これらもJavaScriptに変換される言語で、
JavaScriptの問題点を改善するための構文や機能を提供します。

Python

バックエンド開発だけでなく、データサイエンス、AI、機械学習にも広く使われています。
その構文の簡潔さと可読性から学習が容易で、初心者にもよく推奨されます。
DjangoやFlaskといったフレームワークが存在します。

メリット

  • 書きやすさと可読性が高く、初心者にとって学びやすい。
  • データ分析や機械学習、Web開発など、幅広い用途に使える。

デメリット

  • 実行速度が他の言語と比べて遅い場合がある。
  • モバイルアプリの開発には適していない。

Java

オブジェクト指向プログラミングの概念に基づいて設計されており、
プラットフォームに依存しない特性からエンタープライズ環境で広く利用されています。
Spring Frameworkという強力なフレームワークも存在します。

メリット

  • プラットフォームに依存しない(「一度書けばどこでも動く」)。
  • 大規模なエンタープライズシステムに適しており、堅牢なオブジェクト指向機能を持つ。

デメリット

  • 言語自体が比較的複雑で、規模が大きくなるとコードの管理が難しくなる。
  • 学習コストが高く、初学者にとってはハードルが高いことがある。

PHP

ウェブ開発に特化した言語で、WordPressのようなCMSや、Laravelといったフレームワークが存在します。

メリット

  • Web開発に特化しており、CMSシステム(WordPressなど)で広く使われている。
  • 初心者にとって学びやすい。

デメリット

  • 言語設計に一貫性がなく、大規模なプロジェクトの管理が難しい場合がある。

C++

Microsoftが開発したオブジェクト指向言語で、.NETフレームワークと一緒に使用されます。
Windowsアプリケーションの開発や、ゲーム開発エンジンのUnityでの使用が一般的です。
ただし、文法が複雑で扱いが難しいともされます。

メリット

  • 高いパフォーマンスと直接的なシステムレベルのアクセスを提供し、ゲームや高性能計算に使われる。

デメリット

  • 難易度が高く、メモリ管理などの低レベルな概念を理解する必要がある。

Ruby

Rubyは直感的で読みやすい文法が特徴です。
Ruby on Railsというフレームワークを用いたWeb開発が一般的で、プロトタイプ作成や迅速な開発に適しています。

メリット

  • 読みやすく、書きやすい。そのため、開発がスムーズ。
  • 必要な機能を追加するための"Gem"というパーツがたくさんある。

デメリット

  • 他の言語に比べて動きが遅いことがある。
  • Rubyの特殊なルールに慣れるまでに時間がかかることがある。

そもそも、

フレームワークとは

フレームワークとは、特定のプログラミング言語でのソフトウェア開発を助けるためのツールセットのこと。

一般的なプログラミングタスクのためのライブラリの集合体であり、
開発者が必要とする機能を事前に用意し、コードの再利用を促進し、開発時間を短縮します。

Ruby on Rails(Ruby)

特徴
MVC(Model-View-Controller)パターンを採用しており、
データベースとの連携、テンプレートエンジン、ルーティングなどを備えたフルスタックフレームワークです。

メリット

  • コンベンションオーバーコンフィギュレーション(設定より規約)の原則に基づいて設計されているため、開発者がコードの構成を深く理解することなくアプリケーションを迅速に開発することが可能です。

デメリット

  • 大規模なアプリケーションやパフォーマンスが重要なアプリケーションには向いていないことがあります。
  • フレームワークの規約に従わなければならないため、柔軟性に制限があることもあります。

Django(Python)

特徴
データベース操作、認証、テンプレートエンジンなど、Webアプリケーション開発に必要な主要な機能を一通り提供するフルスタックフレームワークです。

メリット

  • フレームワーク自体が強力であり、多くの機能を備えているため、追加のツールやライブラリを追加する必要が少ないです。
  • Pythonの簡潔で読みやすい構文を活かした設計がされています。

デメリット

  • 大規模で複雑なアプリケーションを開発する際には、規約に従うことにより自由度が制限されることがあります。
  • 一部の機能については他のライブラリやフレームワークに比べて劣ることもあります。

Express.js(JavaScript)

特徴
Node.jsのための軽量で柔軟なフレームワークで、WebアプリケーションやAPIの開発に適しています。

メリット

  • ミニマリストであるため、開発者が必要な機能だけを選択して追加することができ、無駄がないです。
  • JavaScriptを使用するため、フロントエンドとバックエンドの両方で同じ言語を使うことができます。

デメリット

  • フレームワークが提供する機能が少ないため、開発者が多くの部分を自分で作るか、追加のミドルウェアを導入する必要があります。

React(JavaScript)

特徴
ユーザーインターフェースの作成に特化したJavaScriptライブラリで、コンポーネントベースの開発を可能にします。

メリット

  • コンポーネントベースのアプローチにより、コードの再利用性が高まります。
  • 仮想DOMを使用して効率的な更新とレンダリングを行います。

デメリット

  • ビューレイヤー(UI部分)のみに焦点を当てているため、完全なWebアプリケーションを構築するには他のライブラリやフレームワークと組み合わせる必要があります。

MVC/MVVM/MVP

MVC/MVVM/MVPはアーキテクチャパターンであり、特定のプログラミング言語に依存するものではありません。これらはソフトウェアの設計原則であり、どのプログラミング言語でも利用可能です。

ソフトウェアアーキテクチャパターンとは

実際にソフトウェアを設計するときに役立つ、既に試験されて理解された解決策の一種です。
ある種の設計の「テンプレート」であり、それを適用することで、特定の種類の問題を解決することができます。

ただし、特定のフレームワークやツールキットがこれらのパターンを特に採用・強調していることがあります。

フレームワークは特定の設計パターンを推奨することが多いですが、
それが唯一の選択肢であるわけではありません。

プロジェクトの要件に応じて、開発者自身でアーキテクチャをカスタマイズしたり、
別の設計パターンを採用したりすることも可能です。

フレームワークの推奨するパターンから大きく逸脱すると、
フレームワークの提供する機能を十分に活用できない場合があります。

MVC(Model-View-Controller)

MVCパターンは、例えばRuby on Rails(Ruby)、Django(Python)、
Spring MVC(Java)、Express(JavaScript, Node.js)など、
多くのウェブ開発フレームワークで採用されています。

MVVM(Model-View-ViewModel)

MVVMは主にマイクロソフトの技術スタックで用いられます。
例えば、XAMLベースのユーザーインターフェース技術(WPF、UWP)でC#と組み合わせて使用されます。
また、JavaScriptのフレームワークであるKnockout.jsやVue.jsでもこのパターンが採用されています。

MVP(Model-View-Presenter)

MVPパターンは、主にAndroidのアプリケーション開発(Java/Kotlin)で用いられます。
また、GWT(Google Web Toolkit)などのウェブフレームワークでも利用されています。

フレームワークを選ぶ基準って?

1. プロジェクトの要件

プロジェクトの特性や目的に合ったフレームワークを選ぶことが重要です!

例えば、高度なユーザインターフェースが必要な場合、ReactやVue.jsといったフロントエンドフレームワークが適しています。一方、バックエンドのロジックやデータベース操作が重要な場合、DjangoやRails、Springといったフレームワークが適しています。

2. 技術スタック

既存の技術スタックと互換性のあるフレームワークを選ぶことが通常は好ましいです。
例えば、チームがJavaScriptに精通している場合、Node.jsやReactなどのJavaScriptフレームワークが適しているかもしれません。

3. コミュニティとサポート

大きなコミュニティと良好なドキュメンテーションは、問題を解決する際の貴重なリソースとなります。

4. パフォーマンス

フレームワークのパフォーマンスは、アプリケーションの応答時間やスケーラビリティに影響を与えます。
特にパフォーマンスが重要なプロジェクトでは、この点を考慮に入れるべきです。

5. アーキテクチャ

フレームワークが提供するアーキテクチャがプロジェクトの要件と合致しているか、
またはチームが好む開発スタイルと一致しているかを検討することが重要です。
例えば、MVCアーキテクチャを好む場合、RailsやDjangoなどのフレームワークが適しています。

これらの要素をバランスよく考慮し、プロジェクトやチームにとって最適なフレームワークを選ぶことが重要です。

フロントとバックエンドの組み合わせはどう考えるの?

相互運用性
フロントエンドとバックエンドが円滑にデータをやり取りできるかどうかは重要です。
RESTful APIやGraphQLなどのようなデータ交換の標準をサポートしているかどうかを確認してください。

一貫性
可能ならば、同じ言語や同じ種類のフレームワークをフロントエンドとバックエンドの両方で使用することで、学習コストを削減し、コードの一貫性を保つことができます。
例えば、JavaScriptで全スタック開発を行う場合、ReactやVue.js(フロントエンド)とExpress.js(バックエンド)の組み合わせが考えられます。

パフォーマンス
フロントエンドとバックエンドのパフォーマンスはアプリケーション全体のパフォーマンスに大きく影響します。
ユーザー体験やスケーラビリティに関わるため、パフォーマンスを考慮に入れることが重要です。

技術スタック
すでに熟練している技術や経験を活かすことができます。
もしチームがPythonに精通しているなら、DjangoやFlaskのようなバックエンドフレームワークと、JavaScriptのフロントエンドフレームワーク(例えばReactやVue.js)を組み合わせるのが良いかもしれません。

最終的な選択はプロジェクトの要件やチームのスキルに大きく依存します。

Discussion