ورود

View Full Version : سوال: سوالی از برنامه نویسان با تجربه در خصوص بررسی پایدار بودن یک برنامه نوشته شده



one hacker alone
دوشنبه 20 خرداد 1392, 03:25 صبح
با ياد خدا
با سلام
سوالی که برام پیش اومده اینه که چجوری میتونیم میزان پایدار بودن یک برنامه رو بسنجیم و بررسی کنیم
یعنی اینکه برنامه ای که ما طراحی کردیم از تمام جوانب اون رو بررسی میکنیم و از عدم خطادهی اون اطمینان حاصل میکنیم اما نمیدونیم که این برنامه آیا واقعا برای مدت طولانی میتونه تو یک سیستم دوام بیاره یا نه
و اینکه چقدر تغییرات بستر اجرایی روی اون تاثیر میزاره یعنی اینکه برنامه ما در حالت عادی خوب کار میکنه اما شاید یه کلید تو رجیستری دستکاری بشه برنامه ما کار نکنه یا اینکه اگه یه بار نتونه یک فرایند رو انجام بده برای همیشه مختل بشه و این سری مسائل
حالا سوالم اینه که چجوری بدونیم چقدر پایداره ؟ یعنی مثلا 1 سال رو یه سیستم بمونه چه بلایی سرش میاد؟ خب نمیتونیم که یک سال برای نتیجه این ازمایش صبر کنیم باید روشهایی برای از بین بردن این زمان در ازمایشات باشه
و اینکه چه نکاتی رو برای پایدار بودن برنامه باید رعایت کنیم؟

hrj1981
دوشنبه 20 خرداد 1392, 07:18 صبح
با سلام
من خودم از تجربه مايكروسافت استفاده كردم ، من به شما اطمينان 100 درصدي ميدم كه هيچ نرم افزاري كه توليد ميشه حتي اگه سخت ترين فرآيندهاي تست و ايزو رو هم داشته باشه بدون باگ نيست ، تنها روشي كه هم ميشه باگها رو تشخيص داد مديريت هسته اصلي نرم افزاره (كد هاي نوشته شده).براي اين كار هم همانطور كه گفتم من به شخصه از تجربه مايكروسافت بهره گرفتم ، يك سيستم كنترل هسته نوشتم و و اين سيستم توكار جزئي ترين خطاها را به صورت خودكار تويه يك فايل log ميريزه و فقط كاربر با اشاره يك كليد شرح خطاها را به سرور اصلي من منتقل ميكنه بعد شما خيلي راحتتر ميتوني نرم افزار رو اصلاح كني ، چون هيچكس مثل يك كاربر نميوته در طول مدت فرآيند حيات يك اپليكيشن نكات ضعف اونرو در بياره

one hacker alone
دوشنبه 20 خرداد 1392, 11:15 صبح
ممنون
خب حرف شما منطقیه
خودمم همچین چیزی تو ذهنم بود اما برای پیاده سازی دو مشکل دارم
اول اینکه سیستم مدیریت خطایی که قرار پیاده سازی بشه به چه شکل هست
دوم اینکه وقتی یه برنامه خطا میده خب کلا از کار میفته پس چجوری اون لحظه میتونه فرایند لوگ رو انجام بده؟

setroyd
دوشنبه 20 خرداد 1392, 11:26 صبح
اینو نمیشه فهمید این دیگه بستگی به توانایی برنامه نویس داره مثلا من همیشه برای برنامه هام از api استفاده میکنم و از object کمتر استفاده میکنم و سعی میکنم تمام activex هامو خودم بنویسم درسته این کار وقت گیر و بیخوده ولی برای خودم نوشتم و دارم خوب اینم یه جورشه ! . پس نتیجه میگیرم اگر dll ها پاک بشن سیستم هم بالا نمیاد و برای فرامین خود خطا تولید میکنه پس این اولین چیز، از چیزی استفاده بشه که همه ی سیستم ها به اون وابسته هستند و دارند , کلا برای این موضوع چیزی نیست اینو باید برنامه نویس پیش بینی کنه و سعی کنه برنامه ای طراحی کنه که به خیلی چیزا وابسته نباشه یا اگرم هست بتونه کاری کنه در صورت نبودن ایجاد بشه .

hrj1981
دوشنبه 20 خرداد 1392, 11:30 صبح
زياد سخت نيست ، من از يك آيتم خيلي كمك گرفتم ، ابزار كدمستر يك بسته كمكي كه به محيط ويژوال بيسيك اضافه ميشه كه توش يه افزونه هاي زيادي رو در اختيار برنامه نويس قرار ميده (تو خود تالار سرچ كني پيداش ميكني ). يكي از اين افزونه ها ايجاد يك هندل مديريت خطاي رويداد هست كه دو تا كار رو انجام ميده ، اول اينكه رويداد شما را داخل يك سيستم مديريت خطا ميذاره دومين كار مهمش شماره گذاري خطوط برنامه به صورت كاملا خودكاره ، اين مرحله اول كاره ، دومين مرحله شما بايد يك SUB به صورت Public ايجاد كني كه فايل log رو درست كنه و شرح خطا ، محل وقوع خطا و شماره خط خطا رو توش append كنه ، و سومين مرحله اينكه تو هر رويداد كه ميخواي مديريت خطا توش اعمال باشه اين sub كه ايجاد شده رو فراخواني كنه ، اگه مبهم بود بگو مرحله مرحله توضيح بدم

m.4.r.m
دوشنبه 20 خرداد 1392, 12:42 عصر
من یه برنامه تو یه سیستم نصب کردم الان 2 سال بیشتر داره کار می کنه سیستم انواع ویروس ها خرابی ویندوز داشته و ... اما برنامه همچنان پا بر جاست فقط سعی کنید از هر چی استفاده می کنید بکنید فقط Trial نباشه که بعد یه مدت گیر بده یا خودتون OCX بنویسید یا از فایل هایی استفاده کنید که خود ویژوال بیسیک همراه داره اینطوری هیچ مشکلی پیش نمیاد

one hacker alone
دوشنبه 20 خرداد 1392, 16:17 عصر
خب ممنون حرف دوستان مفید بود
اول از همه اینکه به قول دوستمون setroyd (http://barnamenevis.org/member.php?183390-setroyd) باید سعی کنیم برنامه ما کمترین وابستگی رو داشته باشه
به نظر من این خیلی مهم هست چون هرچی اجزای برنامه از خودمون باشه نسبت به اون میتونیم اعتماد بیشتری کنیم
دوست دیگرمون hrj1981 (http://barnamenevis.org/member.php?41307-hrj1981) در مورد وجود ابزار های کمکی برای مدیریت بهتر کد گفتن که اینم فکر کنم موثر باشه البته بنده درخواست دارم در این زمینه یکم ما رو جلو ببرن
و اگه مقاله ای دارن ارائه بدن
خب باز دوستان اگه نظر دیگه ای دارن خوشحال میشم این مبحث کامل تر بشه

hrj1981
دوشنبه 20 خرداد 1392, 22:13 عصر
در خصوص بحث کمتر وابسته بودن نرم افزار به ابزار بیرونی منهم موافق دوستان هستم اما یک نکته اینجا وجود داره که من اون رو با این سوال مطرح میکنم ، یک برنامه نویس چقدر باید وقت بذاره تا بتونه یه مجموعه ابزار شبیه codejock درست کنه ؟
اما در بحث مدیریت هسته نرم افزار ، دوستان اگر دقت داشته باشند و یا بهش برخورد کرده باشند تو پروژه هایی که خطوط نرم افزار مثلا از 10.000 خط بالا میره و اگر برنامه نویس تنها باشه که هم باید وظیفه طراحی و کد نویسی و تیونینگ و تست برنامه را خودش به تنهایی انجام بده حتما ضریب خطا بالا میره ( مخصوصا در نرم افزارهای تجاری ) که مثلا تو یه برنامه 50 فرمی که شاید بالای یکسال برای تولیدش زمان صرف شده تویه یک فرم برای محاسبه جمع دو تا عدد ساده کد اشتباهی سهوی داشته باشه و نرم افزار توی اون گلوگاه کرش بشه و بسته بشه ،علاوه بر ضربه به اعتبار برنامه نویس و از دست دادن روحیه معمولا باید با کاربرها دو ساعت سر و کله بزنی که خطا تو کجای برنامه رخ داده و بدتر از اون اگه درست راهنماییت کنن باید بیایی تو nتا خط دنبال سوزن بگردی
من این صحبتهایی رو که مطرح کردم به قول معروف با پوست و گوشتم احساس کردم و مطمئنم خیلی از دوستای گل برنامه نویسم هم این استرس ها رو پشت سر گذاشتن ، حالا با مطرح شدن این بحث بسیار مفید تو تالار خوبه که سایر دوستان هم کمک کنن مطالب کاملتر بشه ، تجربه خوبی میشه

hrj1981
دوشنبه 20 خرداد 1392, 22:21 عصر
نمونه کدهای زیر نشون میده که چه جوری میشه هسته نرم افزار را از نظر رخ دادن خطا مدیریت کرد (نکته مهم اینه که اگه خطایی هم رخ داد نرم افزار کرش نمیشه و بسته نمیشه و وقوع خطا را با یک پیغام به کاربر اطلاع میده

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

Public Function RequstEbtal(ID As Long) As Boolean
'<EhHeader>
On Error GoTo RequstEbtal_Err
'</EhHeader>
100 If ID = 0 Then Exit Function
Dim cnn As New AdoDb.Connection, Rs As New AdoDb.Recordset
102 cnn.Open DbfTrn
104 Rs.Open "SELECT ...", cnn, adOpenForwardOnly, adLockReadOnly
106 If Not Rs.EOF = True Then
108 RequstEbtal = False
110 EbtalDes = Rs.fields(2)
Else
112 EbtalDes = Empty
114 RequstEbtal = True
End If
116 Set Rs = Nothing
118 cnn.Close
120 Set cnn = Nothing
'<EhFooter>
Exit Function
RequstEbtal_Err:
If Err.Number = 0 Then Exit Function
Call Writen_Error("ProjeName.MDL_APP.RequstEbtal", Err.Number, Err.Description, Erl)
MsgBox Err.Description & vbCrLf & _
"in Diamond_Invoice.MDL_APP.RequstEbtal " & _
"at line " & Erl, _
vbExclamation + vbOKOnly, "Application Error"
'</EhFooter>
End Function

نمونه کد دوم ابزاری که فایل log نرم افزار رو تولید میکنه


Public Sub Writen_Error(Membership As String, _
ErrNumer As Long, ErrDes As String, ErrLine As Long)
On Error GoTo Writen_Error_Err
100 Open App.path & "\ROOT\LOG\" & App.Title & ".log" For Append As #1
102 Write #1, Membership, ErrNumer, ErrDes, ErrLine, Roz, Time$
104 Close #1
106 Debug.Print Membership & _
"-" & ErrLine & "-" & ErrDes
Exit Sub
Writen_Error_Err:
108 If Err.Number = 0 Then Exit Sub
110 Call Writen_Error("ProjeName.MDL_ErrorManager.Writen_Error", Err.Number, Err.Description, Erl)
112 MsgBox Err.Description & vbCrLf & _
"in Diamond_Invoice.MDL_ErrorManager.Writen_Error " & _
"at line " & Erl, _
vbExclamation + vbOKOnly, "Application Error"
'Shell "ErrorManager.exe", vbNormalFocus

End Sub

one hacker alone
سه شنبه 21 خرداد 1392, 11:43 صبح
بله ممنون از دوست عزیزمون که وقت گذاشتن
این بحث مدیریت خطا ها هم اگه به درستی روی پروژه اعمال بشه به نظرم خیلی در کامل کردن برنامه و رفع خطاها کمک میکنه من ترجیح میدم در نرم افزار هایی که نسخه های زیادی ازش تکثیر شده خطاها به سروری ارسال بشه که برنامه نویس اونها رو بررسی کنه و رفع خطا کنه اما یه نکته ی مهم که وجود داره اینه که ما به چه شکل میتونیم برنامه رو طراحی کنیم تا بشه براش افزونه نوشت یا مثلا من برای دکمه x یه سیری عملیات در قالب تابع نوشتم که بعد از بررسی خطا میبینم اونها اون تابع نیاز به اصلاحات داره حالا این مهم هست که به چه شکل میشه در قالب اپدیت برنامه خودش هوشمند عمل کنه و اون قسمت رو ترمیم کنه

hrj1981
سه شنبه 21 خرداد 1392, 16:31 عصر
براي مطلب شما ، اولين قدم ثبت خطاهاي رخ داده شده در جاييه( فايل log و ...) كه تو پستهاي قبلي توضيح دادم
براي ارسال اين خطاها به سرور بايد در زمينه ايجاد و ساخت بانك اطلاعاتي بر روي يك هاست تحقيق كنيد و پس از ايجاد بانك اطلاعاتي ميتونيد خطاهاي ثبت شده رو به صورت يك ركورد خط به خط بخونيد و اونا را در سرور ذخيره كنيد .
در خصوص بحث افزونه ، دو تا مطلب وجود داره ، اول اينكه ما بخواهيم پس از هر بار تغيير يك ستاپ كامل به مشتري ارائه بديم كه من خودم به شخصه با اين روش خيلي موافقم ، اما با توجه به حجم يك فايل ستاپ كامل و هزينه هاي انتقال و خطوط اينترنت و ... يكمي سخته
در روش دوم ما فقط فايلهايي كه تغيير داده شدند و يا به روز رساني شدن رو براي مشتري بفرستيم كه جايگزين فايلهاي قديمي كنه كه اينم چه به صورت هوشمند و چه به صورت دستي امكان پذيره ، مثل سرويس پكهاي مايكروسافت

one hacker alone
سه شنبه 21 خرداد 1392, 16:53 عصر
در مورد ارسال لوگ ها و ذخیره اونها سمت سرور مشکلی ندارم
فقط مشکلی که هست گاها کل پروژه ما میشه یک فایل اجرایی حالا اگه بخوایم سرویس پک براش بسازیم و بفرستیم برا مشتری چکار باید بکنیم نه اینکه کل فایل رو بفرستیم

hrj1981
سه شنبه 21 خرداد 1392, 20:26 عصر
این سوالی که شما مطرح کردید یکم گنگه ، وقتی شما یک برنامه میسازید و به مشتری ارائه میدید عملا یک فایل اجرایی با ملزومات راه اندازی و اجرا بهش میدید ، حالا وقتی شما داخل هسته برنامه اعم از کد یا تغییر در فرمها و گزارش ها میدید کل این تغییرات باید در فایل اجرایی جدید کامپایلر بشه ، خوب اگه ما قراره مداوم نرم افزار رو پایدا نگه داریم لازمش تغییر مداوم فایل اجرایی برنامه است ، تو بحثهای قبلی هم که داشتیم گفتم چون یک فایل اجرایی میزان حجمش خیلی کمتر از یک ستاپ کامله و راحتتر میتونی به مشتری ارائه بدی

one hacker alone
سه شنبه 21 خرداد 1392, 21:50 عصر
روشی که من فکر کنم قابل پیاده سازی باشه اینه که فایل اجرایی رو با یک فایل دیگه ترکیب میکنیم در واقع embed میکنیم تو فایل دیگه جوری که وقتی برنامه اجرا بشه فایل قدیمی رو متوقف کنه بعد پاک و فایل اجرایی رو اکسترا کنه و جایگزین و بعد اجرا
البته این روند باید با مدیریت کامل پشتیبان گیری از اطلاعات قبلی صورت بگیره

vbhamed
یک شنبه 26 خرداد 1392, 06:37 صبح
در مورد ارسال لوگ ها و ذخیره اونها سمت سرور مشکلی ندارم
فقط مشکلی که هست گاها کل پروژه ما میشه یک فایل اجرایی حالا اگه بخوایم سرویس پک براش بسازیم و بفرستیم برا مشتری چکار باید بکنیم نه اینکه کل فایل رو بفرستیم
سلام
معمولا در اينگونه موارد برنامه از اصل به صورت يك عدد فايل تنها ساخته نميشه
هم مي‌تونيد قسمتهاي مختلف برنامه رو جداگانه بنويسيد و exe جدا بسازيد و هم به صورت dll بنويسيد و در صورت لزوم هر كدوم رو ارتقاء بدين