Løser du programmeringsproblemer eller komplette øvelser? (Forskellen betyder noget.)

Folk har tendens til at bruge udtrykkene "problemer" og "øvelser" om hverandre. Men der er forskel - og det betyder noget.

Professor Paul Zeitz skelner.

Tag 5 × 5. Det er let, og det er en øvelse. Så er 5.490.900 × 496. Det er lidt sværere og tager dig mere tid at løse, men du ved hvad du skal gøre. Det er nøglepunktet.

”En øvelse er et matematisk spørgsmål, som du straks ved, hvordan du skal svare,” forklarer Zeitz i en forelæsningsserie om problemløsning. "Du svarer muligvis ikke korrekt, faktisk svarer du måske aldrig korrekt ... men der er ingen tvivl om, hvordan du fortsætter."

Ikke så med problemer. Et problem, ifølge Zeitz, “er et matematisk spørgsmål, som du ikke ved, hvordan du skal svare, i det mindste i starten.”

Han definerer problemer og øvelser gennem linsen til matematisk problemløsning, men de er også anvendelige til programmering.

Hver dag sætter vi vores problemløsningskompetencer til at fungere som programmører: fejlretningskode, læring af et nyt emne eller endda løsning af et problem. Øvelser har deres plads, men som programmør er der ingen erstatning for at løse problemer.

Motion med øvelser

Der er to måder, du kan drage fordel af øvelser på. For det første er de nyttige, når de lærer et nyt emne.

Jeg lærer JavaScript lige nu og bruger en blanding af øvelser og problemer til at gøre det. Øvelserne hjælper mig med at se mønstre og blive fortrolig med begreber og syntaks.

Her er et eksempel på en øvelse fra et projekt, der bad mig skrive en funktion, der tog en række biler.

const cars = [ { id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 }, { id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 }, { id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 }, ... ] 

Jeg var nødt til at sortere matrixen af ​​objekter efter car_modelnøglen i stigende rækkefølge.

Det er ikke at sige, at denne øvelse var en leg - det var det ikke. Det tog mig tid, og jeg fik en god del af fejlmeddelelser.

Men det kvalificerer sig som en øvelse, fordi jeg vidste, hvad jeg havde brug for fra starten.

Jeg havde for nylig lært om arrays i JavaScript. Jeg var bekendt med at sortere data fra min erfaring med Python, selvom jeg var nødt til at undersøge, hvordan man gør dette i JavaScript. De eksplicitte anvisninger hjalp også.

Men begreberne var stadig nye. Jeg havde brug for øvelse i at sætte dem sammen, hvorfor denne øvelse var værdifuld. Gentagelse skaber fortrolighed, og begreberne begyndte at størkne i mit sind.

Vedligehold det, du har opnået

Øvelser hjælper også med at holde de lærte oplysninger friske.

Når jeg lærer JavaScript, vil jeg ikke glemme alt, hvad jeg har lært om det første sprog, jeg lærte, Python. Så jeg bruger Anki, et flashcard-program, flere gange om dagen.

I denne sammenhæng hjælper øvelser dig med at holde et bjerg af materiale lige, minde dig om vigtige begreber og blive mere komfortable ved hjælp af en bestemt datastruktur eller tilgang. Det er vedligeholdelsesarbejde på den viden, du hidtil har fået.

Jeg har over 1.000 kort, der er fyldt med materiale, jeg har set mange gange før. Nogle kort har spørgsmål om syntaks. Andre beder mig om at skrive SQL-forespørgsler eller kommandolinje- eller Git-kommandoer. Mange andre er fyldt med øvelser, som "drej en liste med tal til højre med en stedværdi."

Det er vigtigt at bemærke, at denne øvelse engang var et problem for mig. Hvis du gør et problem nok, kan det blive en øvelse. På samme tid kan du gøre en øvelse til et problem ved at tilføje en begrænsning.

Øvelser er en glat skråning. På den ene side er de nyttige til læringsformål. På den anden side er det let at blive komfortabel ved at holde udelukkende med øvelser.

Det er ulempen: at blive i din komfortzone.

Håndtering af tvetydighed

Programmering handler om problemløsning. Og at løse problemer fører dig uden for din komfortzone. Dette er en god ting.

For mig har problemer to karakteristiske kvaliteter. Den første er tvetydighed. Problemløsning handler stort set om, hvordan man effektivt håndterer tvetydighed.

  • En fejlmeddelelse vises hver gang dit program kører. Hvorfor? Hvad sker der? Hvor er fejlen? Hvordan kan du ordne det?
  • Du trækker en ny problemerklæring op. Du læser den og genlæser den. Ved første øjekast har du ingen idé om, hvad der foregår, endsige hvad du skal gøre for at løse det. Du kan endda få følelsen af ​​"hjorte i forlygter", der ledsages af en grop i bunden af ​​din mave. (Du valgte et godt problem!)
  • Du skal lære om relationsdatabaser. Det er ret bredt. Hvordan vil du gøre det? Hvad skal man først fokusere på? Hvad betyder mest? Hvad har du virkelig brug for at vide lige nu ?

Disse eksempler involverer alle tvetydighed. Og alle kræver løsning af problemer , hvad enten det er at finde og fejlfinde en fejl, løse et faktisk problem eller lære et nyt emne.  

For at gøre fremskridt undersøger du, eksperimenterer, trækker fakta ud, opretter en plan og anvender en række forskellige problemløsningstaktikker. Kort sagt lærer du at finde ud af det. Jo mere tid du bruger på et problem og de forskellige perspektiver, du får, jo flere lag afslører det, og jo tættere på ”aha” -momentet.

Omfavn kampen

Den anden forskel med problemer er kampen. Det er rigtigt.

Problemløsning vil teste din mentale udholdenhed og tålmodighed. Fremskridt kan være langsomt, og processen er kedelig. Jeg har slidt med problemer i timevis, dage og endda uger.

Det er ikke at sige, at øvelser ikke udfordrer dig. De kan. Det er en ting, når du ved, at du har brug for en bestemt metode; du skal bare få det til at fungere ordentligt. Det er en udfordring, som nogle gange kan være direkte frustrerende.

Men det er noget helt andet, når du ikke har nogen idé om, hvad du skal gøre fra starten, hvilket kan ske flere gange, når du løser et problem. For mig er problemer en kamp.

Den bedste løsning er at udholde det og få dig selv fast. Efter min erfaring betyder kampen, at jeg lærer meget, og gennembruddet er normalt rundt om hjørnet.

Når du skubber igennem det mentale ubehag, finder du dig selv til at tænke kreativt og udtænke løsninger, du aldrig har tænkt på før. (Du overrasker og imponerer dig selv - du ved mere, end du tror!) Du bliver en stærkere programmør.

Du vil endda finde dig selv at have det sjovt. Problemløsning er udfordrende, for at være sikker, og endda frustrerende til tider. Men det er også utroligt givende.

Det er som at krydse målstregen på en halvmaraton. Ingen tvivl om, at de sidste 13,1 miles var udmattende, men at krydse målstregen var det værd, og jeg ville gøre det igen. Løsning af et problem føles på samme måde.

Hvad er det: Problemer eller øvelser?

Når du åbner din bærbare computer, skal du løse problemer eller gennemføre øvelser?  

Øvelser har fordele, og det er fint at integrere dem i dine programmeringssessioner. Jeg bruger øvelser som en opvarmning før en programmeringssession. Jeg bladrer gennem et Anki flashcard-kort i ti eller femten minutter og arbejder igennem nogle øvelser. Hvis jeg lærer noget nyt, som JavaScript, har jeg muligvis en hel programmeringssession afsat til øvelser.

Jeg bruger dog tid hver dag på at løse problemer - uanset hvad jeg ellers lærer eller bygger. Selv på de dage, hvor jeg afsætter et stort stykke tid til øvelser, afsætter jeg også masser af tid til at løse problemer.  

Så når du skal starte en programmeringssession, skal du være opmærksom på, hvad du vil: øvelser eller problemer. Og uanset hvad, tag dig tid til at løse problemer.

Problemløsning er en færdighed, der tager meget træning og tid at udvikle sig. Den eneste måde at blive bedre på er at arbejde på det hver dag. Det er så vigtigt og med god grund.

Vi løser problemer hver dag som programmører og på en række forskellige måder. Det er en no-brainer at få tid til at løse problemet; vores arbejde som programmører afhænger af det.

Jeg skriver om at lære at programmere og de bedste måder at gøre det på (amymhaddad.com).