Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
Forwarded from Iran Agile
"ما ساختمانهایمان را شکل می دهیم، پس از آن ساختمانها ما را شکل می‌دهند." چرچیل.

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

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

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

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

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

اما واقعاً کدام در مرکز توجه باید باشد؟
👇👇👇👇

https://www.allankellyassociates.co.uk/archives/4834/the-people-problem-problem-and-the-great-agile-divide/


@iranagile
Forwarded from کدهک
آموزش RabbitMQ و پیاده سازی الگوی Messaging

در این ویدیو به معرفی RabbitMQ می پردازیم و نحوه استفاده از آن را در NET Core. بررسی می کنیم. از RabbitMQ به عنوان Message Broker استفاده میشود که میتواند پیامها را درون صف نگه دارد و به ترتیب در اختیار سایر سرویس ها قرار دهد. این ابزار در پیاده سازی Distributed System ها و میکروسرویس ها کاربرد زیادی دارد.

https://codehaks.com/go/fpw
Forwarded from DotNetZoom (محمد جواد ابراهیمی)
قابلیت Decompile کد های #C در Visual Studio

قبلا در مورد اضافه شدن قابلیت Decompile کد های سی شارپ در VSCode توسط ILSpy گفته بودیم

این قابلیت برای Visual Studio هم وجود داره اما در حالت پیش نمایش هست و به صورت پیشفرض فعال نیست

جهت فعال سازی این قابلیت باید از منو Tools گزینه Options را انتخاب کرده و از قسمت Text Editor > C# > Advanced گزینه Enable navigation to decompiled sources رو تیک بزنین

بعد از فعال سازی روی کلاس/متدی که سورسش رو ندارین راست کلید و گزینه "Go to Definition" رو انتخاب کنین براتون Decompile کنه و کدشو نشونتون بده

این امکان هم توسط کتابخانه معروف ILSpy انجام شده و بار اولی که ازش استفاده کنین یه سوال (در مورد قبول License کتابخونه ILSpy) میپرسه که گزینه Yes رو باید بزنین

جهت استفاده از این قابلیت باید حداقل ویژوال استادیو 2019 نسخه 16.5 به بالا نصب داشته باشین (از منوی Help گزینه Check for Update میتونین چک کنین)
جهت مطالعه بیشتر اینجا و اینجا
______________
@DotNetZoom
اولین #گپ_تکنیکال «فلسفه نرم‌افزار»
با موضوع «Open Source and Community Driven Activity»

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

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

امروز، یکشنبه، ۸ فروردین، ساعت ۲۰:۰۰ منتظرتون هستیم. حتما تلگرامتون رو آپدیت کنین و برای اینکه اون تایم یادتون نره می‌تونین کانال (@SoftwarePhilosophy) رو تو تلگرامتون پین کنین موقع شروع متوجه بشید.

@SoftwarePhilosophy
Live stream started
Live stream finished (1 hour)
Talk 01
Software Philosophy
اولین #گپ_تکنیکال «فلسفه نرم‌افزار»
با موضوع «Open Source and Community Driven Activity»
سی شارپ ۹

قبلا راجع به ویژگی های سی شارپ ۹ صحبت کردیم و به مرور در آینده موارد دیگه‌ای رو هم بررسی می‌کنیم

برای شروع باید NET 5. و آخرین ویژوال استودیو را داشته باشید. (با نصب آخرین ورژن ویژوال استودیو NET 5. هم نصب می‌شه)

ویژگی Target Typing :

در اینجا شما می‌توانید هنگام Initilize کردن کلاس خود، نام آن را نیاورید ولی حتما باید نوع متغییر خود را مشخص کنید و نباید قبل از آن var گذاشته شود.
Person person = new();

اگر کلاس شما سازنده‌ای دارد که در ورودی آن مقداری می‌گیرد می‌توانید داخل پرانتز های new اون مقدار را وارد کنید:

Person person = new("John");

تا حالا اکثر اوقات اینگونه می‌نوشتیم 👇👇
var person = new Person
{
FirstName = "John"
};

الان احتمالا می‌خواهیم به این شکل تغییرش دهیم 👇👇
Person person = new
{
FirstName = "John"
};

ولی این خطای کامپایل می‌دهد. چرا؟
چون در این حالت یک anonymous object می‌سازد در حالی که ما فکر می‌کنیم Person می‌سازد.
برای رفع این مشکل باید دو تا پرانتز جلوی new بگذاریم

Person person = new()
{
FirstName = "test"
};

احتمالا با عملگر ?? آشنا هستید. این عملگر می‌گوید اگه سمت چپم نال بود مقدار سمت راستم را بردار ولی اگه نال نبود مقدار خودش را در نظر بگیر

interface IAnimal{}

class Dog : IAnimal{}

class Cat : IAnimal{}

Cat cat = null;
Dog dog = new();
IAnimal animal = cat ?? dog;

این حالت تا قبل سی شارپ ۹ قابل انجام نبود ولی با ویژگی Target Typing این cat و dog از یک نوع به حساب می‌آیند.


قبل از سی شارپ ۹

public ObservableCollection<Person> Person{ get; } = new ObservableCollection<Person>();
بعد از سی شارپ ۹

public ObservableCollection<Person> Persons { get; } = new();

🔸 مطالب تکمیلی را می‌توانید اینجا مطالعه کنید:

https://dotnetcoretutorials.com/2020/08/07/improved-target-typing-in-c-9/

https://www.thomasclaudiushuber.com/2020/09/08/c-9-0-target-typed-new-expressions/

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، برروی دکمه «نظرت را بگو» کلیک کنید.

#حامد_حاجیلو (http://bit.ly/2IVjfYD)

کانال تلگرام:
@SoftwarePhilosophy
________
Forwarded from فلسفه دیزاین
۵ اصل برای تعامل بهتر بین طراح و توسعه‌دهنده

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

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

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

https://bit.ly/dxgn651

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

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

#اصول‌تعامل #طراح #توسعه‌دهنده #تیم‌دیزاین

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

_____
معرفی System.Threading.Channels

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

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

در اینجا چالش‌های زیادی مطرح می‌شود که در System.Threading.Channels این چالش‌ها مد نظر قرار گرفته شده است که برنامه نویس می‌تواند بر روی چنل (صف) داده قرار دهد (Write) و یا در جای دیگری از داده‌های صف استفاده کند (Read).

افزودن داده بر روی چنل
await channel.Writer.WriteAsync(item);

خواندن داده از چنل
channel.Reader.ReadAllAsync()

توضیحات تکمیلی را اینجا بخوانید:

https://virgool.io/@hamedhajiloo96/system-threading-channels-z1kx0mctp7gp

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، برروی دکمه «نظرت را بگو» کلیک کنید.

#حامد_حاجیلو (http://bit.ly/2IVjfYD)

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

________
دومین #گپ_تکنیکال «فلسفه نرم‌افزار»
با موضوع: «Software Architecture: Maintainablity, Reusablity»

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

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

فردا چهارشنبه، ۲۵ فروردین، ساعت ۲۱:۰۰ منتظرتون هستیم. حتما تلگرامتون رو آپدیت کنین و برای اینکه اون تایم یادتون نره می‌تونین کانال (@SoftwarePhilosophy) رو تو تلگرامتون پین کنین موقع شروع متوجه بشید.

@SoftwarePhilosophy
Live stream started
Live stream finished (1 hour)
Talk 02
Software Philosophy
دومین #گپ_تکنیکال «فلسفه نرم‌افزار»
با موضوع: «Software Architecture: Maintainablity, Reusablity»

با حضور
#مهران_داودی
#یاسر_مرادی
#محمد_جواد_ابراهیمی

لطفا نظرتون رو هم در مورد گپ این هفته بنویسید برامون :)

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

در لینک زیر مفهوم فضا در معماری نرم‌افزار توضیح داده شده:

http://mehrandvd.me/2015/09/16/software-architect-its-all-about-spaces/



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

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

_____
معماری نرم‌افزار مانند معماری ساختمان یک هنر است

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

نکته جالب این است که انسان‌ها یا مشتریان در نهایت از فضا‌ها استفاده می‌کنند نه دیوارها! آنها پول خرج می‌کنند تا فضای زیبایی بخرند و به ندرت دیوارها را می‌بینند.

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

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


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


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

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

_____
Init only setters

در Csharp 9 با معرفی واژه کیلیدی init می توانیم خواص immutable را ساده‌تر پیاده سازی کنیم.

برای درک بهتر این موضوع وضعیت قبل از Csharp 9 و بعد از آن را بررسی می‌کنیم

قبل :

public DateTime RecordedAt { get; private set; }

در اینجا ما نمی‌توانستیم از روش Object Initializer برای مقدار دهی استفاده کنیم و باید با روش‌های دیگری مقدار دهی اولیه انجام می‌شد.

بعد از Csharp 9 :

public DateTime RecordedAt { get; init; }

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

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

توضیحات تکمیلی را در لینک زیر بخوانید:

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، برروی دکمه «نظرت را بگو» کلیک کنید.

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

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

________
کتابخانه یادگیری ماشین برای C++ کاران
فلش لایت برای دامنه‌های مختلفی سرویسی ارائه داده.
لینک‌های زیر برای علاقه‌مندان می‌تواند مفید باشد:
🌻 تشخیص صوت (پروژه wav2letter) - آموزش (لینک)

🌻طبقه‌بندی تصاویر

🌻تشخیص شئ

🌻مدل زبانی

github
@silicon_brain
Forwarded from فلسفه دیزاین
روش‌های اولویت‌بندی امکانات در روند طراحی محصول

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

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

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

۱- مدل کانو (Kano Model): این روش، ترجیحات مشتری را در ۵ دسته مختلف شامل «ابتدایی»، «عملکردی»، «سرگرم‌کننده»، «بی‌تفاوت» و «معکوس» دسته‌بندی می‌کند. در ادامه با بررسی امکانات مد نظر و ارزیابی آنها بر مبنای این دسته‌بندی، اولویت هریک از آنها را نشان می‌دهد.

۲- روش RICE: این روش با استفاده از چهار فاکتور «دسترسی»، «تاثیر»، «اطمینان» و «تلاش» امتیازی را برای هریک از امکانات مد نظر محاسبه می‌کند و در اولیت‌بندی آنها به شما کمک خواهد کرد.

۳- ماتریس تلاش-تاثیر: این روش که با عنوان ماتریس ارزش-پیچیدگی نیز شناخته می‌شود، ابزاری نسبتا ساده برای اولویت‌بندی است. بر مبنای این ماتریس دو وجهی، امکانات مختلف بر مبنای میزان تلاش مورد نیاز برای توسعه یک عملکرد و تاثیر آن در چهار دسته مختلف طبقه‌بندی می‎شوند.

۴- روش MoSCOW: این روش که بیشتر در توسعه نرم‌افزار کاربرد دارد، نیازها را در چهار دسته «حتما باید باشد»، «باید باشد»، «می‌تواند باشد» و «نیازی نیست باشد» طبقه‌بندی می‌کند. این روش، روشی مناسب برای اولویت‌بندی نیازهای حساس به زمان در چارچوب زمانی ثابت است تا اطمینان حاصل شود که مهم‌ترین قسمت‌ها زودتر توسعه داده می‌شوند.

۵- اولویت‌بندی WSJF: این روش که نام آن مخفف عبارت «Weighted Shortest Job First» است، معادله‌ای متشکل از چهار مولفه برای رتبه‌بندی امکانات است. این مولفه‌ها شامل «ارزش کاربر-بیزینس»، «بحران زمانی»، «کاهش ریسک و یا ایجاد شانس» و «حجم کار» است. با محاسبه این فاکتور برای نیازهای مختلف، می‌توان آنها را اولویت‌بندی کرد.

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

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

https://bit.ly/dxgn655

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

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

#طراحی_محصول #اولویت‌بندی
@Dexign فلسفه دیزاین

_____
👍1
سومین #گپ_تکنیکال «فلسفه نرم‌افزار»
با موضوع: «Software Architecture: Performance»

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

ما هم تصمیم گرفتیم گپ تکنیکال رو از طریق همین ابزار برگزار کنیم.
تو این دورهمی #مهران_داودی و #یاسر_مرادی هم صحبت خواهند کرد.

فردا دوشنبه، ۲۷ اردیبهشت، ساعت ۱۹:۰۰ منتظرتون هستیم. حتما تلگرامتون رو آپدیت کنین و برای اینکه اون تایم یادتون نره می‌تونین کانال (@SoftwarePhilosophy) رو تو تلگرامتون پین کنین که موقع شروع متوجه بشید.

@SoftwarePhilosophy

______
Live stream scheduled for