1 min read
Developer Productivity Tools and Practices for 2023
I wrote “Developer Productivity Tools and Practices for 2023” to share practical, production-minded guidance on this topic.
AI-Assisted Development
GitHub Copilot
The game-changer for code generation:
# With Copilot, you type comments and get code
# "Create a function that fetches data from an API with retry logic"
import aiohttp
import asyncio
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
async def fetch_with_retry(url: str, headers: dict = None) -> dict:
"""Fetch data from URL with automatic retry on failure."""
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as response:
response.raise_for_status()
return await response.json()
ChatGPT Integration
Beyond Copilot, ChatGPT helps with:
- Code explanation and review
- Documentation generation
- Debugging assistance
- Learning new concepts
IDE Optimization
VS Code Extensions
Essential productivity extensions:
{
"recommendations": [
"GitHub.copilot",
"ms-dotnettools.csharp",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"eamodio.gitlens",
"ms-azuretools.vscode-docker",
"hashicorp.terraform",
"redhat.vscode-yaml",
"streetsidesoftware.code-spell-checker",
"usernamehw.errorlens",
"christian-kohler.path-intellisense",
"formulahendry.auto-rename-tag",
"ms-vscode.live-server"
]
}
Keybindings for Speed
{
"key": "ctrl+shift+t",
"command": "workbench.action.terminal.toggleTerminal"
},
{
"key": "ctrl+shift+g",
"command": "workbench.view.scm"
},
{
"key": "ctrl+shift+e",
"command": "workbench.view.explorer"
},
{
"key": "ctrl+shift+f",
"command": "workbench.action.findInFiles"
},
{
"key": "ctrl+shift+p",
"command": "workbench.action.showCommands"
},
{
"key": "ctrl+`",
"command": "workbench.action.terminal.focus"
},
{
"key": "ctrl+shift+`",
"command": "workbench.action.terminal.new"
}
Workflow Automation
Git Hooks
#!/bin/bash
# .git/hooks/pre-commit
echo "Running pre-commit checks..."
# Format code
dotnet format --verify-no-changes
if [ $? -ne 0 ]; then
echo "Code formatting issues found. Run 'dotnet format' to fix."
exit 1
fi
# Run linter
dotnet build --no-restore -warnaserror
if [ $? -ne 0 ]; then
echo "Build warnings found."
exit 1
fi
# Run tests
dotnet test --no-build --filter "Category!=Integration"
if [ $? -ne 0 ]; then
echo "Tests failed."
exit 1
fi
echo "Pre-commit checks passed!"
Task Automation
// .vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Build and Test",
"type": "shell",
"command": "dotnet build && dotnet test",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$msCompile"
},
{
"label": "Start Docker Compose",
"type": "shell",
"command": "docker-compose up -d",
"problemMatcher": []
},
{
"label": "Run with Watch",
"type": "shell",
"command": "dotnet watch run",
"isBackground": true,
"problemMatcher": []
},
{
"label": "Generate API Client",
"type": "shell",
"command": "openapi-generator-cli generate -i ./openapi.yaml -g typescript-axios -o ./src/api",
"problemMatcher": []
}
]
}
CLI Power Tools
Modern CLI Alternatives
# Install modern CLI tools
# Instead of ls -> use exa
brew install exa
alias ls='exa --icons'
alias ll='exa -la --icons'
alias tree='exa --tree'
# Instead of cat -> use bat
brew install bat
alias cat='bat'
# Instead of find -> use fd
brew install fd
# fd pattern
# Instead of grep -> use ripgrep
brew install ripgrep
# rg pattern
# Better git log
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# fzf for fuzzy finding
brew install fzf
# ctrl+r for history search
# ctrl+t for file search
Shell Functions
# ~/.zshrc or ~/.bashrc
# Quick project navigation
function proj() {
cd ~/projects/$1
}
# Create and enter directory
function mkcd() {
mkdir -p "$1" && cd "$1"
}
# Git shortcuts
function gco() {
git checkout "$1"
}
function gp() {
git pull origin $(git branch --show-current)
}
function gpu() {
git push origin $(git branch --show-current)
}
# Docker cleanup
function docker-clean() {
docker system prune -af
docker volume prune -f
}
# Azure login with subscription selection
function azlogin() {
az login
az account list --output table
echo "Enter subscription name:"
read sub
az account set --subscription "$sub"
}
# Quick HTTP server
function serve() {
python3 -m http.server ${1:-8000}
}
Documentation as Code
ADR (Architecture Decision Records)
# ADR 001: Use Azure Cosmos DB for Order Storage
## Status
Accepted
## Context
We need a database for storing order data. Requirements:
- Global distribution (customers worldwide)
- Sub-10ms reads
- Handle 10,000 orders/minute at peak
- JSON document flexibility
## Decision
Use Azure Cosmos DB with SQL API.
## Consequences
### Positive
- Built-in global distribution
- Guaranteed <10ms reads at P99
- Automatic indexing
- Serverless option for dev/test
### Negative
- Higher cost than SQL for simple queries
- Different query syntax than SQL Server
- Team needs training
## Alternatives Considered
- Azure SQL: Good for transactional, but global distribution is complex
- MongoDB Atlas: Similar capabilities, but less Azure integration
Living Documentation
# docs/runbook.yaml
service: order-service
version: 2.1.0
alerts:
high_error_rate:
description: Error rate exceeds 1%
severity: P2
runbook: |
1. Check recent deployments: `kubectl rollout history deployment/order-service`
2. Check logs: `kubectl logs -l app=order-service --tail=100`
3. Check dependencies: CosmosDB, ServiceBus
4. If recent deployment, rollback: `kubectl rollout undo deployment/order-service`
5. Escalate to on-call if not resolved in 15 minutes
high_latency:
description: P95 latency exceeds 500ms
severity: P3
runbook: |
1. Check current load: Grafana dashboard
2. Check database query times
3. Scale if needed: `kubectl scale deployment/order-service --replicas=5`
4. Check for slow queries in Cosmos DB
dependencies:
- name: cosmos-db
type: database
health_check: https://order-service/health/cosmos
contact: data-team@company.com
- name: service-bus
type: messaging
health_check: https://order-service/health/servicebus
contact: platform-team@company.com
Time Management
Focus Blocks
# Schedule template for deep work
daily_schedule = {
"09:00-12:00": {
"type": "deep_work",
"rules": ["No meetings", "Notifications off", "Complex coding tasks"]
},
"12:00-13:00": {
"type": "break",
"rules": ["Lunch", "Walk", "No screens"]
},
"13:00-14:00": {
"type": "collaboration",
"rules": ["Code reviews", "Quick syncs", "Slack catchup"]
},
"14:00-16:00": {
"type": "deep_work",
"rules": ["Feature development", "Writing"]
},
"16:00-17:00": {
"type": "admin",
"rules": ["Email", "Planning", "Documentation"]
}
}
Measuring Productivity
productivity_metrics = {
"output_quality": {
"bugs_per_feature": "Track defects introduced",
"code_review_iterations": "Fewer is better",
"test_coverage": "Maintain threshold"
},
"velocity": {
"cycle_time": "Time from start to production",
"deployment_frequency": "How often you ship",
"pr_merge_time": "Time to review and merge"
},
"wellbeing": {
"focus_time_percentage": "Time in deep work",
"meeting_hours": "Keep under 20%",
"after_hours_work": "Minimize"
}
}
Conclusion
Developer productivity in 2023 will be defined by effective use of AI tools, automation of repetitive tasks, and intentional time management. The best developers aren’t just fast coders - they’re systems thinkers who optimize their entire workflow.