title: Refaktoryzacja kilku dużych klas/metod C++. Jak zaczac?

text: > **Możliwy duplikat:** > Odziedziczyłem 200 tys. linii kodu spaghetti – co teraz? Mam do czynienia ze starszym kodem. Zawiera kilka klas BIG (liczba linii 8000+) i kilka metod BIG (liczba linii 3000+). Dla jednej z tych metod napisałem test jednostkowy, który obejmuje przynajmniej część kodu. Ta funkcja nie ma określonej struktury, jest bałaganem zagnieżdżonych pętli i warunków. Chciałbym dokonać refaktoryzacji, ale nadal nie mam pojęcia, jak zacząć. Właściwie zacząłem od wyodrębnienia jednej funkcji. Ostatecznie musiało mieć 21 parametrów :-/ Czy powinienem... 1\. nadal wydobywać okropne funkcje, wiedząc, że na dłuższą metę odniosę sukces? 2\. zacząć wydobywać jeszcze większe funkcje? Odsłaniam więc strukturę tego potwora i wtedy mogę rozpocząć prawdziwą refaktoryzację. 3\. tylko wyodrębnić małe "dobre" funkcje (i/lub klasy) tylko dlatego, że jestem cholernie czystym koderem? 4\. zrobić coś zupełnie innego?


title: Jak radzić sobie ze stresem związanym z trwającą trudną konserwacją?

text: Niedawno podpisałem umowę, w ramach której wspieram starzejący się system. System jest kolażem komponentów .net i VBScript. Część działa jako aplikacja internetowa; część z nich działa jako usługa systemu Windows. Jak każdy na tej stronie może ci powiedzieć, możliwe jest napisanie świetnego kodu przy użyciu starszej technologii i możliwe jest napisanie okropnego kodu w nowej technologii. Projekt, nad którym pracuję, jest jednym z najgorszych kodów spaghetti, jakie kiedykolwiek widziałem. Ma ponad dziesięć lat i został opracowany, wspierany i utrzymywany przez pół tuzina niepowiązanych firm. Jest kilka komentarzy do kodu i wygląda na to, że każdy programista nie wiedział, co robi poprzedni programista. Jednak w jakiś sposób program działa przez większość czasu i jest krytyczną częścią dużego biznesu. W systemie są setki tysięcy linijek kodu, a oto jak to działa: Co tydzień mój klient daje mi kilka raportów o błędach do przejrzenia na początku tygodnia. Mówiono mi konkretnie, abym nie próbował ulepszać projektu systemu, ale aby wprowadzić najmniejszą możliwą zmianę, aby naprawić każdy błąd. Oto, co mnie niepokoi: Po pierwsze, samo próba odczytania kodu i rozeznania, co on robi, jest bardzo obciążająca. Istnieje mnóstwo ramek iframe i bardzo dziwne sposoby łączenia przeglądarki z serwerem i serwera z bazą danych. Często zdarza się, że znalezienie zakątka kodu, w którym występuje błąd, zajmuje kilka dni, a jeśli poprawka nie jest trywialna, zrozumienie powiązanych części kodu może zająć więcej dni. To tak, jakby zarabiać na życie wpychając skałę pod górę. Praca jest bardzo wyczerpująca psychicznie. Trudno jest utrzymać koncentrację, a wtedy czuję się dodatkowo zestresowany, chcąc dawać z siebie wszystko, będąc zmęczonym i nieskoncentrowanym. Na domiar złego cały czas wiem, że pracuję nad błędem, że jak tylko się skończy, mam zacząć wszystko od kolejnego błędu. Praca jest bardzo płatna i chciałbym się do niej lepiej dopasować. Jak niektórzy z bardziej doświadczonych programistów radzą sobie z takim stresem? **Edytuj:** Myślę, że w komentarzach poniżej Robert Harvey poruszył dobry punkt: że mogę stresować się własnymi oczekiwaniami. Wiele z moich wcześniejszych doświadczeń dotyczyło rozwoju od podstaw, więc być może wolniejsze tempo konserwacji. Być może ta konserwacja wymaga innego sposobu myślenia i sposobu myślenia. Poza tym zdecydowanie sprzeciwiam się pomysłowi, że niewłaściwie proszę o pomoc w moim zdrowiu psychicznym. Rozumiem, że psychiatria jest obecnie uważana za dyscyplinę medyczną, ale to nie znaczy, że wszelkie pytania dotyczące radzenia sobie ze stresem i bycia szczęśliwym powinny być rozwiązywane wyłącznie przez specjalistów od zdrowia psychicznego. To po prostu głupie.


title: Jak zmienić strukturę frameworków Pythona

text: Właśnie dołączyłem do grupy pięciu programistów (nieprofesjonalistów) pracujących na średniej wielkości frameworku Python (> 50 modułów, > 10.000 linii kodu). Projekt nie posiada żadnej dokumentacji i nie ma żadnych konwencji kodowania. Moim zadaniem jest: 1. uzyskać przegląd tego, czym zajmuje się framework (obliczenia fizyki teoretycznej), 2. napisać szczegółową dokumentację dla obecnego kodu, 3. zdefiniować wytyczne do rozwoju, 4. zaprojektować nową architekturę oprogramowania, 5. przeprowadzić refaktoryzację kodu . Niestety nie jestem przyzwyczajony do programowania w tak dużych projektach języków z dynamicznym systemem typów (do tej pory do takich celów używałem Javy, a Pythona do krótszych skryptów). Mówiąc o antywzorcach, kod jest czystym kodem spaghetti, zawiera boską klasę i dużo programowania typu kopiuj i wklej. Moim zdaniem kod zdegenerował się do punktu, który jest nie do utrzymania. Jednak przepisanie całego kodu nie wchodzi w grę. W „AntiPatterns: Refactoring Software, Architecture and Projects in Crisis” William Brown i in. sugeruj następujące kroki refaktoryzacji kodu przy dodawaniu nowego kodu w takich projektach programowych: 1. Kontroluj dostęp do zmiennych składowych (w Pythonie użyłbym właściwości). 2. Unikaj powielania kodu. 3. Zmień kolejność argumentów funkcji, aby poprawić spójność. 4. Usuń kod, który jest lub może stać się niedostępny. 5. Zmień nazwy klas, funkcji, typów danych, aby poprawić spójność i ustalić standardy. Krok 1 wydaje mi się w jakiś sposób nie-Pythonic, a kroki 2-5 są trywialne. Zrezygnowałem z prób wymyślenia całościowego obrazu. Zamiast tego podchodzę do tych problemów pojedynczo. Jednak ciągle utknąłem, próbując rozwiązać szaloną ilość sprzężenia obiektów. Nie mam pewności, czy moje podejście jest w ogóle dobrym pomysłem, ponieważ nie mam doświadczenia w restrukturyzacji oprogramowania. Trudno też zadać konkretne pytanie, bo utknąłem na początku mojej pracy. Byłbym wdzięczny, gdyby ktoś mógł przedstawić najlepsze praktyki w tym temacie. * * * **Edytuj:** To pytanie skupia się teraz na podejściu do restrukturyzacji frameworków Pythona, a nie tylko na przeglądzie.


title: Ile (uszkodzonej) starszej struktury należy zachować?

text: Odziedziczyłem system hostowany (system „A”), który może być używany do zarządzania produktami, zapasami i zamówieniami, a także może wysyłać te produkty do różnych stron trzecich. Po prostu system „A” nie działa. Systemy produktów i zapasów są powolne, zawiłe i wadliwe. Integracja z innymi firmami w ogóle nie działa. Kod to bezbożny, spaghettied bałagan, więc naprawianie rzeczy nie jest proste. Moim zadaniem jest spróbować uratować system w coś użytecznego, a moim pierwotnym planem było po prostu refaktoryzacja, refaktoryzacja i refaktoryzacja jeszcze trochę, dopóki system nie zadziała. Jednak moja firma ma również osobny system (system „B”), którego używamy do budowy stron e-commerce. Między innymi system "B" może zarządzać produktami, stanami magazynowymi, a także zamówieniami - tylko w niektórych przypadkach z mniejszą wydajnością. System „B” jest również stale rozwijany i aktualizowany przez zespół. Mój nowy plan polega na wyrzuceniu systemu „A” i odtworzeniu go w oparciu o system „B”. Ponieważ moje refaktory w końcu całkowicie zrestrukturyzowałyby system „A”, myślę, że mogę po prostu zaoszczędzić czas, zaczynając od innej, istniejącej struktury. Jednak jeśli pójdę tą drogą, nadal będę musiał przekodować integrację strony trzeciej i pomniejsze funkcje, które ma system „A”, a system „B” nie. W tej chwili system „A” jest w zasadzie nieczynny – nikt tak naprawdę go nie używa, więc jeśli zechcę, mam swobodę nieco wydłużonego okresu przepisywania. Czy to dobry pomysł, czy powinienem trzymać się pierwotnego planu refaktoryzacji systemu „A”?


title: Jakie cechy lub funkcje sprawiają, że kod można konserwować?

text: Kiedyś myślałem, że wiem, co to jest, dopóki naprawdę nie zacząłem o tym myśleć… „nadający się do utrzymania”… co dokładnie sprawia, że kod jest możliwy do utrzymania? Dla mnie, jeśli kod musi być utrzymywalny, oznacza to, że możemy spodziewać się ponownej wizyty w kodzie, aby wprowadzić w nim jakieś zmiany w przyszłości. Kod jest zawsze „zmienny” bez względu na stan, w jakim się znajduje. Czy to oznacza, że kod musi być łatwy do zmiany? Gdyby jednak nasz kod był skalowalny/rozszerzalny, nie byłoby potrzeby jego bezpośredniej zmiany, ponieważ „zmieni się” (dostosuje) za darmo i automatycznie. Widziałem również, że łatwość utrzymania kodu jest używana zamiennie ze standardami kodowania. Używając spójnego wzorca lub stylu kodowania, czy to naprawdę sprawia, że kod jest łatwiejszy w utrzymaniu? Czytelniejszy i bardziej spójny? Jasne, ale jak to poprawia łatwość konserwacji? Im więcej staram się to przemyśleć, tym bardziej się pogubiłem. Czy ktoś ma właściwe wytłumaczenie?


title: Pierwszy krok w analizie proponowanego systemu

text: Klient poprosił nas o zautomatyzowanie jego procesów papierowych w trybie offline. Wysłał nam kopię fizycznych form, których używa. Nasz zespół spotkał się i omówił, jak powinna wyglądać nawigacja, jakie główne komponenty istniałyby w interfejsie użytkownika. Otóż to. Problem polega na tym, że nie mamy rzeczywistych „pisemnych” wymagań. Przy braku w naszej firmie rzeczywistego analityka biznesowego/systemowego, jakie kroki powinniśmy podjąć, aby dojść do momentu, w którym jesteśmy gotowi do rozpoczęcia rozwoju systemu?


title: Jaki jest dobry sposób na zarządzanie długimi fragmentami kodu w plikach?

text: Jestem web developerem i w tej chwili ciężko mi sobie poradzić z długim nieudokumentowanym kodem pisanym przez poprzednich developerów w organizacji, dla której pracuję. Z pistoletem ostatecznym zawsze wycelowanym w moje czoło, wbija mi się w głowę. Używam funkcji wyszukiwania aptana studio, aby szybko wygrać, ale staje się to przytłaczające do tego stopnia, że nie chcę już z nimi pracować. Czy jest jakieś szybkie/sprawdzone podejście, które mogę zastosować, aby pomóc mi w takim scenariuszu?


title: Co mogę zrobić, aby lepiej oszacować, jak długo potrwają projekty?

text: Nie chcę utrudniać życia kierownictwu. Naprawdę nie. Są wystarczająco mili, ale za każdym razem, gdy przydzielono mi nowy projekt lub zadanie i zapytano mnie „jak myślisz, jak długo to zajmie?”, kończę na absurdalnych ramach czasowych; „od dnia do trzech tygodni”. Chciałbym wierzyć, że to nie do końca moja wina: jestem jedynym programistą w firmie, jestem stosunkowo nowy w prawidłowym rozwoju (czy dopiero pół roku temu napisałem swój pierwszy test jednostkowy? westchnienie...) i jestem praca z bazą kodu, która czasami jest wręcz absurdalna. Więc proszę o radę. Oczywiście doświadczenie to największa rzecz, której mi brakuje, ale wszystko, co poprawiłoby mnie, byłoby bardzo docenione. Szukam materiałów do czytania, metodologii, a może nawet rzeczywistych narzędzi. Doceniam każdy sposób, w jaki mogę przekazać mojemu szefowi dokładniejsze informacje bez konieczności siadania i projektowania cery. Ok magic stackoverflow dżin, co masz dla mnie? **EDYTUJ:** @Vaibhav i inni sugerują, że poświęcam czas na zbadanie i naszkicowanie systemu, w którym zasadniczo się z tobą zgadzam, ale jak to zrównoważyć z ograniczeniami w świecie rzeczywistym? Kiedy jesteś jednym człowiekiem, a nawet częścią małego zespołu, „Potrzebuję 2 dni na zbudowanie wyceny” jest prawdziwym środkiem odstraszającym, gdy możesz zgasić 4 pożary w czasie potrzebnym do uzyskania prostego oszacowania.


title: Dokumentuj istniejący projekt Visual Studio

text: Jestem właścicielem małej firmy, a mój jedyny programista zrezygnował z pracy. Przeziębienie. Nie jestem koderem. Opracował istniejącą aplikację działającą w .net, c#, javascript, sql, opartą na visual studio, 250 000 linii kodu. Musi ewoluować do wersji 2.0. Mam zero dokumentacji. Czy istnieje produkt, który potrafi odczytywać kod i generować dokumentację, co znacznie zmniejszyłoby krzywą uczenia się dla mojego nowego zespołu programistów? Co to jest? Jeśli nie, sugestie?


title: szybkie podejście do migracji klasycznego projektu asp do asp.net

text: Ostatnio otrzymaliśmy wymaganie przekonwertowania klasycznego projektu asp na asp.net. Ten jest naprawdę bardzo starym projektem powstałym około 2002/2003. Składa się z około 50 stron aspowych. Znalazłem bardzo mało dokumentacji do tego projektu, FSD i dokumentacji projektowej tylko dla kilku modułów. Już po krótkim spojrzeniu na ten projekt zaczyna mnie boleć głowa. To naprawdę bałagan. Sprawdziłem zapisy i nie znalazłem żadnego z programistów, którzy pracowali nad tym projektem, już nie pracuje dla firmy. Moim prawdziwym bólem jest to, że jest to pilne wymaganie i muszę podać przełożonym przewidywany termin. Znalazłem podobne pytanie classic-asp-to-asp-net, ale potrzebuję więcej wglądu w to, jak przekonwertować ten klasyczny projekt asp na asp.net w najszybszy możliwy sposób.


title: Poprzedni programista zmarł niespodziewanie; jak mogę odebrać miejsce, w którym skończył?

text: Niedawno podjąłem pracę kończącą tworzenie aplikacji .Net. Dostawa aplikacji jest opóźniona o dwa lata. Poprzedni deweloper zmarł, zanim zdążyłem go poznać. Dostałem kopie katalogów z laptopów zmarłego. Istnieje wiele katalogów kodu (w tym pozornie zduplikowane katalogi), dwie bazy danych SQL Server i niektóre pliki projektu Visual Studio. Szybkie wc pokazuje około 300 000 wierszy kodu .Net. Nie ma kontroli nad źródłami, dokumentacji, licencji na kontrole stron trzecich, testów jednostkowych, skryptów kompilacji, skryptów wydania, instalacji ani rzeczywistego procesu tworzenia oprogramowania. Może niektóre z tych rzeczy istniały, ale nie mogę ich znaleźć. Jestem doświadczonym programistą, ale nigdy nie byłem w takiej sytuacji. Wreszcie, mam budżet na zakup narzędzi w razie potrzeby, ale nie mam więcej personelu. _Jaki byłby twój 90-dniowy plan ponownego uruchomienia tego projektu?_ Oczywiście mam przed sobą miesiące lub lata pracy; _jakie powinny być moje priorytety?_


title: Dlaczego TDD działa?

text: Rozwój oparty na testach (TDD) jest obecnie bardzo popularny. Często uważam, że jest to zalecane jako rozwiązanie dla szerokiego zakresu problemów w Programers SE i innych miejscach. Zastanawiam się, dlaczego to działa. Z inżynierskiego punktu widzenia zastanawia mnie z dwóch powodów: 1. Podejście „test zapisu + refaktoryzacja do przejścia” wygląda niesamowicie antyinżyniersko. Gdyby inżynierowie budowlani stosowali takie podejście do budowy mostów lub projektanci samochodów do swoich samochodów, na przykład, przebudowywaliby swoje mosty lub samochody po bardzo wysokich kosztach, a wynikiem byłby bałagan załatany bez dobrze przemyślanej architektury . Wytyczna „refaktoruj aż do przejścia” jest często traktowana jako nakaz zapomnienia projektu architektonicznego i zrobienia wszystkiego, co jest konieczne, aby spełnić test; innymi słowy, wymagania ustala test, a nie użytkownik. Jak w tej sytuacji zagwarantować dobre „ilości” w wynikach, czyli wynik końcowy, który jest nie tylko poprawny, ale także rozszerzalny, solidny, łatwy w użyciu, niezawodny, bezpieczny, pewny itp.? Tak zwykle robi architektura. 2. Testowanie nie może zagwarantować, że system działa; może tylko pokazać, że tak nie jest. Innymi słowy, testowanie może pokazać, że system zawiera defekty, jeśli test nie przejdzie pomyślnie testu, ale system, który pomyślnie przejdzie wszystkie testy, nie jest bezpieczniejszy niż system, który je nie zaliczy. Pokrycie testami, jakość testów i inne czynniki są tutaj kluczowe. Fałszywe poczucie bezpieczeństwa, jakie daje wielu ludziom „wszystkie zielone” wyniki, zostały zgłoszone w przemyśle cywilnym i lotniczym jako niezwykle niebezpieczne, ponieważ mogą być interpretowane jako „system jest w porządku”, podczas gdy tak naprawdę oznacza „system jest tak dobry”. jako nasza strategia testowania”. Często strategia testowania nie jest sprawdzana. Albo kto testuje testy? Podsumowując, bardziej interesuje mnie bit „napędzany” w TDD niż bit „testowy”. Testowanie jest w porządku; to, czego nie rozumiem, to kierowanie projektem przez robienie tego. Chciałbym zobaczyć odpowiedzi zawierające powody, dla których TDD w inżynierii oprogramowania jest dobrą praktyką i dlaczego kwestie, które wyjaśniłem powyżej, nie są istotne (lub nie są wystarczająco istotne) w przypadku oprogramowania. Dziękuję Ci.


title: Jak utrzymać naprawdę źle napisaną bazę kodu?

text: > **Możliwy duplikat:** > Odziedziczyłem 200 tys. linii kodu spaghetti – co teraz? Niedawno zostałem zatrudniony do pracy nad istniejącą aplikacją internetową z powodu umowy NDA. Nie mogę ujawniać żadnych szczegółów, ale ta aplikacja działa online na etapie testów beta przed oficjalnym uruchomieniem. W tej chwili mamy kilkuset użytkowników, ale ta liczba ma znacząco wzrosnąć po oficjalnej premierze. Aplikacja jest napisana w PHP (ale to nieistotne dla mojego pytania) i działa na samodzielnym serwerze z dwoma procesorami xeon z poważnymi problemami z wydajnością. Widziałem dużo złego kodu PHP, ale to naprawdę wyznacza nowe standardy, zwłaszcza wiedząc, ile czasu i pieniędzy zainwestowano w jego rozwój. * jest tak źle zakodowany, jak to tylko możliwe, miesza się PHP, HTML, SQL, a kod jest powtarzany zawsze, gdy jest to konieczne (zwłaszcza zapytania SQL). nie są używane żadne funkcje, nie wspominając o żadnym OOP * są cztery wersje aplikacji (komputer, iPhone, Android + inny telefon komórkowy) każda wersja ma prawie taką samą funkcjonalność, ale została stworzona przez skopiowanie całej bazy kodu, więc teraz jest są pewne różnice między każdą wersją i jest naprawdę trudna w utrzymaniu * baza danych jest naprawdę źle zaprojektowana, co powoduje poważne problemy z wydajnością również w przypadku naprawienia niektórych błędów w kodzie PHP jest używanych wiele wyzwalaczy bazy danych, które aktualizują dane w SELECT i na INSERT, więc każde testowanie to koszmar Zasadniczo, każdy grzech złego programowania, który możesz sobie wyobrazić, jest tam na przykład nie tylko można używać wstrzyknięć SQL dosłownie w każdym miejscu, ale możesz zalogować się do aplikacji, jeśli używasz loginu, który nie t istnieje i puste hasło. Zespół, który stworzył tę aplikację, już nad nią nie pracuje i istnieje zewnętrzny zespół, który zasugerował, że są pewne problemy, ale nigdy nie był skłonny zająć się słoniem w pokoju częściowo, ponieważ mają bardzo wygodną umowę, a częściowo z powodu braku umiejętności (tylko moja opinia). Moim zadaniem miało być naprawienie niektórych problemów wydajnościowych i rozszerzenie istniejącej funkcjonalności, ale pierwszą rzeczą, o którą zostałem poproszony, był przegląd istniejącej bazy kodu. Zrobiłem recenzję i był to spory szok dla kierownictwa, ale moje wnioski zostały po pewnym czasie ostatecznie potwierdzone przez innych programistów. Kierownictwo dało jasno do zrozumienia, że nie można zacząć przepisywać tej aplikacji od zera (co moim zdaniem powinno być zrobione). Musimy utrzymać jego sprawność i jednocześnie naprawiać błędy wydajnościowe i rozszerzać funkcjonalność. Moje pytanie brzmi, ponieważ nie chcę po prostu łatać istniejącego kodu, jak przekształcić go w poprawnie napisaną aplikację, zachowując jednocześnie działający istniejący kod? **Mój plan to:** 1. Ujednolicenie czterech istniejących wersji we wspólną bazę kodu (naprawianie tylko najbardziej oczywistych błędów). 2. **Przeprojektuj bazę danych i użyj wyzwalaczy, aby wypełnić ją danymi (dzięki czemu dane będą utrzymywane w dwóch formatach jednocześnie)** 3. Cała nowa funkcjonalność zostanie napisana jako osobny projekt. 4. Krok po kroku przenieś istniejące funkcjonalności do nowego projektu 5. Po pewnym czasie wszystko będzie w nowym projekcie Wyjaśnienie do punktu #2, w tej chwili praktycznie niemożliwe jest dokonywanie jakichkolwiek aktualizacji w istniejącej bazie danych, jakakolwiek zmiana wymaga przejrzenia całego kodu i dokonywanie zmian w wielu miejscach. **Czy taki plan w ogóle jest możliwy?** Innym rozwiązaniem jest odejście i pozostawienie bólu głowy komuś innemu.


title: Jak odpowiadać na niekompletne zapytania potencjalnych klientów?

text: Pracując jako freelancer, otrzymuję wiele dziwnych, nieważnych lub niekompletnych zapytań od rzeczywistych lub potencjalnych klientów. Najczęstszym przypadkiem jest ten: > Cześć, > > Potrzebuję strony internetowej, na której ludzie mogą się rejestrować, a także są tam wpisy i > oceny. Ile to będzie dla mnie kosztować? >> Dziękuję. Prośba jest do bani, ale **nie oznacza to, że taki klient nie jest tego wart**. Ta osoba nie wie, jak poprawnie złożyć wniosek, ale przy **odrobinie wysiłku i odrobinie nauki i porad** może stać się wartościowym klientem, który nie będzie marnował mojego czasu. Przez chwilę po prostu **odpowiadałem, prosząc o podanie szczegółów**. Nigdy tego nie robią. Ostatnio postanowiłem **odpowiedzieć bardziej szczegółowo** , wyjaśniając _dlaczego_ nie można podać ceny (poza stwierdzeniem, że będzie to gdzieś pomiędzy 500 a 50 000 $). Najpierw po prostu zrobiłem proste wyjaśnienie, mówiąc, że ich opis projektu jest zbyt skąpy. Następnie dodałem dalsze informacje, metafory itp., lub porównując z innymi domenami, które są lepiej znane osobom bez zaplecza technicznego. Na przykład: > „Wyobraź sobie, że chcesz zbudować dwupiętrowy dom. Czy uważasz, że można > określić koszt budowy domu znając tylko > ilość kondygnacji? Prawdopodobnie musisz podać znacznie więcej szczegółów: czy jest zbudowany z > kamienia czy drewna? Czy na dachu są panele słoneczne? Czy jest basen > na podwórku? > > Duży dom w stylu wiktoriańskim wykorzystujący najnowsze technologie, z dwoma > garażami, dużym tarasem itp. będzie kosztował znacznie więcej niż mały, skromny > > piętrowy dom dla rodziny, która naprawdę nie ma zbyt dużo pieniędzy na spędzić." To nadal nie działa: potencjalni klienci nigdy nie odpowiadają. Próbowałem też techniki „pozwól, że zbierzę dla Ciebie wymagania projektowe od zera i sporządzę specyfikację i architekturę, ale nie zapomnij mi za to zapłacić”, ale wygląda to na oszustwo¹. We wszystkich przypadkach w moim kraju (Francja) to nigdy nie działa z nowymi klientami z kilku powodów. Niektóre wskazówki pokazują mi, że **niektórym z tych ludzi udało się znaleźć programistę i odnieść sukces w swoim projekcie**. Oznacza to, że moje podejście do tych potencjalnych klientów zawodzi, podczas gdy jest jedno podejście stosowane przez kogoś innego, które działa dobrze. Jak odpowiedzieć na takie prośby o cenę, skoro te osoby mnie nie znają, jeszcze mi nie ufają, nie chcą spędzać dni na pisaniu szczegółowego dokumentu opisującego każdą funkcjonalność projektu, a czasem nawet nie wiedzą dokładnie tego, czego chcą, ale nie są gotowi płacić tysięcy dolarów tylko za wymagania, specyfikację i kroki związane z architekturą? * * * ¹ Większość projektów jest wystarczająco mała i ma niewielkie fundusze; większość klientów nie zadaje sobie trudu, aby wiedzieć, że kod źródłowy jest czysty i łatwy w utrzymaniu, że był regularnie refaktoryzowany i że masz testy jednostkowe i integracyjne. **Chcą teraz płacić mniej, bez względu na to, jak kosztowne byłoby późniejsze utrzymanie kodu.** W tym kontekście mówienie o wymaganiach funkcjonalnych i niefunkcjonalnych, architekturze itp. jest postrzegane jako próba zmarnowania połowy pieniędzy klientów robiąc marketingowe paplaniny zamiast pisać kod lub oszukiwać ich, zmuszając ich do zapłaty za coś, czego nie potrzebują ani nie rozumieją, a następnie znikają ze swoimi pieniędzmi, gdy przyjdzie do pisania kodu źródłowego. Nie wiedzą, że jesteś profesjonalistą, a nawet ich to nie obchodzi.


title: Jak przejąć sporą bazę kodu, nie mając dostępu do tych, którzy zaimplementowali?

text: Rozpocząłem pracę jako mobilny lider w firmie zatrudniającej 100 pracowników. Ich produkty mobilne (iOS i Android) zostały opracowane przez zespoły zewnętrzne, a teraz zdecydowali się zebrać zespoły wewnętrzne, więc jestem mocno zaangażowany w zatrudnianie bankomatów, zarówno na iOS, jak i Androida. Będę miał zespoły po 5 osób na każdą z platform. Byłem już menadżerem, ale po raz pierwszy nie zaczynam kodu od zera. Moje pytanie brzmi jak obsłużyć przejmowanie kodu? Kod iOS to około 50 klas, wiele z nich ponad 700 linii. Jakość kodu wynosi około 5/10. Jakie powinny być moje pierwsze kroki do przejęcia bazy kodu? Stopniowo lub najpierw poważna restrukturyzacja, czy obie z wykorzystaniem różnych zasobów?


title: Jak zachować produktywność, mając do czynienia z wyjątkowo źle napisanym kodem?

text: Nie mam dużego doświadczenia w pracy w branży oprogramowania, samouczeniu się i uczestnictwie w open source przed podjęciem pracy. Teraz, kiedy pracuję za pieniądze, mam też do czynienia z nieprzyjemnymi rzeczami, co jest oczywiście normalne. Niedawno zostałem przydzielony do dodania logowania do dużego projektu SharePoint, który jest pisany przez jakiegoś programistę, który najwyraźniej uczył się kodować w pracy. Po 2 latach współpracy klient przeszedł do naszej firmy, ale szkoda została zrobiona i teraz jakoś muszę ten kod utrzymać. Nie żeby kod był _zbyt_ trudny do odczytania. Pomimo problemów — każdy projekt ma jedną klasę z kilkoma metodami „kopiuj-wklej”, ogromnymi zagnieżdżeniami „jeśli”, systemami węgierskimi, niedysponowanymi połączeniami — nadal jest czytelny. Jednak okazało się, że jestem całkowicie bezproduktywny, mimo że pracowałem nad czymś tak prostym, jak dodanie logowania. Zasadniczo wystarczy przejść krok po kroku przez kod i dodać kilka wywołań śledzenia. **Jednak idiotyzm kodu jest tak denerwujący, że w ciągu 10 minut od uruchomienia zaczynam się męczyć**. Na początku dodawałem konstrukcje typu using, redukowałem zagnieżdżanie poprzez odwracanie opcji „if”, zmieniałem nazwy zmiennych na czytelne — ale projekt jest duży i ostatecznie zrezygnowałem. Wiem, że to nie jest zadanie, które powinienem wykonywać, ale przynajmniej zmniejszenie bałaganu dało mi jakąś psychologiczną nagrodę, dzięki której mogłem iść dalej. Teraz sztuczka przestała działać, a ja nadal mam 60% swojej pracy do wykonania. Zacząłem mieć bóle głowy po pracy i nie odczuwam już satysfakcji, jaką kiedyś otrzymywałem – co zwykle pozwalało mi kodować przez 10 godzin bez przerwy i nadal czuć się świeżo. To nie jest tylko jedna wielka tyrada, ponieważ naprawdę mam pytanie: > Czy istnieje sposób, aby pozostać produktywnym i nie walczyć z wiatrakami? Czy istnieje jakaś psychologiczna sztuczka, aby skupić się na zadaniu, zamiast myśleć _„Jak głupie jest **to**?”_ za każdym razem, gdy widzę inną sprytną sztuczkę poprzedniego programisty? Problem z dodaniem logowania polega na tym, że faktycznie muszę _rozumieć_, co robi kod, a robienie tego w nieprzyjemny sposób szkodzi mojemu mózgowi.


title: Nie jesteśmy firmą programistyczną. Czy całkowite przepisanie to nadal zły pomysł?

text: Rozumiem uzasadnienie artykułu Joela Spolsky'ego „Rzeczy, których nigdy nie powinieneś robić, część I”, ale zawsze widzę, że odnosi się do niego w sytuacjach, w których ostatecznym celem jest produkcja oprogramowania. Co zrobić, jeśli jestem programistą, który prowadzi witrynę e-commerce? Moja praca nie polega na pisaniu platformy handlowej, ale na używaniu jej. W rzeczywistości nie byłoby to nawet przepisywaniem, ale dużym przejściem do bazy danych i projektowania stron internetowych. Oprogramowanie, na którym opiera się nasza witryna, jest napisane w klasycznym ASP i zasadniczo brakuje mu wielu funkcji, których klienci oczekują od aktualnej witryny zakupów. Zamiast dodawać te funkcje po kawałku, moje przeczucie jest takie, że powinienem zacząć przechodzić na bardziej nowoczesną platformę. Stracilibyśmy dostosowania, których dokonaliśmy przez lata, ale szczerze mówiąc, wiele z tych funkcji już istnieje (i prawie na pewno zostały lepiej zaimplementowane!) w pakiecie, na który chciałbym się przełączyć. Czy padam ofiarą ducha Netscape, czy też mam rację, myśląc, że lepiej spędzam czas w miejscach poza tym, by nasze narzędzia robiły to, czego potrzebujemy? Aby wyjaśnić, jest to dla nas odpowiednik zmiany platform blogowych. Każdy „rozwój”, który robię, polega zasadniczo na przepisaniu frontendu naszej witryny, podczas gdy backend jest poza moją kontrolą. Załóżmy, że rozwój WordPressa zatrzymał się wiele lat temu i brakowało mu „nowoczesnych” funkcji, takich jak komentowanie, strony statyczne, czyste permalinki itp. Oczywiście, mógłbym napisać wtyczkę, aby dodać te rzeczy, ale po chwili nie byłoby to możliwe lepiej zmienić platformy na coś, co ma wszystkie te (potrzebne) funkcje wbudowane od samego początku?


title: O procesie zastępowania ram wewnętrznych publicznymi

text: Pracuję nad kilkoma aplikacjami, które opierają się na frameworku, który został opracowany przez wcześniejszego inżyniera w firmie. Framework został opracowany i utrzymywany głównie na początku XXI wieku i zapewnia taką samą funkcjonalność jak `boost`, `Qt` czy nawet `c++11`. Uważam, że framework został opracowany wewnętrznie, ponieważ inżynier, o którym mowa, jest samoukiem i że w tym czasie nie znał frameworka, który zaspokoiłby jego potrzeby. W tej chwili framework osiągnął swój limit i planujemy przełączyć się na publiczne i dobrze znane frameworki, aby wykonać tę samą pracę. Problemy, przed którymi stoimy: * Mamy do czynienia z niestandardowymi implementacjami podstawowych struktur danych (łańcuchy, tablice) * Jesteśmy ograniczeni zdolnością do poprawnego programowania sterowanego zdarzeniami lub czystego współbieżnego programowania * Złożoność sprzęgania i kodu może być bardzo wysoka (ze względu na dla osób pracujących zarówno nad frameworkiem, jak i aplikacjami ) * Nikt nawet zdalnie nie chce utrzymywać tej biblioteki * Zarządzanie aplikacjami GUI jest po prostu gorsze od Qt. Na przykład bardzo trudno jest (czytaj _nadal nie zarządzaliśmy_) stworzyć CLI w oparciu o ten framework. Jest to problem, gdy chcemy tworzyć pliki wykonywalne CLI, które wykonują niektóre funkcje interfejsu użytkownika. Zasadniczo **aplikacja jest bardzo odporna na zmiany**. Jeden z programistów zażartował, że _kod źródłowy stał się świadomy i że straciliśmy kontrolę_. Jesteśmy małym zespołem i chcemy stopniowo odchodzić od naszej biblioteki. Nie możemy przejść w tryb pełnej przeróbki, ponieważ aplikacja ma w międzyczasie funkcje\błędy, którymi należy się zająć. Mamy szczęście, że kierownictwo firmy zrozumiało problemy i jest nastawione na współpracę. * Jakie podejście lub strategię powinniśmy wziąć pod uwagę? * Co powinniśmy zrobić, aby nie utknąć w połowie z bezużytecznym mutantem? * Jakie są możliwości? Czy to okazja do ulepszenia architektury? Aby poprawić testowalność? Czy proces rozwoju? * Jeśli przyjdzie ci do głowy kilka rzeczy, którą z nich należy zrobić najpierw?


title: Masz do czynienia ze złymi/niepełnymi/niejasnymi specyfikacjami?

text: Pracuję nad projektem, w którym nasz zespół programistów pobiera specyfikacje z biznesowej części firmy. Zarówno kierownictwo biznesowe, jak i kierownictwo IT wymaga szacunków i prognoz terminów, tak jak powinno. Dobrą rzeczą jest to, że szacunki są w większości dokonywane przez rzeczywistych programistów, którzy wykonują wymagane funkcje. Złą rzeczą jest to, że specyfikacje są zwykle albo zbyt proste (okazuje się, że masz wiele znaków zapytania nad głową, ponieważ wydaje się, że brakuje wielu informacji) lub zbyt złożone (do tego stopnia, że możesz nawet nie wizualizuj, gdzie wszystko „zmieściłoby się” w aplikacji). Częściej niż nie, biznesowa część specyfikacji jest albo niekompletna, albo nieświadoma tego, co można, a czego nie można zrobić (biorąc pod uwagę wcześniej zaimplementowaną logikę biznesową). Zespół programistów otrzymuje około jednego dnia na każdą nową specyfikację, aby oszacować, a my staramy się wyjaśnić niejasności, zwykle spotykając się z osobą, która opracowała specyfikację. W większości przypadków okazuje się, że autorzy specyfikacji tak naprawdę nie przemyśleli wszystkiego i zazwyczaj dopiero, gdy zaczynamy projektować i rozwijać, wpadamy w kłopoty, ponieważ wiele specyfikacji wydaje się mieć dziury. Jak sobie z tym radzisz? Czy jesteś szczodry na kosztorysy z góry?


title: Jak zintegrować proces testowania jednostkowego z procesem tworzenia starszego oprogramowania?

text: Chciałbym, abyś podzielił się swoimi spostrzeżeniami na temat tego, w jaki sposób udało ci się zmienić kierunek gnicia starszej bazy kodu na modułowe projektowanie aplikacji, w których łatwe i przydatne jest dodawanie testów jednostkowych? To, co tutaj próbuję się dowiedzieć, jest trochę inne od tego, o co pytano wcześniej. Chcę usłyszeć o twoich własnych doświadczeniach z rzeczywistymi systemami. Interesuje mnie, jakie punkty krytyczne miały największe znaczenie i spowodowały poprawę. Pracuję od ponad pięciu lat z 15-letnim kodem C/C++, w którym widziałem zmianę ze starego kodu C zbudowanego jako aplikacja monolitowa na zmodularyzowaną nowoczesną aplikację C++, teraz wykorzystującą testowanie jednostkowe jako proces rozwoju (w celu uproszczenia działka). Moim zdaniem, krytyczne rzeczy do osiągnięcia sukcesu (tak jak ja to widzę) to 1. wysoce utalentowane osoby robiące wspaniałe rzeczy i prototypujące (nieco poza oficjalnym procesem) testowanie jednostek i promowanie go wśród innych 2. gotowość kierownictwa do inwestowania w rozwoju architektury (nie w celu umożliwienia testów jednostkowych, ale z powodów biznesowych) 3. duże inwestycje w system ciągłej integracji (co nie jest łatwe do skonfigurowania dla dużej starszej aplikacji C++) 4. dedykowani ludzie do rozwoju i utrzymania frameworków testów jednostkowych, integracji i szkolenie programistów 5. i oczywiście samych programistów, którzy robią postępy. Więc **co zadziałało** w Twoim przypadku, a **co nie?**


title: Czy nie dotrzymanie terminów jest częste w pracach programistycznych?

text: To była moja praca jako freelancer w oDesk. Zrobiłem kilka prac wcześniej w określonym czasie, ale po raz pierwszy nie dotrzymałem terminu. To była bardzo długa praca i starałem się jak mogłem, ale wciąż nie dotrzymałem terminu. Teraz bardzo się boję. Bo to moja wina, że nie dotrzymałem terminu. Moje pytanie brzmi: czy jest to duży problem, czy często zdarzają się niedotrzymane terminy wśród prac programistycznych, więc nie powinienem się tym zbytnio martwić?


title: Jak byś to przepisał/zrefaktoryzował?

text: Stara aplikacja, z której korzysta 50-60 000 płacących klientów. Firma liczy kilkaset osób. Aplikacja posiada dużo kodu krytycznego dla biznesu (30% całego kodu) napisanego w klasycznym asp. Aplikacja posiada dużo więcej kodu .net. Aplikacja posiada mostek COM+ umożliwiający asp „rozmowę” z .net Organizacji brakuje trochę/dużo wiedzy na temat tego, co powoduje 10-20% resetu serwera dziennie (może być z powodu COM+ ?) Nie ma czerwonej linii Aplikacja; bez architektury, bez prawdziwych wzorców itp. Aplikacja jest taka od co najmniej 5 lat. Baza kodu asp rośnie, powoli, ale na pewno. Czytałem historie o refaktoryzacji i mam wiedzę, dlaczego czasami nie powinieneś pisać systemu od nowa. Chciałbym, aby stary kod asp zniknął, podobnie jak składnik COM+. Ale ból polega na tym, że nikt tak naprawdę nie wie, co dzieje się w klasycznym kodzie asp, a nastawienie we wszystkich zespołach brzmi „tak po prostu jest”. W dalszej kolejności powoduje to wiele innych problemów, takich jak rekrutacja, wydajność programistyczna, potrzeby biznesowe, których nie można zaspokoić, skalowanie itp. Czy to usprawiedliwia przepisanie kodu asp i usunięcie komponentu COM+ z tymi małymi faktami ? Jak byś się do tego zabrał?


title: Jak poprosić kierownictwo o zwiększenie liczby programistów w zespole bez wychodzenia na niekompetencję?

text: Obecnie pracuję w małej średniej firmie (~50 pracowników) jako jedyny personel IT. Ostatnio jesteśmy na dobrej drodze do zastąpienia jednego drogiego, ale krytycznego starszego systemu na rzecz aplikacji, nad którą obecnie pracuję w wolnym czasie w pracy. Jednak ostatnio był bardzo zajęty problemami pojawiającymi się na lewo i prawo, więc rozwój aplikacji jest bardzo opóźniony. Jak poprosić bardzo oszczędne kierownictwo, aby zatrudniło więcej programistów, aby pomogli mi zbudować nową aplikację bez brzmienia niekompetentnego. FYI. Zajmuję się obsługą wszystkich naszych aplikacji, konfiguracją i administracją siecią i serwerami oraz tworzeniem własnych aplikacji. EDYCJA 1: Charakter krytycznego starszego systemu w celu uzyskania dodatkowych informacji Legacy System jest centrum naszych działań. Zasadniczo wszystkie nasze raporty, powiadomienia i dane są obsługiwane lub przechodzą przez ten system. Chcemy go zastąpić z kilku powodów: 1. Marnujemy pieniądze, płacąc za wsparcie, które rzadko jest pomocne (naprawdę straszne wsparcie) plus koszty licencji. 2. Śmieszne koszty dodawania nowych funkcji (500$ na dostosowanie szerokości kolumny w raporcie) 3. Problemy z projektowaniem/architekturą systemu, które powodują, że system jest powolny i nieskalowalny (inne gałęzie uważają system za bezużyteczny z powodu jego powolnego działania jest używany poza biurową siecią LAN) 4. Jest to program stworzony z dostępem '97. Czy muszę powiedzieć więcej? Nadal działa, ale to tak, jakby próbować wyciąć coś tępym ostrzem pod względem wydajności


title: Jak mogę oszacować, jak długo potrwa projekt?

text: Pracuję jako programista stron internetowych i chcę być w stanie określić, czy jestem wydajny. Czy obejmuje to czas potrzebny do wykonania zadań, takich jak: * Kod po stronie serwera dla logiki witryny w jednym języku lub wielu php, asp, asp.net. * Kod po stronie klienta jak javascript z jquery dla ajax, menu i innych interaktywności * Układ strony, html, css (kolor, czcionki (ale nie mam zmysłu artystycznego!)) * Potrzeby strony i jak będzie działać (planowanie) Jak mogę ocenić, ile czasu zajmie ukończenie strony internetowej? Strona posiada CMS do dodawania i edycji nowości, produktów, artykułów na temat doświadczeń firmy. Ponadto mogą edytować pracę zespołową, dodawać zajęcia rekreacyjne i galerię logo ze skompresowanym plikiem PSD oraz wysyłać wiadomości na cpanel i na e-mail. Zaczynasz od zera z wyjątkiem JQuery i PHPmailera. Jak mogę oszacować, ile czasu zajmie praca i jak obliczyć wymagany czas na ukończenie nowych projektów? Przepraszam za wiele rozproszonych pytań, ale jestem w moim pierwszym eksperymencie i chcę skorzystać z wspaniałego doświadczenia tych, którzy go mają.


title: Strategia czytania i zrozumienia kodu Node.js

text: Konkretnie patrzę na ten 2000-wierszowy plik tego, co całkiem arbitralnie nazwałbym "przeciętnym" kodem. * Nie jest dobrze skomentowany * nazwy zmiennych i nazwy funkcji wydają się konsekwentnie inteligentne * funkcje nie są dobrze udokumentowane * funkcje mają dobrą długość W skrócie: linie i małe struktury są czytelne, ale nie da się na pierwszy rzut oka wywnioskować architektury lub projektu. Większość kodu, nad którym pracowałem, można opisać w ten sposób, aby być uczciwym. Więc muszę to zrozumieć. I popracuj nad tym. Jest to ważna umiejętność w tworzeniu oprogramowania, w której wciąż jestem słaba i jest niezwykle ważna podczas pracy w powstającym systemie. Więc moje pytanie brzmi, kiedy napotykam taki obcy kod, którego używam jako kod klienta, ale teraz muszę zrozumieć i zmodyfikować, jaka jest szybka strategia dobrego zrozumienia?


title: Techniki refaktoryzacji śmieci i utrzymania zdrowego rozsądku?

text: Siadam więc do ładnej miski spaghetti c# i muszę coś dodać lub coś usunąć ... ale wszędzie mam wyzwania od funkcji przekazujących argumenty, które nie mają sensu, kogoś, kto nie rozumie nadużywania struktur danych ciągi, nadmiarowe zmienne, niektóre komentarze są ponownymi przesłuchaniami, internacjonalizacja jest na poziomie każdego wyjścia, SQL nie używa żadnego rodzaju DBAL, połączenia z bazami danych są wszędzie otwarte... Czy są jakieś narzędzia lub techniki, które ja można użyć, aby przynajmniej śledzić „integralność funkcjonalną” kodu (co oznacza, że moje „ulepszenia” go nie łamią) lub zasób online z typowymi „złymi wzorcami”, które wyjaśniają dobry sposób na przejście kodu? Zasadniczo szukam przewodnika, jak zamienić słomę w złoto. Oto kilka przykładów z tej samej 500-liniowej funkcji: protected void DoSave(bool cIsPostBack) { //ALWAYS a cPostBack cIsPostBack = true; SetPostBack("1"); string inCreate ="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~"; parseValues = nowy ciąg []{"","","","","","","","","","","","","",""," ","","","","","","","","","","","","","","","","", "","","","","","","","","","","","","","","","","","" ,"","","","",""}; if (!cIsPostBack) { //....... //.... //.... if (!cIsPostBack) { } else { } //.... //.... strHPhone = StringFormat(s1.Trim()); s1 = parseValues[18].Replace(encStr," "); strWPhone = StringFormat(s1.Trim()); s1 = parseValues[11].Replace(encStr," "); strWExt = StringFormat(s1.Trim()); s1 = parseValues[21].Replace(encStr," "); strMPhone = StringFormat(s1.Trim()); s1 = parseValues[19].Replace(encStr," "); //(setki wierszy tego) //.... //.... SQL = "...... dużo SQL .... "; SqlCommand curCommand; curCommand = new SqlCommand(); curCommand.Connection = conn1; curCommand.CommandText = SQL; spróbuj { curCommand.ExecuteNonQuery(); } catch {} //.... } Nigdy wcześniej nie musiałem refaktoryzować czegoś takiego i chcę wiedzieć, czy istnieje coś takiego jak przewodnik lub baza wiedzy na temat tego, jak robić tego rodzaju rzeczy, znajdować typowe złe wzorce i oferując najlepsze rozwiązania do ich naprawy. Nie chcę po prostu wysadzić go z orbity,


title: Jak przekonać/udowodnić menedżerowi, że potrzebne jest przepisanie, a nie refaktoryzacja

text: Mój menedżer chce, żebym zrefaktoryzował **ogromną ilość strasznie sprzężonych, makro-, pełnych prywatnych metod przestrzeni nazw, wypaczonych hierarchicznie (nawet 10+ poziomów dziedziczenia)** kodu, który nie został (w rzeczywistości) zaprojektowany z " koncepcja całościowej wizji. Próbowałem mu wytłumaczyć, że ten kod trzeba przepisać, a nie tylko zrefaktoryzować, ale nie słuchał i wyraźnie stwierdził, że **muszę go przerobić.. jakoś**. Mógłbym zagłębić się we wszystkie książki o „radzeniu sobie ze starszym kodem”, ale myślę, że nic pożytecznego by nie wyszło. Jak mogę go przekonać, że przepisanie, zamiast refaktoryzacji, jest rzeczywiście potrzebne?


title: Czy ktoś ma doświadczenie z trudnym klientem?

text: Mamy powtarzający się konflikt z jednym z naszych większych i strategicznie ważnych klientów. Firma (na razie nazwijmy je „C”) zajmuje się sprzedażą i dystrybucją artykułów technicznych, od komponentów sprzętowych po suszarki do włosów, a w swoim katalogu ma ponad 400 000 produktów. Właściciel produktu, który jest również szefem dokumentacji produktu i oprogramowania wewnętrznego w „C”, w pewnym momencie w latach 90. przeszedł kurs testowania oprogramowania, a teraz pisze „Specyfikacje wymagań” jako testy użytkownika. Są one często sprzeczne i podatne na błędy, ale utrzymuje, że to, co pisze, jest tym, czego chce, dopóki nie napisze czegoś innego (w tym samym imperatywnym, ale niejednoznacznym i abstrakcyjnym formacie). Ponadto domaga się ostatecznego budżetu na projekt i nie chce pracować w mniejszych iteracjach budżetowania. Poszukuję wskazówek, jak kontrolować proces rozwoju (i własną gospodarkę) i nadal dostarczać klientowi produkt, który daje firmie największą wartość w stosunku do ceny. Normalnie zaczynałbym projekt od zidentyfikowania celów projektu i biznesowych przypadków użycia organizacji - a następnie wyprowadzenia zakresu z tych celów za pomocą historii użytkownika. Szczegóły (specyfikacje) dotyczące sposobu implementacji historyjek użytkowników są ustalane w specyfikacjach przed sprintem, w tym odpowiednich historyjek użytkowników. Wielokrotnie udowodniło to, że skutkuje to lepszymi produktami i większym zwrotem z inwestycji dla klientów. Czy ktoś ma doświadczenie w znajomości technik, które można wykorzystać do imperatywnych testów użytkowników „inżynierii wstecznej” lub jakichkolwiek innych danych wejściowych dotyczących radzenia sobie z sytuacją? Historycznie pozwolono jej całkowicie zdominować proces rozwoju, co rozwaliło nasze budżety i nauczyło ją, że kontroluje nasz proces. Nasze kierownictwo poprosiło mnie o kontrolowanie (i obronę) procesu rozwoju. Powiedzieli „C”, że nie zostanie wykorzystanych więcej godzin niż uzgodniony budżet, niezależnie od tego, jak „zrobione” ona (właściciel produktu) uważa, że jesteśmy, co oczywiście będzie moją dźwignią. Staje się defensywny, a nawet agresywny, aby postawić na swoim - wszelkie rozsądne argumenty oparte na referencjach zawodowych lub doświadczeniu byłyby pomocne. * * * Kontynuacja: Pomyślałam, że będę kontynuować na wypadek, gdyby ktoś natknął się na ten post z podobnymi problemami: zmieniliśmy komunikację i spodziewamy się dostarczyć kolejny projekt w ramach budżetu i na czas (zmodyfikuję to opublikuj ponownie, jeśli później rozpęta się piekło). Początkowo skupiłem się na budowaniu zaufania między mną a Właścicielem Produktu. Oznaczało to wybór odpowiednich bitew i przedstawienie siebie jako jej narzędzia, aby uzyskać jak największą wartość za jej pieniądze. Wymagania są nadal wyrażane mniej więcej w ten sam sposób (chociaż jest otwarta na wprowadzanie informacji o składni, jest stanowcza co do formatu: dokumenty Word i e-maile), ale powoli wymieniamy kontrolę z widocznością procesu rozwoju. Udało mi się namówić ją do udziału w cotygodniowych spotkaniach dotyczących statusu projektu, przygotowania zaległości i ustalenia priorytetów. Pomiędzy każdym spotkaniem ma szansę przetestować najnowszą wersję, co sprawia, że jej opinie testowe, które były przedmiotem dyskusji, są najcenniejszą informacją zwrotną w zakresie opracowywania zaległości i ustalania priorytetów. Prowadząc bezpośrednią rozmowę na temat opinii z testów, jesteśmy w stanie „wyeliminować” nieporozumienia, sprzeczności i pełzanie zakresu, zanim trafią one do rozwoju. Zaufanie między nami pozwoliło nam na konstruktywną rozmowę o sobie nawzajem o organizacjach oraz procesach i intencjach tych organizacji, co otworzyło mi oczy na dość dużą część problemów, jakimi jest nasz brak zdolności (zawodowo, teoretycznie i metodycznie). Właściciel produktu wezwał kierownictwo, aby osobiście pochwalić postęp, który robimy, więc nazywam sukces na tych pierwszych krokach - ale stale obserwując zakres i postęp, aby nie „spocząć na laurach”


title: Co definiuje czytelność kodu?

text: > **Możliwy duplikat:** > Skąd wiesz, czy napisałeś czytelny i łatwy w utrzymaniu kod? Często mówi się, że czytelność jest prawdopodobnie najważniejszą miarą określającą jakość danego fragmentu kodu ze względu na łatwość konserwacji, łatwość zrozumienia i użytkowania. **Co definiuje słowo _czytelny_ w kontekście kodu źródłowego programu?** Jakie są ostateczne aspekty czytelności kodu? Byłbym wdzięczny za przykłady kodu _czytelnego_, wraz z uzasadnieniem, dlaczego jest czytelny.


title: Jak zdobyć zrozumienie dużych systemów?

text: > **Możliwy duplikat:** > Jak zagłębić się w duże bazy kodu? Od około sześciu lat pracuję jako programista tworzący aplikacje w języku C/C++ na platformy mobilne (Windows Mobile i Symbian). Jednak około rok temu zmieniłem pracę i obecnie pracuję z dużymi(!) systemami korporacyjnymi o wysokich wymaganiach bezpieczeństwa i dostępności, wszystkie opracowane w Javie. Mój problem polega na tym, że mam trudności z opanowaniem architektury systemów, nawet po roku pracy z nimi, a zrozumienie systemów zbudowanych przez innych ludzi nigdy nie było moją mocną stroną. Fakt, że nie pracowałem wcześniej z systemami korporacyjnymi, nie pomaga. Czy ktoś ma dobre podejście do uczenia się i rozumienia dużych systemów? Czy są jakieś konkretne techniki i/lub wzorce, o których powinienem się zapoznać?


title: Udział w projekcie open source

text: Jestem nowy w programowaniu open source. Chcę dodać kilka funkcji do projektu PRISM o otwartym kodzie źródłowym. Ale nie mogłem znaleźć żadnego przewodnika dla programistów ani przewodnika po architekturze kodu. Jak mam zacząć używać jego kodu. Właśnie zaimportowałem plik archiwum do Eclipse i zacząłem czytać kod. Chcę zapytać, czy są jakieś konkretne narzędzia, które mi pomogą?


title: Jak radzić sobie z kodem nie dość przestarzałym?

text: Jest to często zadawany temat... Przeczytałem wiele postów, artykułów i zaraz przeczytam książkę „Efektywna praca z Legacy Code”, ale wcześniej i głównie dlatego, że książka zajmie więcej niż kilka dni. przyjeżdżam i chciałbym utrzymać zdrowie psychiczne w ryzach, oto pytanie: patrzę na nie tak stary (1-2 lata) kod firmy, do której niedawno dołączyłem, i znalazłem tam tak wiele złych praktyk że to prawie łamie serce... Masowe powielanie kodu, zmienne globalne (które są niespójnie używane) i takie rzeczy jak używanie klasy fabrycznej do tworzenia instancji różnych obiektów, które rozszerzają obiekt nadrzędny... a następnie wywoływanie metod, które nie istnieją w rodzica, ale są zdefiniowane we wszystkich podklasach... Kod działa... Rygorystycznie zapewnia kontrolę jakości, a błędy są na minimum, co jest w porządku... ale tak bardzo się boję patrząc na kod... Niedawno zapytałem mój szef, gdybym mógł zrefaktoryzować całą bazę kodu, zapytał, jak mogę zagwarantować, że zmiany nie zostaną zepsuć cokolwiek, poprosiłem, abyśmy mogli zainwestować trochę czasu w stworzenie _prawdziwych_ testów jednostkowych, ponieważ ich tak zwane testy jednostkowe są w rzeczywistości testami end-to-end, więc musimy śledzić dziennik debugowania za każdym razem, gdy coś się zepsuje. Powiedział, że nie mamy wystarczająco dużo czasu, aby stworzyć testy jednostkowe (w rzeczywistości kod nie jest bardzo testowalny jednostkowo, ponieważ jest tak wiele ciasno połączonych kodów ... i musiałbym prawie przepisać większość klas), więc w efekcie nie mogłem nawet dokonać drobnych zmian w kodzie, jeśli nie jest on wymieniony jako błąd w trackerze problemów... To, co teraz robię, to dużo kopiowania i wklejania... wtedy dostroić to, ponieważ logika nie jest dokładnie taka sama... Co mogę zrobić? :/ Przepraszam, myślę, że po prostu się tu wyładuję, a na krótką/średnią metę nic nie mogę zrobić... westchnienie


title: Jak przeprojektować interfejs użytkownika dużego projektu?

text: Obecnie pracuję nad dość dużym projektem Androida (sieć społecznościowa, możesz ją zobaczyć tutaj, jeśli przyda się odpowiedź na pytanie). Postanowiliśmy zmienić styl całej aplikacji, zmieniając cały projekt interfejsu użytkownika. Kod, który faktycznie mam, jest złożony, jest wiele kontrolerów i jest też trochę nieuporządkowany. Czy „lepiej” pod względem czasu i czystości kodu jest branie jednego kontrolera na raz i przepisywanie go całkowicie, czy _modyfikowanie_ jednego kontrolera na raz? Układ i tak zmienia się całkowicie, więc wiem, że muszę zacząć od nowa. Może zabrzmi to głupio pytanie, ale ze zmienną "czas" naprawdę nie widzę najlepszego sposobu.


title: Kiedy wyodrębnianie metod z kodu przestaje mieć sens?

text: Obecnie studiuję metody refaktoryzacji zdefiniowane przez Martinga Fowlera (http://refactoring.com/catalog/). Podaje wskazówkę dotyczącą zastępowania fragmentów kodu jedną metodą, która wykonuje tę pracę. Jak dotąd się zgadzam, ponieważ wszyscy dowiedzieliśmy się o wadach kodu Spaghetti. Ale przykład dla tej reguły wygląda następująco: Zastępowanie void printOwing() { printBanner(); //wydrukuj szczegóły System.out.println ("nazwa:" + _nazwa); System.out.println ("kwota" + getOutstanding()); } przez void printOwing() { printBanner(); printDetails(getOutstanding()); } void printDetails (podwójnie zaległe) { System.out.println ("nazwa:" + _nazwa); System.out.println ("kwota" + zaległe); } Czy czytelność, a co za tym idzie natychmiastowe zrozumienie kodu, jest naprawdę lepsze w tym drugim przykładzie? Nic nie wskazuje na to, jakie „szczegóły” są w odniesieniu do „należności”. Na przykład, czy nazwa zostanie wyświetlona, czy istnieje inna metoda printName()? Czy zainteresowanie jest również wymienione? Aby się o tym dowiedzieć, musiałbym poszukać implementacji metody printDetail(). Sama metoda printOwing() jest już metodą drukowania. Czy nie byłoby łatwiej utrzymać kod, aby po prostu wyświetlić listę System.out.println() w tej metodzie, komentując cel, jak w pierwszym przykładzie, zamiast „rozproszyć” kod w ten sposób? Czy istnieje praktyczna zasada mówiąca o tym, kiedy przestać „metodować”, a kiedy nadal ma to sens?


title: Jak przekonać szefa, że jakość jest dobra w kodzie?

text: Mój szef przyszedł dziś do mnie z pytaniem, czy moglibyśmy zaimplementować określoną funkcję w 1,5 dnia. Rzuciłem okiem na to i powiedziałem mu, że 2-3 dni byłyby bardziej realistyczne. Zapytał mnie wtedy: „A co, jeśli zrobimy to szybko i brudno?” Poprosiłem go, żeby wyjaśnił, co miał na myśli mówiąc „szybko i brudno”. Okazuje się, że chce, abyśmy napisali kod tak szybko, jak to tylko możliwe, przez (na przykład) kopiowanie bitów i kawałków z innych projektów, umieszczanie _całego_ kodu w kodzie za stronami WebForms, przestanie przejmować się DRY i SOLID i zakładając, że kod i funkcje nigdy nie będą musiały być modyfikowane ani zmieniane. Co gorsza, nie chce, abyśmy robili to tylko dla tej jednej funkcji, ale dla _całego_ kodu, który piszemy. > Możemy zarobić więcej, gdy robimy rzeczy szybko i brudno. Klienci nie chcą > płacić za Ciebie, biorąc pod uwagę, że coś _może_ się zmienić w > przyszłości. Zyski dla nas to jak najszybsze dostarczenie kodu. Dopóki > aplikacja robi to, co powinna, jakość kodu > nie ma znaczenia. Nigdy nie widzą kodu. Próbowałem go przekonać, że to zły sposób myślenia jako menedżer firmy programistycznej, ale po prostu nie słuchał moich argumentów: * **Motywacja programistów:** Wyjaśniłem, że ciężko jest zatrzymać programistów zmotywowani, gdy są stale pod presją nierealistycznych terminów i budżetu, aby bardzo szybko napisać niechlujny kod. * **Czytelność:** gdy projekt zostanie przekazany innemu programiście, czystszy i lepiej ustrukturyzowany kod będzie łatwiejszy do odczytania i zrozumienia. * **Możliwość konserwacji:** Łatwiej, bezpieczniej i mniej czasochłonnie dostosowywać, rozszerzać lub zmieniać dobrze napisany kod. * **Testowalność:** zwykle łatwiej jest testować i znajdować błędy w czystym kodzie. Moi współpracownicy są równie zakłopotani, jak ja, z punktu widzenia mojego szefa, ale wydaje się, że nie możemy do niego dotrzeć. Ciągle powtarza, że robiąc rzeczy szybciej, możemy sprzedawać więcej projektów, żądać za nie niższej ceny, a jednocześnie osiągać większy zysk. I w końcu te projekty płacą deweloperom pensje. Co więcej mogę powiedzieć, żeby zobaczył, że się myli? Chcę mu kupić kopie Peopleware i The Mythical Man-Month, ale mam wrażenie, że nie zmienią też jego zdania. Wielu z was prawdopodobnie powie coś w stylu „Uciekaj! Wynoś się _teraz_!” lub „Zrezygnowałbym!”, ale tak naprawdę nie jest to opcja, ponieważ zadania związane z tworzeniem stron internetowych .NET są raczej rzadkie w regionie, w którym mieszkam... * * * # Zaktualizuj Wow, nie spodziewałem się, że otrzymam tak wiele odpowiedzi . Dziękujemy wszystkim za wkład i opinie! Jak wskazuje wiele odpowiedzi i komentarzy, rodzaj firmy i rodzaj projektów odgrywają dużą rolę w tym temacie. Wyjaśniłem tutaj kilka rzeczy w komentarzach do niektórych odpowiedzi, ale prawdopodobnie lepiej dodać to również tutaj. Firma, w której pracuję, jest niewielka. Mamy 4 programistów, 1 projektanta, 1 szefa i 1 specjalistę nietechnicznego (żonę szefa). Realizowane przez nas projekty można podzielić na dwie kategorie: 1. Niewielkie strony internetowe zbudowane we własnym frameworku CMS lub e-commerce (65%) 2. Średnie aplikacje webowe (35%) Tak więc, podczas gdy wiele naszych projektów jest raczej małych , są one zbudowane na tym samym systemie. Ten system ma około 4 lat, a baza kodu jest co najmniej poniżej normy. Zawsze boimy się dodawać nowe funkcjonalności lub modyfikować standardowe funkcjonalności dla konkretnych klientów. Jednym z celów wyznaczonych przez szefa jest przeniesienie naszej uwagi na rozwój produktu. Oznacza to, że będziemy rozwijać większe aplikacje, które będą służyć jako baza dla innych projektów lub będą czymś podobnym do SaaS. Całkowicie zgadzam się, że robienie rzeczy szybkich i brudnych może być najlepszym rozwiązaniem dla niektórych projektów. Ale kiedy rozszerzasz istniejący CMS, który będzie używany przez wszystkie witryny, które opracujesz w ciągu najbliższych kilku lat lub budujesz produkt SaaS od podstaw, myślę, że są lepsze podejścia.


title: Jak efektywnie kodować?

text: Często porównuję swój kod z innymi i uważam, że ich rozwiązanie jest wydajniejsze i krótsze niż moje. Chociaż oba rozwiązania działają, nie mogę na to poradzić, ale zastanawiam się, czy moje nie jest wystarczająco adekwatne. W rezultacie czasami dostaję blokadę psychiczną, gdy mam zamiar rozpocząć projekt, ponieważ ciągle zastanawiam się, czy moje rozwiązanie jest najlepsze. Czy są jakieś kroki, które można podjąć, aby kodować w bardziej efektywny sposób?


title: Jaki jest najskuteczniejszy sposób na dodanie funkcjonalności do nieznanego, strukturalnie niepoprawnego kodu?

text: Jest to prawdopodobnie coś, z czym prędzej czy później każdy musi się zmierzyć podczas rozwoju. Masz istniejący kod napisany przez kogoś innego i musisz go rozszerzyć, aby działał zgodnie z nowymi wymaganiami. Czasami jest to proste, ale czasami moduły mają sprzężenie od średniego do wysokiego i od średniej do niskiej spójności, więc w momencie, gdy zaczynasz czegokolwiek dotykać, wszystko się psuje. I nie czujesz, że zostało to naprawione poprawnie, gdy nowe i stare scenariusze znów działają. Jednym z podejść byłoby pisanie testów, ale w rzeczywistości we wszystkich przypadkach, które widziałem, było to prawie niemożliwe (opieranie się na GUI, brakujące specyfikacje, wątki, złożone zależności i hierarchie, terminy itp.). Więc wszystko sprowadza się do starego dobrego podejścia do kodowania kowbojskiego. Ale nie wierzę, że nie ma innego systematycznego sposobu, który ułatwiłby wszystko. Czy ktoś zna lepsze podejście lub nazwę metodologii, którą należy zastosować w takich przypadkach?


title: Czy powinienem zacząć refaktoryzować ten niechlujny projekt, nawet jeśli wiem, że nie będę miał czasu na całkowitą refaktoryzację wszystkiego?

text: Mam ten starszy projekt (pierwsze wydanie 2005-ish), który odziedziczyłem, że klient prosi mnie o naprawienie lub dodanie czegoś od czasu do czasu. To trochę bałagan w architekturze. Zasadniczo jest to witryna ASP.NET WebForms, w której 90% logiki znajduje się w kodzie za plikiem każdego widoku, a pozostałe 10% znajduje się w warstwie dostępu do danych. Chociaż „warstwa” może być niewłaściwym słowem, ponieważ cały dostęp do danych jest po prostu ułożony w jednej usłudze, wszechstronnej klasie linii 3500 z kodem ADO.NET. Wszystkie inne części witryny używają tej jednej usługi do wszystkiego. Sam nadal jestem nowicjuszem, z około 2 letnim doświadczeniem w pracy. I za każdym razem, gdy wracam do tego projektu, czuję się gorzej, ponieważ nauczyłem się i widziałem, jak lepiej robić architekturę w innych projektach. Więc chociaż wyczuwałem zły kod w tym projekcie prawie od pierwszego dnia, teraz jest to prawie nie do zniesienia. Żadna logika biznesowa nie jest testowalna i zawsze są mniejsze błędy, o których wiem, że zostałyby wyłapane wcześniej, gdy byłyby na miejscu testy i lepiej zdefiniowana warstwa biznesowa. Moim dylematem jest więc to, że chcę zrefaktoryzować to za pomocą MVP (na przykład https://github.com/webformsmvp/webformsmvp), przenieść logikę z kodu i usługi dostępu do danych do warstwy biznesowej, a przynajmniej podzielić duża klasa repozytorium na mniejsze repozytoria. Problem polega na tym, że klient nie jest skłonny poświęcić czasu ani pieniędzy na taką ilość pracy w jednej partii, więc rozważam refaktoryzację bitów i elementów, gdy się z nimi spotykam, aby była to refaktoryzacja przez dłuższy czas. Jednak nie jestem pewien, czy powinienem jeszcze bardziej zepsuć bazę kodu, wprowadzając wiele nowych koncepcji, architektury i frameworków, jeśli nie jestem pewien, czy mogę sam dokończyć pracę. Czuję się trochę źle, zostawiając projekt w stanie częściowo zrefaktoryzowanym, w którym facet po mnie może nie teraz, od czego zacząć lub jak kontynuować refaktoryzację (lub jeśli w ogóle to zrobi i zamiast tego kontynuuje swoją własną ścieżką).


title: Jeśli TDD to projekt, skąd wiesz, że TDD jest dobrze zaprojektowane?

text: Biorąc pod uwagę dużą grupę (50+) programistów: * Wszyscy mają ten sam problem, * Wszyscy używają Test-Driven Development (TDD), * Wszyscy programują w parach, * Wszyscy robią przegląd kodu w oparciu o grupy, osobiście widziałem szerokie spektrum testy, które są możliwe dla tego samego problemu, nawet w pierwszym teście. Tak więc, jeśli TDD to projekt, skąd wiesz, że twoje TDD jest optymalne dla obecnego problemu, a skąd wiesz, że tak nie jest? Czy po pierwszym teście podejście do przeglądania kolejnych testów jest inne, a jeśli tak, to w jaki sposób?


title: Jak odnaleźć swoją drogę w głęboko zagnieżdżonym, interfejsowym kodzie?

text: Wiem, że większość ludzi nienawidzi płaskich i długich funkcji i nienawidzi, gdy kod nie jest pełen ISothings. Problem polega na tym, że myślę, że mój umysł działa inaczej i zawsze mam problemy z tego typu kodem w każdym nietrywialnym rozwiązaniu. Skoro większość ludzi lubi ogromną liczbę funkcji, czy możesz opisać, jaka jest preferowana metoda w przypadku nieznanych baz kodu napisanych w ten sposób? Póki co dla mnie wygląda to tak: mam obiekt z interfejsem IFoo, super, muszę go rozbudować metodą Bar1. Wyszukiwanie wsteczne, nigdzie nie lądujemy, globalne wyszukiwanie, kto implementuje IFoo, to Baz1, Baz2, Baz3, Baz4, są one tworzone przez 3 klasy fabryk. Zaczynamy więc jeden po drugim, definicja Baz1 wygląda ładnie, ale jej zachowanie jest całkowicie zależne od parametrów użytych podczas tworzenia obiektu poprzez fabrykę klas. A co gorsza, jest to po prostu opakowanie wokół innej funkcjonalności jeszcze innej klasy z IFooBar. Który ponownie wykorzystuje wewnętrzną implementację klas z ISomethingElse, która ponownie zamienia się w wybuchowy wykres. Jak tak skutecznie nawigujesz?


title: OO - czy dopuszczalne są duże klasy?

text: Mimo wielu lat w IT wciąż zmagam się z projektowaniem OO. Wydaje się, że jednym szczególnym problemem, z którym ciągle mam do czynienia, są duże klasy, często zawierające wiele setek linii kodu. Świat OO dużo mówi o SRP i _mógłbym_ argumentować, że te duże klasy, z którymi kończę, są odpowiedzialne za jedną odpowiedzialność. Złożona natura aplikacji (systemu przetwarzania danych naukowych) oznacza, że jeden z tych obowiązków wymaga strasznie dużo kodu! Np. klasa może mieć pojedynczą metodę publiczną `Calculate()`, ale może istnieć 15-20 lub więcej prywatnych metod do obsługi tej operacji. Tam, gdzie to możliwe, wydzielę metody do oddzielnych klas w celu ponownego wykorzystania, ale często nie ma na to zbyt dużego zakresu. Część mnie mówi, że powinienem podzielić te duże klasy wyłącznie po to, aby poprawić czytelność (np. grupując podobne metody we własne klasy), ale czasy, w których to robiłem, wydają się zmarnowanym ćwiczeniem – wszystko, co naprawdę zrobiłem, to rozpowszechnienie metod wokół, stworzył więcej zależności klasowych i utrudnił innym programistom znalezienie rzeczy. Ale potem czytam artykuły, w których programiści opowiadają o tym, że wszystkie ich klasy są wystarczająco małe, aby zmieścić się na ekranie bez przewijania i martwię się, że robię coś źle! W poprzedniej pracy pracowałem nad systemem, w którym był on ekstremalny i często widywałem klasy zawierające tylko jedną metodę, często z nie więcej niż jedną lub dwiema liniami kodu. Osobiście uważam, że jest to trudne do odnalezienia się w kodzie i do debugowania, iz tego powodu (i samej liczby klas) mógłbym argumentować, że staje się trudniejsze w utrzymaniu - nie jest to cel dobrego projektowania OO. Myślę, że to zależy od osobistego gustu. Czy to dopuszczalne, aby mieć duże klasy, czy możesz zasugerować inne sposoby, w jakie mógłbym sobie z nimi poradzić?


title: Kto powinien dostarczyć dokument wymagań / SRS?

text: Tworzę aplikację mobilną (CRM) dla innej firmy programistycznej. Powiedzieli mi, że potrzebują tych rzeczy tu i tam, w ciągu 15-30 minut. Ale nigdy nie przedstawili szczegółowego dokumentu wymagań klienta na piśmie. Pytałem o to wiele razy, ale nadal nie. Jak tylko zacząłem pracować, zdałem sobie sprawę, że to, co mówią ustnie, to nawet 10% pracy. Najpierw poprosili mnie o opracowanie własnego projektu, który jest podobny do innej wspomnianej aplikacji. Zrobiłem, w 100% podobny projekt do wspomnianej aplikacji. Potem powiedzieli, że im się to nie podoba, więc dali mi swój projekt. Skończyłem tam projekt i złożyłem. Teraz znowu mówią, że nie podoba im się ich własny projekt i proszą mnie o wykonanie innego projektu! Poza tym proszą teraz o „Animacje przesuwne aktywności”, „Windows Like UI” itp. Aby to zrobić, muszę usunąć całą wykonaną przeze mnie pracę i zacząć od scrachu, ponieważ można to zrobić za pomocą Fragmentów, a moja zawiera Działania. Nawet nie mam pojęcia, jak będzie wyglądał backend. Nawet po miesiącu nadal projektujemy i zmieniamy projekt (ponieważ musisz wysłać minimum 3-4 maile, skontaktuj się telefonicznie z przynajmniej 2 z ich zespołu. Bardzo powolna komunikacja). I czy zapłacą za zniszczone projekty? Nie sądzę. A co z innymi moimi klientami, którym powiedziałem „nie” z powodu braku czasu, jaki będę miał z powodu tego projektu? Czuję się prawie szalony. Zawsze mówią, że wymyśl własny pomysł, ale w tej sytuacji jest to bardzo ryzykowne. Jeśli mój pomysł nie zostanie zaakceptowany, strata czasu i pieniędzy. Jestem tym tak zmęczony, że zmarnowałem dużo czasu projektując dwa w 100% różne projekty i mam zamiar przejść do 3. Ponieważ nie wiem, jak będzie wyglądało oprogramowanie, nie robiłem też oszacowania kosztów. Więc moje pytanie brzmi: klient nie powinien podawać ci żadnych udokumentowanych wymagań? Może być SRS? (Miałem na myśli SRS, kompletny, szczegółowy dokument o funkcjonalności, której potrzebują. Wliczając w to te „animacje”, ponieważ nie mam super mocy, aby zgadywać) Dostarczony przez nich dokument wymagań jest bezużyteczny, mówi tylko „aktualizuj”, „usuń” , "edytować". Wszyscy moi pozostali klienci dostarczyli kompletne dane, niektórzy dostarczyli nawet szkice procesu projektowania, z wyjątkiem tego. Powinni przynajmniej szczegółowo przedstawić mi swoje wymagania, na piśmie, tutaj potrzebuję porady.


title: Jak radzić sobie ze złym kodem?

text: > **Możliwe duplikowanie:** > Techniki na refaktoryzację śmieci i utrzymanie zdrowego rozsądku? > Utrzymanie kodu: utrzymywanie złego wzorca podczas rozszerzania nowego kodu, aby był > spójny, czy nie? Zostałem zatrudniony około 6 miesięcy w firmie, która używa Agile, ale po zapoznaniu się z kodem zdałem sobie sprawę, że to zły kod - metody z ponad 100 linijkami kodu, zduplikowany kod, metody, które mówią, że robi jedną rzecz, ale robi kilka innych niezwiązanych rzeczy. Działa, ale im więcej go aktualizujemy, tym bardziej przypomina domek z kart. Refaktoryzacja jednej małej rzeczy wymaga zmiany wielu innych, co może uniemożliwić działanie programu. Co poszło nie tak i czy można to naprawić? Myślałem, że agile ma stworzyć dobry kod.


title: Ile dni to normalne, że nowy programista ds. zatrudnienia potrzebuje, aby nabrać tempa?

text: Właśnie dostałem rolę programisty C#/Asp.Net w dużym software house. Wcześniej pracowałem w znacznie mniejszym software house przez około dwa lata, ale była to zróżnicowana/mieszana rola, a tutaj aplikacje asp.net, które mamy, są około 10 razy większe. Jak się wydaje normą, powierzono mi zadanie naprawiania błędów. W tej chwili próbuję tylko zrozumieć system. Z Twojego doświadczenia wynika, że jak długo zajmuje „w przybliżeniu” (i jest ogólnie akceptowalne), aby nowy programista zaczął nabierać tempa? Oczywiście różni się to w zależności od firmy, ale co do zasady, kiedy zatrudniłeś kogoś/pracowałeś z kimś nowym, ile dni/tygodni byłoby normalne, aby zmierzyli się z systemem?


title: Czas potrzebny na rozpoczęcie kodowania w nowej firmie

text: Jestem inżynierem oprogramowania od 4 lat i właśnie zmieniłem swoją firmę po raz pierwszy. Firma zajmuje się programowaniem w parach, a minęły 3 dni, nie mogłem nawet napisać ani jednej linijki kodu. To dla mnie takie frustrujące, ponieważ byłem bardzo produktywny w mojej poprzedniej firmie. Baza kodu jest duża, używają 5-6 języków/narzędzi, których nie znam, takich jak rspec, haml, jasmine i inne. Ale nadal czuję się okropnie. W ten weekend stworzyłem UML, aby lepiej zrozumieć działanie aplikacji, ale wciąż domyślam się, że nie dam rady napisać przyzwoitej ilości kodu w tym tygodniu. **Czy to normalne?** _Jakie jest Twoje doświadczenie, gdy zmieniasz pracę i zanurzasz się w obszernej bazie kodu napisanego w językach/bibliotekach, których nie znasz._ **Oczywiście nie pytam o _dokładny_ czas wymagany, ale przeszłe doświadczenia lub rzeczy, które sprawią, że proces będzie świetny.** Btw, przeczytałem już poniżej pytania i odpowiedzi, Jak zanurzyć się w dużych bazach kodu? http://stackoverflow.com/questions/215076/whats-the-best-way-to-become-known-with-a-large-codebase http://stackoverflow.com/questions/2146055/the-best-way -aby-zapoznać-się-z-odziedziczoną-bazą-kodu **AKTUALIZACJA** Wszystkie świetne sugestie! Właśnie wróciłem z pracy, dużo pracowałem! _**O programowaniu w parach:_** Generalnie piszą kod, a ja staram się nie przegapić ani sekundy! Jeśli spróbuję napisać kod, to wiem, że zajmie to wieczność, bo nawet nie wiem, które pliki edytować, ale poza tym, jak powiedziałem, używają 6-7 języków/frameworków, których nie jestem zaznajomiony i uczenie się wszystkich tych składni naraz nie jest łatwe. _**Jak dobrze firma przygotowała się dla inżynierów:_** Nie mogę powiedzieć, że są dobrze zorganizowani, oczekują, że natychmiast zacznę pisać kod. _**Robienie notatek, bycie proaktywnym:_** Zawsze robię notatki, kiedy piszą nowe polecenie/lub cokolwiek o modelach danych. Moi rówieśnicy to bardzo mądrzy i życzliwi ludzie, a ja staram się zadać mnóstwo pytań, czasami nawet **wiele głupich pytań**. _**Czy to powszechne?:_** @Telastyn, dzięki za odpowiedzi, poczułem się trochę lepiej. Wygląda na to, że mój problem nie jest taki rzadki, ale byłem naprawdę produktywny przed tą pracą, a teraz naprawdę czuję się bezużyteczny i niemądry. Mam nadzieję, że wkrótce zacznę rozwiązywać błędy/problemy z wdrażaniem. _**O frameworkach/językach, których używają:_** Byłem naprawdę szczery, nie powiedziałem, że wiem coś, czego właściwie nie wiem. Ale nie spodziewałem się aż tak wielu różnych rzeczy, a odkąd zacząłem pracę w dniu, w którym przyjąłem ofertę, nie miałem czasu się przygotować. @Southpaw Hare, wielkie dzięki za podzielenie się swoimi doświadczeniami. Masz absolutną rację. Nie ma gwarancji, że nauczę się tych wszystkich rzeczy, ale próbuję. W końcu ciężko jest nauczyć się całej składni na raz i myślę, że to też jest główny problem. Ponieważ potrafię dobrze nawigować w kodzie ruby, ponieważ znam ten język, a nawiguję w kodach js dzięki inspektorom przeglądarki, ale problem polega na pisaniu rzeczywistych kodów za pomocą frameworków/języków, których nie znam.


title: Co zrobić ze złym kodem źródłowym?

text: Zostałem zakontraktowany na modyfikację aplikacji dla firmy programistycznej, a kod źródłowy jest szczerze mówiąc bałaganem. Mało komentowane, a autor jest niezgodny z konwencjami kodowania. Facet wydaje się doświadczony, ale jego styl nie jest świetny. Co proponujesz zrobić, aby projekt został wykonany poprawnie i aby było łatwiej? **Edytuj** Nie chciałem powiedzieć _przepisać_, zostałem zatrudniony do modyfikowania interfejsu użytkownika w określonej części aplikacji. Nie sądzę, że klientowi zależy tak bardzo na tym, co robię z kodem źródłowym, o ile działa i o ile jest to kod dobrej jakości. To powiedziawszy, rozszerzyłem niektóre > if(condition) ? TrueResult : FalseResult; dla czytelności. Chociaż nie wydaje mi się, żeby były one szczególnie złym kodem, istnieje niespójność w stylu w całym kodzie i kilka „pozostawionych” stałych, które nie wydają się być nigdzie używane. Istnieje również kilka arbitralnych liczb, w których stałe byłyby rozsądne ze względu na czytelność. Nie jest tak źle, jak początkowo sądziłem, ale wciąż mam kilka pytań do oryginalnego programisty.


title: Jak radzić sobie ze złą bazą kodu

text: Firma, w której pracowałem, odziedziczyła ostatnio niestandardowy system CMS, który jest bardzo błędny, brak dokumentacji i nieczytelna logika we wszystkim. Klient nie będzie miał budżetu na ponowną platformę przez kolejne 6 miesięcy lub dłużej. Problem, który mamy, polega na tym, że naprawianie błędów zazwyczaj wymaga albo łatania, albo całkowitego przepisania całej funkcjonalności/funkcji i jest niezwykle trudne do oszacowania czasu. Czy powinniśmy kontynuować łatanie, dopóki nie zmienią platformy lub nie zmienią całej funkcjonalności i nie dodadzą dokumentacji?


title: Alternatywy przepisywania oprogramowania

text: Mamy do zaktualizowania przestarzały system, ponieważ: 1. Używa niepopularnej (wśród naszych użytkowników) bazy danych innej niż SQL (Btrieve) 2. Zapewnia tylko interfejs tekstowy 3. Jest napisany w Turbo Pascal (ale skompilowany w free pascal), który jest trudny do zrekrutowania/zatrzymania programistów, aby go utrzymać. Aby dać ci wyobrażenie o skali, baza kodu to 15 MB na 756 plikach. Wszystkie badania, do których się przyjrzałem, takie jak te wymienione tutaj, sugerują, że przepisanie jest znacznie droższe niż dostosowywanie tego, co masz. Gdybym pomyślał, że moglibyśmy zawrzeć w sobie elementy starszej wersji usługi sieciowej, a następnie zaprojektować nowego klienta (klientów), to byłoby w porządku. Ale utknąłem z tą starszą bazą danych, do której odnosi się 90% z tych 756 plików. Próbowaliśmy nawet zastąpić niskopoziomowy kod DB kodem do konwersji na SQL i chociaż wszystko działało dobrze, było zbyt wolne, ponieważ kod nadal uzyskuje dostęp do rekordów pojedynczo, generując o wiele za dużo instrukcji SQL, niż byłoby to potrzebne. Dodatkowo takie podejście nie pozwala na żadne ulepszenia w projekcie DB. W obliczu takiego wstrząsu, jak zastąpienie bazy danych, do której tak często odwołuje się kod i inne wymienione wymagania, czy ponowne użycie może nadal być opłacalne, czy też lepiej potraktować nową wersję jako zupełnie nowy produkt i po prostu wymienić obecne możliwości systemu jako wymagania (pamiętając, że nie istnieje podręczny dokument wymagań dla bieżącego systemu). Wiem, że jest zbyt trudno udzielić ostatecznej odpowiedzi na ten temat, więc każda rada byłaby mile widziana, zwłaszcza jeśli doświadczyłeś podobnej sytuacji.


title: Rozpoczęcie powtarzającego się projektu od podstaw

text: Mamy projekt, który się powtarza. Klient oczekuje od nas prowadzenia strony internetowej dwa razy w roku i tak się dzieje przez ostatnie półtora roku. Wziąłem ostatnią kopię roboczą i na niej oparłem naszą najnowszą stronę internetową. Teraz współpracownik zasugerował, że następnym razem powinniśmy zacząć od zera, zamiast walczyć ze starszym kodem. Zacząłem już refaktoryzację istniejącego kodu, podobnie jak inni programiści, którzy brali udział w projekcie. Kod jest czystszy niż wcześniej i spełnia potrzeby klienta. Refaktoryzacja trwała, podczas gdy opracowywaliśmy nowe funkcje. Jakie są dobre powody, by odradzać zaczynanie od zera?


title: Jak przekonać szefa do poprawy jakości kodu?

text: Miejsce, w którym pracuję, to usługodawca. Mamy wiele usług, które są napisane z myślą o terminach, więc ich kod jest naprawdę okropny: * Brak konwencji kodowania, każdy koduje w swoim własnym stylu * Brak testów jednostkowych (co jest naprawdę złe) * Brak refaktoryzacji (co jest naprawdę gorzej) * Brak budowania/wdrażania automatyzacji itp., a ten kod jest używany wielokrotnie, więc zły kod nadal rozprzestrzenia się po całym moim dziale. Naprawdę chcę ustalić standardową jakość naszego kodu, wymagając od wszystkich przestrzegania „reguł”: każda linia kodu, która nie jest zgodna z konwencją, zostanie odrzucona, a każda funkcja kodu, która nie przejdzie testów jednostkowych, nie zostanie zatwierdzona ...Ale nie wiem, jak przekonać szefa, żeby mi na to pozwolił. Jestem stosunkowo nowicjuszem, więc inspirowanie ludzi moimi pracami jest naprawdę trudne i myślę, że łatwiej będzie, jeśli mój szef będzie mnie w tym wspierał. Bardzo dziękuję za rady


title: Rozszyfrowanie obcego kodu

text: Jaka jest najlepsza strategia, aby zrozumieć czyjś kod dla średniej wielkości projektu, jeśli kod nie jest dobrze udokumentowany i nie jest zgodny z wieloma standardami kodowania?


title: Co mogę zrobić ze źle zakodowanym projektem vb6/access2003?

text: Obecnie pracuję nad dużym projektem vb6 i ponieważ nie jestem liderem zespołu (jesteśmy tylko 2), ale będę w niedalekiej przyszłości zacząłem się zastanawiać nad poprawą kodu i struktury danych . Jest 5 słabo zakodowanych projektów, w sumie 60-70 formularzy. Kod jest naprawdę zły, próbowałem go poprawić za pomocą funkcji, aby uniknąć powtórzeń, ale nadal jest okropny. Zajęłoby mi całe życie, aby opisać wszystkie złe rzeczy. Baza danych jest jeszcze gorsza, jest 5 .mdb (dostęp 2003) źle zaprojektowanych, osoba, która je utworzyła nie wie, co to jest normalizacja, więc Indeksy są losowe, brak relacji między tabelami (niektóre tabele, które powinny być powiązane, są na różnych Dbs...) i tak dalej. Współczuję użytkownikom, którzy z tego korzystają, a za każdym razem, gdy coś źle wpisują, muszą ponownie uruchomić aplikację, ponieważ nie ma kontroli nad błędami. Poza tym jest powolny jak diabli (DB są na lokalnym serwerze, aplikacje są lokalne). Od czego powinienem zacząć? Myślałem o pozbyciu się Accessa, ale jaki jest sens, jeśli struktura została tak źle pomyślana?


title: Zbieranie wymagań od mylącego współpracownika

text: Pracuję na moim pierwszym stażu w oprogramowaniu i jak na razie jest super. Jednym z problemów, jaki mam, jest jednak uzyskanie jasnych wymagań od mojego współpracownika (nazwiemy go Osoba A), który przypisuje projekty. Zwykle otrzymuję wymagania od współpracownika/menedżera, projektuję/koduję/testuję moje zmiany i ostatecznie zlecam ich integrację w naszym produkcie. Problem polega na tym, że dość często praktycznie niemożliwe jest uzyskanie jasnych wymagań od osoby A. Zadam pytania, aby lepiej zrozumieć, jaki problem jest rozwiązywany, i często zdarza się jedno z poniższych: * Osoba A przerywa w połowie zdania do myśl na głos, wykolejając obecną rozmowę. Czasami dzieje się tak z dobrego powodu. Przykład: > Ja: "Więc jeśli powinna istnieć tabela mapująca Bazzes do Foos, co by było, gdyby była > była-"> > Osoba A: "Właściwie zastanawiam się, czy rzeczywiście musimy dodać BizzleContainer > w tym tutaj." > > [Czekam kilka minut, aż A przemyśli swoją niezwiązaną myśl i > staram się ją rozwiązać.] To powtórzy się kilka razy i do czasu zakończenia rozmowy jestem bardziej zdezorientowany niż wtedy, gdy zaczął i minęło pół godziny, więc nie chcę dłużej marnować czasu tej osoby. Zwróć uwagę, że nie miałbym nic przeciwko, gdyby przerwanie było związane z bieżącym tematem, ale wydaje się, że przerywanie komuś, aby poprowadzić rozmowę na zupełnie inną ścieżkę, jest kiepską formą. * Osoba A często ledwo rozumie wymagania. Czynniki te składają się na marnowanie dużej ilości czasu na rozwój w oparciu o proste nieporozumienia dotyczące tego, co należy zrobić. Współpracownicy B i C potrafią jasno wyrazić, co należy zrobić, ale często są przepełnieni wymaganiami dotyczącymi ich czasu. Więc zamiast irytować B i C, aby uzyskać wyjaśnienia wymagań, współpracownicy często przechodzą do A i uzyskują mniej niż satysfakcjonujące wyniki. Jak wycisnąć jasne, poprawne wymagania od kogoś, kto je rozumie, ale nie ma ochoty poświęcać czasu/wysiłku na wyjaśnienie, czym one właściwie są?


title: Jak radzić sobie z okropnymi decyzjami projektowymi

text: Jestem konsultantem w jednej firmie. Jest inny konsultant, który jest o rok starszy ode mnie i pracuje tu 3 miesiące dłużej niż ja i jest programistą na pełen etat. Programista na pełen etat jest świetny. Obawiam się, że widzę, jak konsultant podejmuje absolutnie okropne decyzje projektowe. Na przykład relacje M:M są przechowywane w bazie danych jako ciąg znaków oddzielonych przecinkami, a nie za pomocą tabeli łączącej do przechowywania relacji. Rozważmy na przykład dwie tabele, Samochód i Własność: Rekordy samochodów: * Camry * Volvo * Mercedes Rekordy własności: * Opona zapasowa * Radio satelitarne * Obsługa iPoda * Standard Zamiast tworzyć tabelę CarProperties, aby to przedstawić, stworzył „Nieruchomość Atrybut „ w tabeli Samochód, którego dane wyglądają jak „1,3,7,13,19,25”. Nienawidzę tego, jak ta i inne decyzje wpływają na jakość mojego kodu. W ciągu ostatnich dwóch miesięcy, odkąd tu jestem, trzy razy kłóciliśmy się o ten projekt. Zapytał mnie, dlaczego moja sugestia była lepsza, a ja odpowiedziałem, że nasza baza danych będzie eliminować zbędne dane poprzez konwersję do wyższej normalnej postaci. Wyjaśniłem, że ta wada projektowa jest w szczególności omawiana i odradzana w programach dla początkujących studentów, a on odpowiedział strzałem do mnie, mówiąc, że te właściwości bazy danych z wartościami rozdzielanymi przecinkami są nauczane, gdy robisz swoje prace magisterskie (czego żaden z nas nie ma) . Nie trzeba dodawać, że bardzo się zdenerwował i zażądał, abym przeprosił za krytykę jego pracy, co zrobiłem, aby nie być konsultantem przy tworzeniu dramatu biurowego. Nasz kierownik projektu koncentruje się na dostarczeniu produktu JAK NAJSZYBCIEJ i jest bardzo silną osobowością - zasugerowanie mu w tym momencie, że spędzimy trochę czasu, aby zrobić to dobrze, zniechęci go. Istnieje duże prawdopodobieństwo, że oba nasze kontrakty zostaną przedłużone o pracę nad kolejnym projektem. Jak będę w stanie wywrzeć dominujący wpływ na projekt systemu i model danych, aby tak okropne błędy nie powtórzyły się w kolejnym projekcie? Rzut oka na dynamikę: mogę być silną osobowością, jeśli się nie mierzę. Drugi konsultant nie ma silnej osobowości, słabo się komunikuje, jest dość uparty i uważa, że jest lepszy niż wszyscy inni. Kierownik projektu to niezwykle silna osobowość, która koncentruje się na wczorajszym wydaniu produktu jutra. Pełnoetatowy programista jest bardzo wyluzowany i łatwy w prowadzeniu, bardzo skuteczny komunikator, ale jest kimś, kto zaakceptuje zły projekt, jeśli oznacza to nie kołysanie łodzią. Recenzja kodu czy cokolwiek innego, co wymaga "czasu" nie wchodzi w rachubę - nie ma mowy, aby nasz PM został przez nikogo sprzedany na coś takiego.


title: Jak zrozumieć bazę kodu złożonej aplikacji open source

text: Próbuję opracować nową funkcję dla aplikacji open source. Ale istniejąca aplikacja używa różnych API, takich jak Qt i KDE3. Co więcej, istniejące pliki są również bardzo złożone i zależą od siebie. np. chciałem stworzyć obiekt PlaylistBox::Item, ale jego konstruktor jest chroniony. Więc przeszukałem bazę kodu za pomocą grep, jest jedna linia, która używa tej klasy, ale są też zmienne inicjalizacyjne tego konstruktora. Teraz, jak utworzyć te zmienne, kiedy nie mam żadnego zastosowania i sposobu ich inicjalizacji. Mój konstruktor na github, SyncList::SyncList(QWidget* parent)//: PlaylistBox(player,parent,stack) teraz jak zainicjować te zmienne PlaylistBox. To jest link do konstruktora PlaylistBox PlaylistBox::PlaylistBox(PlayerManager *player, QWidget *parent, QStackedWidget *playlistStack) : a to jest PlaylistBox::Item w tym samym pliku playlistbox.cpp#L775 PlaylistBox::Item::Item(PlaylistBox * listBox, const QString &icon, const QString &text, Playlist *l) To był tylko przykładowy przypadek, w którym mam problem. Chcę poznać podstawowe podejście do czytania tak ogromnych i połączonych ze sobą baz kodu, w których jedna klasa dziedziczy inną i tak dalej. Jak dowiedzieć się, której klasy powinienem użyć. Ciągle próbuję różnych wartości, mając nadzieję, że jedna z nich to naprawi, ale najwyraźniej robię to całkowicie niewłaściwie.


title: Jaki jest dobry sposób na samodzielne zrefaktorowanie dużej, okropnie napisanej bazy kodu?

text: > **Możliwe duplikowanie:** > Techniki na refaktoryzację śmieci i utrzymanie zdrowego rozsądku? Mam dość dużą bazę kodu PHP, którą piszę przez ostatnie 3 lata. Problem polega na tym, że napisałem ten kod, kiedy byłem okropnym programistą, a teraz wszędzie są dziesiątki tysięcy linii warunkowych i losowych zapytań MySQL. Jak możesz sobie wyobrazić, jest mnóstwo błędów, które są niezwykle trudne do znalezienia i naprawienia. Chciałbym więc mieć dobrą metodę na refaktoryzację tego kodu, aby był znacznie łatwiejszy w zarządzaniu. Kod źródłowy jest dość zły; Nie używałem nawet klas ani funkcji, kiedy to pisałem. W tym momencie rozważam przepisanie całości. Jestem jedynym programistą, a mój czas jest dość ograniczony. Chciałbym to zrobić tak szybko, jak to możliwe, abym mógł wrócić do pisania nowych funkcji. Ponieważ przepisywanie kodu zajęłoby dużo czasu, szukam metod, których mogę użyć do jak najszybszego oczyszczenia kodu bez pozostawiania złej architektury, która będzie mnie prześladować później. Oto podstawowe pytanie: Jaki jest dobry sposób, aby pojedynczy programista wziął dość dużą bazę kodu, która nie ma architektury, i przekształcił ją w coś o rozsądnej architekturze, której utrzymanie i rozszerzanie nie jest koszmarem?


title: To mój pierwszy tydzień pracy, mam sprawdzony kod i kazano mi go rozejrzeć, dopóki nie będę miał zadania w przyszłym tygodniu. Co ja robię?

text: > **Możliwy duplikat:** > Jak zagłębić się w duże bazy kodu? Byłem w takiej sytuacji już wcześniej i po prostu grzebię w kodzie, naprawdę surfując po Internecie. Zależy mi jednak na tej pracy i chcę się wyróżniać. Jakich rzeczy powinienem szukać? Jak mam zacząć uczyć się frameworka? Z mojego doświadczenia wynika, że uczę się przez działanie - ale wyraźnie oczekują czegoś ode mnie lub nie dadzą mi w tym tygodniu wymyślenia kodu.


title: Jak zrozumieć i debugować starsze oprogramowanie?

text: > **Możliwy duplikat:** > Odziedziczyłem 200 tys. linii kodu spaghetti – co teraz? Niedawno moja firma umieściła mnie w zespole, który zajmuje się niektórymi z najbardziej skomplikowanych błędów, które są w produkcji. Chodzi o to, że prawie wszystkie te błędy występują w starszych aplikacjach Mam naprawdę trudny czas na zrozumienie i debugowanie, a to są niektóre z powodów: * Zły projekt oprogramowania * Dużo duplikacji kodu * Wprowadzające w błąd komentarze * Złe nazwy * Brak dokumentacji w ogóle * Twórcy oprogramowania już nie pracują w firmie * Naprawdę duże klasy i metody, bardzo źle zaprogramowane * Błędy są bardzo słabo udokumentowane, a zespół operacyjny sporządza bardzo słabo udokumentowane raporty dotyczące występujących problemów. Jest to bardzo czasochłonne i frustrujące. Jako programista TDD i ATDD staram się zacząć od pisania testów, aby triangulować i wskazać problem, ale jest tak wiele rzeczy, z których trzeba się wyśmiewać, że jest to bardzo trudne. Również analitycy biznesowi nie podają kryteriów dla tego oprogramowania, ponieważ sami go nie znają. Jedyne, co mówią, to to, że trzeba to naprawić. Pomyślałem, że może tutaj mógłbym znaleźć kogoś z doświadczeniem w przestarzałym oprogramowaniu, który mógłby mi doradzić, jak radzić sobie z błędami w takim środowisku. Czuję, że podczas pracy z tym zajmuję się archeologią oprogramowania. Poza tym jest to bardzo stresujące, a ta duża frustracja sprawia, że czuję się bezużyteczny i bezproduktywny, ponieważ naprawa błędów zajmuje czasem tygodnie. Zawsze pracowałem nad rozwojem green field i po raz pierwszy zajmuję się wsparciem produkcji. Naprawdę byłbym wdzięczny za radę.


title: Przestudiuj kod źródłowy Doom 3

text: > **Możliwy duplikat:** > Jak zagłębić się w duże bazy kodu? Chcę przestudiować kod źródłowy dużego projektu (na przykład kod źródłowy Doom 3) i potrzebuję pomocy w ustaleniu, jak powinienem poruszać się po kodzie. Jak mam zacząć to czytać? Czy powinienem znaleźć funkcję main() i przejść dalej? Czy masz jakieś inne wskazówki, które mogą mi pomóc?


title: Jaka jest norma wprowadzania nowych pracowników do bazy kodu?

text: Po studiach pracowałem w jednej firmie przez 6 miesięcy, a dopiero teraz dołączyłem do innej, co w sumie dało w mojej dotychczasowej karierze dwa. Tak więc pierwsza firma miała kilkaset tysięcy linijek kodu, może w kilkuset plikach. Nie było absolutnie żadnego wstępu do tego, od czego zacząć naukę organizacji bazy kodu… po prostu: „Tutaj, znajdź źródło tego błędu”. To było przerażająco onieśmielające. Powoli zacząłem orientować się w interfejsie użytkownika, ale 6 miesięcy temu dopiero zaczynałem poznawać kod po stronie serwera. Byłem naprawdę szczęśliwy, że mogłem odejść z firmy... Byłem stosunkowo przerażony próbą znalezienia drogi na zapleczu, który był zdecydowanie większą częścią kodu. (Jestem front-end developerem, którego praca czasami wymaga ode mnie drobnych modyfikacji back-endu.) Ale ta nowa firma... jest duża, skupia się wokół strony internetowej... pomyśl o Amazon. 2000 pracowników. Oszacowałbym miliony linijek kodu, ale nie ma sposobu, abym wiedział na pewno. Jeden z moich współpracowników pokazał mi trójwymiarowy wykres zależności plików... Prawie zemdlałem. Wyglądało to tak: ![tutaj podaj opis obrazka](http://i.stack.imgur.com/yh6ek.jpg) Współpracownik chichotał czule, obracając go i przybliżając. Po raz kolejny nie ma przewodnika, wstępu, po prostu… proszę bardzo, zacznij kodować. Jestem przerażona i bardzo zestresowana. Praca wydaje się świetna pod każdym względem poza tym i szybko zaczynam się martwić, że nie jestem kompetentna, ponieważ wydaje mi się, że jestem jedyną osobą, której to onieśmiela. Jakie są doświadczenia innych osób z tym scenariuszem? Czy to tylko ja? Co zrobiłeś w przeszłości? Ile czasu zajmuje ci opanowanie rzeczy? Zadałem to pytanie moim współpracownikom, a oni powiedzieli „kilka tygodni”. PARA TYGODNI, ABY NAUCZYĆ SIĘ TYSIĄC PLUS PLUS, SETKI LUB TYSIĄCE LINII DŁUGICH??? Czy jestem niekompetentny? Po prosu to powiedz.


title: Jak podchodzisz do nowego projektu, w którym kod został już napisany?

text: > **Możliwy duplikat:** > Jak zagłębić się w duże bazy kodu? Mam zamiar zająć się konserwacją i ulepszeniami dość dużego i złożonego projektu Java EE z interfejsem JavaScript. Przeglądam kod, próbując dowiedzieć się, jak to wszystko się łączy, ale zastanawiałem się, czy ktoś z was wymyślił metodologię robienia tego, która najlepiej dla was działa? zaczynasz od interfejsu użytkownika i pracujesz wstecz do bazy danych? A może przepuszczać przez system dyskretne „plastry” w celu uzyskania określonych elementów funkcjonalności? Czy robisz notatki? Jak _ty_ nabrać tempa w nowym projekcie?


title: Jak idziesz o zrozumienie kodu innych?

text: Co robisz, aby zrozumieć kod, którego nie napisałeś? Albo kod, który napisałeś dawno temu i nie pamiętasz już, co robi. Czy masz jakąś technikę, którą się zajmujesz? Czy najpierw analizujesz struktury, czy metody publiczne, czy rysujesz schematy blokowe itp.? A może uruchamiasz debugger i po prostu przez niego przechodzisz? A może po prostu przechodzisz przez to ad hoc, dopóki tego nie zrozumiesz?


title: Zapobiegaj bałaganowi w kodzie

text: Jestem studentem i niezależnym programistą. Obecnie tworzę oprogramowanie w VB6, które ostatnio przekroczyło 100 KB kodu źródłowego. Głównym problemem, z którym się zmagam, jest to, że wiele razy muszę refaktoryzować mój istniejący kod źródłowy, co jest naprawdę bardzo nudne. Również rozmiar mojej bazy kodu nie jest zbyt duży (tylko 100 KB). Jakich technik powinienem użyć, aby zapobiec bałaganowi w kodzie?


title: Ogólne podejście do refaktoryzacji dużego, bardzo źle napisanego starego systemu

text: > **Możliwe duplikowanie:** > Techniki na refaktoryzację śmieci i utrzymanie zdrowego rozsądku? > Jaki jest dobry sposób na refaktoryzację dużej, okropnie napisanej bazy kodu przez > siebie? Naprawdę otwarte pytanie tutaj. Nie szukam odpowiedzi.. tylko porady. Jakiekolwiek wcześniejsze doświadczenia, jakie ludzie mieli z refaktoryzacją starszych systemów, które mogliby przekazać, byłyby niesamowite. Oto kilka informacji na temat oprogramowania, które mam przerobić (będziesz się wzdrygnąć!): * Aplikacja internetowa * Oparta na bazie danych (MySQL) * PHP4 i PHP5 * Większość kodu to PHP4 * Prawie cały kod jest proceduralny * Kod, który to PHP5 nie jest OO.. przykład: 10 000 linii + plik z jedną klasą i jedną funkcją * Zmienne globalne używane wszędzie * Do napisania oprogramowania nie użyto kontroli źródeł (można to zobaczyć w komentarzach w kodzie) * Ogromne ilości kodu powtarzalność * Brak separacji obaw - interfejs użytkownika i logika są wszędzie połączone * Aplikacja opiera się na kolejności tabel w bazie danych * Mało komentarzy do kodu * 250 000+ linii kodu * Aplikacja intensywnie użytkowana Zasadniczo oprogramowanie jest naszym podstawowym produktem i zostałem zatrudniony zrobić główny czynnik (między innymi). To ogromne zadanie i nie mogę po prostu zagłębić się i naprawić wszystkie drobiazgi... Potrzebuję ogólnej strategii. Napisałem kilka skryptów, aby uporządkować wcięcia, usunąłem wszędzie zakomentowany kod i przekształciłem projekt w repozytorium, ale teraz nadszedł czas na prawdziwe rzeczy. Mam niejasny pomysł, ale nie wiem, jak się do tego zabrać. Mógłbym jakoś zostawić obecny kod w spokoju i napisać na nim jakąś warstwę oprogramowania, która abstrahuje od wszystkich okropności. Byłoby dobrze, gdyby nowa warstwa była jakąś architekturą MVC. W tym samym czasie wszedłbym w bieżący kod, usunę redundancje, ponieważ w przeciwnym razie nowa warstwa i tak używałaby złego kodu, więc kod mógłby spowolnić jeszcze bardziej. Jak widzisz... potrzebujesz wskazówek/wskazówek/wskazówek/porad/doświadczeń! Dziękuję bardzo :).


title: Nowicjusz do średniozaawansowanych programista PHP - Jak radzić sobie z utrzymaniem kodu Spaghetti?

text: > **Możliwe duplikowanie:** > Techniki na refaktoryzację śmieci i utrzymanie zdrowego rozsądku? Dostałem więc ten projekt dla klienta, ale osoba, która napisała stronę, pierwotnie wykonała fatalną robotę (gorszy programista niż ja). Mają różne niezdarne poprawki i mam problem z ustaleniem, jakie zmienne robią co. Na przykład jedna sekcja mówi tak: $id = ""; $cuid = ""; start_sesji(); if (isset($_SESSION['id'])) { $id = $_SESSION['id']; $cuid = $id; $ważny_użytkownik = $_SESJA['ważny_użytkownik']; $cuname = $_SESSION['cuname']; $strona = $_SESJA['strona']; $witryna = $witryna; $email_contact = $_SESSION['email_contact']; } $cuid = $_GET['cuid']; include_once("dbfunctions.php"); if (isset($_SESSION['id'])) { $cuid = $_SESSION['id']; } elseif (isset($cuid)) { $_SESJA['id'] = $cuid; } Który po prostu wydaje się powtarzać w kółko to samo. Jak ja, jako nowszy programista (około roku doświadczenia, głównie w Pythonie, teraz z około półrocznym doświadczeniem w PHP) mam sobie radzić z tego typu sprawami? Starsi programiści nie mogą się temu przyjrzeć - mają teraz więcej głównych klientów.


title: Przepisać lub powoli refaktoryzować stary projekt C++

text: Nasz zespół niedawno odziedziczył po innej firmie stosunkowo duży projekt (~250 tys. linii). Został opracowany przy użyciu C++Builder i zamierzamy przenieść stronę Ui do Qt. Większość kodu interfejsu użytkownika jest oddzielona od logiki biznesowej (tak!), ale strona logiczna jest dość bałaganem. Istnieje wiele dziedziczenia diamentowego (na szczęście dziedziczenia wirtualnego), ale to sprawia, że zrozumienie kodu jest dość trudne. Mamy bardzo mało dokumentacji do kontynuowania, co jest nieaktualne (włącznie z komentarzami). Generowałem diagramy klas za pomocą Doxygena, oto najbardziej złożony (musiałem usunąć większość nazw klas, ale zachowałem niektóre z ważniejszych i zachowałem standardowe typy danych C++ i klasy std, tak, dziedziczą po std) ![ mylące dziedziczenie](http://i.stack.imgur.com/iEOhW.png) Do tej pory byliśmy w stanie przekonwertować program bazowy na Qt i jesteśmy w punkcie, w którym możemy zacząć konwertować bit funkcjonalności programu po trochu. Problem w tym, czy warto na dłuższą metę? Chcielibyśmy utrzymać to oprogramowanie jako własne, długoterminowe. Czy istnieje ogólne podejście, które powinniśmy przyjąć, aby rozplątać tego rodzaju bałagan dziedziczenia, czy po prostu przeprojektować od zera i zachować tylko fragmenty istniejącego kodu na bieżąco? EDIT: Trochę więcej informacji Zavior opublikował link do artykułu o tym, dlaczego nie powinniśmy zaczynać od zera, ale Ptolemeusz również zadał kilka dobrych pytań i chciałbym dodać trochę informacji o naszej sytuacji. Nasz program nie jest „wolny od błędów”. Istnieją znane problemy, które użytkownicy mogą rozwiązać w większości przypadków. Nie ma „listy” tych problemów, która jest obecnie kompilowana przez rozmowy ze wszystkimi istniejącymi użytkownikami jeden po drugim, ponieważ mają tendencję do trzymania rzeczy dla siebie. Wszyscy jesteśmy nowymi programistami tego projektu. Naszym jedynym zasobem jest programista, który rozpoczął pracę nad projektem mniej więcej w połowie jego życia. Jest dostępny głównie przez e-mail/czat. Stworzył również dokumentację dotyczącą działania niektórych części kodu. Do tej pory program był używany tylko jako narzędzie wewnętrzne. Chcielibyśmy, aby był opłacalny komercyjnie. EDYCJA 2: Jedną z najważniejszych rzeczy, które chcemy zrobić, to mieć program w Qt. Obecnie korzysta z frameworka VCL z C++Builder, z którym nikt w naszym zespole nie jest zaznajomiony, a my mamy tylko 1 licencję. To podczas mojej pracy przy przenoszeniu z VCL do Qt znalazłem niechlujną strukturę kodu i zakwestionowałem decyzję o "konwersji" vs.


title: Jak można oszacować czas na projekty programistyczne?

text: Wygląda na to, że zbliżenie się do niej jest prawie niemożliwe, ponieważ możesz napotkać wiele problemów i rzeczy, których nie przewidziałeś. Jak blisko możemy się spodziewać, że będziemy mogli rozsądnie oszacować? Nasz PM chce mieć takie rzeczy, jak wykresy Gant i takie mapowanie tygodni na raz i tak dalej... Mówimy więc, że możemy usunąć te błędy, i to jak długo każdy z nich potrwa, a celem będzie piątek , ale wszystko jest odrzucane i odkładane na następny tydzień, jak za każdym razem! Jak mamy odgadnąć właściwy czas?


title: Skąd wiesz, że piszesz dobry kod?

text: Poważne pytanie tutaj. Uwielbiam programować. Bawiłem się kodem od dziecka. Nigdy nie poszedłem ścieżką zawodową, ale zakodowałem kilka wewnętrznych aplikacji dla różnych pracodawców, w tym projekt, w który zostałem wplątany, w którym zbudowałem wewnętrzny system zarządzania transakcjami / raportowania dla banku. Szybko łapię rzeczy, rozumiem wiele pojęć i czuję się swobodnie w całym procesie kodowania. Biorąc to wszystko pod uwagę, czuję, że nigdy nie wiem, czy moje programy są dobre. Jasne, działają – ale czy kod jest czysty, ciasny, dobrze napisany, czy też inny koder spojrzałby na niego i uderzyłby mnie w głowę? Widzę tutaj na SO kilka rzeczy, które po prostu oszałamiają mój umysł i sprawiają, że moje próby kodowania wydają się zupełnie słabe. Moi pracodawcy byli zadowoleni z tego, co zrobiłem, ale bez wzajemnej oceny jestem w ciemności inaczej. Przyjrzałem się recenzjom kodu partnerskiego, ale wielu rzeczy nie można opublikować z powodu umów NDA lub problemów z poufnością. Wielu z was, profesjonalistów, może mieć kolegów z drużyny, którzy mogą patrzeć na rzeczy przez ramię lub podrzucać pomysły, ale co z niezależnymi i solowymi gośćmi, takimi jak ja? Jak poznasz najlepsze praktyki i upewnisz się, że Twój kod jest odpowiedni? A może nie ma znaczenia, czy jest „najlepszy”, o ile działa zgodnie z oczekiwaniami i zapewnia dobry UX? EDYCJA: Wow, nie mogę uwierzyć w świetną odpowiedź i pomocne odpowiedzi, jakie wygenerowało to pytanie! W duchu demokracji wybrałem odpowiedź z największą liczbą głosów za właściwą - w rzeczywistości chciałbym zaakceptować wiele z tych odpowiedzi, ponieważ wszystkie one miały kilka świetnych punktów i pomogły mi trochę poszerzyć mój umysł, gdy przychodzi do mojego programowania. Dziękuję wszystkim, którzy poświęcili czas na odpowiedź i komentarz!