Jak poprawić szkolenie studentów w zakresie konserwacji? [Zamknięte]


18

Utrzymanie jest głównym przedmiotem profesjonalnego rozwoju oprogramowania. Rzeczywiście, konserwacja jest prawie zawsze najdłuższą częścią cyklu życia oprogramowania, ponieważ trwa od wydania projektu aż do końca czasów.

Ponadto projekty będące w konserwacji stanowią znaczną większość ogólnej liczby projektów. Według http://www.vlegaci.com/298/interesting-statistics-%E2%80%93-numbers-of-programmers-in-maintenance-vs-development/ , odsetek projektów będących w utrzymaniu wynosi około 2 / 3.

Ostatnio natknąłem się na to pytanie , gdzie facet wygląda na dość zaskoczonego, odkrywając, że jego praca polega głównie na utrzymaniu. Następnie postanowiłem otworzyć dyskusję (w języku francuskim) na głównej stronie francuskiej społeczności specjalistów od tworzenia oprogramowania ( http://www.developpez.com/ ). Dyskusja jest zatytułowana „Czy studenci są wystarczająco dobrze wyszkoleni do rzeczywistości profesjonalnego tworzenia oprogramowania?” i dotyczy głównie łatwości konserwacji . Zwrócono uwagę, że przynajmniej we Francji ludzie nie są wystarczająco przygotowani, aby stawić czoła alimentów w obu aspektach:

  • zachowaj istniejący kod
  • tworzyć łatwy do utrzymania kod

Moje pytanie znajduje odzwierciedlenie w tej dyskusji i ma na celu znalezienie dobrego sposobu na nauczenie obsługi.

  • Jak możemy uczyć utrzymywalności?
  • Jakie ćwiczenia poleciłbyś?
  • Jeśli jesteś dobrze wyszkolony w zakresie konserwacji, jaki konkretny rodzaj kursów odbyłeś?

[edytuj] Po pewnym nieporozumieniu myślę, że muszę wyjaśnić moje pytanie. Jako lider projektu i programista często pracuję ze stażystami lub świeżo ukońconymi studentami. Kiedyś byłem świeżo po studiach. Chodzi o to, że uczniowie zwykle nie znają zasad takich jak SOLID, które zwiększają łatwość utrzymania projektu. Często mamy poważne trudności z ewolucją projektów (niska konserwowalność). To, czego tu szukam, to konkretny akademicki przykład udanego nauczania o znaczeniu łatwości konserwacji i o tym, jak stworzyć lepszy kod dotyczący tego konkretnego punktu; lub ewentualne sugestie dotyczące poprawy sposobu szkolenia uczniów.



PS: Spójrz na moją odpowiedź, może się okazać, że warto spekulować na spaghetti
dr

@Nupul Ponieważ jesteś nauczycielem i wyglądasz na zaangażowanego w nauczanie obsługi kodu, proszę udzielić pełnej odpowiedzi i powiedz nam, jak postępujesz: kod spaghetti to tylko niewielka jego część
Matthias Jouan

Wysłałem odpowiedź ... mam nadzieję, że doda ci to wartości :)
Dr

Projekt API i projekt konserwacji w „Praktycznym projekcie API” to, IMHO, projekt idealny do nauczenia studentów wyzwań związanych z konserwacją (i kompatybilnością wsteczną).
Marco

Odpowiedzi:


8

Jak możemy uczyć utrzymywalności?

To kwestia praktyki.

Najprostszym sposobem kontrolowania tego, jaki mogę sobie wyobrazić, jest symulacja typowego projektu konserwacji w następujący sposób.

Zdobądź dobrze wykonany projekt ( Projekt A ) i wprowadź kilka problemów: wstrzyknij kilka błędów, porządną dawkę zduplikowanego i martwego kodu, upuść niektóre funkcje, testy jednostkowe i dokumentację tu i tam itp. Możesz nawet mieć dedykowany nazwa tego, na przykład Projekt A - wersja uszkodzona .

Ustanów moduł do śledzenia problemów i wypełnij go żądaniami odpowiadającymi konkretnym wyrządzonym szkodom. Ustanów podstawowe zasady i praktyki dotyczące procesu programowania - zatwierdza VCS, przeglądy kodu, kontrolę jakości itp. - rozważ wzięcie tego, co możesz, z listy kontrolnej podanej w teście Joela .

  • zajęcia 1.
    Napraw błędy, dodaj brakujące testy jednostkowe, dokumentację i funkcje.
  • zajęcia 2.
    Refaktoryzacja.
  • zajęcia 3.
    Utrzymanie / ulepszenie oryginalnych projektów do wykorzystania przez studentów w przyszłym roku
    - Projekt A wersja 2.0 i Projekt A - odpowiednio uszkodzona wersja 2.0 .
    Poprawiając uszkodzoną wersję mam na myśli wyrządzanie jej większych szkód edukacyjnych. :)

Spośród wyżej wymienionych praktyk zwróć szczególną uwagę na przegląd kodu . Jest to prawdopodobnie najskuteczniejszy sposób zapewnienia łatwości utrzymania kodu, jak wskazuje np. Najwyższa odpowiedź w powiązanym pytaniu .

WTF za minutę


11

Oświadczenie: Właśnie dostałem dyplom CS. Nie jestem nauczycielem.

Może się to wydawać oczywiste, ale myślę, że najlepszym sposobem nauczenia obsługi kodu jest umożliwienie uczniom wykonania konserwacji kodu. Oto co bym zrobił:

  1. Weźmy umiarkowanie złożony problem i dwie implementacje, które są semantycznie identyczne, ale jedna jest znacznie łatwiejsza do utrzymania niż druga.
  2. Poproś o wiele zmian / dodatków do funkcji, które są znacznie łatwiejsze do wdrożenia na lepszej podstawie kodu. Jedna połowa uczniów musi je zaimplementować na podstawie kodu, który jest łatwiejszy w utrzymaniu, a druga połowa na mniej konserwowalnym.
  3. W trosce o sprawiedliwość możesz powtórzyć to ćwiczenie z odwróconymi rolami.
  4. Porównaj średnią liczbę pomyślnie zaimplementowanych zmian między dobrym i złym kodem bazowym oraz czas poświęcony na ich wdrożenie. Poproś uczniów, aby podzielili się swoimi doświadczeniami, wyemitowali swoje skargi i po prostu ogólnie mówili o pracy, którą wykonali.

Chodzi o to, aby uczniowie nie tylko pracowali z czyimś kodem, ale także aby docenili kod, który można utrzymać, i który, mam nadzieję, poprawi ich umiejętności projektowe.


+1 za ćwiczenie. Jest to bardzo podobne do czegoś, co chciałem prowadzić od dłuższego czasu; chociaż w mojej wersji uczniowie zapisywali coś do specyfikacji, wówczas ktoś inny (wybrany przeze mnie) mógł ją zmodyfikować. Możesz powtórzyć tę czynność po nauczaniu o łatwości konserwacji i dobrych praktykach, aby wyrazić swoje zdanie.
Andy Hunt

1
Możesz przygotować naprawdę dobry mini-kurs na temat konserwacji w oparciu o rozdział „Zapachy kodowe” w Refaktoryzacji
mjfgates

2

Utrzymanie jest zaletą, a nie umiejętnością. Istnieje wiele ścieżek do tworzenia projektów, które można utrzymać, ale nie ma jednej formuły, która gwarantowałaby ich wykonanie.

Jeśli cenisz cnoty, takie jak życzliwość i hojność, szukasz sposobów, aby praktykować to samo w swoim codziennym życiu. Podobnie jest z konserwowalnością: jeśli Ty i Twoja organizacja cenisz łatwość konserwacji, będziesz mieć to na uwadze podczas projektowania i wdrażania projektu. Będzie to uzasadniony powód, aby poświęcić trochę więcej czasu na budowanie czegoś, ponieważ wiesz, że łatwość konserwacji jest doceniana. I odwrotnie, odradza się poświęcanie dodatkowego czasu ze względu na łatwość utrzymania w organizacji, która go nie docenia.

Jeśli chcesz nauczyć ludzi, jak sprawiać, by utrzymanie było łatwe, powinieneś zacząć od wyjaśnienia, że ​​Twoja organizacja ceni sobie łatwość utrzymania. Określ to w wymaganiach dla swoich projektów. Ustaw to jako jedno z kryteriów pomyślnego przeglądu kodu. Krótko mówiąc, spraw , aby łatwość utrzymania była częścią twojej kultury .

Następnie bądź gotów przeznaczyć trochę zasobów na poprawę konserwacji w istniejących projektach. Zidentyfikuj te części projektu, w których błędy wciąż się pojawiają lub w których naprawianie błędów lub wprowadzanie zmian jest bardzo trudne i zajmuje dużo czasu, a także przeprojektowanie lub refaktoryzacja w celu ułatwienia konserwacji.

Na koniec, indoktrynuj nowych programistów w swoją kulturę łatwości konserwacji , przypisując ich do zespołów, które już to ćwiczą codziennie. Nie ma lepszego sposobu, aby pomóc komuś przyjąć wartość, niż dać mu mnóstwo dobrych przykładów i wskazówek.


1
Trudno mi tutaj zrozumieć głosowanie. Możesz recytować projekt oprogramowania z dowolnej biblii, jak chcesz, ale głównym problemem jest to, że programiści często mają wrażenie, że to nie ma znaczenia, ponieważ nikt nie dba o to, aby zapewnić im lepszą alternatywę od tego, co zrobili . Jeśli nie zaszczepisz uczniom poczucia ważności ciągłego wątpienia w jakość wykonywanej pracy i kwestionowania podejmowanych przez nich decyzji, to naprawdę wątpię, jak bardzo kurs na temat ich konserwacji mógłby się im przydać.
Filip Dupanović

@ FilipDupanović Zgadzam się. Idąc o krok dalej, chociaż ludzie narzekają na brak przygotowania nowych stopni z dyplomami CS, nie sądzę, aby problem był zaskakujący lub unikalny w programowaniu. Oczywiście istnieje różnica między nowym absolwentem a doświadczonym pracownikiem: ktoś ma doświadczenie! Dobry program studiów w dowolnej dziedzinie jest koncepcyjny, a nie zawodowy. Tylko doświadczenie nauczy nowych absolwentów stosowania koncepcji, których się nauczyli, i efektywnej pracy w jakiejkolwiek pracy, w której się znajdą.
Caleb

1

Z jednej strony nie podoba mi się termin Konserwowalny w związku z tworzeniem oprogramowania. Rzeczywistość jest taka, że ​​całe oprogramowanie jest możliwe do utrzymania, ponieważ może podlegać pracom konserwacyjnym, więc prawdziwym problemem jest to, czy oprogramowanie jest drogie, czy niedrogie w utrzymaniu. Wiem, że brzmi to jak pedantyczna wypowiedź na początku odpowiedzi, jednak moja uwaga stanie się bardziej przejrzysta za chwilę.

Problem ze stopniami informatyki, który jest najważniejszy w tworzeniu oprogramowania, polega na tym, że tak naprawdę uczą one studentów tylko najmniejszego minimum, jakie powinni wiedzieć o pisaniu oprogramowania. Umiejętności i wiedzę zawodową zdobywa się poprzez naukę przeprowadzaną w ciągu pierwszych kilku lat pokwalifikacja do stopnia. To wtedy absolwent zaczyna pracę nad projektami, które są tak naprawdę ważne dla klienta, w środowisku, w którym występuje duża presja na wykonanie, a oczekiwaniem jest stworzenie produktu o profesjonalnym standardzie. Niestety wiele firm nie promuje kultury, w której utrzymywane są profesjonalne standardy oprogramowania, co kończy się projektami, których opracowanie i utrzymanie są kosztowne. Na nieszczęście dla naszych absolwentów, uczą się wielu złych nawyków w takich środowiskach we wczesnych latach kariery i może minąć dużo czasu, zanim nauczą się je pokonywać ... jeśli w ogóle.

Lepiej byłoby uczyć uczniów, jak pisać czysty kod i jak identyfikować problemy w oprogramowaniu, które zwykle kończą się długiem technicznym . Zapoznaj się z książkami na temat czyszczenia kodu , refaktoryzacji i rozwoju oprogramowania Lean jako punktu wyjścia jako miejsca rozpoczęcia i naucz uczniów pisania testów jednostkowych przed kodem implementacyjnym, aby zapewnić wysoki stopień pokrycia testowego. Naucz uczniów rozpoznawania powtarzających się i powtarzających się wzorców w kodzie oraz tego, jak zmienić kod w celu usunięcia takiego powielania. Pomóż uczniom zrozumieć i stosować zasady, takie jak SOLID i DRY. Co najważniejsze, porzuć ten pomysł, że zdolność do utrzymywania kodu jest wykonywana wyłącznie w oparciu o projekt i implementację kodu, a zamiast tego zaszczepia od samego początku poczucie kunsztu i jakości w produkcji oprogramowania, starając się dopracuj kod w miarę jego wdrażania, aby zminimalizować wpływ długu technicznego, a tym samym ograniczyć koszty utrzymania oprogramowania do minimum.


Z uwagą przeczytałem twoją odpowiedź, a także twój artykuł o „utrzymywaniu” i muszę powiedzieć, że prawie całkowicie się z tobą zgadzam. Przeczytałem kilka książek, o których wspomniałeś, i używam - lub zmuszam ludzi do korzystania - z zasad takich jak SOLID codziennie w pracy (nie jestem nauczycielem przy okazji). Ale myślę, że twoja odpowiedź jest trochę nie na temat. Przeredaguję moje pytanie, aby wyjaśnić, czego szukam.
Matthias Jouan

1
Masz rację, ale można również powiedzieć, że jeden projekt jest mniej więcej możliwy do utrzymania niż inny. Słowa kończące się na -able lub -ible mogą być absolutne lub względne i wydaje się całkiem jasne, że OP używa ich w sensie względnym.
Caleb

0

Myślę, że najlepszym sposobem na nauczenie się tego rodzaju umiejętności jest przeglądanie kodu i programowanie w parach. Podczas przeglądów kodu doświadczeni pracownicy mogą wskazać, w jaki sposób uczynić kod łatwiejszym w utrzymaniu (zazwyczaj poprzez uczynienie go bardziej czytelnym) i uzasadnić, dlaczego niektóre wybory mogą stworzyć łatwiejszy do utrzymania kod.

Programowanie w parach jest jeszcze lepszym sposobem nauczenia tego rodzaju rzeczy, ponieważ daje mniej doświadczonym pracownikom bezpośrednie doświadczenie w utrzymywaniu kodu z kimś, kto już wie, jak to zrobić dobrze.

Jest też kilka świetnych książek, które możesz przeczytać o pisaniu czystego, łatwego do utrzymania kodu. Przychodzi mi na myśl Clean Code .

Trudno jest zdobyć to doświadczenie w środowisku akademickim, ponieważ studenci rzadko modyfikują duże bazy kodu. Większość tych umiejętności pochodzi z nauki w pracy, a przeglądy kodu i programowanie w parach mogą naprawdę ułatwić tę naukę.


1
Chociaż programowanie w parach jest bardzo dobrym sposobem uczenia się od bardziej wykwalifikowanych programistów, a czytanie książek Roberta C. Martina zdecydowanie zmieniło moje życie, pytanie dotyczyło raczej czysto akademickiego sposobu uczenia się: w jaki sposób studenci mogliby być lepiej przygotowani przed przybyciem do profesjonalny świat tworzenia oprogramowania.
Matthias Jouan

1
-1: @ sugestia suszterpatt brzmi znacznie lepiej.
Jim G.

0

Dobry kod = Mniej konserwacji i łatwe do ulepszenia / dodania funkcji.

Zły kod = koszmar konserwacji

Zasadniczo musimy przekazać uczniom punkty, że „za każdym razem, gdy w projekcie występuje gówniany kod, nowy programista, który dołączy do firmy, ponieważ cierpi pierwotny autor kodu i jak wpłynie na oprogramowanie . ”

Jednym z najlepszych sposobów nauczenia ucznia na temat konserwacji oprogramowania jest pokazanie przykładu zarówno dobrego, jak i złego kodu i poproszenie go o dodanie funkcji, a następnie nauczenie go, że napisanie dobrego kodu nie jest tylko dla zadowolenia z siebie, ale dla zrobienia łatwe dla ludzi, którzy będą utrzymywać kod.

Ćwiczenie:

1) Mają wcześniej napisany zły kod (np.) Duplikat, metoda mówi „obliczyć spłatę kredytu hipotecznego” jest napisana w 9 miejscach w projekcie.

Poproś ucznia o ulepszenie tej funkcji, aby „dodała 1,2% dopłaty do wszystkich płatności hipotecznych”.

Teraz uczeń zobaczy ból związany z lokalizacją i poprawieniem kodu we wszystkich 9 miejscach. Istnieje wiele szans, że nie uda mu się zlokalizować wszystkich 9 miejsc, w których obliczana jest „spłata kredytu hipotecznego”.

2) Teraz pokaż Dobry kod, który ma tę metodę, która oblicza spłatę kredytu hipotecznego w jednym i jedynym miejscu . zademonstruj uczniowi, jak łatwo ulepszyć dobrze napisany kod i wyjaśnij mu, w jaki sposób poprawia to łatwość konserwacji kodu / projektu.

BTW, podobało mi się twoje podejście do narażania studentów na łatwość konserwacji oprogramowania.


-1

@mattmattj: Ponieważ istnieje wiele odpowiedzi, a link, który zamieściłem, ma również kilka dobrych wskazówek, dodam coś, co, mam nadzieję, nie będzie powtórzeniem już opublikowanych odpowiedzi.

Po pierwsze, MUSI zdefiniować „łatwość konserwacji” - nie ma jednej akceptowanej przez wszystkich definicji - podobnej do architektury oprogramowania. Więc wybierz ten, który Twoim zdaniem jest najważniejszy, obejmujący wszystko i podaj go w 3-4 liniach z maksymalną prędkością. Następnie możesz porozmawiać o niektórych metrykach, takich jak - czas na zapamiętanie / zrozumienie własnego kodu (lub kodu innego użytkownika), liczba WTF na minutę / godzinę itp. Zachowaj lekki (humorystyczny) - dzięki temu będą bardziej otwarci na to, co masz powiedzieć po tym.

Niektóre ćwiczenia (może to brzmieć nieco pokrywające się z niektórymi odpowiedziami, proszę wybacz)

Podziel klasę na dwie części - przydziel jednej sekcji proste zadanie kodowania, które należy wykonać w ciągu 1-2 dni. Max. Ostateczny termin. Muszą wykonać pracę we wszystkich okolicznościach - wytyczne - „działający kod”, jaki uznają za odpowiedni. Dla drugiej grupy studentów to samo zadanie, ale z listą konwencji (nazewnictwa) i niektórymi wytycznymi dotyczącymi projektowania i sposobu odejmowania punktów, jeśli nie będą przestrzegane. To NIE jest oszustwo, nawet jeśli tak to brzmi;) Teraz zamień je na kody, tj. Grupa 1 działa teraz na tym, co zrobiła grupa 2 i na odwrót. Teraz zasugeruj modyfikację oryginalnego przypisania kodowania i poproś, aby zrobili to w tym samym czasie. Spotkaj się ponownie i zapytaj ich, jak to było łatwe / trudne, i otwórz podłogę dla dyskusji / opinii. Punkt na pewno trafi do domu - duże szanse, że 50% klasy byłoby szczęśliwych i uznało to za łatwe, a 50% za trudne. Możesz też poprosić ich o pracę nad własną rzeczą po 3 tygodniach i sprawdzenie, czy zdołają to zrobić w ciągu 1 dnia;)

(Dobrym zwrotem jest to, że piszesz ten sam fragment kodu w zawiły sposób i oddajesz klasie do modyfikacji wraz z własnym)

Oto podstawa łatwości konserwacji - każda zmodyfikowana / zaktualizowana linia kodu kosztuje firmę. Im łatwiej jest odczytać i zapamiętać kod, tym lepiej / szybciej modyfikacja, która pomogłaby skrócić czas wprowadzenia produktu na rynek. Bardzo ważne w dzisiejszej szybkiej przestrzeni technologicznej. Konserwowalność jest kluczem do efektywnej ewolucji systemów.

Ważne jest, aby zrozumieć różnicę między rozwojem terenów zielonych i terenów poprzemysłowych - nie każdy projekt lub system zostałby stworzony od zera (raczej trudno jest znaleźć lub być częścią projektów „od zera”). Wyjaśniając, że pole jest „z natury” brązowe i musisz poświęcić czas na jego kształtowanie wraz z ewentualnym wycofywaniem się, gdy wyrasta „z ręki” (możliwe tylko, gdy dryf jest zbyt duży i „niemożliwy do utrzymania”). Im szybciej to zaakceptują, tym lepiej. Jest to trudne, ponieważ programowanie jest z natury kreatywne, ale poprawianie czyjś kod nie jest postrzegane jako takie - przekręć go. Kreatywność to umiejętność zrozumienia kodu, a następnie zastosowania „własnej” kreatywności, aby go ulepszyć - jeśli lepiej go utrzymasz, będziesz w stanie bardziej twórczo go ulepszyć w przyszłości.

Odwołaj się do analogii spaghetti w powyższym linku ... mam nadzieję, że pomoże to zdobyć punkty w domu. Inne odpowiedzi pomagają wypełnić luki i powinny pomóc w nauce! Powodzenia!


@Downvoter - proszę zostawić komentarz, aby zwiększyć szanse na poprawę postu :)
PhD
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.