Go Programming Course 2020 w22

Gopher the Go Mascot
package main

import "fmt"

func main() {
	fmt.Println("Learn Go in one week - w22. ")
	fmt.Println("Registration opens on w12 Monday. ")
}

Haaga-Helia students can enroll in Peppi: Go-ohjelmointi ICT8TN031-3001.

Why Go?

Fast to compile, fast to run. Good for parallel computing: doing many things at the same time, using all CPU cores.

Cross-compile static binaries: you can use Linux to compile programs for Windows - that have zero dependencies, so they are robust. You can cross-compile between Linux, Windows and Mac OSX.

Docker containers, Syncthing file sharing and Ethereum cryptocurrency are all made with Go. Google, Uber and Netflix use Go in production.

It's easy to get started - it has only 25 keywords: if, else, for, func...

The course will be in Finnish, so the rest of this page will be in Finnish, too. Moodle (Haaga-Helia account required)

All my courses are completely online for spring 2020.

Aikataulu 2020 w22

Kurssi kestää viikon w22. Opetuksessa vuorottelevat videokonfferenssi ja itsenäinen harjoittelu.

PäiväAiheTavoite
MaHei maailma!Osaa kirjoittaa yksinkertaisia ohjelmia
TiGo:n ominaispiirteitä (+ versionhallinta)Osaa Go:n tärkeimmät tietorakenteet. Osaa ristiinkääntää ohjelmia, joilla ei ole riippuvuuksia
KeKirjastosta valmis vastaus + vahvuudetTietää, mihin Go soveltuu hyvin
ToOmat ohjelmat (+moniajo)Syvennetään osaamista.
PeOmien ohjelmien esittelySyvennetään osaamista.

Tämä alustava aikataulu muuttuu kurssin aikana. Lisäaiheet on esitetty suluissa. Lisäaiheista käsitellään joitakin ajan salliessa.

Etukäteisvalmistelut

Kurssille osallistuaksesi tarvitset

  • Chrome tai Chromium-selain
  • Weppikamera (tai videoyhteys kännykästä), kuulokkeet, mikrofoni
  • Ubuntu 18.04 (virtualisoitu kelpaa)
  • Internet-yhteys, joka soveltuu kuvalliseen videokonfferenssiin

"Remote Learning Tools for Tero's Courses" - eli ohjeet välineiden asentamiseen

Käytämme Linuxin komentokehotetta. Ovathan nämä tuttuja: 'ls', 'pwd', 'cd foo', 'cd ..', 'nano foo.go' (ctrl-X y enter), 'ls|less' (q), './binInThisDir'? "Command Line Basics Revisited" eli ne tavallisimmat Linux-komennot.

Maanantai - Hei maailma!

Maanantaina keskitytään perusasoihin, joita käytetään lähes jokaisessa ohjelmassa. Ne ovat Go:ssa samantapaisia kuin muissa kielissä.

  • Hello world (go:n asennus, fmt.Println)
  • Ohjelman rakenne (package, import, func main())
  • Funktiot (func, return)
  • Kontrollirakenteet (if-else; switch-case; for, range)
  • Tyypit (int, float, bool, string; array, slice; map)
  • Käyttäjän syötteet

Tiistai - Go:n ominaispiirteitä + Versionhallinta

Tiistaina katsotaan Go:n ominaispiirteitä, asioita, jotka ovat Go:ssa erilaisia kuin muissa kielissä. Lisäksi käytetään versionhallintaa.

  • (lisäaihe) Versionhallinta (git)
  • Virheet (errors, if err != nil { return err })
  • Omat tyypit (type, struct;) (lisäaihe: metodit; interface)
  • (lisäihe) Yksikkötestit (testing)
  • Kääntämistä - ei riippuvuuksia + yksi binääri per alusta

Keskiviikko - Kirjastosta valmis vastaus

Keskiviikkona hyödynnetään valmiita ratkaisuja kirjastoista. Keskustellaan myös Go:n vahvoista ja heikoista alueista.

  • Mihin Go soveltuu hyvin, mihin huonosti?
  • Standardikirjasto https://golang.org/pkg/#stdlib
  • (lisäaihe) x-kirjastot (crypto net net/http sys time enconding/json)
  • (lisäaihe) Valikoituja kolmannen osapuolen kirjastoja (https://pkg.go.dev/ logrus cobra viper)
  • (lisäaihe) Menestyneitä Go-ohjelmia

Torstai - Omat ohjelmat (moniajo)

Torstaina tehdään omat ohjelmat. Ja ehkä otetaan ensiaskeleet moniajossa.

  • (lisäaihe) Moniajo
    • Go-rutiinit (go foo())
    • Kanavat (ch := make(chan int))
  • Oma ohjelma
    • Pitää tulla valmiiksi - riittävän yksinkertainen
    • Pitää olla jokin tarkoitus (sellainen, jonka voi ymmärtää tietämättä, miten se on tehty)
    • Pitää olla oma ja itse keksitty.
    • Esittely perjantaina

Perjantai - Omien ohjelmien esittely

Perjantaina kurssi huipentuu omien ohjelmien esittelyyn. Samalla pääset näkemään, mitä muut keksivät ja pystyivät toteuttamaan tiukassa aikataulussa.

Ohjelman julkaisu

  • Taitoksen yläpuolelle (skrollaamatta näkyvään osaan)
    • Ohjelman tarkoitus yhdellä virkkeellä
    • Ruutukaappaus
    • Lisenssi (suositus GPL 2, mutta minkä vain lisenssin saa valita)
    • Linkki lähdekoodiin
    • Linkki valmiiksi käännettyyn binääriin
    • Oma nimi (suositeltavaa, vapaaehtoista)
  • Kannattaa kirjoittaa englanniksi (suomikin käy)
  • Kannattaa laittaa linkki ja lyhyt kuvaus kommentiksi kurssisivulle (vapaaehtoista)
  • Ohjelmat kannattaa tietysti julkaista, mutta jos joku ei uskalla tai muuten halua julkaista, voi käyttää salanimeä tai laittaa weppiin salasanan taakse ja jakaa salasanan kaikkien kurssilaisten kanssa. Mutta tietysti kannattaa julkaista.

Esitys (5 min)

  • Edellisen esityksen kommentoinnin aikana
    • Linkki ohjelmaisi sivulle (chattiin)
    • Oma ruutu jakoon ja video pikkukuvaksi
  • Hovimestari on syyllinen eli tärkein alkuun
    • Mikä tämä on? (eli mitä ohjelmasi tekee)
    • Oma nimi
  • Demo alkuun
  • Esittele koodi (mikä voisi olla yleisölle hyödyllistä)
  • Seuraa kelloa, lopeta ajoissa

Kurssi päättyy perjantaina. Perjantain jälkeen ei voi palauttaa mitään kurssitehtäviä.

Intensiivi viikolla w22

Ilmoittautuminen alkaa w12 maanantaina 2020-03-16 kello 08:00. Itse kurssi pidetään toukokuussa.

  • Kurssi alkaa w22 maanantaina 2020-05-25
  • Kurssi päättyy w22 perjantaina 2020-05-29

Joka päivä ma-pe opetusta 9-16. Kurssi edellyttää 100% etäläsnäoloa joka päivä. Intensiivikurssi päättyy perjantaina, sen jälkeen ei ole mitään tehtäviä eikä palautuksia. Toteutan kaikki kurssini kokonaan etäopetuksena keväällä 2020.

Opetus on labrassa pa5004, Haaga-Helia, Pasila, Helsinki. Oppituntien ulkopuolella mahdollisuus itsenäiseen harjoitteluun, labra 5004 varattu tälle kurssille.

Go: nopea, luotettava, monialustainen

Go-kieli soveltuu nopeiden, luotettavien ja monialustaisten ohjelmien tekoon. Go:ta käyttävät tuotannossa mm. Google, Netflix ja Uber.

Go-kiellä on tehty useita menestyneitä ohjelmia tietokoneinfrastruktuurin hallintaan. Docker on maailman suosituin tekniikka paketoida pinoja ajettaviksi konteiksi. Juju on palveluiden orkestrointityökalu Ubuntulta. Kubernetes on konttien hallintatyökalu Googlelta. Myös Ethereum-kryptovaluutta ja Syncthing tiedostojako on kirjoitettu Go:lla.

Go on monialustaista. Voit kääntää ohjelmasi kaikille tuetuille alustoille millä vain alustalla, esimerkiksi kääntää Linuxilla ohjelman Windowsille. Ohjelmat ovat täysin riippumattomia asennetuista kirjastoista, joten ne toimivat erittäin luotettavasti ympäristön päivittyessä tai vaihtuessa.

Go on nopea kieli sekä suoritusnopeudeltaan että moniajossa. Kanavat ja go-rutiinit ovat tehokas tapa kirjoittaa monialustaisia ohjelmia, jotka hyödyntävät kerralla kaikki prosessoriytimet.

Kurssikuvaus

Kuvaustiedot

Osaamistavoitteet

Opi Go:n perusteet viikossa!

Opintojakson suoritettuaan opiskelija

  • Osaa kirjoittaa yksinkertaisia ohjelmia Go-kielellä
  • Osaa Go-kielen kontrollirakenteet ja funktiot (if, for, range, func...)
  • Osaa Go-kielen tärkeimmät tietorakenteet (slice, string, rune...)
  • Tietää, mihin Go soveltuu hyvin
  • Osaa ristiinkääntää ohjelmia (esimerkiksi kääntää Windows-ohjelman Linuxilla)
  • Osaa tehdä ohjelmia, joilla ei ole riippuvuuksia (yksi binääri sisältää kaiken)

Sisältö

  • Go-ohjelmointiympäristön asentaminen, hei maailma
  • Menestyneitä Go-ohjelmia
  • Kontrollirakenteet ja funktiot
  • Virheiden käsittely
  • Tärkeimmät tietorakenteet
  • Käännöstekniikat (cross compliation, static binaries)
  • Ohjelmointiharjoituksia

Mikäli aika sallii, voidaan käsitellä myös esimerkiksi yksikkötestejä ja tärkeimpiä kirjastoja.

Sisältöön tulee muutoksia kurssin aikana.

Oppimistavat

  • Teoria opetetaan käytäntöön sidottuna - koodauskurssilla katsomme lähinnä koodia
  • Työskennellään oikeilla tietokoneilla labrassa ja kotona - koodataan.
  • Kannustetaan opiskelijoita hankkimaan tuotantovälineet itselleen.
  • Kannustetaan tulosten julkaisuun.

Lisätiedot

Palautteen hyödyntäminen. "Go -ohjelmointi" toteutetaan ensimmäistä kertaa 2020 keväällä. Kurssin suunnittelussa on hyödynnetty palautetta muilta haastavilta teknisiltä intensiivikursseilta Tunkeutumistestaus (opiskelijapalaute 4.9 / 5) ja Prototyypin rakentaminen (4.8 / 5). Näiden kurssien palautetta on luettavissa http://TeroKarvinen.com.

Opiskelijoiden toiveiden mukaisesti teoria opetetaan tietokoneiden ääressä käytännön esimerkkien yhteydessä. Opettajakeskeinen opetus ja opiskelijoiden lyhyet tuntiharjoitukset vuorottelevat. Harrastuneisuutta tuetaan ja opiskelijoita kannustetaan taitojen välittömään kokeiluun kurssin ulkopuolella. Kurssilla syntyvien raporttien julkaisemiseen ja vapaaseen lisensointiin kannustetaan. Intensiivikurssin ajan on 100% etäläsnäolovaatimus, ja kurssin päättymispäivän (perjantai) jälkeen ei voi eikä saa palauttaa mitään. Toteutan kaikki kurssini kokonaan etäopetuksena keväällä 2020.

Oppimateriaalit

Tietokonelaboratorio käytettävissä koko kurssin ajan. Opetus labrassa 9-16, tuntien ulkopuolella labra varattu kurssilaisille vapaaehtoiseen itsenäiseen harjoitteluun 8-20 kurssipäivinä.

Vapaat ohjelmat, käytettävissä vapaalla alustalla. Mm. Go-kehitysalusta ja Xubuntu 18.04. Opettettuja työkaluja voi käyttää myös kaupallisessa käytössä ilman lisenssimaksuja.

McGranaghan 2020: http://GoByExample.com

Go-kielen dokumentaatio ja kirjastojen lähdekoodi soveltuvin osin. https://pkg.go.dev/

Oheislukemisto, ei tarvitse ostaa kurssia varten: Donovan & Kerninghan 2015: The Go Programming Language. Saattaa löytyä Haaga-Helian tunnuksilla O'Reilly Learning -palvelusta ilmaiseksi.

http://terokarvinen.com/2020/go-programming-course-2020-w22/

Muu myöhemmin ilmoitettava kirjallisuus.

Lähtötaso ja sidonnaisuudet muihin opintojaksoihin

  • Ohjelmoinnin alkeet (millä vain kielellä): if-else, for, funktio, olio, muuttuja...
  • Linuxin alkeet: ls, pwd, cd...

Mitään tiettyjä kursseja ei tarvitse olla käytynä, alkeiden osaaminen testataan tarvittaessa alkutestillä. Opetus on suomeksi ja kirjallisuus englanniksi.

Osaamisen arviointi

Arviointikriteeri - arvosana 1

Opiskelija osaa ratkaista triviaaleja ohjelmointitehtäviä Go-kielellä. Opiskelija on osallistunut kaikkeen opetukseen, tehnyt läksyt ja läpäissyt kokeen tai arvioitavan loppuharjoituksen.

Arviointikriteeri - arvosana 3

Opiskelija osaa ratkaista tavallisia yksinkertaisia ongelmia Go-kielllä. Ohjelmat soveltuvat niiden pääasialliseen käyttötarkoitukseen siten, että ulkopuolinen voisi käyttää niitä. Opiskelija täyttää kaikki alempien arvosanojen kriteerit.

Arviointikriteeri - arvosana 5

Opiskelija pystyy soveltamaan Go-kieltä ongelmien ratkaisemiseen. Go-kielen käyttö on kielelle luonteenomaista ja hyödyntää kielen vahvuuksia. Opiskelija hankkii itse lisää tietoa ja kykenee itsenäisesti ottamaan käyttöön koodia ja kirjastoja, joiden käyttöä ei ole erikseen opetettu. Sovellukset ovat monialustaisia, helppoja ottaa käyttöön ja niiden toiminnallisuutta on testattu. Opiskelija täyttää kaikki alempien arvosanojen kriteerit.

Läksyt

h1

Säädä haaste oikeaksi. Jos osaat koodata, tee myös vapaaehtoiset tehtävät. Jos olet aloittelija, pakolliset riittävät ihan hyvin.

a) Kirjoita itse keksimäsi ohjelma, joka lukee käyttäjältä syötteen (flag) ja tulostaa käyttäjälle tekstiä.

b) Tee Tour of Go: Welcome. Tätä b-alakohtaa ei tarvitse raportoida. Ei tarvitse tehdä lisäkohtaa "Go offline (optional)".

c) Vapaaehtoinen, helppo: Tee Tour of Go: "Basics": "Packages, variables and functions" Tätä c-alakohtaa ei tarvitse raportoida.

d) Vapaaehtoinen: Tee Tour of Go: "Flow control statements: for, if else, switch and defer". Tätä d-kohtaa ei tarvitse raportoida. Tuo "Exercise: Loops and Functions" -harjoitus voi olla haastavampi, voit halutessasi jättää sen väliin. Muut kohdat ovat suoraviivaisia.

e) Vapaaehtoinen: Tee rot13-salakirjoitusohjelma. Se siirtää kirjaimia a-zA-Z 13 askelta eteenpäin. Ameriikkalaisia aakkosia on 26, tästä puolet on 13, joten sama ohjelma salaa ja purkaa. Esimerkiksi "Tero" -> "Greb".

h2

a) LinWinMac! Käännä ohjelma kolmelle alustalle: Windows, Linux, Mac. Tee staattinen käännös niin, että ohjelma toimii ilman mitään riippuvuuksia tai kirjastoja. Testaa ohjelman toiminta ainakin joillain näistä alustoista ja ota ruutukaappaukset. 'CGO_ENABLED=0 GOARCH=amd64 GOOS=windows go build tero.go' (GOOS darwin, windows, linux)

b) Kirjastoja kohti. Kirjoita ohjelma, joka käyttää kahta uutta ominaisuutta tai kirjastoa Go by Example-kirjasta. Voit valita mitä vain, helppoja vaihtoehtoja ovat esimerkiksi satunnaisluvut, merkkijonojen käsittely ja aika.

c) Vapaaehtoinen: Patterit mukana. Vapaaehtoinen: kirjoita ohjelma, joka käyttää jotain uutta ominaisuutta Go:n standardikirjastoista.

d) Vapaaehtoinen: Tee Tour of Go alusta luvun "More types: structs, slices, and maps" loppuun asti. Jos "Exercise"-kohdat ovat hankalia, voit hypätä niistä yli tai jättää ne viimeisiksi. Tätä d-kohtaa ei tarvitse raportoida.

e) Vapaaehtoinen: Kirjoita yksikkötesti (unit test).

h3

Viimeinen läksy, maali häämöttää

a) Kirjastosta päivää. Tee ohjelma, joka käyttää ainakin kahta uutta kirjastoa. Jos ohjelmallasi on jokin käyttötarkoitus, se on mainiota. Muista ensin kokeilla kutakin kirjastoa erikseen. Kirjastoja löytyy GoByExample ja Go:n virallisesta dokumentaatiosta. Käytä jotain uutta kirjastoa, eli ei pelkästään rand, fmt, time eikä string.

b) Lähteet. Katso, että olet viitannut kaikissa tehtävävastauksissasi kaikkiin lähteisiin, joita olet käyttänyt. Kurssiin, tehtävänantoihin, käyttämääsi materiaaliin (GoByExample tms), muiden koodeihin, StackOverflown vastauksiin ja kaikkiin muihinkin lähteisiin.

c) Kaikki tai jotain. Valitse aihe tai pari vaihtoehtoa kurssin loppuprojektille. Palastele: mieti, miten voit ensin toteuttaa pienen, toimivan kokonaisuuden. Ja sen päälle vaihtoehtoja laajentaa.

d) Vapaaehtoinen, helppo ja suositeltava: Asenna Go omaan isäntäjärjestelmääsi. Senhän saa Linuxille, Windowsille ja Macille. https://golang.org/ Jos Windowsin virustorjuntaohjelmasi poistelee mielivaltaisesti tiedostoja, kerro, kuinka annoit itsellesi virustorjunnan asetuksista luvan laittaa binäärejä johonkin hakemistoon.

e) Vapaaehtoinen: Grep. Tee ohjelma, joka näyttää tekstitiedostosta vain rivit, joilla mainitaan hakusana. Kun ohjelmasi toimii ja haluat lisähaastetta, voit tehdä lisäominaisuuksia: case insensitive, regular expressions, rekursio. Jos kaipaat vielä lisähaastetta, voit kokeilla, toimiiko ohjelmasi isolla (yli 50 GB) tiedostoilla, esim. tietokantadumpeilla?

f) Vapaaehtoinen: Tee Tour of Go loppuun. Jos "Exercise"-kohdat ovat hankalia, voit hypätä niistä yli tai jättää ne viimeisiksi. Tätä d-kohtaa ei tarvitse raportoida.

Adminstrivia

Tämä sivu päivittyy.