<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8643472646393964278</id><updated>2011-07-08T19:54:08.100+04:30</updated><category term='مشاهير'/><category term='مقدمه'/><category term='مهندسي نرم افزار'/><category term='Design'/><category term='مفاهيم'/><category term='كتاب شناسي'/><category term='دانلود'/><category term='مشكلات'/><category term='Requirements'/><title type='text'>مهندسي نرم افزار</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devever.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-3728142155117586572</id><published>2009-07-20T21:18:00.012+04:30</published><updated>2009-09-12T14:35:57.305+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مفاهيم'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'></title><content type='html'>&lt;div dir="rtl" style="text-align: justify;"&gt;در ادامه آشنايي با حوزه‌ها و فعاليتهاي مختلف در فرآيند توليد نرم افزار كه اميدوارم با توجه به اصول مهندسي نرم افزار باشد، به "طراحي نرم افزار"  مي‌رسيم.&lt;br /&gt;&lt;h2 style="color: rgb(0, 0, 0);"&gt;طراحي نرم افزار (Software Design)&lt;/h2&gt;    &lt;strong&gt;مقدمه&lt;/strong&gt;&lt;br /&gt;بعد از فعاليتهاي مربوط به حوزهً نيازمنديها نوبت به طراحي يا Design مي‌رسد. در واقع طراحي مانند پلي است كه نيازمنديهاي تهيه شده را به پياده سازي متصل مي‌سازد و نقش بسيار مهمي را در فرآيند توليد نرم افزار بازي مي‌كند. اگر نرم افزار به درستي طراحي گردد، در هنگام پياده سازي برنامه نويسان دربارة چيزي كه بايد پياده سازي شود سردرگمي ندارند و فقط به مسائل مربوط به پياده سازي         مي‌پردازند.&lt;br /&gt;طراحي نرم افزار مقولة بسيار گسترده‌اي است و ادبيات آن به تنهايي شامل چندين هزار صفحه مطلب است. از معماري نرم افزار بگيريد تا رويكردهاي طراحي مانند شئي گرايي تا طراحي واسط كاربر. در ادامه با عنوانهاي متعدد ولي كوتاه سعي به معرفي كليات آن مي‌كنم.&lt;h3 style="color: rgb(0, 0, 0);"&gt;به چه كاري طراحي مي‌گويند؟&lt;/h3&gt;ابتدا تعريف برگرفته از چند منبع معتبر:&lt;br /&gt;&lt;blockquote&gt;فرآيند مشخص سازي معماري، مؤلفه‌ها (Components)، واسطها (Interfaces) و ديگر خصوصيات سيستم يا مؤلفه را "طراحي" گويند. به محصول اين فرآيند نيز "طراحي" گفته مي‌شود.&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;&lt;/blockquote&gt;يا&lt;br /&gt;&lt;blockquote&gt;طراحي نرم افزار شرحي بر ساختار، داده، واسطهاي بين مؤلفه‌هاي سيستم، و گاهي الگوريتمهاي مورد استفادة نرم افزار قرار به پياده سازي مي‌باشد. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#Som06" target="_blank"&gt;[Som06]&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;تعريف من از طراحي ملموس‌تر است:&lt;br /&gt;&lt;blockquote&gt;تهيه هرآنچه برنامه نويسان از نيازمنديهاي نرم افزار براي پياده سازي نرم افزار نياز دارند.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;براي روشن شدن چهارچوبه مبحثي كه در ادامه به آن خواهيم پرداخت شكلي از اجزاي كلي طراحي و ارتباط آن با حوزه تحليل نيازمنديها از &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE04" target="_blank"&gt;[Pre04]&lt;/a&gt; آورده ‌ام. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE04" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mEn8XvoGDow/SmctublKW3I/AAAAAAAAAEc/bk3_I8jqKZ8/s1600-h/Analysis2Design.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 235px;" src="http://1.bp.blogspot.com/_mEn8XvoGDow/SmctublKW3I/AAAAAAAAAEc/bk3_I8jqKZ8/s400/Analysis2Design.gif" alt="" id="BLOGGER_PHOTO_ID_5361304157108722546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3 style="color: rgb(0, 0, 0);"&gt;قوائد طراحي&lt;/h3&gt;   براي طراحي صحيح و خلق طراحي مناسب، لازم است يك سري قوائد رعايت شود، اين   قوائد كه در طول ساليان توسط فعالان اين حوزه بدست آمده است، ما را در انجام درست طراحي ياري دهد.  به عنوان كسي كه قصد طراحي نرم افزار داريد آشنايي با اين اصطلاحات لازم است.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;انتزاع/تجرد/چكيدگي (&lt;/strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Abstraction_%28computer_science%29" target="_blank"&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;:&lt;br /&gt;ترجمه‌هاي متعددي براي اين اصطلاح آورده شده كه من در اينجا از "انتزاع" استفاده مي‌كنم. در كل طراحي نرم افزار از "انتزاع"كم كردن جزئيات را مد نظر دارد. مثل هميشه ذكر يك مثال بهتر از توضيحات گيج كننده است: براي چاپ يك صفحه شما امكان دارد بگوييد: "اين صفحه را چاپ كنيد!" يا دقيقتر حرف بزنيد و بگوييد: "به منوي فايل رفته، گزينة چاپ را انتخاب كرده، سپس... و كليد تأييد را فشار دهيد." در جمله اول روال چاپ با سطح بالاتري از انتزاع نسبت به روال توصيف شده در جمله دوم بيان شده است و جزئيات كمتري دارد. مي‌توان جمله سومي نوشت و روال كار را جزئي‌تر هم تصور كرد."&lt;br /&gt;انتزاع" در طراحي روشي براي كاهش پيچيدگي محسوب مي‌شود و داراي سه نوع است: "انتزاع رويه‌اي" (Procedural Abstraction)، "انتزاع داده" (Data Abstraction) و "انتزاع كنترل" (Control Abstraction).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;وابستگي (&lt;/strong&gt; &lt;a href="http://en.wikipedia.org/wiki/Coupling_%28computer_science%29" target="_blank"&gt;&lt;strong&gt;Coupling&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;br /&gt;كوپلينگ بيان كننده شدت ارتباط بين دو ماژول [عنصر] است &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;. كه من آن را "وابستگي" ترجمه كرده‌ام. وابستگي در طراحي بايد حداقل ممكن باشد كه بدان Low Coupling گويند. با اين كار تغييرات روي ماژالها راحت تر و كم هزينه‌تر خواهد بود و استفاده مجدد به راحتي صورت مي‌پذيرد &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#Lar04" target="_blank"&gt;[Lar04]&lt;/a&gt;.&lt;br /&gt;اصطلاحي كه براي ماژولهايي با وابستگي كم بكار برده مي‌شود "loosely Coupled" است كه به همين مفهوم اشاره داد.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;پيوستگي (&lt;/strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Cohesion_%28computer_science%29" target="_blank"&gt;&lt;strong&gt;Cohesion&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;br /&gt;به شدت ارتباط عناصر تشكليل دهندة يك ماژول Cohesion گفته مي‌شود &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;. وابستگي عناصر تشكيل دهنده يك ماژول بايد حداكثر ممكن باشد كه بدان High Cohesion مي‌گويند و باعث مي‌شود ماژولها متمركزتر، قابل فهم ‌تر باشند و به راحتي مديريت شوند &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#Lar04" target="_blank"&gt;[Lar04]&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;تفكيك يا ماژول بندي (Decomposition/Modularization)&lt;/span&gt;&lt;br /&gt;در عمل تفكيك، نرم افزار به قسمتهايي مشخص و آدرس پذيري به نام "ماژول" تقسيم مي‌شود. ماژول بندي تنها خصوصيت نرم افزار است كه باعث مي‌شود برنامه به صورت عاقلانه‌اي اداره شود &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;. مديريت يك نرم افزار بزرگ و يك تكه كار دشواري است و با شكستن آن به بخشهاي كوچكتر (براي مثال با &lt;a title="Enterprise JavaBeans" href="http://en.wikipedia.org/wiki/Ejb" target="_blank"&gt;EJB&lt;/a&gt; يا &lt;a title="Component Object Model" href="http://en.wikipedia.org/wiki/Component_Object_Model" target="_blank"&gt;COM&lt;/a&gt; ) مديريت آن راحت‌تر صورت مي‌پذيرد.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;كپسوله سازي/پنهان سازي اطلاعات (&lt;/strong&gt;    &lt;a href="http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29" target="_blank"&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;/Information Hiding)&lt;/strong&gt;&lt;br /&gt;بطور خلاصه پنهان سازي اطلاعات يا كپسوله سازي به اين مطلب اشاره دارد كه پيمانه‌هاي مختلف نرم افزار به اطلاعات (داده و الگوريتم) يكديگر [در صورت صلاح ديد] دسترسي نداشته باشند. اين مفهوم كه بعدها در شئي گرايي به عنوان ويژگي شاخص مطرح شد، از دسترسي و دستكاريهاي ناخواسته ماژولها به هم جلوگيري مي‌كند.&lt;br /&gt;&lt;br /&gt;مواردي كه به نظرم مهم بود ذكر كردم، البته اين ليست طولاني‌تر است و براي مثال Sufficiency, completeness and primitiveness توصيه مي‌كند خصوصيات هر مؤلفه نرم افزار به حد كفايت (نه كم به زياد) باشد، در صورت تمايل به &lt;a href="http://www2.computer.org/portal/web/swebok" target="_blank"&gt;SWEBOK&lt;/a&gt;   بخش طراحي براي مشاهده منابع مربوط به اين موارد رجوع كنيد.&lt;br /&gt;&lt;h3 style="color: rgb(0, 0, 0);"&gt;طراحي شامل چه فعاليتهايي مي‌شود؟&lt;/h3&gt;براساس استانداردهاي چرخه توليد نرم افزار از جمله &lt;a href="http://en.wikipedia.org/wiki/IEEE_12207" target="_blank"&gt;IEEE/EIA 12207&lt;/a&gt; طراحي نرم افزار شامل دو فعاليت عمده است:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;طراحي معماري نرم افزار&lt;/span&gt;&lt;br /&gt;در اين طراحي كه طراحي "سطح بالا" نيز گفته مي‌شود، به توصيف سطح بالا و كلي ساختار و سازمان نرم افزار پرداخته مي‌شود و مؤلفه‌هاي مختلف آن شناسايي مي‌گردند. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;&lt;br /&gt;براي هر پروژه‌اي معماري لازم است ولي براي يك پروژه لازم است از ديدگاه‌هاي مختلف بدان پرداخته شود ولي براي پروژه‌هاي كوچكتر فقط يك تصميم براي انتخاب معماري كافي است. يك مثال از معماري نرم افزار در ادامه آورده شده. توضيحات تكميلي در مورد "معماري" بعداً ارائه خواهد شد.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mEn8XvoGDow/SmTbCWscTfI/AAAAAAAAAEI/crQkTlLFXek/s1600-h/componenet.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 202px;" src="http://4.bp.blogspot.com/_mEn8XvoGDow/SmTbCWscTfI/AAAAAAAAAEI/crQkTlLFXek/s400/componenet.PNG" alt="" id="BLOGGER_PHOTO_ID_5360650289975938546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;توضيح: اين دياگرام Component با استفاده از UML 2.0 توسط آقاي &lt;a href="http://www.ambysoft.com/scottAmbler.html" target="_blank"&gt;Scott Ambler&lt;/a&gt; كشيده شده و بيان كننده معماري يك سيستم دانشگاهي مي‌باشد. همانگونه كه مشاهده مي‌شود مؤلفه‌هاي اين سيستم و ارتباط آنها با يكديگر به خوبي با اين دياگرام بيان شده است.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;طراحي تفصيلي نرم افزار&lt;/span&gt;&lt;br /&gt;همانگونه كه اشاره شد در معماري نرم افزار، نرم افزار به بخشها و مؤلفه‌هاي مختلف تفكيك مي‌شود. در طراحي تفصيلي نرم افزار اين مؤلفه‌ها و اجزا با جزئيات كامل بايد تشريح شوند. براي مثال طراحي فيلدهاي جدول بانك اطلاعاتي، طراحي توابع يا كلاسهاي نرم افزار و مشخص كردن ورودي و خروجي آنها، طراحي جزئيات واسط كاربر و اجزاي فرم يا صفحه وب، مثالهايي از طراحي تفصيلي نرم افزار است.&lt;br /&gt;&lt;h3 style="color: rgb(0, 0, 0);"&gt;روشهاي كلي طراحي&lt;/h3&gt;در طراحي مي‌توان رويكردهاي مختلفي اتخاذ نمود. هر روش خصوصيات مخصوصي دارد كه طراح با توجه به نوع سيستمي كه پيش رو دارد بايد روش صحيح را انتخاب كند. در ادامه به معرفي روشهاي مطرح مي‌پردازم:&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;طراحي ساخت يافته (Structured Design)&lt;/strong&gt;&lt;br /&gt;اين روش طراحي سنتي كه حداقل در ايران پركاربردترين روش طراحي است، مبتني بر شناسايي عمكلردهاي اصلي (Major Functions) نرم افزار و سپس شكستن و ريز كردن آنها بصورت بالا به پايين (Top-down) مي‌باشد. لازم به ذكر است در اين روش معمولاً            از Data Flow Diagram  براي انتساب داده‌ به فرآيند استفاده مي‌شود. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;طراحي شئي گرا (Object Oriented)&lt;/strong&gt;&lt;br /&gt;در اين روش سيستم در دنياي واقعي بصورت اشيائي كه داراي خصوصيت و رفتار هستند،‌ در نرم افزار نمود پيدا مي‌كند. اين اشياء بوسيله Message‌ با هم ارتباط برقرار مي‌كنند و در كلاسها و زير كلاسها دسته بندي مي‌شوند &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE01" target="_blank"&gt;[Pre01]&lt;/a&gt;. بطور خلاصه هر شئي داراي نام، يكسري خصوصيت (Attribute) و متد (Method) مي‌باشد كه در ارتباط با هم نرم افزار را تشكيل مي‌دهند. يكي از محاسن استفاده از روش شئي گرايي اين است كه شكاف مفهومي تحليل، طراحي و پياده سازي را به حداقل رسانده است، به بيان ديگر شما در هر سه اين فعاليتها با مفهوم كلاس، شئي، متد و... سروكار داريد. حسني كه در روشهاي ساخت يافته غايب است. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#Lar04" target="_blank"&gt;[Lar04]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;طراحي متمركز بر ساختار داده (Data-Structure-Centered Design)&lt;/strong&gt;&lt;br /&gt;اين روش همانند "ساخت يافته" است با اين تفاوت كه پايه طراحي "داده" است و نه "عمليات". در اين روش طراح در ابتدا ساختار داده ورودي خروجي را مشخص كرده (مثلاً با &lt;a href="http://en.wikipedia.org/wiki/Jackson_Structured_Programming" target="_blank"&gt;دياگرام جكسون&lt;/a&gt;) و سپس ساختار كنترل را براساس ساختار داده مشخص مي‌نمايد.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;طراحي مبتني بر مؤلفه(&lt;/strong&gt;&lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FComponent-based_software_engineering&amp;amp;ei=kjpaSvT2N4eOmAPCxoiEDQ&amp;amp;usg=AFQjCNE-XGSMRVFuYVrX4T5djljSgvwOow&amp;amp;sig2=iOz5DuhBeQRo9PfBuXtzRQ" target="_blank"&gt;&lt;strong&gt;Component Based Design&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; )&lt;/strong&gt;&lt;br /&gt;ابتدا مؤلفه را تعريف مي‌كنم: مؤلفه يك واحد مستقل مي‌باشد كه از واسطها (Interface‌) و وابستگيهايي كه بطور شايسته‌اي تعريف شده، برخوردار مي‌باشد. مؤلفه بصورت مستقل و مجزا قابل انتشار است &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04].&lt;/a&gt;  از اين تعريف خشك بگذريم، بطور ساده مؤلفه يك مجموعه عملكرد (معمولاً شئي) است كه با استفاده از كپسوله سازي و انتزاع به يك واحد مستقل و قابل استفاده مجدد تبديل شده است. طراحي با استفاده از مؤلفه و قرار دادن آنها كنار هم براي رسيدن به يك كل كه نرم افزار هدف ماست را طراحي مبتني بر مؤلفه&lt;br /&gt;گويند&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE01" target="_blank"&gt;[Pre01]&lt;/a&gt;.&lt;br /&gt;براي مطالعه بيشتر در مورد موارد مطرح شده به فصول 11، 14، 15 و 16 &lt;a href="http://www.amazon.com/Software-Design-2nd-David-Budgen/dp/0201722194/" target="_blank"&gt;اين كتاب&lt;/a&gt; مراجعه نماييد.&lt;br /&gt;&lt;h3 style="color: rgb(0, 0, 0);"&gt;خصوصيات كيفي طراحي (Quality Attributes)&lt;/h3&gt;يكي از بحثهاي مهم كه كمتر از آنچه بايد و شايد مورد توجه قرار مي‌گيرد، درنظرگرفتن معياريهاي كيفي طراحي است. طراحان نرم افزار عادت دارند برروي حل مسئله تمركز كنند و فراموش مي‌كنند كه خصوصيات كيفي هميشه جزئي از مسئله است و بايد مد نظر قرار بگيرد&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE01" target="_blank"&gt;[Pre01]&lt;/a&gt;. در ادامه به برخي از خصوصيات كيفي كه تحت عنوان FURPS مشهور هستند، مي‌پردازم:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;عملكرد (Functionality)&lt;/span&gt;: اين خصوصيت با توجه به امكانات و توانايي نرم افزار طراحي شده و همچينين امنيت (Security) مربوط به آنها ارزيابي مي‌شود.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;قابليت استفاده (Usability):&lt;/span&gt; اين خصوصيت با در نظر گرفتن معياريهاي انساني (&lt;a href="http://en.wikipedia.org/wiki/Human_factors" target="_blank"&gt;Human Factos&lt;/a&gt;)، راهنماي نرم افزار و مستندات آن ارزيابي مي‌شود.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;قابلبت اطمينان (Reliability):&lt;/span&gt; اين خصوصيت با توجه به تعدد و شدت خطا، صحت خروجي، توانايي پوشش خطا و پيش بيني پذيربودن (Predictability) نرم افزار ارزيابي مي‌شود.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;كارايي (Performance):&lt;/span&gt; اين خصوصيت كيفي با توجه به سرعت پردازش، زمان پاسخگويي، مصرف منابع، توان و كارايي سنجيده ميشود.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;قابليت پشتيباني (Supportability):&lt;/span&gt; اين مورد شامل خصوصيت مختلفي از جمله: امكان توسعه قابليتهاي برنامه(Extensibility)، قابليت تست برنامه (Testability)، وجود امكان پيكربندي (Configurability) و بومي سازي (Internationalization) مي‌شود.&lt;/li&gt;&lt;/ul&gt;هر برنامه‌اي كه طراحي مي‌شود ممكن است برروي يكي از موارد ذكر شده تمركز بيشتري داشته باشد و لزوماً اهميت مساوي برخوردار نيستند. براي اطلاعات بيشتر به فصل 9 كتاب &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE01" target="_blank"&gt;[Pre01]&lt;/a&gt; رجوع كنيد.&lt;br /&gt;&lt;h3 style="color: rgb(0, 0, 0);"&gt;ثبت طراحي&lt;/h3&gt;براي مستند سازي يا بيان طراحي لازم است از نمادهايي استفاده شود. اين نمادها بايد آنقدر جامع باشد كه تمام جوانب طراحي را پشتيباني نمايند و مرسوم هم باشد تا براي ديگران نيز قابل فهم باشد.&lt;br /&gt;مهمترين كاربرد ثبت طراحي (و ديگر مراحل توليد) بيشتر برقراري ارتباط با ديگران است تا مستندسازي آن براي مراجعات بعدي، واين نكته‌اي است كه كمتر به آن توجه مي‌شود!&lt;br /&gt;نمادها و زبانهاي وجود دارد كه به دو دسته كلي تقسيم مي‌شود، دسته اول نمايي ايستا (Static) از ساختار سيستم نمايش مي‌دهند مانند "دياگرام كلاسهاي نرم افزار" و دسته دومي نمايي پويا (Dynamic) از رفتار سيستم ارائه مي‌دهند، مانند "Data Flow Diagram". در ادامه نگاهي دقيقتر به تعدادي از آنها مي‌اندازيم:&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;توصيف ساختاري (نماي ايستا)&lt;/strong&gt;&lt;br /&gt;بطور كلي نماي ايستا از يك سري عنصر نرم افزاري و رابطة بين آنها تشكيل شده است.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Class &amp;amp; Object Diagrams:&lt;/span&gt; براي نمايش كلاسهاي (اشياء) طراحي شده و همچنين رابطه بين آنها مورد استفاده قرار مي‌گيرد. اين دياگرام از خانواده UML است.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Component Diagrams:&lt;/span&gt; مؤلفه‌هاي سيستم و رابطه بين آنها را نمايش مي‌دهد و بيشتر در سطح معماري سيستم كاربرد دارد و از خانواده UML است.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Deployment Diagrams:&lt;/span&gt; جهت مدلسازي جنبه‌هاي فيزيكي سيستم مورد استفاده قرارمي‌گيرد و شامل گره‌هاي (Node) سخت افزاري و رابطة بين آنهاست و از خانواده UML است.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Entity-relationship diagrams يا ERD&lt;/span&gt;: يك مدل مفهومي از داده‌هايي كه در سيستم اطلاعاتي ذخيره مي‌شوند.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Jackson structure diagrams:&lt;/span&gt; جهت توصيف ساختار داده مورد استفاده قرار مي‌گيرد.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;توصيف رفتاري (نماي پويا)&lt;/strong&gt;&lt;br /&gt;اين نمادها جهت ثبت رفتار و تراكنش اجزاي سيستم بكار مي‌آيند كه به برخي از آنها اشاره مي‌كنم:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Activity diagrams&lt;/span&gt;: اين دياگرام منطق رويه‌اي عمليات را نمايش مي‌دهد. اين دياگرام از خانواده UML است.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Collaboration diagrams&lt;/span&gt;: كه در UML 1.x با نام Communication Diagrams شناخته مي‌شود. فعل و انفعال بين گروهي از اشياء را به نمايش مي‌گذارد و تمركز آن بر اشياء و پيغامهاي تبادل شده بين آنهاست.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Data flow diagrams يا DFD&lt;/span&gt;: جهت نمايش روند چرخش داده در طول مجموعه‌اي از فرآيند، استفاده مي‌شود.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Flowcharts&lt;/span&gt;: روند انجام يك فرآيند را نمايش مي‌دهد.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Sequence diagrams&lt;/span&gt;: فعل و انفعال بين گروهي از اشياء را به نمايش مي‌گذارد و تمركز آن بر اشياء و ترتيب پيغامهاي تبادل شده بين آنهاست.&lt;/li&gt;&lt;/ul&gt;براي مطالعه موارد مربوط به UML به كتاب معروف &lt;a href="http://www.amazon.com/UML-Distilled-Standard-Addison-Wesley-Technology/dp/0321193687/" target="_blank"&gt;UML Distilled&lt;/a&gt; مراجعه كرده و موارد غير UML را در  &lt;a href="http://www.amazon.com/Software-Design-2nd-David-Budgen/dp/0201722194/" target="_blank"&gt;اين كتاب&lt;/a&gt; جستجو كنيد.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;h3&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;مواري كه از قلم افتاد:&lt;/span&gt;&lt;br /&gt;&lt;/h3&gt;به نظر مي‌آيد سه مورد مهم ديگر را بايد اشاره مي‌كردم كه در دسته بندي‌هاي بالا غايب است:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;الگوهاي طراحي (Design Patterns):&lt;/span&gt; الگوهاي طراحي براي مسائلي كه طراح در طراحي زياد با آن مواجه مي‌شود، يك راه حل كلي ارائه مي‌دهند. براي مثال ثبت خطا (Error Logging) در نرم افزار مسئله معمولي است كه طراح بايد به آن بپردازد، با استفاده از الگوهاي طراحي بهترين روش براي انجام اين كار توسط طراحان زبده ارائه شده است و طراح فقط بايد آن را با مسئله خود تطبيق دهد. اصطلاح الگوهاي طراحي بيشتر در طراحي شئي گرا كاربرد دارد و اولين بار توسط Kent Beck مطرح شد و پس از آن با كتاب معروف &lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/" target="_blank"&gt;Design Patterns&lt;/a&gt;‌ به بلوغ خود رسيد.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;طراحي واسط كاربر (User Inerface)&lt;/span&gt;: طراحي واسط كاربر كه زير مجموعه حوزة Usability قرار ميگيرد، به طراحي ظاهر قابل رويت نرم افزار اشاره دارد. كتاب &lt;a href="http://www.amazon.com/About-Face-Essentials-Interaction-Design/dp/0470084111/" target="_blank"&gt;About Face&lt;/a&gt; كتاب مناسبي براي آشنايي با مباني اين مقوله است.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;طراحي بانك اطلاعاتي (Database Design)&lt;/span&gt;: بيشتر نرم افزارهاي بزرگي كه در ايران توليد مي‌شوند به Data Model نياز دارند، چون به احتمال قوي به سيستم اطلاعاتي يك سازمان مربوط مي‌شود. طراحي بانك اطلاعاتي يكي ديگر از مقوله‌هاي طراحي نرم افزار است كه درنوع خود گسترده است. مخصوصاً اگر &lt;a href="http://en.wikipedia.org/wiki/Data_warehouse" target="_blank"&gt;Data Warehouse&lt;/a&gt; و &lt;a href="http://en.wikipedia.org/wiki/Data_mining" target="_blank"&gt;Data Mining&lt;/a&gt; هم به ميان بيايد. جهت مطالعه اين مبحث، &lt;a href="http://www.amazon.com/Database-Design-Sams-White-Book/dp/0672317583/" target="_blank"&gt;اين كتاب&lt;/a&gt; توصيه مي‌شود.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="color: rgb(0, 0, 0);"&gt;در پايان&lt;/h3&gt;سعي كردم نمايي از طراحي را براي خواننده ترسيم كنم. بي شك هر كدام از موارد اشاره شده جدا گانه قابل بررسي و موشكافي است. به مرور در آينده مباحث مهمتر را مورد كنكاش قرار خواهم داد.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;در صورت نياز نسخه الكترونيكي كتابهاي معرفي شده را درخواست نماييد تا لينك آنها را در وبلاگ قرار دهم.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-3728142155117586572?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/3728142155117586572/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/07/blog-post.html#comment-form' title='1 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/3728142155117586572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/3728142155117586572'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/07/blog-post.html' title=''/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mEn8XvoGDow/SmctublKW3I/AAAAAAAAAEc/bk3_I8jqKZ8/s72-c/Analysis2Design.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-7963412435794096754</id><published>2009-06-27T14:07:00.001+04:30</published><updated>2009-06-28T19:41:06.786+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مفاهيم'/><category scheme='http://www.blogger.com/atom/ns#' term='Requirements'/><title type='text'></title><content type='html'>&lt;span style="font-weight: bold;"&gt;مقدمه&lt;/span&gt;&lt;br /&gt;به نظر من يكي از مشكلات  دانشجويان و تازه واردهاي توليد نرم افزار، نبود ديد كلي  نسبت به بخشهاي مختلف مهندسي نرم افزار است. قبلاً اشاره‌اي به SWEBOK كردم، حال  برپاية آن به معرفي حوزه‌هاي دانش مهندسي نرم افزار مي‌پردازم. بي شك خوانندگان  مي‌توانند با رجوع به سندSWEBOK با منابع تشريح كننده هر حوزه آشنا شوند.&lt;br /&gt;در كل  12 حوزه وجود دارد كه در ابتدا به اولين حوزه در چرخة توليد نرم افزار مي‌پردازم.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;نيازمنديهاي نرم افزار (Software Requirements)&lt;/h2&gt;&lt;br /&gt;بررسيهاي مختلفي در  مورد عوامل شكست پروژه‌هاي نرم افزار صورت پذيرفته است. عدم توجه به نيازمنديهاي  پروژه و استخراج ناقص آنها يكي از عوامل اصلي شكست پروژه‌هاي نرم افزار شناخته شده است.&lt;br /&gt;نيازمنديهاي نرم افزار مبحث مهم و گسترده‌اي است كه سعي ميكنم در چند پاراگراف  كليات آن را بيان كنم.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;تعريف چند اصطلاح&lt;/strong&gt;&lt;br /&gt;تعاريف مختلفي  براي نيازمندي نرم افزار ارائه شده است، بنا به تعريف IEEE:&lt;br /&gt;&lt;blockquote&gt;نيازمندي خصوصيت يا  ملاكي است كه در راستاي حل مشكل در دنياي حقيقي، بيان مي‌شود.&lt;/blockquote&gt;&lt;br /&gt;بر اين  پايه:&lt;br /&gt;&lt;blockquote&gt;نيازمندي نرم افزاري، خصوصيت يا ملاكي است كه با هدف حل مشكل در  دنياي حقيقي، پايه پياده سازي نرم افزار مي‌شود. كه IEEE به آن "نيازمندي  محصول" (Product Requirement) مي‌گويد.&lt;/blockquote&gt;&lt;br /&gt;و در مقابل&lt;br /&gt;&lt;blockquote&gt;"نيازمندي  فرآيند" (Process Requiremnt) به نيازمنديهاي خوده توسعه نرم افزار مي‌پردازد  مانند: "نرم افزار بايد با زبان #C‌ نوشته شود".&lt;/blockquote&gt;&lt;br /&gt;تمركز از اينجا به بعد بر  "نيازمندي محصول" است و به مفاهيم مرتبط با آن اشاره مي‌كنم.  &lt;h3&gt;اجزا و عوامل تأثيرگذار بر"نيازمنديهاي نرم افزاري"&lt;/h3&gt;&lt;br /&gt;شكلي كه در ادامه  آمده است به نحو جالبي اجزا و عوامل تأثيرگذار بر "نيازمنديهاي نرم افزار"  را نمايش مي‌دهد &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#Kar03" target="_blank"&gt;[Kar03]&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mEn8XvoGDow/SkaZ1Ea6NnI/AAAAAAAAADk/op5d6d-dcK0/s1600-h/Requirements.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 323px;" src="http://3.bp.blogspot.com/_mEn8XvoGDow/SkaZ1Ea6NnI/AAAAAAAAADk/op5d6d-dcK0/s400/Requirements.GIF" alt="" id="BLOGGER_PHOTO_ID_5352134344175138418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;نيازمنديها به دو دسته كلي تقسيم  مي‌شوند:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;نيازمنديهاي عملياتي (Functional) يا رفتاري  (Behavioral):&lt;/strong&gt; به زبان ساده اين نوع نيازمندي ارتباط مستقيم با فعاليتهاي  تجاري كاربر دارد و توسعه دهنده بايد آنها را پياده سازي كند تا كاربر بتواند از  نرم افزار استفاده نمايد. به عنوان مثال "نرم افزار بايد امكان ايجاد طرف حساب جديد  را داشته باشد" يك نيازمندي عملياتي است. بصورت سنتي نيازمنديهاي عملياتي بصورت  ليستي از امكانات (مانند مثالي كه زده شد) بيان مي‌شدند ولي امروزه روشهاي مؤثرتري  مانند Usecase يا استفاده از UML در حال گسترش است.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;نيازمنديهاي غير  عملياتي (Nonfunctional):&lt;/strong&gt; اين نوع نيازمندي به عنوان محدوديت براي سرويس  يا عملكردي كه سيستم ارائه مي‌دهند، در نظر گرفته مي‌شوند. آنها شامل محدوديتهاي  زماني، محدوديت براي فرآيند يا استاندارهاي توسعه مي‌باشند. آنها معمولاً به كليت  سيستم اعمال مي‌شوند و مربوط به سرويس يا امكان خاصي نيستند &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#Som06" target="_blank"&gt;[Som06]&lt;/a&gt;. به موارد ذكر  شده مي‌توانيد نيازمنديهاي كيفي نرم افزار مانند Usability  يا كاربري، Reliability  يا قابليت اطمينان، Performance‌ يا كارايي، Supportability را نيز اضافه كنيد. در  آينده با بررسي مدل +FURPS بيشتر به اين مقوله مي‌پردازم.&lt;/li&gt;&lt;/ol&gt;موارد ديگري كه ذكر  توضيح كوتاهي در مورد آنها خالي از لطف نيست:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;نيازمندي تجاري (Business  Requirement):&lt;/strong&gt; بالاترين سطح نيازمندي است كه بدون توجه به سيستم نرم  افزاري كه قرار به توليد است به سازمان و كسب و كار مربوط به آن  مي‌پردازد.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;نيازمنديهاي كاربر (User Requirement) و بقيه زير مجموعه  Functional:&lt;/strong&gt;  از اين به بعد وارد چرخه توليد نرم افزار شده‌ايم و با توجه  به سيستمي كه قرار به تهيه است، نيازمنديها جمع آوري و منعكس  مي‌شوند.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case Document:&lt;/strong&gt; يكي از منعطف ترين و قدرتمندترين  ابزاري كه بشر براي جمع آوري و تكميل نيازمنديهاي عملياتي شناخته است. در آينده  بصورت مبسوط به آن مي‌پردازم.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Business Rules يا قوانين تجاري:&lt;/strong&gt;  معمولاً به قوانين خارج از سازمان اشاره دارد مانند قوانين مالياتي يا استاندارهاي  اجباري. اين قوانين برروي توسعه سيستم شما تأثير دارند.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;خصوصيات و  پارامترهاي كيفي (Quality Attributes):&lt;/strong&gt; در نيازمنديهاي غير عملياتي به  آنها اشاره كردم Usability يا كاربري، Reliability يا قابليت اطمينان، Performance‌  يا كارايي، Supportability. آنها به "ility-" هم معروف هستند، چون بيشتر آنها با  همين 5 حرف پايان مي‌يابند.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;تا اينجا به نظر من پرداختن به مفاهيم كافي است، اگر  سئوالي در ذهن شما هست كه هنوز پاسخ داده نشده، با من در ميان بگذاريد.&lt;br /&gt;&lt;h3&gt;فعاليتها در حوزة "نيازمنديهاي نرم افزاري"&lt;/h3&gt;چهار فعاليت عمده در حوزة  "نيامنديهاي نرم افزار" وجود دارد كه ذكر آنها لازم به نظر مي‌رسد:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;استخراج  (Elicitation):&lt;/span&gt; فعاليتي است كه در آن فرد مسئول با ذي نفعان پروژه ارتباط برقرار  مي‌كند و نياز و انتظار آنان از نرم افزار كه قرار است توليد شود را كشف مي‌نمايد.  اين فعاليت از طريق مصاحبه، مشاهده و ساير تكنيكهاي ممكنه صورت مي‌پذيرد.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;تجزيه  و تحليل (Analysis):&lt;/span&gt; در اين مرحله با تجزيه و تحليل خروجي مرحله قبل تضادهاي احتمالي بين نيازمنديهاي استخراج شده از بين مي‌رود، مرز نيازمنديهايي كه بايد پياده سازي  شود پرنگ شده و نيازمنديها دسته بندي مي‌شوند.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;تهيه مشخصات (Specification):&lt;/span&gt; اين فعاليت به  زبان ساده به مستندسازي و مكتوب كردن نيازمنديها اشاره دارد با اين توضيح كه بصورت  نظامند قابل بازبيني، ارزيابي و تصديق باشند.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;تصديق (Validation):&lt;/span&gt; در اين فعاليت  نيازمنديهاي مستند شده با هدف تصديق صحت آنها بررسي مي‌شوند. اين صحت شامل تطابق با  استاندارهاي شركت، قابل فهم بودن، سازگاري و كامل بودن آنان مي‌باشد.&lt;/li&gt;&lt;/ol&gt;عدم توجه  به هر كدام از موارد بالا سلامت پروژه را با خطر مواجه مي‌كند.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;سخن پاياني&lt;/span&gt;&lt;br /&gt;اميدوارم با همين مقدمه كوتاه ديد بازتري نسبت به "نيازمنديهاي نرم افزار" پيدا كرده باشيد. سعي مي‌كنم در آينده نكات عملي بيشتري در مورد اين حوزة مهم از مهندسي نرم افزار بيان كنم.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-7963412435794096754?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/7963412435794096754/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/06/blog-post.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/7963412435794096754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/7963412435794096754'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/06/blog-post.html' title=''/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mEn8XvoGDow/SkaZ1Ea6NnI/AAAAAAAAADk/op5d6d-dcK0/s72-c/Requirements.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-3966472188771639009</id><published>2009-06-01T16:43:00.005+04:30</published><updated>2009-06-02T23:31:19.087+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مفاهيم'/><title type='text'>معرفي پيكرة دانش مهندسي نرم افزار (SWEBOK)</title><content type='html'>&lt;div dir="rtl" style="text-align: right;"&gt;&lt;span style="font-weight: bold;"&gt;مقدمه&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;هر رشته‌اي براي خود مفاهيمي  دارد كه بايد توسط افرادي كه قصد فعاليت در آن حوزه را دارند فرا گرفته شود. براي مثال مهندسين عمران بايد در زمينه نقشه  كشي، تأسيسات و شناخت مواد مطالبي مختلفي را مطالعه كرده و به خاطر بسپارد. شكي نيست كه در مورد رشته مهندسي نرم افزار هم اين چنين است. اشكالي كه برخي به اين  موضوع وارد مي‌دانند اين است كه نرم افزار به حدي متغير و وابسته به فن آوري  (تكنولوژي) است كه پاية با ثباتي نمي‌توان براي آن بنا نمود.&lt;br /&gt;حال سئوال اينجاست كه به بهانة متغير بودن نرم افزار مي‌توان  از تدوين و مطالعة اصول توليد (مهندسي) نرم افزار سرباز زد؟ نگاهي به اتفاقاتي كه  تا كنون افتاده مي‌اندازيم:&lt;br /&gt;در سال 1968 در همايش معروف  NATO اولين هستة با ثبات براي مهندسي نرم افزار تدوين شد. سال 1968 چه مباحثي  در حوزة  نرم افزار وجود داشت؟&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;اولين الگوريتم جستجوي صحيح  دودويي در سال 1962 منتشر شده بود.&lt;/li&gt;&lt;li&gt;در سال 1968 در مورد  مضر بودن Goto بحثهاي داغي در جريان بود.&lt;/li&gt;&lt;li&gt;اولين كتاب در  زمينه تحليل نيازمنديهاي نرم افزار در سال 1979 منتشر شد. يعني 11 سال بعد از همايش  NATO&lt;/li&gt;&lt;/ul&gt;با اين حال 10 تا 20 درصد دانش مهندسي نرم افزار آن  موقع هنوز استفاده مي‌شود. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank" designtimesp="17971"&gt;[McC03]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mEn8XvoGDow/SiUYonKjQ1I/AAAAAAAAADE/48r4Epe17j4/s1600-h/SWEBOK1968.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 445px; height: 314px;" src="http://1.bp.blogspot.com/_mEn8XvoGDow/SiUYonKjQ1I/AAAAAAAAADE/48r4Epe17j4/s320/SWEBOK1968.jpg" alt="" id="BLOGGER_PHOTO_ID_5342703618932032338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;همانگونه كه در شكل  مي‌بينيد، هستة دروني تا كنون ثابت بوده و بخش خاكستري نشان دهنده كل دانش مهندسي  نرم افزار فرض شده كه از سال 1968 تا كنون افزوده شده يا تغيير كرده است.&lt;br /&gt;در حال حاضر در مقايسه با سال 1968 هزاران عنوان كتاب و مقاله  در زمينه مهندسي نرم افزار نگاشته شده و بيش از 2000 صفحه استاندارد مهندسي نرم  افزار در IEEE دسته بندي شده است. شكل زير نشان دهنده وضع در سال 2003 است.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mEn8XvoGDow/SiUZwBolVXI/AAAAAAAAADM/9ZkpEowrIoc/s1600-h/SWEBOK2003.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 273px;" src="http://1.bp.blogspot.com/_mEn8XvoGDow/SiUZwBolVXI/AAAAAAAAADM/9ZkpEowrIoc/s400/SWEBOK2003.jpg" alt="" id="BLOGGER_PHOTO_ID_5342704845808031090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;50 درصد دانش مهندسي نرم افزار به  ثبات رسيده است و انتظار مي‌رود تا 30 سال آينده اطلاعات موجود در هسته اعتبار خود  را حفظ كنند. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank" designtimesp="17978"&gt;[McC03]&lt;/a&gt; و اين نشان مي‌دهد يك فعال در اين حوزه براي  فراگيري آنها مي‌تواند برنامه ريزي كند. به هر حال تغيير در همه رشته‌ها وجود دارد  هر روز خبر از كشف شيوه‌هاي جديد و تغيير در نظريه‌هاي رشته‌هاي مختلف شنيده مي‌شود  و نمي‌توان از نرم افزار انتظار داشت براي هميشه ثابت بماند تا ما انگيزه پيدا كنيم  و به مطالعة دانش مهندسي نرم افزار بپردازيم. واقعيت اين است كه فن آوري زير ساختهاي توليد نرم افزار را بيشتر تحت تأثير قرار مي‌دهند و دانش توليد نرم افزار در كل تغييرات كمتري را به خود مي‌بينند.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;پيكرة دانش مهندسي نرم افزار (Software Engineering Body of  Knowledge)&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;حال كه بيان شد دانش مهندسي نرم افزار وجود  دارد و به اندازه كافي با ثبات است، نوبت معرفي آن ميرسد. ارائه تمام دانش در اين  نوشتار ممكن نيست، به همين دليل به معرفي و ارائه منبع براي مطالعه بيشتر اكتفا  مي‌كنم.&lt;br /&gt;بانيان تهيه SWEBOK گروهي از شركتها، دانشگاه‌ها و فعالان  حوزه نرم افزار زير چتر IEEE مي‌باشند كه من در اين نوشتار از آخرين نسخه آن يعني 2004 با عنوان "راهنماي  پيكرة دانش مهندسي نرم افزار" به عنوان مرجع استفاده كرده‌ام.  در &lt;a href="http://www.swebok.org/" target="_blank" designtimesp="17983"&gt;وب سايت  مربوطه&lt;/a&gt; راهنما براي دانلود وجود دارد و اطلاعات تكميلي براي علاقمندان موجود  است. توضيح اين نكته لازم است كه دانش مهندسي نرم افزار چندين هزار صفحه مطلب است و  راهنماي آن صرفاً به معرفي چهارچوب و منابع مستندات آن در ادبيات مهندسي نرم افزار  مي‌پردازد.&lt;br /&gt;حوزه‌هاي مرتبط با مهندسي نرم افزار در ادامه  آمده است:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mEn8XvoGDow/SiUaCetKbAI/AAAAAAAAADU/QkgRzQo1Wbs/s1600-h/SWEBOKother.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 258px;" src="http://3.bp.blogspot.com/_mEn8XvoGDow/SiUaCetKbAI/AAAAAAAAADU/QkgRzQo1Wbs/s400/SWEBOKother.GIF" alt="" id="BLOGGER_PHOTO_ID_5342705162849512450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;همانگونه كه در شكل  نمايش داده شده است، مهندسي نرم افزار از علوم كامپيوتر، رياضيات، علوم شناختي  (روانشناسي و جامعه شناسي)، مديريت پروژه، و نظامهاي مختلف مهندسي الهام گرفته  است.&lt;br /&gt;با توجه به همين نقطه آغازين، SWEBOK حوزه‌هاي دانش  تشكيل دهندة توانايي‌هاي پايه‌اي براي يك مهندس نرم افزار حرفه‌اي را شناسايي كرده  است.&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;نيازمنديهاي نرم افزاري: كشف، مستندسازي، و تحليل  عملياتي كه بايد در نرم افزار پياده سازي شود.&lt;/li&gt;&lt;li&gt;طراحي نرم  افزار: تعريف ساختار اصلي سيستم در سطوح معماري و جزئي، تقسيم بندي در ماژولها،  تعريف واسطهاي ماژولها، و انتخاب الگوريتمهاي دروني ماژولها.&lt;/li&gt;&lt;li&gt;ساخت نرم افزار: پياده سازي نرم افزار شامل طراحي تفصيلي، كد  نويسي، خطايابي، تست يونيتها، بازبيني فني، و بهينه سازي كارايي. اين ناحيه بعضاً  با طراحي نرم افزار و تست نرم افزار هم پوشاني دارد.&lt;/li&gt;&lt;li&gt;تست  نرم افزار: شامل تمام فعاليتهاي مرتبط با اجراي نرم افزار كه با هدف پي بردن به  نقايص و ارزيابي خصيصه‌هاي نرم افزار صورت مي‌پذيرد. تست كردن شامل برنامه ريزي  تست، طراحي حالت آزمون (Test Case)، و انواع خاصي از تست شامل تستهاي توسعه، تست  يونيت، تست مؤلفه، تست سيستم، تستهاي استرس، و تستهاي پذيرش مي‌باشد.&lt;/li&gt;&lt;li&gt;نگهداري نرم افزار: بازنگري و بهبود نرم افزار، مستندات و  تستهاي موجود.&lt;/li&gt;&lt;li&gt;مديريت پيكربندي نرم افزار: شناسايي،  مستندسازي، و كنترل تغيير تمام دارايي هاي منطقي پروژة نرم افزاري شامل كد منبع،  محتوا  (موارد ترسيمي، صدا، متن و ويدئو)، نيازمنديها، طراحي، تداركات تست،  تخمينها، برنامه‌ها، و مستندات مربوط به كاربر.&lt;/li&gt;&lt;li&gt;كيفيت نرم  افزار: كليه عمليات مربوط به حصول اطمينان از سازگاري نرم افزار با نيازمنديهاي فني  را شامل مي‌شود. مهندسي كيفيت شامل برنامه تضمين كيفيت، سنجش كيفيت، قابليت اطمينان  (Reliability)، تست، بازبيني فني، مميزي، تحقيق و تأييد صحت برنامه.&lt;/li&gt;&lt;li&gt;مديريت مهندسي نرم افزار: برنامه ريزي، پيگيري، و كنترل  پروژه، شغل، يا تشكيلات نرم افزاري.&lt;/li&gt;&lt;li&gt;ابزارها و روشهاي  مهندسي نرم افزار: حمايت از ابزار و روش‌شناسيها (Methodology)، مانند ابزارهاي  CASE، كتابخانه‌هاي كد قابل استفاده مجدد، و روشهاي قراردادي، شامل ممارست در جهت  تعميم و گسترش ابزار و روش‌شناسيها در درون سازمان.&lt;/li&gt;&lt;li&gt;فرآيند  مهندسي نرم افزار: فعاليتهايي در رابطه با بهبود كيفيت در توسعة نرم افزار، دقت،  بهره‌وري، و ديگر مشخصات پروژه و محصول.&lt;/li&gt;&lt;/ol&gt;تا اينجا دليل تدوين SWEBOK بيان شد و بصورت خلاصه كليات آن را مطرح كردم. دو نكته را در پايان متذكر مي‌شوم:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;SWEBOK تهيه شده، فقط شامل مواردي است كه توسط بيشتر فعالان حوزه نرم افزار پذيرفته شده و از ذكر مباحث بحث برانگيز و در حال بررسي اجتناب شده است. &lt;/li&gt;&lt;li&gt;در هر پروژه‌اي نياز به استفاده از تمام حوزه‌هاي مطرح شده نمي باشد، ولي در صورت كاربردي بودن (با توجه به بند بالا) قابل استفاده است.&lt;/li&gt;&lt;/ul&gt;شما هم مي‌توانيد با مطالعه راهنماي تهيه شده توسط IEEE اطلاعات زيادي را بدست آوريد و با آگاهي بيشتري نرم افزار توليد كنيد.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-3966472188771639009?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/3966472188771639009/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/06/swebok.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/3966472188771639009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/3966472188771639009'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/06/swebok.html' title='معرفي پيكرة دانش مهندسي نرم افزار (SWEBOK)'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mEn8XvoGDow/SiUYonKjQ1I/AAAAAAAAADE/48r4Epe17j4/s72-c/SWEBOK1968.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-5149773565692251094</id><published>2009-05-29T02:44:00.004+04:30</published><updated>2009-05-30T22:56:55.245+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مشكلات'/><title type='text'>دروس كارشناسي مهندسي نرم افزار</title><content type='html'>&lt;div dir="rtl" style="text-align: justify;"&gt;&lt;br /&gt;همانگونه كه قرار بود، قصد بررسي دروس ارائه شده در مقطع كارشناسي مهندسي نرم افزار در ايران را داريم. بي شك مرتبط بودن و كيفيت ارائه، عامل مهمي در تربيت مناسب نيروهاي فعال در حوزة مهندسي نرم افزار مي‌باشد.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;كارشناسي مهندسي نرم افزار- آنچه هست&lt;/span&gt;&lt;br /&gt;طبق مصوبة شوراي عالي برنامه ريزي وزارت فرهنگ و آموزش عالي مورخه 1377/8/24،  ليست دروس اصلي و تخصصي دورة كارشناسي مهندسي كامپيوتر، گرايش نرم افزار به شرح ذيل است:&lt;table border="1" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;رديف&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;نام درس&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;آزمايشگاه كامپيوتر&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;مباني كامپيوتر و برنامه سازي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;برنامه سازي پيشرفته&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;ساختمانهاي گسسته&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;زبان ماشين و برنامه سازي سيستم&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;ساختمان داده ها&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;زبان تخصصي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;مدار الكتريكي 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;آزمايشگاه مدار الكتريكي 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;مدار منطقي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;آزمايشگاه مدار منطقي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;رياضي مهندسي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;طراحي الگوريتم&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;معماري كامپيوتر&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;آزمايشگاه معماري كامپيوتر&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;سيستمهاي عامل&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;نظريه زبانها و ماشينها&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;طراحي و پياده سازي زبانهاي برنامه سازي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;ريز پردازنده&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;آزمايشگاه ريز پردازنده&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;مدارهاي الكترونيكي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;آزمايشگاه مدارهاي الكترونيكي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;شبكه‌هاي كامپيوتري&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;شيوه ارائه مطالب علمي و فني&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;ذخيره و بازيابي اطلاعات&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;26&lt;/td&gt;&lt;br /&gt;&lt;td&gt;هوش مصنوعي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;اصول طراحي كامپايلر&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;مهندسي نرم افزار 1 و 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;اصول طراحي پايگاه داده&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;آزمايشگاه سيستم عامل&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;آزمايشگاه پايگاه داده&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;پروژه&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;كارآموزي&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;و به استناد همان مصوبه، قابليت و مهارتهاي زير از فارغ التحصيلان رشته كامپيوتر انتظار مي‌رود:&lt;br /&gt;&lt;ol type="1"&gt;&lt;li&gt;بررسي و شناسايي سيستمهاي كامپيوتري به منظور انتخاب و سفارش سخت افزار، نرم افزار بهينه، هدايت و نظارت در نصب و بهره برداري ازآنها.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ارائه روشهاي عيب يابي، اصلاح و تكميل سيستمهاي سخت افزاري ويا نرم افزاري موجود و نظارت بر اين امور.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;طراحي، ساخت و راه انداري سيستمهاي جديد سخت افزاري و نرم افزاري.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;تشخيص لزوم استفاده از كامپيوتر در كنترل عمليات در محيطهاي مختلف.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;شناسايي تكنيكهاي جديد طراحي وساخت كامپيوتر، ارزيابي و بكارگيري آنها.&lt;/li&gt;&lt;/ol&gt;به نظر مي رسد:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ليست دروس تصويب شده بيشتر براي تربيت دانشجوي مسلح به علم كامپيوتر مناسب به نظر مي‌رسد تا مهندسي نرم افزار موارد 8، 9،10، 11،12، 14، 15، 19، 20، 21، 22 دروس مرتبط با Computer science است.&lt;/li&gt;&lt;li&gt;دروسي كه مستقيماً به مهندسي نرم افزار مرتبط مي‌شوند اندك است.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;غير از مورد 31 هيچ آزمايشگاه ديگري مرتبط با مهندسي نرم افزار وجود ندارد در حالي 7 مورد آزمايشگاه متفرقه وجود دارد.&lt;/li&gt;&lt;li&gt;مهارتهاي مديريتي جايگاهي در ليست ندارد.&lt;/li&gt;&lt;li&gt;به نظر مي‌رسد مسئولين مربوطه بيشتر به "كامپيوتر" پرداخته‌اند تا "نرم افزار".&lt;/li&gt;&lt;/ol&gt;در كل اهداف ودروس ارائه شده نشان از ديدگاه قديمي (حدود دهه 70 ميلادي) نسبت به مهندسي نرم افزار دارد. حال اينكه توليد نرم افزار فرآيندي به نسبت پيچيده و حتي متفاوت با ديگر رشته‌هاي مهندسي است. مهندسي نرم افزار تغييرات بسياري از آن زمان تا كنون كرده است و به مقوله‌اي جدي و مستقل تبديل شده است.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;آنچه بايد بشود&lt;/span&gt;&lt;br /&gt;تلاشهاي ثمر بخشي در زمينه تعريف بدنة دانش مهندسي نرم افزار (Software Engineering Body of Knowledge) و تعيين دروس اساسي دوره كارشناسي مهندسي نرم افزار شده است، نظر شما را به دروس الزامي مهندسي نرم افزار، كار مشتركي از ACM و IEEE (&lt;a href="http://sites.computer.org/ccse/" target="_blank"&gt;نسخه 2004&lt;/a&gt;) جلب مي‌نمايم:&lt;br /&gt;&lt;p&gt;&lt;span&gt;&lt;br /&gt;&lt;table border="1" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="font-weight: bold;"&gt;رديف&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;عنوان لاتين&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;توضيح فارسي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt; Introduction to Software Engineering and Computing &lt;/td&gt;&lt;td&gt;مقدمات مهندسي نرم افزار و كامپيوتر&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Software Engineering and Computing II&lt;/td&gt;&lt;td&gt;مهندسي نرم افزار و كاميپوتر 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Software Engineering and Computing III&lt;/td&gt;&lt;td&gt;مهندسي نرم افزار و كاميپوتر 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt; Data Structures and Algorithms&lt;/td&gt;&lt;td&gt;الگوريتم و ساختمان داده&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Programming Fundamentals&lt;/td&gt;&lt;td&gt;مقدمات برنامه نويسي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;The Object-Oriented Paradigm&lt;/td&gt;&lt;td&gt;مدل شئي گرا&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Introduction to Software Engineering&lt;/td&gt;&lt;td&gt;مقدمات مهندس نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Discrete Structures I&lt;/td&gt;&lt;td&gt;ساختمانهاي گسسته 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Discrete Structures II&lt;/td&gt;&lt;td&gt;ساختمانهاي گسسته 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Statistics and Empirical Methods&lt;/td&gt;&lt;td&gt;آمار و روشهاي تجربي&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Software Construction&lt;/td&gt;&lt;td&gt;ساخت (پياده سازي) نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Software Engineering Approach to Human Computer Interaction&lt;/td&gt;&lt;td&gt;مباحث مربوط به طراحي واسط كاربر&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Software Design and Architecture&lt;/td&gt;&lt;td&gt;معماري و طراحي نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;Software Quality Assurance and Testing&lt;/td&gt;&lt;td&gt;تضمين كيفيت و تست نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Software Requirements Analysis&lt;/td&gt;&lt;td&gt;تجزيه و تحليل نيازمنديهاي نرم افزاري&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Software Project Management&lt;/td&gt;&lt;td&gt;مديريت پروژه‌هاي نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;Design and Architecture of Large Software Systems&lt;/td&gt;&lt;td&gt;معماري و طراحي و سيستمهاي بزرگ نرم افزاري&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;Software Testing&lt;/td&gt;&lt;td&gt;تست نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Low-Level Design of Software&lt;/td&gt;&lt;td&gt;طراحي سطح پايين سيستم&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Software Process and Management&lt;/td&gt;&lt;td&gt;فرآيند توليد و مديريت نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;Formal Methods in Software Engineering&lt;/td&gt;&lt;td&gt;روشهاي رسمي در مهندسي نرم افزار&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;Software Engineering Capstone Project&lt;/td&gt;&lt;td&gt;پروژه&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;اين ليست شامل موارد ديگري مانند دوره‌هاي عملي و اقتصاد در مديريت نيز مي‌شود.&lt;br /&gt;لازم به ياددآوري است كه اين ليست شامل موارد الزامي مي‌باشد و هر دوره‌اي مي‌تواند دروس ديگري را نيز به صلاح ديد خود ارائه دهد.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;نتيجه&lt;/span&gt;&lt;br /&gt;همانگونه كه مشهود است دروسي كه در حال حاضر در ايران ارائه مي‌شود نياز به بازبيني جدي دارد تا خروجي دانشگاه‌هاي كشورمان بتواند گره‌اي از كلاف بهم پيچيدة توليد نرم افزار بگشايد.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-5149773565692251094?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/5149773565692251094/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_28.html#comment-form' title='1 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/5149773565692251094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/5149773565692251094'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_28.html' title='دروس كارشناسي مهندسي نرم افزار'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-5233864864316737713</id><published>2009-05-27T15:36:00.008+04:30</published><updated>2009-05-30T22:11:50.055+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مشكلات'/><title type='text'>مهندسي نرم افزار - هزار راه نرفته</title><content type='html'>&lt;div dir="rtl" style="text-align: justify;"&gt;به عقيده من مشكلات مهندسي شدن نرم افزار را در دو حوزه مي‌توان دسته بندي نمود:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;درك مفهوم و لزوم "مهندسي نرم افزار"&lt;/li&gt;&lt;li&gt;ضعف آموزش در مراكز دانشگاهي و علمي&lt;/li&gt;&lt;/ol&gt;&lt;span&gt;باز هم يادآور مي‌شوم اين موضوع با مشكلات پروژه‌هاي نرم افزاري متفاوت است&lt;/span&gt;&lt;span&gt;، كه آن هم در جاي خود بررسي خواهد شد.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;درك مفهوم و لزوم "مهندسي نرم افزار"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;با توجه به اينكه بيشتر افرادي كه در حوزه توليد نرم افزار فعاليت مي‌كنند، مدركي غير از "مهندسي نرم افزار" (Software Engineering) دارند، نبايد از وجود اختلاف نظر در زمينه مفهوم مهندسي نرم افزار تعجب كرد.&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank"&gt;[McC03]&lt;/a&gt;&lt;br /&gt;نويسنده‌اي مي‌گويد:&lt;br /&gt;ديدگاه ماشيني [رويكرد قائده‌مند، منظم و قابل سنجش] اين واقعيت را كه توسعه دهندگان ماهرتر خطاي كمتري مرتكب مي‌شوند و بهتر عيب يابي مي‌كنند را در نظر نمي‌گيرد. مهندسي نرم افزار باعث مي‌شود فراموش كنيم كه چيزي كه در پروژه اهميت دارد مهارت، دانش و تجربة توسعه دهندگان نرم افزار است. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank"&gt;[McB01]&lt;/a&gt;&lt;br /&gt;ديدگاهاي مشابه‌اي وجود دارند كه معتفد هستند كه تعريف IEEE از مهندسي نرم افزار براي پروژه‌هاي بزرگ مناسب است. عده‌اي هم در مقابل به شيوه‌هاي رسمي (Formal) اعتقاد دارند.&lt;br /&gt;به نظر مي‌آيد با تعديل تعريف "مهندسي نرم افزار" و در نظر گرفتن اندازه و شرايط پروژه بتوان به نقطه مشتركي رسيد.&lt;br /&gt;&lt;br /&gt;بدون شك تعريف مهندسي نرم افزار هرچه باشد، نهادينه كردن استفاده از روشهاي تست شده و استفاده از تجربه چند ميليون نفر ساعته ديگر فعالان عرصه مهندسي نرم افزار كار عاقلانه‌اي است. عدم رعايت اين مسئله مشكلي است كه به وضوح در بين توسعه دهندگان نرم افزار مخصوصاً در ايران ديده مي‌شود و ريشه در درك مفهموم و كاربرد مهندسي دارد.&lt;br /&gt;آموزش آكادميك مي‌تواند نقش اساسي در اصلاح ديدگاه توليد كنندگان نرم افزار در مورد مهندسي نرم افزار داشته باشد.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ضعف آموزش در مراكز دانشگاهي و علمي&lt;/span&gt;&lt;br /&gt;تصور كنيد كه دبيرستاني هستيد و تمايل داريد در آينده "مهندس نرم افزار" شويد. خوب بايد درس بخوانيد و در دانشگاه رشتة "مهندسي كامپيوتر" گرايش نرم افزار قبول شويد و بعد از چهار سال شما مهندس نرم افزار...&lt;br /&gt;آرزو داشتم كه بگويم "مي‌شويد" ولي متأسفانه واقعيت چيز ديگريست. با كمال تأسف به رشتة مهندسي نرم افزار آنگونه كه بايد در دانشگاه‌ها (منظورم بيشتر كشور خودمان &lt;span style="font-weight: bold;"&gt;ايران&lt;/span&gt; است) پرداخته نشده است.&lt;br /&gt;همانگونه كه مشاهده خواهيد كرد، دانشجو در رشتة مهندسي نرم افزار بيشتر با "علوم كامپيوتر" (Computer Science) آشنا مي‌شود تا مهندسي نرم افزار. آيا مي‌شود از اين فرد انتظار داشت با تمام شاخه‌هاي مهندسي نرم افزار آشنايي داشته باشد و آنها را بكار برد؟ اجازه دهيد كمي دقيقتر مشكلات اين رشته را در ايران مطرح كنم.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;دروس ارائه شده ديدگاه مهندسي ندارد و بيشتر به دنبال علم توليد نرم افزار است.&lt;/li&gt;&lt;li&gt;واحدهاي درسي مهندسي نرم 1 و 2 در بهترين حالت مي‌تواند نمايي از مهندسي نرم افزار را ارائه دهد. بقيه درسهاي مرتبط فقط به بخش ساخت (Construction) ارتباط دارند.&lt;/li&gt;&lt;li&gt;منابع درسي مهندسي نرم افزار بسيار محدود است و بيشتر كتابهاي مهندسي نرم افزار Pressman و &lt;span class="ptBrand"&gt;Sommerville&lt;/span&gt; استفاده مي‌شوند كه كلي و غير كاربردي هستند. &lt;/li&gt;&lt;li&gt;در كلاسهايي كه سعي به ارائه مطالب بروز مي‌كنند بيشتر به مباحث "مد" پرداخته مي‌شود. مانند UML و شئي گرايي يا روش شناسيهاي (&lt;a href="http://en.wikipedia.org/wiki/Systems_development" target="_blank"&gt;Methodology&lt;/a&gt;) معروف، كه تنها بخش كوچكي از دانش مهندسي نرم افزار است.&lt;/li&gt;&lt;li&gt;كارگاه مشخص و هدفمندي براي مهندسي نرم افزار تعريف نشده است.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;با احترام به تمام اساتيد محترم، متأسفانه كمتر استاد مسلط به اين حوزه وجود دارد.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;بي شك اين نقصان با عنايت بانيان امور بايد مرتفع گردد. در آينده با ارائه سرفصلهاي مهندسي نرم افزار بيشتر در اين مورد صحبت خواهم كرد.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;نتيجه؟&lt;/span&gt;&lt;br /&gt;فقط بايد صبر كرد تا صنعت نرم افزار مانند ديگر صنايع به بلوغ برسد. از سال 1968 تا كنون پيشرفتهاي زيادي حاصل شده است ولي هنوز راه بس درازي پيش روست.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-5233864864316737713?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/5233864864316737713/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_27.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/5233864864316737713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/5233864864316737713'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_27.html' title='مهندسي نرم افزار - هزار راه نرفته'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-3043093388829136183</id><published>2009-05-25T23:21:00.004+04:30</published><updated>2009-05-30T22:12:13.843+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مفاهيم'/><title type='text'>مهندسي نرم افزار؟</title><content type='html'>&lt;div dir="rtl" style="text-align: justify;"&gt;يك مكالمه فرضي:&lt;br /&gt;&lt;blockquote&gt;- شغل شما چيست؟&lt;br /&gt;- جواب: من در زمينه توليد نرم افزار فعاليت ميكنم.&lt;br /&gt;- چه خوب، پس برنامه نويسي مي‌كنيد!&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;احتمالاً اين مكالمه براي شما نيز آشناست. عوام و بعضاً توسعه دهندگان نرم افزار نيز از توليد نرم افزار فقط برنامه نويسي آن را ميشناسند. هدف از اين مقدمه معرفي توليد نرم افزار بصورت "مهندسي نرم افزار" است.&lt;br /&gt;در ادامه نيم نگاهي خواهيم داشت كه چرا هنوز براي توليد نرم افزار بصورت مهندسي دچار مشكل هستيم. توجه داشته باشيد كه بحث ما با دلايل "شكست" يا "موفقيت" پروژه‌هاي نرم افزاري متفاوت است.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;بحثهاي اساسي&lt;/span&gt;&lt;br /&gt;يكي از جدي ترين افراد در زمينة فلسفه مهندسي نرم افزار بي شك &lt;a href="http://devever.blogspot.com/2009/05/blog-post_23.html#McConnell" target="_blank"&gt;Steven McConnell&lt;/a&gt;  است. او در كتاب متفاوت خود &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank"&gt;"Professional Software Develompment"&lt;/a&gt; مي‌گويد:&lt;br /&gt;&lt;blockquote&gt;بهترين تصور از توسعه نرم افزار چيست؟ آيا علم است؟ يا هنر است؟ يا شايد هم يكجور مهارت باشد؟ شايد هم كلاً مقوله ديگريست؟&lt;br /&gt;افرادي كه از هنري بودن برنامه نويسي دفاع مي‌كنند به جنبه‌هاي زيبايي شناسي توسعه نرم افزار اشاره مي‌نمايند و استدلال مي‌كنند كه علم، الهام و خلاقيت را به بند مي‌كشد.&lt;br /&gt;كساني كه از جنبه علمي بودن دفاع مي‌كنند اشاره به ميزان بالاي خطاي برنامه‌ها دارند و ادعا مي‌كنند قابليت اطمينان تا اين حد پايين غير قابل تحمل است. هر دوي اين ديدگاها ناقصند و پرسشهاي ناسزايي مطرح مي‌كنند. توسعه نرم افزار هنر است و علم است. مهارت، باستان شناسي، آتشنشاني، روانشناسي و ديگر فعاليتها را نيز در خود جاي مي‌دهد. به تعداد افرادي كه برنامه نويسي مي‌كنند ماهيت دارد.&lt;br /&gt;پرسش صحيح اين نيست كه "توسعه نرم افزار در حال حاضر چه چيزي است؟" بلكه سئوال درست اين است كه : "توسعه نرم افزار چه بايد بشود؟" به عقيده من، جواب سئوال مشخص است: توسعة حرفه‌اي نرم افزار بايد &lt;span style="font-weight: bold;"&gt;مهندسي&lt;/span&gt; باشد. آيا اكنون اين گونه است؟ خير ولي بي شك بايد بشود.&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank"&gt;[McC03]&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;هدف از نقل قول اين مطالب اين بود كه نشان دهم &lt;a href="http://devever.blogspot.com/2009/05/blog-post_23.html#McConnell" target="_blank"&gt;Steven McConnell&lt;/a&gt; به عنوان يكي از تأثيرگذارترين افراد در تاريخ نرم افزار به همراه تعداد كثيري از افرادي كه درحوزه ادبيات مهندسي نرم افزار فعال هستند، رأي به "مهندسي" بودن فرآيند توليد نرم افزار داده‌اند.&lt;br /&gt;فكر نمي‌كنم صحبت در زمينه اثبات مناسب بودن ديدگاه "مهندسي" براي نرم افزار لازم باشد، بحثهاي مهمتري وجود دارد...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;در جستجوي تعريف مناسب&lt;/span&gt;&lt;br /&gt;حال كه پذيرفتيم "مهندسي" راه چاره توليد نرم افزار است، بهتراست تعريفي از "مهندسي نرم افزار" نيز ارائه شود.&lt;br /&gt;ابتدا بهتر است به مفهوم واژه "مهندسي" اشاره كنيم:&lt;br /&gt;&lt;blockquote&gt;مهندسي عبارتست از بكارگيري اصول علمي و رياضي براي مقاصد عملي[منبع ندارد]&lt;/blockquote&gt;&lt;br /&gt;منابع متعددي اقدام به تعريف مهندسي نرم افزار كرده اند، اجازه بدهيد تعريف IEEE كه بيشتر از بقيه مورد تأييد است&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#PRE01" target="_blank"&gt;[PRE01]&lt;/a&gt; را ذكر كنم:&lt;br /&gt;&lt;blockquote&gt;اعمال يك رويكرد قائده‌مند، منظم و قابل سنجش در زمينة توسعه، بهره برداري و نگهداري نرم افزار، كه به آن كاربرد مهندسي در نرم افزار گفته ميشود.&lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#IEE04" target="_blank"&gt;[IEE04]&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;اين تعريف شايد شما را از مهندسي نرم افزار فراري دهد يا اين فكر را در ذهن بياورد كه مهندسي نرم افزار منابع زيادي را بيهوده هدر مي‌دهد.&lt;br /&gt;در اين زمينه &lt;a href="http://devever.blogspot.com/2009/05/blog-post_23.html#McConnell" target="_blank"&gt;Steven McConnell&lt;/a&gt; به صراحت بيان مي‌كند كه:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;برخي تصور مي‌كنند ديدگاه مهندسي نسبت به توسعة نرم افزار به منزله استفاده از روشهاي سختگيرانه – نوشتن برنامه همانند اثبات رياضي – مي‌باشد. عقل و تجربه نشان داده است كه انجام اين كار براي اكثر پروژه‌ها، زياده روي است. برخي نيز برخلاف گروه اول اعتقاد دارند كه نرم افزار تجاري آنقدر از تغيير شرايط بازار تحت تأثير قرار مي‌گيرد كه نمي‌توان مهندسي دقيق و زمانبري بر روي آن اجرا نمود.&lt;br /&gt;اين استدلالهاي متناقض، بر اساس ديد محدود و اشتباه از مهندسي بنا نهاده شده است. مهندسي كاربرد قوانين علمي در راستاي اهداف عملي است. اگر مهندسي كاربردي نباشد، مهندسي خوبي نيست. ايدة اعمال روشهاي سختگيرانه به همه پروژه‌هاي نرم افزاري به اندازه استفاده از روش ساخت و ترميم (Build and Fix) مضر است. &lt;a href="http://devever.blogspot.com/2009/05/blog-post_22.html#McC03" target="_blank"&gt;[McC03]&lt;/a&gt;&lt;/blockquote&gt;در واقع پروژه شما در هر ابعاد و اندازه‌اي كه باشد مي‌تواند از "مهندسي" سود ببرد، به اين شرط كه روشهاي موجود را شناخته و از آنها با توجه به مشخصات پروژه سود ببريد.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;در بخش بعدي مشكلات مهندسي شدن نرم افزار را بررسي مي‌كنيم.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-3043093388829136183?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/3043093388829136183/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_2617.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/3043093388829136183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/3043093388829136183'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_2617.html' title='مهندسي نرم افزار؟'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-5543560420031974638</id><published>2009-05-23T16:40:00.005+04:30</published><updated>2009-05-30T22:13:20.393+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='مشاهير'/><title type='text'>مشاهير</title><content type='html'>&lt;div dir="rtl" style="text-align: justify;"&gt;&lt;a name="McConnell"&gt;در اين قسمت به معرفي افرادي كه در مطالب وبلاگ نام برده مي‌شوند، مي‌پردازم. اين فهرست نيز به مرور تكميل مي‌شود.&lt;br /&gt;&lt;br /&gt;Steven McConnell&lt;/a&gt; - نويسنده و مؤلف كتابهاي متعددي از جمله &lt;a href="http://en.wikipedia.org/wiki/Code_Complete" title="Code Complete"&gt;Code Complete&lt;/a&gt;, &lt;i&gt;Rapid Development&lt;/i&gt; و &lt;i&gt;Software Estimation &lt;/i&gt;مي‌باشد. در مورد  اين كارشناس ارشد مهندسي نرم افزار از دانشگاه سياتل همين بس كه در كنار&lt;i&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/i&gt; &lt;a href="http://en.wikipedia.org/wiki/Bill_Gates" title="Bill Gates"&gt;Bill Gates&lt;/a&gt; و &lt;a href="http://en.wikipedia.org/wiki/Linus_Torvalds" title="Linus Torvalds"&gt;Linus Torvalds&lt;/a&gt; به عنوان تأثيرگذارترين افراد در صنعت نرم افزار ياد مي‌شود [Software Development magazine].   اكنون او مدير عامل و مهندس ارشد در شركت&lt;i&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;a href="http://www.construx.com/" target="_top"&gt;Construx  Software&lt;/a&gt; مي‌باشد. براي اطلاعات بيشتر به &lt;a href="http://www.stevemcconnell.com/"&gt;سايت شخصي&lt;/a&gt; او مراجعه كنيد.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-5543560420031974638?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/5543560420031974638/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_23.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/5543560420031974638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/5543560420031974638'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_23.html' title='مشاهير'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-420869203033644467</id><published>2009-05-22T22:18:00.010+04:30</published><updated>2009-07-21T01:42:06.268+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='دانلود'/><category scheme='http://www.blogger.com/atom/ns#' term='مهندسي نرم افزار'/><category scheme='http://www.blogger.com/atom/ns#' term='كتاب شناسي'/><title type='text'>كتاب شناسي</title><content type='html'>&lt;div dir="ltr" style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-weight: bold;"&gt;منابع در اينجا ليست شده‌اند، به مرور به تعداد آنها افروده خواهد شد&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name="IEE04"&gt;[IEE04]&lt;/a&gt; Guide to the Software Engineering Body of Knowledge, IEEE, 2004.&lt;br /&gt;&lt;a name="Kar03"&gt;[Kar03]&lt;/a&gt; Software Requirements, Second Edition, by Karl E. Wiegers, Microsoft Press, 2003&lt;br /&gt;&lt;a name="Lar04"&gt;[Lar04]&lt;/a&gt; Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development, Third Edition,  Craig Larman, Addison Wesley Professional, 2004&lt;br /&gt;&lt;a name="McB01"&gt;[McB01]&lt;/a&gt; Software Craftsmanship: The New Imperative, Pete McBreen, Addison Wesley&lt;br /&gt;&lt;a name="McC03"&gt;[McC03] &lt;/a&gt;Professional Software Development: Shorter Schedules, Higher Quality  Products, More Successful Projects, Enhanced Careers, Addison Wesley, 2003.&lt;br /&gt;&lt;a name="Pre01"&gt;[Pre01]&lt;/a&gt; Software Engineering: A Practitioner’s Approach, Fifth ed., R.S. Pressman, McGraw-Hill, 2001. &lt;a href="http://rapidshare.com/files/251882473/9780073655789_DEVEVER_Blogspot.zip.html"&gt;دانلود كتاب حجم 4مگابايت&lt;/a&gt;&lt;br /&gt;&lt;a name="Pre04"&gt;[Pre04]&lt;/a&gt; Software Engineering: A Practitioner’s Approach, 6th ed., R.S. Pressman, McGraw-Hill, 2004. &lt;a href="http://rapidshare.com/files/251882473/9780073655789_DEVEVER_Blogspot.zip.html"&gt;دانلود كتاب حجم 4مگابايت&lt;/a&gt;&lt;br /&gt;&lt;a name="Som06"&gt;[Som06]&lt;/a&gt; Software Engineering: (8th Edition),  Ian Sommerville, Addison Wesley, 2006&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-420869203033644467?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/420869203033644467/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_22.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/420869203033644467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/420869203033644467'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post_22.html' title='كتاب شناسي'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8643472646393964278.post-1605159258419632698</id><published>2009-05-22T16:57:00.006+04:30</published><updated>2009-05-28T02:31:46.705+04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='مقدمه'/><title type='text'>قبل از شروع</title><content type='html'>&lt;div dir="rtl" style="text-align: right;"&gt;&lt;div style="text-align: justify;"&gt;خدا را سپاس كه بعد از مدتها وقت آن را يافتم كه در زمينه مهندسي نرم افزار مطالبي را به رشته تحرير درآورم. شايد دوستاني كه &lt;a href="http://www.aminrashidi.com/resume.html" target="_blank"&gt;رزومه بنده&lt;/a&gt; را مورد مطالعه قرار دهند با خود بگويند كه مگر قحط الرجال بود كه تو در مورد اين رشته ميخواهي مطلب بنويسي؟ كه به راستي "جانا سخن از زبان ما مي‌گويي." با وجود اين همه استاد و فرد با تجربه چرا من؟&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;بي شك فقدان محتواي فارسي مهندسي نرم افزار يكي از مهمترين انگيزه‌هاي من براي شروع به نوشتن در اين حوزه است. شايد در ابتدا تصور شود كه اين رشته شناخته شده باشد و با وجود تعداد بالاي فارغ التحصيل مهندسي نرم افزار سواد جامعه توليد كننده نرم افزار بالا باشد ولي واقعيت چيز ديگري است.&lt;/li&gt;&lt;li&gt;كلمات و اصطلاحات مهندسي نرم افزار تبديل به واژگان دلفريبي شده اند كه در زبان مادري مهندسي نرم افزار به آن Buzzword گفته ميشود. همين بس كه برخي از اساتيد دانشگاه هم از UML به عنوان متد توليد نرم افزار ياد ميكنند.&lt;/li&gt;&lt;li&gt;به گروههاي آنلاين در زمينه‌هاي مربوطه سري بزنيد بيشتر از هر چيز تقاضا براي پروژة آماده براي نرم 1 يا 2 نظر شما را جلب ميكند  تا مطلبي كه شما را با علم و هنر مهندسي نرم افزار آشنا سازد.&lt;/li&gt;&lt;li&gt;و...&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;پرداختن به ريشه مشكلات مهندسي نرم افزار در ايران بدون در دسترس بودن آمار و تحليل آن جدا از مشكلات فرهنگي و زيرساختي فن آوري اطلاعات كاري بس دشوار و خارج از حوصله اين نوشتار است. اميدوارم در آينده نزديك با جمع آوري اطلاعات لازم به اين مسئله نيز بپردازم.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8643472646393964278-1605159258419632698?l=devever.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devever.blogspot.com/feeds/1605159258419632698/comments/default' title='نظرات پيام'/><link rel='replies' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post.html#comment-form' title='0 نظر'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/1605159258419632698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8643472646393964278/posts/default/1605159258419632698'/><link rel='alternate' type='text/html' href='http://devever.blogspot.com/2009/05/blog-post.html' title='قبل از شروع'/><author><name>امين</name><uri>http://www.blogger.com/profile/14422307760170863828</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
