بهترین معماری برای برنامه‌های اندروید

شما برنامه‌نویس اندروید هستید؟ از چه معماری‌ای برای نوشتن نرم‌افزارهاتون استفاده میکنید؟ MVC؟ MVP؟ یا شاید هم معماری خاصی ندارید و هر جوری که دوست دارید کدها رو مینویسید؟

تست هم مینویسید؟ اگر آره چه اصولی رو تو معماری کدهاتون رعایت میکنید تا تست نوشتن آسون و یا اساسا ممکن بشه؟ و اگر تست نمینویسید چجوری میتونید مطمئن باشید که کد درستی نوشتید؟

یک سالی هست که این سوالها دغدغه منه. از آدمای زیادی پرسیدم و با برنامه‌نویسهای اندروید زیادی حرف زدم تا بفهمم هر کدومشون از چه معماری‌ای استفاده میکنند. هدف من اینه که میخوام برای برنامه‌های اندرویدیم تست بنویسم تا بتونم کارکرد صحیحشون رو گارانتی کنم. ولی تست نوشتن تو اندروید کار ساده‌ای به نظر نمیرسید. وقتی سعی میکنید کدها رو براساس MVC بنویسید منطق و UI در داخل اکتیویتی یا فرگمنتها به شدت درهم تنیده میشن و عملا خیلی وقتها تست نوشتن غیر ممکن میشه. همین شد که لزوم وجود یه معماری درست و اصولی که با ساختار برنامه‌های اندروید هم سازگار باشه رو بیشتر از قبل حس کردم و برای پیدا کردنش کفش آهنی به پا کردم!

نتایج جست‌و‌جوی من بین بقیه برنامه‌نویسها خیلی امیدوار کننده نبود! آدمها معمولا برای برنامه‌هاشون تست نمینویسن، شرکتها هم عموما به تست نوشتن اهمیت نمیدن و فرق بین کسی که برنامه‌اش رو برپایه یک معماری اصولی بنا میکنه و کسی که کدش صرفا کار میکنه رو متوجه نمیشن. همین باعث میشه که برنامه‌نویسها هم دلیلی برای نوشتن تست نداشته باشند!

جست‌و‌جوی من ادامه داشت تا به این آدم برخوردم. نوشته‌های این دختر خانم برای من شبیه نوری در تاریکی بود که بالاخره من رو به حقیقت رسوند! ایشون که یک برنامه‌نویس اندروید آلمانیه سه مطلب خیلی عالی در مدیوم نوشته و در این سه مطلب سه معماری MVC و MVP و MVVM رو بررسی کرده. اگر فرصت داشتید نوشته‌های مدیومش رو بخونید که عالیه. اما اگر نداشتید هم دیدن این پرزنتیشن تا حد زیادی بهتون ایده میده:

من این روزها تو اوقات آزادم دارم سعی میکنم روی MVVM کمی وقت بذارم به باهاش راحت شم! این کار لازم داره که با کتابخونه‌های جالبی مثل RxJava و Dagger2 کار کنم که در ابتدا باعث کندی روند پیشرفت میشن. اما سعی میکنم به زودی روی این معماری مسلط شم و اگر فرصت شد، همزمان با پیشرفت خودم، از روند کاری که میکنم مطلب بذارم تا اگر بتونم به کسایی که علاقمندند کمکی کرده باشم.

۲ نظر

هوش مصنوعی، یادگیری ماشین و از اینجور داستانا! (قسمت دوم)

تو قسمت قبلی تعریفی از هوش مصنوعی ارائه دادیم و اینجا قراره در مورد یکی از رویکردهای هوش‌ مصنوعی،‌ یعنی یادگیری ماشین صحبت کنیم.

یادگیری ماشین: یادگیری تعاریف زیادی داره. یکی از تعاریف یادگیری اینه که کارهای گذشته و تجربه‌ای که از گذشته داریم،  باعث میشه که در آینده رفتار درست‌تری داشته باشیم. سگی رو تصور کنید که بعد از انجام کاری که از نظر صاحبش کار خوبی نبود، دعوا میشه. این سگ به مرور یاد میگیره که نباید این کار رو انجام بده و آروم آروم رفتارش رو اونجوری تنظیم میکنه که مربیش بهش میگه. اینجا سگ یه راهنما داشت،‌ اما لزوما همیشه اینطور نیست و در پروسه یادگیری همیشه مربی وجود نداره. بچه‌ای رو تصور کنید که در ابتدای شناخت رنگها قرار داره و هنوز حتی اسم رنگ‌ها رو نمیدونه. این بچه به مرور و با تجربه میفهمه که مثلا رنگ‌هایی که آبی هستند یا نزدیک به آبی‌اند، با رنگهای قرمز و نزدیک به قرمز تفاوت دارند. این بچه به مرور رنگها رو توی ذهنش دسته بندی میکنه بدون اینکه کسی کمکش کرده باشه یا اسم رنگ‌ها رو یاد گرفته باشه.

یادگیری اگر مطابق با تعریف اول (همراه با راهنما) باشه، یادگیری با نظارت یا superviesed learning نام داره و اگه مطابق با تعریف دوم (بدون راهنما) باشه، یادگیری بدون نظارت یا unsupervied learning نام داره.

ما تو یادگیری ماشین کاری که میکنیم اینه که با استفاده از داده‌هایی که داریم،‌ مدلی میسازیم که با استفاده از این مدل بتونیم برای داده‌هایی که هنوز نداریم پاسخ مناسب به دست بیاریم. اجازه بدید این رو با یه مثال خیلی ساده توضیح بدم.

ادامه این نوشته

۲ نظر

هوش مصنوعی، یادگیری ماشین و از اینجور داستانا! (بخش اول)

هوش مصنوعی، یادگیری ماشین، یادگیری عمیق، شبکه‌های عصبی و ….! اینها کلمه‌هاییند که این روزها هی تو اخبار و مقاله‌های مختلف میشنویم و میبینیم. یه روز میشنویم گوگل تونسته با Deep Mind قهرمان بازی Go رو شکست بده. یه روز دیگه واتسون IBM رو میبینیم که داره غوغا میکنه و تشخیص‌های پزشکی میده. هر کدوم این کلمه‌ها ظاهرا معنای واضحی دارند. هوش مصنوعی هوشیه که مصنوعیه! یا یادگیری ماشین مثلا یه نرم‌افزاره که یاد میگیره! این تعریف‌ها اگر چه غلط نیستند، اما خیلی کلی‌اند و عملا ارزش افزوده و دانشی به ما اضافه نمیکنند. برای همین من تصمیم گرفتم این مطلب رو بنویسم و سعی کنم با بیانی راحت و ساده، کمی تو این مفاهیم عمیق‌تر شم.

ia ادامه این نوشته

یک نظر

بازی ‌X/O یادگیرنده!

امروز تصمیم گرفتم که یک کار بامزه و کوچیک تو راستای چیزی که این‌روزها درگیرشم (یادگیری ماشین) انجام بدم. کاری که تصمیم گرفتم بکنم ساختن یه بازی ساد‌ه‌ی دو نفره بود که نفر دومش کامپیوتر باشه. دلم میخواست بازیکن سمت کامپیوتر اینجوری پیاده سازی بشه که اول صرفا حرکات رندوم و فکر نشده داشته باشه و بعد از اینکه چندین بار بازی کرد و باخت، آروم آروم از تجربیات گذشته درس بگیره و یاد بگیره که قوانین بازی چجوریه و بازی رو بهتر و بهتر انجام بده. تا در نهایت به سطحی برسه که هیچوقت از هیچ انسانی نبازه.

بازی‌های مختلفی تو ذهنم بود که هر کدوم قابلیت پیاده‌سازی همچین چیزی رو داشت. اما من ترچیح میدادم به جای اینکه وقتم صرف نوشتن فضای بازی و گرافیک و … بشه، تمام تمرکزم رو بخش یادگیری ماشین و امتحان روش‌های مختلف یادگیری باشه. برای همین تصمیم گرفتم ساده‌ترین و در عین حال خاطره‌انگیز ترین بازی ممکن رو پیاده کنم: ایکس او !

هممون احتمالا با فضای این بازی آشناییم. یه صفحه ۳ در ۳ که بازیکن‌ها به ترتیب علامت مخصوص خودشون رو (X یا O) رو تو یک سلول مینویسند. در انتها بازیکنی برنده‌ست که یک سطر، یک ستون و  یا یک قطر صفحه رو از آن خود کرده باشه! اگر هم هیچ بازیکنی به این هدف نرسه و تمام ۹ سلول صفحه پر شده باشند، بازی مساوی اعلام میشه.

برای رسیدن به هدفم نیاز داشتم که بازی رو از ابتدا خودم بنویسم. برای نوشتن این بازی یه ماتریس ۳ در ۳ تعریف کردم که در واقع بیانگر صفحه بازی بود. بعد از اینکه هر کاربر یک سلول رو انتخاب کرد، علامت مخصوص اون کاربر به سلول اضافه میشه و صفحه بازی دوباره رسم میشه.

بازی‌ای که نوشتم به دو شکل قابل اجراست. شکل اولش یه بازی دو نفره‌ست که هر کدوم از نفرات به ترتیب بازی میکنه. شکل دومش هم بازی یک نفره‌ست که بازیکن با کامپیوتر بازی میکنه. تو حالت دوم، در حال حاضر کامپیوتر تمام حرکاتش رو رندوم انجام میده و این همون بخشیه‌ که قراره روش کار کنم. قراره کامپیوتر طوری برنامه‌نویسی بشه که از حرکات رندوم خودش آروم آروم یاد بگیره که باید چیکار کنه و حرکات بهتری انجام بده.

ادامه این نوشته

نظر بدید

پیاده سازی bottom sheet در اندروید

کامپوننت Bottom Sheet کامپوننتیه که اجازه میده یک ویوو از پایین صفحه به بالا کشیده بشه تا کانتنت بیشتری رو نشون بده. من اینجا قصد آموزش نحوه پیاده‌سازیش رو دارم و برای اینکه در مورد خیلی دقیقتر بخونید باید به گایدلاین‌های گوگل مراجعه کنید.

bottom sheet gif

ادامه این نوشته

یک نظر

کافه‌بازار و دسترسی به اس‌ام‌اس ها

دیشب متوجه شدم که مارکت اندرویدی ایرانی و معروف کافه بازار دسترسی جدیدی رو به اپلکیشنش اضافه کرده. در آپدیت جدید این اپلیکیشن دسترسی به SMS هم از کاربر گرفته میشه. هر اپلیکیشنی که این دسترسی رو داشته باشه میتونه رو SMS های گوشی کنترل کامل داشته باشه و تمام SMS های کاربر رو بخونه. کافه بازار طبق گفته خودش این دسترسی رو میگیره تا بتونه فعالسازی سریع حساب کاربری از طریق شماره تلفن داشته باشه. من این رو چک نکردم اما احتمالا منظورشون اینه که کسایی که تازه ثبت نام میکنند، برای فعالسازی یه کد از طریق اس‌ام‌اس بهشون ارسال میشه و خود اپلیکیشن خودکار این اس‌ام‌اس و کد داخلش رو میخونه و کاربر حتی نیازی نداره به خودش زحمت بده که یک کد چهار یا پنج رقمی رو وارد کنه.

خب حالا مشکلش چیه؟ این که خیلی چیز خوبیه که خواستن کار رو برای کاربرها راحت کنند. نه؟ اجازه بدید قبل اینکه مشکلش رو بگم، خیلی کوتاه توضیح بدم که با این دسترسی چه کارهایی میشه کرد. همین الان یه تلگرام داخل لپتاپتون نصب کنید، ولی موقع ورود و فعالسازیش شماره یکی از دوستاتون رو به جای شماره خودتون وارد کنید. تلگرام برای اون آدم یه کد اس‌ام‌اس میکنه. حالا شما تنها کاری که لازمه بکنید اینه که یه جوری به گوشی اون آدمه دسترسی داشته باشید و اون کد رو بخونید. اگه اون کد رو بخونید میتونی تمام تلگرام اون آدمه و تمام چتهاش رو تو کامپیوترتون داشته باشید. به همین راحتی.

ادامه این نوشته

۶ نظر

سوگندنامه برنامه‌نویسی!

خیلی از حرفه‌ها هستند که بعد از تکمیل تحصیلات آکادمیک و موقع فارغ‌التحصیلی سوگندنامه مخصوص خودشون رو دارند. این سوگندنامه‌ها معمولا شامل مسائل اخلاقی میشه تا اونهایی که قراره در آینده تو اون حرفه مشغول به کار بشند سوگند بخورند که به اخلاقیات اون حرفه پایبند میمونند. برای مثال ما موقع فارغ‌التحصیلی سوگندنامه مهندسی رو خوندیم. و یا پزشکها که سوگندنامه بقراط رو میخونند و سوگند میخورن که بهش وفادار باشن.

به نظرم ما برنامه‌نویس‌ها هم لازمه که سوگندنامه مخصوص خودمون رو داشته باشیم و سوگند بخوریم به برخی چیزها پایبند بمونیم. وبلاگ Clean Coder یه سوگندنامه ۹بندی آماده کرده و اسمش رو گذاشته A Programmer Oath. بد نیست همه ما برنامه‌نویس‌ها فارغ از تشریفات به این نه بند سوگند بخوریم و سعی کنیم رعایتشون کنیم! من این نه بند رو اینجا ترجمه میکنم:

من به توانایی‌های خودم سوگند میخورم که:

۱. کد مخرب تولید نکنم.

۲.کدی که تولید میکنم همیشه حاصل بهترین عملکرد و بهترین تلاش من باشه. من آگاهانه اجازه نخواهم نداد که کدی که در عملکرد و یا ساختار بد است توسعه و رشد پیدا کند.

۳.من با هر بار انتشار خروجی، یک مدرک مطمئن و سریع ارائه خواهم داد که کد من همونطوری که باید،‌ کار میکند. (مثلا براش تست مینویسم)

۴. من خروجی‌های کوچک و مستمر ارائه خواهم داد تا مطمئن شوم که باعث تاخیر در کار بقیه نمیشوم.

۵. در هر فرصت و زمانی، با تلاشی خستگی‌ناپذیر نتیجه کارم رو بهبود می‌بخشم. هرگز آنرا بدتر نخواهم کرد!

۶. من هر کاری بتوانم میکنم تا بهره‌وری خودم و سایرین را افزایش بدهم. من هرگز کاری که منجر به کاهش بهره‌وری شود نخواهم کرد. 

۷. من به طور مداوم به سایرین کمک میکنم و در صورت لزوم از سایرین کمک میگیرم. 

۸. من تخمین‌های زمانی صادقانه خواهم زد. هرگز بدون قطعیت تخمین زمانی‌ نخواهم زد. 

۹. من هیچگاه یادگیری و بهبود توانایی‌های خودم را متوقف نخواهم کرد. 

۲ نظر

نظر من در مورد فیلم تبلیغاتی اسنپ

امروز اکانت توییتر اسنپ فیلمی توییت کرد که بازخوردهای زیاد و متفاوتی داشت. کلیت فیلم همونیه که اون خانم در ابتدا توضیح میده: ساعت سه نیم صبحه و قراره چندتا از بچه‌ها اسنپ پکهایی رو که شامل سحریه بین رفتگرها توزیع کنند.

خب اینجور استفاده از کارهای خیر در جهت تبلیغات چیز جدیدی نیست و به شخصه باهاش مشکلی ندارم. اتفاقا خیلی هم خوبه اگه آدما برای شوآف و تبلیغ به جای تبلیغ‌ تلویزیونی و بیلبوردهای آنچنانی کارهای خیریه بکنند تا حداقل یه عده از این شوآف و تبلیغات سود ببرند. هر چقدر هم که نیت اون فرد و شرکت خالص نباشه، اما در نهایت نمیشه منکر این شد که این شوآف به نفع عده‌ای تموم شده.

برخلاف چیزی که ممکنه تو نگاه اول به نظر برسه، موضوعی که باعث شد آدمای زیادی تو توییتر به این فیلم واکنش نشون بدن، استفاده ابزاری اسنپ از کار خیریه در جهت تبلیغات خودش نبود. بلکه نحوه انجام این کار و تمایزی بود که بین دو قشر تو این ویدیو تصویر شده بود! تو این فیلم ما دو دسته‌ی اسنپی، رفتگر رو به وضوح میبینیم و تمییز میدیم و اولین حسی که میگیریم اینه که طبقه بالادستی و خرده بورژوا داره به طبقه کارگر ترحم میکنه. اوج نمایشی بودن تمام ماجرا رو هم وقتی یکی از دخترها جارو به دست میگیره درک میکنیم و این موضوع موقعی باعث خشم بیشتر میشه که میبینیم طبقه‌ی کارگر تو این فیلم قشر به شدت آبرومند و معتبر رفتگره که کمتر کسیه که براشون احترام زیادی قائل نباشه. شاید اگه بچه‌های اسنپ همین برخورد رو مثلا با کودکان کار داشتند موضوع به کل متفاوت میشد.

در مجموع نظر من اینه که تبلیغات در قالب کمک به خیریه خیلی هم کار خوب و هوشمندانه‌ایه. اما باید مراقب باشیم که شان آدمها تو این تبلیغات حفظ بشه. برای مثال اسنپ میتونست با اختصاص دادن یه کد تخفیف ویژه به یه قشر خاص و از طبقه پایینتر، تمام معادلات رو به نفع خودش تغییر بده. اینجوری قطعا واکنشها تو شبکه‌های اجتماعی هم متفاوت میشد.

یک نظر

پیاده سازی lazy load در اندروید

اگر برنامه‌نویس اندروید باشید احتمالا شرایطی بوده که نیاز داشتید عکسی که تو اینترنته رو داخل یک ImageView لود کنید. معمولا همچین عکسهایی داخل لیست قرار دارند و شما به ازای هر آیتم لیست باید یک یا چند عکس از اینترنت لود کنید. احتمالا تو این شرایط اولین راهی که به ذهنتون میرسه اینه که به ازای هر عکس یه ریکوئست وب بدید و عکس رو دانلود کنید و نمایش بدید. اما این قطعا بهترین راه نیست. تو این روش مسائل زیادیه که باید رعابت بشه که اگه نکنید ممکنه با مشکل‌های زیادی رو به رو شید. اگر هم همه چیز خوب بشه و عکس رو با موفقیت از سرور بگیرید، تازه دردسر سر و کله زدن با عکس و تغییر سایزش شروع میشه.

اینجاست که چرخ رو دوباره اختراع نمیکنیم و میریم سراغ کتابخونه‌های آماده‌ی اینکار. من اینجا میخوام دو تا از این چرخ‌ها که حرکت ما رو سریعتر میکنند رو معرفی کنم و با هم مقایسه کنم.

ادامه این نوشته

۳ نظر

معرفی crashlytics

تو این نوشته قصد دارم یه ابزار خیلی جذاب رو به توسعه دهنده‌های موبایل معرفی کنم. یه ابزاری که خودم حدودا دو هفته پیش کشفش کردم و اون موقع حسابی از کشفش ذوق زده شدم. این نوشته تلاشش اینه که شما رو هم ذوق زده کنه!

اجازه بدید اول مشکل رو مطرح کنم و بعد بریم سراغ این سولوشن معرکه که کاریه از تیم توسعه توییتر. اگر برنامه‌نویس اندروید (یا iOS. این سولوشن برای هر دو پلتفورم معرفی شده) باشید، احتمالا یکی دوتا چیز شما رو خیلی اذیت کرده. اول اینکه هر دفعه که ماژول یا بخش جدیدی به نرم‌افزارتون اضافه میکنید باید یه APK بگیرید و برای کارفرما، مدیر پروژه، مدیر محصول، بقیه برنامه‌نویسها، تست ‌کننده‌ها، یا کلا هر کسی که درگیر پیشروی پروژه و تست کردنشه بفرستید. احتمالا اینجوری عمل میکنید که APK رو به همراه کمی توضیحات ایمیل میکنید یا میذارید دراپ باکس یا تو حالت رو مخ ترش تلگرام میکنید. بعد میشینید منتظر نظرات اونا و گزارش خطاهای احتمالی. مشکل دوم هم وقتی پیش میاد که گزارش خطا میگیرید. تو اینجور مواقع احتمالا جملاتی میشنوید مثل: اومدم لاگین کنم کرش کرد! یا “اصن باز نمیشه!” و حالا تازه نوبت شما میشه که جملاتشون رو رمزگشایی کنید و بفهمید ایراد کار از کجا بوده.

ادامه این نوشته

یک نظر
android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView screen density splash SSL Error TEDxKish ux WebView آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانشگاه دانشگاه ایده‌آل دزد رشته مهندسی کامپیوتر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب مهاجرت موج سوم نوار پیشرفت همایش هوش مصنوعی وب ویوو ُجزیره کیش کار کسب و کار یادگیری ماشین