Hva du lærer i en 4-årig informatikkgrad

Jeg skrev nylig en artikkel om du trenger en informatikkgrad for å få jobb innen teknologi. Jeg trodde at det ville være nyttig å gå gjennom transkripsjonen. Å diskutere hva jeg studerte vil forhåpentligvis hjelpe folk. Jeg vil at alle skal kunne ta en mest mulig informert beslutning når de velger deres vei for å forfølge en teknisk karriere.

Ansvarsfraskrivelse : Dette er skrevet fra min erindring om klassene og fra perspektivet til en mobilutvikler. Mange av emnene i disse klassene kunne spesialiseres i og forvandles til en karriere. Så de er alle viktige for noen i verden. Jeg skriver fra mitt perspektiv og fra synspunktet til noen som valgte karriereveien til en mobilutvikler.

Programmering I, II

Dette var kjøttet av alt jeg lærte og fikk meg i gang med programmering. Dette var klassene der du lærte å programmere. Før jeg tok disse timene, hadde jeg knapt engang programmert i det hele tatt. Jeg hadde prøvd å få et forsprang, men kom ikke mye lenger enn løkker.

Denne klassen startet med å lage en tom fil og lage den sammen i en IDE (jeg brukte Code :: Blocks). Og vi jobbet oss helt opp for å lage vårt eget tekstbaserte kampspill. Å se tilbake på koden jeg skrev gjør meg flau. Jeg har kommet langt siden da. Her er repoen hvis du vil le (jeg bruker bare en main.cpp-fil med 1063 linjer med kode).

Så hva lærte jeg her? Jeg vil si alt. Disse kursene var sinnsykt verdifulle og fikk meg minst 70% av kunnskapen jeg trengte for å jobbe profesjonelt som programmerer. Jeg lærte om utsagn, sløyfer, boolsk logikk, klasseskaping, strukturopprettelse, oppretting av grensesnitt, polymorfisme, arv og mer. Det var også noe bruk av grunnleggende datastrukturer som matriser og vektorer.

Diskrete strukturer innen informatikk

Denne klassen ble lagt til i transkripsjonen for å gjøre folk vant til boolsk logikk. Som vi hadde nede i de to første ukene av klassen. Dessverre for oss, intetanende studenter, går det ganske langt ned i kaninhullet. Her er noen av emnene det dekket: “logikk, sett og sett operasjoner, bevismetoder, rekursive definisjoner, kombinatorikk og grafteori”.

Dette er alle nyttige ting å vite. Men problemet er at studentene ble oppfordret til å ta denne timen tidlig. Vanligvis ved siden av Progamming I og II. Og dette er noen avanserte emner. Jeg ville slite nå med å bruke matematiske bevis. Og jeg husker at jeg virkelig slet den gangen. Dessuten måtte jeg bare google hva kombinatorikk er, så jeg bruker dem tydeligvis ikke for mye.

Faktum er at mange av de tingene de lærte på dette kurset, ikke virket anvendelige i en datavitenskapskarriere da jeg tok kurset. Jeg vet nå at logikk, sett- og settoperasjoner, rekursive definisjoner og grafteori kan være nyttig. Men det er bare i ettertid å være programmerer i noen år.

Det jeg bruker daglig i min nåværende karriere er logikk og kanskje satt operasjoner. Rekursive definisjoner og grafteori har egentlig bare vært nyttige for intervjuer. Men ta dette med et saltkorn fordi jeg er en mobilutvikler. En back end-dev vil trolig finne grafteori veldig nyttig.

Datastrukturer

Denne klassen var bra. Veldig bra. Datastrukturer brukes over hele dataprogrammering og er ryggraden i det meste av koden folk skriver. De lar oss lagre data på en måte som er nyttig for programmene vi skriver. Evnen til å se på data og vite den beste måten å lagre dem på for tid og rom ytelse er en veldig nyttig ferdighet å ha.

Jeg lærte om matriser, stabler, koblede lister, dobbeltkoblede lister, trær, grafer, dynger og alle de forskjellige smaker av disse datastrukturene (som selvbalanserende trær). Denne klassen hjalp meg ikke bare med å forstå datastrukturer, men hjalp meg også med å bedre organisere dataene jeg lagret.

Denne klassen ble gjort i C, noe som gjorde det enda mer interessant. C kan være veldig kinkig, men også veldig kraftig hvis den brukes riktig. Jeg måtte være veldig forsiktig med hvordan jeg tildelte og ryddet opp minne som også var veldig bra for å lære om minneadministrasjon.

Det var så mange nyttige ting i denne klassen at det er vanskelig å dekke dem alle. Jeg har ikke engang nevnt det faktum at dette er en viktig kunnskapskomponent for intervjuer innen teknologi. Hvis du er skjelven på datastrukturer, så begynn å pusse opp noen grunnleggende ting fordi de er veldig viktige.

Analyse av algoritmer

Denne klassen var noe nyttig. Algoritmer er nyttige. De driver den beste programvaren i verden og gjør dem kraftige nok til å forbli relevante i den moderne verden. Men denne klassen hadde noen problemer.

Den mest nyttige delen av dette var å lære Big O-notasjon. Big O-notasjon lar deg evaluere kode og forstå hvor godt den vil fungere tidsmessig og romvis. Generelt, hvis du måler kodeytelse i et selskap, vil du bruke en tidtaker for å spore tid mellom interaksjoner. Dette lar deg se hvor bra programvaren din fungerer. Dette krever at du skriver kode og evaluerer resultatene etterpå.

Big O-notasjon lar deg gjøre evalueringer av kodeytelsen ved å bare se på koden. Jeg vil ikke komme inn på dette for mye, men hvis du ikke vet om Big O-notasjon, kan du lese dette blogginnlegget.

De faktiske algoritmene vi gikk over var ikke like nyttige. Alt jeg husker er ryggsekkproblemet og det omreisende selgerproblemet. Jeg måtte også skrive kode for disse i grupper, noe som ikke var bra fordi det var en person i gruppen min som gikk utover det han ble ønsket. Det betydde at jeg endte med å skrive mindre kode mot den endelige implementeringen hver gang enn jeg hadde ønsket å gjøre.

En grunnleggende forståelse av hvilke kjente algoritmer som finnes, formålet med dem og hvordan de implementeres, kan være nyttige (mest for intervjuer). Big O-notasjon er nøkkelen her. Det er veldig nyttig på jobben, og det er også utrolig nyttig for intervjuer.

Webutvikling

Denne klassen hadde flest ferdigheter som var direkte anvendelig for en jobb innen teknologi. Jeg lærte om HTML, CSS, JQuery, JavaScript, PHP og JSON. Jeg lærte hvordan en forespørsel sendes fra en nettside til en back-end, hvordan den behandles på bakenden og deretter sendes tilbake til front-enden med et svar. Jeg lærte hvordan jeg oppretter brukergrensesnitt og hvordan jeg kan samhandle med et datalag som deretter samhandler med nettverket.

På slutten av timen hadde jeg bygget et eget nettsted og tok initiativ til å lære Angular. Jeg brukte Angular for å få siden til å se prangende ut, og det endte med at jeg fikk mitt første internship. Jeg fikk også en god forståelse av hvordan et nettsted fungerer under panseret.

Denne kunnskapen alene var stor, men jeg lærte også å plukke opp og lære et ukjent språk, rammeverk eller dataformat og jobbe med det på farten. Jeg googlet mye om disse emnene for å se konkrete eksempler. Jeg lærte å bruke dokumentasjon og online etterforskning for å bedre forstå et konsept som jeg trengte å bruke direkte på kort tid. Dette er en nøkkelferdighet i å være en dyktig programmerer.

Introduksjon til databaser

Jeg lærte stort sett bare SQL i denne klassen. Jeg er sikker på at vi gikk over noen andre konsepter som skjæring og klynging, men jeg husker dem ikke. Noen ganger bruker jeg SQL i min nåværende jobb for å kjøre dataspørsmål for hendelser jeg har logget på. SQL vil enten være en integrert del av jobben din, ellers vil du knapt bruke den. Hvis du trenger det, kan du lære det og bli ekspert. Hvis du ikke gjør det, så ikke bekymre deg for mye om det.

Software Engineering I, II

Også en annen klasse jeg egentlig ikke kan huske. Jeg tror vi gikk over en haug med brede konsepter i denne klassen. Vi dekket metoder for Scrum og Waterfall-prosjektledelse. Vi gikk over testing og alle de forskjellige typene testing det er. Vi dekket noen begreper om brukervennlighet og tilgjengelighet. Det var egentlig bare en oppsummering for konsepter som egentlig ikke passet inn i deres egne klasser.

På grunn av lappeteppet i klassen, internaliserte jeg egentlig ikke noen av konseptene for godt. Det var bra å ha en grunnleggende oversikt over konseptene som dekkes, men jeg skulle ønske mer tid ble brukt på viktige individuelle emner som testing.

Dataarkitektur og monteringsspråk

Jeg husker denne klassen levende. Denne klassen går inn på hvordan en datamaskin fungerer. Hvordan maskininstruksjoner sendes rundt og behandles av datamaskinen. Vi fikk også skrive litt kode i MASM, som er et monteringsspråk som samhandler veldig tett med maskinkoden.

De fleste av programmeringsspråkene jeg hadde brukt opp til å ta denne klassen var språk på høyt nivå. Språk på høyt nivå har en tendens til å være nærmere menneskelig språk enn maskinkode. MASM er veldig nær maskinkoden, og jeg vil si er nærmere maskinspråket over menneskelig språk.

Den viktigste delen av denne klassen er å få en idé om hva som skjer med koden din når den blir samlet. Å forstå de forskjellige logiske enhetene på en datamaskin og hvordan koden din blir håndtert av dem, var veldig interessant å lære om.

For praktiske formål synes jeg ikke denne klassen var veldig viktig for å bidra til min tekniske karriere. Jeg har ikke brukt mye av kunnskapen jeg fikk fra denne klassen i løpet av karrieren min så langt.

Operativsystemer

Jeg skal være ærlig, jeg har det veldig vanskelig å huske hva jeg lærte i denne klassen. Det eneste jeg kan huske er å bygge et meldingsprogram som brukte socket programmering i C for å kommunisere. Jeg lærte også om å åpne filer og manipulere mapper ved hjelp av skript.

Jeg vil være på forhånd om hva jeg husker fra graden min, og faktum er at jeg ikke husker mye fra denne klassen. Jeg brukte bare ikke mye av den kunnskapen jeg fikk fra den i min nåværende karriere.

Introduksjon til datanettverk

Denne klassen var veldig nyttig. Det gikk over hvordan datanettverk fungerte. Dette inkluderte å gå over nettverksprotokoller som HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH og DNS. Jeg fikk lære om hva hver av disse protokollene brukes til, hvordan de implementeres og fikk forståelse for hvorfor de ble opprettet.

Nettverksprotokollene jeg nevnte ovenfor brukes til kritiske funksjoner av moderne programvare. Dette inkluderer e-posthåndtering (POP3 & IMAP), sending av nettverksforespørsler mellom klient og server (HTTP, HTTPS) og håndtering av enheter sikkert gjennom et nettverk (SSH). Dette gir deg virkelig en forståelse av hvordan internett fungerer og hvordan enheter over hele verden kan samhandle med hverandre.

Dette er ikke bare fascinerende, men det kan være nyttig. Jeg har brukt tingene jeg lærte fra denne klassen til å feilsøke problemer jeg kom over da jeg fikk feil fra nettverket. Jeg var i stand til å finne problemene jeg kjørte inn i, og hjelpe bakenden som jeg jobbet med med å finne feilen på slutten.

Introduksjon til Usability Engineering

Denne klassen dekket hvordan du lager en intuitiv app, men også hvordan du gjør en app eller et nettsted tilgjengelig. Tilgjengelighet refererer til å gjøre en programvare brukbar for alle, inkludert de med nedsatt funksjonsevne. Dette dekker ting som tekst til tale og design av programvare som ikke bare er avhengig av lydelementer.

Temaene som ble dekket var nyttige hvis du aldri har hørt om tilgjengelighet før. Det fikk deg i det minste til å vurdere disse tingene når du designer programvare. Det fikk meg til å virkelig begynne å tenke på brukeropplevelse og hvor viktig det er for god programvare. Hvis ingen bruker nøkkelfunksjonaliteten til appen din fordi den er forvirrende, vil programvaren din til slutt miste alle brukerne.

Selv om kunnskapen var interessant, avhenger de spesifikke implementeringene av hvordan du lager en brukbar og tilgjengelig programvare av plattformen. For eksempel har Apple sitt eget sett med retningslinjer for brukergrensesnitt som beskriver generelle designprinsipper og spesifikke detaljer om hvordan du skal designe programvare som skal kjøres på noen av Apples plattformer.

På grunn av den spesifikke informasjonen som trengs per plattform, er jeg ikke sikker på at denne klassen var utrolig nyttig. Det var en fin intro, men jeg endte opp med å lære Apples retningslinjer for grensesnitt som gikk over alle temaene som ble dekket i denne klassen.

Programvareutvikling for mobil og sky

Jeg holder denne kort. Jeg var allerede mobilingeniør da jeg tok denne timen. Jeg bygde en gal mobilapp på få timer for å fullføre graden ASAP. På dette tidspunktet hadde jeg allerede oppnådd målet mitt om å få en jobb som programvareingeniør, men jeg trengte bare å fullføre oppgraderingskompetansen siden jeg nesten var ferdig. Hjertet mitt var ikke interessert i å lære på dette tidspunktet.

Selv når det er sagt, tror jeg ikke denne klassen ble kjørt bra. Den ble lat designet. De oppfordret folk til å skrive kode for en Windows-telefonapp for denne klassen, og etterspørselen etter disse jobbene er mye lavere enn andre. Og jeg føler at det bare ble oppmuntret fordi miljøet er lettere å sette opp og koden kan skrives i JavaScript og ligner på nettutvikling.

Det var også klart for meg at personen som kjørte klassen ikke visste om alle mobilapp-plattformene. Vi ble bedt om å skrive en liten bakdel, men det ville jeg virkelig ikke. Jeg endte med å falske en nettforespørsel ved i stedet å lese fra disken og returnere et hermetisk svar etter noen sekunder. Dette fungerte fordi jeg bare måtte sende inn en demo og kildekoden. Og jeg har en følelse av at personen som graderer bare så på demoen.

Samlet sett underviste klassen utdatert og ubrukt teknologi, ble ikke riktig evaluert og ga egentlig ikke mye veiledning. Dette var ikke en veldig god klasse.

Capstone programvareprosjekt

Når vi snakker om utdatert teknologi, krevde dette prosjektet oss å bygge en GUI for å få tilgang til en database ved hjelp av forbannelser. Her er hele prosjektet hvis du er interessert. Vi fikk ikke velge hva toppsteinprosjektet vårt var, det ble tildelt oss. Og alle måtte gjøre det samme prosjektet. Det ble også gjort i grupper på 3, så du dekket bare en liten del av prosjektet. Dette var en veldig dårlig kjørt klasse.

Samspillet med læreren var stort sett ikke-eksisterende. Jeg hadde ingen interesse for prosjektet, og det vi lærte virket absolutt ubrukelig. For å skape interesse for et emne, må du la folk ha en viss fri vilje når det gjelder å velge hva de lærer. Å ikke ha noe valg i toppsteinprosjektet er bare dumt. Dette prosjektet er ubrukelig for de fleste karriereveier, og det gir ikke mening å tvinge det til mennesker.

Klassen burde ha fått hver student til å sende inn et forslag med grove estimater for en tidslinje for når de skulle fullføre hver del av prosjektet. Dette oppnår to ting: å få folk til å begynne å øve seg på å estimere arbeid og la folk jobbe med det de er interessert i. Klassen hadde vært 100 ganger bedre på denne måten.

Siste tanker

Jeg kunne ikke tatt en god del av klassene og fremdeles være programvareingeniøren jeg er i dag. Men jeg tror at du går glipp av noen av disse kursene, kan gi et stort gap i din kunnskap som en dev. Temaene jeg mener at hver programvareingeniør bør ha litt kunnskap i er datastrukturer og algoritmer.

De andre klassene avhenger av karrieren du følger. Hvis du bestemte deg for å gå inn i innebygd utvikling, bør du lære om dataarkitektur. Hvis du bestemmer deg for å bli frontingeniør, bør du lære om datanettverk.

Hovedtaket her er at en god ingeniør hele tiden lærer. Hvis du mangler kunnskap som du vet vil være nyttig og anvendelig i jobben din, så ta en klasse for å få den kunnskapen. Slik blir du bedre til å skrive god kode. Lær alltid.

Likte det du leste? Sjekk ut de andre artiklene mine

Å starte en teknologikarriere fra ingenting.

Velg den beste tekniske karrieren for deg selv - Dev Ops, Mobile Engineer, Data Scientist, Project Manager og Front End.

Tips til ditt første tekniske intervju.

Bør du få en informatikkgrad?

Swift vs. Objective-C