Picture this: a group of new engineering Owls situate themselves pairwise at temporary desks arranged in our yoga room. With varying technical backgrounds, we ready ourselves for participation in two weeks of Scala & Akka immersion to acquire a certain level of fluency. After reading numerous books on the subject and completing Coursera’s Functional Programming Principles in Scala, what could a Scala & Akka Dev Factory offer us that we hadn’t already encountered?
As it turns out, the course offered more than just a great technical education. Our trainer brought to life the lecture notes, code samples, exercises, and group projects with both social learning practices as well as on-the-fly adjustment of the content in order to reinforce concepts in a really unique way. Some of these techniques included positive reinforcement from daily public code reviews, and pair programming with random partners who had varying skill levels and communication styles. Our daily input into the course also let us shape our classroom experience by driving the expansion of the course topics where we felt we needed it most. These shared learning experiences gave me and my cohort a kaleidoscopic insight into the course material.
Alejandro Lujan guided us to moments of clarity, kept us focused while highlighting important concepts, coached us through fixing malevolent bugs, and tamed unwieldy distributed system designs. He has a striking ability to customize his explanations to each learner, from high level design concepts down to the underlying compiler optimization and desugaring. No question we ever asked gave him pause!
Beyond Knowledge Acquisition
The first two days of the course we reviewed the fundamentals of the Scala language while we coded problem sets on our own. On Wednesday, it became clear that this would be no ordinary Professional Development course: our cohort was randomly organized into pair-sized teams to work on a small project for the rest of the week. At the end of each day, teams demoed their progress and received feedback from the class and from Coach Alejandro. In addition to integrating the course material into our skill sets, this review process sparked discussions about shared experiences and observations.
What impressed me about our group was everyone’s ability to accommodate differences in individual learning processes. We explored paired programming, division of subtasks and working individually while utilizing each person’s strengths. We had discussions about our progress during breaks. We reflected on improvements in our own learning process and helped our teammates to solidify their understanding of concepts.
Creating our Classroom
By observing other teams’ processes and their resulting outcomes at our end of day demos, teams often adjusted to try out new ways of working together. An element of passion about the technologies came into play here as well. If one team implemented an interesting piece of functionality, most if not all of the other teams implemented it the next day (and in some cases extending the functionality a step further). What was interesting here is that we as a group changed our learning environment in order to work effectively within pairs based on our observations of other teams.
A major challenge that created a huge learning opportunity was the synchronization of the tempo of programming within the pairs. We had junior engineers coding alongside senior engineers, as well as those who’d only been exposed to imperative programming working together with functional programming experts. Mentoring while learning concepts is challenging, but this balancing act kept us on our toes. We were able to keep a steady pace through the learning paths with the help of Alejandro, whose magical debugging skills helped guide us towards the intended learning goals of the course. Social reinforcement came from our end of the day demos, reviews, kudos, and valuable feedback and suggestions from our coach and cohort.
So, what did our team projects look like? The basic functionality was quite similar: it was the extra add-on features that varied based on the strengths of teams. We had some internal DSL wizardry from a team who utilized the DSL friendly features of Scala like implicits, higher-order functions, currying, and optional dots and parentheses. This team had mad emoji skills and took the meaning of implicits to a level previously unseen in our class. Another team with architecture strengths re-designed the assignment’s structure to make it more elegant. There was a team who created an efficient architecture for merging child node computations using a distributed worker pattern. My team implemented Akka Persistence functionality for recovery time optimization and compared event and command sourcing, snapshots, and journaling for reliable distributed systems.
After completing the course, my takeaway was immediately evident as we implemented our ideas into an in-progress Proof of Concept. Our course project work had helped us to gain a deeper understanding of Akka Clustering and Persistence that we were able to use in our evaluation. In a more general sense, we gained confidence in our skills and our ability to work together seamlessly. What was made obvious by the structure and flow of the course is that we practice continuous learning here as earnestly as continuous deployments. Our training goals and learning paths mirrored our work style, which is social by nature.
I’d like to be part of social experiential learning in a larger group setting. I predict that the kind of pedagogical rewards that we received from our BoldRadius course cultivate an enthusiasm for learning that’s contagious and will bubble up into other teams. A social learning exercise with a group of Owls working on a project who possess varied skill sets would likely generate creative solutions to interesting problems. I’d love to see the kind of innovation that comes from adjusting our educational environment together and to experience social learning growth as an organization.
Advice to the Next Cohort
So that you have a solid syntactic repertoire for the project work, practice coding directly in the Scala REPL. You will have limited time to complete the tasks. This time is better spent on focusing on new concepts and communicating with your project partner. As customary with the Flipped Classroom Model style of instruction, you are expected to come to class having read the course material ahead of time. Alejandro will send the slides to the cohort the week before class begins which gives everyone ample time to prepare.
For more fun REPL ideas, see the Stack Overflow Q&A on some hidden features of Scala!
A resounding “Thank You!” from the entire cohort to Hootsuite for the enriching experience!
An additional “Thank You!” to:
- Alejandro Lujan and BoldRadius for inspiring us with their Scala skills
- Noel Pullen for setting this up, his advice, enthusiasm, and attentiveness to our concerns
- Edd Steel for his thoughtful insights while helping to build this course with Alejandro
- My team for picking up the extra work while we were away training
- My cohort for allowing me to interview them about their experiences
- Hootsuite yogis for their patience with delayed sessions
- Hootsuite Facilities for arranging our classroom and working behind the scenes to keep everything running smoothly
About the Author
Jodi is a Software Engineer on the Platform Team at Hootsuite. When she’s not building Scala/Akka micro services, you can find her knitting or composing music. As an industry mentor, she helps to mentor women in FOWCS and UBC BCS Computer Science students in their academic careers and beyond. Follow Jodi on Twitter @jodispacek.