Skip to main content
Legacy Code Migration Roadmaps

Choosing Between a Big Bang and a Phased Migration Without Losing Your QA Sanity

Here's the thing about legacy code migrations: nobody ever says 'I wish we'd rushed this.' But deadlines don't care about your feelings. So you're stuck choosing between two brutal paths—Big Bang or Phased—and either way, QA is the one who pays if you get it wrong. I've watched teams burn out on both sides. The Big Bang promise of 'rip the band-aid off' sounds clean until your entire system goes dark for 48 hours. The Phased approach of 'move one module at a time' sounds safe until you're maintaining dual systems for six months. This article gives you the decision framework to choose without losing your QA team's sanity—or your own. Who Has to Make This Call—and When? Stakeholder pressure and deadline reality The call to migrate legacy code never arrives on a calm Tuesday when everyone has slack.

Here's the thing about legacy code migrations: nobody ever says 'I wish we'd rushed this.' But deadlines don't care about your feelings. So you're stuck choosing between two brutal paths—Big Bang or Phased—and either way, QA is the one who pays if you get it wrong.

I've watched teams burn out on both sides. The Big Bang promise of 'rip the band-aid off' sounds clean until your entire system goes dark for 48 hours. The Phased approach of 'move one module at a time' sounds safe until you're maintaining dual systems for six months. This article gives you the decision framework to choose without losing your QA team's sanity—or your own.

Who Has to Make This Call—and When?

Stakeholder pressure and deadline reality

The call to migrate legacy code never arrives on a calm Tuesday when everyone has slack. It lands when a compliance deadline is six weeks out, or a customer has threatened to leave unless the platform stops crashing at peak load. I have watched teams burn three sprints arguing about approach while the business sponsor stands in the doorway asking, 'Can we just cut over next Friday?'—and that pressure is real. Stakeholders don't care whether you prefer Strangler Fig or parallel run; they care about the date the old system stops costing money. The moment someone says 'by end of quarter,' you're no longer choosing a migration strategy in a vacuum. You're choosing which risks you can accept given a fixed calendar.

That sounds fine until you realise the same person who set the deadline will also be the first to scream when a data seam blows out at 3 AM. The catch is that stakeholder pressure rarely comes with a corresponding interest in rollback budgets or testing windows. So identify who actually signs the go-live approval before you weigh technical elegance. Wrong order means you build a phased plan that gets overruled by a Big Bang directive from the CFO on a Tuesday afternoon.

Every migration plan is a negotiation about time, trust, and who sleeps through the night.

— lead architect at a fintech, after a post-mortem I sat in

Team size and skill distribution

Four developers with ten years each on the monolith? A Big Bang might work—they know where every body is buried. But a team of six people where two joined last month and three are contractors? That team doesn't have the cognitive surface area to handle an overnight cutover. The hidden factor is not just headcount; it's how many people can actually undo a failed deployment at 2 AM without waking the SRE lead. I have seen teams with twenty engineers flail on a phased migration because only two understood the database sharding logic. Meanwhile, a four-person crew executed a clean Big Bang because they had written the entire core module themselves. Team composition dictates viable options more than any architecture diagram does. Ignore it and you will be debugging a production incident with the only guy who knows the ORM mappings—while he is on vacation.

Most teams skip this: map your 'bus factor' per service before you choose a migration pattern. If any three services depend on one person's undocumented knowledge, you can't move those services separately in a phased rollout. You must either document first—which adds weeks—or accept the blast radius of a Big Bang where nothing critical depends on a single human memory.

System complexity and coupling

A standalone CRM with its own database and an REST API? Phased migration is almost trivial. A monolith where the billing engine shares a schema with inventory and the session cache lives in a shared Redis cluster? That's a different beast entirely. The coupling graph of your system—not your org chart, not your aspirational architecture—determines whether a phased approach is a controlled rollout or a death by a thousand micro-cuts. When I consult on these roadmaps, the first thing I ask for is a runtime dependency map. Teams that skip this exercise often discover on migration day that 'independent' phase 1 actually touches authentication tables in phase 3's database. That discovery typically happens during a rollback at midnight, with the VP of engineering on the phone.

The trick is to not just draw arrows between services—measure actual runtime coupling. How many calls per minute cross service boundaries? Do you have synchronous dependencies that time out if decoupled even for a millisecond? A phased migration assumes you can draw clean lines between old and new. If your system is a plate of wet spaghetti, those lines don't exist. You either invest weeks in strangulation refactoring first (which is itself a mini-migration) or you accept that Big Bang is the honest answer. Painful but honest beats optimistic and bankrupt.

The Three Migration Options (No, There's Not Just Two)

Big Bang: All-at-once cutover

You flip a switch. One weekend—maybe a long one—and the old system goes dark. The new platform takes every request, every transaction, every user session from that Monday morning forward. I have seen teams pull this off exactly twice without a war room forming by Wednesday. The appeal is obvious: one migration, one rollback plan, one painful stretch of weekends. The catch is that you're betting the entire business on a single cutover window. If something breaks—a payment gateway that behaves differently under production load, a stored procedure that only fails when data volume hits noon—your entire user base finds it simultaneously. Quick reality check: rollback after a Big Bang means restoring yesterday's backups, re-routing DNS, and explaining to stakeholders why Monday is a write-off. That sounds fine until the backup restore itself takes six hours and the data gap becomes a legal problem.

Phased: Incremental module swaps

You carve the monolith into pieces—billing first, then user management, then inventory. Each slice gets its own deploy, its own test cycle, its own canary audience. The tricky bit is that phased doesn't mean simple. Teams who pick this path often underestimate the wiring cost between old and new modules. Your user table lives in the legacy database while orders flow through a new service—how do you join them without building a sync layer that lives longer than the migration itself? Most teams skip this: they assume the two systems can coexist with a few API calls, then discover that session tokens, audit logs, and reporting queries all need dual paths. The risk is architectural debt, not a blown weekend. The upside? You can pause between phases. When a phase breaks, three hundred users feel it, not thirty thousand. We fixed a scheduling disaster once by freezing phase two for a sprint and letting the QA team actually sleep before the next cut.

Parallel run: Hybrid with dual write

Both systems run simultaneously. Every write—every order, every profile update, every inventory adjustment—hits both the legacy database and the new platform. Reads come from whichever system returns first, or from the legacy system exclusively until confidence builds. This is not a separate category in every textbook, but it should be. The cost? You double your infrastructure, your data consistency checks, and your operational toil. The benefit? You never truly cut over—you shift traffic in fractions of a percent. One percent, then five, then twenty. Rollback means dialing the percentage back to zero, not restoring from tape. However, parallel run introduces its own nightmare: drift. The legacy system processes a refund one way; the new system calculates it slightly differently. Over a week, those differences compound into reconciliation spreadsheets that no single human understands. A colleague once called it "paying with your brain instead of your calendar"—you trade a high-stakes weekend for months of monitoring dashboards and gnarly data-diff queries.

'The teams that succeed at parallel run are the ones who automate the comparison, not the switch.'

— delivery lead, after three months of dual-write production

Odd bit about development: the dull step fails first.

What Criteria Should Drive Your Choice?

Risk Appetite and Rollback Difficulty

Let’s be honest—most teams overestimate their willingness to pull a kill switch. I have seen a CTO green-light a Big Bang because “we’re agile people, we commit,” only to freeze mid-migration when the first 10,000 transactions failed silently. Rollback isn’t just a button; it’s a bet on your schema being reversible. Ask yourself: can you restore yesterday’s state without a five-hour data rebuild? If the answer is “we’re not sure,” your risk appetite is lower than you think. Phased migrations let you keep both feet on the ground—one old hammer still swinging while the new chisel takes its first cuts. The catch is: partial rollbacks cost more in coordination than any single undo script.

‘A migration plan without a rollback that takes under two hours is not a plan — it’s a wish.’

— lead engineer, after a 14-hour restore that didn’t fully work

Data Consistency Requirements

Nothing shatters QA sanity faster than a “mostly consistent” dataset. If your system demands immediate referential integrity across the board—financial ledgers, inventory counts, medical records—Big Bang might feel like the cleaner answer. Right? Wrong. I have watched a phased migration tear a transaction chain into two realities: orders logged in the new system but fulfillment still reading the old warehouse table. That’s not a seam; that’s a bleed. The trick is identifying which entities can tolerate a brief drift. Sessions? Customer profiles? Probably fine for a few hours. Payment authorizations? You patch those live or you lose the next quarter’s retention.

Here’s the brutal truth: every dual-write adapter introduces a failure path the original code never had. That’s not a knock on phased migration—it’s a demand that you map data lineage before you touch a single production record. Most teams skip this: they test sync, not semantic drift. Two databases can agree on a row count and still produce different customer-facing answers.

Team Bandwidth and Expertise

You can't do a phased migration with three junior engineers and a Friday afternoon deadline. I have seen that movie. The ending: six weeks of sync fires, one resignation, and a monorepo nobody wants to touch. Phased strategies require continuous context-switching—you’re maintaining two code paths, two monitoring dashboards, and two sets of deployment scripts. That burns energy. Big Bang, paradoxically, demands deep preparation but shallow ongoing overhead: one cut, one crisis, one recovery. The real criterion here is cognitive load tolerance. Does your team have the stamina to hold two mental models for a month? Or are they the type who prefer a single, ugly night of chaos over a slow, polite strangulation?

Quick reality check—audit your last three sprints. How many unplanned interruptions hit the board? If the answer is “too many,” your team’s spare capacity is thinner than the spreadsheet says. A phased migration that drags into a third month will bleed morale faster than a botched Big Bang weekend. Choose the shape of scar you can afford to heal.

Big Bang vs. Phased: The Trade-Off Table

Speed vs. Safety — The Real Clock Is Ticking

You can flip the switch in one weekend. Big Bang seduces with that promise—one long weekend, a coordinated cutover, and Monday morning the new system hums. I have seen teams pull it off exactly twice. The other eight times? Rollbacks, midnight hotfixes, and a QA lead crying into a vending machine. The trade-off isn't abstract: Big Bang buys speed by borrowing against your safety margin. You compress six months of staggered validation into forty-eight hours of adrenaline. Phased migration, by contrast, spreads that same work over weeks—but each phase carries its own debt. You maintain two systems simultaneously, you duplicate integration tests, and the seam between old and new bleeds data corruption if you blink. Speed gives you a clean break. Safety gives you a chance to fix each broken pipe before the next one floods.

Test Coverage vs. Real-World Validation — The Lab Lies

Your automated test suite passes at 97%. Feeling good? Don't. Unit tests validate logic, not production chaos. In a Big Bang, you bet everything on that green checkmark—then discover on Tuesday that the legacy payment gateway rejects timestamps formatted one way while the new system sends them another. Phased migrations let you run real transactions through a limited user cohort before the broader rollout. That sounds safer until you realize your pilot users behave nothing like the full base. They're power users. They skip steps. Your bug reports spike not because the migration broke something, but because you never tested against actual human clumsiness. The catch is this: test coverage tells you what could break; real-world validation shows you what will break at 2:00 PM on a Thursday. What usually breaks first is the identity mapping between old customer IDs and new—something no staging environment ever replicates correctly.

“We tested for eight weeks. Production broke in three places within an hour. The test environment didn't have the same load balancer config.”

— senior engineer, post-mortem on a financial platform cutover

Team Stress and Burnout Risk — The Human Cost

Phased migrations stretch the pain. Your team runs parallel systems for months, fixing integration bugs at 11 PM because the day belongs to feature work. That grinds people down—I've watched a senior dev quit mid-migration because the dual-maintenance grind felt endless. Wrong order: Big Bang compresses the stress into a single pulse. Two weeks of crunch, maybe three. You lose a weekend, you order catered dinners, and then it's done. That hurts differently. Short bursts of extreme pressure can actually feel tolerable—there's a finish line visible. But here's the pitfall: the Big Bang failure scenario doesn't just stress the team; it throws them into a crisis loop of revert-redeploy-revert that can stretch weeks longer than a phased plan. One rhetorical question for your lead: would your people rather pace themselves for a marathon they can pause, or sprint a hundred meters into an unseen wall?

How to Execute Once You've Chosen

Big Bang execution checklist

You're cutting over everything in one weekend. Everything. The entire legacy system turns off Monday morning, and your new platform must handle Monday-morning traffic without a hiccup. Most teams nail the code part. They fail at the data part—specifically, at the cold-start problem. Your new database has zero history, zero session state, zero cached user preferences. That sounds fine until 9 AM hits and every returning user tries to look up an order from last year.

Here is the checklist that saves your weekend:

  • Shadow-run for seven days. Mirror production traffic into the new system, compare outputs, and log every mismatch. Don't cut over until the mismatch rate sits below 0.5% for three consecutive days.
  • Pre-warm the cache layer. Run a batch process Saturday morning that replays the last 30 days of user sessions into Redis. Cold cache under load is a guaranteed timeout cascade.
  • Build a second DNS path. Point 5% of users at the new stack for one hour on Friday. I have seen teams discover SSL certificate mismatches this way—not during the all-hands-on-deck window.

The catch: you can't roll back cleanly after 72 hours. Old data will be stale, foreign-key references will diverge, and the legacy system may have stopped accepting writes. Your rollback plan must be tested before cutover, not written in a doc afterward. That means a full reverse-migration script that runs in under 90 minutes. If it takes longer, you're not ready for a big bang.

Phased migration roadmap

Phase one should be the module nobody loves but everybody needs—authentication. Move login and user profiles first. Why? Because a broken auth page gets immediate executive attention, and the blast radius is limited to a single API gateway. You learn the deployment pipeline, the database sync latency, and the monitoring gap—all on a feature that touches every user but changes no business logic.

Field note: android plans crack at handoff.

Phase two is read-only functionality: order history, invoice PDFs, reporting dashboards. These queries can fail silently without corrupting live transactions. That's the whole point of phasing—you can tolerate a five-second query timeout on a historical report without breaking a checkout flow. What usually breaks first is the join between old and new data. A user logs in via the new auth service but tries to fetch orders from the old monolith. The seam blows out because the session token format changed.

Fix that by running a dual-write period: every create or update operation hits both systems for two weeks. Compare response bodies. Track drift. Only after the drift stays below fifty records per day do you cut the write path fully to the new system. Quick reality check—most teams skip this step, then spend a month reconciling orphaned orders.

Rollback plan (non-negotiable)

Your rollback is not a checkbox on a slide. It's a tested script that restores the exact state from six hours before cutover—including the database schema, queued messages, and consumer offsets. I once watched a team try to roll back a phased migration by restoring a dump from two days earlier. They lost 8,000 pending invoice requests. The fix took three weeks and an apologetic email to the CFO.

“A rollback that you haven’t run on a staging clone is a prayer, not a plan.”

— principal engineer, after the invoice-incident postmortem

Here is the non-negotiable minimum: run your rollback script twice on a staging environment that mirrors production row counts—not a ten-row copy. First run to verify speed. Second run to verify data integrity. If either test throws a foreign-key violation or a missing sequence gap, you stop. You fix. You test again. Because here is the truth nobody says aloud: once you press the big red button on cutover, the old system becomes a museum. It stops accepting writes, integrations are redirected, API keys are rotated. Rolling back means reversing all of that, under time pressure, while users are tweeting about errors. Not yet tested? Not ready.

The Hidden Risks Nobody Talks About

Data drift in phased migrations

You stage the cutover in slices—orders this week, customer profiles next month. Clean plan. What nobody warned you about is the quiet corruption that lives in the seams. While the new platform runs orders, the old system still processes customer updates. A rep changes an address in the legacy CRM. That change never reaches the new order database. Four weeks later, you ship to a warehouse that no longer exists. I have seen a mid-market retail team lose three weeks reconciling this kind of drift—and that was the discovered damage. The catch is: your data sync scripts catch the obvious mismatches, but business rules bend in ways engineers don’t predict. A discount code that depends on a loyalty tier computed in both systems? Gets applied twice—or never. That hurts.

The real sting arrives in the reporting layer. Finance runs a monthly close, and the numbers from the old and new systems don’t tie. Not by a little—by enough that the CFO demands an audit. Nobody budgeted for two months of reconciliation engineers. Yet that's exactly what a phased handoff demands: a parallel truth-check that most teams understaff by 60%. Wrong order. You set up daily reconciliation queries before you flip the first switch, not after the drift has already poisoned three weeks of transactions.

Big Bang 'small bug' cascades

A single timezone parsing error. That was all it took for a payments company I worked with. They migrated the entire transaction engine in one weekend—went live Sunday at 2 AM. Monday morning, 14% of recurring charges failed because the new system stamped timestamps in UTC-only and the legacy gateway expected a local offset. Not a logic bug. A three-line configuration mistake. But here is the edge nobody talks about: in a big bang, there is no partial fallback. You can't say “we’ll route only North American payments through the old system for now.” The old system is gone. So you scramble, fixing the timestamp while support drowns in “why was my card declined?” calls. The cascade is predictable: one small bug → degraded payment flow → support backlog → rushed hotfix → second bug introduced. That second bug? It overwrote a merchant’s payout schedule.

Quick reality check—big bang migration risk is not about major architectural failures. It's the accumulation of tiny, individually harmless mistakes that swarm together because you removed the safety net of parallel operation. Most incident post-mortems I have read list “the actual root cause took 40 minutes to find” as the critical factor. Not the fix. The search. In a phased migration you isolate that search to one module. In a big bang, you search the entire moon.

QA burnout and attrition

The schedule says two regression cycles. The team delivers three—then a fourth, because the smoke tests reveal a UI edge case nobody thought to automate. QA goes from 45-hour weeks to 60-hour weeks. That sounds like standard crunch, but there is a hidden toll: decision paralysis. When a tester has been staring at failed assertions for eighteen days straight, their risk judgement bends. They start signing off on marginal passes just to stop the fatigue. I have watched a senior QA lead wave through a billing-double-post bug because “it only reproduces under load and we can patch it post-launch.” They could not. The double-posts hit production and triggered a PCI audit delay.

Most teams skip this: budget two full contingency weeks for QA rest after the final cutover. Not for retesting—for recovery. Because the attrition after a brutal migration wave is predictable: 20–30% of the QA team gives notice within 60 days. You have lost the people who actually know what the old system did. That knowledge walk is the risk your plan never listed.

“We asked QA to own the migration verification plan. Two months later, half the team had resigned. The ones who stayed couldn’t remember why we built certain edge-case tests.”

— Engineering Director, mid-market FinTech SaaS, post-mortem retrospective

The fix is not heroic. It's boring: rotate QA responsibility across feature areas so no single person owns the full migration validation. Cross-train one dev per squad on the core smoke-test script. And—this is the part most plans omit—set a hard stop on test iteration. Three cycles max. After that, any open defect below the “blocking payments or data integrity” threshold ships as a known risk with a documented rollback trigger. That trigger clause? That's what keeps your QA team from walking out the door.

Reality check: name the development owner or stop.

Frequently Overlooked Questions (Mini-FAQ)

Can you pause a phased migration mid-stream?

Yes—but the cost of hitting pause surprises most teams. I have seen a three-phase migration freeze at phase two for six months because the team that owned the old system got reassigned. The database stayed in a split state: writes went to the new schema, reads still pulled from the legacy store, and every new feature required two code paths. That's not a pause. That's a live-fire experiment nobody signed up for. The real question isn't whether you can pause. It's whether you have a concrete reactivation trigger written down before you start—a date, a business event, or a hard resource commitment. Without it, "pause" becomes "abandon."

How long should each phase actually be?

Too short and your team never exits the setup phase. Too long and the business loses patience. The most common mistake I see is two-week phases for legacy code that hasn't been touched in years. You spend day one discovering the environment differences, day two fixing the deployment pipeline, and days three through ten firefighting. That leaves zero time to validate the actual migration. A better heuristic: take the smallest logical slice of functionality you trust, multiply your best-guess timeline by 1.8, and then add two weeks of buffer for the rollback testing nobody budgets for. That usually lands at 4–6 weeks per phase for most enterprise systems. Shorter than four weeks and you're faking agility; longer than eight and stakeholders assume you've stalled.

What if Big Bang fails? Can you actually roll back?

Technically? Usually. Realistically? The rollback window closes faster than anyone admits. I worked with a payments platform that kept the old system running in parallel for three months before the Big Bang cutover. When the new system broke on transaction reconciliation at hour seven, the rollback took less than ninety minutes. The hidden cost: every transaction processed on the new system during those seven hours had to be manually reconciled with the old database. That took three people four weeks. The catch is that most teams design the rollback procedure but never test the data reconciliation path. Without that, you can flip back—but your QA team will hate you for the next month.

"We had the old database snapshot ready. Nobody had written the script to reverse the updates the new system made to downstream reporting tables."

— senior engineer, logistics SaaS, post-mortem retrospective

That's the pitfall every hidden risks talk skips: you can roll the servers back, but the data is already contaminated. Fixing that's not a button push. It's a detective exercise across log files and manual diffs.

Should you mix both strategies inside the same migration?

Most teams assume Big Bang and phased are mutually exclusive. They aren't. I have seen successful teams use a phased approach for the database migration and a Big Bang for the application cutover. The database moves in four phases over twelve weeks. Then, on a weekend, everything flips at once. That hybrid avoids the worst of both worlds—no perpetual split-state for the data, and no seven-hour reconciliation panic for the code. The trade-off is complexity in the intermediate weeks: your app has to talk to two database versions. That hurts. But for teams with strong API boundaries between services, it works better than either pure play. If your architecture supports write-as-new, read-as-old patterns, this hybrid deserves a serious look before you lock into one dogma. Try framing it: what part of your system can tolerate a slow handover, and what part needs a clean break? Answer those separately, then merge the plans.

Final Recommendation: Map Your Risk Profile First

When Big Bang wins (and loses)

Big Bang works best when your legacy system is small, isolated, and you have a spare weekend that nobody needs for anything else. I have seen a team of four migrate a billing microservice over a single Friday night—tested Monday morning, zero issues. That's the dream. The reality? That same approach took down an e-commerce checkout for eight hours last year. The team had mapped every dependency except the one that fed gift-card balances through a cron job no one remembered existed. Big Bang wins when you own every integration, your rollback plan takes minutes, and the business can survive a one-day outage. It loses the moment you have unknown coupling—which is almost always.

The catch is human stamina. A Big Bang freeze typically spans 48–72 hours of straight work. Your QA team can't sustain focus that long without errors bleeding through. One exhausted tester approved a data-migration script that truncated, not transformed. That hurts. So ask yourself: can your team run the cutover twice—once as a dry run, once for real—before anyone touches production? If the answer is no, Big Bang is a gamble, not a plan.

When Phased is the only sane choice

Phased migration is the tortoise that actually finishes. You move one module, stabilize, then move the next. The trap is that teams treat each phase as a tiny Big Bang—same pressure, same midnight deploys, just smaller scope. That misses the point. Phased works when you can selectively route traffic: new system for new users, old system for the rest. I fixed a platform migration once by flipping ten percent of customers at a time. Found the session-handling bug on batch two, not batch ninety.

The hidden trade-off? Complexity multiplies. You now operate two systems in parallel—two codebases, two databases, two monitoring dashboards. Your QA team runs regression tests on both, and the integration points between old and new become a third system nobody documented. Phased is sane only if you invest in a feature-flag framework early and budget for six weeks of dual maintenance. Otherwise you trade one risk (the cutover bomb) for another (entropy debt).

Most teams skip this: map your risk profile first. Draw a grid: blast radius on one axis, recovery time on the other. A CRM migration with 10,000 concurrent users? Phased. A batch-reporting engine that runs overnight? Big Bang—if, and only if, you can fail back in under an hour.

‘We planned a six-phase migration. By phase two, we had three active versions. That wasn’t agility—that was a distributed nightmare.’

— platform architect, after a 14-month middleware rewrite

Hybrid patterns that work

The best teams I have seen use a hybrid: Big Bang for the data layer, Phased for the application tier. Move the schema in one shot—database migrations are notoriously hard to undo in slices—then roll out new service endpoints bit by bit. That gives you the atomicity of Big Bang where it matters and the reversibility of Phased where risk lives.

Another pattern: use a strangler fig. Wrap the legacy API, redirect calls incrementally, then cut the old system when traffic hits zero. This is not quite Big Bang, not quite Phased—it's a controlled bleed. The QA win here is statistical: you compare error rates between old and new at every percentage point. No surprises, just data. One caveat—strangler figs take patience. If your CEO needs a migration completed before the quarterly earnings call, this pattern will frustrate everyone.

Your move? Pick a weekend next month. Run one dry-run Big Bang on a staging environment that mirrors production’s worst-case load. Measure how long it takes to roll back. If that rollback exceeds your business’s pain threshold, switch to Phased—but only after you have a feature-flag system, a dual-write test suite, and a clear answer to this question: what single bug would force you to abort the entire migration? Because something will break. The difference between losing your QA sanity and keeping it's knowing exactly which break is the one you can’t stomach.

Share this article:

Comments (0)

No comments yet. Be the first to comment!