Why Corporate SDLC Is Broken and What the Workflow Actually Looks Like
You already know how to build things. Let me show you why the process keeps stopping you.
I’m a self-taught senior staff engineer with 27 years of building things. Web apps, mobile platforms, recording studios, motion capture software, self-hosted infrastructure. I’ve worked inside corporate machines big enough to have a VP of PowerPoints and a Jira administrator who doesn’t write code.
I’ve watched a two-day feature become a six-month roadmap item. I’ve sat in sprint planning where nobody in the room could explain what the sprint was actually for. I’ve filed tickets for tickets. I’ve waited three weeks for environment access so I could fix a bug that took 45 minutes to actually fix.
And I’ve also shipped things alone — from napkin to production — in days.
This is the article about the gap between those two experiences. What breaks corporate SDLC, why it breaks that way, and what a no-bullshit workflow from idea to product actually looks like when you’re close to the metal and not worried about whose cloud contract is getting renewed next quarter.
What Corporate SDLC Actually Is
SDLC stands for Software Development Lifecycle. In theory, it’s the end-to-end process of taking an idea from conception to deployed, maintained software. In practice, at most large companies, it’s a system that has optimized for one thing: distributing blame.
Not shipping product. Not serving users. Not moving fast. Distributing blame.
Every gate, every approval, every required sign-off, every mandatory review board exists to ensure that when something goes wrong — and something always goes wrong — no single person or team can be held responsible. The process is the alibi.
This produces a specific shape of dysfunction that you’ll recognize instantly if you’ve worked inside it.
The Seven Ways Corporate SDLC Kills Velocity
1. Requirements by committee.
A product idea enters a room of stakeholders. Everyone has opinions. Everyone has edge cases. Everyone has compliance concerns. Nobody has authority to make a decision unilaterally, so the requirements document grows until it contains every possible interpretation of the original idea simultaneously.
By the time development starts, the feature has been designed by ten people who will never use it, for users nobody in the room has talked to recently, to solve a problem that may have already changed.
You’re not building the idea anymore. You’re building the political settlement.
2. Estimation theater.
Someone who doesn’t write code asks engineers to estimate work they don’t fully understand yet, in story points that will be converted to calendar dates that will be treated as commitments that will be used to measure performance.
Estimates become sandbagged because engineers learn that accurate estimates get held against them. So estimates inflate. Velocity metrics drop. Management responds by adding more process to improve velocity. Velocity drops further.
The estimates were never the problem. The accountability structure around them was.
3. The sprint that isn’t.
Agile says two-week sprints, working software every cycle, adapt based on feedback. Corporate Agile says: two-week sprints, sixty-minute daily standups where seven people report status to each other, sprint reviews where nobody from the business is present to give actual feedback, and a backlog that hasn’t been touched since Q1.
The ceremonies remain. The values that gave the ceremonies meaning were stripped out during the “Agile transformation” that cost $2M and was run by a consulting firm that has never shipped software.
4. Environment hell.
You need a development environment. That requires a ticket. The ticket routes to IT. IT has a 10-day SLA. Your dev environment is a slightly different version of the staging environment, which is a significantly different version of production, which nobody can access directly because of a compliance requirement from 2017 that may no longer apply.
You find the bug in dev. It doesn’t reproduce in staging. It explodes in production. You can’t debug production. You file a ticket for production access. The ticket requires VP approval.
The bug is still there.
5. Cloud complexity as a cargo cult.
Somewhere along the way, the company adopted a cloud-native architecture not because the engineering problems demanded it but because the vendor gave a compelling conference talk and the CTO wanted to put “AWS” in the annual report.
Now you have Kubernetes clusters managing three containers that could run on a $10 VPS. You have Lambda functions with 50ms cold starts serving internal tooling used by 12 people. You have a data pipeline that costs $40,000/month to process data a PostgreSQL query would handle in 200 milliseconds.
The complexity isn’t solving engineering problems. It’s solving vendor relationship problems. And it’s your codebase that carries the weight.
6. The handoff tax.
Design hands off to frontend. Frontend hands off to backend. Backend hands off to DevOps. DevOps hands off to QA. QA hands off to product for sign-off. Product hands off to release management for deployment approval.
Each handoff costs context. Each context switch costs time. Each waiting period costs momentum. By the time the feature reaches production, the engineer who understood the full problem has moved on to three other tickets and can’t remember why that conditional exists.
The code reflects the org chart. Always. Conway’s Law isn’t a suggestion.
7. Meetings about meetings.
The planning meeting to plan the planning meeting. The retro about the retro format. The kickoff for the kickoff. The alignment meeting before the decision-making meeting.
Time spent in meetings is time not spent building. In most large engineering orgs, senior engineers spend more time in meetings than in their editor. The people with the most context spend the least time using it.
Why It Happens: The Real Answer
Corporate SDLC doesn’t emerge from stupidity. It emerges from incentives.
Individual contributors are measured on process compliance, not outcomes. So they comply with the process. Managers are measured on team utilization and sprint velocity, not shipped value. So they maximize utilization and protect velocity metrics. Directors are measured on roadmap delivery, not user impact. So they protect the roadmap.
Nobody in the chain is measured on “did we build the right thing fast enough to matter?” So nobody optimizes for that.
The process is a local optimum for everyone’s individual incentive while being a global disaster for the actual goal.
Add to this: the larger the organization, the more the cost of a mistake is visible and attributable, while the cost of slowness is diffuse and invisible. Shipping the wrong thing gets you in a meeting. Being slow gets you a “we’re working through some process improvements” in the all-hands.
Slowness is the rational choice under these incentives. Every gate is rational for the person who built it. The aggregate effect is a machine that cannot move.
The Actual Workflow: From Idea to Product
Here’s what building without the weight looks like. Not a methodology with a trademark. Not a framework you hire a consultant to install. Just the minimum viable process that gets ideas into production with quality and without theater.
This is the workflow for engineers who build things — solo, in small teams, or inside larger orgs where you’ve found enough autonomy to work this way.
Phase 0: Idea → Decision (One Sitting)
Write down what you’re building in two sentences. If you can’t, the idea isn’t ready. If you can, write three more things: who it’s for, what problem it solves, and how you’ll know it worked.
That’s your requirements document. Fit it on a napkin. If it doesn’t fit on a napkin, you’re solving too many problems at once.
The check: Can you explain this to someone who will use it in under 60 seconds? If not, scope down until you can.
This is not an invitation to skip thinking. It’s an invitation to think precisely instead of extensively. The goal is a crisp decision: build this, skip that, do the smallest thing that proves the concept.
Phase 1: Local First, Always
Before you touch a cloud service, a staging server, or a deployment pipeline: run it locally. On your machine. With real data if possible. With a local database, a local queue, a local anything.
Local development is fast, free, immediate, and reversible. You can break things with no consequences. You can restart the whole environment in seconds. You can add a console.log anywhere without a deployment.
The FTC (Fun Time Coding) Stack principle: If it runs locally, it probably runs anywhere. Solve the problem first. Solve the infrastructure second. Most problems don’t need Kubernetes. Most problems need a process that works.
Local first means: Docker Compose for services, SQLite or local Postgres for data, environment variables in a .env file, everything committed to a local Git repo. No cloud account required. No IAM role to configure. No cold start to wait for.
Build the thing. Make it work. Then and only then think about where it lives.
Phase 2: Version Control Is Your Time Machine
Every change goes to Git. Not just big changes. Not just “finished” features. Every change. Commit small, commit often, write commit messages that explain why not what.
Your Git history is your project memory. When you come back to this codebase in six months — and you will — the diff between commits is the documentation. The commit message is the ticket. The branch name is the feature.
The self-hosted advantage: Gitea on your own hardware means your code never leaves your environment until you want it to. No GitHub dependency. No price-per-seat as you scale. No terms of service that change when Microsoft needs a quarterly number.
Branch per feature. Merge when it works. Tag your releases. That’s your whole branching strategy. Anything more complex is overhead for teams with coordination problems you don’t have.
Phase 3: CI/CD Is Your Build Server, Not Your Security Theater
Continuous integration means: every commit runs the tests. If the tests pass, the build is green. If the tests fail, you fix it before you move on.
Continuous deployment means: a green build deploys to the next environment automatically. No deploy meeting. No release manager. No change request ticket. Green means go.
Woodpecker CI on your own hardware means your pipeline is yours. No GitHub Actions minutes to budget. No CircleCI seat licenses. No “we need to get DevOps involved to add a pipeline step.” You write a .woodpecker.yml, push it, done.
Your pipeline should do exactly three things: lint, test, deploy. If it does more than that, ask why each additional step exists. Most of them exist because someone added them when something went wrong and nobody ever removed them when the underlying problem was fixed.
A build pipeline that takes 45 minutes is a tax on every commit. Optimize it like you optimize hot code paths — measure first, cut what’s slow, make the developer experience the metric.
Phase 4: Feature Flags Over Feature Branches
Long-lived feature branches are a coordination problem in code form. You’re building in isolation, the main branch is moving, and merge day is pain day.
Feature flags solve this. Ship the code. Gate it with a flag. Turn the flag on when it’s ready. Roll back by flipping the flag, not by reverting commits.
This is especially powerful for a solo developer or small team: you can deploy half-finished work to production safely, because nobody sees it until you flip the flag. Your production environment becomes your integration environment. Real data, real load, real behavior — but controlled exposure.
Feature flags don’t need a SaaS product. A boolean in your database and a config read at runtime is a feature flag. Start there. Add complexity only when you need it.
Phase 5: Shipping Is a Non-Event
The goal of a good deployment pipeline is to make shipping boring. Not exciting. Not an event. Not something that requires a deploy window at 2am when traffic is low.
If your deploy is scary, it’s because your deploy is too big or your rollback is too hard. The fix is smaller deploys and reliable rollback. Not a bigger change management process.
Small deploys: Ship one thing at a time. A commit that touches ten files across three features is three deploys that got bundled together. Unbundle them. Ship them separately. Each one is smaller, easier to understand, and easier to roll back if something breaks.
Reliable rollback: Your previous container image is your rollback. docker pull myapp:previous && docker-compose up -d is your incident response. If rollback takes more than five minutes, you’ve overcomplicated your deployment.
When deploy is a non-event, you ship more often. When you ship more often, each ship is smaller. When each ship is smaller, risk drops. This is the cycle that makes fast teams fast — not heroics, just small, frequent, boring deploys.
Phase 6: Observability, Not Dashboards
You need to know when something is broken. You don’t need a 47-panel Grafana dashboard that nobody reads.
Three things you actually need: logs you can search, a metric that tells you the system is alive, and an alert that wakes you up when it isn’t.
Logs you can search: Structured JSON logs, shipped to Loki or any log aggregator. When something breaks, you query the logs. You find the error. You fix it. No log search means debugging in the dark.
A liveness metric: Is the app responding? What’s response time? Are queues draining? One dashboard with five numbers, not fifty.
An alert that matters: If the app is down, you get paged. If a queue is backing up, you get paged. Everything else is noise. Alerts that fire constantly train you to ignore alerts. Ignore alerts long enough and you find out about the outage from a user.
The difference between observability and dashboards is: dashboards show you the system in a steady state. Observability lets you reconstruct what happened when it wasn’t. You build observability for the incident, not the all-hands.
Phase 7: Documentation Is a Decision Log
Documentation is not a spec written before the work. It’s not a README that describes a system that no longer works that way. It’s a log of decisions: what you built, why you built it that way, and what you explicitly decided not to build.
The most valuable documentation is the ADR — Architecture Decision Record. One page. The decision, the context, the alternatives you considered, and the reason you chose what you chose. Written when you make the decision, while the context is in your head.
Six months later when you come back and wonder why that service exists, the ADR tells you. Without the ADR, you reverse-engineer the decision from the code, get it wrong, and change something that was load-bearing for a reason you’ve forgotten.
Write ADRs for every non-obvious decision. Store them in the repo. Version them with the code. They’re the institutional memory that doesn’t evaporate when someone leaves.
The Stack That Supports This Workflow
This isn’t about specific tools. It’s about the philosophy: own your infrastructure, minimize dependencies, keep it local-first, and never let a vendor’s pricing model become a constraint on how you build.
Source control: Gitea, self-hosted. Your code, your server, your rules.
CI/CD: Woodpecker CI, self-hosted. Pipelines that run on your hardware, triggered by your commits.
Local development: Docker Compose. Everything the app needs, running locally, one command.
Database: PostgreSQL or SQLite. The database that’s been solving relational data problems for decades doesn’t need a cloud wrapper and a $300/month bill.
Secrets: Environment variables in dev, a secrets manager in prod. Never committed. Never hardcoded.
Deployment: Docker containers. Build once, run anywhere, roll back with a pull command.
Observability: Loki for logs, Grafana for metrics, Prometheus for collection, Wazuh for security. All self-hosted, all yours.
Hosting: A VPS or your own hardware. $6/month on Hetzner handles more traffic than most products will ever see in their first year.
None of this requires a cloud contract. None of it requires a vendor relationship. None of it has a usage-based billing surprise waiting for you when you go viral. You own the stack, you control the cost, you understand every piece.
The Real Question
Corporate SDLC isn’t broken by accident. It’s optimized — for risk distribution, for political cover, for vendor relationships, for the org chart. It’s just not optimized for shipping.
The question isn’t “how do we fix corporate SDLC?” That’s someone else’s battle, and it usually doesn’t go well for the engineer who tries to fight it from the inside.
The question is: given what you know, given what you control, given the hours outside the W-2 — what’s the minimum viable process that gets your idea into production this week?
Write it down in two sentences. Run it locally. Commit it to Git. Ship it small.
That’s the whole thing.
Constraints win.
Jason Walker is a senior staff engineer and solo builder with 27 years of experience. He’s building Loop Lock, the perfect A/V loop creator, and designing the standard of system design grammar. He runs his own infrastructure, owns his own stack, and writes about building things without the weight. Interested in the grammar? Email stonecassette@gmail.com with the subject “Interested in your system design grammar.” Follow the work at jsonwalker.com.