Welches ist das schwierigste CS-Fach / die schwierigste Theorie, die Sie studiert haben, aber für das Fach wichtig? Und der Grund bitte?
Welches ist das schwierigste CS-Fach / die schwierigste Theorie, die Sie studiert haben, aber für das Fach wichtig? Und der Grund bitte?
Antworten:
„In der Informatik gibt es zwei schwierige Probleme: Caching, Benennung und 1-malige Fehler.“
Ehrlich gesagt, Compilerbau!
Entwurf und Analyse von Algorithmen
Ich denke, diese Frage hängt von dem Lehrer ab, den Sie hatten, und wie dieses Fach in Ihrer Karriere organisiert war.
Das Analysieren von Algorithmen kann so schwierig sein, wie es jemand möchte. Berücksichtigen Sie, dass es ungelöste Probleme gibt, und nicht nur das: Probleme, die nicht gelöst werden können.
Die Sache ist, dass Sie ein Problem haben können, und wenn Sie wissen, dass es nicht gelöst werden kann, ist das perfekt. Aber was ist, wenn du es nicht tust? Sie können viel Zeit damit verbringen, zu zeigen, dass es sich um NP-Complete handelt, oder versuchen, eine polynomielle Zeitlösung zu finden, um es zu lösen.
NP-Vollständigkeit nachzuweisen ist nicht einfach. Ja, viele Probleme sind bekannt, aber es geht darum, die Reduzierungen zu finden, um zu beweisen, dass es sich um NP-Complete handelt. Und was ist, wenn Sie viele Stunden / Tage / Monate damit verbringen, es zu demonstrieren, und es in polynomieller Zeit gelöst werden kann? :)
Es gibt auch andere Fächer wie Compiler , Gruppentheorie und primitive rekursive Funktionen , die so schwierig sein können, wie es der Fachplan oder der Lehrer wünscht;)
Mustererkennung, dh künstliche Intelligenz. Dies bezieht sich auf Smart Computing zusammen mit anderen Werkzeugen zur Mustererkennung wie der optischen Zeichenerkennung, der Spracherkennung, der Gesichtserkennung usw.
Viele der "coolen" Dinge, die Sie mit Computern tun können oder möchten, beruhen auf diesen Algorithmen, und wir haben jahrzehntelang versucht, sie zu perfektionieren, ohne großen Erfolg.
Meine Wahl ist die Berechenbarkeitstheorie
(Hmm ... vielleicht ist es nicht so wichtig, aber es war sicher schwierig)
In der Informatik gibt es nur zwei schwierige Probleme: die Ungültigmachung des Cache und die Benennung von Dingen. - Phil Karlton
Kategorietheorie (diskrete Mathematik), aber es lohnt sich
Kryptographie
Wenn Sie es nur leicht falsch machen, kann es eine Firma Millionen kosten.
Betriebssysteme, insbesondere der Teil, der mit Threading zu tun hat.
Und der Grund ist nicht, dass es so schwer war, 5 Philosophen dazu zu bringen, Pizza mit einer Gabel zu essen. Der Grund dafür ist, dass das Schreiben von Multithread-Code an sich schwierig und für den menschlichen (zumindest männlichen - meiner Frau zufolge) Verstand nicht unbedingt einfach zu berechnen ist.
Ich stimme auch für Compiler Design. Vor allem, wenn der DFA- und der NFA-Teil hinzukommen. Ich bin mir auch nicht so klar über NP-Probleme und so.
Nun, technisch gesehen ist dies ein Zweig der Mathematik, aber in CS von hoher Relevanz.
Fast alles in CS basiert auf Warteschlangen (sichtbar (offensichtlich) und unsichtbar (nicht so offensichtlich oder impliziert)).
In den frühen Tagen von CS waren die Warteschlangen offensichtlich.
Eine Reihe von Programmen (jedes Programm ein Kartenspiel).
Heutzutage sind die Warteschlangen nicht so offensichtlich. Das Internet zum Beispiel: Ein paketvermitteltes Netzwerk, aber die Pakete bilden Warteschlangen, und das Weiterleiten der Pakete ist eine Form der Warteschlangenminimierung.
Es ist nicht allzu schwer, welche Probleme mit dem Spielzeug im Kurs auftreten, aber sobald Sie anfangen, über echte Probleme nachzudenken, wird es zu einer schweren Plackerei.
Interpretieren von Kundenanforderungen, wenn der Kunde nicht genau weiß, was er möchte. Dies wird nicht im College unterrichtet und ist eine der wichtigsten Fähigkeiten, die man haben muss.
Persönlich war meine formale Logik. Es war anfangs schwierig, aber wenn man erst einmal die Regeln festgelegt hat und es geschafft hat, genug damit zu spielen, geht es dem Gehirn gut Logic++;
, was in der Entwicklung eine sehr gute Sache ist.
Als Randbemerkung beantworte ich die Frage direkt - dies war definitiv nicht das schwierigste Fach, als ich meinen Abschluss machte, aber es war wahrscheinlich das schwierigste "im wirklichen Leben anwendbare" Fach.
Compiler-Konstruktionen. Schwer, aber muss die Konzepte dahinter verstehen
Kernel Design jemand? Nun, ich weiß nicht wirklich, wie es gemacht wird und welche Features ein Betriebssystem haben soll, aber für mich muss es eine entmutigende Aufgabe sein, über das Entwerfen eines Kernels nachzudenken.
Ich denke auch an die Computersicherheit . Ich weiß nicht wirklich, was ein System unsicher macht, außer natürlich offensichtlichen Pufferüberläufen, XSS- und SQL-Injections.
Ich bin nicht sicher, aber es scheint, dass einige Algorithmen auch unsicher sind; Wenn Sie sich das MetaSploit-Projekt ansehen, werden alle Arten und Arten von Sicherheitsverletzungen aufgelistet: Sie können feststellen, dass ein Programm auf vielfältige Weise fehlerhaft sein kann.
Es gibt viele unangenehme Themen auf dem Gebiet, aber meine Auswahl für bloß anhaltende Schwierigkeiten sind diejenigen, die globale Systemeigenschaften betreffen . Beispiele für dieses allgemeine Thema sind:
Diese sind schwierig, weil Sie nach etwas suchen, das nur existiert, wenn alles korrekt ist. Sie benötigen eine globale Systemeigenschaft und dennoch können praktisch alle verfügbaren Tools (und alle Tools , die sich nach meiner Erfahrung auf echte Probleme skalieren lassen) nur lokal argumentieren. Es ist der Prozess, von der Überlegung über die Teile des Programms zum ganzen Schebang zu gelangen, der schwierig ist, insbesondere, weil es durchaus möglich ist, Teile zu haben, die in sich korrekt sind, aber wo es immer noch subtile Fehler gibt, weil die Komponenten falsch angeordnet sind. die Bugs können unerwünschte auftauchende Merkmale sein ...
Management Information Services
Während meiner Studienzeit hatte ich jedes Semester ein Managementfach, was mich total verrückt machte.
Zäh! Gute Themen wie Compiler-Design , OS-Design usw. sind schwierig, aber wirklich interessant und herausfordernd. Ich habe Themen wie Management Information System / Services usw. wirklich durcheinandergebracht, da sie voller Langeweile sind und Sie eine Menge Theorie durchlaufen müssen.
Wenn Sie in C / C ++ arbeiten, sind Zeiger das wichtigste Konzept, das Sie kennen müssen. Aber irgendwie habe ich es im College nie richtig verstanden.
Entwurf und Analyse von Algorithmen. Es ist nicht so schwer, bekannte Algorithmen zu verstehen und zu analysieren , sondern es ist schwierig, neue Algorithmen für schwierige Probleme zu entwerfen und zu analysieren, und es erfordert ein umfassendes Verständnis vieler Bereiche und Praktiken bei der Anwendung vieler verschiedener Techniken.
Welches ist das schwierigste CS-Fach / die schwierigste Theorie, die Sie studiert haben, aber für das Fach wichtig?
Diskrete Mathematik.
Es war schwierig, weil die Theorien sehr eng miteinander verwandt sind, aber sie werden in CS verwendet. Zu viel Auswendiglernen, denke ich ...
Beweis durch Induktion, Big O, Rekursion, Dividieren und Konquirieren, Graphentheorie, bla bla .. argh!
Compiler war für mich einfach, weil wir Theory of Automata nehmen mussten. ^^
Ich mag Ihre Antworten (und ich habe nicht vergessen, sie zu aktualisieren), wie Compiler, Kernel usw., aber die meisten Programmierer sind diesen Problemen nie begegnet. Es gibt ein etwas einfacheres, aber häufigeres Problem: Parallelität - Threads, Sperren. Es ist sehr einfach, ein Programm zu schreiben, das magische Fehler erzeugt, wenn wir auch nur einen kleinen Fehler in der Parallelitätsarchitektur machen.
Also, ich sage, es ist nicht das schwierigste Problem beim Rechnen, aber weil es allgemein verwendet wird, ist es gefährlich.
Objekt orientierte Programmierung
Das liegt wahrscheinlich daran, dass ich FORTRAN und APL auf den Kopf gestellt habe, aber mit der Verlagerung von streng prozeduralen Sprachen zu Objekten habe ich jahrelang zu kämpfen. Es hilft nicht, dass sogenannte "Experten" widersprüchliche Artikel und Tutorials darüber schreiben, was es bedeutet, objektorientiert zu sein und die besten / richtigen Wege zu finden, um objektorientierte Programme zu erstellen.