"A good tool improves the way you work. A great tool improves the way you think." — Jeff Atwood
Tool Categories Overview
Core Development
flowchart LR
subgraph VCS [Version Control]
Git[Git]
GitHub[GitHub/GitLab/Bitbucket]
gh[GitHub CLI]
end
subgraph IDE [IDE/Editor]
VSCode[VS Code]
Cursor[Cursor]
JetBrains[JetBrains Suite]
Neovim[Neovim]
end
subgraph Build [Build/Task]
Make[Make/Just/Task]
Bazel[Bazel/Nx/Turborepo]
end
subgraph Pkg [Package/Dep]
PythonPkg[uv/pip/poetry]
JSPkg[pnpm/npm/yarn]
Cargo[Cargo]
GoMod[Go modules]
JavaBuild[Maven/Gradle]
NuGet[NuGet]
end
Code Quality & Testing
flowchart LR
subgraph Quality [Code Quality]
PythonLint[Ruff/Black/mypy]
JSLint[Biome/ESLint/Prettier]
GoLint[golangci-lint/clippy]
Generic[SonarQube/Semgrep]
end
subgraph Testing [Testing]
UnitTest[pytest/Jest/Vitest/JUnit]
E2E[Playwright/Cypress]
Containers[Testcontainers]
PBT[Hypothesis/fast-check/jqwik]
Mutation[mutmut/Stryker/PITest]
end
CI/CD & Observability
flowchart LR
subgraph CICD [CI/CD]
GHA[GitHub Actions]
GitLab[GitLab CI]
CircleCI[CircleCI]
ArgoCD[ArgoCD/Flux]
end
subgraph Obs [Observability]
Metrics[Prometheus/Grafana]
Logs[Loki]
Traces[Tempo/Jaeger]
OTel[OpenTelemetry]
end
Infrastructure & Security
flowchart LR
subgraph Infra [Infrastructure]
TF[Terraform/OpenTofu]
Pulumi[Pulumi]
Crossplane[Crossplane]
Ansible[Ansible]
end
subgraph C8s [Container/K8s]
Docker[Docker/Podman]
Build[Buildah/Kaniko]
K8sTools[kubectl/helm/k9s]
end
subgraph Security [Security]
Scan[Trivy/Grype/Syft]
Signing[cosign]
Policy[OPA/Kyverno]
end
Documentation & Collaboration
flowchart LR
subgraph Docs [Documentation]
MkDocs[MkDocs]
OpenAPI[OpenAPI/AsyncAPI]
end
subgraph Collab [Collaboration]
Issues[GitHub/GitLab/Linear]
Wiki[Notion/Obsidian]
Diagram[Excalidraw]
end
// Pulumi Java example
import com.pulumi.Pulumi;
import com.pulumi.aws.s3.Bucket;
import com.pulumi.aws.s3.BucketArgs;
import com.pulumi.aws.s3.inputs.BucketVersioningArgs;
public class MyStack {
public static void main(String[] args) {
Pulumi.run(ctx -> {
var bucket = new Bucket("my-bucket", BucketArgs.builder()
.versioning(BucketVersioningArgs.builder().enabled(true).build())
.serverSideEncryptionConfiguration(List.of(
BucketServerSideEncryptionConfigurationArgs.builder()
.rule(BucketServerSideEncryptionRuleArgs.builder()
.applyServerSideEncryptionByDefault(
ServerSideEncryptionByDefaultArgs.builder()
.sseAlgorithm("AES256")
.build())
.build())
))
.build());
});
}
}
// Pulumi C# Example
using Pulumi;
using Pulumi.Aws.S3;
class MyStack : Stack
{
public MyStack()
{
var bucket = new Bucket("my-bucket", new BucketArgs
{
Versioning = new BucketVersioningArgs { Enabled = true },
ServerSideEncryptionConfiguration = new[]
{
new BucketServerSideEncryptionConfigurationArgs
{
Rule = new BucketServerSideEncryptionRuleArgs
{
ApplyServerSideEncryptionByDefault =
new ServerSideEncryptionByDefaultArgs
{
SseAlgorithm = "AES256"
}
}
}
}
});
}
}
// OpenTelemetry C++
#include <opentelemetry/trace/provider.h>
#include <opentelemetry/exporters/otlp/otlp_http_exporter_factory.h>
#include <opentelemetry/sdk/trace/simple_processor_factory.h>
#include <opentelemetry/sdk/trace/tracer_provider_factory.h>
using namespace opentelemetry::trace;
using namespace opentelemetry::sdk::trace;
using namespace opentelemetry::exporter::otlp;
void InitTracer() {
auto exporter = OtlpHttpExporterFactory::Create(OtlpHttpExporterOptions{
.endpoint = "http://localhost:4317/v1/traces"
});
auto processor = SimpleSpanProcessorFactory::Create(std::move(exporter));
auto provider = TracerProviderFactory::Create(std::move(processor));
Provider::SetTracerProvider(provider);
}
auto tracer = trace::Provider::GetTracerProvider()->GetTracer("my-service");
Money calculate_discount(Customer customer, Cart cart) {
auto span = tracer->StartSpan("calculate_discount");
auto scope = opentelemetry::trace::Scope(span);
span->SetAttribute("customer.tier", customer.tier);
span->SetAttribute("cart.total", cart.total());
// ... logic
}
// OpenTelemetry Java
import io.opentelemetry.api.trace.*;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.trace.*;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
public class TracingConfig {
public static void init() {
var exporter = OtlpGrpcSpanExporter.builder()
.setEndpoint("http://localhost:4317")
.build();
var processor = BatchSpanProcessor.builder(exporter).build();
var provider = SdkTracerProvider.builder()
.addSpanProcessor(processor)
.build();
GlobalOpenTelemetry.resetFor(
OpenTelemetrySdk.builder()
.setTracerProvider(provider)
.buildAndRegisterGlobal()
);
}
}
// Usage
Tracer tracer = GlobalOpenTelemetry.getTracer("my-service");
@WithSpan("calculate_discount")
public Money calculateDiscount(Customer customer, Cart cart) {
Span span = Span.current();
span.setAttribute("customer.tier", customer.getTier());
span.setAttribute("cart.total", cart.getTotal());
// ... logic
}
// OpenTelemetry .NET
using OpenTelemetry;
using OpenTelemetry.Trace;
using OpenTelemetry.Exporter.OpenTelemetryProtocol;
using OpenTelemetry.Resources;
using OpenTelemetry.Instrumentation.AspNetCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry()
.WithTracing(builder => builder
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddSource("MyApp")
.SetResourceBuilder(ResourceBuilder.CreateDefault()
.AddService("MyApp"))
.AddOtlpExporter(options => {
options.Endpoint = new Uri("http://localhost:4317");
})
);
// Usage
var tracer = TracerProvider.Default.GetTracer("MyApp");
using var span = tracer.StartActiveSpan("calculate_discount");
span.SetAttribute("customer.tier", customer.Tier);
span.SetAttribute("cart.total", cart.Total);
// ... logic
# Ruby instrumentation
# gem install opentelemetry-sdk opentelemetry-exporter-otlp \
# opentelemetry-instrumentation-all
require "opentelemetry/sdk"
require "opentelemetry/instrumentation/all"
OpenTelemetry::SDK.configure do |c|
c.service_name = "pricing-service"
c.use_all # auto-instrument every supported library
end
# Manual instrumentation for business logic
TRACER = OpenTelemetry.tracer_provider.tracer("pricing")
def calculate_discount(customer, cart)
TRACER.in_span("calculate_discount") do |span|
span.set_attribute("customer.tier", customer.tier)
span.set_attribute("cart.total", cart.total.to_f)
# ... logic
end
end
Local Development Environments
Tool
Approach
Best For
Docker Compose
Declarative services
Simple multi-service apps
Dev Containers
VS Code extension
Consistent team envs
Tilt
Live update + smart rebuild
Microservices dev loop
Skaffold
Build→deploy→port-forward
K8s-native dev
Garden
Stack graph + smart sync
Complex multi-env
Nix + direnv
Reproducible builds
Polyglot, hermetic
Architecture Decision Records (ADRs)
An ADR is a Markdown document recording a decision and its rationale — it has no programming language of its own, and reads identically no matter what the project it documents happens to be written in:
# docs/adr/001-use-postgresql.md
## Title: Use PostgreSQL as Primary Datastore
## Status: Accepted
## Context
We need a relational database for transactional data with complex queries.
## Decision
Use PostgreSQL 16+ with connection pooling (PgBouncer).
## Consequences
- ✅ ACID, rich data types, JSONB, full-text search
- ✅ Mature ecosystem, team familiarity
- ⚠️ Operational overhead (backups, vacuum, monitoring)
- ⚠️ Horizontal scaling requires read replicas/sharding
## Alternatives Considered
- MySQL — less advanced indexing, no JSONB parity
- CockroachDB — distributed SQL, higher latency
- DynamoDB — NoSQL, different access patterns
OpenTelemetry + Prometheus + Grafana + Tempo + Loki
CI/CD
GitHub Actions / GitLab CI / Buildkite + ArgoCD
Security
Trivy + Trivy + Cosign + OPA + Renovate
Package
uv / pnpm / Cargo / go mod / Maven / NuGet
Containers
Docker / Buildah / Kaniko / Podman
Docs
mkdocs / TypeDoc / cargo doc / docfx
Collab
GitHub/GitLab + Linear + Excalidraw + Mermaid
Philosophy: "The best tool is the one your team actually uses consistently." — Choose tools that reduce cognitive load, integrate well, and have active communities. Standardise on a core stack, but allow exceptions with architectural review.