
برنامهنویس، مهندس نرمافزار یا معمار نرمافزار: مسئله این است!
اسامی مختلفی در حوزهٔ توسعهٔ نرمافزار وجود دارد که ممکن است خیلیها تفاوت آنها را ندانند که عبارتند از برنامهنویس، مهندس نرمافزار و معمار نرمافزار. اینکه این ۳ مفهوم تا چه میزان شباهت و تفاوت باهم دارند و تعریف دقیق هر یک از آنها چیست، میتواند موضوع جالب توجهی برای اکثر افرادی باشد که تازه پا به این حوزه گذاشتهاند و به همین علت، در این مقاله سعی کردهایم اجمالاً به بیان این تفاوتها بپردازیم.
برنامهنویس
Programmer یا «برنامهنویس» در سادهترین تعریف کسی است که کد میزند، با منطق برنامهنویسی آشنا است و توانایی استفاده و بهکارگیری امکانات زبانهای برنامهنویسی مانند حلقهها، دستورات شرطی و ... را دارا است.
به احتمال خیلی زیاد، چنین شخصی توانایی ایجاد یک وبسایت، ساخت برنامههایی که از بانکهای اطلاعاتی استفاده میکنند و یا دیگر ابزارهای کاربردی را دارد؛ این برنامهها ممکن است با استفاده از مجموعهای از کدها که توسط برنامهنویس نوشته میشوند کار کنند که در برخی اوقات سورسکد کوچکی را شامل میشوند. بههرحال، برنامهنویس توانایی ساخت برنامههای کوچک و متوسط را دارد و بهتنهایی میتواند از پس این کار بهخوبی برآید.
مهندس نرمافزار
به زبان ساده میتوان گفت Software Engineer یا «مهندس نرمافزار»، برنامهنویسی است که یکسری قابلیتهای بیشتر را نسبت به یک برنامهنویس صرف دارا است؛ قابلیت تفکر کردن به مسائل پیشرو و حل آنها بخشی از فعالیتهای یک مهندس نرمافزار است.
درواقع، مهندس نرمافزار باید یک برنامهنویس خوب باشد تا بتواند مشکلات پیادهسازی کدها را درک کند و در کنار آن، قابلیت مدیریت کردن یک مسئله را نیز داشته باشد. همچنین یک مهندس نرمافزار بایستی شناخت خوبی نسبت به ابزارها و انواع روشها داشته باشد و بتواند بهترین روش را که کمترین هزینه و زمان را دربرمیگیرد انتخاب نماید. او باید بتواند برای هر مسئله، یکراهحل بهینه بیابد و اگر راهحلی نبود، آن را ایجاد کند.
معمار نرمافزار
معماری علمی است که در آن هنر نهفته است؛ هنری که پشت آن دانشی است عظیم. یک Software Architect یا «معمار نرمافزار» باید یک هنرمند باشد، یک برنامهنویس خبره، یک مهندس نرمافزار باتجربه که چیزی بیش از 20 سال (به بیان بزرگان این علم) تجربه در زمینهٔ اجرای پروژههای مختلف نرمافزاری دارا باشد تا بتواند معماری یک پروژهٔ عظیم نرمافزاری را در دست گیرد.
اما منظور از معماری نرمافزار چیست؟ در پاسخ به این سؤال بایستی بگوییم که اگر در نظر بگیریم یک برنامهنویس فقط با کدها در ارتباط است، یک مهندس نرمافزار باید با یکسری مسائل و راهحلها و درنهایت با یکسری ابزارها و افراد (سایر برنامهنویسان) درگیر باشد، اما یک معمار نرمافزار بایستی پلتفرمهای مختلف نرمافزاری و روشهای تولید را بشناسد، بایستی شناخت مناسبی نسبت به شرایط و نیازهای مشتری داشته باشد، باید بتواند پیوند بین مهندسین نرمافزار و برنامهنویسان را تسهیل کند و درنهایت باید شناخت مناسبی نسبت به فناوریهای روز و قابلیت پیشبینی آینده را داشته باشد.
با توجه تعاریف انجام شده در مورد هر یک از این مفاهیم، میتوان به بررسی این مسئله در قالب یک مثال کاربردی پرداخت بهطوریکه ببینیم نقش هر یک از این افراد در فرایند توسعهٔ نرمافزار چیست و چه زمانی باید از هر یک از این نقشها در پروژه استفاده نمود. چهطور میتوان با استفاده یا عدم استفاده از چنین نیروهایی، هزینهها را کاهش داده و بهرهوری را افزایش داد؟
فرض کنید قصد تولید یک نرمافزار کوچک جهت محاسبهٔ ساعات کاری کارکنان یک شرکت چند نفری را داریم؛ از آنجا که مسئله و راهحل کاملاً مشخص است، بهنظر میرسد نیازی به مهندس نرمافزار نداشته باشیم. در ضمن، از آنجاییکه معماری یک چنین سیستمی کاملاً مشخص است و میتوان از نمونههای موفق دیگر در بازار استفاده کرد، پس قاعدتاً نیاز به معمار نرمافزار هم نخواهیم داشت و تنها با استفاده از ۱ یا ۲ برنامهنویس، میتوان پروژه را استارت زد.
با این تفاسیر، کاهش چشمگیری در هزینههای نیروی انسانی و بهطبعآن، کاهش در هزینههای جاری شرکت خواهیم داشت. اما اگر قصد داشته باشیم چند بخش از یک شرکت را در قالب یک اتوماسیون پیادهسازی کنیم و بهعنوانمثال نیازمند ساخت سیستم فروش، حسابداری و حقوقودستمزد آن شرکت باشیم، باتوجه به حجم کار بهنظر میرسد که یک یا چند مهندس نرمافزار بتوانند از عهدهٔ این مسئله برآیند. در چنین شرایطی، یک سری مسائل وجود دارد که یک مهندس نرمافزار بایستی باتوجه به شناختی که از نیروهای فنی خود (سایر برنامهنویسان) و نیازهای شرکت دارد، راهحل مناسب برای حل این مسئله را پیدا کند.
اما اگر فرض کنیم که کاری که قرار است انجام دهیم کمی پیچیدهتر از این مسائل باشد و نتوان از معماریهای موجود استفاده نمود، نیازمند یک معمار نرمافزار خواهیم بود؛ بهعنوانمثال، اگر قصد داشته باشیم تمامی سیستمهای یک شرکت را بهصورت الکترونیکی تبدیل کرده و درعینحال دادههای حاصل از رفتارهای مشتری را مورد بررسی قرار دهیم و باتوجه به نتایج آنها بتوانیم به مدیران ارشد پیشنهادهایی برای بهبود فرایندها و افزایش بهرهوری ارائه کنیم، حضور یک معمار نرمافزار که با استفاده از خلاقیت و هنر خود بتواند چنین سیستمی را طراحی نماید الزامی است.
کلام آخر
پس میتوان گفت باتوجه به حجم پروژهها، نوع خواستههای مشتری و همچنین نوع پروژهای که بایستی پیادهسازی شود، هر یک از این تخصصها میتوانند به کار گرفته شوند.
درعینحال، فراموش نکنیم که در محیطهای کسبوکار بسیاری از این مفاهیم و همچنین دیگر اصطلاحات -خواه به اشتباه و خواه بدون اشتباه- بهجای یکدیگر مورد استفاده قرار میگیرند و آنطور که در این مقاله گفته شد، تفاوت چندانی با یکدیگر ندارند.
نظر شما چیست؟ آیا تمایزی مابین برنامهنویس، مهندس نرمافزار و معمار نرمافزار واقعاً وجود دارد؟ نظرات و دیدگاههای خود را با ما و سایر کاربران سکان آکادمی به اشتراک بگذارید.