ত্রিভুজ গণনা – প্রোগ্রামিং ইন্টারভিউ সমস্যা ৪

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

সমাধানঃ সমস্যাটি নিয়ে চিন্তা করার শুরুতেই একটি বিষয় মাথায় চলে আসবে, “ত্রিভুজের যেকোনো দুই বাহুর সমষ্টি তৃতীয় বাহু অপেক্ষা বৃহত্তর।” এই বিষয়টি কাজে লাগিয়ে আমরা সমস্যাটির সমাধান করতে পারি। আমাদের মূল কোড হবে নিচের মতো –

count = 0
for i in range(0, n-2):
    for j in range(i+1, n-1):
        for k in range(j+1, n):
            if A[i] + A[j] > A[k]:
                count += 1

ইন্টারভিউতে অবশ্য একটি ফাংশন তৈরি করে তার ভেতরে মূল কোড লেখা উচিত, আমি সেটি আর দেখালাম না। এখন প্রশ্ন হচ্ছে, এই সমাধানের কমপ্লেক্সিটি কত? O(n^3)। এখন ইন্টারভিউয়ার জানতে চাইবেন, এর চেয়ে ভালোভাবে সমাধান করা সম্ভব কী না, এবং সম্ভব হলে চেষ্টা করতে।

ধরা যাক, মূল অ্যারেতে দেওয়া আছে 1, 1, 2, 3, 4। এখানে প্রতিবার তিনটি করে সংখ্যা নিলে আমরা পাই –

1, 1, 2
1, 1, 3
1, 1, 4
1, 2, 3
1, 2, 4
1, 3, 4
1, 2, 3
1, 2, 4
1, 3, 4
2, 3, 4

এগুলোর মধ্যে, কেবল 2, 3, 4 যখন একটি ত্রিভুজের বাহুর দৈর্ঘ্য হবে, তখন একটি ত্রিভুজ তৈরি করা যাবে। কারণ, 2 + 3  > 4। বাকীগুলোর জন্য a + b > c সত্য নয় (এখানে a, b, c হচ্ছে যথাক্রমে ত্রিভুজের প্রথম, দ্বিতীয় ও তৃতীয় বাহু)। আর সংখ্যাগুলো যেহেতু ছোট থেকে বড় ক্রমে সাজানো, তাই a + b > c পরীক্ষা করলেই হবে, b + c > a, c + a > b এগুলো পরীক্ষা করার দরকার নেই।

এখন প্রশ্ন হচ্ছে, আমাদেরকে যেই অ্যারে দেওয়া আছে, সেটিতো ছোট থেকে বড় ক্রমে সাজানো নেই। তাই প্রথমে আমরা সেটি সর্ট করে নেবো। এই কাজটি করার কমপ্লেক্সিটি হচ্ছে O(n log n), যা O(n^3)-এর চেয়ে অনেক ছোটো। তাহলে প্রথমে আমরা অ্যারেটি সর্ট করে নেবো।

ধরা যাক, অ্যারে A-তে আছে দশটি সংখ্যা – 10, 11, 12, 13, 14, 15, 16, 20, 21, 22। এখন, i-এর মান 0, j-এর মান 1 হলে, k-এর মান 2 থেকে 7 পর্যন্ত প্রতিটির জন্যই A[i] + A[j] > A[k] শর্তটি সত্য হবে, অর্থাৎ A[i], A[j], A[k] ত্রিভুজের তিনটি বাহু হিসেবে ব্যবহার করা যাবে। আর মোট ত্রিভুজ কয়টি হবে? 7 – 1 বা 6টি।

এখন, i-এর মান 0, j-এর মান 2 এর জন্য কিন্তু আর k-এর মান 2 থেকে পরীক্ষা করার দরকার নেই, কারণ k-এর মান 7 পর্যন্ত অবশ্যই A[i] + A[j] > A[k] সত্য হবে, কারণ A[0] + A[1] এর মান অবশ্যই A[0] + A[2] এর মানের  চেয়ে ছোট বা সমান। তাই আমরা k-এর মান আগের চেয়ে এক এক করে বাড়িয়ে পরীক্ষা করবো।

তাহলে, i-এর যেকোনো মানের জন্য, j-এর মান i+1 এবং k-এর মান i+2 থেকে আমরা লুপ শুরু করবো। আর j-এর মান যখন বাড়বে, তখন কিন্তু আবার k-এর মান i+2 থেকে শুরু করবো না, বরং আগে k-এর মান যা ছিল, সেখান থেকেই শুরু হবে।

count = 0
for i in range(n - 2):
    k = i + 2
    for j in range(i + 1, n - 1):
        while k < n and A[i] + A[j] > A[k]:
            k += 1
        count = count + k - j - 1

ওপরের কোড-এর কমপ্লেক্সিটি কত? যারা একটু কম চিন্তা করবে, তারা হুট করে বলে দিবে O(n^3), কারণ তিনটি নেস্টেড লুপ আছে। কিন্তু একটু ভালোভাবে লক্ষ করলে দেখা যাবে যে, j-এর লুপের জন্য ভেতরের লুপটি আর নতুন করে শুরু হচ্ছে না, k-এর আগের মান থেকেই শুরু হচ্ছে। না বুঝলে খাতা কলম নিয়ে বসতে হবে। তাই সবচেয়ে বাইরের লুপ (i-এর লুপ)-এর জন্য ভেতরে j ও k-এর লুপ প্রতিটি সর্বোচ্চ n সংখ্যকবার চলবে (মোট, n + n = 2n)। তাই কমপ্লেক্সিটি হচ্ছে, n * 2n, বা 2 * n^2, বা, O(n^2).

কেউ চাইলে নিচের যেকোনো একটি সমস্যা সমাধানের চেষ্টা করতে পারে

1) https://leetcode.com/problems/valid-triangle-number/

2) https://www.interviewbit.com/problems/counting-triangles

স্ট্যাক দিয়ে কিউ তৈরি – প্রোগ্রামিং ইন্টারভিউ সমস্যা ৩

সমস্যাঃ স্ট্যাক (Stack) ব্যবহার করে কিউ (Queue) তৈরি করতে হবে, অর্থাৎ কিউ এর এনকিউ (enqueue) ও ডিকিউ (dequeue) ফাংশন তৈরি করতে হবে।

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

নোটঃ স্ট্যাক ও কিউ নিয়ে আমি বিস্তারিত আলোচনা করেছি, কম্পিউটার প্রোগ্রামিং ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি এবং পাইথন দিয়ে প্রোগ্রামিং শেখা ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি বইতে। এছাড়া ইউটিউবেও এ বিষয়ে আলোচনা  করেছি ডেটা স্ট্রাকচার ও অ্যালগরিদম প্লেলিস্টে

ধরা যাক, কিউতে প্রথমে আমি পাঁচটি সংখ্যা রাখতে চাই, অর্থাৎ enqueue অপারেশন হবে পাঁচবার এবং সংখ্যাগুলো হচ্ছে – 1, 2, 3, 4, 5. আমি এগুলো প্রথম স্ট্যাকে পুশ (push) করব।

এখন আমি চাই, কিউ থেকে প্রথম তিনটি সংখ্যা সরিয়ে ফেলতে, অর্থাৎ তিনবার dequeue অপারেশন হবে। তাহলে কিউ থেকে যথাক্রমে 1, 2, 3 – এই তিনটি সংখ্যা চলে যাবে। কিন্তু স্ট্যাক থেকে তো কেবল ওপরের সংখ্যাটি সরানো যায়। তাহলে, আমি প্রথম স্ট্যাকের সবগুলো সংখ্যা দ্বিতীয় স্ট্যাকে নিয়ে আসব। তখন স্ট্যাকগুলোর অবস্থা হবে নিচের ছবির মতো –

এখন আমি দ্বিতীয় স্ট্যাকে তিনবার পপ (pop) অপারেশন চালালে 1, 2, 3 স্ট্যাক থেকে চলে যাবে। তখন স্ট্যাকদুটির অবস্থা হবে নিচের ছবির মতো –

এখন আমি কিউতে 6 ও 7 ক্রমানুসারে রাখতে চাই। আমি সেগুলো প্রথম স্ট্যাকে পুশ করবো।

এখন কিউ-এর অবস্থা হচ্ছে এমন: 4, 5, 6, 7. আমি যদি কিউ থেকে তিনটি সংখ্যা সরিয়ে নিই (অর্থাৎ তিনবার ডিকিউ করি), সেগুলো হবে, যথাক্রমে 4, 5, 6। ডিকিউ করার জন্য আমি প্রথমে দেখবো যে দ্বিতীয় স্ট্যাকে কিছু আছে কী না। যদি থাকে, সেই স্ট্যাক থেকে পপ করবো। আর যদি stack2 খালি থাকে, তাহলে Stack1-এর সব কিছু Stack2-তে নিয়ে আসবো (তখন দ্বিতীয় স্ট্যাকে সেগুলো প্রথম স্ট্যাকের বিপরীত ক্রমে থাকবে)। তারপরে দ্বিতীয় স্ট্যাক থেকে পপ করবো।

আশা করি, সমাধানটি নিজের পছন্দমতো প্রোগ্রামিং ভাষায় ইমপ্লিমেন্ট করতে সমস্যা হবে না। সমাধান সঠিক হলো কী না, তা যাচাই করার জন্য নিচের যেকোনো একটি লিঙ্কে গিয়ে সমাধান জমা দিলেই হবে –

বাইনারি সার্চ ট্রি – প্রোগ্রামিং ইন্টারভিউ সমস্যা ২

সমস্যাঃ একটি ফাংশন তৈরি করতে হবে, যেখানে একটি বাইনারি ট্রি ইনপুট দেওয়া হলে সেটি বাইনারি সার্চ ট্রি (BST) কী না, তা বের করতে হবে।

সমাধানঃ কোনো বাইনারি ট্রি-কে বাইনারি সার্চ ট্রি হতে হলে ওই ট্রি-এর যেকোনো নোডের বামদিকের চাইল্ড ও নাতি-পুতি নোডগুলো ওই নোডের চেয়ে ছোট এবং ডানদিকের চাইল্ড ও নাতি-পুতি নোডগুলো ওই নোডের চেয়ে বড় হতে হবে। যেমন নিচের ট্রি-টি একটি বাইনারি সার্চ ট্রি –

             6
          /     \
         3       12
       /   \    /   \
      1     4  9     13

কিন্তু নিচের বাইনারি ট্রি-টি বাইনারি সার্চ ট্রি নয় (কেন?)

             6
          /     \
         3       12
       /   \    /   \
      1     7  9     13

নোটঃ বাইনারি সার্চ ট্রি নিয়ে আমি বিস্তারিত আলোচনা করেছি, কম্পিউটার প্রোগ্রামিং ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি এবং পাইথন দিয়ে প্রোগ্রামিং শেখা ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি বইতে।

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

class node:
  def __init__(self, data):
      self.data = data
      self.left = None
      self.right = None


def find_max(root):
    max_v = root.data
    if root.left:
        left_max = find_max(root.left)
        if left_max > max_v:
            max_v = left_max
    if root.right:
        right_max = find_max(root.right)
        if right_max > max_v:
            max_v = right_max
    return max_v


def check_binary_search_tree(root):
    if root is None:
        return True
        
    # find the largest number on the left sub-tree and check if it's smaller/equal to the root
    if root.left:
        max_value = find_max(root.left)
        if max_value >= root.data:
            return False
    
    # find the smallest number on the right sub-tree and check if it's larger than the root
    if root.right:
        min_value = find_min(root.right)
        if min_value <= root.data:
            return False
    
    # now do the same for the sub-trees
    valid_left = check_binary_search_tree(root.left)
    valid_right = check_binary_search_tree(root.right)
        
    return valid_left and valid_right

ওপরে find_min ফাংশনটি আমি ইমপ্লিমেন্ট করলাম না, find_max কীভাবে কাজ করে বুঝলে find_min তৈরি করতে সমস্যা হবে না। এখন প্রশ্ন হচ্ছে, ওপরের ফাংশনটির কমপ্লেক্সিটি কত? ফাংশনটির টাইম কমপ্লেক্সিটি হচ্ছে O(n^2). কীভাবে সেটি বুঝতে না পারলে একটি বাইনারি ট্রি, যেটি কী না বাইনারি সার্চ ট্রি, সেটি নিয়ে অ্যানালাইসিস করলে বুঝতে পারা যাবে (এই লেখার প্রথম উদাহরণের ট্রি-এর মতো)।

আরো ভালো সমাধানঃ আমরা O(n) টাইম কমপ্লেক্সিটিতে সমস্যাটির সমাধান করতে পারি। এজন্য আমরা ট্রি-টি ইনঅর্ডার ট্রাভার্সাল করে নোডগুলো একটি লিস্টে রেখে দেব। তারপরে দেখব যে, ওই লিস্টের সবগুলো উপাদান ছোট থেকে বড় ক্রমে সর্ট করা আছে কী না, যদি না থাকে তাহলে এটি বাইনারি সার্চ ট্রি নয়, অন্যথা এটি একটি বাইনারি সার্চ ট্রি।

def check_binary_search_tree_(root):
    nodes = []
    
    def inorder(root):
        if root is None:
            return
        inorder(root.left)    
        nodes.append(root.data)
        inorder(root.right)
            
    inorder(root)
    
    for i in range(len(nodes)-1):
        if nodes[i] >= nodes[i+1]:
            return False
        
    return True

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

ওপরের লিঙ্কগুলোতে পাইথন ছাড়াও অন্য ভাষা ব্যবহার করা যাবে।

def check_binary_search_tree(root):
    
    def inorder(root):
        nonlocal last_node
        
        if root is None: 
            return True
        
        left_valid = inorder(root.left)    
        if left_valid is False:
            return False
        
        if root.data <= last_node: 
            return False
        
        last_node = root.data
        
        return inorder(root.right)  
    
    last_node = -1 #assuming all nodes are non-negative
    return inorder(root)

লেখাটি যাদের কাজে আসতে পারে, তাদের সঙ্গে শেয়ার করার অনুরোধ রইলো। ধন্যবাদ।
 

pow(a, n) – প্রোগ্রামিং ইন্টারভিউ সমস্যা ১

সমস্যাঃ একটি ফাংশন তৈরি করতে হবে, যেখানে দুটি ইন্টিজার (a, n) ইনপুট দেওয়া থাকলে ফাংশনটি a^n রিটার্ন করবে। ফাংশনটির রানটাইম হতে হবে O(log n)।

সমাধানঃ আমাদেরকে যেটি করতে হবে, সেটি হচ্ছে pow() ফাংশনটি ইমপ্লিমেন্ট করতে হবে। কিন্তু এতে ঘাবড়াবার কিছু নেই। আমরা পাইথনে খুব সহজে এটি ইমপ্লিমেন্ট করতে পারি।

def pow(a, n):
   result = 1.0
   for _ in range(n):
      result = result * a
   return result

ওপরে যেই ফাংশনটি লিখলাম, সেটির কমপ্লেক্সিটি কত? টাইম কমপ্লেক্সিটি হচ্ছে O(n)। কিন্তু আমাদেরকে বলা হয়েছে O(log n) কমপ্লেক্সিটিতে ইমপ্লিমেন্ট করতে। যদি এটি বলা না থাকতো, তাহলে কিন্তু ওপরের কোড লিখে দিলেই হতো।
আমরা ডিভাইড এন্ড কনকোয়ার পদ্ধতিতে সমস্যাটির সমাধান করতে পারি। সেজন্য আমাদেরকে একটি বিষয় উপলব্ধি করতে হবে। a^n-কে আমরা লিখতে পারি, (a^n/2) * (a^n/2). যেমন, 5^4 হচ্ছে 625. কিন্তু আমরা 5^4-কে লিখতে পারি, (5^2) * (5^2)। এভাবে লিখে লাভ কী হলো? লাভ হচ্ছে, 5^2 এর মান আমাদের দুবার বের করতে হবে না, একবার বের করলেই হবে। কিংবা ধরা যাক, আমাদেরকে 2^32-এর মান বের করতে বলা হলো।

2^32 = (2^16) * (2^16)
2^16 = (2^8) * (2^8)
2^8 = (2^4) * (2^4)
2^4 = (2^2) * (2^2)
2^2 = (2^1) * (2^1)

এখন আমরা জানি, a^0 হচ্ছে 1 আর a^1 হচ্ছে a. তাই রিকার্শন ব্যবহার করে সমস্যাটির সমাধান বের করতে কিন্তু আমাদের তেমন বেগ পেতে হবে না। আর n যদি জোড় সংখ্যা না হয়ে বিজোড় সংখ্যা হতো, তখন আমাদের কী করতে হবে? তখন a^n-কে আমরা লিখতে পারি a^(n-1) * a. n যেহেতু বিজোড় সংখ্যা, n-1 অবশ্যই জোড় সংখ্যা। তাই আমরা আবার আগের মতো আগাতে পারি।

এখন আমি প্রোগ্রাম লিখে ফেলি –

def pow(a, n):
   if n == 0: return 1
   if n == 1: return a 

   if n % 2 == 1:
      return a * pow(a, n-1) 
   else:
      p = pow(a, n/2)
      return p * p

ওপরের pow() ফাংশনটির কমপ্লেক্সিটি হচ্ছে O(log n)। কেন সেটি আর এখানে বিস্তারিত ব্যাখ্যা করলাম না, তবে যারা বাইনারি সার্চের কমপ্লেক্সিটি বোঝে, তাদের এটি বুঝতে কোনো সমস্যা হবে না।

সমস্যাটির সমাধান কিন্তু পুরোপুরি হয় নি। কারণ n যদি ঋণাত্মক হয় তখন কিন্তু প্রোগ্রামটি কাজ করবে না। এটি ঠিকঠাক করার জন্য আমাদেরকে কী করতে হবে?

কেন মাল্টিথ্রেডিং শেখা উচিত

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

কেনো থ্রেড প্রোগ্রামিং সম্পর্কে ধারণা রাখা উচিৎ?

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

এই একাধিক প্রসসের বা সিপিইউয়ের সুবিধাটুকু আমরা তখনই নিতে পারি, যখন এগুলোকে একই সঙ্গে বিভিন্ন কাজে ব্যবহার করতে পারি। যদি সেই সুযোগটা নিতে না পারি, তাহলে আমাদের কম্পিউটারে যে অতিরিক্ত রিসোর্স রাখা আছে, তার অপচয়ই করা হবে বটে।

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

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

আমরা যারা জাভা প্রোগ্রামিং পারি, তারা সহজেই এই মাল্টি থ্রেড প্রোগ্রামিংয়ের সুবিধাটুকু নিতে পারি, যদি একটু কষ্ট করে এর মূলনীতি এবং কীভাবে ব্যবহার করতে হয় তা জেনে নেই।

লেখকঃ আ ন ম বজলুর রহমান, সফটওয়্যার প্রকৌশলী ও লেখক (জাভা প্রোগ্রামিং, জাভা থ্রেড প্রোগ্রামিং)।

জাভা থ্রেড প্রোগ্রামিং

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

নিজের লেখা বই হাতে বইমেলায় দ্বিমিক প্রকাশনীর স্টলে লেখক বজলুর রহমান।

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

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

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

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

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

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

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

 

 

 

শাহরিয়ার মনজুর – ইন্টারভিউ

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

ACM ICPC World Finals 2016 – Phuket, Thailand.

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

সুবিন : আপনি তো এবারেও এসিএম আইসিপিসি’র চূড়ান্ত পর্ব বিচারক হিসেবে যাচ্ছেন। এ নিয়ে আপনার আইসিপিসির চূড়ান্ত পর্বে কত বার যাওয়া হবে?
শাহরিয়ার মনজুর : বিচারক হলাম ত্রয়োদশতম বারের মতো কিন্তু যাচ্ছি এগারতম বার, প্রথম দুবার ভিসা পাইনি।

সুবিন : আইসিপিসির চূড়ান্ত পর্বের বিচারক হিসেবে নির্বাচনের প্রক্রিয়াটি কী?
শাহরিয়ার মনজুর : ডিরেক্টর অফ জাজিং কাছে প্রবলেম পাঠাতে হয় ইমেইলের মাধ্যমে। একটি কমিটি প্রবলেম সেটারের নাম না দেখে প্রবলেম বাছাই করে। যাদের প্রবলেম বাছাই করা হয় তাদের মধ্য থেকেই বিচারক নির্বাচন করা হয়। তবে একদম অপরিচিত কারো প্রবলেম নেয়া হয় না হয়ত। আমি যখন প্রথমবার প্রবলেম দেই তখন কিছু কারণে পরিচিত ছিলাম অনেকের কাছেই। যেমন : UVa Online Judge-এর সাথে জড়িত থাকা, ওয়ার্ল্ড ফাইনালস্ ওয়ার্মআপ আয়োজন করা, স্কিয়েনা-রেভিল্লা এর প্রোগ্রামিং চ্যালেঞ্জেস (Programming challenges) বইতে আমার নাম থাকা ইত্যাদি। তাই বলা যায়, আমি চূড়ান্ত পর্বের বিচারক হয়েছিলাম অনেকটা ভাগ্যের জোরেই।

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

সুবিন : এসিএম আইসিপিসি’র চূড়ান্ত পর্ব ছাড়া আর কোন কোন প্রতিযোগিতার জন্য আপনি প্রোগ্রামিং সমস্যা তৈরি করেন?
শাহরিয়ার মনজুর : ভবিষ্যতে কোথায় করব জানিনা কারণ বয়স হচ্ছে। কিন্তু এখন পর্যন্ত ঢাকা, ফুকেট (থাইল্যান্ড), কুয়ালালামপুর (মালয়েশিয়া), SWERC এবং কিছু চাইনিজ রিজিওনালের জন্য প্রোগ্রামিং সমস্যা তৈরি করেছি।

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

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

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

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

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

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

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

সুবিন : আপনি ছোটবেলায় কোন কোন স্কুল-কলেজে পড়েছেন?
শাহরিয়ার মনজুর : বনানী বিদ্যানিকেতন (কেজি), লিটল এঞ্জেলস স্কুল (৩-৫), ইঞ্জিনিয়ারিং ইউনিভার্সিটি স্কুল (৬-১০), ঢাকা কলেজ। আমার দেখা সবচেয়ে ভালো শিক্ষা প্রতিষ্ঠান ঢাকা কলেজ কারণ সেখানে মুক্ত চিন্তা করার অনেক সুযোগ।

সুবিন : আমাদের স্কুলের লেখাপড়া নিয়ে তো নিয়মিতই বিভিন্ন পরীক্ষা-নিরীক্ষা করা হয়। সিলেবাস, বই ইত্যাদি পরিবর্তন করা হয়। আপনার পর্যবেক্ষণে আমাদের স্কুলের শিক্ষাব্যবস্থায় কি মৌলিক কোনো পরিবর্তন প্রয়োজন বলে আপনি মনে করেন?
শাহরিয়ার মনজুর : খুব ধীরে হলেও সব দেশের শিক্ষার মান বাড়ে, আমরা কেন জানি উল্টা দিকে হাঁটলাম। নতুন যদি কিছু করতে না পারি, আগে যেমন ছিল সেখানে তো অন্তত ফেরত যেতে পারি? SSC , HSC -তে গ্রেডিং সিস্টেম যদি রাখতেই হয় তাহলে ৯০% এ A+ করা যেতে পারে এবং গ্রেড এর ধাপ আরো বাড়ানো উচিত। মনে রাখা দরকার যে শিক্ষা ব্যবস্থা কোনো সার্কাস না যে সবাইকে এসেই চমৎপ্রদ কোনো খেলা দেখাতে হবে।

সুবিন : আপনি প্রোগ্রামিং শেখা শুরু করলেন কবে এবং কিভাবে প্রোগ্রামিং-এর প্রতি আকৃষ্ট হয়েছিলেন?

শাহরিয়ার মনজুর : প্রোগ্রামিং শেখা শুরু করি বুড়ো বয়সে, অর্থাৎ আমার বয়স যখন ঊনিশ, তখন। হুজুগে পরে বুয়েটের কম্পিউটার সায়েন্স ও ইঞ্জিনিয়ারিং বিভাগে ভর্তি হই। শুরুতে প্রোগ্রামিং খুবই ভয় পেতাম। ১০,০০০+ লাইন এর একটি টার্ম অ্যাসাইনমেন্ট করে নিজেকে খুব ভালো প্রোগ্রামার ভাবা শুরু করি, ভাল্লাদলিদ (ইউভিএ) সাইট-এ প্রোগ্রামিং সমস্যা সমাধান করতে গিয়ে সেই ভুল ভাঙ্গে, এরপর ওইখানে বেশ কিছু সমস্যা সমাধান করে আবার নিজেকে ততক্ষণ ভালো প্রোগ্রামার ভাবা শুরু করি যতক্ষণ কিসমান এর সাথে আলাপ হয়নি। সার করা হলো : একমাত্র বোকারাই নিজেদের ভালো প্রোগ্রামার ভাবে।

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

সুবিন : আপনি তো অনেকদিন ধরেই প্রোগ্রামিং সমস্যা তৈরি ও কম্পিউটার বিজ্ঞানে শিক্ষকতার কাজ চালিয়ে যাচ্ছেন। ভবিষ্যতে কি অন্য ধরণের কোনো কাজ করার পরিকল্পনা আছে নাকি এ দুটি কাজই চালিয়ে যেতে চান?
শাহরিয়ার মনজুর : কোনো বাঁধাধরা পরিকল্পনা নেই, আমি পেশায়ে শিক্ষক, আর প্রোগ্রামিং সমস্যা তৈরি করা আমার প্যাশন। যে কবিতা আমি মাঝে মাঝে গুনগুন করি তা হলো:

“আজি হতে শত বর্ষ পরে ,
কে তুমি খাবি খাচ্ছ আমার প্রবলেম নিয়ে
আজি হতে শত বর্ষ পরে”

এই সাক্ষাৎকারটিসহ মোট এক ডজন সাক্ষাৎকার নিয়ে প্রকাশিত হয়েছে প্রোগ্রামিং ক্যারিয়ার গাইডলাইনঃ এক ডজন প্রোগ্রামারের কথা। বইটি পাওয়া যাচ্ছে রকমারি ডট কম-এ।

পিপলওয়্যার – বই রিভিউ

গ্র্যাবে আমি বর্তমানে যেই চাকরি করছি, সেখানে আমার কাজ হচ্ছে ইঞ্জিনিয়ারিং ম্যানেজমেন্ট (Engineering Management)। তো এই কাজটির সঙ্গে আমি একদমই অপরিচিত ছিলাম। তারপরও আমার স্বভাবসুলভ আলসেমি, মানুষের সঙ্গে কাজ করার অভিজ্ঞতা ও কমনসেন্স ব্যবহার করে কাজ চলে যাচ্ছে। আর এই ইঞ্জিনিয়ারিং ম্যানেজার হিসেবে কাজ শুরু করার পরে আমি বিভিন্ন রকম বইপত্র কেনা ও পড়া শুরু করি। সেসব বইয়ের অন্যতম হচ্ছে Peopleware: Productive Projects and Teams (3rd Edition) ।সম্প্রতি বইটি দ্বিতীয়বারের মতো পড়ে শেষ করলাম। বইটি প্রথমবার পড়েছিলাম ২০১৫ সালের শেষ দিকে।

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

বইতে মোট ছয়টি অংশে ৩৯টি অধ্যায় আছে। প্রথম অংশের শিরোনাম হচ্ছে Managing the Human Resource – মানবসম্পদ ব্যবস্থাপনা। সেখানে মূলত সফটওয়্যার প্রজেক্টগুলোর সাফল্য-ব্যর্থতা নিয়ে আলোচনা করা হয়েছে। কীভাবে সফটওয়্যার তৈরির প্রক্রিয়া হার্ডওয়্যার তৈরির প্রক্রিয়ার চেয়ে আলাদা, সেখানে সফটওয়্যারের গুনগত মান নিশ্চিতকরণ কতটা জরুরী, এই বিষয়ে গ্রাহকদের দৃষ্টিভঙ্গী কী, ম্যানেজারের করণীয় কী – সেসব বিষয় আলোচনায় এসেছে। নিম্নমানের সফটওয়্যার কেবল গ্রাহকদের জন্যই সমস্যার সৃষ্টি করে না, বরং সফটওয়্যার প্রকৌশলীদের হতাশার কারণও হয়ে দাঁড়ায়। সফটওয়্যার শিল্পের বিকাশে তাই গুনগত মান নিশ্চিতকরণ বেশ গুরুত্বপূর্ণ, আর সেই সাথে চ্যালেঞ্জিংও বটে। আর গুনগত মানের সঙ্গে যেই জিনিসটি অঙ্গাঅঙ্গি ভাবে জড়িত, তার নাম হচ্ছে প্রোডাক্টিভিটি (productivity) বা উৎপাদনশীলতা। একজন সফটওয়্যার প্রকৌশলীর উৎপাদনশীলতা পরিমাপ করার প্রক্রিয়াটি কিন্তু বেশ অস্পষ্ট ও দুরুহ। সেই বিষয়টিও চমৎকারভাবে আলোচনা করেছেন লেখকদ্বয়।

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

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

বইয়ের শেষ দুটি অংশের নাম হচ্ছে যথাক্রমে Fertile Soil এবং It’s Supposed to Be Fun to Work Here। উর্বর জমিতে যেমন সোনালী ফসল হেসে ওঠে, তেমনি সঠিক ও সুন্দর কাজের পরিবেশে প্রোগ্রামাররাও অনেক ভালোভাবে তাদের কাজ সম্পন্ন করতে পারে। আর এই পরিবেশ এমনি এমনি গড়ে ওঠে না, তার জন্য চাই সেই প্রতিষ্ঠানের সচেতন চেষ্টা। যদিও ইঞ্জিনিয়ারিং ম্যানেজার একটি প্রতিষ্ঠানের মাঝারি পর্যায়ের মানুষ, তারপরও তার হাতে অন্তত তার নিজের দলের জন্য কিছু করার ক্ষমতা থাকে, অন্য দলগুলোকেও প্রভাবিত করার সম্ভাবনা থাকে। তাই সেই চেষ্টা চালিয়ে যাওয়ার কিছু উপায় বাতলে দেওয়া হয়েছে এই অংশগুলোর বিভিন্ন অধ্যায়ে।

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

 

কেন সিএসই পড়বা না

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

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

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

প্রোগ্রামিং শিখতে পরিশ্রম করা লাগে – পড়া এবং প্র্যাকটিস করা। আর এই প্র্যাকটিস করার জন্য আবার মাথাও খাটাতে হয়, এটা কিন্তু দেখে দেখে টাইপ করা ধরণের প্র্যাকটিস না। মাঝে-মধ্যে অজানা সমস্যা চিন্তা করে সমাধান করতে হয়। প্রোগ্রামিং শেখার সময় একটা ছোট সমস্যার সমাধান করতে ৪-৫ ঘণ্টা লেগে যায়। তো আমরা কিন্তু ক্লাস ওয়ান থেকে শুরু করে এইচএসসি পর্যন্ত মোটামুটি মুখস্থ করেই পার করে এসেছি। বড়জোর কিছু অঙ্ক হয়তো বোঝার চেষ্টা করেছি। আমাদের কখনওই একটা প্রবলেম করার জন্য ৪-৫ ঘণ্টা সময় দেয়া লাগে নাই। আশা করি, বিষয়টা পরিষ্কার। এখন কথা হচ্ছে, সময় দেওয়া লাগলে দিবো, যত পরিশ্রম করার দরকার করবো, টিচারের সাহায্য নিবো। কথা কিন্তু এখানেই।

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

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

আর কম্পিউটার সায়েন্স কিন্তু অনেক বোঝার বিষয়। যাদের গণিতের সাধারণ বিষয়গুলো বুঝতেই সমস্যা হয়, তাদের আসলে এই দিকে না আসাই ভালো।

যারা আমার কথায় এখনও একমত হও নাই, তারা আমার লেখা প্রোগ্রামিং শেখার একটা বই আছে, (http://cpbook.subeen.com-এ গিয়ে ফ্রি-তে বইটা পড়া যায়)। সেই বইটা কিছুদিন পড়। যদি মনে হয়, এই জিনিস নিয়া আগামী চার বছর ব্যাপক খাটাখাটনি করতে পারবা এবং আগামী ২০-৩০ বছর এইরকম বিদঘুটে জিনিসকেই নিজের পেশা হিসেবে নিতে পারবা, তাহলে কম্পিউটার সায়েন্স পড়লেও পড়তে পারো।

এইচটিএমএল কিভাবে শিখব?

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

এইচটিএমএল জানার আগে ওয়েবসাইট সম্পর্কে একটু ধারণা থাকা প্রয়োজন। তাই প্রথম ভিডিওতে ওয়েব ডিজাইন সম্পর্কে আলোচনা করেছি।

দ্বিতীয়, তৃতীয় ও চতুর্থ ভিডিওতে এইচটিএমএল-এর বিভিন্ন জিনিস দেখানো হয়েছে।

আশা করি, ভিডিওগুলো অনেকের কাজে আসবে। কোনো মতামত থাকলে পোস্টের নিচে কমেন্টে জানানোর অনুরোধ রইল।