সফটওয়্যার ইন্ডাস্ট্রিতে আসার আগে

তোমরা যারা কম্পিউটার সায়েন্স বা কাছাকাছি কোনো বিষয়ে পড়ছ এবং শীঘ্রই বিশ্ববিদ্যালয়ের গণ্ডি অতিক্রম করে যাবে, তাদের বেশিরভাগই কাজ খুঁজে নেবে সফটওয়্যার ইন্ডাস্ট্রিতে। কম্পিউটার বিজ্ঞানের মৌলিক ধারণার ওপর শক্ত ভিত্তি ও প্রোগ্রামিংয়ে যথেষ্ট দক্ষতা থাকা সত্ত্বেও তোমাদের অনেকের মধ্যেই অনেক দুশ্চিন্তা কাজ করে, আর কী কী শিখতে হবে, কিভাবে শিখব, কতটুকু শিখব এরকম অনেক প্রশ্ন উঁকি দেয় মনে। আজকে আমি পাঁচটি জিনিসের কথা বলব, যেগুলো আমি প্রত্যাশা করি একজন নতুন কম্পিউটার সায়েন্স গ্রাজুয়েট আগে থেকেই জেনে আসবে। যদিও আমি নিজে যখন পাশ করি, তখন এসব জানতাম না, তবে সেটা অনেক অনেক বছর আগের কথা। বর্তমান সময়ে এগুলো না জানলেই নয়।

১) ভার্শন কন্ট্রোল সিস্টেমের ব্যবহার: তোমরা নিশ্চয়ই গিট বা গিটহাবের নাম শুনেছ, না শুনে থাকলে git ও github লিখে গুগলে খোঁজা শুরু কর। খুব সহজ কথায় বললে, গিট হচ্ছে এমন একটি সফটওয়্যার যার মাধ্যমে ভার্শন নিয়ন্ত্রনের কাজটি বেশ সহজে করা যায় এবং সেকারণে অনেকে মিলে একসাথে একটি প্রজেক্ট কাজ করতে সমস্যা হয় না। আর গিটহাব হচ্ছে ওয়েবভিত্তিক একটি সার্ভিস যেখান থেকে বিনামূল্যে গিট ব্যবহার করা যায়। তো গিটহাবে গিয়ে একটু সময় কাটালেই তোমরা এর ব্যবহার শিখে নিতে পার। এছাড়া এই ওয়েবসাইটে গিয়ে তোমরা গিটের ব্যবহার সহজে শিখতে পারবে : https://try.github.io/

২) ডকুমেন্টেশন: ডকুমেন্টেশন দুই পর্যায়ে করতে হয়, একটি হচ্ছে কোডের ভেতরে, আরেকটি হচ্ছে কোডের বাইরে। প্রতিটি ফাংশন ও ক্লাসের সাথে খুব অল্প কথায় সেটি কী কাজ করছে, এটি লিখে দেওয়ার অভ্যাস থাকা ভালো। আর কোডের বাইরে সিস্টেমের ডকুমেন্টেশন, এপিআই ডকুমেন্টেশন এগুলোও লিখতে জানতে হবে। ডকুমেন্টেশন শেখার জন্য সবচেয়ে ভালো উপায় হচ্ছে বিভিন্ন ওপেন সোর্স প্রজেক্টের ডকুমেন্টেশন দেখা। গিটহাবে এরকম প্রচুর প্রজেক্ট হোস্ট করা আছে।

৩) ইউনিট টেস্ট: ইউনিট টেস্ট হচ্ছে প্রোগ্রামের ভেতরে প্রতিটি ফাংশনের জন্য পৃথক টেস্ট কোড। এর মাধ্যমে প্রতিটি ফাংশন টেস্ট করা হয়। সফটওয়্যার ডেভেলাপমেন্ট সহজ করতে এবং বাগ নিয়ন্ত্রণে রাখতে এটি একটি পরীক্ষিত ও কার্যকর উপায়। আর এই ইউনিট টেস্ট করাটা কিন্তু প্রোগ্রামারদেরই কাজ। বর্তমানে প্রোগ্রামিং ভাষার বইগুলোতে সেই ভাষায় কিভাবে ইউনিট টেস্ট করতে হয় সেটির ওপর আলাদা অধ্যায় থাকে, পড়ে নিতে পার।

৪) ওয়েবের ধারণা: তুমি সফটওয়্যারের যে বিভাগে বা যে ধরণের সফটওয়্যার নিয়েই কাজ কর না কেন, বর্তমানে তোমার ওয়েবের শক্ত ধারণা থাকার কোনো বিকল্প নেই। ওয়েব কীভাবে কাজ করে সেটা তোমার জানতে হবে। বিভিন্ন অংশের কাজের ওপর স্বচ্ছ ধারণা থাকতে হবে। ওয়েবের ধারণা অর্জনের জন্য দ্বিমিক কম্পিউটিংয়ের ওয়েব কনসেপ্টস কোর্সটিই সেরা, এবং এটি বিনামূল্যে করা যাবে এই ঠিকানা থেকে: http://dimikcomputing.com/course/web-concepts-online-course/। আর হ্যাঁ, কোর্সটি সম্পূর্ণ বাংলায়।

৫) এপিআই ব্যবহার: বিভিন্ন এপিআই ব্যবহার করতে জানতে হবে, সেটা তুমি মোবাইল ডেভেলাপার হতে চাও কিংবা ওয়েব ডেভেলাপার। ফেসবুক, টুইটার, গুগল ইত্যাদি কোম্পানীগুলো অনেক এপিআই তৈরি করে রেখেছে যেগুলো তুমি তোমার অ্যাপ্লিকেশন (ডেস্কটপ, ওয়েব কিংবা মোবাইল)-এ ব্যবহার করে অনেক চমৎকার সব জিনিস তৈরি করতে পার। বিভিন্ন এপিআই-এর ডকুমেন্টেশন খুব ভালোভাবে লেখা থাকে। তাই সেগুলো পড়ে নিজের কোডে সেটা ব্যবহার করতে পারতে হবে, এর জন্য তোমাকে অফিসে যদি তিন দিন প্রশিক্ষণ দেওয়া লাগে তাহলে কিন্তু মুশকিল।

নতুন দিনের প্রোগ্রামারদের জন্য শুভকামনা।

মেমক্যাশড

মেমক্যাশড কী? মেমক্যাশড-এর ওয়েবসাইটে লেখা আছে :

Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

memcached_banner75

এটা না বুঝলে সমস্যা নাই। সহজ ভাষায় মেমক্যাশড হচ্ছে কি-ভ্যালু স্টোর। কি-ভ্যালু স্টোর আবার কী? জিনিসটা আসলে হ্যাশটেবল, ম্যাপ বা পাইথনের ডিকশনারি-এর মতো। প্রতিটা ডাটার একটা কি থাকবে, সেই কি দিয়ে সহজেই ডাটা একসেস করা যাবে। একটা কি দিয়ে একটা ডাটা (ভ্যালু) পাওয়া যাবে, আবার একটা ভ্যালুর জন্য একটা কি থাকবে। যেমন প্রতিটি দেশের একটি তিন অক্ষরের কোড থাকে, আমরা চাইলে সেই কোড দিয়ে দেশের নামটা জেনে নিতে পারে। এক্ষেত্রে কোড হচ্ছে কি, আর দেশের নাম হচ্ছে ভ্যালু। পাইথনে যদি আমরা একটি ডিকশনারি তৈরি করি, তাহলে এরকম হবে:
alpha_code = {“BGD”: “Bangladesh”, “AUS”: “Australia”, “DEU”: “Germany”, “SGP”: “Singapore”}
এখন print alpha_code[“BGD”] লিখলে Bangladesh প্রিন্ট হবে।

আমরা যদি চাই, আমাদের প্রোগ্রাম বন্ধ হয়ে গেলেও ডাটা যেন হারিয়ে না যায়, তাহলে উপায় কী? সহজ উপায় হচ্ছে ফাইল ব্যবহার করা। আর বেশি ডাটার ক্ষেত্রে উপায় হচ্ছে ডাটাবেজ ব্যবহার করা। এখন ফাইল ব্যবহার করলে ফাইল ওপেন করা, ফাইল থেকে রিড করা, ফাইল ক্লোজ করা – এসব কাজে কিছুটা সময় ব্যায় হয়। তেমনি ডাটাবেজের জন্যও কানেকশন তৈরি করা, কুয়েরি করা, কুয়েরি থেকে রেজাল্ট পড়া, এতেও সময় ব্যায় হয়। উভয় ক্ষেত্রেই ডাটা হার্ড ডিস্কে থাকে। এখন এই ডাটা যদি হার্ড ডিস্কে না রেখে রেমে রাখার ব্যবস্থা করা যেত, তাহলে খুব দ্রুত সেই ডাটা পড়া যেত। কারণ হার্ড ডিস্ক একসেস করার চেয়ে মেমোরি একসেস করার কাজটি প্রসেসর অনেক দ্রুত করতে পারে। তাই বলে সব ডাটা তো আর রেমে রাখা যাবে না, যেসব ডাটা খুব ঘনঘন একসেস হচ্ছে সেসব ডাটা মেমোরিতে রাখা যায়। এই মেমোরিতে ডাটা রাখার ব্যবস্থাটি সহজ করে দিয়েছে মেমক্যাশড।

ক্যাশ করা মানে হচ্ছে ডাটা তৈরি করে রাখা। ধরা যাক, টুইটারের মতো একটি ওয়েবসাইটের একটি ফিচার হচ্ছে ট্রেনডস্ যেখানে সবচেয়ে আলোচিত দশটি বিষয় থাকে এবং এটি দশ মিনিট পরপর আপডেট করা হয়।

Screen Shot 2015-07-11 at 3.46.51 pm

এখন এই দশ মিনিটের ভেতরে কিন্তু কোটি কোটি ব্যবহারকারি টুইটারের ওয়েবসাইট একসেস করছে। তো প্রতিবার যদি টুইটার ডাটাবেজে একটা কুয়েরি চালাত সেরা দশটি আলোচিত বিষয় খুঁজে বের করার জন্য, তাহলে কিন্তু সার্ভারের ডাটাবেজে লোড অনেক বেড়ে যেত আর সেই লোড সামলানো মোটামুটি অসম্ভব হয়ে পড়ত। আর প্রত্যেকের জন্য কিন্তু একই ফলাফল। তাই সেটা যদি মেমোরিতে রেখে দেওয়া যায়, আর সার্ভারে কোনো রিকোয়েস্ট আসলে মেমোরি থেকেই সেটা পড়ে ফেলা যায়, তাহলে দারুণ ব্যাপার হয়। আর সার্ভারে একটা স্ক্রিপ্ট চলবে যেটা দশ মিনিট পরপর মাত্র একটা কুয়েরি চালাবে আর ডাটাবেজে থেকে ডাটা এনে মেমোরিতে রেখে দিবে।

আরেকটি উদাহরণ দেওয়া যাক। ধরা যাক, আমরা কোনো পরীক্ষার ফল প্রকাশ করার জন্য একটি ওয়েবসাইট বানাবো। সবার পরীক্ষার ফলাফল ডাটাবেজে সংরক্ষিত আছে। এখন ওয়েবসাইটে ফল প্রকাশ করার কয়েকমিনিটের মধ্যে বা কয়েকঘণ্টার মধ্যে হাজার হাজার (লাখ লাখও হতে পারে) শিক্ষার্থী ও তাদের অভিভাবক ওয়েবসাইটে এসে হুমড়ি খেয়ে পড়বেন ফলাফল দেখার জন্য। এখন সব ফলাফল যদি ডাটাবেজ থেকে সিলেক্ট কুয়েরি করে দেখাতে হয়, তাহলে কিন্তু ডাটাবেজ সেই লোড সামলাতে পারবে না। কথা হচ্ছে, পরীক্ষার ফল যখন তৈরি হয়ে যায়, তখন কিন্তু সেটি পরিবর্তনের সম্ভাবনা খুবই কম। তাই ফলাফল যদি মেমোরিতে রেখে দেওয়া হয় এবং সার্ভারে রিকোয়েস্ট আসলে সেখান থেকেই জবাব দিয়ে দেওয়া যায়, তাহলে ডাটাবেজের লোড অনেকখানি কমিয়ে দেওয়া সম্ভব। তাহলে আমাদের অ্যালগরিদম হবে এরকম :

১) পরীক্ষার্থীর রোল নাম্বার ইনপুট দেওয়া হলো।
২) রোল নাম্বারটি সার্ভার একটি কি-ভ্যালু স্টোরের মধ্যে খুঁজে দেখতে হবে রোল নাম্বারটি কি হিসেবে ব্যবহার করলে সেটির জন্য কোনো ভ্যালু তৈরি করা আছে কী না। যদি থাকে তাহলে ৫ নম্বর ধাপে যেতে হবে (এটিকে বলে ক্যাশ হিট) আর যদি না থাকে তবে ৩ নম্বর ধাপে যেতে হবে (একে বলে ক্যাশ মিস)।
৩) ডাটাবেজে কুয়েরি করে রেজাল্ট আনতে হবে।
৪) রেজাল্ট ক্যাশে (মেমোরিতে) সংরক্ষণ করতে হবে। যাতে পরবর্তি সময়ে কেউ আবার এই রোল নাম্বারের জন্য রেজাল্ট জানতে চায়, তাহলে আর ডাটাবেজে কুয়েরি করার দরকার পরবে না।
৫) ক্লায়েন্টকে রেজাল্ট রিটার্ন করতে হবে।

মেমক্যাশের মাধ্যমে কাজটি খুব সহজে করা যায়।

এখন মেমক্যাশড এর বৈশিষ্ট্য কী? মেমক্যাশড হচ্ছে আসলে একটা প্রসেস, সেটা সার্ভার-এ সবসময় চলতে থাকবে। মেমক্যাশডের ক্লায়েন্ট সার্ভার দুইটা পার্ট আছে। মেমক্যাশড এর প্রথম বৈশিষ্ট্য হচ্ছে এটা একটা সিম্পল কি-ভ্যালু স্টোর, এটা আমরা আগেই জেনেছি।

তারপর “Smarts half in client, half in server.” এখানে কিন্তু ক্লায়েন্ট এবং সার্ভার দুইটা অংশ আছে। মেমক্যাশড-এ একটা সার্ভার চলতে থাকে, সেই সার্ভার-এর মধ্যে ডাটাগুলা থাকে (আসলে সার্ভার সমস্ত ডাটা মেমরি (RAM)-এর মধ্যে রাখে)। আর ক্লায়েন্ট কী করে? ক্লায়েন্ট সিদ্ধান্ত নেয় যে এখন অমি যে ডাটা আনার জন্য সার্ভারকে কল করব, কোন কি (Key) দিয়ে কল করব?

তারপর আরেকটা মজার ব্যাপার হচ্ছে যে ক্লায়েন্ট কিন্তু একটা না, অনেকগুলা সার্ভার এর সাথেই কমিউনিকেট করতে পারে। খুব বড় অ্যাপ্লিকেশনে আমাদের অনেকগুলা সার্ভার নিয়ে কাজ করতে হয় ও লোড ব্যালেন্সিং করতে হয়। মেমক্যাশড আমাদেরকে একাধিক সার্ভারে ডাটা রাখার সুবিধা দেয়। মেমক্যাশড্ অনেকগুলা সার্ভার এ রেখে দেওয়ার সুবিধা হচ্ছে, যে “Servers are disconnected from each other”, মানে একটা সার্ভার এর সাথে আরেকটা সার্ভার এর কোন সম্পর্ক নাই। তাহলে আমাদের সুবিধা যেটা, যে আমরা যখন নতুন কোন সার্ভার যুক্ত করব তখন বাকীদের সাথে synchronization বা crosstalk বা নিজেদের মধ্যে ব্রডকাস্ট এর কোন ব্যাপার নাই। আবার যখন কোনো সার্ভার বাদ দিয়ে দিব তখন শুধু ওই সার্ভারে যে ডাটাগুলা আছে সেগুলাই শুধু ক্যাশ খুঁজে পাবে না। বাকী সার্ভার-এর ডাটা যেমন ছিল তেমনি থাকবে। আর আমরা নিজেরা কিন্তু প্রোগ্রামিং করার সময় ঠিক করে দিতে পারব না যে ডাটা কোন সার্ভার এর ক্যাশ এ থাকবে? (সেটা কোন সার্ভার এর ক্যাশ এ সেটা জানতে চাইলে আমরা telnet দিয়ে হিট করে দেখতে পারি আসলে এটা কোন ক্যাশ এ আছে, ক্যাশ এর key টা দিয়ে)।

আর সবচেয়ে বড় সুবিধা হচ্ছে O(1) এ আমরা সবকিছু নিয়ে আসতে পারি। (এটা না বুঝলে হাম্মাদ আলী স্যারের ডিসক্রিট ম্যাথ কোর্সটা করে ফেলতে হবে)।

আরেকটা হচ্ছে “Forgetting data is a feature”, আমরা ভ্যালুর এক্সপায়ার টাইম ঠিক করে দিতে পারি। সেই সময় পরে ডাটা ক্যাশ থেকে আপনাআপনি মুছে যাবে। এটা খুব গুরুত্বপূর্ণ ও সুন্দর একটা ফিচার।

তারপরের ফিচারটা হচ্ছে “Cache invalidation is trivial”। আসলে কম্পিউটার সাইন্স এ নাকি দুইটা প্রবলেম খুবই হার্ড প্রবলেম হিসেবে চিহ্নিত করা হয়। প্রথম প্রবলেম হচ্ছে naming প্রবলেম। যে আমরা কোনকিছুর নাম ঠিক করে দিতে পারি না, এটা সবসময়ই হার্ড (কঠিন) প্রবলেম। দ্বিতীয় হার্ড প্রবলেম হচ্ছে ক্যাশিং ভেলিডেশন। এটাও হার্ড প্রবলেম, মানে আমরা যখন ক্যাশটাকে ইনভেলিড করি তখন অনেক জায়গায় অনেক রকম ঝামেলার সৃষ্টি হতে পারে। তো মেমক্যাশড্ এ এই জিনিসটা অনেকটা সহজ হলেও ব্যবহার করার সময় আমাদের নিজেদের কিছু সতর্কতার প্রয়োজন। একটা ডাটা কিন্তু অনেকগুলা ক্যাশ কি-তে রাখতে পারি বিভিন্ন প্রয়োজনে। তখন আমরা যেটা করব তখন আমাদের মাথায় রাখতে হবে প্রোগ্রামিং করার সময় বা ডিজাইন করার সময় যে এখন যদি অমি একটা জিনিস আপডেট (update) করব বা বাদ দিব (invalid করব), তখন সাথে সাথে সংশ্লিষ্ট আর কোথায় কোথায় আমাদের সেই কাজটি করতে হবে। কোনো একটা জায়গায় ভুলে গেলে কিন্তু ঝামেলা হয়ে যাবে। তখন এমন হতে পারে যে ওয়েবসাইটের হোমপেজে দেখাচ্ছে তামিম ইকবাল আউট কিন্তু স্কোরবোর্ডে সেটা দেখাচ্ছে না!

মেমক্যাশড নিয়ে মুক্তসফটে অনেক বছর আগে একটি প্রেজেন্টেশন দিয়েছিলাম, সেটির ভিডিও দেখা যাবে এখানে :

আর স্লাইডগুলো পাওয়া যাবে এখানে

আর আরো জানতে হলে মেমক্যাশডের অফিশিয়াল ওয়েবসাইট-এ যেতে হবে।

মেমক্যাশডের সঠিক ব্যবহার ডেভেলাপার ও ব্যবহারকারীদের জীবনে শান্তি বয়ে আনুক।

লারাভেল ফ্রেমওয়ার্ক

লারাভেল অত্যন্ত জনপ্রিয় একটি ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক। এটি পিএইচপি প্রোগ্রামিং ল্যাংগুয়েজের মাধ্যমে লেখা হয়েছে।

প্রথমেই প্রশ্ন আসে ফ্রেমওয়ার্ক কী? যারা ওয়েব ডেভেলপমেন্টের সাথে জড়িত, তাদের প্রায় প্রত্যেকটা অ্যাপ্লিকেশন তৈরির সময়ই কিছু কমন জিনিস বার বার লিখতে হয়। যেমন, ইউজারের অথেনটিকেশন, সেসন হ্যান্ডেলিং, ক্যাশ-কুকি হ্যান্ডেলিং, ডেটাবেজ স্কিমা তৈরি করা, বিভিন্ন ডেটাবেজ অপারেশন ইত্যাদি। এখন যেহেতু এ কাজগুলো প্রায় প্রত্যেকটা অ্যাপ্লিকেশনেই করতে হয়, তাই ডেভেলপাররা একটা অ্যাপ্লিকেশন বয়েলারপ্লেট ব্যবহার করে, যেখানে আগে থেকেই এ কাজগুলো করা থাকে।  এটিই আসলে ফ্রেমওয়ার্ক নামে পরিচিত।

laravel-architecture-simple
লারাভেল আর্কিটেকচার

বিভিন্ন প্রোগ্রামিং ভাষার জন্য বিভিন্ন ফ্রেমওয়ার্ক রয়েছে, যেমন- পাইথনের জন্য জ্যাঙ্গো(Django), রুবির জন্য রুবি অন রেইলস, জাভার জন্য হাইবারনেট, স্প্রিং ইত্যাদি। পিএইচপি ল্যাংগুয়েজের জন্যও অনেকগুলো ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক রয়েছে, যেমন- কোডইগনিটার, লারাভের, সিম্ফোনি, জেন্ড ফ্রেমওয়ার্ক, ফ্যালকন, ই(Yii) ইত্যাদি। এগুলো সবই জনপ্রিয় ফ্রেমওয়ার্ক। এগুলো ছাড়াও প্রচুর ফ্রেমওয়ার্ক আছে পিএইচপিতে যেগুলো আসলে ততটা জনপ্রিয় নয়।

এখন কথা হচ্ছে, এতগুলো ফ্রেমওয়ার্ক মধ্যে আমরা কোনটা শিখবো? এক্ষেত্রে আমার পরামর্শ হচ্ছে লারাভেল শেখা। যদিও লারাভেল তুলনামূলক নতুন ফ্রেমওয়ার্ক, তবুও এর অসাধারণ কিছু বৈশিষ্ট্য রয়েছে, যার কারনে খুব অল্পদিনের মধ্যেই লারাভেল জনপ্রিয়তার শীর্ষে চলে এসেছে। জনপ্রিয় ডেভেলপার ম্যাগাজিন, সাইটপয়েন্ট এর জরিপে ২০১৫ সালের সেরা ফ্রেমওয়ার্ক নির্বাচিত হয়েছে লারাভেল।

সেরা ফ্রেমওয়ার্ক লারাভেল
সেরা ফ্রেমওয়ার্ক লারাভেল

চলুন একনজরে চোখ বুলিয়ে নেই লারাভেলের কিছু উল্লেখযোগ্য বৈশিষ্ট্য –

– লারাভেল মডার্ন পিএইচপির ফিচারগুলো ব্যবহার করে তৈরি করা হয়েছে। লারাভেল তৈরি করা হয়েছে কম্পোজার নামক ডিপেন্ডেন্সি ম্যানেজারের উপর ভিত্তি করে। পিএইচপি কমিউনিটিতে উল্লেখযোগ্য প্যাকেজগুলো যেমন- কার্বন, সিম্ফোনী এইচটিটিপি ফাউন্ডেশন, মনোলগ, ফ্লাইসিস্টেম, সুইফটমেইলার ইত্যাদি ব্যবহার করে লারাভেল তৈরি করা হয়েছে।
– লারাভেলে অত্যন্ত শক্তিশালী একটা কমান্ড লাইন টুল আছে যার নাম আর্টিসান। এর মাধ্যমে কোড জেনারেট, এনভায়রনমেন্ট পরিবর্তন, টেস্টিং, ডেপ্লয়মেন্টসহ বহু কাজ কমান্ড লাইন থেকেই করে ফেলা যায়।
– ডেটাবেজ স্কিমা তৈরি, পরিবর্তন, এবং ডেটাবেজ প্রিপপুলেটেড ডেটা দেয়ার জন্য রয়েছে চমৎকার মাইগ্রেশন এবং সিডিং এপিআই।
– লারাভেলের রয়েছে অত্যন্ত সহজ এবং সুন্দর সিনট্যাক্স যা সহজেই মনে রাখা যায়।
– লারাভেল রয়েছে অত্যন্ত চমৎকার রাউটিং লাইব্রেরি, যা সিম্ফোনির রাউটিং কম্পোনেন্টের উপর ভিত্তি করে তৈরি করা। এটি রেস্টফুল রাউটিং সাপোর্ট করে।
– লারাভেলে রয়েছে অত্যন্ত চমৎকার কোয়েরি বিল্ডার এবং অবজেক্ট রিলেশনার ম্যাপার(ORM) লাইব্রেরি। এই ওআরএম ইলোকোয়েন্ট নামে পরিচিত। এটি একটিভ রেকর্ডস প্যাটার্ন অনুসরণ করে তৈরি করা হয়েছে। এটি বাই-ডিফল্ট মাইসিক্যুয়েল, সিক্যুয়ালাইট, পোস্টগ্রেস এবং মাইক্রোসফটের সিক্যুয়েল সার্ভার সাপোর্ট করে। এছাড়া কম্পোজার প্যাকেজের মাধ্যমে আপনি অন্যান্য স্কিমালেস নোসিক্যুয়াল ডেটাবেজ যেমন মংগোডিবিও ব্যবহার করতে পারবেন।
– লারাভেলে রয়েছে খুবই চমৎকার কিউ সিস্টেম। এর মাধ্যমে আপনি আপনার যে কোন প্রসেসকে ব্যাকগ্রাউন্ডে পাঠিয়ে ইউজার ইন্টারঅ্যাকশন বাড়িয়ে আপনার অ্যাপ্লিকেশনকে আরো বেশি কার্যকর করতে পারবেন।
– লারাভেলে আপনি খুব সহজেই ইমেইল পাঠাতে পারবেন। এটি ইমেইল পাঠানোর জন্য জনপ্রিয় সুইফটমেইলার লাইব্রেরি ব্যবহার করে।
– রেস্টফুল এপিআই তৈরির জন্য লারাভেল একদম পারফেক্ট। এটি যে কোন ডেটাবেজ কোয়েরি, পিএইচপি এরে বা অবজেক্ট অটোমেটিক জেসনে রিটার্ন করতে পারে। সিঙ্গেল পেজ অ্যাপ্লিকেশন তৈরির জন্য লারাভেল হবে বেস্ট চয়েস।
– লারাভেলে রয়েছে অত্যন্ত চমৎকার টেমপ্লেটিং লাইব্রেরি যেটার নাম ব্লেড। এটির চমৎকার এক্সপ্রেসিভ সিনট্যাক্স আপনার এইচটিএমএল কোডকে সুন্দর এবং রিডেবল করবে।
– লারাভেলের রয়েছে ফ্রন্টএন্ড রিসোর্স ম্যানেজ করার জন্য ইলিক্সির নামে চমৎকার একটি ইউটিলিটি টুল। এর মাধ্যমে আপনি আপনার সিএসএস, জাভাস্ক্রিপ্ট ফাইলগুলোকে আরো সুন্দরভাবে ম্যানেজ করতে পারবেন।
– লারাভেলের আছে খুবই সুন্দর এবং বিশাল একটি কমিউনিটি। আপনি বিভিন্ন টিউটোরিয়াল, ভিডিও পাবেন এর উপর। এছাড়া কোন সমস্যায় পড়লে আপনি গুগলে সার্চ করলেই সমাধান পেয়ে যাবেন।
– লারাভেলের চাকুরির বাজারে খুব কদর আছে। আপনি লারাভেল শিখলে চাকুরি পেতে পারবেন খুব সহজেই।

তাহলে আর দেরি কেন? এক্ষুনি শুরু করে দিন লারাভেল শেখা।

লেখক : নুরুজ্জামান মিলন, লারাভেল পিএচইপি ফ্রেমওয়ার্ক বইটির লেখক।

ওয়েব ডেভেলাপমেন্ট-এ ক্যারিয়ার

ওয়েব ডেভেলাপমেন্ট শব্দটা শুনে অনেকেই নাক সিঁটকায়, ‘ও, ওয়েবসাইট বানানো? এটা কোনো কাজ হলো?’ তো এরকম ভুল ধারণা থাকাটা দোষের কিছু না। তাই আজকে ওয়েব ডেভেলাপমেন্টের ক্যারিয়ার নিয়ে কিছু আলোচনা করবো।

একটিমাত্র পেইজ দিয়েও একটি ওয়েবসাইট তৈরি করা যায়, আবার ওয়েবসাইটটি ফেসবুকের মতো বিশাল হতে পারে। তাই কাজের পরিধি নির্ভর করবে ওয়েবসাইটের পরিধির ওপর। এখন কোনো ওয়েব সাইট বা ওয়েব অ্যাপ্লিকেশন তৈরির প্রথম কাজ হচ্ছে ফিচারগুলো নির্দিষ্ট করা, মানে সেখানে কী কী ফিচার থাকবে তার একটি তালিকা তৈরি করা। তখন ইউএক্স বা ইউজার এক্সপেরিয়েন্সের বিষয়গুলোও খেয়াল রাখতে হবে। কারণ কেবল ফিচার থাকলেই হবে না, সেই ফিচার ব্যবহারকারীরা কিভাবে ব্যবহার করবে, সেটাও নির্ধারণ করতে হবে। ফিচারগুলো নির্দিষ্ট করা হয়ে গেলে প্রথম কাজ হচ্ছে ওয়েবসাইটটি ডিজাইন করা। মানে ওয়েবসাইটি দেখতে কেমন হবে। এই ডিজাইনের কাজটি করেন ওয়েব ডিজাইনার বা গ্রাফিক্স ডিজাইনার। সৃজনশীলতা ছাড়াও একজন ডিজাইনারের আধুনিক ওয়েবসাইটের ডিজাইন, রং, ফন্ট ইত্যাদি বিষয়ে সম্যক ধারণা থাকতে হবে। ওয়েব ডিজাইনাররা সাধারণত ফটোশপ এবং ইলাস্ট্রেটর সফটওয়্যার ব্যবহার করেন, তাই এ দুটি সফটওয়্যার ব্যবহারে দক্ষতা থাকা প্রয়োজন।

ডিজাইনের পরবর্তি কাজ হচ্ছে মার্ক-আপ। মানে ডিজাইনার যেই ডিজাইনটি করেছেন, সেটি থেকে এইচটিএমএল (HTML → Hyper Text Markup Language) ফাইল তৈরি করা। তবে শুধু HTML এর কাজই যথেষ্ট নয়। সাথে দরকার CSS (Cascading Style Sheet)। সিএসএস ব্যবহার করে এইচটিএমএল ফাইলে স্টাইল আনা যায় যাতে ওয়েবসাইট দেখতে হুবুহু তার ডিজাইনের মতো হয়। এই কাজগুলো করেন মার্ক-আপ ইঞ্জিনিয়ার।

বড় কোম্পানীগুলোতে মার্ক-আপ ইঞ্জিনিয়ার এর আলাদা পোস্ট থাকে, তবে অনেক জায়গাতেই সেই কাজটা করতে হয় ফ্রন্ট এন্ড (front end) ইঞ্জিনিয়ারের। তবে ফ্রন্ট-এন্ড ইঞ্জিনিয়ারের মূল কাজ হচ্ছে জাভাস্ক্রিপ্টে। জাভাস্ক্রিপ্ট একটি প্রোগ্রামিং ভাষা যেটি ব্যবহার করে প্রোগ্রাম লিখলে সেটি ব্রাউজার থেকে চলে। ইন্টারএকটিভ ওয়েবসাইগুলোর জন্য জাভাস্ক্রিপ্ট অপরিহার্য। এই ভাষাটি জানতে হয় ফ্রন্ট এন্ড ইঞ্জিনিয়ারের। সাথে কয়েকটি ফ্রেমওয়ার্কও। যেমন জেকুয়েরি (jQuery), ইএক্সটিজেএস (ext-js), প্রটোটাইপ (prototype) ইত্যাদি। এসব জানার পাশাপাশি ওয়েব টেকনোলজির নানা বিষয় সম্পর্কেও স্বচ্ছ ধারণা থাকা দরকার। যেমন এক্সএমএল (XML), জেসন (JSON), এজাক্স (Ajax), ক্লায়েন্ট-সার্ভার ইন্টারএকশন ইত্যাদি।

ওয়েবসাইটে ব্যবহারকারির দেওয়া ইনপুটের উপর ভিত্তি করে বিভিন্ন কাজ হয়। যেমন ফেসবুকে কেউ একটা স্ট্যাটাস দিলো, সেটি তার ফেসবুক বন্ধুতালিকার সবাই দেখতে পাবে, আর পাবলিক হলে ফলোয়ারদের নিউজফিডেও চলে যাবে। এই কাজটি করার জন্য সার্ভারে কিছু কোড লেখা লাগে। আবার ধরা যাক, কেউ অনলাইনে কেনাকাটা করছে, সেখানেও সার্ভারে বেশ কিছু কোড রান করে। সার্ভারে এই প্রোগ্রামগুলো যিনি তৈরি করেন, তাকে বলা হয় ব্যাক-এন্ড ইঞ্জিনিয়ার (back-end engineer)। ব্যাক-এন্ডের কাজের জন্য জনপ্রিয় প্রোগ্রামিং ভাষা হচ্ছে পিএইচপি (PHP), পাইথন (Python), রুবি (Ruby), জাভা (Java) ইত্যাদি। একজন ভালো ব্যাক-এন্ড ইঞ্জিনিয়ারের কেবল প্রোগ্রামিং করতে পারাটাই যথেষ্ট নয়, সেই সাথে ওয়েব নিরাপত্তা, ডাটাবেজ, ওয়েব আর্কিটেকচার এরকম নানান বিষয়ে গভীর জ্ঞান থাকা দরকার। আবার ওয়েবসাইটকে স্কেলেবল (scalable) করাটাও তার কাজের মধ্যে পড়ে। একটি উদাহরণ দিই। প্রতি বছর বিভিন্ন পাবলিক পরীক্ষার ফলাফল যখন প্রকাশ হয়, ওয়েবসাইটে ঢুকলে মনে হয় সাইট হ্যাং হয়ে আছে – কোনো কাজ করছে না। তার মূল কারণ হচ্ছে এসব ওয়েবসাইট যেভাবে তৈরি করা হয়েছে, সেগুলো স্কেলেবল নয়। হয়ত ১০০ ব্যবহারকারির জন্য ওয়েবসাইট কাজ করছে, কিন্তু যখনই দশ হাজার কিংবা এক লক্ষ মানুষ সেই ওয়েবসাইটে হিট করছে, তখন ওয়েবসাইট আর কাজ করছে না, কারণ এত লোড সে সামলাতে পারছে না। একজন ভালো ব্যাক-এন্ড ইঞ্জিনিয়ারের পক্ষে এই সমস্যাটির সমাধান সম্ভব।

যেসমস্ত ওয়েবসাইট খুব বেশি ডাটা নির্ভর, সেখানে ডাটাবেজ ডিজাইন ওয়েবসাইটের পারফরমেন্সের উপর বেশ প্রভাব ফেলে। অনেকসময় ব্যাক-এন্ড ইঞ্জিনিয়ার ডাটাবেজের কাজ করলেও কিছু কিছু ক্ষেত্রে প্রয়োজন হয় একজন দক্ষ ডাটাবেজ আর্কিটেক্ট-এর। তিনি ডাটাবেজ ডিজাইন এবং অপটিমাইজেশনের কাজ করে থাকেন।

একটা ওয়েব সাইট বা ওয়েব অ্যাপ্লিকেশন তৈরির শেষ ধাপ হচ্ছে টেস্টিং। টেস্টিংয়ের কাজটি করেন ওয়েবসাইট টেস্ট ইঞ্জিনিয়ার কিংবা কোয়ালিটি অ্যাসুরেন্সের লোকজন। সাধারণ ওয়েবসাইটে যেমন ওয়েবসাইট ঠিকমতো কাজ করছে কি না সেটি টেস্ট করলেই চলে, কিছু কিছু ওয়েবসাইটে আবার লোড টেস্ট করতে হয়, যে অনেক বেশি ব্যবহারকারি একসাথে আসলে ওয়েবসাইটের কি অবস্থা হয়। আর নিরাপত্তার ব্যাপারটিও টেস্ট করাটা খুবই গুরুত্বপূর্ণ। তাই ওয়েবসাইটের প্রকার ভেদে বিভিন্ন লেভেলের দক্ষতার লোকজন দরকার হয়, যারা ওয়েবসাইটি টেস্ট করেন।

সার্ভারে বিভিন্ন সফটওয়্যার ইনস্টল করা, সেগুলো রান করা, মনিটর করা, সার্ভারের সংখ্যা বাড়ানো-কমানো, ফায়ারওয়াল বসানো ইত্যাদি কাজের জন্য দরকার একজন সিস্টেম এডমিনিসস্ট্রের। যিনি বিভিন্ন টুল ব্যবহার করে সেই কাজগুলো করেন। সিস্টেম এডমিনিসস্ট্রেটর-এর নখদর্পনে থাকতে হয় সার্ভারের অপারেটিং সিস্টেমের নানান বিষয়।

তাহলে দেখা যাচ্ছে একটি বড় ওয়েবসাইট বা ওয়েব অ্যাপ্লিকেশন তৈরিতে অনেক আয়োজন আর সেই কাজগুলো করার জন্য প্রয়োজন হরেক রকম দক্ষতাসম্পন্ন মানুষের। আপনি যদি ওয়েব ডেভেলাপমেন্টে আগ্রহী হন তবে আপনার দক্ষতা, লেখপড়া ও আগ্রহের ভিত্তিতে নির্বাচন করুন সঠিক ক্যারিয়ার।

পুনশ্চ : ওয়েবের উপর ধারণা আরো পাকাপোক্ত করতে এই ফ্রি অনলাইন কোর্সটি করে ফেলুন : http://dimikcomputing.com/course/web-concepts/। কোর্সটি সম্পূর্ণ বাংলায়।

জাভা দিয়ে ছোট্ট ওয়েব ক্রলার

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করে সহজ একটি ওয়েব ক্রলার (বা স্পাইডার বা স্ক্রেপার)-এর কোড শেয়ার করছি। কোডটি আমি অনেক আগে একটি প্রজেক্ট করতে গিয়ে লিখেছিলাম। এটি সম্পূর্ণ ওয়েব ক্রলার নয়, কেবল একটি নমুনা (বা উদাহরণ) মাত্র।


কাজের ধাপ:

১) ব্যবহারকারীর কাছ থেকে ইনপুট হিসেবে ওয়েব সাইটের এড্রেস (ইউআরএল) নিতে হবে।

২) ওই ইউআরএল-এর এইচটিএমএল সোর্স কোড পড়তে হবে বা বের করতে হবে (getUrlContent(url))।

৩) এইচটিএমএল সোর্স কোড থেকে সব হাইপার-লিঙ্কগুলো বের করতে হবে (getHyperlinks(content))।

৪) প্রতিটি ইউআরএল-এর জন্য এইচটিএমএল সোর্স কোড বের করতে হবে এবং সেই সাথে এইচটিটিপি রেসপন্স কোডও বের করতে হবে (getHTTPResponseCode(url))।

 

সম্পূর্ণ সোর্স কোড নিচে দেওয়া হলো :

 import java.io.BufferedReader;    
 import java.io.IOException;    
 import java.io.InputStreamReader;    
 import java.io.FileWriter;    
 import java.io.BufferedWriter;    
 import java.net.HttpURLConnection;    
 import java.net.URL;    
 import java.net.SocketTimeoutException;    
 import java.net.UnknownHostException;    
 import java.util.ArrayList;    
 import java.util.regex.Matcher;    
 import java.util.regex.Pattern;    
 public class Checker {    
     public static void main(String args[]) throws Exception    
     {    
         String url = null;    
         if (args.length > 0) {    
             url = args[0];    
             System.out.println(url);    
         }    
         else {    
             System.out.println("Please enter the URL as a command line parameter.");    
             return;    
         }    
         String content = getUrlContent(url);    
         ArrayList<String> links = getHyperlinks(content);    
         FileWriter fstream = new FileWriter("out.txt");    
         BufferedWriter out = new BufferedWriter(fstream);    
         int status;    
         for (int i = 0; i < links.size(); i++) {    
             url = (String) links.get(i);    
             System.out.println(url);    
             status = getHTTPResponseCode(url);    
             if (status != 200) {    
                 if (status > 0) {    
                     out.write(url + ", HTTP Response Code: " + status + "n");    
                 }    
                 else {    
                     out.write(url + ", Unknown Errorn");    
                 }    
             }                
         }    
         out.close();    
     }    
     private static ArrayList<String> getHyperlinks(String html)    
     {    
         ArrayList<String> links = new ArrayList<String>();    
         Pattern p = Pattern.compile("<a [^<>]*?href="(http.*?)"");    
         Matcher m = p.matcher(html);    
         while(m.find()) {    
             links.add(m.group(1));    
         }    
         p = Pattern.compile("<a [^<>]*?href='(http.*?)'");    
         m = p.matcher(html);    
         while(m.find()) {    
             links.add(m.group(1));    
         }    
         return links;    
     }    
     private static String getUrlContent(String targetUrl) throws Exception    
     {    
         HttpURLConnection connection = null;    
         BufferedReader br = null;    
         StringBuilder sb = null;    
         String line = null;    
         String content = null;    
         URL target = null;    
         try {    
             target = new URL(targetUrl);    
             connection = (HttpURLConnection)target.openConnection();    
             connection.setRequestMethod("GET");    
             connection.setReadTimeout(30 * 1000); // timeout 30 seconds    
             connection.connect();    
             br = new BufferedReader(new InputStreamReader(connection.getInputStream()));    
             sb = new StringBuilder();    
             while ((line = br.readLine()) != null) {    
                 sb.append(line);    
             }    
             content = sb.toString();    
         } catch (SocketTimeoutException e) {    
             System.out.println("Timed Out!");                
         } catch (UnknownHostException e) {    
             System.out.println("Unknown Host");    
         } catch (Exception e) {    
             System.out.println("Unknown Error");    
         }    
         finally {    
             connection.disconnect();    
             br = null;    
             sb = null;    
             connection = null;    
         }    
         return content;    
     }    
     private static int getHTTPResponseCode(String targetUrl) throws Exception    
     {    
         HttpURLConnection connection = null;    
         int response;    
         URL target = null;    
         try {    
             target = new URL(targetUrl);    
             connection = (HttpURLConnection)target.openConnection();    
             connection.setRequestMethod("GET");    
             connection.setReadTimeout(10 * 1000); // timeout 10 seconds    
             connection.connect();    
             response = ((HttpURLConnection) connection).getResponseCode();    
         } catch (SocketTimeoutException e) {    
             response = -100;    
         } catch (UnknownHostException e) {    
             response = -101;    
         }catch (Exception e) {    
             response = -102;    
         }    
         finally {    
             connection.disconnect();    
             connection = null;    
         }    
         return response;    
     }    
 }