There is a project that can be initialised to CR.
This project is split into two, so there is a team on the Application side, and another on the API side.
So they have decided to call themselves CRAPP and CRAPI respectively.
There is a project that can be initialised to CR.
This project is split into two, so there is a team on the Application side, and another on the API side.
So they have decided to call themselves CRAPP and CRAPI respectively.
A developer wrote some code that tries to extract text that looks like HTML tags. So if you have <h1>, <div> etc in your text, he was basically just deleting the HTML prior to saving it to the database.
The thing is, the code just looked for a “<” then a “>” and removed everything between. So if you had a sentence like “the value is ❤ and >1”, then run that through his code, the returned value would be “the value is 1” which has a completely different meaning. You could have paragraphs of text between these characters, and his code would just delete it.
Not sure why he decided to hand-craft his own solution. There will be more official ways of encoding HTML.
This typo made me chuckle.
A manager was trying to arrange a very urgent meeting and he wrote:
“I will book a meeting in for 1360pm, please attend”
Manager
“for those that will be helping out with the Phase 2 testing, the suite is here…”
Becky
I think we have around 5 testers in the team, and only 1 tester responded to Becky. This testing seemed urgent and the fact that she said “for those that will be helping” – this made out it was the testers, plus some other non-testers as volunteers.
As a developer, you assume you aren’t needed – because you’re a developer. But if a tester says their testing is urgent and they need help, then they may request volunteers. It was the first I’d heard of this, and it seemed weird that only 2 people were actually testing.
I questioned the statement, and apparently Becky wanted testers AND developers to volunteer. Why didn’t she say something? She managed to make it sound like people had already been told if they were doing it.
She is so bad at communicating.
Maybe that’s why the Testers weren’t even testing it.
Becky is a Senior Tester and I remember our Team Lead saying he was going to give her more responsibility because she wanted to progress her career. Well, she can’t even manage to get Testers assigned to do some software testing, so what hope do we have?
My manager calls me and says there is a bug that might end up holding the release, and wondered if I can help. He said it was found when testing Colin’s work, but it might not actually be related to his changes.
Colin had been given some other work and he was taking ages on it,so wasn’t available to complete this work himself.
So I call Colin and ask him what this bug is. He sent me the description from the tester (Becky) which was next to useless, he showed me his recent changes, and a specification from his project. Colin assured me that his changes should work, because he just “copied what was already there”.
It seemed like everything I needed, so I got digging into the code and testing it out.
It didn’t take me long before I realised what Colin had done. There were two scenarios that he needed to check. By copying and pasting what he saw in that file; he was just covering one of the scenarios. The other scenario was actually in another file, and he would have realised that if he actually tested it.
The thing is, my first thought was to add a unit test to cover the scenario. I checked for existing unit tests for that file, and there were some existing tests. Colin hadn’t bothered adding additional unit tests; which would have made him realise that his changes didn’t cover both scenarios.
Then days have gone by, the manual testers have finally got round to testing out his changes, and logged this issue just days before the release.
Then I have to save the day once more.
It’s so annoying/stressful when you get given a bug to fix with strict deadlines, but luckily it was very easy to fix. If Colin had shown a bit of effort, then we wouldn’t have been in that situation.
In a previous blog, I was criticising some work done by an Apprentice: Apprentice Insanity
What actually happened with this is that it got deprioritised so was just shelved for a couple of months. Which is weird, because the original developer made out it was very urgent and wanted to check it in at the last minute.
When it was decided it was needed again, who got asked to finish it off?
Yeah! me! What are the chances of that?
The work was to show some messages to the user why a feature isn’t enabled for them. There can be several different reasons, but we never told the user why, until now.
So I load up our program with a valid user… I can’t use the feature anymore, and it tells me 5 reasons why I can’t use the feature. It’s completely broken then. A valid user should have allowed me to use the feature, and obviously show 0 reasons.
So I fixed a few bugs, and now I can use the feature, but there are still 3 reasons displayed. So it says I can’t use the feature; but I can, and I know I should be able to.
I spent a lot of time looking through the code, and I saw that there is an existing file that did the validation, but the apprentice had created another file with some other validation rules in. If it is the same rules, then we are checking them twice? If they are different rules, then you end up in a situation like this; where I can use a feature, but the other file’s validation tells me I can’t.
So I end up deleting this extra file, and make the existing file be the code that returns the failed rules.
The new dialog he added looked nice enough, although the dialog was a bit small, and a few aspects of it wouldn’t actually meet our UX standards. When I looked at it, I saw that he had positioned all the controls by hand for a particular size, and so I had to do a lot of rework to get the controls to work on a larger dialog.
He also had code with complicated logic to adjust the size further. Complete hacky. So I got rid of all that too.
There was some other hacky code where he even had a comment along the lines of “for some reason the control can be duplicated, so if this happens, then we need to remove it”. After some experimentation and debugging, I eventually worked it out. What was happening was that the initialisation code was calling his new method twice. You would think that means the control was always added twice, but it wasn’t.
It turns out that there was some existing code that checked if a control was in position 1 in the grid, and if it was; it was then removed. Then there was some logic to re-add it based on a condition. So the control in position one is optional.
| Position 1 | Control that sometimes gets displayed. Put new control here? |
| Position 2 | Control that is always displayed |
| Position 3 | Another Control that is always displayed |
The Apprentice was adding his control to position 1 in the grid, but if the other control was there, then he added it to position 2 instead. So what was happening is – if he added his control to position 1, then the existing code then removed it, then when his logic is executed the second time, then it gets added to position 1 once more. So it displays correctly, but works “by coincidence”.
If the existing control is added to position 1, his method then adds the new control to position 2, so when it executes the second time, it adds a duplicate to position 2. So then his hacky code kicks in and removes the duplicate. The simple solution; just create a new row in the grid for his new control. Delete the duplicate call. Delete the hack.
So it seems like he got into a mess by trying to cut corners, put in a hack when it didn’t work, but then it only worked intermittently and he didn’t understand why… so then put in some more hacks to cover it up. What you end up with is nonsense.
In the end, I had completely rewritten it, made the UI nicer, and got rid of all the bugs. Result.
We had a demo arranged with someone who was basically representing a user. I was going to demo my code, but, an hour before the meeting, I got an important meeting invite. As a joke, I asked the Apprentice if he could cover me. He said he would be happy to do so. I told him I was joking, but if he really wanted to do it, then it would be appreciated. Like a nutcase, he agreed. With only about 45 minutes to prepare for the demo, I told him I had completely rewritten his code, so he may be a bit lost.
He chose to demo from his existing, broken code.
My meeting turned out to be really short, so I joined the demo as the Apprentice was trying to explain a feature, after it crashed and somehow wiped the contents of an existing dialog, much to the confusion of the Representative.
I saved the day at that point and demoed the proper, working code.
Afterwards, one of my colleagues said to me
“How the hell can you demo something THAT broken?”
concerned colleague
I said he is “a complete legend”.
A new customer reported a particular feature was broken. This feature used a web browser (Chromium) to work.
A developer spent ages trying to work out what was going on and realised that the site had an invalid proxy script. The invalid script was causing a crash within Chromium, rendering this feature completely unusable.
Due to a typo in their proxy script, their proxy wasn’t blocking access as described by the script; it was basically “anything goes”.
The developer told them how to fix it, and we thought it would be case-closed. However, now that the proxy blocked access to websites as defined by their IT department, their employees started complaining.
Instead of the IT department:
They decided to revert back to the original broken script. This obviously made our software break again.
Really, it was a problem with Chromium, the software used in Google Chrome and now Microsoft Edge. Obviously, the workaround is to actually set a valid proxy script, but they decided to be awkward.
When a serious bug is found, there’s all kinds of managers that have a call to discuss it, along with some representation from Development – so at least one Developer and preferably a Tester too.
I got asked to join the call, and there’s like 8-10 people on this call. The representative from Support has roughly described the bug, and how often it has been reported.
Then there are a few managers bickering if the Major Incident is a Medium or High severity. The thing is, we all know it needs fixing urgently, and from my point of view, it doesn’t matter what severity they actually give it. Maybe the managers care because it depends who they have to notify and follow a different process.
I just know that I need to fix it as soon as I can.
However, while the call is going on, this is time wasted because a developer isn’t looking at it. I had been told there was a bug in a particular area, and I know I’ll be the person trying to fix the issue, but I cannot start because I’m on the call. I could multitask, but I wasn’t given the stack trace or recreation steps, so I was left waiting. It would be hard to concentrate if I was half-listening to the call too.
I think that meeting went on for an hour, which is an hour lost. It should have just gone straight to development, then argued about the trivial details whilst it is being looked at. They had further calls anyway for updates, so they could have had better updates from the development team.
At that point, I may have been able to tell them:
So they basically try to discuss things they know nothing about. Ideally, they just need an initial meeting with the “stakeholders” to bring attention to the problem, make sure people are assigned for responsibility/accountability reasons, then arrange a time to reconvene to discuss further.
I get a pull request to approve from Colin:
Title: merge Main in to the code quality barnch Description: merge Main in to the code qualiaty barnch
It’s somewhat ironic that it’s about quality, yet is riddled with typos. Also, why didn’t he just copy and paste the title and description?
Usually, you can just approve merges, there aren’t any new changes from the developer. They are just updating to the latest version. I have a quick peek and I notice that it doesn’t actually have the last set of changes that went into the Main branch.
So I left a comment;
“Isn’t this still 2 weeks out of date?”
The comment of shame
Nothing like quality.
We have a daily “standup” meeting where each person in the team says what they did yesterday and what they are going to do today. You can also highlight any “blockers” that will prevent you from completing your work.
Since we are all working remotely, we just do them using Microsoft Teams. At first we just nominated someone to speak next, but since we have around 10 people in the team, and people don’t really listen or pay attention, then we ended up with people asking: “has everyone been?” – when only half of the team has been.
When Microsoft Teams introduced the “Raise Hand” feature, we used it as a flag to show who still needs to talk. Still, Colin says “who is next? Matt have you been?”. Yes he has been, why don’t you choose one of the 6 people with their hands raised?
Another point which illustrates that people don’t listen, is when I say something like “I’ve sent a Pull Request for my work but no one has reviewed it yet, can someone review it?”. Then three hours later, no one has reviewed it.
I think the problem is often that people are so focussed on what they have to say, then they don’t listen. I was watching a video about it and the guy reckoned the “walking the board” method gains more attention. This method is where you look at your “Kanban board” which shows you all the work your team is doing. Then you can go through each item in turn, and the relevant people can then speak up. I still think you’ll have the same problem since you know that you will have to speak when it gets to your work.
There are a couple of people that seemed to nominate people without even looking at the attendees, so then they end up in embarrassing situations where they say “Rob can go next”, but Rob isn’t actually on the call. Sometimes it was well-known that they don’t actually work that day because they are part time.
We also have someone in our team that just deals with Test Environments so isn’t directly involved in our work. We did raise the point that it is stupid for him to attend the stand-up meetings but our manager said he wants it to continue so he feels part of the team and also gets to hear the team talk. I guess that is a good point – since we are at home, we don’t get to hear our colleagues speak much.
His updates are so boring, and he delivers them in a really bored tone. I often think he doesn’t have much work to do, so just says words to blag it:
How long does resetting a password take? Is any of that actually useful to the team anyway? He may as well just say “Environments stuff” then choose the next person.
Another thing that always happens is when you pick someone to go next and you are met with silence. So you say “you are on mute!”, then a few seconds later “oh yeah, sorry I was on mute”. Here are some classic “mute” scenarios that I wrote down:
Becky: “Good morning Colin” *few seconds of silence* Colin: *bland tone* “good morning” Becky: “You sound down, Colin” Colin: “I said ‘good morning’ but I was on mute, so that's my second attempt.”
James: "Can everyone see my screen ok?" *silence* Becky: "yeah, sorry I was on mute" Colin: "yeah, sorry I was on mute" Matt: "yeah, sorry I was on mute"
Matt: "Colin, have you been?" *silence* Matt: "You still have your hand up" *silence* Matt: "you are also on mute" *silence* Colin: "I'm on mute? how did that happen?
And a bonus scenario:
Becky: "this meeting has started early!" Colin: "who started it?" Matt: "it was you Colin"