Post updated on 12th May, 2021 at 05:04 pm
Android App ডেভেলপমেন্ট শেখার শুরু করি ২০১৫ সালে। ভার্সিটির সেকেন্ড বা থার্ড ইয়ারে পড়ি হয়ত। রমজান মাস আসার আগে প্লে স্টোরে প্রথম অ্যাপ পাবলিশড করি। তখন অ্যাপের নাম ছিল App Of Ramadan. যা বর্তমানে Muslims Day নামকরণ করা হয়েছে। প্লে স্টোরে অ্যাপের ডাউনলোড সংখ্যা ১ লক্ষ ছাড়িয়েছে বেশ কিছুদিন আগে।
২০২০ সালে এই অ্যাপের আমূল পরিবর্তন এসেছে। ২০২১ সালে এসেছে ইউজার ইন্টারফেসে কিছু পরিবর্তন। আগের কোডবেজ বাদ দিয়ে একদম নতুন করে লেখা হয়েছে পুরো প্রোজেক্ট। আমরা এই অ্যাপটি ডেভেলপ করতে বর্তমানে কোন কোন টেকনোলজি ইউজ করছি (যেমনঃ Kotlin, MVVM, Dagger2, RxJava2 ইত্যাদি); আর ২০১৫ থেকে এ পর্যন্ত ডেভেলপমেন্টের অভিজ্ঞতাগুলো ইন্ডাস্ট্রির নবীন Android App Developer-দের জন্য তুলে ধরছি।
জাতীয় বিশ্ববিদ্যালয়ের অধীনে ঢাকা সিটি কলেজের CSE তে পড়তাম তখন। আমাদের সিলেবাসে জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ ছিল না। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কোর্সটা করেছিলাম সি++ ল্যাঙ্গুয়েজ ব্যবহার করে। অ্যান্ড্রয়েড শেখার জন্য জাভা জানা প্রয়োজন। অ্যান্ড্রয়েড আর জাভার হাতেখড়ি হয়েছে জুলকারনাইন মাহমুদ ভাইয়ের শিক্ষক ডট কমের ভিডিও থেকে। তিনি এখন গুগলের সফটওয়্যার ইঞ্জিনিয়ার হিসাবে জব করছেন।
আমার অ্যান্ড্রয়েড ডেভেলপার হওয়ার পিছনে ভাইয়ার ঐ কোর্সের প্রতি আমি আজীবন কৃতজ্ঞ থাকব। আমি আমার ক্যারিয়ার আর আজকের এই Muslims Day অ্যাপ বানানোর জন্য আল্লাহ যদি কোনো সওয়াব নির্ধারণ করে রাখেন তাহলে নিশ্চিত এই সাদকায়ে জারিয়ার অংশীদার তিনিও হবেন। আল্লাহ তার দুনিয়া ও আখিরাতের কল্যান দান করুন।
যথারীতি কৃতজ্ঞতা স্বীকার করছি আমার গুরু শাওন ভাইয়ার প্রতি। তার প্রত্যক্ষ সহযোগিতা ছাড়া আমার এ পর্যন্ত আসা হয়ত অনেক বেশি কঠিন হত। তাঁর পরামর্শেই আমি Android App ডেভেলপমেন্টে আসি। যদিও তিনি শুরু থেকেই PHP নিয়ে কাজ করেন।
App Of Ramadan ২০১৫ (প্রোজেক্টের শুরুর কথা)
২০১৫ সালে এই অ্যাপের মূল কাজ ছিল রমজান মাসের সাহরি ও ইফতারের সময় দেখানো। ৬৪ টা জেলা সিলেক্ট করে হোম স্ক্রিনে বড় করে সাহরি বা ইফতারের সময়ের কাউন্ট ডাউন দেখানো হত। নিচে দুইটা সময় দেখানো হত। আর নেভিগেশন ড্রয়ার থেকে কিছু আর্টিকেল, মাসআলা, দুআ দেখা যেত। খুব সম্ভবত অফলাইন নোটিফিকেশনও ছিল যেটা প্রতিদিন বিকালের দিকে ট্রিগার করত।
Android শেখা শুরু করার সময় Eclipse ইউজ করে অ্যাপ ডেভেলপ করতাম। এরপর BITM এ SEIP প্রোজেক্টের সম্ভবত প্রথম ব্যাচেই কোর্স করেছিলাম। সেই কোর্সের জন্য চার জনের একটা টিম গঠন করতে হয়েছিল। সেই কোর্স চলাকালীন সময়ে ঐ টিমের আমরা চারজন শুরু করেছিলাম এই অ্যাপের ডেভেলপমেন্ট।
আমাদের টিমে অন্যান্যদের মধ্যে ছিল জগন্নাথ বিশ্ববিদ্যালয়ের ছাত্র মাহাদী হাসান সানী। ছিল ইশা হাম্মাম। আর ছিল সবার সিনিয়র মাইনুদ্দীন চিশতী ভাই। আমরা তিনজন CSE ব্যাকগ্রাউন্ডের হলেও চিশতী ভাই ছিলেন কমার্স ব্যাকগ্রাউন্ডের। আর তখন জব করতেন কোনো একটা আর্থিক প্রতিষ্ঠানে। ঐ সময়ই তার প্লে স্টোরে কয়েকটা অ্যাপ ছিল। সম্ভবত আমরা সবাই ২০১৬ বা ২০১৭ পর্যন্ত সবাই একসাথে কাজ করতে পেরেছিলাম এই প্রোজেক্টে। পরবর্তীতে সবার নিজ নিজ ব্যস্ততার জন্য আমি একাই গত ২ বছর অ্যাপের মেইনটেইন করে আসছিলাম। মাঝে ছোট বেলার বন্ধু আবদুর রহীম এই প্রোজেক্টে বেশ কিছু দিন কন্ট্রিবিউট করে। ২০১৬ সালের যেই ডিজাইনটা দেখা যাচ্ছে সেই ডিজাইনটা করে আবদুর রহীমের ভার্সিটির ক্লাসমেট তানভীর হাসান নীল।
কোর্স চলাকালীন সময়ে আমরা এটা ডেভেলপ করে প্লে স্টোরে আপলোড করি। কেবল শেখার শুরু। ঐ সময় আমার কোনো অ্যান্ড্রয়েড ফোনও ছিল না অ্যাপ টেস্ট করার জন্য। Genymotion এর ইমুলেটর ইউজ করে অ্যাপ টেস্ট করতাম। মনে আছে, ইশার নামাজের আগে প্রোজেক্ট বিল্ড দিয়ে গিয়ে নামাজ-কালাম পড়ে এসে এরপর অ্যাপ টেস্ট করতে পারতাম। ঐ সময়ে ২/৪ জিবি RAM আর ডুয়েল কোর প্রসেসর দিয়ে ডায়নোসরের মত Android Studio ইউজ করার অভিজ্ঞতাটা ছিল ভয়াবহ! প্লে স্টোরে অ্যাপ পাবলিশড হওয়ার পর ফ্রেন্ডদের ফোনে ইন্সটল করে দেখতাম কেমন দেখা যায় দেখতে।
তখন Java, XML দিয়ে ঐ সময়ের বিদ্যার দৌঁড়ে যতটুকু কুলায় ততটুকু কাজ করেছিলাম। ২০১৬ তে এসে দেখলাম কোডের মর্ম কিছুই বুঝে আসছে না। আর এটার উপর কাজ করাও সম্ভব না। আবার নতুন করে ডিজাইন করে নতুন করে পুরো প্রোজেক্ট দাঁড় করালাম। বাজে কোড কী জিনিস প্রথম বারের মত একটু বুঝেছিলাম ঐ সময়টায়। এ সময়ে আমাদের কোড কোনো আর্কিটেকচার ফলো করে করতাম না। এমন কি জানতামও না আর্কিটেকচার প্যাটার্ন কী জিনিস?
২০১৫ সালে সাহরি-ইফতারের ডেটা স্টোর করার জন্য strings.xml ফাইলে array বানিয়ে সেখানে ডেটা রেখেছিলাম। জেলাগুলোর জন্য কত মিনিট প্লাস-মাইনাস করতে হবে সেটাও এখানে রাখা ছিল। এটা একটা স্ট্যাটিক অ্যাপই ছিল বলা যায়।
২০১৬-১৭ সালের দিকে Firebase Realtime database ইউজ করা শুরু করি। সাহরি ইফতারের সাথে নামাজের সময়সূচীও ফায়ারবেজে রেখে অ্যাপে ডেটা শো করতাম। ২০১৮ সালের দিকে সম্ভবত প্রথম রোজার দিন ৫০০০-৬০০০ ইন্সটল হয় এক দিনে। রিয়েলটাইম ডেটাবেজের concurrent user এর লিমিট ছিল ১০০ জন। তাই বেশির ভাগ ইউজারই ১ স্টার রেটিং দিচ্ছিল। কারণ তারা ফায়ারবেজ ডিবির সাথে কানেক্ট হতে পারছিল না। প্রথম বারের মত ফিল করলাম concurrency কী জিনিস!
পরদিন গুগলের সফটওয়্যার ইঞ্জিনিয়ার ইমরুল ভাই নক দিলেন। আর ফায়ারবেজের Blaze plan এ মাইগ্রেট করার ব্যাপারে হেল্প করলেন। এখন পর্যন্ত আমরা ব্লেজ প্ল্যানেই আছি। যদিও ফায়ারবেজের উপর থেকে ডিপেন্ডেন্সি কমিয়ে এনেছি অনেক।
App Of Ramadan 2018-19
সম্ভবত ২০১৮ সালে আবারো স্ক্র্যাচ থেকে শুরু করে পুরো কোড ঠিকঠাক করি। তখনও কোডে কোনো আর্কিটেকচারাল প্যাটার্ন ফলো করতাম না। কিছু প্রোজেক্টে কাজ করে সে অভিজ্ঞতার আলোকেই খানিকটা আপডেট করা হয়। এ সময়টা থেকে আমি একাই প্রোজেক্টের মেইনটেনেন্স চালিয়ে নিতে থাকি।
এই সময়েই সম্ভবত অ্যাপ থেকে Google AdMob সরিয়ে ফেলি। অনেকেই পারসোনাল্যি মেসেজ দিয়ে বলতেন যে তারা পেমেন্ট করে অ্যাপ কিনতে চান, যেন বিজ্ঞাপন শো না করে। পাশাপাশি ইসলামিক স্কলারদের থেকে এমন আশংকার কথা জানতে পারি যে অ্যাডমবের এই টাকা হারাম হতে পারে। আর যে কোনো পণ্যের বিজ্ঞাপনেই নারীর অপ্রয়োজন উপস্থিতি এখন এক রকম বাধ্যতামূলক। তাই যতই ফিল্টার করি না কেন, অ্যাপে বিজ্ঞাপন থাকলে সেখানে পর্দা লঙ্ঘন হবেই। আর Interstitial Ad এর ক্ষেত্রে মিউজিকও থাকে। এজন্য গুগলের বিজ্ঞাপন বাদ দিয়ে দেই।
২০১৯ এর শুরুর দিকে প্রোজেক্টের কোড রিফ্যাক্টর করা শুরু করি। এই সময় থেকে কটলিন কোড যোগ করা শুরু করি প্রোজেক্টাতে। নতুন কোনো ফিচার যোগ হলে ক্লাসগুলো Kotlin এ করতাম। আর MVP architecture ফলো করে নতুন ফিচারগুলো রেডি করতাম। প্রোজেক্টের কিছু ফিচার ছিল MVP তে করা, আর আগের ফিচারগুলো ছিল “বাংলা সিসটেমে”।
২০১৯ সাল পর্যন্ত অ্যাপে কোনো লোকাল ডিবি ছিল না। ফায়ারবেজ রিয়েলটাইম ডেটাবেজ আর asset folder এ কিছু ডেটা ছিল। কিছু ছিল আগের মতই স্ট্রিং ফাইলে। আমাদের রিয়েলটাইম ডেটাবেজে সারা বছরের মানে ৩৬৫ দিনের ৫ ওয়াক্ত নামাজের সময়, সাহরি-ইফতারের সময় এগুলো হাতে টাইপ করে স্টোর করে রাখি। এজন্য আমাদের অ্যাপটা শুধু বাংলাদেশের ইউজাররাই ইউজ করতে পারতেন। কিন্তু দেশের বাইরের অনেকেই এটা ইউজ করতেন শুধুমাত্র এর কনটেন্টের জন্য। আমি ১০ বছর মাদরাসায় পড়াশোনা করার সুযোগ পেয়েছিলাম। সেই বিদ্যাটা এই অ্যাপের জন্য খুব বেশি কাজে এসেছে। অ্যাপের কনটেন্ট আর অ্যাকুরেসি নিয়ে আলহামদুলিল্লাহ খুব একটা আপোষ করি না।
Muslims Day 2020 – 2021
২০১৯ সাল থেকে পরিকল্পনা শুরু করি scratch থেকে আবার কাজ শুরু করার। কারণ আগের কোডের দিকে তাকালেই বিতৃষ্ণায় ঠোঁট বেঁকে যেত। এই কোড মানুষ করে? এই কোডের উপর ক্যামনে কাজ করব? আমি এই কোড লিখছিলাম এক সময়? এভাবে নিজের পাপের জন্য ধিক্কার দিতে দিতে বাধ্য হয়ে সিদ্ধান্ত নিয়ে ফেলি যে আবার নতুন করে কোড করব।
তখন সিটি কলেজের ডিপার্টমেন্টের জুনিয়র আর আমার বর্তমান কর্মস্থল Brain Station 23 Ltd এর সহকর্মী শাফায়াতের সাথে আলোচনা করি। আমরা সিদ্ধান্ত নিই যে, আগের মত হার্ডকোডেড ডেটার উপর আমরা কাজ করব না। অ্যাপ হবে সারা বিশ্বে ইউজ করার মত। লোকেশনের উপর বেজ করে কিভাবে সূর্যোদয়-সূর্যাস্ত ও নামাজের সময়গুলো বের করা যায় সেগুলো নিয়ে পড়াশোনা শুরু করলাম। মূল কাজটা আসলে শাফায়াতই করেছে। আজকের প্লে স্টোরে অ্যাপটির যেই অবস্থা, এর জন্য পুরো কৃতত্ব শাফায়াতকে দিলেও বাড়িয়ে বলা হবে না। আল্লাহ শাফায়াতের দুনিয়া ও আখিরাতের কল্যান দান করুন। হেদায়েতের উপর মৃত্যু পর্যন্ত অবিচল রাখুন।
আমাদের এই চলমান প্রোজেক্টের কোডবেজে সরাসরি কনট্রিবিউট করছেন সকলের পরিচিত বজলুর রহমান রোকন ভাইয়া। যিনি এক সময় বিকাশের লিড ইঞ্জিনিয়ার ছিলেন। বর্তমানে কানাডা প্রবাসী। শত ব্যস্তার মাঝেও তিনি আমাদেরকে সহযোগিতা করে যাচ্ছেন। আল্লাহর কাছে উত্তম প্রতিদানের দুআ করি।
এছাড়াও UX/UI নিয়ে এখন রিসার্চ আর ডেভেলপমেন্টে কাজ করছেন Monstar Lab এর সিনিয়র UX/UI ডিজাইনার তাওসিফ ভাই। তাওসিফ ভাইয়ের সাথে কাজ করছেন আরেকজন UX expert ফজলে রাব্বি ভাই। এই দুই ভাইও নিজ আগ্রহে আমার সাথে যোগাযোগ করেছেন অ্যাপের পরবর্তী UX আর ভাল করার জন্য কনট্রিবিউট করতে। আল্লাহ তাদের দুনিয়া ও আখিরাতের কল্যান দান করুন। পাশাপাশি পরিচিত অপরিচিত, জানা-অজানা অনেক ভাবে যারা এই অ্যাপের জন্য কাজ করেছেন ও করে যাচ্ছেন। সকলের জন্য কল্যান কামনা।
R&D
অ্যাপের কাজ শুরু করার আগে শাফায়াত কয়েক মাস রিসার্চ পেপার পড়েছে সূর্যের অবস্থান বিষয়ক। এরপর একটা ডেমো অ্যাপ বানায় যেটা জাস্ট কিছু টেক্সটভিউতে লোকেশনের উপর বেজ করে নামাজের কয়েকটা সময় দেখায়। আমরা ঢাকার বাইরে ট্যুরে গেলে এটা নিয়ে যেতাম। টেস্ট করে দেখতাম এটা ঠিক মত কাজ করে কিনা।
আমি অ্যাপের নতুন ডিজাইন নিয়ে চিন্তা করা শুরু করলাম। আমার ডিজাইন সেন্স অতি নিম্ন মানের। প্রায় ৬ মাস ধরে ৮-১০ টা ডিজাইন করি ফিগমাতে। কোনোটাই পছন্দ হয় না। ডিপার্টমেন্টের আরেক ছোট ভাই আকাশ। ও কিছুটা চেষ্টা করল আমার ডিজাইনকে ইমপ্রুভ করার জন্য। সেগুলোও পছন্দ হলো না।
এরপর প্রায় মাসখানেক মনে হয় ডিজাইন অফ রেখেছিলাম। সব ভুলে গিয়ে মাথার ক্যাশ ক্লিন করার জন্য। এরপর আরেকটা ডিজাইন করলাম। এটা কয়েকজন দেখে বলল চলবে মোটামুটি। সেটার উপর অফিসের আরেক কলিগ রাজিব ভাই একটা উইকেন্ডে কয়েক ঘন্টা কাজ করে কিছু কালার কারেকশন দিয়েছিলেন। সেটার উপর বেজ করেই নতুন অ্যাপের কাজে হাত দেই।
২০২০ সালের পর নতুন ডিজাইনের ইউজার এক্সপেরিয়েন্স নিয়ে আবার নতুন করে চিন্তা শুরু করি। কিভাবে আরো ভাল ইউজার এক্সপেরিয়েন্স দেয়া যায়। তাওসিফ ভাই ও ফজলে রাব্বি ভাইয়ের করা নতুন ডিজাইনের থেকে ইন্সপায়রেশন নিয়ে ২০২০ সালের শেষের দিকে ইউজার ইন্টারফেস আরেক দফা আপডেট করা হয়। চেষ্টা করেছি নতুন আপডেটে UI-টা আরেকটু ক্লিয়ার করার জন্য। পাশাপাশি যুক্ত করেছি বহুল প্রতীক্ষিত dark mode.
Development of Muslims Day
২০১৯ সালের নভেম্বর বা ডিসেম্বরে সম্ভবত মুসলিমস ডে প্রোজেক্টের ডেভেলপমেন্টে হাত দেই। আমরা প্রথমে যেটা করেছিলাম, আগের কোডবেজের সব কিছু “legacy” নামের একটা প্যাকেজে ট্রান্সফার করি। এরপর আলাদা প্যাকেজ করে কাজ শুরু করি। নিচে আমরা কী কী tools & technology ব্যবহার করেছি সেগুলো সংক্ষেপে তুলে ধরছি।
Kotlin – Programming language
পুরো প্রোজেক্টটি ডেভেলপ করা হয়েছে কটলিন প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে। UI এর জন্য যথারীতি xml. খুব সম্ভবত আমরা আগের কোডবেজের জাভা দিয়ে লিখা কোনো কোড এখনকার প্রোজেক্টে রাখি নাই।
Style/Theme
Google এর material theme ব্যবহার করেছি। আমাদের পুরো প্রোজেক্টে দুই/তিন ধরনের বাটন ইউজ করেছি। এগুলোর জন্য স্টাইল লেখা আছে। TextView, Radio button এগুলোর জন্যও কিছু স্টাইল লেখা আছে। ফলে UI improve করাটা সহজ হয়েছে। Custom font ও থিমে সেট করে দেয়া হয়েছে। পুরো অ্যাপে Solaiman Lipi font ব্যবহৃত হচ্ছে।
MVVM (Model View ViewModel) – Architectural Pattern
এই প্রোজেক্ট ডেভেলপমেন্টের ক্ষেত্রে আমরা গুগলের থেকে Android এর জন্য recommended MVVM architecture অনুসরণ করেছি। এই প্রোজেক্টে MVVM অ্যাপ্লাই করার আগে কিছু প্র্যাক্টিস করার দরকার ছিল। তার অংশ হিসাবে MVVM এর উপর ব্লগ পোস্ট করি জানুয়ারির দিকে। অফিসে এখন যে প্রোজেক্টে কাজ করছি সেটাতেও MVVM ইউজ করা হয়েছে। এজন্য এটা বেশ কাজে এসেছে। আল্লাহর একটা রহমত যে আমরা MVVM পছন্দ করেছিলাম এই প্রোজেক্টের জন্য। নইলে প্রোজেক্টটা মেইনটেইন করা কঠিনই হত।
আমাদের View layer থেকে ViewModel লেয়ারে ডেটা ফেচ করার কল দেয়া হয়। ভিউ মডেল কল দেয় রিপোজিটরিকে। রিপোজিটরি ডিসিশন নেয় ডেটা কোথা থেকে ফেচ করতে হবে। নেটওয়ার্ক কল করার দরকার হলে নেটওয়ার্ক কল দেয়, অন্যথায় লোকাল থেকে সার্ভ করে। অর্থাৎ যখন আমরা যেই লেয়ারের জন্য কোড করি, সেটা ছাড়া অন্য কোনো কিছু মাথাতেই আনতে হয় না। ভিউ মডেল বা রিপোজিটরি বা ডেটা সোর্সের জায়গায় কাজ করার সময় অ্যান্ড্রয়েড SDK এর কোনো কিছু নিয়েই চিন্তা করতে হয় না। এই আর্কিটেকচার পছন্দ করা আমাদের জন্য ভাল সিদ্ধান্ত ছিল।
LiveData
ViewModel আর View এর মধ্যে ডেটার আদান প্রদানের জন্য জন্য LiveData ইউজ করেছি। ভিউ থেকে ডেটার জন্য ভিউ মডেলে কল করা হয়। ভিউ এরপর লাইভডেটাকে অবজার্ভ করে বসে থাকে। যখন লাইভডেটাতে ডেটা আসে তখন সেই ডেটার উপর প্রয়োজনীয় কাজ করা হয়।
Data Binding
আমাদের অ্যাপের হোম পেজে অনেক ডেটা শো করতে হয়। এগুলোকে Kotlin ক্লাস থেকে সেট না করে data binding ইউজ করে xml থেকেই সেট করা হয়েছে। এতে কোডের পরিমাণ খানিকটা কমেছে। প্রোজেক্টের কোথাও কোথাও ডেটা বাইন্ডিং ইউজ করে xml থেকে ডেটা সেট করা হয়েছে। কোথাও আবার kotlin কোড থেকে programmatically data set করা হয়েছে। যেখানে যেটা সুবিধাজনক মনে হয়েছে সেটা করেছি।
RxJava2 – Reactive Programming
ViewModel আর Repository এর মধ্যের ডেটা আদান-প্রদান এবং রিপোজিটরির সাথে local data source ও remote data source layer-গুলোর ডেটা আদান-প্রদানের জন্য RxJava2 ব্যবহার করেছি। নেটওয়ার্ক কলগুলো হ্যান্ডেল করা হয়েছে Rx দিয়ে। প্রায় পুরো অ্যাপেই Reactive Programming Paradigm ইমপ্লিমেন্ট করা হয়েছে। ২-১ টা ছোট জায়গা ছাড়া প্রায় সব জায়গাতেই ডেটা ফেচ করার জন্য কল দিয়ে কলব্যাকের জন্য বসে থাকা হয় নাই। বরং ডেটার জন্য মেথড কল দিয়ে নির্দিষ্ট observable-কে observe করে রাখা হয়েছে।
Dagger2 – Dependency Injection
ডেভেলপমেন্ট প্রসেসকে অনেক বেশি ফাস্টার আর স্মুথ করেছে এই dagger! শুরুতে জাস্ট কয়েকটা ক্লাস লিখে কনফিগার করে রাখা। এরপর মনের সুখে খালি ক্লাসগুলো ইউজ করা! আপনি একবার যদি একটা লাইভ প্রোজেক্টে একবার মাত্র ড্যাগার ইউজ করেন, আপনি এটার প্রেমে পড়ে যাবেন। পরের কোনো প্রোজেক্ট ছোট হোক বড় হোক, ইচ্ছাই করবে না ড্যাগার ইউজ না করে অন্য ভাবে কাজ করার। তাই যারা অ্যান্ড্রয়েড নিয়ে ১-২ বছর অলরেডি কাজ করে ফেলেছেন তাদের উচিত ডিপেন্ডেন্সি ইঞ্জেকশন ব্যবহার করতে জানা।
আমাদের কোনো ViewModel এ কোনো রিপোজিটরি প্রয়োজন হলে ভিউমডেলের কনস্ট্রাক্টরে জাস্ট ঐ রিপোজিটরির নাম লিখে দেই। ব্যস ঐ রিপো দিয়ে তখন কাজ করা যায়। রিপোজিটরির ভিতরে কোনো একটা লোকাল ডেটা সোর্স বা রিমোট ডেটা সোর্সের প্রয়োজন হল। কোনো কনক্রিট ইমপ্লিমেন্টেশনের বালাই নাই। কন্সট্রাক্টরে ১ লাইনের কোড লিখে দেই যে কোন ডেটা সোর্স দরকার। কোথাও Application context দরকার হলো। কোথা থেকে আসবে না আসবে কোনো চিন্তা নাই। Constructor এ খালি বলে দেই যে আমার কনটেক্সট দরকার।
তাই এই জিনিস ইউজ না করে বড় প্রোজেক্ট ডেভেলপ করলে সেটা সামলাতে কষ্ট হওয়ারই কথা। অনেকেই হয়ত বলবেন ক্লায়েন্ট সময় দেয় না, ম্যানেজার প্রোজেক্ট দেয়ার পর দিন থেকে আউটপুট দেখতে চায়। তাদেরকে বলব আপনার নিজের প্রয়োজনেই দরকার হলে উইকেন্ডে বাসায় বসে ড্যাগারের বয়লারপ্লেট বানান। এটা প্রোজেক্টের শুরুতে ১ দিন সময় নিবে। পুরো প্রোজেক্ট যত দিন চলবে প্রতি দিনই হয়ত ৩০-৬০ মিনিট বা আরো বেশি বাঁচিয়ে দিবে। গুগলে সার্চ করলে অনেক রেডি boilerplate code পাবেন। চাইলে এই প্রোজেক্টের ডেভেলপার শাফায়েতের গিটহাবে থাকা helloworld repository টি দেখতে পারেন। এখানে ও একটা প্রোজেক্ট শুরু করার জন্য আমাদের যেসব কাজ রেগুলার করতে হয় সবগুলো লিখে রেখেছে। আমাদের প্রোজেক্টটাও বলা চলে এই HelloWorld প্রোজেক্টের উপর দাঁড় করানো।
Room – Persistent Library
অ্যাপের ডেটাগুলো আমরা আগের মত আর স্ট্রিং বা অ্যাসেট ফাইলে রাখি না। চাইলে SQLite database ব্যবহার করতে পারতাম। কিন্তু সেটা না করে Room ব্যবহার করেছি। এতে কাজ করা অনেক সুবিধাজনক হয়েছে।
Retrofit2 & Firebase
প্রোজেক্টের প্রথম দিকে Retrofit network library ইউজ করার প্রয়োজন ছিল না। কারণ সব ডেটা ফায়ারবেজ থেকেই আসত। কিন্তু পরবর্তীতে ইউজার বেড়ে যাওয়ায় ধারণা করছিলাম যে মাসিক ১০ জিবি ব্যান্ডউইথের ফ্রি লিমিট ক্রস হয়ে যেতে পারে এ বছর। তাই মূল ডেটাগুলো অন্য জায়গায় রেখেছি। ফায়ারবেজে রেখেছি শুধু ডেটা সোর্সের লিংকগুলো। আর সাথে last modified timestamp.
ইউজার যখন অ্যাপ ওপেন করে, তখন ফায়ারবেজ থেকে কয়েক কিলোবাইট ডেটা খরচ করে আপডেট নিয়ে আসে যে কোনো ডেটা সোর্সের টাইমস্ট্যাম্প আপডেট হয়েছে কিনা। কোনো একটা সোর্স আপডেট হলেই কেবল ঐ লিংকে হিট করে HTTP রিকোয়েস্টের মাধ্যমে ডেটা নিয়ে আসা হয়। এজন্য Retrofit ও RxJava2 একত্রে ব্যবহার করেছি।
আর ডেটাগুলো নিয়ে আসার পর সেগুলোকে Room এ রেখে দিচ্ছি পরবর্তীতে ব্যবহার করার জন্য। এভাবে চেষ্টা করেছি ইউজারদের ডেটা খরচ কমানোর জন্য। তবুও ২-১ জন অতি বুদ্ধিজীবি ইউজার আশংকা করেন আমরা তাদের অ্যাপে মাঝেমধ্যে ফোর্স আপডেট করি। এটার পিছনে আমাদের পয়সা কামানোর ধান্দা থাকতে পারে। জিপি, বাংলালিংক, রবি ইত্যাদির কোম্পানিগুলোর ডেটা মানুষ ইউজ করে। অ্যাপ আপডেট করালে এসব কোম্পানি টাকা পায়। আমরা ঐসব কোম্পানির সাথে লিয়াজো করে সেখান থেকে পার্সেন্টেজ কামাই। এরকম নিনজা টেকনিক এই দেশের মানুষের মাথাতেই আসা সম্ভব! কোন লেভেলের মানুষদের জন্যে যে কাজ করতেছি ভাবি মাঝে মধ্যে। অ্যাপে একজন নাকি একটা ভুল পেয়েছে। এজন্য সে আশংকা করছে আমরা ইহুদীদের চক্রান্তের অংশ হিসাবে অ্যাপ বানাচ্ছি কিনা। Major bug ধরা পড়লে ভুল শুধরে ফোর্স আপডেট দিলে আবার হয়ে যাব মোবাইল অপারেটরের থেকে পার্সেন্টেজখোর। হাউ কিউট সিচুয়েশন!!! তাই বাঙ্গালীর জন্য ফ্রি কিছু করতে গেলে আগে ১০০ বার ভেবে নিবেন। বঙ্গবাসীর জন্য এটাই আমার শেষ “ঘরের খেয়ে বনের মোষ তাড়ানো” টাইপ অ্যাপ।
Firebase Push Notification
আমাদের অ্যাপে নিয়মিত বিভিন্ন বিষয়ে পুশ নোটিফিকেশন পাঠানো হয়। এজন্য Firebase Push Notification সার্ভিসটি ব্যবহার করি। PHP দিয়ে লিখা একটা পেজ আছে। সেখান থেকে নোটিফিকেশন সেন্ড করি। ইউজারের ফোনে সেটা স্টোর থাকে। Room এ সেভ করে রাখি নোটিফিকেশনের কনটেন্ট। ফলে একটা নোটিফিকেশন একবার পড়ে ফেললে অফলাইনেও সেটা পরে পড়া যায়।
Unit Testing – The Unsung Hero
এই প্রোজেক্টের ডেটাগুলো খুব সেন্সিটিভ। অর্থাৎ এর অ্যাকুরেসি হতে হবে অন্তত ৯৯%। এজন্য ডেটার শুদ্ধতা নিশ্চিত করার জন্য আমরা এই প্রোজেক্টে unit testing লিখেছি। এই প্রোজেক্টে আগে বাংলা মাসের তারিখ দেখানো হত না। যখন বাংলা মাসের তারিখের ফিচারটা শুরু করব, তার আগেই এটার জন্য ইউনিট টেস্ট লিখেছিলাম। প্রায় ৫০ টা টেস্ট কেস দিয়ে টেস্ট করে সবগুলো টেস্ট কেস পাস করার পরই নিশ্চিত হই বাংলা তারিখ দেখাতে ইনশাআল্লাহ কোনো ভুল করবে না।
একই ভাবে, লোকেশন অনুযায়ী সূর্যোদয়-সূর্যাস্ত ও সালাতের সময়সূচীগুলো দিন তারিখ অনুযায়ী ঠিক আছে কিনা সেগুলোও ইউনিট টেস্টিংয়ের মাধ্যমে যাচাই করা হয়েছে। দ্রুত রিলিজের প্রেশারের কারণে এক পর্যায়ে টেস্টিংয়ের দিক থেকে মূল ডেভেলপমেন্টে সরে আসি। এতে দেখা গেছে অনেক বাগ-ভাল্লুকের অস্তিত্ব পরবর্তীতে ধরা পড়েছে।
তাই আমাদের আগামী ৬ মাসের পরিকল্পনা হচ্ছেঃ এই প্রোজেক্টে সামনের ৬ মাস আম জনতার জন্য কোনো কাজ করব না। তাদেরকে পর্যাপ্ত ফিচার দেয়া হয়েছে। অনেক কাজ তাদের জন্য করেছি। এবার সামনের ৬ মাস নিজেদের জন্য কাজ করব। আর তা হচ্ছে এই প্রোজেক্টের সেন্সিটিভ যত ডেটা আছে, এগুলোর জন্য টেস্ট কেস লিখব। শাফায়াত বলল হোম পেজে যে নামাজের সময় দেখানো হচ্ছে, এগুলোর মধ্যে প্রায় ৫০টার মত কেস আছে যেগুলো কোডে হ্যান্ডেল করতে হয়েছে। প্রতিটা কেসের জন্য success test case ও failure test case লিখব ইনশাআল্লাহ। এই প্রোজেক্টটাকে আমরা নিয়েছি আমাদের এক্সপেরিমেন্টের একটা উত্তম মাধ্যম হিসাবে। তাই নতুন নতুন যা শেখা হচ্ছে সেগুলো ইনশাআল্লাহ আস্তে আস্তে এখানে ইমপ্লিমেন্ট করব।
Git – Version Control System
প্রোজেক্টের শুরু থেকেই অর্থাৎ ২০১৫ সাল থেকেই আমরা এই প্রোজেক্টের ভার্সন কন্ট্রোলিংয়ের জন্য গিট ব্যবহার করে আসছি। তখন চার জন কাজ করতাম এজন্য গিট ইউজ করা ছিল খুবই জরুরি। তখন যদিও গিটে একদমই অভ্যস্থ ছিলাম না। সানীকে ফোন দিয়ে বলতাম “সানী! আমি পুশ দিছি। তুমি প্রোজেক্টের ব্যাকাপ zip করে রেখে পুল নাও!” 😀 😀 😀
এখনও গিট ইউজ করছি। তবে এখন আর ব্যাকাপ নিয়ে পুল নিতে হয় না। ২ জন কাজ করি এখন এই প্রোজেক্টে। সাধারণত pull request দিয়ে আমরা একজনের কোড আরেকজন রিভিউ করি। এরপরই কেবল কোড মাস্টারে মার্জ হয়। চেষ্টা করি প্রতিটা কমিট মেসেজ সুন্দর করে লিখার। পুল রিকোয়েস্টের জন্য একটা টেমপ্লেট বানিয়ে রেখেছি। যেন কেউ PR দিলে নির্দিষ্ট ফরমেটে যথাযথ ভাবে ব্যাখ্যা করে দেয়া যায় কী কী কাজ করা হলো, কেন করা হলো?
Trello – Project Management Tools
প্রোজেক্টের যত কাজ আছে, বা যত বাগ আছে এগুলো ট্র্যাক করার জন্য ট্রেলো ইউজ করি। আমাদের এই প্রোজেক্টের জন্য যে ট্রেলো বোর্ড আছে সেটা সম্ভবত ২০১৭-১৮ তে খোলা। তখন অ্যাড করা কিছু কার্ড এখনো আমাদের ব্যাকলগে আছে। যেগুলো করার মত সুযোগ এখনো হয় নাই। আল্লাহ তাওফিক দিলে ২০২১-২০২২ সাল নাগাদ ব্যাকলগের ফিচার লিস্টটা হয়ত ছোট হবে। অফিসের উইকেন্ড আর ফজরের নামাজের পর থেকে অফিস শুরু করার আগ পর্যন্ত এই সময়টুকুই মূলত এই অ্যাপের জন্য বরাদ্দ থাকে। তাই তাড়াহুড়া নাই, কোনো প্রেশারও নাই। আগামী কয়েক মাসের লম্বা সময় ধরে শুধু কোডবেজ রিফ্যাক্টর করব আর ইউনিট টেস্ট লিখব ইনশাআল্লাহ।
শেষ কথা
অ্যাপটির সাথে আমার অনেক স্মৃতি। অনেক মানুষের সাথে সম্পৃক্ত হয়েছি এর মাধ্যমে। শুধু ডেভেলপ করার জন্য ডেভেলপ করা না। এই অ্যাপের জন্য যে পরিমাণ ইসলামি বিষয় নিয়ে পড়াশোনা করতে হয়েছে আর এখনো করতে হয় এজন্য আল্লাহর শুকরিয়া আদায় করি। এখান থেকে আমার পয়সা কামানো উদ্দেশ্য না। উদ্দেশ্য কিছু মানুষের মাঝে হলেও ইসলামের দাওয়াত পৌঁছে দেয়া। অ্যাপটা ডেভেলপ করতে গিয়ে দেখেছি দেশের বেশির ভাগ মানুষই ইসলামের নূন্যতম জ্ঞান রাখেন না। অ্যাপে আমরা যেসব কনটেন্ট দিয়েছি এগুলোকে তারা মনে করেন ভুল। এত বেশি মিস কনসেপশন নিয়ে মানুষ দিন যাপন করেন তার সীমা নাই। পাঁচ ওয়াক্ত নামাজের ওয়াক্ত কোন সময় কোনটা হয়, কোন ওয়াক্তের সময় কতক্ষণ থাকে সেটা বেশির ভাগ মানুষই জানেন না। আমরা অনার্স মাস্টার্স পাশ করি। প্রোজেক্টের পর প্রোজেক্ট করি, মুভির পর মুভি দেখি, টিভি সিরিজের আলোচনায় আমাদের আড্ডা মুখর থাকে। শুধু কুরআনটা কখনোও পড়ে দেখার কথা মনেও করি না। মনে করি এটা হুজুরদের কাজ! না ভাই! ইসলাম কোনো পুরহিততান্ত্রিক ধর্ম নয়। এটা এমন ধর্ম নয় যার দায়িত্ব শুধু পুরোহিতের। তাই আসুন দুনিয়ার চিন্তা করার পাশাপাশি একটু কবরের চিন্তাও করি।
আমাদের প্রোজেক্টের স্ট্রাকচার, আর্কিটেকচার বা যে কোনো আইডিয়ায় কোনো রকম পরিবর্তন বা আরো অপটিমাইজেশনের প্রয়োজন অনুভব করলে অনুগ্রহ করে কমেন্ট করে বা আমাকে মেসেজ করে জানাতে পারেন। সেটাও এই সাদকায়ে জারিয়ার মত একটি প্রোজেক্টে আপনার কনট্রিবিউশন হিসাবে আল্লাহ কবুল করবেন ইনশাআল্লাহ। এছাড়া যে কোনো বিষয়ে আপনার মতামত ও পরামর্শ একান্ত কাম্য। ধন্যবাদ।
আলহামদুলিল্লাহ। খুবই সুন্দর রিভিউ। গত ৩ মাস অ্যাপটি ব্যবহার করছি। প্রতিদিনই ভাবতাম এই কাজটা কিভাবে হল। ওটা কিভাবে হল। আজ জেনে খুবই ভালো লাগছে। এবং আমার একটা প্রোজেক্টের কাজে কিছু ব্যাপারে দ্বিধাদ্বন্দ্বে ছিলাম। অনেক কিছুরই ডিরেকশন পেলাম এখান থেকে। আল্লাহ আপনার এই উদ্যোগ কবুল করুন। জাযাকাল্লাহ।
আমীন।
আলহামদুলিল্লাহ ভাই। আমি অনেক দিন থেকেই ভাবলিছলাম আসলে App টা backend কিভাবে কাজ করে সেটা বুঝার জন্য। আজ সেটা জানতে পারলাম। ভাই আমি Flutter শিখতেছি বিগত ৬ মাস যাবত। এখন Native Android শেখা শুরু করতে চাচ্ছি। কিছুটা ফ্রাস্টেশন ভুগতেছি কি করবো?
Love and respect for you guys. May Allah reward you with good. I, with my friends and family use it whole year.
ভাইয়া, লিখাটা পরে ভালো লাগলো . আপনি অলমোস্ট সব লেটেস্ট লাইব্রেরি এ ব্যবহার করসেন এই app এ . সাথে কটলিন কোরুটিং ব্যবহার করলে পরিপূর্ন হয়ে যেত 😛 . যদি ব্যবহার করে থাকেন তাহলে গ্রেট 😀
আমরা এখানে Coroutines ব্যবহার করি নাই। RxJava ইউজ করেছি।
Assalamulaikum Bhaiya. I was looking exactly for such kind of content. Very grateful to you. Keep writing such kind of clean and clear contents. And Bhaiya if you don’t mind I would like to say that the UI seems to complicated and overwhelming. If possible try to make it look simpler because at first user might get overwhelmed with too much information.
I agree with you. We are working with this data overflow issue. Hope we will fix it soon.
Many Many Thanks Bhaiya😀😀😀😀
আলহামদুলিল্লাহ। আপনার রিভিউ অনেক সুন্দর ছিল। আমার একটি বিষয় আপনার থেকে জানার ছিলো। নামাজের ওয়াক্তের সময় বর্তমানে কি আপনারা Current Location নিয়ে রিমোট API কল করে নিয়ে আসেন নাকি ম্যানুয়ালি অন্য কোন উপায়ে?
অ্যাপের মাঝেই ক্যালকুলেশন হয়। রিমোট কোনো API call হয় না।
আসসালামু আলাইকুম। অ্যাপে প্রতিদিন একটা নির্দিষ্ট সময়ে নোটিফিকেশন ফায়ার হয় অফলাইনে অ্যাপ সম্পূর্ণভাবে কিলড থাকলেও। এটা কিভাবে করা যায়? সাধারণত অ্যাপ মেমোরিতে না থাকলে নোটিফিকেশন ফায়ার করার ক্ষেত্রে ডিফিকাল্টি ফেস করছি আমার একটি কাজে। এ ব্যাপারে কোন রিসোর্স যদি শেয়ার করতেন কাইন্ডলি। জাযাকাল্লাহ।