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