Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
الگوی "try-catch-finally" به زبان ساده

الگوی "try-catch-finally" در سی‌شارپ یک ساختار برنامه‌نویسی است که برای مدیریت خطاها استفاده می‌شود. این دستور در سی‌شارپ نسخه 1.0 معرفی شد و راهی برای مدیریت و بازیابی خطاهایی که ممکن است در حین اجرای یک برنامه رخ‌ دهد ارائه می‌دهد.

فلسفه‌ی پشت الگوی «try-catch-finally» این است که برنامه‌نویسان را قادر می‌سازد تا کدی بنویسند که بتواند خطاهای غیرمنتظره را به شیوه‌ای زیبا و کنترل شده مدیریت کند.

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

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

به طور کلی، الگوی "try-catch-finally" یک ابزار قدرتمند برای مدیریت خطاها در برنامه‌های سی‌شارپ است و بخشی ضروری از هر برنامه قوی و قابل اعتمادی است.

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

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

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

________
👍51👏1
سرنخ‌های شرطی

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

در این مقاله یاد ‌می‌گیریم که، زمانی که سرنخی را پیدا کردیم، آیا می‌خواهیم تا انتهای سرنخ را برسی کنیم یا برایمان همین اطلاعات که از این قسمت از سرنخ به دست‌آورده‌ایم کافی است؟ در واقع در این قسمت انواع Step ها را در زمان دیباگ کردن که به یک Breakpoint می‌رسیم را بررسی می‌کنیم.

برای این کار از ابزار View Result استفاده می‌کنیم تا بتوانیم در هر مرحله از برسی‌هایمان، نگاهی به مقادیری که قبلا داشته‌ایم هم داشته‌باشیم.

هر کارآگاهی روش مختص به خودش را دارد مثلا، یک نفر ترجیح می‌دهد که اگر یک سرنخ شرایط خاصی را داشت بررسی کند، یک نفر دیگر اگر آن سرنخ چند بار تکرار شود! این امکانات در محیط Visual Studio تعبیه شده که آن‌ها را با اسم Condition Breakpoint تعریف کرده‌اند.

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

برای خواندن قدم دوم می‌توانید از این لینک استفاده کنید.

قسمت اول را می‌توانید اینجا بخوانید.


⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

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

________
6👍3👏1
تسک‌های پس زمینه خود را به ما بسپارید!

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

مثلا هر شب ایمیل خاصی را به کاربران بخصوصی بفرستد. یا هر ساعت مجموع فاکتورها را محاسبه کرده و برای مدیر محصول sms کند و ...

برای پیاده سازی این سیستم راه‌های مختلفی مانند Hangfire و ... وجود دارد.

ولی در ASP.Net یکی از ساده‌ترین و در عین حال (به نظر من) ناشناخته‌ترین‌ها! خود سرویس پیشفرض IHostedService است.

می‌تونید از این لینک برای اطلاع از نحوه کار با این سرویس استفاده کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

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

________
👍17🔥61
چگونه در #C دو String را با یکدیگر مقایسه کنیم؟

به نظر سوال ساده‌ای است. اولین چیزی که به ذهن می‌رسد استفاده از == است.

این روش جواب می‌دهد ولی راه بهینه‌ای نیست. مخصوصا زمانی که به lower و upper تبدیل می‌کنید.

〰️〰️〰️〰️〰️
دو روش درست برای این کار وجود دارد.

استفاده از string.Compare

در اینجا اگر در مقایسه کردن، بزرگ و کوچک بودن حروف برای شما اهمیت دارد می‌توانید مقدار StringComparison.Ordinal را پاس دهید و اگر این موضوع اهمیت نداشته باشید می‌توانید StringComparison.OrdinalIgnoreCase را پاس دهید.

〰️〰️〰️〰️〰️

استفاده از String.Equal

در این متد هم می‌توانید از هر دو حالت Ordinal و OrdinalIgnoreCase برای مقایسه استفاده کنید.

〰️〰️〰️〰️〰️

از این لینک می‌توانید برای آشنایی با نحوه کارکرد این روش‌ها و درک بهتر موضوع استفاده کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

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

________
👍134👎2🔥2👏1
برای نگهداری آخرین وضعیت در بلیزور چه باید کرد؟

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

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

• آبجکت مدل HTML که همان UI صفحه است
• فیلدها و پراپرتی‌های مورد استفاده
• وضعیت سرویس‌های رجیستر شده

🔗 در این مقاله سه راه حل برای مدیریت state در بلیزور ارائه شده است و نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

🔗 لینک مقاله در ویرگول

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

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

________
👍9🔥92
۷ موردی که هر برنامه‌نویسی ملزم به رعایت کردن آن است!

🎯 هدف این مقاله افزایش کارآیی و تاثیر Developer ها است. در این مقاله ۷ مورد برای رسیدن به این هدف ذکر شده:

۱- انتخاب فناوری مناسب
در هنگام شروع پروژه، مهم‌ترین تصمیم، انتخاب زبان برنامه‌نویسی، دیتابیس، کتابخانه‌های مورد نیاز و ... مناسب است. یکی از روش‌های انتخاب این موارد، انتخاب تکنولوژی‌ای‌ است که قبلا با آن کار کرده‌اید. مثلا اگر شما یک NET Developer. باشید یا تیم شما یک تیم NET. ای باشد، به نظر منطقی‌تر می‌رسد که پروژه جدید اندرویدی خود را با تکنولوژی مربوطه در NET. پیاده سازی کنید (MAUI). اما این روش ممکن است همیشه جواب ندهد و در بعضی سناریوها نیاز داشته باشید تا از تکنولوژی‌های دیگری نیز استفاده کنید.

۲- انتخاب ابزار مناسب
یک برنامه نویس بعد از انتخاب تنکولوژی برای راحتی در ادامه کار و مدیریت بهتر کار باید ابزارهای مناسبی را انتخاب کند تا به او در پروسه تولید محصول کمک کند. برای مثل اگر شما قصد پیاده سازی سایت با تکنولوژی Blazor را دارید، بهترین ترکیب استفاده از Visual Studio برای برنامه‌نویسی و استفاده از Azure Devops برای بیلد و ریلیز و مدیریت تسک‌ها و تست‌های خودکار است.

۳- به حداقل رساندن کدها
حجم کم کد به خوانایی، توسعه پذیری، تست‌نویسی و ... کمک به سزایی می‌کند. برای رسیدن به این هدف می‌توان از اصل رایج DRY یا همان Don’t Repeat Yourself تبعیت کرد.


۴- تعریف و رعایت کردن Convention ها
در پروژه‌ها بهتر است همیشه همه برنامه‌نویس‌های تیم از مجموعه‌ای از قوانین از پیش تعریف شده تبعیت کنند تا چند‌دستگی در کدها پیش نیاید. از نحوه تعریف متغییرها یا در حالت کلی نام گذاری (Naming) گرفته تا مدلی که برای داکیومنت کردن و ... قرار است استفاده شود.
همچنین توصیه می‌شود که برای فرمت دهی به کدها نیز یک سری هماهنگی‌ها انجام شود. مثلا یک برنامه‌نویس با Prettier کار نکند و برنامه‌نویس دیگر با Code formatter دیگر.


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

۶- بازبینی مجدد کد (Code review)
باگ و اشتباهات عضو جدایی ناپذیر در یک محصول نرم‌افزاریست. پس بهتر است قبل از نهایی سازی کدهای خود، از هم تیمی خود بخواهید تا Pull request شما را Review کند تا احتمال وجود خطا و اشتباهات با دیدن مجدد کد توسط فرد دیگر کاهش یابد. این پروسه شاید در دید اول زمان‌بر باشد ولی در واقع باعث صرفه جویی در زمانی می‌شود که قرار است شما دنبال رفع باگ‌های ناشی از این اشتباهات باشید.

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

نسخه کامل این مقاله را می‌توانید در 🔗 اینجا بخوانید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

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

________
👍20🔥42
استفاده از any و unknown در TypeScript

هیچوقت در TypeScript از نوع any استفاده نکنید، اما چرا؟
چون استفاده از any به این معنی است که: «اصلا برایم مهم نیست که متغیر چه تایپی دارد» و خوب اولین دلیلی که به خاطر آن از TypeScript استفاده می‌کنیم خاصیت Type-base بودن است.

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

از ورژن 3 به بالای TypeScript، داده‌ای اضافه شده به اسم unknown
تایپ. unknown مثل تایپ any، هر مقداری را قبول می‌کند، با این تفاوت که وقتی از نوع unknown استفاده می‌کنید، تایپ اسکریپت یک Type check انجام می‌دهد و با این کار شما را مجبور می‌کند قبل از استفاده از متغیر یک چکینگ داشته باشید.
درواقع برخلاف any که می‌گوید «برای من مهم نیست که متغیر چه تایپی دارد»، unkonwn می‌گوید «مهم است تایپ متغیر چیست ولی الان تایپ را نمی‌دانم و در ادامه بررسی خواهد شد.»

برای فهم بهتر این مطلب می‌توانید این مطلب را مطالعه کنید.

⁉️ سوالات و نکات خود را در قسمت کامنت با ما در میان بگذارید.

#مریم_داودی (لینکدین)

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

_______
👍203🔥3
Forwarded from Software Philosophy
یکی از مهمترین کارهایی که یک معمار نرم‌افزار انجام می‌‌دهد تشخیص و خلق مفهومی به نام «فضا» است. اگر در نرم‌افزاری فضاها به درستی ساخته نشوند، برنامه نویسان دچار سردرگمی می‌شوند و عمدتا کدهای تکراری خواهند نوشت. ساخت فضاهای درست توسط معمار نرم‌افزار احتمال نوشته شدن کدهای تکراری یا اضافی را کم می‌کند.

در لینک زیر مفهوم فضا در معماری نرم‌افزار توضیح داده شده
http://mehrandvd.me/2015/09/16/software-architect-its-all-about-spaces/
👍5🔥52
پرفورمنس بهتر با @Key!

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

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

دستور @key به Blazor اجازه می دهد تا از یک کلید خاص برای مقایسه عناصر به جای ایندکس استفاده کند Blazor آیتم‌های موجود را با موارد جدید با استفاده از مقدار کلید مقایسه می کند. به این ترتیب اضافه‌ها/اصلاحات/حذف‌ها را بهتر تشخیص می‌دهد.

@foreach (var item in items)
{
<li @key="item.Id">@item</li>
}


با استفاده از @key اگر یک نمونه از مجموعه حذف شود، فقط همان نمونه از رابط کاربری حذف می‌شود و موارد دیگر بدون تغییر باقی می‌ماند.
اگر ورودی‌های مجموعه دوباره مرتب شوند، نمونه‌های مربوطه در رابط کاربری حفظ و مرتب می‌شوند.

چه زمانی از @key استفاده نکنیم؟

به طور معمول، استفاده از @key درون یک لیست وقتی مقدار مناسب برای تعریف @key وجود دارد، منطقی است. (به عنوان مثال در یک بلاک foreach)
هنگام رندر کردن با @key هزینه عملکردی وجود دارد. هزینه عملکرد زیاد نیست، اما فقط در صورتی @key را مشخص کنید که حفظ عنصر یا جزء به نفع برنامه باشد.


برای مشاهده توضیحات کامل می‌توانید از 🔗 این لینک و 🔗 این لینک استفاده کنید.

🔗 لینک ویرگول این پست.

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

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

_____
👍134🔥4
اعتیاد به ساخت نرم‌افزارهای جدید!

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

http://mehrandvd.me/2015/09/06/be-a-developer-not-a-programmer/

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

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

_____
👍7🔥32
فعال سازی Pre rendering در بلیزور

چرا باید در پروژه‌های بیلزور Pre rendering را انجام داد؟ بدون pre rendering دو مشکل در بلیزور سرور و کلاینت وجود دارد:

بلیزور کلاینت:
در این نسخه از بلیزور قبل از اینکه کاربر بتواند تعاملی با سایت داشته باشد همه‌ی content های سایت باید دانلود شود که این مورد زمان گیر است.

بلیزور سرور:
از آنجایی که ما به جاوا اسکریپت و SignalR نیاز داریم، در بهینه سازی وب سایت خود برای موتورهای جستجو مشکل خواهیم داشت. آنها اغلب یا جاوا اسکریپت را اجرا نمی‌کنند یا با WebSockets مشکل دارند.

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

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

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.
🔗 لینک مقاله در ویرگول

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

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

_____
🔥7👍62🎉1
تعریف مفهوم LINQ با مثال به ساده‌ترین حالت

سلام امروز می‌خواهیم در مورد LINQ بیشتر باهم بخوانیم. LINQ که مخفف Language Integrated Query است، قابلیتی مهم و قدرتمند در C# است که به برنامه‌نویسان این امکان را می‌دهد تا به صورت ساده و خوانا، داده‌های مختلف را در دسترس داشته باشند.

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

کاربردهای اصلی LINQ عبارتند از:
۱.جستجوی داده‌ها
۲.فیلتر کردن داده‌ها
۳.ترتیب‌بندی داده‌ها
۴.ترکیب داده‌ها
۵.پیمایش داده‌ها

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

در مقاله زیر می‌توانید مثال‌های مختلفی از LINQ را ببنید، که سعی کردم آن‌ها را با ساده‌ترین حالت ممکن توضیح بدهم :
• Filtering
• Projection
• Ordering
• Grouping
• Aggregation
• Joining
• Distinct
• Any and All
• Take and Skip

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

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

_________
👍17🔥43🎉1
جایگاه توسعه‌دهندگان نرم‌افزار در موفقیت یا شکست سیستم‌ها

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

برای مثال سیستم‌های موفق زیادی وجود دارند که با Java و یا C# نوشته شده‌اند. همچنین سیستم‌های بی‌کیفیت زیادی نیز وجود دارد که با Java و یا C# نوشته شده‌اند. این حقیقت نشان می‌دهد دلیل موفقیت یا شکست سیستم‌ها نمی‌تواند زبان برنامه‌نویسی باشد.

مقاله زیر توضیح می‌دهد که چطور طرز فکر برنامه‌نویس‌ها موفقیت و یا شکست یک سیستم را رقم می‌زند.

http://mehrandvd.me/2015/10/15/software-quality-comes-from-people-not-languages/

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

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

_____
👍102🔥2
چگونه تغییرات فایل‌ها را مانیتور کنیم؟

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

به طور کلی هر تغییری که شامل Creation، Deletion و یا Renaming فایل و فولدرها شود را می‌شود از طریق این کلاس مانیتور کرد.
با این کلاس می‌توانیم تغییرات فقط یک فایل خاص، و یا یک فولدر (دایرکتوری) به همراه تمام فایل‌ها و ساب دایرکتوری‌های آن فایل یا فولدر را پیگیری کنیم.

برای مثال اگر دایرکتوری به نام A داشته باشیم و داخل آن دو فایل B و C داشته باشیم، می‌توانیم به طور مجزا فقط تغییرات خود فایل B و C را نیز مانیتور کنیم، و یا به جای اینکار می‌توانیم دایرکتوری A را مانیتور کنیم. در این صورت هر تغییری که در دو فایل B و C رخ دهد قابل مانیتور کردن می‌شود.

علاوه بر این نکات، با استفاده از پراپرتی NotifyFilter این کلاس می‌توانیم تغییرات بیشتری به غیر از ایجاد شدن، حذف شدن و یا تغییر نام را پیگیری کنیم. مواردی مثل تغییر در Attributes ها، CreationTime و یا تغییراتی در سطح دسترسی و حتی تغییر سایز فایل یا فولدر و غیره ...

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

برای اینکه بدون افزایش سایز بافر دایرکتوری مورد نظر را مانیتور کنیم می‌توانیم از پراپرتی‌های این کلاس که در پایین معرفی می‌شود برای محدود کردن تغییراتی که باید توسط این کلاس مانیتور شود استفاده کنیم:

▪️ NotifyFilter
▪️ IncludeSubdirectories
▪️ Filter


🔗برای مطالعه بیشتر در مورد نحوه استفاده از این کلاس و مزایای آن می‌توانید از این لینک استفاده کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#زیبا_سیفائی (لینکدین)

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

_________
👍145🎉2🔥1🤩1
ویژگی‌هایی برای رهبری تیم

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

http://mehrandvd.me/2015/07/16/goalkeepers-vs-leaders-2/

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

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

_____
👍62🔥2🥰1
با حواس جمع از Transient در بلیزور استفاده کنیم!

در تزریق وابستگی به شکل Transient به ازای هر درخواست دهنده‌ی جدید، یک نمونه‌ی جدید از سرویس، توسط (Dependency injection container)DI Container ساخته می‌شود و در اختیار آن قرار می‌گیرد.
وظیفه‌ی DI Container، ایجاد یک نمونه از سرویس درخواست شده، تزریق آن به کلاس درخواست دهنده و در انتها از بین بردن یا Dispose شیء ایجاد شده از سرویس ثبت شده‌است.
در مدل Transient یک نمونه را نمی‌توان به بیش از یک کلاس مصرف کننده تزریق کرد، هر نمونه تزریق شده همیشه منحصر به فرد خواهد بود.

زمانی که DI Container یک نمونه از سرویسی که به صورت Transient رجیستر شده ایجاد می‌کند، آن را فراموش می‌کند. این سرویس‌ها زمانی توسط GC جمع آوری می‌شود که سرویس‌هایی که درون آن رجیستر شده‌اند جمع آوری شوند.
برای اینکه برنامه نویسان نگران dispose کردن سرویس‌های رجیستر شده نباشند، هنگامی که کانتینر Dispose می‌شود متد Dispose همه سرویس‌هایی که IDisposable را Impelement کرده اند را Call می‌کند.

برای اینکه چنین کاری را انجام شود، وقتی نمونه‌ای از سرویسی که IDisposable را پیاده سازی کرده است را ایجاد می‌کند و رفرنسی به این سرویس را در خود نگه می‌دارد.
اشیاء Transient معمولاً زمانی برای جمع‌آوری زباله واجد شرایط هستند که شیئی که به آن تزریق شده است برای جمع‌آوری زباله واجد شرایط باشد. مگر اینکه IDisposable را پیاده سازی کرده باشد. که در این حالت رفرنسی به این نمونه در Container نگهداری می‌شود. بنابراین زمانی کاندیدای جمع آوری شدن توسط GC می‌باشد که Container توسط GC جمع آوری شود.

همچنین Container تا زمانی که کاربر برگه برنامه Blazor را نبندد توسط GC جمع آوری نخواهد شد و این به این یعنی، علاوه بر این که با هر درخواست یک نمونه از شی که به صورت Transient رجیستر شده است ایجاد می‌شود، رفرنس‌ها هم تا پایان در Container نگهداری خواهد شد و اینجاست که Memory leak رخ می‌دهد!

بنابراین اگر می‌خواهید وابستگی‌ها را به‌عنوان Transient ثبت کنید، از انجام این کار برای کلاس‌هایی که IDisposable را به طور کامل پیاده‌سازی می‌کنند اجتناب کنید.


🔗 درک این مطلب در ابتدای کار شاید سخت باشد. در این مقاله نویسنده با ذکر مثال عملی، درک این موضوع را آسان تر کرده است.
🔗 لینک مطلب در ویرگول
___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

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

________
👍112🔥1🥰1🤩1
ارتباط بین کامپوننت‌ها در بلیزور:

بهترین راه ارتباطی بین کامپوننت‌ها در بلیزور چیست؟
سه تکنیک برای انجام این کار وجود دارد:

•  EventCallbacks
•  Cascading Values
•  State Container

EventCallbacks:
این ویژگی در NET Core 3 Preview 3. به بلیزور اضافه شد. که باعث می‌شود بتوان با استفاده از Action یا Func یک کالبک برای کامپوننت‌ها  تعریف کرد. هنگامی که از EventCallback برای ارتباط بین کامپوننت‌ها استفاده شود، متد کالبک، StateHasChanged را برای رندر کردن هرگونه تغییری صدا می‌زند‌. استفاده از EventCallback برای هندل ارتباط کامپوننت‌های تو در تو بسیار خوب است.

Cascading Values:
مقادیر و پارامترهای Cascade راهی برای ارسال یک مقدار از یک کامپوننت به همه فرزندان آن کامپوننت بدون نیاز به استفاده از پارامترهای سنتی کامپوننت است.
بلیزور دارای کامپوننتی ویژه به نام CascadingValue است. این کامپوننت اجازه می‌دهد تا هر مقداری که به کامپوننت داده می‌شود، به همه فرزندانش برساند. سپس کامپوننت‌های فرزند می‌توانند به ویژگی‌های نوع Cascade شده با  [CascadingParameter] دسترسی داشته باشند.
این باعث می‌شود هنگام ساخت کنترل‌های UI که نیاز به مدیریت برخی حالت‌ها دارند، گزینه‌ای عالی باشند.

State Container:
درجات مختلفی از پیچیدگی وجود دارد که می‌توانید هنگام اجرای یک State Container به آنها بروید. بسته به اینکه به ترتیب از Blazor سمت کلاینت یا سمت سرور استفاده می‌کنید، که می‌تواند کلاسی ساده باشد که به‌عنوان سرویس Singleton تزریق می‌شود. همچنین می توانید الگوی بسیار پیچیده تری مانند Flux را پیاده سازی کنید.

این راه از ۲ راه حل دیگر پیچیده‌تر است، هرچند با این راه حل می‌توان بسیاری از کامپوننت‌ها را در کل برنامه مدیریت و هماهنگ کرد.

🔗 لینک مقاله اصلی
🔗 برای توضیحات بیشتر  لینک مقاله در ویرگول را مشاهده کنید.

___

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

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

________
👍9🤩21
قورباغه را دوباره اختراع نکنید!

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

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


http://mehrandvd.me/2016/03/09/reinventing-the-frog/

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

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

_____
👍53🔥2👏1
۲۰ مارس، روزی که ChatGPT را به خواب بردند

یک تجربه بی‌نظیر! شرکت OpenAI در محصول ChatGPT باگی را پیدا می‌کند که به خاطرش سرورهایشان را خاموش می‌کنند.
مشکل این بود که من اگر پیغام جدیدی می‌نوشتم امکان داشت این پیغام در سیستم کاربر دیگری نمایش داده شود.

در ChatGPT از دیتابیس Redis استفاده شده است که عملکرد فوق‌العاده‌ای در سیستم کش دارد. برای اینکه در هر نوبت درخواست احتیاج به ارسال رکوئست به دیتابیس و لود مجدد دیتاها نباشد از این دیتابیس استفاده شده است.

حال به جای اینکه برای هر کانکشنی (برای راحتی می‌تونین هر کاری هم فرض کنید) یک Instance از شی Redis بسازند، از سیستم Redis Cluster استفاده می‌کنند که سربار خیلی کمتری را به سرورها وارد کنند.
همچنین برای برقراری ارتباط بین سرورها که پایتون است و سیستم کش دیتابیس که Redis است، از کتابخانه redis-py استفاده می‌کنند.

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

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

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

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

_______
👍126🥰1
یک .Net و این همه تایمر!

۶ کلاس مختلف تایمربرای .Net وجود دارد و هر تایمر کاربرد مخصوص خودش را دارا است.
تایمر‌های زیر مخصوص اجرای کد در thread های مخصوص UI می‌باشد.

* System.Windows.Forms.Timer
* System.Windows.Threading.DispatcherTimer

این تایمرها callback را در UI thread اجرا می‌کنند. در هر دوی این موارد وقتی در سمت UI یک ایونت Raise می‌شود، تنها یک Callback در لحظه اتفاق می‌افتد. بنابراین Thread safe می‌باشند.

تایمر دیگری که برای وب فرم‌ها وجود دارد، System.Web.UI.Timer است. این تایمر یک رویداد postback در سرور ایجاد می کند.

در نهایت سه تایمر دیگر وجود دارد که مخصوص UI نیستند:

* System.Threading.Timer
* System.Threading.PeriodicTimer
* System.Timers.Timer

ساده‌ترین و ابتدایی‌ترین نوع تایمر System.Threading.Timer است. این تایمر Callbackرا در ThreadPool برنامه ریزی می‌کند. اگر اجرای handler در زمان بیشتری نسبت به بازه زمانی مشخص شده برای اجرا طول بکشد، handler دوباره اجرا می‌شود و در نهایت با چندین handler در حال اجرا به صورت موازی مواجه خواهید شد.

تایمرSystem.Timers.Timer به صورت داخلی از System.Threading.Timer استفاده می‌کند و دارای چند ویژگی دیگر مانند AutoReset، Enabled، یا SynchronizingObject می‌باشد که امکان پیکربندی نحوه اجرای Callback ها را فراهم می‌کند. همچنین، رویداد Tick اجازه می‌دهد تا چندین handlerرا ثبت کنید. بنابراین، یک تایمر می‌تواند چندین handler را فعال کند. همچنین می‌توانید پس از راه اندازی تایمر، handler را تغییر دهید.

آخرین تایمر اضافه شده به کتابخانه‌های دات نت System.Threading.PeriodicTimer است. هدف اصلی این تایمر استفاده در حلقه‌ها و پشتیبانی از رویدادهای async است. این یک رویداد Tick ندارد، اما دارای متدی به نام WaitForNextTickAsync است. این متد یک ValueTask<bool> برمی‌گرداند که وقتی تیک بعدی آماده شد تکمیل می‌شود. مقدار bool نشان می دهد که آیا تایمر از بین رفته است یا خیر. بنابراین، می‌توانید از آن در یک حلقه while استفاده کنید. به لطف این طراحی، callback ها دچار overlap نمی‌شوند.

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.
🔗 لینک مقاله در ویرگول

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

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

_____
👍19🔥43👎1
تاثیر فضا بر معماری نرم‌افزار

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

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

توضیحات کامل مفهوم فضا و تاثیر آن بر مشتری را می‌توانید در لینک زیر بخوانید.

http://mehrandvd.me/2015/10/26/spaces-shape-your-software-architecture/

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

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

__________
5🔥3👍2