ভুল এক: একটি বাক্যের বদলে একটি স্পেক লেখা
আগে খারাপ সফটওয়্যারে ক্ষতিগ্রস্ত হওয়া মানুষরা বিল্ডার খুলে একটা পুরো অনুচ্ছেদ টাইপ করার প্রবণতা দেখান। গ্রেডিং সিস্টেম, ইউনিট পছন্দ, অফলাইন মোড, কালার স্কিম — প্রথম রেসপন্স আসার আগেই সবকিছু আগে থেকে লেখা। এটা দায়িত্বশীল মনে হয়। আসলে তা নয়। বিল্ডার আপনার একটি বাক্য পড়ে, আপনি সম্ভবত কী বোঝাতে চেয়েছেন তা অনুমান করে, এবং প্রায় পনেরো সেকেন্ডের মধ্যে একটি প্ল্যান নিয়ে ফিরে আসে — "পর্বতারোহীদের জন্য একটি ট্রেনিং লগ" রূপান্তরিত হয় একটি সেশন লগে, একটি গ্রেড-ট্র্যাকিং ভিউতে, এবং একটি ড্যাশবোর্ডে, ডিফল্ট হিসেবে V-স্কেল বোল্ডারিং এবং YDS রুট বেছে নেওয়া হয় কারণ বেশিরভাগ ক্লাইম্বার আসলে সেটাই ব্যবহার করেন। এটা আপনাকে জানায় কী বেছে নিয়েছে, ঠিক প্ল্যানের মধ্যেই, যাতে আপনি ব্যতিক্রম হলে এক লাইনে সংশোধন করতে পারেন। আগে থেকেই অনুচ্ছেদ লিখে ফেলা এই ধাপটি এড়িয়ে যায় না। আপনি তবুও একটি প্ল্যান পাবেন, তা পড়তেই হবে, আর এখন আপনি তিন মিনিট খরচ করেছেন এমন সীমাবদ্ধতা টাইপ করে যা প্ল্যান এমনিতেই আপনাকে দেখিয়ে দিত, ঠিক সেই ক্রমে যা আপনার বিল্ডের জন্য আসলে গুরুত্বপূর্ণ।
প্ল্যান খালি জায়গাসহ একটি ফর্ম নয়। এটা গদ্য, আর আপনি গদ্যেই উত্তর দেন। "আসলে এটা Font গ্রেড করে দাও, আমি ইউরোপে থাকি" একটি সম্পূর্ণ এডিট। তেমনি "একটি পার্টনার/বিলে-লগ ফিল্ড যোগ করো, আমি বিভিন্ন মানুষের সাথে ক্লাইম্ব করি" — এটাও। প্রতিটি এডিট প্ল্যান পুনরায় তৈরি করে, বিল্ড নয় — খরচবহুল অংশ শুরু হওয়ার আগেই আপনি নিয়ন্ত্রণ করছেন, এটা পুনরায় শুরু করছেন না। সেই প্ল্যান অনুমোদন করাই আপনার শেষ প্রয়োজনীয় সিদ্ধান্ত। এরপর সবকিছু জেনারেশন আর ভেরিফিকেশন।
ভুল দুই: থেমে যাওয়া টার্মিনালের মতো ফিডের দিকে তাকিয়ে থাকা
বিল্ড সার্ভার-সাইডে চলে, আর এখানকার বিভ্রান্তিটা প্রায় সবসময়ই একটি মিথ্যা অ্যালার্ম: কেউ একজন দুই মিনিট ধরে নিরব অ্যাক্টিভিটি ফিডের দিকে তাকিয়ে ধরে নেন যে এটা আটকে গেছে। তা নয় — এটা এমন একটি ধাপে আছে যা প্রতি সেকেন্ডে দৃশ্যমান আউটপুট দেয় না, আর ফিড ঠিক এই কারণেই আপনি কোন ধাপে আছেন তা লেবেল করে। আপনি ট্যাবটা সম্পূর্ণ বন্ধ করে দিতে পারেন। রানটি আপনার ব্রাউজারে বাস করে না।
আপনার আসলে কী প্রত্যাশা করা উচিত তা রূপভেদে অনেক পরিবর্তিত হয়। ক্লাইম্বিং লগ — কয়েকটি পেজ, একটি লোকাল ডেটা মডেল, এক্সটার্নাল API-তে কোনো কল নেই — তিন মিনিটেরও কম সময়ে সম্পন্ন হয়, যা মূলত "এটা লগ করো, ওটা চার্ট করো, আমাকে একটা লিস্ট দেখাও" জাতীয় যেকোনো কিছুর জন্য সাধারণ। যখনই একটি বিল্ডের প্রকৃত ব্যাকএন্ড, অথেন্টিকেশন, সম্পর্কযুক্ত ডেটাবেস, ব্যাকগ্রাউন্ড জব দরকার হয়, তখন আপনি আট থেকে বারো মিনিট দেখছেন, কারণ এখন স্কিমা জেনারেশন এবং মাইগ্রেশন আছে, আর ভেরিফিকেশন পাস শুধুমাত্র মার্কআপের বদলে সার্ভার কোডের বিরুদ্ধে দ্বিতীয়বার চলে। গেমগুলো আরও ধীর, কারণ তাদের অ্যাসেট জেনারেশন দরকার: স্প্রাইট, সাউন্ড কিউ, কখনো কখনো একটি দ্বিতীয় ভিজ্যুয়াল পাস যদি প্রথম প্রচেষ্টা তার প্রদর্শনের আকারে ঠিকমতো পড়া না যায়। আর নেটিভ প্যাকেজিং, একটি প্রকৃত ইনস্টলযোগ্য APK, শেলে মোড়ানো একটি ওয়েব ভিউ নয়, এটি একটি প্রকৃত টুলচেইনের হাতে ন্যস্ত হয়। Gradle, সাইনিং, সবকিছু। শুধু এই ধাপটাই বাকি সবকিছুর ওপর পাঁচ থেকে দশ মিনিট যোগ করতে পারে, আর এটাই একমাত্র ধাপ যেখানে নিরব ফিড মানে টুলচেইন টুলচেইনের কাজ করছে, কিছু ভেঙে গেছে তা নয়।
এই মডেলের সৎ খরচ হলো আপনি এডিটরে কোড স্ট্রিম হয়ে ঢোকা তাৎক্ষণিক, অক্ষর-ধরে-অক্ষর ফিডব্যাক হারান। এর বদলে যা পান তা হলো এমন একটি সিস্টেম যা আপনার ল্যাপটপ ঘুমিয়ে পড়া এবং আপনার ওয়াইফাই বিচ্ছিন্ন হওয়া সহ্য করে, যা আপনি ফোন থেকে চেক করতে পারেন, যা আপনি দেখছেন কি না তা নির্বিশেষে চলতেই থাকে। নব্বই-সেকেন্ডের একটি বিল্ডের জন্য এই ট্রেড-অফ প্রায় গোনার মধ্যেই আসে না। বারো-মিনিটের ব্যাকএন্ড বিল্ডের জন্য, এটাই টার্মিনাল পাহারা দেওয়া আর কফি খেতে যাওয়ার মধ্যে পার্থক্য।
ভুল তিন: জেনারেট করা আর সম্পন্ন হওয়াকে গুলিয়ে ফেলা
এটাই ব্যয়বহুলটা। যে বিল্ড দ্রুত শেষ হয় কিন্তু যাচাই করা হয়নি, তা একটি সম্পন্ন বিল্ড নয়, এটা এমন একটি ড্রাফট যা চলতে থাকে — আর এই দুইয়ের মধ্যেকার ফাঁকই সেই জায়গা যেখানে বেশিরভাগ দ্রুত সাইট-বিল্ডার তাদের খারাপ খ্যাতি অর্জন করে, স্যানিটাইজেশন ছাড়া ফর্ম আর কীবোর্ডে পৌঁছানো যায় না এমন বাটন সরবরাহ করে। এই প্ল্যাটফর্ম কোনো কিছুকে সম্পন্ন বলার আগে, আলাদা ভেরিফায়ার এজেন্টরা তা পর্যালোচনা করে: কোড, নিরাপত্তা, লিঙ্ক, SEO, অ্যাক্সেসিবিলিটি, এবং আপনার অনুমোদিত প্ল্যানের সাথে কনফরম্যান্স। এটা সত্যিকারের একটি আলাদা পাস, একই এজেন্ট নিজের আউটপুট আবার পড়ে মাথা নাড়ানো নয়।
নিরাপত্তা যাচাই সেই একঘেয়ে বিষয়গুলো খোঁজে যা প্রোডাকশনে আসলে মানুষকে কামড়ায়: ক্লায়েন্ট-সাইড কোডে কমিট করা একটি API কী, স্যানিটাইজেশন ছাড়া ইনপুট গ্রহণকারী একটি ফর্ম, সেশন থেকে ইউজার আইডি বের করার বদলে ক্লায়েন্ট-সরবরাহকৃত ইউজার আইডিকে বিশ্বাস করা একটি এন্ডপয়েন্ট। অ্যাক্সেসিবিলিটি যাচাই কোনো লিন্টার নয় যা একটি কমেন্ট দিয়ে চুপ করানো যায় — এটা প্রকৃত কনট্রাস্ট অনুপাত এবং ইন্টারেক্টিভ এলিমেন্টগুলো কীবোর্ডে পৌঁছানো যায় কি না তা যাচাই করে।
কনফরম্যান্সকেই মানুষ সবচেয়ে বেশি অবমূল্যায়ন করে। একটি জেনারেশন পাস চুপচাপ আপনার চাওয়া কোনো কিছু ফেলে দেওয়া সহজ — যেমন আপনার প্ল্যান-এডিট থেকে সেই পার্টনার/বিলে-লগ ফিল্ড — বিল্ডের তিনটি ফাইলের মধ্যে, কেউ সিদ্ধান্ত না নিয়েই যা অগ্রাধিকারহীন হয়ে যায়। কনফরম্যান্স আপনার অনুমোদিত প্ল্যানকে প্রকৃত আউটপুটের সাথে পুনরায় মিলিয়ে দেখে এবং সেই ফাঁক ধরে ফেলে। যখন এটা কিছু খুঁজে পায়, ফিক্সটা স্বয়ংক্রিয়ভাবে প্রয়োগ ও পুনরায় যাচাই করা হয়; আপনি একটা টু-ডু লিস্ট পান না, আপনি হয় একটি ফিক্স পান যা আপনি কখনো দেখেনই না, নয়তো শুরু থেকেই কিছু ভুল নেই। প্রতিটি ভেরিফায়ার কী পরীক্ষা করে এবং পরপর দুইবার কিছু ব্যর্থ হলে কী ঘটে, তার কৌশল আছে বিল্ডগুলো নিজেদের কীভাবে যাচাই করে-তে। এই সেকশন থেকে বহন করে নিয়ে যাওয়ার মতো একটি জিনিস: সম্পন্ন মানে পাস করা, জেনারেট করা নয়। এদুটোকে একই দাবি ধরলে আপনি শেষ পর্যন্ত ফাঁস হওয়া কী বা পৌঁছানো যায় না এমন বাটন প্রকাশ করবেন।
তিনটি ভুলই এড়িয়ে গেলে আপনি যা পাবেন
- ক্লিক করে চলা যায় এমন একটি প্রকৃত প্রিভিউতে একটি কার্যকর প্রোডাক্ট — আপনার ডেটাসহ আসলেই চলমান একটি ইনস্ট্যান্স, দেখতে কেমন হবে তার স্ক্রিনশট নয়।
- এর সাথে যুক্ত একটি চ্যাট থ্রেড, যেখানে "হেডারটা গাঢ় করো আর একটা স্ট্যাটস পেজ যোগ করো" ভার্সন ওয়ানের পাশে ভার্সন টু তৈরি করে। পুরনো ভার্সনটা হারিয়ে যায় না; নতুন ভার্সন লাইভ প্রিভিউ নিলেও এটা ফলব্যাক হিসেবে থেকে যায়।
- বাটন যা আসলে কাজ করে: লাইভে পাবলিশ করো, কোড ডাউনলোড করো, নেটিভ ইনস্টলার বানাও, একটি স্টোরে পাঠাও। বাটন সেজে আসা আপসেল মোডাল নয়।
সেই কোড-ডাউনলোড-করার বাটনটি দ্বিতীয়বার দেখার যোগ্য, কারণ এটাই আলাদা করে দেয় এমন একটি টুল যাকে আপনি সত্যিকারের কোনো কিছুর জন্য বিশ্বাস করবেন, আর এমন একটি টুল যা শুধু ফেলে দেওয়ার মতো প্রোটোটাইপের জন্য ব্যবহার করবেন। যদি কোডটি সত্যিকারের অর্থে আপনার নিজের নিয়ে যাওয়ার জন্য হয়, পঠনযোগ্য ফাইল গঠন, আপনি আসলে যা চেয়েছিলেন তার বাইরে কোনো অস্বাভাবিক লক-ইন না থাকে, তাহলে প্ল্যাটফর্মটিকে আপনার পরের সেশন অর্জন করে যেতে হয়, বরং এটার উপর নির্ভর করে বসে থাকার সুযোগ পায় না যে আপনি ইতিমধ্যেই এতে আটকে আছেন।



