Edit ruby post
This commit is contained in:
374
static/archive/codefol-io-bskabg.txt
Normal file
374
static/archive/codefol-io-bskabg.txt
Normal file
@@ -0,0 +1,374 @@
|
||||
[1]Codefol.io book logo
|
||||
|
||||
[2]Codefol.io
|
||||
|
||||
* [3]All Articles
|
||||
* [4]Articles by Topic
|
||||
* [5]Favourite Articles
|
||||
* [6]RSS
|
||||
* [7]About
|
||||
|
||||
When Should You NOT Use Rails?
|
||||
|
||||
A chimpanzee in a white coat types at a keyboard lit by glowing LEDs.
|
||||
He's gorgeous, yes. But is his talent natural… or is it Ruby on Rails?
|
||||
|
||||
I was [8]recently on Jason Swett’s podcast again. He’s a great
|
||||
interviewer and I always have fun with him.
|
||||
|
||||
By Twitter request we talked about… When would you not use Rails? It’s
|
||||
a great question.
|
||||
|
||||
For the entertaining version, [9]listen to the podcast. For the
|
||||
just-the-facts extra-complete version, I’m writing this post.
|
||||
|
||||
When Is Rails the Wrong Choice?
|
||||
|
||||
I’ll start with a few simple, obvious times you wouldn’t use Rails, and
|
||||
then I’ll talk about some technically interesting times.
|
||||
|
||||
First, and most important, is team familiarity. If your team doesn’t
|
||||
already know Rails and isn’t especially interested in learning it then
|
||||
Rails is the wrong choice. This should be obvious, but it still
|
||||
deserves first billing.
|
||||
|
||||
Second, when you know some other framework fits better. I’ll talk more
|
||||
below about when that is. But sometimes you have a specific concern
|
||||
that trumps everything else. If you need to use a Java-language machine
|
||||
learning library and you don’t want to use JRuby for some reason, Rails
|
||||
isn’t your framework. If you’re writing a WordPress plugin, you’ll be
|
||||
doing it in PHP. Often there’s one specific compatibility concern that
|
||||
overrides everything else.
|
||||
|
||||
You can also think of it as: use it where Rails’ good points hold and
|
||||
its bad points don’t. So we’ll also talk about the good and bad points.
|
||||
|
||||
Separately: you’d normally only use Rails as an HTTP server, so some
|
||||
tasks just aren’t Rails-shaped.
|
||||
|
||||
When is Rails Too Much?
|
||||
|
||||
[10]A pirate puppet with an eyepatch, safety goggles and a huge
|
||||
scraggly mustache watches over a purple crystal ball at his feet.' He’s
|
||||
too much lab assistant for your lab.
|
||||
|
||||
Some places not to use Rails can include:
|
||||
|
||||
Really Small Tasks that Won’t Grow: if a server does very little, Rails
|
||||
is often too much. Not going to touch a database? Then the DB setup
|
||||
isn’t helping you, is it? Just a tiny low-traffic intermediate server
|
||||
with no caching? A lot of Rails is more trouble than it’s worth.
|
||||
|
||||
Be careful with tasks that grow, though — making a tiny server scale up
|
||||
to do a lot more can be ugly. If you’re already serving HTTP pages to a
|
||||
human with a web browser, consider that you may have to add features to
|
||||
it later. Something like that is already fairly large from the word
|
||||
“go”.
|
||||
|
||||
When It’s ‘Just’ an API Server: Rails has less to offer an API server
|
||||
that speaks JSON over the wire. A lot of its HTTP security doesn’t
|
||||
matter for that case: CSRF protection is entirely about dealing with
|
||||
HTML and Javascript. Many kinds of XSS attacks are dependent on a
|
||||
browser as the weak link, or on putting unescaped user input into HTML.
|
||||
Redirection vulnerabilities assume automatic redirection, which APIs
|
||||
usually don’t do. You can prevent SQL injection attacks with just an
|
||||
ORM, a simpler ORM, or even the raw Ruby MySQL and Postgres gems, which
|
||||
support question-mark arguments.
|
||||
|
||||
Rails security really shines when you’re navigating the bewildering
|
||||
world of HTML and browser security. Small projects that mostly speak a
|
||||
structured format read by machines will get less from Rails. Securing
|
||||
something like an integer ID or a hash of strings is just easier than
|
||||
ensuring your HTML contains no script tags or anything exploitable.
|
||||
|
||||
Related to that is when you’re doing in-browser rendering and Rails is
|
||||
‘just’ serving JSON. It’s a weird kind of in-between case. A lot of
|
||||
Rails security and convenience functions no longer help you, but you’re
|
||||
still doing things where internal libraries (ActiveRecord, ActiveJob,
|
||||
ActionMailer) can be highly useful. But if you’re never rendering HTML
|
||||
on the server and you’re very sure you never will, Rails will probably
|
||||
help you less.
|
||||
|
||||
When Is Rails Not Enough?
|
||||
|
||||
Rails is also designed for a small team and a medium-sized codebase. A
|
||||
huge team (lots of programmers) or a huge codebase (lots of
|
||||
controllers, models and/or lines of code) will tend to drag down the
|
||||
standard Rails-app structure.
|
||||
|
||||
Ruby allows for a lot of [11]non-local effects. Whether that’s
|
||||
monkeypatching, writing to a database or creating new types at runtime,
|
||||
Ruby isn’t designed for a team of 200 programmers where you don’t trust
|
||||
some of them. There are too many ways for them to cause you trouble.
|
||||
You can use [12]good tooling to scale Ruby to larger teams, but even
|
||||
that will [13]tend to have exceptions and difficulties. That’s not
|
||||
really Ruby’s sweet spot.
|
||||
|
||||
In most cases you can cut up a large project into smaller projects. If
|
||||
one Rails app is too big, you can often separate it into multiple apps,
|
||||
or a thinner app with more back-end services, or an app and a separate
|
||||
microservice, or… One way or another there is usually a way to separate
|
||||
out smaller pieces. Ruby strongly encourages that, as do I.
|
||||
|
||||
There are also not-quite-Rails structures that can scale better. Avdi
|
||||
Grimm’s (now retired) [14]Objects on Rails was an attempt in that
|
||||
direction, as is [15]the Hexagonal architecture for Rails, which in
|
||||
turn has a lot in common with the older and more general [16]N-tier
|
||||
architecture.
|
||||
|
||||
But at some point you might want to consider a different framework.
|
||||
[17]Hanami is an obvious choice, designed to be less quick and nimble
|
||||
than Rails for getting a tiny app off the ground, but more scalable if
|
||||
you want to use the same code with a lot more contributors.
|
||||
|
||||
I’d still start out in Rails, personally. If you’re building something
|
||||
quickly to see if anybody cares, I know of no framework that comes
|
||||
close to its productivity. Wait to rewrite (in a more rigid framework)
|
||||
until you’re successful and you can afford the drag on your development
|
||||
speed.
|
||||
|
||||
The other worry here can be performance. If you’re rewriting a project
|
||||
that is already as large as the current Basecamp… then you’re
|
||||
[18]actually fine for performance. Rails still scales great for them.
|
||||
But if you’re looking at something a hundred times larger (which by
|
||||
definition means B2C, not B2B) then you might have a situation where
|
||||
your server costs are substantially greater than your engineering
|
||||
payroll. In that case it can make sense to slow down your engineers to
|
||||
pay lower server costs. To check this, see what your EC2-or-equivalent
|
||||
costs are just for your application servers, which are what run Rails.
|
||||
And check your payroll just for web engineers, which is who writes in
|
||||
Rails. Normally the engineering payroll is much larger and you should
|
||||
stick with trading cheap machine time for expensive engineering time.
|
||||
But at some point the balance may tip and you should consider raising
|
||||
your engineering payroll to cut your server costs.
|
||||
|
||||
When Does Rails Have the Wrong Assumptions?
|
||||
|
||||
[19]A pirate, a bear and a chimp sit at a wicker table. The bear looks
|
||||
into a very old-fashioned microscope as the other two look on. They’re
|
||||
checking the microscope for real-world use cases where Rails might be
|
||||
wrong.
|
||||
|
||||
Before checking if Rails’ assumptions are right for you, we should see
|
||||
what those assumptions actually are.
|
||||
|
||||
Before you take my word for it, I recommend taking [20]David Heinemeier
|
||||
Hansson’s word for it in the form of The Rails Doctrine. It’s a great
|
||||
document and it covers a lot of ground.
|
||||
|
||||
Indeed, if you want to better understand why Rails isn’t amazing for
|
||||
large, low-trust teams, you should read [21]“Provide Sharp Knives” in
|
||||
the Rails Doctrine several times. A lot of Rails’ tradeoffs are
|
||||
entirely by design.
|
||||
|
||||
Rails also has some simpler assumptions: it assumes you’re writing an
|
||||
interactive app with server-rendered HTML. It assumes that security is
|
||||
vital (Rails trades a lot for security) but that you don’t want to
|
||||
build your own custom security system in most cases. And it assumes
|
||||
that you either have a small, excellent team doing prototyping work
|
||||
(“Provide Sharp Knives”) or that you have a possibly-mediocre team that
|
||||
needs powerful built-in guidelines ([22]“The Menu is Omakase.”)
|
||||
|
||||
Rails also assumes you want high developer velocity at a cost of
|
||||
technical debt. In other words, it’s designed for building very
|
||||
quickly. That makes sense when technical execution is not your biggest
|
||||
risk. For instance: if you’re building a small startup, and you’re
|
||||
pretty sure you can build the site but people may not buy your product,
|
||||
you are dominated by market risk. That’s when Rails is perfect. You
|
||||
want to build very quickly. And even if you build perfectly, you’re
|
||||
probably going to have to throw away the result for nontechnical
|
||||
reasons, like “people don’t want to buy it.”
|
||||
|
||||
As part of “high dev velocity, technical debt is okay” Rails assumes
|
||||
things like, “you’ll want to use a lot of gems” and “dependencies that
|
||||
work are fine if they speed you up.”
|
||||
|
||||
Rails assumes you don’t mind scaling out application servers
|
||||
horizontally (by bringing more of them online.) It’s designed to scale
|
||||
well if you can do that. Rails assumes CPU is fairly cheap and it’s
|
||||
usually right about that. Relatedly, Rails assumes that the database is
|
||||
usually your most serious performance bottleneck, which is how web
|
||||
applications usually work.
|
||||
|
||||
Rails also assumes you’ll have some calculation or data transformation
|
||||
in your application. It assumes that it’s okay to use some CPU because
|
||||
you’ll be doing that anyway.
|
||||
|
||||
(When does that last assumption matter? Let’s talk about Evented
|
||||
Servers and see.)
|
||||
|
||||
What Isn’t Rails Good At?
|
||||
|
||||
[23]The Node.js logo. Sometimes you need it, or something like it.
|
||||
|
||||
While Rails is great at a lot of things, there’s one particular task
|
||||
that it’s not amazing for: shim servers.
|
||||
|
||||
By “shim servers” I mean servers that do very little calculation but
|
||||
integrate answers from a few other back-end services and relay the
|
||||
result. Imagine a server that queries two JSON services and combines
|
||||
the result with simple string-manipulation, for instance. It does very
|
||||
little calculation, but it juggles a lot of events.
|
||||
|
||||
And that’s the relevant word: “events.”
|
||||
|
||||
There is a specific kind of app architecture embodied by Node.js and
|
||||
its relatives called “Evented” programming. It can support many
|
||||
thousands, or even millions, of simultaneous connections with a tiny
|
||||
amount of server resources. It can be both high-throughput and
|
||||
low-latency. Its benchmark numbers are matchless… for the cases where
|
||||
it works.
|
||||
|
||||
Rails can’t match Evented programming at what Evented programming is
|
||||
good at. Basically no framework can. There are Evented frameworks for
|
||||
Ruby (e.g. [24]EventMachine, [25]Async.) Rails is built differently.
|
||||
|
||||
If Evented is so much better, why don’t we use it for everything?
|
||||
Because it doesn’t work for everything. I emphasise calculation
|
||||
per-request because an Evented server will fall down and die if you try
|
||||
to make it do very much calculation per-request. Having one server
|
||||
handle a million connections is no good if each connection winds up
|
||||
using a hundred milliseconds of CPU time — that’s simply too many
|
||||
connections and the latency will be terrible.
|
||||
|
||||
In other words, Rails and Node.js are different tools for different
|
||||
projects. If you’re thinking, “I should either use Rails or Node for
|
||||
this” I would recommend looking deeper into your project (and/or your
|
||||
framework) until it’s obvious which one is the right answer. They do
|
||||
different things.
|
||||
|
||||
Look, I Just Scroll to the Bottom for the Summary and Criticise It On Reddit
|
||||
|
||||
[26]A chimpanzee in a lab coat stares down at his lap, containing
|
||||
sections of wooden train track, and his hand holding a toy train. I’m
|
||||
sure this is the right answer, but I have forgotten the question.
|
||||
|
||||
Rails is the wrong choice if your team doesn’t want to use it or
|
||||
doesn’t know how.
|
||||
|
||||
Rails is the wrong choice in cases where a different framework is
|
||||
specifically better, or you have a specific library you need to be
|
||||
compatible with that isn’t Rails-friendly.
|
||||
|
||||
Rails might be the wrong choice if you’re not rendering HTML on the
|
||||
server, especially if your project is very small and/or doesn’t use a
|
||||
database.
|
||||
|
||||
Rails is the wrong choice is you’re not doing prototyping-flavoured
|
||||
work, preferably with a small, highly-competent team.
|
||||
|
||||
Rails is the wrong choice if your dev team or your app code is too big
|
||||
and you can’t subdivide the project.
|
||||
|
||||
Rails is the wrong choice if your project wants an Evented server like
|
||||
Node.js or EventMachine.
|
||||
|
||||
This article is the wrong choice if you’d rather [27]listen to an
|
||||
entertaining podcast on the same topic.
|
||||
|
||||
If you’re wondering when Rails is the right choice, [28]the Rails
|
||||
Doctrine is a great first step.
|
||||
Aug 6 2020
|
||||
[29]ruby [30]rails
|
||||
|
||||
You Hunger to Get Better
|
||||
|
||||
Subscribe to get free ebook chapters and an emailed coding class now,
|
||||
plus videos and articles a few times a month.
|
||||
|
||||
Why this specific newsletter? You want to be an expert. Expertise comes
|
||||
from learning the fundamentals, deeply. And that comes from the best
|
||||
kind of practice. I write with that in mind. I won't waste your time.
|
||||
|
||||
(Yes, I also sell things. They're good, but I'm fine if you don't buy
|
||||
them.)
|
||||
____________________ ____________________ (BUTTON) Sign-up
|
||||
|
||||
Comments
|
||||
|
||||
Please enable JavaScript to view the [31]comments powered by Disqus.
|
||||
[32]comments powered by Disqus
|
||||
|
||||
Read Next
|
||||
|
||||
[33]Computer Science: Just the Useful Bits
|
||||
|
||||
[34]ruby [35]rails
|
||||
[36]Computer Science: Just the Useful Bits
|
||||
|
||||
[37]Let's Build Course Software: Email Reminders
|
||||
|
||||
[38]ruby [39]rails [40]letsbuild [41]rubymadscience
|
||||
[42]Let's Build Course Software: Email Reminders
|
||||
|
||||
[43]Free Rebuilding Rails Video Chapters
|
||||
|
||||
[44]career
|
||||
|
||||
[45]The Urban Legend of the 10X Developer
|
||||
|
||||
[46]career
|
||||
[47]The Urban Legend of the 10X Developer
|
||||
|
||||
[48]Mastodon [49]GitHub [50]Linkedin [51]Mastodon
|
||||
|
||||
[52]Codefol.io © 2020 . Horace theme by [53]JustGoodThemes..
|
||||
|
||||
[54]Back to top
|
||||
|
||||
References
|
||||
|
||||
1. https://codefol.io/
|
||||
2. https://codefol.io/
|
||||
3. file:///posts
|
||||
4. file:///topics
|
||||
5. file:///tags/favourite
|
||||
6. file:///feed.xml
|
||||
7. file:///about
|
||||
8. https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
|
||||
9. https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
|
||||
10. https://rubymadscience.com/img/assistant_pirate_with_sphere_bigthumb.png
|
||||
11. https://en.wikipedia.org/wiki/Side_effect_(computer_science)
|
||||
12. https://sorbet.org/
|
||||
13. https://sorbet.org/docs/troubleshooting#escape-hatches
|
||||
14. https://www.goodreads.com/book/show/13481927-objects-on-rails
|
||||
15. https://medium.com/@vsavkin/hexagonal-architecture-for-rails-developers-8b1fee64a613
|
||||
16. https://en.wikipedia.org/wiki/Multitier_architecture
|
||||
17. https://hanamirb.org/
|
||||
18. https://m.signalvnoise.com/only-15-of-the-basecamp-operations-budget-is-spent-on-ruby/
|
||||
19. https://rubymadscience.com/img/dr_bear_microscope_bigthumb.png
|
||||
20. https://rubyonrails.org/doctrine/
|
||||
21. https://rubyonrails.org/doctrine/#provide-sharp-knives
|
||||
22. https://rubyonrails.org/doctrine/#omakase
|
||||
23. file:///posts/when-should-you-not-use-rails/node_js_logo.png
|
||||
24. https://github.com/eventmachine/eventmachine
|
||||
25. https://github.com/socketry/async
|
||||
26. http://rubymadscience.com/img/rails_internals_bigthumb.png
|
||||
27. https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
|
||||
28. https://rubyonrails.org/doctrine/
|
||||
29. file:///tags/ruby/
|
||||
30. file:///tags/rails/
|
||||
31. http://disqus.com/?ref_noscript
|
||||
32. http://disqus.com/
|
||||
33. file:///posts/introducing-computer-science-just-the-useful-bits/
|
||||
34. file:///tags/ruby/
|
||||
35. file:///tags/rails/
|
||||
36. file:///posts/introducing-computer-science-just-the-useful-bits/
|
||||
37. file:///posts/series-build-coding-course-email-reminders/
|
||||
38. file:///tags/ruby/
|
||||
39. file:///tags/rails/
|
||||
40. file:///tags/letsbuild/
|
||||
41. file:///tags/rubymadscience/
|
||||
42. file:///posts/series-build-coding-course-email-reminders/
|
||||
43. file:///posts/free-rr-video-chapters/
|
||||
44. file:///tags/career/
|
||||
45. file:///posts/urban-legend-of-the-10x-developer/
|
||||
46. file:///tags/career/
|
||||
47. file:///posts/urban-legend-of-the-10x-developer/
|
||||
48. https://ruby.social/@codefolio
|
||||
49. https://github.com/noahgibbs
|
||||
50. https://www.linkedin.com/in/noahgibbs
|
||||
51. https://ruby.social/@codefolio
|
||||
52. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L9874-9978TMP.html
|
||||
53. https://justgoodthemes.com/
|
||||
54. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L9874-9978TMP.html#page
|
||||
Reference in New Issue
Block a user