Jak myślisz, jakie koncepcje w informatyce uczyniły cię lepszym programistą?
Skończyłem z inżynierią mechaniczną, więc jako programista brakuje mi podstaw. Istnieje kilka standardowych koncepcji CS, których nauczyłem się ostatnio, a które dały mi znacznie głębsze zrozumienie tego, co robię, w szczególności:
Funkcje językowe
- Wskaźniki i rekursja (Dzięki Joel!)
Struktury danych
- Połączone listy
- Hashtables
Algorytmy
- Bubble Sorts
Oczywiście lista jest w tej chwili trochę krótka, więc liczyłem na sugestie dotyczące:
- Jakie pojęcia powinienem zrozumieć,
- Wszelkie dobre zasoby do ich prawidłowego zrozumienia (ponieważ Wikipedia może być czasami trochę gęsta i akademicka).
computer-science
Jon Artus
źródło
źródło
Odpowiedzi:
Spójrz na ten post na blogu autorstwa Steve'a Yegge (dawniej Amazon, teraz w Google):
Zawiera szczegółowe informacje na temat pięciu najważniejszych pojęć, które programiści powinni znać:
źródło
Na pewno należy rozumieć Big-O notacji i Big-O szacunki algorytmów - co to jest, jak jest on stosowany, dlaczego ważne jest, w jaki sposób porównać dwa algorytmy oddali swoje szacunki Big-O, jak budować szacunków Big-O dla prostych algorytmów.
źródło
To trochę zabawne, że szukasz przedmiotów informatycznych , ale wikipedia wydaje mi się zbyt akademicka: D
W każdym razie, oto idzie, w przypadkowej kolejności:
źródło
Kilka pojęć, które pomogły mi w rozwoju (intelekt i kod):
To są całe dziedziny dyskretnej matematyki, ale CS wymaga poważnego wprowadzenia:
Chociaż wykłady i artykuły Marka Jasona-Dominusa są często kierowane do hakerów Perla, myślę, że każdy programista skorzystałby na jego przejrzystej prezentacji i prawdziwym kodzie, szczególnie w Perlu wyższego rzędu .
źródło
Powiedziałbym, że w dzisiejszych czasach zrozumienie programowania obiektowego jest koniecznością, nawet jeśli nie musisz go używać na co dzień.
Na tej podstawie powiedziałbym również, że pomocne może być zrozumienie najbardziej powszechnych wzorców.
źródło
Widzę kilka dobrych koncepcji CS, ale niewiele mówię o matematyce.
Proponuję przyjrzeć się matematyce dyskretnej . Ma szeroki wachlarz użytecznych problemów, zaczynając od dowodów logicznych, które pomagają w pisaniu warunków w kodzie. Teoria grafów i kombinatoryka również pomagają w rozwiązywaniu złożonych problemów i optymalizacji algorytmów.
Chociaż jesteśmy przy temacie matematyki, algebra liniowa jest zwykle warunkiem wstępnym zaawansowanych zajęć z grafiki komputerowej.
źródło
Macierz kompetencji programistów omówiła to szczegółowo, ale wyróżnię kilka:
źródło
Uważam, że wykresy i niektóre zastosowane algorytmy, takie jak najpierw głębokość, wyszukiwanie oddechu, najkrótsze ścieżki itp. Są bardzo przydatne. Orientacja obiektowa jest również bardzo powszechną koncepcją.
źródło
Zasada 1: Oprogramowanie to przechwytywanie wiedzy . Oprogramowanie coś znaczy. Jeśli nie masz jasności co do znaczenia, poświęć więcej czasu na rozmowę z użytkownikami, aby zrozumieć, co robią.
Algorytmy i struktury danych to dwie strony tego samego medalu. Algorytm zależy od struktury danych, struktura danych zależy od algorytmu.
Oducz się sortowania bąbelkowego tak szybko, jak to możliwe. Poważnie. Wszystkie współczesne języki (Java, Python itp.) Mają klasy kolekcji, które implementują lepsze sortowanie niż sortowanie bąbelkowe. Nie ma absolutnie żadnych okoliczności, w których kiedykolwiek powinieneś używać sortowania bąbelkowego do czegokolwiek. Powinieneś szukać klasy kolekcji, która zawiera metodę sortowania. Lepiej poszukać algorytmu, który całkowicie unika sortowania.
Musisz nauczyć się kilku języków.
Język programowania (Java, Python itp.)
Język powłoki.
Język bazy danych (SQL)
Języki prezentacji (HTML i CSS)
Inne języki reprezentacji danych (XML, JSON)
Musisz nauczyć się kilku struktur danych.
Sekwencje (listy, krotki, pliki)
Hierarchiczne (jak dokumenty XML i HTML, a także podstawowy system plików)
Relacyjne (takie jak bazy danych i system plików z wrzuconymi twardymi i miękkimi linkami)
Mapy (lub indeksy lub tablice asocjacyjne), w tym mapy z skrótami i mapy drzew
Zestawy
Plus trochę algorytmicznej analizy złożoności. Czasami nazywany „Wielkim O”. Dlaczego sortowanie bąbelkowe jest złe, to fakt, że jest to O ( n ^ 2), gdzie szybkie sortowanie to O ( n log n ).
źródło
Cóż, puszka robaków jest już otwarta! :)
Zacząłem w elektrotechnice.
Projektowanie relacyjnych baz danych: Śledzenie danych jest jak Arnold w „Kindergarden Cop”.
To może być totalny chaos. To musi być kontrolowane.
Jak przechowywać dane w jak najmniejszej liczbie lokalizacji przy jak najmniejszej liczbie duplikatów informacji. Jak sprawić, by Twoje dane były lekkie i łatwo dostępne. Jak kontrolować wzrost i integralność danych.
Projekt interfejsu użytkownika (UI): w ten sposób użytkownik musi uzyskać dostęp do danych, które śledzimy.
Większość interfejsów użytkownika została zaprojektowana przez programistów. Dlatego większość interfejsów użytkownika niestety działa równolegle z projektem bazy danych. Użytkownicy w ogóle nie przejmują się projektowaniem danych. Po prostu chcą tego, czego chcą. Chcą to łatwo zdobyć. Zwykle wymaga to dużej separacji od projektu danych i interfejsu użytkownika. Naucz się oddzielać „inżynierię” siebie od „południowej gościnności”.
Programowanie obiektowe: wiele języków sprowadza się do tego formatu.
Przetwarzanie równoległe - wielowątkowość: wiele procesorów przyspiesza pracę!
Komputery równoległe istnieją od dziesięcioleci. Od jakiegoś czasu są na naszych komputerach stacjonarnych. W przypadku „przetwarzania w chmurze” masowe przetwarzanie równoległe jest nie tylko obowiązkowe, ale także preferowane. Jest niesamowicie potężny! Programiści równolegli mają duży potencjał zatrudnienia.
Zrozumienie reguł biznesowych: Pomaga to w tworzeniu dużej części logiki w oparciu o tabelę.
Wiele warunków IFblock może znajdować się w tabelach reguł biznesowych. Aby zmienić logikę, po prostu zmień informacje w tabeli. Małe / brak przekodowywania. Mała / brak ponownej kompilacji.
Nadzór nad zdarzeniami ... Metody wykonują pracę:
oddzielaj elementy w kodzie. Ułatwia innym dokonywanie aktualizacji w przyszłości. Jest to również w pewnym stopniu analogiczne do struktury Model / Widok / Kontroler (MVC).
PJ
źródło
Dla mnie bardzo dużo dostałem z poniższego kursu na uniwersytecie
Rzeczy, których żałuję, że nie zrobiłem na uniwersytecie
źródło
LOGIKA - po prostu przeceniam znaczenie logiki w programowaniu. Powiedziałeś, że zajmowałeś się inżynierią mechaniczną, więc musisz wiedzieć, jak bardzo matematyka może ułatwić ci życie.
Rachunek zdań , First-Order Logic , Second-Order Logic : są bardzo potężne narzędzia. Prawdopodobnie najważniejsza (i jedyna) rzecz, której nauczyłem się na uniwersytecie. Logika jest jak ciężka artyleria programisty - wiele bardzo złożonych problemów (a także tych mniej złożonych) staje się znacznie prostszych, gdy nadasz im uporządkowaną, logiczną formę. To tak, jak algebra liniowa dla inżynierów mechaników.
źródło
Myślę, że dobrze wiedzieć, jak działa kompilator. Aho ma klasyczną książkę o koncepcjach używanych podczas tworzenia kompilatora. Tytuł to Kompilatory: zasady, techniki i narzędzia. Nazywa się Dragon Book. Aby naprawdę zrozumieć tę książkę, powinieneś rozumieć języki formalne. Hopcroft ma dobrą książkę na ten temat - Wprowadzenie do teorii automatów, języków i obliczeń.
źródło
Kapsułkowanie
W informatyce hermetyzacja to ukrycie wewnętrznych mechanizmów i struktur danych komponentu oprogramowania za zdefiniowanym interfejsem w taki sposób, że użytkownicy komponentu (innych części oprogramowania) muszą tylko wiedzieć, co robi komponent, a nie mogą uzależnić się od szczegółów tego, jak to robi
źródło
Wspomniano już tutaj o wielu dobrych odpowiedziach, ale chciałem dodać podzbiór tego, co jest ważne, ale jak dotąd nie zostało to omówione.
Po 15 latach studiów podyplomowych w zakresie profesjonalnego tworzenia oprogramowania, stwierdzam, że regularnie używam niektórych z następujących pojęć zaczerpniętych w szkole:
Jeśli twój język / platforma nie obsługuje Garbage Collection, alokacja pamięci i czyszczenie są krytyczne i zostaną dodane do listy.
źródło
Głosuję za dyskretną matematyką. Informatyka to abstrakcja. nauka myślenia jak matematyk jest bardzo pomocna.
Chciałem też dodać do tego, co S.Lott powiedział o językach. Ważna jest również nauka kilku RODZAJÓW języków. Nie tylko kompilacja a skrypty. Ale funkcjonalne (ML, Lisp, Haskell) logiczne (Prolog) zorientowane obiektowo (C ++, Java, Smalltalk) imperatywne (nawet C, Pascal, FORTRAN).
Im więcej znasz paradygmatów programowania, tym łatwiej jest przyswoić sobie nowe języki, gdy pojawia się nowy, gorący!
źródło
Niektóre koncepcje systemu operacyjnego
[dobra książka „ Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum”]
Podstawowa znajomość sieci komputerowych
[dobra książka Tanenbauma
Pojęcia OOPS
Finite autometa
Język programowania (najpierw nauczyłem się C, a potem C ++)
Algorytmy (złożoność czasu \ przestrzeni, sortowanie, wyszukiwanie, drzewa, lista połączona, stos, kolejka)
[dobra książka Wprowadzenie do algorytmów ]
źródło
Dąż do niskiego sprzężenia, wysokiej spójności .
(Ukradłem ten obraz z powyższej strony internetowej)
źródło
Spróbuj zrozumieć wszystkie poziomy programowania. Od najniższego poziomu (montaż) do najwyższego poziomu.
Weźmy na przykład rekursję, która jest łatwą funkcją :) Spróbuj nauczyć się asemblera i stwórz program, który będzie używał rekursji w asemblerze.
źródło
Algorytmy.
Nauka posługiwania się językiem programowania w sposób zstępujący jest czymś, czego można się nauczyć na bieżąco, ale praktycznie niemożliwe jest samodzielne wymyślenie wszystkich powszechnie używanych algorytmów. z pewnymi problemami.
Na przykład nie można po prostu napisać niektórych programów z sortowaniem bąbelkowym i oczekiwać, że zostanie on uznany za dobry, bez względu na to, jak dobry jest kod.
Podsumowując - zobacz Wprowadzenie do algorytmów
Nie musisz tego opanowywać, po prostu wiedz, co się dzieje ...
źródło
Jako świeżo upieczony absolwent informatyki polecam:
Jak wspomniano w różnych postach notacja Big O.
OO Design
Struktury danych i algorytmy (nie pamiętam dokładnego tytułu książki, której użyłem, zaktualizuję się, jeśli pamiętam)
Systemy operacyjne http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
Problemy NP
źródło
Jest to oczywiście dobre zrozumienie programowania obiektowego, dobre zasady przewodnie, takie jak SOLID Principles, oraz przestrzeganie ustalonych wzorców i praktyk.
Jeśli spojrzysz na SOA lub DDD, ostatecznie wszystkie one wracają do jakiejś formy koncepcji OOP.
Poleciłbym ci zdobyć kilka dobrych książek OOP i na początek wybrać bogaty język, taki jak C # lub Java
OOP użytkownika Grady Booch
(PHP, chłopaki z rubinami, proszę, nie głosujcie na mnie, podam mu tylko kilka przykładów na początek, tutaj możecie podać własne odpowiedzi i sugestie)
źródło
Struktura i interpretacja programów komputerowych . Jeśli zrozumiesz tę książkę, wszystko inne można łatwo zbudować na tym fundamencie. Jeśli masz problem z koncepcjami zawartymi w książce, możesz być programistą, ale nie informatykiem.
źródło
Nie zamierzam ci mówić żadnych konkretnych pojęć do przestudiowania, ale zamiast tego zalecam dużo lekkiego czytania z szerokiego zakresu tematów. Nie martw się o dogłębne zrozumienie każdego tematu, o którym czytasz - w tym momencie ważniejsze jest, abyś był w stanie rozpoznać, jakiego rodzaju problemu, na który patrzysz, abyś mógł po prostu ... studiowanie w czasie, kiedy faktycznie się z tym mierzysz. Innymi słowy, jest w porządku, jeśli nie wiesz, jak rozwiązać problem kombinatoryki, o ile wiesz wystarczająco dużo, aby wyszukać „kombinatorykę”, kiedy chcesz zobaczyć, na ile sposobów możesz uporządkować zestaw obiektów lub wybrać podzbiór .
Wikipedia jest całkiem dobrym źródłem do tego rodzaju szerokiego przeglądania, zwłaszcza jeśli zaczynasz tylko przeglądać. Jeszcze lepszą, zwłaszcza jeśli uważasz, że Wikipedia jest zbyt akademicka lub niedostępna, jest wiki C2 . (Co ciekawe, jest to oryginalna wiki wymyślona przez Warda Cunninghama).
źródło
Myślę, że ważne jest, aby zrozumieć podstawową teorię związaną z wielowątkowością, bez tego może być trudno nawet dostrzec, że może istnieć problem, dopóki nie debugujesz na serwerze na żywo o godzinie 4 w niedzielny poranek.
Semafory, sekcje krytyczne i wydarzenia.
źródło
Nie, nie sortowanie bąbelkowe, sortowanie szybkie. To jest duże-O - sortowanie bąbelkowe uśrednia O (n ^ 2), szybkie sortowanie to O (n * log (n)).
źródło
Powiedziałbym, że poniżej są najważniejsze rzeczy
Następnie przejdź do rzeczy związanych z konkretnym językiem. Mam nadzieję, że to jest pomocne!
źródło
Zacząłbym od cytatu:
Najważniejszą zasadą, IMO, jest poznanie wielu różnych paradygmatów programowania, języków i dokładne poznanie dostępnych narzędzi. Każdy problem można rozwiązać w prawie każdym wybranym języku, niezależnie od tego, czy jest to pełny język głównego nurtu z ogromną biblioteką domyślną, czy mały język specjalistyczny, taki jak AutoHotKey. Pierwszym zadaniem programisty jest określenie, czego użyć zgodnie ze specyfikacją problemu. Niektóre koncepcje zapewniają lepsze podejście do tematu, niezależnie od tego, jaki jest Twój główny cel - wyrafinowanie, zaciemnianie, wydajność, przenośność, konserwacja, mały rozmiar kodu ...
W przeciwnym razie skończysz jak niektórzy programiści, którzy desperacko próbują zrobić coś w jednym specjalizowanym przez siebie języku, podczas gdy problem może być trywialny do rozwiązania w innym kontekście programowania.
Ta rada jest zgodna z dzisiejszą tendencją do projektów wielojęzycznych (weźmy na przykład aplikacje internetowe, które mogą obejmować kilka języków w jednej aplikacji, takie jak C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... a nawet różne paradygmaty programowania (na przykład C # wprowadził ostatnio pewne koncepcje z paradygmatów programowania funkcjonalnego, lambd).
Więc podstawową rzeczą jest ciągła nauka, na zawsze :)
źródło
Myślę, że grafika 3D to coś, czego każdy powinien się nauczyć. Albo przynajmniej jak prawidłowo używać jednorodnych wektorów i transformat macierzowych.
Może być pomocny nie tylko przy tworzeniu aplikacji 3D, ale także w dziedzinie mechaniki takich jak kinematyka odwrotna w robotach, obliczanie momentów i wiele innych rzeczy.
Nie rozumiałem w pełni algebry liniowej, dopóki nie przeczytałem grafiki 3D, jednego z najlepszych kursów, jakie kiedykolwiek ukończyłem, mimo że nasz nauczyciel był zły.
źródło
Ponieważ maszyny z wieloma rdzeniami (zarówno CPU, jak i GPU) stają się standardem, powiedziałbym, że obejmują one algorytmy rozproszone (od wielu wątków do wielu maszyn). Niezwykle ważne jest zrozumienie wielowątkowości i przetwarzania rozproszonego. Przepraszam, że link nie zapewnia dużej pomocy.
źródło