הנדסת תוכנה – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
דומני שכך קולח יותר
מ ברור שהנדסת תוכנה - כמו מקצועות הנדסה רבים אחרים - מתבססת גם על אומנות. המחלוקת היא בקשר לסיווגה כאמנות
שורה 6:
הנדסת תוכנה החלה להתגבש כתחום ייחודי ב[[שנות ה-60 של המאה ה-20|שנות ה-60]] המאוחרות, על רקע [[משבר התוכנה]]. עד אותה עת נחשבה הנדסת התוכנה לענף משני של [[מדעי המחשב]]. כנס ראשון להנדסת תוכנה נערך בשנת [[1968]] על ידי ועדת המדע של [[נאט"ו]],{{הערה|שם=Naur69}} וציין את תחילת דרכו של הענף כתחום נפרד ועצמאי. עם החלוצים בתחום נמנים [[פרד ברוקס]], [[בארי בם]], [[טוני הור]] ו[[דייוויד פרנס]]. גרסה ראשונה של [[SWEBOK|גוף הידע הרשמי של המקצוע]] הושלמה בשנת [[1999]], ובאותה השנה הוענק ל[[פרד ברוקס]] [[פרס טיורינג]] על "תרומותיו פורצות הדרך בהנדסת מחשבים, מערכות הפעלה והנדסת תוכנה",{{הערה|שם=ACM99}} ושני האירועים נחשבים לאבני דרך חשובות בהתפתחות הענף. ב[[ארצות הברית]], מסלול לימודים אקדמי להנדסת תוכנה ([[בוגר אוניברסיטה|BSc]]) נפתח לראשונה בשנת [[1996]], ומסלול דומה מוצע גם ב[[ישראל]]. עם זאת, נכון לשנת [[2006]], לרוב העוסקים בתחום יש הכשרה אקדמית במדעי המחשב ולא בהנדסת תוכנה.{{הערה|שם=ACM06}}
 
יסודותיה התאורטיים של הנדסת התוכנה לקוחים מ[[מדעי המחשב]], ובצד המעשי היא חולקת עקרונות ושיטות עם [[הנדסת מחשבים]], [[הנדסת מערכות]], [[הבטחת איכות]], [[הנדסת אנוש]] ו[[ניהול פרויקטים]]. בפתח [[המאה ה-21]], ובניגוד חד לרבות מדיסציפלנות ההנדסה האחרות, שיטותיה של הנדסת התוכנה אינן מבטיחות כי תוצריה יהיו עקביים, אמינים או שימושיים.{{הערה|שם=ACM00}} יתר על כן, שיטותיה אינן אחידות, אינן מוסְדרות, ורובן המכריע מבוסס על [[כלל אצבע|כללי אצבע]] ונעדר תשתית מתמטית איתנה. בשל כך, ובשל היבטים נוספים של הנדסת תוכנה, שאלת סיווגה כענף של ה[[הנדסה]], ה[[מדע]] או ה[[אומנות (מלאכה)|אומנותאמנות]] תלויה ועומדת, וכן שוררת אי-הסכמה באשר לנכונותן או נחיצותן של רבות מה[[פרדיגמה|פרדיגמות]] והשיטות המשמשות בה.
 
==הגדרה של הנדסת תוכנה==
שורה 13:
* כינוי בן־זמננו למגוון הפעילויות שבעבר נודעו כ[[תכנות]] ו[[ניתוח מערכות]].
* מונח רחב המתאר את כל ההיבטים המעשיים של תכנות מחשבים. זאת, בניגוד לתאוריה של תכנות מחשבים הידועה גם כ[[מדעי המחשב]].
* מונח המגלם גישה מסוימת לתכנות מחשבים, דהיינו, התייחסות לתכנות מחשבים כמקצוע [[הנדסה|הנדסי]] ולא כ[[אומנות (מלאכה)|אומנות]] או [[אומנות (תרבות)|אמנות]].
* לפי תקן [[IEEE]] 610.12, הנדסת תוכנה היא "(1) יישום של גישה שיטתית, מבוקרת ומדידה לפיתוח, תפעול ותחזוקה של תוכנה, כלומר, החלה של הנדסה על תוכנה; (2) לימוד הגישות השונות ל־(1)".{{הערה|שם=IEEE90}}
 
שורה 23:
 
===הנדסה, מדע או אמנות?===
קיימת מחלוקת ארוכת שנים בשאלת סיווגה של הנדסת תוכנה כענף של ה[[הנדסה]], ה[[מדע]] או האומנותהאמנות. במידה רבה, המחלוקת נובעת מגילו הצעיר של המקצוע ומחוסר הגיבוש של השיטות המשמשות בו.
* יש המסווגים את פיתוח התוכנה כענף מובהק של ה[[הנדסה]]. המצדדים בגישה זו מצביעים על השיטות המשותפות לדיסציפלינות אלה, כגון איסוף וניהול [[דרישה (הנדסה)|דרישות]], [[הבטחת איכות]] ו[[ניהול פרויקטים]]. מאידך, המצדדים בגישה זו נוטים להמעיט בחשיבותו של המרכיב הייצורי והפיזי של הנדסה, שאינו קיים כלל בהנדסת תוכנה. אחרים טוענים שייתכן והנדסת תוכנה אינה דיסצפלינה הנדסית, אך עליה להיות כזו.{{הערה|1=McConnell, Steve (2003). '''Professional Software Development: Shorter Schedules, Better Projects, Superior Products, Enhanced Careers''', Addison-Wesley, {{ISBN|0-321-19367-9}}. p. 39: "In my opinion, the answer to that question is clear: Professional software development should be engineering. Is it? No. But should it be? Unquestionably, yes. "}} מנגד, עמדתו של ה-[[ACM]] היא שהנדסת התוכנה אינה בשלה דיה כדי להחשב דיסצפלינה הנדסית, מכיוון שלא ניתן להבטיח שתוצריה יהיו עקביים, אמינים או שימושיים. לרוב, הגישה הנאיבית להנדסת תוכנה מבלבלת בין התוצר ההנדסי לפיתוחו, ומבקשת לייחס את איכות התוצר ההנדסי לתהליכי הפיתוח של התוכנה. דהיינו, כשם שהתוצר ההנדסי (לדוגמה [[מטוס]]) עומד בקריטריונים מחמירים של יעילות, עמידות ודיוק, כך גם תהליכי פיתוח התוכנה עצמם חייבים לעמוד בקריטריונים דומים. גישה זו מיושמת במתודולוגיית פיתוח התוכנה [[מודל מפל המים|מודל מפל־המים]] המורה על פיתוח תוכנה בתהליך קווי, חד־כיווני הדומה ל[[פס ייצור|פס־ייצור]] של מוצר הנדסי.
* יש המסווגים את פיתוח התוכנה כענף מדעי־מתמטי. ואכן, כל מערכות התוכנה מבוססות על יסודות [[אלגוריתם|אלגוריתמיים]], וחלקן משתמשות בנוסף בענפים שונים של ה[[מתמטיקה שימושית|מתמטיקה השימושית]]. בתהליך פיתוח התוכנה משמשות לעיתים שיטות מתמטיות מתחום [[מדעי המחשב]], כגון יעילות אלגוריתמים, מודלים של חישוב ושיטות ל[[אימות תוכנה]]. אף על פי כן, הנדסת תוכנה אינה ענף של המתמטיקה, וידע מתמטי עמוק אינו מבטיח כלל ועיקר את איכות התוכנה. אדרבא, השיטות הפורמליות הקיימות משמשות ל[[אימות תוכנה]] ולא לתכנונה. זאת ועוד, שיטות האימות הקיימות אינן מסוגלות להתמודד עם המורכבות וסדרי הגודל של מערכות התוכנה המודרניות, ובנוסף מוגבלות בשל חסמים תאורטיים מובנים (ראו גם [[בעיית העצירה]]). יש לזכור כי חלקים מהותיים בתהליך פיתוח התוכנה הם עיצוביים באופיים{{הערה|1=W.R. Reitman (1964). '''Heuristics Decision Procedures, Open Constraints, and the Structure of Ill-Defined Problems'''}} ומתבססים על איסוף וארגון מידע שאינו פורמלי או מוגדר־היטב,{{הערה|1=V. Goel (1995). '''Sketches of Thought''', The MIT Press, Cambridge MA}} ופירוש והמרת אלה ל[[שפת מחשב]] כלשהי.