Jak budować duże aplikacje

Myślę, że stałem się całkiem dobry w podstawach programowania(dla różnych języków). Mogę napisać dobrą linię kodu. Mogę napisać dobrą metodę. Mogę napisać dobrą klasę. Mogę napisać dobrą grupę klas. Mogę napisać dobre małe lub średnie zastosowanie.

Nie wiem jednak jak zbudować dobrą dużą aplikację. Szczególnie w przypadku, gdy w grę wchodzi wiele technologii, a Więcej z nich może stać się związany z czasem. Powiedzmy projekt z dużym front-endem internetowym, dużym back-endem serwerowym, który łączy się z innym back-endem integracji i wreszcie dużą i złożoną bazą danych. Byłem zaangażowany w kilka z tych aplikacji i mógłbym zbudować jedną, jestem pewien. Nie jestem jednak taki pewien, czy może to kwalifikować się jako"dobre".

Moje pytanie jest więc o odniesienie do książki lub innego dobrego źródła czytania, gdzie mógłbym nauczyć się jak rozpowszechniać i organizować kod i dane dla general large projekty. Na przykład, czy chciałbym warstwy rzeczy bardzo ściśle lub chciałbym hermetyzować to niezależne jednostki zamiast. Czy chciałbym spróbować zachować większość logiki w tej samej puli, czy powinien być po prostu rozpowszechniany, ponieważ wydaje się najbardziej logiczne przy dodawaniu jakiejkolwiek funkcji dodaję.

Widziałem wiele ogólnych zleceniodawców w tych kwestiach (np. brak kodu spaghetti, kod klopsika...) i przeczytać kilka doskonałych artykułów, które omawiają tę sprawę, ale nigdy nie spotkałem się z źródłem co doprowadziłoby mnie do konkretnej praktycznej wiedzy. Zdaję sobie sprawę z trudności tego pytania, więc chętnie usłyszę o czytaniach, które inni znaleźli, aby pomóc im w poszukiwaniu takiej wiedzy.

Jak zawsze, dziękuję za odpowiedzi.

****biorąc pod uwagę dyskusyjny charakter definicji "dobrego" kodu, termin "dobry" w tym kontekście nie zostanie zdefiniowany(oznacza to, co uważasz, że powinien oznaczać).

Author: Vlad Gudim, 2009-01-23

12 answers

Jako programiści lubimy wierzyć, że jesteśmy mądrymi ludźmi, więc trudno przyznać, że coś jest zbyt duże i skomplikowane, aby nawet myśleć o wszystkim na raz. Ale w przypadku dużych projektów programistycznych to prawda, i im szybciej uznasz swoją skończoną pojemność mózgu i zaczniesz wymyślać sposoby na uproszczenie problemu, tym lepiej Ci będzie.

Inną najważniejszą rzeczą do zrealizowania jest to, że spędzisz większość swojego czasu zmieniając istniejący kod . Budowanie inicjału codebase to tylko okres miesiąca miodowego - musisz zaprojektować swój kod z myślą o tym, że 6 miesięcy później będziesz siedział przed nim próbując rozwiązać jakiś problem bez pojęcia, jak działa ten konkretny moduł, mimo że sam go napisałeś.

Więc, co możemy zrobić?

Zminimalizuj sprzężenie między niepowiązanymi częściami kodu. Kod zmieni się z czasem w sposób, którego nie można przewidzieć . pojawią się problemy z integracją z nieznanymi produkty, zmiany wymagań-a te spowodują zmiany. Jeśli masz ustalone stabilne interfejsy i zakodowane do nich, możesz wprowadzić wszelkie potrzebne zmiany w implementacji bez tych zmian wpływających na kod, który korzysta z interfejsu. Musisz poświęcić czas i wysiłek na tworzenie interfejsów, które przetrwają próbę czasu - jeśli interfejs też musi się zmienić, wracasz do punktu wyjścia.

Ustanowić zautomatyzowane testy , które można wykorzystać do testowanie regresji. Tak, to dużo pracy z przodu. Ale to się opłaci w przyszłości, kiedy będziesz mógł dokonać zmiany, uruchomić testy i ustalić, że to nadal działa bez tego niespokojnego uczucia zastanawiania się, czy wszystko spadnie, jeśli przerzucisz swoją ostatnią zmianę na kontrolę źródeł.

Odpuść sobie te trudne sprawy. co jakiś czas widzę jakąś sprytną sztuczkę z szablonami C++ i myślę: "Wow! Tego potrzebuje mój kod!"Ale prawda jest taka, że spadek jak czytelny i łatwo zrozumiały kod staje się często po prostu nie warto zwiększonej generyczności. Jeśli jesteś kimś takim jak ja, którego naturalną skłonnością jest próba rozwiązania każdego problemu w jak najbardziej ogólny sposób, musisz nauczyć się go powstrzymywać, dopóki nie natkniesz się na potrzebę tego ogólnego rozwiązania. Jeśli to będzie potrzebne , być może będziesz musiał przepisać jakiś kod -- to nic wielkiego.

 25
Author: j_random_hacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-16 18:59:09

Zapożyczone z tvanfosson:

Zacznij od małej aplikacji i powiedz Yes everytime someone wants a new Dodano funkcję.

 17
Author: carrier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 17:41:46

Oto książka, której użyliśmy do Przewodnika po naszych standardach i metodach kodowania:

Alt text http://ecx.images-amazon.com/images/I/51HNJ7KBBAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpgLarge-Scale C++ Software Design

Program, nad którym pracuję, jest rozwijany od prawie 10 lat, odkąd został po raz pierwszy sporządzony na odwrocie przysłowiowej serwetki. A projekt wciąż się rozwija. Nie było perfect, I nadal są problemy z zależnościami okrężnymi i niektóre interfejsy klas nie są zbyt czyste, ale większość klas nie jest taka, program działa i nasi użytkownicy są zadowoleni.

Polecam również, jak to już było robione przez wielu innych, Code Complete i Software Estimation autorstwa Steve ' a McConnella. Szczególnie podoba mi się jego metafora "rosnącego" oprogramowania, a nie konstruowania czy budowania. Ten sposób przeglądania oprogramowania nadaje się lepiej do coś, co będzie miało długi cykl życia.

 11
Author: Scottie T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 17:56:45

Jak już wspomniałem gdzie indziej, duże aplikacje nie są po prostu większe, są Różne . Tak bardzo, że mówimy o programowaniu w-małym i w-dużym . Istnieje duża zmiana jakościowa, która występuje w naturze problemów i ich rozwiązań, gdy programujesz w-the-large. Linia jest bardzo rozmyta i istnieje wiele konkretnych problemów, które mogą zmusić cię do przekroczenia tej linii.

Niektóre z tych problemów include:

  • rozmiar (taki jak baza danych, która po prostu nie zmieści się na pojedynczym dysku twardym)
  • [11]}złożoność (od aplikacji all-in-one do wielu podsystemów)
  • współbieżność (od zera do tysięcy/milionów jednoczesnych użytkowników)
  • Dostępność (od 9% uptime do 99.999% uptime)
  • niezawodność (od codziennych awarii do kilku lat MTBF)
  • prędkość (od godzin do milisekund w czasie odpowiedzi)
  • produkcja (od Twojego zwierzaka projekt do sprzedawanego towaru)
  • itd.

Jak sobie z tym poradzić? Naucz się i wykorzystaj każdą cenną technikę, którą możesz, i naucz się oceniać, które z nich są rzeczywiście wartościowe-to zajmie trochę czasu, a nie ma szybkiej odpowiedzi.

Jest jednak jedna technika, która jest łatwa, oczywista i uniwersalna: dziel i rządź. Odizoluj każdy główny element funkcjonalności, każdy podsystem, każdą zewnętrzną zależność, tak aby twój główny system dotykał ich tylko w jego zewnętrzna krawędź. Kiedy możesz zmienić każdy z nich, po prostu poprawiając cienki interfejs w bardzo krótkim czasie, to coś osiągnąłeś. To zajmie ci dużo czasu.

Najlepsze życzenia.

 5
Author: Rob Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 19:50:17
  1. Zdecyduj, które funkcje są najważniejsze; zapomnij o reszcie
  2. Zdecyduj, która z tych cech jest najważniejsza i zapomnij o reszcie
  3. zaimplementuj je (powinno potrwać kilka tygodni, w przeciwnym razie powtórz kroki 1 i 2)
  4. Uruchom
  5. Zobacz, które funkcje działają, które nie, a których brakuje
  6. wróć do kroku 1
 4
Author: davetron5000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 17:43:19

Duże aplikacje nie są tworzone w jedną noc. Aplikacje dla przedsiębiorstw zaczynają się od małych elementów, a następnie są łączone. Jeśli projektujesz aplikacje w taki sposób, że można je skalować, łatwiej będzie zintegrować ze wszystkimi otaczającymi czynnikami, takimi jak bazy danych, narzędzia innych firm itp. Jeśli wejdziesz do infoq.com znajdziesz wiele wspaniałych przykładów studiów i materiałów na temat skalowania i architektury, takich jak Myspace, Amazon i wiele innych. Nic, ale doświadczenie poprowadzi ty do tworzenia wielkich dużych aplikacji.

 4
Author: Oscar Cabrero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-24 03:58:38

Uczyń go rozszerzalnym za pomocą wzorców projektowych, które oznaczają, że nie będziesz musiał zmieniać wszystkiego, aby wkleić się w nową funkcjonalność.

Zdecyduj, co musisz zbudować i zbuduj to.

Podziel go na moduły, które wykonują zadania oddzielnie.

Planuj planuj, wiedz co budujesz zanim zaczniesz i buduj to i nic więcej.

Tylko pisz int he features you need to, don ' t add things you think may be useful, but. .. zostawić wystarczy, aby móc dodać coś, co może trzeba dodać.

 3
Author: Omar Kooheji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 17:48:37

Przyrostowo, przy użyciu Test Driven Design

 3
Author: Noel Walters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 18:10:55

To naprawdę interesujące zauważyć, jak wiele z tych komentarzy mówi, że ślepa iteracja jest jedynym sposobem.

Iteracja jest krytyczna (jestem wielką fanką), ale są ludzie, którzy potrafią zaplanować wielkie projekty-tylko, że niewielu z nas kiedykolwiek spotkało się z jednym.

Pomyśl o tym, jak o tym, że wszyscy gramy w koszykówkę na podjazdach. Jesteśmy całkiem dobrzy, możemy zdobyć większość koszy i naprawdę świetnie się bawić w parku.

Tylko dlatego, że nigdy nie spotkaliśmy profesjonalnych graczy, jednak, to nie znaczy, że nie istnieją i nie mogą kopać każdego z naszych tyłków w górę iw dół przez cały dzień.

Jedyną rzeczą jest to, że nie ma profesjonalnych gier programistycznych.może gdyby były, zobaczylibyśmy je nieco więcej.

 3
Author: Bill K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 20:42:54

Cóż, mógłbyś spojrzeć na rational unified process. Sprawdź podstawowe części, wybierz artefakty, które według ciebie będą potrzebne. Zrób listę wszystkich funkcji, które chcesz i uporządkuj je w liście wymagań. Również starannie zaplanuj architekturę oprogramowania, więc nie musisz go później zmieniać. Dzięki niektórym z tych wskazówek łatwiej będzie opracować dużą aplikację.

 0
Author: Danmaxis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 17:49:25

Jako ktoś odpowiedzialny za dużą aplikację powiedziałbym

  • Użyj nieinwazyjnego frameworka, takiego jak Spring
  • Reduce coupling
  • twórz niezmienne obiekty wszędzie tam, gdzie to możliwe - są przyjazne dla wątków
  • zaakceptuj, że Twoja aplikacja może wymagać podziału na oddzielne procesy, aby lepiej skalować i zaplanować to.
  • Zbuduj solidny zestaw narzędzi i naucz się narzędzi.

NIE PANIKUJ

 0
Author: Fortyrunner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 23:44:25

Kilka przemyśleń na temat produktu i dostawcy:

    Staraj się być jak najbardziej niezależny od dostawcy i platformy. Zapobiegnie to konieczności ponownego wdrożenia wszystkiego od podstaw z nowym produktem / platformą / frameworkiem itp.
  • oznacza to praktycznie użycie Java SE + Java EE + oraz open source RDBMS, takich jak PostgreSQL encapsulated by JPA from Java EE. Nie używaj dodatkowych bibliotek, frameworków (spring, hibernate,...) itp. W ten sposób możesz zmieniać produkty i dostawców dowolnych potrzebujesz czasu.
  • myślę, że tylko dzięki Javie można uzyskać taki poziom niezależności od produktu i platformy. Nawet jeśli korzystasz z bibliotek i frameworków OSS, będziesz żałował, że ich używasz, jeśli okaże się, że implementacja nie odpowiada twoim potrzebom i będziesz musiał wszystko przerobić.
  • możesz sprawdzić niezależność produktu swojego kodu za pomocą Java Application Verification Kit .
  • poświęć trochę czasu na architekturę, ale także przeprojektuj architekturę przez cały okres realizacji. Dobrą książką (niestety tylko niemiecką) jest "Java EE 5" Adama Biena.

@j_random_hacker: właściwie nie - nadal uważam, że moim pierwszym punktem jest argument za używaniem Javy w dużych aplikacjach, a nie przeciwko niej. Każdy język to jeden język. Więc zawsze musisz zrobić zobowiązanie do języka, oczywiście.

  • ale Java SE & EE zawiera język, kompilator, maszynę wirtualną, a także wszystkie niezbędne biblioteki / frameworki. Ale istnieją różne implementacje całej platformy Java SE/ EE: Java SE (JDK) od Sun, Apache, IBM, HP, Oracle, BEA. Java EE (serwer aplikacji) od Sun, Apache, Red Hat, IBM, Oracle i innych. . Net z C# ma tylko jedną implementację (od Microsoftu i implementację nieco podobnego języka / platformy o nazwie Mono).
  • PHP ma chyba tylko jedną implementację. Istnieje wiele różnych kompilatorów C++. Ale wszystkie realizują nieco inaczej C++-Języki i nie są one dołączone do bibliotek, które wszystkie mają ten sam API. Wybierając Javę, wiem, że mogę wybrać pomiędzy pół tuzina implementacji Java SE i pół tuzina serwerów aplikacji Java EE, aby uruchomić oprogramowanie, które z kolei działa na Linuksie, Solaris, FreeBSD, HP-UX, IBM z / OS, Windows, Mac OS X i na bardzo dużej różnorodności platform sprzętowych. Więc po prostu nie muszę się martwić, jeśli znajdę naprawdę zły problem z wdrożeniem późno w rozwoju lub nawet w produkcji-chciałbym po prostu odejdź od Słońca i nigdy nie obejrzysz się za siebie. (Dlatego polecam Java Application Verification Kit. Sprawdzając swoje źródło z nim możesz być pewien, że Sun, IBM, Oracle czy jakakolwiek inna zła firma nie przemyciła do twojego źródła żadnych swoich zastrzeżonych rzeczy jako zależności, które mogłyby Cię z nią powiązać. Jesteś wolny jak ptak.)
  • nie możesz tego zrobić z PHP lub Ruby. Z tymi językami, musiałbyś sam załatać problem implementacji, gdyby nikt w przeciwnym razie, ponieważ spędzanie miesięcy na łataniu błędów w PHP lub Ruby jest nadal mniej wysiłku niż przepisanie kompletnej aplikacji.
  • Sun ma open source zarówno: Java SE (kompletny JDK), jak i Java EE (Glassfish application server). Jedyną rzeczą, która nie jest "open source" jest to, że istnieje wiążąca specyfikacja języka, która jest prowadzona przez sun i dostaje ogromny wkład od innych. Dlatego można pobrać implementację Javy od sun, zmodyfikować język Java i rozpowszechniać to źródło i pliki binarne, ale nie można już nazywać tego "Java", jeśli nie jest to zgodne ze specyfikacją języka (Sun chroni znak towarowy Java tylko do rzeczy faktycznie java). Na początku może to zabrzmieć "źle", ale w rzeczywistości zapewnia, że istnieje coś takiego jak" Java": można napisać aplikację java i uruchomić ją na dowolnej implementacji Javy. Nie można tego zrobić z C++ , ponieważ nie ma specyfikacji C++, która jest uzgodniona przez każdą implementację c++ (źródło kod może być kompilowany z kompilatorem Intel C++, ale nie z GNU) i-co ważniejsze-nie ma wspólnej biblioteki: jeśli napiszę program C++ z biblioteką QT, nie będzie kompilowany z biblioteką GTK, ponieważ mają zupełnie inne API.
  • Jeśli nie możesz znieść niczego Sun microsystems, ale chcesz mieć Javę open source, możesz po prostu użyć Apache Harmony (Java SE) z Apache Geronimo (Java EE) na jej szczycie.
 -2
Author: SAL9000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-30 14:18:21