How am I trying to mentor software developers
A 10 minutes story written on Dec 2017 by Adrian B.G.
I see the “mentoring side” as a skill with whom I have a love/hate carousel relationship, it pushes me over the edge every week or so, forcing me to become a better software developer myself.
I think it goes something like this:
you have to learn something 3 times before you are able to explain it.
History 📰
You can skip this part if you want to jump directly to the point, this section is personal.
Soon after I got hired at my last job, I found out that the company was involved in a local Coder Dojo program for kids. Our CTO was in charge of the teaching part for a couple of months and we were the support. We were using Khan Academy JavaScript platform for kids with ages 9–16 to teach them basic programming while doing cool mini-games from scratch.
CoderDojo - Enabling young people worldwide to create and explore technology together
I have also made a few workshops for the non-technical colleagues that wanted to learn more about programming. No one pursued the field further but I hope they all learned something, at least that programming is hard.
I’m not a kid person, I usually hate kids (except my own ofc), but I liked the experience I have with them, as a teacher and after. I did some research, my wife and I, and we (as in me and my wife) gathered all our nephews and started our own private dojo as a summer school. I developed over 7 lessons starting with the basic technologies behind a computer (the components, hardware and software), the IT and in the end we reached the programming lessons. We used Scratch for a couple of lessons and made some cool projects.
Scratch - Imagine, Program, Share
The goal wasn’t to make software engineers out of them, but rather literate them with basic technical knowledge.
Everyone should know how things work, and most of “things” will (already) work on software.
After these lessons life took us in separate ways, meanwhile I had 2 kids and the mentees were busy with other hobbies. Similar to the “Return of the Jedi” story, this year, the “flame of teaching” was lightened again.
Lately, I managed to find some extra free time and I started going to Meetups. As a result I made some new friends, some of which are junior developers. I recognized the desire to learn in a few of them so I offered my help and they accepted.
At the same time a nephew (that attended my “summer dojo”) and a friend of his got to high school and approached me about their desire to learn to programme. They said that their teacher failed them (as expected) and skipped the computer science lessons and jumped directly to coding C++ problems. I made a few tutoring lessons for the basic theory, how hardware and software works, why do we build programs in order to get them up to speed. We will continue with extra programming sessions.
Coincidence or not, other friends and colleagues found some free time and wanted to start learning to programme, to do their own websites or automate actions at their day job.
By reaching my antennas and trying to help people on different programming platforms/forums, other students found my answers helpful and contacted me for further assistance.
What I am trying to say is that if you want to do something, do it, and others will follow.
What exactly am I doing with my mentees? 👣
Good question, I haven’t thought of this until I needed to write this article, so here are a couple of things:
- I am available, I’ve opened a few communication channels and respond when they need any help
- I am sending them resources, based on their skills, levels and needs. I am watching a ton of videos, reading blogs and articles, and sometimes I find something that may be useful for one of them
- Code reviews. I can teach them new concepts, patterns and coding techniques on the code they wrote, because they are familiar with the problem they will appreciate and have a better understanding of the solution.
- Books, courses and articles. At this level they need to form a good foundation, this is the time to introduce them to best practices, Gang of Four and other famous books.
- I often send them math/logic puzzles, games and problems. These brain exercises are good especially for the mentees that haven’t finished a math/CS high-school or university.
- Live coding sessions, I am sharing my screen when I’m free and code open source pet projects. I explain to them how I work, what I am doing and why at each step. Here I can introduce them to a new IDE, git aliases, refactoring techniques …
- I am listening to their problems and technical decisions they made at work, after that I’m trying to explain what other alternative solutions exist, their pro and cons. Here I usually explain technologies, languages and frameworks, programming paradigms or some basic concepts they may have missed …
- I talk often to them and help them in choosing/laying out a career path. If they want to stay in this domain for the next 5–10yrs there should be goal and work on it. I try to make a plan with them for a set of core skills (people skills, tech skills, knowledge, etc) and how/when they should expand further to meet their goal.
- The opposite of the previous point, I am trying to keep their focus contained. It is very easy to lose your focus in the web ecosystem, every week something new appears, you have to stick to the plan, meaning they should have a “strong core”, be good at something (eg: Java server apps, or CSS), and learn adjacent stuff at the same time.
- I am trying not to ruin their dreams. If they want to build the next Google, as an experienced developer, I have a grasp of what it implies, from a business and technical point of view. The first instinct I have is to say “no, stop, focus on something you can REALLY do”. I try not to listen to the instinct, as I think that perhaps, I should let them dream, maybe they succeed or hit the walls that I hit when I was their age. A new fresh/out of the box view on problems often leads to inventions.
- Meetups. Every now and then I organize a small meetup, met with all my mentees face to face or via a call. I try to choose a more general subject, so all the attendees could learn something new, but being independent of their technical level, the last 2 sessions were: networks/DNS (domain name servers) and Random.
- I am always using a visual medium to explain things. If we do not have a whiteboard a notebook should do, it’s easier for them to understand if we use more ways to communicate the same thing (audio and video).
- I am building open source projects with them. I can cover the side of the project that has new technologies (for me), and the mentee will work with technologies that I already know (but are new to him). This way we can both learn things, and still work together.
- Did I miss something? Let me know in the comments if you have any suggestions.
Difficult things 💪
I’m trying not to be biased, my answers are usually followed by a context explanation and how I reached this conclusion, so they can trace it back and choose another path if they wanted it. Most of the questions have grey answers, there are no absolute truths.
For the mentees that already have a job, I often find out that they do not know about a basic concept, that I find “basic”. I mean concepts like “caching” seems so trivial for me that I do not even think that my students do not know about it, especially after they made some commercial websites. But then again, in my country at least, is a common practice to hire junior devs and put them in charge of everything (architecture, development, etc) without a senior in a team, by non-tech companies. As often as they get they become seniors (by title) and still skip a few basic concepts along the way, especially if they come from a non-tech background. The idea is to ask them every now and again: do you know what X is, right?
It’s hard to explain new concepts, that do not have a direct parallel in the physical world. Jumping a few lessons is bad for them, for example I always follow this order: “we reduce everything to numbers -> numbers can be stored in binary, decimal and hex -> how the RAM works -> what is a variable -> what is a pointer”.
Going beyond my limits requires time. I can only teach 60% of my current computer science knowledge, because in order to explain something to a non-technical person/junior you have to have deep knowledge of it. Ofc I sometime cheat and just read them articles, but I cannot explain how Hadoop works for example because I haven’t worked with it. When I know that I have to teach a specific subject, I need at least 4–5h of research forehand, to gather all the data, put the concepts in a logical order and reduce them to simple explanations, preferable with images and charts.
Limit their time —I want from my mentees to learn a LOT, in a short time, so they can advance more rapidly, but their time is limited, also it is a not a good thing to learn many things without practicing, because we will forget. I find it hard to “pace my resource streams”, I could send them 20 books and 2h videos every day, and ask them to watch and implement stuff, but they usually only have 1h per day, for example to learn.
Learning new technologies and catching up with the history, at the same time. For some explanations, I need to go way back to Turing, so I need to have my facts right before giving a straight answer. A few common questions that put me into difficulty were:
- why do computers work nowadays still in binary
- we already have a “true AI”? and if not why is it so hard to make one
- what are other data structures/databases (besides text files and spreadsheets). The non-technical people have problems imagining new concepts, but after a few examples we are all good (graphs, trees, linked lists …)
Inspirations 🤔
I am a student myself, and I observed great teachers like Carl Sagan and Neil DeGrasse Tyson, MIT online classes, udacity courses and others, and realized I could never be like that in 1000yrs. I’m not literate, my vocabulary is limited and I don’t have a lot of patience, but I’m working on these problems.
The simplest rule that I learned and had a great impact on my teaching skills ( and is one thing where most of the schools failed) is to explain first the “Why” and then the “how/what/when”. Why do we need databases, why do we need machine learning or variables and so on.
Courses not tutors. I hate how normal school teach: the teacher puts material in the student’s head, and then send him away. I am trying to be there when they need my help, but is their task, responsibility to learn, grow and Want more info, this leads me to my next point:
Curiosity, I try to trigger their curiosity on anything, I get them intrigued by something they may interest them and leave them hanging: “go and find out on yourself”.
I try to work with their interests and hobbies. Do you like soccer? Learn to programme by building a soccer related-project.
New students 👩🎓
If you are looking for a mentor, you can contact me. The fact that you have read this article says something about you, but first you have to meet the following criteria:
- you need to love, care and have a passion for engineering/computer science
- you have to know fewer things than me, if not contact me because I need a mentor too
- to have a desire to learn. One of my mentees keeps saying: “So many things, so little time 😢😢“.