B O L O T
04-06-2007, 22:15
اشاره :
يكي از مفاهيم بسيار جالب و در عين حال بسيار پيچيده در دنياي برنامهنويسي، مفهوم باگ (Bug) يا نقص نرمافزاري است. واقعاً چرا نرمافزارها باگ دارند؟ چرا هيچ وقت شر اين باگها از سرمان كم نميشود؟
يك تلنگر فكري
خوب است گاهي از فضاي روزمرگي بيرون بياييم و به مفهوم واقعي كارهايي كه انجام ميدهيم و علل وقوع پديدههاي اطراف خود نظري بيفكنيم و درباره آنها دوباره بينديشيم. يكي از مفاهيم بسيار جالب و در عين حال بسيار پيچيده در دنياي برنامهنويسي، مفهوم باگ (Bug) يا نقص نرمافزاري است. شايد هيچ مفهوم و موضوع ديگري در علوم مهندسي را نتوان يافت كه به اندازه مفهوم باگ، اين واقعيت مهم را براي انسان روشن كرده باشد كه هيچ فرمول و قانون ساخت انسان، بياشكال و نقص نيست و در هر طرح و برنامهاي، بدون ترديد، نقصانها و لغزشهايي وجود دارد كه در نگاه اول به نظر نرسيده است. بنابراين همواره بايد در جهت اصلاح طرحها، برنامهها، قوانين و فرمولها كوشيد. به عقيده من موضوع باگ چندان مهم است كه ميتوان درباره چرايي و چگونگي آن ساعتها بحث كرد. اميدوارم در آينده نزديك فرصتي فراهم آيد تا در مورد ابعاد فلسفي اين قضيه چيزي بنويسم، اما در اين مجال كوتاه ميخواهم كمي درباره ابعاد علمي و مهندسي اين موضوع گپ بزنم. واقعاً چرا نرمافزارها باگ دارند؟ چرا هيچ وقت شر اين باگها از سرمان كم نميشود؟
باگ چيست؟
همان طور كه ميدانيد، به هر نقص يا ايراد يك نرمافزار يا برنامه كامپيوتري باگ ميگويند. باگ از نظر لغوي يعني حشره كوچك و در تاريخ مهندسي نرمافزار گفته ميشود اين اصطلاح را اولين بار Grace Hoper، خانمي كه در دانشگاه هاروارد مشغول تحصيل و تحقيق در رشته كامپيوتر بود، به كار برده است. او كه در حال كار با كامپيوترهايMark II و Mark III بود، يكبار با مشكل مواجه شد و تكنيسينهايي كه براي بررسي مشكل و تعمير كامپيوتر، آن را باز كرده بودند سوسكي را پيدا كردند كه وارد دستگاه شده بود و آن را از كار انداخته بود.
البته در حقيقت اين واژه را اولين بار همان تكنيسينهايي كه اين حشره را داخل دستگاه يافته بودند، طي يادداشتي (اولين دليل واقعي باگ / ايراد برنامه پيدا شد) به شوخي به كاربرده بودند. البته اين تكنيسينها يا خانم هوپر اولين كساني نبودند كه از اين واژه براي اشاره به يك ايراد در دستگاهي استفاده ميكردند. آنها صرفاً براي نخستين بار از اين اصطلاح در دنياي كامپيوتر استفاده كردند، ولي اعتقاد بر اين است كه اصطلاح Debugg توسط همين افراد ابداع شد.
موضوع باگ يكي از سرفصلهاي مهم رشته مهندسي نرمافزار است. از اين رو متون و كتابهاي مفصلي در زمينهDebugging يا اشكالزدايي از نرمافزار و متدهاي آن تأليف شده است و همچنان ادامه دارد. برنامهنويسان تازهكار معمولاً از اين شاخه مهندسي نرمافزار گريزانند و اميدوارند برنامههايي بنويسند كه به قدري خوب باشد كه اصلاً كارش به اشكال زدايي نكشد، ولي پس از دو سه سال كار حرفهاي در اين زمينه سرانجام تسليم ميشوند و آشنايي با اصول علمي اشكال زدايي برايشان به يك ضرورت تبديل ميشود؛ مگر اينكه نخواهد به اصول اخلاقي و حرفهاي مهندسي نرمافزار متعهد باشند و از اينكه برنامههاي ساخت آنها پر از انواع باگ و ايراد باشد، باكي نداشته باشند، اما برطرف كردن باگها براي بسياري از برنامهنويسان غيرآماتور يكي از قسمتهاي چالش برانگيز و لذت بخش كار است و تقريباً مثل حل كردن معما است.
برنامهنويساني كه دائماً به فكر كاستن از باگها و ايرادهاي نرمافزارهاي خود هستند، در حقيقت به طور مداوم در حال انجام يك ورزش فكري هستند كه رشتهاي تو در تو از حلقههاي پرسش و پاسخ را در دل خود دارد. با اين همه، اجازه بدهيد به اختصار ببينيم اصولاً چرا باگها به وجود ميآيند و ريشه اين معضل كجاست؟
چرا باگها پديد ميآيند؟
وقتي در دنياي سيستمهاي ديجيتالي و كامپيوتري از باگ صحبت ميكنيم، مقصودمان بيشتر يك نقص نرمافزاري است و كمتر پيش ميآيد يك نقص ديجيتالي سختافزاري را باگ بناميم. هرچند كه اين لغت از نظر تاريخي در مهندسي مكانيك و ادوات سختافزاري ريشه دارد. بنابراين آن دسته از وسايل ديجيتالي كه فاقد نرمافزارند، اصولاً در اين بحث جاي نميگيرند. مثلاً يك دستگاه ويديو را با يك كامپيوتر مقايسه كنيد. هر وقت كه ميخواهيد ويديو را روشن كنيد، يا روشن ميشود يا نميشود و حالت ديگري در اين ميان وجود ندارد، اما وقتي يك كامپيوتر را روشن ميكنيد، ممكن است سيستم عامل بالا نيايد (بوت نشود). در اين صورت ميتوان گفت كامپيوتر واقعاً به كار نيفتاده است؛ زيرا با اين كه روشن است، كار نميكند. بنابراين، هر مشكلي هست، در ماهيت نرمافزاري باگ نهفته است.
در اينجا به پرسش اساسيتري ميرسيم: اصلاً نرمافزار چيست؟ اين پرسش كوچكي نيست و من هم در اين يادداشت كوچك ادعاي پاسخ دادن به آن را ندارم، اما تا آنجا كه به بحث ما مربوط ميشود، ميتوان گفت نرمافزار بستهاي حاوي يك يا چند دستورالعمل است كه كسي (پردازنده) آن را در جايي (حافظه) اجرا ميكند. پردازندههاي امروزي به ندرت اشتباه ميكنند. به علاوه، خود آن يك سختافزار ديجيتالي است كه بحث باگ چندان درباره عملكرد آن صدق نميكند. در واقع اگر انصاف بدهيد، احتمال اشتباه محاسباتي پردازندههاي امروزي اينتل و AMD در كامپيوترهاي ما چنان ناچيز است كه اصلاً قابل مطرح كردن نيست. پس بايد بدانيم كه اين دستورالعمل كجا اجرا ميشود؟ جواب <حافظه> است. در نتيجه پاسخ اين معما هرچه باشد، ماجرايي است كه در ارتباط با دستورالعملها و حافظه رخ ميده
يكي از مفاهيم بسيار جالب و در عين حال بسيار پيچيده در دنياي برنامهنويسي، مفهوم باگ (Bug) يا نقص نرمافزاري است. واقعاً چرا نرمافزارها باگ دارند؟ چرا هيچ وقت شر اين باگها از سرمان كم نميشود؟
يك تلنگر فكري
خوب است گاهي از فضاي روزمرگي بيرون بياييم و به مفهوم واقعي كارهايي كه انجام ميدهيم و علل وقوع پديدههاي اطراف خود نظري بيفكنيم و درباره آنها دوباره بينديشيم. يكي از مفاهيم بسيار جالب و در عين حال بسيار پيچيده در دنياي برنامهنويسي، مفهوم باگ (Bug) يا نقص نرمافزاري است. شايد هيچ مفهوم و موضوع ديگري در علوم مهندسي را نتوان يافت كه به اندازه مفهوم باگ، اين واقعيت مهم را براي انسان روشن كرده باشد كه هيچ فرمول و قانون ساخت انسان، بياشكال و نقص نيست و در هر طرح و برنامهاي، بدون ترديد، نقصانها و لغزشهايي وجود دارد كه در نگاه اول به نظر نرسيده است. بنابراين همواره بايد در جهت اصلاح طرحها، برنامهها، قوانين و فرمولها كوشيد. به عقيده من موضوع باگ چندان مهم است كه ميتوان درباره چرايي و چگونگي آن ساعتها بحث كرد. اميدوارم در آينده نزديك فرصتي فراهم آيد تا در مورد ابعاد فلسفي اين قضيه چيزي بنويسم، اما در اين مجال كوتاه ميخواهم كمي درباره ابعاد علمي و مهندسي اين موضوع گپ بزنم. واقعاً چرا نرمافزارها باگ دارند؟ چرا هيچ وقت شر اين باگها از سرمان كم نميشود؟
باگ چيست؟
همان طور كه ميدانيد، به هر نقص يا ايراد يك نرمافزار يا برنامه كامپيوتري باگ ميگويند. باگ از نظر لغوي يعني حشره كوچك و در تاريخ مهندسي نرمافزار گفته ميشود اين اصطلاح را اولين بار Grace Hoper، خانمي كه در دانشگاه هاروارد مشغول تحصيل و تحقيق در رشته كامپيوتر بود، به كار برده است. او كه در حال كار با كامپيوترهايMark II و Mark III بود، يكبار با مشكل مواجه شد و تكنيسينهايي كه براي بررسي مشكل و تعمير كامپيوتر، آن را باز كرده بودند سوسكي را پيدا كردند كه وارد دستگاه شده بود و آن را از كار انداخته بود.
البته در حقيقت اين واژه را اولين بار همان تكنيسينهايي كه اين حشره را داخل دستگاه يافته بودند، طي يادداشتي (اولين دليل واقعي باگ / ايراد برنامه پيدا شد) به شوخي به كاربرده بودند. البته اين تكنيسينها يا خانم هوپر اولين كساني نبودند كه از اين واژه براي اشاره به يك ايراد در دستگاهي استفاده ميكردند. آنها صرفاً براي نخستين بار از اين اصطلاح در دنياي كامپيوتر استفاده كردند، ولي اعتقاد بر اين است كه اصطلاح Debugg توسط همين افراد ابداع شد.
موضوع باگ يكي از سرفصلهاي مهم رشته مهندسي نرمافزار است. از اين رو متون و كتابهاي مفصلي در زمينهDebugging يا اشكالزدايي از نرمافزار و متدهاي آن تأليف شده است و همچنان ادامه دارد. برنامهنويسان تازهكار معمولاً از اين شاخه مهندسي نرمافزار گريزانند و اميدوارند برنامههايي بنويسند كه به قدري خوب باشد كه اصلاً كارش به اشكال زدايي نكشد، ولي پس از دو سه سال كار حرفهاي در اين زمينه سرانجام تسليم ميشوند و آشنايي با اصول علمي اشكال زدايي برايشان به يك ضرورت تبديل ميشود؛ مگر اينكه نخواهد به اصول اخلاقي و حرفهاي مهندسي نرمافزار متعهد باشند و از اينكه برنامههاي ساخت آنها پر از انواع باگ و ايراد باشد، باكي نداشته باشند، اما برطرف كردن باگها براي بسياري از برنامهنويسان غيرآماتور يكي از قسمتهاي چالش برانگيز و لذت بخش كار است و تقريباً مثل حل كردن معما است.
برنامهنويساني كه دائماً به فكر كاستن از باگها و ايرادهاي نرمافزارهاي خود هستند، در حقيقت به طور مداوم در حال انجام يك ورزش فكري هستند كه رشتهاي تو در تو از حلقههاي پرسش و پاسخ را در دل خود دارد. با اين همه، اجازه بدهيد به اختصار ببينيم اصولاً چرا باگها به وجود ميآيند و ريشه اين معضل كجاست؟
چرا باگها پديد ميآيند؟
وقتي در دنياي سيستمهاي ديجيتالي و كامپيوتري از باگ صحبت ميكنيم، مقصودمان بيشتر يك نقص نرمافزاري است و كمتر پيش ميآيد يك نقص ديجيتالي سختافزاري را باگ بناميم. هرچند كه اين لغت از نظر تاريخي در مهندسي مكانيك و ادوات سختافزاري ريشه دارد. بنابراين آن دسته از وسايل ديجيتالي كه فاقد نرمافزارند، اصولاً در اين بحث جاي نميگيرند. مثلاً يك دستگاه ويديو را با يك كامپيوتر مقايسه كنيد. هر وقت كه ميخواهيد ويديو را روشن كنيد، يا روشن ميشود يا نميشود و حالت ديگري در اين ميان وجود ندارد، اما وقتي يك كامپيوتر را روشن ميكنيد، ممكن است سيستم عامل بالا نيايد (بوت نشود). در اين صورت ميتوان گفت كامپيوتر واقعاً به كار نيفتاده است؛ زيرا با اين كه روشن است، كار نميكند. بنابراين، هر مشكلي هست، در ماهيت نرمافزاري باگ نهفته است.
در اينجا به پرسش اساسيتري ميرسيم: اصلاً نرمافزار چيست؟ اين پرسش كوچكي نيست و من هم در اين يادداشت كوچك ادعاي پاسخ دادن به آن را ندارم، اما تا آنجا كه به بحث ما مربوط ميشود، ميتوان گفت نرمافزار بستهاي حاوي يك يا چند دستورالعمل است كه كسي (پردازنده) آن را در جايي (حافظه) اجرا ميكند. پردازندههاي امروزي به ندرت اشتباه ميكنند. به علاوه، خود آن يك سختافزار ديجيتالي است كه بحث باگ چندان درباره عملكرد آن صدق نميكند. در واقع اگر انصاف بدهيد، احتمال اشتباه محاسباتي پردازندههاي امروزي اينتل و AMD در كامپيوترهاي ما چنان ناچيز است كه اصلاً قابل مطرح كردن نيست. پس بايد بدانيم كه اين دستورالعمل كجا اجرا ميشود؟ جواب <حافظه> است. در نتيجه پاسخ اين معما هرچه باشد، ماجرايي است كه در ارتباط با دستورالعملها و حافظه رخ ميده