2.19 Urekebishaji wa muundo na deni la kiufundi
Muhtasari na msukumo
Urekebishaji wa muundo ni kubadilisha muundo wa ndani wa msimbo bila kubadilisha unachofanya kwa nje. Unabadilisha jina la kigeu, unagawanya kazi ndefu, unatoa darasa, unakunja msongamano wa masharti kuwa kitu ambacho msomaji anaweza kukifuata, na programu inatenda hasa kama awali. Sehemu hiyo ya mwisho ndiyo nidhamu nzima. Urekebishaji wa muundo huhifadhi tabia kwa ufafanuzi, na mara unapobadilisha tabia pia hurekebishi tena, unafanya mambo mawili ya hatari kwa wakati mmoja na kuficha kila moja nyuma ya jingine. Sura hii inachukulia hayo kama vitendo tofauti kwa makusudi, kwa sababu mkanganyiko kati yake ndipo urekebishaji mwingi wa muundo hukosea.
Katika timu kubwa hili ni muhimu zaidi kuliko kwa msanidi mmoja, kwa sababu msimbo unaousafisha ni msimbo ambao mamia ya watu wengine wanausoma, wanautegemea, na wanaogopa kuugusa. Urekebishaji wa muundo ndio jinsi msimbo wa pamoja unavyobaki ukikalika kwa miaka na mauzo ya wafanyakazi. Unaunganishwa moja kwa moja na ujenzi wa programu (sura ya 2.9), ambapo ubora wa uandishi wa kila siku huwekwa, na mkakati wa majaribio (sura ya 2.4), ambao ni wavu wa usalama unaofanya urekebishaji wa muundo uwe salama kabisa. Pia unaunganishwa na swali gumu zaidi la deni la kiufundi: gharama iliyokusanyika ya njia za mkato, usanifu unaozeeka, na usafishaji ulioahirishwa vinavyofanya kila badiliko la baadaye liwe la polepole. Urekebishaji wa muundo ndiyo njia kuu ya kulipa deni hilo, kwa hiyo mada hizi mbili ni za sura moja.
Katika mazingira ya mashirika makubwa na ya serikali dau hupanda. Mifumo hii ni ya muda mrefu, mara nyingi ya miongo, na mara nyingi iko chini ya mifumo ya ukaguzi na udhibiti wa mabadiliko inayochukulia badiliko lolote la msimbo kama tukio linalotawaliwa. Huwezi kuandika upya mfumo wa manufaa ya raia kwa wikendi ndefu; unaboresha kwa hatua ndogo, zinazoweza kutenguliwa, zinazoungwa mkono na ushahidi, ambazo ndizo hasa urekebishaji wa muundo wenye nidhamu unakupa. Kuratibu kazi hiyo kuvuka timu nyingi na mifumo ya muda mrefu (sura ya 10.4) ni mojawapo ya changamoto zinazobainisha uhandisi wa ukubwa mkubwa, na kukosea hapa ndivyo mashirika huishia kuganda, bila kuweza kubadilisha programu wasiyoielewa tena.
Kanuni kuu
- Urekebishaji wa muundo huhifadhi tabia; ukibadilisha msimbo unachofanya, hilo ni badiliko tofauti, linalofanywa tofauti.
- Safu ya majaribio inayoaminika ni sharti la awali la urekebishaji salama wa muundo, si nyongeza ya hiari.
- Fanya kazi kwa hatua ndogo, zilizotajwa, zinazoweza kutenguliwa, na uweke msimbo ukifanya kazi baada ya kila moja.
- Fanya deni la kiufundi lionekane na lifuatiliwe, kisha ufadhili ulipaji kama uwezo thabiti badala ya ushujaa.
- Rekebisha muundo wa msimbo unaoubadilisha tayari, ambapo usafishaji unastahili.
- Si kila deni linastahili kulipwa; msimbo thabiti, unaoguswa mara chache, au unaotarajiwa kustaafu unaweza kuachwa.
- Pima ubora wa ndani ufahamishe busara, kamwe usiwe lengo la kuchezewa.
Mapendekezo
Weka urekebishaji wa muundo na badiliko la tabia tofauti kabisa
Amua kabla ya kuanza unafanya lipi, na usiyachanganye kamwe katika commit moja. Unaporekebisha muundo, majaribio yaliyopita kabla lazima yapite baada, bila kubadilishwa, kwa sababu tabia inayoonekana haijasogea. Unapobadilisha tabia, fanya hivyo kama commit yake yenyewe na majaribio yake. Sababu ni ya kiutendaji: badiliko lililochanganywa likivunja kitu, huwezi kusema kama upangaji upya wako ulileta hitilafu au badiliko lako la tabia, na katika mapitio ya msimbo (sura ya 2.5) mpitiaji hawezi kufikiri kwa usafi kuhusu nusu yoyote. Tabia inayofanya kazi ni kanuni ya kofia mbili ya Martin Fowler: daima umevaa kofia ya urekebishaji wa muundo au ya kipengele, unajua ipi, na unabadilisha kwa makusudi. Commit tofauti pia hufanya historia ya udhibiti wa matoleo isomeke, ili mhandisi anayegawanya kushindwa aweze kuruka commit safi za urekebishaji kwa kujiamini.
Weka wavu wa usalama unaoaminika kabla ya kupanga upya
Kurekebisha muundo bila majaribio ni kuhariri na kutumaini tu. Kabla ya kupanga upya kitu chochote cha maana, unahitaji safu unayoiamini kunasa badiliko la tabia ukilisababisha, ambayo ndiyo hoja kuu ya mkakati wa majaribio (sura ya 2.4). Kwa msimbo ambao tayari una ufikiaji mzuri, endesha majaribio, rekebisha kwa hatua ndogo, na uyaendeshe tena baada ya kila hatua. Kwa msimbo wa urithi usio na majaribio, hatua ya uaminifu ni kuandika kwanza majaribio ya kubainisha tabia. Jaribio la kubainisha tabia halidai msimbo unapaswa kufanya nini; linanasa msimbo unachofanya kweli sasa hivi, ikiwa ni pamoja na tabia zake za ajabu, ili badiliko lolote la tabia lijitokeze kama jaribio linalofeli. Michael Feathers alitangaza mbinu hii kwa hali hasa ambayo mashirika makubwa yanaishi nayo: msimbo unaofanya kazi, unaojalisha, na usio na majaribio. Tabia ya sasa ikishawekwa, unaweza kurekebisha muundo chini yake kwa usalama, na kisha tu kubadilisha tabia juu yake.
Jifunze kutambua harufu za msimbo na utumie urekebishaji mdogo uliotajwa
Harufu ya msimbo ni ishara ya juu juu kwamba kitu cha chini kinaweza kuhitaji umakini: kazi iliyokua ndefu mno, darasa linalojua mengi mno, mantiki iliyonakiliwa, orodha ndefu ya vigezo, majina yanayosema uongo kuhusu wanachofanya. Harufu ni ishara, si hukumu, kwa hiyo unachunguza badala ya kuitii kwa upofu. Jibu ni urekebishaji mdogo, uliotajwa kutoka katalogi ya Fowler: Extract Function, Rename Variable, Move Method, Replace Conditional with Polymorphism, na kadhaa zaidi. Thamani ya kutumia hatua zilizotajwa ni kwamba kila moja ni ndogo, inaeleweka, salama kimitambo, na mara nyingi inasaidiwa moja kwa moja na IDE yako. Unaunda maboresho makubwa kutoka hatua ndogo nyingi zinazotegemewa, ukiweka msimbo kijani muda wote, badala ya kuruka kubwa moja usiloweza kulithibitisha.
Pendelea urekebishaji wa fursa, na uhifadhi kampeni kwa hitaji halisi la kimuundo
Urekebishaji mwingi wa muundo unapaswa kuwa wa fursa, ukichanganywa na kazi unayoifanya tayari. Kanuni ya skauti inaunasa: acha msimbo ukiwa safi kidogo kuliko ulivyouikuta. Unapogusa faili kuongeza kipengele au kurekebisha hitilafu, tayari unaelewa kona hiyo, na usafishaji mdogo hapo hujumlika kwa muda bila kuhitaji ruhusa ya mtu yeyote au bajeti tofauti. Kampeni za urekebishaji zilizopangwa, ambapo timu inasimamisha kazi ya vipengele kupanga upya eneo kubwa, wakati mwingine ni za lazima, lakini ni ghali, ngumu kupangiwa dhidi ya shinikizo la bidhaa, na hatari ikiwa eneo halijajaribiwa vizuri. Hifadhi kampeni kwa matatizo ya kimuundo ambayo usafishaji wa fursa hauwezi kuyafikia, na utoe hoja kwa ushahidi kuhusu gharama ya mabadiliko mnayoilipa. Pendelea matone thabiti ya usafishaji mdogo; ni ya kudumu zaidi kuliko uandishi upya wa kishujaa wa mara kwa mara.
Tumia muundo wa mtini wa kunyonga kwa badiliko kubwa la kimuundo
Mfumo mzima mdogo unapohitaji kubadilishwa, usijaribu uandishi upya wa mlipuko mkubwa unaoendesha kwa mwaka na kuunganishwa mwishoni; ndivyo miradi ya uboreshaji inavyokufa. Tumia muundo wa mtini wa kunyonga, uliopewa jina na Martin Fowler kutokana na mzabibu unaokua kuzunguka mti na kuubadilisha polepole. Unaweka uso mbele ya mfumo wa zamani, unaelekeza kipande kimoja cha utendaji kwa wakati kwenda msimbo mpya nyuma ya uso huo, unakithibitisha kwenye uzalishaji, na kurudia hadi mfumo wa zamani uzungukwe kabisa na uweze kuondolewa. Kila kipande ni kidogo, kinasafirishika, na kinatenguka, kwa hiyo hatari inabaki imefungwa na thamani inafika mfululizo. Binamu wa karibu, tawi kwa uondoaji wa maelezo, hufanya vilevile ndani ya msimbo mmoja: unaleta safu ya uondoaji wa maelezo juu ya kitu unachotaka kubadilisha, unajenga utekelezaji mpya nyuma yake huku vyote viwili vikiishi pamoja, unahamisha watumiaji hatua kwa hatua, na kufuta utekelezaji wa zamani mara hakuna kinachoutegemea. Zote mbili huruhusu mfumo wa urithi kubadilika huku ukibaki hai, ambayo ndiyo aina pekee ya uboreshaji ambayo mashirika makubwa mengi yanaweza kumudu kweli.
Chukulia deni la kiufundi kama jalada, na ulifanye lionekane
Sitiari ya deni, iliyobuniwa na Ward Cunningham, hutenganisha vitu viwili: mtaji (msimbo mchafu au njia ya mkato yenyewe) na riba (juhudi ya ziada ambayo kila badiliko la baadaye hulipa kwa sababu yake). Si deni lote ni sawa. Roboduara ya Fowler hulipanga kwa shoka mbili: la makusudi dhidi ya la bahati mbaya, na la busara dhidi ya la pupa. Deni la busara-la makusudi (“tunasafirisha sasa na kusafisha sprint ijayo, na tunajua gharama”) ni uamuzi halali wa biashara. Deni la pupa-la bahati mbaya (“muundo wa usanifu ni nini?”) ni uharibifu tu. Kazi ya usimamizi, inayounganishwa na kufanya maamuzi na utawala (sura ya 1.5) na mtazamo wake wa deni kama jalada, ni kulifanya deni lionekane ili liweze kufikiriwa: fuatilia vipengee muhimu mahali kazi inapoishi, weka alama kwenye msimbo, na urekodi riba mnayolipa ili ulipaji ushindanie uwezo kwa ushahidi badala ya yeyote anayelalamika kwa sauti kubwa zaidi. Deni usiloliona, huwezi kulisimamia.
Fadhili ulipaji kama uwezo thabiti, si ushujaa
Njia ya kushindwa ni kuchukulia usafishaji kama kitu utakachofanya “mambo yakitulia,” ambacho ni kamwe. Mfumo wa kudumu ni uwezo uliowekwa, uliolindwa wa kulipa: kipande dhahiri cha kila mzunguko, au makubaliano ya kudumu kwamba usafishaji hupanda pamoja na kazi ya vipengele katika eneo lilelile. Kisichofanya kazi ni sprint ya kishujaa ya mara kwa mara ambapo mtu anachoma wikendi kurekebisha kila kitu, kwa sababu haidumiki, haipitiwi, na kwa kawaida hujitengua yenyewe. Uwezo thabiti huweka malipo ya riba chini na kuepuka mzunguko wa kuinuka-na-kuanguka ambapo deni hujilimbikiza hadi mgogoro ulazimishe uandishi upya wa gharama kubwa. Hii ni ahadi ya usimamizi kama ilivyo mazoea ya kihandisi, na inahusu jinsi unavyopanga matengenezo ya programu (sura ya 3.7) kwa maisha ya mfumo.
Pima ubora wa ndani, lakini usiruhusu kipimo kiwe lengo
Unaweza kupima ubora wa ndani kwa ishara kama ugumu wa mzunguko (hesabu ya njia huru kupitia kazi), urudiaji, ufikiaji wa majaribio, kiwango cha kushindwa kwa mabadiliko, na mabadiliko huchukua muda gani katika maeneo unayoshuku. Namba hizi zinafaa kuona deni linapojikita na kutazama mwelekeo kwa muda. Hatari ni sheria ya Goodhart: kipimo kinapogeuka lengo, huacha kupima chochote halisi. Amuru namba ya ufikiaji na unapata majaribio yasiyodai chochote; tuza alama za ugumu wa chini na unapata mantiki iliyotapakaa kuvuka kazi nyingi kukwepa kipimo. Tumia vipimo kuanzisha mazungumzo na kupata sehemu moto, na kamwe usiunganishe kipimo cha ubora na lango ambalo watu wana kishawishi cha kulichezea.
Jua wakati wa kutorekebisha muundo
Urekebishaji wa muundo ni uwekezaji, na baadhi ya msimbo hautalipa kamwe. Moduli ikiwa thabiti, inagusa mara chache, na inaeleweka vya kutosha kuibadilisha katika matukio nadra unapolazimika, kuisafisha ni juhudi inayotumika kwa riba ambayo hukuwa unailipa. Msimbo ukipangiwa kustaafu, kuurekebisha ni kung’arisha kitu unachokaribia kutupa. Nidhamu ni kutumia bajeti yako ya usafishaji pale mabadiliko yanapokuwa ya mara kwa mara na yenye maumivu, ambapo kupunguza riba hujumlika kweli, na kuacha pembe tulivu peke yake.
Mabadilishano: faida na hasara
| Mbinu | Faida | Hasara |
|---|---|---|
| Urekebishaji wa fursa (kanuni ya skauti) | Nafuu, endelevu, hakuna bajeti tofauti, hujumlika kwa muda | Ufikiaji usio sawa; faili moto huboreka huku baridi zikioza |
| Kampeni ya urekebishaji iliyopangwa | Hurekebisha matatizo ya kimuundo ambayo usafishaji hauwezi kuyafikia | Ghali; hushindana na vipengele; hatari bila majaribio mazuri |
| Mtini wa kunyonga / tawi kwa uondoaji wa maelezo | Hatua kwa hatua, inatenguka, huweka mfumo hai, hufunga hatari | Polepole kuliko uandishi upya kwenye karatasi; inahitaji nidhamu kumaliza |
| Uandishi upya wa mlipuko mkubwa | Ukurasa safi; hakuna vikwazo vya urithi | Kiwango cha juu cha kushindwa; muda mrefu hadi thamani; mapengo ya tabia |
| Deni la busara la makusudi | Hutoa thamani sasa; ulipaji wazi, uliopangwa | Hugeuka pupa ulipaji usipopangwa kamwe |
| Ubora unaodhibitiwa na kipimo | Wa kimalengo, unaoonekana, hunasa kuteleza mapema | Unaalika kuchezea; huadhibu nuances; unaweza kudhoofisha ubora halisi |
Mvutano wa msingi ni kasi sasa dhidi ya uwezo wa kubadilika baadaye, na ni halisi. Kusafirisha njia ya mkato kunaweza kuwa uamuzi sahihi tarehe ya mwisho ikiwa ya kweli na deni likiwa la busara na linalofuatiliwa. Kosa ni kujifanya deni ni la bure, au kuliacha lijilimbikize bila kuonekana hadi mfumo uwe ghali mno kubadilisha. Lisuluhishe kwa kufanya biashara iwe wazi kila mara: taja deni, kadiria riba, amua kwa makusudi, na urekodi uamuzi ili ulipaji uweze kupangwa badala ya kusahaulika. Timu inayokopa kwa kujua na kulipa mfululizo inabaki ya haraka kwa miaka; timu inayokopa kwa upofu inakwama.
Maswali ya kujadili na timu yako
Tunazuiaje urekebishaji wa muundo na badiliko la tabia kuchanganyika katika commit moja, na je, mapitio yetu yanaitekeleza hilo kweli? Hii ndiyo nidhamu ya msingi ya sura nzima, na ndiyo inayovunjwa mara nyingi zaidi chini ya shinikizo la tarehe ya mwisho, kwa sababu inahisi ya ufanisi “kusafisha hapa nikiwa ndani” na kusafirisha yote pamoja. Gharama inatua baadaye: commit iliyochanganywa inapovunja uzalishaji, hakuna anayeweza kusema upangaji upya au kipengele kilisababisha, na ugawanyaji kupitia historia yenu huacha kuaminika. Leta maombi machache ya hivi karibuni ya kuvuta na uangalie kwa uaminifu mangapi yalichanganya kofia mbili. Jambo linaloshindana ni msuguano, kwa kuwa kugawanya kazi kuwa commit tofauti ni juhudi kidogo zaidi mapema. Jibu linapaswa kuumba kanuni zenu za commit na orodha hakiki ya mapitio.
Deni letu la kiufundi liko wapi, tunalipa riba kiasi gani juu yake, na nani anaamua nini kilipwe? Timu nyingi haziwezi kujibu hili, ambalo ndilo tatizo halisi, kwa sababu deni usiloliona husimamiwa na yeyote anayelalamika kwa sauti zaidi badala ya mahali gharama ilipo kweli. Kulifanya lionekane kunamaanisha kufuatilia vipengee muhimu, kuweka alama kwenye msimbo, na kukusanya ushahidi kuhusu maeneo yanayofanya mabadiliko kuwa ya polepole na yanayoelekea kushindwa. Mvuto unaoshindana ni kwamba kila saa inayotumika kulipa ni saa isiyotumika kwa vipengele, kwa hiyo uamuzi lazima uwe wa jalada unaofanywa na uongozi, ukiunganishwa na jinsi mnavyotawala kazi ya kihandisi (sura ya 1.5). Leta data yenu ya kushindwa kwa mabadiliko na orodha ya faili ambazo kila mtu anaogopa kuzigusa. Jibu linapaswa kugeuka kuwa uwezo wa kulipa uliolindwa, thabiti, si nia isiyo wazi ya kusafisha mambo yakitulia.
Sehemu zipi za msimbo wetu tunapaswa kutorekebisha kwa makusudi, na tungejuaje? Kurekebisha kila kitu ni kushindwa kama kutorekebisha chochote, kwa sababu juhudi inayotumika kusafisha msimbo thabiti, unaoguswa mara chache, au unaostaafu hivi karibuni ni riba inayolipwa kwa mkopo msiodaiwa. Uamuzi wa busara ni halisi: moduli inaweza kuonekana mbaya na bado ikawa mahali pasipo sahihi pa kuwekeza ikiwa hakuna anayeibadilisha kamwe. Leta data yenu ya marudio ya mabadiliko kando ya ishara zenu za ugumu, kwa sababu makutano ya msukosuko mkubwa na ugumu mkubwa ndipo usafishaji hujumlika, wakati msimbo wa msukosuko mdogo kwa kawaida ni bora kuachwa. Hatari inayoshindana ni kwamba “tutauacha” inakuwa kisingizio cha kutogusa chochote kigumu. Jibu linapaswa kukupa orodha fupi dhahiri ya sehemu moto zinazostahili uwekezaji na ruhusa ya kupuuza pembe tulivu.
Je, tunaamini safu yetu ya majaribio vya kutosha kurekebisha msimbo tunaouhitaji kubadilisha zaidi, na wapi tungelazimika kuandika majaribio ya kubainisha tabia kwanza? Wavu wa usalama usioweza kuuamini hugeuza urekebishaji wa muundo kuwa kuhariri na kutumaini, na katika timu kubwa msimbo wa kutisha zaidi kwa kawaida ni ule unaojaribiwa kidogo zaidi, ambapo usafishaji ungelipa zaidi. Leta data ya ufikiaji na ya kushindwa kwa mabadiliko kwa sehemu zenu moto, na uwe mkweli ni moduli zipi muhimu hazingekupa onyo lolote upangaji upya ukibadilisha tabia. Mazingatio yanayoshindana ni kwamba kuandika majaribio ya kubainisha tabia kwa msimbo wa urithi ni kazi ya polepole, isiyovutia isiyosafirisha kipengele, kwa hiyo ni rahisi kuiahirisha milele. Katika mifumo ya mashirika makubwa na serikali chini ya ukaguzi na udhibiti wa mabadiliko, majaribio hayo yaliyobainishwa pia ni ushahidi kwamba badiliko lilihifadhi tabia, kwa hiyo kuyafadhili ni hatua ya usalama na ya uzingatiaji kwa wakati mmoja; jibu linapaswa kutaja maeneo gani yanapata jukwaa la majaribio kabla ya mtu yeyote kuyagusa.
Mfumo mdogo unapohitaji kubadilishwa kweli, tunaamuaje kati ya mbinu ya mtini wa kunyonga ya hatua kwa hatua na uandishi upya, na nani ana mamlaka ya kukataa uandishi upya? Uandishi upya wa mlipuko mkubwa ndio chaguo la kuvutia zaidi na linaloelekea kushindwa zaidi mezani, kwa sababu ukurasa safi daima unaonekana wa bei nafuu kwenye karatasi kuliko kuishi na vikwazo vya zamani. Kwa shirika kubwa njia ya hatua kwa hatua (uso, kipande kimoja kwa wakati, kimethibitishwa kwenye uzalishaji) huweka mfumo hai na kufunga hatari, lakini ni polepole zaidi, inadai nidhamu kumaliza, na inashindana na hamu ya mwanzo mpya. Leta ramani ya marudio ya mabadiliko ya mfumo mdogo, makadirio ya uaminifu ya muda ambao uandishi upya ungeendesha kabla ya kutoa thamani, na mapengo ya tabia ambayo uandishi upya sambamba ungelazimika kuyazibaa. Katika mazingira ya serikali na yanayodhibitiwa, uandishi upya wa miaka mingi unaounganishwa mwishoni mara chache unanusurika ukaguzi, kwa hiyo jibu linapaswa kuwa mtini wa kunyonga au tawi kwa uondoaji wa maelezo kwa chaguo-msingi na kuchukulia uandishi upya wowote kama kighairi kinachopaswa kutetewa kwa ushahidi.
Tunatumiaje vipimo vya ubora wa ndani kupata mahali deni linapojikita bila kuruhusu namba kuwa lengo ambalo watu wanalichezea? Vipimo kama ugumu, urudiaji, ufikiaji, na kiwango cha kushindwa kwa mabadiliko ndiyo njia pekee ambayo shirika kubwa linaweza kuona kuvuka msimbo ambao hakuna mtu mmoja anayeusoma, hata hivyo mara kimoja kinapofungwa na lango au tathmini ya utendaji, sheria ya Goodhart inatawala na namba huacha kupima chochote halisi. Leta mifano ya mahali kipimo tayari kinaendesha tabia, na uliza kama kinaanzisha mazungumzo au kinatuza kimyakimya majaribio yasiyodai chochote na mantiki iliyotapakaa kuvuka kazi kukwepa kizingiti. Mvuto unaoshindana ni kwamba uongozi unataka namba rahisi ya dashibodi, na “tumia busara” ni vigumu kuuza kuliko upau wa kijani. Katika mazingira ya mashirika makubwa na serikali ambapo vipimo vinalisha ripoti za utawala, kuwa wazi kwamba ishara za ubora zinafahamisha uwekezaji na kupata sehemu moto lakini kamwe haziwadhibiti watu binafsi; jibu linapaswa kuchora mstari thabiti kati ya kupima ili kujifunza na kupima ili kuhukumu.
Mtazamo wa sekta
Kampuni changa. Ukiwa na wahandisi wachache na bila muda wa ziada, rekebisha muundo kwa fursa tu: vaa kofia moja kwa kila commit ili historia ibaki inayogawanyika, na uweke orodha fupi ya uaminifu ya njia za mkato ulizochukua kwa makusudi. Usianzishe kampeni za usafishaji wala kung’arisha moduli thabiti; tumia umakini wako adimu kwa faili ile moja ambayo kila mtu anaogopa, na uandike majaribio ya kubainisha tabia pale tu badiliko linapokutisha kweli. Deni la makusudi, linaloonekana ni sawa katika hatua hii; deni la pupa lisiloonekana ndilo linalokuua.
Biashara ndogo. Bila mtaalamu maalumu wa jukwaa au zana na bajeti finyu, tegemea kile IDE yako na mfumo wa ikolojia wa lugha vinakupa bure: hatua za kiotomatiki za kubadilisha jina na kutoa, linter, na ishara ya msingi ya ufikiaji. Chukulia deni nyingi kama kitu unachosimamia katika mwendo wa kazi ya kawaida badala ya kitu unachoajiri mshauri kukirekebisha, na upendelee kununua maktaba zinazodumishwa vizuri kuliko kujenga kisha kulazimika kurekebisha muundo wa yako mwenyewe. Hifadhi juhudi adimu inayolipwa kwa mfumo mmoja ambao ucheleweshaji wake unakugharimu wateja moja kwa moja.
Biashara kubwa. Kuvuka timu nyingi tatizo ni utawala wa jalada: rejista ya deni ya pamoja, uwekaji alama thabiti wa sehemu moto kwa marudio ya mabadiliko na ugumu, na kipande kilicholindwa cha uwezo wa kila timu kwa ulipaji ili usafishaji uache kushindwa kwa vipengele kwa chaguo-msingi. Sawazisha nidhamu ya kofia mbili na mazoea ya majaribio ya kubainisha tabia ili mhandisi yeyote anayehama kati ya timu apate kanuni zilezile, na utumie mtini wa kunyonga na tawi kwa uondoaji wa maelezo kwa badiliko la kimuundo linaloratibiwa kuvuka vikundi. Weka vipimo vya ubora vya taarifa ili vipate deni bila kuchezewa kwenye tathmini za utendaji.
Serikali. Mifumo ya muda mrefu chini ya ukaguzi mkali na udhibiti wa mabadiliko hufanya urekebishaji wa muundo wenye nidhamu kuwa mali ya uzingatiaji, si ya kihandisi tu: kuweka upangaji upya tofauti kabisa na badiliko la tabia huwaruhusu wakaguzi kuona hasa commit zipi zilibadilisha tabia na zipi zilisafisha tu. Kanuni za ununuzi na uwazi zinapendelea hatua ndogo, zinazotenguka, zinazoungwa mkono na ushahidi kuliko uandishi upya wa mlipuko mkubwa, kwa hiyo chaguo-msingi ni mtini wa kunyonga pamoja na majaribio ya kubainisha tabia yanayoandika kwamba tabia imehifadhiwa. Fanya rejista ya deni na mpango wake wa ulipaji kuwa sehemu ya rekodi ya matengenezo ya mfumo ili vyombo vya usimamizi vipate ufuatiliaji wanaohitaji.
Mifano
Kampuni changa. Kampuni changa ya watu sita inasafirisha haraka na inajua inachukua deni, kwa hiyo inafanya mambo mawili ya bei nafuu vizuri. Kila ombi la kuvuta linavaa kofia moja: commit za urekebishaji wa muundo ni tofauti na commit za vipengele, ambayo huweka historia yao ikigawanyika hata kwa kasi ya juu. Na wanaweka orodha fupi, ya uaminifu ya njia za mkato walizochukua kwa makusudi, na noti ya mstari mmoja kuhusu riba ambayo kila moja inagharimu. Moduli ya malipo inapogeuka faili ambayo kila mtu anaiogopa, orodha hiyo pamoja na historia yao ya kushindwa kwa mabadiliko inatoa hoja ya kutumia siku mbili kutoa mpaka safi zaidi. Wanaandika majaribio ya kubainisha tabia kuweka tabia ya sasa, wanarekebisha chini kwa hatua za IDE za kubadilisha jina na kutoa, na hawagusi kamwe moduli thabiti ambazo hakuna anayezibadilisha. Deni wanalobeba ni la makusudi na linaloonekana, kwa hiyo halifiki aina ya pupa.
Biashara kubwa. Kampuni ya kimataifa ya usafirishaji inaendesha mfumo wa maagizo wa miaka kumi na mitano ambao timu nyingi huubadilisha kila wiki. Badala ya uandishi upya, wanapokea muundo wa mtini wa kunyonga: uso unakaa mbele ya monolith, na uwezo mmoja uliofungwa kwa wakati unaelekezwa kwenye huduma mpya nyuma yake, ukithibitishwa kwenye uzalishaji kabla ya kipande kinachofuata kuanza. Kuratibu hili kuvuka timu na mfumo wa muda mrefu (sura ya 10.4) ndilo gumu, kwa hiyo wanadumisha rejista ya deni ya pamoja, wanaweka alama sehemu moto kwa marudio ya mabadiliko na ugumu, na kuhifadhi kipande kisichobadilika cha uwezo wa kila timu kwa ulipaji. Vipimo vya ubora wa ndani vinafahamisha mahali pa kuangalia lakini kamwe haviwadhibiti tathmini za utendaji za mtu yeyote, jambo linaloweka namba kuwa za uaminifu. Kwa miaka miwili monolith inapungua mfululizo na hakuna badiliko lolote linalohatarisha mfumo mzima.
Serikali. Wakala wa kitaifa wa kodi lazima uboreshe jukwaa la tathmini la miongo kadhaa chini ya kanuni kali za ukaguzi na udhibiti wa mabadiliko, ambapo kila badiliko la msimbo ni tukio linalotawaliwa, linaloungwa mkono na ushahidi. Uandishi upya wa mlipuko mkubwa hauwezekani, kwa hiyo wanatumia tawi kwa uondoaji wa maelezo: safu ya uondoaji wa maelezo inaletwa juu ya injini ya hesabu ya urithi, utekelezaji mpya unajengwa nyuma yake, na watumiaji wanahamishwa kanuni moja ya kodi kwa wakati, kila uhamishaji ukiandikwa kama badiliko dogo, linalotenguka lenye majaribio ya kubainisha tabia yanayothibitisha tabia haijabadilika. Kwa sababu urekebishaji wa muundo umewekwa tofauti kabisa na badiliko lolote la tabia la kisheria, wakaguzi wanaweza kuona hasa commit zipi zilibadilisha tabia na zipi zilipanga upya tu. Rejista ya deni na mpango wake wa ulipaji huwa sehemu ya rekodi ya matengenezo ya mfumo (sura ya 3.7), ikitoa vyombo vya usimamizi ufuatiliaji wanaohitaji.
Kesi ya biashara: sababu, ROI, na TCO
Mapato ya urekebishaji wa muundo na ulipaji wa deni ni uwezo endelevu wa kubadilisha programu kwa bei nafuu, na kwa mifumo mingi sehemu kubwa ya gharama ya maisha ni matengenezo, kwa hiyo hapa ndipo jumla ya gharama ya umiliki inapoamuliwa kwa kiasi kikubwa. Riba ya deni la kiufundi hulipwa kwa sarafu ambayo uongozi tayari inafuatilia: utoaji wa polepole, kiwango cha juu cha kushindwa kwa mabadiliko, muda mrefu wa kurejesha kutoka kwa matukio, na wahandisi wanaoepuka msimbo wa kutisha zaidi. Unapofanya deni lionekane na kufadhili ulipaji mfululizo, unapunguza gharama ya kila badiliko la baadaye katika maeneo yanayojalisha zaidi, na kuepuka mzunguko wa kuinuka-na-kuanguka ambapo deni lililopuuzwa hulazimisha uandishi upya wa dharura wa gharama kubwa.
Gharama ya kupokea ni ya wastani na hasa ya kiutamaduni: weka nidhamu ya kofia mbili, jenga wavu wa usalama pale unapohitaji kurekebisha, dumisha rejista ya deni, na ulinde kipande thabiti cha uwezo kwa ulipaji. Gharama ya kupuuza inajumlika kimyakimya. Riba hujilimbikiza kwa kila badiliko hadi kasi iporomoke na shirika lijikute limeganda, halina uwezo wa kubadilisha kwa usalama mfumo ambao halilielewi tena, ambalo ndilo tokeo ghali zaidi. Kujenga hoja kwa uongozi, unganisha deni moja kwa moja na vipimo vya utoaji wanavyojali tayari, na uweke ulipaji kama uamuzi wa jalada wenye malipo yanayopimika, si wahandisi wakiomba muda wa kutengeneza.
Mifumo mibaya na mitego
- Kuchanganya urekebishaji wa muundo na badiliko la tabia: commit moja inafanya yote mawili, kwa hiyo kuvunjika hakuwezi kuhusishwa na historia inakuwa isiyoaminika.
- Kurekebisha muundo bila wavu wa usalama: kupanga upya msimbo usiojaribiwa na kutumaini, ambalo ni kuhariri kwa imani.
- Uandishi upya wa mlipuko mkubwa: kubadilisha mfumo unaofanya kazi wote kwa mara moja, mtindo wenye kiwango cha juu cha kushindwa na muda mrefu hadi thamani.
- Urekebishaji wa muundo kama wikendi ya kishujaa: usafishaji usiopitiwa, usiodumu unaojitengua badala ya uwezo thabiti.
- Deni lisiloonekana: njia za mkato ambazo hakuna anayezifuatilia, kwa hiyo ulipaji unaendeshwa na kiasi cha malalamiko badala ya gharama halisi.
- Kuchezea vipimo vya ubora: kufikia lengo la ufikiaji au ugumu huku ubora halisi unashuka, kwa sababu kipimo kimegeuka lengo.
- Kurekebisha msimbo usio sahihi: kung’arisha moduli thabiti au zinazostaafu huku sehemu moto halisi zikiendelea kukugharimu.
- Urekebishaji usio na mwisho: upangaji upya usiokoma usiosafirisha thamani kamwe, taswira ya kioo ya kutosafisha kamwe.
Kielelezo cha ukomavu
- Ngazi ya 1, Kuanzisha: Urekebishaji wa muundo ni wa papo hapo na wa kuitikia, mara nyingi umechanganywa na badiliko la tabia katika commit moja. Hakuna wavu wa usalama unaoaminika, deni la kiufundi halionekani na halifuatiliwi, na usafishaji hufanyika tu katika milipuko ya mara kwa mara ya kishujaa au hakuna kabisa.
- Ngazi ya 2, Kuendeleza: Baadhi ya timu hutenganisha urekebishaji wa muundo na badiliko la tabia na kutegemea majaribio pale yaliyopo, na urekebishaji uliotajwa na majaribio ya kubainisha tabia yanaonekana katika mifuko. Mazoea hayana uthabiti kuvuka timu, deni linajadiliwa na wakati mwingine linaandikwa, na ulipaji hushindana kwa papo hapo dhidi ya vipengele na kwa kawaida hushindwa.
- Ngazi ya 3, Kusawazisha: Nidhamu ya kofia mbili, majaribio ya kubainisha tabia kwa msimbo wa urithi, na urekebishaji mdogo uliotajwa vimeandikwa na kutarajiwa shirika zima. Deni linafuatiliwa katika rejista ya pamoja inayotenganisha mtaji na riba, na uwezo uliolindwa wa ulipaji unapangwa kila mzunguko na kutekelezwa kwenye mapitio.
- Ngazi ya 4, Kusimamia: Deni na usafishaji vinapimwa na kudhibitiwa kwa data dhidi ya vipimo vya msingi. Unafuatilia marudio ya mabadiliko na ugumu kupata sehemu moto, unatazama kiwango cha kushindwa kwa mabadiliko na muda wa kuongoza wa mabadiliko katika maeneo yaliyorekebishwa, na unarekodi riba ambayo kila kipengee muhimu kinagharimu, kwa hiyo maamuzi ya ulipaji yanasimama kwenye ushahidi na maamuzi ya kuua-au-kuwekeza hufanywa kwa mielekeo badala ya kiasi cha malalamiko. Ishara za ubora zinafahamisha uwekezaji bila kufungwa kwenye malango ambayo watu wanaweza kuyachezea.
- Ngazi ya 5, Kuratibu: Deni linasimamiwa kama jalada linalosawazishwa upya mfululizo lililounganishwa na upangaji wa bidhaa na matengenezo kuvuka shirika zima. Badiliko la kimuundo hutumia mtini wa kunyonga na tawi kwa uondoaji wa maelezo yaliyoratibiwa kuvuka timu kwa kawaida, ulipaji ni endelevu na umelinganishwa na mahali mabadiliko yanapokuwa ya mara kwa mara na yenye maumivu, na mazoea hubadilika mfumo na picha yake ya hatari vinapohama, kwa hiyo msimbo wa muda mrefu unabaki unaoweza kubadilishwa kwa miongo.
Mawazo ya kujadili
- Kanuni halisi, inayotekelezwa ya timu yenu ya kuweka urekebishaji wa muundo tofauti na badiliko la tabia ni ipi, na inavunjikia wapi chini ya shinikizo la tarehe ya mwisho?
- Mnaamuaje, kwa ushahidi, msimbo upi unastahili usafishaji na upi ni bora kuachwa?
- Majaribio ya kubainisha tabia yangekuruhusu wapi kurekebisha kwa usalama eneo la urithi mnaloliepuka sasa?
- Kwa uboreshaji wenu mkuu unaofuata, mbinu ya mtini wa kunyonga ingeonekanaje, na uso au uondoaji gani wa maelezo ungeuleta kwanza?
- Nani anamiliki rejista ya deni la kiufundi, na ulipaji unashinda vipi uwezo dhidi ya kazi ya vipengele?
Mambo muhimu ya kukumbuka
- Urekebishaji wa muundo huhifadhi tabia; uweke tofauti kabisa na badiliko la tabia, katika commit tofauti.
- Safu ya majaribio inayoaminika ni sharti la awali la urekebishaji salama wa muundo, na majaribio ya kubainisha tabia yanaipa msimbo wa urithi moja.
- Fanya kazi kwa hatua ndogo, zilizotajwa, zinazotenguka, pendelea usafishaji wa fursa, na utumie mtini wa kunyonga au tawi kwa uondoaji wa maelezo kwa badiliko kubwa la kimuundo.
- Fanya deni la kiufundi lionekane, tenganisha mtaji na riba, na ufadhili ulipaji kama uwezo thabiti badala ya ushujaa.
- Pima ubora wa ndani uongoze busara, kamwe usiwe lengo la kuchezewa, na usirekebishe msimbo ulio thabiti au unaopangiwa kustaafu.
Marejeo na usomaji zaidi
- Martin Fowler, Refactoring: Improving the Design of Existing Code, second edition
- Michael Feathers, Working Effectively with Legacy Code
- Ward Cunningham, The WyCash Portfolio Management System (OOPSLA 1992 experience report, origin of the debt metaphor)
- Martin Fowler, “TechnicalDebtQuadrant” and “StranglerFigApplication” (martinfowler.com)
- Kent Beck, Tidy First? A Personal Exercise in Empirical Software Design
- Steve McConnell, Code Complete: A Practical Handbook of Software Construction
- Robert C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship