Hvad du lærer i en 4-årig datalogi-grad

Jeg skrev for nylig en artikel om, hvorvidt du har brug for en datalogisk grad for at få et job inden for teknologi. Jeg troede, at det ville være nyttigt at gennemgå min udskrift. At diskutere, hvad jeg studerede, vil forhåbentlig hjælpe folk. Jeg ønsker, at alle skal være i stand til at tage den mest velinformerede beslutning, når de vælger deres vej til at forfølge en teknisk karriere.

Ansvarsfraskrivelse : Dette er skrevet fra min erindring om klasserne og set fra en mobiludviklers perspektiv. Mange af emnerne i disse klasser kunne specialiseres i og forvandles til en karriere. Så de er alle vigtige for nogen i verden. Jeg skriver ud fra mit perspektiv og set fra en person, der valgte karrierevejen for en mobiludvikler.

Programmering I, II

Dette var kødet af alt det, jeg lærte, og fik mig i gang med programmering. Dette var de klasser, hvor du lærte at programmere. Før jeg tog disse klasser, havde jeg næsten ikke engang programmeret overhovedet. Jeg havde prøvet at få et forspring, men kom ikke meget længere end sløjfer.

Denne klasse startede med at oprette en tom fil og få den til at kompilere i en IDE (jeg brugte kode :: blokke). Og vi arbejdede os helt op til at skabe vores eget tekstbaserede kampspil. Når jeg ser tilbage på koden, skrev jeg mig flov. Jeg er kommet langt siden da. Her er repoen, hvis du gerne vil grine (jeg bruger kun en main.cpp-fil med 1063 linjer kode).

Så hvad lærte jeg her? Jeg vil sige alt. Disse kurser var sindssygt værdifulde og fik mig mindst 70% af den viden, jeg havde brug for til at arbejde professionelt som programmør. Jeg lærte om udsagn, sløjfer, boolsk logik, klasseskabelse, oprettelse af struktur, oprettelse af grænseflader, polymorfisme, arv og mere. Der var også en vis brug af grundlæggende datastrukturer som arrays og vektorer.

Diskrete strukturer inden for datalogi

Denne klasse blev føjet til udskriften for at vænne folk til boolsk logik. Som vi havde nede i de første to uger af klassen. Desværre for os, intetanende studerende, går det temmelig langt ned i kaninhullet. Her er nogle af de emner, det dækkede: "logik, sæt og sæt operationer, bevismetoder, rekursive definitioner, kombinatorik og grafteori".

Nu er dette alle nyttige ting at vide. Men spørgsmålet er, at studerende blev opfordret til at tage denne klasse tidligt. Normalt sammen med Progamming I og II. Og dette er nogle avancerede emner. Jeg ville kæmpe nu for at bruge matematiske bevismetoder. Og jeg husker, at jeg virkelig kæmpede dengang. Jeg var bare nødt til at google, hvad kombinatorik er, så jeg bruger dem naturligvis ikke for meget.

Faktum er, at mange af de ting, de underviste i dette kursus, ikke syntes anvendelige i en datalogisk karriere, da jeg tog kurset. Jeg ved nu, at logik, sæt og sæt operationer, rekursive definitioner og grafteori kan være nyttige. Men det er kun bagud med at være programmør i et par år.

Hvad jeg anvender dagligt i min nuværende karriere er logik og måske sætte operationer. Rekursive definitioner og grafteori har egentlig kun været nyttige til interviews. Men tag dette med et saltkorn, fordi jeg er en mobiludvikler. En back-end-dev vil sandsynligvis finde grafteori meget nyttig.

Datastrukturer

Denne klasse var god. Meget godt. Datastrukturer bruges overalt på computerprogrammering og er rygraden i det meste af den kode, som folk skriver. De giver os mulighed for at gemme data på en måde, der er nyttig for de programmer, vi skriver. Evnen til at se på data og kende den bedste måde at gemme dem på i tid og rum ydeevne er en meget nyttig færdighed at have.

Jeg lærte om arrays, stakke, sammenkædede lister, dobbeltkoblede lister, træer, grafer, dynger og alle de forskellige varianter af disse datastrukturer (som selvbalancerende træer). Denne klasse hjalp mig ikke kun med at forstå datastrukturer, men hjalp mig også til bedre at organisere de data, som jeg lagrede.

Denne klasse blev udført i C, hvilket gjorde det endnu mere interessant. C kan være meget flittig, men også meget kraftig, hvis den bruges korrekt. Jeg var nødt til at være meget forsigtig med, hvordan jeg tildelte og ryddede hukommelse, hvilket også var meget godt for undervisning i hukommelsesstyring.

Der var så mange nyttige ting i denne klasse, at det er svært at dække dem alle. Jeg har ikke engang nævnt det faktum, at dette er en vigtig videnkomponent til interviews i tech. Hvis du er urolig over datastrukturer, skal du begynde at børste nogle grundlæggende op, fordi de er meget vigtige.

Analyse af algoritmer

Denne klasse var noget nyttig. Algoritmer er nyttige. De driver den bedste software i verden og gør dem stærke nok til at forblive relevante i den moderne verden. Men denne klasse havde nogle problemer.

Den mest nyttige del af dette var at lære Big O-notation. Big O-notation giver dig mulighed for at evaluere kode og forstå, hvor godt det ville fungere tidsmæssigt og rummæssigt. Generelt, hvis du måler kodeydelse hos et firma, bruger du en timer til at spore tid mellem interaktioner. Dette giver dig mulighed for at se, hvor godt din software klarer sig. Dette kræver, at du skriver kode og evaluerer resultaterne bagefter.

Big O-notation giver dig mulighed for at foretage evalueringer af kodeydelse ved bare at se på koden. Jeg vil ikke komme ind i dette for meget, men hvis du ikke kender til Big O-notationen, skal du læse dette blogindlæg.

De faktiske algoritmer, vi gik igennem, var ikke så nyttige. Det eneste, jeg husker, er rygsækproblemet og problemet med den rejsende sælger. Jeg var også nødt til at skrive kode til disse i grupper, hvilket ikke var fantastisk, fordi der var en person i min gruppe, der gik ud over, hvad han blev scoped for. Det betød, at jeg endte med at skrive mindre kode mod den endelige implementering hver gang, end jeg gerne ville.

En grundlæggende forståelse af, hvilke berømte algoritmer der findes, deres formål og hvordan de implementeres, kan være nyttige (hovedsagelig til interview). Big O notation er nøglen her. Det er meget nyttigt på jobbet, og det er også utroligt nyttigt til interviews.

Web-udvikling

Denne klasse havde de fleste færdigheder, der var direkte anvendelige til et job inden for teknologi. Jeg lærte om HTML, CSS, JQuery, JavaScript, PHP og JSON. Jeg lærte, hvordan en anmodning sendes fra en websides frontend til en back-end, hvordan den behandles på back-enden og derefter sendes tilbage til front-enden med et svar. Jeg lærte, hvordan man opretter brugergrænseflade, og hvordan man interagerer med et datalag, der derefter interagerer med netværket.

I slutningen af ​​klassen havde jeg bygget mit eget websted og tog initiativ til at lære Angular. Jeg brugte Angular til at få mit websted til at se prangende ud, hvilket til sidst fik mig min første praktikophold. Jeg fik også en god forståelse af, hvordan et websted fungerer under emhætten.

Denne viden alene var stor, men jeg lærte også at hente og lære et ukendt sprog, ramme eller dataformat og arbejde med det på farten. Jeg googlede meget om disse emner for at se konkrete eksempler. Jeg lærte at bruge dokumentation og onlineundersøgelse for bedre at forstå et koncept, som jeg havde brug for at anvende direkte på kort tid. Dette er en nøglefærdighed i at være en dygtig programmør.

Introduktion til databaser

Jeg lærte for det meste bare SQL i denne klasse. Jeg er sikker på, at vi gik over nogle andre begreber som sharding og clustering, men jeg kan ikke huske dem. Jeg bruger nogle gange SQL i mit nuværende job til at køre dataforespørgsler til begivenheder, jeg har logget på. SQL vil enten være integreret i dit job, eller du vil næppe bruge det. Hvis du har brug for det, skal du lære det og blive ekspert. Hvis du ikke gør det, skal du ikke bekymre dig for meget om det.

Software Engineering I, II

Også en anden klasse, som jeg ikke rigtig kan huske. Jeg tror, ​​vi gik gennem en række brede begreber i denne klasse. Vi dækkede Scrum og Waterfall projektstyringsmetoder. Vi gik over test og alle de forskellige typer test der er. Vi dækkede nogle begreber om brugbarhed og tilgængelighed. Det var virkelig bare en indfangning af koncepter, der ikke rigtig passede ind i deres egne klasser.

På grund af klassens patchwork-karakter internaliserede jeg ikke rigtig nogen af ​​begreberne for godt. Det var godt at have et grundlæggende overblik over de dækkede begreber, men jeg ville ønske, at der blev brugt mere tid på de vigtige individuelle emner såsom test.

Computerarkitektur & monteringssprog

Jeg husker denne klasse levende. Denne klasse gennemgår, hvordan en computer fungerer. Hvordan maskininstruktioner sendes rundt og behandles af computeren. Vi fik også skrevet noget kode i MASM, som er et samlingssprog, der interagerer meget tæt med maskinkode.

De fleste af de programmeringssprog, jeg havde brugt op til at tage denne klasse, var sprog på højt niveau. Sprog på højt niveau har tendens til at være tættere på menneskeligt sprog end maskinkode. MASM er meget tæt på maskinkoden, og jeg vil sige, at det er tættere på maskinsproget over det menneskelige sprog.

Den vigtigste del af denne klasse er at få en idé om, hvad der sker med din kode, når den først er samlet. At forstå de forskellige logiske enheder på en computer og hvordan din kode bliver håndteret af dem var meget interessant at lære om.

Til praktiske formål synes jeg ikke, at denne klasse var meget afgørende for at bidrage til min teknologiske karriere. Jeg har ikke brugt meget af den viden, jeg har fået fra denne klasse i min karriere indtil videre.

Operativsystemer

Jeg vil være ærlig, jeg har virkelig svært ved at huske, hvad jeg lærte i denne klasse. Det eneste, jeg kan huske, er at opbygge et messaging-program, der brugte socket-programmering i C til at kommunikere. Jeg lærte også om at åbne filer og manipulere mapper ved hjælp af scripts.

Jeg vil være på forhånd med, hvad jeg husker fra min grad, og faktum er, at jeg ikke kan huske meget fra denne klasse. Jeg brugte bare ikke meget af den viden, der blev opnået med det i min nuværende karriere.

Introduktion til computernetværk

Denne klasse var meget nyttig. Det gik over, hvordan computernetværk fungerede. Dette omfattede at gå over netværksprotokoller som HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH og DNS. Jeg fik at lære om, hvad hver af disse protokoller bruges til, hvordan de implementeres og fik en forståelse af, hvorfor de blev oprettet.

De netværksprotokoller, jeg nævnte ovenfor, bruges til kritiske funktioner i moderne software. Dette inkluderer e-mailhåndtering (POP3 & IMAP), afsendelse af netværksanmodninger mellem klient og server (HTTP, HTTPS) og håndtering af enheder sikkert gennem et netværk (SSH). Dette giver dig virkelig en forståelse af, hvordan internettet fungerer, og hvordan enheder over hele verden kan interagere med hinanden.

Dette er ikke kun fascinerende, men det kan være nyttigt. Jeg har brugt de ting, jeg lærte fra denne klasse, til at fejle problemer, jeg stødte på, da jeg fik fejl fra netværket. Jeg var i stand til at lokalisere de problemer, jeg løb ind i, og hjælpe backend-dev, som jeg arbejdede med, med at finde fejlen i deres ende.

Introduktion til Usability Engineering

Denne klasse dækkede, hvordan man laver en intuitiv app, men også hvordan man gør en app eller et websted tilgængeligt. Tilgængelighed refererer til at gøre et stykke software anvendeligt til alle, inklusive dem med handicap. Dette dækker ting som tekst til tale og design af software, der ikke er helt afhængig af kun lydelementer.

Emnerne var nyttige, hvis du aldrig har hørt om tilgængelighed før. Det fik dig i det mindste til at overveje disse ting, når du designer software. Det fik mig også til virkelig at begynde at tænke på brugeroplevelse, og hvor vigtigt det er for god software. Hvis ingen bruger nøglefunktionaliteten i din app, fordi den er forvirrende, så mister din software til sidst alle sine brugere.

Mens viden var interessant, afhænger de specifikke implementeringer af, hvordan du opretter et brugbart og tilgængeligt stykke software, af platformen. For eksempel har Apple sit eget sæt retningslinjer for brugergrænseflader, der beskriver generelle designprincipper og specifikke detaljer om, hvordan du skal designe software, der kører på en hvilken som helst af Apples platforme.

På grund af de nødvendige specifikke oplysninger pr. Platform er jeg ikke sikker på, at denne klasse var utrolig nyttig. Det var en dejlig introduktion, men det endte med at jeg skulle lære Apples retningslinjer for grænseflade, der gik over alle de emner, der er dækket af denne klasse.

Udvikling af mobil- og cloudsoftware

Jeg holder denne kort. Jeg var allerede mobilingeniør, da jeg tog denne klasse. Jeg byggede en skør mobilapp på et par timer for at afslutte min grad ASAP. På dette tidspunkt havde jeg allerede nået mit mål om at få et job som softwareingeniør, men jeg havde bare brug for at afslutte min comp sci-grad, da jeg næsten var færdig. Mit hjerte var ikke til at lære på dette tidspunkt.

Selv med det er sagt, synes jeg ikke, denne klasse blev kørt godt. Det var dovent designet. De opfordrede folk til at skrive kode til en Windows-telefonapp til denne klasse, og efterspørgslen efter disse job er meget lavere end andre. Og jeg føler, at det kun blev opmuntret, fordi miljøet er lettere at konfigurere, og koden kan skrives i JavaScript og ligner webudvikling.

Det var også klart for mig, at den person, der kørte klassen, ikke vidste om alle mobile app-platforme. Vi blev forpligtet til at skrive en lille bagdel, men det ville jeg virkelig ikke. Jeg endte med at falske en webanmodning ved i stedet at læse fra disken og returnere et dåse svar efter et par sekunder. Dette fungerede, fordi jeg kun måtte indsende en demo og kildekoden. Og jeg har en fornemmelse af, at klassificeringen kun kiggede på demoen.

Samlet set underviste klassen i forældet og ubrugt teknologi, blev ikke korrekt evalueret og gav virkelig ikke meget vejledning. Dette var ikke en særlig god klasse.

Capstone-softwareprojekt

Når vi taler om forældet teknologi, krævede dette projekt os at opbygge en GUI til at få adgang til en database ved hjælp af forbandelser. Her er det fulde projekt, hvis du er interesseret. Vi fik ikke valgt, hvad vores stenstenprojekt var, det blev tildelt os. Og alle måtte gøre det samme projekt. Det blev også gjort i grupper på 3, så du dækkede kun en lille del af projektet. Dette var en rigtig dårligt kørt klasse.

Interaktionen med læreren var stort set ikke-eksisterende. Jeg havde nul interesse for projektet, og det, vi lærte, virkede absolut ubrugeligt. For at skabe interesse for et emne skal du lade folk have en vis fri vilje, når det kommer til at vælge, hvad de lærer. At have intet valg i dit capstone-projekt er bare fjollet. Dette projekt er ubrugeligt for et flertal af karriereveje, og det giver ikke mening at tvinge det til mennesker.

Klassen skulle have fået alle studerende til at indsende et forslag med grove estimater for en tidslinje for, hvornår de ville afslutte hver underdel af projektet. Dette udfører to ting: at få folk til at begynde at øve sig i at estimere arbejde og lade folk arbejde på det, de er interesseret i. Klassen ville have været 100 gange bedre på denne måde.

Afsluttende tanker

Jeg kunne ikke have taget en god del af undervisningen og stadig være den softwareingeniør, jeg er i dag. Men jeg tror, ​​at gå glip af nogle af disse kurser kan efterlade et stort hul i din viden som en dev. De emner, jeg synes, at enhver softwareingeniør skal have en vis viden om, er datastrukturer og algoritmer.

De andre klasser afhænger af den karriere, du følger, du vælger. Hvis du besluttede at gå ind i integreret udvikling, bør du lære om computerarkitektur. Hvis du beslutter dig for at blive en frontend engineer, skal du lære mere om computernetværk.

Den vigtigste afhentning her er, at en god ingeniør konstant lærer. Hvis du mangler noget viden, som du ved, ville være nyttigt og anvendeligt i dit job, så tag en klasse for at få den viden. Sådan bliver du bedre til at skrive god kode. Lær altid.

Kan du lide det, du læser? Tjek mine andre artikler

At starte en teknisk karriere fra ingenting.

Vælg den bedste tekniske karriere til dig selv - Dev Ops, Mobile Engineer, Data Scientist, Project Manager og Front End.

Tips til dit første tekniske interview.

Skal du få en datalogisk grad?

Swift vs. Objective-C