Lecture 3 | Programming Language Foundation - A Bigger Landscape | Full Stack Army
Programming Language Foundation - A Bigger Landscape
আজকের লেকচারটা আগের দুইটার তুলনায় অনেক গুরুত্বপূর্ণ হতে যাচ্ছে। কারণ আজ আমরা আমাদের অস্ত্র রেডি করতে যাচ্ছি। ডেভেলপমেন্টে আমাদের অস্ত্র কি হতে পারে? একটু ভাবুন তো। অবশ্যই ল্যাঙ্গুয়েজ। গত ক্লাসে সব প্রোগ্রামিং ল্যাঙ্গুয়েজ নিয়ে একটা আলোচনা করা হয়েছিল। আমরা বুঝতে পেরেছিলাম যে কোনো ল্যাঙ্গুয়েজ কেউ কারো শত্রু না। আজকে আমরা আরেকটা বড় ল্যান্ডস্কেপ নিয়ে আলোচনা করবো। এই ল্যান্ডস্কেপ যদি মাথায় বসিয়ে ফেলা যায় তাহলে যেকোনো ল্যাঙ্গুয়েজ খুব সহজ মনে হবে।
যেকোনো কিছু শিখতে গেলে আগে পুরোটা ম্যাপ করে ফেলে এরপর অল্প অল্প করে শেখা উচিৎ। মানে আপনি যা শিখতে চাইছেন তা সেক্টরে সেক্টরে ক্লাসিফাই করে ফেলুন। এটা যদি করতে পারেন তাহলে আপনার জন্য যেকোনো কিছু শেখা সহজ হয়ে যাবে।
আজ আমাদের কাজ হলো কিভাবে সহজে নতুন নতুন টেকনোলজি শেখা যায় তা নিয়ে আলোচনা করা।
Today's Agenda
আমাদের আজকের এজেন্ডা হলো:
- Programming Language Landscaping
- Visualize Programming Syntax
Programming Language Landscaping
এই টপিক বুঝার জন্য আমাদের নিচের ডায়াগ্রামটা বুঝতে হবে।
প্রোগ্রামিং ল্যাঙ্গুয়েজের কি কি জিনিস আছে? এই প্রশ্নটা যদি করা হয় আর সব উত্তর যদি লিস্ট করা হয় তাহলে এর শুরু এবং শেষ খুঁজে পাওয়া যাবে না। সেক্ষেত্রে প্রতিটা জিনিস যদি আমি ক্যাটাগরিতে ভাগ করে ফেলতে পারি তাহলে আমাদের জন্য রোডম্যাপ তৈরি করাটা সহজ হয়ে যাবে। একটা প্রোগ্রামিং ল্যাঙ্গুয়েজের কোর কম্পোনেন্ট মূলত ৩টি। কোর কম্পোনেন্ট মানে হলো যা ছাড়া প্রোগ্রামিং ল্যাঙ্গুয়েজ কল্পনা করা যায় না। এই ৩টি কম্পোনেট হলো:
ইনপুটঃ ইনপুট অনেকভাবে দেয়া যায়। আমি কীবোর্ডে কিছু লিখছি সেটা ইনপুট, ফর্ম সাবমিট ইনপুট, ব্রাউজারে কিছু সার্চ করা ইনপুট। প্রোগ্রামিং ল্যাঙ্গুয়েজে অসংখ্য ইনপুট থাকতে পারে। কিন্তু আমরা যখন ল্যাঙ্গুয়েজ শেখা শুরু করবো আমাদের বাছাই করে নিতে হবে স্ট্যান্ডার্ড ইনপুট কোনটা। এর মানে হলো আমাদের টার্মিনাল ওপেন থাকবে, আমরা কীবোর্ড দিয়ে ইনপুট দিবো। একেই বলে স্ট্যান্ডার্ড ইনপুট।
প্রসেসিংঃ ইনপুট দেয়ার পর কোনো না কোনোভাবে সেটা প্রসেসিং করবে। এই কাজটা অনেক বড়। এই প্রসেসিংকে আবার দুই ভাগে ভাগ করা যায়ঃ
ফাউন্ডেশনালঃ একটা অ্যাপ্লিকেশনের মেইন প্রব্লেম সলভ করার জন্য যা যা লাগে তাদের এই ক্যাটাগরিতে ফেলা হয়। এখানে কিছু গুরুত্বপূর্ন টপিক আছে।
ভ্যারিয়েবলঃ একটা প্রোগ্রামিং ল্যাঙ্গুয়েজের অন্যতম গুরুত্বপূর্ণ বিষয় হলো ভ্যারিয়েবল। এটাকে আমরা তেমন একটা পাত্তা দিই না, কিন্তু এটা খুবই গুরুত্বপূর্ণ কোথায় ভ্যারিয়েবল নিতে হবে কোথায় নিতে হবে না। কোনো অপ্রয়োজনীয় ভ্যারিয়েবল নিলে হবে না, কারণ মেমোরি লিক হওয়ার চান্স থাকে। তাই এই টপিকটা বুঝার ব্যাপার আছে।
স্টেটমেন্ট / এক্সপ্রেশনঃ
অপারেটরঃ
লজিকঃ এর মধ্যে লজিক্যাল অপারেশন্স বা লজিক বিল্ডিং যেমন কন্ডিশন, লুপ এসব কিছুই চলে যায়।
ফাংশনঃ কোড পুনরায় ব্যবহার করার জন্য এটা খুবই অসাধারণ কম্পোনেন্ট। এই বিষয়ে আমরা বিস্তারিত জানবো।
অ্যারে, কী-ভ্যালু পেয়ার ডাটা স্ট্রাকচারঃ অনেক ধরণের ডাটা স্ট্রাকচার আছে। কিন্তু সবগুলো প্রব্লেম সলভ করতে লাগে না। কিন্তু দুইটা ডাটা স্ট্রাকচার আছে যেগুলো ছাড়া প্রব্লেম সলভ কল্পনাই করা যায় না। প্রতিটা প্রোগ্রামিং ল্যাঙ্গুয়েজ এই দুইটা ডাটা স্ট্রাকচার বাই ডিফল্ট দিয়ে দেয়। বাকিগুলো অনেক কমপ্লেক্স, সেটা আমাদের প্রয়োজনে আমরা ইমপ্লিমেন্ট করে থাকি। এই দুইটা ডিএসের মধ্যে একটা হলো অ্যারে। দ্য মোস্ট ইগ্নোরড ডাটা স্ট্রাকচার। অ্যারে যে একটা ডাটা স্ট্রাকচার এটা আমরা অনেকেই জানিনা। আপনি যদি Array Data Structure - GeeksForGeeks লিংকে যান, তাহলে দেখবেন এক অ্যারে নিয়ে কি পরিমাণ অ্যালগরিদম আছে। এগুলো আমাদের জানা লাগবে। আরেকটা ডাটা স্ট্রাকচার যেটা হলো কী-ভ্যালু পেয়ার। অ্যারে এবং কী-ভ্যালু পেয়ার একে অন্যের পরিপূরক। অ্যারেতে আমরা নাম দিতে পারি না, ইনডেক্স ধরে ধরে কাজ করতে হয়। কিন্তু কী-ভ্যালু পেয়ারে আমরা ডেটার নামকরণ করতে পারি। এটা জাভাস্ক্রিপ্টে বলে অবজেক্ট, সি তে বলে স্ট্রাকচার, পাইথনে বলে ডিকশনারি, ডার্টে বলে ম্যাপ, জাভাতে একটু ডিফারেন্ট যেহেতু অবজেক্ট অরিয়েন্টেড ল্যাঙ্গুয়েজে তাই ক্লাস তৈরি করে দুইটা কী আর ভ্যালু দিয়ে দিলেই কী-ভ্যালু পেয়ার হয়ে যাচ্ছে। এদের মধ্যে সবচেয়ে শক্তিশালী হলো জাভাস্ক্রিপ্টের অবজেক্ট। সব ল্যাঙ্গুয়েজে কী-ভ্যালু পেয়ারের মধ্যে কিছু কিছু ভিন্নতা আছে। কিন্তু যেটা মূল ব্যাপার, সেটা হলো কী এবং ভ্যালু থাকবে।
এই যে ছয়টা কম্পোনেন্ট দেখছেন এগুলো হলো পাজল। পৃথিবীতে যতো ছোট বড় অ্যাপ্লিকেশন আছে সব তৈরি করা হয়েছে এগুলো দিয়ে। এদের মধ্যে লাস্টেরটা প্রয়োজনভেদে অ্যাডভান্স ডাটা স্ট্রাকচার দিয়ে রিপ্লেস করা যায়। কিন্তু প্রথম ৫টা রিপ্লেসের কোনো সুযোগ নেই।
সি এর যে চাইল্ড ল্যাঙ্গুয়েজগুলো আছে যেমন সি++, জাভা, জাভাস্ক্রিপ্ট, পিএইচপি এগুলোতে সিনট্যাক্স অনেক কাছাকাছি। ফাউন্ডেশনাল কম্পোনেন্টগুলো ল্যাঙ্গুয়েজ ভেদে শুধু সিনট্যাক্সে ভিন্ন হয়। অন্য কোনো থট প্রসেসে ভিন্ন হয় না। থট প্রসেস একই। শুধুমাত্র সিনট্যাক্স আলাদা।
স্ট্রাকচারালঃ কোড লেখার চেয়ে কোড বছরের পর বছর ধরে মেইনটেইন করাটা হচ্ছে সবচাইতে কঠিন কাজ। একটা অ্যাপ্লিকেশন যদি সুন্দরভাবে স্ট্রাকচার করা না যায় তাহলে সেটা মেইনটেইন করা দুরূহ ব্যাপার হয়ে যাবে। সেই স্ট্রাকচারাল প্রব্লেম সলভ করার জন্য আমরা এই স্ট্রাকচারাল প্রসেসিং ব্যবহার করি। এতে আছে
- OOP: এটা ল্যাঙ্গুয়েজ স্পেসিফিক বিষয় না। গত ক্লাসে আমরা এটা নিয়ে বিষদ আলোচনা করেছিলাম। এটা একটা থিওরাম। যদিও সি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজ না, কিন্তু আমরা সি তে অবজেক্ট অরিয়েন্টেড থিওরি অ্যাপ্লাই করে OOP এর কাজ করতে পারি। তাহলে দেখা যাচ্ছে যে ল্যাঙ্গুয়েজ আমাকে OOP এর সাপোর্ট দিচ্ছে সেখানেও আমরা OOP ব্যবহার করতে পারছি, যেখানে সাপোর্ট দিচ্ছে না সেখানেও আমরা পারছি।
- Functional: এটাও কোনো ল্যাঙ্গুয়েজ স্পেসিফিক না। কারণ এটা একটা থিওরাম। আর এটা ব্যবহার করে আমরা ফাংশনকে ভ্যালু হিসেবে ইউজ করতে পারি, এবং ফাংশন দিয়েই আমরা দুনিয়ার সবকিছু বানিয়ে ফেলতে পারি। এক্ষেত্রেও যে ল্যাঙ্গুয়েজ আমাকে ফাংশনাল এর সাপোর্ট দিচ্ছে সেখানেও আমরা ফাংশনাল ব্যবহার করতে পারছি, যেখানে সাপোর্ট দিচ্ছে না সেখানেও আমরা পারছি।
- Design Pattern: এটা কোনো প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিপেন্ডেন্ট না। যেহেতু OOP প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিপেন্ডেন্ট না, আমরা OOP বিভিন্ন ওয়েতে ব্যবহার করে ডিজাইন প্যাটার্ন বানিয়ে থাকি। তাই এটিও প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিপেন্ডেন্ট না।
- Design Principles: এটাও কোনো প্রোগ্রামিং ল্যাঙ্গুয়েজের উপর ডিপেন্ড করে না। এতে আছে SOLID (Single responsibility, Open-closed, Liskov substitution, Interface Segregation, and Dependency inversion), DRY (Don't Repeat Yourself), KISS (Keep It Simple, Stupid), YAGNI (You Aren’t Gonna Need It), SoC (Separation of Concerns), Avoid Premature Optimization, Law of Demeter, Clean Code Architecture. মোটামুটি এই ৭/৮ ধরণের প্রিন্সিপাল জানলে যেকোনো কিছু করতে পারবো। এই বিষয়গুলোর আইডিয়া পেতে এই লিংক ভিজিট করতে পারেন।
- DSA: এখানে একটা প্রশ্ন আসে, ডিএসএ কোনো ল্যাঙ্গুয়েজ ব্যবহার করে শিখা বেটার। আমরা আসলে বুঝিই না ডিএসএ কি জিনিস? ডিএসএ হচ্ছে একধরণের ম্যাথমেটিক্স। গণিতের একটা শাখা আছে ডিসক্রিট ম্যাথমেটিক্স। ডাটা স্ট্রাকচার এবং অ্যালগরিদম এই শাখার অন্তর্ভুক্ত। প্রোগ্রামিং ল্যাঙ্গুয়েজ আসার অনেক আগে থেকে ডিএসএ পৃথিবীতে রয়েছে। যেকোনো ল্যাঙ্গুয়েজ ব্যবহার করেই তা প্রয়োগ করা যায়। ডাটা স্ট্রাকচার হলো আমার ডাটাকে কোনো একটা উপায়ে স্ট্রাকচার করে রাখা, যেন আমি সহজে ডাটা ইনসার্ট করতে পারি, ডাটা বের করে আনতে পারি, প্রয়োজনবোধে ডাটা আপডেট এবং ডিলিট করতে পারি। এখন কোন কাজটা করবো সেই অনুযায়ী আমরা ডাটা স্ট্রাকচার সিলেক্ট করবো। তবে একটা কথা পরিষ্কার মনে রাখতে হবে যে ডিএসএর সাথে প্রোগ্রামিং ল্যাঙ্গুয়েজের কোন সম্পর্ক নাই।
কিন্তু অ্যাপ্লিকেশনের যে মেইন প্রব্লেম সেটা সলভ করা যায় না স্ট্রাকচারাল প্রসেসিং দিয়ে। তার জন্য কিছু টপিক লাগে যেগুলোকে বলা হয় কম্পিউটার ফান্ডামেন্টালস। যেগুলো ফাউন্ডেশনাল প্রসেসিং এ আলোচনা করা হয়েছে।
উপরের দুইটা কম্পোনেন্টের মধ্যে সবচেয়ে গুরুত্বপূর্ণ হলো ফাউন্ডেশনাল কম্পোনেন্ট। পৃথিবীর যত সমস্যা আছে সব সলভ করা হয়েছে এটা দিয়ে। স্ট্রাকচারাল লাগে ডেভেলপমেন্টের উদ্দেশ্যে। যতক্ষণ ফাউন্ডেশনালে আমরা কমফোর্টেবল না ততক্ষণ আমরা স্ট্রাকচারালে যাওয়া উচিৎ না। ফাউন্ডেশনালে আমরা কাজ করবো ইম্পেরেটিভ ওয়েতে।
- আউটপুটঃ প্রসেসিং এর পর আমাদের কাছে একটা আউটপুট আসবে। আউটপুট হতে পারে মনিটর, জাভাস্ক্রিপ্ট ডম, প্রিন্টার, সাউন্ডবক্স ইত্যাদি। কিন্তু যখন আমরা প্রথম প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখবো তখন আমরা স্ট্যান্ডার্ড আউটপুট নিয়ে কাজ করবো। পরবর্তীতে কাজ করতে করতে বাকিগুলো শিখে নিবো
Visualize Programming Syntax
আমাদের প্রোগ্রাম করতে গেলে ভয় লাগে কেন? কারণ মানুষ যখন চিন্তা করে তখন সে একটা ইমেজ দিয়ে চিন্তা করে। কিন্তু প্রোগ্রামিং এর ক্ষেত্রে আমাদের ইমেজ নিয়ে চিন্তা করতে সমস্যা হয়। আমরা শুধু সিনট্যাক্স নিয়েই ভাবি। সেক্ষেত্রে সমস্ত সিনট্যাক্স আমাদের মাথায় গিয়ে প্যাঁচ খেয়ে যায়। তখন আমরা অনেক সমস্যার মধ্যে পড়ি। যদি আমরা প্রোগ্রামিং সিনট্যাক্সগুলোকে ইমেজের মতো করে কল্পনা করতে পারি তাহলে আমাদের জন্য অনেকটা সহজ হয়ে যায়। এর জন্য একটা ওয়েবসাইট আছে যার নাম Scratch। যারা বিগিনার তারা এখানে গিয়ে পাজলের মতো মিলিয়ে মিলিয়ে সুন্দরভাবে শিখতে পারবেন। এটা নিয়ে তামিম শাহরিয়ার সুবিন ভাইয়ের Scratch Programming in Bangla প্লেলিস্টটি দেখতে পারেন। যারা বিগিনার না প্রোগ্রামিং এ তাদের জন্যও স্ক্র্যাচ ভিজ্যুয়ালাইজেশনের জন্য খুব উপকারী হবে।
জাভাস্ক্রিপ্টকে Weird Language বলার কারণ
জাভাস্ক্রিপ্টকে এমনটা বলার কারণ হলো এখানে OOP আর functional এমনভাবে আছে যেটাতে বিগিনাররা কনফিউজ হয়ে যায়। এখানে যেমন OOP এর কাজ করা যায়, তেমনি যখন মেথড লিখবো সেখানে আবার ফাংশনের সমস্ত বিষয় ব্যবহার করতে পারবো। এটা ক্লিয়ার করতে হহবে খুব ভালভাবে। আরেকটা প্রব্লেম আছে যেটা হলো সেটা হলো জাভাস্ক্রিপ্ট ডাইনামিক এবং উইকলি টাইপড ল্যাঙ্গুয়েজ। জাভাস্ক্রিপ্ট এক ডাটা টাইপকে অন্য ডাটা টাইপে কনভার্ট করার চেষ্টা করে যেটা একটা প্রব্লেম। উদাহরণস্বরূপঃ
let a = 'ab';
console.log(Number(a)); // NaN
এটা যদি পাইথনে হতো সে এরর দিতো। কিন্তু জাভাস্ক্রিপ্ট সেটাকে কনভার্ট করার চেষ্টা করে, এবং ফলস্বরূপ আউটপুট দেয় Nan
। এসব কারণে জাভাস্ক্রিপ্টকে উইয়ার্ড ল্যাঙ্গুয়েজ বলা হয়।
Why do we use function
ধরেন আমাদের একটা রিকোয়ারমেন্ট আছে দুইটা সংখ্যা যোগ করার। টোটাল ছয়টা ক্যালকুলেশন হবে এই যোগের। আমরা ইম্পেরেটিভ ওয়েতে লেখা শুরু করলাম।
let a = 10 + 20;
let b = 20 + 30;
let c = 40 + 50;
let d = 10 + 20;
let e = 20 + 30;
let f = 40 + 50;
এরপর হঠাৎ ক্লায়েন্ট এসে বললো ভাই এখানে যে যোগ করার কথা বলেছিলাম, সেটা যোগ হবে না সেটা হবে বিয়োগ। এবার আপনি আবার বসে বসে সব চেইঞ্জ করলেন এভাবে।
let a = 10 - 20;
let b = 20 - 30;
let c = 40 - 50;
let d = 10 - 20;
let e = 20 - 30;
let f = 40 - 50;
এবার আবার ক্লায়েন্ট এসে বললো ভাই ঐ যে বলেছিলাম বিয়োগ হবে সেটা আমি ভুল করেছি। সেটা বিয়োগ হবে না, যোগই হবে কিন্তু প্রতিটা থেকে এক বিয়োগ হবে। মাথা আপনার ফায়ার। কিন্তু কিছু করার নাই আবার আপনি করলেন এভাবে।
let a = 10 + 20 - 1;
let b = 20 + 30 - 1;
let c = 40 + 50 - 1;
let d = 10 + 20 - 1;
let e = 20 + 30 - 1;
let f = 40 + 50 - 1;
এবার আপনি চিন্তা করলেন ক্লায়েন্ট সুবিধার না। সে এসে বিভিন্ন সময় বিভিন্ন চেইঞ্জ দিচ্ছে। আর এখানে ছয়টার জায়গায় ছয় হাজার যদি হয় তখন তো পাগল হয়ে যেতে হবে। আপনি করলেন কি বুদ্ধি করে একটা ফাংশন বানিয়ে নিলেন এভাবে।
function myFunction(a, b) {
return a + b - 1;
}
আর ভ্যারিয়েবলগুলোকে লিখলেন এভাবে।
let a = myFunction(10, 20);
let b = myFunction(20, 30);
let c = myFunction(40, 50);
let d = myFunction(10, 20);
let e = myFunction(20, 30);
let f = myFunction(40, 50);
এবার যদি ক্লায়েন্ট এসে বলে ভাই ১ বিয়োগ হবে না। তাহলে আপনি শুধু একটা জায়গায় চেইঞ্জ করবেন। সেটা হলো ফাংশন থেকে - 1
কেটে দিবেন। তাহলে ফাংশন দাঁড়াবে এরকম।
function myFunction(a, b) {
return a + b;
}
এরপর যদি সে বলে আমি আসলে চাইছি প্রতিটা সংখ্যার বর্গের যোগফল। কোনো সমস্যা নাই। ফাংশন বডি চেইঞ্জ করুন।
function myFunction(a, b) {
return a ** a + b ** b;
}
তাহলে দেখা যাচ্ছে ফাংশনের মাধ্যমে আমাদের কাজ কমে যাচ্ছে, ডিবাগিং এ সুবিধা হচ্ছে, মেইনটেইন করতে সুবিধা হচ্ছে কোড, এবং কোড রিইউজও করতে পারছি। যখন দেখবো কোনো কোড আমাদের দুইবার লিখতে হচ্ছে সেখানেই আমরা ফাংশন ইউজ করবো। যেখানেই কোড রিপিটেশন সেখানেই ফাংশন।
আমাদের বিগিনারদের দুই জায়গায় মূলত প্রব্লেম হয়। একটা হচ্ছে ভ্যারিয়েবল ডিক্লেয়ার করা। আরেকটা হচ্ছে ফাংশন ডিক্লেয়ার করা। এর সমাধান হচ্ছে-
- যখনই দেখবো আমার কাছে একটা ডেটা আছে, আমরা সেই ডেটার জন্য একটা ভ্যারিয়েবল বানিয়ে ফেলবো।
- প্রথমে আমাদের যা কাজ আছে আমরা করতে থাকবো। করতে করতে যখন দেখবো যে একই কাজ আমরা একের অধিক করেছি, সাথে সাথে আমরা তার জন্য একটা ফাংশন লিখে ফেলবো। এখানে আমরা আমাদের অজান্তে একটা ডিজাইন প্রিন্সিপাল অ্যাপ্লাই করে ফেলেছি। সেটা হলো DRY।
Conclusion
স্ট্রাকচারাল কম্পোনেন্টকে যদি ধরেন বিল্ডিং এর ডিজাইন, রঙ তাহলে ফাউন্ডেশনাল হলো ইট, বালি, সিমেন্ট, রড। আপনার বিল্ডিং যতোই সুন্দর হোক না কেন ইট, বালি, সিমেন্ট, রড যদি ভাল না হয় তাহলে সে বিল্ডিং টিকবে না। তাই আমাদের ফাউন্ডেশনাল ক্লিয়ার করেই স্ট্রাকচারালে যাওয়া উচিৎ। ফাউন্ডেশনালে কোনো ধরণের ল্যাকিংস রাখা উচিৎ না।