Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
#پست_مجدد این پست تا به حال بیش از ۳۰۰۰ بار مشاهده شده و به نظر می‌رسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
وجود یک «لکه» یا Blob در کد برنامه شما یک نمونه ضد الگوی برنامه نویسی (Anti Pattern) محسوب می‌شود. یکی از علائمی که نشان می‌دهد برنامه شما لکه دارد، زمانی است که از این جمله استفاده می‌کنید: «این قسمت از کد، قلب سیستم است»
وقتی از این جمله استفاده می‌کنید، یعنی قسمتی از کد شما وجود دارد که در آن حجم زیادی از منطق برنامه شما نوشته شده‌است و شکسته نشده‌است. لکه‌ها تمایل به بزرگ شدن دارند،‌ یعنی خیلی وقت‌ها برای نوشتن یک کد جدید، احساس‌ می‌کنید باید آن را به «قلب سیستم» اضافه کنید. خیلی وقت‌ها علت این مشکل معماری بد و یا حتی «نبود معماری» است.

لینک زیر بیشتر در مورد این Anti Pattern توضیح داده است.

https://sourcemaking.com/antipatterns/the-blob

#مهران_داودی
لینکداین:
https://ir.linkedin.com/in/mehrandvd


کانال تلگرام:
@SoftwarePhilosophy


___
Forwarded from Iran Agile
🔴 شش روش برای ایجاد سازمان یادگیرنده

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

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

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

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

– سوالات احمقانه

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

– گوش کردن و سوال پرسیدن

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

– حرف دیگران قطع نکنیم

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

– چیزی را که نمی دانید، تاکید کنید که نمی دانید

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

– در جلسات همه صحبت کنند

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

– اگر شخصی مورد اهانت قرار گرفت، وظیفه شما حمایت است

این مورد را بشدت تجربه کردم بخصوص در جلسه های فنی، یک نفر به نفر دیگر تیم اهانت یا بی احترامی می کند، و بخاطر سیاست یا ترس یا هر چیز دیگری شما ترجیح می دهید که چیزی نگویید. مطمئن باشید بی احترامی در یک جلسه به هر شخصی، اهانت به شخص شماست. به هیچ وجه با بی احترامی به افراد تیم کنار نیایید، حتی اگر فرد مورد نظر فنی ترین و کلیدی ترین فرد تیم شماست، اگر امروز با او برخورد نکنید، مطمئن باشید فردا مشکلات جدی تری خواهید داشت.
و البته با خود نگویید که “حالا بعدا خصوصی بهش میگم که اینجوری حرف نزن”، کسی که جلوی جمع به کسی بی احترامی می‌کند، وظیفه مدیر این است که همان جلوی جمع “اهمیت احترام” را به افراد نشان دهد. البته لازم نیست، شما به فرد نیز بی احترامی کنید، همین که سعی کنید به طرف نشان دهید که اگر در این جلسه نتوانیم احترام را رعایت کنیم، پس هر نتیجه ای بی معنی خواهد بود.

https://goo.gl/mwUPAe

@iranagile
Forwarded from فلسفه دیزاین
معرفی Lottie:
ابزاری بینظیر برای خلاقانه‌ترین ایده‌های شما

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

امروز میخواهیم درباره ابزاری صحبت کنیم که قدم بزرگی در جهت ساده‌سازی پیاده‌سازی دیزاین‌های متحرک برداشته است. قبلتر هم درباره خبرهایی که Airbnb در مجامع دیزاین ایجاد کرده بود صحبت کرده‌ایم. این شرکت چند ماه قبل مجددا خبرساز شد و ابزاری متن‌باز به اسم Lottie را معرفی کرد.
با استفاده از این ابزار شما می‌توانید انیمیشن‌هایی بُرداری (vector) را با پسوند JSON با کمک نرم‌افزار Adobe AfterEffect تولید کرده و تیم توسعه هم با استفاده از کتابخانه ارائه شده و استفاده از آن در اپلیکیشن، به راحتی آن انیمیشن را اجرا کند.

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

پیشنهاد می‌کنم در اولین فرصت این ابزار را امتحان کرده و از طراحی انیمیشن‌ها لذت ببرید.

در ادامه توجه شما را به چند انیمیشن اجرا شده که استفاده جلب می‌کنم.

https://medium.com/airbnb-engineering/introducing-lottie-4ff4a0afac0e

(زمان حدودی مطالعه، ۸ دقیقه)

#ابزار #اینتراکشن #تجربه_کاربری #Lottie
@Dexign دیزاین

___
یکی از مشکلات برنامه نویسان پیاده سازی چندباره نرم افزار در چندین پلتفرم مختلف مانند وب، iOS و Android است که بسیار پر هزینه می‌باشد. با آمدن React Native، Xamarin و ... این امکان به وجود آمد که برای موبایل‌های مختلف با یک کد مشترک نرم افزار ساخت. حال مایکروسافت پا را از این نیز فراتر گذاشته و با ایجاد فریمورک ReactXP بر روی React.JS و React Native بستری را فراهم نموده تا با نوشتن یک کد، آن نرم افزار همه جا از جمله در وب و کلیه موبایل‌ها اجرا گردد.

https://microsoft.github.io/reactxp/

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، بر روی لینک زیر کلیک کنید:

https://ow.ly/iem730fSdfp

#علیرضا_وفی (https://ow.ly/Vna930dsUGr)


کانال تلگرام:
@SoftwarePhilosophy


___
#پست_مجدد این پست تا به حال بیش از ۱۶۰۰ بار مشاهده شده و به نظر می‌رسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
نامگذاری به روش کباب! برای نحوه نامگذاری روش‌های مختلفی وجود دارد که هر زبان قانون خود را دارد. برای مثال حتما تا به حال از روش‌های نامگذاری PascalCase, camleCase, snake_case استفاده کرده‌اید. اخیرا یک روش نامگذاری را با اسم «روش کباب» دیدم که خیلی جالب بود! مدل kebab-case مدلی است که چون ظاهر آن شبیه این است که یک سیخ کباب از آن رد شده به kebab-case معروف شده‌است! جای خوشحالی دارد که یکی از عبارات فرهنگ ایرانی وارد اصطلاحات دنیای برنامه‌نویسی شده!

کتابخانه Lodash متدی برای تبدیل string به حالت kebab-case دارد. برای این منظور می‌توانید از _.kebabCase('my food bar') استفاده کنید که خروجی آن my-food-bar خواهد بود.

https://lodash.com/docs#kebabCase

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، بر روی لینک زیر کلیک کنید:

https://ow.ly/Nu1030dx8j8


#مهران_داودی (https://ow.ly/GwIl309lFEm)

کانال تلگرام:
@SoftwarePhilosophy


___
Forwarded from فلسفه دیزاین
دیزاین‌ها را باید شُست، جور دیگر باید چید

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

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

در مقاله امروز آقای Slava Shestopalov با استفاده از بیش از ۵۰ نمونه و با توضیح جزئی‌تر (بخصوص روی اشکالی با گوشه‌های گرد) به ما در درک بهتر این مفهوم کمک می‌کند.

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

https://medium.muz.li/optical-effects-9fca82b4cd9a

(زمان حدودی مطالعه، ۱۸ دقیقه)

#آموزش #بررسی #مفاهیم #نمونه‌ها

@Dexign دیزاین

___
#پست_مجدد این پست تا به حال بیش از ۱۱۰۰ بار مشاهده شده و به نظر می‌رسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
کدهایی که اجرای آنها زمانبر است ممکن است همیشه به درستی انجام نشوند. ریستارت سرور، قطع ناگهانی شبکه و خطای کد می‌توانند باعث توقف و عدم اجرای کد مورد نظر شوند. با Hangfire می‌توان در .NET کارهای طولانی مدت در نرم افزار را بسادگی بصورت Fire and Forget و یا بصورت زمانبندی شده اجرا نمود. با بسته شدن نرم افزار، ریستارت شدن و یا هر اتفاقی که باعث انجام موفقیت آمیز آن کار نشود، Job مورد نظر دوباره اجرا خواهد شد. البته ذکر نکته نیز مهم می باشد که Job ها به شکلی نوشته شوند که در صورت عدم اجرای موفقیت آمیز بتوانند بطور کامل از آغاز مجدداً اجرا گردند.

https://docs.hangfire.io/en/latest/quick-start.html


https://docs.hangfire.io/en/latest/configuration/using-sql-server.html

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، بر روی لینک زیر کلیک کنید:

https://ow.ly/aqMD30dBgdj


#علیرضا_وفی (https://ow.ly/Vna930dsUGr)

کانال تلگرام:
@SoftwarePhilosophy

___
#پست_مجدد این پست تا به حال بیش از ۱۳۰۰ بار مشاهده شده و به نظر می‌رسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
یکی از مسایلی که برنامه نویسان با آن درگیر هستند فهمیدن نحوه استفاده از یک وب سرویس (Web API) و نوشتن کد برای استفاده از آن می‌باشد. با Swagger می‌توان برای هر Web API مستندات تهیه نمود و در پلتفورم دلخواه از Java گرفته تا Xamarin کد استفاده از وب سرویس را ایجاد کرد. مکانیزم عملکرد Swagger مانند ایجاد WSDL و ایجاد کد استفاده از وب سرویس در Visual Studio می‌باشد ولی با این تفاوت که قابلیت ایجاد کد کلاینت بر روی کلیه پلتفرم‌ها وجود دارد.

https://blog.rsuter.com/nswag-tutorial-integrate-the-nswag-toolchain-into-your-asp-net-web-api-project/

https://github.com/RSuter/NSwag/wiki/T4

https://editor.swagger.io/

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، بر روی لینک زیر کلیک کنید:

https://ow.ly/8aKh30dGLEB


#علیرضا_وفی (https://ow.ly/Vna930dsUGr)

کانال تلگرام:
@SoftwarePhilosophy

___
Forwarded from Iran Agile
🔴 آیا برنامه‌نویس‌ها باید در فرآیند طراحی کانسپت محصول حضور داشته باشند؟

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

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

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

🌐 https://goo.gl/qQHnR6

@iranagile
#خلاصه_مطالب «فلسفه نرم‌افزار» در هفته گذشته:

۱. آشنایی با فریمورک ReactXP

https://t.iss.one/SoftwarePhilosophy/987

۲. نامگذاری به روش کباب!
#naming
https://t.iss.one/SoftwarePhilosophy/989

۳. خطای دید انسانی و دیزاین (فلسفه دیزاین) https://t.iss.one/SoftwarePhilosophy/990

۴. استفاده از Hangfire در در .NET برای زمان بندی کارهای طولانی
#dotnet #scheduler #framework #jobrunner
https://t.iss.one/SoftwarePhilosophy/992

۵. نحوه استفاده از Swagger برای تهیه مستندات در Web API ها
#rest #webapi #documentation
https://t.iss.one/SoftwarePhilosophy/994

۶. آیا برنامه‌نویس‌ها باید در فرآیند طراحی کانسپت محصول حضور داشته باشند؟ (Iran Agile)
#sdlc #scrum
https://t.iss.one/SoftwarePhilosophy/995

ـــــــــــ


@SoftwarePhilosophy
Forwarded from Software Philosophy
اگر دوستانی دارید که نه تنها برنامه نویس هستند، بلکه اعتقاد دارید «مهندس نرم‌افزار» هم هستند، آنها را به کانال @SoftwarePhilosophy دعوت کنید.
این پیغام را برای آنها Forward کنید.
تست نرم افزار موضوعی مهم برای برنامه‌های موبایل است. با وجود نسخه‌های متعدد از سیستم عامل‌ها و دستگاه‌های متفاوت، تحت پوشش قرار دادن همه آن‌ها وقت گیر است. به همین دلیل اجرای تست اتوماتیک برای همه سیستم عامل‌ها و دستگاه‌ها بصورت موازی به جای اجرای ترتیبی آن‌ها، صرفه زمانی و اقتصادی بیشتری دارد. Appium ابزاری open source برای تست خودکار و موازی نرم افزارهای موبایل native ،hybrid و تحت وب روی iOS و Android یا Windows است.
توضیحات بیشتر در لینک‌های زیر ارائه شده است.

https://www.softwaretestingmagazine.com/knowledge/parallel-mobile-testing-with-appium-part-1-android/

https://appium.io/introduction.html?lang=en

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، بر روی لینک زیر کلیک کنید:

https://ow.ly/opgC30g2exl

#شراره_لطفی (https://ow.ly/xvC530dx8xL)

کانال تلگرام:
@SoftwarePhilosophy

___
Forwarded from فلسفه دیزاین
کتابخانه‌ها به شما بال میدن:
بررسی نسخه ۴۷ نرم‌افزار Sketch

چند وقت قبل با یکی از دوستانم که حالا به عنوان Android Engineer در شرکت Spotify کار می‌کند گپ می زدیم. Spotify بعد از منتشر کردن ویدئویی از نحوه کار تیم‌هایش، توجه خیلی‌ها از جمله من را به ساختار تیمی خود جلب کرد. برایم خیلی جالب بود بدانم در شرکتی با این تعداد تیم و این تعداد نیروی انسانی، دیزاینرها چطور دیزاین‌های خود را بصورت یکپارچه نگه می‌دارند؟

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

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

در مقاله امروز از زبان تیم Sketch می‌خوانیم که این نسخه شامل ۲ ویژگی مشخص به نام Library و Smooth Corner و چند بهینه‌سازی و بهبود کوچکتر است.
ویژگی Library دقیقا همان چیزی است که می‌تواند روند کاری تیم‌های دیزاین که بر روی یک محصول کار می‌کنند را کاملا تغییر داده و مشابه Spotify کند. اگر با Symbolها در Sketch کار کرده باشید، می‌دانید که با استفاده از آن‌ها می‌توان عناصری را ساخته و در جاهای مختلف دیزاین خود استفاده کنید؛ حال با تغییر یکی از نمونه‌های استفاده شده، تمامی آن‌ها به‌روز شده و تغییر اعمال شده را می‌پذیرند.
حالا در نسخه جدید Sketch، شما Symbolهایی دارید که می‌توانید آن‌ها در یک فایل جدا ذخیره کرده و از آن‌ها در فایل‌های مختلف استفاده کنید. با تغییر در یکی از نمونه‌ها، تمامی فایل‌ها تغییر عنصر مورد نظر را به شما اطلاع داده و به‌روز می‌شوند.
خیلی جالب است نه؟

در ادامه ویدئویی از کارکرد این ویژگی خواهیم دید.
پیشنهاد می‌کنم پس از دیدن ویدئو، باقی توضیحات را از زبان خود مقاله بخوانید.

https://blog.sketchapp.com/introducing-libraries-and-smooth-corners-in-sketch-47-2abc5dfc1fb3

(زمان حدودی مطالعه، ۷ دقیقه)

#بررسی #معرفی #ابزار #Sketch
@Dexign دیزاین

_
#پست_مجدد این پست تا به حال بیش از ۲۵۰۰ بار مشاهده شده و به نظر می‌رسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
لینوکس Ubuntu در Windows Store قرار گرفت! نتیجه همکاری Microsoft و Canonical امکان اجرای لینوکس روی سیستم عامل Windows 10 بدون استفاده از VM شده‌است. طبق گفته Scott Hanselman به زودی امکان اجرای موازی و مستقیم n نسخه لینوکس روی ماشین‌های Windows 10 (و بدون استفاده از VM) فراهم می‌شود.

https://www.hanselman.com/blog/UbuntuNowInTheWindowsStoreUpdatesToLinuxOnWindows10AndImportantTips.aspx

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، بر روی لینک زیر کلیک کنید:

https://ow.ly/EeFG30dIsnz

#مهران_داودی (https://ow.ly/GwIl309lFEm)

کانال تلگرام:
@SoftwarePhilosophy


___