Programming Languages I Use in Production

Every language is a tool, and I pick the one that fits the job. I write production code in PHP, JavaScript, TypeScript, Python, Go, Java, C#, Swift, Kotlin, SQL, Bash, and HTML/CSS. Not because they are trendy, but because each one solves specific problems better than the alternatives. Here is how I use them, when I choose each one, and what that means for your project.

Industry Insights
77%
of all websites use PHP on the server side, including WordPress, which powers 43% of the web
98%
of websites use JavaScript on the client side, making it the most deployed language on the internet
#1
Python is the most popular language for AI, data science, and automation workloads worldwide

PHP

PHP is the backbone of most of my server-side web work. I use it for custom websites, WordPress themes and plugins, server-rendered pages, and backend logic that powers everything from contact forms to full e-commerce systems. This site runs on PHP.

The language gets a bad reputation from developers who have not touched it since 2010. Modern PHP is a different language. PHP 8 brought named arguments, match expressions, fibers, enums, and significant performance improvements. It is fast, well-documented, and runs on virtually every web host without special configuration. That last point matters more than most developers admit. When a client needs to deploy on shared hosting or a simple VPS, PHP just works.

I write PHP when the project involves server-rendered HTML, WordPress development, or lightweight APIs that do not need the complexity of a Node.js or Python framework. For content-driven websites, PHP with clean architecture is still the most efficient path from idea to production. No build step, no compilation, no dependency management headaches. Write the file, upload it, and it runs.

When I Reach for PHP

  • WordPress themes and plugins built from scratch
  • Server-rendered websites and landing pages
  • Backend APIs for form handling, email, and payment processing
  • Projects where hosting simplicity is a priority
  • WooCommerce customization and e-commerce builds

JavaScript

JavaScript is the language of the browser. If something interactive happens on a web page, JavaScript makes it work. I use it for front-end interactivity, DOM manipulation, animations, form validation, and dynamic content loading. On the server side, I use JavaScript through Node.js for APIs, real-time applications, and build tooling.

I write vanilla JavaScript when the project does not need a framework. A marketing site that needs a mobile menu, a smooth scroll effect, and a form submission handler does not need React. It needs 50 lines of clean JavaScript. I am deliberate about this. Every kilobyte of JavaScript you ship to the browser costs your users time. It has to parse, compile, and execute before the page becomes interactive. Less JavaScript means faster pages.

When a project does need a framework, I use React or Next.js. Single-page applications, dashboards, complex forms with real-time validation, and interactive tools all benefit from a component-based architecture. But I do not default to a framework. I evaluate the actual requirements first and choose the simplest tool that handles them well.

On the backend, Node.js gives me a unified language across the entire stack. For real-time features like chat, live notifications, or collaborative editing, Node.js with WebSockets is my go-to. For REST APIs that need to handle high concurrency with low overhead, Express on Node.js is fast to build and fast to run.

When I Reach for JavaScript

  • Client-side interactivity, animations, and DOM manipulation
  • Single-page applications and complex user interfaces
  • Node.js backend APIs and real-time features
  • Build tooling, bundling, and development workflows
  • Lightweight scripts where a framework would be overkill

TypeScript

TypeScript is JavaScript with a type system. I use it on any JavaScript project that is large enough to benefit from compile-time error checking, which in practice means most projects with more than a handful of files. It catches bugs before the code ever runs, makes refactoring safe, and gives me and anyone who maintains the code after me clear documentation of what every function expects and returns.

I use TypeScript across both frontend and backend. React applications, Next.js projects, Node.js APIs, and React Native mobile apps all get written in TypeScript. The upfront cost of defining types pays for itself the first time a type error catches a bug that would have taken an hour to track down in plain JavaScript.

TypeScript also makes collaboration easier. If another developer needs to pick up my code, the type definitions act as living documentation. They do not have to guess what shape a data object should be or what arguments a function accepts. The compiler tells them.

I do not use TypeScript for small scripts or quick prototypes where the overhead is not justified. A 30-line utility script does not need type annotations. But for anything that will be maintained, extended, or handed off, TypeScript is the default.

When I Reach for TypeScript

  • React and Next.js applications
  • Node.js APIs with complex data models
  • React Native mobile apps
  • Any codebase that multiple developers will touch
  • Projects with long maintenance horizons

Python

Python is my primary language for AI integration, data processing, automation, and scripting. When a project involves calling OpenAI or Anthropic APIs, processing datasets, scraping websites, building data pipelines, or automating repetitive workflows, Python is almost always the right tool.

The ecosystem is the main advantage. Libraries like pandas, requests, BeautifulSoup, and LangChain let me build complex data workflows in a fraction of the time it would take in other languages. For AI work specifically, Python is the industry standard. Every major AI model provider publishes their primary SDK in Python first. The tooling, documentation, and community support are unmatched.

I use Python for backend services when the project is data-heavy or AI-focused. Flask and FastAPI give me lightweight web servers that are fast to build and deploy. For scheduled tasks, ETL pipelines, and batch processing, Python scripts running on cron jobs or serverless functions handle the job cleanly.

I do not use Python for front-end web development or for applications where raw execution speed is critical. Python is not the fastest language, and it is not designed for the browser. But for its core strengths, data processing, AI, automation, and scripting, nothing else comes close to the combination of speed-of-development and ecosystem depth.

When I Reach for Python

  • AI and LLM integrations using OpenAI, Anthropic, and open-source models
  • Data processing, transformation, and pipeline automation
  • Web scraping and data extraction
  • Backend APIs for AI-powered features
  • Scripting and task automation

HTML & CSS

HTML and CSS are not afterthoughts. They are the foundation of everything that renders in a browser. I write semantic HTML that search engines understand, screen readers can navigate, and browsers render fast. I write CSS that is maintainable, performant, and does not fight the cascade.

Semantic HTML means using the right elements for the right purpose. Headings have a logical hierarchy. Navigation uses nav elements. Articles use article elements. This is not academic pedantry. It directly affects your SEO, your accessibility compliance, and how well your content performs across devices and assistive technologies.

For CSS, I write custom stylesheets when the project calls for it, and I use Tailwind CSS or Bootstrap when rapid development is the priority. I understand the cascade, specificity, flexbox, grid, container queries, and modern CSS features well enough to write layouts that work without fighting the browser. I do not stack !important declarations or use JavaScript to do what CSS handles natively.

Performance matters here too. I minimize CSS file sizes, avoid render-blocking stylesheets where possible, and use modern techniques like content-visibility and will-change to keep paint times low. A well-structured stylesheet loads faster and renders smoother than a bloated framework stylesheet with thousands of unused rules.

When HTML/CSS Are the Star

  • Marketing and content-driven websites where SEO and accessibility matter
  • Email templates that render consistently across clients
  • Landing pages optimized for Core Web Vitals
  • Component styling in React, Next.js, and WordPress projects
  • Responsive layouts that work across every screen size

SQL

SQL is the language of data. Every web application I build talks to a database, and that means writing SQL — whether it is raw queries, migrations, or the logic behind an ORM. I write SQL for PostgreSQL, MySQL, and SQLite depending on the project, and I understand the differences between them well enough to write queries that perform correctly on each.

I write schema designs that normalize data without over-engineering. I write queries that use proper indexing, avoid N+1 problems, and return only the data the application needs. When an application is slow, the database is usually the first place I look, and SQL is the tool I use to diagnose and fix it.

For complex reporting, analytics dashboards, and data-heavy applications, SQL is often doing the heavy lifting behind the scenes. Aggregate queries, window functions, CTEs, and joins replace what would otherwise be hundreds of lines of application code. Writing that logic in SQL instead of PHP or JavaScript means less code to maintain and faster execution.

When I Reach for SQL

  • Database schema design and migrations for new applications
  • Performance optimization — slow queries, missing indexes, query plan analysis
  • Reporting dashboards and analytics that aggregate large datasets
  • Data migrations between systems or during platform upgrades
  • Complex filtering, search, and sorting logic that belongs in the database layer

Bash & Shell Scripting

Bash is the glue between everything else. Deployment scripts, cron jobs, CI/CD pipelines, server provisioning, log processing, database backups — all of it runs on shell scripts. I write Bash that automates the repetitive parts of running production software so they happen reliably without manual intervention.

Every project I deploy involves shell scripting somewhere. Docker containers need entrypoint scripts. CI/CD pipelines run build, test, and deploy steps as shell commands. Servers need provisioning scripts that install dependencies, configure services, and set permissions. Cron jobs need scripts that run nightly backups, clean up temp files, or trigger data syncs.

I write shell scripts that are readable, handle errors properly, and log what they do. A deployment script that fails silently is worse than no script at all. My scripts use set -e for error handling, trap for cleanup, and proper quoting to avoid the whitespace bugs that plague most shell code.

When I Reach for Bash

  • Automated deployment pipelines — build, test, deploy in sequence
  • Server provisioning and configuration management
  • Database backup and restore scripts
  • CI/CD workflow steps in GitHub Actions, GitLab CI, or similar
  • Log rotation, cleanup jobs, and system maintenance tasks

Go

Go, also called Golang, is what I reach for when a service has to absorb heavy concurrent traffic without heavy operational complexity. It was designed at Google for exactly this problem, and it shows. Go compiles to a single static binary with no runtime to install, no dependency tree to resolve on the server, and no interpreter to keep patched. You build it, you copy it, it runs. That property alone eliminates an entire category of deployment problems.

The concurrency model is the real reason to use it. A goroutine costs about two kilobytes of memory, which means a Go service can hold tens of thousands of concurrent operations on hardware that would choke a thread-per-request architecture. Channels pass data between goroutines without the shared-memory locking that makes concurrent code in most languages fragile and hard to debug. When I need a webhook receiver that absorbs traffic spikes, a job processor chewing through a queue, or an API that stays responsive under load, Go is the most direct path to it.

Go is also excellent for command-line tooling. Because the output is one self-contained executable that cross-compiles to Linux, macOS, and Windows from a single machine, internal tools I write in Go can be handed to a client and simply run. No Node version manager, no Python virtual environment, no "works on my machine."

I am pragmatic about where it fits. I do not rewrite a working Node.js or PHP application in Go for its own sake. But when a specific service in the system is throughput-bound, or when a piece of infrastructure needs to be dead simple to deploy and operate, Go earns its place in the stack.

When I Reach for Go

  • High-throughput REST APIs and webhook receivers that need to absorb traffic spikes
  • Background workers and job processors handling thousands of concurrent tasks
  • Microservices where a single static binary simplifies containers and deployment
  • Command-line tools that must run anywhere without a runtime installed
  • Data-processing services where raw throughput matters more than development speed

Java & C#

Java and C# run an enormous share of the business-critical software that never shows up in startup blog posts. Hospital systems, insurance platforms, ERP installations, warehouse management, banking middleware. If your company has a system that has been running since before the current dev team was hired, there is a good chance it is Java on Spring Boot or C# on .NET.

The most valuable work I do in these languages is integration rather than greenfield construction. A business comes to me with a modern requirement — a customer portal, a mobile app, an AI assistant, a reporting dashboard — and the data it needs lives inside an existing enterprise system. I build the bridge: a REST or GraphQL layer over the legacy application, a scheduled sync between the enterprise database and a modern one, a webhook adapter that lets the old system trigger new workflows.

On the Java side that means Spring Boot services, JDBC and JPA data access, Maven or Gradle builds, and the JVM tuning that keeps them healthy. On the .NET side it means ASP.NET Core Web APIs, Entity Framework, and the Azure services most Microsoft-centric shops already pay for. Both ecosystems are strongly typed, deeply tooled, and extremely stable, which is exactly what you want in the layer that touches your system of record.

Where I set expectations honestly: I am a solo developer, so I am not the right choice to architect a brand-new enterprise monolith with a twenty-person team behind it. What I am very good at is extending, integrating, and modernizing what you already have — and connecting it to the web and mobile experiences your customers actually want.

When I Reach for Java or C#

  • Integrating a modern web or mobile front end with an existing Spring Boot or ASP.NET Core system
  • Building REST APIs that must run inside an established JVM or .NET environment
  • Extending internal line-of-business applications without a risky full rewrite
  • Data sync and middleware between enterprise systems and modern databases
  • Android work that requires native Java interop alongside Kotlin

Swift & Kotlin

Most mobile projects I build are cross-platform, because writing one codebase for iOS and Android is usually the right economic call. But "cross-platform first" is not the same as "cross-platform only." Every serious app eventually reaches a feature that needs to talk directly to the operating system, and that is where Swift and Kotlin come in.

The typical pattern is a native module. The app's screens, navigation, state, and API calls stay in shared TypeScript, and a small, well-defined slice gets written natively and exposed to the rest of the app: a Core Bluetooth integration for a medical device, a HealthKit sync, a camera pipeline that has to process frames in real time, a background location service that must survive the OS killing the app, a home screen widget, or a watch companion. That slice is usually five percent of the codebase and one hundred percent of the reason the app is worth building.

Both languages have converged on the same modern idea for building interfaces. SwiftUI and Jetpack Compose are declarative UI frameworks, which means the mental model is nearly identical to React: describe what the screen should look like for a given state and let the framework handle the updates. If you already know component-driven development, moving between them is far less jarring than it was in the UIKit and XML-layout era.

Native fluency also matters for shipping. App Store review, code signing, provisioning profiles, TestFlight distribution, Play Console staged rollouts, and platform permission requirements are where mobile projects actually get stuck. Knowing the native side means I can diagnose a rejection or a signing failure directly instead of guessing from behind an abstraction layer.

When I Reach for Swift or Kotlin

  • Native modules that expose platform APIs to a React Native or Flutter app
  • Bluetooth devices, HealthKit data, camera pipelines, or background location tracking
  • Home screen widgets, watch apps, and other OS-level integrations
  • Performance-critical screens where the cross-platform bridge is the bottleneck
  • Fully native builds when platform guidelines or App Store review demand it

When to Use Which Language

This table is the quick-reference version of how I choose languages for client projects. Every project is different, but these are the general decision points I work through.

Project Type Primary Language Why
WordPress site or plugin PHP WordPress core is PHP. Custom themes and plugins must be PHP.
Static business website HTML/CSS + PHP Fast, simple, no build step. PHP handles includes and forms.
Interactive web app or dashboard TypeScript + React Component architecture, type safety, rich interactivity.
Mobile app TypeScript + React Native One codebase for iOS and Android with native performance.
AI chatbot or agent Python Best AI/ML ecosystem. First-class SDK support from all providers.
Data pipeline or scraper Python pandas, BeautifulSoup, and async libraries handle data at scale.
Real-time backend (chat, live updates) JavaScript (Node.js) Event-driven architecture handles concurrent connections efficiently.
REST API for a web or mobile app TypeScript (Node.js) Shared types between frontend and backend. Fast development cycle.
Reporting dashboard or analytics SQL Complex aggregations and joins belong in the database, not application code.
Deployment pipeline or server automation Bash CI/CD, Docker entrypoints, cron jobs, and provisioning scripts.
High-throughput API or webhook receiver Go Goroutines handle massive concurrency. Deploys as one static binary.
Internal CLI or developer tooling Go or Bash Go cross-compiles to a single executable. Bash when it stays on one server.
Integration with an existing enterprise system Java or C# Meet the system of record where it lives instead of forcing a rewrite.
Native mobile feature (Bluetooth, HealthKit, widgets) Swift or Kotlin Direct access to platform APIs that no cross-platform bridge exposes.

Quick Facts About My Language Stack

Stack at a Glance
12
production languages spanning web, mobile, enterprise integration, data, and infrastructure
Full Stack
every language I use covers a real production need, not a resume checkbox
0
projects where I force a language to fit. The project requirements dictate the tool, not the other way around.

Why a Polyglot Developer Matters

Plenty of developers specialize in one language and try to use it for everything. That works until the project requirements do not fit. A JavaScript-only developer will build your data pipeline in Node.js even though Python would handle it in half the code. A PHP-only developer will try to build your real-time chat server in PHP when Node.js is the natural fit.

I do not have that limitation. When you bring me a project, I evaluate the requirements and choose the language and tools that solve the problem most efficiently. Sometimes that means a single language handles the whole project. More often, it means different parts of the system use different languages, each one playing to its strengths.

A typical full-stack project might use PHP for server-rendered pages, TypeScript and React for interactive components, Python for a background data processing service, SQL for the data layer, Bash for deployment automation, and HTML/CSS as the foundation for everything that renders in the browser. Each language handles the part of the system it was designed for. The result is cleaner code, better performance, and lower maintenance costs.

This flexibility also means I can work with whatever technology your existing systems use. If your business already runs on a PHP codebase, I work in PHP. If your team uses Python, I integrate with Python. I am not going to rewrite your entire stack just because I prefer a different language. I meet the project where it is and build from there.

Staying Current Without Chasing Trends

Languages evolve. PHP 8 is a massive improvement over PHP 5. Modern JavaScript with ES modules, async/await, and optional chaining is a different language than the jQuery-era code most people associate with it. Python 3.12 runs measurably faster than Python 3.8. I stay current with each language's evolution because the improvements are real and they directly benefit the projects I build.

What I do not do is chase every new language that appears on Hacker News. A language earns a place in my stack by solving a problem the others solve worse. Go earned it on concurrency and single-binary deployment. Swift and Kotlin earned it because some mobile features can only be built natively. Java and C# earned it because that is where enterprise data already lives. Rust, Zig, and Elixir are genuinely excellent tools that have not yet earned a place in the kind of work I do, and I would rather say that plainly than pad a list. For web development, mobile apps, AI integration, and data automation, the languages above cover the territory completely.

I invest in depth over breadth. Knowing a language well enough to use it in production means understanding its edge cases, performance characteristics, security pitfalls, and ecosystem. That depth is what separates code that works in a demo from code that holds up under real traffic and real users.

Let's Talk About Your Project

Book a free discovery call and I will walk you through the technology choices that make sense for your specific project. No jargon, no upsells. Just a straight answer on what to build and how to build it.

Book a Call