A well-configured developer environment is the foundation of productivity. Investing time in setting up your shell, editor, and tooling pays dividends every single day. This guide covers a complete development environment setup that works across platforms.


Operating System Choice


Choose an operating system that supports the tools you need:


  • **macOS**: Excellent developer experience, Unix-based terminal, Homebrew package manager. Preferred for iOS/macOS development.
  • **Linux (Ubuntu/Debian/Fedora)**: Native Docker performance, full control over the system. Preferred for server-side and Linux-targeted development.
  • **Windows with WSL2**: Windows Subsystem for Linux 2 provides a Linux kernel inside Windows. Run Linux tools natively while using Windows applications.

  • For most developers, macOS or WSL2 on Windows provides the best balance of tooling and usability.


    Shell Configuration


    Modern shells improve daily productivity. Zsh with Oh My Zsh is the standard:


    
    # Install Zsh and Oh My Zsh
    
    sudo apt install zsh -y
    
    sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    
    

    Essential Zsh plugins:


    
    # ~/.zshrc
    
    plugins=(
    
      git
    
      docker
    
      docker-compose
    
      npm
    
      node
    
      history
    
      colored-man-pages
    
      zsh-autosuggestions
    
      zsh-syntax-highlighting
    
      command-not-found
    
    )
    
    

    For power users, consider Fish shell for autosuggestions out of the box, or Nushell for structured data pipelines.


    Git Configuration


    Set up a robust Git configuration:


    
    git config --global user.name "Your Name"
    
    git config --global user.email "your@email.com"
    
    git config --global init.defaultBranch main
    
    git config --global pull.rebase true
    
    git config --global fetch.prune true
    
    git config --global diff.colorMoved zebra
    
    git config --global alias.co checkout
    
    git config --global alias.br branch
    
    git config --global alias.ci commit
    
    git config --global alias.st status
    
    git config --global alias.lg "log --oneline --graph --decorate --all"
    
    git config --global core.excludesfile ~/.gitignore_global
    
    

    A global `.gitignore` prevents committing common OS and editor files:


    
    # ~/.gitignore_global
    
    .DS_Store
    
    Thumbs.db
    
    *.swp
    
    *.swo
    
    *~
    
    .vscode/
    
    .idea/
    
    *.log
    
    .env.local
    
    

    Package Managers


    Install language-specific package managers:


    
    # Node.js (via nvm for version management)
    
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
    
    nvm install --lts
    
    nvm use --lts
    
    
    
    # Python
    
    sudo apt install python3 python3-pip python3-venv
    
    
    
    # Rust
    
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
    
    
    # Go
    
    wget https://go.dev/dl/go1.22.linux-amd64.tar.gz
    
    sudo tar -C /usr/local -xzf go1.22.linux-amd64.tar.gz
    
    

    Use version managers (`nvm`, `pyenv`, `rbenv`, `sdkman`) to manage multiple language versions.


    Editor Setup


    VS Code is the most popular editor for good reason. Essential extensions:


    
    # Install via CLI
    
    code --install-extension ms-python.python
    
    code --install-extension dbaeumer.vscode-eslint
    
    code --install-extension esbenp.prettier-vscode
    
    code --install-extension github.copilot
    
    code --install-extension bierner.markdown-mermaid
    
    code --install-extension eamodio.gitlens
    
    code --install-extension ms-azuretools.vscode-docker
    
    code --install-extension streetsidesoftware.code-spell-checker
    
    

    Settings to consider:


    
    {
    
      "editor.formatOnSave": true,
    
      "editor.defaultFormatter": "esbenp.prettier-vscode",
    
      "editor.minimap.enabled": false,
    
      "editor.fontSize": 14,
    
      "editor.fontFamily": "'JetBrains Mono', 'Fira Code', monospace",
    
      "editor.fontLigatures": true,
    
      "editor.cursorBlinking": "smooth",
    
      "files.autoSave": "onFocusChange",
    
      "workbench.colorTheme": "One Dark Pro",
    
      "terminal.integrated.fontFamily": "JetBrains Mono",
    
      "git.autofetch": true
    
    }
    
    

    Docker Setup


    Docker is essential for local development consistency:


    
    # Ubuntu
    
    sudo apt install docker.io docker-compose-v2
    
    sudo usermod -aG docker $USER  # Log out and back in
    
    
    
    # macOS
    
    brew install --cask docker
    
    

    Create a development Docker Compose file for your project's dependencies:


    
    # dev-dependencies.yml
    
    services:
    
      postgres:
    
        image: postgres:16-alpine
    
        ports: ["5432:5432"]
    
        environment:
    
          POSTGRES_DB: myapp_dev
    
          POSTGRES_PASSWORD: devpassword
    
        volumes:
    
          - pgdata:/var/lib/postgresql/data
    
    
    
      redis:
    
        image: redis:7-alpine
    
        ports: ["6379:6379"]
    
    
    
    volumes:
    
      pgdata:
    
    

    Local HTTPS with mkcert


    Test HTTPS locally:


    
    brew install mkcert  # or sudo apt install mkcert
    
    mkcert -install
    
    mkcert localhost 127.0.0.1 ::1
    
    

    This creates locally trusted TLS certificates for development.


    Dotfiles Management


    Store your configuration in a Git repository:


    
    git init --bare $HOME/.dotfiles
    
    alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
    
    config remote add origin https://github.com/you/dotfiles.git
    
    config add ~/.zshrc ~/.gitconfig ~/.vimrc
    
    config commit -m "Initial dotfiles"
    
    config push
    
    

    Restore on a new machine:


    
    git clone --bare https://github.com/you/dotfiles.git $HOME/.dotfiles
    
    alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
    
    config checkout
    
    

    Containerized Development with Dev Containers


    VS Code Dev Containers package the entire development environment:


    
    // .devcontainer/devcontainer.json
    
    {
    
      "name": "My Project",
    
      "image": "mcr.microsoft.com/devcontainers/typescript-node:22",
    
      "features": {
    
        "ghcr.io/devcontainers/features/docker-in-docker:2": {}
    
      },
    
      "postCreateCommand": "npm install",
    
      "forwardPorts": [3000],
    
      "customizations": {
    
        "vscode": {
    
          "extensions": ["dbaeumer.vscode-eslint"]
    
        }
    
      }
    
    }
    
    

    Every developer gets identical tools regardless of their host OS.


    Summary


    A productive developer environment is personal, but some investments benefit everyone: a modern shell with autosuggestions, a well-configured editor with formatting on save, Docker for reproducible dependencies, and dotfiles versioned in Git. The initial setup takes an afternoon, but the time saved over a career is immense. Start with the basics -- shell, Git, editor, and Docker -- then add specialized tools as your workflow requires them.