Career guideপ্রবলেম সলভিং - Problem Solving

সফটওয়্যার ডেভেলপমেন্ট বনাম কম্পিটিটিভ প্রোগ্রামিং

Software Development vs competitive programming/ which one to select?/ কনফিউশন কম্পিটিটিভ প্রোগ্রামিং না সফটওয়্যার ডেভেলপমেন্ট

কম্পিটিটিভ প্রোগ্রামিং (Competitive programming) নাম শুনার পর আমাদের মাথায় আসে Codeforces, Hackerank, Codechef ইত্যাদি সাইট গুলোতে প্রবলেম সলভ (Problem Solve) করা এবং কন্টেস্ট করা। অন্যদিকে সফটওয়্যার ডেভেলপমেন্ট বললে আমরা কল্পনা করি বিভিন্ন ধরনের মোবাইল অ্যাপ, ডেস্কটপ অ্যাপ, ওয়েব অ্যাপ্লিকেশান, অথবা কোনও একজন ডেভেলপার সফটওয়্যার রিলেটেড সমস্যার সমাধান করছেন।

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

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

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

যেকোনো একটা সিলেক্ট করা আমাদের মতো ছাত্রদের জন্য বিশাল কঠিন তো অবশ্যই, অভিজ্ঞ ডেভেলপারদের (যারা আরও ভালো পজিশন অর্জন করতে চান) কাছেও একটি সমস্যা।

মাইক্রোসফট সফটওয়্যার ইঞ্জিনিয়ার Satendra Verma এর মতে, Although it adds to your skills, a good software engineer requires a lot more than what competitive programming has to offer. Competitive programming is not a necessity for being a good software engineer. এটার বিপরীতও দেখা যায়। অনেক ইঞ্জিনিয়াররাই বলেন কম্পেটিটিভ প্রোগ্রামিং তাদের ভালো সফটওয়্যার ডেভেলপার হতে সহায়তা করেছে।

কম্পেটিটিভ প্রোগ্রামিং (Competitive Programming)

কম্পেটিটিভ প্রোগ্রামিং (Competitive programming) করার সবচেয়ে বড় সুবিধা হলো জব ইন্টারভিও গুলোতে উত্তর করা আপনার কাছে ডাল-ভাত হয়ে যাবে। একজন ভালো সফটওয়্যার ডেভেলপারও ইন্টারভিও থেকে রিজেক্ট (Reject) বা বাদ পরতে পারে তবে একজন ভালো কম্পেটিটিভ প্রোগ্রামার রিজেক্ট হয় না সাধারণত। কম্পেটিটিভ প্রোগ্রামিং আপনাকে একজন ভালো প্রবলেম সলভার (Problem Solver) করে তুলে যেটা সফটওয়্যার ডেভেলপমেন্টর জগতে খুব বেশি ম্যাটার করে।

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

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

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

তো আমরা দেখলাম কম্পেটিটিভ প্রোগ্রামার রা কন সমস্যা উত্তম উপায়ে সমাধান করতে পারে। তারা সঠিক সময়ে সঠিক ডাটাস্ট্রাকচার ব্যাবহারে ওস্তাদ। তারা জানে কোন ধরনের সমস্যার জন্য কোন উপদায় বেস্ট।

সফটওয়্যার ডেভেলপমেন্ট

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

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

একজন সফটওয়্যার ইঞ্জিনিয়ার একই সাথে সিস্টেম কমপ্লেক্সিটি, স্কেলাবিটি সমস্যা (Scalabilty issue), পারফরমেন্স সমস্যা সমাধানের জন্য বিভিন্ন টেকনিক ( যেমন ক্যাশিং ) এর সাথেও কাজ করার দক্ষতা রাখেন।

Scalability issue

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

সুতরাং সফটওয়্যার ডেভেলপমেন্টে আপনার ক্লিন কোড লিখা খুবই গুরত্তপুর্ন একটি বিষয়। এতে করে আপনার টিম এর বাকিরা খুব সহজেই আপনার কোড বুঝতে পারবে, মেইন্টেইন করতে পারবে, নতুন ফিচার যুক্ত করতে পারবে। কোনও একটি বই এ দেখেছিলাম, আপনার সফটওয়্যারের কোড কয়ালিটির পরিমাপ হচ্ছে WTF/Minuit।

WTF Per minutes - Code quality
বুঝে নিন

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

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

চাকরি, চাকরি এবং চাকরি

হ্যাঁ, আমাদের চাকরি দরকার। করোনার মধ্যে এমনি বিয়ে লেট হবে 🙂 । আমরা এ সব কিছুই করছি টাকার জন্য (আমার এই লিখাটাও, এড এ ক্লিক আসলে গুগল মামা ভালোই পয়সা-কড়ি দেয়)।

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

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

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

পরিশেষ

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

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

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

যদি আমি দুইটাই সাজেস্ট করলাম, আপনার যা ভালবাসেন আপনি তা করবেন। পুরোটাই আপনার প্রস্বানটির উপর নির্ভর করে। দুইটা এরিয়াতেই যথেষ্ট সুযোগ রয়েছে আর আপনি যদি চান যেকোনো একটি নিয়ে ফোকাস করবেন তাও সম্পূর্ণ ঠিক।

সফটওয়্যার প্রজেক্টে কাজ করার জন্য গিট একটি গুরুত্বপূর্ণ টুল। আরও জানতে গিট নিয়ে এই লিখাটি দেখুন।

এই লিখাটি Geeksforgeeks থেকে নেয়া। চাইলে মুল লিখাটি পড়তে পারেন। আমি আমার মতো করে অনুবাদ করার চেষ্টা করেছি। ভুল ক্রুটি হলে ক্ষমা সুন্দর দৃষ্টিতে দেখবেন। #HappyCoding #HappyLife

লেখাটি কেমন লেগেছে আপনার?

রেটিং দিতে হার্টের উপর ক্লিক করুন।

গড় রেটিং / 5. মোট ভোট:

আপনি প্রথম ভোটদাতা.

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?

3 টি মন্তব্য

  1. অসংখ্য ধন্যবাদ,
    সত্যি কথা বলতে বিষয়টা নিয়ে দ্বিধায় ছিলাম,
    লেখা তুলনামুলক ভাবে ভালো ছিলো বুঝতে একটুও সমস্যা হয়নি, যদিও অনলাইনে অনেক হয়তবা অনে কন্টেন্ট আছে, কিন্তু কখনো পড়া হয় না,
    ধন্যবাদ, তুমি লিখছো বলে বিষয়গুলা ক্লিয়ার হওয়া গেলো💚,
    এমন কন্টেন্ট continuous চাই,
    আর তাড়াতাড়ি আমাদের ভাবিকে দেখতেচাই, সবগুলা আডে ক্লিক মাইরে দিলাম,
    HappyWriting😇

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button