【プログラミング基礎】元インフラ系の人と学ぶ手続き型プログラミング
こんにちは!
Biz Freakでバックエンド開発をしているエンジニアのTNと申します。
早速、私事で申し訳ないですが、最近異動がありました。
そして、今までBiz Freakでブログを書いてきているエンジニアのメンバーと
同じプロジェクトにアサインされることとなりました!(かなり嬉しいです)
直近までTypeScript、Node.jsあたりを使って開発をしていましたが、
ガラッと環境が変わってPythonをメインに扱うようになり、Pythonでバックエンド開発をしています。
私のエンジニアの始まりはPythonだったので、故郷に帰ったような気分です。笑
そして、水面下でBubbleでのキャッチアップも進めています!
ローコードのスキルも身につけて、エンジニアとしてPlus Ultraしていきますよー!
はじめに
てなわけで、勝手にシリーズ化させている「元インフラ系の人と学ぶシリーズ」ですが、
前回の第一回「元インフラ系の人と学ぶオブジェクト指向」では、
オブジェクト指向プログラミングについて説明させていただきました。
人によっては内容的に結構難しかったかもしれませんが、
今回は難易度がグッと下がった内容になると思います。
プログラミングには様々なスタイル(パラダイム)がありますが、
その中でも今回お話をする手続き型プログラミングは、命令を順番に実行していく最も基本的なスタイルです。
そのため、大体の方はこのプログラミングの手法から始める方が多いのではないかと。
では、今回も学んでいきましょう!
手続き型プログラミングとは?
手続き型プログラミングは、プログラムを「手続き」(procedure)の集まりとして記述するプログラミングパラダイムです。手続きとは、一連の命令をまとめたもので、プログラムはこれらの手続きを順番に実行することで目的を達成します。
Pythonでは、以下のように関数を定義し、それを呼び出すことで手続き型プログラミングを実現します。
def greet(name):
"""挨拶を表示する関数"""
print(f"こんにちは、{name}さん!")
def main():
"""メイン関数"""
greet("太郎")
greet("花子")
if __name__ == "__main__":
main()
この例では、 greet
関数が挨拶を表示する手続き、 main
関数がプログラム全体の流れを制御する手続きとなっています。
OpenAIライブラリでの例
OpenAIライブラリを使って、文章生成を行う例を見てみましょう。
import openai
openai.api_key = "YOUR_API_KEY" # 自身のAPIキーを設定
def generate_text(prompt):
"""文章生成を行う関数"""
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
max_tokens=100
)
return response.choices[0].text.strip()
def main():
"""メイン関数"""
prompt = "Pythonでプログラミングをするメリットは?"
generated_text = generate_text(prompt)
print(generated_text)
if __name__ == "__main__":
main()
この例では、 generate_text
関数がOpenAIのAPIを呼び出して文章生成を行う手続き、 main
関数がプロンプトを設定し、生成された文章を表示する手続きとなっています。
手続き型プログラミングのメリット
- 実装が容易: シンプルな問題であれば、比較的簡単に実装できる。
- 逐次デバッグが容易: 命令が順番に実行されるため、プログラムの動作を追いやすい。
- 最適化が効きやすい: CPUでで実行されるコードが手続き型を前提としていることが多く、コンパイラによる最適化が効きやすい
手続き型プログラミングのデメリット
- 大規模開発には不向き: プログラムが複雑になると、コードの見通しが悪くなり、保守が難しくなる。
- 再利用性が低い: 処理が特定のコンテキストに依存しやすく、他の場所で再利用しにくい。
- 並列処理が難しい: 状態の変化を伴うため、並列処理が難しい場合がある。
関数型プログラミングとの違い
手続き型プログラミングが命令の実行順序を重視するのに対し、関数型プログラミングは関数の組み合わせによってプログラムを構築します。
- 状態の変化: 手続き型プログラミングは状態の変化(変数の値の変更など)を伴いますが、関数型プログラミングは基本的に状態の変化を許容しません。
- 副作用: 手続き型プログラミングは副作用(関数外の状態への影響)を伴うことがありますが、関数型プログラミングは副作用を局所化し、状態を変更するようなコードがどこなのか分かりやすくします。
- データの扱い: 手続き型プログラミングはデータを変更可能なものとして扱いますが、関数型プログラミングはデータを変更不能なものとして扱います。
宣言型プログラミングとの違い
手続き型プログラミングは、どのように問題を解決するかという「解法」を記述するのに対し、宣言型プログラミングは、何を解決したいかという「問題の定義」を記述します。
- 解法 vs 定義: 手続き型は「問題を解くための手順」を記述し、宣言型は「解決したい問題そのもの」を記述します。
- 制御フロー vs 事実: 手続き型は命令の実行順序(制御フロー)を重視しますが、宣言型は順序や条件分岐のない事実の記述を重視します。
- 可読性: 宣言型は事実を宣言的に記述するため、コードが読みやすくなる傾向があります。一方、手続き型は状態や制御フローを追う必要があるため、複雑になると可読性が低下する可能性があります。
手続き型言語における宣言的アプローチ
手続き型言語でも、部分的に宣言型の利点を取り入れることができます。
- アノテーション: コードにメタデータを付与し、宣言的な情報を追加します。
- DSL (Domain Specific Language): 特定の領域に特化した言語を作成し、宣言的な記述を可能にします。
- データベース操作言語である SQL や、IaCツールとして有名なTerraform用の記述言語である HCL もDSLの一種です。
手続き型プログラミングと宣言型プログラミングは、それぞれ異なる特性を持つプログラミングパラダイムです。問題の性質や開発の規模に応じて、適切なパラダイムを選択することが重要です。
プログラミングの学習を始めたばかりの方は、まずは手続き型プログラミングから始めて、
徐々に他のパラダイムも学んでいくことをお勧めします!
最後に…
私たちのチームでは、業界最高のスピード感で新規事業開発に携わることができ、
テクノロジーの力で圧倒的な成長を実感することができます。
株式会社Biz Freakで一緒に成長したい方は、ぜひ以下のリンクからご応募ください。
チーム一同、あなたと一緒に未来を創ることを楽しみにしています!