Кіріспе

Бағдарламалық жасақтаманы әзірлеуде жұмсақ өндіріс принциптерін қолдану

Жұмсақ бағдарламалық жасақтаманы әзірлеу – бұл жұмсақ өндіріс принциптері мен тәжірибелерін бағдарламалық жасақтаманы әзірлеу саласына бейімдеу. Toyota Production System жүйесінен алынған, ол agile қауымдастығының жұмсақ өндіріс бағытын қолдайтын субмәдениетінің арқасында дамып келеді. Жұмсақ өндіріс тұтас тұжырымдамалық ая, құндылықтар мен принциптер, сондай-ақ agile ұйымдарды қолдайтын тәжірибеден алынған жақсы тәжірибелер ұсынады.

Шығу тегі

"Жүйкелі бағдарламалық жасақтаманы әзірлеу" термині 2003 жылы Мэри Поппендиек пен Том Поппендиектің осы атпен жазған кітабында пайда болды. Кітапта дәстүрлі "арық" принциптері мен 22 құрал жиынтығы қайта қарастырылады, сондай-ақ құралдар тиісті икемді практикалармен салыстырылады. Поппендиектердің икемді бағдарламалық жасақтаманы әзірлеу қауымдастығына қатысуы, оның ішінде бірнеше икемді конференциялардағы баяндамалары, осы ұғымдардың икемді қауымдастықта кеңінен қабылдануына ықпал етті.

Оқуды кеңейту

Бағдарламалық жасақтаманы әзірлеу – код жазу кезінде итерацияларға негізделген, үздіксіз оқу процесі. Бағдарламалық жасақтаманы жобалау – бұл бағдарламашылардың код жазу және алған тәжірибесін қолданатын мәселені шешу процесі. Бағдарламалық жасақтаманың құндылығы талаптарға сәйкестігімен емес, пайдалануға ыңғайлылығымен өлшенеді. Қосымша құжаттама немесе егжей-тегжейлі жоспарлаудың орнына, код жазып, құру арқылы түрлі идеяларды сынап көруге болады. Пайдаланушылардың талаптарын жинау процесін соңғы пайдаланушыларға интерфейстерді көрсету және олардың пікірлерін алу арқылы жеңілдетуге болады. Ақаулардың жинақталуын болдырмау үшін код жазылғаннан кейін дереу тесттер жүргізу қажет. Оқу процесін қысқа итерациялық циклдарды қолдану арқылы жылдамдатуға болады – әр цикл рефакторинг және интеграциялық тестілеумен байланысты. Клиенттермен қысқа пікір алмасу арқылы кері байланыс беруді арттыру, дамудың ағымдағы кезеңін анықтауға және болашақ жақсартуларға күш-жігерді бағыттауға көмектеседі. Осы қысқа сессиялар барысында клиенттердің өкілдері де, даму тобы да домендік мәселе туралы көбірек біліп, одан әрі даму үшін мүмкін болатын шешімдерді іздейді. Осылайша клиенттер өздерінің қажеттіліктерін жақсырақ түсінеді, бұл даму жұмысының қолданыстағы нәтижелеріне негізделген, ал дамушылар осы қажеттіліктерді қалай толықтыруға болатынын жақсырақ біледі. Клиентпен байланыс және оқу процесіндегі тағы бір идея – болашақ шешімнің шектеулерін баяндауға баса назар аудару, мүмкін болатын шешімдерге емес, осылайша клиентпен диалог арқылы шешімнің тууына жағдай жасау.

Шешімді мүмкіндігінше кеш қабылдаңыз

Бағдарламалық жасақтаманы әзірлеу әрқашан белгілі бір белгісіздікпен байланысты болғандықтан, жинақтарға негізделген немесе нұсқаларға негізделген тәсілмен жақсы нәтижелерге қол жеткізуге болады. Шешімдер нақты деректерге негізделгенге дейін, ал нақты емес болжамдар мен күтулерге емес, мүмкіндігінше кейінге жылжыту керек. Жүйе қаншалықты күрделі болса, соғұрлым өзгерістерге бейімделу мүмкіндігі артық болуы керек, осылайша маңызды және шешуші міндеттемелерді кейінге қалдыруға болады. Итеративтік тәсіл осы принципті қолдайды – өзгерістерге бейімделу және қателерді түзету қабілеті, егер жүйе шығарылғаннан кейін анықталса, өте қымбатқа түсуі мүмкін. Жинақтарға негізделген әзірлеуде: мысалы, егер автомобильге жаңа тежегіш жүйесі қажет болса, үш команда бір мәселені шешу үшін әртүрлі шешімдерді әзірлей алады. Әр команда мәселені зерттейді және мүмкін болатын шешімді ұсынады. Егер шешім ұнамсыз деп танылса, ол жойылды. Белгілі бір кезеңнің соңында, қалған шешімдер салыстырылады және біреуі таңдалады, мүмкін басқалардан алынған білім негізінде кейбір түзетулермен. Бұл – міндеттемелерді соңғы мүмкін сәттерге дейін кейінге қалдырудың тамаша мысалы. Бағдарламалық шешімдер де осы тәжірибеден пайда көріп, алдын ала жобалаудың салдарынан туындайтын тәуекелді азайта алады. Сонымен қатар, бірнеше дұрыс жұмыс істейтін, бірақ ішкі құрылымы жағынан әртүрлі іске асырулар пайда болады. Оларды бірнеше іске асыру арқылы барлық кіріс және шығыстардың дұрыстығын бір уақытта тексеретін, қателерге төзімді жүйелерді құру үшін пайдалануға болады. Шапшаң бағдарламалық жасақтаманы әзірлеу тәсілі клиенттерге нұсқаларды ертерек ұсынуға мүмкіндік береді, осылайша клиенттер өз қажеттіліктерін толық түсінгенге дейін маңызды шешімдерді кейінге жылжытуға болады. Бұл сондай-ақ өзгерістерге бейімделуге және ерте қабылданған технологиялық шешімдердің салдарынан туындайтын қымбат қателерді болдырмауға мүмкіндік береді. Бұл жоспарлаудың қажет еместігін білдірмейді – керісінше, жоспарлау қызметі әртүрлі нұсқаларға және ағымдағы жағдайға бейімделуге, сондай-ақ жағдайды түсіндіру үшін жылдам әрекет етуге арналған үлгілерді құруға бағытталған болуы керек. Әртүрлі нұсқаларды бағалау тиімді, егер олардың тегін емес екені, бірақ кейінірек шешім қабылдау үшін қажетті икемділікті қамтамасыз ететіні анықталғанда.

Мүмкіндігінше тез жеткізу

Технологияның қарқынды дамып келе жатқан дәуірінде ең үлкені емес, ең жылдамдары сақталатын болады. Түпкілікті өнім ірі кемшіліктерсіз қаншалықты тез жеткізілсе, кері байланыс та соншалықты жылдам алынып, келесі итерацияға енгізіледі. Итерациялар қысқа болған сайын, команда ішіндегі оқу мен байланыс та жақсырақ болады. Жылдамдық шешімдерді кешіктіруге мүмкіндік береді. Жылдамдық клиенттің қазіргі қажеттіліктерін қанағаттандырады, кешегі талаптарын емес. Бұл оларға нақты не қажет екені туралы шешімді, жақсы білім алғанша кейінге жылжытуға мүмкіндік береді. Клиенттер сапалы өнімді жылдам жеткізуді бағалайды. Дәл уақытында өндіріс идеологиясы бағдарламалық жасақтаманы әзірлеуге де қолданылуы мүмкін, оның ерекше талаптары мен ортасы ескеріле отырып. Бұл қажетті нәтижені ұсыну арқылы және команданың өзін-өзі ұйымдастыруына, сондай-ақ белгілі бір итерация үшін қажетті нәтижені орындау үшін міндеттерді бөлуіне рұқсат беру арқылы жүзеге асырылады. Бастапқыда клиент қажетті ақпаратты ұсынады. Бұл шағын карточкалар немесе оқиғалар түрінде болуы мүмкін – дамытушылар әр карточканы іске асыру үшін қажетті уақытты бағалайды. Осылайша жұмыс ұйымдастыру өзіне-өзі тарту жүйесіне айналады. Әр таңертең өткізілетін жиналыста команданың әрбір мүшесі кеше не істегенін, бүгін және ертең не істеу керектігін қарастырады, сондай-ақ әріптестерінен немесе клиенттен қажетті ұсыныстарды сұрайды. Бұл процестің ашықтығын қажет етеді, бұл командалық байланысқа да пайдалы. Осы принциптің негізінде жатқан миф – асығу ысырапқа алып келеді. Дегенмен, Lean-ді енгізу тәжірибесі көрсеткендей, нәтижелерді мүмкіндігінше ертерек көру және талдау үшін жылдам жеткізу – жақсы тәжірибе.

Топқа күш беру

Көптеген кәсіпорындарда ұйымда шешім қабылдау туралы дәстүрлі түсінік қалыптасқан: басшылар қызметкерлерге өз жұмысын қалай істеу керектігін айтады. "Жұмыс жасау" әдісінде рөлдер ауыстырылады – менеджерлер бағдарламашыларды қалай тыңдауға үйренеді, осылайша олар қандай шаралар қолдануға болатынын жақсы түсіндіріп, жақсартулар бойынша ұсыныстар бере алады. Lean тәсілі "мотивацияланған адамдардың айналасында жобаларды құру және жұмысты аяқтау үшін оларға сену" принципін ұстанады, прогреске ынталандыру, қателерді анықтау және кедергілерді жоюға көмектеседі, бірақ микробасқаруға жол бермейді. Тағы бір жалған пікір – адамдарды қарапайым ресурстар деп санау. Адамдар статистикалық мәліметтер бойынша ресурс ретінде қарастырылуы мүмкін, бірақ бағдарламалық жасақтаманы әзірлеуде және кез келген ұйымдық бизнесте адамдарға міндеттер тізімі мен жұмыстың орындалуына кедергі келтірмейтініне кепілдік беру жеткіліксіз. Адамдарға жұмыс істеу үшін мотивация және қол жетімді болатын нақты мақсат қажет – команда өз міндеттемелерін таңдай алатынына сенімділікпен. Бағдарламашылар клиенттерге тікелей қол жеткізуге мүмкіндік алса, команда жетекшісі қиын жағдайларда қолдау көрсетуі және көмектесуі керек, сондай-ақ күмән команданың рухын құлатпауына көз жеткізуі керек. Адамдарды құрметтеу және олардың еңбегін бағалау – команданы күшейтудің бір жолы.

Адалдықты қалыптастыру

Клиент жүйе туралы толыққанды түсінікке ие болуы керек. Бұл – қабылданатын тұтастық, яғни жүйені қалай жарнамалау, жеткізу, енгізу, пайдалану, оның қолданудың қаншалықты интуитивті болуы, бағасы және мәселелерді қаншалықты тиімді шешетіні. Тұжырымдық тұтастық – жүйенің жеке компоненттерінің икемділік, техникалық қолдау, тиімділік және жауап беру қабілеті арасындағы үйлесімділікпен жұмыс істеуі. Мұны мәселені бірден шешу арқылы, бірінен соң бірін емес, жүзеге асыруға болады. Қажетті ақпарат үлкен бір бөлік түрінде емес, кішігірім бөліктермен берілуі керек – мүмкіндігінше бетпе-бет әңгімелесу арқылы, жазбаша құжаттама емес. Ақпарат ағыны екі бағытта да үздіксіз болуы керек – клиенттен дамытушыларға және керісінше, осылайша ұзақ дамытудан кейін туындайтын үлкен стресстік ақпараттан аулақ болуға болады. Тұтас архитектураға жетудің бірден-бір дұрыс жолы – рефакторинг. Бастапқы код базасына жаңа мүмкіндіктер қосылған сайын, одан әрі жақсартулар енгізу қиындай түседі. Рефакторинг – кодтың қарапайымдылығын, түсініктілігін, мүмкіндіктердің ең аз санын сақтау туралы. Кодтағы қайталаулар – нашар код дизайнының белгісі және олардан аулақ болу керек (мысалы, DRY ережесін қолдану арқылы). Толық және автоматтандырылған құрастыру процесі дамытушылар мен клиенттердің толық және автоматтандырылған сынақтарымен бірге жүруі керек, олар жүйенің ағымдағы күйімен бірдей нұсқалауға, синхрондауға және семантикаға ие болуы керек. Соңында тұтастық мұқият сынау арқылы тексерілуі керек, осылайша жүйенің клиент күткенін орындайтынына көз жеткізіледі. Автоматтандырылған сынақтар өндіріс процесінің бір бөлігі болып есептеледі, сондықтан олар құндылық қоспаса, оларды пайдасыз деп санау керек. Автоматтандырылған тестілеу мақсат емес, мақсатқа жету құралы болуы керек, атап айтқанда, қателерді азайту.

Бүкілін оңтайландыру

Қазіргі заманғы бағдарламалық жүйелер тек олардың құраушы бөліктерінің жиынтығы ғана емес, сонымен қатар олардың өзара әрекеттесуінің нәтижесі болып табылады. Бағдарламалық жасақтамадағы кемшіліктер даму процесінде жинақталады – ірі тапсырмаларды кішірек тапсырмаларға бөлу және дамудың әртүрлі кезеңдерін стандарттау арқылы кемшіліктердің түпкі себептерін анықтап, жою қажет. Жүйе неғұрлым ірі болса, оның дамуына қатысқан ұйымдардың саны көп болса және әртүрлі командалармен жасалған бөліктердің саны арта түссе, әртүрлі жеткізушілер арасындағы анық қарым-қатынастардың маңызы осымен пропорционалды түрде артады. Ұзақ мерзімді даму кезеңінде, берік қосалқы мердігерлер желісі, өзара тиімді қарым-қатынасқа мүмкіндік бермейтін қысқа мерзімді пайданы бағалаудан әлдеқайда пайдалы. Lean (жайлау) ойлауды жобаның барлық қатысушылары нақты жағдайда қолдану алдында жақсы түсінуі керек. "Ірі ойла, кішкентай қадамдар жаса, тез қателіктерге жол бер, жылдам үйрен" – бұл ұрандар саланың түсінігінің және бағдарламалық жасақтаманы дамыту процесінде lean принциптерін енгізудің тиімділігінің маңыздылығын көрсетеді. Бағдарламалық жасақтаманы дамытуда табысқа жету үшін барлық lean принциптері жұмыс ортасына қатысты "ақылға қонымды" тәсілмен бірге кешенді түрде іске асырылуы керек.