{"id":29019,"date":"2026-09-08T23:02:41","date_gmt":"2026-09-08T23:02:41","guid":{"rendered":"https:\/\/umang.pk\/2026\/09\/08\/%db%81%d8%ac%d8%b1%d8%aa-%d8%b3%db%92-%d9%be%db%81%d9%84%db%92-%d9%85%db%8c%d8%b1%d8%a7%d8%ab%db%8c-%d8%a7%db%8c%d9%be%d9%84%db%8c-%da%a9%db%8c%d8%b4%d9%86%d8%b2-%da%a9%d9%88-%da%a9%db%8c%d8%b3%db%92\/"},"modified":"2026-09-08T23:02:41","modified_gmt":"2026-09-08T23:02:41","slug":"%db%81%d8%ac%d8%b1%d8%aa-%d8%b3%db%92-%d9%be%db%81%d9%84%db%92-%d9%85%db%8c%d8%b1%d8%a7%d8%ab%db%8c-%d8%a7%db%8c%d9%be%d9%84%db%8c-%da%a9%db%8c%d8%b4%d9%86%d8%b2-%da%a9%d9%88-%da%a9%db%8c%d8%b3%db%92","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/09\/08\/%db%81%d8%ac%d8%b1%d8%aa-%d8%b3%db%92-%d9%be%db%81%d9%84%db%92-%d9%85%db%8c%d8%b1%d8%a7%d8%ab%db%8c-%d8%a7%db%8c%d9%be%d9%84%db%8c-%da%a9%db%8c%d8%b4%d9%86%d8%b2-%da%a9%d9%88-%da%a9%db%8c%d8%b3%db%92\/","title":{"rendered":"\u06c1\u062c\u0631\u062a \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0631\u06cc \u0627\u06cc\u06a9\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u062c\u0633 \u0644\u0645\u062d\u06d2 \u06a9\u0648\u0626\u06cc \u0679\u06cc\u0645 \u0645\u06cc\u0631\u0627\u062b\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0648\u0688 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u062f\u0628\u0627\u0624 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u067e\u0646\u0627 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633\u060c API\u060c \u06cc\u0627 UI \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u067e\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9\u060c \u0631\u0646 \u0679\u0627\u0626\u0645\u060c \u06a9\u0644\u0627\u0624\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1\u060c \u06cc\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0642\u0627\u0628\u0644 \u0641\u06c1\u0645 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0646\u0638\u0627\u0645 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0627\u0635\u0648\u0644\u0648\u06ba\u060c \u0627\u0633\u062a\u0642\u0627\u0645\u062a\u060c \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0627\u0688\u06cc\u0648\u0644 \u0645\u06cc\u06ba \u0628\u06cc\u0631\u0648\u0646\u06cc \u0627\u0646\u0636\u0645\u0627\u0645 \u0627\u0648\u0631 \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0634\u0646 \u06a9\u0648 \u0645\u0644\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06c1\u062c\u0631\u062a \u0627\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0635\u0631\u0641 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06c1\u0645 \u06a9\u0626\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc\u0648\u06ba \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u0633\u0627\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0622\u067e\u0633 \u0645\u06cc\u06ba \u062c\u0691\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0645\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u0648 \u062a\u0631\u062c\u06cc\u062d \u062f\u06cc\u062a\u0627 \u06c1\u0648\u06ba\u06d4 <strong>\u067e\u06c1\u0644\u06d2<\/strong> \u06c1\u062c\u0631\u062a\u06d4 \u06c1\u0645 \u0645\u06cc\u0631\u0627\u062b\u06cc \u0646\u0638\u0627\u0645 \u06a9\u0648 \u062e\u0648\u0628\u0635\u0648\u0631\u062a \u0628\u0646\u0627\u0646\u06d2 \u06cc\u0627 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u062a\u06cc\u0627\u0631\u06cc \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u0648 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4<\/p>\n<p>\u0645\u0642\u0635\u062f \u0628\u06c1\u062a \u062a\u0646\u06af \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0648 \u06a9\u0627\u0641\u06cc \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u0627\u06c1\u0645 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc \u062c\u0627 \u0633\u06a9\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0631\u0627\u062d\u0644 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0648\u0688 \u0628\u06cc\u0633 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u0633 \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0631\u06cc\u06a9\u0679\u0631\u0627\u0626\u0632\u06cc\u0634\u0646 \u0679\u06cc\u0633\u0679 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0633\u06d2 \u06c1\u0645 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u062a\u06be\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\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 \u0628\u062a\u0627\u0624\u06ba \u06af\u0627 \u06a9\u06c1 \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0631\u0627\u062b\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc\u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u062d\u062f\u0648\u062f \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628\u061b<\/p>\n<\/li>\n<li>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u0633\u06d2 \u0627\u0644\u06af \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0627\u0635\u0648\u0644\u060c<\/p>\n<\/li>\n<li>\n<p>\u0633\u06cc\u0648\u0646 \u06a9\u0627 \u062a\u0639\u0627\u0631\u0641\u060c<\/p>\n<\/li>\n<li>\n<p>\u0627\u0644\u06af \u0627\u0644\u06af \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a\u060c<\/p>\n<\/li>\n<li>\n<p>\u0628\u06cc\u0631\u0648\u0646\u06cc \u0646\u0638\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u0627\u0688\u0627\u067e\u0679\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c<\/p>\n<\/li>\n<li>\n<p>\u0627\u0646\u062d\u0635\u0627\u0631 \u0633\u0645\u062a \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u06cc\u06ba\u060c<\/p>\n<\/li>\n<li>\n<p>\u0645\u0631\u0628\u0648\u0637 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u0646\u06a9\u0627\u0644\u0646\u0627\u061b<\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06cc \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u06d2 \u0679\u06cc\u0633\u0679 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c<\/p>\n<\/li>\n<li>\n<p>\u0633\u0633\u0679\u0645 \u06a9\u0648 \u0622\u0646\u06a9\u06be\u06cc\u06ba \u0628\u0646\u062f \u06a9\u0631\u06a9\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c AI \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0622\u067e \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0646\u062a\u0642\u0644\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0628 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\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 \u0639\u0645\u0644 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0632\u0628\u0627\u0646\u0648\u06ba \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 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">legacy application\n\u2193\nperfect architecture\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2:<\/p>\n<pre><code class=\"language-text\">legacy application\n\u2193\nmigration-friendly structure\n\u2193\nincremental migration\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u0631\u0642 \u0622\u067e \u06a9\u0648 \u0628\u06c1\u062a \u0633\u0627\u0631\u06d2 \u063a\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u06a9\u0627\u0645 \u0633\u06d2 \u0628\u0686\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0627\u0626\u0637<\/h2>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0631\u0627\u0645 \u062f\u06c1 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0645\u0648\u062c\u0648\u062f\u06c1 \u06a9\u0648\u0688 \u0628\u06cc\u0633 \u067e\u0691\u06be\u06cc\u06ba<\/p>\n<\/li>\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>\u06cc\u0648\u0646\u0679 \u0627\u0648\u0631 \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>\u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0627\u0648\u0631 \u0627\u0688\u0627\u067e\u0679\u0631<\/p>\n<\/li>\n<li>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631<\/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<\/ul>\n<p>\u062c\u0633 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0622\u067e \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u0686\u06be \u0631\u0648\u06cc\u06d2 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u062a\u062d\u0641\u0638 \u0628\u06be\u06cc \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0627\u0646 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u0648\u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u06a9\u0631\u06cc\u06a9\u0679\u0631\u0627\u0626\u0632\u06cc\u0634\u0646 \u0679\u06cc\u0633\u0679<\/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>\u0645\u0639\u0627\u06c1\u062f\u06c1 \u0679\u06cc\u0633\u0679<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u062a\u0628\u0627\u062f\u0644 \u0637\u0648\u0631 \u067e\u0631\u060c \u06cc\u06c1 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u062a\u062d\u0641\u0638 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0645\u0645\u06a9\u0646 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0633\u0627\u062e\u062a\u06cc \u0628\u06c1\u062a\u0631\u06cc \u0627\u0648\u0631 \u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06a9\u0631\u0646\u0627 \u0628\u06be\u06cc \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-why-migration-problems-often-start-before-the-migration\">\u06a9\u06cc\u0648\u06ba \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u0627\u06a9\u062b\u0631 \u06c1\u062c\u0631\u062a \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06cc \u0622\u0631\u0688\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u062e\u062f\u0645\u0627\u062a \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-typescript\">async function processOrder(orderId: string) {\n  const connection = await mysql.getConnection();\n\n  const [rows] = await connection.query(\n    \"SELECT * FROM orders WHERE id = ?\",\n    [orderId]\n  );\n\n  const order = rows[0];\n\n  if (!order) {\n    throw new Error(\"Order not found\");\n  }\n\n  if (order.customer_type === \"PREMIUM\") {\n    order.total = order.total * 0.9;\n  }\n\n  if (\n    order.country === \"AR\" &&\n    order.payment_method === \"TRANSFER\"\n  ) {\n    order.total -= 500;\n  }\n\n  await connection.query(\n    \"UPDATE orders SET total = ?, status = ? WHERE id = ?\",\n    [order.total, \"PROCESSED\", order.id]\n  );\n\n  await paymentProvider.createPayment({\n    orderId: order.id,\n    amount: order.total,\n  });\n\n  await eventBus.publish(\"order.processed\", {\n    id: order.id,\n    total: order.total,\n  });\n\n  await emailClient.send({\n    to: order.customer_email,\n    template: \"order-processed\",\n  });\n\n  return order;\n}\n<\/code><\/pre>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0627\u06c1\u062f\u0627\u0641 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">MySQL       \u2192 PostgreSQL\nOld runtime \u2192 New runtime\nLegacy API  \u2192 New service\n<\/code><\/pre>\n<p>\u0648\u0627\u0636\u062d \u0641\u062a\u0646\u06c1 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0679\u0627\u0631\u06af\u0679 \u0627\u0633\u0679\u06cc\u06a9 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u0622\u067e \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u062c\u0631\u062a \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<p>\u0627\u0646 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">database access\nbusiness rules\nstate transition\npayment integration\nevent publication\nemail delivery\napplication orchestration\n<\/code><\/pre>\n<p>\u0627\u0628\u060c \u0627\u06af\u0631 \u0622\u067e \u0627\u067e\u0646\u0627 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0642\u06cc\u0645\u062a\u0648\u06ba \u067e\u0631 \u0627\u062b\u0631 \u0627\u0646\u062f\u0627\u0632 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u062e\u0637\u0631\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06d2 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0645\u0633\u062a\u0642\u0644 \u0645\u0632\u0627\u062c\u06cc \u067e\u0631 \u0627\u062b\u0631 \u0627\u0646\u062f\u0627\u0632 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u062e\u0637\u0631\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0648 \u062f\u0648\u0633\u0631\u06cc \u0633\u0631\u0648\u0633 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0645\u0634\u06a9\u0644 \u062c\u0632\u0648\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0633\u0627\u062e\u062a \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627 \u06c1\u062c\u0631\u062a \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u0627\u0646 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-choose-a-migration-boundary-before-refactoring\">\u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u062c\u0631\u062a \u06a9\u06cc \u062d\u062f \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628<\/h2>\n<p>\u0627\u0633 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba:<\/p>\n<blockquote>\n<p>\u0622\u0626\u06cc\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/blockquote>\n<p>\u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba:<\/p>\n<blockquote>\n<p>\u0622\u067e \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06cc\u0627 \u06c1\u062c\u0631\u062a \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<\/blockquote>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u0646\u06d2 \u067e\u0631\u0627\u0633\u06cc\u0633 \u0622\u0631\u0688\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u06c1\u0644\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631 \u0644\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u062f\u0648\u062f \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u067e \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">Input:\norderId\n\nBusiness behavior:\nload order\ncalculate adjustments\nmark as processed\n\nSide effects:\npersist order\ncreate payment\npublish event\nsend email\n\nOutput:\nprocessed order\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">src\/services\/\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06c1 \u0641\u0648\u0644\u0688\u0631\u0632 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u062d\u062f\u0648\u062f \u06c1\u0648\u06ba\u06d4<\/p>\n<p>\u062c\u0628 \u0622\u067e \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0645\u0646\u062a\u0642\u0644\u06cc \u0628\u06c1\u062a\u0631 \u06a9\u0627\u0645 \u06a9\u0631\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\">Process Order\nCancel Order\nGenerate Invoice\nRegister Customer\nRenew Subscription\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0627\u06cc\u06a9 \u0645\u0645\u06a9\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644\u06cc \u06cc\u0648\u0646\u0679 \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-dont-refactor-the-entire-application\">\u067e\u0648\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0644 \u0645\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0646 \u0633\u0628 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u06a9\u0634\u0634 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">circular dependencies\nduplicated repositories\nglobal configuration\nlarge services\nstatic helpers\ndirect database access\ninconsistent error handling\nmixed domain models\n<\/code><\/pre>\n<p>\u0627\u06af\u0631\u0686\u06c1 \u06cc\u06c1 \u0633\u0628 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u06c1 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0645\u0627\u0645 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0642\u0631\u0636\u0648\u06ba \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0627 \u0645\u0642\u0635\u062f \u0627\u06cc\u06a9 \u0622\u0631\u0688\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0641\u0646\u06a9\u0634\u0646 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0645\u0641\u06cc\u062f \u0627\u0635\u0648\u0644 \u0635\u0631\u0641 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631 \u06a9\u0631\u0646\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u0631\u0648\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\">Problem:\nOrder processing calls MySQL directly.\n\nRelevant?\nYes.\n\nProblem:\nThe reporting module uses inconsistent date formatting.\n\nRelevant?\nProbably not.\n\nProblem:\nOrder processing calls the payment SDK directly.\n\nRelevant?\nYes.\n\nProblem:\nThe admin UI contains duplicated CSS.\n\nRelevant?\nNo.\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u06cc \u062a\u06cc\u0627\u0631\u06cc \u06a9\u0648 \u06a9\u0628\u06be\u06cc \u0646\u06c1 \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0622\u0631\u06af\u0646\u0627\u0626\u0632\u0646\u06af \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u062c\u062f\u06cc\u062f\u06cc\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06d2 \u0646\u0638\u0645 \u0648 \u0636\u0628\u0637 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-separate-business-rules-from-infrastructure\">\u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u0633\u06d2 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u0648 \u0627\u0644\u06af \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0633\u06d2 \u0627\u0644\u06af \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648\u0688 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-typescript\">async function processOrder(orderId: string) {\n  const order = await mysqlOrders.find(orderId);\n\n  if (order.customerType === \"PREMIUM\") {\n    order.total *= 0.9;\n  }\n\n  if (\n    order.country === \"AR\" &&\n    order.paymentMethod === \"TRANSFER\"\n  ) {\n    order.total -= 500;\n  }\n\n  await mysqlOrders.update(order);\n\n  await stripe.createPayment({\n    orderId: order.id,\n    amount: order.total,\n  });\n}\n<\/code><\/pre>\n<p>\u0642\u06cc\u0645\u062a\u0648\u06ba \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u0648 \u062e\u0648\u062f MySQL \u06cc\u0627 Stripe \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u0627\u0633\u06d2 \u0627\u0633 \u0637\u0631\u062d \u0646\u06a9\u0627\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-typescript\">type Order = {\n  id: string;\n  total: number;\n  customerType: \"STANDARD\" | \"PREMIUM\";\n  country: string;\n  paymentMethod: \"CARD\" | \"TRANSFER\";\n};\n\nfunction calculateOrderTotal(order: Order): number {\n  let total = order.total;\n\n  if (order.customerType === \"PREMIUM\") {\n    total *= 0.9;\n  }\n\n  if (\n    order.country === \"AR\" &&\n    order.paymentMethod === \"TRANSFER\"\n  ) {\n    total -= 500;\n  }\n\n  return Math.max(total, 0);\n}\n<\/code><\/pre>\n<p>\u0627\u0628:<\/p>\n<pre><code class=\"language-text\">pricing behavior\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u0628 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u06c1\u06cc\u06ba \u0645\u0644\u0627 \u06c1\u0648\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">MySQL\nStripe\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06a9\u0645\u0644 \u0688\u0648\u0645\u06cc\u0646 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0645\u0641\u06cc\u062f \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0627\u06af\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0627\u0633 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u067e\u0646\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-introduce-seams-around-hard-dependencies\">\u0633\u062e\u062a \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f seams \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0627\u0646\u0627<\/h2>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u06a9\u0648\u0688 \u0627\u06a9\u062b\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u0686 \u06cc\u0627 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u0622\u0633\u0627\u0646\u06cc \u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-typescript\">class OrderService {\n  async process(orderId: string) {\n    const client = new LegacyDatabaseClient();\n\n    const order = await client.findOrder(orderId);\n\n    \/\/ ...\n  }\n}\n<\/code><\/pre>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0645\u062a\u0628\u0627\u062f\u0644 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0686\u06be\u0648\u0679\u06cc \u067e\u0631\u06cc \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0633\u06cc\u0648\u0646 \u06a9\u0627 \u0628\u0627\u0639\u062b \u0628\u0646 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">interface OrderRepository {\n  findById(id: string): Promise<order null=\"\">;\n  save(order: Order): Promise<void>;\n}\n<\/void><\/order><\/code><\/pre>\n<p>\u067e\u06be\u0631:<\/p>\n<pre><code class=\"language-typescript\">class OrderService {\n  constructor(\n    private readonly orders: OrderRepository\n  ) {}\n\n  async process(orderId: string) {\n    const order = await this.orders.findById(orderId);\n\n    if (!order) {\n      throw new Error(\"Order not found\");\n    }\n\n    \/\/ existing behavior\n  }\n}\n<\/code><\/pre>\n<p>\u0645\u0648\u062c\u0648\u062f\u06c1 MySQL \u0646\u0641\u0627\u0630 \u0627\u0628 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">class MySqlOrderRepository implements OrderRepository {\n  async findById(id: string) {\n    \/\/ existing MySQL behavior\n  }\n\n  async save(order: Order) {\n    \/\/ existing MySQL behavior\n  }\n}\n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba \u06c1\u062c\u0631\u062a \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">class PostgresOrderRepository implements OrderRepository {\n  \/\/ new implementation\n}\n<\/code><\/pre>\n<p>\u063a\u0648\u0631 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06c1\u0645 \u0646\u06d2 \u06a9\u06cc\u0627 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0646\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0631\u0648\u06cc\u06d2 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u06c1\u06d2\u06d4 \u06c1\u0645 \u06c1\u06cc\u06ba <strong>\u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0627 \u0645\u062a\u0628\u0627\u062f\u0644<\/strong>.<\/p>\n<p>\u06cc\u06c1 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06cc \u0627\u06cc\u06a9 \u0642\u0633\u0645 \u06c1\u06d2 \u062c\u0648 \u06c1\u062c\u0631\u062a \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-isolate-side-effects-from-decision-logic\">\u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06cc \u0645\u0646\u0637\u0642 \u0633\u06d2 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u06a9\u0648 \u0627\u0644\u06af \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0645\u0641\u06cc\u062f \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">deciding\n<\/code><\/pre>\n<p>\u0627\u0648\u0631:<\/p>\n<pre><code class=\"language-text\">performing\n<\/code><\/pre>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0645\u0646\u0633\u0648\u062e\u06cc \u0641\u06cc \u0627\u0644\u062d\u0627\u0644 \u0627\u0633 \u0637\u0631\u062d \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">async function cancelOrder(order: Order) {\n  if (order.status === \"SHIPPED\") {\n    throw new Error(\"Cannot cancel shipped order\");\n  }\n\n  order.status = \"CANCELLED\";\n\n  await orders.save(order);\n  await inventory.release(order.id);\n  await payment.refund(order.id);\n  await audit.log(\"ORDER_CANCELLED\", order.id);\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc\u0627\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0641\u06cc\u0635\u0644\u06d2:<\/p>\n<pre><code class=\"language-text\">Can this order be cancelled?\nWhat should its new state be?\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u0627\u062b\u0631\u0627\u062a \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">persist\nrelease inventory\nrefund\naudit\n<\/code><\/pre>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u06a9\u0631\u0633\u0679\u0644 \u0646\u06a9\u0627\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba.<\/p>\n<pre><code class=\"language-typescript\">function cancelOrderState(order: Order): Order {\n  if (order.status === \"SHIPPED\") {\n    throw new Error(\"Cannot cancel shipped order\");\n  }\n\n  return {\n    ...order,\n    status: \"CANCELLED\",\n  };\n}\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0634\u0646 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">async function cancelOrder(order: Order) {\n  const cancelled = cancelOrderState(order);\n\n  await orders.save(cancelled);\n  await inventory.release(cancelled.id);\n  await payment.refund(cancelled.id);\n  await audit.log(\"ORDER_CANCELLED\", cancelled.id);\n\n  return cancelled;\n}\n<\/code><\/pre>\n<p>\u0631\u0648\u06cc\u06c1 \u0627\u0628 \u0628\u06be\u06cc \u0648\u06c1\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0631\u06cc\u0627\u0633\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0627\u0628 \u0622\u0632\u0645\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2 \u0627\u06af\u0631 \u0679\u0627\u0631\u06af\u0679 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 \u0628\u062f\u0644 \u062c\u0627\u0626\u06d2 \u06a9\u06c1 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u06a9\u06cc\u0633\u06d2 \u0627\u0646\u062c\u0627\u0645 \u067e\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u0648\u0631\u0698\u0646 \u0645\u06cc\u06ba \u0622\u067e \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u06cc\u06ba \u06af\u06d2:<\/p>\n<pre><code class=\"language-text\">transactional outbox\nevent-driven workflow\nqueue\nworkflow engine\n<\/code><\/pre>\n<p>\u0627\u0628\u06be\u06cc \u062a\u06a9 \u0627\u0646 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u06a9\u0648 \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0635\u0631\u0641 \u0627\u067e\u0646\u06d2 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06cc \u0645\u0646\u0637\u0642 \u067e\u0631 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u0646\u0627 \u0686\u06be\u0648\u0691\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<h2 id=\"heading-put-external-systems-behind-adapters\">\u0627\u0688\u0627\u067e\u0679\u0631 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0627\u06cc\u06a9 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0633\u0633\u0679\u0645 \u0631\u06a9\u06be\u06cc\u06ba<\/h2>\n<p>\u0628\u06cc\u0631\u0648\u0646\u06cc SDKs \u0627\u06a9\u062b\u0631 \u0645\u06cc\u0631\u0627\u062b\u06cc \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u06af\u06c1\u0631\u0627\u0626\u06cc \u0633\u06d2 \u0644\u06cc\u06a9 \u06c1\u0648\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-typescript\">const result = await stripe.paymentIntents.create({\n  amount: order.total,\n  currency: \"usd\",\n  metadata: {\n    orderId: order.id,\n  },\n});\n<\/code><\/pre>\n<p>\u062c\u0628 \u062f\u0631\u062c\u0646\u0648\u06ba \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0627\u0688\u06cc\u0648\u0644 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u0633\u0679\u0631\u0627\u0626\u067e SDK \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u06cc\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u0633\u0637\u062d \u06a9\u06cc \u062d\u062f \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">type PaymentRequest = {\n  orderId: string;\n  amount: number;\n};\n\ntype PaymentResult = {\n  paymentId: string;\n};\n\ninterface PaymentGateway {\n  charge(\n    request: PaymentRequest\n  ): Promise<paymentresult>;\n}\n<\/paymentresult><\/code><\/pre>\n<p>\u0627\u0633\u0679\u0631\u0627\u0626\u067e \u0627\u0688\u0627\u067e\u0679\u0631 \u0645\u06cc\u06ba \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u0645\u062e\u0635\u0648\u0635 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">class StripePaymentGateway implements PaymentGateway {\n  async charge(\n    request: PaymentRequest\n  ): Promise<paymentresult> {\n    const result =\n      await stripe.paymentIntents.create({\n        amount: request.amount,\n        currency: \"usd\",\n        metadata: {\n          orderId: request.orderId,\n        },\n      });\n\n    return {\n      paymentId: result.id,\n    };\n  }\n}\n<\/paymentresult><\/code><\/pre>\n<p>\u0627\u0628 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0627\u0646\u062a\u06cc \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">PaymentGateway\n<\/code><\/pre>\n<p>\u0628\u062c\u0627\u0626\u06d2:<\/p>\n<pre><code class=\"language-text\">Stripe SDK\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0641\u06cc\u062f \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u06a9\u0648\u0688 \u0645\u0642\u0627\u0645\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u06cc \u067e\u06cc\u0679\u0631\u0646 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">email providers\nmessage brokers\ncloud storage\nERP integrations\nCRM APIs\nidentity providers\nsearch engines\n<\/code><\/pre>\n<p>\u0627\u0688\u0627\u067e\u0679\u0631 \u0627\u0633 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u062c\u062f\u06cc\u062f \u06c1\u06d2\u06d4 \u0648\u06c1 \u0642\u06cc\u0645\u062a\u06cc \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0648\u06c1 \u062d\u062f\u0648\u062f \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-improve-dependency-direction-without-rebuilding-everything\">\u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06cc \u0633\u0645\u062a \u06a9\u0648 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627\u06cc\u0627<\/h2>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u0646\u0638\u0627\u0645 \u0645\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u06d2:<\/p>\n<pre><code class=\"language-text\">business logic\n    \u2193\ndatabase SDK\n    \u2193\nframework utilities\n<\/code><\/pre>\n<p>\u0627\u0633 \u0633\u06d2 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0635\u0627\u0641 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u0627 \u067e\u0691\u06d2\u06d4 \u062c\u0628 \u0645\u0646\u062a\u0642\u0644\u06cc \u0636\u0631\u0648\u0631\u06cc \u06c1\u0648 \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06cc \u0633\u0645\u062a \u06a9\u0648 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<p>\u067e\u06c1\u0644\u06d2:<\/p>\n<pre><code class=\"language-text\">OrderService\n   \u2193\nMySQL\n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">OrderService\n   \u2193\nOrderRepository\n   \u2191\nMySqlOrderRepository\n<\/code><\/pre>\n<p>\u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u062e\u0644\u0627\u0635\u06c1 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06cc\u06ba\u06d4 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u062f\u0627\u0626\u06cc\u06af\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06be\u06cc \u06cc\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">OrderService\n   \u2193\nPaymentGateway\n   \u2191\nStripePaymentGateway\n<\/code><\/pre>\n<p>\u067e\u06cc\u063a\u0627\u0645:<\/p>\n<pre><code class=\"language-text\">OrderService\n   \u2193\nOrderEvents\n   \u2191\nKafkaOrderEvents\n<\/code><\/pre>\n<p>\u0627\u0628 \u062c\u0628 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062e\u062f\u0645\u0627\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1\u06cc \u0627\u06c1\u0645 \u0646\u062a\u06cc\u062c\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0626\u06cc \u0686\u06be\u0648\u0679\u06cc \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0622\u067e \u06a9\u0627 \u0641\u0646\u06a9\u0634\u0646 \u0627\u0633 \u0637\u0631\u062d \u0646\u0638\u0631 \u0622 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">interface OrderRepository {\n  findById(id: string): Promise<order null=\"\">;\n  save(order: Order): Promise<void>;\n}\n\ninterface PaymentGateway {\n  charge(request: {\n    orderId: string;\n    amount: number;\n  }): Promise<void>;\n}\n\ninterface OrderEvents {\n  processed(order: Order): Promise<void>;\n}\n\nclass ProcessOrder {\n  constructor(\n    private readonly orders: OrderRepository,\n    private readonly payments: PaymentGateway,\n    private readonly events: OrderEvents\n  ) {}\n\n  async execute(orderId: string) {\n    const order = await this.orders.findById(orderId);\n\n    if (!order) {\n      throw new Error(\"Order not found\");\n    }\n\n    const total = calculateOrderTotal(order);\n\n    const processed: Order = {\n      ...order,\n      total,\n      status: \"PROCESSED\",\n    };\n\n    await this.orders.save(processed);\n\n    await this.payments.charge({\n      orderId: processed.id,\n      amount: processed.total,\n    });\n\n    await this.events.processed(processed);\n\n    return processed;\n  }\n}\n<\/void><\/void><\/void><\/order><\/code><\/pre>\n<p>\u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u062d\u062a\u0645\u06cc \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06c1\u0648\u06d4 \u06cc\u06c1 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u06cc\u06c1 \u062f\u0639\u0648\u06cc\u0670 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06a9\u06c1:<\/p>\n<blockquote>\n<p>\u0627\u0633 \u0637\u0631\u062d \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u0638\u0631 \u0622\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<\/blockquote>\n<p>\u06c1\u0645 \u0635\u0631\u0641 \u06cc\u06c1 \u06a9\u06c1\u06c1 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<blockquote>\n<p>\u0627\u0633 \u062e\u0635\u0648\u0635\u06cc\u062a \u0645\u06cc\u06ba \u0627\u0628 \u062d\u062f\u0648\u062f \u06c1\u06cc\u06ba \u062c\u0648 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648 \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/blockquote>\n<p>\u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0628\u062f\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0642\u0648\u0627\u0646\u06cc\u0646 \u0642\u0627\u0628\u0644 \u0627\u0645\u062a\u062d\u0627\u0646 \u06c1\u06cc\u06ba\u06d4 \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0634\u0646 \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0645\u0639\u0627\u06c1\u062f\u06d2 \u0648\u0627\u0636\u062d \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u062c\u0631\u062a \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1\u06cc \u06a9\u0627\u0641\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-keep-behavioral-tests-running-during-the-refactor\">\u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06d2 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/h2>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u067e\u0686\u06be\u0644\u06d2 \u0645\u0631\u0627\u062d\u0644 \u0633\u06d2 \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u06d2 \u0679\u06cc\u0633\u0679 \u06a9\u0627\u0645 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0627\u0635\u0644 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc:<\/p>\n<pre><code class=\"language-typescript\">it(\"preserves premium order processing behavior\", async () => {\n  const result = await processOrder(\"order-1\");\n\n  expect(result.total).toBe(9000);\n  expect(result.status).toBe(\"PROCESSED\");\n\n  expect(payment.charge).toHaveBeenCalledWith({\n    orderId: \"order-1\",\n    amount: 9000,\n  });\n\n  expect(events.processed).toHaveBeenCalled();\n});\n<\/code><\/pre>\n<p>\u0627\u0628 \u0622\u067e \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">direct database access\n<\/code><\/pre>\n<p>\u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">repository\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">direct payment SDK\n<\/code><\/pre>\n<p>\u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">payment adapter\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0646\u06a9\u0627\u0644\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">pricing logic\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0627\u0644 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">small structural change\n\u2193\ntest\n\u2193\nsmall structural change\n\u2193\ntest\n\u2193\nsmall structural change\n\u2193\ntest\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062c\u0628 \u0637\u0631\u0632 \u0639\u0645\u0644 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba \u062a\u0648 \u0633\u0627\u062e\u062a\u06cc \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u0627 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u0646\u0627 \u0628\u06c1\u062a \u0622\u0633\u0627\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u0633\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u0648\u0626\u06cc \u0679\u06cc\u0633\u0679 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0645\u0645\u06a9\u0646\u06c1 \u0648\u062c\u0648\u06c1\u0627\u062a \u062a\u0646\u06af \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u062f\u0648 \u06c1\u0641\u062a\u0648\u06ba \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u0648\u0626\u06cc \u0679\u06cc\u0633\u0679 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u0645\u0645\u06a9\u0646\u06c1 \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u0686\u06be \u0628\u06be\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-use-ai-during-structural-refactoring\">\u0633\u0627\u062e\u062a\u06cc \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \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 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u0645\u062f\u062f \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u0645\u0641\u06cc\u062f \u0627\u0634\u0627\u0631\u06d2 \u0645\u062e\u062a\u0644\u0641 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">Refactor this application using Clean Architecture.\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0627\u067e\u0646\u06d2 \u0645\u0627\u0688\u0644 \u0645\u06cc\u06ba \u0645\u062d\u062f\u0648\u062f \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0641\u0631\u0627\u06c1\u0645 \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\">This service currently accesses MySQL directly.\n\nI want to introduce an OrderRepository seam without\nchanging observable behavior.\n\nTasks:\n\n1. identify every database operation used by this service,\n2. propose the smallest repository interface needed,\n3. move existing database calls behind an adapter,\n4. preserve return values, errors, and call order where relevant,\n5. do not change business rules,\n6. do not introduce additional abstractions.\n\nExplain every structural change before generating code.\n<\/code><\/pre>\n<p>\u06cc\u06c1 AI \u06a9\u0648 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u0628\u06c1\u062a \u06a9\u0645 \u062f\u0627\u0626\u0631\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0645\u0641\u06cc\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">Compare the implementation before and after this refactor.\n\nIdentify any observable behavior that may have changed.\n\nCheck specifically:\n\n- exceptions,\n- return values,\n- side effects,\n- ordering of side effects,\n- null handling,\n- transaction boundaries,\n- retry behavior.\n\nDo not assume equivalence because the code looks similar.\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba AI \u062f\u0648\u0633\u0631\u06d2 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0642\u0627\u0628\u0644 \u0642\u062f\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u0628\u0691\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u06cc\u06a9\u0646 \u0679\u06cc\u0633\u0679 \u0627\u0628 \u0628\u06be\u06cc \u0645\u0636\u0628\u0648\u0637 \u062b\u0628\u0648\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-dont-ask-ai-to-design-the-target-architecture-too-early\">AI \u0633\u06d2 \u0627\u067e\u0646\u06d2 \u0679\u0627\u0631\u06af\u0679 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u0628\u06c1\u062a \u062c\u0644\u062f \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u0648 \u0646\u06c1 \u06a9\u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>AI \u0639\u0627\u0645 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u067e\u06c1\u0686\u0627\u0646\u0646\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u062e\u0637\u0631\u0646\u0627\u06a9 \u0628\u06be\u06cc \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u0691\u06cc \u0645\u06cc\u0631\u0627\u062b\u06cc \u0633\u0631\u0648\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u0648\u0686\u06be\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">How should this be modernized?\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0622\u067e \u0648\u0635\u0648\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2:<\/p>\n<pre><code class=\"language-text\">microservices\nevent-driven architecture\nCQRS\nrepository pattern\ndomain events\nmessage broker\nAPI gateway\ndistributed cache\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0633\u0628 \u062c\u0627\u0626\u0632 \u062a\u06a9\u0646\u06cc\u06a9 \u06cc\u0627 \u0646\u0645\u0648\u0646\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062c\u0627\u0626\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u0627\u0631\u06af\u0679 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">deployment frequency\nteam size\ntransactional requirements\nlatency\nfailure tolerance\ndata ownership\nintegration boundaries\noperational maturity\ntraffic\ncost\nregulatory requirements\n<\/code><\/pre>\n<p>\u0645\u0627\u0626\u06cc\u06a9\u0631\u0648 \u0633\u0631\u0648\u0633\u0632 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u0686\u06be\u06cc \u0637\u0631\u062d \u0633\u06d2 \u067e\u0627\u0628\u0646\u062f \u0645\u0648\u0646\u0648\u0644\u062a\u06be \u0628\u06c1\u062a\u0631 \u06c1\u062f\u0641 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0648\u0642\u062a \u0633\u0627\u0632 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u0645\u0627\u0688\u0644 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648 \u0633\u06a9\u062a\u06cc\u06d4<\/p>\n<p>\u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u0626\u06d2\u060c \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u0627\u062e\u062a\u06cc\u0627\u0631\u0627\u062a \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 AI \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u0633\u06cc \u0645\u0627\u0646\u0648\u0633 \u0646\u0645\u0648\u0646\u06c1 \u06a9\u06cc \u0645\u0648\u062c\u0648\u062f\u06af\u06cc \u06a9\u0648 \u0627\u0633\u06d2 \u0627\u067e\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u0648\u062c\u06c1 \u0646\u06c1 \u0628\u0646\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-know-when-a-capability-is-ready-to-migrate\">\u06cc\u06c1 \u06a9\u06cc\u0633\u06d2 \u062c\u0627\u0646\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06a9\u0648\u0626\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4<\/h2>\n<p>\u06a9\u0633\u06cc \u0648\u0642\u062a \u0622\u067e \u06a9\u0648 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u0648 \u0631\u0648\u06a9\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4 \u0627\u0648\u0631 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u06a9\u0627\u0645\u0644 \u06a9\u0648\u0688 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0646 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u0627 \u0648\u0627\u0636\u062d \u062c\u0648\u0627\u0628 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648\u0646\u0627 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0622\u067e \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u06c1\u062a \u0642\u0631\u06cc\u0628 \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-can-i-describe-its-inputs\">\u06a9\u06cc\u0627 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0627\u0646 \u067e\u0679 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">orderId\ncustomer\nrequest payload\nevent\n<\/code><\/pre>\n<h3 id=\"heading-can-i-describe-its-outputs\">\u06a9\u06cc\u0627 \u0622\u067e \u0646\u062a\u0627\u0626\u062c \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">processed order\nHTTP response\nevent\ndatabase change\n<\/code><\/pre>\n<h3 id=\"heading-are-its-important-business-rules-visible\">\u06a9\u06cc\u0627 \u0622\u067e \u0627\u06c1\u0645 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0627\u0635\u0648\u0644 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u0627\u0646 \u06a9\u0627 \u06a9\u0627\u0645\u0644 \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u06a9\u06c1\u0627\u06ba \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-are-external-dependencies-explicit\">\u06a9\u06cc\u0627 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u0648\u0627\u0636\u062d \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">OrderRepository\nPaymentGateway\nOrderEvents\nEmailSender\n<\/code><\/pre>\n<h3 id=\"heading-can-infrastructure-be-substituted\">\u06a9\u06cc\u0627 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>\u0627\u06af\u0631 MySQL \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06cc \u0642\u06cc\u0645\u062a\u0648\u06ba \u06a9\u06cc \u0645\u0646\u0637\u0642 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062a\u0648 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0622\u067e \u06a9\u0627 \u062f\u0627\u0626\u0631\u06c1 \u062a\u06cc\u0627\u0631 \u0646\u06c1 \u06c1\u0648\u06d4<\/p>\n<h3 id=\"heading-are-important-behaviors-protected\">\u06a9\u06cc\u0627 \u0627\u06c1\u0645 \u0627\u0639\u0645\u0627\u0644 \u0645\u062d\u0641\u0648\u0638 \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-do-you-know-the-side-effects\">\u06a9\u06cc\u0627 \u0622\u067e \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0633\u06d2 \u0648\u0627\u0642\u0641 \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">persist order\ncreate payment\npublish event\nsend email\n<\/code><\/pre>\n<h3 id=\"heading-are-major-unknowns-documented\">\u06a9\u06cc\u0627 \u06a9\u0644\u06cc\u062f\u06cc \u0646\u0627\u0645\u0639\u0644\u0648\u0645 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u06cc \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u06a9\u0686\u06be \u063a\u06cc\u0631 \u06cc\u0642\u06cc\u0646\u06cc \u0635\u0648\u0631\u062a\u062d\u0627\u0644 \u0628\u0627\u0642\u06cc \u0631\u06c1 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0628\u0627\u06c1\u0631 \u06a9\u06be\u0691\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2.<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0646 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06d2 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u0633 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0688\u06be\u0627\u0646\u0686\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-a-practical-pre-migration-refactoring-workflow\">\u0639\u0645\u0644\u06cc \u067e\u0631\u06cc \u0645\u0627\u0626\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \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-choose-one-capability\">1. \u0627\u06cc\u06a9 \u062e\u0635\u0648\u0635\u06cc\u062a \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u067e\u0648\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">Process Order\nGenerate Invoice\nRenew Subscription\n<\/code><\/pre>\n<h3 id=\"heading-2-confirm-behavioral-protection\">2. \u0631\u0648\u06cc\u06d2 \u06a9\u06d2 \u062a\u062d\u0641\u0638 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062a\u0646\u0642\u06cc\u062f\u06cc \u0631\u0648\u06cc\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06cc\u0633\u0679 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0642\u0628\u0636\u06c1:<\/p>\n<pre><code class=\"language-text\">outputs\nstate transitions\nside effects\nerrors\ncontracts\n<\/code><\/pre>\n<h3 id=\"heading-3-identify-migration-blockers\">3. \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0631\u06a9\u0627\u0648\u0679\u0648\u06ba \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0645\u062c\u0645\u0648\u0639\u06c1 \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">direct database access\nprovider SDKs\nglobal state\nframework-specific objects\nstatic dependencies\nshared mutable state\n<\/code><\/pre>\n<p>\u062d\u0633\u0627\u0628\u0627\u062a \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0633\u06d2 \u062f\u0648\u0631 \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-text\">calculate price\nvalidate transition\nchoose status\ncalculate commission\n<\/code><\/pre>\n<h3 id=\"heading-5-introduce-seams\">5. \u0633\u06cc\u0648\u0646 \u06a9\u0627 \u062a\u0639\u0627\u0631\u0641<\/h3>\n<p>\u0627\u067e\u0646\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u062d\u062f\u0648\u062f \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-text\">database\npayments\nevents\nemail\nstorage\nexternal APIs\n<\/code><\/pre>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u0648\u062c\u06c1 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u062c\u0631\u06cc\u062f \u062a\u062e\u0644\u06cc\u0642 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-6-localize-infrastructure\">6. \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0644\u0648\u06a9\u0644\u0627\u0626\u0632\u06cc\u0634\u0646<\/h3>\n<p>\u0679\u06a9\u0646\u0627\u0644\u0648\u062c\u06cc \u06a9\u06cc \u0645\u062e\u0635\u0648\u0635 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u0627\u0688\u06cc\u067e\u0679\u0631\u0632 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \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\">MySqlOrderRepository\nStripePaymentGateway\nKafkaOrderEvents\nSendGridEmailSender\n<\/code><\/pre>\n<h3 id=\"heading-7-make-orchestration-visible\">7. \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0634\u0646 \u06a9\u0648 \u0645\u0631\u0626\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u0627 \u0645\u0642\u0635\u062f\u06d4<\/p>\n<pre><code class=\"language-text\">load\n\u2193\ndecide\n\u2193\npersist\n\u2193\nperform side effects\n\u2193\nreturn\n<\/code><\/pre>\n<h3 id=\"heading-8-run-behavioral-tests-after-every-step\">8. \u06c1\u0631 \u0642\u062f\u0645 \u06a9\u06d2 \u0628\u0639\u062f \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06d2 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u06a9 \u0628\u06cc\u0686 \u0645\u06cc\u06ba 10 \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0632 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0686\u06be\u0648\u0679\u06cc \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-9-compare-before-and-after\">9. \u0645\u0642\u0627\u0628\u0644\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0648\u0631 \u0628\u0639\u062f \u0645\u06cc\u06ba<\/h3>\n<p>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">inputs\noutputs\nerrors\nside effects\ndata shapes\nordering\ntransactions\n<\/code><\/pre>\n<h3 id=\"heading-10-stop-when-migration-becomes-possible\">10. \u062c\u0628 \u0645\u0645\u06a9\u0646 \u06c1\u0648 \u062a\u0648 \u06c1\u062c\u0631\u062a \u0631\u0648\u06a9 \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u062c\u0627\u0631\u06cc \u0646\u06c1 \u0631\u06a9\u06be\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u0633\u0627 \u06c1\u0645\u06cc\u0634\u06c1 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0642\u0635\u062f \u06c1\u062c\u0631\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631\u06cc \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-what-not-to-refactor-before-migration\">\u06c1\u062c\u0631\u062a \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06cc\u0627 \u0646\u06c1\u06cc\u06ba \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631<\/h2>\n<p>\u06a9\u0686\u06be \u0686\u06cc\u0632\u06cc\u06ba \u0627\u06cc\u0633\u06cc \u06c1\u06cc\u06ba \u062c\u0648 \u0622\u067e \u06a9\u0648 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u0645\u0631\u062d\u0644\u06d2 \u067e\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06af\u0631\u06cc\u0632 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0648\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648 \u0631\u0648\u06a9 \u062f\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-naming-everywhere\">\u0627\u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0628\u06be\u06cc \u0646\u0627\u0645 \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u0634\u0627\u06cc\u062f \u0622\u067e \u06a9\u0648 \u0633\u06cc\u0646\u06a9\u0691\u0648\u06ba \u067e\u0631\u0627\u0646\u06d2 \u0646\u0627\u0645 \u067e\u0633\u0646\u062f \u0646\u06c1 \u06c1\u0648\u06ba\u06d4 \u062a\u0627\u06c1\u0645\u060c \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0627 \u0646\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u06cc \u062a\u06be\u0648\u0691\u06cc \u0642\u06cc\u0645\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0691\u0627 \u0641\u0631\u0642 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-formatting-the-entire-repository\">\u0645\u06a9\u0645\u0644 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u06a9\u06cc \u0634\u06a9\u0644<\/h3>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u0626\u0644\u06c1\u06d4 \u0634\u0648\u0631 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-replacing-every-pattern\">\u062a\u0645\u0627\u0645 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba<\/h3>\n<p>\u0645\u06cc\u0631\u0627\u062b\u06cc \u0646\u0638\u0627\u0645 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">singletons\nservice locators\nstatic utilities\nlarge classes\n<\/code><\/pre>\n<p>\u06a9\u0686\u06be \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0631\u06c1 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u062c\u0631\u062a \u06a9\u06cc \u062d\u062f\u0648\u062f \u06a9\u0648 \u0639\u0628\u0648\u0631 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0679\u06be\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-rewriting-stable-algorithms\">\u0645\u0633\u062a\u062d\u06a9\u0645 \u0627\u0644\u06af\u0648\u0631\u062a\u06be\u0645 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u0627<\/h3>\n<p>\u067e\u0631\u0627\u0646\u06d2 \u062d\u0633\u0627\u0628\u0627\u062a \u0628\u062f\u0635\u0648\u0631\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06af\u0631 \u0648\u06c1 \u0645\u062d\u0641\u0648\u0638 \u0627\u0648\u0631 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u067e\u06c1\u0644\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648\u0646\u0627 \u0627\u0648\u0631 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631 \u06c1\u0648\u0646\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-fixing-every-discovered-bug\">\u067e\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u06a9\u06cc\u0691\u06d2 \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u06cc\u06c1 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06cc \u062a\u06cc\u0627\u0631\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06a9\u0648\u0626\u06cc \u06a9\u06cc\u0691\u06d2 \u0646\u0638\u0631 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0646\u06c1\u06cc\u06ba \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u06c1 \u0637\u06d2 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u062a\u0631\u0645\u06cc\u0645\u0627\u062a \u06a9\u0627 \u062a\u0639\u0644\u0642 \u0627\u0633\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u0633\u06d2 \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627:<\/p>\n<pre><code class=\"language-text\">structural refactor\n+\nbehavioral correction\n+\nplatform migration\n<\/code><\/pre>\n<p>\u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0628\u06be\u06cc \u06a9\u0628\u06be\u06cc \u0635\u062d\u06cc\u062d \u062c\u0648\u0627\u0628 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">preserve bug\nmigrate\nfix bug intentionally afterward\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u063a\u06cc\u0631 \u0622\u0631\u0627\u0645 \u062f\u06c1 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u0631\u0648\u06cc\u06d2 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u062e\u0637\u0631\u0646\u0627\u06a9 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-refactoring-is-preparation-not-the-migration\">\u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u062a\u06cc\u0627\u0631\u06cc \u06c1\u06d2\u060c \u0645\u0646\u062a\u0642\u0644\u06cc \u0646\u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>\u067e\u0631\u06cc \u0645\u0627\u0626\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0628\u06be\u06cc \u0646\u06c1 \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0644 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u0627\u0633 \u0637\u0631\u062d \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba:<\/p>\n<blockquote>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<\/blockquote>\n<p>\u067e\u06be\u0631:<\/p>\n<blockquote>\n<p>\u0622\u067e \u06a9\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<\/blockquote>\n<p>\u067e\u06be\u0631:<\/p>\n<blockquote>\n<p>\u0634\u0627\u06cc\u062f \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u067e\u06cc\u0634 \u06a9\u0631\u0648\u06ba\u06d4<\/p>\n<\/blockquote>\n<p>\u067e\u06be\u0631:<\/p>\n<blockquote>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u06cc\u0633\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06cc\u06c1 \u0634\u0627\u06cc\u062f \u0645\u0627\u0626\u06cc\u06a9\u0631\u0648 \u0633\u0631\u0648\u0633 \u06c1\u0648\u0646\u0627 \u067e\u0691\u06d2 \u06af\u0627\u06d4<\/p>\n<\/blockquote>\n<p>\u0645\u06c1\u06cc\u0646\u06d2 \u06af\u0632\u0631 \u06af\u0626\u06d2 \u0627\u0648\u0631 \u06a9\u0686\u06be \u0628\u06be\u06cc \u06c1\u062c\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0627\u06d4 \u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0627\u06cc\u06a9 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u0648\u06c1 \u0628\u06be\u06cc \u0641\u06cc\u0644 \u0645\u0648\u0688 \u06c1\u06d2\u06d4 \u0627\u06c1\u062f\u0627\u0641 \u0645\u062e\u0635\u0648\u0635 \u0631\u06c1\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2:<\/p>\n<pre><code class=\"language-text\">ProcessOrder\n\u251c\u2500\u2500 MySQL\n\u251c\u2500\u2500 pricing rules\n\u251c\u2500\u2500 Stripe\n\u251c\u2500\u2500 Kafka\n\u251c\u2500\u2500 email\n\u2514\u2500\u2500 framework internals\n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">ProcessOrder\n\u251c\u2500\u2500 OrderRepository\n\u251c\u2500\u2500 pricing rules\n\u251c\u2500\u2500 PaymentGateway\n\u251c\u2500\u2500 OrderEvents\n\u2514\u2500\u2500 EmailSender\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0627\u0641\u06cc \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2.<\/p>\n<p>\u0627\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0627\u0646\u062a\u062e\u0627\u0628 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06c1\u062c\u0631\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">MySQL \u2192 PostgreSQL\n<\/code><\/pre>\n<p>\u0642\u06cc\u0645\u062a\u0648\u06ba \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631\u06d4<\/p>\n<p>\u0622\u067e \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">Stripe adapter\n<\/code><\/pre>\n<p>\u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631\u06d4<\/p>\n<p>\u0622\u067e \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">ProcessOrder\n<\/code><\/pre>\n<p>\u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0633\u0648\u0626\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0631\u06cc\u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0646\u06d2 \u0627\u062e\u062a\u06cc\u0627\u0631\u0627\u062a \u0628\u0646\u0627\u0626\u06d2 \u06c1\u06cc\u06ba: \u06cc\u06c1 \u0642\u062f\u0631 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u0648\u0631\u0627\u062b\u062a \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u0627\u0633 \u0648\u0642\u062a \u062e\u0637\u0631\u0646\u0627\u06a9 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0628 \u0645\u062a\u0639\u062f\u062f \u0642\u0633\u0645 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0628\u06cc\u06a9 \u0648\u0642\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">behavior\narchitecture\ninfrastructure\nruntime\ndata\ndeployment\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06a9\u0646 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06c1\u0648\u0626\u06cc\u06d4<\/p>\n<p>\u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u063a\u06cc\u0631 \u06cc\u0642\u06cc\u0646\u06cc \u0635\u0648\u0631\u062a\u062d\u0627\u0644 \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u0646\u0627 \u0627\u06cc\u06a9 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0633\u0645\u062c\u06be\u06cc\u06ba\u060c \u067e\u06be\u0631 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0633\u0627\u062e\u062a \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u062d\u062f\u0648\u062f \u0628\u0646\u0627\u0626\u06cc\u06ba. \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0627\u0648\u0631 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0641\u06cc\u0635\u0644\u06d2 \u0627\u0644\u06af\u06d4 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0646\u0638\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0645\u0642\u0627\u0645\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u06a9\u0648 \u0646\u0638\u0631 \u0645\u06cc\u06ba \u0631\u06a9\u06be\u06cc\u06ba\u06d4 \u062c\u0628 \u0628\u06be\u06cc \u0688\u06be\u0627\u0646\u0686\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u06c1\u0645 \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06d2 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0648\u0631 \u0641\u06cc\u0686\u0631 \u067e\u0648\u0631\u0679\u06cc\u0628\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0628\u0646\u062f \u06a9\u0631 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u062d\u06a9\u0645 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">Understand\n\u2193\nCharacterize\n\u2193\nRefactor\n\u2193\nMigrate\n<\/code><\/pre>\n<p>AI \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u0648 \u0688\u0631\u0627\u0645\u0627\u0626\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u06cc\u0632 \u062a\u0631 \u0628\u0646\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0646\u06a9\u0627\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06a9\u0627\u0644\u0632 \u06a9\u0648 \u0627\u0688\u0627\u067e\u0679\u0631 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0641\u0627\u0630 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0628\u0691\u06d2 \u0641\u0631\u0642\u0648\u06ba \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06d2 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0644 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u0648 \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0645\u0642\u0635\u062f \u0645\u06cc\u0631\u0627\u062b\u06cc \u0646\u0638\u0627\u0645 \u06a9\u0627 \u0635\u0627\u0641 \u062a\u0631\u06cc\u0646 \u0648\u0631\u0698\u0646 \u0628\u0646\u0627\u0646\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0645\u0642\u0635\u062f \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 <strong>\u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0688\u06be\u0627\u0646\u0686\u06c1<\/strong>.<\/p>\n<p>\u0627\u0648\u0631 \u062c\u0628 \u0622\u067e \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0637\u0631\u062d \u0646\u06c1\u06cc\u06ba \u0644\u06af\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u0627\u06cc\u06a9 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u06cc \u0637\u0631\u062d \u0646\u0638\u0631 \u0622\u0646\u06d2 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062c\u0633 \u0644\u0645\u062d\u06d2 \u06a9\u0648\u0626\u06cc \u0679\u06cc\u0645 \u0645\u06cc\u0631\u0627\u062b\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0648\u0688 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u062f\u0628\u0627\u0624 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u067e\u0646\u0627 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633\u060c API\u060c \u06cc\u0627 UI \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u067e\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9\u060c \u0631\u0646 \u0679\u0627\u0626\u0645\u060c \u06a9\u0644\u0627\u0624\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1\u060c \u06cc\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0642\u0627\u0628\u0644 \u0641\u06c1\u0645 [&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-29019","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/29019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=29019"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/29019\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=29019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=29019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=29019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}