2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

面接での技術質問の反省①

Last updated at Posted at 2021-02-02

はじめに

今回も、昨日の面接でいただいた話から広げていきます。

アプリの課題

面接の技術的な質問にて…

users_controller.rb
def show
  @users = User.all
end

(あくまでも、例です)

ActiveRecodeの「all」を使っているけど、
「もし、ユーザーが1万人に増えて、処理が遅くなるとしたら、どうする?」

その時の考え

正直、今まで考えたことがありませんでした。
学習してきた中で、データベースの操作を表すCRUDがあって、
特に条件を付けずに、情報を取ってくるときは、allと安易に理解していました。

改めて復習してみる

CRUDとは…
C(create)
R(read)
U(update)
D(delete)
の頭文字で、データベース操作を表しています。

今まで使っていた、各操作の代表的なものは、

C(create)


user = User.create

新しく情報を作成するときに使っていました。
コントローラーでcreateのメソッド内で使うことが多くありました。

U(update)

便宜上、こちらを先に…


user = User.find(id:1)
user.name = Qiita
user.save

R(read)


users = User.all

保存された情報を表示させるようなときに使っていました。
ビューでeach文を使って数に応じて表示させたり、フォームのプルダウンで選択できるようにしたりする場面が主でした。

D(delete)


user = User.find(params[:id])
user.destroy

必要なくなった情報を削除したいときに使います。
ちなみにfindはR(read)です。

なぜ、allでは処理が遅くなるのか…

改めて、この問題を考えるためには、ActiveRecodeとは何かを考えます。
私の認識としては、
SQL文を直接書かずとも、Railsが勝手に書いて、処理をしてくれるもの
です。
つまり、面接での質問の意図と処理が遅くなるとは、
「めっちゃSQL文が生成されているけど、本当に全部必要?」
「必要のない情報も呼び出してるけど、全部必要?」
ってことだと考えます。
「はい、必要ではない場合もあると思います。」
大まかに言うと同じだと思うのですが、
具体的に言うと、
Amazonで例えるなら…
全ての商品をいちいち表示してないですよね。きっとそんなことしたら、商品の数だけSQL文が生成され、×(かける)ユーザーの数となり、素人でも処理が遅くなることが想像できます。
これを抑えることができないか?
と、いうことです。

このままAmazonを例にすると答えが導き出せそうです。
実際にAmazonではどうしているか。
パッと思い浮かぶ解決方法は2つあります。
- 検索でヒットした情報のみを表示させている。
- 表示も一度ではなく、ページを分けている。(1ページに◯件まで)
これはヒントになりそうです。

自分のアプリケーションにも取り入れることができないか。他の方法はないか、もう少し考えてみたいと思います。

最後に

現場では、処理の速度や情報が大量になったときを想定して、設計していることを知ることができた面接でした。
やっぱり、エンジニアってすげぇって話です。
続きは、また明日。

2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?