توسعه نرم افزار شبیه چیست ؟
اگر بخواهم توسعه نرم افزار را به چیزی تشبیه کنم ، قطعا آن را به تربیت یک نوزاد تشبیه خواهم کرد. نوزاد وقتی به دنیا می آید کاری به غیر از گریه کردن ندارد. این گریه کردن ها و داد زدن ها مشابه کاری است که کُدها انجام میدهند.
نوزاد برای رفع نیاز گرسنگی اش گریه می کند و نیاز به شیر مادر دارد. حال حکایت کدها مانند همین شیر مادر است. نیاز تغذیه ای اصلی یک نرم افزار کدُ می باشد. مانند نیاز تغذیه ای یک نوزاد.
مانند کودکی که بعد از مدتی رشد میابد و نیازهایش بیشتر و بیشتر می شود ، نرم افزار هم بعد از مدتی نیازهای مختلف پیدا می کند و دیگر شیر مادر یا همان کُدها نیازهایش را تامین نمی کنند.
کودک برای رشد نیاز به یادگیری از روش و اسلوب پدر و مادر خودش دارد و این پدر و مادر هستند که به او می آموزند چگونه رفتار کنند.
ساخت نرم افزار هم پس از گذشت مدتی نیازهای مختلفی پیدا می کند که باید از پدر ومادرش که همان سیستم جاری (AS-IS) است ، این نیازها را تامین کند. در حقیقت نرم افزار مانند بچه ای در سازمان است که می تواند کار همه پدر و مادرها را خیلی سریعتر از خودشان انجام دهد، اگر و فقط اگر نرم افزار به درستی توسعه یافته و تربیت شود.
تربیت نرم افزار مرحله بعد از توسعه است که صحبت کردن در مورد آن خارج از چارچوب این بحث میباشد و خود یک مقوله پیچیده است. اما همین را بدانید که تربیت نرم افزار همان کارهایی است که متخصصان هوش مصنوعی و بیگ دیتا ، با نرم افزار مربوطه انجام میدهند و آن را برای شرایطی قابل پیش بینی تربیت می کنند. این را به یاد داشته باشید که هیچ نرم افزاری نمی تواند در شرایط غیرقابل پیش بینی کار درست را انجام دهد. همه شرایط در نرم افزار پیش بینی شده است. حتی شبکه های عصبی در نرم افزار هم با ورود یک ویروس که همان شرایط غیر قابل پیش بینی است ، امکان دارد به کل از کار بیافتد. منظورم این بود که فعلا تربیت نرم افزار در مقایسه با توسعه در مراحل ابتدایی رشد و نمو خویش است.
مباحث و کتاب های خیلی زیادی در مورد توسعه نرم افزار وجود دارد. البته توسعه نرم افزار یک سری نیازهای پایه دارد که میشود گفت در اکثراٌ حوزه های ساخت نرم افزار از این موارد بنابر نیاز ، استفاده خواهد شد.
بعد از مطالعه کتاب های مختلف در مورد توسعه نرم افزار ( حدود 300 جلد کتاب در طول 8 سال) ، کتابی را یافتم که می توان گفت مراحل توسعه و ساخت یک نرم افزار را به صورت خیلی خیلی خلاصه و روان بیان کرده است.
در باره کتاب توسعه ، طراحی و دیباگ نرم افزار
Software Development, Design and Coding With Patterns, Debugging, Unit Testing, and Refactoring
کتابی است که آقای John F. Dooley در سال 2017 آن را نوشته و توسط انتشارات Apress منتشر شده است.
کتاب جامع و خلاصه ای است. اما اگر بخواهم عمیق تر در مورد هر یک از فصل های این کتاب بحث کنم می توانم برای هر کدام از موضوعات مربوطه در فصولی که در این کتاب معرفی شده است ، چندین کتاب معرفی کنم.
منظورم اینست که ا اگر کسی تا حدودی با نرم افزار و توسعه نرم افزار آشنایی دارد و به دنبال موضوعات مرتبط با توسعه نرم افزار است ، می تواند این کتاب را مطالعه کند و به اطلاعات خوبی در مورد توسعه و مباحث مطرح شده در آن، دست یابد.
اما آنهایی که چندین و چند سال است در مورد توسعه نرم افزار وساخت آن مطالعه می کنند و تجربه دارند ، این کتاب مانند یک کتاب داستان خواهد بود. یعنی خواندن و نخواندش فرقی به حال کسی ندارد.
اما اگر همین متخصصان بخواهند در مورد توسعه نرم افزار به طور خلاصه برای کسی یا در کنفرانسی توضیحی بدهند، مطالعه این کتاب مفید خواهد بود.
وقتی هم به پشت جلد کتاب یک نگاهی می اندازم ، متوجه این موضوع خواهم شد. (سطح مطالب کتاب)
فصل اول کتاب با مقدمه ای بر توسعه نرم افزار شروع میشود و در قسمت اول همین فصل ابتدایی می نویسد که ما داریم چه کاری می کنیم ؟
کمی در مورد تاریخچه نرم افزار توضیح میدهد و می نویسد که از همان موقع مشکلات توسعه نرم افزار وجود داشته و با وجود اینکه حدود 70 سال از عمر حوزه و رشته نرم افزار می گذرد، این مشکلات همچنان گریبان گیر شرکت ها و افراد هستند.
متن اصلی کتاب را در زیر برایتان نوشته ام. در قسمت هایی که حس میکنم کتاب اطلاعات را دقیق تر منتقل می کند، همان متن اصلی خود کتاب را رونوشت می کنم.
What We’re Doing?
It turns out that, after 70 or so years of using computers, we’ve discovered that developing software is hard. Learning how to develop software correctly, efficiently, and beautifully is also hard. You’re not born knowing how to do it, and many people, even those who take programming courses and work in the industry for years, don’t do it particularly well. It’s a skill you need to pick up and practice—a lot. You don’t learn programming and development by reading books—not even this one. You learn it by doing it. That, of course, is the attraction: to work on interesting and difficult problems. The challenge is to work on something you’ve never done before, something you might not even know if you can solve. That’s what has you coming back to create new programs again and again.
خب با وجود این مشکلات آیا راه حل هایی هم برای درمان وجود دارد ؟
اصلا چگونه باید یک نرم افزار را توسعه دهیم تا کمتر با این مشکلات روبه رو شویم ؟
همان نکته ای را که بالاتر گوشزد کرده بودم ، خود این کتاب هم آن را بیان می کند و هشدار می دهد. آن هم با قطعیت.
So, How to Develop Software?
The first thing you should do is read this book. It certainly won’t tell you everything, but it will give you a good introduction into what software development is all about and what you need to do to write great code. It has its own perspective, but that’s a perspective based on 20 years writing code professionally and another 22 years trying to figure out how to teach others to do it.
خب از این کتاب که بگذریم اولین چیزی که باید در توسعه نرم افزار در نظر بگیریم، Process Model است. به طور خیلی ساده پراسس مادل ، ترتیب انجام کارهای توسعه نرم افزار را توضیح می دهد.
اما اگر کمی دقیق تر شویم ، در می یابیم که ابتدایی ترین قسمت توسعه نرم افزار از دو لغت تشکیل شده است.
Process : روال کارها ، و
Model : که یک ساده سازی از واقعیت است.
Software Development Lifecycle
اما در مرحله بعد از پراسس مادل، یک بخش مهم وجود دارد و آن SDLC است که مخفف عبارت Software Development Lifecycle است.
SDLC مجموعه کارهایی که برای توسعه یک سیستم نرم افزار باید انجام گیرد را مشخص می کند. خب تا اینجا به طور ساده دو نکته را فهیمدیم که Process Model ترتیب انجام کارها را مشخص می کند و SDLC هم لیست کارهایی که باید انجام دهیم را ، مشخص می کند.
به طور مثال : SDLC اعلام می کند که باید ساخت نرم افزار یا Construction انجام گیرد و Process Model هم می گوید که کِی یا در کدام مرحله باید انجام گیرد. بحثی از چگونه یا چطوری بودن Construction در این مرحله وجود ندارد و خارج از بحث این دو مرحله می باشد.و قطعا هر بخش برای پاسخ به چگونه یا چطوری بودن ، روش ها و الگوهای خاص خودش را دارد.(روی هر عکس کلیک کنید می توانید آن را با وضوح بیشتر مشاهده کنید.)
Process Model
کمی دوست دارم که جزئی تر و عمیق تر شوم و این مرحله را کمی بیشتر توضیح دهم.
ابتدا سراغ Process Model خواهم رفت.
اصولا هر سیستم جدیدی که می خواهیم بسازیم باید بر طبق Process Model چهار فاز اصلی داشته باشد.
1)Planning
2)Analysis
3)Design
4)Implementation
حال ممکن است فازهایی دیگری بر طبق نیاز به این مراحل اضافه شود. قسمت هایی مانند Test یا Verification . اما چهار فاز اصلی همین هایی هستند که مشخص کرده ام. مثلا در عکس بالا دوفاز طرح ریزی و تحلیل ترکیب شده است با فاز نیازسنجی(+)
معمولا در Process Model این قسمت های مختلف را با حروف ابتدایی آن نشان می دهند. P,A,D,I
Process Model Types
Process Model هم انواع مختلفی دارند که من چندتایی از آنها را برایتان می نویسم.
1)قدیمی ترین آنها ، همان Process Model خطی است. به طور خیلی ساده ، ابتدا مرحله P انجام می گیرد و در ادامه مراحل A,D,I.
2) آبشاری یا همان Waterfall( همان عکس بالایی)
3) موازی یا Parallel
4) تکرار شونده Iterative
5) اسکرام Scrum
6)کانبان Kanban
Modeling Language
مرحله بعدی و مهم در توسعه نرم افزار ، مرحله چگونه انجام دادن کارهاست. در این مرحله نیاز به یک زبان مدلسازی است. وقتی پروژه ها بزرگ می شوند ، معمولا برای راحتی ارتباط از Modeling Language استفاده می شود. البته از نوع استانداردش بخاطر جلوگیری از تداخل تفاسیر در مدل سازی.
خب همان طوری که گفتم مدل یک ساده سازی از واقعیت است. Model is simplification of reality
اما زبان یا Language یعنی چه ؟
Language یک وسیله ی ارتباطی برای برقراری ارتباط استاندارد است.
هدف از Modeling Language یا همان زبان مدلسازی ، برقراری ارتباط استاندارد مابین طرفین درگیر بحث توسعه نرم افزار، بر اساس یک ساده سازی از واقعیت است.
به طور خلاصه ،زبان مدلسازی از چندین قسمت تشکیل شده است.
1)نماد های گرافیکی Graphical Elements
2) نمودارها Diagram
3) مدل ها
4) ارتباطات مشترک Shared Communications
هر زبان مدل سازی به مثابه یک جعبه ابزار می باشد و انواع مختلفی هم دارد.
UML , SYSML , ADL, ERD , DFD , …
تا اینجا ترتیب و لیست کاره و چگونگی انجام آن مشخص شد. اما هدف و زمان و شخص و مکان فعلا مشخص نشده است.
Methodology
اینجاست که سر و کله متدولوژی پیدا می شود. خب متدولوژی یعنی چه ؟
به مجموعه ای از Process Model ، SDLC ، Modeling Language به همراه یک سری تکنیک های توسعه نرم افزار، یک متدولوژی گفته می شود.
متدولوژی ها هم انواع مختلفی دارند که بازهم چندتایی از آن ها را می نویسم.
SSADM (Structured Systems Analysis & Design Method)
CDM (Customers Development Methodology)
DSDM (Dynamic Software Development Methodology)
RUP (Rational Unified Process)
AGILE (XP, Scrum , Kanban ,…)
اگر بخواهیم به طور خیلی ساده متدولوژی را تعریف کنیم ، می توانیم بگوییم که ، چه کسی ؟ چه کاری را ؟ چگونه ؟ در چه زمانی؟ و در چه مکانی؟ برای رسیدن به چه هدفی؟ باید انجام دهد.
این یک تعریف خیلی ساده و جامع و خلاصه یک متدولوژی است.
خب حال این سوال به وجود می آید که توسعه نرم افزار شامل چه چیزی هایی می شود و چگونه انجام می شود ؟
برای جواب به این سوال خلاصه کردن توضیحاتی که نوشته ام ، لازم و ضروری است. اما در توسعه نرم افزار ابتدا باید مشخص کنیم که در چه مرحله ای هستیم. برای مثال در مرحله ساختن و نوشتن یک نرم افزار هستیم. در این مرحله :
1)مشخص می کنیم که ترتیب انجام کارهایمان چیست ؟ Process Model
2)لیست کارهایمان را مشخص می کنیم. البته بعد از اینکه ترتیب انجام کارهایمان مشخص شد. SDLC
3)بر طبق شرایط موجود باید از چه زبان مدلسازی مناسبی استفاده کنیم؟ Modeling Language
4) مناسب ترین متدولوژی مورد استفاده (این مرحله ساخت ) چیست؟ Methodology
جمع بندی :
در انتها باید متذکر شوم که :
همیشه به یاد داشته باشید که در فازهای مختلف توسعه نرم افزار ، به دلایل مختلف (مالی،زمانی، استهلاک نیرو و...) ، ممکن است از متدولوژی های و پراسس مادل ها و زبان های مدل سازی مختلفی استفاده کنیم. یعنی لازم نیست که کل یک پروژه را با یک متدولوژی یا پراسس مادل ثابت ، توسعه دهیم. گاهی اوقات شرایط ایجاب می کند که در فازهای مختلف توسعه نرم افزار از متودولوژی ها و تکنیک های خاصی استفاده کنیم.
نحوه استفاده مناسب از این چهار مورد هم بیشتر به تجربه توسعه دهندگان بستگی دارد. یعنی هرچه تجربه آنها در توسعه نرم افزار بیشتر باشد ، قاعدتاَ نحوه استفاده مناسب آنها هم ، بهتر و به صرفه تر خواهد بود.
پی نوشت 1 : هدفم از نوشتن این متن 2300 کلمه ای ، مانند تمامی متن هایی که نوشته ام ، معرفی کتاب نبود و برای تهیه این متن مجبور شدم که چندین کتاب و صد ها صفحه از یادداشت برداری هایم را مطالعه کنم تا بتوانم به یک متن جامع در مورد توسعه نرم افزار برسم. اما یک اشکال وجود داشت آن هم ساده سازی این متن بود که وقت خیلی زیادی را از من گرفت. ابتدا می خواستم که کتاب های زیادی را برای توسعه نرم افزار معرفی کنم اما شروع کردم به نوشتن و ساده سازی مطالب.البته نه آنقدر ساده که باعث شود شالوده مطلب از بین برود.
اما توسعه نرم افزار آنقدر پیچیده و مفصل است که می توان سال ها در مورد آن بحث کرد. اما کتابی را معرفی کرده ام یک کتاب خوشخوان و سیصدوسی صفحه ای در مورد کلیات توسعه نرم افزار است که آن را از بین چند ده کتابی که در این مورد دارم ، انتخاب کرده ام.
پی نوشت 2: معمولا برای هر متنی که منتشر می کنم ابتدا چندین کتاب را درباره آن موضوع خاص ،مطالعه می کنم و تصمیم می گیرم که خوشخوان ترین و بهترین آن را بر اساس تصمیم خودم انتخاب و معرفی کنم. برای اینکار هم فقط سه دلیل دارم :
1) وقت و زمان خودم مفت نیست.
2) حاضر نیستم آجرهای برندی شخصی ام را که درحال ساختن آن هستم ، پوچ و زرد و غیر تخصصی و سطحی ، روی هم بچینم.
3) زمان مخاطب را هم مانند زمان خودم مفت و پوچ تصور نمی کنم و مخاطب را هم مانند خودم عمقی و دقیق تصور می کنم.