プログラミングが役立つIT業界と役立たないIT業界

実は一口にIT業界と言っても、大きく2種類ありまして

  1. プログラミングが役立つIT業界
  2. プログラミングが役立たないIT業界

2に属する人間のプログラミング役立たない発言はもう20年前から繰り返されていて正直うんざりなんですが、2の世界では事実なので仕方ないです。

SE(システムエンジニア)という単語が出てくるのは役に立たない方のIT業界である可能性が高く、SIと呼ばれる企業も2の可能性が高いです。これからIT業界を目指す若者は自分が目指している道はどちらなのか、よく考えて就職先を選んで欲しいところです。もしあなたが、今プログラミングを頑張りたい、極めたいのに2に属してしまっているのならば、今すぐ1に属する会社に転職しましょう。

私も10年以上前に2の世界でプログラミングなんか頑張っても意味がないと言われ、1の世界にやってきました。我々は2の世界から1の世界を目指すあなたを歓迎します。まぁ、相応のスキルは求められますし、クソみたいな会社も少なからず存在するので、必ずしも全てが理想郷ではありませんけどね。

ところで、2の世界でプログラミングができると言った場合 "Javaで仕様書に沿ったコードが書ける" ぐらいの意味ですが、1の世界でプログラミングができるというのは、"ある目的のためにデータをコンピュータで処理するにあたって、最適な環境、最適な言語、最適なアルゴリズムを選択し、時間空間的に最も効率的な処理を考え、実装できる" と大きく意味が異なるので誤解なきように

Railsのbefore_forkで接続を閉じる必要あるの?

Railsunicornやpumaのconfigをネットでググってみると以下のような設定が見つかる。

# unicorn
preload_app true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
# puma
preload_app!

before_fork do
  ActiveRecord::Base.connection.disconnect!
end

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

いるのこれ?

workerを起動する前にmasterプロセスのDB接続を閉じてるんすけど、なんで閉じるんすかね?

おそらくこれはforkした子プロセスがmasterで使ってるリソースを共有しないように切断させたいという意図だと思います。preload appでforkした場合、copy-on-writeでメモリが共有されるためコネクションもプロセス間で共有されしまい、これに複数プロセスが同時に読み書きしてしまうと不具合が発生して困ったことになります。

しかし、masterプロセスはリクエストを子プロセスにディスパッチするだけで自身は応答処理をしないためDB接続もしません。disconnectしても何も起こらないはずです。プロセス間でコネクションが共有される事もないので接続を切る必要もないと思います。

また、Railsはコネクションプーリングを使っていて、実際にDBアクセスが必要になるまで接続せず、単にestablishを呼んだだけでは何もしないはずです。よってfork後に再接続する必要もないと思うんですよね。

RailsActiveRecordは抽象化されているのでコネクションプーリングしない実装への考慮として書いておくのが流儀なのでしょうか? まぁ、実はcron的な処理を起動していてmasterがDB接続してましたーみたいな想定外に対する保険として書いておいてもいいのかもしれないですが。結局のところ意図はよくわからない。