ড্র্যাগ-এবং-ড্রপ প্রক্রিয়া ডিজাইনের ভুলগুলো ও কীভাবে রিফ্যাক্টর করবেন
ড্র্যাগ-এবং-ড্রপ প্রক্রিয়া ডিজাইন ভুল ওয়ার্কফ্লোকে পরিবর্তন করা কঠিন ও ভাঙন সহজ করে তোলে। সাধারণ অ্যান্টি-প্যাটার্ন ও ব্যবহারিক রিফ্যাক্টর ধাপ শিখুন।

কেন ড্র্যাগ-এবং-ড্রপ ওয়ার্কফ্লো ভুল হয়
ভিজ্যুয়াল প্রসেস এডিটরগুলি নিরাপদ মনে হয় কারণ পুরো ফ্লো দেখা যায়। কিন্তু ডায়াগ্রামও মিথ্যা বলতে পারে। বাস্তবে ব্যবহারকারী, ডেটা, ও টাইমিংয়ের সমস্যাগুলো এসে প্রোডাকশনে ফেইলিং ঘটায়।
অনেক সমস্যা আসে যখন ডায়াগ্রামকে একটি চেকলিস্ট হিসেবে দেখা হয়—অবশ্যই সেটা আসলে একটি প্রোগ্রাম। ব্লকগুলোর ভেতর লজিক থাকে। সেগুলো স্টেট তৈরি করে, শাখা নিয়ে চলে, রিট্রাই করে, এবং সাইড-ইফেক্ট ট্রিগার করে। এসব যদি স্পষ্ট না করা হয়, তবে ছোট সম্পাদনাও আচরণ পরিবর্তন করে দিতে পারে।
ওয়ার্কফ্লো অ্যান্টি-প্যাটার্ন হচ্ছে এমন একটি বারবার হওয়া খারাপ রূপ যা সমস্যা বাড়ায়। এটা কোনো একক বাগ নয়—এটা একটা অভ্যাস, যেমন: ডায়াগ্রামের এক কোণে সেট করা ভেরিয়েবলে গুরুত্বপূর্ণ স্টেট লুকিয়ে রাখা এবং অন্য কোথাও সেটা ব্যবহার করা, অথবা ফ্লোকে এমনভাবে বাড়তে দেওয়া যে কেউই বুঝতে না পারে।
লক্ষণগুলো পরিচিত:
- একই ইনপুট বিভিন্ন রান-এ ভিন্ন ফল দেয়
- ডিবাগ করা অনুমান খেলা হয়ে যায় কারণ বোঝা যায় না কোথায় মানটি বদলেছে
- ছোট এডিট অপ্রাসঙ্গিক পথ ভেঙে দেয়
- ফিক্স গুলো শাখা বাড়ায়, কমায় না
- ব্যর্থতা আংশিক আপডেট রেখে যায় (কিছু স্টেপ সফল, কিছু যায় না)
সস্তা ও দৃশ্যমান থেকে শুরু করুন: পরিষ্কার নামকরণ, টাইট গ্রুপিং, ডেড পাথ অপসারণ, এবং প্রতিটি স্টেপের ইনপুট ও আউটপুট স্পষ্ট করা। AppMaster-এর মতো প্ল্যাটফর্মে, এটার মানে প্রায়ই Business Process-কে কেন্দ্রীভূত রাখা—প্রতিটি ব্লক এক কাজ করে এবং ডেটা খোলাভাবে পাস করে।
তারপর গঠনগত সমস্যার জন্য গভীর রিফ্যাক্টরের পরিকল্পনা করুন: স্প্যাগেটি ফ্লো আলাদা করা, সিদ্ধান্তগুলিকে কেন্দ্রীভূত করা, এবং আংশিক সফলতার জন্য ক্ষতিপূরণ যোগ করা। লক্ষ্য সুন্দর ডায়াগ্রাম নয়—এটা এমন একটি ওয়ার্কফ্লো যা প্রতিবার একইভাবে আচরণ করে এবং যখন চাহিদা বদলে যায়, তখন পরিবর্তন করা নিরাপদ থাকে।
লুকানো স্টেট: অবাক করার নীরব উৎস
অনেক ভিজ্যুয়াল ওয়ার্কফ্লোয়ের অসফলতা শুরু হয় এক অদৃশ্য সমস্যায়: আপনি যে স্টেটে নির্ভর করেন তা আপনি স্পষ্টভাবে নাম করেননি।
স্টেট হলো যেকোনো জিনিস যা আপনার ওয়ার্কফ্লোকে সঠিকভাবে আচরণ করার জন্য মনে রাখতে হয়। এর মধ্যে ভেরিয়েবল (যেমন customer_id), ফ্ল্যাগ (যেমন is_verified), টাইমার ও রিট্রাই, এবং এমনকি আপনার ডায়াগ্রামের বাইরে থাকা স্টেটও আছে: একটি ডাটাবেস সারি, CRM রেকর্ড, পেমেন্ট স্ট্যাটাস, বা আগে পাঠানো একটি মেসেজ।
লুকানো স্টেট তখনই দেখা যায় যখন সেই “মেমোরি” এমন কোথাও থাকে যেখানে আপনি আশা করেন না। সাধারণ উদাহরণগুলো:
- ভেরিয়েবলের মতো আচরণ করা নোড সেটিংস (হার্ডকোডেড আইডি, ডিফল্ট স্ট্যাটাস)
- আগের স্টেপের implicit আউটপুট ("last result ব্যবহার করা")
- "রিড" স্টেপ যা লেখাও করে (DB আপডেট, স্ট্যাটাস বদলানো)
- বাইরের সিস্টেম (পেমেন্ট, ইমেইল/SMS প্রোভাইডার, CRM) যা পূর্বের কাজ মনে রাখে
- একটি শাখা বদলানোর পরও চলতে থাকা টাইমার ও রিট্রাই
যে নিয়মটা বেশিরভাগ বিস্ময় রোধ করে
স্টেটকে স্পষ্ট এবং নামকৃত করুন। যদি কোনো মান পরে গুরুত্বপূর্ণ হয়, তাহলে সেটাকে একটি পরিষ্কার নামকৃত ভেরিয়েবলে সংরক্ষণ করুন, এক জায়গায় সেট করুন, এবং কাজ শেষ হলে রিসেট করুন।
উদাহরণস্বরূপ, AppMaster-এর Business Process Editor-এ প্রতিটি গুরুত্বপূর্ণ আউটপুটকে একটি প্রথম-শ্রেণীর ভেরিয়েবল হিসাবে বিবেচনা করুন—না এমন কিছু যা আপনি “জানেন” যে আগের নোড চালিয়েছে বলে উপলব্ধ। একটি ছোট পরিবর্তন যেমন status থেকে payment_status রিনেম করা, এবং কেবল নিশ্চিত পেমেন্ট রেসপন্সের পরে সেট করা—পরের মাসে ফ্লো বদলে গেলে ঘন্টার বদলে ঘণ্টা সাশ্রয় করতে পারে।
স্প্যাগেটি ফ্লো: যখন ডায়াগ্রাম পড়ার উপযোগী থাকে না
স্প্যাগেটি ফ্লো হচ্ছে এমন একটি ভিজ্যুয়াল প্রসেস যেখানে কানেক্টরগুলো সবখানে ক্রস করে, স্টেপগুলো আশ্চর্যজনকভাবে ফিরে লুপ করে, এবং শর্তগুলো এত গভীরে নেস্ট করা থাকে যে কেউ সুখী পথটি জুম ছাড়া বা স্ক্রল ছাড়া বোঝাতে পারে না। যদি আপনার ডায়াগ্রাম কোনো ন্যাপকিনে আঁকা সাবওয়ে ম্যাপের মতো অনুভব হয়, আপনি তখনই দাম চুকাচ্ছেন।
এটা রিভিউকে অ可信্য করে তোলে। মানুষ এজ কেস মিস করে, অনুমোদনগুলো দেরিতে হয়, এবং এক কোণ থেকে হওয়া পরিবর্তন অন্য কোথাও কিছু ভেঙে দেয়। একটি Incident-এ মৌলিক প্রশ্নের উত্তর দেওয়াও কঠিন হয়: "সবশেষে কোন স্টেপ চালানো হয়েছিল?" বা "কেন আমরা এই শাখায় প্রবেশ করলাম?"
স্প্যাগেটি সাধারণত ভাল উদ্দেশ্য থেকে জন্মায়: কাজ করা একটি শাখা কপি-পেস্ট করা “একবারের জন্য”, চাপের সময় দ্রুত ফিক্স যোগ করা, এক্সসেপশন হ্যান্ডলিং লেয়ার করা যেগুলো nested কন্ডিশনে পড়ে, পুরাতন স্টেপের দিকে ফিরে যেতে থাকাই বদলে একটি পুনরায় ব্যবহারযোগ্য সাব-প্রসেস তৈরি না করা, অথবা একই ব্লকে ব্যবসায়িক নিয়ম, ডেটা ফরম্যাটিং, ও নোটিফিকেশন মিশিয়ে দেয়া।
একটি সাধারণ উদাহরণ হলো অনবোর্ডিং। শুরুতে পরিষ্কার থাকে, তারপর ফ্রি ট্রায়াল, পার্টনার রেফারেল, ম্যানুয়াল রিভিউ, এবং "VIP" হ্যান্ডলিং-এর জন্য পৃথক শাখা বাড়তে থাকে। কয়েকটি স্প্রিন্টের পরে ডায়াগ্রামে একাধিক ব্যাক-এজেড কর্নারে "Collect docs" এবং একাধিক জায়গায় ওয়েলকাম ইমেইল পাঠানোর স্টেপ থাকে।
একটি স্বাস্থ্যকর লক্ষ্য সহজ: সাধারণ কেসের জন্য একটি প্রধান পথ, ও এক্সসেপশনের জন্য পরিষ্কার সাইড-পাথ। AppMaster-এর Business Process Editor-এ এটি প্রায়ই মানে হয় পুনরাবৃত্ত লজিককে একটি পুনরায় ব্যবহারযোগ্য সাব-প্রসেসে বের করে আনা, শাখাগুলিকে উদ্দেশ্য অনুযায়ী নামকরণ করা ("Needs manual review"), এবং লুপগুলো স্পষ্ট ও সীমিত রাখা।
সিদ্ধান্ত ওভারলোড এবং নকল রুল
একটি সাধারণ প্যাটার্ন হলো দীর্ঘ শর্ত নোডের চেইন: প্রথমে A চেক, পরে আবার A চেক, তারপর তিনটি আলাদা জায়গায় B চেক। এটা শুরুতে হয় "আরও একটি রুল" হিসেবে, তারপর ওয়ার্কফ্লো একটি ভাঁজ হয়ে যায় যেখানে ছোট পরিবর্তনগুলো বড় পার্শ্বপ্রতিক্রিয়া দেয়।
বড় ঝুঁকি হলো ছড়িয়ে পড়া রুলগুলো যা সময়ের সাথে অসঙ্গত হয়ে ওঠে। একটি পথ অ্যাপ্লিকেশন অ্যাপ্রুভ করে কারণ ক্রেডিট স্কোর বেশি; অন্য পথ একই অ্যাপ্লিকেশন ব্লক করে কারণ পুরানো একটি স্টেপ এখনও "ফোন নম্বর অনুপস্থিত"-কে হার্ড স্টপ হিসেবে বিবেচনা করে। দুটো সিদ্ধান্তই স্থানীয়ভাবে যুক্তিযুক্ত হতে পারে, কিন্তু একসাথে তারা অনিয়মিত ফল দেয়।
কেন নকল চেক সংঘাত ঘটায়
একই রুল ডায়াগ্রামের বিভিন্ন জায়গায় থাকা মানে মানুষ এক কপি আপডেট করে এবং অন্যগুলো মিস করে। সময়ের সাথে আপনি এমন চেক পেয়ে যাবেন যা দেখতে একই মনে হয় কিন্তু নয়: একটি বলে "country = US", আরেকটা বলে "country in (US, CA)", আর তৃতীয়টি প্রায়ই কেপসি হিসেবে "currency = USD" ব্যবহার করে। ওয়ার্কফ্লো চলে, কিন্তু তা পূর্বনির্ধারিত নয়।
একটি ভালো রিফ্যাক্টর হলো সিদ্ধান্তগুলো একটিতে কনসোলিডেট করা—স্পষ্ট নামকৃত সিদ্ধান্ত স্টেপ যা কয়েকটি আউটকাম দেয়। AppMaster-এর Business Process Editor-এ এটা প্রায়ই মানে সম্পর্কিত চেকগুলোকে এক decision ব্লকে গ্রুপ করা এবং শাখাগুলোকে অর্থবহ করা।
আউটকামগুলো সহজ রাখুন, উদাহরণস্বরূপ:
- Approved
- Needs info
- Rejected
- Manual review
তারপর সবকিছু ওই এক সিদ্ধান্ত পয়েন্ট দিয়ে রুট করুন পরিবর্তে পুরো ফ্লো জুড়ে ছোট-ছোট সিদ্ধান্ত ছড়িয়ে দেওয়ার। যদি কোনো রুল বদলে যায়, আপনি একবারেই আপডেট করবেন।
একটি বাস্তব উদাহরণ: সাইনআপ ভেরিফিকেশন ওয়ার্কফ্লো তিন জায়গায় ইমেইল ফরম্যাট চেক করে (OTP-এর আগে, OTP-এর পরে, এবং অ্যাকাউন্ট তৈরির আগে)। সব ভ্যালিডেশনকে একটি "Validate request" সিদ্ধান্তে সরান। যদি ফলাফল "Needs info" হয়, একটিই মেসেজ স্টেপে পাঠান যা ব্যবহারকারীকে ঠিক কি মিস করছে সেটাই বলে, পরিবর্তে পরে সাধারণ ত্রুটিতে ব্যর্থ করার।
আংশিক সফলতার পরে ক্ষতিপূরণ স্টেপের অভাব
একটি সবচেয়ে ব্যয়বহুল ভুল হচ্ছে ধরে নেওয়া যে প্রতিটি ওয়ার্কফ্লো সম্পূর্ণভাবে সফল বা সম্পূর্ণভাবে ব্যর্থ হয়। বাস্তব ফ্লো প্রায়ই অর্ধেক সফল হয়। যদি পরে একটি স্টেপ ভাঙে, আপনার সামনে একটি বিশৃঙ্খলা থাকে: টাকা নেওয়া হয়েছে, মেসেজ পাঠানো হয়েছে, রেকর্ড তৈরি হয়েছে, কিন্তু কোন পরিষ্কার উপায় নেই এগুলো ফিরিয়ে আনতে।
উদাহরণ: আপনি একজন গ্রাহকের কার্ড চার্জ করেন, তারপর অর্ডার তৈরি করার চেষ্টা করেন। পেমেন্ট সফল, কিন্তু ইনভেন্টরি সার্ভিস টাইমআউট হওয়ার কারণে অর্ডার তৈরি হয়নি। এখন সাপোর্টে অসন্তুষ্ট মেইল, ফাইন্যান্সে চার্জ দেখা যাচ্ছে, এবং সিস্টেমে কোন মিল না থাকা অর্ডার আছে।
ক্ষতিপূরণ হলো "আনডু" (বা "সেটা নিরাপদ করা") পথ যা তখন চালানো হয় যখন আংশিক সফলতার পরে কিছু ব্যর্থ হয়। এটা নিখুঁত হতে হবে না, কিন্তু অবশ্যই ইচ্ছে মত এবং পরিকল্পিত হওয়া উচিত। সাধারণ পদ্ধতিগুলো:
- অ্যাকশন রিভার্স করা (রিফান্ড, ক্যান্সেল, ড্রাফট মুছা)
- ফলাফলকে নিরাপদ অবস্থায় রূপান্তর করা ("Payment captured, fulfillment pending" হিসেবে মার্ক করা)
- প্রসঙ্গ সহ ম্যানুয়াল রিভিউতে রুট করা
- আইডেম্পোটেন্সি চেক ব্যবহার করা যাতে রিট্রাই ডাবল-চার্জ বা ডাবল-সেন্ড না করে
আপনি ক্ষতিপূরণ কোথায় রাখেন তা গুরুত্বপূর্ণ। সব ক্লিনআপ একক "error" বক্সে লুকিয়ে রাখবেন না। বিপদজনক স্টেপের পাশে রাখুন, যখন আপনার কাছে প্রয়োজনীয় ডেটা থাকে (payment ID, reservation token, external request ID)। AppMaster-এর মতো টুলে এটার মানে সাধারণত কলের পরে সেই আইডিগুলো সংরক্ষণ করা, এরপর সাফল্য বনাম ব্যর্থতার উপর ভিত্তি করে শাখা করা।
একটি কার্যকর নিয়ম: কোন স্টেপই যেটি বাইরের সিস্টেমের সাথে কথা বলে, সেটি এগিয়ে যাওয়ার আগে দুই প্রশ্নের উত্তর দিতে হবে: "আমরা কি পরিবর্তন করেছি?" এবং "পরের স্টেপ ফেইল করলে কীভাবে আমরা এটাকে আনডু বা কন্টেইন করব?"
এক্সটার্নাল কলগুলোর কাছে দুর্বল এরর হ্যান্ডলিং
অনেক ব্যর্থতা তখনই দেখা দেয় যখন আপনার ওয়ার্কফ্লো সিস্টেমের বাইরে যায়। বাইরের কলগুলো মেসি ভাবে ফেল করে: ধীর রেসপন্স, অস্থায়ী আউটেজ, ডুপ্লিকেট অনুরোধ, এবং আংশিক সাফল্য। যদি আপনার ডায়াগ্রাম ধরে নেয় "কলে সফল হয়েছে" এবং এগিয়ে চলে, ব্যবহারকারীরা শেষে মিসিং ডেটা, ডাবল চার্জ, বা ভুল সময়ে পাঠানো নোটিফিকেশন পায়।
শুরু করুন এমন স্টেপগুলো চিহ্নিত করে যেগুলো আপনার নিয়ন্ত্রণে নয়: এক্সটার্নাল APIs, পেমেন্ট ও রিফান্ড (যেমন Stripe), মেসেজ (ইমেইল/SMS, Telegram), ফাইল অপারেশন, এবং ক্লাউড সার্ভিস।
দুইটা ফাঁদ খুব সাধারণ: মিসিং টাইমআউট এবং ব্লাইন্ড রিট্রাই। টাইমআউট না থাকলে একটা ধীর অনুরোধ পুরো প্রসেসকে ফ্রিজ করে দিতে পারে। রিট্রাই আছে কিন্তু কোন নিয়ম নেই, তাহলে আপনি পরিস্থিতিকে খারাপ করে ফেলতে পারেন—একই মেসেজ তিনবার পাঠানো বা তৃতীয়-পাটির সিস্টেমে ডুপ্লিকেট তৈরি করা।
এখানেই আইডেম্পোটেন্সি গুরুত্বপূর্ণ। সহজ বাংলায়, একটি আইডেম্পোটেন্ট অ্যাকশন আবার চালালে নিরাপদ। যদি ওয়ার্কফ্লো দুটি বার একটি স্টেপ চালায়, সেটা দ্বিতীয় চার্জ বা দ্বিতীয় অর্ডার বা দ্বিতীয় "ওয়েলকাম" মেসেজ তৈরি করলে চলবে না।
একটি ব্যবহারযোগ্য ফিক্স হলো কল করার আগে একটি রিকোয়েস্ট কি ও স্ট্যাটাস সংরক্ষণ করা। AppMaster-এর Business Process Editor-এ এটা হতে পারে এমনভাবে: একটি রেকর্ড লিখা—"payment_attempt: key=XYZ, status=pending"—তারপর রেসপন্সের পরে সেটাকে success বা failed হিসেবে আপডেট করা। যদি ওয়ার্কফ্লো ওই স্টেপ আবার আসে, আগে সেই রেকর্ড চেক করুন এবং সিদ্ধান্ত নিন কী করা হবে।
একটি নির্ভরযোগ্য প্যাটার্ন দেখতে এমন:
- টাইমআউট ও রিট্রাই সীমা সেট করুন (এবং কোন এররগুলো রিট্রাইযোগ্য তা সংজ্ঞায়িত করুন)
- কল করার আগে একটি রিকোয়েস্ট কি ও বর্তমান স্ট্যাটাস সেভ করুন
- বাইরের কলটি করুন
- সফল হলে ফলাফল লিখুন এবং স্ট্যাটাস সম্পন্ন হিসেবে চিহ্নিত করুন
- ব্যর্থ হলে এরর লগ করুন এবং ব্যবহারকারী-মুখী রিকভারি পথে রুট করুন
ওভারলোডেড স্টেপ ও অস্পষ্ট দায়িত্ব
একটি সাধারণ ভুল হলো একটি স্টেপে চারটি কাজ দিয়ে রাখা: ইনপুট ভ্যালিডেট করা, মান হিসাব করা, ডাটাবেজে লেখা, এবং মানুষকে নোটিফাই করা। এটা কার্যকর মনে হলেও পরিবর্তন ঝুঁকিপূর্ণ করে তোলে। কিছু ভাঙলে, আপনি জানেন না কোন অংশ ভেঙেছে, এবং এটিকে অন্য কোথাও নিরাপদে পুনরায় ব্যবহার করা যায় না।
কিভাবে ওভারলোডেড স্টেপ চেনবেন
স্টেপের নাম অস্পষ্ট হলে (যেমন "Handle order") এবং আপনি এর আউটপুট এক বাক্যে বর্ণনা করতে না পারলে সেটি ওভারলোডেড। আরেকটি সিগন্যাল হচ্ছে ইনপুটগুলোর লম্বা তালিকা যা কেবল স্টেপের "কিছু অংশ" দ্বারা ব্যবহার করা হয়।
ওভারলোডেড স্টেপ প্রায়ই মিশ্রিত করে:
- ভ্যালিডেশন এবং মিউটেশন (save/update)
- ব্যবসায়িক নিয়ম এবং প্রেজেন্টেশন (মেসেজ ফরম্যাটিং)
- এক জায়গায় একাধিক এক্সটার্নাল কল
- একাধিক সাইড-ইফেক্ট কোনো নির্দিষ্ট ক্রমানুসারে না থাকা
- অস্পষ্ট সফলতার মানদণ্ড ("done" মানে কী?)
পরিষ্কার কন্ট্রাক্টসহ ছোট ব্লকে রিফ্যাক্টর করুন
বড় স্টেপগুলোকে ছোট, নামকৃত ব্লকে ভাঙ্গুন যেখানে প্রতিটি ব্লকের একটি কাজ এবং একটি স্পষ্ট ইনপুট ও আউটপুট থাকে। নামকরণের একটি সহজ প্যাটার্ন সাহায্য করে: স্টেপগুলির জন্য ক্রিয়াপদ ব্যবহার করুন (Validate Address, Calculate Total, Create Invoice, Send Confirmation) এবং ডেটা অবজেক্টগুলির জন্য সজ্ঞা।
ইনপুট ও আউটপুটের জন্য ধারাবাহিক নাম ব্যবহার করুন। উদাহরণস্বরূপ, "OrderDraft" (সেভ করার আগে) এবং "OrderRecord" (সেভ করার পরে) ব্যবহার করা ভাল—"order1/order2" বা "payload/result"-এর বদলে। এটি ডায়াগ্রামকে কয়েক মাস পরেও পাঠযোগ্য করে তোলে।
যখন আপনি একটি প্যাটার্ন বারবার করেন, তাকে একটি পুনরায় ব্যবহারযোগ্য সাবফ্লো-এ এক্সট্র্যাক্ট করুন। AppMaster-এর Business Process Editor-এ এটা সাধারণত দেখায় যেমন "Validate -> Normalize -> Persist"-কে একটি শেয়ারড ব্লকে নিয়ে আসা যা অনেক ওয়ার্কফ্লো ব্যবহার করে।
উদাহরণ: একটি অনবোর্ডিং ওয়ার্কফ্লো যা "ইউজার তৈরি করে, পারমিশন সেট করে, ইমেইল পাঠায়, এবং অডিট লগ করে"—এটি চারটি স্টেপে ভাগ করা যেতে পারে এবং একটি পুনরায় ব্যবহারযোগ্য "Write Audit Event" সাবফ্লো যুক্ত করা যায়। এতে টেস্টিং সহজ হয়, এডিট নিরাপদ হয়, এবং বিস্ময় কমে।
কিভাবে ধাপে ধাপে বিশৃঙ্খল ওয়ার্কফ্লো রিফ্যাক্টর করবেন
অধিকাংশ ওয়ার্কফ্লো সমস্যা আসে "আরও একটা" রুল বা কানেকটর যোগ করা থেকে, যতক্ষণ না কেউই কী ঘটে সেটা অনুমান করতে পারে না। রিফ্যাক্টরিং হচ্ছে ফ্লোকে আবার পড়ার উপযোগী করে তোলা, এবং প্রতিটি সাইড-ইফেক্ট ও ব্যর্থতার কেস দৃশ্যমান করা।
শুরু করুন হ্যাপি পাথে: শুরু থেকে শেষ পর্যন্ত একটি পরিষ্কার লাইন আঁকুন। যদি মূল লক্ষ্য হয় "একটি অর্ডার অনুমোদন করা", ঐ লাইনে কেবল সেই অপরিহার্য ধাপগুলো দেখানো উচিৎ যখন সবকিছু ঠিক থাকে।
তারপর ছোট ছোট পাসে কাজ করুন:
- হ্যাপি পথকে একক ফরওয়ার্ড পাথে পুন:আকৃতি দিন, ধাপে ধারাবাহিক নাম (ক্রিয়া + বস্তু) ব্যবহার করে
- প্রতিটি সাইড-ইফেক্ট (ইমেইল পাঠানো, কার্ড চার্জ করা, রেকর্ড তৈরি) তালিকাভুক্ত করুন এবং প্রতিটাই আলাদা স্পষ্ট স্টেপ করুন
- প্রতিটি সাইড-ইফেক্টের জন্য, তার ব্যর্থতার পথ সেখানেই যোগ করুন, আংশিক সফলতার ক্ষতিপূরণসহ
- পুনরাবৃত্ত শর্তগুলোকে এক সিদ্ধান্ত পয়েন্টে বদলান এবং সেখান থেকে রুট করুন
- পুনরাবৃত্ত চাঙ্কগুলোকে সাবফ্লোতে এক্সট্র্যাক্ট করুন, এবং ভেরিয়েবলগুলোর নাম এমন রাখুন যাতে মান স্পষ্ট হয় (
payment_statusflag2-এর চেয়ে ভালো)
একটি দ্রুত উপায় লুকানো জটিলতা খুঁজে পেতেই: জিজ্ঞেস করুন—"এই স্টেপ দুইবার চালালে কি ভেঙে যায়?" যদি উত্তর হয় "আমরা ডাবল-চার্জ করতে পারি" বা "দুইবার ইমেইল পাঠাতে পারি", তাহলে আপনাকে স্পষ্ট স্টেট ও আইডেম্পোটেন্ট আচরণ দরকার।
উদাহরণ: একটি অনবোর্ডিং ফ্লো একাউন্ট তৈরি করে, প্লান অ্যাসাইন করে, Stripe-এ চার্জ করে, এবং ওয়েলকাম মেসেজ পাঠায়। যদি চার্জ সফল কিন্তু ওয়েলকাম মেসেজ ব্যর্থ হয়, আপনি চান না যে পেইড ইউজার এক্সেস ছাড়া আটকে থাকুক। নিকটবর্তী ক্ষতিপূরণ শাখা যোগ করুন: ইউজারকে pending_welcome হিসেবে মার্ক করুন, মেসেজ রিট্রাই করুন, এবং যদি রিট্রাই ব্যর্থ হয় তাহলে রিফান্ড করে প্ল্যান রদ করুন।
AppMaster-এ এই ক্লিনআপ সহজ হয় যখন আপনি Business Process Editor ফ্লোকে ফ্ল্যাট রাখেন: ছোট স্টেপ, স্পষ্ট ভেরিয়েবল নাম, এবং "Charge payment" বা "Send notification"-এর মতো সাবফ্লো যা আপনি সর্বত্র reuse করতে পারেন।
সাধারণ রিফ্যাক্টরিং ফাঁদ যা এড়াতে হবে
ভিজ্যুয়াল ওয়ার্কফ্লো রিফ্যাক্টর করা উচিত প্রক্রিয়াকে বুঝতে সহজ করা এবং পরিবর্তনের সময় নিরাপদ করা। কিন্তু কিছু ফিক্স নতুন জটিলতা যোগ করে, বিশেষ করে সময়ের চাপ থাকলে।
একটি ফাঁদ হলো পুরনো পাথগুলোকে "হতে পারে" অবস্থায় রাখা—কোনো স্পষ্ট সুইচ, ভার্শন মার্কার, বা রিটায়ারমেন্ট ডেটা ছাড়া। লোকজন পুরনো রুট টেস্ট করতে থাকে, সাপোর্ট তা রেফারেন্স করে, এবং শীঘ্রই আপনি দুইটি প্রসেস বজায় রাখেন। যদি ধাপে ধাপে রোলআউট দরকার হয়, সেটিকে স্পষ্ট করুন: নতুন পথকে নাম দিন, এক দৃশ্যমান সিদ্ধান্ত দিয়ে গেট করুন, এবং কখন পুরনোটি মুছে ফেলা হবে তা পরিকল্পনা করুন।
অস্থায়ী ফ্ল্যাগ আরেকটি ধীরে ধীরে সমস্যা। ডিবাগিং বা এক সপ্তাহের মাইগ্রেশনের জন্য তৈরি করা একটি ফ্ল্যাগ প্রায়ই স্থায়ী হয়ে যায়, এবং প্রতিটি নতুন পরিবর্তন তা বিবেচনা করতে হয়। ফ্ল্যাগকে নষ্টশীল আইটেম মনে করুন: কেন আছে তা ডকুমেন্ট করুন, একজন মালিক নির্দিষ্ট করুন, এবং অপসারণের তারিখ ঠিক করুন।
তৃতীয় ফাঁদ হলো এক-অফ এক্সসেপশন যোগ করা পরিবর্তে মডেল পরিবর্তন না করা। যদি আপনি বারবার "স্পেশাল কেস" নোড ঢুকান, ডায়াগ্রাম পাশ থেকে বাড়তে থাকে এবং রুলগুলো অনির্ধার্য হয়ে যায়। যখন একই এক্সসেপশন দুইবার দেখা যায়, সাধারণত সেটার মানে ডেটা মডেল বা প্রসেস স্টেট আপডেট করা উচিত।
অবশেষে, ব্যবসায়িক রুলগুলোকে অপ্রাসঙ্গিক নোডের ভিতরে লুকিয়ে রাখবেন না শুধু কাজ করে দেখানোর জন্য। ভিজ্যুয়াল এডিটরে এটা প্রলোভনস্বরূপ, কিন্তু পরে কেউই রুলটি খুঁজে পাবে না।
সতর্কতা সঙ্কেত:
- দুইটি পথ যা সামান্য ভিন্নতা সহ একই কাজ করে
- "temp2" বা "useNewLogic"-র মতো অস্পষ্ট মানের ফ্ল্যাগ
- এমন এক্সসেপশন যা কেবল একজনেই বুঝে
- বহু নোডে বিভক্ত রুল যা কোনো স্পষ্ট সোর্স অফ ট্রুথ নেই
- ব্যর্থতার পরে যোগ করা "ফিক্স" নোড পরিবর্তে আগের স্টেপ উন্নত করা
উদাহরণ: যদি VIP গ্রাহকদের আলাদা অনুমোদন দরকার হয়, তিন জায়গায় লুকিয়ে চেক যোগ না করে একটি পরিষ্কার "Customer type" সিদ্ধান্ত একবার করে নিয়ে যান এবং সেখান থেকে রুট করুন।
শিপ করার আগে দ্রুত চেকলিস্ট
অধিকাংশ সমস্যা লঞ্চের ঠিক আগে দেখা দেয়: কেউ রিয়েল ডেটা দিয়ে ফ্লো চালায়, এবং ডায়াগ্রাম এমন কিছু করে যা কেউ ব্যাখ্যা করতে পারে না।
একটি ওয়াকথ্রুর আউট লাউড করুন। যদি হ্যাপি পাথটি বলতে অনেক কাহিনী লাগে, তাহলে ফ্লোতে সম্ভবত লুকানো স্টেট, নকল রুল, বা অনেক শাখা আছে যেগুলো গ্রুপ করা উচিত।
শিপ করার আগে একটি দ্রুত প্রি-শিপ চেক
- এক শ্বাসে হ্যাপি পাথ ব্যাখ্যা করুন: ট্রিগার, প্রধান ধাপ, শেষ সীমা
- প্রতিটি সাইড-ইফেক্টকে তার নিজস্ব দৃশ্যমান স্টেপ করুন (চার্জ করা, মেসেজ পাঠানো, রেকর্ড আপডেট, টিকেট তৈরি)
- প্রতিটি সাইড-ইফেক্টের জন্য ব্যর্থ হলে কী হবে এবং অর্ধেক সফলতাকে কীভাবে আনডু করা হবে তা নির্ধারণ করুন (রিফান্ড, ক্যান্সেল, রোলব্যাক, বা ম্যানুয়াল রিভিউ)
- ভেরিয়েবল ও ফ্ল্যাগ চেক করুন: পরিষ্কার নাম, প্রতিটি কোথায় সেট হয় সেটি স্পষ্ট, এবং কোনো রহস্যময় ডিফল্ট নেই
- কপি-পেস্ট লজিক খুঁজুন: একই চেক বিভিন্ন শাখায়, বা একই ম্যাপিং সামান্য পরিবর্তন সহ বারবার করা
এমন একটি সরল টেস্ট যা বেশিরভাগ সমস্যা ধরবে
ফ্লো তিনটি কেস দিয়ে চালান: একটি সাধারণ সফল, একটি সম্ভাব্য ব্যর্থ (যেমন পেমেন্ট প্রত্যাখ্যান), এবং একটি অদ্ভুত এজ কেস (ঐচ্ছিক ডেটা অনুপস্থিত)। এমন কোনো স্টেপ দেখুন যা "আংশিকভাবে কাজ করে" এবং সিস্টেমকে অসম্পূর্ণ অবস্থায় রেখে দেয়।
AppMaster-এর Business Process Editor-এ এটা প্রায়ই একটি পরিষ্কার রিফ্যাক্টরে পরিণত হয়: পুনরাবৃত্ত চেকগুলোকে এক শেয়ারড স্টেপে টানা, সাইড-ইফেক্টগুলোকে স্পষ্ট নোডে রাখা, এবং প্রতিটি ঝুঁকিপূর্ণ কলের পাশে একটি ক্ষতিপূরণ পথ যোগ করা।
বাস্তবসম্মত উদাহরণ: অনবোর্ডিং ফ্লো রিফ্যাক্টর
ধরে নিন একটি কাস্টমার অনবোর্ডিং ওয়ার্কফ্লো যা তিনটি কাজ করে: ব্যবহারকারীর পরিচয় যাচাই করে, তাদের অ্যাকাউন্ট তৈরি করে, এবং পেইড সাবস্ক্রিপশন শুরু করে। এটা সোজা শুনায়, কিন্তু প্রায়ই এমন একটি ফ্লো হয়ে যায় যা "সাধারণত চলে" যতক্ষণ না কিছু ব্যর্থ হয়।
বিশৃঙ্খল ভার্সন
প্রথম ভার্সন ধাপে ধাপে বড় হয়। একটি "Verified" চেকবক্স যোগ করা হয়, তারপর একটি "NeedsReview" ফ্ল্যাগ, তারপর আরও ফ্ল্যাগ। "if verified" মতো চেকগুলো বিভিন্ন জায়গায় দেখা যায় কারণ প্রতি নতুন ফিচার তার নিজস্ব শাখা যোগ করে।
শীঘ্রই ওয়ার্কফ্লোটি এমনভাবে দেখা যায়: identity verify, create user, charge card, send welcome email, create workspace, তারপর আবার verification রি-চেক করার জন্য ফিরে লাফ—কারণ পরে কোনো স্টেপ তার ওপর নির্ভর করে। যদি চার্জ সফল হয় কিন্তু workspace creation ব্যর্থ হয়, কোনো রোলব্যাক থাকে না। গ্রাহক চার্জ করা হয়েছে, কিন্তু তাদের অ্যাকাউন্ট আংশিক—সাপোর্ট টিকিট আসবে।
রিফ্যাক্টর
একটি পরিষ্কার ডিজাইন শুরু হয় স্টেটকে দৃশ্যমান ও নিয়ন্ত্রিত করে। ছড়িয়ে থাকা ফ্ল্যাগগুলোকে একটি একক স্পষ্ট অনবোর্ডিং স্ট্যাটাসে (উদাহরণ: Draft, Verified, Subscribed, Active, Failed) প্রতিস্থাপন করুন। তারপর "আমরা কি চালিয়ে যাবো?" লজিকটি একটি সিদ্ধান্ত পয়েন্টে রাখুন।
রিফ্যাক্টর লক্ষ্যগুলো যা সাধারণত দ্রুত ব্যথা কমায়:
- এক সিদ্ধান্ত গেট যা স্পষ্ট স্ট্যাটাস পড়ে এবং পরবর্তী ধাপ রুট করে
- ডায়াগ্রামে পুনরাবৃত্ত চেক না রেখে শুধু পুনরায় ব্যবহারযোগ্য ভ্যালিডেশন ব্লক
- আংশিক সফলতার জন্য ক্ষতিপূরণ (রিফান্ড, সাবস্ক্রিপশন ক্যান্সেল, ওয়ার্কস্পেস ড্রাফট মুছা)
- ব্যর্থতার একটি স্পষ্ট পথ যা কেন ব্যর্থ হয়েছে তা রেকর্ড করে এবং নিরাপদে থামে
তারপর ডেটা ও ওয়ার্কফ্লোকে একসাথে মডেল করুন। যদি "Subscribed" সত্য হয়, সাবস্ক্রিপশন ID, payment ID, এবং প্রোভাইডার রেসপন্স এক জায়গায় সংরক্ষণ করুন যাতে ক্ষতিপূরণ অনুমান ছাড়া চলে।
পরিশেষে, জানতা ব্যর্থতার কেসগুলো ইচ্ছাকৃতভাবে টেস্ট করুন: verification টাইমআউট, পেমেন্ট সফল কিন্তু ইমেইল ব্যর্থ, ওয়ার্কস্পেস তৈরির ত্রুটি, এবং ডুপ্লিকেট webhook ইভেন্ট।
আপনি যদি AppMaster-এ এই ওয়ার্কফ্লো তৈরি করেন, তবে ব্যবসায়িক লজিককে পুনরায় ব্যবহারযোগ্য Business Processes-এ রাখলে প্ল্যাটফর্ম পরিবর্তন হলে পরিষ্কার কোড জেনারেট করে দেয়, যাতে পুরনো শাখাগুলো ঝুলে থাকে না। দ্রুত প্রোটোটাইপ করার জন্য (ব্যাকএন্ড, ওয়েব, এবং মোবাইল অংশ একসাথে), AppMaster on appmaster.io এই ধরনের এন্ড-টু-এন্ড ওয়ার্কফ্লো বিল্ডের জন্য ডিজাইন করা।


