Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

genuinely curious what your take is here, I have been in security engineering for 5-6 years, then most recently a startup that's using rails. It honestly does not seem that bad even though we're using an ember frontend.

What is your thought process here? Is it the notion that you can ship as fast as possible, and that creates a shitty environment given that you're a hamster on a wheel getting measured by output since "you should be able to ship fast?"



If you mean about Rails specifically, it's that the total lack of discipline in both language and framework makes it impossible to build a product maintainable by more than one person, so every "successful" project has one or a few covert empire builders running it, usually with more political than technical success. That's not a kind of project that pays enough to be worth the trouble, even before we talk about opportunity cost, and the framework itself is a dead end that peaked in 2011 and has had about as many "renaissances" since then as there've been years of the Linux desktop. If I want to go live under that kind of rock, I'll do it with Salesforce, where the pay is better and no one thinks they're cool for poking at a keyboard all day.


Strongly disagree. I've seen bad code or maintenance in all the languages. Sure, some ecosystems seem to attract worse practices, but the absolute best software engineering principles I ever learned in my multi-decade career were at a Rails shop. Everything was extremely well maintained, tested, CI/CD were great even before that was a thing. Not to start flame wars about refactoring or what it means to maintain code more, but that place was absolutely full of people who cared and kept those projects at the highest of caliber grade. You can find good, bad, and ugly in every ecosystem but I personally don't think Rails was ever even remotely bad. You can have an amazingly well-maintained setup and still be super productive. It's really about the people and the company spending the time, money, and energy to care. (Edit: typo)


Which shop? When? Who with?

It matters, far more in this ecosystem than others. If today there seems to be a history of pervasive testing culture in the Rails ecosystem, I can only assume there must exist some quiet mutual agreement to keep some history swept under what must be quite a large rug. Oh, I remember the same enormous amount of lip service about testing that you do! And I also remember what it was like to try to integrate a dependency into a Rails project in 2012, because that was a fair bit of what swore me off the platform. Rails was famously the home of dogshit engineering practice in its day, every bit as much as PHP, excepting only among the coterie of too-good-for-finance Boston hipsters who invented the thing, and benefited from all the same traditional software engineering training and practice they built a culture (and, coincidentally, a reputedly quite lucrative consulting practice) around decrying. Just saying "I saw good Rails back in the day" thus really isn't dispositive.

They were young, so was I, we all make some bad decisions at that age, it's fine, I don't care. But none of us is young any more, and as an aging hipster once said, there's nothing more contemptible than an aging hipster.


One of the largest codebases I've ever worked on, generating billions in revenue every year to this day, is in Rails. Over a thousand hands have touched it, and none of the original people are still around to hold an empire.

I'm with you on the general lack of discipline enforced by Rails; this codebase isn't fun to maintain, precisely for that reason. All the same, I don't think your critique is fair or even that accurate.

But that's from my POV working at bigger companies. Maybe it looks different as a freelancer for smaller shops.


By the sound of it, your POV working at one big company. The codebases I've worked on that did similar ARR numbers with similar depths of commit history were in Javascript and TypeScript, so "your argument is invalid," right? Why not? It's just what you said and my credentials are better. What's the most in revenue one second of your life was ever worth? For me that's about $35k. But no, you go ahead, try to big league me with numbers some more.

If you think my critique is unjust or inaccurate, then attack it, not my standing to speak on the subject. Especially not when I'm the more forthcoming of the two of us when it comes to professional history, anyway; mine is findable from my HN profile, while you prefer true pseudonymy. To argue from authority as you've tried is quite risible with none of that even in evidence, don't you think?


I don't mean to say one of us has better bona-fides, only that there is an existence proof to the contrary of your post. You claim that rails' lack of discipline promotes unmaintainable code shepherded by empire-builders; I claim that this is not always so. I gave the numbers I did to emphasize that rails (and rails shops) can succeed even at that scale.

Not sure what I said that came off as an attack on you or your standing. Not my intent.


I don't see an attack either, FWIW


You should work on that. Technical discussion would I think better resume from https://news.ycombinator.com/item?id=44254539 But I haven't said no Rails project ever meets its definition of success. I assumed the scare quotes in my earlier comment would suffice to indicate my argument intended to contradict that definition.


First, props for your candor. It’s refreshing.

I do wonder if Rails is so bad compared to other frameworks that it deserves such a distinct treatment.

Over the decades I’ve worked with at least half a dozen popular frameworks that fit this description, is the same for you or is Rails truly unique in this regard?


Rails is uniquely compromised by its history and by its language of implementation. Ruby is good for many things. Writing maintainable software in the absence of conventions enforced by shotgun is none of them. And Ruby's American fanbase gets off way too much on holding the shotgun.


Worse than Python (without Typing)?


100% yes. Python mostly encourages simple, stupid code. Code that you can still read while 2 beers in. Rails, on the other hand, encourages being as clever as possible at all times. Forget about local side effects when any part of the codebase can just reach in and patch another part of the codebase.


That's also my perspective.

Debugging can be extremely hard when there are multiple complex frameworks/libraries doing magic stuff, plus extensions by the current team.

In practice this is all very convenient when you're writing the code, but not so much when you have a production issue.


Exactly so.

I'm not actually averse to a programming environment where the only ground truth is the running image. I love that kind of environment! In my editor, where worst case I dump some state when I restart, and I can just not play such dangerous games when on call or there otherwise exists a risk of winning such stupid prizes. Production has rules. Or it had better.

That said, if you want me to go back to dynamic typing, there's a fee. The grass really is a lot greener over here.


The thing about Rails is that it does one thing really well and beyond that you are completely on your own. Without incredible discipline, this becomes a problem because people tend to fall in love with how well it does that one thing and start dreaming up how their other problems that inevitably show up in a project of any meaningful complexity can be solved with the same kind of 'magic'. But they don't have the multiple decades of refinement and literal thousands of developers supporting their solution to give it the same polish that the Rails core has. Which means that, with almost certainty, what they come up with is going to be a nightmare.

The best of the best developers may have the resolve necessary to ignore their emotions and stick to writing 'magic-less' code when they move past the one thing Rails does well, but most projects are going to land in the laps of most developers who aren't that. I am sure we can find counterexamples of where exceptionally skilled teams have been able to wrangle Rails, but the exceptions do not make the rule.

On the other hand, when beginning in a place where writing ugly, boring, but at the same time usable code is the norm, even the average developer tends to stick with it when they need to do things that are "off the Rails". They don't have the original enamourment to get caught up in. There are plenty of developers who can still manage to screw this up too, but, again, exceptions do not make the rule.

Rails is just a tool, of course. The outcome ultimately is down to the operator. But there is a certain psychology at play that introduces difficulty. It is kind of like giving the average daily commuter, who is a perfectly fine driver under normal circumstances, a supercar with features they can fall in love with. In theory it's just a car to drive as they normally do, but they're bound to do something stupid with it when the emotions take over.


After a lot of consideration of this question (I have also all-but written off Rails work, after doing a lot of it) I think it's a combination of two things, one technical, one business-social:

1) Rails and Ruby will gladly let you make an absolute garbage fire out of your codebase, while it still technically works, and discovering how exactly the garbage fire is structured so you can start trying to put it out is unusually difficult in Rails. You don't have to make it a garbage fire, but they won't do a single thing to discourage it, and once it's bad, it's hard for an outsider to show up and figure out how to fix it, because of how the framework and language are designed.

2) Rails is often chosen by very price-sensitive companies trying to move fast, as cheaply as possible. This means high turnover, lots of enthusiastic juniors, outsourcing (often passing through multiple outsourced teams...) and often mediocre or poor management oversight.

The result is that a high proportion of Rails codebases in the wild are both remarkably terrible and impractically difficult to restore to some non-terrible state (i.e. they're the kind of cases where the right call really is to just start over—one of the things that makes them hard to work with is that a bad rails codebase is especially hard to rewrite-in-place, it's just a ground-up replacement job usually, but you won't actually be allowed to do that because see again: price sensitive, so you'll just live with an awful pace of development and poor application performance while management gets increasingly frustrated by the outcomes of their own choices)


This must be a god level troll post.


I was asked for an opinion and I gave one. Don't make too much of it. Rails devotees can't stand hearing a bad word about their baby, they always make a fuss.


I've seen poorly-built code on rails circa 2014, and I've seen Rails done pretty well circa-2025. I'd say rails is pretty neutral. Saying it's PHP bad seems a bit much, but hey.

The worst code I've ever seen by a country mile though was a huge Python 2 code base written on an old version of Tornado circa 2012, a library that basically hacked the Python language to get code to run asynchronously, but you had to contort yourself into knots to get it. You couldn't just call other async functions/methods, you had to `yield func()` when calling them. To return from a function, you couldn't use `return` you had to throw an exception of type Tornado.Return. Absolutely insane way to write code.

Then all the business logic written on top of this bizarre framework was terrible. Half of the code broke the rules I just mentioned but still half-worked sometimes, but would perform terribly or have mysterious problems.

One of my greatest accomplishments was getting it all to Python3 then onto more sane async-style code.


I didn't say Rails was PHP bad, but if you'd asked I would say it is worse. Both have awful ergonomics that make mistakes easy, but at least with PHP it's hard to be foolish in a way that's very clever. Ruby meanwhile will happily hand you more than enough rope to David Carradine yourself before you really even notice, and the DHH/Katz crowd took full advantage.


And yet he double downs on the troll… Style points for the David Carradine reference though.


I reckon the negative reactions are at least partly down to your wording, e.g.

> there is no good work

> total lack of discipline

> impossible to build

This level of absolutism is problematic for a couple of reasons. Firstly it's ambiguous: a "total" lack of discipline would entail never releasing anything. This is clearly inaccurate, and the reader is left guessing what level of discipline is implied. Secondly, without more detail, most will assume exaggeration, given that RoR sees significant commercial use. You haven't provided compelling reasons to trust your judgement over anyone else's, so users are well-justified in raising counter-examples from their experience.

You also come off as dismissive of opinions and lived experiences that differ from your own; suggesting that anyone who disagrees is a "devotee", and that concrete counter-examples are meaningless one-offs. Having been on the sharp end of this dismissiveness myself, it mostly acts to drag the discussion down. Like, fair enough, maybe you're incredibly experienced, you want to make the world a better place by passing on your wisdom, and you're tired of dealing with half-baked takes. But belittling your fellow users is not helping. And again, from my own experience, you can be quick to say that a take is half-baked even when it aligns with scholarly opinion.


Yeah, everyone wants a treatise here, always and only on whatever they happen to disagree with. There's no kind of intellectual consistency more consistent than imposing an effectively unsatisfiable bar for standing to dissent, but letting whatever you like to hear slide without a second thought or question. Meanwhile detailed and substantive technical critiques provided by other users - critiques of the sort I learned a decade ago not to bother making - go totally ignored as I knew that they would.

I don't really see why I should take that sort of thing very seriously. Do you?


I think if you resort less to absolutist phrasing and knee-jerk insults, you might have more fulfilling interactions with other users. Perhaps that's not really what you're looking for when you post. It's difficult to understand why you post.


I could explain it.


"It was eye-opening to see how little attention was paid to serious [people] vs hucksters," you said in a comment last week. That's a good start, and the right frame of thought in which to try to infer an answer to the question you didn't quite ask.

I also realize the insult you didn't quite offer, but while there are grounds for anyone with a Ph.D. to offer me offense, breadth of knowledge is really none of them. You are an expert specialist and I respect that as it deserves, which is less than you imagine but more than you fear.


I simply gave some pointers on how to use less aggressive language. If you perceived a hidden insult, I'd encourage you to reflect whether that comes from the same place that the aggressive language does.


"Aggressive?" I would go as far as uncompromising, discourteous, perhaps even rude. But aggression? Really. Do me the courtesy of not resorting to the absurd, not at least if you mean me to go on taking you seriously.


Yes; from what I've seen, you can be hostile, presumptuous, belitting, and confrontational. What you just posted is a good example. There's just no need for the section starting "not at least...". It's an intimidating phrase.


"Intimidating." I remind you this is a website, where I have publicly disclosed my real identity for years while you remain anonymous.

That is your choice, of course. But this is what I mean about not taking you seriously. No remotely reasonable person could possibly believe anyone competent to participate in Hacker News and be able also to honestly claim to be intimidated by someone taking an impatient tone in mere discourse on the relative merits of programming languages, in a context where I am the one whose identity is known.

Such a transparent lie would ill befit a child of five, and whatever axe you have here to grind, the way you go about it is just embarrassing. Your critique, such as it was, has been submitted, received, and evaluated as ill founded. You have no further business with me.


All this stuff about "taking you seriously" is basic emotional manipulation. It adds nothing to the argument and serves no purpose than to try to make me feel inferior. Same thing when you compare me to a five year old. You dress it up with pompous phrases like "child of five" (or "remotely reasonable" or "mere discourse"), which I suspect is another way to project dominance. Perhaps you don't like facing up to the fact that your language is hostile and confrontational, but it is.


My language is exactly as I intend it to be, but yours is not; you meant to say I sought to intimidate, and ended up saying I intimidated. I remain convinced this is less typo and more admission against interest, but never mind; even at face value it's embarrassing, out of someone who has after all essayed to critique my usage.

We seem to be having an argument that you started, inasmuch as I was not actually in need of any explanation of the phenomenon I described; it does not bewilder at this late date when those with extensive social and professional investment in the waning Rails scene react badly to discussion of that wane. If the progress of that argument fails to satisfy, perhaps another interlocutor will give you a more enjoyable time.

Until then, you will either address any of the variety of substantive points raised earlier in discussion which you have carefully heretofore ignored, or you'll receive no further response from me. Not that I don't come here precisely for pointless disputation, but even my battered pride eventually scruples at this kind of pop-psychological pettifogging you so favor.


I wasn't trying to start an argument. You complained about negative reactions to your posts. I highlighted some aspects of your language and tone that provoke those negative reactions. You then became defensive and tried to belittle me. When I pointed out the irony of this, you tried to belittle me further.


So this all started when you replied to me opining thusly:

> I was asked for an opinion and I gave one. Don't make too much of it. Rails devotees can't stand hearing a bad word about their baby, they always make a fuss.

I quote my own initial comment here, unabridged and verbatim, for the sake of adjacency with the following question: Where in this do you find a complaint?

That's a substantive question, not merely a rhetorical one. I would characterize my tone in that quote accurately as dismissive and uncharitably as contemptuous. But for the way you've talked about it now at such length, I can conclude only that I gave a mistaken impression of uncomprehending dismay. I don't understand how that could be so, given I literally do proffer an explanation for the behavior I'm meant not to comprehend; that explanation might be inaccurate and attract criticism accordingly, but to behave as though required to piece things together de novo is unwarranted. It's inconsistent to argue both that I must not understand the effect I create and that I must set out to create it, don't you think? Yet that's pretty much where you seem to end up.

You having concluded otherwise, ie that there is some essential ignorance here on my part requiring your effort to redress, I therefore ask on what basis you so conclude - the better to avoid again wasting my time, and incidentally also someone else's, in such fashion as this. Good grief, if I could've corrected that misapprehension right up front, we could've dispensed with everything after, to no doubt mutual preference.

And if you'll forgive myself quoting myself from earlier in the conversation, one more time:

> Meanwhile detailed and substantive technical critiques provided by other users - critiques of the sort I learned a decade ago not to bother making - go totally ignored as I knew that they would.


The people you refer to as "devotees" who "can't stand hearing a bad word" strike me as ordinary users whose personal experience simply contradicts your claims. The absolutism of those claims played a part. If you see someone say "X is impossible", but you have personally seen X occur, it's natural to want to correct the record.


That isn't really an answer, or not one at least on point. You're saying my approach made people angry and they responded in a way influenced by that anger, again as though I were unaware. But I have been having this conversation for well over a decade now, nearly 15 years. You will forgive me if I do not always behave as though it were my first time, especially when disingenuousness on the part of my interlocutors has been such a constant over that span.


So... what are you trying to gain by using hyperbole?


What would you like to suggest I would gain by acting otherwise? No comments on this website are private, other perhaps than in orange-name backchannels, and none here are flagged. Those provisos notwithstanding you can see exactly the same discussion I can, and if you felt you could argue other than that it has progressed exactly as I describe, I assume by now you would have essayed the attempt.

Even where it would have offered an advantageous contrast to my supposed hyperbole et al, where do you see sweet reason having told? - when, that is, it comes to the substantive technical critiques of the sort I'm meant to be taken at fault for declining to provide. Those critiques are still being ignored, while you sit here days later still not yet disabused of the idea you are equipped to bandy words with me.

I am not, in short, arguing here with even remotely serious people, and I show them the treatment condign upon their behavior. To do otherwise would serve only to lampoon myself, instead of them. It isn't something I expect to see appreciated by my interlocutors, including you. Its audience, if any, lies elsewhere.


Do you never take a step back and wonder whether all this talk about "seriousness" is just a deflection?

Hard disagree. I work on one of the largest Rails codebases out there. Millions of lines of code running in a monolith. I have learned more in this shop about scaling, observability, mature system designs, zero downtime upgrades, deploys, etc…

I been in this field for almost 30 years and have worked with whatever tech the job required. Still I learned more at a Rails shop with more than 200 engineers all working in the same monolith shipping to production multiple times every day.


I'm well aware there is a large Rails shop with famously strong engineering practices, which I believe deserve much credit that accrues for some reason instead to the framework.


Yes, yes, yes, everyone knows about Shopify and no that’s not the multi billion dollar monolith shop I’m referring to, but we definitely have taken some inspiration from their excellent practices. We also brought in a lot of best in breed from Microsoft and Amazon.

Bottom line is it’s about the talent and the discipline. At the end of the day it’s not bad languages that are the problem it’s bad engineers.


Well, good enough engineers can get the most out of even the worst tools, that's true. I'm glad not to be among the ones you describe.


Can confirm, I'd charge a laaaarge premium to ever work on an existing Rails codebase again.

Did it several times over a period of 15 years and they were always a wreck and unreasonably painful to work with. Every single time.

I'd start a green field one, no problem, provided I get veto on gem choices ("Let's use some twee fucking template language that's a ton worse-performing than the default and doesn't let you programmatically control nesting levels / end tags because it's terribly designed" yeah how about we don't do that because it's going to make my life a living hell) without charging a premium. But no more onboarding to rails codebases without enough money to make it worth my hating every second of work for the (assuredly short) duration.

... and I like Ruby!


Ruby is only just now getting static typing and Rails has a lot of "magic" as part of its value prop. If you're trying to launch something of low to medium complexity quickly and stay on the happy path of the tools in the ecosystem then it works great. The lack of rigor from dynamic typing and latitude afforded by Ruby's expressive syntax can quickly become a footgun though.

My pet theory is that LLM coding is going to give the upper hand to more verbose languages like Golang or Typescript because more of the execution flow will end up explicitly in the LLM's context. Convention over configuration-type frameworks ruled when one-person code bulldozers shipped MVPs but Continue is upending this paradigm.


I wouldn't really call it a pet theory at this point; HN's front page daily further shows that LLMs suck at magic and excel at boring code, seeming quite immune to boredom. But I would argue what makes the difference for LLMs is not verbosity but locality, whether syntactic or analytical ie whether the type is just written here or you have an LSP server to query for it, the distinction is, being able to point to an arbitrary symbol and get lots of rich context about it.

It's a game changer for human devs also, and not really one I would expect a serious Rails habitué to necessarily evaluate in a way that's reliable. What did someone call that once, the "Blub Paradox?" Silly name, but that's this industry for you.


I've worked with Ruby. It was a delight. But it has to be maintained, dynamic typing loses upfront safety & allows for a mess where you have to analyse the whole program to have any idea what some function is expected to take in & put out

I'm glad static typing came back


Ruby is a fine toy and an awful tool, the other Perl that Python killed.

Rails should have incurred some kind of criminal indictment.

I wish I hadn't mentioned either, because now no one will talk about anything else.


Analyze the whole program? I steadfastly refused to ever attempt do that. "method(:foo).source_location" from the Rails console and I've got the only answer that matters. Most functions were monkey patched at least once anyways, so you'd never know by searching for the implementation where it was.


But like…this is very telling, no? If major conventions in a language involve runtime debugging/printing actions to just find out where a method is defined (and your approach here is the norm in every Ruby codebase I’ve worked on; this isn’t an attack on you in the slightest) that doesn’t say anything good about the Ruby ecosystem.

Hell, just finding out what methods can be called from a given code location is something that most Rubyists I’ve met answer either with a runtime debugger or hard-fought and non-transferable memory about a particular piece of code.

Like, I don’t need perfectly accurate programmatically-available answers to those questions in my IDE (though that would be nice). I’m fine reading code and working it out if things are added via reflection/metaprogramming. But if the domain of code to read to determine those things is “who knows/could be anything in the codebase or dependencies”, this is a poor quality tool and/or community.

If you read that and think I’m complaining about one specific instance, codebase, or Ruby community habit, I promise I’m not. It’s not about the 2014 obsession with “DSL”s (that aren’t really DSLs); it’s not about method_missing, open classes, pervasive monkey patching, and so on. It’s about all those things, and more, and the overwhelming enthusiasm (with no small side of smugness) with which the Ruby ecosystem doubles down on them constantly.

Is it the language itself? The community? I don’t know, but I know there are plenty of equivalently capable alternatives to both, and that’s enough for me to avoid the hell out of Ruby and Rubyists for a long time to come.

Is Ruby the worst? No, that honor goes to a multimillion line Perl monolith worked on by far too many not-as-clever-as-they-thought-they-were people over far too long. But all the Ruby I’ve worked on is close enough to that experience to make me question the choice of tool.


I think it is just the result of a community that views metaprogramming as the normal solution to a problem.

I can write perfectly legible and readable Ruby if I want to. But I also could just write Python and it would be easier to maintain.


Came back? Everyone and their cousin is falling over themselves to get on the AI train[1], and spending incomprehensible amounts of energy trying to "lint" their way to sanity as if the python ecosystem isn't fighting tooth and nail to "be dynamic"

So, yeah, I look forward to the cycle tacking in the other direction but today ain't it

1: to say nothing of the fact that model servers exist so why the fuck are you writing business logic in a language that DGAF just because your data scientists have a hard-on for pytorch


As evidenced by the other replies by OP, it’s a hyperbolic and bad take. There’s plenty of companies doing just fine with Rails codebases. Many of which are a decade or more old now and have done just fine with the inter generational transfer that happens due to natural employee attrition and haven’t been held hostage by one or two all-knowing engineers.


I said "empire builders," not "engineers." Nor did I say "held hostage."

My perspective on this is that of a working engineer who made a deliberate choice, now nearly 15 years ago, to avoid ending up stuck in the same decreasing-radius career spiral I saw Rails leading me toward - so I went and did some other things, then spent a decade building modern TypeScript instead, mostly on Kubernetes, without losing the ability to knock out a quick one-off script or architect a system top to bottom as I need. It's worked out splendidly for me! I suppose I might have done as well if I decided differently, but I admit I don't see how.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: