|
|
تست جوئل -- The Joel Test : 12 راهی
براي كد بهتر
جوئل اسپولسكي، يهودي ساكن آمريكا است كه از جمله سوابقش مديريت پروژه MS Excel v5 است. او نظريات منحصر به فرد و جالبي در زمينه توليد نرم افزار دارد و امروزه در شركت خودش، Fog Creek Software مشغول به كار است. متن زير كه توسط وي در اوت 2000 منتشر شده است مشخصه هاي ارزيابي يك تيم نرم افزاري را به زبان ساده و تا حدي طنز گونه بيان ميكند. در ترجمه اين متن سعي شده است اصطلاحات فني به صورتي كه بين برنامه نويسان حرفهاي در ايران مصطلح است به كار رود.
آيا تا بحال نام SEMA (Software Engineering Measurement and Analysis) را شنيده ايد؟ SEMA ، سيستم نسبتاً مبهمي است براي اندازه گيري شايستگي يك تيم نرم افزاري. نه! صبر كنيد، به سايت آن نرويد، زيرا فقط شش سال طول ميكشد تا مطالب آن را بفهميد. به همين علت من تست كاملاً نامرتب و نامعتبر (!) خودم را براي ارزيابي كيفيت يك تيم نرم افزاري درست كردم. بهترين قسمت ماجرا اينجاست كه فقط سه دقيقه از وقتتان را ميگيرد. با وقتي كه صرفه جويي ميكنيد، ميتوانيد به سراغ حرفه پزشكي برويد[1]!
ويژگي شسته و رفته تست جوئل در اين است كه به راحتي ميتوان به هر سؤال جواب بله يا نه داد. شما مجبور نيستيد كه تعداد خطهاي كد در روز يا تعداد متوسط اشكال در هر قسمت را بشماريد. نقطه ضعف تست جوئل در اين است كه نبايد از آن براي اطمينان از صحت نرم افزار نيروگاه اتمي خود استفاده كنيد!
امتياز 12 عالي، 11 قابل قبول و 10 يا پايينتر نشان دهنده مشكلات جدي است. واقعيت در اين است كه بيشتر موسسات نرم افزاري با امتياز 2 يا 3 در حال فعاليت هستند و به كمك جدي نياز دارند، چرا كه شركتهايي مانند Microsoft تمام مدت با امتياز 12 اداره مي شوند.
البته، اينها تنها موارد مشخص كننده موفقيت يا شكست نيستند: مثلاً ، اگر شما تيم ماهري داريد كه بر روي محصولي كه هيچ كس آن را نمي خواهد كار ميكند، خوب، مردم باز هم آن محصول را نخواهند خواست. از طرفي، تيم غير عادي را ميتوان تصور كرد كه بدون انجام هيچ كدام از اين كارها، نرم افزار فوق العاده اي توليد كند و دنيا را تغيير دهد. اما اگر همه شرايط برابر باشند، با رعايت اين 12 نكته، تيم منضبطي خواهيد داشت كه هميشه موفق به تحويل پروژه هايش ميشود.
. آيا از سيستم كنترل سورس بهره ميبريد؟
. آيا ميتوانيد در يك مرحله، برنامه تان را build
كنيد؟
اگر اين رويه بيشتر از يك مرحله داشته باشد، مستعد اشتباه است. و هر چقدر به زمان تحويل نزديكتر ميشويد، احتياج به چرخه سريعتري براي تصحيح "آخرين" bug، و ساختن EXE نهايي داريد. اگر كامپايل كردن كد، اجراي سازنده installer و بقيه كارها بيست مرحله به طول انجامد، دست به اشتباهات احمقانه خواهيد زد. فقط به همين علت، آخرين شركتي كه در آن كار ميكردم، از WISE به InstallShield تغيير كرد: لازم بود كه رويه ايجاد installer از روي يك script به صورت خودكار نيمه شبها توسط NT Scheduler اجرا شود و WISE چنين قابليتي نداشت. (دوستان خوب ما در WISE به من اطمينان داده اند كه آخرين نسخه شان توانايي build هاي شبانه را دارد.)
. آيا داراي build روزانه هستيد؟
شكستن بيلد آنقدر بد (و رايج) است كه درست كردن بيلد روزانه كمك ميكند كه چنين موضوعي ناشناخته نماند. در تيمهاي بزرگ، يك راه اين كه مطمئن شويد كه چنين مشكلاتي در اولين فرصت برطرف شوند، اين است كه بيلد روزانه را هر روز، هنگام ناهار انجام دهيد. همه تمامي check in هايي را كه ميتوانند قبل از رفتن به ناهار انجام ميدهند. بيلد، زماني كه همه برگشتند تمام شده است. اگر كه همه چيز درست است، كه فبحال! آخرين نسخه سورس توسط همه check out شده و كار ادامه پيدا ميكند. اما اگر كه عمل بيلد با موفقيت روبرو نشده باشد، افراد با نسخه سالم قبلي به كار خود ادامه ميدهند.
در تيم Excel، با قانوني داشتيم: هر كسي كه build را ميشكست، به عنوان تنبيه، مسئولیت نگهداري از بيلدها را عهده دار ميشد. اين انگيزه خوبي بود هم براي جلوگيري از شكستن بيلد، و هم راه خوبي بود براي اين كه همه (به صورت چرخشي) ياد بگيرند كه رويه چطور است.
ميتوانيد در مقاله ديگرم - Daily Builds are Your Friend - در مورد build هاي روزانه بيشتر بخوانيد.
. آيا بانك اطلاعاتي از اشكالات ((bugs داريد؟ بانك باگ ميتواند پيچيده و يا ساده باشد. يك بانك باگ سودمند بايد حداقل اطلاعات زير را در مورد هر باگ نگه دارد :
اگر پيچيدگي نرم افزار پيگيري باگها مانع از آن ميشود كه چنين كاري را انجام دهيد، يك جدول پنج ستونه (با فيلدهاي ضروري فوق) بسازيد و شروع به انجام اين كار كنيد.
براي اطلاعات بيشتر در مورد رديابي باگها، مقاله Painless Bug Tracking را بخوانيد.
. آيا قبل از نوشتن كد جديد، به رفع اشكالات كنوني
ميپردازيد؟
مايكروسافت متوجه شد كه مديران پروژه آنقدر بر حفظ " زمان بندي " (schedule) اصرار داشتند كه برنامه نويسان مجبور به كد نويسي با عجله شده بودند، و بسيار بد كد مي نوشتند - به اين علت كه فاز bug fix جز زمانبندي رسمي نبود. تلاشي براي پايين نگهداشتن تعداد خطاها وجود نداشت. حتي برعكس، روايت شده كه يكي از برنامه نويسان كه مسؤول نوشتن كد محاسبه ارتفاع خطوط متن بود، فقط نوشت: return 12; و بعد هم منتظر نشست تا در گزارش باگها بيايد كه تابعاش ، هميشه درست كار نميكند. زمانبندي پروژه صرفاً تبديل شده بود به ليستي از باگهايي كه بايد توليد ميشد! بعدها، از اين اتفاق با عنوان " متدولوژي عيوب نامحدود " (infinite defects methodology) ياد شد.
براي حل اين معضل، مايكروسافت " متودولوژي كمترين عيوب" (zero defects methodology) را به صورت فراگيري اتخاذ كرد. بسياري از برنامه نويسان داخل شركت خنديدند - چون به نظر ميرسيد مديريت به اين نتيجه رسيده بود كه با يك حكم سازماني تعداد باگها را كم كند. اما در واقع، معني " كمترين عيوب" در اين است كه در هر لحظه، بالاترين اولويت در رفع باگهاست، نه نوشتن كد جديد. اما چرا؟
به صورت كلي، هر چه براي تصحيح يك اشكال بيشتر معطل كنيد، هزينه تصحيح آن (از لحاظ وقت و پول) بيشتر خواهد بود.
به عنوان مثال، وقتي كه اشتباه تايپي انجام ميدهيد و كامپايلر آن را catch ميكند، تصحيح آن كار اساساً سادهايست. به همين ترتيب، بار اولي كه كدتان را اجرا ميكنيد و در آن اشكالي ميبينيد، ميتوانيد بلافاصله آن را تصحيح كنيد، چون همه كد در ذهنتان وجود دارد.
اما اگر در كدي كه چند روز پيشتر آن را نوشته ايد، ايرادي بيابيد، يافتن محل دقيق آن مدتي طول خواهد كشيد، البته وقتي كه كدتان را باز خواني كنيد همه چيز بالاخره يادتان ميآيد و در يك زمان قابل قبول مشكل رفع ميشود.
اما بالاخره اگر در كدي كه چند ماه پيش آن را نوشته ايد باگي پيدا شود، به احتمال زياد چيزهاي زيادي را در مورد آن كد به فراموشي سپرده ايد و تصحيح آن بسيار سختتر است. ممكن است مشغول تصحيح باگ كد كسي شده باشيد كه در آن لحظه براي مرخصي به جزاير درياي كارايب رفته باشد. در اين صورت، تصحيح باگ به صورت يك علم در ميآيد : بايد با درايت، وسواس، نظم و بدون هيچ تصوري از مدت زماني كه يافتن راه حل طول ميكشد، عمل كنيد.
اگر در كدي كه تحويل دادهايد ايرادي بيابيد، متحمل هزينه باز هم زيادتر براي اصلاح آن خواهيد شد.
پس اولين دليلي كه بايد باگها را بلافاصله رفع كرد، كم كردن زمان لازم براي اين كار است. دليل ديگري هم وجود دارد: پيشبيني مدت زمان لازم براي نوشتن كد جديد، راحتتر از پيشبيني زمان لازم براي رفع يك باگ است. مثلاً اگر از شما بپرسم كه چقدر زمان براي نوشتن كدي براي مرتب سازي يك فهرست لازم داريد، جواب نسبتاً دقيق ميتوانيد به من بدهيد. اما اگر از شما بپرسم در جايي كه IE 5.5 نصب شده باشد و كدتان ديگر كار نميكند چقدر زمان لازم داريد تا باگ مربوطه را رفع كنيد، بعيد ميدانم كه حتي بتوانيد حدسي بزنيد! چرا كه (بنابر تعريف صورت مساله) نميدانيد كه منشأ مشكل كجاست. ممكن است سه روز وقتتان را بگيرد، ممكن هم هست كه فقط دو دقيقه.
به بيان ديگر، اگر در برنامه زمانبنديتان تعداد زيادي باگي كه بايد رفع شوند، وجود داشته باشد، زمانبنديتان غير قابل اعتماد است. اما اگر تمامي ايرادهاي شناخته شده را تصحيح كردهايد و فقط كد جديد مانده، زمانبنديتان به طرز حيرت آوري دقيقتر خواهد بود.
نكته خوب ديگري هم كه صفر نگهداشتن تعداد باگها در هر زمان دارد، عكس العمل سريعتر در برابر رقباست. بعضي برنامه نويسان اين قضيه را به " آماده تحويل بودن" محصول در تمام لحظات، تعبير ميكنند. اگر رقيب شما امكان مشتريكُشي[2] عرضه كرد، شما هم ميتوانيد آن امكان را فوراً به برنامه تان اضافه كنيد و آن را تحويل دهيد، بدون اين كه مجبور به تصحيح تعداد زيادي ايراد انباشته شده باشيد.
. آيا برنامه زمانبنديتان به روز است؟
متاسفانه، اين اصلاً به درد نميخورد. برنامه ريزي هاي زيادي بايد قبل از تحويل نهايي كد انجام گيرد : دمونستراسيون، نمايشگاهها، تبليغات و غيره. و تنها راه انجام اين كارها، داشتن برنامه زمان بندي و به روز نگهداشتن آن است.
فايده حياتي ديگر داشتن برنامه زمانبندي در اين است كه مجبورتان ميكند تصميم بگيريد چه امكاناتي[3] را ميخواهيد در برنامه بگنجانيد و اين كه امكانات با اوليت پايينتر را حذف كنيد، و گرفتار بيماري featuritis نشويد. (featuritis / scope creep / creeping featurism، و يا گرايش به ويژگيهاي نو، بيماري طراحان است ؛ طراحان مبتلا به اين بيماري دوست دارند كه به سيستم پيچيدهاي بدون برنامه ريزي كافي امكانات و ويژگيهاي نو اضافه كنند؛ و در واقع آن را - به صورت غير اصولي - فقط پيچيدهتر كنند!)
نگهداشتن schedule (برنامه زمانبندي)، الزاماً سخت نيست. مقاله ديگرم، Painless Software Schedules - كه راه ساده اي براي اين كار ياد ميدهد - را بخوانيد.
. آيا داراي ليست مشخصات هستيد؟
دقيقاً مطمئن نيستم كه چرا ؛ احتمالاً به اين علت است كه برنامه نويسان از نوشتن مستندات متنفرند. در نتيجه، تيمهايي كه همه اعضايش برنامه نويس هستند وقتي سراغ مسألهاي ميروند، ترجيح ميدهند كه راه حلشان به زبان كد باشد تا به صورت سند. ترجيح ميدهند كه از اول شيرجه بزنند و كد بنويسند تا اين كه ابتدا يك ليست مشخصات درست كنند.
در مرحله طراحي، اگر به معضلي بر بخوريد، به سادگي با تغيير چند خط ميتوانيد آن را حل كنيد. اما زماني كه كد نوشته شده است، هزينه درست كردن معضلات بسيار گزاف است : هم از لحاظ عاطفي (چون مردم از دور انداختن كد خود متنفرند)، و هم از لحاظ زماني، و به همين علت نوعي مقاومت در مقابل درست كردن معضل بوجود ميآيد. نرم افزاري كه از روي ليست مشخصات (specifications) توليد نشود معمولاً نتيجه اش طراحي بد و زمانبندي خارج از كنترل است. به نظر ميرسد كه مشكل Netscape نيز همين بوده - چهار نسخه اول آن قدر شلم شوربا شد كه مديريت به طرز احمقانه اي تصميم گرفت همه كد آن را دور بياندازد و از صفر شروع كند. سر Mozilla هم دوباره همين اشتباه را مرتكب شدند، كه محصول آن هيولايي خارج از كنترل است كه چند سال طول كشيده تا فقط به مرحله آلفا برسد.
تئوري مورد علاقه من اين است كه اگر برنامه نويسان را به يك دوره متمركز نويسندگي بفرستيد، ياد خواهند گرفت كه نويسندگان با ذوقي شوند. راه حل ديگر، استخدام مدير برنامه (program manager) زبردستي است كه خود نوشته ها را تهيه كند. در هر دو حالت، بايد قانون " هيچ كدي بدون مشخصات پذيرفته نيست " را به اجرا بگذاريد. در نوشته چهار قسمتي من، هر چه كه در مورد نوشتن مشخصات لازم داريد را ميتوانيد بخوانيد.
. آيا برنامه نويسان شما محيط آرامي براي كار كردن
دارند؟
مشكل اينجاست: همه ما ميدانيم كه نيروي كار فني با قرار گرفتن در جرياني كه از آن به " در بحر موضوع رفتن " تعبير ميشود - بهتر كار ميكنند ؛ اين زماني است كه تمركزشان كاملاً بر روي كارشان است و حواسشان كاملاً از محيط اطرافشان پرت شده است. احساس زمان را از دست ميدهند و از طريق تمركز مطلق، چيزهاي عالي اي خلق ميكنند. نويسندگان، برنامه نويسان، دانشمندان، و حتي بازيكنان بسكتبال در مورد حالت " در بحر موضوع فرو رفتن " ميتوانند براي شما توضيح دهند.
وارد شدن به اين حالت كار ساده اي نيست. اگر اندازه گيري كنيد، ميبينيد كه حدوداً 15 دقيقه طول ميكشد تا به حداكثر كارايي خود برسيد. بعضي مواقع، زمانهايي كه خسته هستيد و يا به اندازه كافي براي آن روزتان خلاقيت به خرج دادهايد، ديگر نميتوانيد در بحر موضوع برويد و بقيه روز را به كارهاي بيهوده، خواندن وب و Tetris بازي كردن ميگذرانيد.
مشكل ديگر در اينجاست كه از دست دادن تمركز كار ساده ايست :سر و صدا، تماسهاي تلفني، ناهار را بيرون خوردن، آن پنج دقيقهاي كه براي نوشيدن قهوه تا كافي شاپ صرف رانندگي ميكنيد، و علل الخصوص مزاحمت ها و سؤالهاي همكاران، همگي تمركز را از بين ميبرند. اگر همكار شما ازتان سؤالي بپرسد كه يك دقيقه كارتان را متوقف كند، ولي آنقدر حواستان را پرت كند كه نيم ساعتي طول بكشد تا به حالت سابق برگرديد، بهروري كلي تيمتان در خطر جدي قرار دارد. اگر در محيط شلوغي كار ميكنيد - از همان نوعي كه dotcom هاي كافئينزده سخت عاشق آن هستند و در آنها بخش فروش زير گوش برنامه نويسان مشغول داد و بيداد هستند - بهروري شما سقوط بدي خواهد كرد.
در مورد برنامه نويسان (به نسبت بقيه knowledge workers و طيفهاي ديگري كه نيازمند تمركز زياد هستند)، قضيه سختتر است. بهروري، به توانايي شعبده بازي با جزئيات زيادي در حافظه موقت بستگي دارد. هر نوع وقفهاي باعث بهم ريختن اين جزئيات ميشود. وقتي كارتان را از سر ميگيريد، هيچ كدام از جزئيات (نظير نام متغيرهاي محلي يا اين كه تا كجاي پياده سازي الگوريتم جستجويتان را انجام داده بوديد) يادتان نخواهد آمد و مجبور به مراجعه به كار قبلتان هستيد كه سرعتتان را ميگيرد.
رياضيات اين مساله زياد سخت نيست: فرض كنيد (كه شواهد هم اين فرض را تاييد ميكنند) كه اگر براي يك دقيقه هم يك برنامه نويس را متوقف كنيد، پانزده دقيقه از بهروريش كم ميكنيد. براي مثال، Jeff و Mutt (كه هر دو برنامه نويس هستند) را در دو پارتيشن كنار هم قرار ميدهيم (در يك فضاي كاملاً Dilbert اي). مات، نام تابع كپي رشته در يونيكد را به خاطر نميآورد. ميتواند جواب آن را جستجو كند - كه 30 ثانيه طول ميكشد، و يا اين كه از جف بپرسد - كه 30 ثانيه طول خواهد كشيد. خوب، چون جف در كنارش نشسته است ترجيح ميدهد كه از او بپرسد. حواس جف پرت ميشود و 15 دقيقه را از دست ميدهد (براي اين كه مات 15 ثانيه صرفه جويي كرده باشد.)
حالا اجازه دهيد كه جف و مات را در دو اتاق (با در و ديوار) جدا بگذاريم. اكنون وقتي كه مات اسم تابع را به خاطر نميآورد، ميتواند جواب آن را جستجو كند (كه همان 30 ثانيه طول ميكشد) و يا اين كه از جف بپرسد كه 30 ثانيه طول ميكشد و شامل از جاي خود بلند شدن هم ميشود (كه با توجه به وضعيت جسمي معمول برنامه نويسان و مسايل ديگر ، كار ساده اي نيست!). بنابر اين ترجيح ميدهد كه جوابش را جستجو كند. 30 ثانيه وقتش تلف ميشود اما 15 دقيقه به نفع جف است! واي!
. آيا بهترين ابزارهايي را كه وجود دارد ميخريد؟
debug كردن كد GUI با يك مانيتور اگر غير ممكن نباشد،
بسيار سخت و دردناك است. اگر در حال نوشتن كد GUI هستيد، داشتن دو مانيتور همه چيز
را بسيار ساده خواهد كرد.
در محل كار قبلي ام، admin شبكه دايماً براي من spam ميفرستاد و غر ميزد كه من بيشتر از 220 مگابايت فضاي مجازم، روي سرور جا اشغال كرده ام. من روزي جواب دادم كه با توجه به قيمت هارد ديسك، هزينه فضاي مورد استفاده كمتر از هزينه دستمال كاغذي من است و صرف كردن حتي ده دقيقه از وقتم براي كوچك كردن دايركتوريام يك هدر دادن اشرافي بهرهوري است.
تيمهاي توليد نرمافزار درجه يك، برنامه نويسان خود را شكنجه نميكنند. حتي موضوعات جزيي اعصاب خرد كن ناشي از داشتن ابزار نامناسب، جمع ميشود و برنامه نويسها را بد اخلاق و ناراحت ميكند. يك برنامه نويس بد خلق، يك برنامه نويس با كارايي پايين است.
يك نكته ديگر هم اضافه كنم... برنامه نويسها را به راحتي ميتوان با رشوه دادن - بوسيله جديدترين و با حال ترين وسايل - تطميع كرد. اين برايتان خيلي ارزانتر از دادن حقوق مكفي تمام ميشود!
. آيا بخش تست شما جداست؟
مقاله Top Five (Wrong) Reasons You Don't Have Testers را كه در مورد همين موضوع نوشتم، بخوانيد.
. آيا داوطلبان جديد در موقع مصاحبه، كد هم مينويسند؟
با اين وجود، هر روز، برنامه نويسهايي بخاطر داشتن resume جالب يا به اين خاطر كه مصاحبه گر از گپ زدن با او لذت برده، استخدام ميشوند. يا بايد به سوالات ساده اي مانند " فرق CreateDialog() و DialogBox() چيه؟ " كه با خواندن مستندات قابل پاسخگويي است، جواب دهند. واقعاً نبايد برايتان اهميتي داشته باشد كه داوطلب، هزاران نكته پيش پا افتاده را حفظ كردهاست يا نه، بلكه بايد توانايي او در توليد كد برايتان مهم باشد. از همه چيز بدتر، سؤالات " معما گونه " است : آن دسته از سؤالاتي كه پاسخ دادن به آنها غير ممكن است ولي وقتي جواب را ميدانيد بديهي به نظر ميرسند.
لطفاً از اين كارها نكنيد! و هر كاري كه ميكنيد، حتماً از مصاحبه شونده بخواهيد كه برايتان كد بنويسد. (براي راهنمايي بيشتر، به مقاله Guerrilla Guide to Interviewing مراجعه كنيد.)
. آيا از آزمايش " قابليت استفاده راهرويي " سود
ميجوييد؟
طراحي " واسط كاربر " خوب آنقدرها هم كه فكر ميكنيد سخت نيست، حتي براي اين كه مشتريها عاشق برنامه تان بشوند و آن را بخرند، واجب هم هست. كتاب مجاني و online من در مورد طراحي واسط كاربر كه الفباي آن را براي برنامه نويسان شرح ميدهد بخوانيد.
اما مهمترين نكته در مورد واسطهاي كاربر (user interfaces) اين است كه اگر برنامهتان را به پنج يا شش نفر نشان دهيد، به سرعت بزرگترين مشكلات كاربران را خواهيد دانست. Jakob Nielsen مقالهاي دارد كه در آن توضيح ميدهد چرا اين چنين است. خلاصه اين كه حتي اگر در زمينه UI واقعاً ضعيف باشيد، با آزمايشهاي قابليت استفاده راهرويي كه شرح آن رفت و خرجي هم ندارد، UI تان واقعاً بهبود پيدا ميكند.
چهار استاده براي تست جوئل :
برگرفته از سایت: http://www.barnamenevis.org
نقل از:
SReza1 |
|
|
آخرين به روز رسانی: آمار بازدید: |