takechanel
@takechanel (Take N)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

プログラミングする上で何を考慮して実装しているの? - アルゴリズムを考慮することの優先順位は?

アルゴリズムを考慮することの優先順位は? ※ここではオブジェクト指向プログラミング言語に限る。

  • [こちらの書籍](Pythonで学ぶアルゴリズムの教科書 一生モノの知識と技術を身につける)を読んでいて疑問に思ったことがある。 それはアルゴリズムについてだ

  • アルゴリズムは、解答パターンを指し示すもの

    • 例えば、中学校 数学問題であったのは「花子さんがA地点からB地点に辿り着くために最も最短経路は?」みたいな問題があったと思う
    • 辿り着く手段(経路)は複数あるが最短経路は少数のパターンしかない。それらの経路を導くプロセスを「アルゴリズム」と呼ぶそう
  • ここで疑問なのが「エンジニアはセキュリティ面や処理スピードを考慮した実装が問われるがどの要素を優先的に考え、実装するのかベストなのだろうか疑問である。 」

  • もちろんセキュリティが悪く、システムが崩壊するものはよくないのでシステムを安全にリリースすることが重要であると思うが、その次にエンジニアは何を考慮して実装すれば良いだろうか?

  • 皆様の意見が知りたい。どんな意見があるか教えてほしい

経緯

  • なぜこの疑問が生じたかといえば、以下である
    • 上記の書籍を読んで アルゴリズム、処理スピードの重要性に気づいた
    • 一方でObject設計(無駄な実装にならないように)主体が何をどうする?に基づいてメソッドを実装するObject指向に基づいた実装も重要だと思う。 ー保守性や可読性の担保が大事だから。 エンジニアはコードを書く時間よりも読む時間のほうが長い。(2年半実務より)
    • 生成AIが進化してきており、より専門的な技術が問われてきていると痛感している
      • 深掘りすると高度な技術なエンジニア (技術選定)やシステム設計ができるエンジニアが今後求められるフェーズだと考えている

これらの点から、Jr(まだ1~3年のエンジニア)は何を基軸に業務を行事すれば良いかわからないので意見が欲しいです。

 - 補足
  - エンジニアの仕事は、脳内で整理してコーディングしたり、コミュニケーション取るなど頭の中で整理することができているかがポイントだと私は思っております。なので実装においてなにを優先してどのように整理して実装するかを私は脳内で整理、構造化できていない。なぜなら、アルゴリズムを考慮した実装が乏しかったからだ。

3

質問内容から職業プログラマーかと思いますが、どのような製品を開発されているのでしょうか?質問の範囲がかなり広いと感じまして、業界やプロジェクトによっても優先順位は様々かと思いましたので。
御社でも設計やコード実装の際の基準は何かしらあると思います。コードレビューで「こうした方が良い」等は言われませんか?
品質かスピードかのバランスは難しいところかと思いますが、例えば命に係わるシステム(医療系など)であれば精度が厳しく求められるのではと思います。

1Like

質問内容から職業プログラマーかと思いますが、どのような製品を開発されているのでしょうか?質問の範囲がかなり広いと感じまして、業界やプロジェクトによっても優先順位は様々かと思いましたので。
御社でも設計やコード実装の際の基準は何かしらあると思います。コードレビューで「こうした方が良い」等は言われませんか?

言われたことあります。扱ってるシステムはWebAppになります。
業界はまばらです。ECでしたり、通信業界でしたりまばらです。
セキュリティ面や処理速さの点からこの実装が良いなどありますがアルゴリズムの視点からこちらが良いなどのアドバイスをいただくことはなかったです。
(そのアドバイスも根底にはアルゴリズム観点からの指摘だったかもしれませんが、気づけていなかったです)

つまり、megchandesuさんの回答は業界宿のようなシステムかによるという回答でしょうか?ご回答ありがとうございます。

0Like

私はプロのプログラマではないので実務のことはわからないと前置きしておきます。 以下は一般論として良く語られるものです。

「早すぎる最適化は諸悪の根源」という格言があります。 コンピュータは複雑な構造を持っていて何がボトルネックになるのか事前に予測するのは困難だという前提があり、早すぎるタイミング (作る前) に様々なことを考慮しても実際には思ったようにはいかないものだという論です。

そして「推測するな、計測せよ」という格言もあります。 まずは動くものを作ってから各部にどれだけの処理時間がかかっているのかを計測してチューニングすべきという論です。

綺麗な構成にしておけば性能が足りないところを改良するのは比較的楽に出来ますが、 (実際に効果があるかどうかもわからない) 性能優先で歪な構成になっているとそこから改良するのはしんどいというのはなんとなくわかるでしょう。

もちろん可能な範囲で概算くらいはしたほうがよい (概算の精度も高いに越したことはない) でしょうが、一般的にはプログラムの実行速度に関しては後回しにするほうが全体としては上手くいくと考えられています。 あくまで「後回し」であって「優先度が低い」とは限りません。

2Like

アルゴリズムを考慮することの優先順位は?

アルゴリズム次第で何がどれだけ変わるというのか? その変わり具合の重要性というのはどの程度なのか?
……っていう話次第でしょう.

「アルゴリズムAだと 30 秒もかかり,ユーザを毎度激しく待たせてしまう.ところが,アルゴリズムBにすれば 0.2 秒で終わるらしい」とかいう場合,AではなくてBを採用(実装)することの優先度はとても高いかもしれない.

しかし「Bを使ってるとかw 別のアルゴリズムCならばそこは 0.1 秒ですよ」とか言われたとして,Cを採用(実装)することの 意義/価値/etc がどの程度あるのか? というのは状況次第であろう.
Bでも十分である(速度面に問題がない)ならば,既にBで実装されているものをCに改めることの優先度というのは極めて低いであろう.

そんな話ではなくて「1秒間にN回処理できなければならない」みたいな話であれば,何は無くともその目標を達成することが最優先事項であろうし.

1Like

言われたことあります。扱ってるシステムはWebAppになります。
業界はまばらです。ECでしたり、通信業界でしたりまばらです。

ご回答ありがとうございます。
そうなるとサイバーセキュリティ対策やレスポンスの速さが重要になりそうですね。Webアプリケーションですとフレームワークになると思いますので、個人の力量で大きく変わることはなさそうな印象ですがそうでもないんでしょうか?
24時間稼働し続けることが必須だったり決済システムを扱っていたりすればセキュリティが優先になるかと思います。
保守性についてはそのシステムを何年稼働する予定なのかに依ると思います。実際には期間や予算に左右されてしまう部分かもしれません。

最初からベストを目指すよりもリファクタリングすれば良いのではないかと思います。

1Like

Your answer might help someone💌