Friday, January 6, 2017

Act with Prudence


Whatever you undertake, act with prudence and consider the consequences

Kevlin Henney এর একট বই আছে, নাম 97 Things Every Programmer Should Know

এই বইয়ের প্রথম চ্যাপ্টারের নাম - Act with prudence.  তারপরেই উপরের লাইনটা আছে। 

Prudence শব্দের অর্থ দূরদর্শিতা বা বিচক্ষণতা। 
লাইনটার মানে দাড়ায় - বিচক্ষণতা সহিত কাজ কর। 

এবার মূল আলোচনায় চলে আসি। আলোচনার বিষয়বস্তু টেকনিক্যাল ডেব্ট(technical debt)

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

তবে এই লোন যত তাড়াতাড়ি শোধ করা যায় ততই মঙ্গলজনক (এতে সুদের পরিমান কম থাকে)। মূল বিষয়টা হচ্ছে লোন নেওয়া সাময়িক সুবিধার মনে হলেও এটি মোটেও ভালো কোনো বিষয় নয়। 

টেকনিক্যাল ডেব্‌ট মূলত রুপক অর্থে ব্যবহৃত(metaphorical term) শব্দ। যেকোনো কাজের কিছু নিয়ম কানুন(discipline) থাকে। ধরুণ আপনি একটি ব্রিজ তৈরি করতে চান। কোনোরকম শৃঙ্খলা ছাড়া একটি ব্রিজ ইচ্ছমতো বানানো সম্ভব নয়। সিভিল ইঞ্জিনিয়াররা পুরো প্রক্রিয়ার পরিকল্পনা তৈরি করে, এই পরিকল্পনাতে প্রচুর হিসেব নিকেশ থাকে, কীভাবে কোন রিসোর্স কোথায় ব্যবহার করা হবে তা নির্দিষ্ট করা হয়। 

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

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

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

অনেকসময় একজন ডেভেলপার/প্রোগ্রামারকে এমন সিন্ধান্তের মুখোমুখি হতে হয় - 
  1. doing it right. 
  2. doing it quick 
কখনো কখনো আপানকে দ্বিতীয় সিন্ধান্তটি নিতে হয়। আপনি ধরে রাখেন যে, পরবর্তীতে এসে এটিকে আপনি ঠিক করবেন। কিন্তু বাস্তবতা আসলে এমনটা কখনো হয় না। আপনার কাছে প্রতিনিয়ত নতুন নতুন সমস্যা আসতেই থাকবে। আপনি পরে করবেন বলে যে কাজটি রেখে চলে গেলেন তা হয়তো কখনোই করা হয়ে উঠবে না। আর এদিকে আপনার ঋণ বেড়েই চলবে। এভাবে ঋণ বাড়তে বাড়ে কোনো সময় আপনরা পুরো প্রজেক্ট মুখ থুবড়ে পরতেই পার। এটি খুবই স্বাভাবিক। 

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

কিন্তু আমরা জানি যে, বাস্তবে এমনটা সবসময় সম্ভব নয়। তাই সিন্ধান্ত নেওয়ার সময় চিন্তাভাবনা করে বিচক্ষণতার সাথে নেওয়া উচিৎ এবং এর পরিণতি (consequences) সম্পর্কে অবগত থাকা উচিৎ। 


কাজী নজরুল ইসলামের একটা কবিতার লাইন - 

“দিনে দিনে বহু বাড়িয়াছে দেনা শুধিতে হইবে ঋণ”

দেনা না বাড়ানোই উত্তম।

Monday, November 21, 2016

হ্যাশ ফাংশন -২

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

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

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





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

সমস্যাটি নিশ্চয় বুঝতে পারছো। এই সমস্যাকে বলা হয় কলিশন (collision)। এখন তুমি যদি অ্যারের ১ নম্বর ইনডেক্সে আমের দাম রাখো, তাহলে আগের আদার দামের সাথে এটি রিপ্লেস হয়ে যাবে। এতে করে তুমি যদি পরবর্তীতে আদার দাম দাও, তোমার হ্যাশটেবিল আমের দাম দিয়ে দিবে যা হওয়া উচিৎ নয়।

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

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

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



উপরের ছবি থেকে নিশ্চয় দেখতে পাচ্ছো সমস্যাটি কোথায়? তোমার অ্যারের বাকি স্লটগুলো প্রায় খালি রয়ে গেছে।
তাহলে এখান থেকে দুটি বিষয় জানা গেলো –
১. হ্যাশ ফাংশন অনেক গুরুত্বপুর্ণ। এটি খুব সিম্পল হলে সমস্যা।
২. প্রত্যেকটি স্লটেই যদি অনেক বড় লিংকলিস্ট থাকে, তাহলে কনস্ট্যান্ট টাইম অর্থাৎ O(‌1) সময়ে তুমি উপাদান খুঁজে বের করতে পারছো না।
এখন যদি তুমি একটি ভালো হ্যাশ ফাংশন লিখতে পারো, এবং প্রত্যেক স্লটেই যাতে বিশাল লিংকডলিস্টের চেইন না হয় তা নিশ্চিত করতে পারো তাহলেই O(‌1) সময়ে হ্যাশ টেবিল থেকে ভ্যালু পড়তে পারবে।

এবার Load Factor বলে একটা টার্ম আছে, এটি নিয়ে একটু বলি তোমাদের। একটি হ্যাশটেবিলের লোড ফ্যাক্টর খুব সহজেই বের করা যায়।

Load Factor = Number of items in the hash table / Total slot in the array


তাহলে তোমার অ্যারেতে যদি স্লট হয় 10 এবং উপাদানের সংখ্যা যদি হয় ৭ তাহলে লোড ফ্যাক্টর হবে- 0.7। এটি দিয়ে একটি হ্যাশটেবলি কতগুলো স্লট ফাকা আছে তা বের করা যায়। একটি হ্যাশটেবিলের লোড ফ্যাক্টর যদি 1 হয় তাহলে এর বোঝায়, এর প্রত্যেকটি স্লটে একটি করে উপাদান রয়েছে। লোড ফ্যাক্টর একের অধিক থাকার অর্থ হলো, টেবিলের কোন স্লটে একাধিক উপাদান রয়েছে।

কনস্ট্যান্ট টাইম অর্থাৎ O(1) সময়ে কোন উপাদান খুঁজে পাওয়া নিশ্চিত করতে চাইলে লোড ফ্যাক্টর সবসময় একের নিচে রাখতে হবে। এটি করার জন্যে যখনই লোড ফ্যাক্টর ১ এর বেশি হবে তখনই টেবিলকে রিসাইজ করে আবার প্রত্যেকটি উপাদানের হ্যাশ ক্যালকুলেট করে বিভিন্ন স্লটে বসাতে হবে। এই অপারেশনটি মোটামুটি এক্সপেনসিভ। তবে তুমি কনস্ট্যান্ট টাইম উপাদানগুলো খুঁজে পাচ্ছো টেবিলের সাইজ যতোই হোক না কেনো।

তাহলে উপরের আলোচনা থেকে নিশ্চয় বুঝতে পারছো যে, যদিও কনস্ট্যান্ট টাইমে আমরা উপাদান খুঁজে বের করতে চাচ্ছি, কিন্তু সবসময় তা সম্ভব নয়। তবে best case এটি অবশ্যই O(1) হবে এবং worst case-এ এটি O(n) হতে পারে।

Sunday, November 20, 2016

হ্যাশ ফাংশন

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

খাতাতে যদি নামগুলো বর্ণানুক্রমে রাখা না থাকে, তাহলে তোমার প্রতিবার খুঁজে বের করতে অনেক সময় লাগে। অ্যালগরিমদ ক্লাসে নিশ্চয় শিখেছো যে এক্ষেত্রে খুঁজে বের করার সময় O(n) । তবে নামগুলো যদি বর্ণানুক্রমে রাখা থাকে তাহলে বাইনারি সার্চ ব্যবহার করা যায় আর তখন সময় লাগবে O(log n)। তুমি নিশ্চয় জানো যে O(n) চেয়ে O(log n) কম সময় লাগে।

চিত্র: O(n) vs O(log n) 

যদিও O(log n) কম সময় লাগছে, তবুও কিছুটা সময় লাগছে। সবচেয়ে ভাল হতো যদি কোন সময়ই না লাগতো। তুমি সবগুলো পণ্যের নাম এবং দাম মুখস্থ করে ফেলতে পারতে এবং ক্রেতা কোন পণ্যের নাম বলার সঙ্গে সঙ্গেই তুমি দাম বলে দিতে পারতে।

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

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

মনে করো, তোমার ১০ সাইজের একটি অ্যারে রয়েছে। এখন, ধরো, পেঁপের দাম ২০ টাকা। পেঁপে নামটি যদি হ্যাশ ফাংশনে দাও, তাহলে এটি যদি ৪ রিটার্ন করে, তাহলে অ্যারের চতুর্থ নম্বর ইনডেক্সে পেঁপের দামর রেখে দেবে। এভাবে আদার নাম হ্যাশ ফাংশনে দিলে যদি ৩ রিটার্ন করে, তাহলে তাকে তিন নম্বর ইনডেক্সে রেখে দিলে। এভাবে কলা, মরিচ ইত্যাদি রেখে দিলে। এখন যখন তোমার এগুলো দাম জানার দরকার হয়, তাহলে চট করে হ্যাশ ফাংশনে নামটি দিয়ে তার ইনডেক্সটি বের করে নিলে। অ্যারতে ইনডেক্স জানলে ভ্যালু পড়ে আনা খুব সহজ। অ্যারে থেকে ভ্যালু পরে আনার সময় আসলে O(1) ।

চিত্র: হ্যাশ ফাংশন


চিত্র: হ্যাশ টেবিল


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

উপরের যে উদাহরণটি দিয়েছি তাতে একটি সমস্যা রয়েছে। সেটি নিয়ে পরবর্তীতে আলোচনা করবো। তবে সমস্যাটি তুমি চিন্তা করে যদি খুঁজে বের করতে পারো তাহলে নিচে কমেন্ট করে জানাও।

পরের অংশ:  লিংক

Thursday, November 3, 2016

জাভা ইন্টারফেস এর ক্ষেত্রে multiple inheritance সাপোর্ট করলেও ক্লাসের ক্ষেত্রে কেনো করে না ?

জাভা প্রোগ্রামিং ল্যাংগুয়েজের ডিজাইনাররা কয়েকটি গুরুত্বপূর্ণ বিষয় মাথায় রেখে এই ল্যাংগুয়েজকে ডিজাইন করে। এগুলো হলো-
  1. এটি হতে হবে খুবই সিম্পল, অবজেক্ট ওরিয়েন্টেড এবং পরিচিত, অর্থাৎ যারা তখন সি বা সি++ জানতো তারা যাতে করে সহজেই বুঝতে পারে।
  2. এটিকে অবশ্যই অনেক শক্তসমর্থ এবং নিরাপদ (robust and secure) হতে হবে।
  3. এটি যেকোন অপারেটিং সিস্টেমে চলবে।
  4. এর পারফর্মেন্স অনেক ভাল হতে হবে ।
  5. এটি ইন্টারপ্রেটেড, থ্রেডেড এবং ডাইনামিক হতে হবে। (এখানে বলে রাখি, জাভা যদিও কম্পাইল্ড ল্যাংগুয়েজ, কিন্তু জাভা ভার্চুয়াল মেশিন মূলত বাইটকোড ইন্টারপ্রেট করে আর জেভিএম একটা ডাইনামিক মেশিন)।
এই কয়কেটা উদ্দেশ্যের সাথে আরেকটি গুরুত্বপূর্ণ জিনিস হলো- এর ল্যাংগুয়েজ ফিচার খুব অল্প হতে হবে যাতে একজন প্রোগ্রামার খুব সহজেই মনে রাখতে পারে। যেসব ফিচার খুব ঝামেলাযুক্ত এবং আসলে তেমন প্রয়োজন নেই খুবএকটা সেগুলোকে তারা বাদ দিয়ে ডিজাইন করেছে। যেমন- অপারেটর ওভারলোডিং, মাল্টিপল ইনহেরিটেন্স। এগুলো সুবিধার চেয়ে প্রোগ্রামারদের অসুবিধার কারণ বেশি তৈরি করে।
মাল্টিপল ইনহেরিটেন্সের ক্ষেত্রে একটি বড় সমস্যা হলো ডাইমন্ড সমস্যা। একটি উদাহরণ দেওয়া যাক- মনে কর, একটি ক্লাস A, একে B ও C এক্সটেন্ড করে। আবার আরেকটি ক্লাস D যা কিনা B ও C কে এক্সটেন্ড করে। এখন ধরো, যদি A এর কোনো একটি মেথডকে B ও C দুটিই ওভারাইড করে। এখন যদি D থেকে সেই মেথডটি কল করতে চাও, তাহলে সেটি কোন ক্লাসের মেথডকে কল করবে ? B না C ? সমস্যাটি নিশ্চয় বোঝা যাচ্ছে? 
ইন্টারফেসের ক্ষেত্রে এই সমস্যা হওয়ার কোন উপায় নেই, কারণ প্রত্যেকটি ক্লাস যেহেতু মেথডগুলো ইম্প্লিমেন্ট করবে, তাই সবাই আসলে নিজের মেথডকেই কল করবে।
জাভা ডিজাইনাররা এরকম সমস্যার মধ্য দিয়ে যেতে চায় নি। তাই জাভাতে মাল্টিপল ইনহেরিটেন্স নেই।

Ref: http://programabad.com/questions/5613/multiple-inheritence/5614

Tuesday, November 1, 2016

কীভাবে ভাল প্রোগ্রামার হওয়া যায়

এই প্রশ্নটি অনেকেই করে থাকে। এর একটি নির্দিষ্ট উত্তর নেই। তবে আমার মনে হয় প্রোগ্রামিং মূলত দুটি বিষয়ের সংমিশ্রণ। 

এক, চিন্তা করার ক্ষমতা ।
দুই, অনুশীলণ। 


এই দুটিই লাগে প্রোগ্রামিং করার জন্যে। এই দুটির একটি বাদ পরলে ভাল প্রোগ্রামার হওয়ার কোন উপায় নেই।

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

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

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

ম্যালকম গ্ল্যাডওয়েলের একটি বই- Outliers-এ তিনি উল্লেখ করেছেন যে, যে কোন বিষয়ে মাস্টার হতে হলে রাফলি ১০ হাজার ঘণ্টা অণুশীলন করতে হয়। সে অনুযায়ী আপনি যদি সপ্তাহে ৫ দিন ৪ ঘণ্টা করে অনুশীলন করেন, আপানর লাগবে প্রায় ১০ বছর।

নিচে একটি লিংক দিয়ে দিলাম। এটি ব্যবহার করে আপনি নিজেই ঠিক করে নিন প্রতিদিন কত ঘণ্টা এবং সপ্তাহে কতদিন অণুশীলন করবেন-http://ryac.ca/10000-hours-how-long-is-that/



Sunday, October 23, 2016

5 Mistakes Java developer makes that prevent them from growing their careers

ব্রুনো সোজা (Bruno Souza) জাভা ডেভেলপারদের ক্যারিয়ার উন্নতির লক্ষ্যে একটি নতুন সাইট তৈরি করেছে। গতকাল তার একটি ওয়েবইনার ছিল। এর টপিকটি হলো- একজন জাভা প্রোগ্রামার তার ক্যারিয়ার উন্নতির ক্ষেত্রে যে ৫ টি ভুল করে থাকে তার উপর। 

ওয়েবইনারটির লিংক: https://www.youtube.com/watch?v=pFbMYZUUT8Q


তবে এটিকে আমি বাংলাতে সংক্ষেপে বলার চেষ্টা করবো। তিনি শেষ থেকে শুরু করেছেন । এখানেও সেভাবেই লিখছি - 

পঞ্চমত, শুধুমাত্র টেকনোলজি জানলেই চলবে। 

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

চতুর্থত, অনেক বেশি অনুশীলন বা চর্চা না করা 

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

তৃতীয়ত, আপনি যা জানেন তা অন্যদের সাথে শেয়ার না করা 

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

আরেকটি কঠিন সত্য ব্যপার হলো, মানুষ আসলে আপনাকে খুব একটা কেয়ার করে না। আপনি আসলে তাদের জন্যে কি করতে সেটাই মুখ্য। সুতরাং আপনি যত বেশি শেয়ার করবেন, আপনি অন্যের জন্যে ততবেশি প্রয়োজনীয় হয়ে উঠবেন। 

দ্বিতীয়ত, ফোকাস 


আপনি নিজে দুনিয়ার সব মানুষকে অ্যাকসসে করতে পারবেন না বা সবার সঙ্গে সবকিছু শেয়ার করতে পারবেন না। আপনাকে একটি নির্দিষ্ট বিষয়ে ফোকাস করতে হবে। 

এক্ষেত্রে একটি স্পেসিফিক একটি লাইন ফলো করা যেতে পারে- 

I help (a person) to do (something) so he/she can have (something) 

Example - 

I help my coworker to learn Java so he/she can program in Java 

I help professional java developers do solve hard Java problems so they can have a secure and satisfying job or project


প্রথমত, সব কিছু নিজে করা

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


অনেকভাবেই টিমআপ করতে পারেন। একটি চমৎকার আইডিয়া হতে পারে জাভা ইউজার গ্রুপে জয়েন করা। অন্যের কোন ওপেন-সোর্স প্রজেক্টের সাথে জয়েন করতে পারেন।

Wednesday, October 19, 2016

I'm writing a book

Yes, that's true!

It's a book about a programming language called Java. The written language of the book is Bangla, and I targeting mostly Bangladeshi developers who know a basic programming language eg C or python and want to explore Java.

I, in fact, intend to write three separate part of the book.

Here is the outline of the books: 


Java :  Part 1 (Basic Java)
  1. Introduction 
  2. Your First Java Programming 
  3. Syntax 
  4. Data Types, Operators 
  5. Control flow-looping-branching 
  6. Array 
  7. Object Oriented Programming 
  8. Exception Handling 
  9. Generics 
  10. Java IO 
  11. Java NIO 
  12. String Operations 
  13. Collection Framework 
  14. Core Utilities 
  15. Unit Testing 

Java : Part 1.5 ( Java 8)
  1. Intro – like why should you care 
  2. Lambda Expression 
  3. Functional programming using Java 
  4. Stream API 
  5. New utilities-> Optional, Future, Completable Future etc 
  6. New Date Time API
Java : Part 2 (Advance Java)
  1. Java Memory Model 
  2. Thread & Concurrency 
  3. Annotation Processing 
  4. Java Reflection API 
  5. Java NIO2 → asynchronous I/O 
  6. Java Networking 
  7. JDBC 
  8. Example 
    1. Single Threaded Web server 
    2. Multi-Threaded Web Server 
    3. Multiplexed Web Server 

The first one is complete and hopefully, will be published by late November.