Choosing a backend language, choosing a culture
photo credit: Gerd Altmann

Choosing a backend language, choosing a culture

Somebody was talking to me about choosing a backend programming language for their startup.

I was realizing that in general, it is true that most languages offer many of the same features. But the community and tools that form around the language are the hidden factors that actually are more important.

Languages and cultures

Javascript is used primarily by front-end developers. This community is about fast delivery and rapid change, and many of the developers in this community deeply understand their customers and the user experience. You can build backend services in node.js, and many do. The advantage here is you can build both the front-end and the back-end in the same language, so this can be very tempting.

Ruby on Rails lands in a slightly similar camp. Ruby on Rails has always been popular for whipping out that first implementation, getting the funding you need and delivering value immediately. This community is focused on fast prototyping and quick database integration.

For both of these groups, however, once you move beyond a single, simple monolithic service, you run into trouble. I wish it were not so but I have seen it over and over again. They get stuff to work, but when you start scaling, things start falling over, and they generally don't have the skills or background to understand how to design and manage distributed systems. Some of them even look down on such things and say you're over-complicating things...

When you want engineers who understand distributed service design, who have grown up around design patterns and principles such as query responsibility separation, hexagonal pattern, idempotence, things like that, you're more likely to find that in the Java, Kotlin and Scala communities.

You can see Go in this space as well, but it's tricky, because now you are veering into high-performance, high-scale, no-nonsense platform communities. Rust also falls into this area. These folks understand distributed systems, no doubt about it, but often they have grown up deep in the engine, making it hum, and have neither the interest nor the patience for business domain modeling, design patterns or "thinking like the customer." Their services tend to have hundreds of clients and they have to keep the code super-clean and efficient and drive the API independent of specific consumers to maintain its scale and maintainability.

With Python you are going to find data engineers who know how to build data pipelines and perform deep data analysis, but who also generally don't have a background in distributed service design and maintenance.

My recommendations

So here's how I'd map it out:

Zero-to-one, get your app built quickly - you can definitely use Ruby on Rails or node.js.

The trick with this choice is that if and when your business scales beyond a single backend service, it is a major shift.

You will likely want to change your programming language so you can have more luck finding developers with the right type of experience. That's difficult in itself, but this most also often meets with strong resistance from your initial team.

You'll aso need to invest in training your initial team into distributed systems thinking and a new language, and some people are going to sign off rather than go on that journey.

I personally have been involved in this transition multiple times; it is not easy or fun.

These days I might try as an alternative the build-an-app-with-a-prompt AI tools. This might be a better choice than Ruby on Rails or Javascript because you can still get stuff up and running fast, but you can choose your longer-term language (and developers who are part of that culture). You'll probably still have to clean it up later, but at least you won't have to change your developer culture and your language.

The one risk here is Java or Kotlin developers are sometimes too systematic and want to do a lot of up-front design (DVC raises his hand...), when that is not necessarily what is called for when you're trying to get your first product out the door.

Domain services that model the business domain and which interact well together using well-established design patterns - I would go with Java or Kotlin.

High-scale, high-performance, bare-to-the-metal backend services - definitely Go or Rust. Java can also fit here, but sometimes at this level the size and complexity of the language, which is great for business domain services, can get in its own way. Also often the Java developer community tends to prioritize expressiveness over performance and may not have the skills to build fast fast fast services.

Solid data pipelines with all the expertise and tools for data analysis - Python is your go-to. Be careful building apps with Python, as you'll again probably need to change your language and team culture

In general, be thoughtful about your language choice. At one level, any language can work, but you may be pushing against the natural tendencies of both the tooling and the developer community for that language.

Religious wars over coding standards have moved to languages & environments (since most languages come with their own coding standards and automated checking/compliance.) The tendency to form priesthoods around development environments persists.

Allen Sallinger

Senior Software Engineer

1 个月

Great article! I agree on getting the first iteration out with what you know or with what has the scaffolding to do so. In the past year or so, now that's filled with what AI can help you build out for the first iteration. If you have enough traction and revenue, you can migrate to something or scale out the system if that makes sense. From working at Python, Go, and Node shops, it's fascinating how the culture forms around the tooling. I never thought I'd see a distinct culture emerge directly from it.

要查看或添加评论,请登录

David Van Couvering的更多文章

  • Simplifying technical designs

    Simplifying technical designs

    Someone recently shared with me that they really appreciate my ability to take a massive, complex problem or design and…

    3 条评论
  • A set of coding standards

    A set of coding standards

    We have decided to focus on improving coding practices within my team, and I wanted to provide a digestible summary of…

    7 条评论
  • How big should a service be? The age-old problem

    How big should a service be? The age-old problem

    It happened again. I was in a conversation with a colleague, and they were trying to decide whether to make something a…

    8 条评论
  • Crossing the distributed systems chasm

    Crossing the distributed systems chasm

    A large part of my career has been helping an engineering organization evolve from a single monolithic system that…

    3 条评论
  • Your job on ADD (AI-Driven-Development)

    Your job on ADD (AI-Driven-Development)

    In a recent article I mused about how AI will impact our jobs as software engineers. I was realizing things were…

    8 条评论
  • Deciding how frequently to deploy

    Deciding how frequently to deploy

    I was talking with a colleague last week about whether they should increase or decrease their deploy frequency. They…

    4 条评论
  • Turn out the lights when you leave...

    Turn out the lights when you leave...

    I have been having some interesting conversations with my developer colleagues as they are starting to see how well the…

    3 条评论
  • Politics and sales as a software engineer

    Politics and sales as a software engineer

    Politics and sales can definitely be a dirty business. Some people will say anything if it is to their advantage.

    1 条评论
  • Changing coding habits

    Changing coding habits

    Over the last few years, I have been working with teams trying to help them change their design and coding habits. I am…

    1 条评论
  • So busy but nothing gets done

    So busy but nothing gets done

    In my last post I talked about value streams and how we can use this concept to change how we think about building…

    2 条评论

社区洞察

其他会员也浏览了