এডা লাভলেসের অ্যানালিটিক্যাল ইঞ্জিন সম্পর্কে নোটগুলো একটি পুনরাবৃত্তিমূলক অ্যালগরিদম বর্ণনা করে। দেখুন কিভাবে তার প্রাথমিক ধারণাগুলো আধুনিক প্রোগ্রাম ডিজাইন ও চিন্তাভাবনার সঙ্গে মিলে যায়।

আপনি সম্ভবত সংক্ষিপ্ত সংস্করণটি শুনেছেন: এডা লাভলেস "প্রথম অ্যালগরিদম" লিখেছিলেন—চার্লস ব্যাবেজের অ্যানালিটিক্যাল ইঞ্জিনের জন্য নির্দেশনার একটি সেট। মানুষ এখনও এটিকে উদ্ধৃত করে কারণ এটি এখন আমরা প্রোগ্রামিং বলি সেই ধারণার একটি প্রাথমিক, চমকপ্রদভাবে পরিষ্কার উদাহরণ—একটি লক্ষ্যকে এমন নির্দিষ্ট ধাপে ভেঙে ফেলা যাতে একটি যন্ত্র তা অনুসরণ করতে পারে।
এই নিবন্ধটি ইঞ্জিনের গিয়ারগুলো পুনর্নির্মাণ বা প্রতিটি ঐতিহাসিক দাবি স্থাপন করার চেষ্টা করবে না। পরিবর্তে এটি লাভলেসের কাজের ভিতরে থাকা প্রোগ্রামিং ধারাগুলোর দিকে নজর দেয়: কিভাবে একটি গাণিতিক সমস্যাকে executable আকারে রূপান্তর করা হয়, কিভাবে ডেটা উপস্থাপন করা হয়, এবং কিভাবে কোনো প্রক্রিয়া এমনভাবে যোগাযোগ করা হয় যাতে অন্য কেউ (বা অন্য কিছু) তা চালাতে পারে।
লাভলেসের বিখ্যাত "Notes" গুলো গণিত ও সফটওয়্যার ডিজাইনের মধ্যে একটি সেতুর মতো লাগে। যদিও যন্ত্রটি বেশিরভাগই ধারণাগত ছিল, সেই চিন্তা-ভাবনা যেকোনো মানুষেরই পরিচিত যে কখনও কম্পিউটারকে নির্ভরযোগ্যভাবে কিছু করাতে চেয়েছেন।
এখানে আমরা যাগুলো লক্ষ্য রাখব:
শেষ পর্যন্ত লক্ষ্যটি সহজ: লাভলেসের "প্রথম অ্যালগরিদম"কে জাদুঘরের একটি বস্তু হিসেবে না দেখে computational thinking-এর এক প্রারম্ভিক টেমপ্লেট হিসেবে দেখা—যা আজও আমরা প্রোগ্রাম ডিজাইনে ব্যবহার করি।
অগাস্টা এডা কিং, কনটেস অফ লাভলেস—সাধারণভাবে এডা লাভলেস হিসেবে পরিচিত—কবিতা ও গণিতের এক মোড়ে বেড়ে উঠেছিলেন। তার মা কঠোর অধ্যয়নের প্রেরণা দিয়েছিলেন, এবং এডা দ্রুত বিজ্ঞানী ও চিন্তাবিদদের একটি ছোট চক্রের অংশ হয়ে উঠেছিলেন। তিনি একা অবাক উজ্বল প্রতিভা ছিলেন না; বরং তিনি একজন প্রতিভাবান সহযোগী ছিলেন, যিনি যন্ত্রগুলো কী অর্থ বহন করতে পারে সে সম্পর্কে অসাধারণভাবে পরিষ্কার প্রশ্ন করেছিলেন, শুধু কী করতে পারে তা নয়।
চার্লস ব্যাবেজ তখনই গাণিতিক যন্ত্রপাতি বিষয়ে বিখ্যাত ছিলেন। ব্যাবেজ মাথার মধ্যে হার্ডওয়্যারের ডিজাইন কল্পনা করতে পারতেন: গিয়ার, শ্যাফট এবং সংখ্যা-চাকা। এদিকে এডার টেলেন্ট ছিল ব্যাখ্যার—জটিল প্রযুক্তিগত ধারণাগুলোকে গঠনমূলক, যোগাযোগযোগ্য ধারণায় রূপ দেওয়া।
তাদের সম্পর্ক কাজ করেছিল কারণ তাদের শক্তি ভিন্ন ছিল। ব্যাবেজ প্রকৌশলগত দৃষ্টিভঙ্গি এগিয়ে নিয়ে গেলেন; এডা ধারণাগত দিকটি এগিয়ে নিয়ে এলেন, বিশেষত একটি যন্ত্র পূর্বনির্ধারিত ক্রম অনুসরণ করতে পারে—এমন ধারণা।
ব্যাবেজের অ্যানালিটিক্যাল ইঞ্জিন কেবল আরও ভালো একটি ক্যালকুলেটর ছিল না। কাগজে এটি একটি সাধারণ-উদ্দেশ্য যন্ত্র হিসেবে বর্ণিত: এমন একটি যন্ত্র যা মান সংরক্ষণ করতে পারে, অপারেশন সম্পাদন করতে পারে, এবং ধাপে ধাপে পরিকল্পিত প্রক্রিয়া চালাতে পারে। এটি সেই প্রারম্ভিক ব্লুপ্রিন্টের মতো যা আমরা এখন প্রোগ্রামেবল কম্পিউটার বলি—যাইহোক, তাদের জীবনকালে এটি সম্পন্ন হয়নি।
1840-এর দশক ছিল এমন একটি সময় যখন গণিত, শিল্প এবং অটোমেশন একে অপরের সঙ্গে মিশছিল। মানুষ নির্ভরযোগ্য পদ্ধতির জন্য আগ্রহী ছিল—টেবিল, সূত্র, এবং পুনরাবৃত্তিমূলক প্রক্রিয়া—কারণ ভুল ব্যয়বহুল ছিল এবং বিজ্ঞান দ্রুত এগোচ্ছিল। সেই প্রেক্ষাপটে, যন্ত্রকে “কীভাবে নির্দেশ দেওয়া যায়” এই বিষয়ে এডার আগ্রহ কৌতূহল নয়; বরং এটি একটি সময়োপযোগী উত্তর ছিল: মানব যুক্তিকে পুনরাবৃত্তিমূলক, যাচাইযোগ্য প্রক্রিয়ায় রূপান্তর করা।
লাভলেস কোনো অ্যালগরিদম বর্ণনা করার আগে, একটা প্রোগ্রাম করার মতো যন্ত্র থাকা দরকার ছিল। ব্যাবেজের অ্যানালিটিক্যাল ইঞ্জিনটি একটি সাধারণ-উদ্দেশ্য ক্যালকুলেটর হিসেবে কল্পিত ছিল: কেবল একটি বিশেষ সূত্রের জন্য নয়, বরং এমন যন্ত্র যা বিভিন্ন অপারেশনের বিভিন্ন ক্রম সম্পাদন করতে সক্ষম।
মূল ধারণাটি সরল: যদি আপনি কোনো সমস্যাকে ছোট আরিথমেটিক ধাপে ভেঙে দিতে পারেন (যোগ, বিয়োগ, গুণ, ভাগ), তাহলে একটি যন্ত্র সেই ধাপগুলো নির্ভুলভাবে, সঠিক ক্রমে এবং যতবার দরকার চালাতে পারবে।
এটাই একক গণনার থেকে পুন:ব্যবহারযোগ্য পদ্ধতিতে লাফ।
ব্যাবেজ দুটি প্রধান উপাদান বর্ণনা করেছিলেন:
ইনপুট ও আউটপুটের জন্য ইঞ্জিনটি পাঞ্চ-কার্ড (ঝাঁকর কোনো তন্তু বোনা যন্ত্রের অনুপ্রেরণায়) ব্যবহার করে নির্দেশ ও ডেটা নিতে ডিজাইন করা ছিল, এবং ফল মানুষ-উপযোগী আকারে—মুদ্রিত বা অন্যভাবে—উৎপন্ন করতে পারত।
যদি আপনি এগুলোকে আজকের সাথে মিলিয়ে দেখেন:
এই কারণেই অ্যানালিটিক্যাল ইঞ্জিন গুরুত্বপূর্ণ: এটি একই বিভাজনকে খসড়া করে—যন্ত্র যা ধাপগুলো চালায়, এবং প্রোগ্রাম যা নির্ধারণ করে কোন ধাপগুলো চালাবেন।
এডা লাভলেস ও প্রথম অ্যালগরিদম সম্পর্কে যখন কথা বলা হয়, প্রায়ই তারা যেই বিশেষ সংযোজনের দিকে ইঙ্গিত করে তা হলো: তিনি লুইজি মেনাব্রেয়ারার ইংরেজি অনুবাদের সাথে জোড়া হিসাবে যুক্ত করা "Notes"।
মেনাব্রেয়া মেশিনের ধারণা বর্ণনা করেছিলেন। লাভলেস আরো এগিয়ে গেলেন: তিনি ইঞ্জিনকে এমন কিছু হিসেবে বিবেচনা করলেন যাকে নির্দেশিত করা যায়—শুধু প্রশংসার ধেনু নয়। এই পরিবর্তনই প্রোগ্রামিং ইতিহাসে এতটা গুরুত্বপূর্ণ করে তোলে। নোটগুলো পড়লে আধুনিক computational thinking-এর ছাপ পাওয়া যায়: লক্ষ্যকে নির্দিষ্ট ধাপে ভাগ করা, উপস্থাপন নির্বাচন করা, এবং কিভাবে একটি যান্ত্রিক প্রক্রিয়া সেগুলো অনুসরণ করবে তা আগে থেকেই অনুমান করা।
লাভলেসের Notes-গুলো এখন আমরা বলি এমন প্রোগ্রাম ডিজাইনের ব্যাখ্যা দেয়। তিনি ইঞ্জিনের অংশগুলো (যেমন মেমোরি স্টোর ও মিল) এমনভাবে বর্ণনা করে ছিলেন যাতে অপারেশনগুলোকে কিভাবে সিকোয়েন্স করা যায় তা বোঝা যায়। কেন্দ্রীয় ধারণাটি সহজ কিন্তু গভীর: যদি অ্যানালিটিক্যাল ইঞ্জিন নির্দিষ্ট ক্রমে নির্দিষ্ট প্রতীকগুলোর উপর অপারেশন করতে পারে, তাহলে "কীভাবে" লিখে রাখা দরকার এমন আকারে যাতে যন্ত্রটি তা নির্বাহ করতে পারে।
এখানেই তাঁর কাজ আধুনিক প্রোগ্রামিংয়ের মত দেখতে শুরু করে। এটি শুধু তত্ত্ব নয়; এটি পদ্ধতি।
সবচেয়ে গুরুত্বপূর্ণ, Notes-এ একটি কাজ করা উদাহরণ রয়েছে যা ধাপে-ধাপে টেবিল আকারে উপস্থাপিত। এটি লাইন-বাই-লাইন দেখায় যন্ত্রকে কী করতে হবে—কোন মান কোন অবস্থানে আছে, পরবর্তীতে কোন অপারেশন হবে, এবং ফল কোথায় রাখা হবে।
এই টেবিল ফরম্যাট আজকের পিউডোকোড, ফ্লোচার্ট ও ইনস্ট্রাকশন শিডিউলের পূর্বপুরুষ: একটি স্পষ্ট, যাচাইযোগ্য পরিকল্পনা যা অনুমান ছাড়াই অনুসরণ করা যায়। আপনি যদি কখনো অ্যানালিটিক্যাল ইঞ্জিন তৈরি না করাকেন, তবুও যে অভ্যাসটি শিখিয়ে দেয়—একটি ধারণাকে executable ক্রমে রূপান্তর করা—তাই সফটওয়্যার লেখার হৃদ্য।
একটি অ্যালগরিদম, সাধারণ ভাষায়, একটি পুনরাবৃত্তিমূলক পদ্ধতি: পরিষ্কার ধাপগুলোর সেট যা নির্ভরযোগ্যভাবে একটি শুরু থেকে ফল পর্যন্ত নিয়ে যায়। এটি এমন একটি রেসিপির মতো যা অনুমানের উপর নির্ভর করে না—আপনি ধাপগুলো অনুসরণ করলে প্রতি বার একই ফল পাওয়ার কথা।
এডা লাভলেসের প্রসিদ্ধ উদাহরণটি ছিল বার্নউলি সংখ্যা গণনা করা—একটি ক্রম যা গণিতে বিভিন্ন জায়গায় দেখা যায় (উদাহরণস্বরূপ 1 + 2 + … + n-এর যোগফল সম্পর্কিত কিছু সূত্রে)। আপনাকে তত্ত্ব জানার দরকার নেই—তারা কেন প্রাথমিক পরীক্ষার জন্মদাতা তা বুঝতে—কারণ তারা প্রোগ্রামযোগ্য যন্ত্রের জন্য একটি ভাল টেস্ট কেস।
এগুলো সঠিক মাত্রায় চ্যালেঞ্জিং:
অর্থাৎ, এটি যথেষ্ট জটিল যাতে মেশিন একটি কাঠামোবদ্ধ পদ্ধতি অনুসরণ করতে পারে, কিন্তু পর্যাপ্তভাবে সাজসজ্জিত যাতে ধাপগুলো লিখে রাখা যায়।
মূলভাবে অ্যালগরিদমটির গঠন আমরা আজও প্রোগ্রামে দেখি:
এই দিক থেকে, লাভলেস কেবল একটি সংখ্যা গণনা দেখাচ্ছেন না—তিনি দেখাচ্ছেন কিভাবে বহু ধাপের গণনাকে এমনভাবে সংগঠিত করা যায় যাতে একটি যন্ত্র অনুমান ছাড়াই তা নির্বাহ করতে পারে।
লাভলেসের বার্নউলি অ্যালগরিদম নিয়ে আলোচনা করলে অনেকেই ফলাফলটিকেই ("একটি প্রাথমিক প্রোগ্রাম") গুরুত্ব দেয়, কিন্তু যেই ডিজাইন কাজটি ধাপগুলোকে নির্ভরযোগ্য করে তা বেশি গুরুত্বপূর্ণ। কৃতিত্ব কেবল অপারেশনগুলো তালিকাভুক্ত করা নয়—বরং সেগুলো এমনভাবে সাজানো যাতে যন্ত্র কোনো improvisation ছাড়াই অনুসরণ করতে পারে।
"বার্নউলি সংখ্যা গণনা করুন"কে একক কাজে অবতীর্ণ করার বদলে, Notes-গুলো এটিকে ছোট ছোট সাবটাস্কে ভেঙে দেয়: মধ্যবর্তী মান গণনা করা, নির্দিষ্ট সূত্রে সেগুলো একত্রিত করা, ফল নথিভুক্ত করা, তারপর পরবর্তী কেসে অগ্রসর হওয়া।
এটি গুরুত্বপূর্ণ কারণ প্রতিটি সাবটাস্ক আলাদাভাবে যাচাই করা যায়। যদি আউটপুট ভুল লাগে, আপনি পুরো অ্যালগরিদম নয়, একটি নির্দিষ্ট অংশ পরীক্ষা করবেন।
একটি যান্ত্রিক কম্পিউটার “মনে” রাখে না। প্রতিটি মান যা পরবর্তীতে প্রয়োজন হবে, কোথাও সংরক্ষিত থাকতে হবে, এবং Notes-গুলো তা নিয়ে সাবধান। কিছু সংখ্যা অস্থায়ী কাজের মান; অন্যগুলো হলো চূড়ান্ত ফল যা পরবর্তী ধাপে টিকে থাকতে হবে।
এটি প্রোগ্রাম স্টেট সম্পর্কে প্রাথমিক ধাঁচের চিন্তা:
অপারেশনের ক্রমটাই একটি সেফটি ফিচার। নির্দিষ্ট গণনা একে আগে, অন্যটিকে পরে করতে হবে—এটি শৈল্পিকতার জন্য নয়, বরং আগে প্রস্তুত না করা মান ব্যবহার করা বা কোনো ভ্যালুকে ভুলভাবে ওভাররাইট করে ফেলার সম্ভাবনা এড়াতে।
আধুনিক ভাষায়, লাভলেস এমন কন্ট্রোল ফ্লো ডিজাইন করছিলেন যাতে প্রোগ্রামে একটি স্পষ্ট পথ থাকে: প্রথম A, তারপর B, তারপর C—কারণ B আগে করলে ফল চুপচাপ ভুল তৈরি করবে।
লাভলেসের ধাপে-ধাপে টেবিলে লুকিয়ে থাকা সবচেয়ে "আধুনিক" ধারণাগুলোর মধ্যে একটি হল পুনরাবৃত্তি: একই নির্দেশনার সেট বারবার করা—কখনও আটকে পড়ে নয়, বরং পুনরাবৃত্তি করাই ফল পেতে দ্রুততম উপায়।
প্রোগ্রামে পুনরাবৃত্তি মানে: একটি ছোট রেসিপি অনুসরণ করা, পরীক্ষা করা আপনি শেষ করে ফেলেছেন কি না, এবং যদি না হয়ে থাকে তাহলে একই রেসিপি আবার চালানো। মূল বিষয় হল প্রত্যেকবার কিছু পরিবর্তিত হয়—প্রায়ই একটি কাউন্টার, টেবিলের একটি পজিশন, বা আপনি তৈরী করা মান—তাই প্রোগ্রামটি একটি শেষ সীমার দিকে অগ্রসর হয়।
লাভলেসের নোটেশনে এটি আগের ধাপে ফিরে যাওয়ার একটি কাঠামোবদ্ধ নির্দেশ হিসেবে দেখা যায়। একই নির্দেশ বহুবার লিখে তৎপর না হয়ে, তিনি একটি নিদর্শন বর্ণনা করেছেন এবং কোথায় সাইকেল করতে হবে তা নির্দেশ করেছেন। এটাই ইটারেশনের বীজ।
আপনি যদি কোড লিখে থাকেন, আপনি এই নিদর্শনটি for লুপ ("N বার পুনরাবৃত্তি করুন") বা while লুপ ("কোনো শর্ত সত্য না হওয়া পর্যন্ত পুনরাবৃত্তি করুন") হিসেবে দেখেছেন। তাঁর টেবিলে যা দেখা যায় তা হল পরিচিত লুপ উপাদান:
ধরুন আপনি 1 থেকে 5 পর্যন্ত যোগ করতে চান।
total = 0\n- শুরু করুন i = 1\n- i-কে total এ যোগ করুন\n- i-কে 1 বাড়ান\n- যদি i এখনও 5 বা কম হয়, যোগ-এবং-বাড়ানোর ধাপটি পুনরাবৃত্তি করুনএটাই সাধারণ ভাষায় ইটারেশন: একটি ছোট লুপ যা একটি কাউন্টারের আপডেট ও একটি ফল সঞ্চিত করে। লাভলেসের অবদান কেবল কী তিনি গণনা করেছিলেন তা নয়—তিনি দেখিয়েছেন যে পুনরাবৃত্তির কাঠামো এতটাই স্পষ্টভাবে লেখা যায় যে একটি যন্ত্র (এবং ভবিষ্যৎ পাঠক) তা নির্ভুলভাবে চালাতে পারে।
একটি প্রক্রিয়া আপনার মনে পুরোপুরি যুক্তিসঙ্গত হতে পারে, তবু একটি যন্ত্র বা অন্য কেউ সেটি অনুসরণ করার জন্য একটি উপায় ছাড়া অসম্ভব হয়ে ওঠে। এইখানে ভেরিয়েবল ও নোটেশনের গুরুত্ব আসে।
একটি ভেরিয়েবলকে ডেস্কে থাকা লেবেলকৃত বাক্স হিসেবে ভাবুন। লেবেলটি অপরিবর্তিত থাকে, কিন্তু ভিতরের জিনিস পাল্টায়।
যদি আপনি একটি ক্রম গণনা করেন, আপনার থাকতে পারে:
এসব বাক্স না থাকলে আপনাকে সবকিছু লম্বা বাক্যে বর্ণনা করতে হবে ("গত দু'ধাপে গণনা করা সংখ্যাটি নিন..."), যা দ্রুত জঞ্জালে পরিণত হয়।
লাভলেসের Notes-এ প্রতীক ও লেবেলগুলি আনুষ্ঠানিক দেখানোর জন্য নয়—তারা প্রক্রিয়াটিকে executable করতে ছিল। স্পষ্ট নোটেশন এ মৌলিক প্রশ্নগুলোর উত্তর দেয়:
ভাল ভেরিয়েবল নামকরণ এখনো বাগ কমানোর সবচেয়ে সস্তা উপায়। x1, x2, x3 তুলনা করুন current_sum, term_index, next_term—দ্বিতীয় সেট কবে কিসের জন্য বাক্সগুলো তা বলে দেয়।
টাইপ একটি অন্য স্তরের নিরাপত্তা দেয়। কিছু কি পূর্ণসংখ্যা, দশমিক, তালিকা, নাকি রেকর্ড তা নির্ধারণ করা যেমন সঠিক ধারকের নির্বাচন—কিছু ত্রুটি অসম্ভব করে তোলে বা কমপক্ষে আগেই ধরা সহজ করে।
ভেরিয়েবল ও নোটেশন "একটি কৌতুকপূর্ণ ধারণা"-কে এমন ধাপে পরিণত করে যা কেউ (মেশিনসহ) পুনরাবৃত্তি করে সঠিকভাবে করতে পারে।
অ্যাবস্ট্রাকশন বলতে গুরুত্বপূর্ণ অংশগুলোতে নজর দেওয়া এবং অপ্রাসঙ্গিক বিস্তারিতগুলো লুকিয়ে রাখা। লাভলেসের Notes-এ এই প্রবণতা প্রাথমিকভাবে দেখা যায়: তারা পদ্ধতিটিকে যোগাযোগযোগ্য করতে চেষ্টা করে, যন্ত্রের যান্ত্রিক বিশদের মধ্যে আটকে না থেকে।
Notes-গুলোর একটি উল্লেখযোগ্য বৈশিষ্ট্য হল কিভাবে তারা মূল ধারণাকে যন্ত্রের ভৌত ক্রিয়াকলাপ থেকে আলাদা রাখে। অ্যানালিটিক্যাল ইঞ্জিনের নিজস্ব "কীভাবে" আছে (গিয়ার, স্টোর, মিল), কিন্তু Notes-গুলো "কি"-কে গুরুত্ব দেয়: একটি ফল পাওয়ার জন্য কোন অপারেশনগুলোর ক্রম দরকার।
এই বিভাজনই আজকের সফটওয়্যার ডিজাইনের বীজ:
যখন আপনি পদ্ধতিটিকে যন্ত্র ছাড়াই বর্ণনা করতে পারেন, আপনি ইতিমধ্যেই গণনাকে পোর্টেবল বিবেচনা করছেন—বিভিন্ন হার্ডওয়্যারে বা ভিন্ন ব্যক্তির দ্বারা পুনরায় বাস্তবায়নযোগ্য।
Notes-গুলোর টেবিলগুলো প্রাথমিক “প্রসিডিউর” এর অনুরূপ: নির্দিষ্ট ধাপগুলোর সেট যা পুনরাবৃত্তিমূলকভাবে অনুসরণ করা যায়। আধুনিক কোড এটাকে ফাংশন, মডিউল ও রিইউজেবল কম্পোনেন্ট হিসেবে আনুষ্ঠানিক করে।
একটি ভাল ফাংশন লাভলেসের উপস্থাপনার মত করে:
অ্যাবস্ট্রাকশন অস্পষ্টতা নয়—এটি ব্যবহারযোগ্যতা। একবার একটি পদ্ধতি পরিষ্কারভাবে প্রকাশ করা হলে, আপনি তা নতুন প্রসঙ্গে পুনরায় ব্যবহার করতে পারবেন, অন্যান্য পদ্ধতির সঙ্গে মিলিয়ে বড় সিস্টেম বানাতে পারবেন বিনা বিশৃঙ্খলায়।
এডা লাভলেস কেবল আলোচনা করেননি যে অ্যানালিটিক্যাল ইঞ্জিন কি করতে পারে—তিনি দেখিয়েছেন কিভাবে একটি প্রক্রিয়া স্পষ্টভাবে অন্য একজন (বা যন্ত্র) অনুসরণ করার যোগ্য করে দেওয়া যায়। এটাই Notes-দের নীরব শক্তি: ব্যাখ্যাকে কাজের অংশ হিসেবে বিবেচনা করা, নয় কোনো অলংকার।
তার উপস্থাপন современной অনুভব হওয়ার একটি কারণ হলো ধাপে-ধাপে টেবিলের ব্যবহার। একটি টেবিল সেই সিদ্ধান্তগুলো জোর করে যা অস্পষ্ট গদ্যে লুকিয়ে থাকতে পারে:
এটি অস্পষ্টতাকে কমায় ঠিক যেমন আজকাল পিউডোকোড করে। আপনি একটি অনুচ্ছেদ পড়ে বুঝেছেন বলে ভেবেও বাস্তবে চালালে বোঝা যায়—একটি ধাপে-ধাপে টেবিল "নির্বাহ পাথ" দৃশ্যমান করে তোলে, যা ভালো প্রোগ্রাম ডকুমেন্টেশনের উদ্দেশ্যও।
লাভলেসের Notes তিনটি জিনিস মিশিয়েছিল যা আমরা এখনও একত্রে রাখতে চাই:
এটি গতানুগতিকভাবে কমেন্ট, ডকস্ট্রিং, ও README-এর সঙ্গে মিলে যায়। README লক্ষ্য ও প্রসঙ্গ বোঝায়। ইনলাইন মন্তব্য জটিল ধাপগুলো পরিষ্কার করে। ডকস্ট্রিং ইনপুট/আউটপুট ও এজ কেস নির্ধারণ করে। যদি এইগুলোর কোনো একটি অনুপস্থিত থাকে, ব্যবহারকারীরা অনুমান করতে বাধ্য হয়—আর অনুমানই বাগের জন্ম।
কোনো প্রক্রিয়া (কোড হ’ল বা না হ’ল) ডকুমেন্ট করলে, এমনভাবে লিখুন যেন অন্য কেউ এটি আপনার ছাড়াই পুনরাবৃত্তি করবে:\n\n- ইনপুট ও আউটপুট স্পষ্টভাবে বলুন ("X দিলে Y উৎপন্ন করুন")।\n- অনুমানগুলো তালিকাভুক্ত করুন (ইউনিট, অর্ডারিং, রাউন্ডিং নিয়ম)।\n- ধাপগুলো সংখ্যায় বা ছোট টেবিলে লিখুন।\n- মধ্যবর্তী মানগুলো নামকরণ করে ধারাবাহিকতা বজায় রাখুন।\n- একটি ছোট কাজ করা উদাহরণ যোগ করুন যা হাতে পরীক্ষায় মিলিয়ে দেখা যায়।
এটি অতিরিক্ত কাজ নয়—এভাবে একটি পদ্ধতি রিইউজেবল হয়।
এডা লাভলেস প্রায়ই "প্রথম প্রোগ্রামার" এই সাহসী লেবেল দিয়ে পরিচিত হন। এটি কার্যকর শর্টহ্যান্ড, তবে এটি আরও মজার এক সত্যকে সমতল করে দিতে পারে। বিতর্কটি কেবল কীর্তির প্রতিযোগিতা নয়—এটি কীকে আমরা প্রোগ্রাম, কম্পিউটার, এবং রচয়িতা বলি তার ওপরও নির্ভর করে।
যদি “প্রোগ্রামার” মানে এমন একজন যে সাধারণ-উদ্দেশ্য যন্ত্রের জন্য নির্দেশ লিখেছেন, তাহলে লাভলেসের দাবিটি শক্তিশালী। তাঁর Notes-এ তিনি বার্নউলি সংখ্যার জন্য একটি ধাপে-ধাপে পদ্ধতি বর্ণনা করেছেন—মৌলিকভাবে একটি পরিকল্পনা যে ইঞ্জিনটি জটিল গণনা কিভাবে চালাবে।
কিন্তু ইতিহাসবিদরা এই লেবেল নিয়ে বিতর্ক করে কারণ:\n\n- অ্যানালিটিক্যাল ইঞ্জিন সম্পন্ন হয়নি, তাই প্রোগ্রামটি তখন যাচাই করা যায়নি\n- লাভলেস ও ব্যাবেজের মধ্যে সহযোগিতা ছিল; লেখকের সীমা জটিল\n- আগের অটোমেশন ছিল (যেমন জাক্কার্ড লুমের পাঞ্চ-কার্ড), যদিও তা একই জেনারেল-উদ্দেশ্যের ধারণা ছিল না
"কম্পিউটিং আইডিয়া আবিষ্কার করা" এবং "কাজ করা কম্পিউটার বানানো"—এই দুটি আলাদা। ব্যাবেজের প্রধান অবদান ছিল আর্কিটেকচার: স্টোর, মিল এবং পঞ্চ-কার্ড কন্ট্রোল। লাভলেসের অবদান ছিল ব্যাখ্যামূলক ও ব্যাখ্যাযোগ্য: তিনি দেখালেন কীভাবে এমন একটি যন্ত্র কিছু উপস্থাপন করতে পারে এবং কিভাবে একটি পদ্ধতি লিখে রাখা যায় যাতে যন্ত্র তা অনুসরণ করতে পারে।
একটি প্রোগ্রাম হার্ডওয়্যার না থাকলে প্রোগ্রামই না হয়ে যায় না। আধুনিক ভাষায় এটি এমন যেমন আপনি এমন প্ল্যাটফর্মের জন্য সফটওয়্যার লিখছেন যা এখনও তত্ত্বীয়।
এই যুগকে সম্মানজনকভাবে বোঝানো যেতে পারে একাধিক ভূমিকায় সহযোগিতা হিসেবে:
যা আমরা নিশ্চিতভাবে বলতে পারি: লাভলেসের Notes প্রোগ্রামিং কী তা সংজ্ঞায়িত করতে সাহায্য করেছে—শুধু গণনা নয়, বরং একটি অনিবাঞ্ছিতভাবে নির্দিষ্ট প্রক্রিয়া লেখা যা মেশিন অনুসরণ করতে পারে।
লাভলেসের Notes গুরুত্বপূর্ণ কারণ তারা দেখায় কিভাবে চিন্তা করতে হয় যখন একজন ধারণাকে মেশিন-নির্বাহযোগ্য পরিকল্পনায় রূপান্তর করছেন। আপনি যদি কখনো পাঞ্চ-কার্ড বা যান্ত্রিক গিয়ার না দেখেন, মূল পাঠগুলো আধুনিক প্রোগ্রাম ডিজাইনের সাথে সুন্দরভাবে মিল রাখে: কাজকে পরিষ্কার কাঠামো দিন, জিনিসগুলোকে সাবধানে নামকরণ করুন, পুনরাবৃত্তি সুইচ করে ব্যবহার করুন, এবং রিইউজেবল অংশ তৈরি করুন।
কাঠামো শ্রেষ্ঠত্ব অর্জন করে। একটি প্রোগ্রাম তৈরি ও রক্ষণাবেক্ষণ সহজ হয় যখন এটি উদ্দেশ্যপূর্ণ ধাপে বিভক্ত। লাভলেসের পদ্ধতি আপনাকে সমাধানের আকৃতি ডিজাইন করতে উৎসাহ দেয়, বিশদে আটকে পড়ার আগে।
স্বচ্ছতা একটি বৈশিষ্ট্য। তাঁর টেবিল ও ব্যাখ্যাগুলো অলংকার নয়—এগুলো প্রোগ্রামের অংশ। ভবিষ্যৎ-বা আপনার সহকর্মী দ্রুত যুক্তি বুঝতে পারলে প্রোগ্রাম নির্ভরযোগ্য হয়।
ইটারেশন একটি টুল, কৌশল নয়। পুনরাবৃত্তি (লুপ) হলো কিভাবে আপনি একটি পদ্ধতিকে স্কেল করেন। প্রধান বিষয় হলো কীটা পুনরাবৃত্তি হয়, প্রতি বার কী বদলায়, এবং কখন বন্ধ হবে।
অ্যাবস্ট্রাকশন পুনরায় ব্যবহারকে সম্ভব করে। যদি একটি ধাপ একবার কাজ করে, আপনাকে সেটিকে বিভিন্ন ইনপুট দিয়ে পুনরায় ব্যবহার করার উপায় রাখতে হবে। এটাই ফাংশন, মডিউল, এবং লাইব্রেরির বীজ।
আপনি যদি কখনো "বর্ণনা করে তৈরি করুন" ধাঁচের ওয়ার্কফ্লো ব্যবহার করে থাকেন—প্রয়োজনীয়তা লিখে, পরিকল্পনা নিয়ে ইটারেট করে, তারপর কাজ করা সফটওয়্যার তৈরি করে—আপনি ইতিমধ্যে লাভলেসের Notes-এর মর্জিনে কাজ করেছেন: পদ্ধতিটিকে স্পষ্ট করা, স্টেট পরিষ্কার রাখা, অনুমান ডকুমেন্ট করা যাতে নির্বাহ পুনরাবৃত্তিযোগ্য হয়।
এই কারণেও এমন টুলগুলো, উদাহরণস্বরূপ Koder.ai, এই কাহিনীর সঙ্গে স্বাভাবিকভাবে মানায়। Koder.ai-তে আপনি চ্যাট ইন্টারফেসের মাধ্যমে ওয়েব, ব্যাকএন্ড এবং মোবাইল অ্যাপ তৈরি করতে পারেন, কিন্তু একই মূল বিষয় প্রযোজ্য: আপনি ইনপুট/আউটপুট স্পষ্ট করলে, জিনিসগুলো ধারাবাহিক নামকরণ করলে, এবং ধাপে-ধাপে কাঠামো চাইলে (planning mode আপনাকে "Notes" লক করতে সাহায্য করে) ফল ভাল আসে। টুলটি নতুন; শৃঙ্খলাটি নতুন নয়।
কোড করা শুরু করার আগে বা যখন কিছু এলোমেলো লাগছে তখন এই দ্রুত পাসটি ব্যবহার করুন:
যদি আপনি "Notes-first" স্টাইল শক্ত করার আগ্রহী হন, এই লিঙ্কগুলো সাহায্য করবে:\n\n- /blog/how-to-write-better-requirements\n- /blog/pseudocode-examples\n একসাথে এই অভ্যাসগুলো প্রোগ্রামিংকে “চালিয়ে ফেল” থেকে “বোঝার যোগ্য করে তোলা”–তে পরিণত করে—ঠিক সেই রূপান্তর যার দিকে লাভলেসের Notes ইতিমধ্যেই ইঙ্গিত করছিল।
এডা লাভলেসের “প্রথম অ্যালগরিদম” তার Notes-এ প্রদত্ত ধাপে-ধাপে নির্দেশনার একটি সেট, যা চার্লস ব্যাবেজের অ্যানালিটিক্যাল ইঞ্জিন দ্বারা কার্যকর করার উদ্দেশ্যে লেখা ছিল। এটি বিখ্যাত কারণ এটি গণনা-কে সংরক্ষিত মানগুলোর উপর পরিকল্পিত ক্রমের অপারেশন হিসেবে দেখায়—যা আধুনিক প্রোগ্রামিংয়ের সঙ্গে ঘনিষ্ঠভাবে মিল রাখে, যদিও যন্ত্রটি সম্পন্ন করা হয়নি।
এই পোস্টটি মূলত লাভলেসের কাজে থাকা প্রোগ্রামিং ধারণাগুলো ব্যাখ্যা করে—কীভাবে কোনো পদ্ধতিকে এমনভাবে প্রকাশ করা যায় যাতে তা নির্বাহযোগ্য, যাচাইযোগ্য এবং বোঝার যোগ্য হয়—তবে এখানে ইঞ্জিনের হার্ডওয়্যার পুনর্নির্মাণ করা বা প্রতিটি ঐতিহাসিক বিতর্ক মিটিগুলো নিষ্পত্তি করাই উদ্দেশ্য নয়।
অ্যানালিটিক্যাল ইঞ্জিন একটি প্রস্তাবিত সাধারণ-উদ্দেশ্য যন্ত্র ছিল, যা:
এই স্থাপত্যটি গুরুত্বপূর্ণ কারণ এটি চলানোর জন্য হার্ডওয়্যার এবং কোন ধাপ চালাতে হবে তা নির্ধারণ করে এমন প্রোগ্রামের বিভাজনকে প্রস্তাব করে—ঠিক সেই বিভাজন যা আধুনিক কম্পিউটারও ব্যবহার করে।
বার্নউলি সংখ্যা একটি ক্রম যা বিভিন্ন গাণিতিক সূত্রে দেখা যায়। এদের ব্যবহার ভালো উদাহরণ কারণ:
এই কারণে এগুলো প্রোগ্রামযোগ্য যন্ত্রের সক্ষমতা পরীক্ষা করার জন্য উপযুক্ত।
একটি ধাপ-টেবিল নির্দিষ্টতা জোর করে। এটি আপনাকে জানাতে বাধ্য করে:
যুগোপযোগীভাবে, এটি আধুনিক সূক্ষ্ম-অলংকার ছাড়া পিউডোকোডের অনুরূপ এবং অন্যকে অনুমান ছাড়াই পদ্ধতিটি “চলাতে” সাহায্য করে।
পুনরাবৃত্তি হল আধুনিক ইটারেশন বা লুপের প্রাথমিক রূপ: একটি ছোট ধাপের সেট বারবার করা, প্রতি বার কিছু বদলানো (যেমন কাউন্টার বা আংশিক যোগফল) যাতে শেষবিন্দুতে পৌঁছানো যায়। আধুনিক কোডে এটি for বা while লুপে প্রতিফলিত হয়, যেখানে থাকে:
কারণ যন্ত্র মানুষের মতো প্রাসঙ্গিক স্মৃতিতে ভরসা করতে পারে না। স্পষ্ট ভেরিয়েবল-সমান লেবেলগুলো বলে দেয়:
এগুলি দীর্ঘ পদ্ধতিতে সবচেয়ে সাধারণ ত্রুটি — অনুরূপ দেখায় এমন মানগুলো গুলিয়ে ফেলা — কমায়।
অ্যাবস্ট্রাকশন মানে প্রয়োজনীয় জিনিসগুলোকে আলাদা করে ধরে রাখা এবং অপ্রাসঙ্গিক বিবরণ গোপন রাখা। লাভলেসের নোটগুলো পদ্ধতিটির কোর অংশকে যান্ত্রিক বিবরণ থেকে আলাদা রাখে—এটি আজকের ফাংশন, মডিউল ও রিইউজেবল কম্পোনেন্টের দানবীজ।
একটি ভালো ফাংশন করে:
এই লেবেলটি বিতর্কিত কারণ:
বেশিরভাগ নিস্পত্তিযোগ্য উপসংহার: লাভলেসের নোটগুলো স্পষ্টভাবে প্রোগ্রামিং কী তা সঙ্গতভাবে সংজ্ঞায়িত করেছে—শুধু গণনা নয়, বরং এমন একটি প্রক্রিয়া যা মেশিন অনুসরণ করতে পারে।
কোডিং শুরু করার আগে বা ডিবাগের সময় এই দ্রুত চেকলিস্ট ব্যবহার করুন:
আরও নির্দেশিকা পেতে দেখুন: /blog/how-to-write-better-requirements ও /blog/pseudocode-examples।