کاری که یک برنامه نویس در یک ماه انجام میده ، دو برنامه نویس در دو ماه انجام میدن :/
-فرد بروکز
🖥 @FunProGraming
-فرد بروکز
🖥 @FunProGraming
🔰 دسته بندی #معماری_نرم_افزار
🔸معماری را میتوان از جنبههای مختلف مورد بررسی قرار داد. یک طراح پایگاه داده، همیشه از معماری داده صحبت میکند، طراح نرمافزار، از معماری نرمافزار و مدیر ارشد IT سازمان، از معماری اطلاعات سخن میگویند. برای معماری، دستهبندی خاصی در مراجع وجود ندارد ولی در برخی منابع ، برخی معماری های موجود را تشریح کرده است. در ادامه به معرفی عمده معماری های موجود میپردازیم که به صورت زیر میباشد :
1) معماری سیستم (System Architecture)
2) معماری نرمافزار (Software Architecture)
3) معماری سازمان (Enterprise Architecture)
4) معماری کسب و کار (Business Architecture)
5) معماری اطلاعات (Information Architecture)
6) معماری کاربرد (Application Architecture)
7) معماری داده (Data Architecture)
8) معماری تکنولوژی (Technology/Infrastructure Architecture)
9) معماری مرجع (Reference Architecture)
10) معماری خط تولید (Product-Line Architecture)
🖥 @FunProGraming
🔸معماری را میتوان از جنبههای مختلف مورد بررسی قرار داد. یک طراح پایگاه داده، همیشه از معماری داده صحبت میکند، طراح نرمافزار، از معماری نرمافزار و مدیر ارشد IT سازمان، از معماری اطلاعات سخن میگویند. برای معماری، دستهبندی خاصی در مراجع وجود ندارد ولی در برخی منابع ، برخی معماری های موجود را تشریح کرده است. در ادامه به معرفی عمده معماری های موجود میپردازیم که به صورت زیر میباشد :
1) معماری سیستم (System Architecture)
2) معماری نرمافزار (Software Architecture)
3) معماری سازمان (Enterprise Architecture)
4) معماری کسب و کار (Business Architecture)
5) معماری اطلاعات (Information Architecture)
6) معماری کاربرد (Application Architecture)
7) معماری داده (Data Architecture)
8) معماری تکنولوژی (Technology/Infrastructure Architecture)
9) معماری مرجع (Reference Architecture)
10) معماری خط تولید (Product-Line Architecture)
🖥 @FunProGraming
⚜ #معماری_نرم_افزار (معماری سیستم)
🔅بالاترین مفهوم در دستهبندیهای معماری، معماری سیستم میباشد. مفهوم معماری نرم افزار و معماری سیستم تقریباً یکسان است. به این دلیل که در بیان تعربف معماری نرم افزار در اصل معماری یک سیستم را تعریف میکنیم که این سیستم میتواند هر چیزی باشد. تعریف معماری سیستم را [IEEE 1471-00] ارائه میکنیم.
🔅معماری سیستم، مجموعهای است از موجودیت های یک سیستم، خصوصیات هر یک از آنها و رابطه بین آنها که یک ساختار برای سیستم تعریف میکنند.
🔅 اگر بخواهیم یک تعریف برای معماری نرمافزار (معماری سیستمهای نرمافزاری) یا معماری سیستمهای دیگر (مثل معماری سیستمهای تولیدی) ارائه کنیم، کافی است در تعریف معماری سیستم، بجای “موجودیتها”، موجودیتهای سیستم مورد نظر را قرار دهیم. ولی آنچه از مفهوم معماری برمیآید اینست که معماری، ساختارهای سطح بالای یک سیستم را شامل میشود. درنتیجه اگر بخواهیم تعریف معماری سیستم را برای سیستم های دیگری مثل سیستم های نرمافزاری بیان کنیم، باید موجودیتهای سطح بالای آن را بیان کنیم و در قسمت خصوصیات، چون به صورت Black Box به اجزاء نگاه میکند، فقط خصوصیات بیرونی آنها را در نظر میگیریم. موجودیتهای سطح بالای سیستمهای نرمافزاری، موئلفه های نرمافزاری و زیرسیستم های آن میباشند. درنتیجه تعریف معماری نرمافزار، بر اساس معماری سیستم، بدین صورت باید باشد:
معماری نرمافزار، مجموعه زیرسیستم ها و موئلفهها، خصوصیات بیرونی هر یک از آنها و ارتباطات بین آنها است که یک ساختار برای نرمافزار تعریف میکند.
🖥 @FunProGraming
🔅بالاترین مفهوم در دستهبندیهای معماری، معماری سیستم میباشد. مفهوم معماری نرم افزار و معماری سیستم تقریباً یکسان است. به این دلیل که در بیان تعربف معماری نرم افزار در اصل معماری یک سیستم را تعریف میکنیم که این سیستم میتواند هر چیزی باشد. تعریف معماری سیستم را [IEEE 1471-00] ارائه میکنیم.
🔅معماری سیستم، مجموعهای است از موجودیت های یک سیستم، خصوصیات هر یک از آنها و رابطه بین آنها که یک ساختار برای سیستم تعریف میکنند.
🔅 اگر بخواهیم یک تعریف برای معماری نرمافزار (معماری سیستمهای نرمافزاری) یا معماری سیستمهای دیگر (مثل معماری سیستمهای تولیدی) ارائه کنیم، کافی است در تعریف معماری سیستم، بجای “موجودیتها”، موجودیتهای سیستم مورد نظر را قرار دهیم. ولی آنچه از مفهوم معماری برمیآید اینست که معماری، ساختارهای سطح بالای یک سیستم را شامل میشود. درنتیجه اگر بخواهیم تعریف معماری سیستم را برای سیستم های دیگری مثل سیستم های نرمافزاری بیان کنیم، باید موجودیتهای سطح بالای آن را بیان کنیم و در قسمت خصوصیات، چون به صورت Black Box به اجزاء نگاه میکند، فقط خصوصیات بیرونی آنها را در نظر میگیریم. موجودیتهای سطح بالای سیستمهای نرمافزاری، موئلفه های نرمافزاری و زیرسیستم های آن میباشند. درنتیجه تعریف معماری نرمافزار، بر اساس معماری سیستم، بدین صورت باید باشد:
معماری نرمافزار، مجموعه زیرسیستم ها و موئلفهها، خصوصیات بیرونی هر یک از آنها و ارتباطات بین آنها است که یک ساختار برای نرمافزار تعریف میکند.
🖥 @FunProGraming
🌐 #معماری_نرم_افزار
💠 یکی از زیر شاخههای مهم و اصلی در مهندسی نرمافزار به شمار میرود.
💠 معماری باعث تقسیم بندی یک کل به بخش ها، و ارتباط بین بخش ها میشود که باعث بوجود آمدن گروه هایی از افراد، به صورت سازمانی، جغرافیایی یا در حدود و اندازههای مختلف میشود که به صورت مشترک برای حل یک مسئله بزرگ، تلاش میکنند.
💠 معماری یک راه حل تقسیم غلبه برای حل مسائل میباشد، به طوری که یک کل را به بخش ها شکسته و بعد از حل هر یک از بخشها، با استفاده از ارتباط بین بخش ها، باعث حل مسئله اصلی میشود.
💠 مفهوم معماری نرمافزار، طراحی سطح بالا میباشد. یعنی فاز طراحی را به دو سطح، طراحی سطح بالا و طراحی با جزئیات تقسیم میکنیم. در حقیقت هدف مشخص کردن دقیقتر حد فاصل این دو سطح میباشد به طوریکه بتوان هر عامل در فاز طراحی را در یکی از این دو سطح قرار داد.
🖥 @FunProGraming
💠 یکی از زیر شاخههای مهم و اصلی در مهندسی نرمافزار به شمار میرود.
💠 معماری باعث تقسیم بندی یک کل به بخش ها، و ارتباط بین بخش ها میشود که باعث بوجود آمدن گروه هایی از افراد، به صورت سازمانی، جغرافیایی یا در حدود و اندازههای مختلف میشود که به صورت مشترک برای حل یک مسئله بزرگ، تلاش میکنند.
💠 معماری یک راه حل تقسیم غلبه برای حل مسائل میباشد، به طوری که یک کل را به بخش ها شکسته و بعد از حل هر یک از بخشها، با استفاده از ارتباط بین بخش ها، باعث حل مسئله اصلی میشود.
💠 مفهوم معماری نرمافزار، طراحی سطح بالا میباشد. یعنی فاز طراحی را به دو سطح، طراحی سطح بالا و طراحی با جزئیات تقسیم میکنیم. در حقیقت هدف مشخص کردن دقیقتر حد فاصل این دو سطح میباشد به طوریکه بتوان هر عامل در فاز طراحی را در یکی از این دو سطح قرار داد.
🖥 @FunProGraming
🔶 مفهوم کیفیت #نرم_افزار و مشخصه های کیفی
🔹 سیستم های کامپیوتری در بسیاری از برنامههای کاربردهای بحرانی مورد استفاده قرار میگیرد. در این برنامهها یک نقص میتواندعواقب زیادی را به دنبال داشته باشد. توسعه دهندگان این سیستم ها، مسئول تشخیص و تعیین نیازمندی های این برنامههای کاربردی و ایجاد سیستم برای محقق سازی این نیازمندی ها هستند.
🔹 توسعه دهندگان سیستم های بحرانی، ابتدا نیازمندیهای برنامه مورد نظر را شناسایی میکنند، نرمافزار مورد نظر را طوری توسعه میدهند که نیازمندیهای مورد نظر را با منابع مقتضی پوشش داده شوند.
🔹 سیستم های بحرانی در حالت کلی نیازمند برخی مشخصههای دیگر نیز هستند که میتوان به کارایی، وابستگی، امنیت، سلامتی و برخی نیازهای مشابه اشاره کرد.
🔹 نیازمندیها در حالت کلی به دو دسته نیازمندیهای عملیاتی و نیازمندی های غیرعملیاتی تقسیم میشوند. نیازمندی های عملیاتی، عبارتست از توانایی سیستم در انجام کاری که برای آن ایجاد شده است. نیازمندیهای غیرعملیاتی که تحت عنوان مشخصههای کیفی از آنها یاد میشود، هر آنچه که غیر از نیازمندی های عملیاتی سیستم باشد، در این دسته قرار میگیرند. مانند کارایی، امنیت، هزینه ساخت و… .
🔹 کیفیت نرمافزار به صورت مستقیم با توانایی یک سیستم در قبال نحوه انجام نیازمندیهای عملیاتی و غیرعملیاتی آن در ارتباط میباشد. یک سیستم میتواند شامل مشخصههای زیادی همچون کارایی، قابلیت نگهداری، امنیت و… باشد. کیفیت هر یک از مشخصههای موجود، بر کیفیت کل سیستم تاثیر دارد. یعنی کیفیت کل سیستم تابعی از کیفیت تکتک این مشخصهها میباشد.
🔹 لازم به ذکر است که همیشه کیفیت این مشخصهها قابل اندازهگیری نیست.
🖥 @FunProGraming
🔹 سیستم های کامپیوتری در بسیاری از برنامههای کاربردهای بحرانی مورد استفاده قرار میگیرد. در این برنامهها یک نقص میتواندعواقب زیادی را به دنبال داشته باشد. توسعه دهندگان این سیستم ها، مسئول تشخیص و تعیین نیازمندی های این برنامههای کاربردی و ایجاد سیستم برای محقق سازی این نیازمندی ها هستند.
🔹 توسعه دهندگان سیستم های بحرانی، ابتدا نیازمندیهای برنامه مورد نظر را شناسایی میکنند، نرمافزار مورد نظر را طوری توسعه میدهند که نیازمندیهای مورد نظر را با منابع مقتضی پوشش داده شوند.
🔹 سیستم های بحرانی در حالت کلی نیازمند برخی مشخصههای دیگر نیز هستند که میتوان به کارایی، وابستگی، امنیت، سلامتی و برخی نیازهای مشابه اشاره کرد.
🔹 نیازمندیها در حالت کلی به دو دسته نیازمندیهای عملیاتی و نیازمندی های غیرعملیاتی تقسیم میشوند. نیازمندی های عملیاتی، عبارتست از توانایی سیستم در انجام کاری که برای آن ایجاد شده است. نیازمندیهای غیرعملیاتی که تحت عنوان مشخصههای کیفی از آنها یاد میشود، هر آنچه که غیر از نیازمندی های عملیاتی سیستم باشد، در این دسته قرار میگیرند. مانند کارایی، امنیت، هزینه ساخت و… .
🔹 کیفیت نرمافزار به صورت مستقیم با توانایی یک سیستم در قبال نحوه انجام نیازمندیهای عملیاتی و غیرعملیاتی آن در ارتباط میباشد. یک سیستم میتواند شامل مشخصههای زیادی همچون کارایی، قابلیت نگهداری، امنیت و… باشد. کیفیت هر یک از مشخصههای موجود، بر کیفیت کل سیستم تاثیر دارد. یعنی کیفیت کل سیستم تابعی از کیفیت تکتک این مشخصهها میباشد.
🔹 لازم به ذکر است که همیشه کیفیت این مشخصهها قابل اندازهگیری نیست.
🖥 @FunProGraming
🔳 سبک ها و الگوهای #معماری_نرم_افزار و نحوه ارزیابی و انتخاب آن ها
◽️ هر سیستم، از مولفههای مختلفی تشکیل شده است. هر سیستم را میتوان به روش های مختلف به مولفهها و روابط بین آنها شکست. در حقیقت سیستم ها را میتوان به مجموعههای مختلفی از موئلفهها و روابط بین آنها، افراز کرد.
◾️ برای سیستم های نرمافزاری، روشهای مختلفی برای شکستن سیستم به اجزاء و روابط، وجود دارد که هر کدام از این روش ها در سطوح بالا، یک معماری برای سیستم مورد نظر خواهند بود.
◽️ برخی از این روش ها یا معماریها، توسط معماران نرمافزار بارها برای سیستم های خاص ارائه شدهاند و به کرات مورد استفاده قرار گرفتهاند و کاربرد ها و توانایی های آنها تائید شده است و مجموعهای از معماریها و الگوهای معماری تشکیل شده است که معماران را در ارائه معماریها، یاری میکنند.
◾️ یعنی معماران، برای ارائه یک سبک معماری، میتوانند از این مجموعه از معماریها، استفاده کنند. هر یک از معماریهای این مجموعه را یک سبک معماری میگویند.
🖥 @FunProGraming
◽️ هر سیستم، از مولفههای مختلفی تشکیل شده است. هر سیستم را میتوان به روش های مختلف به مولفهها و روابط بین آنها شکست. در حقیقت سیستم ها را میتوان به مجموعههای مختلفی از موئلفهها و روابط بین آنها، افراز کرد.
◾️ برای سیستم های نرمافزاری، روشهای مختلفی برای شکستن سیستم به اجزاء و روابط، وجود دارد که هر کدام از این روش ها در سطوح بالا، یک معماری برای سیستم مورد نظر خواهند بود.
◽️ برخی از این روش ها یا معماریها، توسط معماران نرمافزار بارها برای سیستم های خاص ارائه شدهاند و به کرات مورد استفاده قرار گرفتهاند و کاربرد ها و توانایی های آنها تائید شده است و مجموعهای از معماریها و الگوهای معماری تشکیل شده است که معماران را در ارائه معماریها، یاری میکنند.
◾️ یعنی معماران، برای ارائه یک سبک معماری، میتوانند از این مجموعه از معماریها، استفاده کنند. هر یک از معماریهای این مجموعه را یک سبک معماری میگویند.
🖥 @FunProGraming
🔻معرفی برخی از سبک های متداول در #معماری_نرم_افزار
• سبک های متمرکز روی داده
• سبک های جریان داده ای
• سبک های ماشین مجازی
• سبک های فراخوانی و بازگشت
• سبک های سیستم شی گرا
🖥 @FunProGraming
• سبک های متمرکز روی داده
• سبک های جریان داده ای
• سبک های ماشین مجازی
• سبک های فراخوانی و بازگشت
• سبک های سیستم شی گرا
🖥 @FunProGraming
🔰مجموعه اجزا و #معماری_نرم_افزار و ارتباط بین آن ها
🔸 معماری نرمافزار، مجموعهای از اجزاء معماری و خصوصیات و رفتارهای بیرونی آنها و ارتباط بیرونی بین آنها است.
🔸 نکته بعدی که در شناخت و تحلیل معماری نرمافزار وجود دارد اینست که این اجزاء باید سطح مند باشند. یعنی تشکیل یک ساختار سطح مند از اجزاء و روابط، میدهند. ولی ممکن است چندین نوع ساختار ارائه دهیم.
🔸 به عنوان مثال در پروژههای مقیاس بزرگ، اجزاء مختلف بین تیمه ای مختلف تقسیم میشود.
🔸 فرض کنید برای چنین کاری یکبار سیستم را به صورت عملیاتی (تابعی) بین تیم تقسیم کنیم و بار دیگر به صورت دادهای بین تیمهای دیگر تقسیم کنیم.
🔸 در نتیجه ساختارهای متفاوتی برای توصیف یک سیستم مورد نظر خواهیم داشت. در نهایت معماری ساختارهایی از سیستم مورد نظر میباشد که این ساختارها اجزاء معماری و فقط خصوصیات و رفتارهای بیرونی هر جزء و ارتباط بیرونی بین آنها خواهد بود.
🖥 @FunProGraming
🔸 معماری نرمافزار، مجموعهای از اجزاء معماری و خصوصیات و رفتارهای بیرونی آنها و ارتباط بیرونی بین آنها است.
🔸 نکته بعدی که در شناخت و تحلیل معماری نرمافزار وجود دارد اینست که این اجزاء باید سطح مند باشند. یعنی تشکیل یک ساختار سطح مند از اجزاء و روابط، میدهند. ولی ممکن است چندین نوع ساختار ارائه دهیم.
🔸 به عنوان مثال در پروژههای مقیاس بزرگ، اجزاء مختلف بین تیمه ای مختلف تقسیم میشود.
🔸 فرض کنید برای چنین کاری یکبار سیستم را به صورت عملیاتی (تابعی) بین تیم تقسیم کنیم و بار دیگر به صورت دادهای بین تیمهای دیگر تقسیم کنیم.
🔸 در نتیجه ساختارهای متفاوتی برای توصیف یک سیستم مورد نظر خواهیم داشت. در نهایت معماری ساختارهایی از سیستم مورد نظر میباشد که این ساختارها اجزاء معماری و فقط خصوصیات و رفتارهای بیرونی هر جزء و ارتباط بیرونی بین آنها خواهد بود.
🖥 @FunProGraming
میخوای بدونی چجوری باید یه #مهندس_نرم_افزار بشی؟!👨🏻💻😻👩🏻💻
حتی بدون اینکه دانشگاه بری!!😃😉💪🏻
11 گام برای تبدیل شدن به یه مهندس نرم افزار موفق 😎👇🏻
گام اول: نسبت به انتخاب هدف نهاییتان دقت زیادی به خرج دهید و به آن متعهد باشید🎯🧐
گام دوم: زبان موردنظرتان را انتخاب کنید📚😛
گام سوم: تمرین، تمرین و تمرین …🙇🏻😈
گام چهارم: از ابزارهایی استفاده کنید که توسعهدهندگان واقعی استفاده میکنند🛠🤨
گام پنجم: کدهای دیگران را بخوانید📄🙄
گام ششم: پیدا کردن یک انجمن فعال در حوزه کسب تخصص مهندس نرمافزار🔍👥
گام هفتم: ساخت پروژه📑😌
گام هشتم: شبکه حرفهایتان را ارتقا بدهید📱🤔
گام نهم: قبل از مصاحبه کاری، یک مهندس نرمافزار حرفهای شوید🧑🏻💼👩🏻💼
گام دهم: مصاحبه شغلی خود را انجام دهید🗣😼
گام یازدهم: قبول کردن پیشنهاد شغلی به عنوان یک مهندس نرمافزار👩🏻💻🧑🏻💻
🖥 @FunProGraming
حتی بدون اینکه دانشگاه بری!!😃😉💪🏻
11 گام برای تبدیل شدن به یه مهندس نرم افزار موفق 😎👇🏻
گام اول: نسبت به انتخاب هدف نهاییتان دقت زیادی به خرج دهید و به آن متعهد باشید🎯🧐
گام دوم: زبان موردنظرتان را انتخاب کنید📚😛
گام سوم: تمرین، تمرین و تمرین …🙇🏻😈
گام چهارم: از ابزارهایی استفاده کنید که توسعهدهندگان واقعی استفاده میکنند🛠🤨
گام پنجم: کدهای دیگران را بخوانید📄🙄
گام ششم: پیدا کردن یک انجمن فعال در حوزه کسب تخصص مهندس نرمافزار🔍👥
گام هفتم: ساخت پروژه📑😌
گام هشتم: شبکه حرفهایتان را ارتقا بدهید📱🤔
گام نهم: قبل از مصاحبه کاری، یک مهندس نرمافزار حرفهای شوید🧑🏻💼👩🏻💼
گام دهم: مصاحبه شغلی خود را انجام دهید🗣😼
گام یازدهم: قبول کردن پیشنهاد شغلی به عنوان یک مهندس نرمافزار👩🏻💻🧑🏻💻
🖥 @FunProGraming
📚 تعاریف رسمی #مهندسی_نرم_افزار
📙 تحقیقات، طراحی، توسعه و تست سیستمهای عامل در سطح نرمافزار، کامپایلر، نرمافزار شبکه توزیع برای پزشکی، صنعتی، نظامی، ارتباطات، هوا فضا، کسب و کار، علمی و بهطور کلی برنامههای کاربردی محاسباتی
📗 برنامه سیستماتیک علمی و دانش فناوری و روشها و تجربههایی برای طراحی، پیادهسازی و تست و مستندسازی نرمافزار
📘 برنامهای سیستماتیک و منظم با قابلیت سنجش توسعه و عملکرد و نگهداری از نرمافزار
📕 یک از رشتههای مهندسی است که در رابطه با تمام جنبههای تولید نرمافزار است
📓 ایجاد و استفاده از اصول درست مهندسی برای بدست آوردن نرمافزاری که از لحاظ اقتصادی، قابل اعتماد و صرفه است و در ماشینهای واقعی به صورت کارایی عمل میکند
🖥 @FunProGraming
📙 تحقیقات، طراحی، توسعه و تست سیستمهای عامل در سطح نرمافزار، کامپایلر، نرمافزار شبکه توزیع برای پزشکی، صنعتی، نظامی، ارتباطات، هوا فضا، کسب و کار، علمی و بهطور کلی برنامههای کاربردی محاسباتی
📗 برنامه سیستماتیک علمی و دانش فناوری و روشها و تجربههایی برای طراحی، پیادهسازی و تست و مستندسازی نرمافزار
📘 برنامهای سیستماتیک و منظم با قابلیت سنجش توسعه و عملکرد و نگهداری از نرمافزار
📕 یک از رشتههای مهندسی است که در رابطه با تمام جنبههای تولید نرمافزار است
📓 ایجاد و استفاده از اصول درست مهندسی برای بدست آوردن نرمافزاری که از لحاظ اقتصادی، قابل اعتماد و صرفه است و در ماشینهای واقعی به صورت کارایی عمل میکند
🖥 @FunProGraming