تفاوت بین توسعهدهنده نرمافزار و برنامهنویس چیست؟
برنامهنویس و توسعهدهنده هر دو کدنویسی میکنند اما توسعهدهنده میتونه مساله حل کنه و با قابلیتهایی که داره برای تیم موثرتر باشه
چرا یک عده از جمله من خودشون رو توسعهدهنده نرمافزار صدا میکنند در حالی که کارشون برنامهنویسی هست؟
در بخشی از نوشته مهارتهای کار تیمی نرمافزار قسمت دوم: اشتراک گذاری دانش اشاره کردم که درباره تفاوت برنامهنویسی و توسعه نرمافزار خواهم نوشت. این مطلب به این موضوع اختصاص خواهد داشت.
برای اینکه تفاوت بین این دو کلمه رو از نظر فنی (و نه صرفاً معنایی) متوجه بشوید، اجازه بدید از مثالی که در این مقاله آمده استفاده کنم. در این مثال یک صورت مساله مشخص را به دو شخص که یکی صرفاً برنامهنویسی میداند (programmer است) و دیگری را میتوان توسعهدهنده نرمافزار (Software Developer) نامید میدهیم و خروجی را مقایسه میکنیم:
صورت مساله: برنامهای بنویسید که 2 عدد را با هم جمع کند و نتیجه را نشان بدهد.
اگر به یک برنامهنویس (فرض کنیم برنامهنویس دات نت) صورت مساله بالا را بدهیم، بلافاصله Visual Studio را باز میکنه و شروع میکنه به نوشتن کد و build و باز هم کد و build و build، اجرا و تست و در نهایت آماده شدن چیزی شبیه به تصویر زیر:

این برنامه در نگاه اول کار خواسته شده را انجام میدهد اما:
- ظاهر مرتبی ندارد، input ها در یک خط نیستند.
- هیچی توضیحی در کار نیست، کاربر لابد از روی متن دکمه Add باید بفهمد که برنامه چه کاری انجام میدهد.
- tab order درست نیست.
- اسم پنجره Form1 است! یعنی برنامهنویس حتی زحمت تغییرش را به خودش نداده. حتی آیکون پیش فرض پنجره هم تغییر نکرده است.
- فقط یک عمل جمع را انجام میدهد، هر چند صورت مساله همین بوده اما اصلاً به این شکل قابل توسعه نیست.
- نتیجه عملیات را میتوان به صورت دستی تغییر داد!
- فضای اضافی زیادی در پنجره وجود دارد.
- اگر به جای عدد، حروف الفبا وارد کنید، برنامه به exception میخورد!
و اگر احتمالاً کد این برنامه را نگاه کنیم با انبوهی از نامگذاری اشتباه label1 و button1 و متدهایی مثل button1click و ... مواجه میشویم که هیچ کس حتی خود برنامهنویس، دو ماه بعد متوجه منطق آنها نخواهد شد! احتمالاً هیچ کامنتی در کد وجود ندارد، به همه حالات خطا فکر نشده و بعضی چیزها مثل عملیات انجامی هم hardcode شده است.
اما اگر به یک توسعهدهنده نرمافزارصورت مساله بالا را بدهید، قبل از نوشتن کد، یک قلم و کاغذ برمیدارد و لیستی از ویژگیهای برنامهای که میخواهد درست کند ایجاد میکند. به خطاهای احتمالی فکر میکند و همینطور یک UI اولیه بر روی کاغذ ترسیم میکند. بعد دست به کار نوشتن برنامه میشود و خروجیاش احتمالاً چیزی شبیه به تصویر زیر خواهد بود:

این برنامه هم در ظاهر همان کار برنامه بالا را انجام میدهد اما:
- کنترلها align شده و مرتب هستند.
- هر چند در تصویر بالا دیده نمیشود اما tab order درست است.
- کاربر امکان انتخاب عملیات را دارد و همچنین توضیحی در رابطه با نحوه کار برنامه در قالب یک label داده شده است.
- امکان تغییر نتیجه نیست.
- در صورتی که ورودی نامعتبری داده شود، برنامه به جای exepction ای که handle نشده، یک خطای مناسب را در نتیجه نشان میدهد (مثلاً NaN)
- هر چند در تصویر بالا دیده نمیشود اما به کنترلهای ورودی tooltip اضافه شده است.
- فضای خالی کمتری در برنامه وجود دارد.
علاوه بر این موارد در کد نیز، نامگذاری استاندارد استفاده شده و مواردی که نیاز به توضیح داشته، کامنت نوشته شده است. خطاها به شکل مناسبی مدیریت شدهاند و برای استثناء های غیرقابل پیشبینی هم فکری شده. پروژه تست اتوماتیک برای نرمافزار هم نوشته شده است.
مقایسه تولید محصول توسط برنامهنویس و توسعهدهنده نرمافزار
شاید به نظر برسد، وقتی فقط کدی بنویسیم که کار میکند حالا اگر چند تا باگ را مدیریت نکرده باشیم یا نامگذاری استانداردی به کار نبرده باشیم، بعداً هم وقت برای رفع این موارد هست و از این جهت تولید محصولات نرمافزار توسط برنامهنویسان سریعتر و از نظر اقتصادی به صرفهتر است اما واقعیت این است که زمانی که بعداً صرف اصلاح معماری اشتباه یا رفع باگها یا حتی فهم کدهای نوشته شده (اغلب اسپاگتی) برنامهنویسان میشود خیلی خیلی بیشتر از زمان صرف شده توسط توسعهدهنده نرمافزار برای تولید یک محصول نرمافزاری خوب و با کیفیت است.
برای برنامهنویس شدن شما نیازی به تحصیلات دانشگاهی ندارید (هر چند تحصیلات دانشگاهی میتواند به دید شما کمک کند اما الزامی نیست) در واقع هر کسی با خواندن یک کتاب برنامهنویسی میتواند مدعی تولید نرمافزار شود، آنچه توسعهدهندگان نرمافزار را از برنامهنویسان عادی متمایز میکند در کنار تجربه، استفاده مناسب از روشهای حل مساله برای حل تمیز مسائل از طریق تولید نرمافزار است. این کاری است که فقط با تمرین و یادگیری مداوم بدست میآید.
در این مورد بیشتر با هم حرف میزنیم.