Rails is better low code than low code
478 points by thunderbong 7 days ago | 242 comments
  • namaria 6 days ago |
    The low code space has been well explored. Excel is the flagship product in that space.

    You tell me if you want to be involved with a long lived and non trivial collection of spreadsheets.

    • rqtwteye 3 days ago |
      Not sure if Excel is low code. It has a pretty full featured language behind it: VBA.
      • ebiester 3 days ago |
        Retool has JavaScript. This is common for low code to have full languages attached.

        The point is that you can do 80% of the presentation by wiring things together and only rely on coding for the most complex tasks.

    • stefan_ 3 days ago |
      I don't know if that is the case. Here is a low code flagship product few people have heard of: https://mathworks.com/products/simulink.html

      It runs your car engine.

      • cpgxiii 3 days ago |
        More exactly, C code (hopefully MISRA C) generated from Simulink models runs much of the embedded systems in many cars. Although sometimes (cough, Toyota/Denso, cough) that generated C is then bodily assaulted by questionably competent embedded developers until it combines the worst qualities of MISRA C and low-quality embedded development, because, like many low-code solutions, getting (and keeping) everything in the low-code model is hard and the built-in escape hatch to a real programming language is not always a good fit to the problem at hand.

        (As a nit, I suspect that Simulink is known and deservedly disliked by the vast majority of people with non-software Engineering degrees, given the omnipresence of Matlab in academic contexts.)

        • analog31 3 days ago |
          Matlab / Simulink will doubtlessly have a very long tail, but is being overtaken by Python. For one thing, programming is gaining ground in areas that have no established loyalty to Matlab, and those are growing areas. Such as the life sciences. For another, a certain fraction of students want to test the waters and see if they can explore software development as a career option. Python is more relevant to that option than Matlab.

          But Simulink does continue to rule its own roost. I think the users see themselves more as engineers than as software developers. And engineers are more inured to using awkward tools.

          • miohtama 2 days ago |
            Python is also open source.
            • analog31 2 days ago |
              Indeed, and that's an attraction even despite Matlab being effectively "free" due to generous academic site licenses. But people are catching on that open source means more than "free" as in beer. I think it has also encouraged what we've seen, the flourishing ecosystem of libraries, tools, tutorials, etc., that really make Python what is. People don't want to pour their heart and soul into something that somebody else owns.
              • robocat 2 days ago |
                > People don't want to pour their heart and soul into something that somebody else owns.

                Plus the soul of academia is openess and sharing (perhaps trending towards closed IP and privatisation).

    • IshKebab 3 days ago |
      I don't particularly want to be involved with a long lived and non trivial collection of Ruby code either, if my experience of the Gitlab codebase is anything to go by.

      I agree with the author's point, if you replace Ruby with something less awful (Deno, Go, etc.)

      • meesles 3 days ago |
        This feels like the exception that proves the rule. Gitlab has one of the largest Rails codebases on earth. It's also been built by a decentralized remote engineering org from the start. I think that explains a lot.

        Compare that to my personal experiences and that of my colleagues who work heavily with Rails: We show up to a new job at any level of seniority, spend a week or two learning the codebase, and immediately have a firm grasp of all the major components of the application. And I want to stress _firm_ grasp, since everything from the model structure to the ORM to where you can expect to find tests is standard.

        Obviously no framework or convention will hold perfectly in the extremes

        • kayodelycaon 3 days ago |
          Same here. I’ve basically made my career as a rails developer and it’s never taken me very long to figure out the many applications I’ve worked with. Some of them are quite complicated.

          Some of the older stuff built around rails overdid the meta-programming. Makes unraveling things a little more difficult, but you generally know where to look.

          And every time I see a nontrivial state machine using a state machine gem, I know I’m in for a world of hurt. But I know exactly what mistakes I will be fixing. :)

    • lordofgibbons 3 days ago |
      That's AN example, idk if I'd call it the flagship product. Another example is: https://www.sidefx.com/products/houdini/ which uses node based programming with small amounts of code for edge cases. It's used in a lot of movies very successfully.
    • ryukoposting 3 days ago |
      I'll never understand why more devs don't learn Excel. Yeah, it's ugly. It's also the only thing you know you can use to develop a tool, slap one file into an email, send it to whoever needs the tool, and they'll immediately know exactly how to open it and use it. No 5-step lists of instructions, no dependency hell, no need to subvert the IT department. Excel is the lowest-friction platform for developing internal tools, period.
      • analog31 3 days ago |
        At my workplace, they do, for all of those reasons.
      • grogenaut 3 days ago |
        We use sheets all the time at work for all sorts of processes, essentially an internal tool. But it doesn't really even need code, the human is the code. I had to strongly suggest to some of our TPMs and actually a principal in the last year that no they didn't need a tool, they just needed a spreadsheet. But this is so low code that people likely don't even think of it as a low code solution, it's just a spreadsheet.

        That said other than managing and sorting lists of work to do, I break the limits on sheets and excel all the time so for anything with customer scale data I can't use it.

      • nickjj 2 days ago |
        Yep, even the most basic knowledge such as knowing how to do math on a few cells can be useful to build things. It's really good for one off internal tools to do comparisons.

        For the first 5 years of selling courses I handled affiliate payouts by sorting and summing rows in a spreadsheet. It only took 5 minutes once a month. I eventually automated what I used to do manually with a script that reads the CSV file because I like coding and it was fun to me, plus I wanted to remove one point of human error.

    • zamalek 3 days ago |
      Somewhat of a tangent: As much as us engineers hate it, I consider the fact that Excel monstrosities are commonplace high praise for the product. Being hated by engineers because your product is so common is exactly where you want to be (double points if you stir up some consulting/certification for migrating to actual solutions).
  • simplemindedbot 6 days ago |
    So low-code is faster to get started with little programming knowledge but isn’t expandable. OTOH, a language and framework that you’ve taken the time and effort to learn takes a little longer to get started but is ultimately more suited to more complex tasks.

    I think the takeaway from the narrative here is knowing when to switch from the low code platform and call it a PoC. I’d have cut that off around the point that the custom lambda came into play. That way you’ve used the low code environment for what it’s good at, creating something “they” can react to and easily explore basic functionality. While at the same time you’re taking those learnings and building the more robust solution.

    • ljoshua 3 days ago |
      I agree that the main takeaway is knowing when to switch. Having a mental model for this makes many future discussions and decisions much easier, because this seems to be a conundrum that comes up frequently (even for me inside of a large tech organization!).

      Based on my experience, I'd suggest the pivot point occurs before even starting: it should pivot around who is building and maintaining the system. If you have the experience needed to quickly develop a solution in code, do it in code. If not, because this is a non-technical team without technical resources, do it in low code. Simple as that.

    • rqtwteye 3 days ago |
      I usually go straight to the full language. It's pretty hard to find the point when to switch from low code to something else when there is time pressure.

      Same with bash vs python. People say you should switch from bash once you have more than 100 lines or so. But at this point you already have some complexity in bash which makes the switch to python non trivial. So you usually end up patching the bash script in small increments as needed. It gets messier and messier but nobody wants to/can spend the effort for a full conversion

      • maleldil 3 days ago |
        Better to immediately switch to Python (or anything else) once you have any non-trivial control flow in your bash script. Loops, non-trivial conditionals, and argument parsing are all easier in Python. Bash is for simple scripts that just chain commands.
      • raffraffraff 2 days ago |
        Unless you're a regular python user who has already paid the high cost of installing learning to use the whole mess of tools, the break even point exists. There are times when I do the 100+ lines of shell to avoid python. How often do python apps just stop working on me for no apparent reason? (Yesterday I tried to launch puddletag and had to nuke it and reinstall). But for me the big thing is that using "curl | jq | awk" is easy, fast and terse. If I can get away with that I'll choose it every time.
        • maleldil 2 days ago |
          If you're using simple pipes with little control flow, bash is a great choice. Once you need something more complex, you're better off using something else. Not necessarily Python (Ruby and JS work well as replacements, too), but that would be my first choice.

          For most simple scripts, Python's standard library is more than enough. File operations, JSON manipulation, HTTP requests and argument parsing are all available without external packages.

          Regarding Python apps, have you tried using pipx to install them? That would eliminate most dependency problems, which usually arise from sharing the same environment (potentially including conflicting dependencies) across different apps.

  • jitl 3 days ago |
    I don’t want to build in a language without types, but low code is even less types than Rails. I’ve just never worked on a public app that was simple enough for Rails to feel good - Airbnb was rails but by the time I got there it was very much not simple. Internal tools in rails though, that is okay.
    • darepublic 3 days ago |
      I expect low code that can be translated into typed clean code. The low code side of it is just with more assumptions baked in. And with llms you can perhaps have a lot of leeway to in fact customize and allow low or no coders to specify somethinf exportable to readable typed code
    • ajayvk 3 days ago |
      This is what I am trying to solve for with https://github.com/claceio/clace.

      Allow internal tools to be built with regular frameworks, while making it easy to add gitops, SSO, secrets management etc which are required for internal tools.

    • Zambyte 3 days ago |
      Ruby is strongly typed. Dynamic typing and inferred typing are not the same as typeless. B and Forth are examples of typeless languages.
      • lolinder 3 days ago |
        "Strongly typed" is not a well defined term—it basically means "I'm personally comfortable with the level of guarantees offered by the language", which is a purely subjective measurement.

        In context it's obvious that what OP meant is that they wouldn't want to build in a language without statically-checked types. That there are languages that provide even fewer statically-analyzable guarantees than Ruby does not make Ruby a suitable candidate.

        • cies 2 days ago |
          > "Strongly typed" is not a well defined term

          True. But it has boundaries. Strongly typed cannot be used for langs with implicit nulls. You need to do better than stock C, C++, Java or Go to be able to use the term.

          Rust, Elm, Haskell, Kotlin and OCaml come to mind.

          • lolinder 2 days ago |
            No, that's also entirely subjective. You feel that way, others don't.
          • lelanthran 4 hours ago |
            > True. But it has boundaries. Strongly typed cannot be used for langs with implicit nulls. You need to do better than stock C, C++, Java or Go to be able to use the term.

            That's, frankly, an insane boundary.

            According to you, all mainstream languages are untyped? Seriously?

        • Zambyte 2 days ago |
          > In context it's obvious that what OP meant is that they wouldn't want to build in a language without statically-checked types.

          They should say that then. "Dynamically typed language" is not much harder to say or write than "typless language", but is correct instead of being incorrect. And that is a well defined term :)

          • lolinder 2 days ago |
            Most academics would agree with them that dynamically typed languages are a misnomer and in fact have no type system. And whether you want to use the colloquial term that counts dynamically typed languages or the academic one that doesn't is a subjective decision, and one where their choice was clear from context.

            More generally, advocates of dynamically typed languages seem to want their languages to be considered typed because there's a developing consensus that typed is better. Unfortunately for said advocates, that consensus was not developed in contrast to languages like Forth, it was developed in contrast to languages like Ruby, so changing the definition of a type system to accommodate Ruby doesn't actually get you credibility in the new "cool kids club". You're better off arguing why dynamic is better than static than you are trying to enforce a particular definition of types. No one is going to be persuaded that Ruby meets their needs just because you made them use your definition.

            • Zambyte 2 days ago |
              Incredible, I disagree with just about every point you made. We're not going to make any progress, have a good day.
    • stephen 3 days ago |
      > don't want to build in a language w/o types

      Yep; that's the only reason I don't use Rails.

      I'm building "ActiveRecord but with type(script)" at https://joist-orm.io/ and have our own internal "kinda Rails w/GraphQL" going internally--so far we're at ~450 tables and still "feeling good" (no n+1s ever!), but definitely a long way to go before AirBNB-sized problems.

      • cies 2 days ago |
        I hate ORMs, as you still need to break out to SQL regularly: why bother?

        I'd go with Kotlin/SqlDelight or Rust/sqlx (or even jOOQ) these days to avoid having to deal with the overhead of an ORM.

    • mattmcknight 2 days ago |
      Ruby has types.
      • nicce 2 days ago |
        In runtime. Basically you lose most of the benefits.
        • fulafel 2 days ago |
          Before lightly using this argument I recommend using a language that really doesn't have types. The difference between getting your errors at runtime / compile time is much much smaller than the difference between those and not getting errors at all.
          • lelanthran 4 hours ago |
            > Before lightly using this argument I recommend using a language that really doesn't have types.

            I am curious now: which language doesn't have types but has a separate compile-time?

        • mattmcknight 2 days ago |
          Not just at runtime.
      • jitl 2 days ago |
        Whenever I google to see if people are enjoying Sorbet or RBS I find articles like this that basically say “no, no one seems to be enjoying this and it’s going nowhere” https://brandur.org/fragments/ruby-typing-2024

        In my opinion RBS files are a horrible design decision and split the Ruby community between a typing system that people actually want to use (Sorbet) and a typing system we’ll tolerate because it’s official but a pain in the ass (RBS), leaving both ecosystems to whither. Sad :-(

  • Neywiny 3 days ago |
    It would be nice to get a brief definition of "low code." Otherwise great article. I've found myself using "low code" frameworks when they setup my environment for me and can generate the code files. Key example was a Minecraft mod maker. Within a minute I was fed up with the scratch style programming, but it had all the Java build stuff ready for me to just edit the files myself. No setting up gradle or anything.
    • p1necone 3 days ago |
      I think this is the key to them actually being useful - generate a sane project in some widely used language under the hood, and let people give up on the low code solution when they outgrow the guardrails. Otherwise you're just dooming yourself to an eventual rewrite as soon as you need some feature that's not supported.
      • Klonoar 3 days ago |
        “Ejecting” is the key term here I think, or at least the one I’ve always used - for when you need to shed the handlebars for more control.
        • daelon 3 days ago |
          "Escape Hatch" is also commonly used.
          • ec109685 2 days ago |
            Escape hatch feels like the lambda the author talks about. Ejecting is abandoning the generator and owning the code from that point on completely.
    • bloomingkales 3 days ago |
      “Low code” means you do not have to go beyond the tool to solve problems. In fact, there should be entire problems you cannot even create with low code tools. Programming could mean an endless rabbit hole through several technologies, same with designing (you are concocting designs that may use several different technologies).

      If the tool lets you make a circle button and change text in it, then that’s all you have to worry about.

    • jiggawatts 3 days ago |
      Generally these are the drag & drop visual editors like Microsoft Power Apps and the like.

      Like the article said, my experience is that they're Great!™ until they're not, at which point you're painted into a corner.

      • ozim 3 days ago |
        Funny thing is they stop being great rather quick.

        When you configure 10 controls and then you have to do another 10 but slightly different - with code you can mostly copy, paste, modify with search and replace and you are done.

        With low code tools usually it is just the same work again and even if you can duplicate stuff with an option in the interface adjusting stuff goes one by one.

        • jiggawatts 3 days ago |
          Personally I find this to be the worst with ETL tools such as Microsoft SQL Server Integration Services (SSIS).

          Table-to-table mappings are often very mechanical, with a set of simple exceptions or deviations, such as adding one column or skipping one column.

          There is nothing fiddlier in this world than repeating these steps over and over with a GUI tool where you have to individually click each column mapping link to open its "properties" one... at... a... time... for hundreds of tables with dozens of columns each.

      • owlstuffing 3 days ago |
        Yep. They demo great, but unless your use case is on the trivial end, you either find yourself making unreasonable compromises or, if the tool provides API escapes, you’re not only coding, but hacking against the tool.

        In my view, mainstream languages like Java should offer static metaprogramming for library authors to make tooling like Rails possible and more approachable in IDEs.

        The manifold project[1] has something like this for SQL, but it’s obviously providing its own static metaprogramming layer over Java. Shrug.

        1. https://github.com/manifold-systems/manifold/blob/master/man...

      • stana 3 days ago |
        And not much mention of how you do releases and version control with low-code.
    • slantaclaus 3 days ago |
      I assumed low-code meant something less bulky like Sinatra
    • imtringued 2 days ago |
      I think the hallmark of a low code solution is that you don't have to worry about build systems, project setup or deployment. Those barriers hinder software engineers and laymen alike.
  • jameslk 3 days ago |
    Both low code and Rails have become a lot less relevant since LLM assisted coding became the norm.

    Low code became less relevant because 1. LLMs solved many of the problems low code solves with better control over the output, and 2. you can’t use many low code platforms as an output from LLMs or other types of models (yet).

    Rails became less relevant because Ruby is dynamically typed, and this poses a challenge for LLMs due to hallucinations. You don’t want to find out at runtime what things were complete bs from the model. Static typing isn’t a panacea to hallucinations but it’s a significant enough advantage, especially against such a dynamic language as Ruby. Even mere mortals struggle to understand the magic in meta programming DRY golf that many in the Ruby world have chosen to embrace.

    EDIT: Any down voters care to explain why you disagree?

    • bravura 3 days ago |
      What are the best static languages + frameworks for shipping CRUD web apps?
      • dallasg3 3 days ago |
        ASP.NET and C#
        • valiant55 3 days ago |
          I'm currently building an internal app with Pico CSS, htmx and ASP.NET minimal APIs returning Razor components and it's a joy. I'm a Developer DBA with no perfessional front end experience but I feel really productive and the final results look great.
        • WuxiFingerHold 2 days ago |
          Not to forget Entity Framework Core. It has become one of the best (if not the best) ORM over the years. Bit of a learning curve, but for CRUD ideal.
      • jameslk 3 days ago |
        This is going to be largely dependent on your needs, but a factor I would consider if you're using LLMs for coding is which models have been trained the most on which languages. The more a model has been trained on a particular language, the less it will hallucinate
      • lmm 3 days ago |
        Wicket is the best library I've ever used. Not just best webapp library or best Java library, the best library anywhere. If server-side rendering is an option then I'd absolutely use that (possibly from Scala).
        • imtringued 2 days ago |
          Wicket sounds like a throwback to JSF. No thanks.
          • vitro 2 days ago |
            Yes, sounds like, but it isn't. There is no logic inside html templates apart from wicket-specific component binding tags and everything happens in Java.
        • vitro 2 days ago |
          Happy to see Wicket mentioned. It is still pleasure to work with, even now.
    • dullcrisp 3 days ago |
      The post isn’t about LLMs. Why not say LLMs have become less relevant since the advent of Ruby on Rails? It seems to me they’d be worse than both options presented in the post.
    • cpursley 3 days ago |
      As much as I love Ruby and Rails (and Elixir even more so), the IDE type checking of Typescript combined with LLMs is insanely productive. So I tend to agree, despite very much disliking node/JS and it's ecosystem. I've never been so productive in terms of getting ideas out of my head into functional products (ideate with Claude then start with bolt and move to Cursor after tapping that out).
    • chamomeal 3 days ago |
      I don’t rely on LLMs as much as I did when copilot came out, but I 100% agree regarding static types: they make it so much easier to tell when the LLM is spewing nonsense. I probably wouldn’t use one at all with a dynamically typed language.
      • teitoklien 3 days ago |
        the key is to not generate huge big spurts of code blocks but incremental, reviewable code blocks in dynamic typed languages. Also,

        “LLM”s are a constantly updating product, the new DeepSeek coder model with GPT-o1 like reasoning and chain of thought just came out, and its a lot superior than LLM models from even 1 month ago, especially when trained on internal docs, and files, and synthetic LLM generated metadata on those files, all accessible under an effective hybrid search engine.

        It’s perfectly usable with Dynamic languages like JS and Python, and perfectly doable to write bug free effective code, is one is restrained and thoughtful in its use, which builds up as muscle memory over time anyways.

        Especially if one considers linters and type hints enabled in js (as ts) and python type hints, then it becomes even more doable, if you’re insistent on static typed only language code with LLM.

        • cageface 3 days ago |
          restrained and thoughtful in its use is exactly how I expect people to not use these tools. Copy and paste and push the commit is more like it.
        • jokethrowaway 2 days ago |
          It's marginally better compared to Claude and costs 10x. O1 is not a solution.

          I agree there is plenty of space for improvement on the IDEs side, they need to start fetching code of dependencies and documentation dynamically, get the relevant context and pass it in the prompt to the LLM, so that they can use real code and not what the model remembers from training a certain library does.

    • verdverm 3 days ago |
      > since LLM assisted coding became the norm.

      Has it? I don't think many here would agree it is the new norm

      > better control over the output

      LLMs are notorious for inconsistent output. Deterministic code gen is predictable. The control of a SaaS style low-code project may be limited, some offer to eject the codebase for you. There are numerous open frameworks, like Rails, where you have full control. It's about how you define control. Using a magic box like an LLM to generate code inconsistently comes with a lot of headaches. Why not choose the predictable magic box like Rails?

      > Any down voters care to explain why you disagree?

      Talking about downvoting typically earns more downvotes because it is against the posting guidelines

      • jameslk 3 days ago |
        > Has it? I don't think many here would agree it is the new norm

        Yes: https://survey.stackoverflow.co/2024/ai/#sentiment-and-usage

        Anecdotally, my entire engineering team chooses to use LLM assistance because they feel more productive with it

        > Talking about downvoting typically earns more downvotes because it is against the posting guidelines

        I’m fine with the down votes. I asked because there were no comments, which makes for a pretty boring discussion. Now there are some comments. Thank you for leaving yours

    • ElatedOwl 3 days ago |
      I agree that LLMs capabilities with a language are going to be extremely relevant. Community, API consistency, and whatever other factors that are going to increase LLM usefulness will decide the popularity of languages in the coming years.

      I’m not sold on the importance of static typing though. I’ve had great results with Ruby and Python with 4o, o1, and to a limited degree Copilot.

      One of the biggest benefits of Ruby is how simple testing is. The language is so dynamic that mocking/stubbing and intercepting or whatever is dead simple stupid.

      So the “static types prevent you using LLM hallucinations” does not hold for me. I’m going to write tests covering the method (which the LLM will probably help with), and I’m going to get an undefined method error.

      • jokethrowaway 2 days ago |
        It's very evident this is the case if you generate similar JavaScript or TypeScript.

        The types mismatching can really help you spot mistakes early on instead of at runtime, plus with the LLM generating trivial boring types is very straightforward.

        The same effect is visible in Rust too and you'll quickly catch APIs that don't exist or that are being used incorrectly - albeit LLM understanding of Rust is really bad compared to other mainstream languages

  • xrd 3 days ago |
    I got stuck when he said he wrote a lambda function for the no-code project. How did a lambda function get categorized as no-code? </snark>

    (I think I'm aligning with his point in the article. No-code really does not offer much long term. And, IMHO, no-code will never truly be no-code, so why not start with "Yes! to code!" and build from there)

  • game_the0ry 3 days ago |
    I am not a rails dev but have looked into it for some side projects that I am considering.

    IMO, I think it hits an excellent balance between rolling-your-own framework and no-framework-low-code. Rails itself handles so much configuration and wiring up so you that most of the code you do have to write is business logic.

    Lambda functions and firebase are convenient and compelling but come with their own tradeoffs that are not as well-tested in the real world compared to rails.

    • 0xDEAFBEAD 3 days ago |
      I think Rails is good for a consultant who wants to pump out a lot of relatively generic apps. You pay a constant upfront cost to learn the Rails magic and the conventions, and once you know that stuff, it makes greenfield development faster.

      If you're doing a single big project, Rails is less attractive. The upfront cost is amortized over just one project, and the magic makes it a bit harder to stray from the beaten path when you need that.

      • abid786 3 days ago |
        Could you give some examples of what the use cases are where Rails makes it hard to stray from the beaten path?
        • rafamvc 3 days ago |
          If you work on an older and large rails code base, you can easily find the programmers who came from more "formal" languages like java.

          They build layers and layers of code to "isolate" rails and end up with big ball of mud. Once you do that you have to keep wrapping and adapting, and commanding, and querying and it takes a gang of more than 4 developers to maintain a feature set that could be done with 1 good rails dev.

          Code is liability. Features are the asset. Well written rails has one of the best bang for the buck for lines of code per feature.

        • afuchs 3 days ago |
          > Could you give some examples of what the use cases are where Rails makes it hard to stray from the beaten path?

          Rails is amazing for greenfield projects. It will automatically do things for you which will greatly reduce the amount of boilerplate you need to write as long as you follow the framework's conventions.

          However, Rails has a less than stellar reputation from those who have maintained long lived projects which use it. Rails' conventions encourage the use of fat models where business logic is implemented in the models themselves. With the default scaffolding Rails provides, every single model and all of this business logic ends up in the project's app/models/ directory without any separation between different features. Because the default doesn't cleanly separate business logic with well defined boundaries this means that Rails apps tend to evolve in a way where everything starts to become tightly coupled with everything else. When the business requirements for the application inevitably change this tendency towards tight coupling between models makes it difficult to make major changes to existing code.

          I've also seen hacky workarounds used in Rails based apps which exist to make complex business logic work (e.g., saving one model doesn't implicitly trigger hooks for business logic on other related models). These hacky workarounds usually break the conventions Rails uses and ends up requiring extra boilerplate to be added elsewhere in the application.

          Some developers try to avoid this by hand rolling more architectural layers (e.g., "Java/Go/Node.js/OOP like") on top of Rails to try prevent this, to varying degrees of success. Other frameworks (e.g., Django) try to encourage developers to separate different features into distinct modules to try and prevent them from being tightly coupled with each other.

          • andrewmutz 3 days ago |
            Long-lived rails apps are a nightmare to work with, in exactly the same manner as long-lived java, python or php apps
            • afuchs 3 days ago |
              > Long-lived rails apps are a nightmare to work with, in exactly the same manner as long-lived java, python or php apps

              Agreed that tech debt and bad architecture is everywhere. However, from my experience there is a difference in how much work it takes to evolve a project towards something that's less of a nightmare to work with.

      • revscat 3 days ago |
        My experience has been different. Rails is good for everything from small internal projects to larger, enterprise level projects. Like all languages and frameworks, it requires discipline and good practices for the code to remain robust and maintainable, but functionally I’m not aware of anything that fits what you describe in your second paragraph.
  • stana 3 days ago |
    Code is cost. Low-code is getting a vendor to generate code for you (cost again) and putting into a black box you can't access. i.e. lock in.
    • revscat 3 days ago |
      How is that relevant to this discussion?
      • stana 3 days ago |
        Point I was trying to make was that low-code is a lock-in IMO, and I would pick Ruby, Django, or whatever any day for no other reason than being able to modify/maintain/own code.
  • jumpoddly 3 days ago |
    Better headline: The framework you know intimately is better low code than low code.

    What programmer “believes” in “low code” solutions?

    • MattGaiser 3 days ago |
      The real pain point low code seems to solve is boilerplate. Say that I am getting Django ready to go. To get started, have to Dockerize, swap to Postgres, add linting, swap out of the User model, etc.

      But once all that is ready to go, it is about as fast as low code in my experience.

    • weitendorf 3 days ago |
      Sufficiently advanced "low code" is indistinguishable from a framework or a library.

      The main difference in practice is that most software that markets itself as "low code" obscures how it works and tries to lock you in to charge rent. Though to be fair, there is generally not much of a market for proprietary/non-OSS libraries and frameworks anymore, so if you want to monetize your library/framework low-code (or an API) is probably the way to do it.

      Aside from that, I do think the "low code" label can be genuinely helpful as a way of communicating towards semi-technical users that the software they're using is intended to be usable with their level of technical sophistication. IMO this has been a perpetually underserved market, and it's growing over time especially as computer science/programming gains popularity in schools. There are a lot of people out there who understand basic programming and took maybe a couple CS classes in their life, and want to do something entrepreneurial or practical for their non-SWE jobs, but aren't skilled enough to dive right in to doing things the way experienced SWEs would do it.

      • threatofrain 3 days ago |
        This makes me think about Microsoft Access and why it never took off. It helps people create databases, forms, and reports. One might call it a no code solution as opposed to merely a low code solution. There are a lot of businesses that's ostensibly in the right place for Microsoft Access.

        In my view there are certain aspects of app building that's hard. Some of it is in code, some of it is in design, some of it is in domain modeling. Every once and awhile you get stuck and your low-code solution is suddenly paralyzed at that one point. ChatGPT unblocks you until you REALLY need a programmer.

        Low or no code did not make sense until ChatGPT.

        • andyferris 3 days ago |
          Access was more popular with a certain crowd, way back.

          Then the client-server world dominated the desktop, plus we needed automated backups and source control and tests and scalability and auditing and hosting and security and other really important things that never properly made there way into Access. Presumably Microsoft didn't want to cannabilize SQL Server sales and chose not to invest in those things that would have actually made it an MVP for building home-grown apps.

        • weitendorf 3 days ago |
          Access maybe never took off, but wasn't Visual Basic super popular at one point? I think you could arguably call it low-code given its use of a WISYWIG UI builder and eliminating a lot of the boilerplate of creating a windows application. I definitely think you could call Excel a low-code tool too. Probably SAP and Salesforce as well.

          I'd argue that it was Cloud and improved monetization opportunities rather than ChatGPT which made the current iteration of low/no-code more popular, although ChatGPT certainly helps (I'd argue that past a certain level of complexity/code sized, LLMs also stop working properly). Most low/no-code tools include hosting, which is a must for anything meant to be served on the Internet, and before public cloud took off, this was a lot more complicated to offer for free or a low-cost. There's also a much bigger market for SaaS and it's easy to take payments over the Internet now, which incentivizes semi-technical to build software to be served over the Internet rather than their desktop (and also makes it easier to build the low/no-code tools themselves).

          > until you REALLY need a programmer

          This is the thing I was getting at, there are a lot of people who know how to program but are not super-skilled at it, and I think a lot of software engineers don't get this. Think back to when you were just learning to program and how frustrating it probably was to do "basic" things like set up your dev environment or ship a website for the first time. For the people using low-code, it's not that they can't do these things, it's that they'd have to spend a lot of time looking things up and learning how do it, which is a major time investment (and frankly require a lot of persistence/patience which I think professional SWEs self-select for, because the learning SWE learning curve is brutal for most people) that they'd rather not make. You can argue that past a certain degree of complexity that the investment is worth it, but in many cases it probably isn't, and in others it's possible they'd not have made it to the point of outgrowing low-code at all if they had to do everything from scratch.

          It's not much different from how we as programmers use things like Cloudflare or AWS Lambda. Could we run and manage our own DNS or scaling? If we really need to learn it, we probably could if we set our minds to it. Is it possible we could outgrow those tools if we start on them? Definitely. But even when we know how to implement our own scaling or DNS we might still reach for these tools just because they're so convenient to get something working quickly, and most of the time we don't outgrow them anyway. Low-code is pretty much the same thing except it has a lower technical barrier to entry (eg you don't need to know how building/deploying software works) and often is easier to outgrow.

        • singpolyma3 3 days ago |
          Access was so good. I've been trying to find something half as good for years since it died.
        • unscaled 3 days ago |
          Microsoft Access definitely took off. It was certainly more popular than the new crop of no-code/low-code platforms we have today. In the late-90s and early 2000s almost every large company seems to have had Access applications running in several different corners of the business.

          The reason Access eventually died off is that it wasn't designed as a multi-user database. You could run Access on a network file share but performance would suffer (especially with concurrent access by multiple users), and you'll be running the risk of database file corruption. Microsoft Access did support a client-only mode, where Access is used for the forms, queries and application code, but the actual data is stored in Microsoft SQL Server — but setting up and maintaining a database server was probably too complicated for the type of contexts in which Access became popular.

          The key point is that most of the usage of low-code products in the past was basically an instance of Shadow IT. In order for a Shadow IT product to be successful it generally needs to be easy to use, easy to distribute (or access) and have a capable free (or effectively free) version. Access and Excel had it all. They were easy to use for beginners (although complex applications required skill). Distribution was extremely simple in the corporate intranet age: you just had to place your Excel or Access file on a network share. They were part of Microsoft Office, so everybody had them on their computer "for free". If a product fulfills the conditions above, entrepreneurial employees will start using this product to address viable needs that your IT department lacks the resources to solve with a more robust solution.

          Often these Access apps became popular enough that it had to be officially taken by the IT department, where IT programmers invariably cursed the buggy hack of an application they had to maintain. I don't know the statistics, but I assume a great number of these would just be rewritten as a traditional client/server or web application.

          • slfnflctd 2 days ago |
            > it wasn't designed as a multi-user database. You could run Access on a network file share but performance would suffer [...] Access did support a client-only mode, where Access is used for the forms, queries and application code, but the actual data is stored in Microsoft SQL Server

            Both your comment and a sibling's mention features that Access either didn't have or didn't do well. However, there were low-code/scripting workarounds for all of these, which were in fact used in many places. It was scalable if you were just knowledgeable and persistent enough to keep chasing your goals. In addition, the backend didn't have to be SQL Server, it could just be another Access database.

            I myself created a 'sharded' Access-only implementation (admittedly a fairly simplistic one) that supported over 300 concurrent users. The trick was to keep record locking to a minimum by training users to click a 'save record' button when they were done filling out a form (which defaulted to an offline state)-- all the data was then uploaded to the central database in a few milliseconds, and the connection was immediately closed. Kind of mimicking old webforms. It worked.

            > IT programmers invariably cursed the buggy hack of an application they had to maintain

            This was really the biggest problem. Only apps designed by people who were pretty good at what they were doing avoided this.

    • rtpg 3 days ago |
      Meh, I've had successful things run just off of zapier and friends.

      Sometimes the thing really is just the thing. The real thing is plenty of low code systems are just garbage. But Salesforce is the size it is because it's a successful "low code" system.

    • aantix 3 days ago |
      You can get really far with Make.com

      It handless authentication, storing if auth tokens, can run periodic jobs without managing any infra.

      Its great.

  • paxys 3 days ago |
    This can be generalized to - whatever language and framework you are very familiar with is best for the job.
    • Spivak 3 days ago |
      I don't think this is always true, so they are saying something here. It might not be super profound but:

      > the advantage of 'low-code' is an essentially flat learning curve, if you have expertise in the field you're being asked to prototype in your strongest stack will be faster and better.

      It's at least actionable by developers who might feel tempted by these tools for a throw-away project.

  • em-bee 3 days ago |
    this story is missing the third option: use something complete and ready to run like wordpress. or reuse the CRUD backend from your previous project. the ultimate low code option is to use something that is already written.

    i am building all my sites on the same generic backend, that has all the features any website would want, object storage, user management, access control, sync and async messaging like IRC, XMPP, email..., database, various APIs, the works. for most websites i don't even have to touch the backend code anymore. it's like a database. when did you last have to make changes to your DB?

    i had one customer who had a demo of a complex app without a backend. the frontend was fully functional but no data was being saved. we were able to integrate that frontend with our reusable backend and we had the whole thing actually working in a very short time without any custom coding beides adding things to the API and adapting the frontend to use it.

  • light_triad 3 days ago |
    No code is easy to get started but difficult to customize. Code is a pain to set up but easy to modify.

    It really depends how much flexibility you need: if you have to experiment, change on the fly, possibly pivot then the initial investment is usually justified with code. If your requirements are fixed and fit within the existing functionality then a no code platform might be best (for example if you’re building an app version of an existing site that’s close to templates)

    • meiraleal 3 days ago |
      > Code is a pain to set up but easy to modify.

      How I wish this was true. Code is a joy to set up using the new shiny tech and people get promoted before the pain to modify comes bite them.

  • langsoul-com 3 days ago |
    Article is more like, low code is only good for the most simple of simple apps. And this MUST NEVER CHANGE, the second it changes, or isn't how the low code platform is designed for. Basically it's a massive and near impossible hack job.
  • ethagnawl 3 days ago |
    What is "low code"?
    • stana 3 days ago |
      Stuff like MS Power Apps. More traditionally MS Access. Basically drag and drop App builder - UI form builder, connectors to connect to public API-s and even store data.
      • ethagnawl 2 days ago |
        Thanks. Yeah, Wikipedia claims it become a term of art in 2016, so I don't feel too bad about not being familiar with it.
  • ahodgkinson 3 days ago |
    Low code initially works quite well until you hit the limits of the low-code framework. If you just need a throw-away proof of concept, or a personal utility, or the like, low-code solutions can be quite efficient.

    However, implementing anything significant that's expected to be extended and improved, particularly when there are users that request changes, improvements and new features, low-code "is like climbing a tree in order to reach the moon". You'll will very quickly run out of tree and further progress becomes almost impossible.

    To a lesser extent the same thing also occurs with web development frameworks, but the limits are less constraining and there are often mechanisms that allow you integrate your own code, that implements whatever it is that the framework doesn't provide.

    Low code, frameworks, and "build it totally from scratch", can all be a valid solutions, but the right choice often depends on a bunch of specific considerations (technology, user & quality expectations, organizational capabilities & constraints, etc.)

    My recommendation is to keep an open mind about alternative technologies and approaches, and to pick solutions that are appropriate for the environment in which they will be developed, extended and operated. And that requires experience, which you normally don't have in the early phase of your career (e.g. good judgement comes from experience, and experience comes from bad judgement)

    • brightball 3 days ago |
      One of the perks of Rails is that Ruby itself makes it more compelling.

      When you need to get to something that the framework doesn’t expose, Ruby makes it easy to get to it without having to rewrite the framework, extend a class and replace it in multiple places or fork it just to use your modification.

      This applies to the entire gem ecosystem too.

      Over the years this ability has saved me numerous headaches with only a few lines of code. IMO it’s the real super power of Ruby.

      • it_citizen 3 days ago |
        I agree. But with great powers comes great responsabilities.
      • Gigachad 3 days ago |
        Ruby is my least favorite part of Rails by far. The lack of type checking makes every single gem and rails update extremely dangerous in ways that are incredibly difficult to predict.

        For example the redis gem updated to return an int from exists() instead of a bool like it did before. This doesn’t raise any exceptions because all ints work in if statements. They just always return true. Silently breaking all of the code using it. You can read all of the change logs and search your own code base, but will constantly run in to situations where another gems code is using the method that just changed.

        As well as the fact that almost every method has one param “options” where the available options are never listed in the documentation and are impossible to find without reading the source code.

        Rails itself I quite like for being an all inclusive framework that just works out of the box, but untyped languages should be avoided at all costs these days when we have much better options like typescript.

        • lazylester 3 days ago |
          "...but will constantly run in to situations where another gems code is using the method that just changed". I've worked with Rails for 20 years and haven't seen this. Have I just been really lucky? I'm sure your test suite showed the warnings about the Redis `exists()` change for many versions prior to its actually being changed, right?
          • Gigachad 2 days ago |
            I’ve worked on rails apps for a while now and on previous jobs it wasn’t so bad, but those were smaller apps. At the current company, almost every update manages to slip something through CI that blows up on production. Even with 30,000 rspec tests and tons of cypress tests. The CI is set up to raise exceptions on warnings, but I think it only applies to warnings raised by rails.

            I guess rails works alright at the start, but eventually your app gets so big that it becomes a nightmare to verify updates before they roll out.

            • jack_riminton 2 days ago |
              30,000+ tests and it can't detect breaking changes?
              • Gigachad 2 days ago |
                In this case no because the broken code was in another gem (sidekiq) using the redis gem. Our CI does not run the unit tests for every library we import. Only our own.
                • jack_riminton a day ago |
                  Do you not have tests for your Jobs?
                  • Gigachad a day ago |
                    Yes, we do. In this case the issue was very much inside some internal logic of sidekiq around managing the jobs, not any of our own code.
        • mdji 3 days ago |
          Have you checked out sorbet?
        • oleg_antonyan 3 days ago |
        • tvink 3 days ago |
          It's wild how all the huge successful applications written in it manage to stay alive eh
        • potamic 2 days ago |
          Anyone maintaining software in the public domain needs to understand Torvald's first rule of kernel development. YOU DO NOT BREAK USERSPACE! Seriously, how hard is it to understand? The collective impact across thousands of users will always be greater than any overhead in versioning. It's equivalent to willingly shipping a bug, and you would never do that, would you? Arguments about keeping the interface simple are weak because it only helps potential new users at the expense of existing users. As users, we need to encourage such norms by not adopting or advocating for software that has a history of breaking changes. Some communities are better at this than others, and the difference in developer experience is very evident for those of us who have seen both.
          • Gigachad 2 days ago |
            The argument for changing it was that the redis gem was meant to mirror functionality of the redis api method with the same name.

            What really blows my mind though is that they did it as a minor patch release. Combined with Ruby having no type checking and allowing nonsensical stuff like if statements that always return true.

            • fabianholzer 2 days ago |
              Well, that is still no reason to introduce a breaking change in the existing interface.

              You introduce a new one, using a different signature and mark the old one as deprecated, and keep it around until as long as reasonably possible.

          • exe34 2 days ago |
            > Anyone maintaining software in the public domain needs to understand Torvald's first rule of kernel development. YOU DO NOT BREAK USERSPACE!

            That's why they offer refunds!

            • TeMPOraL 2 days ago |
              Indeed. Let's not forget the greatest invention in history of software development, unparalleled in how it improved productivity of software developers:

                THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT
                WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
                INCLUDING BUT NOT LIMITED TO THE WARRANTIES
                OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
                PURPOSE AND NONINFRINGEMENT.
        • freedomben 2 days ago |
          I appreciate the example because I've heard people complain about this but have yet seen a good example of it in practice.

          I think you make a good point, and were I maintaining redis gem I wouldn't have approved a contract break like that. Even in a typed language, changing the return type of an existing function is IMHO not something you do, especially once you hit v1.0.

          But you make a good point that a compiler in a typed language would have at least notified you at build time of the breakage. Personally I'm willing to give that up for the benefits, but I can understand why someone wouldn't.

        • speleding 2 days ago |
          I agree that it's very bad they broke the exists() behaviour in a point release by changing the return value from a boolean to an integer. But I think strong typing is not the answer. It's a drag on productivity and I can think of several other ways they could have broken the user space API that would not have been picked up by strong typing. You really need good test coverage, and ruby/rails makes that easy.

          If you have great test coverage then strong types are superflous, if strong types help you then your tests are not good enough.

          • RUnconcerned 2 days ago |
            I totally disagree. I think not having static types is a drag on productivity and maintainability. I have to work with both Kotlin and Ruby codebases, and the Ruby ones are always a nightmare whenever you need to make a change deep within the application's core, even though the Ruby one has more extensive tests.

            The idea that test coverage is a replacement for static types is nonsensical. I won't insult your intelligence and say that by great test coverage you meant testing the shape of your inputs, because only an idiot would say that would serve as a replacement for something that is done automatically by a compiler, but sometimes minor naming mistakes (like `job` instead of `jobId` when you're passing an ID and not an instance of `Job`) will make it past code review and will place a totally unnecessary mental burden on the next programmer who has to look at the code and figure out what exactly he's looking at. With static types there is no need for that, it's right there in the code.

            • speleding 2 days ago |
              Good tests do indeed not test the detailed shape of inputs and outputs, they test the system end to end. And they should be cheap to run, so you run them after every change. As soon as someone mistypes jobId the test will break and you will know where to look. If that would slip through then your tests simply aren't good enough.

              And because tests do not test the detailed shape of inputs and output it becomes easier to try out a quick refactor of your code later, without having to change a zillion signatures just to experiment a little. Agility matters.

              • RUnconcerned 2 days ago |
                I'm very fond of end-to-end system tests, with any external dependencies mocked out using something like Wiremock for HTTP calls, and containers for databases or queues. If it were up to me, I'd only have that kind of test, and some unit tests for pure functions/methods that may have finicky logic.

                You misunderstood my point about the `job`/`jobId`, though. It would be correctly typed, and wouldn't break anything. But it would not be immediately clear for a developer working on that code in the future if it was an instance of Job or the ID of a job, and there would be no type information that immediately makes that clear.

                I don't feel like the point you are making with regards to changing the signatures is true, either. If you're changing the shape of some data structure, or adding/removing parameters, then you would also have to make those changes in a dynamically typed language, it's only when you're changing the types of the parameters that you have to make a change, but that's really not that big of a deal, since your development environment should helpfully point out the places you need to update as you change them. I value code that's easy to makes changes in, but I value code that someone else can quickly pick up more.

          • maples37 2 days ago |
            I'm curious to hear why you don't like strong types, because I can't imagine not using types.

            My day job involves working on a PHP app that's been around since the 5.x days. So it's a mixture of "new code" which has typehints everywhere (PHP nomenclature for runtime type-checking, but static analyzers can also read the signatures and alert you before runtime, which is the real benefit IMO) and "old code" where everything is an array, but to figure out what's in the array you've been passed, you have to look at the 3 functions that call the function you're looking at, and even then sometimes you have to back up 2 or 3 steps up the stack to find where the array is created, and even then you're not 100% sure if that `userEmail` member is present all the time or only in certain circumstances.

            With strong types, we pass a UserModel object, and everyone immediately knows what they can and cannot do with it.

            I remember in college trying to write some Selenium scripts in Python to do some scraping, and my biggest frustration was not being able to identify the return type of anything. The language wouldn't tell me, the built-in python IDE (IDLE?) wouldn't tell me, so the best I could come up with was something like `print(typeof(x))` (or maybe it was a function to print the properties/methods? it's been a while, I forget) every time I called a new function and running the tool, which was a painful experience to say the least. A few months later I ended up doing something similar but in C# and the difference in productivity was night-and-day.

            • speleding 2 days ago |
              In rails or elsewhere in our code base, if I'm ever unsure what a function does or what it returns then I just jump to the function definition and read it, a single key stroke in my IDE.

              Now I need to fix a small bug in a library. Rather than wait for the library to be fixed I can monkey patch the fix into the library until it's fixed upstream. Trying to do that with a strongly typed language, you typically need to jump through all kind of hoops or end up fixing the problem outside your library or put some shim in between the broken library and your code. And then once the fixed library comes out you need to undo the code fixes on your side rather than just delete the monkey patch.

              Sure I understand the benefits you list, but for me the effort put into strong typing, typing the stuff, changing it each time, just doesn't seem a worthwhile trade off because it's very rare for me to encounter a problem caused by a wrong type. Perhaps I would feel differently if I had to work on a poor code base with many people, but I don't.

        • cies 2 days ago |
          > The lack of type checking makes every single gem and rails update extremely dangerous in ways that are incredibly difficult to predict.

          This. I found a typed-Ruby in Kotlin (OO-core with lots of FP niceties; code even looks similar to Ruby in many cases as type inference it quite good).

          Kotlin + http4k (analog to Rack+Sinatra) + JTE's KTE (or kotlinx.html) + SqlDelight (or jOOQ; fuck ORMs anyway: also ActiveRecord) is a dream to work with.

          I'm not sold on TypeScript. Yes it helps but it allows for very messy code.

        • brightball 2 days ago |
          The type checking argument comes up in every language discussion and IMO it’s not worth it. Some people love static typing and swear by it as you clearly do here. Others do not find static typing helpful and manage to do well in environments without it.

          Your critique here isn’t even a critique of Ruby in these use cases, it’s a critique of any dynamically typed language.

          The Ruby functionality I mentioned could easily bail you out in this situation by allowing you to monkey patch the redis gem to restore the old functionality until you were ready to get around to fixing it in your codebase or until you determined that the other dependent gems had been updated.

          If anything, this is a great example of exactly my point about the flexibility of Ruby.

    • ksec 3 days ago |
      >Low code initially works quite well until you hit the limits of the low-code framework.

      I wrote this a while ago. May be the future is a No Code tool with AI that generate enough of an App to allow Low Code edit with the help of AI while the whole App itself is still a full Ruby Rails App that allow Real Code modification in the future by professionals.

    • devjab 2 days ago |
      I’ve spend a few decades in non-tech enterprise including 7 years in the public sector, and I’ve never seen a low-code solution work at all. Even extremely simple automation flows require at least some degree of software engineering. Looping isn’t intuitive at all, he’ll even conditions aren’t.

      What has completely changed the field is LLMs. We now have employees of every sort building small Python scripts which actually work. Even installing Python and getting it up and running is something the LLMs help with. Obviously almost all of it is terrible, and none of scale, but for 90% it, it never has to run outside the personal computers of the employees who write it. Now the challenge becomes keeping the knowledge (and scripts) when employees change jobs. Though to be fair, the knowledge bit was always a challenge.

      • qsort 2 days ago |
        The second coming of Excel, basically.
        • Tarks 2 days ago |
          Shhhhhhhh.

          Do you have any idea how much I made in Fintech converting spreadsheets that'd exceeded the TA's ability to hack/keep it all in their head and/or quit?

          Favourite included a single cell that had, I am not kidding, something like 150+ nested if statements.. and there was a dateTime bug in it somewhere :D

          A friend did very well positioning himself as a data engineering consultant that could come in and quickly improve poorly thrown together data pipelines, wonder what the equivalent is for these :)

          • amichal 2 days ago |
            Wasn't fintech but was fin something. Several weeks into trying to port a Excel workbook with a zillion tabs, some VBscript from stackoverflow and other nastiness and being unable to replicate the results. I discovered the "consultant" who help them create this insane thing had turned on the "allow circular references"[1] option and choosen a number of iterations that "Seemed to make it work"

            Yay! for non-deterministic financial modeling.

            Also was really fun trying to explain to the folks who hired me why I couldnt get the results they wanted to see.

            [1] https://support.microsoft.com/en-us/office/remove-or-allow-a...

            • Tarks a day ago |
              ha wow, read about a guy having to clean up after some data scientists that'd figured out how to use circular references and an iteration limit to do crazy, hard to replicate stuff, (thankfully) never ran into it myself but I bet that was a 'fun' time for you !

              Here's to hoping we both never have to dip back into that world again :D

      • egeozcan 2 days ago |
        Those scripts work, until they don't and the people who generated them cannot even ask the right questions to an LLM, and people who can actually maintain them get overwhelmed by the side-quests of keeping them in order, because everything that gets some use become a dependency for the business.
        • cpursley 2 days ago |
          So we're not losing our jobs?
          • egeozcan 2 days ago |
            Only time can tell.
          • jeltz 2 days ago |
            Maybe long term we will lose our jobs but medium term there will be huge demand for people who can clean up the mess which was created by people who used AI to generate code without understanding what they did.
            • rob74 2 days ago |
              The only question is: does anyone want to do that job (and I doubt that the "maintenance" job will be better paid than the job for originally writing the code)?
              • jeltz 2 days ago |
                I think it will be well paid but not fun at all. I have done similar work and at least cleaning up after bad human developers is often well paid. But time will tell.
                • lelanthran 2 days ago |
                  > at least cleaning up after bad human developers is often well paid.

                  I wish!

                  "This was written by Bob, who's a certified genius. Unfortunately Bob left us to go backpacking across Chile. Can you make just this one tiny change for us?

                  ...

                  What do you mean, billing for a full day? Bob used to be able to dive right in and make changes like this in 5m!"

                  • GreenWatermelon a day ago |
                    Sigh... This os exactly the curse...

                    Bad coders leave managers with wrong expectations and saddle us with their smoldering piles of garbage and now we have to convince Mr. Manager why we it's impossible to match Mr. Monkey's pace.

                    We are literally stuck paying off someone else's debt, and it's soul crushing, because you know Mr. Manager won't understand anything technical, and the true culprit, Mr. Code Monkey is already long gone, and we are the sucker holding the bag, getting blamed for late features and slow delivery.

                    The life lesson I learned is: don't pickup someone else's code, you'll assume all liability.

        • the_duke 2 days ago |
          The solution is obvious of course: just train an LLM that is intimitely familiar with the product and integrate it directly!

          ...

      • dagw 2 days ago |
        I’ve never seen a low-code solution work at all.

        I've worked quite a bit in civil engineering and GIS, and most places I've worked at have made very good use of a 'low-code' tool called FME for automation and ETL tasks. I even reach for it myself for many tasks, even when I am fully capable of doing exactly the same task using for example Python. For the right tasks it is simply the most productive solution.

        That being said even with these tools you still need to know how to 'program', at least conceptually, and it's not like just anybody can pick up a tool like this and be productive. The basic concepts of control flow and algorithms still apply and work the same way.

        • devoutsalsa 2 days ago |
          I've never heard of FME before, but I don't do any GIS work. Are you referring to this?

          https://www.tensing.com/en/software/fme

          Tensing looks like they specialize in GIS.

          • dagw 2 days ago |
            Right software, wrong company. Tensing appears to be a FME reseller and consultant. https://www.safe.com is the company that makes FME. While they started in the GIS world, and this is very much where their roots and core user base is, they've expanded greatly over the past few years into becoming a more general automation, data processing and ETL tool.
            • devoutsalsa 2 days ago |
              Ah, cool. Thanks. This must be for serious industry w/ deep pockets. There's not even a sign up link for individuals.
              • dagw 2 days ago |
                Yea, sadly they've gone full enterprise over the past few years. Once upon a time they were a small scrappy software company with both a price list and order form right on their website as well as a free Home license which let you use FME for 'play' and training at home. Now it's all "cloud hosted", "contact our sales team" and "dynamic subscription prices, tailored to your needs". Still it's a fantastic pieces of software once you manage to buy it.

                For what it's worth I seem to recall base licenses started at roughly $3500 per user for the desktop version of their software last time they had a price list.

      • Angostura 2 days ago |
        I currently work in the public sector in the UK and my experience is different. I see quite a lot of PowerAutomate going on to automate tasks and to create simple SharePoint apps.
        • devjab 2 days ago |
          It’s been some years since I left the public service, PowerAutomate didn’t really exist back then. It may be an exception to what I said, I do know my current organisation had a few of those Apps running. I wasn’t much involved in the process, but they were basically discovered because of their cost and later shut down. Since I know basically nothing about this process, the PowerApps would have been made by non-developers since I know all the developers in house. I’ll assume they also must have worked.
      • SOLAR_FIELDS 2 days ago |
        The best low code solutions I’ve seen from the end user perspective are ones that create sane looking skeleton code for you and have an eject button for when you hit the boundaries of what the tool is capable of. The eject button is a one off operation that switches the low code solution to a traditional code based solution, and is irreversible. Bootstrapping and prototyping quickly is a great use case for low code tools in the phase where long term code maintenance is not really important.

        Such a model is not easily monetized which is why you don’t often see this model in the wild. Draftbit is one company I’ve seen that uses this model: https://draftbit.com/pricing. Note I am not affiliated and have not used the software just find it interesting to see this model actually out in the wild.

    • jstummbillig 2 days ago |
      Low code tools are fantastic for people with unambitious software goals (not to be confused with unambitious company goals). A lot of burden is lifted off of the tool builder, simply, because there is so much stuff that has been decided for you and therefore a lot of things you can not do.

      But you have to really accept this limitation as a feature, just like you need to accept that inventing pieces or moves is not an option when you get frustrated during a match of chess. As soon as you fall into the coder mindset of "If only I could go one level down", you immediately switch into having 0 upside while having all of the downside. You fight the tool and then there's a ton of things that would in fact be simpler if you just wrote it starting from the correct level.

      I would argue, just as with coding, this is mostly a matter of discipline. Having boundaries is part of the real world problem solving. Being able to work within them is a skill.

    • cies 2 days ago |
      > Low code initially works quite well until you hit the limits of the low-code framework. If you just need a throw-away proof of concept, or a personal utility, or the like, low-code solutions can be quite efficient.

      The same I'd say for dynamically typed languages (and their frameworks like Rails): initially works quite well until you hit the limits.

      Once your app is big and there is a team, the efficiency dwindles. Refactoring becomes really hard. Unit test for the rescue, but they also take time to write.

      • dustingetz 2 days ago |
        at some point we need to take a step back and acknowledge that programming is not solved, no kind of language works particularly well at scale. Companies have been buying their way out by growing revenue/cash more quickly than tech debt, and those that fail to do that, stagnate and die.
  • shallichange 3 days ago |
    Bring back 4GLs like Clipper / dBase etc
  • djaouen 3 days ago |
    Or, you could use Elixir/Phoenix, which has Flame. *hint hint*
    • andruby 2 days ago |
      I've done a lot in Rails and a bit in Elixir/Phoenix. I haven't dipped my toes into Flame yet, although I did like the presentation.

      Have you used or seen it used successfully?

      Just to learn from, not to knock it down.

      • djaouen 2 days ago |
        I haven't personally used Flame, but I have extensively used Elixir and Phoenix and contend that, even without Flame, they compete well with so-called "No Code" solutions (like the article contends with Ruby/RoR).
  • throwaway42668 3 days ago |
    I never understood the "low code" microbubble that was being inflated.

    We went through that era already. We called them RAD tools, and they targeted the same sort of strange, mythical end user profile. Someone so technically capable and apt that they could navigate a dizzying domain of deeply buried checkboxes, property fields, and sprawling relationships & side-effects, but who was also simultaneously unable to understand source code or program structure.

    When using them you would quickly hit a point where making changes to relatively simple things would take mounting an archeological dig of GUI controls that would have otherwise been a few simple find & replace operations on code in a regular environment.

    • gonzo41 3 days ago |
      Everything you just said also applies to all ETL and workflow management tools as well. There's a level of complexity that's never going away.
      • stoat_meniscus 3 days ago |
        Yes, Informatica was the one that came to mind.

        We inherited some Informatica ETL workflows once at work. Nice at first glance with good logging, but peel back the surface a little bit and it was a dizzying level of hidden complexity. Some of this was business logic which was inherently complex, but it was so deeply buried in menus and abstractions with no easy diffing or version control...

        Like the comment starter mentioned - who are these tools designed for?

        • disgruntledphd2 2 days ago |
          They're designed for purchasing departments and VPs, unfortunately.
    • jayd16 3 days ago |
      Low code tooling is alive and well in the entertainment industry. Node graphs are becoming very popular in game engines, shaders, procedural modeling software etc.

      The king of low-code, spreadsheets, are still quite popular as well.

    • quantadev 3 days ago |
      Well said. You are exactly right. Low Code stuff is usually invented by people with a specific set of criteria that they realize can be generalized, and defined by a GUI, but who lack enough experience to realize the entire world of possibilities can't be crammed into their model. Languages (like Python, etc) are already the most compact way to represent most things, and trying to avoid that fact just makes things even harder.
      • jayd16 3 days ago |
        You're letting perfect be the enemy of good. The low code solutions can simply have a full-code escape hatch with interop. Much like how Python can interop with C.
        • quantadev 2 days ago |
          Oh, I definitely agree that's what should be done. You'd have generated code and non-generated code that way.
        • HelloNurse 2 days ago |
          But people who lack enough experience to realize the entire world of possibilities that can't be crammed into their model aren't normally humble enough to design good escape hatches.
    • ajcp 3 days ago |
      I think you're taking the intent of "low-code" too literal, or have not worked in an organization of sufficient size for its value proposition to be evident. It's not to solve a solutioning problem; it's to solve an organizational one.

      While any "low-code" is marketed as a WYSWG, business friendly solution platform, what it actually is is a way for the business to get access to capabilities IT otherwise gatekeeps as "domain expertise", but fails to actually produce with.

      Case-and-point: IT quotes an organization $75 million for 30 projects in fiscal year 20nn. By 20nn+1 IT has completed 5 projects for $75 million. Sick. Org gets "low-code" on their own dime for $1 million, hires a couple "business systems analyst" for a little less, and in 20nn+1.5 has completed 25 projects. In 20nn+3 IT looks incompetent, gets pissed, cries foul, the "business systems analyst" are ingested into IT and taught Java and CRUD circa 1998, and the life-cycle continues.

      • gardenhedge 3 days ago |
        From your first sentence it is implied you have some working experience with this. What are your thoughts on end user computing and the longer term effect in the business?
        • matwood 3 days ago |
          One of my very first jobs was taking tools that were developed at the team/dept level and scaling them up org wide if they were useful. Honestly it was great to have end users already deeply thinking about what’s needed by building prototypes themselves. This business was much better for it. Looking back I was very fortunate to land in a large business who embraced technology as a key differentiator very early on.
      • urban_winter 2 days ago |
        My experience of apps built by "the business" is 13 years in UBS and Bank of America. "The business" cannot be trusted to understand regulatory and privacy concerns, they cannot test their apps, they do not concern themselves with vulnerabilites in their dependencies or the licence terms therof. For those reasons, and more, the ability for the business to deliver apps more cheaply than IT is illusory.

        That doesn't stop a cyclical swing towards RAD/no-code/AI when people forget this and then a swing back when we remember.

      • Closi 2 days ago |
        100% this! In some companies the 'simple app' that is described in this post will get some ridiculous quote from central IT/tech ('it will take our team 4 sprints') and then never get signed off. IT will also ban anyone spinning up their own servers due to support issues.

        No code platforms manage to get around this.

        Another use case - I work for a 'non-tech' consultancy. Clients typically won't like paying us to spin up some flask/django/rails app, but are happy to pay us to spin up some sort of no-code thing for them (perception is that it will be easier to self-support, which is also probably the reality compared to me developing some sort of rails app and then leaving the company).

        • aitchnyu 2 days ago |
          I saw the powers that be sit on requests for access for readonly BI tools on existing DBs. How do the low code vendors get VIP treatment?
          • Closi 2 days ago |
            In my experience you are right - IT will always deny these requests, so you need to build the solutions in a way that avoids accessing existing DBs.

            Usually it’s replacing a spreadsheet, so either the information can be manually keyed in or can be imported from various reports. Sometimes you even get into screen scraping, sometimes scheduled reports that are getting dumped to a drive and getting imported… basically any way that avoids needing to get permission from the IT team.

      • jordanbeiber 2 days ago |
        Writing the code is NOT the problem with these enterprise project failures.

        Usually decades of problem-solving have led to an absolute mess of blurry ownership and accountability.

        This in turn leads to corner cutting and a road completely covered in Chesterton fences…

        Tearing arbitrary fence down leads to consequences out of project scope, no one can answer questions, and no one can prioritize - this is a business problem, and no amount of fancy code (lo/hi/full/lo/left or right) will help.

        If you run a bigger company and rely on IT and ERP flows, well, it’s a part of your core and you’d better treat it as such!

      • ivell 2 days ago |
        I have heard this before. But before we assume incompetence, first we need to understand what the IT is producing. Anyone in IT can also build the application in a very short time. What the business do not fully understand is the effort required to implement all the other non-functional requirements they need but they don't know yet. Once the quick and dirty solution is done, and they are happy that the feature are done, they realize it is not compliant. Now they spent some effort for compliance and after that they realize that there is no backup. If the data is corrupted, all is lost. So then they call up their business analyst to implement that. And after a few such iterations they give up and hand it over to IT. Now IT has a shitty application that is not secure, partially compliant and terrible disaster recovery. So it has to be rebuilt. Now it costs much more than if IT had implemented it in the beginning.

        The costs of the IT department exists because we have experience on the real costs of implementing production grade software.

        For minor throwaway apps, there is always excel and MS access.

    • anonzzzies 3 days ago |
      RAD is a broadly used term, but tools like Delphi were good at it and not restricted. You could build anything, but the dream of dragging and dropping little boxes and filling properties to build applications with the client and having, possibly another team, building other little boxes to satisfy the features you couldn't deliver, was a successful way of doing things.

      I would say especially in modern day guy in some cases: I have not seen anyone happy changing modern code (nextjs or so) that has not been touched for 5 years. The 'just drop in a new component' won't work because 9 billion dependencies had updates and break everything (seems modern devs in the npm ecosystem have serious issues keeping things compatible even across minor versions); that issue was never there with delphi; you just make the change; either in code or gui. Many components I used for 2 decades to create and fix applications without the pain I feel these days. Unlike others apparently, I have no interest in actually maintaining applications: I want to make them and if no changes are needed, I don't want to update them; security fixes are meant to be compatible with what there already is, so that's just a recompile. It's not anymore though so it causes work and work costs money. It's not very nice unless you get paid by the hours then it's brilliant.

      Commenting on your general use of rad tools, the rest you say i agree with. I see (i googled a bit) that things like Outsystems are RAD tools now, and yes, those are hell on earth to work with (we did a massive project with it and everyone basically thought it was terrible).

      • creesch 3 days ago |
        Oh man, I totally forgot about the delphi IDE and the drag and drop editor for making GUIs. I only ever did encounter it in college (early 2000s) and for group projects it was really nice. Simply because it allowed you to prototype GUIs in the IDE and then instead of having to re-implement them in your markup language simply use those prototypes to build the functionality behind it.

        https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2...

        It's a bit of a different perspective as you describe.

        > I have not seen anyone happy changing modern code (nextjs or so) that has not been touched for 5 years.

        Yeah... even if you do faithfully update dependencies it isn't straightforward. The sort of stuff I work on is mostly used internally and overall is fairly simple as far as the UI goes. So, for a while now, I have done away with most dependencies where I can and switched to vanilla JS, HTML and CSS for this sort of tooling. Not only does this help me with future maintaining of these tools, it also makes the whole development process a lot smoother as there is no building involved.

        I very much realize that I am in a somewhat luxury position here as I don't do client facing applications and most of them are fairly simple. But that's also my point, all too often I see very simple single purpose applications that make use of a complete ecosystem of modern frameworks where the same can easily be achieved without them.

      • rob74 2 days ago |
        Then again, I wouldn't say Delphi was (is?) "low code". Certainly easier to use than some of the alternatives available for building GUI applications at the time (looking at you "Visual" C++!), but that just took care of the boilerplate, you still had to code the application's business logic.
        • anonzzzies 2 days ago |
          Yes, I agree, but they were talking about RAD tools and Delphi was the posterchild for RAD tools. I was solely responding to the term RAD tools (and their abuse/misuse).
    • matwood 3 days ago |
      I don’t think they were strange or mythical users. Excels and Access gave business analysts enough power to make real tools tailored to specific needs. VB would have been the next step. One thing that made this possible was the ubiquity of Windows though.

      I still haven’t used anything as easy and powerful as those tools were even if they were Windows only and lacked easy distribution.

    • ozim 3 days ago |
      I see it quite often as SaaS platform I work for the configuration grew into small time low code because business wanted to do all kinds of changes skipping dev cycle to deliver faster.

      „low code” appeals to people - who are not technically capable, whose numbers are big - who think if they can get rid of this complex writing stuff they will be able to do stuff. Those people are on all levels of seniority so if CEO mandates stuff, company will do that.

      Unfortunately essential complexity of an application does not go away and I have seen those people struggling, cursing and shooting themselves in the foot.

      proper software dev tooling has all the right solutions for handling complexity like version control, CI/CD, unit/integration testing - no low code tools implement that.

      But if people hear my solution „let’s teach you proper dev tools” they are pretty much uninterested.

    • siva7 2 days ago |
      RAD tools had nothing to do with low-code. I think you're confusing something. You still needed seasoned software developers and you weren't restricted by anything.
    • jillesvangurp 2 days ago |
      Low code efforts go back decades. In the eighties there was this whole movement around 4GL languages. Basically relatively simple languages around databases that enabled relatively quick development of business applications. Before that, Cobol of course was an attempt to come up with a business programming language that was nominally human readable. In the nineties we got things like Visual Basic, Delphi and a bunch of other things which again were targeting relatively inexperienced programmers. And then of course there's a long history of creating domain specific languages for all sorts of things - typically with the goal to let domain experts be able to define things. Tcl/TK is a good example for UI applications on X-windows.

      Rails built on all of that. Ruby brought two useful thing to the table (well, borrowed from Lisp) which was meta programming and the ability to use its syntax to build so-called internal DSLs: domain specific languages which were just building on top of Ruby's own syntax instead of needing a new one. Rails is basically a DSL for building web based database applications with server side model view controller style UIs.

      Once MVC moved mostly client side with single page javascript applications and rich mobile applications, the MVC bits and bobs became somewhat redundant. And of course the rest of it is basically a nice but otherwise unremarkable ORM framework that you can find for other languages as well. I was never that impressed with it to be honest and I'm not a big fan or ORM frameworks in general. Server side MVC is still somewhat relevant if you are into server side rendering (which reinvents what world + dog was doing twenty years ago) but otherwise not that relevant for most REST APIs.

      IMHO the last two decades have been a bit unremarkable for UI development. It seems a lot of things plateaued in the nineties. The average UI projects are still fairly labor intensive for what they do; which is mostly just building a lot of form based crap to input data in some database. We had perfectly usable and relatively idiot proof visual UI builders that did that sort of thing thirty years ago. From a functional point of view, the resulting UIs more or less did the same thing. Was that great code, not necessarily. But it did the job. And most "modern" react/rails/django/whatever code isn't a whole lot better. If you discard the lipstick on a pig that is CSS, you are left with essentially the same UI components and primitives (buttons, checkboxes, text fields, etc.). We had all of those decades ago. You don't need a mustache twirling hipster web ninja to reinvent those wheels.

    • rsynnott 2 days ago |
      It's particularly baffling because there's currently a _competitive_ "do programming without doing programming" bubble; LLMs. Whatever about one at a time, it's odd to have two approaches to the same false promise going at once.
  • th0ma5 3 days ago |
    The comments here are great and show that even if LLMs seem to provide an ability to need to code less, we actually can't stand that for me reasons either.
    • quantadev 3 days ago |
      The problem with LLM-generated code is you can't trust it. It might be fun for games and non-mission critical stuff, and I agree it's coding sills (Claude namely) are amazing, but it often totally misses edge cases, or creates stuff that seems to work, until you scrutinize it and find tons of bugs.

      The qualify of software worldwide is about to begin to plummet as developers get lazy and start trusting AI generated code. That's super dangerous. Never trust it.

  • est 3 days ago |
    I once joked that PHP was the best serverless language/platform

    https://news.ycombinator.com/item?id=41358020#41364190

  • dzonga 3 days ago |
    people like to shit on document databases - but man oh man - the expressivity you get working with document databases combined with Ruby is unmatched. I know someone is gonna reply all you need is postgres - but yeah jsonb queries don't match mongo queries. & after all - most of the places I have worked the database writes / queries hit one or two tables and work loads got migrated to dynamodb. that includes socia media ingestion, iot streams and metasearch.

    yeah if you need kimball style queries i.e olap then yeah use postgres with rails etc

    • anonzzzies 3 days ago |
      People like to shit on mongo not so much on others as far as I have seen. They were bitten by it I guess.

      I guess they are harder to grok after the initial ease of use: performance is harder to reason about; things can suddenly grind to a halt even though you 'didn't do anything different' etc.

  • hks0 2 days ago |
    Low code starts failing when one expects it to go turing complete. I also experienced the reverse (unfortunately) a couple of times until I gave up: Can we teach basic python to non-programmers in a 1-week workshop, so they can automate boring tasks without needing the developers? Answer: No.

    And once I switched from trying to teach python, to just using click-clicky through Zapier or alike, people started to be way more productive without having to deal with us pesky programmers directly. Zapier does have big limitations, but people got creative on how to overcome them. Python would've consumed all their mental energy leaving no room for this. And they did create some hard to maintain horror in the UI, yet it had lower cost thanks to people's self sufficiency.

    The article's conclusion says:

    > Also, if you’re not a programmer, then absolutely, low code is great. But if you’re reading this article, you’re probably a programmer. So, why are you even thinking about it?

    And I would like to add: If you _are_ a programmer, then absolutely, coding is great. But otherwise, why are you even thinking about it?

  • andrewstuart 2 days ago |
    Rails is no different to any other modern programming language.

    It’s no more productive. I don’t know why people treat it like it’s more productive than other things.

    • jstummbillig 2 days ago |
      For starters, it's not a programming language, but assuming you are aware: The completeness of Rails still not that common (for example, NextJS needs a lot of additional packages for stuff that integrated in Rails).

      Curiously, what makes Rails more interesting to me right now are LLMs: Rails is so stable that you can trust the models to know about (most) features, which makes ai assisted development so much more effective.

    • vundercind 2 days ago |
      Why was it ever popular? It promoted a productive code organizational pattern, basic hygiene like migrations that were absent in a lot of web dev at the time, had a very productive non-totally-dogshit ORM, and some good deployment tools for the pre-container (and, hell, pre-popularization-of-IAC) era developed alongside it.

      It’s mostly the ecosystem making it popular these days. Same reason Python’s a juggernaut in several spaces—the ecosystem, not the language or tools (or, in Rails’ case, framework). You can slap a few gems together and have a site with all the basics (user accounts, admin, OAuth, file uploads, user roles, et c) in minutes. The gems are widely-used enough that they support most things you might need for whatever-they-do, and you probably won’t run into some feature that you really need but has been broken for two years and nobody realized it because nobody’s using that feature.

      (For the record, I’ve sworn off rails after seeing so many codebases that were total dumpster fires that I decided it attracts too many budget-minded-to-a-fault companies and owners for me to want to work with it again, plus I fucking hate ungreppable magical defined-nowhere metaprogramming symbols and magical imports that leave one unable to figure out WTF is happening without running the code, but I can see why it’s popular)

  • phartenfeller 2 days ago |
    Even though it is Oracle, Oracle APEX is exceptional at creating CRUD applications. The main benefit to other low code tools is that it doesn't want eliminate code but just the repetitive UI code. It still expects you to have skills in database development so you can achieve everything but generating a Report, Grid or Form from a SQL query takes as long as you need to write the query. And everything is customizable and maintainable in the end.
    • KronisLV 2 days ago |
      > It still expects you to have skills in database development so you can achieve everything but generating a Report, Grid or Form from a SQL query takes as long as you need to write the query. And everything is customizable and maintainable in the end.

      Isn't this what people thought about Oracle Forms before it going the way it did?

      • phartenfeller 2 days ago |
        Yes, it similarly just builds around developers storing the code in the database layer. Forms is still around, with some giant companies relying on it, but of course, it is slowly dying. APEX is also 20 years old already, but based on the web stack. This choice aged perfectly, so it went from a niche inside Oracle to now the default application framework inside Oracle around 2020. Oracle Forums[0] is build on APEX for example.

        [0]https://forums.oracle.com/ords/r/apexds/community/home

        • quotemstr 2 days ago |
          Is it me, or is that forum site very slow?
    • bigfatkitten 2 days ago |
      A former employer of mine banned Microsoft Access, because they didn't want critical business functions running from random desktop machines. I imagine they'd take the same view today to home made LLM-generated Rails apps.

      They instead said "if you need to write your own little CRUD apps, use our APEX instance that we support and have backups for."

      • phartenfeller 2 days ago |
        > imagine they'd take the same view today to home made LLM-generated Rails apps.

        Sounds like an effective solution. Even though some people might build a great application, but someday they might leave, and nobody knows how to administer this.

        You can still write bad PL/SQL code, but at least everything is centralized and stored in a single database where you have an admin making sure that everything is fine. For other developers, it is straightforward to make small changes because 95% of the complexity just lies in the data model and the database code. You don't need to adapt to a specific infrastructure, frameworks and other dependencies, etc.

    • forinti 2 days ago |
      Apex is nice, but it becomes hard to maintain larger applications.

      It also makes it so easy to create opportunities for SQL injection if you don't have careful coders. And it is also a great target for DoS attacks.

      Having said all this, it really is the only low code platform I would ever consider using, in spite of it being Oracle's.

      • phartenfeller 2 days ago |
        > It also makes it so easy to create opportunities for SQL injection if you don't have careful coders.

        This is not the case. If you bind values with :ITEM_NAME and use compiled statements (never dynamic string concatenated ones with "execute immediate') there is no chance of SQL injection.

        • forinti 2 days ago |
          You can set items from the URL, which you usually can't do with most web frameworks. Of course you can enable Session State Protection, but you have to be vigilant.

          You can also inadvertently leave a page public.

  • brap 2 days ago |
    Was there ever a Node/TS alternative to Rails?
    • sandruso 2 days ago |
      There are maybe some but not as popular as Rails. I think everybody in node/js community advocated to build your own stack with libraries and write glue code yourself.
    • miohtama 2 days ago |
      Many, but not yet as successful as Rails.
    • gherkinnn 2 days ago |
      https://adonisjs.com/

      Adonis.js is just that. I have never used it beyond a quick test though so I can't say what it is like in production.

  • iforgotpassword 2 days ago |
    This post boils down to "it's easier to use something you know in and out that some new tool you're using for the first time.", so not a good argument. I think I've seen ruby code a handful of times in my life and it looks like an obfuscated form of perl to me. If you'd give me a low code tool and ruby and the same task I don't think I'll succeed with either in a reasonable amount of time.

    (Not that I'm a fan of low code or anything.)

    • weatherlite 2 days ago |
      You can use an LLM and get quite far with Rails imo if you've been programming in a web framework of any kind. You don't have to know Ruby. Probably same goes for the low code tool, only there once you're stuck its probably because you've hit the limits of the tool.
  • maximus93 2 days ago |
    Low code tools can indeed be effective for simple use cases or prototyping, but their limitations often surface when scaling or customizing is needed. As others have pointed out, a framework like Rails offers the flexibility to expand and adapt while maintaining structure.

    Building the Multiwoven product based on Rails has been incredibly helpful in balancing rapid development with the ability to scale and customize as user demands evolve. It provides a structured yet flexible foundation, allowing us to adapt quickly without compromising on quality.

    It’s about knowing when to leverage low code for speed and when to transition to more robust solutions for long-term scalability.

  • twen_ty 2 days ago |
    What is low code anyway in 2024?

    For example, is AWS Amplify or Firebase low code?

    • jve 2 days ago |
      Power Apps https://www.microsoft.com/en-us/power-platform/products/powe...

      Uses excel and excel like formulas for stuff. Not bad for power users that can/want hack their app together.

      • niam 2 days ago |
        PowerApps would not catch me endorsing it for anything beyond a year of use, however. Either a replacement needs to be on its way, or it's for a project with a defined end date.

        Otherwise, "there's nothing more permanent than a temporary solution".

        • jve 2 days ago |
          I see low code tools are suitable for power users (citizen developer) and less for programmers (pro developer).

          Like a farmer hacking together some stuff for their needs instead of waiting for official solution.

          Power users automate their way to gain efficiency when programmers are busy doing their stuff.

    • Sammi 2 days ago |
      Also, is a headless CMS low code?
    • user432678 2 days ago |
      Some managers at my current consultancy job think that ChatGPT is a low code solution worth selling to the customers as a service. I wonder if it’s a 4d chess approach to sell traditional programmers once clients realise that ChatGPT slop of code now needs way more than LLM-powered developers to maintain it.
  • jokethrowaway 2 days ago |
    No Code > Low Code > Large framework that does everything > Small framework > Library > No library

    Every item is faster to implement and less configurable than the next one.

    Until the set of features you need to implement fit your current choosen setup, you're good. If you need to dig deeper, you'll be in pain.

    You may get some relief with some hooks.

    I've experienced my fair share of pain with RoR, it's definitely not a magic bullet.

    I was amazed at things like Rails Admin a decade ago but overall it does way too much for what I typically need.My sweet spot is a low level server, eg. node.js + express (actually, rust + axum these days).

  • Sammi 2 days ago |
    There's a solution between low code and rails like frameworks, which is headless cms. You get most of the backend infrastructure pre-packaged, but you still get to customize the data model and data flow.
  • glutamate 2 days ago |
    If you are asking "well we could build this in 2 hours with low-code or 8 hours with rails" - then you are not the target market for low-code. To be able to build a rails app in one day takes years of skill and education and maturity. A lot of people or organisations want to build apps but don't have that expertise.

    Also, I don't see what is wrong with the outcome that at some point you have to rebuild with code. You have spent not very much time to develop a prototype that was able to get some feedback and come up with new ideas. Maybe that very revolutionary idea about the reservations app the author describes would never have imagined if they didn't have a prototype to play with?

    And don't even get me started on the risks of traditional software engineering. How many projects never even got to a viable prototype because devs decided to rewrite everything in flavour-of-the-month every 3 weeks?

    • glutamate 2 days ago |
      Although i have to say i always found the concept of low-code silly. All code should be low code, and i think rails is actually a very good example of that.
    • bryanrasmussen 2 days ago |
      > How many projects never even got to a viable prototype because devs decided to rewrite everything in flavour-of-the-month every 3 week

      this part sounds pretty fanciful, my experience is at the worst six months for new library in your chosen language, and that you can generally talk them out of; 1-2 years rewrite fever in some is almost overwhelming.

      on edit: in short I think even the least self-aware dev is not going to do rewrite cool new tech every 3 week, maybe once but not twice. So sounds a bit hyperbolical.

      • glutamate 2 days ago |
        I admit it was an exaggeration for comic relief, but many projects have definitely not gotten to working prototype because devs wanted to use something fancy
    • another-dave 2 days ago |
      > If you are asking "well we could build this in 2 hours with low-code or 8 hours with rails" - then you are not the target market for low-code. To be able to build a rails app in one day takes years of skill and education and maturity. A lot of people or organisations want to build apps but don't have that expertise.

      Exactly, low/no code solutions have their limitations, but I think the space they're useful for is — "they" need a simple CRUD app so they build it themselves in No Code solution, figure out what they really want & what the pain points are and _then_ bring on board a developer if it needs expansion, but with a real todo list in front of them.

      Or (just as useful to the business user), realise it's not what they need and bin the project before engaging a dev at all.

    • jack_riminton 2 days ago |
      Well that's the point of the article isn't it, Rails hasn't been the flavour-of-the-month in about 15 years, it's boringly good, so that's why you should stick with it
  • rsynnott 2 days ago |
    ... Wait, are 'low-code' things a _thing_, again? Thought those died out in the noughties.
  • mkl95 2 days ago |
    Rails / Django / etc. are already low code in the eyes of a Go / Rust / etc. developer. No need to stretch the concept, really.
  • indymike 2 days ago |
    Great software works well when it enables people to do things they could not before. Low code works well when the use case is isolated to something where you can focus on simplifying or putting training wheels on writing logic or configurations. When things get complex you end up with what amounts to Xcode or Visual Studio - something that clearly does help professional go faster.

    When you try to replace an entire language and multiple libraries with visual editor, you end up with something really complex, and often beyond your user's abilities to learn with the limited time/attention they have.

  • october8140 2 days ago |
    I have experienced this just in the last year. Thank you for validating my feelings.
  • aenis 2 days ago |
    Most existing front-end frameworks are already low-code by any standards, I'd say.

    Most backend, integrations, automations require some degree of business logic, which requires algorithmic thinking, and this in turns requires engineers - there aren't many people who 'think algorithmically' and can't code. Engineers, in turn, hate low code frameworks, as they are useless on the CV and annoying to work with for reasons mentioned by others here. Proprietary s*ht tech that always, inevitably, leads to custom code.

    And, it's expensive. We had mulesoft, outsystems, boomi and replaced it all with general purpose stuff shaving approx. 9M/yr in license costs. We have lost no velocity, and the great thing about the alternative (in our case: simply standardizing the toolset and going with GCP 'serverless' stack) is that its super easy to find devs who will willingly work on that. That hasn't been our experience with the low code frameworks.

  • anonyfox 2 days ago |
    I don't know. I recently am drawn more and more in pure Go code, which is conceptually as simple as it gets, yet I can achieve basically everything imaginable in it without hitting walls/limitations. Add some (embedded) SQLite for small/quick/cheap things or postgres for when it gets more involved or critical (horizontal scaling, backups, ...), and everything is quickly possible. Now with LLMs, its outright trivial to make them generate functionality at will immediately, and (pure) Go is exceptionally friendly with LLM codegen, due to the language being stupid simple and the stdlib being "complete" for years.

    Essentially I prefer staying at the "you need to be a coder" abstraction level, but the general tooling nowadays makes becoming one very easy. Once you mentally lift the requirement that something needs to be configurable by some non-technical end user or even needs an UI at all, 90%+ of all dev effort can be saved directly. Plus there are no showstoppers in capabilities or usual barriers like too bad performance/config hell of "no code"/"low code" I encountered quite often. And if you don't use the latest webdev fads, things can be maintainable for decades (looking at Go compared to NodeJS).

    Rawdogging basic programming (yes, also no framework if possible) made more "business" projects first succeed (and then stay alive easily) much more than either a web framework or any kind of lo-/no-tool, at least the things I encountered in the wild. Even bad spaghetticode monstrosities can now uploaded to an LLM and refactored into sanity quite efficiently.

    The worst kind of projects (with lots of pain and regret) have been either JS-based, mis-used framework projects (including rails!) or Salesforce setups. Often you're stuck in a dead-end here.

    • carsoon 2 days ago |
      Same thing I have settled on.

      Sqlite for quick and easy postgres for scaling.

      For simple frontends I just use the built in go templates.

      If I need complex frontends for larger apps I use sveltekit/svelte5 for frontend data I just export a single instance of a class that has state/derived fields for data and an isInitialized field that returns a promise for loading the data. Then methods for reloading data, changing data or any actions I need.

      So all i have to do is await classInstance then use the class data in whatever way I need. Everything is reactive and simple due to states. you can use and update the fields directly like regular js but with global reactivity built in.

      The data automatically loads the first time the module is imported. due to how esmodule files work. I just have a classInstance.LoadData() after the export.

      Svelte5 isn't as good with LLM's but with some small instructions about how states, derived, and effects work it works pretty well.

  • bobm_kite9 2 days ago |
    Good article but this misses the obvious - but slightly more distant - eventuality: the no-code vendor goes bankrupt meaning no further support or security fixes, or is bought out by some other firm which means exorbitant future licensing costs and no further features.

    Again, some people might not care about that but it seems kind of a biggie to me.

  • cess11 2 days ago |
    I find Elixir and Phoenix have most of the niceties of RoR but a more rigid handling of databases with Ecto and very few of the drawbacks.
  • deterministic 18 hours ago |
    You can turn any programming language into a super productive “low code like” development platform by adding the necessary libraries/frameworks.

    I personally use a code generator to generate more than 90% of the C++ and Javascript code that a typical biz client/server application needs. Protocols, Database support etc. Using libraries to do what isn’t application dependent.

    And when I occasionally (rarely) need a new feature not supported by the code generator or libraries, I simply add it as needed.

    I highly recommend building your own code generator/libraries. Yes it takes a bit more time up front, but you get a solution that is tailored and perfectly shaped to your (team) needs. And you don’t end up depending on some open source project that has been abandoned or changed in a direction that you don’t agree with.