Бағдарламалық құрылымның күрделігі және қолдауға қабілеттілігі
Programming complexity
Бағдарламалық құрылымның күрделігі: бағдарлама ішіндегі өзара әрекеттесулер. "Күрделі" мен "қиын" ұғымдарының айырмасы, өзара байланыстардың өсуі жайлы.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Кіріспе
Бағдарламалау күрделілігі (немесе бағдарламалық жасақтаманың күрделілігі) – ішкі өзара әрекеттесулерге әсер ететін бағдарламалық жасақтаманың қасиеттерін қамтитын термин. Көптеген сарапшылар «күрделі» және «қиын» терминдерін ажыратады. «Қиын» дегеніміз – түсінуге қиын, бірақ соңында білуге болады. Ал «күрделі» – нысандар арасындағы өзара әрекеттесуді сипаттайды. Нысандар саны артқан сайын, олардың арасындағы өзара әрекеттесулер саны экспоненциалды түрде өседі, осылайша олардың барлығын білу және түсіну мүмкін болмайды. Сол сияқты, бағдарламалық жасақтаманың күрделілігі жоғарылағанда, өзара әрекеттесулерге бейсымды түрде кедергі келтіру қаупі артады, демек бағдарламалық жасақтаманы өзгерту кезінде қателер енгізу мүмкіндігі де артады. Ең нашар жағдайларда, бағдарламалық жасақтаманы өзгерту тіпті мүмкін болмайды. Бағдарламалық жасақтаманың күрделілігін бағдарламалық жасақтаманы қолдану мүмкіндігімен байланыстыру идеясын профессор Мэнни Леман өз бағдарламалық жасақтама эволюциясының заңдарын жасап, кеңінен зерттеді. Ол және оның әріптесі Лес Белэди бағдарламалық жасақтаманың күйін өлшеуге қолданылатын көптеген бағдарламалық жасақтама өлшемдерін зерттеді, соңында ең тиімді шешім – детерминистік күрделілік модельдерін пайдалану деген қорытындыға келді.
Programming complexity (or software complexity) is a term that includes software properties that affect internal interactions. Several commentators distinguish between the terms "complex" and "complicated". Complicated implies being difficult to understand, but ultimately knowable. Complex, by contrast, describes the interactions between entities. As the number of entities increases, the number of interactions between them increases exponentially, making it impossible to know and understand them all. Similarly, higher levels of complexity in software increase the risk of unintentionally interfering with interactions, thus increasing the risk of introducing defects when changing the software. In more extreme cases, it can make modifying the software virtually impossible. The idea of linking software complexity to software maintainability has been explored extensively by Professor Manny Lehman, who developed his Laws of Software Evolution. He and his co author Les Belady explored numerous software metrics that could be used to measure the state of software, eventually concluding that the only practical solution is to use deterministic complexity models.
Түрлері
Қолданыстағы бағдарламаның күрделілігі, бағдарламаны өзгертудің күрделілігін анықтайды. Мәселенің күрделілігі екі санатқа бөлінеді:
Кездейсоқ күрделілік – бұл бағдарламашының бағдарламалық жасақтама құралдарынан туындаған қиындықтарға байланысты. Жақсырақ құралдар жиынтығын немесе жоғары деңгейдегі бағдарламалау тілін таңдау оны төмендетуге көмектеседі. Кездейсоқ күрделілік көбінесе мәселенің шешімін қалыптастыру үшін салалық білімді қолданбаудан туындайды. Салалық басқару дизайны кездейсоқ күрделілікті азайтуға көмектеседі. Ал негізгі күрделілік – шешілуге тиіс мәселенің қасиеттерімен байланысты және оны азайту мүмкін емес.
The complexity of an existing program determines the complexity of changing the program. Problem complexity can be divided into two categories:
Accidental complexity relates to difficulties a programmer faces due to the software engineering tools. Selecting a better tool set or a higher level programming language may reduce it. Accidental complexity often results from not using the domain to frame the form of the solution. Domain driven design can help minimize accidental complexity. Essential complexity is caused by the characteristics of the problem to be solved and cannot be reduced.