همه چیز دقیقا از جایی شروع شد که دو روز قبل تا نیمه شب داشتم کد میزدم و خیلی اتفاقی تو گیت یکی از کد های دوسال قبلم رو دیدم از خدا که پنهون نیست از شما چه پنهون که حسابی به خودم توهین کردم که آخه مرد نا حسابی اینی که تو به عنوان کد به خورد این و اون دادی اسمش اصلا کد نیست که بیشتر شبیه کاغذ آبی طراحی هیولای اسپاگتی پرنده است !
خوب پس اومدم یه نیم نگاهی به کد های جدیدم کردم که ببینم چی شد و چیکار کردم و چه تجربه هایی داشتم که خروجیش یه کد قابل خوندن تر قابل فهم تر و قابل تست تر شده و همونطور ک درحال خوندن بودم روانه ی رختخواب گران مایه شدم و 5-6 تا توییت درباره اش نوشتم که این پایین هست :) بعد گفتم خب چرا به آدمهایی که جای سه سال قبل من هستن نگم چی رو از کجا خوندم که بهتر بتونن راه رو پیدا کنن نتیجه کار شد این پست ویرگول و اینکه چطوری میشه با کمک اندروید و گوگل در راه بتمن شدن قدم برداشت.
من سعی کردم تا جایی که میشه مفاهیم کلی تر که باعث دید بهتری به کل فرآیند تولید اپلیکیشن میشه رو مد نظر قرار بدم قطعا اینکه شما بدونید فرگمنت با اکتیویتی چه فرقی داره رو میتونید تو هرکتاب آموزش اندروید یا کلاسی پیدا کنید ولی خب اینکه بهتره کدوم معماری رو استفاده کنید کجا از اکتیویتی استفاده شه و کجا از فرگمنت رو خب خیلی جاها ازش غافل میشن چه تو کتابها چه تو کلاسها این سبک دانش چیزی هست که خود برنامه نویس باید پیگیرش باشه و یاد بگیره و گاهی سردرگم میشه که من الان چی باید یاد بگیرم برای بهتر شدن و چه چیزی نیاز دارم من تمرکزم رو گذاشتم رو اون بحث امیدوارم به کارتون بیاد
تو این مقاله سعی میکنم به ساده ترین شکل ممکن درباره چیزایی که به ذهنم میرسه توضیح بدم و تا حد ممکن منبع فارسی معرفی کنم ولی اگر زبانتون حداقل درحد خوندن یکی دوتا مقاله تخصصی جوابگو نیست حتما حتما حتما حتما یه فکری به حالش بکنید:) از اون گذشته ممکنه خیلی از چیزایی که من به واسطه کم تجربگی تجربه کردم رو شما تجربه نکنید من رشته ام تو دانشگاه ای تی بود ولی شبکه هیچوقت راضیم نکرد و باز برگشتم سمت کد پس ممکنه یه سری از چیزایی که میگم به عنوان یه مهندس نرم افزار بدونید و به کار ببرید یا تو دانشگاه و کلاس و.. درباره اش خونده باشید و درکش کرده باشید پیشاپیش به بزرگی خودتون ببخشید اگر چیز تکراری دیدین :)
به عنوان کسی که هرگز کلاس جاوا نرفت هرگز قبل از اندروید جاوا نزد و کل مفهوم شی گرایی رو تو زبانی به نام C++ درک کرد به شما پیشنهاد میکنم اگر خود جیمز گاسلینگ و مدیران ارشد سان مایکرو سیستمز اومدن گفتن داداش نیازی به دانش اولیه جاوا نداری و برو سراغ اندروید شما به نیابت از من میتونی با پشت دست بزنی تو دهنشون :))) اول اینکه شما حتما حتما نیاز داری که دانش اولیه درباره جاوا داشته باشی اینکه چطوری کار میکنه تفاوت JDK و JRE رو بدونید، بدونید مفهوم super و this چیه ،برای این کار من یه کورس بشدت خوب دیدم تو فرانش که لینکش این پایین هست کامل نیست ولی اگر دارید کد اندروید میزنید و تو مفاهیم شی گرایی خیلی خوب نیستید و این موضوع اذیتتون میکنه حتما این دوره رو ببینید که حسابی گره از کارتون باز میکنه :)و البته یه کتاب جمع و جور جاوا که خیلی دوسش دارم و واقعا کتاب خوبیه لینک آمازونشو براتون میذارم با یکم تلاش احتمالا بتونید PDF اش پیدا کنید ولی نمونه فارسی کتاب جاوا نخوندم و نمیدونم کیفیتشون در چه حده پس هر کتابی که باهاش راحتید و مباحث اولیه و پایه رو به خوبی توضیح میده خوبه
دوره مفهوم شی گرایی در جاوا برای برنامه نویسان اندروید
۲.معماری در اندروید:
معماری یک نرم افزار و الگو های معماری در نرم افزار یکی از چیزهایی هست که خیلی از توسعه دهنده های تازه کار اندروید کلا یادشون میره همچین چیزی وجود داره و کد باید دارای یه ساختار مشخص باشه اینکه معماری چقدر میتونه موثر باشه تو تمیزی کد و اینکه بدونید دقیقا دارید چیکار میکنید رو کار ندارم بذارید ساده ترین شکل ممکنش رو بگم یه سری آدم سالهاست دارن کار نرم افزاری میکنن اونا دیدن اگر ساختار مشخصی برای کد وجود داشته باشه زندگی زیباتر میشه در نتیجه تصمیم گرفتن این ساختار ها رو ایجاد کنند تو زبان های مختلف درباره اشون مقاله بنویسن و اینکه بگن چطوری میشه یه ساختار بوجود آورد اینکه چرا معماری استفاده میشه یه بحثه که خیلی واردش نمیشم و البته از لینک های زیر میتونید برای درکش استفاده کنید. اینجا خود گوگل بحث معماری تو اندروید رو باز یه سری نمونه کد داره و... این شما رو میبره به ویدیو های مربوط به معماری در جلسات برنامه نویسان اندروید تهران یا همون logcat که اجتماع خیلی دوست داشتنی رو به وجود آوردن :)
Android Architecture Patterns : MV( C | P | VM )
Building Modern apps using the Android Architecture Guidelines
Considering architecture for Android app
3.الگو های طراحی
دیزاین پترن زمانی به وجود اومد که یه سری مشکل تکراری برای برنامه نویس ها پیش اومد :| خب تقریبا جوابها همیشه تکراری بود موارد استفاده متفاوت بود :)) خب بهتر بگم اینجوری بود که قابلیت هایی نیاز بود به برنامه اضافه شه که ممکن بود هرکاری بکنن و عملکردشون مهم نبود مهم نحوه پیاده سازی اونا در حالتی کاملا تر و تمیز مرتب و شیک بود اینگونه بود که در دهه نود میلادی یه سری دوستان گرامی که بعد ها چون اسماشون زیاد میشد به gang of four معروف شدن اومدن یه کتاب نوشتن و تعدادی روش برای این سبک مشکلات در ساختار شی گرایی فارغ از زبان برنامه نویسی ایجاد کردن هنوز هم بهترین کتاب در این رابطه همون کتاب معرفشون (اسمش طولانی بود این لینک ویکی پدیای کتابه) هست هرچند بر این تعداد الگو های افزوده شد بعضی هاش کاربردی تره بعضیاش نه و... ولی خب در مجموع خیلی سخت نیست یادگیریشون و خیلی هم کاربردی هست متاسفانه فقط یه جا پیدا کردم که تعداد زیادی از این الگو ها رو به زبان فارسی توضیح بده که اونم زبان پیش فرضش رو C# انتخاب کرده بود که خب از لحاظ تئوری میشه ازش استفاده کرد یکم باهوش و با دقت باشید میتونید عین اون کد ها رو تو جاوا پیاده سازی کنید ( به کسی نگید ولی بیل گیتس و رفقا سی شارپ رو از رو دست جاوا تقلب کردن :)))) )
Design Patterns: Elements of Reusable Object-Oriented Software
Design patterns (in farsi)- tosinso WebSite
۴.S.O.L.I.D
شاعر میگه من بنده آن دمم که مدیر گوید تست برای نرم افزارت بنویس و من نتوانم !
بذارید من یکم خوش خیال باشم فکر کنم شما دقیقا به توصیه هام گوش دادید و رفتین یاد گرفتین دقیقا کد تمیز با معماری خوب نوشتید و دیزاین پترن استفاده کردین آیا کافی است؟ متاسفم نه :|
خب بذارید اینجوری بگم عزیزانی که این پایین لیست شدن جز نکات کلیدی و شب امتحانی تو کد تمیز و قابل تست نوشتن هستن:) ولی خب قرار نیست اینجا توضیح خاصی درباره شون بدم چون هم انگلیسی هم فارسی کسانی که سابقه شون خیلی بیشتر و قوی تره درباره شون حسابی تر و تمیز صحبت کردن فقط بگم رعایت این ها باعث میشه که بتونید خیلی ساده و سریعتر برای کدتون تست بنویسید و ماژولاریتی کدتون هم زیاد میشه البته از وقتی من بیشتر بهشون توجه میکنم پوستمم شفاف تر شده :)
S: Single Responsibility
O: Open / Closed
L: Liskov Substitution
I: Interface Segregation
D: Dependency Inversion
ویدیو جلسات LOGCAT که خب طبیعتا فارسی هست
S.O.L.I.D: The First 5 Principles of Object Oriented Design
۵.REST-JSON
خب این دیگه هیچ ربطی به اندروید نداره :| البته دروغ چرا ربط داره ولی نه اونقدر که قبلی ها ربط داشتن خب اینجوری بگم که این روزها هرچی اپ تولید میشه یه جوری یه راه دررو برای ارتباط با اینترنت دارن بدین ترتیب باید راهی باشه تا اپلیکیشن بتونه تو اینترنت پبام بفرسته یا دریافت کنه مثلا قراره شما یه سری داده از یه سایتی مثل توییتر بگیرید یا اصلا چرا توییتر شما یه وبسایت دارید و میخواید برای وبسایتتون اپلیکیشن بسازید و سرویس هاتون رو در قالب اپ هم ارائه بدین راه حل یه زبان مشترک هست که اپلیکیشن اندرویدتون بتونه با وب سرویستون صحبت کنه اینجاست که پای REST و JSON وسط میاد و معمولا هرجا بخواید استخدام بشیدیکی از شرایط آشنایی با کتابخانه هایی مثل volly و Retrofit هست که دقیقا برای همین کار طراحی شدن دوتا آموزش ساده درباره این عزیزان این پایین لینک میکنم سخت نیست ولی بشدت کاربردیه درضمن JSON رو صرفا بابت پرکاربرد تر بودن آوردم بغل rest وگرنه کاملا درجریانم لزوما نیازی نیست که برای ارتباط rest از json استفاده شه :)
۶.SQL-DB
خب تقریبا داریم تموم میشیم این شخصا تجربه خودم نبوده من قبل از اینکه یاد بگیریم اسم اندروید رو هم بنویسم با ایشون کارهای ژانگولر میکردم :)) (حالا انگار میشه باش چیکار کرد نهایتا دوتا کوئری زدم بابا ) خب sql شاید هم نباشه ولی من دوست داشتم اینجا درباره اش بنویسم ایشون خیلی کاربردیه زیادی کاربردیه شما میتونی بدون دونستن چیز خاصی از ایشون و صرفا کپی کردن کد از اینترنت یا استفاده از ORM دیتا ذخیره کنی یا پاک کنی و ... ولی خب اگر بخوام صادقانه بگم هرگز نمیشه بدون ادویه و پیاز مرغ درست کرد(گرسنم بود که این مثال رو زدم) اگر مستقیما از sqlite استفاده کنید که خب قطعا نیازتون میشه و اگر از sqlite استفاده نکنید دونستن ساختار شما رو ده پله جلو میندازه ساختار درست پیاده کردن توی پایگاه داده میتونه خیلی به بالا رفتن کارایی و سرعت اپلیکیشنتون اضافه کنه پس من گزینه 6 ام رو اختصاص دادم به sql که اگر بلد نیستید حتما حتما حتما حداقل مفاهیم پایه اش رو بخونید لینک های مفید مرتبط رو پایین میبینید البته منابع فارسی هم زیاد هست میتونید استفاده کنید ولی صرفا من اینا رو پیدا کردم دوست داشتم
SQL Cookbook (Cookbooks (O'Reilly))
۷.GIT-Github-Gitlab
و یا هر سرویس دیگه ای :) گیت یکی از بهترین چیزهایی که تو زندگی میشه باهاش سر و کله زد مثل لینوکس گیت یک سامانه است که به شما اجازه میده بتونید بدون مشکل خاصی از هر مرحله فرآیند اپلیکیشنتون بک اپ داشته باشید و یا اینکه بتونید کدهاتون رو به اشتراک بذارید و اپلیکیشن متن باز منتشر کنید و از اون مهمتر که شاید بهترین مزیتش باشه اینه که شما میتونید اپ های گروهی تولید کنید و بدون اینکه مشکل خاصی بوجود بیاد چندین نفر روی یک پروژه کار کنند و نتیجه هم کم نظیر شه در عین حال گیتهاب و گیت لب دو سرویس مبتنی بر گیت هستن که برای دولوپر های تازه کار تفاوت خاصی با بهشت ندارن پر از کد ها و لایبرری های ازاد که میشه ازشون استفاده کرد کدهاشون خوند و یاد گرفت واقعا اگر فکر میکند بدون گیت میشه برنامه نویس بود تقاضای تجدید نظر دارم:)
آموزش مقدماتی کار با گیت گیت هاب و گیتلب
Version Control with Git: Powerful tools and techniques for collaborative software development
اول ببخشید اگر شوخیام خیلی بی مزه بود :)) سعی کردم ساده و راحت بنویسم و البته روان اگر خطایی داشت بر من ببخشید دوم اینکه این ۷ موضوع مفاهیم خیلی پایه ای هستن که دونستنشون امتیاز نیست بلکه الزام هست برای کدنویس خوب بودن مفاهیم خیلی جزئی تری هست از لایبرری های خاص تا فلان تکنولوژی ترند روز ولی خب همونطور که گفتم من مخاطبم صرفا خودم در زمستان 94 بود جایی که بلد بودم چیزی بنویسم که کار کنه ولی چیزی که خوب باشه چی؟ اونو نمیدونستم و سعی کردم بفهمم اما این فهمیدن هزینه داشت فرصت های زیادی از دست دادم بابت ندونستن یه سری مفاهیم زمان زیادی از دستم پرید درک یه سری مفاهیم بابت ندونستن بعضی مفاهیم پایه ای تر برام خیلی سخت تر بود ولی خب فهمیدم باید بخونم بخونم و بیشتر بخونم تا مسیر برای بهتر شدن و قدم بعد واضح تر شه امیدوارم این نوشته بتونه کمک کنه مسیر واضح تر شه :)
و البته اینکه آدم هایی با سابقه و توانایی بیشتر از من قطعا خیلی خیلی زیاد هست و من بشدت دوست دارم درباره مواردی که نوشتم و درست و غلط و صحیح یا خطا بودن نوشته ام نظر بدن پیشاپیش ممنونم