Odpowiedź
„W informatyce są dwa poważne problemy: buforowanie, nazewnictwo i błędy typu off-by-1”
Komentarze
d dodaj wątki …
Odpowiedź
Szczerze, konstrukcja kompilatora!
Komentarze
Odpowiedź
Projekt & Analiza algorytmów
Myślę, że to pytanie zależy od nauczyciela, którego miałeś i jak ten przedmiot był zorganizowany w Twoja kariera.
Analizowanie algorytmów może być tak trudne, jak ktoś chce. Weź pod uwagę, że są nierozwiązane problemy, i nie tylko: problemy, których nie można rozwiązać.
Rzecz w tym, że możesz mieć problem i jeśli wiesz, że nie można go rozwiązać, to jest idealne. Ale co jeśli tego nie zrobisz? Możesz spędzić dużo czasu próbując zademonstrować, że jest to NP-Complete lub próbując znaleźć rozwiązanie wielomianu czasu, aby go rozwiązać.
Wykazanie NP-kompletności nie jest łatwe. Tak, wiele problemów jest wiadomo, ale chodzi o to, aby znaleźć redukcje, aby wykazać, że jest to NP-Complete. A co, jeśli spędzasz wiele godzin / dni / miesięcy próbując to zademonstrować i można to rozwiązać w czasie wielomianowym? 🙂
Są też inne tematy, takie jak Kompilatory , Teoria grup i Prymitywne funkcje rekurencyjne , które mogą być tak trudne, jak chce plan przedmiotu lub nauczyciel;)
Komentarze
Odpowiedź
Rozpoznawanie wzorców ie Sztuczna inteligencja. Odnosi się to do inteligentnych obliczeń wraz z innymi narzędziami do rozpoznawania wzorców, takimi jak optyczne rozpoznawanie znaków, głos na tekst, identyfikacja twarzy itp.
Wiele „fajnych” rzeczy, które możesz zrobić lub chciałbyś zrobić na komputerach polegaj na tych algorytmach i od dziesięcioleci próbujemy je doskonalić bez większego sukcesu.
Komentarze
Odpowiedź
Mój wybór to teoria obliczalności
(Hmm … może to nie jest takie ważne, ale na pewno było trudne)
Komentarze
Odpowiedź
Są tylko dwa trudne problemy w informatyce: unieważnianie pamięci podręcznej i nazywanie rzeczy. – Phil Karlton
Odpowiedź
teoria kategorii (matematyka dyskretna), ale warto
Komentarze
Odpowiedź
Kryptografia
Jeśli zrobisz to trochę źle, może to kosztować firmę miliony.
Komentarze
Odpowiedź
Systemy operacyjne, zwłaszcza część, która ma cokolwiek wspólnego z wątkami.
A powodem nie jest to, że tak trudno było zmusić pięciu filozofów do jedzenia pizzy widelcem. Powodem jest to, że pisanie wielowątkowego kodu jest sama w sobie trudna i niekoniecznie łatwa do obliczenia dla ludzkiego (przynajmniej męskiego – według mojej żony) umysłu.
Komentarze
Odpowiedź
Ja też głosuję na Projekt kompilatora. Zwłaszcza tam, gdzie pojawia się część DFA i NFA. Nie mam też jasności co do problemów NP i takich rzeczy.
Komentarze
Odpowiedź
Teoria kolejek
Cóż, technicznie rzecz biorąc, 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 lub niejawne)).
We wczesnych latach CS kolejki były oczywiste.
Kolejka programów (każdy program to talia kart).
W dzisiejszych czasach kolejki nie są takie oczywiste. Na przykład Internet: sieć z komutacją pakietów, ale pakiety tworzą kolejki, a ich trasowanie jest formą minimalizacji kolejek.
Komentarze
Odpowiedź
Analiza numeryczna
Nie jest to zbyt trudne, aby rozwiązać problemy z zabawkami, które zostały przedstawione w trakcie kursu, ale gdy zaczniesz rozważać prawdziwe problemy, zamieni się to w poważną męczarnię.
Odpowiedź
Interpretacja wymagań klienta , gdy klient tak naprawdę nie wie, czego chce. Tego nie uczy się na studiach i jest jedną z najważniejszych umiejętności, jakie należy posiadać.
Komentarze
Odpowiedź
Osobiście moją była logika formalna. Na początku było ciężko, ale kiedy już opanujesz zasady i będziesz w stanie się nimi wystarczająco bawić, Twój mózg zacznie Logic++;
, co w fazie rozwoju jest bardzo dobrą rzeczą.
Na marginesie, odpowiadam bezpośrednio na to pytanie – zdecydowanie nie był to najtrudniejszy przedmiot, kiedy robiłem dyplom, ale był to prawdopodobnie najtrudniejszy przedmiot „nadający się do zastosowania w prawdziwym życiu”.
Komentarze
Odpowiedź
Konstrukcje kompilatora. Trudne, ale konieczne do zrozumienia pojęć stojących za
Komentarze
Odpowiedź
Jądro Zaprojektuj kogokolwiek? Cóż, 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ństwo komputera ; Naprawdę nie wiem, co sprawia, że system jest niebezpieczny, poza oczywistymi przepełnieniami bufora, zastrzykami 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 typów i rodzajów naruszeń bezpieczeństwa: widać, że istnieje wiele sposobów, w jakie program może zawierać błędy.
Odpowiedź
W tej dziedzinie jest wiele niewygodnych tematów, ale ja wybieram te dotyczące samych trwałych trudności, które dotyczą Globalnych właściwości systemu . Przykłady tego ogólnego tematu obejmują:
- Bezpieczne i wolne od zakleszczeń wielowątkowe
- Bezpieczeństwo
Są trudne, ponieważ Ty ” szukamy czegoś, co istnieje tylko wtedy, gdy wszystko jest poprawne; potrzebujesz globalnej właściwości systemu, a jednak praktycznie wszystkie dostępne narzędzia (i wszystkie te, które z mojego doświadczenia skalują się do rzeczywistych problemów) tak naprawdę działają tylko lokalnie . Jest to proces przechodzenia od rozumowania na temat fragmentów programu do całego shebangu, który jest trudny, szczególnie dlatego, że jest całkowicie możliwe, aby mieć fragmenty, które same w sobie są poprawne, ale nadal są subtelne błędy, ponieważ komponenty są nieprawidłowo rozmieszczone; błędy mogą być niepożądanymi pojawiającymi się cechami…
Odpowiedź
Usługi informacji zarządczej Podczas studiów w każdym semestrze miałem jeden przedmiot z zarządzania, co całkowicie mnie wkurzyło.
Trudne! cóż, tematy takie jak Projekt kompilatora , Projekt systemu operacyjnego itp. są trudne, ale są naprawdę interesujące i wymagające.Naprawdę majstrowałem w tematach, takich jak system informacji zarządczej / usługi itp., Ponieważ są one pełne nudy i musisz przejść przez wiele teorii.
Komentarze
Odpowiedź
Jeśli pracujesz w C / C ++, wskaźniki są najbardziej ważna koncepcja do poznania. Ale jakoś nigdy nie zrozumiałem tego w pełni na studiach.
Komentarze
Odpowiedź
Projektowanie i analiza algorytmów. To nie jest tak dużo, że trudno jest zrozumieć i przeanalizować znane algorytmy, po prostu projektowanie i analizowanie nowych algorytmów dla trudnych problemów jest trudne i wymaga szerokiego zrozumienia wielu dziedzin i praktyki w stosowaniu wielu różnych technik.
Odpowiedź
Programowanie ograniczeń. , który dotyczy problemów kombinatorycznych, problemów NP-zupełnych.
Odpowiedź
Optymalizacja Algorytm jest trudnym tematem.
Odpowiedź
Jaki jest najtrudniejszy przedmiot / teoria CS, którą studiowałeś, ale ważny w tej dziedzinie?
Dyskretna matematyka.
Było to trudne, ponieważ teorie są ze sobą bardzo luźno powiązane, ale zostały ponownie użyte w CS. Wydaje mi się, że za dużo zapamiętywania …
Dowód przez indukcję, duże O, rekurencję, dzielenie i podbój, teorię grafów, bla bla … argh!
Kompilator był dla mnie łatwy, ponieważ musieliśmy wziąć Theory of Automata. ^^
Odpowiedź
Notacja Z / formalne metody używane do zranienia mojego mózgu na studiach. Głównie dlatego, że tego nienawidziłem. Trudne jest o wiele łatwiejsze, gdy lubisz to, co robisz, a znacznie trudniejsze, gdy tego nie robisz.
Odpowiedź
Podoba mi się twoje odpowiedzi (i nie zapomniałem o ich głosowaniu), takie jak kompilator, jądro itp., ale większość programistów nigdy nie napotkała tych problemów. Jest trochę łatwiejszy, ale częstszy problem: współbieżność – wątki, blokowanie. Bardzo łatwo jest napisać program, który generuje magiczne błędy, jeśli zrobimy choćby mały błąd w architekturze współbieżności.
Więc mówię, że nie jest to najtrudniejszy problem w obliczeniach, ale ponieważ jest powszechnie używany, jest niebezpieczny.
Odpowiedź
Programowanie obiektowe
Prawdopodobnie dlatego, że zraniłem się w FORTRAN i APL, ale przejście z języków ściśle proceduralnych na obiekty było czymś, „Walczyłem z nią od lat. 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.