সব জায়গায় গুডনোট

গুডনোটস বিপণন চিত্র একজন মহিলাকে একটি আইপ্যাডে পণ্য ব্যবহার করে দেখাচ্ছে৷

গত দুই বছর ধরে, গুডনোটস ইঞ্জিনিয়ারিং টিম সফল আইপ্যাড নোটটেকিং অ্যাপটিকে অন্যান্য প্ল্যাটফর্মে আনার জন্য একটি প্রকল্পে কাজ করছে। এই কেস স্টাডিটি কভার করে যে কিভাবে 2022 সালের iPad অ্যাপটি ওয়েব প্রযুক্তি দ্বারা চালিত ওয়েব, ChromeOS, Android এবং Windows-এ পেল এবং WebAssembly একই সুইফট কোড পুনরায় ব্যবহার করে দলটি দশ বছরেরও বেশি সময় ধরে কাজ করছে।

গুডনোটস লোগো।

গুডনোটস কেন ওয়েব, অ্যান্ড্রয়েড এবং উইন্ডোজে এসেছে

2021 সালে Goodnotes শুধুমাত্র iOS এবং iPad এর জন্য একটি অ্যাপ হিসেবে উপলব্ধ ছিল। গুডনোটসের ইঞ্জিনিয়ারিং দল একটি বিশাল প্রযুক্তিগত চ্যালেঞ্জ গ্রহণ করেছে: গুডনোটসের একটি নতুন সংস্করণ তৈরি করা কিন্তু অতিরিক্ত অপারেটিং সিস্টেম এবং প্ল্যাটফর্মের জন্য। পণ্যটি সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ হওয়া উচিত এবং iOS অ্যাপ্লিকেশনের মতো একই নোট রেন্ডার করা উচিত। পিডিএফ-এর উপরে তোলা যেকোন নোট, বা সংযুক্ত যেকোন ছবি সমতুল্য হওয়া উচিত এবং iOS অ্যাপটি যে স্ট্রোক দেখায় সেই একই স্ট্রোক দেখাতে হবে। যে কোনো স্ট্রোক যোগ করা উচিত iOS ব্যবহারকারীরা যে টুল তৈরি করতে পারে তার সমতুল্য, ব্যবহারকারী যে টুলটি ব্যবহার করছেন তা থেকে স্বাধীন—উদাহরণস্বরূপ, পেন, হাইলাইটার, ফাউন্টেন পেন, শেপ বা ইরেজার।

হাতে লেখা নোট এবং স্কেচ সহ Goodnotes অ্যাপের পূর্বরূপ।

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

আইওএসের জন্য বৈশিষ্ট্যগুলি যোগ করার জন্য পণ্যটি ইতিমধ্যে বেশ কয়েকটি আকর্ষণীয় চ্যালেঞ্জ সমাধান করেছে:

  • নোট রেন্ডারিং।
  • নথি এবং নোট সিঙ্ক্রোনাইজেশন।
  • দ্বন্দ্ব-মুক্ত প্রতিলিপিকৃত ডেটা টাইপ ব্যবহার করে নোটের জন্য দ্বন্দ্ব সমাধান।
  • এআই মডেল মূল্যায়নের জন্য ডেটা বিশ্লেষণ।
  • বিষয়বস্তু অনুসন্ধান এবং নথি সূচীকরণ.
  • কাস্টম স্ক্রোলিং অভিজ্ঞতা এবং অ্যানিমেশন।
  • সমস্ত UI স্তরগুলির জন্য মডেল বাস্তবায়ন দেখুন৷

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

গুডনোটস' প্রযুক্তি স্ট্যাক

সৌভাগ্যবশত, ওয়েবে বিদ্যমান সুইফট কোড পুনরায় ব্যবহার করার একটি উপায় ছিল—WebAssembly (Wasm)। Goodnotes ওপেন সোর্স এবং সম্প্রদায়-রক্ষণাবেক্ষণ করা প্রকল্প SwiftWasm এর সাথে Wasm ব্যবহার করে একটি প্রোটোটাইপ তৈরি করেছে। SwiftWasm এর সাথে Goodnotes টিম ইতিমধ্যেই প্রয়োগ করা সমস্ত Swift কোড ব্যবহার করে একটি Wasm বাইনারি তৈরি করতে পারে। এই বাইনারিটি অ্যান্ড্রয়েড, উইন্ডোজ, ক্রোমওএস এবং অন্যান্য অপারেটিং সিস্টেমের জন্য প্রগতিশীল ওয়েব অ্যাপ্লিকেশন হিসাবে পাঠানো একটি ওয়েব পৃষ্ঠাতে অন্তর্ভুক্ত করা যেতে পারে।

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

লক্ষ্য ছিল গুডনোটগুলিকে PWA হিসাবে প্রকাশ করা এবং প্রতিটি প্ল্যাটফর্মের দোকানে এটি তালিকাভুক্ত করতে সক্ষম হওয়া। সুইফ্ট ছাড়াও, ইতিমধ্যেই iOS-এর জন্য ব্যবহৃত প্রোগ্রামিং ভাষা, এবং WebAssembly ওয়েবে সুইফ্ট কোড চালানোর জন্য ব্যবহৃত, প্রকল্পটি নিম্নলিখিত প্রযুক্তিগুলি ব্যবহার করেছে:

  • TypeScript: ওয়েব প্রযুক্তির জন্য সর্বাধিক ব্যবহৃত প্রোগ্রামিং ভাষা।
  • প্রতিক্রিয়া এবং ওয়েবপ্যাক: ওয়েবের জন্য সবচেয়ে জনপ্রিয় ফ্রেমওয়ার্ক এবং বান্ডলার।
  • PWA এবং পরিষেবা কর্মীরা: এই প্রকল্পের জন্য বিশাল সক্ষমকারী কারণ দলটি আমাদের অ্যাপটিকে একটি অফলাইন অ্যাপ্লিকেশন হিসাবে পাঠাতে পারে যা অন্য যেকোন iOS অ্যাপের মতো কাজ করে এবং আপনি এটি স্টোর বা ব্রাউজার থেকে ইনস্টল করতে পারেন।
  • PWABuilder: মূল প্রকল্প গুডনোট PWA কে একটি নেটিভ উইন্ডোজ বাইনারিতে মোড়ানোর জন্য ব্যবহার করে যাতে দলটি Microsoft স্টোর থেকে আমাদের অ্যাপ বিতরণ করতে পারে।
  • বিশ্বস্ত ওয়েব অ্যাক্টিভিটিস: সবচেয়ে গুরুত্বপূর্ণ অ্যান্ড্রয়েড প্রযুক্তি যেটি কোম্পানী আমাদের PWA কে একটি নেটিভ অ্যাপ্লিকেশান হিসেবে বিতরণ করতে ব্যবহার করে।

সুইফট, ওয়াসম, রিঅ্যাক্ট এবং পিডব্লিউএ নিয়ে গঠিত গুডনোটস টেক স্ট্যাক।

নিম্নলিখিত চিত্রটি ক্লাসিক টাইপস্ক্রিপ্ট এবং প্রতিক্রিয়া ব্যবহার করে কী প্রয়োগ করা হয়েছে এবং SwiftWasm এবং ভ্যানিলা জাভাস্ক্রিপ্ট, Swift এবং WebAssembly ব্যবহার করে কী প্রয়োগ করা হয়েছে তা দেখায়। প্রকল্পের এই অংশটি JSKit ব্যবহার করে, সুইফটের জন্য একটি JavaScript আন্তঃঅপারেবিলিটি লাইব্রেরি এবং WebAssembly টিম ব্যবহার করে আমাদের সুইফ্ট কোড থেকে আমাদের এডিটর স্ক্রীনে DOM পরিচালনা করার জন্য যখন প্রয়োজন হয় বা এমনকি কিছু ব্রাউজার-নির্দিষ্ট API ব্যবহার করে।

মোবাইল এবং ডেস্কটপে অ্যাপের স্ক্রিনশটগুলি Wasm দ্বারা চালিত নির্দিষ্ট অঙ্কন এলাকা এবং প্রতিক্রিয়া দ্বারা চালিত UI এলাকাগুলি দেখায়।

কেন Wasm এবং ওয়েব ব্যবহার করবেন?

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

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

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

পুনরাবৃত্তিমূলক পণ্য উন্নয়ন

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

দুটি অ্যাপ স্ক্রিনশট শুধুমাত্র পঠন থেকে সম্পূর্ণ বৈশিষ্ট্যযুক্ত পণ্যে যাওয়ার প্রতীক।

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

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

প্রাথমিক বাধা

এই প্রকল্পে কাজ করা বিভিন্ন দৃষ্টিকোণ থেকে সুপার চ্যালেঞ্জিং ছিল। দলটি প্রথম যে বাধাটি খুঁজে পেয়েছিল তা ছিল সুইফটওয়াসম টুলচেনের সাথে সম্পর্কিত। টুলচেনটি দলের জন্য একটি বিশাল সক্ষমকারী ছিল, কিন্তু সমস্ত iOS কোড Wasm-এর সাথে সামঞ্জস্যপূর্ণ ছিল না। উদাহরণ স্বরূপ, IO বা UI-এর সাথে সম্পর্কিত কোড—যেমন ভিউ, API ক্লায়েন্ট, বা ডাটাবেসে অ্যাক্সেসের প্রয়োগ পুনঃব্যবহারযোগ্য ছিল না, তাই দলটিকে অ্যাপের নির্দিষ্ট অংশগুলিকে পুনরায় ব্যবহার করতে শুরু করতে হবে। প্ল্যাটফর্ম সমাধান। দলটি তৈরি করা বেশিরভাগ পিআর ছিল বিমূর্ত নির্ভরতার রিফ্যাক্টর যাতে দল পরে নির্ভরতা ইনজেকশন বা অন্যান্য অনুরূপ কৌশল ব্যবহার করে তাদের প্রতিস্থাপন করতে পারে। iOS কোড মূলত মিশ্র ব্যবসায়িক যুক্তি যা Wasm-এ প্রয়োগ করা যেতে পারে ইনপুট/আউটপুট এবং ব্যবহারকারী ইন্টারফেসের জন্য দায়ী কোড সহ যা Wasm-এ প্রয়োগ করা যায়নি কারণ Wasmও সমর্থন করে না। সুইফ্ট বিজনেস লজিক প্ল্যাটফর্মগুলির মধ্যে পুনরায় ব্যবহার করার জন্য প্রস্তুত হয়ে গেলে IO এবং UI কোড টাইপস্ক্রিপ্টে পুনরায় প্রয়োগ করা দরকার।

কর্মক্ষমতা সমস্যা সমাধান

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

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

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

  • ভারী অ্যালগরিদমের জন্য ঘন ঘন ওয়েব কর্মীদের ব্যবহার করে মূল থ্রেডটি আরও অফলোড করুন।
  • শুরু থেকেই JS-Swift ইন্টারপ লাইব্রেরির পরিবর্তে রপ্তানিআমদানিকৃত ফাংশন ব্যবহার করুন যাতে তারা Wasm প্রসঙ্গ থেকে বেরিয়ে আসার কার্যক্ষমতার প্রভাব কমাতে পারে। এই জাভাস্ক্রিপ্ট ইন্টারপ লাইব্রেরিটি DOM বা ব্রাউজারে অ্যাক্সেস পেতে সহায়ক তবে এটি নেটিভ Wasm এক্সপোর্ট করা ফাংশনগুলির চেয়ে ধীর।
  • নিশ্চিত করুন যে কোডটি হুডের নীচে OffscreenCanvas ব্যবহারের অনুমতি দেয় যাতে অ্যাপটি মূল থ্রেডটি অফলোড করতে পারে এবং নোট লেখার সময় অ্যাপ্লিকেশনগুলির কার্যক্ষমতা সর্বাধিক করে এমন একটি ওয়েব কর্মীর কাছে ক্যানভাস API-এর সমস্ত ব্যবহার সরাতে পারে৷
  • সমস্ত Wasm-সম্পর্কিত এক্সিকিউশনকে একজন ওয়েব কর্মী বা এমনকি ওয়েব কর্মীদের একটি পুলে নিয়ে যান যাতে অ্যাপটি মূল থ্রেড কাজের চাপ কমাতে পারে।

পাঠ্য সম্পাদক

আরেকটি আকর্ষণীয় সমস্যা একটি নির্দিষ্ট টুল, পাঠ্য সম্পাদকের সাথে সম্পর্কিত ছিল। এই টুলের জন্য iOS বাস্তবায়ন NSAttributedString এর উপর ভিত্তি করে, হুডের নিচে RTF ব্যবহার করে একটি ছোট টুলসেট। যাইহোক, এই বাস্তবায়নটি SwiftWasm-এর সাথে সামঞ্জস্যপূর্ণ নয় তাই ক্রস-প্ল্যাটফর্ম টিমকে প্রথমে RTF ব্যাকরণের উপর ভিত্তি করে একটি কাস্টম পার্সার তৈরি করতে বাধ্য করা হয়েছিল এবং পরে RTF কে HTML-এ রূপান্তরিত করে সম্পাদনার অভিজ্ঞতা বাস্তবায়ন করতে হয়েছিল এবং এর বিপরীতে। ইতিমধ্যে, iOS টিম একটি কাস্টম মডেলের সাথে RTF-এর ব্যবহার প্রতিস্থাপন করে এই টুলটির জন্য নতুন বাস্তবায়নে কাজ শুরু করেছে যাতে অ্যাপটি একই সুইফট কোড শেয়ার করা সমস্ত প্ল্যাটফর্মের জন্য বন্ধুত্বপূর্ণ উপায়ে স্টাইল করা পাঠ্য উপস্থাপন করতে পারে।

গুডনোটস টেক্সট এডিটর।

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

পুনরাবৃত্তিমূলক রিলিজ

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

অফলাইন কাজ

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

গুডনোটস অ্যাপ অফলাইনে কাজ করছে।

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

ওয়েবে সুইফট ব্যবহার করার সময় সুপারিশ

আপনার যদি অনেক কোড সহ একটি iOS অ্যাপ্লিকেশন থাকে যা আপনি পুনরায় ব্যবহার করতে চান তবে প্রস্তুত হন কারণ আপনি একটি অবিশ্বাস্য যাত্রা শুরু করতে চলেছেন৷ আপনি শুরু করার আগে কিছু টিপস আপনার কাছে আকর্ষণীয় মনে হতে পারে।

  • আপনি কি কোড পুনরায় ব্যবহার করতে চান তা পরীক্ষা করুন। যদি আপনার অ্যাপের ব্যবসায়িক যুক্তি সার্ভারের দিকে প্রয়োগ করা হয়, তাহলে সম্ভবত আপনি আপনার UI কোড পুনরায় ব্যবহার করতে পছন্দ করবেন এবং Wasm আপনাকে এখানে সাহায্য করবে না। দলটি সংক্ষিপ্তভাবে Tokamak- এর দিকে নজর দিয়েছে, WebAssembly এর সাথে ব্রাউজার অ্যাপ তৈরির জন্য একটি SwiftUI- সামঞ্জস্যপূর্ণ কাঠামো, কিন্তু এটি অ্যাপের প্রয়োজনের জন্য যথেষ্ট পরিপক্ক ছিল না। যাইহোক, যদি আপনার অ্যাপে ক্লায়েন্ট কোডের অংশ হিসাবে শক্তিশালী ব্যবসায়িক যুক্তি বা অ্যালগরিদম প্রয়োগ করা হয়, Wasm আপনার সেরা বন্ধু হবে।
  • আপনার সুইফট কোডবেস প্রস্তুত আছে তা নিশ্চিত করুন। UI স্তরের জন্য সফ্টওয়্যার ডিজাইন প্যাটার্ন বা নির্দিষ্ট আর্কিটেকচার যা আপনার UI যুক্তি এবং আপনার ব্যবসায়িক যুক্তির মধ্যে একটি শক্তিশালী বিচ্ছেদ তৈরি করে তা সত্যিই কার্যকর হবে কারণ আপনি UI স্তর বাস্তবায়ন পুনরায় ব্যবহার করতে পারবেন না। ক্লিন আর্কিটেকচার বা ষড়ভুজ স্থাপত্যের নীতিগুলিও মৌলিক হবে, কারণ আপনাকে সমস্ত IO-সম্পর্কিত কোডের জন্য ইনজেকশন এবং নির্ভরতা প্রদান করতে হবে এবং আপনি যদি এই আর্কিটেকচারগুলি অনুসরণ করেন যেখানে বাস্তবায়নের বিবরণকে বিমূর্ততা হিসাবে সংজ্ঞায়িত করা হয় এবং এটি করা সহজ হবে নির্ভরতা বিপরীত নীতি ব্যাপকভাবে ব্যবহৃত হয়.
  • Wasm UI কোড প্রদান করে না। অতএব, আপনি ওয়েবের জন্য ব্যবহার করতে চান এমন UI ফ্রেমওয়ার্কের বিষয়ে সিদ্ধান্ত নিন।
  • JSKit আপনাকে জাভাস্ক্রিপ্টের সাথে আপনার সুইফ্ট কোড সংহত করতে সাহায্য করবে তবে মনে রাখবেন আপনার যদি হটপাথ থাকে, তাহলে JS-সুইফ্ট ব্রিজ অতিক্রম করা ব্যয়বহুল হতে পারে এবং আপনাকে এটি এক্সপোর্ট করা ফাংশনগুলির সাথে প্রতিস্থাপন করতে হবে। আপনি অফিসিয়াল ডকুমেন্টেশন এবং সুইফটে ডায়নামিক মেম্বার লুকআপ, একটি লুকানো রত্ন থেকে কীভাবে JSKit কাজ করে সে সম্পর্কে আরও শিখতে পারেন! পোস্ট
  • আপনি আপনার আর্কিটেকচারটি পুনরায় ব্যবহার করতে পারবেন কিনা তা নির্ভর করবে আপনার অ্যাপ যে আর্কিটেকচার অনুসরণ করে এবং আপনি যে অ্যাসিঙ্ক কোড এক্সিকিউশন মেকানিজম লাইব্রেরি ব্যবহার করেন তার উপর। MVVP বা কম্পোজেবল আর্কিটেকচারের মতো প্যাটার্নগুলি আপনাকে আপনার ভিউ মডেল এবং UI লজিকের অংশ পুনঃব্যবহার করতে সাহায্য করবে UIKit নির্ভরতা যা আপনি Wasm এর সাথে ব্যবহার করতে পারবেন না। RXSwift এবং অন্যান্য লাইব্রেরিগুলি Wasm-এর সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে, তাই এটি মনে রাখবেন কারণ আপনাকে OpenCombine , async/await এবং Goodnotes এর সুইফট কোডে স্ট্রীম ব্যবহার করতে হবে৷
  • জিজিপ বা ব্রোটলি ব্যবহার করে ওয়াসম বাইনারি সংকুচিত করুন। মনে রাখবেন ক্লাসিক ওয়েব অ্যাপ্লিকেশনের জন্য বাইনারিটির আকার বেশ বড় হবে।
  • এমনকি যখন আপনি PWA ছাড়া Wasm ব্যবহার করতে পারেন, নিশ্চিত করুন যে আপনি অন্তত একজন পরিষেবা কর্মীকে অন্তর্ভুক্ত করেছেন, এমনকি আপনার ওয়েব অ্যাপের কোনো ম্যানিফেস্ট না থাকলেও বা আপনি ব্যবহারকারীকে এটি ইনস্টল করতে চান না। পরিষেবা কর্মী বিনামূল্যে Wasm বাইনারি এবং সমস্ত অ্যাপ সংস্থান সংরক্ষণ করবে এবং পরিবেশন করবে যাতে ব্যবহারকারীরা যখনই আপনার প্রকল্পটি খুলবে তখন তাদের সেগুলি ডাউনলোড করতে হবে না।
  • মনে রাখবেন নিয়োগ আশার চেয়ে কঠিন হতে পারে। আপনাকে সুইফটে কিছু অভিজ্ঞতা সহ শক্তিশালী ওয়েব ডেভেলপার নিয়োগ করতে হতে পারে বা ওয়েবে কিছু অভিজ্ঞতা সহ শক্তিশালী সুইফট ডেভেলপারদের নিয়োগ করতে হবে। আপনি যদি উভয় প্ল্যাটফর্মে কিছু জ্ঞান সহ জেনারেলিস্ট ইঞ্জিনিয়ারদের খুঁজে পেতে পারেন তবে এটি দুর্দান্ত হবে

উপসংহার

চ্যালেঞ্জে পূর্ণ একটি পণ্যে কাজ করার সময় একটি জটিল প্রযুক্তিগত স্ট্যাক ব্যবহার করে একটি ওয়েব প্রকল্প তৈরি করা একটি অবিশ্বাস্য অভিজ্ঞতা। এটা কঠিন হতে যাচ্ছে, কিন্তু সম্পূর্ণরূপে মূল্য. এই পদ্ধতি ব্যবহার না করে iOS অ্যাপ্লিকেশনের জন্য নতুন বৈশিষ্ট্যগুলিতে কাজ করার সময় Goodnotes কখনই Windows, Android, ChromeOS এবং ওয়েবের জন্য একটি সংস্করণ প্রকাশ করতে পারে না। এই টেক স্ট্যাক এবং গুডনোটস ইঞ্জিনিয়ারিং টিমকে ধন্যবাদ, গুডনোটস এখন সর্বত্র, এবং দলটি পরবর্তী চ্যালেঞ্জগুলিতে কাজ চালিয়ে যাওয়ার জন্য প্রস্তুত! আপনি যদি এই প্রকল্প সম্পর্কে আরও জানতে চান, আপনি NSSpain 2023-এ গুডনোটস টিমের দেওয়া একটি আলোচনা দেখতে পারেন। ওয়েবের জন্য গুডনোটগুলি চেষ্টা করে দেখতে ভুলবেন না!