Mentoring #8: Former Apprentice

Intro

A few years back, I was assigned to mentor one of the Software Developer Apprentices and wrote about him in a series, the last one being Mentoring #7. There, I mentioned that our manager, Colin, was supposed to be setting him challenges (with the aim of sacking him) or finding him some kind of alternative role, possibly as a Software Tester.

The Apprentice turned that idea down, but I thought it would be a good career move if he went for it, because he didn’t seem to have the problem-solving skills required to be a developer. I was increasingly thinking he was one of those people that is “all talk and no action”.

So I’ll go through a few events that’s happened since then.

Colin’s Kanban

I always thought Colin was a bit disorganised, or he’d often come up with ideas then quickly abandon them. When we hired some new developers, Colin created a Kanban board with Tasks that they need to complete for their induction. He said The Apprentice needed to do it as well to ensure we had trained him adequately. The theory was that if the new starters start writing code after completing our training, and The Apprentice doesn’t; then it’s evidence that HR will require to sack him.

After a month, I checked the Kanban board and there was no progress.

Me  15:36
Remember the new starter training programme?

The Apprentice  16:15
What do you mean remember? 
This is my programme, although I'm not exactly working on it like that

Me  16:28
nothing has moved on the board for weeks

The Apprentice  16:30
I don't get your point as we haven't been asked to move anything on the board etc. Maybe it's just for managers to plan etc

Me  16:38
It's a kanban board. It's supposed to be what you are currently doing and what you have left.
I haven't heard a peep out of those new starters

The Apprentice  16:40
I haven't received any such instructions and am doing the tasks I have been asked to do. But I will speak to Colin now that you mention it cos I probably am supposed to be doing that.

So Colin had basically abandoned it, but then there’s no determination to impress from The Apprentice. He is just chilling away without a care. He could have easily provided evidence he had completed everything and impressed Colin.

LibreOffice Config

My Apprentice picked up a bug where he needed to switch the configuration from MS Word to LibreOffice. I told him to configure LibreOffice in Configuration Manager. He asks if it is a feature in the main program. I tell him it isn’t; Configuration Manager is a separate configuration tool.I want him to try and work independently so I need to give him generic advice for the future. To try and work out how to enable features in our software, I tell him that in general you can check:

  1. the independent Configuration Manager tool (newer features are most likely here), 

  2. Organisation Configuration in the main software,

  3. then the modules themselves.

For point 3, one example I gave is that the Users module has its own Configuration screen. 30 mins later he says

I checked User Config and I can’t see an option for LibreOffice“. 

Apprentice

Before I gave him the generic advice, I told him it was in Configuration Manager. Then when I gave him the generic advice, I listed Configuration Manager first. Why didn’t he check them in the order I said? He either doesn’t pay attention or just comes across as trolling by slowly doing the wrong thing.

Oblivious

We had some mandatory Security Training presented remotely from a third-party, which started at 9:00 and lasted half the day. It was 12:45

“Is this Security training something everyone should attend?

Apprentice

The Set Up

When he first joined, I showed him how to check out our code repository, how to build it, where to get the databases from, and we rewrote the New Starter documentation together. He had replaced his laptop recently, so he had to set it up again. He asked me a question about how to access a database backup server, so I asked him why? He mentioned he wanted a particular database from the server. So I asked him “why?” – if he is following the instructions we wrote; it doesn’t say to do that. He claimed he was following the instructions.

“I’m honestly on the instructions, I can’t see what you are referring to.”

Apprentice

The funny thing was, I didn’t have the instructions open but I remember what it said. So I open them, click the Database section in the Table of Contents, then copy the instructions into the chat that say something along the lines of “Run the following SQL script to create the database:”.

What was he looking at? Or why was he pretending the instructions said to access the database backup server? I could have all the databases configured in 20 mins at most, and he dragged it out for hours.

Performance Review

When it was time to do objectives, he obviously didn’t have much to write about because he hadn’t done any work. Apparently, he had a “spreadsheet of evidence” though, so maybe I am wrong. We had a form that we needed to submit and he spent the entire day transferring the spreadsheet to the form. The next day, I had some free time, so I told him I’d help him look into his assigned software bug. He said that he wants an extra 30 minutes to finish the form…which then became a few hours. See what I mean about being “all talk and no action”? He just makes excuses to not do his work.

False Confidence

I ran out of ideas on a bug fix I was working on. I told my colleagues in the group chat on Slack. The Apprentice says

“Fancy a call to talk your thoughts? I’m kind of getting good. And I can share my ideas”

Apprentice

I was completely baffled where this confidence was coming from. He hasn’t fixed anything himself and struggles to come up with ideas. I am not opposed to a Junior correcting/inspiring me, but there’s no evidence to suggest that he could do it.

Support

Last month, he told me he has a new job, but is actually staying within the company. He has switched to 2nd Line Support. I don’t really get how that interview went. Being a software developer is about diagnosing then fixing issues, whereas support is just about diagnosis. (If there is a known fix that they can do without assistance from development, then they can fix the problem too). So I think it makes sense that people move from Support into Development if they have learned how to code, but I have never seen the switch the other way. I am intrigued how that is going to go. He has already started making claims like “this is much more suited to my skills”, “I’m really happy with this role”, but it’s early days.

Remembering the failed the Software Development Apprenticeship hiring 

About 4 years ago, we started hiring some “Apprentices” from a Bootcamp company. They only had a few months training, and it wasn’t even targeted to the languages we needed. So we basically were paying fees to this company for them to give us random people we could have just got ourselves. Recently, a few more of these people have left the business, so I wanted to look back and reminisce on the disaster.

“in partnership with Bootcamp, the Apprenticeship Scheme was launched in April this year and currently supports 14 apprentice software developers, including four employees who have moved within the business. Apprentices spend 20 percent of their time learning new skills and the rest based in the work environment. The company is hoping to take on more apprentices in 2020.”

Local Newspaper 2019

It’s interesting reading this quote because the 4 people were actually from another Bootcamp company we hired from a year prior. I think we switched companies because of some management issues (leading to a lack of communication) at that company. Those initial guys were quite good overall, but then the second company gave us generally poor people.

The part about 20% of the time learning was just nonsense. We never had a plan for them. Some people got moved about between teams every few months, sometimes being told to learn a different language so we never really allowed them to become good. But then most of them that I interacted with just didn’t seem to care; we were giving them money for nothing. I guess they had way more than 20% to learn since we often didn’t assign them any work.

“We are embracing this way of attracting people from less traditional backgrounds and allowing people like Sadiq to challenge themselves. In the process, they are to contribute significantly to our future success.”

HR Director 2019

“we don’t want another Sadiq Situation”

Colin (2022) – on the plans to hire more Juniors. We actually need a training plan for them to succeed.

It’s evident that Sadiq didn’t contribute to our future success.

It would be interesting to know the reasons why each person left since I think they were on good money for their ability, and it’s a low-pressure environment. Most were working on our new software that hasn’t been released so maybe they got frustrated about never having their code reach production.

Anonymised NameStatusEstimated Time Spent
MasonLeft4 years
ElijahLeft2 years
TesterResigned (Health issues)~ 1 year
ChrisLeft3.5 years
DanielStill here3 years
SadiqStill here3 years
PaulStill here3 years
JonSacked 3 years
BrogrammerLeft3 years
SimonLeft (Failed Apprenticeship exams)6 months
The MountainLeft (Decided to change career)<1 year
KatStill here3 years (1 year Maternity leave, yet to come back)
HarryLeft3 years
JohnLeft2 years

So there are only 4 left. Sadiq and Paul have been asked to go through some Training that we have put together, and could be sacked if they don’t show signs of improving. I don’t know much about Kat, but she’s taken a year of maternity leave. Daniel is the only one actually contributing and seems a quick learner. So after ploughing money into the future generation of developers, we ended up with one (maybe 2) future developers. Some of the others did contribute but then thought there were better opportunities elsewhere.

I found these chat logs about the initial batch of Apprentices, mainly targeting Elijah. It was a slow start until they got stuck into proper work, but Mason and Chris were actually really good developers.

Me:
what approach are we taking with these Bootcamp guys?

Steven: 16:23:
I think it's the "lounge about all day and get paid to learn how to write crap code" approach
because the company thinks it's cheaper to do that
the guy next to me has written an app that takes a list of countries and people, and would assign each person to a random country - a sweepstake generator
he seems right impressed with it
called one of his mates over to see it

Me: 16:27:
for the World Cup?
doesn't Different Elijah Wood sit next to you?

Steven: 16:30:
yeah!
he sounds like a robot
robot Elijah clone
I think he must smoke 75 cigs a day

Me: 16:30:
does his random algorithm work correctly
better not be newing up instances of Random at the same time and generating the same numbers

Steven: 16:32:
that's a good point
I haven't code reviewed it

Me: 16:32:
has he written it at work?

Steven: 16:33:
yep
yesterday and today

Me: 16:33:
our guy, Mason just reads Reddit all day
he was running the Build last time I saw him though

Steven: 16:33:
he's got a learning C# book
was reading about collections today
I've been given no info on these guys
so don't know what to do about it

Me: 16:33:
are you looking forward to training him up to expert level

Steven: 16:33:
well that's the thing, I'm not employed as a teacher
I expect everyone to be capable
and if not I'll be raising it as an issue

Me: 16:34:
what information do you want? what they should be working on?
I was expecting some info on that as well

Steven: 16:34:
yeah
should they be reading BBC News or learning all day?
or should they be picking up WIs?
what even is a junior dev?
if a junior dev doesn't even know how to code
seems a big risk to me
not even sure why I went to uni
anyone can code, right?
bring your gran to work day
I didn't manage to write any code today, but I did write a poem. <Pats gran on the head>, yeah gran you've done well today, here's a hundred quid, maybe tomorrow you'll be using the collection pattern

Me: 16:37:
I don't mind teaching people but they do need to pick things up quick
otherwise the extra member is just losing time for someone else
so it's a net loss
I think they should be like the old "Apprenticeship scheme" we had - get them testing, that way they can learn what our software does and learn when they are waiting for work

Steven: 16:37:
I don't mind teaching more advanced stuff, or anything not intuitive
yeah, I think that's the best really

Me: 16:38:
but they don't need to be a Software Tester for 3 years; just 6 months or something

Steven: 16:38:
help the "tools guys" make our Internal Tools decent
or have templates for test environments
the tools team don't seem to have time to make any tools

Me: 16:39:
and I guess they could do some kind of assessment to see if they are ready for simple WI
and if not, then they get out
or stay as a tester

Steven: 16:39:
they're more bothered about useless stuff no one wants

So even when the initial apprentices joined, Steven and I were sceptical that they could contribute since we didn’t really have a plan. It seemed I had a good solution though – by starting them off as Software Testers. They can learn about our Software, Agile Development, Processes, Internal Tools etc. Then later start learning C# more and gain experience with the codebase. I think this is roughly what Colin has in mind for the new recruits…

We are going to be hiring again, but going for Graduates this time, but are we going to do better?

Apprentice – X/Y problem

Recently, I came across the XY problem

The XY problem is a communication problem encountered in help desk, technical support, software engineering, or customer service situations where the question is about an end user’s attempted solution (Y) rather than the root problem itself

The XY problem obscures the real issues and may even introduce secondary problems that lead to miscommunication, resource mismanagement, and sub-par solutions. The solution for the support personnel is to ask probing questions as to why the information is needed in order to identify the root problem X and redirect the end user away from an unproductive path of inquiry

My apprentice is terrible for this as he comes to me with vague problems without telling me what the context is. Many times he has asked me to diagnose errors and then I realise that he isn’t even configuring the correct thing, or someone has told him the hard method of doing something.

Example 1:

He was following some instructions to set up Online Requests. The “offline” version requires no configuration, but the Online version goes out to an API and requires configuration.

Apprentice: “I don’t have the users tab that step #6 refers to”

Me: “not sure why it says “bottom of the screen”. Isn’t it a large panel to the right?”

Apprentice: “Yes!”

Me: “So you ignored the large panel?”

Apprentice: “Nah, I carried on but still couldn’t create the Online Request”

First of all, it’s usually pretty vital not to skip steps when setting things up, because if it wasn’t a prerequisite – it wouldn’t be on the instructions. Also, the next steps involve configuring a URL, username and password which he never asked for.

Me: “but this is the X/Y problem again. You have a problem doing something a certain way, but we don’t know what the “something” is”

Apprentice: “The something is me wanting to make an Online Request but haven’t been told that it has to be done the way it does”

Me: The something isn’t the Online Request, but WHY you want to make an Online Request. Do you have a Bug to fix? a Test Case to run? What is the actual main objective?

Apprentice: I’ve been asked to look at a Bug yes, debug and provide the root cause of the issue and yet haven’t been able to recreate because I haven’t been able to create an Online Request

Me: What’s the issue?

Apprentice: Essentially, have been struggling to create a Online Request only to learn I probably couldn’t have done anyway lol

Me: We still don’t know the Bug number though.

He finally provides it. I read the bug description and realise that he doesn’t even need the API configured. He just needs the “offline” functionality which I could have shown him within seconds.

Instead, he spent an hour trying to find and follow instructions for the “online” functionality. Then I spend time giving him more background info on how we set up Online functionality. Then after asking him to keep giving me info, we find out that it’s all been a waste of time.

It definitely was the X/Y problem.

Example 2:

In this example, the Apprentice was following a wiki to set something up. However it had links to other resources and the servers that hosted them had been decommissioned. He wanted to know where they were migrated to so he could update the main wiki. I don’t know what Bug he wants to recreate, or how he found this wiki. There’s no context provided to me again, so I have to ask questions to get the info out of him.

Apprentice: Is there a definitive way of checking if docs like the below were migrated? And if so, is there a methodical way of checking where exactly said docs will have been migrated to pls? (sends broken link to the old Environment Store wiki he wants to find)

Me: why do you want to add Test Environment details to the Environment Store anyway? XY Problem

Apprentice: I don’t even know what you mean by that.

Me: I’m saying you have decided you need these docs but are blocked by the fact you can’t find them. But what is the actual problem you are trying to solve which led you to the conclusion that you need these docs? Maybe you don’t even need them.

Apprentice: I just thought I’d replace the docs links with the correct one
I’m not working on the actual item yet anyway

Me: What are you currently working on then?

Apprentice: After my Agile Development Training, I can work on my current bug fix. But if you’re sure I don’t need those docs, I’ll leave that be.

Me: I don’t know what document you have

Apprentice: So why are you so reluctant in my getting to the bottom of ensuring the docs have the right links?

Me: you were desperate to know the location of another wiki that I didn’t think you needed because it would be unlikely you would need to add an environment to the Environment Store. If you are trying to keep documentation up to date, then great, but I don’t even know what this documentation is that you have.

Apprentice: I’m not sure what another wiki has to do with this one, but if I’ve been given a doc, with a Bug Report, and told to follow that up, I’m obviously going to want to replace the broken links within that doc aren’t I mate.

Me: I don’t think you had told me much, that’s why I have to keep asking questions. You still haven’t told me what doc it is after all these questions🤷

Apprentice: I only wanted to replace the links for the next person (who may not have someone like you to help them). These are the docs I’ve been given for the Bug Report:
(sends documents)
I thought maybe I could get a headstart on the Environment setup but that link wouldn’t work

Me: you just need to ask your Testers if it is set up somewhere already

Apprentice: This is the Bug Report: (sends link to the Bug)

Me: this guide is written from a Tester’s point of view. You can just set this up on your machine and skip the Environment bit.

It’s really hard work isn’t it? All that back and forth repeatedly asking him what his objective was, and he just wanted to update a Wiki that he didn’t even need to read. (-‸ლ)

Example 3:

Apprentice: Is there an Installer on RDA?

Robert: RDA?

Apprentice: I’ve connected to the Server as I need to switch to a specific environment

Robert: Are you developing against the tester’s Server? Why do you need to switch from the Server?

Apprentice: I’ve only been asked to get myself connected so far. I tried to through the Installer on my own computer, but it wouldn’t and then Becky said I need to do it through the Server

Robert: What is she wanting you to do? I’m not sure i follow.

Apprentice: Don’t worry geeza, I’ve messaged her – but thank you of course.

Me: sounds like an XY problem again.

Sometimes I think people like Becky just say some words to the Apprentice, then he just says an interpretation of those words to us, and we are like 🤷🙃

Apprentice: RDA is my fault. I thought it was called Remote Desktop Application

Robert: Ah RDP

We still didn’t know what he actually wanted to do.

Conclusion

I think the X/Y Problem is a great thing to bear in mind when asking for help. Make sure you explain the root problem, then describe your attempted solution. You might not need help with your attempted solution, but help coming up with an alternate solution to fix the root problem.

False Advertising Jobs

Intro

I’ve never been involved in the recruitment process to hire someone else, but have applied to jobs and read many job adverts. It’s a process that’s intriguing though, and I don’t think many companies get it right.

I’ve criticised performance reviews in previous blogs, and have stated it is very difficult to accurately judge someone. However, job interviews seem even more impossible to me. You need to come up with a good job advert to bring in the correct people to assess. Then your interview and assessments need to judge the best applicants.

Finding the correct people to fill a job vacancy is probably hard. I think you need to clearly convey what the job entails so people know if they are qualified and interested. You want all these people to apply for the job, whilst not wasting your time with people who aren’t qualified or aren’t actually interested.

When someone applies, you need to make a judgement whether to call them in for an interview/assessment. Anyone you reject through the entire process – is time wasted. Employing someone and regretting it is lots of time and money wasted.

I’ve seen many people come and go over the years, some quietly leaving and not even lasting a few months.

Here’s a collection of Job Advert stories.

Apprenticeship Schemes

When I first started my job, we had a special type of apprentice role where you start off as a software tester but then eventually become a software developer.

It sounded like a great idea; you get technical people joining, they then learn how the system works as a Tester. When they have the required development skills after learning with a mentor over a period of time, they can move into a development role. They will show their quality mentality from their Testing role, but also understand the requirements much more than hiring a new developer.

However, they joined, were never assigned a developer mentor, and were stuck as a software tester until they threatened to quit. It was just a scam. The company got technical and ambitious people that did a great job at testing. Those that were allowed to move to the Development role all became great developers. However, some actually moved elsewhere so they lost these good people.

It’s a fantastic idea if it is implemented as promised.

More recently, we hired loads of Apprentices via boot camp companies. Just like before, they never really got assigned a proper mentor. They mostly got placed in teams which didn’t have any direction on how to use them. A few months later, presumably someone highlighted this to managers and they were then moved to another team but without anything else changing.

They also had the promise of “Apprentices spend 20 percent of their time learning new skills and the rest based in the work environment”. We even published stories in newspapers with this claim. Maybe you could say 100% of their time were learning new skills because they were kinda just left alone and not really integrated into the team. Some quit after being frustrated that they couldn’t produce any valuable work. The better ones quit to find another software developer role, and the rest just seem to be happily taking the pay cheque for little expectations.

Having a nice spread of abilities: Apprentice, Junior, Developer, Senior, Expert is great as long as you have a plan of how to integrate everyone in the team. If you don’t have a plan for short term and long term, then there’s no point in hiring them.

Women are likely to apply if the job is accurate

See Women In Tech blog.

“Women working at HP applied for a promotion only when they believed they met 100 percent of the qualifications listed for the job. Men were happy to apply when they thought they could meet 60 percent of the job requirements.”

Hewlett-Packard

I find this statement bizarre. Most job adverts are basically just keyword spam and it is hard to ascertain what the job actually involves when they are being vague. If it really does reduce the number of women applying for roles, then why does it keep happening?

I’ve seen job adverts that we put out which may say something like “experience with VMWare” when you don’t need to know anything about how it works – you just need to know how to open sofware and log in. Or you see job adverts like “experience with React, Vue, Svelte” when you know the job is only going to involve one of them… but which one? If you have experience in React and have no interest in using Vue or Svelte, are you going to apply to it?

lorem ipsum

On a few occasions, our HR have put out adverts where the full text was just “lorem ipsum”. This is ridiculous. I mean, they have 1 job to put out adverts, and they just copy and paste a template and don’t even fill it in.

If people see that in a job listing, are they really going to take our company seriously? The fact that it has happened on multiple occasions means that they should change their process so it doesn’t happen again.

Cycle to work 

We work at home now, but yet still heavily promote the cycle-to-work scheme as a benefit. Recently we have promoted other “green” ideas like discounts on electric cars. If we don’t drive to work, then really it’s just a potential employee discount. Additionally, it’s not as directly aligned to the company values as they make out – they are basically encouraging more cars on the road!

Bad Impression

We are a tech company that makes various software products. However, our Job Vacancies page isn’t mobile-friendly – you have to use a PC to view them properly. Again, this is going to leave a bad impression and people won’t take our company seriously.

Conclusion

When it is hard to find the right people, and costly to recruit, it is important that you get every stage of the recruitment process correct. You need to get the right people applying, then your process has to accurately judge the best candidates.

Placing a “lorem ipsum” advert which doesn’t display correctly on a mobile device, and also promotes a cycle-to-work scheme on a home-working role – isn’t going to get many applicants.

Software Developer Wages

In my recent Promotion Special blog, I discussed how I was underpaid by my employer and I am going to end up with £12k extra for doing exactly the same job as before.

When I have looked at Job Adverts for developer roles of my level of experience, it seems I could possibly get an extra £5k-10k if I went elsewhere (~£50k). However most of these adverts seem to imply I would need to learn a few more programming languages and could have extra responsibilities like line management, or dealing with Senior Managers, possibly even relocate. It’s not worth it.

My first job out of uni was £18k and that was a hybrid role of Tech Support and Junior Software Engineer – I additionally spent a fortune in travel costs (I think it was like £80 per week). Last year, we hired loads of Apprentices so I thought they could be on about £18k, but when I stated that to my Apprentice, he said it was £23k. I couldn’t believe it. That was my salary when I was about 25 and I had to work hard for that. These youths have it easy these days.

The thing is, we got these Apprentices via a Bootcamp company so we pay the Bootcamp a premium too for commission. It’s bizarre, because we are well known to be cheap, so why are we paying a 3rd party, and giving a high salary to unskilled developers. Mental.

Quite often when you watch Youtube videos or read blogs, Americans often come up with salaries like $100k+. I think there was one video that said a Google salary was $230k – mental). I guess you need to take into account what a dollar means over there – ie cost of living; but these figures do sound crazy. You can look at jobs in London, England and you can easily see £60k-100k, or sometimes even more if you know an obscure language where the “supply” of developers is limited so you can demand a premium. 

These wages can be misleading though. I have a friend that is a Senior Software Developer and his partner is a Lawyer. I went to stay at their house in Bermondsey, central London, and expected he was living the high-life, but he lived in a rough-looking area in an apartment block. It was cramped and looked quite dark and drab. I don’t remember the exact figure, but he said it cost something like £1600 per month in rent alone.

Recently at work, we had a casual chat and talked about wages. One Tester sounded a bit outraged at the wages we pay and she said “Testers should be paid as much as developers”. I strongly disagree with this. I think Manual Testers really could earn £30,000 max. I used to be a Tester and for the most part, I see it as low skilled. Maybe the best testers like myself (arrogant) use better analytical skills, and can read the code and understand how to possibly find gaps and therefore find the most bugs. However, most Testers I work with don’t really think and they just do what you tell them. So it mainly involves mindlessly clicking buttons in the UI.

Anyway, this outraged Tester then stated she didn’t mind disclosing her salary and she gets paid £40,500 for a Senior Tester – which is going to be higher than many developers! Senior Developer wages start at £39,000 where I work, and I was under the impression that Senior Testers were more like £32k. How she managed to wrangle that wage is anyone’s guess. Why she thinks she deserves more is even more baffling.

Mentoring #5

I am mentoring an Apprentice who has never done C# before, and this is his first programming job. So this is a diary of some-sort of his progression and my ability to mentor. I haven’t written about my Apprentice in detail for a while – it’s been 4 months!

The bad thing is that there’s no good news to talk about, but I can sure rant about him instead. I’ve spent a lot of time with him over the past year, giving him general advice based on my journey as a developer and telling some great stories. I’ve explained what I think makes a good developer, emphasising how it is fundamental to know how to debug effectively, and how you need to find the root cause of an issue rather than papering over the cracks. 

When a batch of Apprentices joined the company, we had no plan for them, so managers passed them between teams aimlessly. When he joined my team, I promised him I would put in the effort and be the mentor he expected to have when he joined. So I can help him reach whatever potential he has, but he needs to put in the effort to get there; I can just get him there faster. I said he can ask as many dumb questions in the first year, but after that, then I will judge him.

I’ve given him exam questions, a pdf book, a list of project ideas I spent a few hours writing, a list of easy bugs to fix, and I frequently send him code samples to discuss. I’ve even made some basic programs and set the challenge to enhance them. I’ve done live coding demos, talking him through how to make a noughts-and-crosses game. I said I would code review anything he sends me.

I told him that it’s not mandatory to do everything I send him, because people learn in different ways, but he needs to put the effort in to do something. Maybe he doesn’t like reading and prefers watching videos? The key thing is just to get writing code.

However, with my Apprentice, he has been with me a year, and yet has basically nothing to show for it. He just seems to make excuses and somehow time has flown by.

I did get another Apprentice assigned to me. He did the exam questions within a couple of days. He made his own Battleships program in the following week, he completed a few easy bugs in the weeks following that. Then he moved teams, but I thought he was probably ready for proper work. He did seem far more naturally gifted, but he also had the high determination and took all my advice and instructions on board. I couldn’t have been happier with him.

A few months ago, my Apprentice also switched teams and I said to him he was nowhere near ready to be assigned proper work. The work his team had planned would feature more advanced, Senior level topics like threads, and required good knowledge of the domain.

I advised him to partake in meetings and do a bit of pair-programming so he has a feel for what is going on, but he must spend half the day practicing code, working through the assignments I had given him.

After a few weeks he calls me and says he has felt he has wasted his time and learned nothing. I asked him what code he has written and he says he has only gone to meetings and been watching a colleague work. He then asks me for advice. I remind him of my original plan and he says “oh yeah, you did say that, I should always listen to your advice because you are always right”.

A few weeks go by and I ask him why I still haven’t seen any code from him. He said he felt bad doing his own personal tasks, on work time. In his team stand-ups meetings, he felt like he needed to talk about his team’s work otherwise his colleagues would think he isn’t contributing. I ask him what he has spoken about if he hasn’t done any work for the team. He has not contributed anything. At least if he actually practiced coding over the last couple of months, he would have had the skills to try and contribute from now on. 

He said I was right again, although he was still adamant he wanted to do some proper work. He promised to start his project at the weekend and continue to do it outside work. So I picked out a few bugs from the backlog that looked easy. His Product Owner and Scrum Master weren’t happy about bringing in work to their team’s backlog when it wasn’t planned. I explained that currently their work is far too hard for him and he isn’t contributing so should imagine him not in the team. So let’s give him some easy work, then he can do something. Even if the work is shelved and the Testers don’t have time to test it, at least he has learnt something and he will feel like he has done something.

So after 1 year of my mentorship, I can now judge him and he has been a complete disappointment. He has only done 2 easy bug fixes with my supervision. In some ways, I feel like a failure but I know I’m not a bad mentor. I have put so much effort in and gave him so much advice. I feel like he disregards it, then says I am right, but then doesn’t change and carries on with the wrong approach. I definitely held my side of the bargain of being the mentor that they promised him.

Has he started his project yet? No. He just comes out with excuses. He does have some good reasons, but it’s hard to justify not being able to find a few hours here and there over a year, or even just the last couple of months:

  • Moving into a new flat
  • Went to visit a friend down in London
  • Forgot his son was staying the weekend
  • His son enjoyed his stay so wanted to stay again
  • Decided to start boxing as a new hobby
  • Watching the Euro 2020 England game.

I’ve stopped asking him about it, because I feel like I am just repeating myself, and have given him so many ideas of what to code. He isn’t in my team so I feel like I’m not responsible for him anymore. I’ll still be around if he wants help or advice because I enjoy helping people, but I’m not going to be proactive anymore.

“What interaction have you had with varied stakeholders?”

One of our apprentices said he needs to fill in an “evidence” piece which questions aspects he has experienced on the job. Since he has mainly been studying for exams and filling in forms, he hasn’t had much chance to actually do any real work. So he wanted me to help him come up with ideas of what he can write about.

I don’t think we have that much interaction with people outside the immediate team really, but it really depends on how you interpret the question. I guess this particular question is just about stakeholders which includes anyone with an “interest” in the software.

I always thought it was annoying when we got asked questions like this on appraisals; usually the focus being on people outside your team/department. It’s not part of our job really, since we have a hierarchy so you would just get your manager/team lead to either arrange a meeting, or perform the action on your behalf.

The key thing for developers is to raise questions about requirements with a Product Owner. So if the requirements aren’t clear, or your investigation has uncovered new information – then the solution isn’t as simple as people imagined it would be. Then you could then agree on changing the requirements with the Product Owner, or creating a new “work item” with the additional requirements to implement at a later time.

Maybe you would need to talk to an Architect to come up with an overall solution to a complex problem. 

Sometimes we email the UX team for UX designs or to ask the Technical Authors to write us a nice user-facing message to display in a dialog box.

Ideally, in a perfect world, these things would be alongside the requirements since you would think there would be a process before it comes to us. But we never really work like that.

In a recent project, the requirements were vague anyway. It was more like “Feature doesn’t work for certain users” …they want to select a Proxy user and that user’s details are sent in the message. So I made those changes but then you realise that they could want to use the feature, but maybe haven’t configured it correctly. So you need to tell the users. So I’ve put in a message box to tell the user certain config is missing from their user. I’ll need to get the Technical Authors to write the actual message. It should also be confirmed by the Product Owner that they want it to work like that.

A Tester then found another potential issue and suggested we add a default behaviour in a certain scenario, but that would be something the Product Owner decides. Do you want to switch the default, or do you want to just tell the user this method is invalid, and they have to manually switch to a different method? But then maybe we would want to ask the UX team what they think the user flow should be.

I guess the conclusion here is that it’s always hard to know exactly what the system should do. You end up having some requirements but then when you implement it/prototype it, then you realise that there are other scenarios that you should also take into account. So sometimes it is an iterative process: there is a bit of back and forth with the conversations between these stakeholders.

Poor standard and My Inspirational Quote

I saw a Pull Request (Code Review) from a Senior developer. They had created a new property along the lines of HasSetOption but there was already a property called HasOptionSet in the same file which was for the same purpose. I looked at how they were using their new property and they never even set the value; they only read from it; so it wouldn’t have worked anyway. He even had 4 failing unit tests for bonus points.

I told my Apprentice about it to show him that not everyone is actually smart:

“Senior developers, Junior developers. They are all the same really”

Me

“From a learner’s perspective, that is both scary and reassuring lol”

Apprentice

“Yeah. Doesn’t matter how bad you are, you can probably find a Senior that you are as good as :laughing:

Me

I thought that was quite an inspirational quote. It’s sad that it’s actually true.

Mentoring #4

I am mentoring an Apprentice who has never done C# before and this is his first programming job. So this is a diary of some-sort of his progression and my ability to mentor.

I haven’t written about my Apprentice in detail for a while. After spending a bit of time with him, he then got involved in more form-filling and exams for his Bootcamp company. It seems weird that we probably paid a premium for the Bootcamp company to train him, but yet he has been working with us for about a year now (I think) and we have barely managed to do anything with him. I really hope we don’t hire from those Bootcamp companies again. You may as well just hire someone and train them up yourself.

The good news is that my Apprentice has now “passed his apprenticeship” which means he has no more dealings with the Bootcamp company and now can work with me full-time.

At the moment, I’ve given him some Junior developer tests that employers normally give before an interview, so he is working his way through those. Ideally, he should have done them in an hour, so I guess he is a long way off from a Junior standard since he has had them a few days. But hopefully, I can train him well, so I’m quite excited for that.

Another complication is that my team has been assigned another Apprentice and my manager asked me if I could also train him. I made a great point that we have loads of Seniors in the team, so why aren’t they being asked? He said it was a good point and would look at promoting me. We will see how that goes.

Here’s a small summary of aspects I have gone through with my Apprentice. These are C# or Visual Studio topics:

  • Use some shortcuts like F12 to navigate methods
  • Ctrl+t “Go to type” shortcut that seems way better than Ctrl+f to find code
  • Use the “Rename” feature to easily rename variables/methods/classes setc
  • Break large methods into smaller ones – use Visual Studios “Extract method”.
  • Using breakpoints, the watch window, immediate window, “tracepoints” to debug. This is very important, you can never be a good developer without being good at debugging.
  • What the “Call Stack” is, and how to navigate through the method calls using Call Stack window.
  • How to create a branch in Git, push it to the server and create a Pull Request.
  • Class inheritance and polymorphism. 
  • When to use Abstract classes and methods.
  • The difference between “hard” casts and “as” casts.
  • Using some basic Linq (Select, Where, OfType).
  • Creating basic Winforms, and how to use Dock and Anchor to automatically resize controls as the form resizes.

Terrible Developers

Last week, I was reminiscing to myself about the developer that changed a random line of code which clearly wouldn’t have fixed the bug he was working on. It was also the same developer that repeatedly checked in “fixes” in an attempt to fix the build: Using the Build Server to test your code.

I said to my Apprentice, “how do you get into that mindset: where you write code, don’t even check it works then send it to your team to review?” but also “what happens if they did approve it and you are then embarassed when the Software Testers tell you it doesn’t work?“. Or even worse, “what happens if your bad code somehow went live?

I wasn’t sure if I’d see something like that again, but it seems like we have hired some terrible developers in recent times.

Today, I was having a nosey at Pull Requests (aka Code Reviews) and saw some changes that seemed like the developer hadn’t even built the changes, therefore didn’t run their own unit tests they wrote, or done any kind of manual testing.

When you create a Pull Request, it triggers off an integration build. Then you can only complete your request if you have a successful build, and your team members have approved the change.

First of all, the build was failing, and it was a simple syntax error which Visual Studio would have highlighted, and definitely would have been brought to their attention if they clicked the Build button.

Looking at the code though, the first thing that I thought was funny is that they had a Code Analysis error. When you get these errors, most of the time you have to fix the problem it is highlighting. In the case that Code Analysis is wrong and you are smarter than it, you can add a Suppression. To make it clear why it is suppressed, you can add a Justification parameter and add your own explanation to it. To force people to do this, we have added a Custom Rule “SuppressionsMustBeJustifiedRule“. But the sneaky developer went and suppressed that!

[System.Diagnostics.CodeAnalysis.SuppressMessage("Custom.Maintainability", "CM3000:SuppressionsMustBeJustifiedRule")]
		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]

I then looked at their unit tests.

bool isValid = validator.IsValid(input);
Assert.AreEqual("True", isValid);

I was convinced that would give an error and it certainly does.

Assert.AreEqual failed. Expected:<True (System.String)>. Actual:<True (System.Boolean)>. 

Comparing the wrong datatypes. A Boolean is a true or false value but it cannot be compared to a String (text) representation of it (“True” or “False”). What they actually need is simply:

Assert.IsTrue(isValid);

If isValid is true, then the Assert passes. If isValid is set to false, then the test fails.

Then the next set of tests were like this:

string successMessage = string.Empty;
List<string> errors = validator.Validate();
if (errors.Count() != 0)
    successMessage = string.Empty;

Assert.AreEqual(string.Empty, successMessage);

So Validate returns 0 or more errors. If there are 0 errors then the test passes because successMessage was initialised to string.Empty and we are comparing it to string.Empty. If there are 1 or more errors, then we explicitly set successMessage to string.Empty (which hasn’t actually done anything because it was already initialised to string.Empty), then we compare it to string.Empty and the test passes. So no matter what Validate does, the test will always pass.

What an absolute waste of time.

I also said to my Apprentice that it is perfectly fine to have a go and writing some code but failing. Then you can say “here is what I have wrote, it doesn’t build but I don’t know why, can you help me?”. Then I can go through it, give him some advice, and together we come up with a good solution.

The worst thing you can do is give up, but then try and get the crap code checked into the codebase.