.D

Dylan van Heugten

Self-Assessment

Hieronder zie je mijn self-assessment aan de hand van mijn ingeleverde projecten.

Vak Onderdeel Beoordeling
SCO visie beginnend
conceptueel denken beginnend
UXU storytelling beginnend
user tests geoefend
DED programmeren geoefend
audiovisueel ontwerp geoefend
hardware geoefend
OND onderzoekende houding geoefend
onderzoekscyclus geoefend

BW Ventures

programmeren . conceptueel denken . hardware

Voor de proftaak van semester 3 zijn we met onze groep een platform gaan maken voor Blue Whale Ventures, dit platform zou een bestaand Excel-bestand gaan vervangen. Mijn hoofdtaak binnen dit project was het realiseren van een dedicated iOS applicatie. (Dus geen responsive web-app.)

De applicatie zou ontwikkeld worden in Swift 3, een taal waar ik nog nooit mee gewerkt had. Het was voor mij dan ook een hele uitdagen om zonder kennis een iOS applicatie te ontwikkelen.

Sites waar ik veel aan gehad heb zijn Google Firebase, Ray Wanderlich en Hacking With Swift. Door deze sites te koppelen aan een ruim scala van YouTube tutorials (private playlist) heb ik de applicatie kunnen ontwikkelen tot hoe die nu is. (GitHub)

BWVentures iOS applicatie.

Van inloggen naar een experiment overview

Het inloggen

        
          Auth.auth().signIn(withEmail: email, password: password) {(user, error) in
            if error == nil {
              // Print to console
              let db = Firestore.firestore()
              let docRef = db.collection("users").document((user?.uid)!)
              docRef.getDocument {(document, error) in 
                if let document = document {
                  // Create instance of UserDefaults
                  let userDef = UserDefaults.standard
                  // Storing values
                  userDef.set(document.data()["Age"], forKey: "Age")
                  userDef.set(document.data()["Email"], forKey: "Email")
                  userDef.set(document.data()["Gender"], forKey: "Gender")
                  userDef.set(document.data()["Name"], forKey: "Name")
                  userDef.set(document.data()["Phone"], forKey: "Phone")
                  userDef.set(document.data()["Surname"], forKey: "Surname")
                  userDef.set(document.data()["uid"], forKey: "uid")
                  userDef.set(document.data()["ventureID"], forKey: "ventureID")
                } else {
                  print("Document does not exist")
                }
              }
              self.present(nextViewController, animated: true, completion: nil)
            } else {
              // Tell user that there was an error
              let alertController = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
              let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
              alertController.addAction(defaultAction)
              self.present(alertController, animated: true, completion: nil)
            }
          }
        
      

Het inlog-proces

De code in het blok hierboven laat het volledige inlog-proces zien. Inloggen gebeurt via Google Authentication. Hierbij krijg je een uid (User ID) teruggestuurd en misschien een error.

Allereerst kijk ik of error leeg is. Zo ja, dan wordt de connectie met de database gemaakt en kunnen de persoonsgegevens worden opgehaald. Deze worden lokaal opgeslagen zodat er de volgende keer niet hoeft te worden ingelogd.

        
          override func viewWillAppear(_ animated: bool) {
            Auth.auth().addStateDidChangeListener {(auth, error) in
              if user != nil {
                let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let nextViewController = storyboard.initiateViewController(withIdentifier: "tabBarID")
                self.present(nextViewController, animated: true, completion: nil)
              }
            }
          }
        
      

Automatisch inloggen bij opstart

Hier kwam er echter een obstakel naar voren. Ik had geen idee hoe ik deze data lokaal moest opslaan. Als je een webapplicatie zou ontwikkelen kun je simpelweg een session gebruiken om dit voor elkaar te krijgen. In Android kun je gebruik maken van de SharedPreferences-class, maar bij iOS wist ik niet hoe het heette.

Na veel zoeken kwam ik er achter dat je in iOS een class hebt genaamd UserDefaults. Hier kon ik alle persoonsgegevens in opslaan, waaronder de belangrijkste, het ventureID. Met het ventureID is namelijk alle overige data op te halen, van Experiments en Questions tot en met People.

Het ophalen van experimenten

        
          // Get all experiments
          func getExperiments() {
          
            // Get user data and ventureID
            let userDef = UserDefaults.standard
            let ventureid = userDef.string(forKey: "ventureID")
            
            // Build database connection
            let docRef = db.collection("Startups").document(ventureid!).collection("Experiments").order(by: "DateCreated", descending: true)
            // Collect experiments
            docRef.getDocuments() { (snapshot, error) in
              if error != nil {
                // Show possible error
                print("Error getting documents: \(error)")
              } else {
                // Create experiment with the Experiment-class
                for experiment in (snapshot!.documents) {
                  let exp = Experiment()
                  exp.customerLocation = experiment.data()["CustomerLocation"] as! String?
                  exp.customerSegment = experiment.data()["CustomerSegment"] as! String?
                  exp.dateCreated = experiment.data()["DateCreated"] as! Date?
                  exp.documentID = experiment.documentID as String?
                  exp.experimentName = experiment.data()["ExperimentName"] as! String?
                  exp.experimentNumber = experiment.data()["ExperimentNumber"] as! Int?
                  exp.experimentSubtitle = experiment.data()["ExperimentSubtitle"] as! String?
                  exp.failCondition = experiment.data()["FailCondition"] as! String?
                  exp.learningGoal = experiment.data()["LearningGoal"] as! String?
                  exp.numberInterviews = experiment.data()["NumberInterviews"] as! Int?
                  exp.problemHypothesis = experiment.data()["ProblemHypothesis"] as! String?
                  exp.stopCondition = experiment.data()["StopCondition"] as! String?
                  
                  // Add experiment to the experiments list
                  self.experimentList.append(exp)
                  
                  // Reload TableView
                  DispatchQueue.main.async {
                    self.experimentsTableView.reloadData()
                  }
                }
              }
            }
          }
          
          // Experiment class in anoter file
          class Experiment: NSObject {
            var customerLocation: String?
            var customerSegment: String?
            var dateCreated: Date?
            var documentID: String?
            var experimentName: String?
            var experimentNumber: Int?
            var experimentSubtitle: String?
            var failCondition: String?
            var learningGoal: String?
            var numberInterviews: Int?
            var problemHypothesis: String?
            var stopCondition: String?
          }
        
      

Het ophalen van alle experimenten

Experiment overzicht vullen

        
          // Custom cell for Experiment tableview
          class ExperimentCell: UITableViewCell {
            @IBOutlet weak var experimentNumberLabel: UILabel!
            @IBOutlet weak var experimentNumber: UIView!
            @IBOutlet weak var experimentOptions: UIImageView?
            @IBOutlet weak var experimentTitle: UILabel!
            @IBOutlet weak var experimentDescription: UILabel!
          }
          
          // Creating the tableview
          func numberOfSections(in tableView: UITableView) -> Int {
            return 1
          }
          
          func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return experimentList.count
          }
          
          func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            // Create tableview cell from custom cell
            let cell = tableView.dequeueReusableCell(withIdentifier: "ExperimentCellID", for: indexPath) as! ExperimentCell
            
            // Cell styling
            cell.selectionStyle = .none
            cell.experimentNumber.layer.cornerRadius = 25
            let number = experimentList[indexPath.row].experimentNumber
            cell.experimentNumberLabel.text = String(number!)
            cell.experimentTitle.text = experimentList[indexPath.row].experimentName
            cell.experimentDescription.text = experimentList[indexPath.row].experimentSubtitle
            
            // Change label background color
            if experimentList.count == experimentList[indexPath.row].experimentNumber {
              cell.experimentNumber.backgroundColor = numberBlue
            }
            
            // Return the custom cell
            return cell
          }
        
      

De benodigde code voor het creëren van het experimenten overzicht
Het laatste experiment krijgt een blauwe achtergrond aangezien dit het huidige experiment is

Data meesturen naar volgende scherm

Van Experimenten naar een enkel Experiment

In de video hierboven zie je hoe je van het Experimenten overzicht naar een enkel Experiment gaat. Deze overgang wordt gedaan met een segue in iOS. Het was voor mij een hele klus om data door te sturen naar het volgende scherm met deze segue. Uiteindelijk is het mij gelukt met behulp van de onderstaande code. Je kan namelijk variabelen uit de volgende view al aanroepen tijdens de prepare(segue)

        
          // Check which row is selected
          func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            selectedExperiment = experimentList[indexPath.row].documentID
            self.performSegue(withIdentifier: "toExperimentTabBar", sender: self)
          }
        
          // Set 'selectedExperiment' as destination 'experimentID'
          override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "toExperimentTabBar" {
              let tabBarC: UITabBarController = segue.destination as! UITabBarController
              let desView: SingleExperimentViewController = tabBarC.viewcontrollers!.first as! SingleExperimentViewController
              desView.experimentId = selectedExperiment
            }
          }
        
      

Zelfreflectie

Terugkijkend op het hele Blue Whale Project zie ik dat ik ontzettend veel geleerd heb. Het ontwikkelen van een iOS applicatie zonder ook maar enige kennis te hebben van de taal en ontwikkelomgeving was een moeilijke en erg ambitieuze klus.

De code die ik geschreven heb zal zeker niet optimaal zijn. Echter ben ik er wel van overtuigd dat als ik meer tijd zou hebben voor dit project dat ik deze code wel zou kunnen optimaliseren.

Verder ging ook het samenwerken met de rest van de groep is goed. Dit komt vooral omdat ieder zijn eigen taak had binnen dit project. Maar omdat iedereen een brede kennis heeft konden we elkaar ook goed bekritiseren op het werk.

Dummy Programmeertaal

storytelling . user tests . onderzoekende houding . onderzoekscyclus

Het probleem: Er is geen programmeertaal met een lage instap voor 'dummies'.
Mijn oplossing: Het bedenken van een programmeertaal-dialect.
Het doel: Mensen op jonge leeftijd meer stimuleren om te programmeren.

Voordat ik wild ga beginnen om een nieuwe taal te ontwikkelen, ga ik eerst een beetje vooronderzoek doen.

Zo wil ik weten hoeveel programmeertalen er zijn, of er talen bij zitten die een soortgelijke insteek hebben als mijn project en als laatste wil ik weten welke talen het makkelijkste te leren zijn.

Hoeveel programmeertalen zijn er?

Wat ik vooraf al weet is dat er ontzettend veel talen zijn. Met een snelle zoekopdracht van 'List of all programming languages' krijg je lange lijsten van namen.

Op Wikipedia krijg je maarliefst een lijst van 714 programmeertalen. Hierbij geven ze aan dat het een lijst is van noemenswaardige talen, kijkend naar talen die in gebruik zijn en historische talen. De programmeertalen die ze niet meenemen zijn dialecten van BASIC, esoterische talen en markup talen.

99 Bottles of Beer vernoemd 1500 programmeertalen. Ruim het dubbele van Wikipedia. En laat daarbij ook zien hoe deze talen werken aan de hand van een uitgebreid "Hello world!" programma.

99 Bottles of Beer

'Hello world!' programma in C

Overige zoekresultaten laten eigenlijk maar een handjevol van programeertalen zien.

Kortom, het aantal programmeertalen is niet precies te benoemen. Mijn mening is wel dat je door de bomen het bos niet meer ziet. Hierdoor komt er een nieuwe vraag bij mij op.

Wat zijn de meest gebruikte programmeertalen anno 2017?

Uit een artikel van Stackify blijkt dat JavaScript de meest populaire taal is. Op GitHub dan wel. Stackify heeft namelijk gekeken naar het aantal pushes wat gedaan is op GitHub.

Stackify - Most used programming languages

Overzicht van meest gepushte talen op GitHub

Ze kwamen er zelf al achter dat een oudere taal uiteraard meer pushes heeft dan een nieuwere taal. Daarom hebben ze ook gekeken naar de meest actieve repositories. Hierbij zie je echter een vrij gelijk overzicht van talen.

Stackify - Languages with the most active repositories in GitHub

Overzicht van meest actieve repositories op GitHub

De top 5 zou er dan als volgt uitzien:

  1. JavaScript
  2. Java
  3. Python
  4. PHP
  5. Ruby
CSS heb ik weggelaten aangezien dit geen programmeertaal is maar een markup taal.

Het artikel van Stackify geeft een mooi overzicht van een enkel platform, maar dat wilt dus niet zeggen dat het overal zo is. Gelukkig zag ik ook een artikel van IEEE Spectrum.

IEEE Spectrum maakt sinds 2014 elk jaar een overzicht van populairste talen. Hierbij maken ze gebruik van 12 bronnen op 10 verschillende websites.

IEEE Spectrum - Top 10 of 2017

Top 10 van 2017

Zoals je kan zien komt er uit het onderzoek van IEEE Spectrum een ander resultaat dan uit dat van Stackify. Aangezien IEEE Spectrum een breder onderzoek heeft gedaan naar deze talen beschouw ik deze als volledig.

Zijn er vergelijkbare beginnerstalen?

Een taal die speciaal ontworpen is om mensen snel te leren programmeren is BASIC. En hoewel deze taal ontworpen is voor beginners, en ook zeker effectief was, zijn er nu nieuwe methoden gekomen om mensen te leren programmeren.

Zo wordt er tegenwoordig gebruik gemaakt van block-based drag-and-drop programma's gericht op de meest leergierige personen, kinderen. Kinderen leren hierbij door middel van het slepen van blokken een programma te schrijven.

Drag-and-drop coding

Voorbeeld van block-based coding

Er zijn dus nog geen talen/dialecten zoals ik die voor ogen heb. Dit geeft mij reden genoeg om mijn onderzoek door te zetten.

Welke talen zijn het makkelijkst te leren?

Deze vraag heeft eigenlijk geen concreet antwoord. Het antwoord op deze vraag zal altijd een mening zijn omdat ieder persoon anders leert.

Voor mijn onderzoek gebruik ik een overzicht van verschillende websites die een lijst hebben gemaakt hiervoor. In de tabel hieronder laat ik van 6 sites hun top 5 zien.

Techrepublic MakeUseOf LifeHacker Fossbytes CodeMentor TechWorm
Python JavaScript Java Python JavaScript Python
JavaScript Ruby Ruby Ruby Ruby Ruby
PHP Python Python Java Python JavaScript
Java Java C / C++ C / C++ PHP Java
R C / C++ JavaScript JavaScript Java C / C++

Top 3:
1. - 3.  Python
1. - 3.  JavaScript
1. - 3.  Java

Het valt op dat vrijwel alle websites het erover eens zijn dat dit de makkelijkste drie talen zijn om te leren. Om een taal te kiezen voor mijn dialect ga ik over op persoonlijke interesse. Van deze drie ben ik zelf het meest bekend met JavaScript, naar mijn mening is dit ook de belangrijkste voor webdesign/development.

User tests

Question Description
General Questions
Do you have any programming experience?
If so, which languages do you know?
If not, are you interested in learning a programming language?
If so, in which field would you want to apply your newly learned knowledge?
If not, what is the main reason you do not want to learn how to program?
In-depth Questions
Answers can be words, abbreviations and/or symbols.
1. How would you declare a value? A value must first be declared to be used later on in your code.
2. Should there be a difference between text-values and numeric-values? Do text-values and numeric-values be declared differently?
2.a. How would you declare a text-value? Which word, abbreviation or symbol would you use for text?
2.b. How would you declare a numeric-value? Which word, abbreviation or symbol would you use for numbers?
3. Which word would you use to execute a piece of code if X-value is equal to Y-value? E.g.: If X-value is the same as Y-value, do this.
4. Which word would you use to execute a piece of code if X-value is not equal to Y-value? E.g.: If X-value is not the same as Y-value, do this.
5. Which word would you use to execute a piece of code for a certain amount of times? E.g.: As lons as X-value is smaller or equal to Y-value, do this.
6. Which word would you use to execute code as long as X-value is true? E.g.: As long as X-value is true, do this.
7. Which word would you use to show a value for debugging purposes? E.g.: You can log something to the console when something happens.
8. Which word would you use to show a popup-window? E.g.: To show a window asking if the user really wants to delete something.

De vragenlijst heb ik gedeeld via Facebook. Echter heb ik in een week tijd maar 4 reacties gekregen hierop. Mijn onderzoek is dus mislukt.

Gelukkig kreeg ik van sommigen te horen dat ze er niks van snapten. Het zou dus zo kunnen zijn dat als ik betere vragen geformuleerd zou hebben er meer reacties zouden komen.

The Beauty That is 's-Hertogenbosch

audiovisueel ontwerp . user tests

Het idee: De mooie plekken van 's-Hertogenbosch laten zien aan de hand van een cinematic video.
Het doel: Een goed en aantrekkelijk beeld van Den Bosch te laten zien en mensen naar de stad toe te trekken.

Lijst van (mogelijke) film locaties:

Moerputten

De Moerputten

Engelermeer

Het Engelermeer

Sint Janskathedraal

De Sint Janskathedraal

Graffiti steegje

Het graffiti steegje

Wegens het tijdsschema kan ik helaas niet de exacte shots maken die ik wil. De meeste shots zouden aantrekkelijker zijn in de zomertijden. De video zal echter zo geëdit worden met de gedachten dat shots kunnen nagemaakt worden in de zomer.

User tests

Resultaten: Google Spreadsheet

Om te kijken of ik mijn doel had bereikt met deze video had ik weer een enquête gemaakt. Ook deze heb ik verspreid via Facebook en heb maarliefst 65 reacties gekregen. Hierbij heb ik voor Facebook gekozen om in een korte tijd zoveel mogelijk reacties te krijgen. Plus, ik wilde voor deze enquête zoveel mogelijk reacties van mensen uit verschillende landen krijgen.

Van alle 65 reageerders zijn er maarliefst 47 al eens in Den Bosch geweest. De meesten hiervan kwamen voor het shoppen, voor een city-trip of gingen op bezoek bij familie. Wat bij al deze 47 mensen overeen kwam is dat ze 's-Hertogenbosch zien als een erg mooie en gezellige stad.

Van de overige 18 is de meest voorkomende reden dat het er nog niet van gekomen is om naar Den Bosch toe te komen. Ook deze mensen heb ik gevraagd of ze al een indruk hebben van Den Bosch, misschien kan deze namelijk verbeterd worden door mijn video.

Uiteraard kwamen er een aantal reacties dat ze het nog niet weten. Anderen zeggen gehoord te hebben dat het een mooie stad is waar goed gewinkeld kan worden.

Na deze vragen heb ik de video laten zien en gevraagd of hun indruk van Den Bosch veranderd is. Hierbij hoop ik het beeld van Den Bosch te verbeteren bij degene die nog nooit in Den Bosch is geweest.

Bij 50% van deze mensen is het beeld van 's-Hertogenbosch verbeterd. Tussen de overige 50% zat ook een enkele internet trol die alleen negatieve antwoorden gaf.

Maar! De vraag waar het uiteindelijk om ging bij mij, willen deze mensen wel naar 's-Hertogenbosch toe komen? 10 Mensen zeiden 'ja'. 7 Mensen zeiden 'misschien'. En maar 1 iemand zei 'nee'.

Kortom, ik vind dat mijn enquête én video geslaagd zijn.

Reflectie

Als laatste heb ik alle respondenten nog gevraagd om 3 vragen te beantwoorden die mij persoonlijk kunnen helpen ontwikkelen.

Als eerste vroeg ik wat ze van de video vonden. Alle reacties (behalve 1) waren lovend. Een enkeling had nog te melden dat ze de Bosche Bollen mistte in de video. Een ander voegde er nog aan toe dat de muziek iets vrolijker mocht zijn. En iemand vond het allemaal te langzaam gaan.

Daarna vroeg ik welk gevoel ze kregen bij het zien van het filmpje. Hierbij kwamen vooral de antwoorden als rust, warmte en vrede naar voren. Iemand zei ook dat de muziek het hele filmpje mysterieus maakte. Ook deze antwoorden waren waar ik op gehoopt had.

Als allerlaatst vroeg ik de mensen nog wat ze van de gestelde vragen vonden. Aangezien mijn vorige enquête hier ook op stuk liep was ik hier benieuw naar. 'Goed', 'duidelijk', 'normale vragen'. Tussen deze antwoorden kwam ik ook een paar opmerkelijke maar vooral fijne reacties tegen.
The questions seemed appropriate for the goal of the survey, which I assume was to introduce or reintroduce people to 's-Hertogenbosch. Goed om indruk te krijgen over hoe er over 's-Hertogenbosch gedacht wordt. Good questions, but maybe you could add the following question: What did you enjoy the most during your visit to 's-Hertogenbosch? Echter, de meest hartverwarmende reactie die ik tegen kwam was deze:
De gedachte ben ik nog niet uit, of het nou een schoolproject of een reclame stunt over 's-Hertogenbosch is. Deze persoon vond mijn video dusdanig goed dat er getwijfeld werd of het een schoolproject was.

Het risico

Bij deze enquête ben ik ervan uitgegaan dat mensen de vragen naar alle eerlijkheid hebben ingevuld. Echter, aangezien de enquête verspreid is via Facebook, bestaat de kans dat dit niet zo is. De kans is er dat respondenten niet 100% eerlijk zullen zijn omdat ze een enquête in hebben gevuld die gedeeld is door een bekende.

Om dit tegen te gaan heb ik nog getwijfeld om de straat op te gaan om willekeurige mensen aan te spreken. Doordat zij mij niet kennen, zijn ze eerder geneigd om de waarheid te zeggen.