Leerdoel 1
Inleiding
Tijdens mijn stage leer ik hoe ik zo efficiënt mogelijk een nieuwe programmeertaal leer, hoe ik dit toe kan passen binnen m'n huidige bedrijf en hoe ik de opgedane kennis later ook toe kan passen.
Ik ga dit leerdoel aanpakken door te programmeren in Kotlin tijdens de projecten. Voordat ik deze nieuwe programmeertaal kan gaan gebruiken in projecten moet ik eerst kennis opdoen in de syntax van de taal. Daarna kan ik door het volgen van tutorials en online opdrachten al oefenen met het programmeren in de nieuwe taal, zodat ik beter voorbereid ben voor het project. Vervolgens ga ik de gemaakte opdrachten aanpassen en mijn kennis van structuren uit andere programmeertalen leren en toepassen in deze nieuwe taal. Ten slotte, loop ik alle gemaakte opdrachten door en ververs ik mijn kennis over Kotlin, zodat deze vers in mijn hoofd zit op het moment dat ik begin met het eerste project.
Het leerdoel is behaald als ik tijdens de projecten geprogrammeerd heb in Kotlin en de kennis die ik al bezit in andere talen zoals Java ook toe kan passen. Door een nieuwe taal te leren zoals Kotlin kan ik ervaring opdoen met het leren van en werken met andere programmeertalen, deze ervaring kan ik gebruiken om zowel andere talen te leren als deze talen toe te passen binnen andere bedrijven en projecten.
Ik bewijs het halen van dit leerdoel in mijn portfolio door screenshots te maken van code in Kotlin die ik geschreven heb en die draait in het project. Bij deze code zal ik een korte uitleg geven wat het doet. Daarnaast zal ik de materialen die ik gebruikt heb om Kotlin te leren toevoegen.
Toelichting op het bewijs
Als bewijs voor het beheersen van Kotlin heb ik een snippet van mijn Kotlin Code, die draait in het project, met een korte uitleg hoe het werkt toegevoegd. Ook zijn de materialen die ik gebruikt heb om Kotlin te leren toegevoegd en is welk proces ik gevolgd heb te zien.
Kotlin Code
RoutePlannerLogic.convertCalculatedRoutesToDetailedRoutes(sandbox, calculatedRoutes)
Deze methode is verantwoordelijk voor het converteren van de resultaten van GraphHopper, die gebruik maakt van de gesimplificeerde grafiek en dus ook gesimplificeerde lijnen heeft, naar gedetailleerde routes.Om dit te doen krijgt deze functie de volgende verantwoordelijkheden:
Regel Beschrijving 1. 6
Resultaten opslaan in de variabele. 2. 8
Een cache voor locaties naar gedetailleerde routes, om sneller gedetailleerde routes te verkrijgen. 3. 12,13
Het verkrijgen van de kruispunten voor berekende routes. 4. 16-24
Duplicates verwijderen op basis van of de route zonder kruispunten al eerder bestaat en kijken of deze routes valide zijn. 5. 27-37
Voor alle overgebleven routes de gedetailleerde routes verkrijgen. 6. 40
Gedetailleerde routes toevoegen aan alle routes zonder duplicates. 7. 43
Teruggeven van de resultaten. Deze functie heeft een hele belangrijke aansturende rol voor de routeplanner. Namelijk de resultaten van GraphHopper gereed maken voor het daadwerkelijk kunnen teruggeven en weergeven van de opgevraagde routes.
1 | /** Converts calculated routes to detailed routes and removes duplicates */
2 | private fun convertCalculatedRoutesToDetailedRoutes(
3 | sandbox: RiverScoutSandbox,
4 | calculatedRoutes: List<List<Pair<Pair<SimplifiedGraphObject, SimplifiedGraphObject>, List<Location>>>>
5 | ): List<List<Route>> {
6 | val allRoutes: MutableList<List<Route>> = mutableListOf()
7 |
8 | val locationsToDetailedRoutesMap: HashMap<Pair<Pair<Location, Location>, Boolean>, List<Pair<MutableList<SimplifiedGraphObject>, GraphNote>>> =
9 | hashMapOf()
10 |
11 | for (calculatedRoute in calculatedRoutes) {
12 | val junctionsFrom = calculatedRoute.map { it.first.first.toLocation().toCoords() }.distinct()
13 | val junctionsTo = calculatedRoute.map { it.first.second.toLocation().toCoords() }.distinct()
14 |
15 | // Remove duplicates by discarding the junctions for the check
16 | val modifiedRoutes = removeDuplicateRoutes(calculatedRoute) { (_, list) ->
17 | val indexFrom = list.count { it.toCoords() in junctionsFrom }
18 | val indexTo = list.count { it.toCoords() in junctionsTo }
19 | if (indexFrom < list.size && list.size - indexTo <= list.size) {
20 | list.subList(indexFrom, list.size - indexTo)
21 | } else {
22 | list
23 | }
24 | }.filter { RouteLogic.isValidRoute(it.second) }
25 |
26 | // Convert the remaining routes to detailed
27 | val routes: MutableList<Route> = mutableListOf()
28 | for ((nodes, route) in modifiedRoutes) {
29 | val res = RouteCreatorUtils.convertToDetailedRoutes(
30 | sandbox,
31 | locationsToDetailedRoutesMap,
32 | route,
33 | nodes.first,
34 | nodes.second
35 | )
36 | routes.addAll(res)
37 | }
38 |
39 | // Add to all routes and remove duplicates
40 | allRoutes.add(removeDuplicateRoutes(routes) { it.locations })
41 | }
42 |
43 | return allRoutes
44 | }
Materialen
Try Kotlin
Try Kotlin is een omgeving waar je letterlijk Kotlin kan uitproberen en leren. Dit kan aan de hand van verschillende voorbeelden en opdrachten, vanaf je eerste Hello, World!
programma naar gecompliceerdere onderwerpen waar de voordelen en mogelijkheden van Kotlin tot het licht komen.
De Try Kotlin omgeving is hier te vinden.
Eerste voorbeeld van een Hello, World!
programma
Kotlin Koans
Binnen Try Kotlin kan je ook 42 opdrachten maken waarin je een vraag of een stukje code krijgt. Dit stukje code kan zowel in Kotlin als in Java zijn opgesteld. Vervolgens geef je zelf een antwoord die gecontroleerd wordt met een stuk code in de vorm van een unit-test.
Een opdracht van Kotlin Koans
Google I/O
Naast het bekijken van voorbeelden en maken van opdrachten, heb ik ook de video's bekeken van de Google I/O events van 2017 en 2018. Hierin worden talks gehouden over Kotlin zelf en welke mogelijkheden deze programmeertaal heeft.
Google I/O 2017
Google I/O 2018
Experimenteren
Uiteindelijk is dan het moment daar, zelf gaan programmeren in Kotlin. Voordat ik dit toe wilde passen in het project, wilde ik eerst alle structuren en mogelijkheden uit Java weten te schrijven in Kotlin.
Om dit te doen heb ik verschillende onderdelen uit Java, zoals for
, while
en do-while
herschreven in Kotlin. Daarnaast heb ik ook andere mogelijkheden uit Kotlin, die niet in Java mogelijk zijn, nogmaals uitgetest door ermee te experimenteren.
Op het moment dat ik wist dat ik genoeg van Kotlin kende ben ik begonnen aan het project RiverScout.
Feedback
Dit leerdoel is tot stand gekomen door de de keuze van technology stack binnen Teqplay, namelijk om Kotlin te leren aangezien dit ook gebruikt wordt binnen Teqplay.
Mijn kennis en beheersing van Kotlin wordt ook bewezen door het stabiel draaien en testen van de applicatie, daarnaast is de kwaliteit van het project ten opzichte van de code standaarden op een niveau dat hoger dan de verwachting was.
Ten slotte is het systeem verder ontwikkeld ten opzichte van het oorspronkelijke idee, aangezien het in productie gebruikt kan worden.
Reflectie
Ik ben blij en trots dat ik een nieuwe programmeertaal heb kunnen leren en dit ook ben gaan beheersen. Ik kan verzekerd zeggen dat de applicatie die ontwikkeld is met Kotlin, daadwerklijk goed in elkaar zit en ik de taal erg goed beheers.
Persoonlijke groei
Ik heb dit leerdoel gekozen omdat ik op het moment dat ik begon met de stage bijna 5 jaar ervaring had in de programmeertaal Java. Teqplay gebruikt voor haar projecten naast deze programmeertaal ook de programmeertaal Kotlin, een programmeertaal die ik aan het begin van m'n stage nog niet beheersde. Teqplay gebruikt voor nieuwe projecten Kotlin om te programmeren, daarnaast is het een groeiende, populaire en opkomende taal die tevens ook ondersteund is door Google in het Android project. Het is dus niet alleen nuttig om deze nieuwe programmeertaal te leren voor mijn eigen ontwikkeling tijdens de stage, maar ik zal hier in de toekomst ook profijt van hebben. Zowel om mij beter aan te leren hoe ik het leren van een programmeertaal aan kan pakken, deze kennis later te kunnen gebruiken voor het leren van andere programmeertalen en deze taal beheersen om later toe te kunnen passen in het werkveld.
Om de programmeertaal Kotlin mijzelf eigen te maken ben ik begonnen met het maken van de opdrachten van 'Try Kotlin' om hiermee met de taal te oefenen. Hierdoor ben ik zowel de syntax gaan leren als wat de mogelijkheden zijn van de taal. Na deze opdrachten kon ik meer uitdagende opdrachten gaan doen, hiervoor heb ik gewerkt aan de opdrachten van 'Kotlin Koans'. Na het maken van deze opdrachten had ik bedacht om de video's van Google I/O te bekijken, ik wist namelijk dat Kotlin gebruikt kon worden voor Android, omdat Google hier ondersteuning voor bood. Vervolgens wist ik van zowel de opdrachten als de video's gecombineerd meer over de programmeertaal Kotlin en kon ik hiermee gaan experimenteren. Ik heb ermee geëxperimenteerd door structuren uit Java te leren schrijven in Kotlin, hierdoor wist ik hoe ik de vertaalslag kon maken tussen deze twee talen.
Uiteindelijk heb ik mijn kennis van Kotlin uitgebreid en dit toegepast tijdens het werken aan de routeplanner RiverScout. Na het krijgen en verwerken van de feedback van de code reviews heb ik meer inzicht gekregen in hoe Kotlin gebruikt kan worden, daarnaast heb ik gedurende de loop van de stage vaak teruggekeken naar oudere code die ik geschreven had om deze te verbeteren met de opgedane kennis over de taal. Op dit moment ben ik vloeiend geworden in het werken met Kotlin en kon dit aan het begin van m'n stage vrij vlot oppakken. Ik ben heel erg enthousiast over hoe de programmeertaal werkt en wat de mogelijkheden ermee zijn, zo enthousiast zelfs dat ik volgende projecten die ik voor mezelf ga maken ook zal schrijven in Kotlin.