مهندسی نرم‌افزار با برنامه‌نویسی فرق دارد
ایمان مدائنی

به نظر ما مهندس نرم‌افزار کسی است که به دنبال نوشتن کیفیت نرم‌افزار در حرفه خود است. فردی که علم و آمار را به این حرفه اعمال می‌کند و به نظر نمی‌رسد شغلی باشد که فقط برای کسب درآمد است.

دانستن شیوه‌های برنامه‌نویسی شما را مهندس نرم‌افزار نمی‌کند.

هر کسی می‌تواند برنامه‌نویسی را به آسانی یاد بگیرد. هر کسی می‌تواند برنامه ساده‌ای را ایجاد کند که در سیستمش کار می‌کند اما تضمینی وجود ندارد که همان برنامه‌ها برای دیگران کار کند.

مقایسه ساده‌ای که در این رابطه می‌توان انجام داد این است که هرکسی می‌تواند زیر دوش آواز بخواند و خود را سرگرم کند، اما در مهمانی نمی‌تواند با صدای بلند شروع به آواز خواندن کند.

تحلیل بیشتری می‌خواهید؟ حتما:

ما ریاضی و نوشتن را در مدرسه یاد می‌گیریم، اما این عوامل از ما ریاضی‌دان یا نویسنده نمی‌سازد.

بسیاری از ما به راحتی می‌توانیم آشپزی را یاد بگیریم، اما آیا می‌توانیم به عنوان یک آشپز برای تعداد زیادی از مردم غذا درست کنیم.

شما از خدمتکار همسایه خود دعوت نمی‌کنید که بیاید و برایتان یک خانه بسازد.

پیام اصلی که می‌خواهیم در این مقاله به اشتراک بگذاریم این است که برنامه‌های ساده بسیار متفاوت از برنامه‌های مهندسی هستند.

کار برنامه‌نویسی، در ساده‌ترین تعریف، دادن دستورالعمل‌های کامپیوتری با دادن یک سری ورودی و دریافت و تولید خروجی برای انجام کاری است.

کار مهندسی نرم‌افزار، در مورد طراحی، نوشتن، تست و نگهداری برنامه‌های کامپیوتری با هدف حل مسائل برای بسیاری از کاربران است. این کار در مورد ایجاد راه‌حل‌های قدرتمند و ایمن است که با تست زمان مواجه خواهد شد و برای برخی مسائل ناشناخته پیرامون به طور قابل توجهی کار خواهد کرد.

مهندسان نرم‌افزار همه چیز را در مورد مسائلی که حل می‌کنند، راه‌حل هایی که ارائه ‌می‌دهند، محدودیت‌های این راه‌حل‌ها، مفاهیم پنهان آن‌ها و پیامدهای امنیتی آن‌ها درک می‌کنند.

اگر کسی این مسائل را درک نکرد، نباید اجازه داده شود تا راه‌حلی را برای آن ارائه دهد.

راه حل فکری

مهندسان نرم‌افزار فکر نمی‌کنند که حرفه آن‌ها فقط نوشتن برنامه است. آن‌ها به رفع نیازها و حل مسائل فکر می‌کنند. این مهم است چرا که هر مسأله‌ای نیاز به نوشتن برنامه‌ ندارد. برخی مسائل را می‌توان با برنامه‌های موجود یا با کنار هم گذاشتن برنامه‌های متعدد حل کرد. با انجام اقدامات اولیه، از برخی مشکلات می‌توان به طور کامل جلوگیری کرد. برنامه‌های خوب طراحی شده اغلب شامل برنامه‌ریزی برای جلوگیری از مشکلات آتی هستند.

"خردمندان مشکلات را حل می‌کنند، نابغه‌ها از آن‌ها جلوگیری می‌کنند."  ‘آلبرت انیشتین’

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

قبل از نوشتن برنامه، مهندس نرم‌افزار سؤالاتی را مطرح می‌کند:

مسائلی که من سعی می‌کنم آن‌ها را حل کنم چه هستند؟

به جز نوشتن کد چه کاری می توان برای حل آن‌ها انجام داد؟

چه کاری می‌توانم انجام دهم تا این مسائل را به راحتی با کد حل کنم؟

کیفیت کد

برنامه‌های بزرگ تمیز و قابل خواندن هستند، می‌توانند به راحتی توسعه یابند، با برنامه‌های دیگر به خوبی کار می‌کنند، و نگهداری از آن‌ها کابوس نیست. کیفیت کد چیز قابل مذاکره‌ای نیست، وقتی در کدنویسی عجله دارید، استفاده از کلیدهای میانبر نامرتب هرگز قابل قبول نیستند.

یکی از مهم‌ترین جنبه‌های مهندسی نرم‌افزار، طراحی هر چیزی برای توسعه است. تغییر نرم‌افزار واقعیت زندگی است. کاربران ویژگی‌های بیشتر و راه‌های ساده‌تر برای استفاده از نرم‌افزار را تقاضا خواهند کرد.

یک قطعه نرم افزاری معمولا به تنهایی مفید نیست. ویژگی‌های سودمند نرم‌افزار زمانی شروع می‌شود که چندین قطعه از نرم‌افزار با یکدیگر ارتباط برقرار می‌کنند، داده‌ها را مبادله می‌کنند، و روی وظایف مربوط به ارائه داده‌ها و رابط‌های کاربران با هم کار می‌کنند.

برنامه‌ها باید در ذهن طراحی شوند. چه پیام‌هایی را قبول می‌کنند؟ چه رویدادهایی تحت نظارت هستند؟ چه پیام‌هایی منتشر می‌شوند؟ چگونه می‌توانیم ارتباطات را تأیید کرده و به آن‌ها مجوز دهیم؟

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

"در علوم کامپیوتر تنها دو چیز سخت وجود دارد: نامعتبرسازی کش و نامگذاری چیزها." ‘فیل کارلتون’

موضوع قابلیت خواندن کد بسیار بیشتر از آن چیزی است که فکرش را می‌کنید. متأسفانه معیارهای خوبی برای وضوح کد وجود ندارد. حفظ عملکردها و الگوهای نرم‌افزاری خوب می‌تواند کمک کند اما اغلب کافی نیست. مهندسان نرم‌افزار خوب کد تمیز با تجربه و شهود ایجاد می‌کنند.

"من زمانی برای نوشتن یک نامه کوتاه نداشتم، بنابراین به جای آن یک متن طولانی نوشتم." ‘مارک تواین’

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

محیط و تست

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

مثلا وقتی نرم‌افزاری برای مرورگر وب ایجاد می‌شود، باید روی تمام مرورگرهای بزرگ مختلف کار کند. هنگام ایجاد نرم‌افزار دسکتاپ، در اکثر موارد باید برای کاربران مک و ویندوز کار کند. هنگام ایجاد برنامه‌هایی که به داده‌ها بستگی دارند، نرم‌افزار باید در مواردی که اتصال برای بازیابی داده کند است یا برای مدتی کلا خاموش شده است، کار کند.

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

مهندسان نرم‌افزار نیازهای نرم‌افزاری را که معمولا مبهم و ناقص هستند درک می‌کنند. مهارت منحصربه‌فرد یک مهندس نرم‌افزار بااستعداد نحوه نوشتن راه‌حل نیست بلکه شناسایی آنچه باید در راه‌حل باشد است.

هزینه و کارایی

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

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

یک برنامه‌نویس مبتدی ممکن است یک راه‌حل ارزان قیمتی را به شما بدهد، اما راه‌اندازی این راه‌حل ممکن است هزینه‌های شما و مشتریان‌تان را بسیار بیشتر کند، مگر اینکه یک برنامه‌نویس باتجربه داشته باشید که راه‌حل مؤثری را در اولین وهله ایجاد کند.

قابلیت استفاده

برنامه‌های خوب با در نظر گرفتن تجربه‌های کاربری (UX) در نظر گرفته می‌شوند. تعامل انسان و کامپیوتر یک موضوع بزرگ با یافته‌ها و مطالعات تحقیقاتی بی‌شماری است. بیشتر این یافته‌ها پذیرفته شده‌اند. اجازه دهید چند مثال بیاوریم تا آن را بهتر درک کنید:

1. هنگام طراحی فرم‌های ورودی که انتظار می‌رود کاربران داده ها را وارد کنند، مثل آدرس ایمیل‌شان، یک برنامه گیرنده خوب از حروف کوچک و بزرگ چشم‌پوشی می‌کند. همچنین فضای اضافی اطراف آن را از بین می‌برد. وقتی کلید CAPSLOCK کاربر روشن است، کاربر به سختی کار نمی‌کند، ایمیل در فرمت حروف کوچک خود منحصربه‌فرد است. چنانچه برنامه آدرس‌های جدید ایمیل را بپذیرد، اعتبارسنجی صورت گرفته و پیغام واضحی به کاربر نشان داده می‌شود که ممکن است از آدرس اشتباهی استفاده کرده باشد. این موارد شامل مشکلات اساسی اعتبارسنجی، مثل عدم داشتن علامت @ است. اما همچنین باید شامل مشکلات اعتبارسنجی نه چندان جدی مثل استفاده از “gmail.com” هم باشد.

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

3.یک برنامه خوب با درنظر گرفتن سناریوهای کاربر طراحی شده است. خودتان را جای کاربرتان بگذارید. فقط ویژگی‌ها را اضافه نکنید! مثلا پروازی را رزرو کرده‌ایم که شامل شماره پرواز است. پس از تأییدیه به وب‌سایت مورد نظر رفته‌ایم تا #FF را به پرواز اضافه کنیم و ده دقیقه طول می‌کشد تا بتوانیم آن را پیدا کنیم. مسیر مشخصی وجود نداشت. بنابراین ما مجبور شدیم تمام لینک‌هایی که به این ویژگی مربوط می‌شد را بررسی کنیم. ما از صفحه‌ای که در این ویژگی وجود داشت بازدید کردیم اما اولین بار نتوانستیم آن را ببینیم، زیرا عمیقا در فرم بزرگی که وجود داشت گم شده بود. ما مجبور بودیم اطلاعات سفر را تغییر دهیم. تقریبا 20 ورودی قبلی از فرم را اسکرول کردیم، نوع #FF ای که می‌خواستیم اضافه کنیم و همچنین شماره تلفن مورد نیاز را برای ارسال کل فرم وارد کردیم. این نمونه‌ای از یک برنامه است که از نقطه نظر کاربر با فکر طراحی نشده است.

قابلیت اطمینان، امنیت و ایمنی

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

کاربرانی هستند که می‌خواهند از نرم‌افزار با ورودی بد یا اشتباه استفاده کنند. بعضی‌ها عمدا سعی می‌کنند نرم‌افزار را دچار مشکل سازند تا بتوانند منابع را هک کنند.

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

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

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

این یک استراتژی پشتیبان برای برنامه و داده‌ها است. هکرها در صورت هک به داده‌های رمزنگاری شده دسترسی پیدا می‌کنند که عمدتا برای آن‌ها بی‌فایده است.

یک نرم‌افزار به سمت حالت‌های بدی خواهد رفت و باید اصلاح شود. مشکلات غیرمنتظره برای بهترین نرم‌افزارها رخ خواهد داد. اگر از آن آگاه نباشید و برای آن برنامه‌ریزی نکنید، پس شما یک حرفه‌ای در نرم‌افزار نیستید. شما فقط برنامه‌های ناامن را می‌نویسید.

نقص‌های نرم‌افزاری نامرئی هستند. توانایی فکری ما و پیش‌بینی و پیش‌گیری از این نقص‌ها محدود هستند. به همین دلیل مهندسان نرم‌افزار ارزش ابزارهای خوب را درک می‌کنند که می‌تواند به آن‌ها کمک کند نرم‌افزار امن و مطمئنی را بنویسند.

در بر گرفتن ابزار

شکی نیست که ما نیاز به ابزارهای بیشتر و بهتری داریم. ابزارها تفاوت بزرگی را ایجاد می‌کنند  و اغلب باید از آن‌ها قدردانی کرد. تصور کنید اگر هنوز مجبور بودیم از فایل‌های FTP استفاده کنیم! تصور کنید دیباگ کردن شبکه و مشکلات عملکردی بدون DevTools انجام می‌شد! نوشتن جاوااسکریپت بدون ESLint و Prettier را تصور کنید!

اگر شما توسعه‌دهنده جاوااسکریپت هستید و بنا به دلایلی مجبور هستید تنها یک پلاگین را برای برنامه ویرایشگر خود انتخاب کنید، باید ESLint را انتخاب کنید.

هر ابزاری که در هنگام نوشتن کد، حلقه بازخورد را کوتاه می‌کند، باید مورد استقبال قرار گیرد. درک و بهبود ابزار یکی از راه‌های مؤثر در آینده‌ای روشن است.

وقتی ابزار جدیدی پیدا می‌کنیم، تأسف می‌خوریم که چرا پیش از این از آن استفاده نکرده‌ایم. ابزار بهتر به شما کمک خواهد کرد که برنامه‌نویس بهتری باشید. آن‌ها را پیدا کنید، از آن‌ها استفاده کنید، از آن‌ها قدردانی کنید و اگر می‌توانید آ‌ن‌ها را بهبود بخشید.

انتخاب زبان مهم است. نوع ایمنی مهم است. مورد بهتری که برای جاوااسکریپت رخ داده است، تایپ‌اسکریپت (و Flow) است. تحلیل استاتیک کد مسأله‌ای بزرگ‌تر از آن چیزی است که شما فکر می‌کنید. اگر این کار را انجام ندهید اساسا خودتان را برای آینده‌ای ناشناخته آسیب‌پذیر ساخته‌اید. بدون سیستم static typing کد نزنید. اگر زبان انتخابی شما static typing ندارد، یا زبان‌تان را عوض کنید یا یک transpiler برای آن پیدا کنید. امروزه transpilerها به اندازه کافی هوشمند شده‌اند که فقط با خواندن دستورات در کد کار می‌کنند.

تکامل مهندسی نرم‌افزار

هیچ کس نمی‌تواند مهندسی نرم‌افزار را در دو ماه، شش ماه یا حتی یک سال یاد بگیرد. شما مهندسی نرم‌افزار را در آموزشگاه یاد نمی‌گیرید. خود ما در طی بیش از 20 سال گذشته آن را آموخته‌ایم و هنوز در حال یادگیری هستیم.

مهندسی نرم‌افزار برای هر کس نیست، اما هر کسی باید یاد بگیرد که چگونه مشکلات کامپیوتری خود را حل کند. اگر می‌توانید نوشتن یک برنامه ساده را یاد بگیرید باید این کار را انجام دهید. اگر می‌توانید استفاده از خدمات نرم‌افزاری عمومی را یاد بگیرید باید این کار را انجام دهید. اگر بتوانید استفاده از نرم‌افزارهای open-source را یاد بگیرید، قدرت بزرگی را به دست خواهید آورد.

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

نظرات کاربران در رابطه با این دوره

جهت ثبت نظر باید در سایت عضو شوید و یا وارد سایت شده باشید .
logo-samandehi