Programinės įrangos kūrimo gyvavimo ciklas: naudingas vadovas

1. Įvadas
Kai pradėjau kurti savo augintinių projektus, turėjau problemų dėl nuoseklios sistemos, kuri galėtų padėti gauti išsamų nuoseklų vadovą, kaip įgyvendinti projektą iš idėjos.
Tada susipažinau su programinės įrangos kūrimo gyvavimo ciklu (SDLC) ir pradėjau diegti savo praktikas. Mano pagrindinė kalba yra Python, ir aš jums papasakosiu tikslią darbo eigą, kaip paprastai kuriu programas šia kalba.
SDLC yra labai svarbus kuriant sėkmingą programinę įrangą. Jame pateikiamas aiškus kiekvieno žingsnio planas ir struktūra, padedanti komandoms išlikti organizuotai. Kai pradėsite sekti SDLC, pažadu, kad jūsų projektai taps visiškai neatpažįstami.
Tam reikia kelių žingsnių, kuriuos reikia atlikti, ir iškart pereikime prie jų:
Esu labiau praktiškas nei teorinis žmogus ir siūlyčiau sukurti aplikaciją apie praktiką taikant SDLC principus.
2. Programos apžvalga
Mes sukursime a „Receptų patarėjas” programa, kuri siūlo receptus pagal vartotojų turimus ingredientus.
Kad šis straipsnis nebūtų pernelyg slegiantis, sukurkime paprastą CLI versiją ir galėsite įdiegti backend ir frontend atlikdami visiškai tuos pačius veiksmus ir SDLC metodą, aprašytą šiame straipsnyje.
3. Planavimas
Planavimo etape daugiausia dėmesio skiriama Reikalavimai rinkimui ir Įvertinimų nustatymas.
3.1 Surinkimo reikalavimai:
- Vartotojai turi įvesti turimus ingredientus.
- Paraiškoje turėtų būti pasiūlyti receptai, kuriuos galima pagaminti iš šių ingredientų.
- Vartotojai turėtų turėti galimybę peržiūrėti išsamią recepto informaciją, įskaitant ingredientus ir instrukcijas.
SVARBU: Kūrėjas turi apibrėžti tikslius ir gerai aprašytus reikalavimus. Labai svarbu suprasti reikalingas funkcijas ir tai, kaip vartotojai sąveikaus su programa. Būkite kuo konkretesni!
3.2 Įvertinimų nustatymas:
Nustatant sąmatą siūlyčiau suskirstyti didelę problemą į mažesnes dalis ir išanalizuoti, kiek laiko užtruks kiekviena nedidelė problema. Nebūkite per griežti ir skirkite savo komandai keletą papildomų dienų tobulėjimui. Retas atvejis, kai programinės įrangos kūrime viskas vyksta pagal planą 😉.
- Kūrimo laikas: 2 savaitės.
- Bandymo laikas: 3 dienos.
4. Dizainas
Projektavimo etapas yra vienas iš sudėtingiausių SDLC aspektų. Kūrėjai turėtų suprasti, kad kiekvienas šiame etape priimtas sprendimas gali reikšmingai paveikti projekto sėkmę. Jame yra šie veiksmai:
- Aukšto lygio dizainas (Architektūros sistema):
- Žemo lygio dizainas (Išsami komponento ir modulio informacija):
- Vartotojo srautas (Kaip vartotojas sąveikauja su programa)
4.1 Aukšto lygio dizainas
Paprastai tokiu atveju sukuriate architektūros schemą ir vadovaukitės kontroliniu sąrašu, kurį galite pamatyti toliau esančioje ekrano kopijoje:
Šis kontrolinis sąrašas gali skirtis priklausomai nuo naudojamų technologijų. Tačiau paprastai tai yra abstraktiausias vaizdas, kuris gali būti taikomas daugumai projektų.
Mūsų programai mums reikės šių dalykų:
- Scenarijus su ingredientų įvedimo funkcijomis, receptų pasiūlymais ir išsamios recepto informacijos rodymo funkcijomis.
- Paprasta receptų duomenų bazė (žodynas).
4.2 Žemo lygio dizainas:
Suskirstykite projektą į aiškius modulius arba komponentus pagal funkcionalumą. Šiam etapui reikia:
- Projekto struktūra.
- Funkcijos:
input_ingredients
,suggest_recipes
,view_recipe_details
.
- Duomenų saugykla:
Dictionary
receptams ir jų detalėms saugoti.
Paprastumo dėlei aš sukūriau tokią struktūrą:
recipe_recommender/
├── utils.py # user input
├── recipes.py # mini-db and logic of suggestion
└── main.py # put it altogether
4.3 Vartotojo srautas
Šis etapas, mano nuomone, yra pats svarbiausias, jūs tiesiog atsiduriate vartotojo vietoje ir galvojate, kaip bendrautumėte su programa. Vartotojams nerūpi nei kodo kokybė, nei pasirinkta programavimo kalba; jie nori turėti paruoštą naudoti produktą!
5. Įgyvendinimas
Šioje dalyje jūs įgyvendinate idėją! Mėgstamiausia programuotojų dalis. Mano rekomendacija bus diegiant vadovautis geriausia programinės įrangos inžinerijos pasaulyje žinoma praktika.
# utils.py
def input_ingredients():
ingredients = input("Enter your available ingredients, separated by commas: ").lower().split(", ")
return ingredients
# recipes.py
recipes = {
"Pasta Salad": {
"ingredients": ["pasta", "tomatoes", "olive oil", "salt"],
"instructions": "Boil pasta, chop tomatoes, mix with olive oil and salt. Serve chilled."
},
"Omelette": {
"ingredients": ["eggs", "salt", "pepper", "cheese"],
"instructions": "Beat eggs, add salt and pepper, cook on a skillet, add cheese before folding."
}
}
def suggest_recipes(available_ingredients):
suggested_recipes = []
for recipe, details in recipes.items():
if all(item in available_ingredients for item in details["ingredients"]):
suggested_recipes.append(recipe)
return suggested_recipes
def view_recipe_details(recipe_name):
if recipe_name in recipes:
print(f"\nRecipe for {recipe_name}:")
print("Ingredients:", ", ".join(recipes[recipe_name]["ingredients"]))
print("Instructions:", recipes[recipe_name]["instructions"])
else:
print("Recipe not found.")
# main.py
from recipes import suggest_recipes, view_recipe_details
from utils import input_ingredients
def main():
while True:
print("\nRecipe Recommender Application")
print("1. Input Ingredients")
print("2. Suggest Recipes")
print("3. View Recipe Details")
print("4. Exit")
choice = input("Choose an option: ")
if choice == '1':
available_ingredients = input_ingredients()
print("Ingredients received.")
elif choice == '2':
suggested_recipes = suggest_recipes(available_ingredients)
if suggested_recipes:
print("Recipes you can make:", ", ".join(suggested_recipes))
else:
print("No recipes found with the given ingredients.")
elif choice == '3':
recipe_name = input("Enter the recipe name: ")
view_recipe_details(recipe_name)
elif choice == '4':
break
else:
print("Invalid choice, please try again.")
if __name__ == "__main__":
main()
6. Testavimas
Šios dalies metu jūs PRIVALO rašyti testus kad programa veiktų taip, kaip tikėtasi. Be to, prieš pradedant kurti naujas funkcijas, kiekviena naujos funkcijos dalis turėtų būti išbandyta E2E. Paraiškos turi būti padengtos visų tipų bandymais, įskaitant Vieneto testavimas, Integracijos testavimas ir E2E testavimas.
6.1 Vieneto testavimas
Atskirų funkcijų ir modulių testavimas, siekiant užtikrinti, kad jie tinkamai veiktų atskirai.
import unittest
from recipes import suggest_recipes, view_recipe_details
class TestRecipes(unittest.TestCase):
def setUp(self):
self.available_ingredients = ["pasta", "tomatoes", "olive oil", "salt"]
self.missing_ingredients = ["pasta", "tomatoes"]
def test_suggest_recipes(self):
expected_output = ["Pasta Salad"]
self.assertEqual(suggest_recipes(self.available_ingredients), expected_output)
self.assertEqual(suggest_recipes(self.missing_ingredients), [])
6.2 Integracijos testavimas
Čia norite užtikrinti, kad visa modulių sąveika būtų nuosekli ir veiktų pagal norimą logiką.
class TestRecipeRecommender(unittest.TestCase):
@patch('builtins.input', side_effect=['1', 'eggs, cheese, salt', '2', '3', 'Omelette', '4'])
@patch('sys.stdout', new_callable=StringIO)
def test_full_integration(self, mock_stdout, mock_input):
main.main()
output = mock_stdout.getvalue().strip()
self.assertIn("Ingredients received.", output
self.assertIn("Recipes you can make: Omelette", output)
6.3 E2E testavimas
Paprasčiausia šios darbo eigos dalis – elkitės taip, lyg tiesiog žaistumėte su programa kaip naudotojas, bandantis užtikrinti, kad ji veiktų taip, kaip tikėtasi, arba ją sugadintumėte.
Recipe Recommender Application
1. Input Ingredients
2. Suggest Recipes
3. View Recipe Details
4. Exit
Choose an option: 1
Enter your available ingredients, separated by commas: pasta, tomatoes, olive oil, salt
Ingredients received.
Pabandykite nutraukti programą, nustatyti skausmo taškus ir juos sutvarkyti pertvarkymas/priežiūra etapai. ⬇️
7. Priežiūra
Prieš pradėdami priežiūros dalį, turite įdiegti programą, kad ji būtų prieinama vartotojams. Nesikoncentruosiu į tai, nes tai yra per daug apimti, bet mano asmeninė rekomendacija būtų naudoti tokias paslaugas kaip Heroku / AWS / GCP. Priežiūros dalis taip pat yra labai svarbi; čia atliekame šiuos veiksmus:
7.1 Veikimas ir naudojimas
Paprastai tai tvarko serverio tiekėjai, todėl jums nieko nereikia daryti. Jei jūsų programa veikia blogai, turite arba padidinti serverio išteklius, arba iš naujo įtraukti asinchronines funkcijas. Naudokite profiliavimo priemones, pvz scalene
ir pertvarkyti sudėtingą logiką, kuri valgo jūsų išteklius.
Papildomam stebėjimui būtų malonu nustatyti Grafana ar panašius įrankius.
7.2 Registravimas
Kurdami nepridėjome registravimo, todėl kilo problemų stebint, kaip vartotojai sąveikauja su programa, todėl neįmanoma stebėti galimų klaidų ir klaidų, jei programa sugenda.
Pridėkite šias funkcijas, išbandykite programėlės įtraukimo sąlygas ir užregistruokite kiekvieną svarbią skiltį, kurioje vyksta sąveika:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def log_input(ingredients):
logging.info(f"User input ingredients: {ingredients}")
def log_suggestions(suggestions):
logging.info(f"Suggested recipes: {suggestions}")
def log_error(error_message):
logging.error(f"Error: {error_message}")
log_input(["pasta", "tomatoes", "olive oil", "salt"])
log_suggestions(["Pasta Salad"])
log_error("Recipe not found.")
Įdiegę tai galėsite pamatyti, ar jūsų programoje kas nors nepavyko. Ištaisykite klaidas ir nedelsdami atsakykite.
7.3 Vartotojų atsiliepimai
Dabar norėtumėte tiesiogiai susisiekti su vartotojais ir paklausti, kas jiems patinka ar nepatinka jūsų programoje. Paprašykite žmonių pateikti atsiliepimų, kaip sukūrėte jiems šią programinę įrangą. Norite sužinoti, kokias funkcijas žmonės nori įdiegti. Ir kaip pagerinti jų bendrą patirtį naudojant programą.
Tarkime, kad turime tokį prašymą:
Sveiki!
Man labai patinka jūsų programa! Norėčiau turėti galimybę įtraukti savo receptus į duomenų bazę ir įtraukti juos į pasiūlymus!
Geriausi linkėjimai!
Gerai, jūsų noras yra mūsų įsakymas! Pradėkime plėtrą! O kadangi jau esame profesionalai, stebėsime programinės įrangos kūrimo gyvavimo ciklą! Planning -> Design -> Implementation -> Testing -> Maintenance -> Improvements
8. Išvada
Labai ačiū už dėmesį. Tikiuosi, kad turite bendrą idėją sukurti aukštos kokybės programinę įrangą. Kaip jau buvo minėta anksčiau, nusprendžiau supaprastinti programą, kad būtų skaitomas straipsnis.
Sudėtingesnėms programoms reikia planuoti aukšto lygio komponentų architektūrą. Pavyzdžiui, kaip FE ir BE sąveikauja tarpusavyje, duomenų bazės struktūra, diegimo vamzdynai ir, žinoma, sudėtingesnis vartotojų srautas.
Išbandykite šiame straipsnyje aprašytą SDLC metodą, bet būkite labai atsargūs, nes tai gali sukelti aukštos kokybės programinę įrangą 🙂. Sėkmės!