{"id":2467,"date":"2026-10-18T20:00:00","date_gmt":"2026-10-18T20:00:00","guid":{"rendered":"https:\/\/www.bhopalorbit.com\/blog\/?p=2467"},"modified":"2026-10-18T20:00:00","modified_gmt":"2026-10-18T20:00:00","slug":"devops-90-day-ticketing-plan","status":"publish","type":"post","link":"https:\/\/www.bhopalorbit.com\/blog\/devops-90-day-ticketing-plan\/","title":{"rendered":"How We Learned DevOps: A Small Team&#8217;s 90 Days"},"content":{"rendered":"<p>The night our booking page fell over, it rained hard enough to drum on the office shutter. A folk-festival on-sale opened at nine, traffic arrived at 9:01, and by 9:04 our three-person team was watching an error page where the ticket button used to be. We fixed it by midnight. We also decided, somewhere between the second chai and the third, that we would rather never repeat the evening. That decision is how we came to learn DevOps properly, in ninety days, on a budget that would not frighten a street food stall.<\/p>\n<h2>Step One: Watch the Work Before Changing It<\/h2>\n<p>Our first week produced no code at all. We drew the journey of a single feature \u2014 &#8220;add a seating map&#8221; \u2014 on the wall, from idea to the moment a customer clicked pay. The picture was humiliating. Roughly four days of actual work sat spread across five weeks of waiting: waiting for review, waiting for a deploy window, waiting for whoever held the server passwords to be awake. Nobody had been lazy. The system had been patient. Seeing the waits on paper, with numbers beside them, ended every argument about where to start.<\/p>\n<p>A tip for anyone repeating the exercise: time the waits yourself instead of estimating them from memory. Our estimates were flattering by half, and the real numbers \u2014 captured with a stopwatch and some honest ticket notes \u2014 bought us credibility with the coach from the very first meeting. Measurement before persuasion; it is the same instinct that later made our audit folder easy.<\/p>\n<h2>Step Two: Protect One Stream and One Coach<\/h2>\n<p>We had exactly one product worth protecting: checkout and ticketing. So that became our stream, and we hired an enabling coach for one quarter rather than &#8220;doing a transformation&#8221;. She made us sign something I initially found dramatic \u2014 an agreement that output would dip for several weeks while automation raised our testing bar, and that nobody would panic about the dip before an agreed date. She was right to insist. The J-curve is real; week four tested us precisely as promised, and the pre-agreed date is the only reason we did not pull the plug.<\/p>\n<h2>Step Three: Build Once, Promote Everywhere<\/h2>\n<p>Until then, each of us built the app slightly differently, which meant staging tested an artefact production had never seen. Week three fixed that permanently: one pipeline, run the same way every time, producing one build that travels forward through every environment without being rebuilt. Then we attacked feedback speed. Any commit had to get an answer \u2014 pass or fail \u2014 in about ten minutes. When a check pushed past that, we shortened the check rather than accepted the wait. Fast answers keep a three-person team honest; slow ones teach you to batch, and batching is how Fridays get dangerous.<\/p>\n<h2>Step Four: Rehearse the Rollback Until It Is Boring<\/h2>\n<p>The rain-night recovery had taken us three hours, much of it spent remembering how. Our coach made us script the sequence \u2014 declare the deployment ID and an owner, check whether an irreversible database step had run, roll back if safe or switch the feature off if not \u2014 and then practise it on the calendar, monthly, with a stopwatch. Our first timed drill was slow. The third was quicker than our original real emergency by an order of magnitude, which is the professional way of saying the drill now finishes in the time it takes the kettle to boil. Every incident since has ended in a no-blame review inside five working days, pointed at systems rather than people.<\/p>\n<h2>Step Five: Let Releases Arrive in Stages<\/h2>\n<p>We stopped saving work up. Small changes merge into one shared trunk daily \u2014 no more feature branches ageing like pickle \u2014 and anything user-facing ships behind a flag so it can sit dark in production until we choose. Riskier changes go out first to a sliver of traffic as a canary. The seating map spent two weeks invisible to customers while we poked it in staging, then flipped on for real one quiet Tuesday without a single ticket of drama.<\/p>\n<h2>Our DevOps Rules, Written Down and Handed Over<\/h2>\n<p>Phase three of the quarter was governance, which sounded corporate until we saw it was mostly house rules. Access became least-privilege; credentials became short-lived tokens issued through OIDC instead of a shared password in a group chat. A break-glass merge path exists for genuine emergencies and announces itself loudly when used. Each quarter we pull roughly ten random changes and check their evidence end to end \u2014 fifteen minutes each, and the audit folder writes itself. Reference material kept us honest throughout; the coach pointed us at <a href=\"https:\/\/www.xopsschool.com\/devops\/\">the Ops Atlas DevOps explainer<\/a> so our arguments were about trade-offs, never definitions.<\/p>\n<h2>Step Seven: Keep the Numbers Where Everyone Sees Them<\/h2>\n<p>The last habit cost nothing and changed our arguments. The five delivery measures went on a whiteboard beside the kettle, updated every Monday:<\/p>\n<ul>\n<li>Lead time \u2014 the wait from finished change to live.<\/li>\n<li>Shipping frequency \u2014 deploys per week.<\/li>\n<li>Restore speed \u2014 minutes to bounce back.<\/li>\n<li>Failure share \u2014 releases that caused trouble.<\/li>\n<li>Rework \u2014 the figure researchers added in 2024 for effort spent redoing failed changes.<\/li>\n<\/ul>\n<p>Decisions stopped being about opinions once the board was in eyeshot; when someone proposed a clever shortcut, someone else only had to point at it. Recovery, we learned, counts only change-caused failures these days, which suited us fine since that was exactly the thing our drills were improving. A shared spreadsheet would have worked just as well. The location mattered more than the format: numbers nobody walks past are numbers nobody uses.<\/p>\n<h2>What the DevOps Quarter Gave Us<\/h2>\n<p>The next festival on-sale came and went while we watched, unemployed by drama. Releases that once needed a committee now happen several times a week, each one small enough to reverse before the kettle boils. The waits we mapped in week one have mostly been designed out, and the second team in our building \u2014 a logistics side project \u2014 has adopted the same rules without a coach, which is the real test of whether we learned anything.<\/p>\n<p>If you want a structured version of the path we stumbled along, <a href=\"https:\/\/www.bhopalorbit.com\/blog\/devopsschool-career-path-learn-practice-build-skills-and-grow\/\">this DevOps career guide covering learning, practice, and building skills<\/a> is the tidy map, and <a href=\"https:\/\/www.bhopalorbit.com\/blog\/devops-training-for-companies-moving-toward-agile-it-operations\/\">the piece on DevOps training for companies moving toward agile IT operations<\/a> describes our quarter from the employer&#8217;s side of the table. For the monitoring layer we added afterwards, <a href=\"https:\/\/www.bhopalorbit.com\/blog\/your-complete-guide-to-mastering-modern-site-reliability-engineering\/\">this guide to mastering modern site reliability engineering<\/a> picks up exactly where our story stops.<\/p>\n<p>Ninety days cost us a coach, some pride, and six weeks of slower output. It bought back every night since.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seven steps a three-person ticketing team took in one quarter \u2014 value stream first, one pipeline, rehearsed rollbacks \u2014 told as a working story rather than a manual.<\/p>\n","protected":false},"author":7,"featured_media":2468,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3708],"tags":[],"class_list":["post-2467","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/posts\/2467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/comments?post=2467"}],"version-history":[{"count":1,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/posts\/2467\/revisions"}],"predecessor-version":[{"id":2479,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/posts\/2467\/revisions\/2479"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/media\/2468"}],"wp:attachment":[{"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/media?parent=2467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/categories?post=2467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bhopalorbit.com\/blog\/wp-json\/wp\/v2\/tags?post=2467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}