21-12-2024 17:47:00 pm
Link: https://bigyan.org.in/theoretical-computer-science
সৌমিক (বিজ্ঞান): প্রথমে জানতে চাইবো, তুমি গবেষণার জগতে যে পথটা বেছে নিয়েছ, তার পিছনে অনুপ্রেরণা কী ছিল।
সুজয় ভোর: এর দু-রকম উত্তর রয়েছে। আমি কম্পিউটার সায়েন্স নিয়ে পড়া শুরু করেছিলাম কারণ কম্পিউটার সায়েন্স ব্যাপারটাকে আমার exciting লেগেছিল। আমার অঙ্ক ভালো লাগতো। মনে হয়েছিল, কম্পিউটার সায়েন্স এমন একটা বিষয় যেখানে অঙ্কের একটা প্রয়োগ রয়েছে।
একদম শুরুর দিকে, কম্পিউটার সায়েন্স-এর অ্যাপ্লায়েড এবং সিস্টেমস দিকগুলোই বেশি মজাদার লাগতো। যেমন, সিস্টেমস-এর দিক থেকে মাইক্রোপ্রসেসর, কম্পিউটার আর্কিটেকচার, মেশিন তৈরি, বা প্রয়োগের দিক থেকে আর্টিফিশিয়াল ইন্টেলিজেন্স বা মেশিন লার্নিং। যেগুলো এখন খুবই প্রচলিত বিষয়।
তাত্ত্বিক বা থিওরিটিক্যাল কম্পিউটার সায়েন্স-এ আসা, সেটা অনেকটা পরে হয়েছে। আমি কলেজে দ্বিতীয় বর্ষ থেকে এই বিষয়টার সাথে পরিচিত হয়েছিলাম। তারপর আস্তে আস্তে আমার এইদিকে উৎসাহ বাড়তে থাকে। (হেসে) এর একটা কারণ হলো, তাত্ত্বিক বিজ্ঞানের মধ্যে ওই একটা চিরন্তন ব্যাপার রয়েছে। এমন একটা জিনিস বানাচ্ছি যেটা হয়তো প্রায় চিরকাল টিকে থাকবে। যদি তুমি একটা থিওরেম প্রমাণ করো, সেই থিওরেম-টার প্রভাব বহুদিন পর্যন্ত থেকে যায়, যতদিন না সেই প্রমাণের বিরুদ্ধে কিছু পাওয়া যাচ্ছে অন্য কোনো সূত্রে। এটা ধীরে ধীরে আমাকে গবেষণার জগতে টানতে থাকে।
আরেকটা জিনিস যেটা আমার কাছে ওই বয়সে খুব আকর্ষণীয় ছিল, সেটা হলো, গবেষকরা যেভাবে অনেক কিছুর সংস্পর্শে আসার সুযোগ পায়। বিভিন্ন জায়গায় যাওয়ার সুযোগ, সেখানকার মানুষের সাথে কথা বলার সুযোগ, তাদের সম্বন্ধে বা তাদের সংস্কৃতির সম্বন্ধে জানার সুযোগ। আমার মনে হয়েছিল, গবেষণা এমন একটা মাধ্যম যার হাত ধরে আমি এই সমস্ত জিনিসগুলো করতে পারি। একই সাথে, যেটা আমার পছন্দের জায়গা, সেই বিষয়ে রপ্ত থাকতে পারি।
আচ্ছা, তুমি যে তাত্ত্বিক বা theoretical কম্পিউটার সায়েন্সে কাজ করো, এই তাত্ত্বিক কম্পিউটার সায়েন্স ব্যাপারটা ঠিক কী? কম্পিউটার সায়েন্স বলতে আমরা যেটা বুঝি, তার সাথে coding করা বা কোনো একটা simulation software চালানো, এর কোনো তফাৎ আছে কি? তুমি এই যে অঙ্কের কথা তুললে, তাত্ত্বিক কম্পিউটার সায়েন্সে অঙ্কের অংশটা কি বেশি?
এটা নিয়ে একটা সুন্দর কথা আছে। ডাচ গণিতজ্ঞ এবং কম্পিউটার বিজ্ঞানী Dijkstra, যার কম্পিউটার সায়েন্সের শুরুর দিকে প্রচুর অবদান রয়েছে, তিনি এটা বলেছিলেন। বিভিন্ন ক্ষেত্রে, যেমন Uber app-এ
আমরা যে ধরনের shortest path অ্যালগোরিদম ব্যবহার করি, সেগুলো Dijkstra-এর দেওয়া।
এই Dijkstra-এর একটা খুব সুন্দর কথা আছে: কম্পিউটার সায়েন্স আসলে কম্পিউটার নিয়ে চর্চা নয় (computer science is not about computers)। যেমন, জ্যোতির্বিদ্যা বা অ্যাস্ট্রোনমি টেলিস্কোপ নিয়ে চর্চা নয়। বা, বিজ্ঞানের যে কোনো শাখাই কোনো যন্ত্রকে ঘিরে নয়।
এটা শুনে মনে হতে পারে, কথাটার মধ্যে একটু স্ববিরোধিতা রয়েছে। কারণ কম্পিউটার সায়েন্স নামটার মধ্যেই কম্পিউটার ব্যাপারটা রয়েছে। এখানে একটা জিনিস আমি স্পষ্ট করতে চাই — কম্পিউটার সায়েন্স যেটা নিয়ে মূলত মাথা ঘামায়, সেটা কম্পিউটার অর্থাৎ গণকযন্ত্রর থেকে বেশি কম্পিউটিং বা গণনার প্রণালীটা।
যেমন, এই বিষয়টার সূচনা কিন্তু হয়েছিল কম্পিউটার আবিষ্কারের অনেক আগে থেকে। আমরা যদি সেই প্রাচীন ইতিহাসে না-ও যাই, গত শতাব্দীর কথাই ধরতে পারি। 1940-এর দশকে দ্বিতীয় বিশ্বযুদ্ধের সময় কম্পিউটিং নিয়ে গবেষণাতে একটা নতুন জোয়ার আসে যখন Alan Turing বিষয়টাকে আরো মজবুত ভিতের উপর দাঁড় করান। ওনার কাজে কিন্তু গণনার প্রক্রিয়াটার উপর বেশি জোর দেওয়া হয়।
এখন কম্পিউটিং ব্যাপারটা ঠিক কী? আমি যেভাবে দেখি, কম্পিউটিং বা গণনার প্রক্রিয়া আসলে গণিতের একটা শাখা যেখানে বাস্তব সীমাবদ্ধতাগুলোকে নিয়ে মাথা ঘামাতে হয়। যে মডেলগুলো নিয়ে আমরা কাজ করি সেগুলোর ক্ষমতা সীমিত, কারণ বাস্তবে আমাদের গণনার ক্ষমতাও অসীম নয়। যেমন, তুমি যদি একটা স্মার্টফোন ব্যবহার করো, তার একটা নির্দিষ্ট মেমরি রয়েছে বা সেটা একটা নির্দিষ্ট স্পিড-এ প্রসেসিং করতে পারে। যদি এই সম্ভাব্য সীমাবদ্ধতার কথা ভেবে গণনার প্রক্রিয়ার একটা ভিত্তি তৈরি করা হয়, সেটাই হবে কম্পিউটিং বা গণনার তত্ত্ব। এই তত্ত্বকে ঘিরে যে বিষয়টা, সেটাকেই আমরা কম্পিউটার সায়েন্স-এর তত্ত্ব বা তাত্ত্বিক কম্পিউটার সায়েন্স বলে থাকি।
এখানে আরেকটা জিনিস আমি যোগ করবো। তাত্ত্বিক কম্পিউটার সায়েন্স-এর অবশ্যই একটা ভীষণ বাস্তব প্রয়োগ রয়েছে। আমরা নানা বিষয়ে কম্পিউটার সায়েন্স-এর তত্ত্বগুলো প্রয়োগ করে থাকি। যেমন, বায়োলজি-তে জিন সিকোয়েন্স করতে কম্পিউটিং-এর তত্ত্বের ব্যবহার করা হয়। অথবা ফিজিক্স বা কেমিস্ট্রি-তেও কম্পিউটার সায়েন্স-এর একটা প্রয়োগ রয়েছে। এইসব প্রয়োগের জায়গাতেও কিন্তু গণনার প্রণালীটা অনেক বেশি গুরুত্বপূর্ণ হয়ে দাঁড়ায় কম্পিউটার মেশিন-টার থেকে।
এটাকে আরেকটু ভেঙে বললে, গণনার প্রক্রিয়ার সাথে সেই গণনাটার স্কেলেবিলিটি-র কোনো যোগ নেই। মানে, আমার কম্পিউটার 256 GB স্টোর করতে পারে কি 512 GB, তার উপর গণনার তত্ত্ব নির্ভর করে না। আদৌ কোনো একটা কোড চালানো যাবে কিনা, সেটা এর উপর নির্ভর করে। কিন্তু তত্ত্ব বানানোর সময় আমরা কম্পিউটার-এর মেমরি ইত্যাদিকে তত্ত্বের একটা প্যারামিটার হিসেবে ধরে নিই। তারপর দেখি, সেই প্যারামিটার-এর উপর ভিত্তি করে হাতে মজুত গণনার ক্ষমতাকে কতটা কাজে লাগাতে পারি। অর্থাৎ, গণনার ক্ষমতায় সীমাবদ্ধতা রয়েছে, এটা মাথায় রেখে তত্ত্ব বানাতে হয়, কিন্তু তত্ত্ব বানানোর সময় সীমাবদ্ধতাটা ঠিক কোথায়, সেটা ভাবার দরকার পড়ে না।
এর ফলে একটা অন্য সমস্যাও হয়। গণনার তত্ত্ব যে সবসময় সবার কাজে লাগবে এরকম নয়। যদি একটা খটোমটো শব্দ ব্যবহার করি, কম্পিউটার সায়েন্স-এ theoretical lower bounds বলে একটা জিনিস রয়েছে। সেখানে প্রমাণ করা হয় যে একটা নির্দিষ্ট গণনার ক্ষমতার মধ্যে, একটা নির্দিষ্ট সময়ে কোনো একটা গণনা করা সম্ভবই নয়।
একটা জিনিস আমার মনে হয়। এই যে, কম্পিউটার সায়েন্স-এর তত্ত্ব আর কোডিং, এই দুটো কি সম্পূর্ণ আলাদা? নাকি কখনো এরা হাত ধরেও চলে? এই দুটোর মধ্যে সম্পর্কটা কী? আমরা জানি, কোডিং এখন খুব জনপ্রিয়, সবাই ছোটোবেলা থেকে শিখছে। তারা কি কম্পিউটার সায়েন্স-ও শিখছে?
এটা খুবই ভালো প্রশ্ন। কম্পিউটার সায়েন্স আর কোডিং-এর মধ্যে যোগসূত্রটা কোথায়, সেটা আমার মনে হয় দু-দলেরই বোঝা জরুরি — যারা কম্পিউটার সায়েন্স নিয়ে চর্চা করছে, আর যারা কোডিং করছে।
তোমরা অ্যালগোরিদম শব্দটার কথা হয়তো শুনেছ। এই কথাটা মধ্যপ্রাচ্যের এক গণিতজ্ঞ-এর নাম থেকে এসেছে। এই কথাটার মানে হলো, ধরো তোমাকে একটা নির্দিষ্ট কাজ দেওয়া হলো। তোমাকে একটা ইনপুট দেওয়া হবে, এবং তোমার কাজের শেষে অমুক আউটপুট পাওয়ার আশা করছি। তোমাকে কাজটা ধাপে ধাপে ভেঙে করতে হবে। এই ধাপে ধাপে ভাঙার কাজটাকেই বলা হয় অ্যালগোরিদম বানানো।
অ্যালগোরিদম -এর ব্যবহার আমাদের জীবনের প্রত্যেকটা কাজে রয়েছে। যদি রান্না করতে চাই, তার জন্যেও আমাদের ধাপে ধাপে এগোতে হবে। পরপর ধাপগুলো পেরোলে তবেই আমরা একটা নির্দিষ্ট আউটপুট পেতে পারি।
এখন এই অ্যালগোরিদম -এর বাস্তব জগতে একটা প্রকাশ হলো প্রোগ্রামিং বা কোডিং। আমি বা তুমি যে ভাষায় কথা বলি বা একে অপরকে বোঝানোর চেষ্টা করি, কম্পিউটার সেই ভাষা বুঝতে পারবে না, কারণ শত হলেও কম্পিউটার-এর পরিচিতিটা ইলেকট্রনিক্স-এর জগতে সীমাবদ্ধ। তাই কম্পিউটার-কে বোঝাতে হলে আমাদের অনেকগুলো মধ্যবর্তী ভাষা তৈরি করতে হয়। তার অনেক বিবরণ আছে, assembly language, compiled language, interpreted language।
আমরা যদি সেসবের মধ্যে নাও যাই, মূল কথাটা হলো: প্রোগ্রামিং বা কোডিং যেটাকে বলি, কম্পিউটার সায়েন্স তত্ত্বে তার পেছনে রয়েছে একটা অ্যালগোরিদম, অর্থাৎ ধাপে ধাপে কার্যোদ্ধার। যখন আমরা কোড লিখি, আমাদের একটা উদ্দেশ্য হলো, কোড-টাকে কতটা সফলভাবে চালাতে পারবো যাতে আমার প্রয়োজনীয় আউটপুট পেতে পারি। কিন্তু অ্যালগোরিদম নিয়ে চর্চা করার সময়, যেটাকে আমরা বলি design and analysis of algorithms, সেখানে আরো একটা ব্যাপার প্রমাণ করার দায় এসে যায়। শুধু এটুকুতেই সন্তুষ্ট থাকলে চলে না যে একটা উপায় পেয়েছি যাতে প্রয়োজনীয় আউটপুট পাওয়া যায়। এটাও দেখাতে হয় যে সমস্যাটা সমাধান করার যত উপায় হতে পারে, তার মধ্যে এটাই শ্রেষ্ঠ উপায় (‘শ্রেষ্ঠ’ হওয়ার মাপকাঠি যাই হোক না কেন)।
আমি তোমাকে একটা উদাহরণ দিতে পারি। ধরো, আমাদের দেশের রেলওয়ে নেটওয়ার্ক। সেটা অনেক জায়গায় পৌঁছয় এবং তার জন্য দ্রুত পরিবহণ সম্ভব হয়। এই রেলওয়ে নেটওয়ার্ক-টাকে একটা সাদা কাগজে আঁকলে সেটাকে একটা graph হিসেবে ভাবতে পারি, যেখানে প্রত্যেকটা স্টেশন একটা বিন্দু আর স্টেশনগুলোর মধ্যে রেল চললে আমি দুটোর মধ্যে একটা সরলরেখা এঁকে দেবো।
এবার এই নেটওয়ার্ক-টা দিয়ে কেউ একটা প্রশ্ন করতে পারে: আমি মুম্বই থেকে কলকাতা যেতে চাইলে কত তাড়াতাড়ি যেতে পারবো? তার উত্তর দিতে গিয়ে কেউ এইভাবে ভাবতে পারে: তুমি মুম্বাই থেকে সবচেয়ে কাছের যে শহর এই নেটওয়ার্ক-এ আছে সেখানে যাও, সেখান থেকে তার সবচেয়ে কাছের শহরটাতে যাও, এইভাবে যেতে থাকো। সত্যি কথা বলতে কি, মানুষের মস্তিষ্ক এইভাবে অপ্টিমাইজ করে ভাবতেই অভ্যস্ত। কিন্তু যেটা স্বাভাবিক ভাবনায় আসে না এবং যেখানে কম্পিউটার সায়েন্স-এর তত্ত্ব কাজে লাগে, সেটা হলো: এটা প্রমাণ করার একটা দায় আছে যে এইভাবে গেলেই আমি সবথেকে তাড়াতাড়ি পৌঁছতে পারবো। এই কারণেই কম্পিউটার সায়েন্স অঙ্কের খুব কাছাকাছি চলে আসে।
এবং এই প্রমাণ করা কিন্তু মোটেই সহজ নয়। তার কারণে, আমাকে আর সব সম্ভাবনাকে বাদ দিতে হবে, যার দ্বারা এর থেকে ভালো সমাধান আমি পাবো না।
একটা প্রশ্ন করি — তাত্ত্বিক কম্পিউটার সায়েন্স-এর কোন বিশেষ অংশে তুমি কাজ করো? আমি তাত্ত্বিক কম্পিউটার সায়েন্স-এর বিভিন্ন ব্যাপারে উৎসাহী। তার মধ্যে যেটা আমার মূল বিষয়, সেটা হলো: discrete and computational geometry। আরেকটা জিনিস যেটাতে আমার উৎসাহ রয়েছে, সেটা হচ্ছে: algorithms with uncertainties। তারপর ওর আশেপাশে যা হয়: graph theory, robotics, এগুলোতেও আমি কাজ করি।
লেখাটি অনলাইন পড়তে হলে নিচের কোডটি স্ক্যান করো।
Scan the above code to read the post online.
Link: https://bigyan.org.in/theoretical-computer-science