Mówiąc jako ktoś z wykształceniem elektronicznym, a nie informatykiem, jaki jest kawałek informatyki, który powinienem wiedzieć, aby uczynić mnie lepszym programistą w świecie rzeczywistym ?
(W prawdziwym świecie mam na myśli coś, z czego zamierzam korzystać i czerpać korzyści w codziennej pracy jako programista - na przykład sugeruję, że zrozumienie normalizacji bazy danych jest bardziej praktyczne niż zrozumienie szybkiego sortowania, dla którego jest wiele bibliotek).
learning
computer-science
theory
Jon Hopkins
źródło
źródło
if
iloop
kiedykolwiek napisane oświadczenie wykorzystuje podzbiór tych dwóch obszarów badań.Odpowiedzi:
Jeśli mam do wyboru tylko jeden bit, która jest trudna decyzja, powiedziałbym przejść do notacji Big O . Zrozumienie implikacji O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Pomaga uniknąć wielu kosztownych błędów, które działają dobrze w środowisko testowe, ale katastrofalnie zawodzi w produkcji.
źródło
To pytanie, na które każdy będzie miał inną odpowiedź. Powiedziałbym: teoria złożoności jest najważniejszym elementem, którego i tak nie uczysz się bezpośrednio jako programista (jak algorytmy i struktury danych), ale co może wpłynąć na twoją pracę. Pomaga, jeśli wiem, że problem ma złożoność sześcienną, wiem, że będzie źle skalowany, jeśli rozmiar problemu zostanie zwiększony.
źródło
Dowiedz się o strukturach danych, algorytmach i złożoności.
Nie za dużo, aby zrozumieć, że maszyna nie jest magicznym pudełkiem o nieograniczonej mocy. Nie możesz w to cokolwiek rzucić i spodziewaj się, że rozwali to w milisekundach. Ma ograniczenia, które znasz. Musisz nauczyć się nie testować ich za pomocą kodu.
Zapoznaj się również z powszechnymi podejściami do rozwiązywania konkretnych problemów projektowych w programowaniu. Wzory projektowe mianowicie. Nie czcij ich, po prostu weź pomysły, które przekazują.
Niezbędna jest również znajomość modelowania baz danych.
Potem są to tylko różne języki programowania, frameworki i biblioteki, które implementują lub umożliwiają implementację podstawowych pojęć. Wybieraj co chcesz i ćwicz z nimi.
źródło
To trochę trudne pytanie.
Wszystkie aspekty informatyki są ważne w taki czy inny sposób.
Zrozumienie Big O Notation jest ważne, a także zrozumienie, w jaki sposób można wykonać kod, jest również bardzo ważne w rzeczywistych sytuacjach.
źródło
Tak, to zmusiło mnie do myślenia przez wiele godzin.
W trakcie tego procesu musiałem usunąć niektóre typowe odpowiedzi podane tutaj.
Duża notacja O (n) . Trudno to tutaj umieścić, ale nie, możemy intuicyjnie wypracowywać nieefektywności i porównywać różne zestawy procedur, nawet nie słysząc zdalnie o asymptotycznej analizie algorytmicznej.
Języki funkcjonalne Nie, jedna rodzina języków to tylko jedno podejście do myślenia o problemach. Dlaczego tylko ten kawałek powinien mieć znaczenie?
Zatrzymanie Problem Niektóre są po prostu zbyt specyficzne, a ludzie żyli życiem, nie wiedząc o ich istnieniu.
Słuchaj Jeśli nie słuchasz, żyjesz w swoim własnym świecie. Niekoniecznie szkodliwe!
Cykl rozwoju oprogramowania Nie! Nadal możemy natknąć się na niesamowite oprogramowanie lub heroiczny wysiłek solo.
Teoria złożoności Chyba tak, ale bez formalności
Powiedziałbym - „ Abstrakcje Abstrakcje Abstrakcje ... ”. Dowiedz się o tym. Zobacz przykłady wokół niego i dowiedz się, jak budować z niego. To jest wszędzie. Całość informatyki, inżynierii i aplikacji wygląda jak warstwa po warstwie abstrakcji.
Gdy się o tym dowiesz, zaczniesz uczyć się dobrze rozglądać.
Gdy zobaczysz, że ktoś używa
list insertion
wpython
inot append
, uśmiechasz się, ponieważ wiesz, że listy Pythona są tworzone przy użyciu abstrakcji tablic, w których wstawianie jest kosztowne i dołącza tańsze.To tylko jeden przykład.
źródło
Teoria automatów i FSM. :-)
źródło
Konkurencyjne przypadki wykorzystania struktur danych.
Są sytuacje, w których mapa z czerwono-czarnymi drzewami jest wymagana, aby zagwarantować wydajność, i inne, w których nie można użyć tablicy, ponownie, aby zagwarantować wydajność. Wiedza, kiedy wybrać, która struktura danych jest nieocenioną umiejętnością.
źródło
liczą się tylko trzy liczby:
źródło
Najważniejszą rzeczą, której nauczyłem się w CS (i jako programista od wielu lat i jako architekt), jest umiejętność rozwiązywania problemu na podstawie zmienności, a nie funkcji. Wszystkie dobre projekty izolują i zamykają lotność. Wszyscy dobrzy programiści / architekci robią to intuicyjnie, nawet jeśli nie sformalizowali tego w swoich myślach. Ogromnym powodem niepowodzenia projektu jest niemożność rozwiązania problemu na podstawie zmienności i hermetyzacji. Brak enkapsulacji zmienności nieuchronnie prowadzi do ucieczki złożoności i niepowodzenia projektu.
źródło
Problem zatrzymania
Fakt, że istnieją problemy związane z komputerem, których komputer po prostu nie może rozwiązać.
źródło
Powinieneś znać wystarczającą teorię automatów, aby wiedzieć, gdzie problem, z którym masz do czynienia, należy do hierarchii języków formalnych. Na tej podstawie możesz dowiedzieć się kilku ważnych praktycznych zastosowań, na przykład dlaczego nie powinieneś używać REGEX do analizowania HTML (HTML potrzebuje gramatyki bezkontekstowej, aby go opisać) i dlaczego kompilacja C ++ zajmuje dużo więcej czasu niż Java lub C # (C ++ wymaga maszyny Turinga, natomiast Java i C # można opisać za pomocą gramatyki bezkontekstowej).
Najważniejsze poziomy języków formalnych, od najsłabszych do najsilniejszych:
Języki, które mogą być analizowane przez skończone automaty lub REGEX (implementacje REGEX z referencjami wstecznymi są potężniejsze niż ta kategoria, ale nadal nie mogą analizować wszystkiego w kategorii 2)
Języki, które mogą być analizowane przez automaty z pamięcią stosu lub gramatyką bezkontekstową.
Języki, które mogą być analizowane przez maszynę Turinga lub automaty z pamięcią o swobodnym dostępie.
źródło
Cóż, mógłbym dać tępą odpowiedź: teoria automatów i teoria informacji.
Albo mogę powiedzieć, czego nauczyłem się od konsultanta sprzętowego dawno temu:
źródło
Cykl życia oprogramowania to coś, co sugeruję wiedzieć, jeśli jeszcze tego nie zrobiłeś. To prawda, że wprowadzono go na drugim roku kursu informatyki i jest on wielokrotnie wykorzystywany w projektach oprogramowania. Może to być przydatne, aby uzyskać ogólne pojęcie o tym, jak przebiega projekt od początku do końca, ale jeśli chcesz bardziej dogłębnie, istnieją metodologie takie jak Waterfall lub Agile, które możesz studiować, aby uzyskać bardziej szczegółową wiedzę.
źródło
Programowanie
Z Wydziału Matematyki i Informatyki Hobart i William Smith Colleges pochodzi informatyka 124 Wprowadzenie do programowania :
Jeśli nie umiesz programować, nie zajdziesz daleko w świecie komputerów.
I tak, zauważyłem, że jesteś programistą. Ma to na celu podniesienie ogólnej wiedzy na temat teorii programowania i innych dostępnych metod.
Czy programowanie informatyki w takiej formie, w jakiej ją znamy?
W odpowiedzi na komentarz @Thomas Owens, który zauważył (całkiem słusznie), że programowanie nie jest wyłącznie informatyką, chciałbym zacytować z artykułu z Wikipedii :
Tak więc, jak czytam, programując, demonstrujesz swoje zrozumienie teorii programowania. To z kolei powinno pomóc w stworzeniu prostego, eleganckiego kodu, z którym inni mogą się cieszyć.
źródło
Nie mogę się zgodzić z Konradem Rudolphem. Jest „odrobina” informatyki, którą powinieneś wiedzieć, aby uczynić cię lepszym „prawdziwym programistą”. Jeśli nie odbierzesz nic więcej od odpowiedzi, które tu otrzymujesz, przynajmniej weź to pod uwagę - Spełnienie wymagań NIE jest tym samym, co zadowolenie klienta! Użytkownicy końcowi ZAWSZE będą starali się używać twojego programu w sposób, o jakim nigdy nie myślałeś ani nie kodowałeś. ZAWSZE, ZAWSZE, ZAWSZE.
Dlatego, aby być lepszym programistą, musisz najpierw SŁUCHAĆ. Słuchaj klienta. Słuchaj ich potrzeb. Słuchaj ich życzeń. A zwłaszcza, słuchajcie ich poziomu „techniki”. Nie mogę powiedzieć, ile razy widziałem zbudowany projekt, który był dokładnie tym, o co prosiliśmy, ale wcale nie tym, czego właściwie potrzebował klient. Wszystko dlatego, że programista zbierający wymagania naprawdę nie słuchał.
Jeśli nie masz doświadczenia w projektowaniu interfejsu użytkownika, poproś kogoś, kto zaprojektuje interfejs użytkownika. ZAWSZE mogę dostrzec aplikację, w której interfejs użytkownika został zaprojektowany przez programistę, a nie eksperta. To, co jest logiczne i ma dla ciebie sens, nie będzie miało sensu dla klienta. A jeśli twoi klienci nie są tech saavy (a kto to jest?), Wtedy twoje „funkcjonalnie poprawne, ale estetycznie brzydkie” rozwiązanie spotka się z ciepłem skunksa na przyjęciu.
źródło
Języki funkcjonalne!
Nauka języków funkcjonalnych sprawia, że myślisz raczej w kategoriach wyrażeń niż kroków i nazwanych stanów zmiennych (zmiennych). Ma to znaczący wpływ na twoją zdolność skutecznego radzenia sobie z codziennymi problemami programistycznymi - zwłaszcza teraz, gdy prawie każdy popularny język ma funkcje funkcjonalne.
Algorytmy i teoria złożoności są również ważne, ale są nieco mniej interesujące, ponieważ pozwalają na umieszczanie nazw na rzeczach, które zwykle już znałeś i mógłbyś wywnioskować.
źródło
Że komputery są w zasadzie dobieraczami wzorów, niczym więcej. Wszystko sprowadza się do maszyny Turinga - klasycznej koncepcji nauki komputerowej wyjaśniającej obróbkę wzoru.
źródło
Rozwiązywanie problemów i chęć kontynuowania nauki!
Służą mi znacznie lepiej niż znajomość szybkiego sortowania i normalizacji bazy danych.
źródło