چیزی که 2 سال توسعه اندروید، از راه سخت برایم آموخت

چیزی که 2 سال توسعه اندروید، از راه سخت برایم آموخت

من هنوز آن روز را در 2014 به یاد دارم وقتی که من تصمیم بر شروع توسعه دهندگی اندورید کردم، و یکی از بهترین تصمیماتم در زندگیم بود. و درحال حاضر حدود دو سال و نیم است، من این شانس را داشتم که بسیاری از چیزهارا در اندروید یاد بگیرم و یادنگیرم.

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

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

مدت زمان زیادی است که من برای کمک به دیگر توسعه دهندگان از راه هایی که برایم ممکن بوده،در تلاش هستم، به طور مستقیم و غیر مستقیم. اینجا پروفایل StackOverflow و Github من است.

در این مقاله، من برخی از جواهرات را به اشتراک می گذارم که من در این سال ها جمع آوری کردم. این ممکن است به کسی کمک کند تا سریعتر کار کند و اشتباهاتی را که من بارها انجام دادم تکرار نکند.

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

1. اختراع دوباره چرخ نکنید
ابتدا، من یک ایده بد داشتم ، برای استفاده نکردن از کتابخانه های منبع باز. هر چقدر که نیاز داشتم ، میخواستم خودم بسازم. واقعا ایده وحشتناکی بود.

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

بیشتر در مورد منطق کسب و کار اصلی برنامه خود تمرکز کنید. اگر می خواهید تماس های شبکه ای را در برنامه خود بگنجانید، نیازی نیست که Retrofit خودتان را بسازید.

جایزه: Android Arsenal یک پایگاه داده از تقریبا همه کتابخانه های اندروید که تاکنون ساخته شده اند است. حتما چک کنید.

[مقاله مرتبط: تهدیدها و فرصت‌های اختراع مجدد چرخ در صنعت توسعهٔ نرم‌افزار ]

2.کتابخانه ها را عاقلانه انتخاب کنید
تعداد زیادی از کتابخانه های منبع باز موجود در Github برای استفاده شما به صورت رایگان وجود دارد. اما خیلی هیجان زده نشوید و کورکورانه شروع به استفاده از کتابخانه ها نکنید.

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

اگر بتوانید وقت خود را بپردازید، باید به کد آن کتابخانه شیرجه بزنید و خودتان کدها را چک کنید، اگر واقعا ارزشش را دارد.

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

توصیه: هر کتابخانه میزبان، مستقیما از خط فرمان با استفاده از Dryrun امتحان کنید.


3. یک فنجان قهوه بردار و بشین و بیشتر کد بخوان
ما بیشتر وقتمان را صرف خواندن کدهای دیگران میکنیم تا نوشتن آن ها. اگر این کار را نمیکنید، استارتش را از امروز بزنید.

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

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

جایزه: در اینجا یک لیست از برخی از بهترین کتابخانه ها است و در اینجا یک لیست از تقریبا تمام برنامه های کاربردی اندروید منبع باز در دسترس است. خواهش میکنم :-)

4.فقط بخاطر خدا، استانداردهای مناسب کدزنی را حفظ کنید
اگر کدزدن را با نوشتن مقایسه کنید، کدزنی استاندارد همانند دست خط شماست.

اگر شما کدهای دیگران را بیشتر مطالعه کنید، دیگران هم کدهای زیادی از شما را خواهند خواند، اینطور نیست؟ اگر شما در یک سازمان کار می‌کنید و به شدت با دیگر توسعه دهندگان همکاری میکنید، توجه خاصی به این مسائل داشته باشید.

کوتاه نویسی، کدهای تمیز و خوانا را شما و دیگران میخوانند و باهم لذت میبرید. باید کدهای شما را مثل یک داستان خواند.

| کد شعر است.

اگر یک قطعه کد بنویسید و همکاران تان چند روز با شما صحبت نکنند شکایت نکنید.

جایزه: برای شروع، شما باید به طور کامل این و این موضوع را حل کنید.

5.شما به ProGuard نیاز دارید، بله، نیاز دارید!
هرگز هرگز این اشتباه را نکنید که برنامه خود را بدون استفاده از ProGuard در Play Store منتشر کنید. ProGuard نه تنها کد شما را مینویسد، اما این باعث می‌شود که کد شما برای مهندسین معکوس سخت‌تر باشد تا درک کند، تکثیر کرده و آن را دستکاری کنند.

این کاملا رایگان است و بصورت یک باندل با Android SDK همراه است، هیچ دلیلی برای استفاده نکردن از آن وجود ندارد.

من چندین توسعه دهنده را دیده ام که برنامه خود را بدون استفاده از ProGuard در مارک منتشر میکنند. بیش از چند ساعت طول نمی کشد که یک هکر مبتدی یک برنامه منتشر شده بدون استفاده از ProGuard را دستکاری کند.

توصیه: اما اگر شما یک امنیت درجه یک می خواهید، پس ProGuard مانند یک تکه مقوا است در حالی که شما به یک امنیت مطمئن نیاز دارید، و در اینجا، به شما DexGuard را معرفی میکنم.

6.از یک معماری مناسب استفاده کنید
شما بخاطر انتخاب معماری مناسب در اولین فرصت همیشه از خودتون تشکر خواهید کرد.

شما می‌توانید از معماری (MVP (Model-View-Presenter استفاده کنید که می‌تواند کد شما را به لایه‌های مختلف آسان کند در نتیجه انعطاف‌پذیری کد را بهبود می‌بخشد و زمان نگهداری را به شدت کاهش می‌دهد.

برای شروع یک پروژه دمو عالی اینجا برای شما وجود دارد. و اگر شما زمان زیادی را اختصاص داده اید، در اینجا یک راهنمای دقیق برای مبتدیان است.

جایزه: این لینک و این لینک را چک کنید، این لینک را مهمتر از همه حتما چک کنید. همه اینها تا حد زیادی می تواند در اجرای MVP در پروژه شما کمک کنند.


7.واسط کاربر مانند شوخی است، اگر باید توضیح دهید، بد است
اگر برای هر سازمانی که نقش "فقط" یک توسعه دهنده Android را بازی می کنید، شما احتمالا بیش از این نگران نباشید زیرا طراحان UI / UX برای مراقبت از این کار وجود دارند.

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

رابط کاربری تمیز، ساده و زیبایی را طراحی کنید این یک دید سبک و روانی را به مخاطب میدهد. شما نباید فقط مثل یک توسعه دهنده فکر کنید، در عوض شما باید بر روی طراوت پنهان داخل خود تمرکز کنید.

با ایجاد یک رابط کاربری زیبا، سعی کنید یک اثر پایدار بر روی کاربران خود ایجاد کنید، به طوری که آنها اغلب بیشتر از دیگران به برنامه شما می آیند و تمایل به تبدیل بیشتر دارند (ممکن است نسخه premium شما را بخرند).

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

جایزه: شما همیشه میتوانید از طریق Dribble یا MaterialUp از طرح های محبوب الهام بگیرید. و اگر شما علاقمند به طراحی باشید، این کتابی است که شما احتمالا دوست دارید بخوانید.

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

با تجزیه و تحلیل، من به هر دو گزارش خرابی (crash reporting)و ردیابی استفاده از برنامه(app usage tracking) مراجعه میکنم و شما به هر دو آنها نیاز دارید.

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

ابزارهای گزارش سازی خرابی (Crash reporting tools) می تواند به شما در ردیابی و رفع آنها کمک کند، یک Crash در یک زمان.

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

توصیه: من به شدت توصیه می کنم از ابزار crash reporting در Instabug استفاده کنید. شما حتما عاشقش میشین.

9.یک نینجای بازاریابی باشید
اگر شما یک توسعه دهنده شخصی هستید، شما باید فراتر از "یک توسعه دهنده" فکر کنید و باید بازاریابی را نیز درک کنید.

| من محصولات خوبی را دیدم که به دلیل عدم بازاریابی مناسب شکست خوردند، و آنهایی که خیلی خوب نبودند فقط به دلیل بازاریابی عالی موفق شدند.

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

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

توصیه: در اینجا یک ابزار تجزیه و تحلیل بازار مقرون به صرفه است، من دوست دارم از آن استفاده کنم.

10.زمان بهینه سازی برنامه شماست
این چیزی است که اکثر ما عموما انجام نمی‌دهیم، اما شما باید و باید…

تفاوت زیادی بین نوشتن کد و نوشتن کد بهینه شده وجود دارد. کدی را وارد کنید که به سرعت اجرا می شود، memory کمتر و حافظه دستگاه کمتری را مصرف می کند.

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

مقدار حافظه مورد استفاده، توسط برنامه خود را بررسی کنید و به نشت حافظه (memory leaks) توجه کنید. به یاد داشته باشید، یک نشت کوچک می تواند یک کشتی بزرگ را غرق کند. زمانی را صرف درک نحوه کار زباله روب در جاوا کنید، محل انباشت زباله (heap dumps) ایجاد و اشیا (objects) زنده خود را آنالیز کنید.

توصیه: از Leak Canary برای کشف نشت حافظه خود استفاده کنید، این کار می‌تواند زمان زیادی را با خودکار کردن این امر برای شما حفظ کند.

11.ذخیره بیش از ۵ ساعت در هر هفته با ساختارهای Gradle:
خیلی محتمل است که شما برای توسعه اندروید از اندروید استادیو استفاده می کنید و از Gradle برای ساخت سیستم تان استفاده میکنید. Gradle عالی است، اما کند است و زمانی که اندازه پروژه شما شروع به رشد می کند، از یک حلزون کندتر می شود.

من به یاد دارم که ساعت های بیشماری را نشستن و منتظر ماندن برای پایان عملیات ساختاری Gradle هدر داده ام. در یک روز کاری سخت، من به راحتی حدود یک ساعت فقط در مورد Gradle هدر می دادم و مثل اینکه 5 ساعت در هفته توی گل لای گیر بیوفتی.

اما، اینجا راه هایی برای افزایش سرعت آن است.

شما میتوانید این و این پست را دنبال کنید و بطور قابل ملاحظه ای سرعت خود را افزایش دهید. پس از بهینه سازی مناسب زمان build من از 4 دقیقه تا کمتر از 30 ثانیه کاهش یافت.

12.تست کنید، تست کنید و زمانی که شما پروژه را به اتمام رساندید، دوباره تست کنید!
هیچ چیز مهمتر از تست نیست. این چیزی است که باید در بالای لیست شما باشد.

تا جایی که ممکن است اپ خود را کامل تست کنید. وقت خود را برای نوشتن تست های خودکار صرف کنید. شرایط مختلف استرس زا برای برنامه خود ایجاد کنید و ببینید آیا می تواند زنده بماند.

من یکبار از روی عجله ریلیز اشتباهی از برنامه خودم را منتشر کردم و زمان مناسبی را برای تست آن صرف نکردم. منتظر بودم که کاربرانم با اشکالات مواجه شوند، آن را گزارش کنند و سپس آنها را برطرف کنم.

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

| هیچ کار عجولانه ای انجام ندهید، وقت خود را صرف کنید و به مدت طولانی فکر کنید. یک چشم اندازداشته باشید. اکنون سیر کنید، بعدا بپزید.

13.اندروید Fragmentation یک شیطان در لباسی دیگر است

عمل Fragmentation یکی از بزرگترین مشکلات در اندروید است و بنظر میرسد گوگل برای درست کردن آن بی میل است، اما شما باید با آن زندگی کنید.

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

اضافه شدن ورژن های مختلف اندروید گوگل قابلیت های API ها را اضافه یا حذف کرده باعث افزایش حجم کاری میشود (به مثال).

برای مثال، یک توسعه دهنده اندروید کار خود را بدون استفاده از SharedPreferences API تمام نمی کند. این خیلی رایج است، هنوز در Samsung Galaxy S نسخه 2.2 اندروید مشکل دار است (گزارش اشکال).

زمان بیشتری برای ایجاد layout های مختلف برای اندازه های مختلف صفحه نمایش صرف کنید. بر روی دستگاه های مختلف تست کنید، داشتن نسخه های مختلف، مشخصات مختلف و از سازندگان مختلف OEM.

| هرگز فکر نکنید که چیزی آن طور که بنظر میرسد، دارد کار میکند.

14. شروع Git، امروز!
اگر هنوز از Git استفاده نمی کنید، پیش بروید و از آن استفاده کنید.

زمانی که من به توسعه اندروید شروع کردم، من به اندازه کافی بدبخت بودم که بفهمم Git چی بود. من قبلا هر پروژه خودم را کپی میکردم و یک نسخه پشتیبان در هارد درایو و یا در ابر ذخیره میکردم. به نظر احمقانه میاد؟

بله، کاملا احمقانه بود.

Git می تواند به طور چشمگیری گردش کار شما را بهبود بخشد. اگر کسی از من بخواهد یک ابزار را که من هر روز استفاده می کنم نام ببرم که نمی توانم متوقفش کنم!! هر زمان Git و Git است.

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

و بعد از مدتی شما شروع به یک پروژه بزرگ خواهید کرد و در مورد چگونگی حفظ یک مدل مناسب شاخه ای سردرگم می شوید، پس بفرمایید.

جایزه: اگر شما تازه شروع کرده اید و نمی توانید مبلغ اشتراک ماهانه برای نگهداری ریپازیتوری خصوصی در GitHub پرداخت کنید، می توانید BitBucket را امتحان کنید که به شما این امکان را بصورت رایگان می دهد.

15.برای هکرها مشکل‌سازی کنید
طبیعت منبع باز بودن اندروید چیزی است که آن را در مقابل حملات آسیب پذیر میکند. هر اپ اندرویدی به راحتی میتواند decompile، مهندسی معکوس ، ripped open، تجزیه و تحلیل و دستکاری شود.

شما نمی‌خواهید که این اتفاق برای برنامه شما بیفتد، درست است؟

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

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

اگر برنامه شما یک نسخه premium دارد که crack شده و رایگان منتشر میشود. در تجارت ضرر بزرگی به دست می آورید، درسته؟

چندین چیز که می توانید انجام دهید برای جلوگیری از آسیب رساندن به برنامه شما وجود دارد. هیچ چیز مانند امنیت 100٪ وجود ندارد. هر هکر ماهر و متعهد با منابع، ابزار و صبر مناسب می تواند برنامه شما را کرک کند.

تمام چیزی که شما میخواهید انجام دهید این است که برای هکر عملیات کرک را سخت و سخت تر کنید.

جایزه: خواندن این و این باید شروع خوبی برای امنیت برنامه شما باشد.

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

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

یک دستگاه قدیمی و با کیفیت پایین که با تعداد زیادی از برنامه‌ها رها شده، آن را برای یک دستگاه توسعه، ایده‌آل می‌سازد.


17.سرمایه گذاری در یادگیری الگوهای طراحی
این سرمایه گذاری است که همیشه برای شما پرداخت خواهد کرد.

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

شروع به صرف زمان زیادی از امروز برای یادگیری الگوهای طراحی جاوا. در اینجا یک پروژه Github است که تمام الگوهای طراحی شناخته شده برای بشر را نشان می دهد.

برای شروع، مهم‌ترین آن‌ها را یاد بگیرید مثل:

Singleton, Adapter, Factory Method, Iterator, Dependency Injection, Event Driven Architecture, Builder, Callback, Strategy, Facade and Producer Consumer

به نظر خیلی میاد؟ در واقع نیست، هنگامی که داخل این موضوعات شیرجه می روید، آنها را دوست خواهید داشت.

توصیه: کتاب هایی برای مطالعه مثل GoF’s Design Patterns و Refactoring by Martin Fowler و Effective Java by Joshua Bloch و Design Pattern with Kotlin by Alexey Soshin

18.وقت آن است که به عقب بر گردیم
همه ما از افراد اطراف مان و از اینترنت بسیار کمک گرفته ایم.

بگذارید اعتراف کنم.


هر زمان که مشکلی دارید، اولین چیزی که شما می توانید انجام دهید این است که گوگل آن را پیدا کرده و اولین لینک را از StackOverflow پیدا کنید. گاهی اوقات شما عجله دارید و شما در نهایت راه حل را از پاسخ با بالاترین رأی Copy و Paste خواهید کرد.

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

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

وقتش است که برگردی. هر چی بیشتر بدست بیاری بازم بیشتر میتونی برگردی.

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

من سعی کردم تا برخی از درسهایی را که در این سفر کوتاه با توسعه اندروید آموخته ام به اشتراک بگذارم. سفر من را ادامه دهید، بیشتر یاد بگیرید و حتی بیشتر به اشتراک بگذارید. امیدوارم به کسی کمک کرده باشم و زندگی را کمی ساده تر کنم.

اگر شما این مقاله را دوست دارید، نظر بدهید و با دوستانتان به اشتراک بگذارید.

منبع

منبع

از بهترین نوشته‌های کاربران سکان آکادمی در سکان پلاس


online-support-icon