見出し画像

システムプログラミングはまるでパズル

ボケ防止のつもりで、カジュアルゲームなんかやってるけど
そんなのやめて、システム作りでコードを書いてる方がましなのにね。

どうせ何も残らないけど、日曜大工でキャットタワーを作るようなものかな。ネコもいないのに・・・。

もっとシンプルな構造にできないかを考えると
せっかく動いていたのについScrap and Buildしてしまう。
で、最初のアルゴリズムの方が良かったかなとか
はじめからこれで作ってればとか。

ただ今「パズル」と称しているのは、プログラムをジェネレートする機能を持ってるフレームワークのだから。

普通のアプリケーションプログラミングはパズルでは困る。
シンプルじゃなきゃ。
そのためにフレームワークなるものがある・・・
はずなんだけど。

「プログラム言語フレームワークはいくつあるか?」

ChatGPTに訊いてみたけど、答えられない。
世の中にはAIをもってしても”数えきれないほどの”フレームワークがあり、まださらに開発され続けてる。

バカか・・・

例えばこんなコード

JavaScript:

const salesData = [
  { department: '部署A', salesperson: '担当者1', date: '2022-01-05', amount: 100 },
  { department: '部署B', salesperson: '担当者2', date: '2022-01-10', amount: 200 },
  { department: '部署A', salesperson: '担当者1', date: '2022-02-15', amount: 300 },
  { department: '部署B', salesperson: '担当者2', date: '2022-02-20', amount: 150 },
  { department: '部署A', salesperson: '担当者2', date: '2022-02-25', amount: 250 },
];

// 集計結果を格納するオブジェクト
const aggregatedData = {};

// 集計
salesData.forEach((sale) => {
  const date = new Date(sale.date);
  const yearMonth = `${date.getFullYear()}-${date.getMonth() + 1}`; // 年月の形式を取得

  if (!aggregatedData[yearMonth]) {
    aggregatedData[yearMonth] = {};
  }

  if (!aggregatedData[yearMonth][sale.salesperson]) {
    aggregatedData[yearMonth][sale.salesperson] = 0;
  }

  aggregatedData[yearMonth][sale.salesperson] += sale.amount;
});

// 集計結果の表示
for (const yearMonth in aggregatedData) {
  console.log(`年月: ${yearMonth}`);
  for (const salesperson in aggregatedData[yearMonth]) {
    console.log(`担当者: ${salesperson}, 金額: ${aggregatedData[yearMonth][salesperson]}`);
  }
  console.log('---');
}

Python:

from collections import defaultdict

sales_data = [
    {"department": "部署A", "salesperson": "担当者1", "date": "2022-01-05", "amount": 100},
    {"department": "部署B", "salesperson": "担当者2", "date": "2022-01-10", "amount": 200},
    {"department": "部署A", "salesperson": "担当者1", "date": "2022-02-15", "amount": 300},
    {"department": "部署B", "salesperson": "担当者2", "date": "2022-02-20", "amount": 150},
    {"department": "部署A", "salesperson": "担当者2", "date": "2022-02-25", "amount": 250},
]

aggregated_data = defaultdict(lambda: defaultdict(int))

# 集計
for sale in sales_data:
    year_month = "-".join(sale["date"].split("-")[:2])
    aggregated_data[year_month][sale["salesperson"]] += sale["amount"]

# 集計結果の表示
for year_month, data in aggregated_data.items():
    print(f"年月: {year_month}")
    for salesperson, amount in data.items():
        print(f"担当者: {salesperson}, 金額: {amount}")
    print("---")

Ruby:

sales_data = [
  { department: '部署A', salesperson: '担当者1', date: '2022-01-05', amount: 100 },
  { department: '部署B', salesperson: '担当者2', date: '2022-01-10', amount: 200 },
  { department: '部署A', salesperson: '担当者1', date: '2022-02-15', amount: 300 },
  { department: '部署B', salesperson: '担当者2', date: '2022-02-20', amount: 150 },
  { department: '部署A', salesperson: '担当者2', date: '2022-02-25', amount: 250 },
]

aggregated_data = Hash.new { |h, k| h[k] = Hash.new(0) }

# 集計
sales_data.each do |sale|
  year_month = sale[:date].split("-")[0..1].join("-")
  aggregated_data[year_month][sale[:salesperson]] += sale[:amount]
end

# 集計結果の表示
aggregated_data.each do |year_month, data|
  puts "年月: #{year_month}"
  data.each do |salesperson, amount|
    puts "担当者: #{salesperson}, 金額: #{amount}"
  end
  puts "---"
end

PHP:

$salesData = [
    ['department' => '部署A', 'salesperson' => '担当者1', 'date' => '2022-01-05', 'amount' => 100],
    ['department' => '部署B', 'salesperson' => '担当者2', 'date' => '2022-01-10', 'amount' => 200],
    ['department' => '部署A', 'salesperson' => '担当者1', 'date' => '2022-02-15', 'amount' => 300],
    ['department' => '部署B', 'salesperson' => '担当者2', 'date' => '2022-02-20', 'amount' => 150],
    ['department' => '部署A', 'salesperson' => '担当者2', 'date' => '2022-02-25', 'amount' => 250],
];

$aggregatedData = [];

// 集計
foreach ($salesData as $sale) {
    $date = new DateTime($sale['date']);
    $yearMonth = $date->format('Y-m');

    if (!isset($aggregatedData[$yearMonth])) {
        $aggregatedData[$yearMonth] = [];
    }

    if (!isset($aggregatedData[$yearMonth][$sale['salesperson']])) {
        $aggregatedData[$yearMonth][$sale['salesperson']] = 0;
    }

    $aggregatedData[$yearMonth][$sale['salesperson']] += $sale['amount'];
}

// 集計結果の表示
foreach ($aggregatedData as $yearMonth => $data) {
    echo "年月: {$yearMonth}\n";
    foreach ($data as $salesperson => $amount) {
        echo "担当者: {$salesperson}, 金額: {$amount}\n";
    }
    echo "---\n";
}

同じロジックでも、それぞれこうなる。

独りよがり以外の何物でもない。

何も構造的には違わず、些細な書き方が違うだけ。
この一字一句を取り違えれば動かない。

ちなみにそれぞれの言語の平均所得

↑ここによると
①JavaScript 663万円
⑥Python 608万円
⑩PHP 545万円
⑭Ruby 450万円
らしい。

ソースによってはかなり違うけど
200万くらいの格差がある。

こんなこといつまで続けるんだろ。

さっきのコードはChatGPTに書かせたんだけど

部署、営業担当者、売上日、売上金額の要素を持つ配列から、年月と担当者ごとの金額の集計を行うjavascriptのサンプルプログラム。

この程度のものはAIですぐかける時代。
でも要件が複雑になると、言葉で説明するより自分で書いた方が早い感じも。
ある程度説明は簡単だけど、作るのに専門知識が必要なモジュールをオーダーするといいのかな。

おっと長くなっちまった。
「パズル」解かなきゃ。

このパズルをChatGPTに頼むのと、自力で何とかするのと
どっちにしても自分の頭を悩ませそうだ。

ちなみにさっきのロジック
SQLならこうなる。

SELECT
DATE_FORMAT(date, '%Y-%m') AS year_month,
salesperson,
SUM(amount) AS total_amount
FROM
sales_data
GROUP BY
year_month, salesperson;

まぁ適材適所ということ。

この記事が気に入ったらサポートをしてみませんか?