{"id":29507,"date":"2026-09-18T06:16:43","date_gmt":"2026-09-18T06:16:43","guid":{"rendered":"https:\/\/umang.pk\/2026\/09\/18\/%d8%a8%da%af-%d8%a8%db%8c%d9%86%da%af-%d8%b1%db%8c-%d8%b1%d8%a7%d8%a6%d9%b9-%da%a9%db%92-%d8%a8%d8%ba%db%8c%d8%b1-%d9%85%db%8c%d8%b1%d8%a7%d8%ab%db%8c-%db%8c%da%a9-%d8%b3%d9%86%da%af%db%8c-%da%a9\/"},"modified":"2026-09-18T06:16:43","modified_gmt":"2026-09-18T06:16:43","slug":"%d8%a8%da%af-%d8%a8%db%8c%d9%86%da%af-%d8%b1%db%8c-%d8%b1%d8%a7%d8%a6%d9%b9-%da%a9%db%92-%d8%a8%d8%ba%db%8c%d8%b1-%d9%85%db%8c%d8%b1%d8%a7%d8%ab%db%8c-%db%8c%da%a9-%d8%b3%d9%86%da%af%db%8c-%da%a9","status":"publish","type":"post","link":"https:\/\/umang.pk\/ur\/2026\/09\/18\/%d8%a8%da%af-%d8%a8%db%8c%d9%86%da%af-%d8%b1%db%8c-%d8%b1%d8%a7%d8%a6%d9%b9-%da%a9%db%92-%d8%a8%d8%ba%db%8c%d8%b1-%d9%85%db%8c%d8%b1%d8%a7%d8%ab%db%8c-%db%8c%da%a9-%d8%b3%d9%86%da%af%db%8c-%da%a9\/","title":{"rendered":"\u0628\u06af \u0628\u06cc\u0646\u06af \u0631\u06cc \u0631\u0627\u0626\u0679 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0645\u06cc\u0631\u0627\u062b\u06cc \u06cc\u06a9 \u0633\u0646\u06af\u06cc \u06a9\u0648 \u0628\u062a\u062f\u0631\u06cc\u062c \u06a9\u06cc\u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0645\u06cc\u0631\u0627\u062b\u06cc \u06c1\u062c\u0631\u062a\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u062d\u062a\u0645\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u0633\u06d2 \u0628\u06c1\u062a \u067e\u06c1\u0644\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0646\u0627\u06a9\u0627\u0645\u06cc\u0627\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u0648\u0642\u062a \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0628 \u0627\u06cc\u06a9 \u06c1\u062c\u0631\u062a \u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u067e\u0646\u06d2 \u067e\u0631\u0627\u0646\u06d2 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u062e\u0637\u0631\u0646\u0627\u06a9 \u0645\u0641\u0631\u0648\u0636\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062e\u06cc\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u067e\u0631\u0627\u0646\u06d2 \u0646\u0638\u0627\u0645 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0627 \u062a\u0628\u0627\u062f\u0644\u06c1 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0645\u06cc\u0631\u0627\u062b\u06cc \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u06d2 \u0679\u06cc\u0633\u0679\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0627\u0641\u0642 \u062d\u062f\u0648\u062f \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u067e\u0631\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0622\u067e \u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u0645\u0633\u0626\u0644\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0628\u062f\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u062c\u0627\u0626\u06d2:<\/p>\n<pre><code class=\"language-text\">legacy monolith\n      \u2193\ncomplete rewrite\n      \u2193\nbig-bang cutover\n<\/code><\/pre>\n<p>\u0622\u067e \u062f\u0631\u062c \u0630\u06cc\u0644 \u0633\u0645\u062a\u0648\u06ba \u0645\u06cc\u06ba \u062c\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacy monolith\n      \u2193\none capability extracted\n      \u2193\nsmall percentage of traffic\n      \u2193\nobserve\n      \u2193\nexpand\n      \u2193\nrepeat\n<\/code><\/pre>\n<p>\u0645\u0642\u0635\u062f \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u0648 \u0633\u0633\u062a \u06a9\u0631\u0646\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0645\u0642\u0635\u062f \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0631 \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0648 \u0686\u06be\u0648\u0679\u0627\u060c \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u0627\u0648\u0631 \u0627\u0644\u0679\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba\u060c \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u062f\u06a9\u06be\u0627\u0624\u06ba \u06af\u0627 \u06a9\u06c1 \u06a9\u0633 \u0637\u0631\u062d \u0627\u06cc\u06a9 \u0645\u06cc\u0631\u0627\u062b\u06cc \u06cc\u06a9 \u0633\u0646\u06af\u06cc \u06a9\u0648 \u0628\u062a\u062f\u0631\u06cc\u062c \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2 \u0628\u0630\u0631\u06cc\u0639\u06c1:<\/p>\n<ul>\n<li>\n<p>\u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u062d\u0641\u0648\u0638 \u0679\u06a9\u0691\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u0646\u0627<\/p>\n<\/li>\n<li>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u06a9\u0648\u0688 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u06a9\u0648\u0688 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u062d\u062f\u0648\u062f \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0646\u0641\u0627\u0630 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0631\u0648\u0679\u0646\u06af \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>Strangler Fig \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2<\/p>\n<\/li>\n<li>\n<p>\u0679\u06a9\u0646\u0627\u0644\u0648\u062c\u06cc \u06a9\u06cc \u062a\u06c1\u06c1 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a \u0633\u06d2 \u06c1\u062c\u0631\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u067e\u0631\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u06a9\u06be\u0646\u0627<\/p>\n<\/li>\n<li>\n<p>\u062a\u0631\u0642\u06cc \u067e\u0633\u0646\u062f \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0627 \u062a\u0639\u0627\u0631\u0641<\/p>\n<\/li>\n<li>\n<p>\u0645\u06a9\u0645\u0644 \u06a9\u0679 \u0627\u0648\u0648\u0631 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062e\u0631\u0627\u0628\u06cc \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627<\/p>\n<\/li>\n<li>\n<p>\u0631\u0648\u0644 \u0628\u06cc\u06a9 \u067e\u0627\u062a\u06be \u0688\u06cc\u0632\u0627\u0626\u0646<\/p>\n<\/li>\n<li>\n<p>\u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0645\u0644\u06a9\u06cc\u062a \u06a9\u0648 \u0627\u062d\u062a\u06cc\u0627\u0637 \u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0633\u0644\u0648\u06a9 \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 AI \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u062b\u0627\u0644\u06cc\u06ba TypeScript \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0632\u0628\u0627\u0646\u0648\u06ba\u060c \u0631\u0646 \u0679\u0627\u0626\u0645\u0632 \u0627\u0648\u0631 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0642\u0635\u062f \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u062e\u06cc\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u062c\u0631\u062a \u06a9\u0648 \u06a9\u0633\u06cc \u0627\u06cc\u06a9\u060c \u0646\u0627\u0642\u0627\u0628\u0644 \u0648\u0627\u067e\u0633\u06cc \u0648\u0627\u0642\u0639\u06c1 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u0633\u0644\u0633\u0644\u06c1 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u067e \u06a9\u0648 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0633\u06d2 \u0648\u0627\u0642\u0641 \u06c1\u0648\u0646\u0627 \u06c1\u0648\u06af\u0627:<\/p>\n<ul>\n<li>\n<p>TypeScript \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0645\u0644\u062a\u06cc \u062c\u0644\u062a\u06cc \u0632\u0628\u0627\u0646<\/p>\n<\/li>\n<li>\n<p>API \u0627\u0648\u0631 \u0633\u0631\u0648\u0633 \u06a9\u06cc \u062d\u062f\u0648\u062f<\/p>\n<\/li>\n<li>\n<p>\u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06cc \u062c\u0627\u0646\u0686<\/p>\n<\/li>\n<li>\n<p>\u0627\u0646\u062d\u0635\u0627\u0631 \u0627\u0646\u062c\u06a9\u0634\u0646<\/p>\n<\/li>\n<li>\n<p>\u0631\u0648\u0679\u0646\u06af \u0627\u0648\u0631 \u0631\u06cc\u0648\u0631\u0633 \u067e\u0631\u0627\u06a9\u0633\u06cc<\/p>\n<\/li>\n<li>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646<\/p>\n<\/li>\n<li>\n<p>\u0645\u0634\u0627\u06c1\u062f\u06c1<\/p>\n<\/li>\n<li>\n<p>\u0627\u0646\u06a9\u0631\u06cc\u0645\u0646\u0679\u0644 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af<\/p>\n<\/li>\n<li>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u062c\u062f\u06cc\u062f \u06a9\u0627\u0631\u06cc<\/p>\n<\/li>\n<\/ul>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u0646 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u0628\u06be\u06cc \u0633\u0645\u062c\u06be \u0644\u06cc\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0648 \u0622\u067e \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631\u060c \u0622\u067e \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0628\u06be\u06cc \u062a\u06a9 \u0627\u0633 \u0645\u0642\u0627\u0645 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06c1\u062c\u0631\u062a \u06a9\u0631\u0646\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0648\u0642\u062a \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-why-big-bang-migrations-are-so-risky\">\u0628\u06af \u0628\u06cc\u0646\u06af \u0645\u0627\u0626\u06cc\u06af\u0631\u06cc\u0634\u0646 \u062e\u0637\u0631\u0646\u0627\u06a9 \u06a9\u06cc\u0648\u06ba \u06c1\u06d2\u061f<\/h2>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u06a9\u0627\u0645\u0631\u0633 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0646 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">customers\norders\npayments\ninventory\nshipping\ninvoicing\nnotifications\nreporting\n<\/code><\/pre>\n<p>\u062c\u062f\u06cc\u062f \u06a9\u0627\u0631\u06cc \u06a9\u06d2 \u0645\u0646\u0635\u0648\u0628\u06d2 \u0645\u06cc\u06ba \u06a9\u06c1\u0627 \u06af\u06cc\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">replace the monolith\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u0637\u0631\u062d \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631\u060c \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u0628\u062f\u0644\u0646\u0627 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">runtime\nframework\ndatabase\ndeployment model\nAPI contracts\nauthentication\nnetworking\nobservability\ndata model\nbusiness logic\nexternal integrations\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba.<\/p>\n<p>\u062d\u062a\u0645\u06cc \u06a9\u0679 \u0627\u0648\u0648\u0631 \u06a9\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06cc \u0645\u0645\u06a9\u0646\u06c1 \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Did pricing change?\n\nDid the database migration lose data?\n\nIs the payment provider failing?\n\nDid authentication behave differently?\n\nDid the new runtime change date handling?\n\nDid a timeout become shorter?\n\nDid an event stop being published?\n\nDid the new deployment configuration fail?\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u06af \u0628\u06cc\u0646\u06af \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06c1\u0645 \u0645\u0633\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u0628\u06c1\u062a \u0633\u0627\u0631\u06d2 \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06c1\u0631 \u0642\u062f\u0645 \u067e\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-think-in-migration-slices-not-applications\">\u0645\u0627\u0626\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0633\u0644\u0627\u0626\u0633\u0632 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u0648\u0686\u06cc\u06ba\u060c \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0646\u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>\u067e\u0648\u0686\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2:<\/p>\n<blockquote>\n<p>\u0645\u06cc\u06ba \u0627\u0633 \u06cc\u06a9 \u0633\u0646\u06af\u06cc \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0648\u06ba\u061f<\/p>\n<\/blockquote>\n<p>\u067e\u0648\u0686\u06be\u06cc\u06ba:<\/p>\n<blockquote>\n<p>\u0633\u0628 \u0633\u06d2 \u0686\u06be\u0648\u0679\u06cc \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u06cc\u0627 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u06c1\u0645 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<\/blockquote>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Calculate Order Total\nGenerate Invoice\nSend Order Confirmation\nCreate Shipment\nRenew Subscription\nApprove Customer\n<\/code><\/pre>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06d2 \u0679\u06a9\u0691\u06d2 \u0645\u06cc\u06ba \u0645\u062b\u0627\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2:<\/p>\n<pre><code class=\"language-text\">clear input\nclear output\nknown side effects\nunderstood dependencies\nobservable behavior\na rollback path\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0679\u06be\u0648\u0633 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Generate Invoice\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u0633 \u0637\u0631\u062d \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">input:\norderId\n\nbehavior:\nload order\ncalculate taxes\ngenerate invoice number\ncreate invoice\n\nside effects:\nstore invoice\npublish invoice.created\n\noutput:\ninvoice\n<\/code><\/pre>\n<p>\u06c1\u062c\u0631\u062a \u06a9\u0631\u0646\u0627 \u0627\u0633 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0622\u0633\u0627\u0646 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">billing module\n<\/code><\/pre>\n<p>\u06cc\u0627:<\/p>\n<pre><code class=\"language-text\">src\/services\/\n<\/code><\/pre>\n<p>\u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0627\u0641\u0639\u0627\u0644 \u0641\u0648\u0644\u0688\u0631\u0632 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u0628\u06c1\u062a\u0631 \u0627\u06a9\u0627\u0626\u06cc\u0627\u06ba \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-choose-the-first-capability-carefully\">\u0627\u067e\u0646\u06cc \u067e\u06c1\u0644\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0627\u062d\u062a\u06cc\u0627\u0637 \u0633\u06d2 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u067e\u06c1\u0644\u0627 \u0679\u06a9\u0691\u0627 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u06cc\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0633\u0633\u0679\u0645 \u06a9\u06cc \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06af\u0631\u06cc\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u06d4<\/p>\n<p>\u0622\u067e \u0627\u067e\u0646\u06d2 \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u0686\u06cc\u0632 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u062a\u0646\u0627 \u062e\u0637\u0631\u0646\u0627\u06a9 \u0646\u06c1\u06cc\u06ba \u06a9\u06c1 \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u06d2 \u062a\u0628\u0627\u06c1 \u06a9\u0646 \u0646\u062a\u0627\u0626\u062c \u0628\u0631\u0622\u0645\u062f \u06c1\u0648\u06ba\u06d4<\/p>\n<p>\u0645\u0641\u06cc\u062f \u067e\u06c1\u0644\u06d2 \u0679\u06a9\u0691\u0648\u06ba \u0645\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u0634\u0627\u0645\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">moderate traffic\nlimited external dependencies\nclear behavior\ngood test coverage\nfew transactional boundaries\nlow blast radius\n<\/code><\/pre>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Generate Customer Statement\n<\/code><\/pre>\n<p>\u0627\u0633 \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u067e\u06c1\u0644\u0627 \u06c1\u062c\u0631\u062a \u06a9\u0627 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631 \u06a9\u06cc\u0627 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">Authorize Payment\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06cc \u06c1\u062c\u0631\u062a \u062c\u0632\u0648\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u06a9\u0627\u0645 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0645\u0634\u0642 \u0628\u06be\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0686\u06cc\u06a9 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">routing\ndeployment\nobservability\nrollback\ndata access\ntesting\nteam workflow\n<\/code><\/pre>\n<p>\u0645\u0632\u06cc\u062f \u0627\u06c1\u0645 \u0627\u0641\u0639\u0627\u0644 \u067e\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2.<\/p>\n<h2 id=\"heading-create-a-boundary-between-legacy-and-new\">\u0648\u0631\u0627\u062b\u062a \u0627\u0648\u0631 \u0646\u0626\u06d2 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0633\u0631\u062d\u062f\u06cc\u06ba \u0628\u0646\u0627\u0646\u0627<\/h2>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0645\u06cc\u0631\u0627\u062b\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">async function generateInvoice(\n  orderId: string\n) {\n  \/\/ legacy implementation\n}\n<\/code><\/pre>\n<p>\u06c1\u062c\u0631\u062a \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062d\u062f\u0648\u062f \u06a9\u0627 \u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">interface InvoiceGenerator {\n  generate(\n    orderId: string\n  ): Promise<invoice>;\n}\n<\/invoice><\/code><\/pre>\n<p>\u0645\u06cc\u0631\u0627\u062b \u06a9\u0627 \u0646\u0641\u0627\u0630 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">class LegacyInvoiceGenerator\n  implements InvoiceGenerator {\n  async generate(\n    orderId: string\n  ): Promise<invoice> {\n    \/\/ existing behavior\n  }\n}\n<\/invoice><\/code><\/pre>\n<p>\u0646\u06cc\u0627 \u0646\u0641\u0627\u0630 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">class NewInvoiceGenerator\n  implements InvoiceGenerator {\n  async generate(\n    orderId: string\n  ): Promise<invoice> {\n    \/\/ migrated behavior\n  }\n}\n<\/invoice><\/code><\/pre>\n<p>\u0627\u0628 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 \u0639\u0645\u0644 \u0641\u0639\u0627\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062e\u0635\u0648\u0635\u06cc\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">replace implementation\nwithout replacing caller\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-use-the-strangler-fig-pattern\">Strangler Fig \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2<\/h2>\n<p>\u0627\u0636\u0627\u0641\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0637\u0631\u06cc\u0642\u06c1 Strangler Fig \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u067e\u0648\u0631\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0645\u0648\u062c\u0648\u062f\u06c1 \u0633\u0633\u0679\u0645\u0632 \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u0646\u06cc\u0627 \u0631\u0648\u06cc\u06c1 \u0628\u062a\u062f\u0631\u06cc\u062c \u0628\u0646\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0635\u0648\u0631\u0627\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">            incoming request\n                   \u2502\n                   \u2193\n                router\n              \/        \\\n             \/          \\\n      legacy path     new path\n<\/code><\/pre>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2:<\/p>\n<pre><code class=\"language-text\">legacy: 100%\nnew:      0%\n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacy: 95%\nnew:      5%\n<\/code><\/pre>\n<p>\u067e\u06be\u0631:<\/p>\n<pre><code class=\"language-text\">legacy: 50%\nnew:     50%\n<\/code><\/pre>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacy:  0%\nnew:    100%\n<\/code><\/pre>\n<p>\u0627\u0633 \u0645\u0642\u0627\u0645 \u067e\u0631 \u0622\u067e \u0627\u0633 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u06c1\u0679\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc \u0622\u06c1\u0633\u062a\u06c1 \u0622\u06c1\u0633\u062a\u06c1 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u062d\u0635\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u0631\u06c1\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062c\u0628\u06a9\u06c1 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u062f\u0648\u0633\u0631\u06d2 \u062d\u0635\u0648\u06ba \u067e\u0631 \u0642\u0628\u0636\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-migrate-capabilities-not-technical-layers\">\u06c1\u062c\u0631\u062a \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a\u060c \u0679\u06cc\u06a9\u0646\u0627\u0644\u0648\u062c\u06cc \u06a9\u06cc \u067e\u0631\u062a\u06cc\u06ba \u0646\u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0627\u06cc\u06a9 \u067e\u0631\u06a9\u0634\u0634 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">move database\nthen move services\nthen move APIs\nthen move UI\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a \u067e\u0631 \u0645\u062d\u06cc\u0637 \u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06c1 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">new API\n\u2193\nlegacy service\n\u2193\nnew database\n\u2193\nlegacy event publisher\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0628\u06be\u06cc \u06a9\u0628\u06be\u06cc \u0646\u0627\u06af\u0632\u06cc\u0631 \u06c1\u06d2.<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u062c\u0628 \u0628\u06be\u06cc \u0645\u0645\u06a9\u0646 \u06c1\u0648 \u0645\u06cc\u06ba \u0639\u0645\u0648\u062f\u06cc \u0633\u0644\u0627\u0626\u0633\u0648\u06ba \u06a9\u0648 \u062a\u0631\u062c\u06cc\u062d \u062f\u06cc\u062a\u0627 \u06c1\u0648\u06ba\u06d4<\/p>\n<p>\u0639\u0645\u0648\u062f\u06cc \u0679\u06a9\u0691\u0627 \u0627\u0633 \u0637\u0631\u062d \u0644\u06af\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">Generate Invoice\n\nrequest\n\u2193\napplication logic\n\u2193\npersistence\n\u2193\nevents\n\u2193\nresponse\n<\/code><\/pre>\n<p>\u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u0645\u0631\u0628\u0648\u0637 \u0627\u06a9\u0627\u0626\u06cc \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u062d\u0631\u06a9\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06be\u0631:<\/p>\n<pre><code class=\"language-text\">Create Shipment\n<\/code><\/pre>\n<p>\u0648\u06c1 \u0627\u0644\u06af \u0627\u0644\u06af \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba.<\/p>\n<p>\u067e\u06be\u0631:<\/p>\n<pre><code class=\"language-text\">Renew Subscription\n<\/code><\/pre>\n<p>\u0648\u063a\u06cc\u0631\u06c1<\/p>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u067e\u06c1\u0644\u06d2 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0639\u0627\u0631\u0636\u06cc \u0627\u0646\u0679\u0631 \u0633\u0633\u0679\u0645 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0628\u06be\u06cc \u06a9\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-keep-legacy-and-new-implementations-running-together\">\u0648\u0631\u0627\u062b\u062a \u0627\u0648\u0631 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u06a9\u06be\u0646\u0627<\/h2>\n<p>\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0628\u0642\u0627\u0626\u06d2 \u0628\u0627\u06c1\u0645\u06cc \u0639\u0627\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u0639\u0644\u0627\u0645\u0627\u062a \u0648\u0642\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0638\u0627\u06c1\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-text\">LegacyInvoiceGenerator\nNewInvoiceGenerator\n<\/code><\/pre>\n<p>\u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0646\u0642\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06c1\u0645\u0627\u0631\u06cc \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06c1\u0645 \u0633\u0648\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0633 \u0637\u0631\u062d \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">feature flag\ntenant\nuser group\nrequest header\nregion\npercentage rollout\nspecific account IDs\n<\/code><\/pre>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-typescript\">class InvoiceRouter {\n  constructor(\n    private readonly legacy:\n      InvoiceGenerator,\n    private readonly migrated:\n      InvoiceGenerator\n  ) {}\n\n  async generate(\n    orderId: string,\n    useMigrated: boolean\n  ) {\n    if (useMigrated) {\n      return this.migrated.generate(\n        orderId\n      );\n    }\n\n    return this.legacy.generate(\n      orderId\n    );\n  }\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0631\u0648\u0679\u0646\u06af \u0648\u0627\u0636\u062d \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u06af\u0627 \u06a9\u06c1 \u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u06a9\u0633 \u0646\u0641\u0627\u0630 \u0646\u06d2 \u0633\u0646\u0628\u06be\u0627\u0644\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-route-traffic-explicitly\">\u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1<\/h2>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0645\u0646\u0637\u0642 \u0633\u06d2 \u0628\u0686\u06cc\u06ba \u062c\u0633 \u06a9\u0627 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-typescript\">try {\n  return await newService.call();\n} catch {\n  return legacyService.call();\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0644\u0686\u06a9\u062f\u0627\u0631 \u062f\u06a9\u06be\u0627\u0626\u06cc \u062f\u06d2 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0648 \u0686\u06be\u067e\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0646\u06cc\u0627 \u0646\u0641\u0627\u0630 40\u066a \u0648\u0642\u062a \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u062a\u0645\u0627\u0645 \u062e\u0631\u0627\u0628\u06cc\u0627\u06ba \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0648\u0631\u0627\u062b\u062a \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0645\u0633\u0626\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u0635\u062d\u062a \u0645\u0646\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0633\u0626\u0644\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u067e\u06c1\u0644\u0627 \u0648\u0631\u0698\u0646 \u062f\u0648 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u0645\u0644\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0646\u0641\u0627\u0630 \u062c\u0646 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062c\u0627\u0646\u06cc \u0686\u0627\u06c1\u0626\u06d2\u06d4<\/strong> \u0627\u0648\u0631 <strong>\u0627\u06af\u0631 \u06cc\u06c1 \u0639\u0645\u0644 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u06a9\u06cc\u0627 \u06c1\u0648\u06af\u0627\u061f<\/strong>. \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0641\u0627\u0644 \u0628\u06cc\u06a9 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>catch<\/code>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0648\u0626\u06cc \u0642\u0627\u0628\u0644 \u067e\u06cc\u0645\u0627\u0626\u0634 \u0648\u0627\u0636\u062d \u0631\u0648\u0679\u0646\u06af \u0633\u06af\u0646\u0644 \u067e\u06cc\u062f\u0627 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0628\u0627\u0631 \u0628\u0627\u0631 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631 \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u067e\u06c1\u0644\u06d2 \u0631\u0648\u0679\u0646\u06af \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0646\u06c1\u06cc\u06ba \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u067e\u0646\u06cc \u067e\u0633\u0646\u062f \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06c1\u062c\u0631\u062a \u06a9\u06cc \u067e\u0627\u0644\u06cc\u0633\u06cc \u06a9\u0648 \u063a\u0644\u0637\u06cc \u0633\u06d2 \u0646\u0645\u0679\u0646\u06d2 \u0633\u06d2 \u0627\u0644\u06af \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u0648\u0627\u0636\u062d \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0631 \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 \u0648\u0627\u0642\u0639\u06cc \u06a9\u062a\u0646\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u067e\u06c1\u0646\u0686\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-typescript\">const route =\n  migrationPolicy.route(request);\n\nmetrics.increment(\n  `invoice.route.${route}`\n);\n\nif (route === \"migrated\") {\n  return migrated.generate(\n    request.orderId\n  );\n}\n\nreturn legacy.generate(\n  request.orderId\n);\n<\/code><\/pre>\n<p>\u0627\u0628 \u0622\u067e \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">requests routed to legacy\nrequests routed to migrated\nmigration failures\nfallback count\nlatency\nbusiness outcomes\n<\/code><\/pre>\n<p>\u0646\u0638\u0627\u0645 \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0627\u0639\u0644\u06cc\u0670 \u062a\u0631\u06cc\u0646 \u0633\u0637\u062d \u067e\u0631 \u0645\u0646\u062a\u0642\u0644\u06cc \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h2 id=\"heading-start-with-internal-or-low-risk-traffic\">\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u06cc\u0627 \u06a9\u0645 \u062e\u0637\u0631\u06d2 \u0648\u0627\u0644\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u0628\u0691\u06cc \u062a\u0639\u062f\u0627\u062f \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0631\u0627\u0633\u062a\u0648\u06ba \u0633\u06d2 \u0646\u06cc\u0686\u06d2 \u0644\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u062d\u0641\u0648\u0638 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">development\ntest environments\ninternal users\nstaff accounts\ntest tenants\nspecific low-risk customers\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">deployment\nrouting\nobservability\ndata access\nexternal integrations\nfailure handling\n<\/code><\/pre>\n<p>\u062e\u0637\u0631\u06c1 \u06a9\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0622\u067e \u0627\u0633\u06d2 \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">internal users\n\u2193\n1% production\n\u2193\n5%\n\u2193\n10%\n\u2193\n25%\n\u2193\n50%\n\u2193\n100%\n<\/code><\/pre>\n<p>\u0635\u062d\u06cc\u062d \u062a\u0646\u0627\u0633\u0628 \u0627\u06c1\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0635\u0648\u0644 \u06c1\u06d2.<\/p>\n<p>\u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u06a9\u0627\u0641\u06cc \u062b\u0628\u0648\u062a \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-progressively-increase-production-traffic\">\u0622\u06c1\u0633\u062a\u06c1 \u0622\u06c1\u0633\u062a\u06c1 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1<\/h2>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0635\u0648\u0631\u062a \u062d\u0627\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">10,000 invoice requests\/day\n<\/code><\/pre>\n<p>\u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0648\u0691\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2:<\/p>\n<pre><code class=\"language-text\">legacy \u2192 new\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0631\u0627\u0633\u062a\u06c1:<\/p>\n<pre><code class=\"language-text\">1%\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06d2<\/p>\n<p>\u06cc\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u0633 \u0637\u0631\u062d \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">100 real requests\/day\n<\/code><\/pre>\n<p>\u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u0633\u06d2<\/p>\n<p>\u0627\u0628 \u0645\u0627\u0646\u06cc\u0679\u0631 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">error rate\nlatency\noutput differences\nside effects\ncustomer-visible failures\nbusiness metrics\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06a9\u0627 \u0633\u0633\u0679\u0645 \u0679\u06be\u06cc\u06a9 \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631 \u0644\u06d2 \u062a\u0648 \u0627\u067e\u0646\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0646\u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0631\u0648\u0679\u0646\u06af \u06a9\u0648 \u06a9\u0645 \u06cc\u0627 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0646\u062a\u0642\u0644\u06cc \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u062a\u062c\u0631\u0628\u06c1 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u0679 \u0627\u0648\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0628\u06c1\u062a \u0645\u062e\u062a\u0644\u0641 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-use-differential-testing-before-and-during-rollout\">\u0631\u0648\u0644 \u0622\u0624\u0679 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0631\u0627\u0646 \u062a\u0641\u0631\u06cc\u0642 \u0679\u06cc\u0633\u0679\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0633 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0636\u0627\u0645\u06cc\u0646 \u062a\u0641\u0631\u06cc\u0642 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u067e\u0631 \u0645\u0631\u06a9\u0648\u0632 \u062a\u06be\u06d2\u06d4 \u06cc\u06c1 \u062a\u06a9\u0646\u06cc\u06a9 \u06cc\u06c1\u0627\u06ba \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0641\u0631\u06cc\u0642 \u0679\u06cc\u0633\u0679\u0646\u06af \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0627\u0648\u0631 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0686\u0644\u0627\u0646\u0627 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u0631\u0648\u06cc\u06d2 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u0627\u06d4 \u0641\u0646\u06a9\u0634\u0646 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u060c \u0627\u0633 \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0642\u062f\u0631\u06cc\u06ba\u060c \u063a\u0644\u0637\u06cc\u0627\u06ba\u060c \u062d\u0627\u0644\u062a \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba\u060c \u0627\u0648\u0631 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0634\u0627\u0645\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0642\u0635\u062f \u06cc\u06c1 \u062b\u0627\u0628\u062a \u06a9\u0631\u0646\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0646\u0641\u0627\u0630 \u062f\u0627\u062e\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u0642\u0635\u062f \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0628\u0627\u0645\u0639\u0646\u06cc \u0631\u0648\u06cc\u06d2 \u06a9\u06d2 \u0641\u0631\u0642 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u062a\u0645\u0627\u0645 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0679\u0631\u06cc\u0641\u06a9 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0631\u0648\u0679\u0646\u06af \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">same input\n\u2193\nlegacy result\n\nsame input\n\u2193\nnew result\n<\/code><\/pre>\n<p>\u0622\u067e \u0631\u0648\u0644 \u0622\u0624\u0679 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062d\u0642\u06cc\u0642\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0627 \u0646\u0645\u0648\u0646\u06c1 \u0628\u06be\u06cc \u0644\u06d2 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0631\u0648\u06cc\u06d2 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">real request\n      \u2502\n      \u251c\u2500\u2500\u2500\u2500\u2192 active implementation\n      \u2502\n      \u2514\u2500\u2500\u2500\u2500\u2192 shadow implementation\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-text\">output\nerrors\nside effects\nbusiness state\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0679\u0631\u06cc\u0641\u06a9 \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062b\u0628\u0648\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u0627\u0646\u0686 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u0627\u0633 \u067e\u0631 \u0645\u0628\u0646\u06cc \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">divergence\nerror rate\nlatency\nbusiness outcomes\n<\/code><\/pre>\n<p>\u0628\u062c\u0627\u0626\u06d2:<\/p>\n<blockquote>\n<p>\u06cc\u06c1 \u0679\u06be\u06cc\u06a9 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/blockquote>\n<h2 id=\"heading-a-small-end-to-end-invoice-migration-example\">\u0633\u0645\u0627\u0644 \u0627\u06cc\u0646\u0688 \u0679\u0648 \u0627\u06cc\u0646\u0688 \u0627\u0646\u0648\u0627\u0626\u0633 \u0645\u0627\u0626\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u0645\u062b\u0627\u0644<\/h2>\n<p>\u062c\u0628 \u0622\u067e \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u0679\u06a9\u0691\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0686\u06be\u0648\u0679\u06cc\u060c \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u0645\u062b\u0627\u0644 \u06c1\u06d2 \u062c\u0648 \u0627\u0646\u0648\u0627\u0626\u0633 \u06a9\u06cc \u0641\u0639\u0627\u0644\u06cc\u062a \u067e\u0631 \u0645\u0628\u0646\u06cc \u06c1\u06d2 \u062c\u0633\u06d2 \u06c1\u0645 \u067e\u0648\u0631\u06d2 \u0645\u0636\u0645\u0648\u0646 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u0645\u06cc\u06ba \u0627\u0635\u0644 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633\u060c \u0631\u06cc\u0648\u0631\u0633 \u067e\u0631\u0627\u06a9\u0633\u06cc\u060c \u0642\u0637\u0627\u0631\u060c \u06cc\u0627 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06d2 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0646\u0642\u0637\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06d2 \u0628\u06c1\u0627\u0624 \u06a9\u0648 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u067e\u0631 \u062f\u06a9\u06be\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u06d2 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">type InvoiceInput = {\n  orderId: string;\n  subtotal: number;\n};\n\ntype Invoice = {\n  orderId: string;\n  total: number;\n};\n\ninterface InvoiceGenerator {\n  generate(\n    input: InvoiceInput\n  ): Promise<invoice>;\n}\n<\/invoice><\/code><\/pre>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0627\u0646\u0648\u0627\u0626\u0633 \u06a9\u06cc \u06a9\u0644 \u06a9\u0627 \u062d\u0633\u0627\u0628 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">class LegacyInvoiceGenerator\n  implements InvoiceGenerator {\n  async generate(\n    input: InvoiceInput\n  ): Promise<invoice> {\n    return {\n      orderId: input.orderId,\n      total: input.subtotal * 1.21,\n    };\n  }\n}\n<\/invoice><\/code><\/pre>\n<p>\u0627\u0628 \u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u0646\u06d2 \u0627\u0633 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u062f\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">class MigratedInvoiceGenerator\n  implements InvoiceGenerator {\n  async generate(\n    input: InvoiceInput\n  ): Promise<invoice> {\n    const tax =\n      input.subtotal * 0.21;\n\n    return {\n      orderId: input.orderId,\n      total: input.subtotal + tax,\n    };\n  }\n}\n<\/invoice><\/code><\/pre>\n<p>\u06a9\u0648\u0688 \u0645\u062e\u062a\u0644\u0641 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0633\u0644\u0648\u06a9 \u0627\u06cc\u06a9 \u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0644\u0627\u060c \u06c1\u0645 deterministic \u0631\u0648\u0644 \u0622\u0624\u0679 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u0645\u062b\u0627\u0644 \u0645\u06cc\u06ba \u06c1\u0645 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u0648 \u062a\u0641\u0648\u06cc\u0636 \u06a9\u0631\u06cc\u06ba \u06af\u06d2: <code>orderId<\/code> 0 \u0633\u06d2 99 \u062a\u06a9 \u0628\u0627\u0644\u0679\u06cc \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06c1\u0645\u06cc\u0634\u06c1 \u0627\u0633\u06cc \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 \u0686\u0644\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">function bucketFor(\n  value: string\n): number {\n  const sum = [...value].reduce(\n    (total, char) =>\n      total + char.charCodeAt(0),\n    0\n  );\n\n  return sum % 100;\n}\n\nfunction shouldUseMigrated(\n  orderId: string,\n  percentage: number\n): boolean {\n  return (\n    bucketFor(orderId) < percentage\n  );\n}\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 <code>percentage<\/code> \u06c1\u06d2 <code>10<\/code>\u062a\u0642\u0631\u06cc\u0628\u0627\u064b 10% IDs \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u062a\u0641\u0648\u06cc\u0636 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u0626\u06cc\u06d2 \u0686\u0646\u062f \u0686\u06be\u0648\u0679\u06cc \u0627\u0646 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u0679\u0631\u06a9\u0633 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">const metrics = {\n  legacyRequests: 0,\n  migratedRequests: 0,\n  mismatches: 0,\n};\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0622\u067e \u0645\u06cc\u0631\u0627\u062b \u0627\u0648\u0631 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0646\u062a\u0642\u0644\u06cc \u0633\u06d2 \u0622\u06af\u0627\u06c1 \u0627\u0646\u0679\u0631\u06cc \u067e\u0648\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">class IncrementalInvoiceService {\n  migratedEnabled = true;\n  rolloutPercentage = 10;\n\n  constructor(\n    private readonly legacy:\n      InvoiceGenerator,\n    private readonly migrated:\n      InvoiceGenerator\n  ) {}\n\n  async generate(\n    input: InvoiceInput\n  ): Promise<invoice> {\n    const legacyResult =\n      await this.legacy.generate(\n        structuredClone(input)\n      );\n\n    const migratedResult =\n      await this.migrated.generate(\n        structuredClone(input)\n      );\n\n    if (\n      migratedResult.orderId !==\n        legacyResult.orderId ||\n      migratedResult.total !==\n        legacyResult.total\n    ) {\n      metrics.mismatches += 1;\n    }\n\n    const useMigrated =\n      this.migratedEnabled &&\n      shouldUseMigrated(\n        input.orderId,\n        this.rolloutPercentage\n      );\n\n    if (useMigrated) {\n      metrics.migratedRequests += 1;\n      return migratedResult;\n    }\n\n    metrics.legacyRequests += 1;\n    return legacyResult;\n  }\n}\n<\/invoice><\/code><\/pre>\n<p>\u06cc\u06c1 \u0686\u06be\u0648\u0679\u06cc \u0633\u06cc \u062e\u062f\u0645\u062a \u0645\u0636\u0645\u0648\u0646 \u06a9\u06d2 \u06a9\u0626\u06cc \u062e\u06cc\u0627\u0644\u0627\u062a \u06a9\u0648 \u06cc\u06a9\u062c\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u062f\u0648\u0646\u0648\u06ba \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0686\u0644\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u0627 \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0645\u062b\u0627\u0644 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06cc\u0631\u0648\u0646\u06cc \u0645\u0636\u0631 \u0627\u062b\u0631\u0627\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u0627\u060c \u06c1\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u062d\u0635\u06d2 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0646\u062a\u0627\u0626\u062c \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u06cc\u0633\u0631\u0627\u060c \u06c1\u0645 \u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u0648\u06ba \u0646\u06d2 \u06c1\u0631 \u0631\u0627\u0633\u062a\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u06a9\u062a\u0646\u06cc \u0631\u0648\u06cc\u06d2 \u0645\u06cc\u06ba \u062a\u0636\u0627\u062f\u0627\u062a \u0648\u0627\u0642\u0639 \u06c1\u0648\u0626\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06cc\u06c1 \u06a9\u0686\u06be \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-typescript\">const service =\n  new IncrementalInvoiceService(\n    new LegacyInvoiceGenerator(),\n    new MigratedInvoiceGenerator()\n  );\n\nfor (let i = 1; i <= 100; i++) {\n  await service.generate({\n    orderId: `order-${i}`,\n    subtotal: 1000,\n  });\n}\n\nconsole.log(metrics);\n<\/code><\/pre>\n<p>\u0622\u067e \u0627\u0633 \u0637\u0631\u062d \u06a9\u0686\u06be \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacyRequests:   89\nmigratedRequests: 11\nmismatches:        0\n<\/code><\/pre>\n<p>\u0628\u0627\u0644\u0679\u06cc \u0641\u0646\u06a9\u0634\u0646 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0635\u0631\u0641 100 \u0627\u0646 \u067e\u0679 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0639\u06cc\u0646 \u0645\u0637\u0627\u0628\u0642 \u062a\u0642\u0633\u06cc\u0645 \u0628\u0627\u0644\u06a9\u0644 90\/10 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0631\u0648\u0679\u0646\u06af \u062a\u0639\u06cc\u06cc\u0646\u0627\u062a\u06cc\u060c \u0642\u0627\u0628\u0644 \u067e\u06cc\u0645\u0627\u0626\u0634 \u0627\u0648\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u06c1\u06d2\u06d4 <code>rolloutPercentage<\/code>.<\/p>\n<p>\u062c\u0628 \u0645\u0646\u062a\u0642\u0644\u06cc \u0639\u0645\u0644 \u0645\u06cc\u06ba \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u062a\u0636\u0627\u062f \u06a9\u0627\u0624\u0646\u0679\u0631 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u0633\u06af\u0646\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0631\u0648\u0644 \u0622\u0624\u0679 \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062a\u0648 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">service.migratedEnabled = false;\n<\/code><\/pre>\n<p>\u0627\u0633 \u0648\u0642\u062a \u0633\u06d2\u060c \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u062c\u0648\u0627\u0628 \u062c\u0648 \u0648\u0627\u067e\u0633 \u0622\u0626\u06d2 \u06af\u0627 \u0648\u06c1 \u0645\u06cc\u0631\u0627\u062b \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u0633\u06d2 \u0648\u0627\u067e\u0633 \u0622\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0622\u0633\u0627\u0646 \u06a9\u06cc \u06af\u0626\u06cc \u0645\u062b\u0627\u0644 \u06c1\u06d2\u06d4 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0636\u0628\u0648\u0637 \u0631\u0648\u0679\u0646\u06af\u060c \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06d2 \u0645\u06cc\u0679\u0631\u06a9\u0633\u060c \u063a\u0644\u0637\u06cc \u0633\u06d2 \u0646\u0645\u0679\u0646\u06d2\u060c \u0645\u0633\u062a\u0642\u0644 \u062d\u0627\u0644\u062a\u060c \u0627\u0648\u0631 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0633\u06d2 \u0645\u062d\u062a\u0627\u0637 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0646\u0645\u0679\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0639\u0645\u0644 \u06a9\u0648 \u0622\u0646\u06a9\u06be \u0628\u0646\u062f \u06a9\u0631 \u06a9\u06d2 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06af\u0631 \u0622\u067e \u0627\u0646\u0648\u0627\u0626\u0633\u0632 \u0628\u0646\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc \u0645\u06cc\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u062f\u0648 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0644\u06a9\u06be \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0628\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u06cc\u0627 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062f\u06a9\u06be\u0627\u0626\u06cc \u062f\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u067e\u0648\u0633\u0679 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0646 \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba\u060c \u0634\u06cc\u0688\u0648 \u067e\u0627\u062a\u06be \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688\u0646\u06af \u0627\u0688\u0627\u067e\u0679\u0631\u060c \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631\u060c \u06cc\u0627 \u0627\u0635\u0644 \u0627\u062b\u0631 \u06a9\u0648 \u0646\u0642\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0631\u0648\u06cc\u06d2 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u06a9\u0646\u0679\u0631\u0648\u0644 \u0644\u0648\u067e \u0627\u06cc\u06a9 \u06c1\u06cc \u06c1\u06d2.<\/p>\n<pre><code class=\"language-text\">same input\n\u2193\ncompare legacy and migrated behavior\n\u2193\nroute a small percentage\n\u2193\nobserve\n\u2193\nexpand or roll back\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u0633\u0628 \u0633\u06d2 \u0686\u06be\u0648\u0679\u06cc \u0645\u0641\u06cc\u062f \u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-design-rollback-before-you-need-it\">\u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06a9\u0633\u06cc \u0648\u0627\u0642\u0639\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0631\u0648\u0644 \u0628\u06cc\u06a9\u0633 \u06a9\u0648 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u067e\u0648\u0686\u06be\u06cc\u06ba \u06a9\u06c1 \u0627\u06af\u0631 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u0631\u0627\u0633\u062a\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0631\u0648\u0679\u0646\u06af \u0644\u06cc\u0648\u0644 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0633\u06cc\u062f\u06be\u0627 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">migration flag = false\n<\/code><\/pre>\n<p>\u0679\u0631\u06cc\u0641\u06a9 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc:<\/p>\n<pre><code class=\"language-text\">legacy implementation\n<\/code><\/pre>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-typescript\">if (\n  featureFlags.useNewInvoices\n) {\n  return migrated.generate(\n    orderId\n  );\n}\n\nreturn legacy.generate(orderId);\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u063a\u0644\u0637 \u0628\u0631\u062a\u0627\u0624 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">useNewInvoices = false\n<\/code><\/pre>\n<p>\u0631\u0648\u0644 \u0628\u06cc\u06a9 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0641\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0631\u0648\u0644 \u0628\u06cc\u06a9\u0633 \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">data format changes\nnew data is written\nevents differ\nexternal systems are updated\nlegacy code cannot read new records\n<\/code><\/pre>\n<p>\u0627\u0646 \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba\u060c \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u06cc\u0686\u0631 \u06a9\u06d2 \u062c\u06be\u0646\u0688\u06d2 \u06a9\u0648 \u067e\u0644\u0679\u0627\u0646\u06d2 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u067e\u0691 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u067e\u0633\u0645\u0627\u0646\u062f\u06c1 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u062f\u0648\u0646\u0648\u06ba \u0648\u0631\u0698\u0646 \u0627\u06cc\u06a9 \u06c1\u06cc \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0648 \u067e\u0691\u06be \u0633\u06a9\u06cc\u06ba \u0627\u0648\u0631 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a\u060c \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0648\u0627\u0642\u0639\u0627\u062a\u060c \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0639\u0627\u0648\u0636\u06c1 \u062f\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632\u060c \u06cc\u0627 \u0645\u062e\u062a\u0635\u0631 \u0645\u062f\u062a \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062c\u0628 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0646\u0638\u0627\u0645 \u0646\u0626\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0644\u06a9\u06be\u06d2 \u06af\u0626\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u06d2\u06d4<\/p>\n<p>\u06c1\u0627\u0626\u06cc \u0631\u0633\u06a9 \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06cc\u06c1 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0628\u0627\u0624\u0646\u0688\u0631\u06cc\u0632 \u06a9\u06cc \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u0627 \u0628\u06be\u06cc \u0645\u062f\u062f\u06af\u0627\u0631 \u062b\u0627\u0628\u062a \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0679\u0631\u06cc\u0641\u06a9 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0648\u0631\u0627\u062b\u062a \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u0622 \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0646\u06cc\u0627 \u0633\u06a9\u06cc\u0645\u0627 \u0648\u0631\u0698\u0646 \u0646\u06c1\u06cc\u06ba \u0628\u0646 \u062c\u0627\u062a\u0627\u060c \u06cc\u0627 \u06a9\u0633\u06cc \u0645\u062e\u0635\u0648\u0635 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06d2 \u0628\u0639\u062f \u0628\u062d\u0627\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0627\u062f\u06c1 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u0639\u0627\u0648\u0636\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0628 \u0627\u06cc\u06a9 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0628 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0628\u062d\u0627\u0644\u06cc \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u067e\u0631 \u062c\u0627\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-treat-data-migration-as-a-separate-problem\">\u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648 \u0627\u0644\u06af \u0645\u0633\u0626\u0644\u06c1 \u0633\u0645\u062c\u06be\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06af\u0631\u0686\u06c1 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627 \u062a\u0639\u0644\u0642 \u06c1\u06d2\u060c \u0648\u06c1 \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u0626\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0645 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0627 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0646\u0638\u0627\u0645 \u0630\u062e\u06cc\u0631\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-json\">{\n  \"customer_type\": \"P\",\n  \"status\": 2\n}\n<\/code><\/pre>\n<p>\u062c\u0628 \u06a9\u06c1 \u0646\u06cc\u0627 \u0646\u0638\u0627\u0645 \u0628\u0686\u0627\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-json\">{\n  \"customerType\": \"PREMIUM\",\n  \"status\": \"APPROVED\"\n}\n<\/code><\/pre>\n<p>\u0627\u0628 \u0622\u067e \u06a9\u0648 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2:<\/p>\n<pre><code class=\"language-text\">Which database is authoritative?\n\nCan both systems read the same data?\n\nDo we transform on read?\n\nDo we migrate records in batches?\n\nDo we replicate changes?\n\nWhen does ownership change?\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06d2 \u0648\u0627\u0636\u062d \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4 \u0628\u0635\u0648\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062f\u06a9\u06be\u0627\u0626\u06cc \u062f\u06d2 \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u062c\u0628\u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062d\u062f\u0648\u062f \u0645\u0628\u06c1\u0645 \u0631\u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-be-careful-with-dual-writes\">\u062f\u0648\u06c1\u0631\u06cc \u062a\u062d\u0631\u06cc\u0631 \u0633\u06d2 \u0645\u062d\u062a\u0627\u0637 \u0631\u06c1\u06cc\u06ba<\/h2>\n<p>\u0627\u06cc\u06a9 \u0639\u0627\u0645 \u062a\u0628\u0627\u062f\u0644\u0648\u06ba \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">write to legacy database\n+\nwrite to new database\n<\/code><\/pre>\n<p>\u0627\u0633\u06d2 \u0688\u0628\u0644 \u0631\u0627\u0626\u0679 \u06a9\u06c1\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0622\u0633\u0627\u0646 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-typescript\">await legacyOrders.save(order);\nawait newOrders.save(order);\n<\/code><\/pre>\n<p>\u0644\u06cc\u06a9\u0646 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628:<\/p>\n<pre><code class=\"language-text\">legacy write succeeds\nnew write fails\n<\/code><\/pre>\n<p>\u0627\u0628 \u062f\u0648\u0646\u0648\u06ba \u0646\u0638\u0627\u0645 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u0633\u06d2 \u0645\u0637\u0627\u0628\u0642\u062a \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u062a\u06d2\u06d4<\/p>\n<p>\u06cc\u0627:<\/p>\n<pre><code class=\"language-text\">legacy write fails\nnew write succeeds\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u0626\u0644\u06c1\u06d4<\/p>\n<p>\u0688\u0628\u0644 \u0644\u06a9\u06be\u0646\u0627 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc \u0645\u0633\u062a\u0642\u0644 \u0645\u0632\u0627\u062c\u06cc \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0648 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u0648\u0686\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2:<\/p>\n<pre><code class=\"language-text\">retries\nidempotency\nreconciliation\nordering\npartial failure\nmonitoring\n<\/code><\/pre>\n<p>\u06a9\u0628\u06be\u06cc \u06a9\u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">single authoritative write\n\u2193\nchange event\n\u2193\nreplication\n<\/code><\/pre>\n<p>\u06cc\u0627 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646\u0644 \u0622\u0624\u0679 \u0628\u0627\u06a9\u0633\u06d4<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0639\u0627\u0644\u0645\u06af\u06cc\u0631 \u062d\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0645 \u062f\u0648\u06c1\u0631\u06cc \u062a\u062d\u0631\u06cc\u0631\u0648\u06ba \u06a9\u0648 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc \u062a\u06a9\u0646\u06cc\u06a9 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u0645\u0627\u0646\u062a\u06d2\u06d4<\/p>\n<h2 id=\"heading-decide-who-owns-the-data\">\u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0627 \u0645\u0627\u0644\u06a9 \u06a9\u0648\u0646 \u06c1\u06d2\u06d4<\/h2>\n<p>\u0628\u0642\u0627\u0626\u06d2 \u0628\u0627\u06c1\u0645\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0645\u0644\u06a9\u06cc\u062a \u0645\u0628\u06c1\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacy system writes customers\n\nnew system writes invoices\n\nboth systems read orders\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0645\u0639\u0642\u0648\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633\u06d2 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u06cc \u0634\u06a9\u0644 \u062f\u06cc\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0631 \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u06c1 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">system of record\nwrite owner\nreaders\nreplication direction\nconsistency expectations\n<\/code><\/pre>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Invoices\n\nWrite owner:\nnew system\n\nSource of truth:\nnew database\n\nLegacy access:\nread-only adapter\n\nReplication:\nnew \u2192 legacy reporting store\n<\/code><\/pre>\n<p>\u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06cc \u0627\u0628 \u0627\u06cc\u06a9 \u0648\u0627\u0636\u062d \u0633\u0645\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0644\u06a9\u06cc\u062a \u06a9\u06d2 \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u0645\u0633\u062a\u0642\u0644 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-observe-business-behavior-not-just-infrastructure\">\u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0631\u0648\u06cc\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0627 \u0628\u06be\u06cc \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0631\u0648\u0644 \u0622\u0624\u0679 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u060c \u0679\u06cc\u0645 \u06a9\u062b\u0631\u062a \u0633\u06d2 \u0646\u06af\u0631\u0627\u0646\u06cc \u06a9\u0631\u06d2 \u06af\u06cc:<\/p>\n<pre><code class=\"language-text\">CPU\nmemory\nlatency\nHTTP 500s\ndatabase connections\n<\/code><\/pre>\n<p>\u0648\u06c1 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u06a9\u06cc\u0644\u0627 \u06a9\u0627\u0641\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">HTTP 200 rate = 99.99%\n<\/code><\/pre>\n<p>\u062c\u0628\u06a9\u06c1:<\/p>\n<pre><code class=\"language-text\">invoice totals are wrong\n<\/code><\/pre>\n<p>\u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u06cc \u0646\u06af\u0631\u0627\u0646\u06cc \u06a9\u0627 \u06a9\u06c1\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1:<\/p>\n<pre><code class=\"language-text\">healthy\n<\/code><\/pre>\n<p>\u0644\u06cc\u06a9\u0646 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0646\u0638\u0627\u0645 \u0635\u062d\u062a \u0645\u0646\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0645\u0634\u0627\u06c1\u062f\u06d2 \u0645\u06cc\u06ba \u0688\u0648\u0645\u06cc\u0646 \u0633\u06af\u0646\u0644\u0632 \u0634\u0627\u0645\u0644 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">orders processed\npayments authorized\ninvoices generated\ndiscount distribution\nfailed renewals\naverage invoice total\nevents published\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0639\u0627\u0645 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0646\u0642\u0627\u0626\u0635 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0648 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0645\u06cc\u0679\u0631\u06a9\u0633 \u0633\u06d2 \u0645\u062d\u0631\u0648\u0645 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-know-when-a-migration-slice-is-complete\">\u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627 \u0679\u06a9\u0691\u0627 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0679\u0631\u06cc\u0641\u06a9 \u06a9\u06d2 100% \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0641\u06cc\u0686\u0631\u0632 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0642\u0631\u0627\u0631 \u062f\u06cc\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">100% traffic on new path\nacceptable error rate\nacceptable latency\nbehavioral differences resolved\nside effects verified\ndata ownership established\nrollback window completed\nlegacy callers removed\nlegacy writes stopped\nobservability in place\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u0633\u0648\u0627\u0644 \u067e\u0648\u0686\u06be\u06cc\u06ba\u06d4<\/p>\n<blockquote>\n<p>\u0648\u0631\u0627\u062b\u062a \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0627\u0628 \u0628\u06be\u06cc \u06a9\u0633 \u0645\u0642\u0635\u062f \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u061f<\/p>\n<\/blockquote>\n<p>\u0627\u06af\u0631 \u0646\u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0633\u06d2 \u06c1\u0679\u0627 \u062f\u06cc\u06ba.<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06cc\u06c1 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">maintenance cost\nconfusion\nduplicate bugs\nunclear ownership\nfuture migration debt\n<\/code><\/pre>\n<p>\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648 \u0628\u0627\u0644\u0622\u062e\u0631 \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633\u06d2 \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h2 id=\"heading-remove-the-legacy-path\">\u0645\u06cc\u0631\u0627\u062b\u06cc \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u06ba\u06d4<\/h2>\n<p>\u06cc\u06c1 \u0645\u0631\u062d\u0644\u06c1 \u0627\u06a9\u062b\u0631 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u0627 \u0634\u06a9\u0627\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u06cc\u0645 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u067e\u0631\u0627\u0646\u06d2 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">just in case\n<\/code><\/pre>\n<p>\u0686\u0646\u062f \u0645\u0627\u06c1 \u0628\u0639\u062f:<\/p>\n<pre><code class=\"language-text\">nobody knows whether it is still used\n<\/code><\/pre>\n<p>\u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">routing metrics show zero traffic\nno callers depend on it\ndata dependencies are removed\nrollback period is complete\noperational documentation is updated\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u06c1\u0679\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacy implementation\nlegacy feature flags\nlegacy database access\nunused integration code\ntemporary compatibility layers\n<\/code><\/pre>\n<p>\u062d\u0630\u0641 \u06a9\u0631\u0646\u0627 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u062c\u0631\u062a \u062c\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u06c1\u0679\u0627\u0626\u06d2 \u0628\u063a\u06cc\u0631 \u0646\u0626\u06d2 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-use-ai-during-an-incremental-migration\">\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 AI \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>AI \u0627\u0633 \u0639\u0645\u0644 \u06a9\u06d2 \u0628\u06c1\u062a \u0633\u06d2 \u062d\u0635\u0648\u06ba \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u06c1\u0645 \u0645\u06cc\u0631\u0627\u062b\u06cc \u06a9\u0648\u0688 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u06d2 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06cc\u0633\u06d2:<\/p>\n<pre><code class=\"language-text\">Which modules implement this capability?\n\nWhich callers depend on it?\n\nWhich database tables does it touch?\n\nWhich external services does it call?\n\nWhich side effects occur?\n\nWhich feature flags already exist?\n\nWhich paths need adapters?\n<\/code><\/pre>\n<p>\u06a9\u0686\u06be \u0645\u0641\u06cc\u062f \u0627\u0634\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">Analyze the Generate Invoice capability.\n\nIdentify:\n\n1. entry points,\n2. business rules,\n3. persistence dependencies,\n4. external integrations,\n5. side effects,\n6. callers,\n7. data ownership,\n8. possible migration seams.\n\nDo not redesign the system.\n\nReturn evidence for each finding using file paths\nand relevant code references.\n<\/code><\/pre>\n<p>AI \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0628\u06be\u06cc \u0622\u067e \u06a9\u06cc \u0645\u062f\u062f \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Compare the legacy and migrated implementations.\n\nIdentify possible behavioral differences in:\n\n- return values,\n- errors,\n- side effects,\n- persistence,\n- event ordering,\n- retries,\n- idempotency,\n- transaction boundaries.\n\nDo not assume the new implementation is correct.\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0645\u0641\u06cc\u062f \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06a9\u0631\u0627\u0631\u06cc \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 AI \u0627\u0633 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0648 \u062a\u06cc\u0632 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-dont-let-ai-turn-the-migration-into-a-rewrite\">AI \u06a9\u0648 \u06c1\u062c\u0631\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1 \u06c1\u0648\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0639\u0627\u0645 \u0637\u0631\u06cc\u0642\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0622\u067e \u067e\u0648\u0686\u06be\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<blockquote>\n<p>\u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u0633 \u0645\u06cc\u0631\u0627\u062b\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u06c1\u0645\u0627\u0631\u06cc \u0645\u062f\u062f \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/blockquote>\n<p>\u0645\u0627\u0688\u0644 \u0627\u0633 \u0637\u0631\u062d \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">new architecture\nnew domain model\nnew API\nnew event model\nnew database schema\nnew validation layer\nnew framework\n<\/code><\/pre>\n<p>\u0627\u0633 \u0648\u0642\u062a\u060c \u0622\u067e \u0627\u0628 \u06a9\u0633\u06cc \u0627\u06cc\u06a9 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0622\u067e \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0628\u06be\u06cc \u06a9\u0628\u06be\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0636\u0631\u0648\u0631\u06cc \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633\u06d2 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u0648\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u060c \u0648\u0627\u0636\u062d \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0634\u0627\u0631\u06d2 \u06a9\u0648 \u062a\u0631\u062c\u06cc\u062d \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">Migrate this capability without intentionally changing\nobservable behavior.\n\nPreserve:\n\n- inputs,\n- outputs,\n- errors,\n- side effects,\n- ordering where relevant,\n- transactional behavior.\n\nOnly introduce the minimum structural changes required\nto run it in the target environment.\n\nList any behavior you cannot preserve with confidence.\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0648 \u062a\u0646\u06af \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>AI \u06a9\u0648 \u0645\u06a9\u06cc\u0646\u06cc\u06a9\u0644 \u06a9\u0648\u0634\u0634\u0648\u06ba \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u062f\u0627\u0626\u0631\u06c1 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0646\u06c1\u06cc\u06ba \u0628\u0691\u06be\u0627\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h2 id=\"heading-a-practical-incremental-migration-workflow\">\u0639\u0645\u0644\u06cc \u0628\u0691\u06be\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648<\/h2>\n<p>\u0645\u06cc\u06ba \u062c\u0648 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0648\u06ba \u06af\u0627 \u0648\u06c1 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<h3 id=\"heading-1-understand-the-capability\">1. \u0627\u067e\u0646\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a\u0648\u06ba \u06a9\u0648 \u0633\u0645\u062c\u06be\u06cc\u06ba\u06d4<\/h3>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">inputs\noutputs\nrules\nside effects\ndependencies\nunknowns\n<\/code><\/pre>\n<h3 id=\"heading-2-characterize-existing-behavior\">2. \u0645\u0648\u062c\u0648\u062f\u06c1 \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a<\/h3>\n<p>\u0627\u067e\u0646\u06d2 \u0627\u06c1\u0645 \u0627\u0639\u0645\u0627\u0644 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">characterization tests\nintegration tests\ncontract tests\n<\/code><\/pre>\n<h3 id=\"heading-3-refactor-for-migration\">3. \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af<\/h3>\n<p>\u0628\u0646\u0627\u0646\u0627:<\/p>\n<pre><code class=\"language-text\">seams\nadapters\nexplicit dependencies\nclear orchestration\n<\/code><\/pre>\n<p>\u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u067e\u0646\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631\u06d4<\/p>\n<h3 id=\"heading-4-build-the-new-implementation\">4. \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631<\/h3>\n<p>\u06c1\u062f\u0641 \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u06cc\u06ba\u06d4 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u0645\u0639\u0627\u06c1\u062f\u0648\u06ba \u06a9\u0648 \u0648\u0627\u0636\u062d \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-5-differentially-test-old-and-new\">5. \u067e\u0631\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u06a9\u0648 \u0627\u0644\u06af \u0627\u0644\u06af \u062c\u0627\u0646\u0686\u06cc\u06ba\u06d4<\/h3>\n<p>\u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">outputs\nerrors\nside effects\nbusiness state\n<\/code><\/pre>\n<p>\u0646\u0645\u0627\u0626\u0646\u062f\u06c1 \u0645\u062b\u0627\u0644\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-6-introduce-explicit-routing\">6. \u0648\u0627\u0636\u062d \u0631\u0648\u0679\u0646\u06af \u06a9\u0627 \u062a\u0639\u0627\u0631\u0641<\/h3>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">legacy\nor\nmigrated\n<\/code><\/pre>\n<p>\u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06c1\u062c\u0631\u062a \u06a9\u06cc \u067e\u0627\u0644\u06cc\u0633\u06cc\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2\u06d4<\/p>\n<h3 id=\"heading-7-start-with-safe-traffic\">7. \u0645\u062d\u0641\u0648\u0638 \u0646\u0642\u0644 \u0648 \u062d\u0645\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">internal users\ntest tenants\nselected customers\n<\/code><\/pre>\n<h3 id=\"heading-8-increase-traffic-gradually\">8. \u0627\u067e\u0646\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u0645\u06cc\u06ba \u0628\u062a\u062f\u0631\u06cc\u062c \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">1%\n5%\n10%\n25%\n50%\n100%\n<\/code><\/pre>\n<p>\u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062c\u0628 \u062b\u0628\u0648\u062a \u0627\u06af\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u06cc \u062d\u0645\u0627\u06cc\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-9-monitor-technical-and-business-metrics\">9. \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0627\u0648\u0631 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0627\u0634\u0627\u0631\u06d2 \u06a9\u06cc \u0646\u06af\u0631\u0627\u0646\u06cc \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u062f\u0648\u0646\u0648\u06ba \u06a9\u0627 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-text\">system health\nbusiness behavior\n<\/code><\/pre>\n<h3 id=\"heading-10-keep-rollback-available\">10. \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0645\u0645\u06a9\u0646 \u0631\u06a9\u06be\u06cc\u06ba<\/h3>\n<p>\u0627\u067e\u0646\u06d2 \u0648\u0631\u0627\u062b\u062a \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u0646\u0627 \u062a\u06cc\u0632 \u0627\u0648\u0631 \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-11-transfer-data-ownership\">11. \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0645\u0644\u06a9\u06cc\u062a \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc\u06d4<\/h3>\n<p>\u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 \u0646\u0638\u0627\u0645 \u0645\u0627\u0644\u06a9 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">writes\nreads\nreplication\n<\/code><\/pre>\n<h3 id=\"heading-12-remove-the-legacy-path\">12. \u0645\u06cc\u0631\u0627\u062b\u06cc \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0645\u0633\u062a\u062d\u06a9\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f:<\/p>\n<pre><code class=\"language-text\">delete old implementation\nremove temporary routing\nremove obsolete dependencies\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba:<\/p>\n<h2 id=\"heading-what-incremental-migration-doesnt-solve\">\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u0633\u06d2 \u06a9\u06cc\u0627 \u062d\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627<\/h2>\n<p>\u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u062e\u0637\u0631\u06d2 \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u06a9\u0648 \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u0628 \u0628\u06be\u06cc \u062f\u0631\u062c \u0630\u06cc\u0644 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u0627 \u062e\u06cc\u0627\u0644 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u067e\u0691 \u0633\u06a9\u062a\u06cc \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">distributed transactions\nshared databases\nold schemas\ntight coupling\nunsupported runtimes\npoor test coverage\norganizational ownership\nregulatory constraints\n<\/code><\/pre>\n<p>\u06a9\u0686\u06be \u0646\u0638\u0627\u0645 \u062c\u0632\u0648\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648 \u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u0645\u0634\u06a9\u0644 \u0628\u0646\u0627 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">highly stateful systems\nstrongly coupled desktop applications\nlarge transactional batch systems\nsystems with shared global state\n<\/code><\/pre>\n<p>\u06a9\u0686\u06be \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba\u060c \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u062d\u062f \u06a9\u0648 \u0628\u0691\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u067e\u0691 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0635\u0648\u0644 \u0648\u06c1\u06cc \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<blockquote>\n<p>\u0633\u0628 \u0633\u06d2 \u0686\u06be\u0648\u0679\u06cc \u0627\u0644\u0679 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0645\u0641\u06cc\u062f \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/blockquote>\n<p>\u0627\u0636\u0627\u0641\u06c1 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u0645\u06cc\u0634\u06c1 \u0686\u06be\u0648\u0679\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1\u06d4<\/p>\n<h2 id=\"heading-the-complete-legacy-modernization-workflow\">\u0645\u06a9\u0645\u0644 \u0645\u06cc\u0631\u0627\u062b\u06cc \u062c\u062f\u06cc\u062f \u06a9\u0627\u0631\u06cc \u0648\u0631\u06a9 \u0641\u0644\u0648<\/h2>\n<p>\u06cc\u06c1 \u0645\u0636\u0645\u0648\u0646 \u0627\u0633 \u06a9\u0627\u0645 \u06a9\u06d2 \u0641\u0644\u0648 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u06c1\u0645 \u0646\u06d2 \u0627\u0633 \u0633\u0644\u0633\u0644\u06d2 \u0645\u06cc\u06ba \u0642\u0627\u0626\u0645 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u0633\u0626\u0644\u06c1 \u0633\u06d2 \u0622\u063a\u0627\u0632 \u06a9\u06cc\u0627\u06d4<\/p>\n<blockquote>\n<p>\u0622\u067e \u067e\u0631\u0627\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u063a\u0644\u0637\u06cc \u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u06d2 \u0628\u063a\u06cc\u0631 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u062c\u062f\u06cc\u062f \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<\/blockquote>\n<p>\u067e\u06c1\u0644\u0627 \u0642\u062f\u0645 \u0633\u0645\u062c\u06be\u0646\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<pre><code class=\"language-text\">Legacy system\n\u2193\ninvestigate\n\u2193\nmap behavior and dependencies\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u06a9\u0631\u062f\u0627\u0631 \u0646\u06af\u0627\u0631\u06cc \u06d4<\/p>\n<pre><code class=\"language-text\">observed behavior\n\u2193\ntests\n\u2193\nbehavioral safety net\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u0627\u0633\u06d2 \u0631\u06cc \u0627\u06cc\u06a9\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-text\">entangled capability\n\u2193\nseams and boundaries\n\u2193\nmigration-friendly structure\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u062a\u0641\u0631\u06cc\u0642 \u06a9\u06cc \u062c\u0627\u0646\u0686\u06d4<\/p>\n<pre><code class=\"language-text\">legacy implementation\n        +\nnew implementation\n        \u2193\nbehavior comparison\n<\/code><\/pre>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc.<\/p>\n<pre><code class=\"language-text\">Understand\n\u2193\nCharacterize\n\u2193\nRefactor\n\u2193\nMigrate\n\u2193\nCompare\n\u2193\nRoute\n\u2193\nObserve\n\u2193\nExpand\n\u2193\nRemove legacy\n<\/code><\/pre>\n<p>\u0622\u0631\u0688\u0631 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0641\u06c1\u0627\u0645 \u0648 \u062a\u0641\u06c1\u06cc\u0645 \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u0627 \u063a\u0644\u0637 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627 \u0628\u0627\u0639\u062b \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0631\u062f\u0627\u0631 \u0646\u06af\u0627\u0631\u06cc \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c \u0631\u0648\u06cc\u06d2 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u06a9\u0633\u06cc \u06a9\u0627 \u062f\u06be\u06cc\u0627\u0646 \u0646\u06c1\u06cc\u06ba \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u062d\u062f\u06cc\u06ba \u0628\u06c1\u062a \u0628\u0691\u06cc \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u0627 \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u06a9\u0648 \u0686\u06be\u067e\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0646\u06a9\u0631\u06cc\u0645\u0646\u0679\u0644 \u0631\u0648\u0644 \u0622\u0624\u0679 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u062f\u06be\u0645\u0627\u06a9\u06d2 \u06a9\u06d2 \u0631\u062f\u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0633\u0627\u0626\u0644 \u0646\u0638\u0631 \u0622\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u06c1\u0631 \u0642\u062f\u0645 \u0645\u062e\u062a\u0644\u0641 \u0642\u0633\u0645 \u06a9\u06cc \u063a\u06cc\u0631 \u06cc\u0642\u06cc\u0646\u06cc \u0635\u0648\u0631\u062a\u062d\u0627\u0644 \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062c\u062f\u06cc\u062f \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0645\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0645\u062d\u0641\u0648\u0638 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0627\u0648\u0631 \u0646\u0626\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u0648 \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u06c1\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u0627\u0633\u062a\u06c1 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u06be\u0648\u0691\u06cc \u0633\u06cc \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u0631\u0648\u0679 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u062b\u0628\u0648\u062a \u0627\u0633 \u06a9\u06cc \u062a\u0627\u0626\u06cc\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0679\u0631\u06cc\u0641\u06a9 \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0646\u06c1\u06cc\u06ba \u062a\u0648 \u0648\u0627\u067e\u0633 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0645\u0644\u06a9\u06cc\u062a \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0648\u0631 \u062f\u06c1\u0631\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u06a9\u0645\u0644 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">Understand\n\u2193\nCharacterize\n\u2193\nRefactor\n\u2193\nMigrate incrementally\n\u2193\nCompare behavior\n\u2193\nProgressively route traffic\n\u2193\nObserve\n\u2193\nRemove legacy\n<\/code><\/pre>\n<p>AI \u06c1\u0631 \u0642\u062f\u0645 \u06a9\u0648 \u062a\u06cc\u0632 \u062a\u0631 \u0628\u0646\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u06a9\u0648\u0688 \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u0646\u06d2\u060c \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u0646\u06d2\u060c \u0627\u0688\u0627\u067e\u0679\u0631 \u0628\u0646\u0627\u0646\u06d2\u060c \u0646\u0641\u0627\u0630 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u06d2\u060c \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0627 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0641\u0631\u0642 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u0645\u0644 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u0631\u0641\u062a\u0627\u0631 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u06d2 \u0628\u0631\u0627\u0628\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06c1\u0645 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0628 \u0628\u06be\u06cc \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">What behavior matters?\n\nWhat can change?\n\nWhat should remain compatible?\n\nWhat is the migration boundary?\n\nWhat evidence is enough?\n\nWhen is rollback necessary?\n\nWhen can the legacy path be removed?\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0648\u0688 \u062c\u0646\u0631\u06cc\u0634\u0646 \u06a9\u0627 \u0633\u0648\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06c1\u062c\u0631\u062a \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0648\u0631 \u06cc\u06c1 \u0627\u0633 \u067e\u0648\u0631\u06cc \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0627 \u0633\u0628 \u0633\u06d2 \u0628\u0691\u0627 \u0633\u0628\u0642 \u06c1\u06d2\u06d4<\/p>\n<p>AI \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u0646\u06cc\u0627 \u06a9\u0648\u0688 \u0628\u0646\u0627\u0646\u0627 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0633\u0633\u062a\u0627 \u06c1\u0648\u062a\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0645\u06cc\u0631\u0627\u062b\u06cc \u062c\u062f\u06cc\u062f\u06cc\u062a \u0645\u0639\u0645\u0648\u0644\u06cc \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0627 \u0645\u0639\u06cc\u0627\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0628 \u0633\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06c1\u062c\u0631\u062a\u06cc\u06ba \u0648\u06c1 \u06c1\u06cc\u06ba \u062c\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u06c1 \u0645\u0633\u0644\u0633\u0644 \u06cc\u06c1 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u06a9\u06cc\u0648\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0622\u06cc\u0627 \u0627\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0646\u0627 \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0645\u06cc\u0631\u0627\u062b\u06cc \u06c1\u062c\u0631\u062a\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u062d\u062a\u0645\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u0633\u06d2 \u0628\u06c1\u062a \u067e\u06c1\u0644\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0627\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u0648\u0642\u062a \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0628 \u0627\u06cc\u06a9 \u06c1\u062c\u0631\u062a \u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u067e\u0646\u06d2 \u067e\u0631\u0627\u0646\u06d2 \u0633\u0633\u0679\u0645 \u06a9\u0648 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-29507","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/29507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/comments?post=29507"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/29507\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media?parent=29507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/categories?post=29507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/tags?post=29507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}