Wiem, jak programować i jak się programować, ale jak / gdzie uczysz się, jak prawidłowo tworzyć systemy? [Zamknięte]

11

Przy tworzeniu systemu należy wziąć pod uwagę wiele rzeczy, weźmy na przykład system internetowy, w którym użytkownicy logują się i wchodzą w interakcje między sobą, tworząc i edytując zawartość. Teraz muszę pomyśleć o bezpieczeństwie, sprawdzaniu poprawności (nawet nie sądzę, że jestem w 100% pewien, co to za sobą pociąga), „upewniając się, że użytkownicy nie stawiają sobie nawzajem stóp” (określenie na to?), Zapobiegając błędom w wielu przypadki, upewniając się, że dane w bazie danych nie stają się problematyczne z powodu nieoczekiwanych ... sytuacji? Wszystkie te rzeczy, których nie wiem jak i gdzie się uczyć, czy jest książka na ten temat? Jak powiedziałem, wydaje się, że istnieje ogromna różnica między pisaniem kodu a pisaniem właściwego kodu, wiesz o co mi chodzi? Wydaje mi się, że w mojej obecnej pracy programistycznej brakuje dużo tego, co opisałem, i widzę problemy, które powoduje później, a problemy są znacznie trudniejsze do rozwiązania, ponieważ dane istnieją i ludzie z nich korzystają. Czy ktoś może wskazać mi książki lub zasoby lub odpowiedni podzbiór programowania (?) Dla tego rodzaju uczenia się?

PS: popraw swoje tagi, nie wiem o czym mówię.

Edycja: Zakładam, że niektóre z przykładów, które napisałem, dotyczą również innych typów systemów, po prostu nie znam innych dobrych przykładów, ponieważ głównie zajmowałem się pracą w sieci.

MetaGuru
źródło

Odpowiedzi:

10

O ile mogę powiedzieć, profesjonalni programiści uczą się tych rzeczy na trzy główne sposoby:

  1. Uczenie się na podstawie złych doświadczeń - napotykasz coś złego. Napraw to. Mówicie: „Hej, nie powinienem tego robić ponownie. Następnym razem zrobię X.” Najwyraźniej jesteś w samym środku tego.
  2. Uczenie się przed złym doświadczeniem - w końcu nauczysz się widzieć pewne rodzaje nadchodzących problemów. Kiedy to zrobisz, będziesz próbował tego uniknąć. Może czytasz książkę, może przeszukujesz Internet, a może próbujesz eksperymentów.
  3. Uczenie się od doświadczonych kolegów - To zdecydowanie najłatwiejsze, choć wciąż nie jest łatwe. Sztuką jest ustalenie, czy kolega reaguje na złe doświadczenie, które jest nadal istotne. W końcu technologia się rozwija.

Zachęcam do strzelania do wszystkich trzech. Znajdź miejsce z inteligentnymi, doświadczonymi kolegami, którzy odpowiedzą na Twoje pytania. Upewnij się, że jest to miejsce, które pozwala na wysyłkę wcześnie i często, abyś mógł spróbować wielu rzeczy. I poświęć czas na badania i refleksje.

William Pietri
źródło
Jeśli chodzi o # 1), pamiętaj, że złe doświadczenia i błędy, których się uczysz, niekoniecznie muszą być twoje. Spędzaj czas w Internecie, spotykaj się tam, gdzie robią to programiści, poznawaj horrory o szalonych błędach, które popełnili lub napotkali, trzymaj je z tyłu głowy podczas programowania.
Shadur
1
Zgadzam się, Shadur, ale myślę, że niektóre złe doświadczenia naprawdę muszą być twoje. Niektórzy próbują siedzieć na uboczu, czekając, aż zrobią coś idealnego. Ale naprawdę muszą się tam dostać i zacząć robić, jeśli chcą poprawić swoje umiejętności.
William Pietri,
4

Jeśli chodzi o aplikacje internetowe, w tej odpowiedzi jest więcej dobrych informacji niż w jakimkolwiek innym miejscu, jakie kiedykolwiek widziałem.

Ale w rzeczywistości jest wiele do zrobienia, aby dobrze skompletować kompletny system. Istnieją badania, które wspierają 10 000 godzin, ponieważ ilość ćwiczeń jest niezbędna do osiągnięcia poziomu mistrzostwa, a rozwój systemów informatycznych nie jest wyjątkiem.

quentin-starin
źródło
Więc chyba jest inaczej dla różnych rzeczy, co?
MetaGuru,
Wiele problemów będzie, powiedzmy, specyficznych dla aplikacji internetowych, a wiele będzie bardziej ogólnych. Nie jestem pewien, czy całkowicie rozumiem, o co pytasz.
quentin-starin
3

Bardzo podoba mi się odpowiedź Williama Pietri (+1), ale uważam, że należy ją dodać. Nawet zakładając, że to, co rozumiesz przez systemy, składa się wyłącznie z oprogramowania.

Ale zanim przejdę do sedna sprawy, nie znam książki, która mogłaby pomóc. Wszystko, co następuje, nauczyłem się z doświadczenia (co oznacza trzy punkty, które podniósł William).

To, o czym mówisz, obejmuje co najmniej cztery szerokie role. Czasami jedna osoba może pełnić wszystkie te role, w przypadku małych i średnich projektów, ale kiedy zaczynasz od dużych projektów, musisz przynajmniej nieco je rozdzielić. Trudno jest być ekspertem od nich wszystkich w jakikolwiek znaczący sposób.

  1. Analityk Biznesowy

    To osoba, która rozmawia z klientem i przekłada jego wymagania na coś, co architekt może zrozumieć. Zasadniczo lista poprawnie sformułowanych wymagań. Obejmuje to oczywiste wymagania funkcjonalne (co musi zapewnić ten system?), Ale także wymagania niefunkcjonalne (jakie są ogólne cechy, które musi spełniać system? Może to obejmować bezpieczeństwo, niezawodność, dostępność, odporność, pojemność, wydajność, niezawodność i inne takie wymagania z punktu widzenia użytkownika).

    To pierwsze przejście do tego, co musi zrobić system, początek poważnego myślenia.

  2. Architekt systemu

    Osoba ta tworzy ramy techniczne na wysokim poziomie, w których można pracować. Podają ogólny plan dopasowania. Ogólne narzędzia, techniki, konstrukcje. Rozkładają cały system na mniejsze elementy, jak pasują do siebie, jak pasują do świata zewnętrznego ...

    Pomaga to na wiele sposobów dopracować to, o czym należy pomyśleć. Na tym etapie bardzo często pojawiają się problemy dotyczące wymagań napisanych przez analityka biznesowego. Wróć do nich, aby uzyskać kilka iteracji, aby lepiej zrozumieć, czego chcą i wyrazić to.

  3. Projektant systemu

    Ta rola polega na tym, jak sprawić, by wszystko działało. To może być więcej pracy zespołowej niż jednoosobowego serialu. Ale prawdopodobnie istnieje główny projektant, który nadzoruje cały projekt systemu. Ta osoba musi zagłębić się w szczegóły i upewnić się, że widok architekta jest czymś, co można zbudować.

    Oczekuj dalszego udoskonalenia architektury systemu, a zatem potencjalnie analizy biznesowej.

  4. Kierownik testów

    Ta rola jest bardzo często zapominana. Ale na koniec dnia, jeśli nie możesz go przetestować, jak możesz udowodnić, że możesz go zbudować? Przegląd wszystkich etapów: analizy biznesowej, architektury i projektu musi zostać dokonany przez osobę kompetentną w testowaniu, która będzie w stanie wskazać braki i tym samym umożliwić wczesne korekty, na długo przed napisaniem kodu.

To krótkie podsumowanie.

Ci faceci / dziewczęta są tylko ogólną grupą ludzi w młynie, którzy myślą o tym, o czym należy pomyśleć.

W przypadku skomplikowanych projektów, takich jak duże aplikacje bankowe lub kosmiczne, aby wziąć dwa przykłady (pomyśl o setkach do wielu tysięcy osobodni), istnieje wielu ekspertów w tej dziedzinie, ponieważ nazywamy ich do przeglądu i wspierania projektów na każdym etapie. Role te obejmują analizę bezpieczeństwa, zmianę rozmiaru systemu, pojemność, wydajność, bazy danych, tworzenie klastrów i wiele innych tak wąskich dziedzin wiedzy specjalistycznej, w tym precyzyjne obszary biznesowe. Różnorodność ról zależy od wielkości i złożoności systemów.

Wszystko to, żeby powiedzieć, że nie powinieneś próbować tego wszystkiego wiedzieć, nie będziesz. Możesz jednak zapoznać się z ogólnym obrazem, a przy małych projektach możesz zagłębić się w znacznie więcej niż w duże projekty, po prostu dlatego, że poziom złożoności pozwala ci być bardziej zaokrąglony.

Jeśli chcesz wiedzieć, jak projektować systemy, musisz zacząć zadawać pytania, myśląc nieszablonowo. Postaw się wystarczająco w butach klienta i spróbuj pomyśleć, co może pójść nie tak, co wymaga testowania. Następnie spotkaj się z prawdziwym klientem i popchnij go, aby wyjaśnił zakres i ograniczenia systemu, którego potrzebują. Ponadto, gdy mówię „klient”, musisz zrozumieć, że obejmuje to kilka bardzo różnych osób. Jest osoba, która codziennie korzysta z systemu do tego, do czego został przeznaczony. Jest operator, wsparcie techniczne, menedżer, który potrzebuje jakiegoś raportu lub innego, audytor, zespół infrastruktury, interesariusz, który zapłacił za to, menedżer jakości, który potrzebuje środków do przetestowania twojego systemu ... Zapytaj wszystkich (a jeśli są jedną osobą, poproś ich, aby założyli wszystkie te czapki na raz), więc zapytaj ich wszystkich, czego potrzebują, a będziesz dobrze zacząć od poznania wymagań systemowych. Stamtąd można wyprowadzić architekturę, a stamtąd projekt.

W przypadku złożonych systemów (czy to tylko oprogramowania, czy też w celu integracji ze sprzętem w najbardziej ogólnym sensie) nie tylko jedna osoba nie wystarczy na każdą z czterech wyżej wymienionych ról, ale musisz zarządzać projektem nawet definicją tego, co system musi zrobić, nie mówiąc już o innych fazach.

HPH, asm.

asoundmove
źródło
2

tutaj, aby się dowiedzieć, czy jest książka na ten temat?

Nie „książka”. Dużo książek.

Nie ma królewskiej drogi

Tak jak powiedziałem, wydaje się, że istnieje ogromna różnica między pisaniem kodu a pisaniem właściwego kodu

Dobrze.

Mówisz o „architekturze”, programowaniu w dużej skali.

Krok 1. Przeczytaj dużo kodu. Naprawdę dużo. Pomyśl o rzeczach, które chcesz zrobić. Znajdź powiązane projekty open source. Przeczytaj kod. Wszystko.

Krok 2. Przeczytaj więcej kodu. Dużo więcej.

Krok 3. Czytaj książki o architekturze.

S.Lott
źródło
2
Czytaj czytaj czytaj. Ale muszę zasugerować, że to nie to samo, czego się uczysz, kiedy faktycznie wdrażasz prawdziwe systemy.
quentin-starin
@qes: Pytanie brzmiało: „gdzie uczysz się, jak prawidłowo tworzyć systemy?” Nie uczysz się tego, źle budując prawdziwe systemy. Rzeczywiście, złe wdrażanie prawdziwych systemów jest dokładnym przeciwieństwem uczenia się.
S.Lott,
3
Z Code Complete, jedna z rzeczy, które najbardziej mi się podobały: „W dziedzinie inżynierii oprogramowania niezwykle ograniczone są przykłady wcześniejszych sukcesów i niepowodzeń. Jeśli interesowałeś się architekturą, studiowałbyś rysunki [znanych architektów] ... odwiedzić niektóre budynki ... ”.
Jakub
@ S.Lott: kto powiedział coś o złym robieniu tego?
quentin-starin
@qes: jakie są szanse dobrego wykonania programu na dużą skalę bez zapoznania się ze stanem techniki? Dla geniusza takiego jak ty możliwe jest, że można po prostu pisać dobre programy przez cały czas i we wszystkich skalach. Ale dla wszystkich innych, którzy nie patrzyli na programowanie na dużą skalę, zaczynając od próby wdrożenia dużego systemu bez przeczytania czegokolwiek, jest droga do napisania czegoś, co zawiera tak wiele błędów, że nic pożytecznego nie można się z tego nauczyć. Twoje doświadczenie może być inne, ale wiem, że nie jestem wystarczająco inteligentny, aby pracować bez uprzedniego przeczytania.
S.Lott,
1

Aby powiększyć, przeczytaj wiele książek ....

Teraz, gdy wiesz, że masz problem, warto przeczytać te książki. (Przed wykonaniem prawdziwej pracy omawianie tych książek nie ma większego sensu)

Wzory projektowe według Gamma, Helma, Johnsona i Vlissides Języki wzorcowe projektowania programów 1,2,3 i 4.

Ale nie próbuj stosować każdego tupotu wszędzie, gdzie widzisz, że można go użyć

to też jest zła rzecz.

Mam nadzieję że to pomoże.

Tim Williscroft
źródło
1

Najlepszym sposobem, aby dowiedzieć się, jak coś zrobić, jest to zrobić. Jeśli chcesz nauczyć się mówić po francusku, musisz mówić po francusku, czytać po francusku i pisać po francusku, czytać o francuskim i jechać do Francji i rozmawiać z Francuzami po francusku. Jeśli chcesz wiedzieć, jak grać na pianinie, musisz grać na pianinie. Musisz grać proste piosenki i uczyć się budowy fortepianu i struktury muzyki. Musisz nauczyć się czytać muzykę i wyrażać ją przez fortepian za pomocą palców. Musisz nauczyć się, jak brzmi muzyka i jakie dźwięki może wydawać fortepian w porównaniu do tego, co potrafi gitara, flet lub saksofon.

Programowanie jest dokładnie takie samo. Jeśli wiesz, jak zaprojektować bazę danych, musisz zaprojektować bazy danych. Jeśli chcesz zrozumieć kryptografię, zaimplementuj algorytmy kryptograficzne i protokoły kryptograficzne. Jeśli chcesz pisać oprogramowanie, które może obsługiwać wielu użytkowników jednocześnie, musisz zrozumieć, jak działają operacje dyskowe IO, sieciowe IO i wątki. Aby zrozumieć, jak to działa, musisz napisać kod, który czyta i zapisuje z plików, przesyła dane przez sieć i synchronizuje dostęp do zasobów. Wszystko to wymaga praktyki.

„System” jest ogólnie tylko zbiorem rzeczy. Elementy, które koordynują się, tworząc całość. Aby zbudować coś dużego, musisz zbudować kilka małych części. Jeśli więc chcesz nauczyć się budować systemy, po prostu zacznij budować systemy. Weź problem, rozpadnij się na części i wdrażaj każdy kawałek jeden po drugim. W końcu będziesz mieć zintegrowany „system”. Prawdopodobnie kilka razy nie uda ci się po drodze, ale to w porządku. Jeśli nie zawiedziesz, zwykle oznacza to, że nie próbujesz wystarczająco mocno.

Poleciłbym też chodzić do szkoły na studia informatyczne. Nie pomoże to zbytnio w części „ćwiczyć”. Będziesz musiał zrobić to sam, ale to pomoże w części dotyczącej ekspozycji. Dowiesz się dużo, prawie o wszystkim, co związane jest ze sposobem działania komputerów i systemów komputerowych, co jest trudne do nauczenia się na własną rękę.

Scott Wiśniewski
źródło
1
+1, choć sugerowałbym, że samo robienie nie wystarczy. Nie będziesz wiedział, czy zrobiłeś to dobrze, czy źle, dopóki nie wrócisz do tego samego kodu po pewnym czasie. I nawet wtedy możesz wiedzieć, że coś jest nie tak, ale nie w jaki sposób można to poprawić. Jednym ze sposobów skrócenia tego wszystkiego jest zapewnienie wielu opinii od osób bardziej doświadczonych na temat tego, czego próbujesz się nauczyć. Tak, „zrób” jest bardzo ważne, ale informacja zwrotna na temat tego, co robisz, może nawet bardziej, aby przyspieszyć proces uczenia się.
Marjan Venema