Kompilatory +1 były najtrudniejsze i najbardziej satysfakcjonujące.
dietbuddha
3
Było tam z największą ilością pracy i dobrym przygotowaniem do kodowania, ale nie sądzę, żeby było to takie trudne. Może trudniej bez używania YACC lub jakichkolwiek narzędzi, których używaliśmy, nie wiem.
Peter Turner
4
Kompilatory są naprawdę trudne tylko dlatego, że większość teorii wywodzi się z czasów niezwykle poważnych ograniczeń sprzętowych, a wiele formalnych instrukcji nie posunęło się za daleko. Spójrzmy na Let's Build A Compiler, aby zobaczyć, jak łatwe może być pisanie kompilatora, jeśli podejdziesz do niego z innej perspektywy.
Mason Wheeler
1
@Martin York, jako autor kompilatorów, uważam, że złożoność implementacji kompilatorów jest poważnie przeceniana. Ogólnie rzecz biorąc, kompilator jest znacznie prostszy niż interpreter. Podejrzewam, że to Smokowa Księga i jej wina jest winna, proponują najbardziej skomplikowane sposoby robienia prostych rzeczy i zwracają zbyt dużą uwagę na najmniej ważny krok, czyli parsowanie.
SK-logic
1
@Martin York, istnieją techniki utrzymywania AST tak proste i możliwe do utrzymania, jak to możliwe, bez względu na to, jak skomplikowany jest język źródłowy. Istnieje również wiele bardzo prostych, ale potężnych technik, dzięki którym każdy etap kompilacji jest trywialny i odizolowany.
SK-logika
22
Projektowanie i analiza algorytmów
Myślę, że to pytanie zależy od nauczyciela, którego miałeś i od tego, jak ten temat był zorganizowany w twojej karierze.
Analiza algorytmów może być tak trudna, jak ktoś chce. Weź pod uwagę, że istnieją nierozwiązane problemy, a nie tylko to: problemy, których nie można rozwiązać.
Chodzi o to, że możesz mieć problem, a jeśli wiesz, że nie można go rozwiązać, to idealnie. Ale co jeśli nie? Możesz spędzić dużo czasu próbując wykazać, że jest to NP-Complete, lub próbując znaleźć rozwiązanie czasu wielomianowego, aby je rozwiązać.
Wykazanie kompletności NP nie jest łatwe. Tak, znanych jest wiele problemów, ale chodzi o znalezienie redukcji, aby wykazać, że jest to NP-Complete. A co, jeśli spędzasz wiele godzin / dni / miesięcy próbując to zademonstrować, a można to rozwiązać w czasie wielomianowym? :)
Istnieją również inne przedmioty, takie jak kompilatory , teoria grup i pierwotne funkcje rekurencyjne, które mogą być tak trudne, jak plan zajęć lub nauczyciel chce;)
s / Analiza / Analiza ... inaczej dokładnie to, co myślę ... prymitywne funkcje rekurencyjne, uhgh !!
Felix Dombek
Zgadzam się, że przeszedłem przez studia licencjackie, nigdy nie mając pewności, że kiedykolwiek z powodzeniem „udowodniłem” cokolwiek (chociaż moja klasa algorytmów była zbyt prosta, z powodu profesora)
Peter Turner
Pokażę wam w dzisiejszych czasach, jak trudne mogą być algorytmy :)
Oscar Mederos
18
Rozpoznawanie wzorów, tj. Sztuczna inteligencja. Odnosi się to do inteligentnego przetwarzania wraz z innymi narzędziami do rozpoznawania wzorów, takimi jak optyczne rozpoznawanie znaków, głos do tekstu, identyfikacja twarzy itp.
Wiele „fajnych” rzeczy, które możesz zrobić lub chcesz zrobić z komputerami, polegają na tych algorytmach, a od dziesięcioleci staramy się je doskonalić bez większego sukcesu.
Jest to trudne, ponieważ nie jest to coś deterministycznego. Opracowanie dobrego rozpoznawania wzorców AI wymaga eksperymentów dla każdej aplikacji, w której chcesz go używać, aby upewnić się, że wybierasz odpowiedni algorytm, odpowiednie funkcje itp.
Ken Bloom
1
Zaczynam dopiero wspinać się na tę górę (rozpoznawanie wzorów). To trudne. DUŻO matematyki. Wielkie, ogromne, zastraszające stosy matematyki, wpatrujące się we mnie, odważające mnie wejść.
David Poole
no cóż ... rozpoznawanie wzorców może być również postrzegane jako statystyki stosowane, to nie jest tylko problem w zakresie CS
Zgadzam się, że teoria obliczeń była trudna, ale była też jednym z moich ulubionych przedmiotów. Przyznaję, że studiowałem matematykę na dwóch kierunkach ...
Poindexter
+1 też podwójnie specjalizuję się. Mógłbym poradzić sobie z tym wprowadzeniem, ale wersja dla absolwentów ... Cieszę się, że go upuściłem!
Job
było ciężko, nie wiemy o tym tyle, że nie ma to większego znaczenia.
Nazwa wyświetlana
10
Istnieją tylko dwa trudne problemy w informatyce: unieważnienie pamięci podręcznej i nadawanie nazw. - Phil Karlton
Chociaż coraz bardziej popularny, Crypto nie jest unikalny dla oprogramowania.
JBRWilkinson
Crypto nie jest takie trudne. Problem polega na tym, że bezpieczeństwo nie może być łatwo przetestowane, więc zauważasz swoje błędy tylko wtedy, gdy ktoś cię włamie. Jednak brak możliwości testowania dotyczy większości form bezpieczeństwa IT, a nie tylko kryptografii.
CodesInChaos
4
Systemy operacyjne, szczególnie część, która ma coś wspólnego z wątkami.
A powodem nie jest to, że tak trudno było zmusić 5 filozofów do zjedzenia pizzy widelcem. Powodem jest to, że pisanie wielowątkowego kodu jest samo w sobie trudne i niekoniecznie łatwe dla ludzkiego (przynajmniej męskiego - według mojej żony) umysłu do obliczenia.
Pozwól więc swojej żonie napisać kod wielowątkowy :)
3
Pamiętaj, że jeśli chodzi o wielowątkowość pamięci współużytkowanej, komputer to sprytna świnia, która chce cię dopaść. Podwójnie, gdy chodzi o procesor wielordzeniowy; jeden rdzeń może rozpraszać cię przed oczami, gdzie patrzysz, a drugi może następnie iść za tobą i dźgnąć cię w plecy.
Donal Fellows
3
Ja również głosuję na projekt kompilatora. Zwłaszcza tam, gdzie wchodzi część DFA i NFA. Nie jestem też tak jasny na temat problemów związanych z NP.
Tak, trudniej byłoby mi pracować z kompilatorami, gdybym nie wziął najpierw teorii obliczeń.
Peter Turner
DFA i NFA są karmą dla kurczaków. Poczekaj, aż będziesz musiał wykonać analizę LALR (1).
David Thornley,
3
Teoria kolejkowania
Technicznie jest to gałąź matematyki, ale jest bardzo istotna w CS.
Prawie wszystko w CS opiera się na kolejkach (widoczne (oczywiste) i niewidoczne (nie tak oczywiste ani dorozumiane)).
W pierwszych dniach CS kolejki były oczywiste.
Kolejka programów (każdy program talia kart).
W dzisiejszych czasach kolejki nie są tak oczywiste. Internet na przykład: sieć z komutacją pakietów, ale pakiety tworzą kolejki, a routing pakietów jest formą minimalizacji kolejki.
Interpretowanie wymagań klienta, gdy klient tak naprawdę nie wie, czego chce. Tego nie uczy się na studiach i jest to jedna z najważniejszych umiejętności.
Nie jestem pewien, czy zgadzam się z tym, że jest to koncepcja informatyki. Nie rozumiem też, jak można to rozwiązać za pomocą metody naukowej.
jmort253
@ jmort253 - To prawda, ale informatyka próbuje (moim zdaniem bezskutecznie) zbadać tę dziedzinę za pomocą formalnych metod projektowania i sprawdzania poprawności.
mouviciel
Zgadzam się, że nie jest to koncepcja „informatyki” - ale kiedy zaczynałem karierę, nie byłem świadomy / nieświadomy faktu, że klienci nie wiedzą, czego chcą. Myślałem, że WSZYSTKIE projekty oprogramowania pochodzą z jakimś formalnym dokumentem wymagań. Może temat wykładu na kurs inżynierii oprogramowania (może moja uczelnia go nie omawiała)?
Steven Striga
1
Osobiście moja była logiką formalną. Trudno było zacząć od tego, ale kiedy już zrzucisz zasady i uda ci się z nimi grać wystarczająco dużo, twój mózg idzie Logic++;, co w rozwoju jest bardzo dobrą rzeczą.
Na marginesie, odpowiadam bezpośrednio na to pytanie - zdecydowanie nie był to najtrudniejszy temat, kiedy ukończyłem studia, ale prawdopodobnie był to najtrudniejszy temat „odpowiedni do życia”.
Logika formalna to coś, z czym miałem związek miłości / nienawiści. Lubiłem zastanawiać się nad koncepcjami, ale nigdy nie mogłem zrozumieć, w jaki sposób mi to pomogło, dopóki nie spotkałem rzeczywistych problemów wymagających logicznego myślenia.
jmort253
@ jmort253 - Tak naprawdę było dla mnie tak samo. Walczyłem nawet do tego stopnia, że pomyślałem, że to się nie powiedzie, studiowałem tak długo i ciężko, aż w końcu kliknęło mi w głowę. Po tym korzyści były niesamowite.
Kyle Rozendo
1
Konstrukcje kompilatora. Trudno, ale trzeba zrozumieć koncepcje
Powinieneś oddać głos za tą samą odpowiedzią, która została Ci udzielona, zamiast dawać tę samą odpowiedź ponownie.
Abimaran Kugathasan
1
Kernel Design ktoś? Cóż, tak naprawdę nie wiem, jak to się robi i jakie są docelowe funkcje systemu operacyjnego, ale dla mnie myślenie o zaprojektowaniu jądra musi być trudnym zadaniem.
Myślę też o bezpieczeństwie komputerowym ; Naprawdę nie wiem, co sprawia, że system jest niebezpieczny, z wyjątkiem oczywiście oczywistych przepełnień bufora, zastrzyków XSS i SQL.
Nie jestem pewien, ale wydaje się, że niektóre algorytmy są również niebezpieczne; Spójrz na projekt MetaSploit, zawiera listę wszystkich rodzajów i rodzajów naruszeń bezpieczeństwa: widać, że istnieje wiele sposobów, w jakie program może zostać uszkodzony.
Istnieje wiele niezręcznych tematów w tej dziedzinie, ale moje wybory dla samej ciągłej trudności to te dotyczące Global System Properties . Przykłady tego ogólnego tematu obejmują:
Bezpieczne i bezproblemowe wielowątkowość
Bezpieczeństwo
Są trudne, ponieważ szukasz czegoś, co istnieje tylko wtedy, gdy wszystko jest w porządku; trzeba Global Property systemu i jeszcze praktycznie wszystkich dostępnych narzędzi (oraz wszystkie te, które skala do rzeczywistych problemów w moim doświadczeniu) tylko naprawdę lokalnej rozumowania. Jest to trudny proces przechodzenia od wnioskowania na temat fragmentów programu do całego shebang, szczególnie dlatego, że całkowicie możliwe jest posiadanie kawałków, które same w sobie są poprawne, ale gdzie nadal występują subtelne błędy, ponieważ komponenty są nieprawidłowo rozmieszczone; błędy mogą być niepożądanymi nowymi cechami…
Usługi informacji zarządczej
W czasie studiów miałem jeden przedmiot zarządzania w każdym semestrze, co całkowicie mnie wkurzyło.
Twardy! oraz przedmioty, takie jak Compiler projekt , OS projekt etc są trudne, ale są naprawdę interesujące i wyzywające. Naprawdę pomieszałem w tematach takich jak System informacji zarządczej / Usługi itp., Ponieważ są one pełne nudy i trzeba przejść wiele teorii.
Nudzą się, ponieważ mówią o zawiłościach koncepcyjnych każdego systemu, podczas gdy połowa ludzi nigdy sama nie napisała żadnego systemu (ale z pewnością korzystała z różnych). Ponadto w seminariach używa się tak wielu załadowanych słów, ale nie stanowią one prawdziwego przykładu w prostym języku angielskim. Podobnie jak systemy wspomagające podejmowanie decyzji ... nie możesz po prostu upuścić kilku zrzutów ekranu raportów Google Analytics, FML, tylko po to, aby uczniowie znaleźli się na tej samej stronie przed ucieczką przed intelektualnym orgazmem przed widownią.
Filip Dupanović
0
Jeśli pracujesz w C / C ++, najważniejsze są najważniejsze pojęcia. Ale jakoś nigdy nie zrozumiałem tego w pełni na studiach.
naprawdę? Mam na myśli, że każda osoba jest inna, ale myślę, że jest wiele (mam na myśli, wiele ) tematów trudniejszych niż tylko wskaźniki . Na przykład architektura komputera , Assambler, który w jakiś sposób jest powiązany ze wskaźnikami ;)
Oscar Mederos
To prawda, ale zrozumienie odwoływania się do pamięci przez asemblery jest o wiele łatwiejsze, ponieważ w rzeczywistości pracujesz z surowymi wskaźnikami, podczas gdy w C / C ++ pracujesz z odwołaniami do wskaźników, co po prostu dezorientuje ludzi, ponieważ abstrakcja nigdy nie jest wypowiadana wprost. o.
Filip Dupanović
2
Ah assambler, herbata najlepszego programisty
Matt Ellen
Facet zapytał o tematy trudne, ale ważne, stąd wskazówki.
Manoj R
@Matt: Właśnie uczyniłeś mój dzień: D @Manoj R: Wskaźniki są trywialne, jeśli pomyślisz o nich jako o dostępie do tablicy. Czy dostęp do tablicy jest trudny?
back2dos
0
Projektowanie i analiza algorytmów. Nie chodzi o to, że trudno jest zrozumieć i przeanalizować znane algorytmy, ale o to, że projektowanie i analiza nowych algorytmów dla trudnych problemów jest trudna i wymaga szerokiego zrozumienia wielu obszarów i praktyki w stosowaniu wielu różnych technik.
Notacja Z / formalne metody używane do zranienia mojego mózgu na studiach. Głównie dlatego, że nienawidziłem tego. Trudne jest o wiele łatwiejsze, gdy lubisz to, co robisz, i znacznie trudniejsze, gdy nie.
Lubię twoje odpowiedzi (i nie zapomniałem o ich poprawieniu), takie jak kompilator, jądro itp., Ale większość programistów nigdy nie spotkała się z tymi problemami. Jest nieco łatwiejszy, ale bardziej powszechny problem: współbieżność - wątki, blokowanie. Bardzo łatwo jest napisać program, który generuje magiczne błędy, jeśli popełniamy nawet mały błąd w architekturze współbieżności.
Mówię więc, że nie jest to najtrudniejszy problem w informatyce, ale ponieważ jest powszechnie używany, jest niebezpieczny.
Prawdopodobnie dlatego, że obciąłem zęby FORTRAN i APL, ale od lat zmagałem się z językami ściśle proceduralnymi do przedmiotów. Nie pomaga to, że tak zwani „eksperci” piszą sprzeczne artykuły i samouczki na temat tego, co to znaczy być zorientowanym obiektowo oraz najlepszych / właściwych sposobów konstruowania programów zorientowanych obiektowo.
Odpowiedzi:
„W informatyce występują 2 trudne problemy: pamięć podręczna, nazewnictwo i błędy off-by-1”
źródło
Szczerze mówiąc, konstrukcja kompilatora!
źródło
Projektowanie i analiza algorytmów
Myślę, że to pytanie zależy od nauczyciela, którego miałeś i od tego, jak ten temat był zorganizowany w twojej karierze.
Analiza algorytmów może być tak trudna, jak ktoś chce. Weź pod uwagę, że istnieją nierozwiązane problemy, a nie tylko to: problemy, których nie można rozwiązać.
Chodzi o to, że możesz mieć problem, a jeśli wiesz, że nie można go rozwiązać, to idealnie. Ale co jeśli nie? Możesz spędzić dużo czasu próbując wykazać, że jest to NP-Complete, lub próbując znaleźć rozwiązanie czasu wielomianowego, aby je rozwiązać.
Wykazanie kompletności NP nie jest łatwe. Tak, znanych jest wiele problemów, ale chodzi o znalezienie redukcji, aby wykazać, że jest to NP-Complete. A co, jeśli spędzasz wiele godzin / dni / miesięcy próbując to zademonstrować, a można to rozwiązać w czasie wielomianowym? :)
Istnieją również inne przedmioty, takie jak kompilatory , teoria grup i pierwotne funkcje rekurencyjne, które mogą być tak trudne, jak plan zajęć lub nauczyciel chce;)
źródło
Rozpoznawanie wzorów, tj. Sztuczna inteligencja. Odnosi się to do inteligentnego przetwarzania wraz z innymi narzędziami do rozpoznawania wzorów, takimi jak optyczne rozpoznawanie znaków, głos do tekstu, identyfikacja twarzy itp.
Wiele „fajnych” rzeczy, które możesz zrobić lub chcesz zrobić z komputerami, polegają na tych algorytmach, a od dziesięcioleci staramy się je doskonalić bez większego sukcesu.
źródło
Moim wyborem jest teoria obliczalności
(Hmm ... może to nie jest takie ważne, ale z pewnością było trudne)
źródło
źródło
teoria kategorii (matematyka dyskretna), ale warto
źródło
Kryptografia
Jeśli zrobisz to trochę źle, może kosztować firmę miliony.
źródło
Systemy operacyjne, szczególnie część, która ma coś wspólnego z wątkami.
A powodem nie jest to, że tak trudno było zmusić 5 filozofów do zjedzenia pizzy widelcem. Powodem jest to, że pisanie wielowątkowego kodu jest samo w sobie trudne i niekoniecznie łatwe dla ludzkiego (przynajmniej męskiego - według mojej żony) umysłu do obliczenia.
źródło
Ja również głosuję na projekt kompilatora. Zwłaszcza tam, gdzie wchodzi część DFA i NFA. Nie jestem też tak jasny na temat problemów związanych z NP.
źródło
Teoria kolejkowania
Technicznie jest to gałąź matematyki, ale jest bardzo istotna w CS.
Prawie wszystko w CS opiera się na kolejkach (widoczne (oczywiste) i niewidoczne (nie tak oczywiste ani dorozumiane)).
W pierwszych dniach CS kolejki były oczywiste.
Kolejka programów (każdy program talia kart).
W dzisiejszych czasach kolejki nie są tak oczywiste. Internet na przykład: sieć z komutacją pakietów, ale pakiety tworzą kolejki, a routing pakietów jest formą minimalizacji kolejki.
źródło
Analiza numeryczna
Problemy z zabawkami, które dostajesz na kursie, nie są zbyt trudne, ale kiedy zaczniesz rozważać prawdziwe problemy, zamieni się to w ciężką harówkę.
źródło
Interpretowanie wymagań klienta, gdy klient tak naprawdę nie wie, czego chce. Tego nie uczy się na studiach i jest to jedna z najważniejszych umiejętności.
źródło
Osobiście moja była logiką formalną. Trudno było zacząć od tego, ale kiedy już zrzucisz zasady i uda ci się z nimi grać wystarczająco dużo, twój mózg idzie
Logic++;
, co w rozwoju jest bardzo dobrą rzeczą.Na marginesie, odpowiadam bezpośrednio na to pytanie - zdecydowanie nie był to najtrudniejszy temat, kiedy ukończyłem studia, ale prawdopodobnie był to najtrudniejszy temat „odpowiedni do życia”.
źródło
Konstrukcje kompilatora. Trudno, ale trzeba zrozumieć koncepcje
źródło
Kernel Design ktoś? Cóż, tak naprawdę nie wiem, jak to się robi i jakie są docelowe funkcje systemu operacyjnego, ale dla mnie myślenie o zaprojektowaniu jądra musi być trudnym zadaniem.
Myślę też o bezpieczeństwie komputerowym ; Naprawdę nie wiem, co sprawia, że system jest niebezpieczny, z wyjątkiem oczywiście oczywistych przepełnień bufora, zastrzyków XSS i SQL.
Nie jestem pewien, ale wydaje się, że niektóre algorytmy są również niebezpieczne; Spójrz na projekt MetaSploit, zawiera listę wszystkich rodzajów i rodzajów naruszeń bezpieczeństwa: widać, że istnieje wiele sposobów, w jakie program może zostać uszkodzony.
źródło
Istnieje wiele niezręcznych tematów w tej dziedzinie, ale moje wybory dla samej ciągłej trudności to te dotyczące Global System Properties . Przykłady tego ogólnego tematu obejmują:
Są trudne, ponieważ szukasz czegoś, co istnieje tylko wtedy, gdy wszystko jest w porządku; trzeba Global Property systemu i jeszcze praktycznie wszystkich dostępnych narzędzi (oraz wszystkie te, które skala do rzeczywistych problemów w moim doświadczeniu) tylko naprawdę lokalnej rozumowania. Jest to trudny proces przechodzenia od wnioskowania na temat fragmentów programu do całego shebang, szczególnie dlatego, że całkowicie możliwe jest posiadanie kawałków, które same w sobie są poprawne, ale gdzie nadal występują subtelne błędy, ponieważ komponenty są nieprawidłowo rozmieszczone; błędy mogą być niepożądanymi nowymi cechami…
źródło
Usługi informacji zarządczej W czasie studiów miałem jeden przedmiot zarządzania w każdym semestrze, co całkowicie mnie wkurzyło.
Twardy! oraz przedmioty, takie jak Compiler projekt , OS projekt etc są trudne, ale są naprawdę interesujące i wyzywające. Naprawdę pomieszałem w tematach takich jak System informacji zarządczej / Usługi itp., Ponieważ są one pełne nudy i trzeba przejść wiele teorii.
źródło
Jeśli pracujesz w C / C ++, najważniejsze są najważniejsze pojęcia. Ale jakoś nigdy nie zrozumiałem tego w pełni na studiach.
źródło
Projektowanie i analiza algorytmów. Nie chodzi o to, że trudno jest zrozumieć i przeanalizować znane algorytmy, ale o to, że projektowanie i analiza nowych algorytmów dla trudnych problemów jest trudna i wymaga szerokiego zrozumienia wielu obszarów i praktyki w stosowaniu wielu różnych technik.
źródło
Programowanie ograniczeń. który dotyczy problemów kombinatorycznych, problemów NP-zupełnych.
źródło
Optymalizacja algorytmu stanowi trudny temat.
źródło
Dyskretna matematyka.
Było to trudne, ponieważ teorie są bardzo luźno ze sobą powiązane, ale są stosowane w CS. Myślę, że za dużo zapamiętywania ...
Dowód indukcji, Big O, rekurencja, dzielenie i podbijanie, teoria grafów, bla bla ... argh!
Kompilator był dla mnie łatwy, ponieważ musieliśmy wziąć teorię automatów. ^^
źródło
Notacja Z / formalne metody używane do zranienia mojego mózgu na studiach. Głównie dlatego, że nienawidziłem tego. Trudne jest o wiele łatwiejsze, gdy lubisz to, co robisz, i znacznie trudniejsze, gdy nie.
źródło
Lubię twoje odpowiedzi (i nie zapomniałem o ich poprawieniu), takie jak kompilator, jądro itp., Ale większość programistów nigdy nie spotkała się z tymi problemami. Jest nieco łatwiejszy, ale bardziej powszechny problem: współbieżność - wątki, blokowanie. Bardzo łatwo jest napisać program, który generuje magiczne błędy, jeśli popełniamy nawet mały błąd w architekturze współbieżności.
Mówię więc, że nie jest to najtrudniejszy problem w informatyce, ale ponieważ jest powszechnie używany, jest niebezpieczny.
źródło
Programowanie obiektowe
Prawdopodobnie dlatego, że obciąłem zęby FORTRAN i APL, ale od lat zmagałem się z językami ściśle proceduralnymi do przedmiotów. Nie pomaga to, że tak zwani „eksperci” piszą sprzeczne artykuły i samouczki na temat tego, co to znaczy być zorientowanym obiektowo oraz najlepszych / właściwych sposobów konstruowania programów zorientowanych obiektowo.
źródło