Hadithi ya uchapishaji ambayo iliathiri kila kitu

Hadithi ya uchapishaji ambayo iliathiri kila kitu
Maadui wa Ukweli kwa 12f-2

Mwishoni mwa Aprili, wakati White Walkers walipokuwa wakizingira Winterfell, jambo la kupendeza zaidi lilifanyika kwetu; tulifanya uchapishaji usio wa kawaida. Kimsingi, tunasambaza vipengele vipya kila mara katika toleo la umma (kama kila mtu mwingine). Lakini hii ilikuwa tofauti. Ukubwa wake ulikuwa kwamba makosa yoyote ambayo tunaweza kufanya yangeathiri huduma na watumiaji wetu wote. Kwa hivyo, tulitoa kila kitu kulingana na mpango, ndani ya muda uliopangwa na uliotangazwa, bila matokeo ya mauzo. Nakala hiyo ni juu ya jinsi tulivyofanikisha hili na jinsi mtu yeyote anaweza kurudia nyumbani.

Sitaelezea sasa maamuzi ya usanifu na kiufundi tuliyofanya au kuelezea jinsi yote yanavyofanya kazi. Haya ni madokezo kwenye pambizo kuhusu jinsi mojawapo ya uchapishaji mgumu zaidi ulifanyika, ambayo niliona na ambayo nilihusika moja kwa moja. Sidai ukamilifu au maelezo ya kiufundi; labda yataonekana katika nakala nyingine.

Asili + ni aina gani ya utendakazi huu?

Tunaunda jukwaa la wingu Mail.ru Cloud Solutions (MCS), ambapo ninafanya kazi kama mkurugenzi wa kiufundi. Na sasa ni wakati wa kuongeza IAM (Udhibiti wa Utambulisho na Ufikiaji) kwenye jukwaa letu, ambalo hutoa usimamizi wa pamoja wa akaunti zote za watumiaji, watumiaji, nenosiri, majukumu, huduma na zaidi. Kwa nini inahitajika katika wingu ni swali la wazi: habari zote za mtumiaji zimehifadhiwa ndani yake.

Kawaida vitu kama hivyo huanza kujengwa mwanzoni mwa miradi yoyote. Lakini kihistoria mambo yamekuwa tofauti kidogo katika MCS. MCS ilijengwa katika sehemu mbili:

  • Openstack na moduli yake ya idhini ya Keystone,
  • Hotbox (S3 kuhifadhi) kulingana na mradi wa Wingu la Mail.ru,

ambapo huduma mpya zilionekana.

Kimsingi, hizi zilikuwa aina mbili tofauti za idhini. Zaidi ya hayo, tulitumia baadhi ya maendeleo tofauti ya Mail.ru, kwa mfano, hifadhi ya jumla ya nenosiri la Mail.ru, pamoja na kiunganishi cha openid kilichoandikwa kibinafsi, shukrani ambayo SSO (uidhinishaji wa mwisho hadi mwisho) ulitolewa kwenye paneli ya Horizon. ya mashine pepe (OpenStack UI asilia).

Kututengenezea IAM kulimaanisha kuunganisha yote kwenye mfumo mmoja, wetu wenyewe kabisa. Wakati huo huo, hatutapoteza utendakazi wowote njiani, lakini tutaunda msingi wa siku zijazo ambao utaturuhusu kuiboresha kwa uwazi bila kuibadilisha na kuipanga kwa suala la utendakazi. Pia mwanzoni, watumiaji walikuwa na kielelezo cha kuigwa cha upatikanaji wa huduma (RBAC ya kati, udhibiti wa ufikiaji unaotegemea dhima) na mambo mengine madogo.

Kazi hiyo iligeuka kuwa isiyo ya kawaida: python na perl, backends kadhaa, huduma zilizoandikwa kwa kujitegemea, timu kadhaa za maendeleo na wasimamizi. Na muhimu zaidi, kuna maelfu ya watumiaji wa moja kwa moja kwenye mfumo wa uzalishaji wa kupambana. Haya yote yalipaswa kuandikwa na, muhimu zaidi, kutekelezwa bila majeruhi.

Je, tutafanya nini?

Ili kuiweka takribani, katika takriban miezi 4 tulitayarisha yafuatayo:

  • Tuliunda damoni kadhaa mpya ambazo zilijumlisha utendakazi ambazo hapo awali zilifanya kazi katika sehemu tofauti za miundombinu. Huduma zingine zote ziliamriwa mwelekeo mpya katika mfumo wa pepo hawa.
  • Tuliandika uhifadhi wetu wa kati wa manenosiri na funguo, zinazopatikana kwa huduma zetu zote, ambazo zinaweza kurekebishwa bila malipo tunapohitaji.
  • Tuliandika maandishi 4 mapya ya Keystone kutoka mwanzo (watumiaji, miradi, majukumu, majukumu), ambayo, kwa kweli, ilibadilisha hifadhidata yake, na sasa inafanya kazi kama hazina moja ya nywila zetu za watumiaji.
  • Tulifundisha huduma zetu zote za Openstack kwenda kwa huduma ya sera za watu wengine kwa ajili ya sera zao badala ya kusoma sera hizi ndani ya nchi kutoka kwa kila seva (ndiyo, hivyo ndivyo Openstack hufanya kazi kwa chaguomsingi!)

Rework kubwa kama hiyo inahitaji kubwa, ngumu na, muhimu zaidi, mabadiliko ya synchronous katika mifumo kadhaa iliyoandikwa na timu tofauti za maendeleo. Mara baada ya kukusanyika, mfumo mzima unapaswa kufanya kazi.

Jinsi ya kutekeleza mabadiliko kama haya na sio kuifuta? Kwanza tuliamua kuangalia kidogo katika siku zijazo.

Mkakati wa usambazaji

  • Itawezekana kusambaza bidhaa katika hatua kadhaa, lakini hii ingeongeza muda wa maendeleo kwa mara tatu. Kwa kuongezea, kwa muda fulani tungekuwa na utenganishaji kamili wa data katika hifadhidata. Utalazimika kuandika zana zako za kusawazisha na kuishi na duka nyingi za data kwa muda mrefu. Na hii inajenga aina mbalimbali za hatari.
  • Kila kitu ambacho kinaweza kutayarishwa kwa uwazi kwa mtumiaji kilifanyika mapema. Ilichukua miezi 2.
  • Tulijiruhusu muda wa kupumzika kwa saa kadhaa - kwa shughuli za mtumiaji tu kuunda na kubadilisha rasilimali.
  • Kwa uendeshaji wa rasilimali zote zilizoundwa tayari, muda wa chini haukubaliki. Tulipanga kwamba wakati wa uchapishaji, rasilimali zinafaa kufanya kazi bila wakati na kuathiri kwa wateja.
  • Ili kupunguza athari kwa wateja wetu ikiwa hitilafu itatokea, tuliamua kusambaza Jumapili jioni. Wateja wachache hudhibiti mashine pepe wakati wa usiku.
  • Tuliwaonya wateja wetu wote kwamba katika kipindi kilichochaguliwa kwa usambazaji, usimamizi wa huduma hautapatikana.

Kichepuo: uchapishaji ni nini?

Kila mtaalamu wa IT anaweza kujibu kwa urahisi uchapishaji ni nini. Unasakinisha CI/CD, na kila kitu kinatolewa kiotomatiki kwenye duka. πŸ™‚

Bila shaka hii ni kweli. Lakini ugumu ni kwamba kwa zana za kisasa za utoaji wa msimbo wa kiotomatiki, uelewa wa uchapishaji yenyewe umepotea. Jinsi unavyosahau kuhusu epicness ya uvumbuzi wa gurudumu wakati wa kuangalia usafiri wa kisasa. Kila kitu ni kiotomatiki hivi kwamba uchapishaji mara nyingi hufanywa bila kuelewa picha nzima.

Na picha nzima iko hivi. Usambazaji una vipengele vinne muhimu:

  1. Uwasilishaji wa nambari, pamoja na urekebishaji wa data. Kwa mfano, uhamiaji wao.
  2. Urejeshaji wa msimbo ni uwezo wa kurudi nyuma ikiwa kitu kitaenda vibaya. Kwa mfano, kwa kuunda chelezo.
  3. Muda wa kila operesheni ya kusambaza/kurejesha. Unahitaji kuelewa muda wa operesheni yoyote ya pointi mbili za kwanza.
  4. Utendaji ulioathiriwa. Inahitajika kutathmini athari chanya na hasi zinazowezekana.

Ni lazima vipengele hivi vyote vizingatiwe ili uchapishaji ufanikiwe. Kawaida ni ya kwanza tu, au bora ya pili, inatathminiwa, na kisha uchapishaji unachukuliwa kuwa umefaulu. Lakini ya tatu na ya nne ni muhimu zaidi. Ni mtumiaji gani angependa ikiwa uchapishaji utachukua saa 3 badala ya dakika? Au ikiwa jambo lisilo la lazima litaathiriwa wakati wa uchapishaji? Au kupunguka kwa huduma moja kutasababisha matokeo yasiyotabirika?

Sheria ya 1..n, maandalizi ya kutolewa

Mwanzoni nilifikiria kuelezea kwa ufupi mikutano yetu: timu nzima, sehemu zake, milundo ya mijadala kwenye maeneo ya kahawa, mabishano, majaribio, mijadala. Kisha nilifikiri itakuwa si lazima. Miezi minne ya maendeleo daima inajumuisha hili, hasa wakati huandiki kitu ambacho kinaweza kutolewa kila mara, lakini kipengele kimoja kikubwa cha mfumo wa kuishi. Ambayo inaathiri huduma zote, lakini hakuna kitu kinachopaswa kubadilika kwa watumiaji isipokuwa "kitufe kimoja kwenye kiolesura cha wavuti."

Uelewa wetu wa jinsi ya kuzindua ulibadilika kutoka kwa kila mkutano mpya, na kwa kiasi kikubwa. Kwa mfano, tungeenda kusasisha hifadhidata yetu yote ya malipo. Lakini tulihesabu muda na kugundua kuwa haikuwezekana kufanya hivi kwa wakati unaofaa wa uchapishaji. Ilituchukua takriban wiki moja zaidi kugawa na kuhifadhi hifadhidata ya bili kwenye kumbukumbu. Na wakati kasi ya uchapishaji inayotarajiwa bado haikuwa ya kuridhisha, tuliagiza maunzi ya ziada, yenye nguvu zaidi, ambapo msingi wote uliburutwa. Sio kwamba hatukutaka kufanya hivi mapema, lakini hitaji la sasa la kusambaza lilituacha bila chaguo.

Wakati mmoja wetu alikuwa na shaka kuwa uchapishaji unaweza kuathiri upatikanaji wa mashine zetu za mtandaoni, tulitumia wiki moja kufanya majaribio, majaribio, uchanganuzi wa kanuni na tukapata uelewa wa wazi kuwa hili halingefanyika katika utayarishaji wetu, na hata watu wenye shaka zaidi walikubali. na hii.

Wakati huo huo, wavulana kutoka kwa usaidizi wa kiufundi walifanya majaribio yao ya kujitegemea ili kuandika maagizo kwa wateja juu ya njia za uunganisho, ambazo zilipaswa kubadilika baada ya kusambaza. Walifanya kazi kwa UX ya mtumiaji, walitayarisha maagizo na kutoa mashauriano ya kibinafsi.

Tuliendesha shughuli zote za uchapishaji kiotomatiki ambazo ziliwezekana. Kila operesheni iliandikwa, hata rahisi zaidi, na vipimo viliendeshwa kila wakati. Walibishana kuhusu njia bora ya kuzima huduma - acha daemoni au uzuie ufikiaji wa huduma kwa ngome. Tuliunda orodha hakiki ya timu kwa kila hatua ya uchapishaji na kuisasisha kila mara. Tulichora na kusasisha chati ya Gantt kila mara kwa kazi zote za uchapishaji, kwa kutumia muda.

Na hivyo…

Kitendo cha mwisho, kabla ya kuanza

... ni wakati wa kuzindua.

Kama wanasema, kazi ya sanaa haiwezi kukamilika, imekamilika tu kuifanyia kazi. Unapaswa kufanya jitihada za mapenzi, kuelewa kwamba huwezi kupata kila kitu, lakini ukiamini kwamba umefanya mawazo yote ya busara, yaliyotolewa kwa kesi zote zinazowezekana, kufungwa kwa mende zote muhimu, na washiriki wote walifanya kila kitu walichoweza. Kadiri unavyotoa nambari zaidi, ni ngumu zaidi kujihakikishia hii (zaidi ya hayo, kila mtu anaelewa kuwa haiwezekani kutabiri kila kitu).

Tuliamua kuwa tuko tayari kusambaza tuliposhawishika kuwa tumefanya kila tuwezalo ili kufidia hatari zote kwa watumiaji wetu zinazohusiana na athari zisizotarajiwa na nyakati zisizotarajiwa. Hiyo ni, chochote kinaweza kwenda vibaya isipokuwa:

  1. Kuathiri (takatifu kwetu, ya thamani zaidi) miundombinu ya mtumiaji,
  2. Utendakazi: matumizi ya huduma yetu baada ya uchapishaji yanapaswa kuwa sawa na hapo awali.

Inaendelea nje

Hadithi ya uchapishaji ambayo iliathiri kila kitu
Roll mbili, 8 usiingilie

Tunapunguza muda kwa maombi yote kutoka kwa watumiaji kwa saa 7. Kwa wakati huu, tuna mpango wa uchapishaji na mpango wa kurejesha.

  • Utoaji wenyewe huchukua takriban saa 3.
  • Saa 2 kwa majaribio.
  • Saa 2 - hifadhi kwa urejeshaji iwezekanavyo wa mabadiliko.

Chati ya Gantt imechorwa kwa kila hatua, inachukua muda gani, nini kinatokea kwa mfuatano, nini kinafanywa kwa sambamba.

Hadithi ya uchapishaji ambayo iliathiri kila kitu
Kipande cha chati ya uchapishaji ya Gantt, mojawapo ya matoleo ya awali (bila kutekeleza sambamba). Zana ya Thamani Zaidi ya Usawazishaji

Washiriki wote wana jukumu lao katika uchapishaji kubainishwa, ni kazi gani wanafanya, na wanawajibika kufanya nini. Tunajaribu kuleta kila hatua kwenye hali ya kiotomatiki, kuikunja, kuirudisha nyuma, kukusanya maoni na kuisambaza tena.

Mambo ya nyakati ya matukio

Kwa hiyo, watu 15 walikuja kazini Jumapili, Aprili 29, saa 10 jioni. Mbali na washiriki muhimu, wengine walikuja tu kusaidia timu, ambayo shukrani maalum kwao.

Pia ni muhimu kutaja kwamba tester yetu muhimu iko likizo. Haiwezekani kusambaza bila majaribio, tunachunguza chaguzi. Mwenzetu anakubali kutujaribu kutoka likizo, ambayo anapokea shukrani kubwa kutoka kwa timu nzima.

00:00. Acha
Tunasimamisha maombi ya mtumiaji, weka ishara inayosema kazi ya kiufundi. Ufuatiliaji hupiga kelele, lakini kila kitu ni cha kawaida. Tunaangalia kwamba hakuna kitu kilichoanguka zaidi ya kile kilichopaswa kuanguka. Na tunaanza kazi ya uhamiaji.

Kila mtu ana mpango wa uchapishaji uliochapishwa hatua kwa hatua, kila mtu anajua ni nani anafanya nini na kwa wakati gani. Baada ya kila hatua, tunaangalia muda ili kuhakikisha hatuzizidi, na kila kitu kinakwenda kulingana na mpango. Wale ambao hawashiriki katika uchapishaji moja kwa moja katika hatua ya sasa wanajiandaa kwa kuzindua toy ya mtandaoni (Xonotic, aina ya 3 quacks) ili wasisumbue wenzao. πŸ™‚

02:00. Imetolewa
Mshangao mzuri - tunamaliza uchapishaji saa moja mapema, kwa sababu ya uboreshaji wa hifadhidata zetu na hati za uhamiaji. Sauti ya jumla, "imetolewa!" Vitendaji vyote vipya viko katika toleo la umma, lakini hadi sasa ni sisi pekee tunaweza kuziona kwenye kiolesura. Kila mtu huenda katika hali ya majaribio, kuzipanga katika vikundi, na kuanza kuona kilichotokea mwishoni.

Haikutokea vizuri sana, tunatambua hili baada ya dakika 10, wakati hakuna kitu kilichounganishwa au kufanya kazi katika miradi ya wanachama wa timu. Usawazishaji wa haraka, tunatoa sauti matatizo yetu, kuweka vipaumbele, kushiriki katika timu na kuingia katika utatuzi.

02:30. Matatizo makubwa mawili vs macho manne
Tunapata shida mbili kubwa. Tuligundua kuwa wateja hawataona baadhi ya huduma zilizounganishwa, na matatizo yangetokea kwenye akaunti za washirika. Zote mbili ni kwa sababu ya hati kamilifu za uhamiaji kwa visa vingine vya makali. Tunahitaji kurekebisha sasa.

Tunaandika maswali ambayo yanarekodi hii, kwa angalau macho 4. Tunazijaribu wakati wa utayarishaji wa awali ili kuhakikisha zinafanya kazi na hazivunji chochote. Unaweza kuendelea. Wakati huo huo, tunaendesha jaribio letu la kawaida la ujumuishaji, ambalo hufichua masuala machache zaidi. Wote ni ndogo, lakini pia wanahitaji kutengenezwa.

03:00. -2 matatizo +2 matatizo
Shida mbili kubwa za hapo awali zimerekebishwa, na karibu zote ndogo pia. Wale wote ambao hawana kazi katika urekebishaji wanafanya kazi kwa bidii katika akaunti zao na kuripoti kile wanachopata. Tunaweka kipaumbele, tunasambaza kati ya timu, na kuacha bidhaa zisizo muhimu kwa asubuhi.

Tunaendesha vipimo tena, wanagundua matatizo mawili mapya makubwa. Sio sera zote za huduma zilizofika kwa usahihi, kwa hivyo maombi mengine ya watumiaji hayapitishi idhini. Pamoja na tatizo jipya la akaunti za washirika. Hebu tukimbilie kuangalia.

03:20. Usawazishaji wa dharura
Toleo moja jipya limerekebishwa. Kwa pili, tunapanga usawazishaji wa dharura. Tunaelewa kinachotokea: kurekebisha hapo awali kulirekebisha shida moja, lakini ikaunda nyingine. Tunachukua mapumziko ili kujua jinsi ya kuifanya kwa usahihi na bila matokeo.

03:30. Macho sita
Tunaelewa hali ya mwisho ya msingi inapaswa kuwa ili kila kitu kiende vizuri kwa washirika wote. Tunaandika ombi kwa macho 6, toa nje katika utayarishaji wa awali, ujaribu, uondoe kwa ajili ya uzalishaji.

04:00. Kila kitu kinafanya kazi
Vipimo vyote vimepita, hakuna matatizo muhimu yanayoonekana. Mara kwa mara, kitu katika timu haifanyi kazi kwa mtu, tunaitikia mara moja. Mara nyingi kengele ni ya uwongo. Lakini wakati mwingine kitu haifiki, au ukurasa tofauti haufanyi kazi. Tunakaa, kurekebisha, kurekebisha, kurekebisha. Timu tofauti inazindua kipengele kikubwa cha mwisho - malipo.

04:30. Pointi ya kutorudishwa
Hatua ya kutorudi inakaribia, yaani, wakati ambapo, tukianza kurudi nyuma, hatutafikia wakati wa kupumzika tuliopewa. Kuna matatizo na bili, ambayo inajua na kurekodi kila kitu, lakini kwa ukaidi inakataa kufuta pesa kutoka kwa wateja. Kuna hitilafu kadhaa kwenye kurasa za kibinafsi, vitendo, na hali. Utendaji kuu hufanya kazi, vipimo vyote hupita kwa mafanikio. Tunaamua kuwa uchapishaji umefanyika, hatutarudi nyuma.

06:00. Fungua kwa kila mtu katika UI
Hitilafu zimerekebishwa. Baadhi ambayo haiwavutii watumiaji huachwa kwa ajili ya baadaye. Tunafungua interface kwa kila mtu. Tunaendelea kufanyia kazi utozaji, tukisubiri maoni ya mtumiaji na matokeo ya ufuatiliaji.

07:00. Matatizo na upakiaji wa API
Inakuwa wazi kuwa tulipanga vibaya kidogo mzigo kwenye API yetu na tukajaribu mzigo huu, ambao haukuweza kutambua shida. Kwa hivyo, β‰ˆ5% ya maombi hayakufaulu. Hebu tuhamasishe na tutafute sababu.

Malipo ni mkaidi na hataki kufanya kazi pia. Tunaamua kuiahirisha hadi baadaye ili kutekeleza mabadiliko kwa utulivu. Hiyo ni, rasilimali zote zinakusanywa ndani yake, lakini kufuta kutoka kwa wateja haipiti. Bila shaka, hili ni tatizo, lakini ikilinganishwa na utoaji wa jumla inaonekana sio muhimu.

08:00. Rekebisha API
Tulitengeneza kurekebisha kwa mzigo, mapungufu yalikwenda. Tunaanza kwenda nyumbani.

10:00. Wote
Kila kitu kimewekwa. Ni kimya katika ufuatiliaji na mahali pa wateja, timu hulala polepole. Bili inabaki, tutairejesha kesho.

Kisha wakati wa mchana kulikuwa na uchapishaji ambao ulirekebisha kumbukumbu, arifa, kurejesha misimbo na ubinafsishaji kwa baadhi ya wateja wetu.

Kwa hivyo, uchapishaji ulifanikiwa! Inaweza, bila shaka, kuwa bora zaidi, lakini tulifanya hitimisho kuhusu kile ambacho haitoshi kwetu kufikia ukamilifu.

Katika jumla ya

Katika kipindi cha miezi 2 ya maandalizi amilifu ya uchapishaji, kazi 43 zilikamilishwa, zilizochukua kutoka saa kadhaa hadi siku kadhaa.

Wakati wa kusambaza:

  • pepo mpya na zilizobadilishwa - vipande 5, kuchukua nafasi ya monoliths 2;
  • mabadiliko ndani ya hifadhidata - hifadhidata zetu zote 6 zilizo na data ya mtumiaji zimeathiriwa, upakuaji umefanywa kutoka hifadhidata tatu za zamani hadi moja mpya;
  • sura ya mbele iliyorekebishwa kabisa;
  • kiasi cha msimbo uliopakuliwa - mistari elfu 33 ya kanuni mpya, β‰ˆ mistari elfu 3 ya kanuni katika vipimo, β‰ˆ mistari elfu 5 ya msimbo wa uhamiaji;
  • data yote ni shwari, hakuna mashine pepe ya mteja hata moja iliyoharibika. πŸ™‚

Mbinu nzuri za uchapishaji mzuri

Walituongoza katika hali hii ngumu. Lakini, kwa ujumla, ni muhimu kuzifuata wakati wa uchapishaji wowote. Lakini jinsi uchapishaji unavyokuwa mgumu zaidi, ndivyo wanavyochukua jukumu kubwa zaidi.

  1. Jambo la kwanza unahitaji kufanya ni kuelewa jinsi uchapishaji unaweza au utaathiri watumiaji. Kutakuwa na wakati wa kupumzika? Ikiwa ndivyo, ni wakati gani wa kupumzika? Je, hii itaathiri vipi watumiaji? Je, ni hali gani zinazowezekana bora na mbaya zaidi? Na kufunika hatari.
  2. Panga kila kitu. Katika kila hatua, unahitaji kuelewa vipengele vyote vya uchapishaji:
    • utoaji wa kanuni;
    • kurejesha kanuni;
    • wakati wa kila operesheni;
    • utendaji ulioathiriwa.
  3. Cheza matukio hadi hatua zote za uchapishaji, pamoja na hatari katika kila mojawapo, ziwe dhahiri. Ikiwa una mashaka yoyote, unaweza kuchukua mapumziko na kuchunguza hatua ya shaka tofauti.
  4. Kila hatua inaweza na inapaswa kuboreshwa ikiwa inawasaidia watumiaji wetu. Kwa mfano, itapunguza wakati wa kupumzika au kuondoa hatari fulani.
  5. Jaribio la kurudi nyuma ni muhimu zaidi kuliko jaribio la uwasilishaji wa nambari. Inahitajika kuangalia kuwa kama matokeo ya kurudisha nyuma mfumo utarudi katika hali yake ya asili, na uthibitishe hii na vipimo.
  6. Kila kitu ambacho kinaweza kuwa kiotomatiki kinapaswa kuwa kiotomatiki. Kila kitu ambacho hawezi kuwa automatiska kinapaswa kuandikwa mapema kwenye karatasi ya kudanganya.
  7. Rekodi kigezo cha mafanikio. Ni utendaji gani unapaswa kupatikana na kwa wakati gani? Ikiwa hii haitatokea, endesha mpango wa kurejesha.
  8. Na muhimu zaidi - watu. Kila mtu anapaswa kufahamu anachofanya, kwa nini na nini kinategemea matendo yao katika mchakato wa uchapishaji.

Na katika sentensi moja, kwa kupanga vizuri na kufafanua unaweza kusambaza chochote unachotaka bila matokeo kwa mauzo. Hata kitu ambacho kitaathiri huduma zako zote katika uzalishaji.

Chanzo: mapenzi.com

Kuongeza maoni