Paul Bone

Mentoring

Since participating in Global Diversity CFP Day and participating in a few other community events I have had more contact with some junior developers, and some people who advocate for them. (Checkout LevelsConf a conference for junior developers this July in Melbourne.) And so I’ve heard mentoring advocated recently and noticed a growing number of people open to mentoring strangers on the internet! Which honestly still seems a little crazy for me.

I’ve also been recently made aware that I have some fairly unique and hard-won knowledge. Being hard-won it’s not easy for everyone to have had the opportunities that can help you gain this knowledge (I freely admit being lucky). Naturally this is part of the reason I blog and it’s also been a factor in deciding to begin live streaming some work on Plasma. Just because such knowledge was hard to earn doesn’t mean I should protect it and make it hard for others.

Acting as if some knowledge is only for blessed rockstar coders will can exclude anyone but the most arrogant from learning. Leading people to believe things such as "I can’t understand garbage collection (GC), I’m not smart enough." If people avoid learning something then they (without any intention) take on incorrect ideas instead such as "GC is slow" or "GC always pauses the program" or even "Reference counting is faster than GC" (all incorrect).

However I don’t believe I or anyone else actually have a duty to teach and share, it’s just a good idea for the community. But is it a good idea for the individual taking time out to mentor someone else?

Recent reflections

Yes.

A close friend of mine, let’s call her Hannah, has begun taking a programming course at University and learning her very first programming language, Java. Hannah is not as she would say "A tech person", but she does have a science background. As a tutor, I am supplementing what she’s learning in class and listening to her poetically expressed frustrations and answering a lot of questions, many of them with the answer "erm, not really", or "Sorta???".

Apart from one semester’s experience as a tutor in Uni, I have no teaching experience, so I could be off base here or ignoring some important factors. However my concern is that this particular course and many like it, cram too many concepts in such a short time, and often all at once.

Concepts in programming languages

Some examples of concepts for someone learning or using Java are:

  • Classes

  • files

  • Objects (why do they exist but classes don’t!?)

  • Variables

  • control flow (if, switch)

  • loops (for, while)

  • scopes (can’t see a variable outside the block it’s declared in)

  • Methods

  • parameters

  • pass-by-reference (things change sometimes, but not always assigning to a local variable doesn’t change something on the heap, but using a method or assigning to an array’s slot or variable in a class does!)

  • static / non-static

  • inheritance

  • has-a / is-a / talks-to / etc

  • public / protected / private

  • cohesion

  • coupling

  • identity / equality

  • interfaces

  • abstract classes

  • abstract methods

  • polymorphism / method lookup / final

  • const

  • co-variance and contra-variance (when you generics, collections and interfaces all together)

  • overloading

While these are the concepts for any Java student or working developer, and I may have forgotten a few, Hannah’s course has covered all but a few of these in 12 weeks (and I’m impressed by her progress!), She’s also been working on some other more general concepts like algorithms (insertion sort), pseudo-code and its use, UML, compilation vs interpretation, parsing, and "what is computer code, how does the computer know how to execute it?" (Java vs bytecode vs assembly vs machine code).

This is a lot to cover in 12 weeks, and my main concern is that it’s too many concepts in that time, just enough to get a 30,000ft view and then move on to the next concept. With very little opportunity for consolidating the knowledge that would help you really use it in practice. Furthermore most courses and languages require a student to master several concepts at once, Java’s hello world requires, classes, IO, functions, public, static methods etc. I have my doubts that any beginner will be able to take much away from this course, at least without external tuition.

It has made me realize just how many concepts Java exposes you to (straight away too!) and how many I take for granted. This is one reason why I don’t think Java is a good beginner’s language. Years ago, when the University of Melbourne switched from using C and Haskell as it’s first year languages to Python. I complained; I probably believed something that you needed to be thrown in the deep end so that those that didn’t drown could continue the course at a higher degree of rigor. I no-longer believe that. I also probably forgot that I had been programming since I was 10 or so, I honestly don’t remember, and programming in C since I was 13, so when it came to using a new language at Uni (for me Java was used in first year) I had already learnt many of the concepts. Of course rigor is important, but we could get so much more out of people willing to learn if we used a bit more empathy.

I think that a good beginner’s language has very few concepts, Python is a better choice than Java (although I’d prefer something with a type system), Python doesn’t have:

  • static / non-static

  • public / protected / private

  • interfaces

  • abstract classes

  • abstract methods

  • final

  • const

  • co-variance and contra-variance

It does have a few extra things, such as "quacks like a duck" rules.

Another benefit of Python is that you don’t need to expose students to concepts like classes right away.

This doesn’t mean that I want people who have only taken one semester’s Python class to write the application that processes my credit card number. But it does mean that such people will have an easier time next semester when they are exposed to more concepts, because they’ve already had time to understand something like parameter passing (as I did, before I studied Java in my undergraduate course).

Python isn’t a perfect choice, and a friend of mine suggested Lua, that may be a good choice but I don’t know Lua and can’t say.

One problem here is that people seek out courses that are going to teach them the languages they expect to use in industry. Why would someone choose a course teaching Pascal (a language written for teaching) when all the job ads ask for Java or C# experience? Particularly if they have no experience they don’t know how many or how few of the skills are transferable, or that learning Pascal/Python/etc for a 6-12 weeks and then switching to Java or C# will give them an advantage.

Another thought, and just ask a C developer, is that some languages are too complex, with too many concepts for any human being to ever master. Using these languages can be a source of constant surprise, When you use RAII classes to free resources and perform actions at the end of code blocks and then are surprised when the RAII code triggers a garbage collection (because this is the SpiderMonkey codebase, it has a GC) and fails to understand that the thing you were about to return from your function needs to be a GC root! and you can't see the problem because the RAII code is essentially invisible! (It happened to a friend of mine.) And this is not even a particularly C feature.

Empathy

Tutoring Hannah has been rewarding for me, I got to help my friend and feel good about it, but it’s more. Maybe it’s because we’re friends that it was easier for me to feel empathetic, so when Hannah asks something like: “what even is an object in java and how the eff do I use one?” - which is the title of our Ted talk where she flails and curses and I say "erm, not really" - that we work out which concept(s) Hannah is trying to learn right now (and she may not know!) This may depend on which concepts she already understands (or misunderstand). Being able to ask more questions and understand what Hannah was thinking helped me to know which things need practice, or explaining in a new way. Point is, without empathy I would not have been able to give the appropriate information for something like: “what even is an object in java and how the eff do I use one?”.

It almost goes without saying, but another important practice is to allow the student enough time and space to solve problems for themselves, not to swoop to the rescue and solve the problem for them, or impatiently tell them the answer. Allowing them to solve the problem for themself is how they will learn, and be equipped to solve a similar problem next time. Of course, this doesn’t mean that you don’t do anything, what would be the point of tuition? It’s okay to throw clues in, provide the right examples at the right moments which assist with consolidating the current concept.

Of course, please don’t become frustrated or lash out at the student, it’s not their fault if they don’t understand something yet, and if they’ve come to you, then they are trying to understand it.

Summary

I already knew many of the following things, but they were all reinforced by watching my friend deal with them and witnessing her expressions of frustration.

  • Software engineering is often taught badly, sometimes due to language choice (Java has far to many concepts), but maybe also due to expectations of the school or lecturer, whomever is setting the pace.

  • We need better learning languages, not attach any stigma to them.

  • We need a better curriculum, I have long and detailed thoughts about this that I’ll leave to another time.

  • Empathise with your junior developers, maybe this stuff came easy to you or you had already been exposed to programming before you started any formal course.

  • Tools like BlueJ just hide complexity, they don’t solve it, and make some things more tedious and painful.

I would recommend, particularly once you have say 10-15 years of experience, mentoring an absolute beginner to really get an appreciation of what it is like to learn this - because it’s easy to forget what it was like. Doubly so if you were initially self taught as I was. Maybe some of this knowledge and empathy you pick up from mentoring will change decisions you make when you build technology for the world.

What I can offer

I’m already attempting to blog about once a month, and I’m aiming my content at those who probably have about 5 years experience and are curious about programming language implementation (PLI). I’ve also started livestreaming, and I’m also aiming that at much the same audience. I’m also providing some description of my workflow in the livestream, because I’m aware that different workflows are interesting to a lot of people.

I pay attention to some topics on Quora and reddit, so see if there are opportunities to share what I know there, but I ignore a most basic questions that I know plenty of other people can answer. Likewise I’m less interested in mentoring beginners or topics outside of PLI, because I think PLI is rarer knowledge, I’d rather concentrate on sharing that.

I am interested in co-advising Ph.D. students in specific topics If you’re beginning a Ph.D. and want to use Mercury, Plasma or work on automatic parallelism, then let me know. Find a primary supervisor within your institution (I can’t do their duty, since they are in the university and have more experience with Ph.D. supervision), and then ask me if I’d like to be a second or third advisor.

I am also happy to receive questions about PLI topics, particularly if I’ve done work on them in the past, and I’m extra interested if I can share the answers on this blog so that more people can learn.

Acknowledgement

This article was approved by Hannah with her input. Hannah is a real person but this is not her real name. I would like to thank her for the opportunity to tutor her and working with me to write this article.