Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
Forwarded from DotNetZoom (Ali)
❇️ خواهشا از HttpClient درست استفاده کنیم! (قسمت اول)

کلاس HttpClient محبوب ترین کلاس برای ارتباطات Http است ولی متاسفانه اکثرا از آن بدستی استفاده نمیکنند!
در این پست میخواهیم Best Practice های آن را بررسی کنیم.

در دات نت، 3 کلاس پایه برای ارتباطات Http داریم :

1️⃣ کلاس HttpWebRequest : اولین و low-level ترین کلاس که کنترل بیشتری به شما می دهد

2️⃣ کلاس WebClient : یک محصور کننده hight-level بر روی HttpWebRequest که کنترل کمتری به شما می دهد ولی طرز استفاده آن ساده تر است

3️⃣ کلاس HttpClient : بهینه ترین کلاس موجود برای ارتباطات Http که مزایای هر دو کلاس قبل را داشته و در دات نت 4.5 به بعد (و نیز تمامی ورژن های NETCore) اضافه شد (البته پکیج Nuget آن برای دات نت 4.0 هم وجود دارد)

کلاس HttpClient نسبت به دو کلاس قبلی پرفرمنس بیشتری داشته و متد های اصلی آن (از جمله GetAsync و PostAsync و...) thread-safe است درنتیجه میتوان یک نسخه از آن به صورت Singleton ایجاد و به صورت concurrent استفاده شود.

یک قابلیت مهم دیگر این آن، امکان Chain کردن HttpMessageHandlers ها در HttpClient است (چیزی شبیه به Pipeline میدلور ها در ASP Core) که میتوان از آن برای Logging، Caching و Error handling و ... استفاده کرد (مثال)

4️⃣ کتابخانه RestSharp نیز یک کتابخانه third-party برای ارتباطات Http و مخصوصا REST بوده ولی درون خود از HttpWebRequest استفاده میکند نه HttpClient و پرفرمنس کمتری دارد (نزدیک به نصف!)

5️⃣ کتابخانه Refit هم هست که با قابلیت های مدرن زیادی داره و کار با RESTful API ها رو خیلی راحت میکنه و البته از HttpClient هم استفاده میکنه (در حال حاضر بهترین کتابخانه third-party)

🔰 نکته بسیار مهم، استفاده بهینه و صحیح از این کلاس است که متاسفانه خیلی ها به اشتباه از آن استفاده میکنند

🔸کلاس HttpClient نباید هربار و به ازای هر درخواست، ساخته (new) شود که در این صورت پرفرمنس را به شدت کاهش میدهد!

🔹با وجود اینکه استفاده از یک شی Singleton آن نسبت به ایجاد هر باره آن بهتر است ولی باز هم صحیح نیست و باعث میشود از تغییرات DNS آگاه نشود!

🔸قبلا گفتیم که فقط متد های اصلی آن thread-safe است، پس پروپرتی های آن مانند (DefaultRequestHeaders و BaseAddress و Timeout و ...) thread-safe نیست و نباید بین ترد های مختلف به صورت مشترک استفاده شود
مثلا اگر یک شی Singleton یا static از HttpClient داشته باشید و در میان ترد های مختلف از آن استفاده کنید ممکن است در آن واحد که یک ترد در حال درخواست زدن به یک url است، ترد دیگری BaseAddress آن را تغییر دهد

🔹با وجود اینکه کلاس کلاس HttpClient یک شی Disposable است ولی نباید به صورت دستی Dispose شود درنتیجه استفاده از آن در کنار using (برای Dispose خودکار) به شدت اشتباه است و باعث مشکل حادی را به نام sockets exhaustion (اشباع سوکت های باز) میشود.

🔸نکته قبل، برای خروجی متد های آن، یعنی کلاس HttpResponseMessage صادق نیست و آن هارا باید حتما توسط using یا به صورت دستی Dispose کرد (البته در حالت دستی اگر exception ایی رخ دهد Dispose رخ نخواهد داد پس باید در بلاک try finaly نوشته شود)

🔹نکته بسیار مهم دیگر این است که به هیچ عنوان از کلاس HttpClient به صورت sync استفاده نکنید، ارتباطات network یکی از مهمترین عوامل block کننده thread بوده و دلیل اصلی اینکه کلاس HttpClient فقط و فقط دارای متد های async است همین بوده.
در نتیجه، استفاده از متد های آن به صورت sync همراه با Task.Wait و Task.Result به شدت اشتباه است و باعث بلاک شدن ترد می شود. (این مقوله برای تمامی متد های async صادق است و حتی می تواند باعث dead-lock شود)

در قسمت بعد اصولی ترین و بهینه ترین روش کار با HttpClient را بررسی خواهیم کرد.
#Performance #HttpClient
__________________
@DotNetZoom
👍1
Forwarded from DotNetZoom (Ali)
❇️ خواهشا از HttpClient درست استفاده کنیم! (قسمت دوم)

در قسمت قبل روش های کار با Http و مزایا و معایب هرکدام را بررسی کردیم و به نکات و Best Practice های استفاده از HttpClient پرداختیم
در این قسمت میخواهیم بهترین روش استفاده از آن را بررسی کنیم

اصولی ترین و بهینه ترین حالت استفاده از HttpClient، استفاده از کلاس HttpClientFactory موجود در NET Core 2.1. به بعد است

این کلاس وهله سازی HttpClient و Dispose کردن آن را به صورت خودکار و استاندارد به عهده میگیرد و توسط مکانیزم Pooling (استخری از HttpClient ها) وهله های ایجاد شده را مجددا برای درخواست های بعدی استفاده می کند

بدین ترتیب HttpClientFactory از HttpClient های خود، به بهینه ترین نحو استفاده‌ی مجدد می‌کند و همچنین سربار ایجاد HttpClient‌های جدید نیز به حداقل می‌رسند.

در این روش دیگر مشکل نشتی حافظه یا کمبود منابع ناشی از Dispose نشدن HttpClient ها را نخواهیم داشت زیرا Lifetime وهله ها توسط HttpClientFactory مدیریت می شود
همچنین دیگر مشکل sockets exhaustion (اشباع سوکت های باز) و آگاه نشدن از تغییرات DNS را نخواهیم داشت

برای استفاده از این کلاس 4 روش موجود است
Basic usage
Named clients
Typed clients
Generated clients

روش Basic روش ساده و معمول آن است ولی معمولا در پروژه ها لازم است یک سری کانفیگ خاص را برای هر HttpClient تنظیم کنیم
مثلا HttpClient ایی که قرار است به سایت A درخواست بزند BaseAddress و Timeout و DefaultRequestHeaders (هدرهای پیشفرض) خود را دارد

از انجایی که این پروپرتی ها thread-safe نیستند بهترین راه استفاده از روش های Named clients و Typed clients است
نکته و محدودیت ای که در ورش Typed clients وجود دارد اینست که کلاس استفاده کننده از آن HttpClient الزاما به صورت Transient رجیستر میشود که باید مد نظر داشت و در صورت نیاز از روش Named clients یا ترفند های دیگر استفاده کرد.

روش Generated clients هم مخصوص استفاده از HttpClient توسط کتابخانه های third-party مانند Refit (که در قسمت قبل بررسی کردیم) است

برای یادگرفتن روش صحیح استفاده از HttpClient پیشنهاد میکنم حتما این 3 مقاله را بخوانید
https://www.dotnettips.info/post/2801
https://www.dotnettips.info/post/3022

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2


#Performance #HttpClient
_____________________
@DotNetZoom
Forwarded from فلسفه دیزاین
انتخاب مناسب ویژگی‌های محصول بر اساس مدل کانو

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

مدل کانو یک نظریه توسعه محصول و رضایت مشتری است که در دهه ۱۹۸۰ توسط پروفسور نوریاکی کانو ساخته شده‌است. کانو در این روش اولویت‌های کاربران را به سه دسته پایه، جذاب و عملکردی طبقه‌بندی می‌کند. استفاده از این تکنیک با در نظر گرفتن دو فاکتور رضایت و احساس مشتریان، باعث درک بهتر دیدگاه کاربران در مورد ویژگی‎‌های مختلف محصول می‌شود. این فاکتورها به طراحان کمک می‌کند تا بفهند که کدام ویژگی محصول باعث ایجاد لذت و یا ناامیدی در کاربران می‌گردد.

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

http://bit.ly/dxgn598

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

نویسنده: نیما‌ حکیم‌رابط

#مدل‌کانو #رضایت‌کاربر
@Dexign فلسفه دیزاین

___
Forwarded from Iran Agile
هر زمان که برای پیشرفت محصول خود نیاز به بیش از یک تیم توسعه داشته باشید، این انتخاب را دارید که: تیمها را براساس فیچرها یا کامپوننتها سازماندهی کنید، اصطلاحا تیمهای محصول در مقابل تیمهای کامپوننت. این مقاله توضیح می دهد که چرا این تصمیم برای افراد محصول اهمیت دارد و اینکه چه نوع تیمی در چه شرایطی مناسبتر است؟

بیشتر بخوانید در:
https://www.romanpichler.com/blog/feature-teams-vs-component-teams/

@iranagile
Forwarded from DotNetZoom (Ali)
❇️ عیب یابی و رفع مشکلات پرفرمنسی

در یکی از شرکت هایی که مشاور هستم از من خواسته شده تا مشکلات پرفرمنسی پروژه را پیدا کرده و مناسب ترین راه حل را به آنها پیشنهاد دهم

در هر پروژه ای احتمالا قسمت های زیادی قابل بهبود هستند (چه از لحاظ پرفرمنسی و چه از لحاظ معماری و کدنویسی تمیز و...) اما برای یافتن موثر ترین راه و البته کم هزینه ترین، باید ابتدا Bottleneck (گلوگاه) های سیستم را کشف کرده و سپس بر اساس «هزینه، زمان و منفعت» آنها را الویت بندی کنیم

برای کشف گلوگاه های سیستم (جاهایی که عامل اصلی افت پرفرمنس هستند) باید از ابزار های Profiler استفاده کنیم.
در کل پروفایلر های مختلفی وجود دارند که اکثرا پولی هستند در اینجا میخواهم بهترین آنها رو معرفی کنم

بهترین ابزار های Performance Profiler

1️⃣ برنامه ANTS Performance Profiler (محصول شرکت Redgate)
2️⃣ برنامه dotTrace (محصول شرکت JetBrains)
3️⃣ برنامه PerfView (محصولی "رایگان و سورس باز" از شرکت Microsoft)
4️⃣ برنامه CodeTrack (محصولی "رایگان و سورس باز")

هر چهار برنامه قابلیت های قوی و زیادی دارند از مهمترین شون میشه به موارد زیر اشاره کرد

🔸 قابلیت ثبت سلسله مراتب فراخوانی متد ها
توسط این قابلیت که اصلاحا بهش Call tree میگن میشه فهمید که چه متدی چه متد های دیگه ای رو فراخوانی کرده یا مثلا یک متد کلا چندبار صدا زده شده و هر متد چقدر به طول انجامیده (در قالب یک Timeline کامل) و ....

🔹 قابلیت ثبت تمام کوئری های اجرا شده بر روی دیتابیس
توسط این قابلیت میشه دید چه کوئری هایی و مثلا یک کوئری چندبار روی دیتابیس اجرا شده و هرکدوم چقدر زمان بره و...

🔸 قابلیت ثبت تمام Exception های رخ داده به همراه جزئیات و stacktrace

🔹 قابلیت نمایش تمام Thread های ایجاد شده و فرایند های انجام شده داخلش هر کدومشون و یا کلیه فرایند های انجام شده داخل یک Process

🔸 قابلیت پروفایل کردن همه برنامه ها از جمله
.NET Framework, .NET Core و ASP.NET, ASP.NET Core, Webservices, WCF, Windows Forms, Windows services, WPF ,IIS Website, IIS Express Website, Attach to a running process


❇️ این قابلیت ها برای عیب یابی به شدت مفید هستند چون توی یه سیستم با تراکنش بالا که بعضی مشکلات رو نمیشه پیش بینی کرد با این به راحتی میشه متد ها و یا کوئری های سنگین و اضافه ای که باعث افت پرفرمنس میشه رو پیدا کرد

❇️ هر دو برنامه ANTS و dotTrace پولی بوده و جز بهترین و محبوبترین برنامه های Performance Profiler هستند.
برنامه dotTrace یکپارچگی خوبی با Resharper داره و Visual Studio داره ولی شخصا با توجه به تجربه کاری با جفتشون، برنامه ANTS رو بیشتر می پسندم؛ کارکردن باهاش راحته و UX خوبی داره گزارشات و خروجی کاربردی تری نشون میده
ANTS Performance Profiler overview (ویدئو دمو برنامه)
https://www.youtube.com/watch?v=8mhC-Ji6-uU

❇️ برنامه PerfView هم تقریبا همین قابلیت ها رو داره ولی کارکردن باهاش سخت تره و UX خوبی نداره ولی چون رایگانه محبوبه
برنامه CodeTrack هم قابلیت هاش (نسبت به قبلی ها) کمتره ولی کارکردن باهاش راحته و UX متوسطی داره ونیز رایگانه

❇️ یه قابلیت خوبی که فقط dotTrace داره قابلیت Remote Profiling هست که توسط اون میتونین به برنامه هاتون روی یه سرور Remote دیگه متصل بشین و پرفایلش کنین

#Performance
____________________
@DotNetZoom
1
ساندویچ بندری، برای تیم‌های ریموت!

این عنوان موضوعیه که امروز (جمعه ۲۴ مراداد) ساعت ۵:۴۵ قراره در استیج @inotexevent در موردش صحبت کنم.
این صحبت یه جورایی ادامه سخنرانی پارسالم تو INOTEX 2019 با موضوع The Art of Thinking, But Together هست.

پس پیشنهاد می‌کنم قبلش از لینک زیر سخنرانی پارسال رو ببینید. مخصوصا اون قسمتش که در مورد دابل دایمند و «یه‌بل دایمند» صحبت می‌کنم!!
https://www.instagram.com/p/B-2kYQ4Ap9M/

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

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

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

۱- آیا چیزهایی که در اولین نگاه مشاهده می‌کنید، منطبق بر انتظارات کاربر است؟

۲- آیا می‌توانید در نگاه اول نوع اطلاعات موجود در صفحه را متوجه شوید؟

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

پیش از این، در مقاله زیر در مورد الگوهای اسکن اطلاعات صحبت کرده بودیم:

https://news.1rj.ru/str/Dexign/563

برای بهبود اسکن‌پذیری صفحات، رعایت نکات زیر مؤثر خواهد بود:

۱- اولویت‌بندی محتوا براساس سلسله‌مراتب بصری
۲- قرار دادن قسمت اصلی مسیر اطلاعات در هدر وبسایت
۳- حفظ تعادل فضای منفی
۴- مشاهده شدن دکمه‌های CTA در یک نگاه
۵- بررسی خوانایی محتوا
۶- استفاده از اعداد و ارقام به جای کلمات
۷- ارائه یک موضوع در هر پاراگراف
۸- استفاده از لیست‌های شماره‌گذاری شده و مشخص شده
۹- هایلایت کردن اطلاعات مهم
۱۰- استفاده از عکس و تصویرسازی

برای آشنایی بیشتر با این موضوع و نکات مؤثر، مقاله زیر را مطالعه کنید:

http://bit.ly/dxgn603

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

نویسنده: محمدرضا پناهی

#اسکن‌پذیری #معماری‌اطلاعات
@Dexign فلسفه دیزاین

ـــــــــ
Forwarded from Iran Agile
🍜۱۱ استراتژی برای رفع وابستگی مابین تیم‌های چابک

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

دلایل زیادی برای وجود این وابستگی ها وجود دارد: مانند ساختار سازمانی، عدم فرا-وظیفه‌ای بودن تیم، معماری نامناسب، سیستم‌ها یا فرآیندهای قدیمی، مقاومت در برابر تغییر و ...

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

در ادامه ۱۱ استراتژی در خصوص مواجهه با این وابستگی ها معرفی شده است:

https://medium.com/@caminmccluskey/11-strategies-for-managing-dependencies-between-agile-squads-aac11e3c1f11

@iranagile
Forwarded from DotNetZoom (Ali)
❇️ پیاده سازی راحت تر درگاه های پرداخت با Parbad

پرباد یه کتابخونه کاربردی و راحت جهت پیاده سازی درگاه های پرداخت هست و از ASP.NET CORE و AS.PNET MVC و ASP.NET WebForms پشتیبانی میکنه
این کتابخونه از انواع درگاه های زیر پشتیبانی میکنه، همچنین یه درگاه پرداخت تستی هم براتون میسازه که در زمان توسعه بتونین راحت تر پرداخت هاتون رو تست کنین.
✔️Mellat
✔️Melli
✔️Saman
✔️Pasargad
✔️Parsian
✔️Iran Kish
✔️Asan Pardakht
✔️ZarinPal
✔️Pay.ir
✔️IDPay.ir
🔰اینم اموزش فارسیش
https://www.dotnettips.info/post/3009
https://www.dotnettips.info/post/3011
https://www.dotnettips.info/post/3012
https://www.dotnettips.info/post/3013

🗂البته داکیومنت خودش بروز تره
https://github.com/Sina-Soltani/Parbad/wiki

https://github.com/Sina-Soltani/Parbad
____________
@DotNetZoom
👍1
Forwarded from فلسفه دیزاین
قانون آشنایی جیکوب

الگوهای طراحی یا (Design Patterns) زمانی ایجاد می‌شوند که مدت زیادی را کاربران با آن رابط و تجربه‌ی کاربری مشغول هستند و بهترین راه‌حل ممکن را دریافت کرده‌اند.

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

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

bit.ly/dxgn607

(زمان حدودی مطالعه: ۵ دقیقه)

نویسنده: حسین میرزاده

#تجربه_کاربری #قانون_آشنایی_جیکوب #الگوی_طراحی

@Dexign فلسفه دیزاین

_____
Forwarded from Iran Agile
طول اسپرینت باید چقدر باشد؟

بستگی دارد...
جواب مشاورها برای این سوال دقیقاً همین خواهد بود. اما دقیقاً به چه چیزی بستگی دارد؟

اسپرینت قلب اسکرام است، یک بازه‌ای زمان ثابتِ یک‌ماهه یا کمتر که طی آن، یک فرآورده «تکمیل‌شده»، قابل‌استفاده و بالقوه قابل‌ارائه، ساخته می‌شود.

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

اما دقیقاً در تعیین طول اسپرینت باید به چه عواملی توجه داشته باشیم؟

https://medium.com/serious-scrum/how-long-a-sprint-should-be-c41a12494471

@iranagile
Forwarded from DotNetZoom (Ali)
❇️ نکاتی در مورد تست نویسی روی EF6 / EFCore توسط دیتابیس InMemory

🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه

🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.

🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده

🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)

نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.

این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظه‌ی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا می‌شود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده

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

🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم

🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
#پست_مجدد این پست تا به حال نزدیک به ۱۰۰۰ بار مشاهده شده و به نظر می‌رسد برای خوانندگان جدید کانال جذاب باشد.
Forwarded from Software Philosophy
مفهوم Collectionها در جاوا و نحوه استفاده از آن‌ها مبحث بسیار جذاب و مهمی برای هربرنامه نویس جاوا (یا حتی غیر جاوا) است. همانطور که می‌دانیم مبحث ساختمان‌های داده در جاوا به دو قسمت عمده Collection و Map تقسیم می‌شود که قسمت‌های اول به Collectionها اختصاص دارد . خود collection ها هم به List ها، Setها و ueue ها تقسیم می‌شود.
لینک زیر مقدمه‌ای بر این قسمت ارائه می‌دهد:

https://bit.ly/2x0dMx2

#شهریار_انتظام (http://ow.ly/qDN430nPiCg)

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

___
Forwarded from فلسفه دیزاین
مبانی سلسله مراتب بصری

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

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

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

برای آشنایی بیشتر با اصول ایجاد و بهبود سلسله مراتب بصری مقاله زیر را مطالعه کنید:

https://bit.ly/dxgn612

(زمان حدودی مطالعه: 15 دقیقه)

نویسنده: محمدرضا پناهی

#سلسله_مراتب #طراحی_بصری #تجربه_کاربری

@Dexign فلسفه دیزاین

______
Forwarded from Iran Agile
😡 پنج تکنیک رفع تعارض در تیم‌ها

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

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

🔨 در اینجا پنج روش برای رفع تعارض معرفی شده است

🔗https://www.leadinganswers.com/2020/07/5-tools-for-team-conflict-resolution.html

@iranagile
Forwarded from DotNetZoom (Ali)
❇️ استفاده از MongoDb در سیستم احراز هویت ASP.NET Core Identity

اگه توی پروژه ASPNET Core ایی تون از MongoDb استفاده میکنین و میخواین از سیستم احراز هویت Identity روش پیاده کنین
این کتابخونه (AspNetCore.Identity.MongoDbCore) کار یکپارچه سازیش رو براتون انجام میده

کتابخانه های زیادی برای پشتیبانی از MongoDb در Identity وجود دارند که من همشون رو بررسی کردم و این بهترینشون و کاملترینشون بود (بعدشم این یکی AspNetCore.Identity.Mongo)

🔰لینک ریپازیتوری گیتهاب (اموزششم توش هست)
https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore

#MongoDb #Identity
__________________
@DotNetZoom
Forwarded from فلسفه دیزاین
نکات موثر برای کار از راه دور

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

۱- فضای کاری مشخصی برای خود در خانه ایجاد کنید.

۲- بین فعالیت‌های شغلی و کارهای شخصی خود در خانه مرزبندی ایجاد کنید.

۳- ساعت کار منظمی برای خود تعیین کنید و در آن زمان در دسترس سایر اعضای تیم باشید.

۴- وضعیت کاری خود را به طور مستمر با هم تیمی‌های خود به اشتراک بگذارید.

۵- با اعضای تیم خود در ارتباط باشید و در مسائل مختلف همفکری کنید.

۶- از ابزارهای برنامه‌ریزی مثل ترلو، آسانا، تسکولو و ... جهت ایجاد نظم در فعالیت‌های تیم استفاده کنید.

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

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

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

https://bit.ly/dxgn613

(زمان حدودی مطالعه: ۵ دقیقه)

نویسنده: نیما‌ حکیم‌رابط

#دورکاری #کارتیمی
@Dexign فلسفه دیزاین

______
Forwarded from Iran Agile
👌 چهار روش برای نابود کردن یک تیم چابک توسط یک مدیر/مالک محصول

1. عدم تمرکز یا چشم انداز

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

2. ارتباطات ضعیف پیرامون اهداف و نتایج

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

3. عدم داشتن اختیارات در زمینه اولویت بندی بک لاگ محصول

"آنچه" تیم روی آن کار می کند، مسئولیت PO است. بدون داشنن سطح مناسبی از اختیارات در حوزه تصمیم گیری، تیم در یک چرخه ثابت گرفتن تأییدها یا چرخه ثابت کار مجدد، قرار خواهد گرفت و شاهد پیشرفت چشمگیر نخواهیم بود.

4- عدم احترام به تیم

عبارات زیر را در نظر بگیرید:
کسی به من اهمیت نمی دهد.
شما به اندازه کافی کار نمی کنید.
چطوری میتونه اینقدر طول بکشه؟
شما بچه ها متعهد نیستید که این محصول را موفق کنید.
گفته های فوق نتیجه ناامیدی است که احتمالاً ناشی از عدم درک پیچیدگی های اجرا است. اگر شما یک PO هستید و هر یک از این گفته ها یا موارد مشابه، از دهان شما خارج شده اند - لطفاً این کار را نکنید. اظهاراتی چنین کلی و مبهم که تلقین میکند "تیم اهمیتی به کار نمی دهد"، هرگز و هرگز مولد نیست.

متن کامل
https://medium.com/serious-scrum/4-ways-a-product-owner-can-destroy-a-scrum-team-e6e5cff59eac

@iranagile
Forwarded from کدهک
آموزش آپلود کردن فایل در ASP NET Core

در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.

https://codehaks.com/go/eoz
Forwarded from DotNetZoom (ALI_1992)
کتابخانه اعتبارسنجی FoolProof برای ASP.NET Core

خیلی وقتا لازم میشه یه سری اعتبارسنجی روی مقادیر ورودی کاربر داشته باشیم. مثلا مقدارش کمتر یا بیشتر از فلان مقدار نباشه و ... تو این شرایط معمولا خودمون میایم و یه Attribute Validation سفارشی ایجاد میکنیم (که تازه اعتبار سنجی سمت کلاینت با jQuery رو هم نداره و فقط سمت سرور چک میشه) ولی الان میخوام یه کتابخونه رو معرفی کنیم که کارتون رو خیلی راحت میکنه.

🔸کتابخانه FoolProof.Core تعداد زیادی Attribute برای اعتبار سنجی مقادیر کاربر داره که همگی علاوه بر Server-side از Client-side Validation هم پشتیبانی میکنن. نسخه قدیمی آن (foolproof) برای ASPNET MVC سابق است.
(آموزش استفاده از آن در سایت dotnettips) ولی این نسخه از ASPNET Core پیشتیبانی میکنه

🔹لیست Attribute های پشتیبانی شده:
✔️ Is
✔️ EqualTo
✔️ NotEqualTo
✔️ GreaterThan
✔️ LessThan
✔️ GreaterThanOrEqualTo
✔️ LessThanOrEqualTo
✔️ Improved required validators:
✔️ RequiredIf
✔️ RequiredIfNot
✔️ RequiredIfTrue
✔️ RequiredIfFalse
✔️ RequiredIfEmpty
✔️ RequiredIfNotEmpty
✔️ RequiredIfRegExMatch
✔️ RequiredIfNotRegExMatch
✔️ In
✔️ NotIn

🔰لینک پکیچ Nuget و مخزن گیتهاب
https://www.nuget.org/packages/FoolProof.Core/
https://github.com/rpgkaiser/FoolProof.Core

#FoolProof #Validation #اعتبارسنجی
__________________
@DotNetZoom