Being a polyglot developer: choosing the language for the problem
Personal notes on why mastering multiple programming languages is a matter of tool selection, not identity.
When a developer answers the question “which language do you use?”, the reply almost always carries more than a technical preference. It becomes a kind of identity statement. I’m a PHP developer. I’m a Go developer. I’m a Python developer. Over the years I’ve noticed that this identity framing is really just a cover for a decision already made: work with whatever is at hand.
For the past few years I’ve been actively using more than one language. In this post I want to share that experience — why I see being a “polyglot developer” as an outcome rather than a goal, and what choosing the language for the problem actually means in practice.
The cost of treating language as identity
I started with PHP and stayed with PHP for a long time. There was a practical reason: I was building web applications and PHP was a solid tool for that. The problem was that the “I’m a PHP developer” identity gradually made me not even bother evaluating other languages. When Go appeared, my reaction was “that’s a systems language, not my concern.” I kept Python at arm’s length for years.
Identity closes off choices in advance. When you treat a language as a tool, every new problem becomes a question: which tool is better suited for this job?
The lesson learned from real projects
I spent years building web applications in PHP, staying within the Laravel ecosystem. Then at some point I needed to write a small CLI tool — something that would process files in a specific directory, produce some output, and ship as a single distributable binary. I could have written it in PHP, but the distribution would have gotten complicated. I looked at Go: single binary, fast compilation, a clean concurrency model. That tool was written in Go that day and has been running without issues for two years.
A similar choice happened with Python. I needed to pull data from a third-party API at regular intervals and transform it. Python’s data processing ecosystem — parsing JSON in a few lines, the csv module, pandas if needed — felt far more natural for that job than PHP did. The script was written in a few hours.
These two examples don’t point to different solutions; they point to the same principle: every language has a center of gravity, and when you work close to that center, the language’s resistance decreases.
The center of gravity of each language
For me, the centers of gravity of the three languages have settled into the following:
PHP: Web applications, API development, the Laravel ecosystem. A large ecosystem, a mature framework, decades of accumulated knowledge for server-side web. Domain modeling, form handling, auth flows, scheduled jobs — PHP is still my primary choice in this space.
Go: Distributable tools, small services, background processing where performance matters. Single-binary compilation, memory efficiency, a clean concurrency model. There’s a learning curve, but once you’re past it you produce remarkably reliable code.
Python: Automation scripts, data transformation, rapid prototyping. Highly readable, a broad standard library, an ecosystem that is unquestionably rich for data processing. It has become the first language I reach for when I want to solve a problem quickly.
The real cost of context switching
There is a price to using multiple languages: context switching. Every language has different syntax, idiomatic patterns, and a different standard library. Error handling in Go works differently than in PHP. Python’s type system is looser compared to TypeScript or Go. There is time lost in these transitions.
The way I deal with this is to keep the context clear: know precisely which language I’m writing in, and be deliberate about not importing the habits of other languages. When writing Go, I try not to think like I’m in PHP. When writing Python, I don’t try to force Go’s error-handling philosophy onto it.
Another reality: switching languages doesn’t mean starting from zero. Logic, algorithmic thinking, and design decisions transfer independently of the language. What changes are the idioms, the standard library, and certain paradigms. That overhead lightens over time.
”How many languages should I learn?”
Wrong question. The right question is: what problems am I facing, and are my current tools sufficient for them?
A developer doesn’t need to know every language. But there’s also no payoff in treating a single language as absolute truth. At some point you start seeing solutions through the lens of another language that you simply couldn’t see from your first one. That is an enrichment of thinking, independent of the language itself.
Right now I’m actively working in three languages. I’m in no hurry to add a new one; I know it will happen when the need arises. For now, aligning the tools I have with the problem at hand is enough.
When you stop carrying a language as part of your identity, the choice of tool becomes both easier and clearer. That’s all there is to it.
Comments
Sign in with your GitHub account to join the discussion. Comments are stored in GitHub Discussions.