۱۳۸۹ آذر ۶, شنبه

چگونه یک برنامه نویس خوب شوم؟

برنامه نویسان زیادی در جهان وجود دارند که هر یک از چند ماه تا چندین سال است که برای کسب درآمد، علاقه شخصی و یا هردو به تولید نرم افزارهای کامپیوتری می پردازند.

اگر از 50 برنامه نویس بخواهید که برنامه یکسانی را پیاده سازی کنند، ممکن است در نهایت 50 نسخه مختلف از نرم افزار را داشته باشید که به 50 روش مختلف پیاده سازی شده اند، با فرض اینکه همه این نسخه ها بدون مشکل کار می کنند و نتیجه یکسانی را تولید می کنند، مسلما اگر قرار باشد بین این نرم افزار ها بهترین ها را انتخاب کنید، آنهایی را انتخاب می کنید که کارکردن با آنها راحت تر بوده و سریعتر باشند.

حال اگر قرار باشد از برنامه نویسان نسخه های برتر بخواهید که امکان بزرگ دیگری را به نرم افزار اضافه کرده و روند کاری بخشی از نرم افزار را به طور کلی تغییر دهند، احتمالا با نتایج جالبی برخورد خواهید کرد. گروهی از برنامه نویسان نرم افزار خود را در مدت چند روز تغییر داده و تحویل می دهند، بعضی در مدت چند هفته و بعضی دیگر شاید اصلا نتوانند این کار را انجام دهند و با مشکلات و به اصطلاح باگ های فراوانی روبرو شوند. شاید گروهی از آنها بگویند "اگر از همان ابتدا کل نرم افزار را برایمان مشخص کرده بودید برایتان طراحی می کردیم ولی الان تغییرات بسیاری لازم است"  و شما در جواب می گویید "چطور فلانی توانست نرم افزار را در مدت 2 روز به طور کامل تغییر دهد؟".

بله، در پایان این مرحله شاید راهی جز انتخاب یکی دو برنامه نویس نداشته باشید و بقیه به وضوح ضعیف تر به نظر برسند. شما در نهایت نرم افزاری را انتخاب کردید که به نسبت سریعتر با کاربری راحت تر و همینطور با قابلیت تغییر پذیری بالاتر بود. 

در عمل و در یک تیم طراحی نرم افزار، وظیفه طراحی ظاهر و رابط کاربری به عهده برنامه نویس نیست بلکه مهندسین نرم افزار طی جلساتی که شاید همه برنامه نویسان در آن حضور نداشته باشند، رابط کاربری نرم افزار را تعیین کرده و با در نظر گرفتن اولویتهای کاری نرم افزار بهترین و راحت ترین شیوه برقراری ارتباط کاربر با نرم افزار "از نظر خود" را تعیین می کنند. همین مهندسین نرم افزار معماری نرم افزار و کلاسهای موجود در آن را تعیین می کنند و در نهایت احتمالا رابطهای کلاس (Interface) نوشته شده و سپس برنامه نویسان وارد عمل می شوند.

همین طراحی کلاسها  و در حالت کلی تر طراحی ساختار داخلی نرم افزار است که تعیین کننده ترین عامل در قابلیت تغییر پذیری نرم افزار خواهد بود. رجوع کنید به مطلب برنامه نویسی شیء گرا 

اما اینکه برنامه نویس چگونه قسمت های خواسته شده را پیاده سازی می کند، به عهده خودش است. معمولا مهندسین بالا دست و مدیر یک پروژه نرم افزاری و یا یک مشتری کاری به ساختار داخلی کد و یا الگوریتم نوشته شده برای پیاده سازی یک متد از یک کلاس ندارند، بلکه در نهایت سرعت اجرای آن متد و میزان منابع سیستمی مصرف شده برای اجرای آن که در تستهای نرم افزار تشخیص داده می شود مهم است. برنامه نویس خود باید بتواند با انتخاب بهترین الگوریتم و بهترین ساختمان های داده ای متد مورد نظر را پیاده سازی کند.

مشاهده کردید که در یک تیم بزرگ نرم افزاری، وظیفه طراحی ظاهری و حتی ساختار داخلی کلاسهای نرم افزار به عهده برنامه نویسان نیست و می دانید که این دو عامل جزء عوامل تعیین کننده در موفقیت نرم افزار محسوب می شوند، اما قسمتی بسیار مهم که بیشتر با مسائل فنی کامپیوتر و برنامه نویسی سروکار دارد به عهده برنامه نویس است و آن سرعت و کارایی نرم افزار است. گرچه در تیمهای کوچک و یا حتی در طراحی نرم افزار به صورت انفرادی اهمیت اطلاع برنامه نویسان از مسائل مربوط به طراحی ظاهر و معماری کلاسهای نرم افزار دو چندان می شود.

برای اینکه یک برنامه نویس خوب باشیم لازم است از مسائل پایه ای که مربوط به کارایی نرم افزار می شود شروع کنیم. الگوریتم و ساختمان داده (Data Structure).

اصول طراحی الگوریتم ها یکی از مهمترین مباحثی است که هر برنامه نویسی باید با آن آشنا باشد، مبحثی که در آن برنامه نویس با انواع الگرویتمهای روتین برای حل دسته های مختلف مسائل آشنا می شود، یاد می گیرد که چطور سرعت و کارایی یک الگوریتم را محاسبه کند و حتی پیش بینی کند که برای یک مسئله خاص الگوریتمی که در ذهن اوست به نتیجه می رسد و یا خیر. کتایهای زیادی برای آشنایی برنامه نویسان با این مبحث وجود دارد که معروفترین مرجع دانشگاهی آن در دنیا معروف به CLRS است.

ساختمان داده ها نیز از جمله مباحث بسیار مهم است که برنامه نویس در آن با انواع ساختارهای داده ای در علم کامپیوتر آشنا شده، معایب و مزایای آنها را متوجه شده و می تواند تشخیص دهد که در هر موقعیت و برای هر کاری از کدام ساختار استفاده کند. این ساختار های به طور کلی برای نگهداری داده ها استفاده می شوند، از نگهداری داده ها بروی حافظه اصلی و برای انجام پردازش روی آنها گرفته تا نگهداری داده های با حجم بالا روی حافظه های کمکی. از جمله آنها می توان به موارد زیر اشاره کرد.
Linked List ها، Queue ها،Stack ها، Tree ها،Dictionary و ...

لازم به ذکر است که این دو مبحث ار مسائل پایه ای هستند و برنامه نویس در مرحله بعد به جز در مواردی خاص لازم است برای نوشتن اکثر نرم افزارهای کامپیوتری با برنامه نویسی شیء گرا و اصول مهندسی نرم افزار نیز آشنا باشد.

البته تمرین، مطالعه و تفکر از ضروری ترین اموری هستند که هر برنامه نویسی در هر سطحی باید مد نظر قرار دهد.

در انتها ذکر این نکته لازم است که طراحی ظاهر نرم افزارها در اکثر کشورهای جهان زیر مجموعه شاخه ای از علم کامپیوتر به نام "تعامل انسان و کامپیوتر" (Human Computer Interaction) است.

هیچ نظری موجود نیست:

ارسال یک نظر