#Programming Languages

Articles about Programming Languages — exploring patterns, best practices, and real-world implementations in production systems.

16 posts tagged with programming languages. ← All posts

#A2A (14)#ADK (8)#AG-UI (6)#AI (9)#AI Agents (303)#AI Architecture (10)#AI Cost (10)#AI Cost Optimization (8)#AI Engineering (160)#AI Governance (28)#AI Red Teaming (9)#AI Research (9)#AI Safety (6)#AI Security (21)#AI in Production (12)#AML (3)#API Design (10)#API Security (8)#APIs (47)#AWS (17)#Accounting (9)#Agent Skills (3)#Agentic AI (24)#Agentic Commerce (12)#Agentic RAG (8)#Agents (4)#Amazon Bedrock (8)#Architecture (36)#Audit (3)#Authentication (10)#Authorization (3)#Automation (6)#Azure (11)#Azure AI Foundry (9)#Backend Engineering (267)#BigQuery (6)#CI/CD (8)#Capital Markets (14)#Card Payments (12)#Cards (13)#Career (7)#Checkpointing (4)#Claude Code (8)#Cloud (3)#Cloud Architecture (3)#Code Review (8)#Collaboration (4)#Communication (4)#Compliance (51)#Computer Networking (8)#Concurrency (25)#Consulting (3)#Context Engineering (10)#Cost Optimisation (5)#Credit (14)#Credit Risk (14)#CrewAI (8)#Crypto (12)#Cryptocurrency (12)#Custody (9)#DSPy (8)#Data (4)#Data Engineering (4)#Data Structures (8)#Databases (33)#Deployment (3)#DevOps (9)#DevSecOps (11)#Developer Experience (5)#Distributed Systems (88)#Documentation (3)#Edge AI (8)#Embeddings (14)#Engineering (7)#Engineering Culture (3)#Engineering Practices (16)#Evaluation (44)#Event-Driven Architecture (8)#FREE-AI (8)#FX (5)#FinOps (23)#FinTech (6)#Financial AI (14)#Financial Systems (129)#Fine-Tuning (11)#Fintech (131)#Flutter (8)#Foreign Exchange (5)#Forward Deployed Engineer (8)#Forward Deployed Engineering (8)#Fraud (10)#Function Tools (5)#GCP (5)#Gemma (4)#Go (220)#Google ADK (36)#Governance (55)#Granite (6)#GraphQL (3)#Guardrails (24)#HIPAA (3)#HTTP (3)#Harness Engineering (8)#Hugging Face (8)#Human-in-the-Loop (8)#IBM watsonx (8)#Identity (11)#Integration (3)#Interfaces (3)#KYC (11)#KYC and AML (12)#Kafka (10)#Kubernetes (9)#LLM (5)#LLM Inference (8)#LLMs (110)#LangChain (8)#LangGraph (11)#Ledger (12)#Lending (14)#LlamaIndex (8)#MCP (22)#MLOps (30)#Machine Learning (13)#Markets (4)#Memory (13)#Memory Management (4)#Microservices (3)#Microsoft Agent Framework (150)#Middleware (6)#Migration (9)#Monitoring (3)#Multi-Agent (10)#Multi-Agent AI (14)#Multi-Agent Systems (70)#Multimodal (3)#NIM (5)#NVIDIA (8)#OAuth (3)#OWASP (7)#Observability (43)#On-Device AI (8)#Open Source (6)#OpenTelemetry (5)#Opinion (6)#Orchestration (10)#Payment Rails (16)#Payments (54)#Performance (29)#Platform Engineering (9)#Privacy (4)#Privacy Engineering (3)#Product (4)#Production (6)#Programming (10)#Programming Languages (16)#Prompt Engineering (64)#Prompt Injection (6)#Protocols (9)#Providers (4)#Pydantic AI (8)#Python (142)#Quality (3)#RAG (58)#RBI (3)#REST (5)#Rails (16)#Reconciliation (3)#RegTech (8)#Regulation (9)#Reliability (45)#Resilience (3)#Responsible AI (5)#Retrieval (3)#Risk (13)#Rust (16)#SRE (20)#Scalability (3)#Security (80)#Self-Evolving Agents (16)#Sessions (3)#Settlement (9)#Software Architecture (35)#Software Engineering (138)#Spanner (4)#Strands (8)#Streaming (25)#Structured Output (4)#System Design (32)#Systems Programming (16)#Testing (34)#Tool Use (21)#Tools (3)#Trading (8)#Treasury (6)#Type System (3)#Type Systems (3)#Vector Databases (21)#Vector Search (11)#Web Development (6)#Workflows (14)#gRPC (5)#smolagents (8)
Pratik Dhanave · ·7 min read

Modules, Crates, and Project Structure

As a program grows past one file, you need a way to organize it — to group related code, control what's public, and pull in libraries. Rust's module system does this with a clear hierarchy and privacy-by-default, and understanding crates, modules, and paths is what lets your projects scale beyond a single main.rs. This closes Module 2.

As a program grows past one file, you need a way to organize it — to group related code, control what's public, and pull in libraries. Rust's module system does this with a clear hierarchy and privacy-by-default.

Pratik Dhanave · ·6 min read

Smart Pointers: Box, Rc, and RefCell

Module 1's ownership rules — one owner, borrow-checked references — cover most code. But some data structures genuinely need more: a value on the heap, shared ownership, or mutation through a shared reference. Smart pointers are Rust's escape hatches that provide these while keeping the safety, and knowing the big three is knowing how to model the shapes ownership alone can't.

Ownership's rules cover most code. But some data structures genuinely need more: a value on the heap, shared ownership, or mutation through a shared reference. Smart pointers are Rust's escape hatches that provide these while keeping the safety.

Pratik Dhanave · ·7 min read

Error Handling: Result, Option, and No Exceptions

Rust has no exceptions. Errors and absent values are ordinary data — enum values you must handle — so the compiler forces you to deal with the possibility of failure instead of letting it propagate invisibly. It sounds tedious and turns out to be one of Rust's quiet strengths: you cannot forget to handle an error.

Rust has no exceptions. Errors and absent values are ordinary data — enum values you must handle — so the compiler forces you to deal with failure instead of letting it propagate invisibly. It turns out to be one of Rust's quiet strengths.

Pratik Dhanave · ·6 min read

Iterators

Iterators are how Rust does loops without writing loops — a chain of composable adapters (map, filter, collect) that reads like a description of what you want, not how to get it. And the astonishing part is that this high-level, functional style compiles to code as fast as a hand-written loop. Zero-cost abstraction, at its most delightful.

Iterators are how Rust does loops without writing loops — a chain of composable adapters (map, filter, collect) that reads like a description of what you want. And the astonishing part is that this high-level style compiles to code as fast as a hand-written loop.

Pratik Dhanave · ·6 min read

Structs, Enums, and Pattern Matching

Rust's enums are not the feeble named-constants of other languages — they're full algebraic data types that can hold data, and combined with pattern matching they become one of Rust's most loved features. Together with structs, they're how you model your domain, and the compiler makes sure you handle every case.

Rust's enums are not the feeble named-constants of other languages — they're full algebraic data types that hold data, and combined with pattern matching they become one of Rust's most loved features. Together with structs, they're how you model your domain.

Pratik Dhanave · ·6 min read

Closures

Closures are anonymous functions that can capture variables from around them — and in Rust, the ownership model makes "capture" a precise, three-way question: does the closure borrow, mutably borrow, or take ownership of what it captures? Understanding that is what makes closures (and the iterators that depend on them) click.

Closures are anonymous functions that capture variables from around them — and in Rust the ownership model makes 'capture' a precise, three-way question: does the closure borrow, mutably borrow, or take ownership of what it captures?

Pratik Dhanave · ·7 min read

Lifetimes

Lifetimes are the part of Rust that looks most alien — those `'a` annotations scattered through function signatures — and the part most misunderstood. They don't change how your code runs; they're just the compiler making explicit a question it's always been asking: how long does this reference need to be valid? Understanding that reframes lifetimes from cryptic syntax to a natural extension of borrowing.

Lifetimes are the part of Rust that looks most alien and is most misunderstood. They don't change how your code runs — they're the compiler making explicit a question it always asks: how long does this reference need to be valid?

Pratik Dhanave · ·6 min read

Trait Objects and Dynamic Dispatch

Generics with trait bounds give you many types, resolved at compile time. But sometimes you need a collection of different types that share a trait — a list of shapes, a set of plugins — decided at runtime. Trait objects provide that, trading a little performance for runtime flexibility. Knowing when to use which is a real Rust design decision.

Generics with trait bounds give many types resolved at compile time. But sometimes you need a collection of different types that share a trait, decided at runtime. Trait objects provide that, trading a little performance for runtime flexibility.

Pratik Dhanave · ·7 min read

Borrowing and References

If ownership were the whole story, Rust would be exhausting — you'd move values in and out of every function by hand. Borrowing is the release valve: it lets code use a value without taking ownership, governed by one elegant rule that also happens to eliminate data races. Ownership makes Rust safe; borrowing makes it usable.

If ownership were the whole story, Rust would be exhausting. Borrowing is the release valve: it lets code use a value without taking ownership, governed by one elegant rule that also happens to eliminate data races. Ownership makes Rust safe; borrowing makes it usable.

Pratik Dhanave · ·6 min read

Traits: Shared Behavior

Traits are Rust's answer to "how do I say that different types share a capability?" — its version of interfaces, but more powerful. They're the mechanism behind generics, operator overloading, iterators, and much of the standard library. If ownership is the heart of Rust's safety, traits are the heart of its abstraction.

Traits are Rust's answer to 'how do I say that different types share a capability?' — its version of interfaces, but more powerful. They power generics, operator overloading, iterators, and much of the standard library. If ownership is Rust's safety heart, traits are its abstraction heart.

Pratik Dhanave · ·7 min read

Ownership: Rust's Big Idea

Ownership is the idea that makes Rust Rust — the mechanism that delivers memory safety without a garbage collector. It's a set of three simple rules with deep consequences, and it's the one concept you must genuinely understand, because everything distinctive about the language flows from it. This is the heart of the series.

Ownership is the idea that makes Rust Rust — the mechanism that delivers memory safety without a garbage collector. Three simple rules with deep consequences, and the one concept you must genuinely understand, because everything distinctive flows from it.

Pratik Dhanave · ·6 min read

Generics

Writing the same function three times for three types is the kind of duplication that rots a codebase. Generics let you write it once, over any type — and Rust's twist is that this abstraction costs nothing at runtime, because the compiler generates the specialized versions for you. Zero-cost abstraction starts here.

Writing the same function three times for three types is duplication that rots a codebase. Generics let you write it once over any type — and Rust's twist is that this abstraction costs nothing at runtime, because the compiler generates the specialized versions.

Pratik Dhanave · ·6 min read

Variables, Types, and Immutability by Default

In most languages, variables vary — that's the default, and you opt into constancy. Rust flips it: variables are immutable unless you say otherwise. That one inverted default, plus a strong static type system with inference, quietly shapes how Rust code is written and prevents a whole class of bugs before you meet ownership.

In most languages variables vary by default; Rust flips it — variables are immutable unless you say otherwise. That one inverted default, plus a strong static type system with inference, quietly shapes how Rust is written and prevents a class of bugs.

Pratik Dhanave · ·6 min read

Collections: Vec, String, and HashMap

Module 1's arrays and tuples were fixed-size and stack-bound. Real programs need growable, heap-backed collections — and Rust's three workhorses, Vec, String, and HashMap, are where ownership and borrowing stop being abstract rules and become the everyday texture of writing Rust. This opens Module 2: the data structures and abstractions you actually build with.

Real programs need growable, heap-backed collections — and Rust's three workhorses, Vec, String, and HashMap, are where ownership and borrowing stop being abstract rules and become the everyday texture of writing Rust.

Pratik Dhanave · ·6 min read

Getting Started: Cargo and the Toolchain

Rust's tooling is one of its quiet superpowers — a single tool, Cargo, handles building, dependencies, testing, and more, and it's good enough that Rust developers rarely think about build systems at all. Before the language's hard ideas, meet the tooling that makes working in Rust pleasant.

Rust's tooling is a quiet superpower — a single tool, Cargo, handles building, dependencies, testing, and more, and it's good enough that Rust developers rarely think about build systems at all. Meet the tooling that makes working in Rust pleasant.

Pratik Dhanave · ·6 min read

Why Rust?

Rust makes a promise that sounds impossible: memory safety without a garbage collector, and fearless concurrency without data races — all checked at compile time, with no runtime cost. The price is a compiler that argues with you until your program is correct. Understanding that bargain is the key to understanding why Rust exists and why people love it.

Rust makes a promise that sounds impossible: memory safety without a garbage collector, and fearless concurrency without data races — all checked at compile time, with no runtime cost. The price is a compiler that argues with you until your program is correct.

All posts on this site are written by Pratik Dhanave, an Agentic AI Architect with 7+ years building production distributed systems, multi-agent AI platforms, and cloud-native infrastructure. About the author → Each article includes working code, architecture diagrams, and references to the specific frameworks and standards discussed. Browse all posts or explore related topics using the tag cloud above.