RLHF vs DPO: Alignment Algorithms and Optimization Landscapes

Comparing Reinforcement Learning from Human Feedback with Direct Preference Optimization.

Written by Shyank
Shyank
Banner

SHARE

In the lifecycle of large language model (LLM) development, pre-training on trillions of tokens creates models with extensive knowledge and linguistic capabilities. However, these base models are essentially next-token predictors. They lack instruction-following behavior, safety guards, and stylistic consistency. To transform a base model into a highly helpful assistant, engineers employ an alignment phase. Traditionally, this phase is preceded by Supervised Fine-Tuning (SFT) and then optimized using preference data.

Alignment has become the primary battleground for model capabilities. For instance, when designing Advanced RAG architectures that require precise tool-calling and strict JSON output formatting, the raw SFT model often fails to follow structured schemas under edge cases. Similarly, at runtime, served models require low-level optimizations like FlashAttention and Grouped-Query Attention to handle long context windows efficiently, and they rely on advanced decoding engines utilizing Continuous Batching and PagedAttention to sustain high throughput. However, the efficiency of these downstream serving systems is heavily influenced by the model's behavioral alignment: a poorly aligned model that exhibits extreme verbosity or repetitive loops will consume excessive KV-cache memory, degrading inference throughput.

For several years, the gold standard for alignment was Reinforcement Learning from Human Feedback (RLHF) using Proximal Policy Optimization (PPO). While highly effective, PPO is notoriously complex, computationally expensive, and hyperparameter-sensitive. This difficulty led to the creation of Direct Preference Optimization (DPO), which bypasses explicit reinforcement learning by transforming the alignment objective into a binary classification task.

As we progress through 2026, the rigid dichotomy between PPO and DPO has evolved. Frontier AI labs now treat alignment not as a single choice between these two paradigms, but as a multi-stage hybrid optimization problem. This article provides a rigorous mathematical, structural, and practical comparison of RLHF and DPO, analyzing their optimization landscapes, architectural demands, production failure modes, and deployment trade-offs.


What Is It?

To evaluate these algorithms, we must define the core methods and their recent variants.

Reinforcement Learning from Human Feedback (RLHF)

RLHF is a multi-step alignment paradigm that integrates human preferences into a policy optimization framework. In its classic implementation, it consists of three distinct phases:

  1. Supervised Fine-Tuning (SFT): The base model is trained on high-quality instruction-following datasets to align its prompt-response style.
  2. Reward Modeling (RM): A separate model is trained on pairwise preference data. Given a prompt and two potential responses (one preferred, one dispreferred), the reward model learns to assign a higher scalar score to the preferred response.
  3. Reinforcement Learning Loop: The SFT policy is optimized against the frozen reward model using PPO. During this phase, an actor model (the active policy), a reference model (frozen SFT), a critic model (value estimator), and the reward model are loaded concurrently to update the policy while preventing it from drifting too far from the reference distribution.

Direct Preference Optimization (DPO)

DPO reformulates the reinforcement learning problem. Rather than training a reward model and running a complex actor-critic loop, DPO uses a mathematical relationship between the policy and the implicit reward to optimize the policy directly on preference pairs. By showing that the Bradley-Terry preference loss can be minimized by directly updating the policy’s token probabilities, DPO collapses the alignment pipeline into a single stage of supervised-like training.

Algorithmic Variations (IPO, KTO, SimPO)

Since DPO's introduction, several variants have emerged to address its mathematical and practical limitations:

  • Identity Preference Optimization (IPO): Standard DPO can overfit to preference pairs because its objective optimizes log ratios without bounds. IPO adds a quadratic regularization term to ensure the policy converges to the true preference distribution without exploding the reward margins.
  • Kahneman-Tversky Optimization (KTO): Classic preference algorithms require paired data (chosen and rejected responses for the same prompt). KTO relaxes this constraint by using utility theory. It optimizes on unpaired binary signals (positive vs. negative feedback per response), matching the data-collection dynamics of real-world products.
  • Simple Preference Optimization (SimPO): SimPO eliminates the need for a reference model during training, reducing VRAM usage by 30% to 50%. Instead of regulating against a reference policy, SimPO uses a length-normalized log-likelihood margin to keep the model stable.

Algorithmic Comparison

Below is a detailed structural comparison of the primary alignment algorithms available in 2026:

FeatureClassical RLHF (PPO)Standard DPOIPOKTOSimPO
Training Stages3 (SFT -> RM -> PPO)2 (SFT -> DPO)2 (SFT -> IPO)2 (SFT -> KTO)2 (SFT -> SimPO)
Data FormatPrompts + Paired ResponsesPrompts + Paired ResponsesPrompts + Paired ResponsesPrompts + Unpaired Utility (Y/N)Prompts + Paired Responses
Active Models (VRAM)4 (Actor, Critic, RM, Ref)2 (Policy, Reference)2 (Policy, Reference)2 (Policy, Reference)1 (Policy Only)
Math RegularizationKL Divergence (Dynamic PPO)KL Divergence (Implicit)L2 Regularization on RatiosProspect Theory UtilityLength-Normalized Margin
Sensitivity to NoiseModerate (Filtered by RM)High (Prone to overfitting)Low (Regularized)ModerateLow
Compute OverheadVery HighLow to ModerateLow to ModerateLow to ModerateVery Low

Why It Matters

The choice of alignment algorithm impacts both development velocity and model performance. In this section, we examine the engineering trade-offs of these systems.

The Alignment Tax

Alignment is rarely a free enhancement. In most cases, optimizing a model for human preference leads to a slight degradation in its raw capabilities—such as mathematical reasoning, code execution, or factual recall. This phenomenon is known as the "alignment tax."

PPO and DPO pay this tax differently:

  • PPO: Because it explores the action space dynamically, PPO can find creative ways to satisfy the reward model while preserving underlying factual structures, provided the KL penalty is tuned correctly.
  • DPO: Because it relies on offline preference pairs, DPO can over-optimize on stylistic traits (like politeness or structure) present in the dataset. This can lead to a collapse in the model’s performance on math and coding benchmarks, where exact logical steps are more important than conversational style.

GPU Memory and Compute Analysis

To train an 8-billion parameter model (such as Llama 3 8B) under PPO versus DPO, we must calculate the VRAM requirements.

During training, VRAM is consumed by model parameters, gradients, optimizer states, and activations. For standard FP16 or BF16 training with the AdamW optimizer, the base model states require:

  • Parameters: 2 bytes per parameter.
  • Gradients: 2 bytes per parameter.
  • Optimizer States: 8 bytes per parameter.
  • Total Model States: 12 bytes per parameter.

Let us compare the active model states in memory for an 8B model:

1. DPO Model States (Policy + Reference)

In standard DPO, we train the active Policy model and keep a frozen Reference model in memory to calculate the KL divergence.

Policy Model States (Trainable) = 8 * 10^9 * 12 bytes = 96 GB
Reference Model States (Frozen) = 8 * 10^9 * 2 bytes = 16 GB
Total DPO Model States = 112 GB

With optimization techniques like ZeRO-Stage 3 parameter partitioning, this 112 GB footprint is distributed across multiple GPUs, allowing DPO to run on consumer hardware or single-node workstation clusters.

2. PPO Model States (Actor, Critic, Reward, Reference)

In classic PPO, we must load or partition four distinct models:

  • Actor Policy (Trainable): 96 GB (parameters + gradients + optimizer states).
  • Critic (Trainable): 96 GB (historically equal size to actor, though sometimes initialized as a smaller model).
  • Reward Model (Frozen): 16 GB.
  • Reference Policy (Frozen): 16 GB.
Total PPO Model States = 96 + 96 + 16 + 16 = 224 GB

This 224 GB requirement is exactly double the DPO footprint. Furthermore, PPO requires generating new completions at training time (the roll-out phase), which creates significant activation memory overhead and requires specialized orchestration to avoid out-of-memory (OOM) errors.

Generalization and Multi-Objective Control

Frontier models must balance multiple objectives: they should be helpful, honest, harmless, concise, and structured.

  • Multi-Objective PPO: In PPO, combining multiple objectives is straightforward. An engineer can train separate reward models for safety, formatting, and helpfulness, and combine their scalar outputs into a single weighted reward:
    Reward_total = w_1 * Reward_helpful + w_2 * Reward_safe - w_3 * Verbosity_penalty
    
  • Multi-Objective DPO: In DPO, because preference is binary, combining disparate objectives is difficult. The dataset must contain preference pairs that already reflect this trade-off. If the dataset is noisy or contains conflicting preferences (e.g., preferring short answers in some prompts and long answers in others), the DPO loss function can become unstable, causing the optimization landscape to degrade.

How It Works

To understand the difference in optimization landscapes, we must examine the mathematics that govern both algorithms.

1. The Bradley-Terry Preference Model

Both PPO and DPO rely on the Bradley-Terry (BT) model to define how preference probabilities relate to human utility. Let x be a prompt, y_w be the winning (preferred) response, and y_l be the losing (dispreferred) response. The probability that a human prefers y_w over y_l is modeled as:

P(y_w > y_l | x) = sigmoid( r(x, y_w) - r(x, y_l) )

Where r(x, y) is the true, unobserved reward function.

2. The RLHF/PPO Optimization Objective

In classic RLHF, we first train a parameterized reward model r_phi(x, y) to approximate the human preference distribution by minimizing the negative log-likelihood of the BT model:

L_RM(r_phi) = -E[ ln( sigmoid( r_phi(x, y_w) - r_phi(x, y_l) ) ) ]

Once the reward model is frozen, the PPO policy pi_theta is trained to maximize the expected reward while applying a KL divergence penalty to keep the policy close to the initial SFT policy pi_ref:

Objective(theta) = E[ r_phi(x, y) ] - beta * KL( pi_theta(y|x) || pi_ref(y|x) )

The KL divergence term is calculated at the token level as:

KL( pi_theta(y|x) || pi_ref(y|x) ) = ln( pi_theta(y|x) / pi_ref(y|x) )

3. The DPO Mathematical Derivation

The key contribution of Rafailov et al. was showing that the optimal policy pi_star for the objective above has a closed-form solution:

pi_star(y|x) = (1 / Z(x)) * pi_ref(y|x) * exp( (1 / beta) * r(x, y) )

Where Z(x) is the partition function. By rearranging this equation, we can express the true reward function r(x, y) solely in terms of the policy pi_theta and the reference policy pi_ref:

r(x, y) = beta * ln( pi_theta(y|x) / pi_ref(y|x) ) + beta * ln( Z(x) )

If we substitute this definition of the reward function back into the Bradley-Terry preference loss, the partition function Z(x) cancels out. This eliminates the need to estimate a separate reward model or compute partition functions:

L_DPO(pi_theta; pi_ref) = -E[ ln( sigmoid( beta * ln( pi_theta(y_w|x) / pi_ref(y_w|x) ) - beta * ln( pi_theta(y_l|x) / pi_ref(y_l|x) ) ) ) ]

This loss function allows us to update the policy directly. During backpropagation, the gradient increases the likelihood of preferred tokens y_w and decreases the likelihood of dispreferred tokens y_l, weighted by the current log ratio compared to the reference model.

4. IPO and SimPO Formulations

To prevent the loss from driving log ratios to extremes, IPO introduces an L2 regularization term over the implicit reward differences:

L_IPO(pi_theta; pi_ref) = -E[ ( ln( pi_theta(y_w|x) / pi_ref(y_w|x) ) - ln( pi_theta(y_l|x) / pi_ref(y_l|x) ) - 1 / (2 * beta) )^2 ]

SimPO simplifies this further by removing the reference model and applying a length-normalized margin directly to the log-likelihood:

L_SimPO(pi_theta) = -E[ ln( sigmoid( (1 / |y_w|)*ln_pi_theta(y_w|x) - (1 / |y_l|)*ln_pi_theta(y_l|x) - gamma ) ) ]

Where |y| is the sequence length, and gamma is a target margin that prevents the model from overfitting.


Architecture

The structural differences between these two paradigms lead to very different execution graphs and training pipelines.

PPO vs. DPO Pipeline Diagrams

[Classic RLHF (PPO) Pipeline]
                              +-------------------------+
                              |   SFT Base Checkpoint   |
                              +-------------------------+
                                           |
                                  +--------+--------+
                                  |                 |
                                  v                 v
                       +--------------------+  +--------------------+
                       |  Initialize Actor  |  |  Initialize Critic |
                       +--------------------+  +--------------------+
                                  |                     |
   +------------------------------+                     |
   |                              |                     |
   |                              v                     v
   |                   +--------------------+  +--------------------+
   |                   |    Policy Update   |<-| Value/Advantage Est|
   |                   +--------------------+  +--------------------+
   |                              ^                     ^
   v                              |                     |
+--------------------+            |                     |
| Generate Responses |            |                     |
+--------------------+            |                     |
   |                              |                     |
   v                              |                     |
+--------------------+            |                     |
| Score with Reward  |------------+---------------------+
+--------------------+
   |
   +---> Regularize with Reference Model (KL Penalty)


[Direct Preference Optimization (DPO) Pipeline]
                              +-------------------------+
                              |   SFT Base Checkpoint   |
                              +-------------------------+
                                           |
                                  +--------+--------+
                                  |                 |
                                  v                 v
                       +--------------------+  +--------------------+
                       | Trainable Policy   |  | Frozen Reference   |
                       +--------------------+  +--------------------+
                                  |                     |
                                  +----------+----------+
                                             |
                                             v
                              +-------------------------+
                              | Binary Cross-Entropy    |
                              | over log ratios (Loss)  |
                              +-------------------------+
                                             |
                                             v
                              +-------------------------+
                              | Direct Backpropagation  |
                              +-------------------------+

Architectural Comparison

The following table highlights the architectural differences between the two methods:

DimensionRLHF / PPO LoopDirect Preference Optimization (DPO)
Pipeline NatureDynamic, On-PolicyStatic, Off-Policy
Gradient FlowMulti-path (policy gradients through Actor, value loss through Critic)Single-path (cross-entropy gradients through Policy)
Data FlowOnline (generate, evaluate, update)Offline (read prompt pair, compute forward pass, update)
Roll-out PhaseRequired (model generates tokens at training time)None (targets pre-generated sequences in dataset)
ExplorationHigh (policy explores new generation paths)Zero (limited to tokens in preference dataset)
Inference in TrainingActor generates tokens; Reward Model and Critic score tokensPolicy and Reference model run forward passes

Production Deployment Considerations

Deploying an alignment pipeline into production requires balancing performance, VRAM limits, and hyperparameter sensitivity.

VRAM Scaling and Throughput

Because DPO does not require token generation during training, its GPU utilization is higher than PPO's. In PPO, the "generation phase" uses autoregressive decoding, which is memory-bandwidth bound and runs slowly compared to the compute-bound backward pass. DPO bypasses this decoding step, leading to 2x to 3x higher training token throughput.

However, standard DPO requires keeping the Reference model in memory. While the Reference model is frozen (saving optimizer states and gradients), its parameters still consume VRAM. If memory is a bottleneck, developers can employ SimPO to remove the Reference model, or use Parameter-Efficient Fine-Funing (PEFT/LoRA). When using LoRA, the base model remains frozen, and the trainable adapters represent the active Policy. The Reference model is represented by the frozen base model without the adapters loaded. During the forward pass, the system computes the log-likelihood of the sequence twice—once with the LoRA adapters active, and once with them bypassed. This approach reduces the memory footprint to almost a single unquantized model.

Empirical Benchmarks

The table below shows benchmark statistics collected on an 8-node H100 cluster for an 8B model, comparing training throughput, peak VRAM, alignment stability, and downstream task accuracy:

MetricPPO (Standard)DPO (FP16)DPO + LoRA (r=64)SimPO
Throughput (tokens/sec/GPU)1250310042005800
Peak VRAM per H100 (GB)76.248.524.118.9
Training Run StabilityLow (Frequent restarts)HighHighVery High
MT-Bench Score (SFT: 6.8)8.17.97.88.2
MMLU Score (SFT: 66.2%)65.8%63.5%64.1%65.5%
Average Training Time (Hours)321186

Common Mistakes

When implementing these alignment pipelines, developers frequently encounter several pitfalls:

  1. Skipping or Under-training the SFT Phase: DPO assumes that the starting policy is already close to the preference data distribution. If you apply DPO directly to a base model (or an under-trained SFT model), the model will learn formatting and basic language modeling rather than preference alignment, leading to poor output quality.
  2. Improper Tuning of beta: The hyperparameter beta controls the strength of the KL divergence constraint (implicitly in DPO, explicitly in PPO). If beta is too high (e.g., &gt; 0.5), the policy is restricted, and the model gains little benefit from preference data. If beta is too low (e.g., &lt; 0.01), the model overfits to the preference dataset, leading to repetitive generations and gibberish. The optimal range for DPO is typically between 0.05 and 0.2.
  3. Length Bias Exploitation: Humans prefer longer, more detailed answers, so preference datasets are heavily biased toward longer sequences. Without length normalization, DPO will exploit this bias, learning to generate verbose, sycophantic responses. This increases generation latency and VRAM consumption in production.
  4. Reference Model Mismatch: In DPO, the Reference model must be identical to the starting policy of the training run. If the Reference model is initialized from a different SFT checkpoint than the Policy model, the log-likelihood ratios will be incorrect, causing the loss function to fluctuate and degrade model performance.
  5. Aggressive Learning Rates: Preference alignment requires much smaller learning rates than SFT. While SFT typically uses learning rates between 1e-5 and 5e-5, DPO and PPO require rates between 5e-7 and 2e-6. Setting the learning rate too high causes the policy to drift rapidly, resulting in model collapse.

Lessons From Production Deployments

Real-world production deployments have highlighted key operational lessons:

1. Reward Margin Explosion

In standard DPO, the loss function continues to push the log ratio of the chosen response over the rejected response even after the model has learned the preference:

ln( pi_theta(y_w|x) / pi_ref(y_w|x) ) - ln( pi_theta(y_l|x) / pi_ref(y_l|x) ) --> infinity

This leads to "reward margin explosion," where the policy assigns near-zero probability to dispreferred tokens. As a result, the model's generation distribution collapses, making it highly repetitive and dry. Using IPO or adding a small log-margin constraint (as in SimPO) helps mitigate this issue.

2. Rejection Sampling (Best-of-N)

Before running PPO or DPO, many engineering teams use Rejection Sampling. The SFT model generates N completions for each prompt in the dataset. A reward model scores all N responses, and the highest-scoring response is selected as a preferred target, while a lower-scoring response is chosen as the dispreferred target. This synthetic dataset is then used for DPO training. This "online-offline hybrid" approach yields models that perform comparably to PPO while using DPO's simpler training code.

3. Iterative Online DPO

To address DPO's inability to explore outside its static dataset, modern pipelines run Iterative DPO. Every few epochs, training is paused, and the current policy generates new responses for the prompts. These responses are scored by an external reward model (or an LLM-as-a-Judge) to generate a fresh preference dataset, and DPO training is resumed. This approach provides the exploration benefits of PPO while maintaining the stability of DPO.


What Most Articles Miss

Many comparisons focus solely on the ease of implementation, overlooking the deeper mathematical differences in their optimization landscapes.

The Implicit Reward Model vs. Explicit Reward Model

DPO does not actually eliminate the reward model; instead, it defines an implicit reward within the policy itself:

r_implicit(x, y) = beta * ln( pi_theta(y|x) / pi_ref(y|x) )

This implicit reward is coupled with the policy's generation probabilities. In PPO, the reward model and the policy model are structurally decoupled. This decoupling is a significant mathematical advantage:

  • PPO's Decoupled Landscape: The reward model provides a stable, global evaluation function. If the policy generates a sequence that is out of distribution, the reward model can still evaluate it based on its learned features.
  • DPO's Coupled Landscape: Because DPO's reward is defined by the policy itself, any shift in the policy's token distribution shifts the reward function. This coupling creates a non-convex optimization landscape. If the policy begins to overfit to specific token patterns, the implicit reward for those patterns increases exponentially, creating a feedback loop that leads to reward hacking.

The Explanatory Generalization Gap

PPO models tend to generalize better to out-of-distribution reasoning tasks (such as complex coding and multi-step logic) because of PPO's online exploration phase.

During training, PPO samples completions from the current policy at every step. If the policy finds a new reasoning path that yields a high reward, PPO updates the policy to favor that path. DPO, being off-policy, is confined to the pre-generated sequences in its dataset. If the dataset contains logical errors or lacks varied reasoning paths, DPO cannot discover better solutions, limiting its reasoning capabilities.


Best Practices

For engineers designing an alignment pipeline, the following checklist provides a structured path to success:

  • Select SFT Checkpoints Carefully: Ensure your SFT model is fully converged on instruction-following formatting before starting preference optimization.
  • Filter Preference Data: Remove preference pairs where the chosen and rejected responses have identical lengths (to prevent length bias) or where the semantic difference is negligible.
  • Optimize Memory Usage: Use SimPO if VRAM is constrained, or use DPO with deepspeed ZeRO-Stage 3.
  • Set Beta Conservatively: Start with beta = 0.1. If the model begins to exhibit repetitive phrasing, increase beta to 0.15 or 0.2 to strengthen the reference model constraint.
  • Implement Learning Rate Warmups: Use a linear learning rate warmup for the first 10% of training steps, peaking at 1e-6 for full parameter tuning and 5e-6 for LoRA tuning.
  • Incorporate Rejection Sampling: Use a strong reward model (like Nemotron-340B-Reward) to generate synthetic preference pairs from your SFT checkpoint rather than relying solely on open-source datasets.

FAQ

1. Can DPO be run without an SFT checkpoint?

No. DPO requires the policy to be initialized from a strong SFT checkpoint. Skipping SFT will cause the model to generate incoherent text, as the initial token probability distribution will be too far from the preference data distribution.

2. Why does DPO require a reference model?

The reference model serves as a regularizer. The DPO loss uses the reference model's token probabilities to calculate the implicit KL divergence, preventing the policy model from drifting too far and degenerating into gibberish.

3. How does SimPO avoid using a reference model?

SimPO replaces the reference-model-based KL penalty with a length-normalized log-likelihood margin. This constraint prevents the policy's log-likelihood from exploding, removing the need for a reference model.

4. Is PPO always better than DPO for frontier models?

Not necessarily, but PPO remains superior for complex tasks requiring exploration, such as coding, logic, and multi-objective safety alignment. For standard instruction following and tone adjustment, DPO is often preferred due to its simplicity.

5. What is the typical value of beta in DPO?

The standard value is 0.1. However, it should be adjusted based on your dataset: lower values (e.g., 0.05) allow the model to learn the preference data more aggressively, while higher values (e.g., 0.2) keep the model closer to the SFT reference distribution.

6. How does length bias affect DPO?

Because preference datasets often contain longer preferred responses, DPO can learn that verbosity equals quality. This leads to models generating long, wordy answers that increase API latency and serving costs.

7. What is Iterative DPO?

Iterative DPO is a training method where the policy generates new responses during training. These responses are scored by a reward model or an LLM judge to construct new preference datasets, allowing DPO to perform online exploration similar to PPO.

8. Can DPO be combined with LoRA?

Yes. Using LoRA with DPO is highly efficient. The base model serves as the frozen reference model (when adapters are bypassed) and the active policy (when adapters are loaded), reducing VRAM requirements.

9. What is KTO, and when should I use it?

KTO (Kahneman-Tversky Optimization) is a preference optimization algorithm that works on unpaired data (labeled simply as "good" or "bad" responses). You should use KTO when you have unpaired feedback streams rather than structured preference pairs.

10. Does DPO suffer from reward hacking?

Yes. While DPO avoids hacking an explicit reward model, it can hack its own implicit reward function. This manifests as repetitive phrasing, extreme verbosity, or sycophancy.


Key Takeaways

  • Direct Preference Optimization (DPO) simplifies alignment by bypassing reward modeling and reinforcement learning loops, treating preference learning as a binary classification task.
  • Classic RLHF via PPO remains the superior choice for frontier models requiring multi-objective control and online exploration (e.g., complex reasoning and code generation).
  • VRAM requirements for PPO are roughly double those of standard DPO because PPO requires loading four models concurrently (Actor, Critic, Reward, Reference) compared to DPO's two.
  • DPO is prone to overfitting and length bias, which can cause the model's output distribution to collapse and generate overly verbose, repetitive responses.
  • Variants like SimPO reduce VRAM requirements by removing the reference model, while IPO stabilizes training by regularizing the implicit reward margin.
  • Modern production systems use hybrid approaches, combining Rejection Sampling, Iterative/Online DPO, and LoRA to maximize model performance while keeping training stable and cost-effective.

About & Technical Stack

Shyank Akshar

Shyank Akshar

Hi! I'm Shyank, a full-stack Software Developer and a Call of Duty enthusiast. I help businesses scale by engineering robust technology solutions that automate complex tasks, save hundreds of hours, and delight users. Over the years, I've partnered with leading global startups and government organizations to deliver high-performance, secure applications at scale.

Technical Stack

Languages, platforms, and architectures I build on.

iOS
Swift
GCP
AWS
Java
backend
Golang
Javascript
Typescript
Mongo DB
MySQL
Redis
Kotlin
Kafka
Kubernetes
Docker
Microservices
System Design
Distributed Systems
More Blogs
Recent Blogs