بررسی مشکلات برنامه نویسی

بنام انكه جان را فكرت آموخت
با بررسي هاي و تجربياتي كه بنده در زمينه برنامه نويسي هاي پايگاههاي اطلاعاتي انجام دادم مشكلات بزرگ برنامه نويسان را در عوامل متععددي پيدا كردم كه درطي سال گذشته ( از دي ماه ۸۱ تا خرداد ۸۲ ) سعي كردم براي اين مشكلات راه حل هاي جامع پيدا كنم

.براي حل برخي از اين مشكلات به راهنمايي و كمكهاي ارزنده دوستاني( كه هرگز نديدمشان ولي خود را وامدار آنها مي دانم ) مديون هستم و برخي ديگر را لطف الهي مي دانم … به هر حال از انجايي كه اين نتايج را نمي خواهم تنها در اختيار خود داشته باشم و آنرا متعلق به همه مي دانم ، سعي خواهم كرد طي مقالاتي گزارشي از راهي كه پيموده ام را خدمت دوستان عزيز تقديم كنم.

۱) انچه در شروع بايد بدانيم
الف ) بنابر يك اصل كلي در حل مسائل “ابتدا بايد مقصد را مشخص سپس ابزار رسيدن را انتخاب نمود ”
اگر به اين مسئله معتقد باشيم باشيم انگاه ديگر درگير معضلاتي همچون “تعصب بروي يك نرم افزار خاص” و يا “چون من فقط همين نرم افزار را مي دانم پس بهترين راه همين است ” نخواهيم شد. وصد البته اينكار نيازمند مطالعه و تحقيق مداوم براي رسيدن به بهترين راه حل خواهد بود.

ب) “همه كس همه چيز را نمي داند”
… اعتقاد به اين اصل باعث خواهد شد تا شما اولا سعي در تيمي كردن پروژه هاي بزرگ كنيد و ثانيا انجام نرم افزارهايي كه از حيطه توانايي شما خارج است (ومدت كوتاهي براي اتمام آن داريد ) را قبول نكنيد چراكه با شكست در انجام آن اعتبار خود را زير سوال خواهيد برد

ج ) “چند كار كوچك بهتر از ۱ كار بزرگ است ”
اين به معناي اينست كه
• اگر تازه كار هستيد با پروژه هاي كوچك شروع كنيد و پس از كسب تجربه به سراغ اهداف بزرگتر برويد
• اگر پروژه بزرگي داريد (بزرگي پروژه بنابر منطق فازي به خودتان بستگي دارد) آنرا به قسمتهاي كوچكتري تقسيم كنيد تارسيدن به انها ساده تر باشد
د) “مشكلترين راه حل هميشه بهترين نيست”

هميشه اينگونه نيست كه بتوانيد همه چيز را بنابر مصالحي (همچون “استقلال برنامه از ابزار” ) با كد نويسي حل كنيد چرا كه اينكار نه تنها باعث افزايش زمان پروژه خواهد شد كه احتمال خطا را نيز افزايش مي دهد .

بنده از سال ۷۴ تا ۷۵ در حدود ۱۲۰۰۰ خط برنامه بزبان پاسكال نوشتم كه Utilityمحسوب مي شد و باعث گرديد كه مشكلاتي همچون فارسي نويسي، ارتباط با شبكه مرتب سازي بانكهاي اطلاعاتي و غيره را حل كنم و باكمك آنها چند برنامه مفيد نوشتم اما اكنون از عيب يابي اين برنامه ها وحشت دارم چه رسد به كسترش اين برنامه ها

ه) “خيال پرداز باشيد ”
در سينما به اين اصطلاح “حس گرفتن ” گفته مي شود. در واقع تخيل شما در باره محصول نهايي هميشه مشوق شما براي پيدا كردن راه حلها و فهم ندانسته هاي شما خواهد بود . اين حس ذاتي است و انهايي كه از اين حس كمتر بهره مند هستند تا زمان تحويل پروژه متوجه نواقص ان نخواهند شد

و) “دست پيش را بگيريد تا پس نيفتيد”
در مورد ۲ عامل مهم تاكيد مي كنم اين ضرب المثل را فراموش نكنيد
• زمان انجام پروژه
• مبلغ قرارداد
همواره پس از شنيدن صورت مسئله ،اعداد و ارقام ذهنتان را ۲ تا ۳ برابر اعلام كنيد چراكه در اين صورت نه تنها با ارامش خيال بدون واهمه زمان كافي براي انجام پروژ خواهيد داشت كه در اخر كار پس از كسر صورت هزينه هايي كه حتي تصورشان را هم نمي كرديد مقداري استفاده برايتان خواهد ماند.

ز) “شما ۲ گوش داريد و ۱ زبان “
مشتري هميشه مي داند كه چه كار مي خواهد انجام شود ولي قرار نيست شما با حرفهاي بزرگ زدن مسئله را براي او وخودتان پيچيده تر از آنچه كه هست كنيد . هميشه گوش كنيد و نكات ظريف مسئله را با دقت تمام دنبال كنيد . شايد در لحظه اي كه شما فكر مي كنيد “مسئله ساده اي است ” يك “فاجعه” در انتظار شما باشد در ان لحظه به اين مسئله فكر كنيد “زبان سرخ سرسبز مي دهد برباد”

ح) “من نمي دانم “
هميشه با همه براي فهم انچه نمي دانيد در ارتباط باشيد .
• همواره با مشتري خود مشورت كنيد . شايد او از مسائل برنامه نويسي چيزي نداند ولي مطمئننا از انچه كه مي خواهد با اطلاع است . نگذاريد اين دانش او با ايراد گرفتن به شما منتقل شود.
• هميشه در حال جستجوي اطلاعات جديد در اينترنت و يا كتب ويا حتي دوستاني كه داريد باشيد .

ط) “اول كوچكترها بعد بزرگترها”
يكي از عوامل موفقيت شما در شبيه سازي پروژه هاي بزرگ به صورت كوچك و تعميم آن به برنامه هاي بزرگتر است . بياد داشته باشيد كه در پروژه هاي بزرگ شما بايد مسائل حاشيه اي را ( كه حتي ممكن است به اصل صورت مسئله ارتباط مستقيم ندارد ) در نظر بگيريد . اما شبيه سازي در مقياس كوچك به شما فرصت حل اصل مسئله را خواهد داد.

ي)”سريع و كثيف “
زيبا سازي برنامه را براي بعد بگذاريد .. مهم نيست اول چه فونتي با چه رنگي انتخاب مي شود . مهم اينست كه ايا برنامه درست عمل مي كند يا خير . مشتري در هنگام استفاده ديدن يك برنامه زيبا را مهم مي داند نه در هنگام توليد .

ك) “عقل تابع چشم است “
• (در مورد مشتري )يك برنامه زيبا بيشتر به دل مي نشيند
• (در مورد برنامه نويس ) هرچه بيشتر نمونه برنامه ببينيد ، ذهن شما قدرت خيالپردازي بيشتري پيدا ميكند و بالطبع ديد وسيع تري را در عمل كردن خواهيد داشت
براي شروع لازم است در مورد مسائلي كه به ترتيب عنوانهاي آنها قيد مي شود … علاوه بر توضيحات اين مقاله مطالعه وسيع و مداومي نيز داشته باشيد
البته لازم به ذكر است كه فرض اين مقاله بر اين است كه مشتري يا خود شما امكان و يا به صرفه بودن توليد نرم افزار را براورد و درمورد ان مطمئن هستيد.

حل هر مسئله و خصوصا برنامه هاي كامپيوتري مستلزم گذراندن ۵ مرحله است كه در شكل نشان داده شده است

همانگونه كه از شكل مشخص است هرچه ۴ مرحله اول دقيق تر انجام شود احتمال تكرار مراحل قبلي كمتر و بالطبع زمان و در پي ان هزينه توليد نرم افزار كاهش مي يابد . در ميان ۵ مرحله تحليل مهمترين بخش است چراكه تعريف صورت مساله در تحليل انجام ميشود. نمي خواهم بحث را طولاني كنم .فقط اين قضيه را خاطر نشان مي كنم كه اهميت “تحليل ” بقدري زياد است كه در خارج از كشور شركتها ي توليدكننده نرم افزار حتما داراري چندين تحليلگر ماهر هستند كه از ابتدا تا انتهاي پروژه هدف پروژه را كنترل و مسير انرا اصلاح ميكنند.
بعنوان يك حاشيه مي توان زمانبندي ۵ مرحله را نيز بصورت زير ترسيم نمود كه با مراجعه به كتابها و نرم افرارهاي مختلف مي توانيد اين نمودار را دقيق تر كنيد .

الف ) تحليل
“فهم مساله نيمي از حل مساله مي باشد”
شما تاوقتي كه خودتان ندانيد چه مي خواهيد انجام دهيد نخواهيد توانست مساله را حل و بالطبع ديگر اعضاي گروه را رهبري كنيد .
پس قدم اول شناخت صورت مساله است .هدف از انجام اين قدم را مي توان پرداختن به ۴ موضوع زير دانست

۱٫ تعيين اطلاعاتي كه قابل مكانيزه كردن مي باشد
۲٫ افرادي كه لازم است با اين ابزار(نرم افزارها) كار كنند.در پروژه هاي بزرگ اين مسئله شامل سلسله مراتب اولويت افراد نيز مي گردد
۳٫ انتخاب نمونه هاي اصلي براي كار روي انها(فرمها پرونده ها اسناد و غيره…….)
۴٫ ميزان گستردگي نمونه هاي انتخاب شده و همچنين كاهش ميزان پيچيدگي نرم افزار در موارد كم اهميت

براي انجام اين كار راههاي متععدي وجود دارد مانند :
• مصاحبه : با يك يا چند كارشناس مسلط به كار (هر چند دركي از كامپيوتر نداشته باشند) صحبت كنيد . اين كار را گاه لازم است بطور مداوم تكرار كنيد تا مطمئن شويد كه مي دانيد چه مي خواهيد .
• فرمهاي نظر سنجي : ممكن است برنامه اي قبلا نوشته شده باشد و يا ذهن يك جامعه (منظور مجموعه اي از افراد است ) نسبت به يك مسئله روشن باشد ، بهتر است نظر انها را در مورد نواقص سيستم قبلي(حتي ممكن است سيستم قبلي يك سيستم دستي باشد) و يا پيشنهاد سيستم جديد بدانيد .
• مرور انچه كه هست : برخي موارد (بجز مواردي كه يك نرم افزار خاصي وجود دارد ) مي توانيد با مراجعه به انچه انجام شده(نرم افزارهاي قبلي) به بررسي نقاط ضعف و قوت نرم افزارها بپردازيد و از اين راه تحليل خود را محكم تر كنيد
• مشاهده عيني : بايستي بطور مداوم با حضور در محل روند كار وانچه گفته مي شود را با انچه مي دانيد تركيب و مقايسه كنيد تا بتوانيد به نكات ريز و ظريفي كه وجود دارد پي ببريد . گاه نكته اي كه از ديد كارفرما بديهي است از ديد شما ناشناخته است
• عكسبرداري و فيلمبرداري و يا ضبط صوت : انسان هيچگاه نمي تواند به حافظه خود جهت يادآوري اتكا كند . بهتر است از اين سه ابزار ساده و ارزان قيمت ( در مقايسه با نتايجي كه بدست مي آوريد ) استفاده كنيد تا در هنگام تحليل بتوانيد با مراجعه مكرر امكان خطا را كاهش دهيد
• ثبت انچه بدست مي اوريد : مطالبي كه شما جمع اوري ميكنيد داراي ارزش زيادي هستند . انها را بطور مداوم دسته بندي و يادداشت كنيد . اينكار باعث مي گردد تا اولا براحتي در مراجعه بعدي مطلب را پيدا كنيد و ثانيا با حذف يك شخص خاص از پروژه (اخراج ، عدم تمايل به كار، بيماري و يا ….) كل پروژه از كار نيفتاد

همانگونه كه مي بينيد در اين مورد اين مساله نكات ظريف بسار زياد است .
از جمله تجربياتي كه من در حين كار متوجه شدم اينست كه وقتي من ميتوانم بگويم يك تحليل جامع و كامل ارائه كردم ويا در واقع صورت مساله را فهميدم كه بتوانم تك تك كارهاي مشتري را در سيستم دستي بدون اشكال خودم انجام دهم .
البته در حين مراحل تحقيق چند نكته را از ياد نبريد
• پررو باشيد : از سه عامل پول ، پارتي و پررويي اگر دوتاي اول را نداريد حداقل سومي را داشته باشيد . البته اين به معناي بي ادب بودن نيست بلكه به معناي سمج بودن يا در اصطلاح ادبي “پشتكار داشتن ” براي دست يافتن به مطلب مورد نظر است
• ايجاد وحشت نكنيد : با فيلمبرداري و ضبط صدا و يا حتي يادداشتها كاري نكنيد كه كارمندان احساس كنند شما درحال جمع اوري مدرك عليه او هستيد

يك تحليل گر علاوه بر ارائه انچه كه وجوددارد بايد بتواند راهكارهاي اصلاح سيستم فعلي را نيز ارائه كند كه به اين مقوله در بخش بعدي خواهيم پرداخت
چگونه تحليل اطلاعات و طراحي كنيم
در ادامه بحث قبل اكنون ميرسيم به اينكه با نتايج مرحله قبل چه كنيم
مواردي كه اكنون در اختيار ما هست عبارنتد از
• كليه فرمهاي ورودي و خروجي سيستم
• توضيحات مربوط به هريك از فرمها بصورت كامل
• نوارهاي صوتي و تصويري احتمالي از مصاحبه ها

طراحي شامل قسمت هاي مختلفي است كه مي توان اولين قسمت انرا ترسيم وضعيت موجود و دسته بندي عنوان كرد

حال بترتيب عمليات زير را انجام دهيد
۱ <<<انچه در اختيار داريد را دسته بندي كنيد
مثلا در مورد يك سيستم پرسنلي دسته ها مي توانند بصورت : اطلاعات پرسنل، مدارك ، مرخصي ، مزايا و… باشند
۲<<<بر اساس دسته بندي اوليه خود نمودار كلي نظام را ترسيم كنيد(System Narrative)

اين نمودارها در واقع عملكرد سيستم فعلي را براي انجام كار نشان مي دهند

۳<<< نمودار گردش داده(Data Flow Diagram يا DFD) را ترسيم كنيد اين نمودار مي تواند به ما نشان دهد كه دادهاي خروجي و ورودي هريك از اجزاء چيست و وضعيت گردش انها به چه ترتيب است . در مورد ترسيم اين نمودار مي بايستي تمامي گردش كار بدقت ترسيم شود چرا كه به عنوان يك نمودار عملياتي بعدا مورد استفاده مكرر شما و مشتري خواهد بود

۴<<< نمودارهاي DFD خود را از سطح صفر به سطح يك و … ببريد. هر سطح نشانه داخلي تر بودن پردازش خواهد بود : مثال سطح ۱

ما اكنون كار مدل سازي سيستم را به صورت شماتيك انجام داده ايم و مي دانيم اطلاعات خام بدست امده از بخش قبل چگونه با يكديگر ارتباط دارند . اما هنوز در مورد اصلاح اين سيستم و شروع طراحي كاري نكرده ايم . اكنون براي بررسي اطلاعات آماده مي شويم .

پايگاهها
اصلي ترين منبع براي اطلاعات فرمهايي است كه در يك سيستم رد و بدل مي شوند.براي پردازش اين فرمها مي بايستي تمامي اطلاعات قيد شده در انها را بصورت يك جدول ليست كنيم . بالاي جدول نيز مي توانيم نام را قيد كنيم

مثال:

نكته
در هنگام بررسي Data ها متوجه خواهيد شد كه برخي مطالب داراي درجه اولويت بالاتري نسبت به برخي ديگر هستند . به عنوان مثال در همان مثال شماره تلفن داراي اهميت بالايي نيست.

حال در قدم بعدي مي توانيد اطلاعات موجود در جدول را بصورت زير در يك Data Catalog ثبت نمود . اين كاتالوگ پيشنهادي است كه اطلاح شده فرمهاي مفصل و دست و پاگير (ولي قدرتمند) اصلي (Data Dictionary)مي باشد. در Data Dictionaryهاي اصلي نه تنها همين مطالب كه مطالب بيشتري مانند محلهاي استفاده ، محدوديتهاي محل و غيره را ميتوان قيد نمود با مراجعه به كتب طراحي مي توانيد به مطالب بيشتري دست پيدا كنيد .
همچنين يك نام نيز براي پايگاه انتخاب كنيد
Factor(پايگاه فاكتور فروش)

اين طرح خام و اوليه پايگاه شماست
چگونه تحليل اطلاعات و طراحي كنيم ۲
در قسمتهاي قبلي گفتيم كه چگونه مي توان به طرح خام از پايگاه رسيد

حال به اين مسئله مي پردازيم كه چگونه مي بايد ارتباط بين اين طرههاي خام را برقرار كرد

در كل سه نوع ارتباط بين پايگاهها وجود دارد
۱٫ يك به يك : (One To One) ارتباطي است كه به ازاي يك ركورد در يك پايگاه فقط و فقط يك ركورد در پايگاه مرتبط موجود ياشد
مثال : يك مشتري يك سفارش دارد
۲٫ يك به چند : (One To Many) ارتباطي است كه به ازاي يك ركورد در يك پايگاه حداقل يك يا بيشتر ركورد در پايگاه مرتبط موجود ياشد
مثال : يك سفارش چند قلم كالا دارد
۳٫ چند به چند : (Many To Many) ارتباطي است كه به ازاي يك ركورد در يك پايگاه حداقل يك يا بيشتر ركورد در پايگاه مرتبط موجود ياشد و بالعكس
مثال : چند مشتري چند سفارش دارند

شكل زير نحو ترسيم اينگونه ارتباط ها را نشان مي دهد

اما تشخيص و ترسيم رابطهاي كلي نظام مستلزم طي كردن قدم به قرم مراحل زير است :
• ابتدا تمامي رابطه هاي واقعي موجود در سيستم را تك به تك بنويسيد
• شكل هريك از رابطه ها را بكشيد
• اشكال را برهم منطبق كنيد تا موجوديتهاي تكراري حذف شوند(شكل كلي ارتباط)
• از طريق تحليل شكل كلي ارتباط هاي اضافي را حذف كنيد

يك مثال : نظام دانشجو ، استاد ، درس ، برنامه درسي
رابطه ها : (دو قدم اول)

تكميل (دو قدم دوم)

چگونه تحليل اطلاعات و طراحي كنيم ۳
تا اين مرحله ما ياد گرفتيم كه چگونه روند كار سيستم را نشان دهيم و چگونه پايگاههاي موجود را از فرمها بصورت خام تهيه كنيم

قبلا گفته شد كه مي بايستي از پيچيدگي سيستم بكاهيم . اين وظيفه را نرمالايز(Data Normalaization) انجام مي دهد.
بترتيب قدمهاي زير را انجام دهيد

۱) داده هاي تكراري را از داده هاي ثابت جدا كنيد و در پايگاههاي جداگانه بگذاريد
مثال از فاكتور خريد زير مي توان ۲ پايگاه را ايجاد كرد

۲) كليد شناسايي تهيه كنيد . تهيه كليد شناسايي ركورد داراي روشهاي بسيار متنوعي است كه اگر توانستم بعدا در اين زمينه توضيحات بيشتري خواهم داد

اما روش كلي براي ساخت كليد را مي توان بصورت زير عنوان نمود : پيدا كردن فيلديا تركيبي از فيلدها كه در هيچ حالتي نتواند تكرار داشته باشد . بعنوان مثال فيلد نام خريدار نمي تواند كليد باشد اما شماره فاكتور يك پيشنهاد براي كليد پايگاه اول است.و در پايگاه دوم ميتوان رديف را پيشنهاد نمود . اشكالي كه در مثال وجود دارداينست كه در پايگاه دوم رديف تكراري خواهد بود براي حذف اين تكرار مي بايستي تركيب اين فيلد را با شماره فاكتور پايگاه اول در نظر گرفت . بنابر اين يك مجموعه Master / Detail خواهيم داشت . شكل زير اين مسئله را روشن مي كند

۳) داده هاي قابل استنتاج و غير كليدي را حذف كنيد ( Calculated Fields)
اين گونه داده ها داده هايي هستند كه مثلا از جمع مقادير يك فيلد ، تفاضا ۲ فيلد و يا محاسبه فرمولي يك فيلد ديگر(تاريخ تولد و سن يا تاريخ استخدام و سابقه كاري) بدست مي آيد .
در مثال فوق مبلغ كل فاكتور در پايگاه اول از اين دسته فيلدها است . بنابر اين پايگاه را بصوت زير تكميل مي كنيم

۴) دادههايي كه در چند پايگاه تكرار ميشوند را حذف كنيد (LookUp Fields)
ممكن است شما براي مشخصات مشتريان خود بخواهيد يك پايگاه جداگانه تعريف كنيد و يا حتي بخواهيد فروشندگان خود را به تفكيك مشخص كنيد در اين صورت لازم نيست در هر ركورد پايگاه اول تمامي مشخصات انهارا قيد كنيد ، بلكه كافي است كد مربوطه را به اين پايگاه منتقل كنيد . شكل زير تمامي پايگاههاي تشكيل شده را نشان ميدهد

حال پايگاه شما در حالت كامل نرمالايز قرار دارد
گفتن چند نكته شايد بد نباشد :
۱) بهنگام طي كردن مرحله ۳ مي بايستي در مورد فيلدهايي كه قابل استنتاج هستند ولي استنتاج انها زمان زيادي مي طلبد قدري با احتياط رفتار كرد . اين مساله به نحوه استنتاج شما ارتباط مستقيمي دارد .شايد توضيحات زير تا حدودي قضيه را روشنتر كند :
• استنتاج زير ۱۰۰ ركورد با حلقه While را شايد بتوان تحمل كرد، هر چند پيشنهاد نمي شود
• ولي اين روش را نمي توان در مورد بالاتر از ان روش درستي ناميد . بهتر است با يك دستور SQL اين زمان را در مورد تعداد بالاتر كاهش داد .
• اما در برخي موارد دستورات SQL نه تنها در مورد تعداد بالا بلكه در مورد پيچيدگي دستور نيز دچار مشكل و بالطبع زمانبر مي شوند در اين حالت بهتر است از روشهاي بهينه سازي دستورات SQL (تعريف Index ها، تودرتو كردن دستورات و… )استفاده كنيد
• اگر با روشها ي فوق به نتيجه نرسيديد و يا علاقه مند به وارد شدن به اين مقولات نيستيد بهتر است اصلا اين فيلد را حذف نكنيد
۲) در مورد مرحله ۲ مي بايستي تجربه و نگاه خوبي به مساله داشته باشيد .
• ممكن است در برخي موارد كليدي بظاهر يكتا باشدولي بعدا متوجه شويد كه يكتا بودن فقط در يك دوره خاص است . اين مساله تمامي طراحي هاي شما را بهم خواهد ريخت .
• ممكن است برخي موارد كليد ها را بيش از پيچيده كنيد . مثلا تركيب چند فيلد براي كليد بودن .اين مساله علاوه بر احتمال كاهش سرعت در فيلدهاي كليدي بزرگ باعث خواهد شد كه اگر برخي از موارد مورد نياز شما در حالات خاص وارد نشود شما در توليد كليد دچار مشكل شويد

چگونه تحليل اطلاعات و طراحي كنيم ۴
انچه كه تا اينجا قيد شد تنها طراحي بخش داده ها بود . ما هنوز چند قسمت ديگر را در پيش رو داريم . به شكل زير دقت كنيد

اگر شماي كلي يك سيستم را شامل ۳ بخش فوق بدانيم ما هم اكنون بخش اول انرا تهيه كرديم .
برنامه ها در بخش دوم قرار دارند كه با UIمتفاوت هستند . برنامه ها در هنگام طراحي صرفا يكسري كدهاي بدون وابستگي به زبان خاص(Pseudo Codes )مي باشند . شايد اطلاق شرايط محيطي به اين برنامه ها براي جلوگيري از اشتباه مفيد باشد .

براي نوشتن اين شرايط طراحان معمولا از كلمات اشنايي نزديك به معاني اصلي استفاده مي كنند .نمونه اين كلمات عبارتند از

مثال :
Read No
Read K
If No > 100
For 1 to No
{ k = k Mod 10
Print K
}
Else
S = Add (No,5)
اما چگونه از اين كد ها مي توان استفاده نمود
فرض كنيد در برنامه فاكتور مي خواهيد حتما يكسري تصميم گيري ها قيد و يا محاسباتي انجام شود . به مثالهاي زير توجه كنيد
۱) تاريخ فاكتور به ماقبل بر نمي گردد
If Input Date < Current Date
Print “Error in Date”
2) جمع حاصل ضرب في در تعداد در مبلغ كل ريخته شود
S = 0
For All rows
S=S+Fi * Numner
Monye = S
3) تعداد درخواستي بايد كمتر از ميزان موجود باشد
If ReqNumber< Remind in stock
………….
Else
Message “Not Enough In Stock “
اما چرا نياز است كه اين مطالب را به اين صورت بنويسيم . زيرا كه اولا امكان خواندن برنامه ها بدون تلاش در فهم متغير ها امكان پذير مي گرددو ثانيا اهداف برنامه ها را مي توان بسادگي پيدا كرد
اما در برخي موارد در نوشتن اين برنامه ها در شرطهاي تودر تو دچار مشكل مي شويم در اينجا بسادگي مي توانيم از درختهاي تصميم گيري استفاده كنيم .
بعنوان مثال بجاي نوشتن اين گونه كد ها
If ………..
……
Else
If ………..
……
.
.
.

مي توان از درخت زير استفاده كرد

تا اينجا توانستيم ۲ قسمت از ADT را تكميل كنيم
۱) پايگاههاي اطلاعاتي
۲) شرايط محيطي كار روي اطلاعات (برنامه ها بدون وابستگي به زبان)

حال بايستي به سراغ قسمت سوم يعني رابط كاربر(User Inter Face) برويم . پيش شرط ان بررسي و شناخت محيط پياده سازي است . اين به معناي بررسي سخت افزار قبل از پياده سازي نرم افزار مي باشد.

براي اين كار بايستي به چند سوال پاسخ دهيد
۱٫ ورود اطلاعات به كامپوتر و احتمالا تبادل اطلاعات با ديگر كامپيوتر ها چگونه است
۲٫ نحوه گرفتن پشتيبان از اطلاعات به چه ترتيب است
۳٫ نحوه دريافت خروجي هاي برنامه ما توسط كاربر چگونه است
۴٫ چه كامپيوتر (هايي ) مورد نياز است كه براي پاسخ به ان بايستي به سوالات زير توجه كنيد
a. حجم عمليات به چه ميزان مي باشد
b. حجم اطلاعاتي فوق در بهترين و بدترين شرايط چه زماني به مي دهد
c. فعاليت هاي ما (Process هاي برنامه )به چه ميزان زمان نياز دارند
d. زمان بازيابي اطلاعات ما چقدر است

همانگونه كه مشاهده مي كنيد
• اين سوالات را در مورد يك سيستم ساده مي توان براحتي جواب داد اما در مورد سيستمهاي وسيع قدري بايد دقت كرد . هرچند توصيه مي كنم هرگز در جايي كه يك شبكه وجود دارد هيچ سيستمي را به صورت تك كاربره در نظر نگيريد ، چون بعد از مدتي يادشان مي ايد كه به شما درمورد شبكه بودن ان قبلا تذكر داده بوده اند!

• در مورد سيستمهاي وسيع (مجموعه نرم افزارها تحت شبكه و يا ۱ نرم افزار كه روي چند سيستم كار ميكند) شايد دانستن چند تعريف باعث شود مسائل را بهتر متوجه شويد
۱٫ شبكه ها محلي (LAN = Local Area Network) شبكه هايي هستند كه معمولا در يك ساختمان و يا محوطه كوچك پياده سازي مي شوند.
۲٫ شبكه هاي وسيع (WAN = Wide Area Network) شبكه هايي هستند كه وابستگي جغرافيايي در انها معني ندارد
۳٫ ميزبان (Host/Server) : به كامپيوتري مي گويند كه وظيفه نگهداري اطلاعات را برعهده دارند . اين كامپيوتر ها معمولا از قدرت پردازش بالاتري برخوردارند
۴٫ ميهمان (Guest / Client ) كامپيوتر هايي كه از داده هاي موجود در سرور استفاده / حذف / تغيير ويا اضافه مي كنند

همچنين در مورد نحوه اتصال كامپيوتر ها به يك ديگر نيز با توجه به اشكال زير مي توان برخي از مفاهيم را شناسايي كرد

كامپيوتر آبي همان ميزبان و مشكي ميهمان است

البته ممكن است كه چند شبكه به هم متصل باشند

تمامي مطالبي كه گفته شد براي اين بود كه بگوييم
“وظيفه شما به عنوان يك تحليل گر و طراح ايجاب مي كند كه شما بتوانيد ابتدا طرح شبكه را به عنوان كسي كه شناخت جامع و كاملي از نرم افزار داريد به مسئولان پياده سازي شبكه پيشنهاد دهيد “

اما چگونه ؟
۱٫ ابتدا به مساله پايگاهها با دقت توجه كنيد . برخي از پايگاهها را لازم است در كامپيوتر ميهمان و برخي را در كامپيوتر ميزبان قرار دهيد . نحوه اين تقسيم بندي را بايستي با توجه به
a. ميزان زمان مورد نياز براي پردازشها
b. اهميت دادهها
c. اشتراك داده ها
d. رده بندي داده ها
مشخص نمود .
فرض كنيد در يك سيستم برخي از پايگههاي شما موقتي هستند و نتيجه انها در يك سيستم ديگر ثبت مي شوند و يا لازم است نتيجه يكسري از مقادير در اختيار ديگران قرار گيرد . هردو اين مثالها پايگاههايي را نشان مي دهند كه مي توانند روي كامپيوتر هاي ميهمان قرار گيرند
۲٫ به مساله پردازشها توجه كنيد . اين مساله ارتباط مستقيمي با محل نگهداري اطلاعات پايگاهها دارد . برخي از پردازشها را بايد روي كامپيوتر ميهمان انجام داد . مثلا نتيجه گيري از دادههاي وارد شده در كامپيوتر اپراتور براي ارسال به كامپيوتر ميزبان . اما برخي ديگر را مي بايستي در كامپيوتر ميزبان انجام داد.
يك مثال ساده مي تواند به شما كمك كند . فرض كنيد مي خواهيد جمع كل يكسري داده را محاسبه كنيد . اين پردازش بايستي در نزديكترين محل به كامپيوتر نگهداري ان داده ها باشد . اگر داده ها در كامپيوتر ميزبان هستند ، در انجا و باالعكس . اينكار باعث كاهش ترافيك شبكه و سرعت پاسخگويي مي شود .اما اگر اين كار امكان پذير نيست بايستي مشتري هزينه بيشتر براي شبكه متحمل شود
۳٫ كنترل ، نه تنها به مفهوم امنيت كه به معناي تقسيم كار هم مي باشد . فرض كنيد در يك سيستم ، دادههاي ورود و خروج اجناس را قرار است ثبت كنند . ايا بهتر است يك كامپيوتر (براي ثبت اطلاعات) در محل قرار دهند و يا مي توان اطلاعات را به يك قسمت ديگر براي ثبت فرستاد ؟ و ايا بهتر است بانك اطلاعاتي در محل باشد و سپس با ديسكت (يا هر انتقال Off Line ديگر ) به كامپيوتر مادر منتقل شود و يا انتقال بايد همزمان ثبت باشد؟ ايا امنيت (چه در مورد دستكاري اطلاعات Off line و چه در مورد ثبت اشتباه Online ) تامين مي شود ؟ و سوالات ديگري كه با تجربه و مطالعه مي توان جواب انها را پيدا كرد

براي پياده سازي راههاي متعددي وجود دارد .من در ادامه اين نوشته ها راهي را كه بنظرم داراي كمترين اشكال وكد وهمچنين بيشتري بازه است را خواهم گفت .
اما قبل از آنكه بخواهيد شروع به نوشتن برنامه ها كنيد چند نكته كوچك و پر اهميت را براي دوستاني كه نمي دانند عنوان مي كنم .

تقسيم بندي پايگاهها :
پايگاهها هميشه يك نوع نيستند. بلكه داراي تقسيم بندي برحسب نوع عملكرد دارند. اين تقسيم بندي (كه تقريبا همجا يكسان است) بصورت زير مي باشد
۱٫ پايگاههاي اصلي (Master): پايگاههايي هستند كه اطلاعات مادر رانگهداري مي كنند . مثلا پايگاه اطلاعات پرسنل و يا اطلاعات دانش آموزان
تشخيص : اين نوع پايگاه داراري تغييرات كمي هستند مثلا تصحيح نام يا تاريخ استخدام و برخي از فيلد ها هرگز تغيير نمي كنند . مثلا شماره شناسايي

۲٫ پايگاههاي ثبت تغييرات (Detail) : پايگاههايي كه تغييرات مرتبط با پايگاههاي مادر را ثبت مي كنند. مثلا ورود و خروج كارمندان و يا نمرات دانش آموزان
تشخيص : اين نوع پايگاه داراي تغييرات وسيعي مي باشد و بيشترين كار كاربر روي فعاليت اين نوع پايگاه استوار است
۳٫ پايگاههاي مرجع (Reference) : اطلاعاتي كه در اين نوع پايگاهها ثبت مي شوند تقريبا ثابت هستند. مثلا پايگاه واحدهاي اندازه گيري يا نحوه محاسبه بيمه و ماليات
نكته : اين نوع پايگاهها را نبايد با پايگاههاي اصلي اشتباه گرفت و همچنين در برخي از موارد اين پايگاهها فاقد كليد اصلي هستند

۴٫ پايگاههاي راكد (Archive) : پايگاههايي براي نگهداري اطلاعات دوره هاي قبلي كار سيستم هستند. مثلا بايگاني سالهاي مالي و يا سوابق افراد
نكته : در بيشتر موارد اطلاعات موجود در اين پايگاهها مي بايستي غير قابل تغيير باشند. همجنين در مورد نحوه تشكيل اين پايگاهها مي توان به ۲ صورت زير عمل نمود
• يك فايل ثابث كه اطلاعات هردوره به اين فايل اضافه مي شود
• از طريق تقسيم بندي محل نگهداري (ديسكها ، شاخه ها و … ) اين اطلاعات را برحسب دوره از يكديگر منفك نمود
۵٫ پايگاه هاي پشتيبان (Back Up) : پايگاههايي براي پشتيباني از پايگاههاي اصلي يا تغييرات هستند و در صورت خرابي فايل ها اصلي مورد استفاده قرار مي گيرند .

نكته : انواع روشهاي زمانبندي براي پشتيبان گيري وجوددارد . به عنوان مثال روش پدربزرگ كه شكل زير ميتواند تاحدودي به نحوه كار ان اشاره كند.
توجه داشته باشيد كه شدت رنگ ميزان خطر از دست رفتن اطلاعات را مشخص مي كند

۶٫ فايل يا پايگاه ثبت تغييرات (Transaction Log) : پايگاه و يا فايلهايي كه هرگونه تغييرات در ديگر انواع پايگاهها را ثبت مي كنند و بهنگام بروز اشكال ، كاربر مي تواند پايگاهها را به زمان پشتيبان گيري برگردانده و از طريق اين فايلها تمامي عمليات را مجدد اعمال نمايد
نكته : چنانچه شما سيستمي را مورد استفاده قرار مي دهيد كه تعدادي اپراتور در ان ورود و يا اصلاح اطلاعات انجام مي دهند ، اينگونه فايلها جزء مهمترين دسته فايلهايي هستند كه به شما مي توانند كمك كنند.

روشهاي بازيابي اطلاعات :
۱٫ روش متوالي (Physical Sequential File Access)
در اين روش اطلاعات به ترتيب و ركورد به ركورد خوانده و يا نوشته مي شوند
۲٫ روش متوالي منطقي (Logical Sequential Access)
در اين روش كليه ركورد ها بر اساس يكي از فيلد مرتب شده است و پردازش ركورد به ركورد انجام مي شود
۳٫ روش دسترسي مستقيم (Direct Access/Random Access)
در اين روش دستيابي به يك ركورد فقط از طريق كليد انجام مي شود

انواع بانكهاي اطلاعاتي :
۱٫ طبقاتي (Hierarchical)
در اين روش هر پايگاهي يا بصورت Parent و يا Child است . دستيابي به اطلاعات حتما مي بايستي از ريشه شروع شود . مزيت اين نوع مشابهت ان با طبيعت سازمانهاي اطلاعات است
شكل زير اين نوع را نمايش مي دهد

۲٫ شبكه اي (Network)
در اين روش هر پايگاه عضوي (Member) از يك پايگاه ديگر(Owner) است . اين روابط را مجموعه ها (Set) تعريف مي كنند . از انجا كه هر پايگاهي مي تواند داراري اين رابطه باشد شكل ناشي از اين نوع پايگاهها دارار انعطاف بسيار زيادي است . براي پيدا كردن يك ركورد در اين مجموعه ابتدا بايد به سراغ مالك مجموعه و از طريق ان بسراغ عضو رفت . به شكل زير دقت كنيد

۳٫ نوع رابطه اي (Relational)
در اين روش برخلاف دو روش قبل رابطها قطعيت ندارند ، بلكه با روابط رياضي تعريف مي شوند . نمونه اين پايگاهها SQL است .در اين روش ميتوان از پايگاههاي اصلي هر نوع جداولي كه اطلاعات را به تفكيك يكسري صفات (فيلد ها) نگهداري مي كنند ايجاد و روابط بين اين جداول را از طريق دستوراتي مانند Select وJoin و… برقرار نمود .توانايي بالاي اين نوع پايگاهها در ايجاد جداول ، ارتباط بين جداول و يا با پايگاهها و مرتب سازي قدرت انعطاف بسيار بالايي را به اين نوع بانكهاي اطلاعاتي مي دهد. شكل زير را ببينيد

در پرانتز
آنچه كه تا اينجا عنوان شد حاصل دروس دوران دانشگاه ، كتب مختلف طراحي و تجربه هاي شخصي بنده بود . كتب مختلفي بعنوان مرجع استفاده شدند كه كتاب “تحليل و طراحي نظامهاي كامپيوتري ” تاليف دكترمحمود جهاني براي دسته بندي وترتيب مطالب و برخي مثالها بيشترمورد استفاده قرار گرفت. خواندن اين كتاب را به همه توصيه مي كنم و از همينجا از ايشان تشكروقدرداني مي نمايم . در ادامه مطلب از مراجع ديگر استفاده ومعرفي خواهند شد.

شروع
با يك جمع بندي از قبل كه انجام دهيم ، مي توانيم به اين نكته برسيم كه ما برنامه را از نظر تحليل و طراحي آماده كرديم اما در زمان پياده سازي نياز است كه به چند سوال مهم جواب دهيم
۱٫ برنامه را چگونه پياده كنيم
۲٫ در چه محيطي
۳٫ با چه ابزاري
۴٫ در چه مدت زمان
۵٫ چه نوع تكنيكهاي برنامه نويسي استفاده كنيم

بنظرمن جواب اين سوالها به ۲ سوال مهم از خود شما برمي گردد :
۱٫ با چه محيطهايي آشنا هستيد
۲٫ تا چه حد به محيطهاي مذكور مسلط هستيد
اما بطور كلي از ديد من جواب سوالهاي فوق بدين صورت مي باشد

۱٫ سه نوع پياده سازي وجود دارد
a. پياده سازي از طريق مدل سازها مانند Rational Rose/Modal Maker كه در اين حالت بايستي از سالها تجربه در زمينه تحليل ، طراحي و برنامه نويسي برخوردار باشيد تا بتوانيد هم به سادگي برنامه اي را توليد هم سريعا خطاهاي احتمالي سيستم را بررسي و رفع كنيد . انشاا… وقتي اين بحث خاتمه پيدا كرد مقالاتي راجب به اين مطلب خواهم نوشت .

b. پياده سازي از طريق الگوهاي آماده مانند Microsoft Access كه در اين حالت نيازي آنچناني به دانستن علوم كامپيوتر احساس نمي شود . شما مي توانيد با يك دوره آموزش ۱۰ ساعته به تهيه و توليد هرنوع برنامه بانك اطلاعاتي بپردازيد . اين روش بنابر قدرتهاي خوبي كه در اختيار كاربر (و يا توليد كننده نرم افزار) قرار ميدهد، داراري محبوبيت فراواني است . اما اين نوع برنامه ها نيز داراي مشكلات مخصوص به خود هستند. درمورد اين روشها نيز مي توانيد مطالب زيادي (و يا افراد زيادي ) پيدا كنيد

c. پياده سازي از طريق كد نويسي (برنامه نويسي) اين روش كه زمان زيادتري (به نسبت ۲ روش قبل )نيز طلب مي كند مورد بحث ما است كه باالطبع توضيح كامل در ادامه بحث داده خواهد شد