CS-Fächer, die ein Student kennen muss [geschlossen]

34

An der Uni habe ich mich nie für Theorie interessiert. Ich habe es nie gelesen. Egal wie viel ich versuchte, ich konnte nichts lesen und wusste nicht, was in der Praxis tatsächlich geschah. Wie zum Beispiel in meinem Kurs über Automatentheorie erzählte mir mein Professor alles, was möglicherweise mit dem mathematischen Aspekt zu tun hatte, aber er erwähnte nicht ein einziges Mal, wo es praktisch angewendet werden würde. Dies ist nur ein Beispiel.

Ich habe mein College erfolgreich abgeschlossen und auch ein Praktikum bei einer Firma absolviert, bei der ich ein Projekt durchgeführt habe. Zum Glück haben sie sich nicht um meine Noten gekümmert, da sie überdurchschnittlich gut waren.

Jetzt bin ich daran interessiert, welche Fächer ein CS-Student unbedingt und positiv kennen muss. Themen, die in der Branche relevant sein können. Das liegt daran, dass ich etwas Freizeit habe und es mir helfen würde, sie besser zu verstehen.

Was sind deine Vorschläge? Algorithmen sind ein Thema.

Karl
quelle
3
Reguläre Ausdrücke basieren auf der Automatentheorie und helfen Ihnen, wenn Sie jemals etwas analysieren müssen. Ich habe in der Schule Dinge getan und gelernt, die für meine Jobs irrelevant waren, aber das sagt mindestens so viel über das aus, woran ich gearbeitet habe, wie über das, was ich gelernt habe. Nichts, was ich gelernt habe, wäre auf dem Gebiet unter allen Umständen nutzlos.
David Thornley
2
Ich hasse es, mit deinem Typ zu arbeiten ... jk (irgendwie). Wenn ich Sie wäre, würde ich mir zuerst die Zeit nehmen, Dinge zu wiederholen, die Sie von der Schule wissen sollten - so würden Sie bei Ihrem nächsten Interview nicht wie ein Idiot aussehen. Danach würde ich eine angemessene Menge an Datenstrukturen und Algorithmen lernen, die so aussehen, als könnten sie in einer realen Welt verwendet werden. Sie müssen herausfinden, wo Sie sein möchten. Wenn Sie ein Spieleentwickler sind, benötigen Sie wahrscheinlich lineare Algebra, 3D-Grafik und rechnerische Geometrie. Im Allgemeinen müssen Sie Datenstr-, Alg-, Datenbank-, Betriebssystem- und Compiler-Inhalte auf ein Minimum reduzieren und weiter lernen.
Job
Es ist schwierig, eine bestimmte Anwendung für die Automatentheorie so zu benennen, wie es schwierig ist, eine bestimmte Anwendung für die Arithmetik zu benennen. Eine Übertreibung vielleicht, aber nicht so sehr. Zustandsdiagramme sind häufig nützlich, und ihre Bearbeitung im Code ist für eine Reihe von Zwecken hilfreich. Entscheidungsbäume (in Digraphen minimiert) sind für mich ein relativ junges Beispiel, und ich musste sogar Zustandsmodelle (in kanonischer Form) als Schlüssel für Container verwenden. Wenn Sie Anwendungen in Anwendungen nicht sehen können, denken Sie daran, eine Ebene der Indirektionscodegenerierung hinzuzufügen.
Steve314
1
Im Folgenden finden Sie viele gute CS-Antworten, aber ich denke, wenn Sie Ihre Frage so einschränken, dass Ihnen einige der nützlichsten Dinge fehlen, die ich in den 15 Jahren seit meinem BSCS gesehen habe Das hat sich in der Branche bewährt: Kommunikation in kleinen Gruppen und Teamfähigkeit. Wie albern es scheint, gehen Sie zur Sprach- / Theaterabteilung und nehmen Sie an einem Kurs wie "Kleingruppenkommunikation" oder "Team- / Gruppenführung / Management" teil. Auch wenn Sie nicht vorhaben, Management zu übernehmen, werden Sie aufgrund der dort erworbenen Fähigkeiten zu einem besseren Ingenieur und Teammitglied.
Cabbey

Antworten:

41

Ob Sie es glauben oder nicht, eines der Dinge, die sich im späteren Leben als von entscheidender Bedeutung für mich herausstellten, war Compiler Construction. Nicht die moderne Namby-Pamby-Version mit Lex und Yacc, das ist für Dummies.

ECHTE Compilerkonstruktion, in der Sie Ihren eigenen Symbolscanner und Parser von Grund auf schreiben.

Dies ist etwas, von dem ich dachte, dass ich es nie wieder verwenden würde. Aber in den letzten 20 Jahren hat dieser Kurs sein Gewicht in Gold viermal bewiesen. Jeder Kommandoprozessor, den ich schreiben musste, jeder Incoming-Message-Scanner, jeder User-Dispatcher, jeder Script-Interpreter, hat die Prinzipien dieses Kurses verwendet. Tun Sie es so und das Leben ist süß, klar und einfach. UND ich gab sogar einem Kollegen, der es nicht getan hatte, alle Informationen - er musste tatsächlich einen Compiler für eine abstrakte Maschine schreiben. Was ich hinzufügen möchte, hat sich als sehr kommerziell erfolgreich erwiesen.

Wenn ich mich bei einem Universitätsdozenten für ein Fach bedanken müsste, wäre es das. Ohne das wäre ich durchgekommen, aber meine Lösungen wären viel viel hässlicher gewesen.

(Und bevor jemand aufspringt und sagt "Nun, du hättest Lex und Yacc verwenden können ...", lautet die Antwort vielleicht - es hängt sehr vom System ab. In einigen Fällen waren die Programmiersprachen nicht C (z. B. PL / M und Ada), in einigen Fällen waren weder Lex noch Yacc für die Plattform verfügbar. Wenn Sie die Grundlagen kennen, haben Sie eine Lösung parat, anstatt die Hände zu wringen und herauszufinden, wie Sie ein Werkzeug biegen können, um das Problem zu lösen.)

schnell_nun
quelle
6
+1 Compiler war einer meiner Lieblingskurse an der Uni und ist immer nützlich. Lex / yacc / bison habe ich selten benutzt, die grundlagen sind viel konkreter.
Orbling
Ich stimme vollkommen zu, obwohl aus einem anderen Grund. Zu wissen, wie man den Code-Generator schreibt - obwohl ich Lex und Yacc verwendet habe - war mein erstes und bestes Eintauchen in die objektorientierte Programmierung.
Peter Turner
Sie können (und sollten AUCH wissen, wie man den Codegenerator in C oder einer anderen Nicht-OO-Sprache schreibt). Dann ist es eine Lektion, sehr große Teile des prozeduralen Codes zu schreiben und die Parser / Scanner / Code-Generierung in sinnvolle und verständliche Phasen aufzuteilen.
quick_now
+ 1-Compiler enthalten so viele Muster und Prinzipien, dass Sie Design und Code in einem völlig anderen Licht sehen können, nachdem Sie dies getan haben.
Andrew T Finnell
2
"Das ist etwas, von dem ich dachte, ich würde es nie wieder benutzen." Wenn ich für jedes Mal einen Dollar hätte, hätte ich mir das gesagt, als ich jünger war ...
Nick Spreitzer
37
  1. Datenstrukturen / Algorithmen, insbesondere Graphen. Die Menge der Situationen in der realen Welt, in denen ich grafische Algorithmen einsetzen konnte, hat mich überrascht. Konzentrieren Sie sich darauf, die Merkmale zu kennen, wann eine Datenstruktur oder ein Algorithmus geeignet ist. Es ist wichtig, ein Problem zu erkennen und zu wissen, wie man einen dynamischen Programmier- / Gier-Algorithmus verwendet, und Sie können viel Zeit sparen.

  2. Kenntnisse über die Komplexität von Berechnungen. Sie müssen nicht genau wissen, was die Untergrenze der Radix-Sortierung ist, aber es ist wichtig zu wissen, wie Sie die Worst-Case-Laufzeit von etwas, das Sie schreiben, ermitteln können, insbesondere für leistungskritische Projekte.

  3. OS-Konzepte. Speicherverwaltung, Scheduler usw. Jeder Entwickler sollte wirklich ein solides Verständnis der Betriebssysteme haben, da der von Ihnen geschriebene Code ständig damit interagiert.

  4. NetSec. Ich habe nur sehr wenige Entwickler getroffen, die ein solides Verständnis für grundlegende Sicherheitsbedenken bei der Entwicklung haben (Pufferüberläufe, xss, SQLI usw.). Dies ist wirklich ein Muss, wenn Sie in der Industrie erfolgreich sein wollen. Es ist großartig, wenn Sie das nächste große Ding schreiben können, aber Sie werden nicht lange viele Benutzer haben, wenn Sie ihre Daten nicht sichern.

  5. Programmierparadigmen. Kennen Sie die Eigenschaften und Unterschiede zwischen OO / Functional / Procedural Programming. Eine der besten Grundschulklassen, die ich jemals hatte, war das Schreiben von einfachen 20 Instruktionsdolmetschern für Fortan, Schema, Prolog usw. in den Sprachen selbst. Schon die Belichtung selbst kann Ihnen dabei helfen, die grundlegenden Konzepte der Softwareentwicklung zu verstehen.

Kurtis
quelle
1
+1 Die gesamte Liste ist so ziemlich erforderlich. (4) Insbesondere in der modernen verteilten Ära ist sie sehr wichtig.
Orbling
1
+1 auf Datenstrukturen / Graphen. Die Anzahl der Programmierer, die ich kenne und die nicht wissen, wie man eine Hashtable richtig benutzt oder warum eine Linked List statt eines einfachen Arrays in manchen Fällen jeden Tag überrascht.
Machado
+1 für Programmierparadigmen. Ein gutes Verständnis der Kontraste zwischen verschiedenen Arten von Sprachen hilft sehr.
apoorv020
19

Die Erfüllung der Abschlussanforderungen ist nicht unbedingt ausreichend, um der beste Informatiker zu sein, den Sie sein können. Für einen typischen College-Lehrplan sind hier die zehn wichtigsten Dinge, die Sie unbedingt lernen sollten:

  1. Grundlagen der Volkswirtschaftslehre - Ein Einführungskurs zu Themen wie Ergänzungen und Substitutionen ist von entscheidender Bedeutung, um in der Gesamtwirtschaft zu arbeiten oder sie einfach nur zu verstehen. Das Konzept eines Giffen-Gutes wird Ihnen zwar nicht unbedingt helfen, aber das Wissen um Äußerlichkeiten wird Ihnen helfen . Es kann Ihnen auch dabei helfen zu verstehen, dass mehr Situationen eine Win-Win-Situation sind, als Sie vielleicht bemerkt haben.

  2. So schreiben Sie einen Proof - Alle Informatik-Hauptfächer sollten wissen, wie man einen Proof schreibt. Und diskrete Mathematik zählt nicht, obwohl sie Teil eines ausgewogenen Frühstücks ist. [Induktion ist nur eine Beweismethode, und Sie können damit auskommen, ohne wirklich viel über Beweise zu wissen.] Ein Kurs in Algebra oder echter Analyse ist erforderlich, um Beweise wirklich zu schreiben. Und mit Algebra meine ich Gruppentheorie oder abstrakte Algebra, nicht den Kurs, den Sie an der High School besucht haben. Nehmen Sie für den vollen Nutzen Algebra und reale Analyse im gleichen Begriff.

    Warum ist Proof Writing so wichtig? Weil es programmiert! Überlegen Sie, wann Sie das Programmieren zum ersten Mal gelernt haben: Wenn für eine Aufgabe eineifund eine Schleife, Sie könnten keine Ahnung gehabt haben, wo sie in Beziehung zueinander zu setzen. Aber jetzt würde sich dieselbe Aufgabe ganz natürlich anfühlen. Einen Beweis zu schreiben ist sehr ähnlich. Es gibt eine Reihe von Tricks, die Sie lernen, und sobald Sie sie gelernt haben, sehen die Dinge ganz anders aus.

  3. Schreiben - Schriftliche Kommunikationsfähigkeiten sind unerlässlich, egal ob Sie in der Industrie oder im akademischen Bereich arbeiten. Am besten finden Sie einen Mechanikkurs und keinen Schreibkurs, der sich effektiv mit einem anderen Thema befasst. Das heißt, viele Schulen werden versuchen, die Schreibkurse relevanter oder interessanter zu machen, indem sie dafür sorgen, dass es sich um ein spezielles Thema handelt. Versuchen Sie, die "langweilige" Version des Kurses zu wählen.

  4. Wahrscheinlichkeit und Statistik - Es gibt einige Dinge, die Sie nur durch einen Kurs richtig lernen können. Zusammen mit den Hauptanforderungen für CS (die Ihnen diskrete Mathematik, Einzelvariablen- und Mehrfachvariablenrechnung sowie lineare Algebra bieten sollten) und Algebra und / oder reelle Analyse erhalten Sie durch das Aufnehmen von Statistiken wahrscheinlich einen Nebeneffekt in Mathematik. Mithilfe von Lernstatistiken können Sie mit anderen Wissenschaftlern an ihren Projekten arbeiten.

  5. Aktuelles aktuelles Thema - In den vergangenen Jahrzehnten waren es möglicherweise Datenbanken oder objektorientierte Programmierung. Heute könnte es sich um Webprogrammierung oder serviceorientierte Architektur handeln. Was auch immer die aktuelle Modeerscheinung ist, stellen Sie sicher, dass Sie einen Kurs darin belegen. Wenn nur zu sehen, worum es in der Mode geht.

  6. Das Problem des Anhaltens - Die meisten Probleme können nicht von Maschinen gelöst werden. Dies ist eine ziemlich tiefe Idee, die unsere Kultur so gut aufgenommen hat, dass es nicht mehr schockierend klingt. Dasselbe gilt für Radio, Goedel und die Atombombe. Erst mit der postmodernen Kunst und dem Kalten Krieg konnten wir uns wieder mit diesen Konzepten auseinandersetzen. Ein Kurs in Berechenbarkeitstheorie kann Sie jedoch erneut für diesen erstaunlichen Beweis sensibilisieren.

  7. Reine funktionale Programmierung - Sie werden höchstwahrscheinlich nicht in die reine funktionale Programmierung einsteigen, es sei denn, Sie recherchieren darin oder arbeiten für einige ausgewählte Unternehmen, aber wenn Sie wissen, dass dies Ihnen hilft, ein besserer Programmierer zu sein. Der Grund dafür ist, dass Sie viele neue Formen der Abstraktion und Konzepte wie Kirchenzahlen und -fortsetzungen sowie Monaden und, ja, Rekursionen kennenlernen werden. Diese Tools können auch auf Ihr nächstes Java-Programm angewendet werden.

  8. P und NP - OK, dieser befindet sich bereits auf Ihrem kritischen Pfad, aber achten Sie trotzdem darauf. Sie möchten sichergehen, dass Sie jemanden korrigieren können, der NP fälschlicherweise als „nicht polynomiell“ bezeichnet. Als ob!

  9. Die Themen aus dem Kurs, die Sie mit Sicherheit hassen werden - Dies kann ein CS-Kurs sein, den Sie für zu niedrig, zu theoretisch oder für einen Nicht-CS-Kurs halten, den Sie als zu anstößig, zu schwierig oder zu langweilig empfinden . Wenn ein Kurs wie dieser ein Problem für Sie darstellt und Sie anderen erklären, warum Sie so froh sind, dass Sie nicht so und so teilnehmen müssen, sollten Sie feststellen, dass Sie viel lernen werden durch den Kurs! Vielleicht lernst du die Materialien des Kurses nicht, aber du lernst deine eigenen Grenzen und vielleicht mehr über die Rechtfertigungen, die du dir selbst machst. [Hinweis: Sie sind normalerweise schwach.]

  10. Der Nicht-CS-Kurs, den Sie sicher lieben werden - Am Ende sollten Sie Spaß haben. Dies ist der Kurs, aus dem Sie wahrscheinlich am wenigsten herausholen werden, aber nehmen Sie ihn trotzdem. Mach es einmal. Wenn Sie zufällig viele Kurse lieben, ist das gut für Sie, aber stellen Sie sicher, dass dies nicht die restlichen Kurse auf dieser Liste beeinträchtigt.

Mein Ansatz hier war praktisch, basierend auf Kursen, die Sie tatsächlich belegen können. Und ich habe mich auf Lernziele konzentriert, die wahrscheinlich gelernt werden. Anmerkung: Diese Antwort stammt aus einem Blog-Beitrag über zehn Dinge, die jeder Major der Informatik lernen sollte .

Macneil
quelle
Eine Erklärung für die Ablehnung wäre hilfreich. Vielleicht kann ich meine Antwort ändern, und dann können Sie Ihre Meinung ändern.
Macneil
Professor, ich würde Ihre Antwort nicht herabstimmen, aber es gibt eine Sache, die ich in Frage stellen werde. Beweisschreiben: Bis heute kann ich keinen diskreten Beweis schreiben, es sei denn, Sie haben mich gebeten, eine ungerade oder gerade Zahl zu prüfen. Ich verstehe den Zusammenhang zwischen diesem und der Branche nicht. Vielleicht fehlt mir der "Problemlösungsaspekt?". Ich könnte nie mein Gehirn um mathematische Induktion oder das Pumping Lemma wickeln. Ich glaube nicht, dass es mich bremst.
Bryan Harrington
Einen Beweis zu schreiben ist wie ein Programm zu schreiben. Zu lernen, wie man beweist, dass zum Beispiel eine * 0 = 0 ist, ist ein bisschen wie der FizzBuzz der Mathematik (naja, vielleicht ist es etwas schwieriger). Es scheint zunächst einschüchternd, aber bald lernen Sie die kleinen Tricks, genau wie beim Programmieren. Beweise können unterschiedliche Strukturen haben, die Ihnen helfen können, rekursiv und strukturell zu denken. Wie gesagt, ein diskreter Mathematikkurs ist nicht geeignet, um echte Beweise zu erlernen. Sie brauchen dazu Gruppentheorie oder echte Analyse.
Macneil
Während die Kenntnis von Komplimenten sicherlich nützlich ist, halte ich die Kenntnis von Komplimenten für wirtschaftswissenschaftlicher.
4.
1
@ijw: In Bezug auf Wirtschaft für CS-Studenten hat Joel eine gute Diskussion, die es wert ist, gelesen zu werden: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

Nach einem Gespräch mit ein paar Unternehmensvertretern und Freunden, die viele Interviews hatten:

  • Datenbanken
  • OOP
  • Algorithmen
  • Datenstrukturen

Neigen dazu, ein "Muss" für Neueinstellungen zu sein (oder, wie gesagt, "sehr empfehlenswerte" Kurse).

Andere Kurse, die nützlich sein können, sind Computersicherheit, Zusammenbau und Maschinenarchitektur. Viele meiner Professoren haben mir auch einen Compilerkurs empfohlen. Wenn Sie Zeit haben, würde ich Ihnen auch sehr empfehlen, Mathematikkurse wie Graphentheorie, Diskrete Mathematik und Kombinatorik zu besuchen. In den Klassen, die in den meisten CS-Kursen übergangen werden, lernt man eine Menge Denkfähigkeiten, die jedoch beim Schreiben sehr komplexer Programme von großem Nutzen sind.

Hoffentlich hilft das!

K-RAN
quelle
1
Würde mit OOP und Datenstrukturen übereinstimmen.
apoorv020
4
Grundlegende Datenstrukturen ... sooooooooooo wichtig. Wichtiger, denke ich, als OOP. Sie müssen überlegen können, wie Sie Informationen speichern und organisieren. Und wenn auf eingebetteten Systemen das In-Memory-Layout Ihrer Datenstrukturen lebenswichtig ist.
quick_now
3
+1 für die Matheklassen. Sie helfen Ihnen auch dabei, den Überblick über große Probleme / Systeme zu behalten.
Michael K
1
Networking ist auch eine gute Sache.
Keyo
OOP? Sie können in Haskell oder C ohne OOP programmieren ... ich gebe Ihnen, es ist weit verbreitet, aber ich denke nicht, dass es ein grundlegendes ist. Die Auseinandersetzung mit verschiedenen Paradigmen scheint dagegen recht nützlich zu sein.
Matthieu M.
6

Es hängt weitgehend davon ab, was Sie mit dem Abschluss vorhaben. Es sieht so aus, als ob die meisten CS-Majors Software-Ingenieure sind. Vor diesem Hintergrund bin ich mir nicht sicher, warum mehr Leute nicht nur im Bereich Software-Engineering tätig sind. Ich vermute, dass es nicht genug Software-Engineering-Programme gibt, insbesondere an öffentlichen Institutionen.

Ich komme aus einem eingebetteten Hintergrund. Jede einzelne Person, mit der ich zusammenarbeite, hatte entweder einen EE-Abschluss oder einen CE-Abschluss, und das liegt zum Teil daran, dass als die "Alten" am College nicht so viele CE-Programme zur Verfügung standen. Es ist also ziemlich offensichtlich, dass ein Hardware-Hintergrund wünschenswert ist, wenn Sie im eingebetteten Bereich arbeiten möchten.

Unabhängig davon, in welchem ​​Bereich Sie arbeiten möchten, glaube ich, dass jeder Programmierer einen Kurs in Assembler-Programmierung belegen sollte. Sie werden es vielleicht nie benutzen, aber es zeigt genau, was auf Prozessorebene während eines Funktionsaufrufs passiert, wie Interrupts behandelt werden, wie der Speicher strukturiert ist oder wie die verschiedenen Adressierungsmodi verwendet werden. Ich glaube, all diese Dinge werden Sie zu einem besseren Programmierer machen.

Auch wenn dies möglicherweise nicht ersichtlich ist, sind dies einige wichtige Themen, wenn Datenstrukturen und Algorithmen für eine bestimmte Plattform betrachtet werden.

Pemdas
quelle
+1, weil Sie mit einem Informatik-Abschluss Erfahrung mit einer Vielzahl von Fächern / Technologien haben. Achten Sie auf den Kurs zum Software-Design.
Herr Ant
+1 Verstehen Sie beim Zusammenbau immer genau, was am unteren Rand des Stapels passiert. Wäre schön, wenn jeder auch Hardware kennt, aber für viele wäre es ein Schritt zu weit.
Orbling
5

Es gibt zwei Möglichkeiten, Ihre Frage zu beantworten. Lass mich beides versuchen. Der erste Weg besteht darin, die Dinge unter dem Gesichtspunkt eines potenziellen Arbeitsmarktes, Codierfähigkeiten usw. zu betrachten. Also hier ist meine Liste:

  1. Datenstruktur
  2. Algorithmus-Analyse
  3. Objekt orientierte Programmierung
  4. Entweder ein bestimmter Kurs in C ++ oder Java
  5. Betriebssysteme
  6. UI-Design
  7. Parallele Programmierung

Der zweite Weg ist, die Dinge aus einer etwas abstrakten Perspektive zu betrachten, und wer weiß, kann auch ein bisschen philosophisch sein. Die folgende Liste hat möglicherweise nicht die besten Fähigkeiten, die der Arbeitsmarkt verlangt, aber ich bin mir ziemlich sicher, dass Sie, wenn Sie diese Kurse beenden, die Kunst der Softwareentwicklung besser verstehen werden.

  1. Finite Sprache und Automatentheorie
  2. Compiler-Aufbau
  3. Graphentheorie
  4. Künstliche Intelligenz
Fanatic23
quelle
Führen Sie nicht nur eine Reihe von Kursen auf, die Ihrer Meinung nach von wesentlicher Bedeutung sind, sondern geben Sie Gründe und Erfahrungen an, die Sie für Ihre Liste gemacht haben.
2

Ich würde auch Software Engineering oder Design Practices zur Liste hinzufügen, obwohl deren Inhalt normalerweise von Studenten der Branche aufgegriffen wird.

Meiner Meinung nach (allerdings nicht durch viel Erfahrung gestützt) möchten Unternehmen nicht wirklich, dass die meisten theoretischen Dinge in Kursen wie Datenbanken usw. vermittelt werden. Sie möchten, dass die Leute diese Dinge verstehen und anwenden können .

EDIT: Aufgrund der Ablehnung möchte ich meine Antwort erklären. Ich bin ein Informatikstudent im letzten Jahr und meine Erfahrung basiert auf meinen Praktika und Vorstellungsgesprächen mit führenden Unternehmen auf diesem Gebiet. Nach meiner Erfahrung müssen Personen selten komplizierte Algorithmen verwenden oder sehr komplizierte Datenstrukturen in Interviews oder Jobs codieren.

Nützlicher, wenn Sie Datenbanken erstellen und verwenden, die Quellcodeverwaltung verwenden, das Debuggen und das Verwenden von Entwurfsmustern usw. können. Wie ich bereits sagte, werden diese Fähigkeiten in der Regel in der Branche erlernt und nicht in Kursen behandelt. Software Engineering / Design Practices beinhalten in der Regel die Erstellung eines mittelgroßen Projekts, das zum Erlernen aller dieser Fähigkeiten sehr nützlich ist.

apoorv020
quelle
Bitte machen Sie nähere Angaben zu Ihren Erfahrungen und warum jemand an diesen Kursen teilnehmen sollte.
@Mark: Kannst du die Gründe für die Ablehnung erklären?
apoorv020
@ apoorv020 Ohne zu erklären, warum Sie Software Engineering oder Design Practices empfehlen, ist Ihre Antwort nicht hilfreich. Ihre Bearbeitung erklärt immer noch nicht, warum Sie sie empfehlen.
@ apoorv020 Der einzige Vorteil für Software-Engineering- oder Design-Praktiken besteht darin, dass Sie normalerweise ein mittelgroßes Projekt (was auch immer das bedeutet) erstellen. Was haben Sie persönlich aus diesen Kursen gelernt?
Sie sind gut zu wissen, aber das sind keine CS-Fächer.
Thomas Owens
2

Dinge, die ich im College gelernt habe und die ich jeden Tag benutze:

  • Objektorientierte Entwurfsmethodik
  • Designmuster
  • Reguläre Ausdrücke
  • Grundlegende Algorithmen und Analysen
  • Datenstrukturen

Ich wünschte, ich hätte einen Datenbankkurs gemacht. (Ich habe seit meinem Abschluss genug gelernt, um damit klarzukommen, aber ich wünschte, ich wüsste mehr.) Ich wünschte auch, die Versionskontrolle würde unterrichtet - sie ist allgegenwärtig, äußerst nützlich und wurde im Lehrplan meiner Schule völlig ignoriert.

Ich musste mehrere Mathekurse belegen. Ich habe keinen Kalkül mehr benutzt, seit ich meinen Abschluss gemacht habe. Ich wünschte, ich hätte einen Statistikkurs gemacht. (Wieder habe ich seit meinem Abschluss genug zu tun, aber ich wünschte, ich wüsste mehr.)

Nehmen Sie über die CS-Abteilung hinaus an einem Schreibkurs teil. Gute schriftliche Kommunikationsfähigkeiten sind für den Erfolg unerlässlich.

pwc
quelle
+1 Überrascht, dass Datenbanken in Ihrem Kurs nicht obligatorisch waren, was normalerweise als wesentlicher Bestandteil angesehen wird.
Orbling
Es war. Ich bin aus technischen Gründen herausgekommen und habe es bereut.
pwc
@Orbling: Oft haben kleine Abteilungen (im Gegensatz zu großen staatlichen Schulen) einfach nicht genug Dozenten, um alle wichtigen Themen zu bearbeiten. An meiner Schule zum Beispiel waren Datenbanken ein Wahlfach.
Macneil
@Macneil: In meinem Kurs war der Kurs über Primärdatenbanken eine Voraussetzung (mit allen Grundlagen: ER-Modellierung, normale Formulare, SQL (nicht nur grundlegendes SQL, zusammengesetzt / verschachtelt usw.), Indexplatzierung usw.), letzteres komplexer Datenbankkurse waren Wahlfächer (ich glaube, es waren insgesamt drei). Ich habe mich nie für sie entschieden, da ich dachte, dass es Dinge sind, die ich unabhängiger leichter aufnehmen kann als andere Kurse, die ich verpassen würde. Denke ich nehme stattdessen fortgeschrittenen OP.
Orbling
@pwc: Ich wette, erinnerst du dich, warum du rausgekommen bist und nicht wie?
Orbling
2

Es gibt viele wichtige Kurse, je nachdem, in welche Richtung Sie gehen möchten. Vorausgesetzt, Sie können überhaupt programmieren, muss der wichtigste Kurs jedoch sein:

  • Datenstrukturen und Algorithmen

    Praktisch alles in der Datenverarbeitung funktioniert wieder mit Algorithmen. Achten Sie besonders auf Arrays und Hashtables, da sie bei weitem die nützlichsten Datenstrukturen sind, die häufig verwendet werden, aber Listen und Bäume und Diagramme (nun, Listen sind eingeschränkte Baumtypen und Bäume sind eingeschränkte Diagrammtypen) wichtig sein. Darüber hinaus ist das Verstehen von Algorithmen von entscheidender Bedeutung, um Code zu erstellen, der nicht schrecklich ist. (Andernfalls werden Sie Dinge tun, die einfach schrecklich sind, wie die Verwendung eines O ( n 3 ) -Algorithmus, für den ein O ( n log n ) -Algorithmus verwendet wird.) Wenn Ihr CS-Abschluss keinen obligatorischen DS + A-Kurs enthält, Es ist nicht CS. Oder Softwareentwicklung. Oder einfach nur programmieren.

Abgesehen davon war der Kurs, den ich im Laufe der Jahre in verschiedenen Bereichen am nützlichsten fand,:

  • Parallelität

    Parallelität hat viele Aspekte, aber ich würde ein Verständnis für den Unterschied zwischen Shared Memory und Message-Passing erwarten. Ich möchte auch, dass Sperrstrategien (Mutexe, Semaphoren usw.) und Transaktionen umfassend abgedeckt werden.

    Dies ist natürlich von entscheidender Bedeutung für das Verständnis der Parallelisierung, aber es ist auch wichtig für alles, was verteilt wird (z. B. das Schreiben eines Dienstes, der dem Internet ausgesetzt ist, auch wenn er Single-Threaded ist, da die Clients sowieso asynchron sind). Ich verstehe, dass es auch nützlich ist, um Spiele zu schreiben (die normalerweise Multithread-fähig sind) und mit eingebetteten Geräten zu arbeiten.

Abgesehen davon halte ich es für das beste Interesse der meisten Studenten, möglichst vielen unterschiedlichen Ideen ausgesetzt zu sein. Viele Programmiersprachen und Paradigmen. Viele verschiedene Einsatzgebiete. Ein angemessenes Maß an Mathematik (wieder, weil es so oft nützlich ist) und auch ein gewisses Maß an Kontakt mit menschlichen Faktoren und Psychologie (weil jede Software, die mit Benutzern interagiert, mit Menschen zu tun hat). Schließlich wissen Sie nie genau, was Sie in Zukunft tun werden. Die Planung von Flexibilität ist daher eine großartige Lebensstrategie.

Donal Fellows
quelle
1

Als ich am College war, gab es eine ganze Reihe von Themen, für die ich in meinem wirklichen Leben keine Verwendung finden konnte, und manchmal hat sich die Intuition als richtig erwiesen (formale Methoden sind in den meisten Fällen nur für triviale Probleme geeignet) war völlig falsch (die Big-O-Notation ist sehr nützlich), also war mein jüngeres Ich im Großen und Ganzen teilweise richtig.

Wenn Sie sich auf die reale Welt vorbereiten möchten, empfehle ich zusätzlich zu den Empfehlungen von @ K-Ran, Code Complete zu lesen und dies als Grundlage für eine eingehendere Untersuchung von Themen zu verwenden, die Sie als schwierig empfinden oder die Sie nicht haben ausreichend abgedeckt.

Glenatron
quelle
Ich habe manchmal formale Methoden als nützlich empfunden, obwohl dies offensichtlich nur für kleine Komponenten gilt. Ich dachte an Dijkstra et al. als etwas zu sagen wie "Wenn Sie ein perfekter Mathematiker sind, können Sie ein guter Programmierer sein."
David Thornley
Ich vermute, wenn Sie an Code arbeiten, dessen Leben davon abhängt, dass Sie im Grunde genommen ein solides Verständnis für dieses Zeug haben müssen. Aber für die Arbeit, die ich geleistet habe, war es nie notwendig. Wenn ich es jetzt brauchen würde, müsste ich zurückgehen und es von Grund auf neu
lernen
Dinge wie Z werden wirklich nur für unternehmenskritische Software in Organisationen verwendet, in denen, wie Sie sagen, Leben in Gefahr sind. Ich denke jedoch, dass das Erlernen dieser Funktionen ein weitaus besseres Bewusstsein für die Code-Korrektheit vermittelt und eine umfassende Grundlage für die Spezifikation aller Arten bietet. Manchmal lernt man nicht um seiner selbst willen, sondern um sicherzugehen, was oben steht.
Orbling
Betrachten Sie es als größere Bausteine, die solide sind. Wenn Sie bewiesen haben, dass Ihre Komponenten korrekt sind (und getestet haben, um die dummen Fehler zu finden, die Sie bei Design und Proof gemacht haben), müssen Sie sich beim Schreiben und Debuggen weniger Gedanken machen.
David Thornley
1

Ich denke, Sie sollten Folgendes studieren:

Betriebssystem: - Auch wenn Sie es möglicherweise nicht benötigen, um als Programmierer zu arbeiten, sollten Sie wissen, wie ein Betriebssystem funktioniert und wie es von einem CS-Absolventen erwartet wird. Jedes gute Buch kann helfen.

OOP: - Das ist Brot und Butter. Ein Muss. Bücher, wenn Sie fragen möchten: Ihr erstes Buch sollte sein: - Kopf voran OOAD, dann können Sie sich für Grady Booch und Ivar Jacobsons Buch entscheiden

Datenstrukturen und Algorithmen: - Sehr wichtig für die Entwicklung des logischen Denkens und Denkens.

Für mich ist das genug. Es ist niemals zu spät. :)

Abhi
quelle
1

Als jemand, der regelmäßig Bewerber für Programmierjobs interviewt und sich nach mehr als 12 Jahren in der Branche einigermaßen erfolgreich fühlt, würde ich Folgendes vorschlagen

  • Datenbankdesign und SQL: Es ist erstaunlich, wie viele Programmierer einfaches SQL nicht kennen und welche mit guten SQL-Kenntnissen von unschätzbarem Wert sind. In einem Unternehmen mit einer festgelegten Datenbankstruktur ist es möglicherweise nicht sinnvoll, eine gute Datenbank zu entwerfen. Für Start-ups und Unternehmen, die sich im Wandel befinden, ist dies ein MUSS!
  • Designmuster. Sie helfen Ihnen einfach, bessere Entscheidungen über gutes Design zu treffen
  • OOP: Dies ist normalerweise eine Vorbedingung für die meisten Kurse, aber es wird helfen.
  • Algorithmen: Weil so wenige Leute wissen, was Rekursion ist, geschweige denn verstehen, wann es ihnen eine Menge komplexer Codierungen ersparen könnte
  • Datenstrukturen: Die meisten modernen Sprachen erledigen diese Aufgaben für Sie, aber das Verständnis ist der Schlüssel zu gutem Design.

Dann lesen Sie einige außerschulische Arbeiten:

  • Zertifizierungsart Bücher. Sie bringen Ihnen häufig die Art der Syntax und der Operatoren bei, die sich unter dem Deckmantel befinden. Es ist weitaus wichtiger zu WISSEN, warum Sie etwas tun, als "weil es funktioniert", was so alltäglich ist.
Codemwnci
quelle
1

ES IST ABHÄNGIG , es gibt keine gute Antwort auf diese Frage.

Programmierer ist eine allgemeine Welt, um jemanden zu identifizieren, der Computersoftware schreibt.

Jetzt gibt es Software aller Art. Wenn wir zum Beispiel Wikipedia als Quelle für Verallgemeinerungen verwenden, können wir drei großartige Verallgemeinerungen treffen :

  • Systemprogrammierung
  • Programmiersoftware
  • Anwendungssoftware

Im ersten Feld Systemprogrammierung entwickeln Sie Gerätetreiber, Betriebssysteme, Server, damit Sie beispielsweise einem Betriebssystemkurs folgen können.

aber was ist mit Programmiersoftware ? Wie Wikipedia schrieb, können Sie hier Compiler, Debugger, Interpreter, Linker und Texteditoren codieren. Daher kann ein Kurs in Automatisierungstheorie, Sprachtheorie, Sprache und Compilern hilfreich sein.

Können wir nicht über Anwendungssoftware jeglicher Art sprechen:
- Videospiele: Algebra, Physik, objektorientierte Kurse?
- Mathematik-Software: Mathematikkurse?
- Bildbearbeitung: Mathematik, Physik, Algorithmuskurse?
- Industrielle Automatisierung: Mathematik, Physik, Algorithmus, Robotikkurse?
- Medizinische Software: Biologie, Medizin, was sonst noch?
- viele Sachen hier: viele Kurse hier.

Wie Sie sehen, gibt es natürlich eine Menge, denen Sie folgen können und die für Ihre Arbeit nützlich sein werden.

Nach meiner Erfahrung bin ich ein System-Software-Entwickler und Anwendungs-Software-Entwickler im Bereich Sicherheit (Sie möchten einen Sicherheitskurs absolvieren?). Ausgehend von ein wenig Erfahrung in der Programmierung werde ich immer interessanter für Algorithmen und verteilte Systeme und wieder fühle ich mich unangenehm in der Einfachheit der Allzweckanwendung, die ich geschrieben habe (Schnüffler, Netzwerk-Intrusion-Detection-System, Protokoll-Dissektor und -Detektor usw.).

Wie Sie in der theoretischen Informatik sauer gelernt haben! Hast du diese Kurse geflogen? : P

Sie haben zum Beispiel gelernt, dass alle Computersprachen in eine Reihe berechenbarer mathematischer Funktionen eingepasst werden können, und wenn Ihre Erfahrung beispielsweise denselben Weg einschlägt, werden Sie sich in diesem kleinen Kalkülsatz bald unwohl fühlen und wie ich können Sie anfangen zu sehen, wie sich das entwickelt Software ist nicht so ansprechend und verblüffend, weil das gleiche DESIGN-MUSTER immer wieder auftaucht (haben Sie Design-Muster-Kurse besucht?) und Sie zum Beispiel mehr Interesse dafür bekommen, warum und wie eine Sprache in mathematische Funktionen übersetzt werden kann und beginnt lerne, dass die Computersprache nicht so komplex ist! Sie können zum Beispiel bald mehr über die Person und die Psychologie überrascht sein, und Sie können mehr Interesse dafür bekommen und ein guter Projektmanager werden! Haben Sie die Kurse über den Software-Lebenszyklus verfolgt?

Also, was ist der MUST-HAVE-Kurs in Ihrer CS-Karriere?

Ich schlage vor, so viel wie möglich in allen Bereichen zu lernen, insbesondere im theoretischen Bereich, da Sie sich im allgemeinen Arbeitsbereich schnell über die geringe Komplexität um Sie herum langweilen und zu einem Vollzeitbeschäftigten werden, für den Sie weniger Zeit zum Lernen haben wie die Dinge wirklich funktionieren und viel mehr Zeit, um zu sehen, wie Leute mit starkem theoretischem Wissen die Dinge für die Arbeit projiziert haben, und um Ihnen die Möglichkeit zu geben, Code zu erstellen, um Essen zu Hause zu bekommen.

In der Informatik gibt es einen falschen Realitätssinn. Informatiker zum Beispiel sind manchmal wirklich weit weg von Softwareentwicklern.

Schauen Sie sich die Wikipedia-Erklärung an.

viel spaß mit dem leben :)

meine 2 Cent.

Entschuldigung für mein wirklich schlechtes Englisch.

boos
quelle
1

Zweifellos ist Englisch das Wichtigste, in dem CS-Studenten fließend sprechen sollten.

Ohne ein Verständnis von gesprochenem und geschriebenem Englisch sind Sie für immer im Nachteil.

Schauen Sie sich die Vielzahl der Fragen an, die auf den Stack-Sites eingehen. Viel zu viele von ihnen sind schwer zu entziffern. Einige Leute verwenden eine Mischung aus Texting (nicht sicher, ob der richtige Begriff verwendet wird). Andere geben eine Erklärung ab und hängen einfach ein Fragezeichen an, während wichtige Gedanken wie Verben oder Adjektive fehlen.

Wenn Sie nicht kommunizieren können, werden Sie sich nicht verständlich machen können, geschweige denn verstehen, was andere sagen.

Alles andere sind nur Details. Wenn Sie kommunizieren können, mindestens durchschnittlich intelligent sind und verstehen, was Sie lesen, können auch Sie eine erfolgreiche Karriereplanung haben.

Nicht ich
quelle
1

Ich komme aus einer etwas anderen Perspektive, da ich keinen Abschluss in CS hatte, sondern einen Abschluss in Elektrotechnik (mit einem Nebenfach in Business).

Darauf aufbauend denke ich dir eine Liste von Dingen verstehen müssen , relativ kurz ist, da ich (und viele andere CS-Absolventen) glücklich überleben, ohne etwas über Compiler-Design oder ähnliches zu wissen.

Was ich sagen würde, habe ich aufgegriffen und finde es nützlich:

  • RDBMS-Design - RDBMS-Systeme stehen hinter den meisten Systemen und Standorten, und Sie sollten zumindest die Grundlagen dessen verstehen, was vor sich geht (das habe ich bei der Arbeit gelernt).
  • Grundlegendes UI-Design - die besten Programmierer, mit denen ich gearbeitet habe, konnten eine brauchbare Anwendung erstellen, die nicht so hässlich war. Außer einem, aber er ist die Ausnahme, die die Regel bestätigt.
  • Einige grundlegende Programmierung - und ich meine grundlegend. Ich lernte etwas C (für Bildverarbeitung und eingebettete Systeme), etwas Assemblersprache (die ich innerhalb weniger Wochen nach Abschluss des Kurses vergessen hatte) und etwas Pascal (ein grundlegender Computerkurs war Standard für alle Ingenieure). Beim Vorstellungsgespräch bin ich fassungslos, wie wenige CS-Absolventen wirklich so programmieren können, wie es kommerzielle Organisationen für sinnvoll halten. Ich erwarte daher nicht viel, aber ich erwarte, dass sie die Grundlagen kennen.
  • Logik - Ich habe es durch digitale Elektronik gelernt, Mathematiker durch Theorie, CS durch Programmierung, aber wie auch immer Sie es lernen, Sie sollten ein gutes Verständnis dafür haben, da so viel darauf ankommt.
  • Kommunikationsfähigkeiten - Ich habe an der Universität einige Kurse absolviert, die über meinen tatsächlichen Abschluss, meine Präsentationsfähigkeiten und mein Durchsetzungsvermögen hinausgehen. Viel gesunder Menschenverstand, aber es tut nie weh, ein paar Mal vernünftige Dinge zu erzählen.
  • Die Grundlagen von Business und Rechnungswesen. Einige Programmierer tun so, als wäre es egal, aber meiner Meinung nach ist es für jeden wichtig, der in einem Unternehmen arbeitet - so funktioniert das Spiel und es wird Ihr Leben kontrollieren. Warum sollten Sie also nicht zumindest die Grundlagen von wissen wollen? wie und warum passieren die dinge

Und wenn Sie die Möglichkeit haben, etwas über Projektmanagement zu lernen, dann würde das nicht wirklich schaden, aber das wird an der Universität in vielen Fällen ziemlich schlecht gelehrt, und Sie werden ein bisschen mehr über diesen Job lernen, wenn Sie nur an Projekten arbeiten.

Jon Hopkins
quelle
0

Ich würde der Liste auch einige grundlegende Kurse in Human Resources / Psychologie hinzufügen.

Dies mag seltsam erscheinen, aber ein Teil der beruflichen Arbeit besteht darin, zu lernen, wie man sich selbst verkauft und verhandelt. Das erste richtige Interview zu führen, ohne die Motivation der HR-Drohne genau zu kennen, ist ein Rezept für eine Katastrophe und endet wahrscheinlich damit, dass der Student in ein niedriges Gehalt verwickelt wird.

Kennen Sie Ihren Feind, damit Sie sich schützen können.

Peter Bernier
quelle
-1

1. Jahr:

  1. Grundlegende OOP in einer höheren Sprache
  2. Datenstrukturen

2. Jahr:

  1. Compiler, Sie erstellen einen einfachen Formular-Scratch
  2. Parallelität

3. Jahr:

  1. Algorithmus
  2. Betriebssystem, fügen Sie Funktionen und Verbesserungen zu einem einfachen hinzu
  3. Formelle Sprache

4. Jahr:

  1. Vernetzung
  2. Verteiltes System
  3. Benutzeroberfläche
  4. Erweiterter Compiler
  5. Erweitertes Betriebssystem
  6. Künstliche Intelligenz
  7. Computergrafik

Diese Kurse sollten reichlich Theorie und Codierungspraxis bieten.

Thierry Lam
quelle
-2

Es ist seltsam, dass niemand die Computerarchitektur erwähnt hat.

Sorantis
quelle
Ich denke, Computerarchitektur ist wichtig zu wissen, wenn Sie die Auswirkungen von Speicher-Caches, Seitenfehlern usw. verstehen möchten
apoorv020