Neil was very similar to Gerald. Although I always got on with Neil, his programming skills were a bit lacking.
He was definitely one of those software developers that may have been good in his prime, but the languages he has used are now obsolete and he struggles to learn new things, so was a poor C# developer. Or maybe he has always been poor.
Neil is like “I don’t know why this bug is happening, I might try change random parameters“
So I said “have you found the barcode code since it is that which is displaying incorrectly?“
“No I haven’t. I suppose that’s important to find“
Neil in the Standup update on Thursday: “gonna switch branches”
Friday: “just in the process of switching branches”
Switching branches takes a few minutes (Git, plus some config changes)
“I don’t have a good feeling about downloading nuget packages any more. Before the patch, the fix made 21 changes to .csproj file and .config files in order to work. So far it has made 523 changes.”
Neil
What’s he on about? sounds like Neil is deleting packages then removing the part of the build script that grabs them, then wondering why he can’t log in.
One trait they had is that he seemed focussed on his own work and didn’t pay attention to what anyone else was doing. So there could be well-known employees at the company and he wouldn’t know who they are. So there were plenty of conversations like “go and ask George for assistance” and he would be like “who’s that?” or “what does he do?” much to the derision of team-mates.
"might be worth getting you and Nick on a call together because you are working on similar items"
Neil: "Nick who?"
"Nick on our team"
He once turned up to the stand up which started at 9:30 but he was supposed to be on a 4 hour training course from 9. He said he joined the meeting but no one was there. Our manager was like “did you join using the correct link? The calendar invite says PLACEHOLDER so that’s not the correct one“. Why didn’t he ask people if the meeting was on? He should have messaged his manager straight away.
A few months later, he missed another meeting. “did you not see my reminder about this morning’s call in Slack yesterday afternoon?“
“I thought it was some advice on where to look in the code“
The team lead had posted “Announcement : reminder that we’ve got a call at 9am tomorrow about MEDS ISN”.
Probably Neil’s brain – “mmmmmmm MEDS ISN call. Sorry, I can’t seem to find the MedsISNCall code. Is that a 3rd party dll?”
I’m still baffled by Neil. If he thought it really was code, then why wouldn’t he ask you how to find it?
He often struggled and didn’t ask for help, even though we repeatedly told him we would help train him up in our software and with C#. He would raise it as a point for himself in the Agile Retrospectives, and say that he will ask for more help and work as a team; but then carried on as normal.
“Yesterday, I failed to log in after 3 attempts. So I am carrying on looking at it“
Neil wants to add a new user to the database because he doesn’t know how to unlock his password by running a script on the database, but it seems he didn’t know how to add users either. I wonder what time he locked it. Did he lock it at 11am, then walked off?
Neil last week: I need to ask for help more
Probably Neil’s brain this week: well, my account is locked, looks like today is a write-off
Later on, the manager asks him if he is all sorted and he said: “I can log in but an error pops up.“
So he is blocked again and never said anything. He is really trying to get himself sacked.
I’ve noticed these types of people often blag their standup updates by saying “Sent a message to…”. Sending an instant message or email to someone could take some time to make sure it is worded correctly, but it’s not really a significant thing. Then there can be times where the recipient doesn’t respond because they are busy or out of office. But then what are you doing whilst blocked? They seem to use it as an excuse to write-off the entire day and shift the blame to someone else.
There were several times where he was working on items that had been picked up by others, had completely misinterpreted the requirements, or just had general bad luck with work being deprioritised as he was working on it. It kinda became a running joke like he was a cartoon character.
We told Neil to take a bug from the backlog. It was one I had investigated and put loads of notes in so it should be really easy for him to fix. He took the one already assigned to me with a status of “In Progress”.
Build Problem
On a standup, he was saying he was struggling with a build error. I volunteered to help him since we didn’t want him stuck all day. I asked him to clarify the situation; “is it on a computer that has always worked then suddenly stopped working?” And is he “currently running the build script without any of his changes in, or could it be caused by something he changed?”. “If he types that az login command, what does it say?”
Then all he says back is
“Curtis from IT is supposed to be setting up elevated access on A20205 but it isn’t working yet“
WHO IS CURTIS? Why is he included in the story now? and what even is that machine name? Am I supposed to recognise it?
“Existing one that has always worked except for these latest build changes. Curtis said “I’ll need to switch your admin access over from Primary to an elevated to match that of the other users on the jumpbox” and under the circumstances I thought it sounded like a good idea.”
I asked why Curtis is involved. Has Neil asked him to fix his build issues? and why does he think it’s an IT problem rather than a Development one?
“He contacted me. He did not give a reason for making the change so I don’t think he knew about my build issues. He may have noticed that others users have elevated permissions. I do not think they have caused the build issues.“
So he is telling me about Curtis but it’s nothing to do with the problem I am trying to help him with?
After looking at Neil’s local changes, I saw that he had made changes to the build script which is basically one of my initial questions which he could have answered. I suppose I need to check each stage for tampering.
So I ask him what the error he got in order for him to start changing the build script. It shouldn’t be necessary; why would it work for everyone in the department but not Neil? He sends me a screenshot, and I noticed that the command prompt showed Isobel’s name as the local user.
How can he be logging in as Isobel? Have IT merged his account. Is this Curtis’ doing?
I asked him if he noticed he was logging in as Isobel. He says he took the screenshot from her documentation! He is a wind-up. He was getting the same error as her troubleshooting guide but decided to paste her screenshot to me.
I tell him to log in; then run a command. He runs the command without logging in. So I explained again, and I think he logged in but didn’t run the command. Absolute wind-up.
In the end I think we undid all his random changes to the build script and fixed the problem with the Azure Devops plugin, as documented in Isobel’s guide.
How Many Items To Return
There was a bug he was assigned to that looked like it could be simple on first glance. You have a list of items and the code was calling the LINQ method First(). The change could be that it should be FirstOrDefault if it could be an empty collection, or maybe the problem is that there really should be one item in the list and it is missing.
Without recreating the problem, we wouldn’t know what the fix should be.
Looking at the code, it passed in a list of items and possibly switched some depending on the config and certain checks. The method returned a list but was not clear at first glance what was returned. Is it all items? ones that have switched? any that have been modified?
He said it should be all items regardless if they were swapped.
Then when reading the code in this particular method where the crash occurs, why was it returning items when this swapping feature was enabled, but 0 if not?
Another developer, Dean, points out that in the previous method calls, there is another IF statement. When this swapping feature is on, an empty list is returned, and when it isn’t, the original drugs are returned. But then they are placed in a list called switchedItems.
Neil: “I understand it enough to know that this fix will work, but don’t understand it enough to refactor it”
He says his approach is to make the simplest change possible, not increase the scope and chance of introducing a new bug. I say that although that approach is generally good, in this case we see that the original developer had made a mistake in a previous method, and not returned the initial list of items. Then it looked like they had put in a hack to possibly try and work around it.
So I tell Neil that the original change was basically a hack – and the developer was attempting to do the simplest and quickest fix; but it has then made the code look confusing and still has a bug. Then Neil is continuing this mentality, by modifying the if statement to work in this additional scenario where we have found a bug, further contributing to the mess.
We discussed other scenarios and if those scenarios are impacted by this particular code. Then David says “so my change is fine then?”. Dean and I, in unison, say “NO!”. You need to fix the original method to return the initial list.
Not Hitting Breakpoints
There was another good example where he did ask for help but hadn’t recreated the issue at all, and didn’t adequately explain what point in the investigation he was stuck on.
The bug report was very poorly worded, but the general gist of the problem as I understood was – that there was a certain type of Request Task which contained a list of items. The user then tries to change the item to a Repeat order. Then it crashed triggering a dialogue.
His manager asked him if he had tried recreating the issue, and he said he has been “trying for a while“, but didn’t elaborate on it.
I gave him advice that sometimes you need to look where the crash occurs from the stack trace, then look at the method calls before that to see the initial UI call. Then work out which UI control triggers that.
The next day, he says he is still struggling, so I needed to help him.
I get set up. After I start investigating and getting sidetracked with other issues, he then says he is getting a crash creating the Tasks. What has he been doing for the last few hours?
I sorted his environment out, then asked him if he had found any suspicious code, and he said he hadn’t. I wasn’t sure if he meant he hadn’t even found any relevant code, or hadn’t identified what could be the problem, but I left him to it for a bit.
He sends me some method names which lead up to the method which was mainly from the stacktrace, and some were irrelevant. I pointed out that the line of code that was crashing was when a collection was empty, and reminded him the exact method he needs to look at.
A few hours later, he asked me if I had made any progress, and then said “there is a null being returned in the If statement”. So I remind him that null is fine, we are looking when the collection is empty. Empty or null are similar, but there’s a difference in the world of programming.
So we need to find what can return an empty collection. The returned list sometimes does stuff with the swapping feature so that made me think it could be that.
Neil
Which dialog are you referring to when you say "in that dialog"?
Me
In the Task
Neil
Are you adding a task that appears in the To-Do list or Inbox?
Me
Requests, not To-Do list
have you not got that far, or have I just confused you by giving you random bits of info
I don’t really get it because it sounded like he knew it was Requests, and then is now thinking it could just be some other type of task. Then when I explain where the link is that the user is clicking in the stack trace, he is like “oooooooh I haven’t got this far“.
It said Requests in the bug report. I told him to first work out what the user was clicking in the UI. But he hasn’t got far enough to know it was a Request nevermind what the user was clicking on.
As he was showing me debugging, it was hitting all kinds of breakpoints. He had like 50 and hadn’t been hitting them before because he wasn’t using the correct dialog. He had speculatively changed the method I had told him to look at as an experiment, but if he was never using the feature that called that code, then what is the point of experimenting by changing it?
He could have told me that he can’t hit his breakpoints at least. Either a problem in Visual Studio, or most likely; he isn’t in the correct feature of our program.
I don’t really understand how he can be a developer for 30 years and not understand how to work out a problem from the stacktrace. It’s not 100% possible due to a feature might needing configuration to be enabled, so you may still wonder how code is called, but at least you can deduce some information and come up with several scenarios then rule some out.
Conclusion
I always say it is hard to tell how good developers are, but there’s certain red flags that suggest they are bad. Obvious ones for me are not asking for help, not understanding basic debugging, showing a lack of interest in the project or code quality.