Shav Vimalendiran
BlogWiki ↗
  • The Last MoatsJul 7, 2026
  • The Tech FrontierJul 6, 2026
  • The Trust BarrierJul 4, 2026
  • I Open-Sourced My Coding Agents' MemoryJun 24, 2026
  • How I Gave My Coding Agents Persistent MemoryMar 12, 2026
  • Multi‑Agent Web Exploration with Shared Graph MemoryFeb 19, 2026
  • Our Lessons from Building Production Voice AIJan 11, 2026
  • Reinforcement Learning, Memory and LawDec 10, 2025
  • Automating Secret ManagementOct 23, 2025
  • The Knowledge LayerOct 5, 2025
  • OTel Sidecars on FargateSep 11, 2025
  • Git Disasters and Process DebtSep 7, 2025
  • Is Code Rotting Due To AI?Sep 3, 2025
  • The Integration IllusionAug 30, 2025
  • When MCP FailsAug 26, 2025
  • Context EngineeringAug 22, 2025
  • Stop Email Spoofing with DMARCAug 5, 2025
  • SOTA Embedding Retrieval: Gemini + pgvector for Production ChatJul 21, 2025
  • Agentic Design PatternsJun 21, 2025
  • Building AI Agents for Automated PodcastsJan 1, 2025
  • Rediscovering CursorDec 2, 2024
  • GraphRAG > Traditional Vector RAGAug 8, 2024
  • Cultural Bias in LLMsJul 20, 2024
  • Mapping out the AI Landscape with Topic ModellingJul 7, 2024
  • Sustainable Cloud Computing: Carbon-Aware AIJun 27, 2024
  • Defensive Technology for the Next Decade of AIJun 24, 2024
  • Situational Awareness: The Decade AheadJun 13, 2024
  • Mechanistic Interpretability: A SurveyJun 7, 2024
  • ›Why I Left UbuntuMay 24, 2024
  • Multi-Agent CollaborationApr 16, 2024
  • Building Better Retrieval SystemsMar 28, 2024
  • Building an Automated Newsletter-to-Summary Pipeline with Zapier AI Actions vs AWS SES & LambdaFeb 3, 2024
  • Local AI Image GenerationDec 15, 2023
  • Deploying a Distributed Ray Python Server with Kubernetes, EKS & KubeRayNov 15, 2023
  • Making the Switch to Linux for DevelopmentOct 24, 2023
  • Scaling Options Pricing with RayOct 1, 2023
  • The Async Worker PoolSep 23, 2023
  • Browser Fingerprinting: Introducing My First NPM PackageSep 8, 2023
  • Reading Data from @socket.io/redis-emitter without Using a Socket.io ClientJul 6, 2023
  • Socket.io Middleware for Redux Store IntegrationJul 1, 2023
  • Sharing TypeScript Code Between Microservices: A Guide Using Git SubmodulesApr 21, 2023
  • Efficient Dataset Storage: Beyond CSVsFeb 3, 2023
  • Why I switched from Plain React to Next.js 13Nov 8, 2022
  • Deploy & Scale Socket.io Containers in ECS with ElasticacheNov 3, 2022
  • Implementing TOTP Authentication in Python using PyOTPSep 13, 2022
  • Simplifying Lambda Layer ARNs and Creating Custom Layers in AWSSep 9, 2022
  • TimeScaleDB Deployment: Docker Containers and EC2 SetupJun 23, 2022
  • How to SSH into an EC2 Instance Using PuTTYDec 16, 2021
Loading post…

In This Post

The Breaking PointWhy Windows Won Me BackSetting Up the Development EnvironmentAdding Git Bash to Windows TerminalPowerShell Git AliasesOptimizing with Dev DriveStorage StrategyPackage Cache ConfigurationPython Environment SetupFinal Thoughts
Published: May 24, 2024
PreviousNext

Why I Left Ubuntu

I recently upgraded to Ubuntu 20.04 LTS, but my experience wasn't as smooth as I'd hoped. Here's why I decided to switch back to Windows and my setup process for an optimal development environment.

The Breaking Point

The upgrade to 20.04 LTS caused my system to stop working due to endless issues with NVIDIA drivers. Despite trying multiple versions (450, 460, 470), the problems persisted. I wasn't the only one facing these challenges.

The time I spent troubleshooting these issues on Stack Overflow and AskUbuntu could have been used more productively. This became the catalyst for reconsidering my entire development setup.

Why Windows Won Me Back

Proprietary Software Dependencies: I needed Adobe software for certain tasks, which meant dual-booting between Linux and Windows. This disrupted my workflow, especially when I had to switch for a quick edit. Alternatives like OBS Studio and GIMP just didn't match the functionality and intuitiveness of Adobe products.

Peripheral Support Issues: My peripherals, such as Razer Synapse and Logitech Studio, lacked proper software support on Linux. This limited advanced functionalities that are readily available on Windows. My camera stopped working on Ubuntu, and I had to switch to Windows to use it for calls.

Development Environment Friction: Although developing in the same environment as my deployment was beneficial, most of my work was containerized with Docker. Using Windows with WSL2 or Docker provided a similar experience without the extra hassle.

I faced issues with log management, where my syslog was getting too large, and I had to manually set up logrotate to force the logs to rotate and delete automatically. Setting up VPNs and other utilities was more cumbersome on Ubuntu compared to the seamless installation and integration on Windows.

Application Availability: The lack of certain applications, like Surfshark VPN and Notion, was inconvenient. While there are Linux alternatives, they often required additional setup and weren't as user-friendly.

Given these challenges, the benefits of using Ubuntu didn't outweigh the negatives for me. I decided to switch back to Windows, where I could focus more on coding and less on system maintenance.

Coming back to Windows, I set up the fresh 2TB NVMe I had Ubuntu on as a dedicated Dev Drive. This comprehensive resource helped me optimize my development environment on Windows.

Setting Up the Development Environment

For developers interested in optimizing their Windows setup, here's how I configured my environment for a seamless development experience.

Adding Git Bash to Windows Terminal

From this Stack Overflow post, you can add Git Bash to Windows Terminal by adding this configuration:

{
  "guid": "{00000000-0000-0000-ba54-000000000002}",
  "commandline": "%PROGRAMFILES%/Git/bin/bash.exe -i -l",
  "icon": "%PROGRAMFILES%/Git/mingw64/share/git/git-for-windows.ico",
  "name": "Bash",
  "startingDirectory": "%USERPROFILE%"
}

PowerShell Git Aliases

To achieve the same functionality as GitBash aliases in PowerShell, you can create functions. For example, a function that adds, commits, and pushes changes to your Git repository.

The GitBash equivalent used to be:

alias gacp='f(){ git add . && git commit -m "$1" && git push; }; f'

In PowerShell, open your profile script by running notepad $PROFILE and add the function:

function gacp {
    param (
        [string]$message
    )
    git add .
    git commit -m $message
    git push
}

Optimizing with Dev Drive

A Dev Drive utilizes the Resilient File System (ReFS) to optimize storage for development workloads, providing faster performance and customizable settings. ReFS is a newer Microsoft file system format designed to maximize data availability, scale efficiently to large data sets across diverse workloads, and provide data integrity with resiliency to corruption.

The Dev Drive enables you to initialize a storage volume specifically for development workloads, with ReFS optimizations that improve the performance of key developer scenarios.

Storage Strategy

What to Store on Dev Drive:

  • Source code repositories and project files
  • Package caches for faster dependency resolution
  • Build output and intermediate files

What Not to Store on Dev Drive:

  • Developer tools like Visual Studio, MSBuild, .NET SDK, etc.

Package Cache Configuration

A package cache is the global folder location used by applications to store files for installed software. These source files are needed when you want to update, uninstall, or repair the installed software.

Npm cache (Node.js):

  • Create an npm cache directory on your Dev Drive: D:\packages\npm
  • Set a global environment variable: setx /M npm_config_cache D:\packages\npm

Pip cache (Python):

  • Create a pip cache directory on your Dev Drive: D:\packages\pip
  • Set a global environment variable: setx /M PIP_CACHE_DIR D:\packages\pip
  • Move existing cache contents from %LocalAppData%\pip\Cache to this directory

Python Environment Setup

Python Installation:

  • Install all versions of Python via the Microsoft Store for automatic updates and easy management
  • Install pipx following the pipx documentation for isolated tool installations

Poetry Configuration:

  • Install Poetry for dependency management
  • View current configuration: poetry config --list
  • Set cache directory to Dev Drive: poetry config cache-dir "D:\\packages\\pypoetry"

This setup ensures your Python toolchain leverages the performance benefits of the Dev Drive while maintaining clean separation of concerns.

Final Thoughts

Switching back to Windows has streamlined my development workflow, allowing me to focus on coding rather than troubleshooting. While Linux has its merits, the stability and comprehensive software support of Windows make it a better choice for my current needs.

The combination of WSL2, Docker, and a properly configured Dev Drive provides the best of both worlds: the familiarity and stability of Windows with the development capabilities traditionally associated with Linux environments.

For developers considering a similar transition, the Windows development environment guide provides comprehensive setup instructions to optimize your workflow.


Loading comments...
PreviousMechanistic Interpretability: A SurveyNextMulti-Agent Collaboration

Be the first to share your thoughts!