JavaRush /وبلاگ جاوا /Random-FA /مهندس نرم افزار کیست؟ مهندسی نرم افزار در مقابل برنامه نو...

مهندس نرم افزار کیست؟ مهندسی نرم افزار در مقابل برنامه نویسی "فقط".

در گروه منتشر شد
ما اقتباسی از مقاله ای از سامر بونا را در مورد تفاوت های بین مهندسی نرم افزار و برنامه نویسی، یا اینکه چگونه توسعه یک مفهوم نرم افزار با "فقط کدنویسی" متفاوت است، مورد توجه شما قرار می دهیم .
مهندس نرم افزار کیست؟  مهندسی نرم افزار در مقابل
همه مهندسان نرم افزار می توانند کدنویسی کنند، اما همه برنامه نویسان نمی توانند مفاهیم نرم افزار را توسعه دهند. برخی از افراد اصطلاح «مهندس نرم‌افزار» (معروف به مهندس نرم‌افزار) را نمی‌پسندند، زیرا اغلب وقتی در مورد چیزی فیزیکی‌تر صحبت می‌کنیم - مثلاً ساخت‌وساز، از کلمه «مهندس» استفاده می‌کنیم. مقاله ما، البته، در مورد خود این اصطلاح نیست. اگر به طور ناگهانی باعث طرد شما شود، به راحتی می توان آن را با چیزی که مربوط به خلاقیت است جایگزین کرد. «خالق نرم افزار»، «نویسنده نرم افزار»... یا حتی «خالق نرم افزار»!
وقتی در مورد "مهندس نرم افزار" صحبت می کنیم، منظور شخصی است که وظیفه اصلی او فقط نوشتن کد نیست، بلکه ایجاد یک برنامه با کیفیت است. و در این امر دعوت خود را می بیند و رویکردی علمی و روش های آماری را در کار خود به کار می گیرد. برای او برنامه نویسی فقط راهی برای کسب درآمد برای غذا نیست.
توانایی برنامه نویسی به طور خودکار یک فرد را مهندس نرم افزار نمی کند. هر کسی می تواند کدنویسی را یاد بگیرد، و این بسیار ساده تر از چیزی است که به نظر می رسد. هر کسی می تواند یک برنامه ساده برای استفاده خود ایجاد کند، اما این تضمین نمی کند که همان برنامه برای دیگران کار کند. مثال مورد علاقه من این است: بسیاری از ما زیر دوش می خوانیم، اما افسوس که این اجرا همیشه شایسته یک صحنه حرفه ای نیست. البته، برای یک تجربه موسیقی با کیفیت بالا، به احتمال زیاد به یک حرفه ای مراجعه خواهید کرد. آیا به مثال های بیشتری احتیاج دارید؟
  • همه ما ریاضیات و نوشتن را در مدرسه یاد می گیریم، اما این ما را ریاضیدان و نویسنده نمی کند.
  • بسیاری از ما قادر به تهیه یک غذای مقوی و گاه بسیار خوشمزه هستیم، اما هرکسی جرات نمی‌کند برای مهمانی شام سفارت یک میز 100 نفره بپزد. در این صورت یک آشپز استخدام می کنیم.
  • آیا در حال حاضر آماده اید که ساخت خانه جدید خود را به طور کامل به فرزند همسایه که شاهکارهای چشمگیری از لگو خلق می کند، بسپارید؟
نکته اصلی من که در این مقاله سعی دارم بیان کنم این است که برنامه های ساده با برنامه های طراحی شده توسط مهندسان بسیار متفاوت هستند. ساده ترین تعریف فرآیند برنامه نویسی: ترسیم دنباله ای از اقدامات منظم برای یک کامپیوتر به منظور بدست آوردن چیزی خاص به عنوان خروجی، با توجه به پارامترهای ورودی داده شده. فرآیند مهندسی نرم افزار طراحی، نوشتن، آزمایش و مدیریت یک برنامه کامپیوتری برای حل مشکلات بسیاری از کاربران است. این در مورد ایجاد راه حل های قابل اعتماد و ایمن است که در آزمون زمان مقاومت کرده و برای برخی از چالش های احتمالاً ناشناخته فراتر از بدیهیات کار می کند.
مهندس نرم افزار کیست؟  مهندسی نرم افزار در مقابل
مهندسان نرم افزار همه چیز را در مورد مشکلاتی که حل می کنند، راه حل هایی که پیشنهاد می کنند، محدودیت های آن راه حل ها، حریم خصوصی و امنیت آنها می دانند. به نظر من، اگر شخصی اصل مسئله را درک نکند، حتی نباید شروع به برنامه ریزی برای حل آن کند.

ذهنیت مهندسی - جستجو برای راه حل های کاربردی

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

"روشنفکران مشکلات را حل می کنند، نوابغ از آنها جلوگیری می کنند"

- آلبرت انیشتین

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

کیفیت برنامه و کیفیت کد

برنامه های خوب واضح و خوانا هستند. گسترش آنها آسان است، با برنامه های دیگر خوب بازی می کنند و کار با آنها کابوس نخواهد بود. کیفیت کد قابل مذاکره نیست. باید بالا باشد، همین. هنگام بررسی آن، بهانه‌هایی مانند خلق و خوی بد کدنویس یا ضرب‌الاجل‌های بسیار تنگ (اوه، آن مهلت‌ها!) غیرقابل قبول هستند. یکی از مهمترین جنبه های توسعه نرم افزار طراحی برنامه به گونه ای است که نگهداری و اصلاح آن در آینده آسان باشد (سلام OOP!). امروزه، تقریباً همه نرم افزارها قابل تغییر هستند، اغلب این فرآیند حتی بدون مشارکت کاربر انجام می شود یا به غیر از "برنامه شما به روز شده است، روی OK یا به تعویق انداختن" چیزی از کاربر نیاز ندارد. البته، کاربران این حق را دارند که از برنامه‌ها ویژگی‌های جدیدی را مطالبه کنند (مخصوصاً اگر در مورد نرم‌افزارهای سازمانی طولانی مدت که به زبان جاوا نوشته شده‌اند یا بازی‌های آنلاینی صحبت می‌کنیم که می‌توان برای سال‌ها بازی کرد).
آیا می خواهید در مورد برنامه نویسی جاوا بیشتر بدانید؟ به گروه توسعه دهندگان جاوا بپیوندید !
یک قطعه کد به خودی خود به سختی می تواند مفید باشد. عملکرد مفید نرم افزار از جایی شروع می شود که بخش های متفاوت برنامه ها با یکدیگر ارتباط برقرار می کنند، داده ها را مبادله می کنند و با هم کار می کنند تا وظیفه ارائه داده ها و رابط ها را به کاربران انجام دهند.
مهندس نرم افزار کیست؟  مهندسی نرم افزار در مقابل
برنامه ها باید با در نظر گرفتن این نکات طراحی شوند! چه پیام هایی دریافت می کنند؟ چه رویدادهایی رصد می شوند؟ احراز هویت و مجوز چگونه اتفاق می افتد؟ یکی دیگر از نشانه های به همان اندازه مهم یک برنامه خوب، وضوح کد است، نه تعداد تست هایی که برنامه گذرانده است یا حتی پوشش تست خوب. سوالات به ظاهر ساده: "آیا کسی غیر از من می تواند کد من را بفهمد؟"، "آیا من می توانم امروز این کد را بنویسم و ​​چند هفته دیگر آن را بفهمم؟" یک نقل قول محبوب در مورد دو سخت ترین چیز در برنامه نویسی می گوید:

"فقط دو چیز واقعا سخت وجود دارد: نامعتبر کردن حافظه پنهان و نامگذاری موجودیت"

- فیل کارلتون.

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

"من آن را کوتاه تر می نوشتم، اما وقت نداشتم."

- مارک تواین

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

محیط و آزمایش

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

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

یک مهندس نرم افزار در اکثر موارد می تواند مشکل را به سرعت حل کند. اگر فکر می کنید استخدام یک برنامه نویس با تجربه «گران قیمت» هزینه های شما را افزایش می دهد، دوباره فکر کنید. هر چه برنامه نویس استخدام شده باتجربه تر باشد، سریعتر می تواند راه حلی ساده، منظم، قابل اعتماد و با کاربری آسان ارائه دهد. این امر در دراز مدت قطعاً هزینه های توسعه نرم افزار را کاهش می دهد.
مهندس نرم افزار کیست؟  مهندسی نرم افزار در مقابل
در نظر گرفتن هزینه های اجرای برنامه نیز ضروری است. هر برنامه ای از منابع محاسباتی استفاده می کند و رایگان نیستند.
کار یک مهندس نرم افزار نوشتن کد کارآمد است که از منابع محاسباتی بی مورد استفاده نمی کند.
به عنوان مثال، کش کردن داده هایی که به طور مکرر در دسترس هستند یکی از راهبردهای ممکن برای دستیابی به نتیجه مطلوب است. اما این تنها یکی از صدها ابزار و راه حلی است که می تواند یک برنامه را سریعتر و کارآمدتر کند. ممکن است یک برنامه نویس مبتدی راه حل ارزانی به شما ارائه دهد، اما استفاده از چنین راه حلی در نهایت برای شما و مشتریانتان هزینه بسیار بیشتری نسبت به زمانی که با یک توسعه دهنده با تجربه کار می کردید که در وهله اول یک راه حل موثر ایجاد کرده بود، خواهد داشت.

روی تجربه کاربری تمرکز کنید

یک برنامه نویس خوب با در نظر گرفتن تجربه کاربری (UX) توسعه می یابد. تعامل انسان و ماشین موضوعی با تحقیقات و راه حل های بی پایان است. هرچه راه حل های بیشتری اعمال شود، برنامه بهتر خواهد بود. در اینجا چند نمونه آورده شده است، فقط برای اینکه به شما احساس کنید که این جهت چیست:
  • هنگام طراحی فرم های ورود اطلاعات مانند ایمیل، یک برنامه خوب باید مورد آدرس ایمیل را نادیده بگیرد. اگر کلید CAPSLOCK فشار داده شود نباید خطا ایجاد کند زیرا آدرس ایمیل با حروف کوچک منحصر به فرد است. اگر برنامه یک آدرس ایمیل جدید را به عنوان ورودی می پذیرد، در ابتدای فرآیند ورودی آن را بررسی کنید تا به کاربر هشدار دهد که از فرمت آدرس اشتباه استفاده می کند. این راه حل شامل چک های واضحی مانند علامت «@» گم شده و همچنین موارد نه چندان واضح، مانند بررسی ترتیب اشتباه کاراکترهایی مانند «gmail.ocm» است.

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

    فرض کنید در حال جستجوی سفر هوایی به عنوان مهمان در Expedia هستید. بعداً تصمیم می گیرید یک حساب کاربری ایجاد کنید. برنامه باید تمام جستجوهای قبلی شما را در حساب جدید ذخیره کند و شما باید بتوانید از دستگاه های دیگر به آنها دسترسی داشته باشید.


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

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

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

به نظر من، مهم ترین تفاوت بین یک توسعه دهنده نرم افزار حرفه ای و یک آماتور، در نظر گرفتن پارامترهایی مانند قابلیت اطمینان، امنیت و ایمنی برنامه در هنگام ایجاد آن است.
یک متخصص واقعی می داند که مسئولیت ایمنی و امنیت راه حل خود را بر عهده دارد.
بخش‌هایی از برنامه باید نسبت به ورودی‌های نادرست، حالت‌های نادرست و تعاملات نادرست مدارا داشته باشند. اجرای این در واقع بسیار دشوار است و دلیل اصلی این است که ما داستان هایی از مرگ افراد به دلیل اشکالات نرم افزاری را می شنویم. کاربران داده های نادرست را وارد برنامه کرده اند، وارد می کنند و به وارد کردن آنها ادامه خواهند داد. این را باید به عنوان یک واقعیت پذیرفت. علاوه بر این، برخی از عمد با هدف شکستن برنامه و دستیابی به منابع موجود این کار را انجام می دهند.
مهندس نرم افزار کیست؟  مهندسی نرم افزار در مقابل
در اینجا یک مثال واقعی آورده شده است: فردی که گفته می شود مسئول نقض اخیر داده های Equifax است متهم به شکست در مسئولیت های شغلی خود است، که عبارت بود از ایجاد راه حل هایی برای مقاومت در برابر ورودی های بد و مخرب در همه محصولات نرم افزاری که در دسترس عموم قرار می گیرد. حوادث مربوط به امنیت اطلاعات نه تنها شامل ورودی های نادرست و مخرب، بلکه داده های وارد شده نادرست نیز می شود. اگر کاربر رمز عبور خود را فراموش کرده باشد، چند بار می تواند آن را وارد کند؟ آیا بعد از این او را بلاک خواهید کرد؟ اگر شخص دیگری بخواهد حساب کاربری او را مسدود کند چه؟ آیا کاربر می تواند اعتبار خود را از طریق یک کانال داده رمزگذاری نشده ارسال کند؟ اگر درخواست ورود از یک مکان غیرعادی باشد چه؟ اگر تلاش برای ورود به سیستم خودکار به نظر برسد، چه خواهید کرد؟ برای محافظت از کاربران خود در برابر اسکریپت بین سایتی، جعل درخواست های متقابل سایت و فیشینگ رایج چه کرده اید؟ آیا در صورت حمله DDoS به سرورهای خود یک استراتژی پشتیبان دارید؟ این سوالات فقط برخی از مسائلی را که باید در نظر گرفته شوند برجسته می کند. برنامه محافظت شده اطلاعات مهم را در قالب متن ذخیره نمی کند. آن را با یک رمز یک طرفه پیچیده محافظت می کند (رمز رمزگذاری آسان اما رمزگشایی بدون کلید تقریبا غیرممکن است). این اقدامات پشتیبان گیری در صورت هک شدن برنامه است. هکرها داده های رمزگذاری شده ای را کشف می کنند که برای آنها بی فایده است. مشکلات غیرمنتظره حتی در بهترین برنامه ها نیز به وجود می آید. به سختی می توان برنامه نویسی را که برای وقوع آنها آماده نیست حرفه ای نامید. تا زمانی که انتظار رفتار غیرمنتظره ای نداشته باشد، مهندس نیست. او "نویسنده برنامه های ناامن" است. خطاها در برنامه ها همیشه آشکار نیستند. توانایی فکری ما برای پیش بینی و جلوگیری از خطاهای شناخته شده محدود است. به همین دلیل است که مهندسان نرم افزار اهمیت ابزارهای خوب را درک می کنند تا آنها را قادر به نوشتن نرم افزار صحیح و ایمن کنند.

ابزارهای مورد نیاز

شکی نیست که ما به ابزارهای توسعه متفاوت و خوب نیاز داریم. نقش آنها اغلب دست کم گرفته می شود، اما در واقع آنها در زمان و تلاش زیادی صرفه جویی می کنند و برخی از کارها را با یک مرتبه بزرگی ساده می کنند. تصور کنید که هنوز مجبور به آپلود فایل ها از طریق FTP برای استقرار، به اصطلاح، به روش قدیمی هستید. اشکال زدایی شبکه و مشکلات عملکرد را بدون Chrome DevTools تصور کنید! و این روزها نوشتن کد جاوا اسکریپت بدون ESlit و Prettier چقدر ناکارآمد خواهد بود!
مهندس نرم افزار کیست؟  مهندسی نرم افزار در مقابل
هر ابزاری که زمان بازخورد را هنگام نوشتن کد کاهش دهد باید مورد استقبال قرار گیرد. وقتی ابزاری پیدا می‌کنم که قبلاً برایم ناآشنا بود، اما واقعاً مفید و مؤثر است، فقط می‌توانم افسوس بخورم که قبل از این لحظه شاد از آن استفاده نکردم.
ابزارهای بهتر و مدرن تر به شما کمک می کنند تا برنامه نویس بهتری شوید. آنها را پیدا کنید، از آنها استفاده کنید، از آنها قدردانی کنید و اگر می توانید آنها را بهبود ببخشید. و به همین موضوع معطل نشوید: چه کسی می‌داند، شاید با یک ابزار جدید یک بار زمان صرف نصب و یادگیری کنید، و سپس چندین برابر سریع‌تر مشکلات را حل کنید؟

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

هیچ کس نمی تواند مهندسی نرم افزار را در دو ماه، شش ماه یا حتی یک سال یاد بگیرد. در یک دوره، دانشگاه، یا بوت کمپ به شما آموزش داده نخواهد شد که چگونه مهندس نرم افزار باشید. من بیش از بیست سال گذشته درس می خواندم و الان هم ادامه می دهم. تنها پس از یک دهه یادگیری و توسعه، ایجاد و نگهداری برنامه های کاربردی مورد استفاده توسط هزاران کاربر، به راحتی توانستم خود را یک برنامه نویس با تجربه بنامم. مهندسی نرم افزار برای همه نیست، اما همه باید یاد بگیرند که مشکلات خود را با استفاده از کامپیوتر حل کنند. اگر می توانید نوشتن برنامه های ساده را یاد بگیرید، باید. اگر می توانید استفاده از نرم افزارهای در دسترس عموم را یاد بگیرید، باید. اگر بتوانید استفاده از نرم افزار متن باز را یاد بگیرید و آن را برای خود شخصی سازی کنید، یک قدرت فوق العاده دارید! هر روز برای توسعه دهندگان چالش های جدید، مشکلات جدید به ارمغان می آورد، به همین دلیل است که مهندسی نرم افزار مورد نیاز است. وظیفه اصلی این حرفه ایجاد نرم افزاری است که یک فرد عادی مجبور نباشد سال ها با آن سر و کار داشته باشد. به طوری که نیازی به مطالعات طولانی برای تعامل با برنامه ها نباشد. با این حال، مهندسان نرم‌افزار دائماً به ایجاد ابزارهای بهتری فکر می‌کنند که می‌تواند مشکلات پیچیده‌تر شناخته‌شده را حل کند و هر کاری ممکن است انجام می‌دهد تا اطمینان حاصل شود که مشکلات جدید تا حد امکان به ندرت ظاهر می‌شوند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION