The classic Wingdings printout Bug

When I was a Software Tester, one of the first bugs I found was on an appointment booking system. There was this concept called “Assignment List” which had a list of Patients that required appointments. Then you drag and drop them into the appointment slot to book them in. A tick/checkmark would appear next to their name. I then printed it out and saw that most of the printout was in the Wingdings font!

I thought it was pretty clear, so typed up the basic information in the Bug Report, even suggesting what I thought the problem was. My (correct) assumption that the font was switched to use the tick/checkmark from the Wingdings font, then the font wasn’t set back to normal for the next bit of information, resulting in a full page of Wingdings symbols! 

Ensure patients are present in the assignment list. Book patients into session. Press the print button – App book is printed and includes patient details – Details for some patients appear in Windings font in assignment lists. This is possibly related to the tick (shown by using Windings font?).

My bug report

For some reason, the lead developer decided to be a bit aggressive and add extra information to my report:

CRITICAL MISSING INFORMATION: This ONLY happens if a patient in the assignment list has been assigned and has a tick next to them.  When printing it prints the tick but it appears that the rest of the details for that patient are left in the wingdings font.

Developer response

CRITICAL MISSING INFORMATION!

The Expo

Despite other departments in our company arranging optional meetings to explain what they do, in a recent survey, colleagues had apparently said they don’t have visibility of the wider business. The directors decided to create what they called “The Expo”. This was a mandatory all-day event located about an hour away from our main office.

The Registration

We got told to sign up via an Events Company’s website and the instructions we were given didn’t match my experience at all. We were told by visiting the website via the link in the email, it would auto-populate with our names. Yet the first question on the page was to ask for my name and email, and only then did it display back to me. We were also told to ignore the displayed cost because it would be the company that would be charged and not us personally – yet it displayed as “free”. There was no information in the email about how we would travel, but then one of the questions on the survey was asking us how we would arrive at the venue. It was only when I tried the “coach” option did it then state it would pick us up from the office on the day, but didn’t state the time. I then expected that information in the confirmation email, but it was only a week before the event I was told the pickup was 7:50am which meant I would probably have to wake up at 6:30 to make sure I didn’t miss it.

Despite the usual reminders that travelling by personal car on company time would invalidate your insurance (since you need to be covered by business insurance), I suspect most people went by car because there were only around 20 of us on the coach.

The Arrival

As we headed towards the venue, some of the senior management handed out notebooks but no pen. The notepad did have the schedule printed on the front which was useful. Since they told us to dress smart, most of us didn’t bring bags, so we had to inconveniently carry a notebook around all day.

The Event

Most of the day was sat in a large meeting hall watching presentations from the heads of various departments and directors. They used the opportunity to present the Employee of the Year awards. The thing is, we periodically watch presentations like this remotely, so it seemed a waste to make people from across the country to travel to an event like this. Some people travelled hours, and stayed in a hotel on company expense, and I just didn’t see how it could possibly be worth it.

“can’t believe we have so many people turning up”

Event organiser

You invited the entire company and said it was mandatory, what did you expect?

The Call

As it approached lunchtime, during one of the presentations, I noticed a developer checking his phone and looking concerned and then he walked out. During lunch, I was talking to another developer in the team. He started looking at his phone, then handed me his plate and told me to hold it while he goes to take a call. Several minutes passed and he hadn’t come back, so I was there awkwardly holding 2 plates. There were no tables and the room was packed with people so there was nowhere to put it. Eventually, I just had to bin it. When I saw them later in the day, they said there was a Major Incident so were called to a room to investigate remotely. So a few developers and the directors were all gathered around 1 laptop, knowing there wasn’t much we could do.

That’s another disadvantage of one of these all-day events. No one is working, and urgent issues like this can’t be addressed and just adds extra stress.

The Stalls

Another part of the day was walking around some stalls. It was like a careers fair but you already work for the company that they are promoting. Also, since there were that many of us, we were split into 2 groups, and since I was in the second batch, all the free stuff was gone. I could have grabbed a free pen for the notepad.

I didn’t really get the motivation for actually approaching anyone on the stall to listen to them reel off a speech that they would have been saying on repeat hundreds of times throughout the few allocated hours. Wouldn’t it have been better if these were also presentations in the main hall, then they only have to do the presentation once, and everyone gets to hear it?

I suppose the more socially outgoing types might be in their element, but I was just walking in circles, pretending to look busy. Eventually, I got talking to some old team mates and we were commenting on how bizarre the entire thing was.

Software Development Stall

For Development, the manager who volunteered to run our stall said he planned on using a darts game but using “magnetic” darts so it wouldn’t violate Health and Safety. The “Fun Police” busted him though – Health and Safety deemed it unsafe since throwing something would involve swinging your arm back and that is dangerous.

I’m not sure if things have changed from a few years ago, but we have had office parties with a Bucking Bronco, Bouncy Castles and similar games. I think every year 1 person has had some kind of injury using those, but it never stops us organising things the following year.

The replacement game was a “guessing game”. It was a vague question like:

“Guess how many minutes were saved in a 2 month period during our “COVID” release?”

The manager was insistent that everyone should guess, and was demanding I submit a number. I didn’t understand how people were coming up with the numbers. I kept on asking questions but I got the impression even the figure they had was some exaggerated figure. I asked

  1. what was the feature?
  2. how was it measured?
  3. Why are we measuring in minutes when the figure appeared to be large like 20 mill minutes.

After the event they announced that guesses ranged from 100 minutes to 2 billion minutes! The correct answer was 31.9 million minutes.

Evening Meal

Another part that wasn’t well thought out and a waste of money, is that they provided food at 4:30 but there was nothing scheduled afterwards. The coach was at 5:30 so I had to stay, but most people had no incentive to stay. So when food was served, there were probably only 20% of the people there, but they would have paid for food for everyone.

Feedback

I did wonder if people would give negative feedback for the event. It seemed rather pointless to me; a complete waste of money, and not really that feasible to try and bring the entire company in one building like that. I suppose the main COVID days are behind us, but it’s probably a bit of a health risk. I knew a few people that were ill after the event.

Loads of people actually stated positive feedback, but it was on Yammer, and people seem to use it to post overly positive statements. The only negatives were:

  1. All I used the notebook for was the agenda on the back, which could have been printed on the back of the pass.
  2. no pen
  3. carrying around the notebook all day
  4. restricted interactions, 
  5. lack of space while eating

Yet the positivity was flowing:

It was great to put faces to names – especially when it’s a team that you work closely with. It was also really nice to see people that I’ve not seen in over 3 years. Overall, a great opportunity.

I was reminded of the value of face to face interactions with colleagues across the business. Will be looking forward to future opportunities to meet in person.

I learnt more in one day about our business/products and services than I have in the year that I’ve been at the company. What an amazing ‘sheep dip’ opportunity to immerse oneself in the ‘what we do’ and ‘why we do it’ for our end Customers – fantastic !

Seeing people, I have not seen in over 3 years since working from home was great, as was meeting people I have never met in person before. Getting to meet them in the flesh and build further bonds was a great experience.

Having the opportunity to network on such a mass scale and learn about other departments that we may not have regular touch points with was invaluable.

It helped me appreciate how each and every department is working towards the same goal, and that we have a lot of exciting tech-for-good products!

Being just 5 months into starting with The Company I found The Expo a real success. Not only did it serve to educate as to the breadth of offering across the wider business but also reinforced the value and absolute quality of our portfolio. The insights to the wider business has reinforced key messages around data quality relevant to my customers within their world and how our unique offering can support and accelerate the valuable research they provide. This event really encouraged me to reach out across the wider business and was indeed an excellent platform for building an internal network. The Expo gave a real feeling that top down and bottom up you would get support.

Sometimes, being bogged down in the day job, it’s common to be disheartened by the day-to-day challenges we face and getting mired in the weeds: a classic case of not being able to see the forest for the trees. The Expo was a great opportunity to get the big-picture view and see how, by succeeding in the daily challenges, we are improving healthcare for huge numbers of people.

I’d been fortunate to have attended two other great opportunities to meet up face to face and network already this year, and still found this another great one to see even more people and catch up on common themes across the whole business. I always learn something both personally and about our products, on this occasion improving my knowledge of Project X particularly. The overwhelming reminder at the beginning of why we do it, the impact it has and why we should feel proud of where we work, is a welcome prompt to look up from the day to day challenges more often.

I met many more people face-to-face for the first time than I’m able to remember now and got a real insight from generally chatting to others around what different teams actually do, how and why. With the number of acquisitions we’ve done over the years it also helped me learn what some of the products we’ve acquired are as well as how they add value to our customers. It was great to see some of our Chennai colleagues at the event and hear how the services I work on day-to-day are used in the real world.

Hang on, they flew people from India over to England just for the event!? What a waste.

Delayed reporting of Major Software Incidents

Process Problem

A few years ago, there was a period of time where I ended up being on the calls after a Major Incident (MI) with our software was declared. I was amazed at the clear failings with the process. There were all kinds of various managers, then maybe a few people from Deployment, but then barely anyone from Development. 

Then you’d have these managers just theorising if the Incident was caused by hardware or software, and if it was software – which enhancement/bug fix could have caused the issue?

It was pure guesswork of course, and occasionally they were right, but what is the point theorising when you could just get the people involved that can actually investigate it?

Sometimes I would hear about a Major Incident and then see that it was actually logged days ago. I think a problem is all the process between Support and Development. Support log incidents in their system and talk about “customer reference numbers”, but we need it in our system which is currently Azure DevOps and we talk about Work Item numbers. 

So sometimes there might be a delay even logging it in Support, and then there is a delay until it actually gets transferred over to our system. Often we are on these calls and we ask for a Work Item number so we can read information rather than just waiting for someone to mention it on the call… and then we are told that they haven’t created a Work Item yet.

I remember a time when users complained to Support, then they logged a Bug straight away, and did really good investigation. Then it would come to us with full details. Now, users complain for weeks, it gets escalated up to the Directors, then comes down the Development managers to Colin, then we have barely information to look into it because the users haven’t provided it, or is just “Chinese Whispers” and the information gets lost.

It’s so frustrating because how can you attempt to diagnose anything without all the required information? So the call is pointless, but when you do have the information, then you don’t want to be on a call – you want to go and start looking into it because you want to diagnose it then fix it.

So let’s look at one of the last examples I was involved in…

Example

Colin messages me about a Major Incident.

“I need some investigation…”

Colin

Apparently 179 sites are complaining about this problem and threatening to leave. Despite being complaining since the Friday release, Colin only knows about it Wednesday. Classic. Not the first time this has happened.

So what can I investigate? What is even the problem? All I know is there is a problem with a certain feature, but the thing is, we integrate with several third party API’s and I haven’t been told which one it involves, and I don’t know what the problem the users are seeing is.

I ask Colin to elaborate:

“not sure which provider. Can we look into all of them? So one of them may be broken, but we need to look at them all and hope we find it”

Colin

Wut. You want me to test them all out and hope I notice a problem? But it could involve just one and require specific steps.

When I finally got some information, it was pretty sparse.

“between 2 minutes and 12 minutes for the dialog to pop up” 

the problem

I told them I would have to see it happen, and see if there is anything different the user is doing to make it go from 2 minutes to 12 minutes. It sounds like a network issue, or not our fault.

“we will test it with a happy…well not a happy user, but an ‘engaged’ user”.

Manager’s suggestion of arranging a call with a user to witness the problem

I was then on a call with all kinds of random managers, all chipping in speculative accusations. “It’s a problem with the deployment“, “it’s a problem with the amount of data in their Tasks module“, “it’s a problem with the number of user-created resources“.

Colleague Opinion

I was discussing this with one of my colleagues and he re-iterated my views:

"they red flag anything nowadays - they just wave their flags around
It’s always the case that someone knew several days ago, but now it needs fixing immediately and it’s the first time any developer has heard about it

why can it not go:
Problem logged by customer -> Support discuss with Release Management -> Release Management arrange call with the correct Team Leader -> Prioritises the work with a developer and tester

I don't see how that's difficult

What actually happens:
Problem logged by customer -> sits in a list for a while
Problem management person looks at issue -> sits in list for a while
Someone kicks off and escalates the issue -> Director gets it in the neck -> Release Management notified
Release Management hold a call -> float many theories about what the issue is about
Developer randomly hears about issue -> mistakenly joins call mid-flow -> explains that it's probably related to the work item with the same keywords as the issue in the title
Developer now late with their own work
Release management say they'll prioritise the issue, but asks if you could start working on it -> Developer says no because you are busy working on 8 different things -> everyone in a huff
Team Leader nowhere to be seen -> likely watching the TV"

Apparent Analysis

A manager recently posted an update with facts that I was sceptical of:

“Analysis conducted into 2 years worth of Major Incidents

Some interesting trends have appeared and I think it’s worth discussing:

  • Data shows that most of the MIs are caused by either a 3rd party or tech debt/ops related issues. The number attributed to code change is pretty low.
  • We are lacking ownership around domains for existing products so not obvious which Engineering Manager is accountable.
  • We don’t have enough SQL skills to manage our complex DB
  • We rely upon a small number of people to investigate MIs.
  • MIs should be owned with the right teams.
  • Further investigation required on this and changes to ownership, structure, investment needs to happen.”

Release at Pace

Another interesting claim was made by another manager:

“There’s lots of interesting developments going on at the moment; we’re delivering more than ever before.”

Manager claim

I message the Software Delivery Manager to ask if there is any truth in that, because I thought we were releasing at the slowest pace.

“Who knows? I reckon one of those blaze statements that people just say to make it sound good”

Software Delivery Manager

On a recent Development meeting, one person posed a question to the Head of Development:

“Deploying software at speed is ultimately what we want to do as a business. However, this can come at a cost. We have had more Incidents in Q1 caused by software defects than we did in the whole of last year! How do we ensure the deployed code is at the quality required if we are going to deploy at speed?” 

Staff member’s concern about software quality

If we deliver more changes, I suppose there is more risk of introducing more bugs. If you are rushing, then you are more likely to create Major Incidents. I suppose you can say it is fine if there’s more bugs in general, but all considered low severity.

The Rapid Responders Group

As a response to this, I think Colin came up with the idea of the “Rapid Responders Group

“We are deploying our software at a pace we have never done before, so we can miss scenarios that could happen in the production environments as we have seen in the last two MIs. If we can get information straightway, we can investigate the issue straightaway. We all have access to the Live environment. With our technical ability, we might be able to see things that other people might not, so this is why I have assembled this team.”

Colin on his new idea

However, it was quickly shot down by one of our architects and never mentioned again.

“With one of the MIs, there was absolutely nothing we could’ve done between the people in this channel to anticipate that as it relates to a combination of live configuration and state that can’t be replicated.

In general the problems we have with the MI process is making changes takes too long due to processes and permissions, noise from the non-experts present (it’s hard to get a word in edgeways with some people), and multiple people bugging those performing the fixes/changes for updates (when it should be one person who fronts the technical team working on sorting it out)”

Architect

“We had first-hand experience of this on the last Major Incident call. We could have fixed it within 30 minutes but was on a call discussing it for hours.”

Colin
Architect:
It's usually the fault of those running the call or lack of confidence in Dev.
I will say when we have enough information to make a fix - that I'm departing the call to concentrate. As you say, it will otherwise go on for hours, with multiple people fronting opinions on the cause of the problem, unless someone identifies it with confidence and takes the initiative.

When an MI occurs, it's always the same group of people, which is often a pretty good mix, but first we need to identify the cause.
 
Usually it takes a long time for the details of the MI to be logged, particularly somewhere Development can all access such as a Work Item. If you miss the start of the call, it's difficult to know what the details of the original issue were: you can guarantee you missed something of importance.
 
I would suggest the following to help the diagnosis run more smoothly:
 
  1. When a release is made, it must identify a point of contact for each change, preferably the team email address making the change. 
  2. When an MI is started, a brief description must be provided in written form and a source-of-truth record started (such as a Work Item). 
  3. The Release Point Of Contact list is emailed with details of the MI starting.
  4. They might not need to join the call unless there is something they can add, but at least if they feel their input valuable to the diagnosis they can join or reply with details. 
  5. After identifying the team/person working on a fix, they are protected by a single manager. The manager will be responsible for communicating with the techies and the outside world, so they can concentrate. They will update the Work Item and email those who need to know progress, what the fix entails etc. 
  6. Work out a way to expedite changes to live and retrospectively log change requests
Principal Developer:
From the MI's I've been involved in, they mostly run smoothly - the only disruption is (as Mike said) people "sticking their oar in" and having a guess at what the problem might be - sometimes forcefully.

They are not always wrong, but sometimes it can distract from getting to the route of the issue, you need to have the confidence to talk over them and get the information you need, correct misunderstanding, and to keep the discussion on track. A lot of the time the initial presentation from support can be way off the mark, but that is true of most bugs we get due the lack of technical skill in support. Only the developers on the call are going to be able to diagnose a fault as a result of a code change. 

The primary focus of an MI call is to restore service ASAP, exploring workarounds is part of the developers role on the call - can we change a stored proc / setting to improve things now? This helps users and gives development more time to work on a fix. Another role is to assist the wider business (especially those in the Safety and Governance roles) to understand the issue - is it as bad as initially reported, or is it worse!?

Once we know what the problem is, and how we will resolve it, then it is OK to drop off and work on the fix.

Conclusion

I think it is clear that too much time is wasted discussing the problem with the wrong people. Managers need to find the correct group of technical people, give them all the information they need, then give them time without hounding them – in order to actually fix it.

Software Tech Jargon

When you work in the Software Industry, it’s obvious there’s going to be a lot of technical terms and abbreviations/initialisations. However, I think in many cases, you could easily write/say something in a way that more people could understand. I think sometimes people want to appear more technical, or maybe even “gatekeep” by trying to outnerd their peers. Over a long period of time, I have collected various written and spoken quotes. So here is a nice and varied collection. I don’t understand what many of these mean.

“I believe this to could be because of the contiguous memory necessary to rasterise an image of this scope.”

“I think if you are migrating the symbol server, then you need to consume the symbols”

.Net Nerd

“That’s why I use a View that bakes the invariants in so I don’t need to re-check them a number of times.

Adding this index could improve performance of the query by 47% and avoid using hash matches and parallelism operators.

DB Nerd

You have a couple of options here. 1. If the data is small then you might consider xcom as an intermediary to share data between two operators. Preferably this is up to hundreds of records and no further (without using custom xcom backends). 2. Sounds like you probably want something like a TrinoToCloudWatchMetricsOperator, it’s the sort of thing that would need to be implemented as it’s quite niche but could likely be re-used across teams. I tend to treat Python Operator as a fallback option now. If it really doesn’t make sense to write your own operator because it’s so specific and couldn’t be re-used.

 This code will need to be changed at some point in the future to detect the Evergreen Runtime as a prerequisite – removing the need for this Visual C++ runtime check.

For anyone interested in learning about Node.js and the MEAN stack to produce a quick REST API, this is a pretty good tutorial which dockerises the app too and deploys it to aws: https://blog.codeship.com/running-mean-web-application-doc…/ Incorporating a CI system like Travis, Jenkins or Circle, testing with Supertest or Postman and adding in aws clusters and load balancers means in a very short time you can create a CD system for the API too with a time to live of 3 to 4 minutes. Using all free tools like VS Code, Github and the AWS free tier means it can all be done without paying a single penny too. too much

Me 13:27:
can you tell me how a minimal deterministic acyclic finite state automaton would use less space than a trie?
Lucy 13:29:
7
Me 13:30:
This is because a DAFSA can compress identical branches from the trie which correspond to the same suffixes (or parts) of different words being stored.

what kind of nerd do you have to be to understand all this jargon?

The user account is in a different forest than the computer account. The processing of Group Policy from another forest is not allowed. Group Policy will be processed using Loopback Replace mode. The scope of the user policy settings will be determined by the location of the computer object in Active Directory. The settings will be acquired from the User Configuration of these policies. 

Windows Event Viewer.
now that is a good bit of jargon. What the hell is a forest?
This is from some jargon from FutureShop for some crazily expensive headphones.

The LCD-4, Audeze’s new reference headphone, is the result of dedicated research and development and advancements in materials science. It features Their amazingly thin nano-grade diaphragms and unique Double Fluxor magnet arrays for the most powerful magnetic flux density in existence, an incredible 1.5 Tesla! It also features a new comfortable suspension-type carbon fiber and leather headband and delivers breathtaking high resolution sound, imaging and transparency, with exciting dynamics.  

We are pleased to offer a free cable burn-in service for this cable when purchased through us. The Nordost VIDAR cable burn-in machine combines three different functions all in one operation:
It neutralises charges that build up around the cables and the insulation 
It provides a very wide band and deep conditioning into the conductor core, which produces changes in the way signals pass through the metal. 
It ultrasonically conditions the surface of the conductors.  

 So, we’ve now got a requirement to orchestrate some containers with Kubernetes and patch some MS SQL databases. Now we can bring Octopus in because we no longer have 180,000 machines to deal with, just the 300 or so database boxes with Kubernetes managing the rest of the servers running the containers. Throw in your CI/CD tool of choice to pipe directly in to Octopus and your container registry and you’ve got a pretty sweet setup going!

Me 16:30:
Enablers support the activities needed to extend the Architectural Runway
have you tried extending the Architectural Runway ?
Andrew  16:32:
i think there were protests about them doing that

Append blobs are made up of blocks like the block blobs, but are optimized for append operations. These are used for things like logging information to the same blob from multiple VMs.

https://docs.microsoft.com/en-us/azure/storage/common/storage-introduction

Suppress OrganisationLookup Index queries from the ambient transaction so that upstream callers can run their own transactions without escalating to a distributed transaction.

DB Nerd

The transaction log for database ‘tempdb’ is full due to ‘NOTHING’.

SQL Server error

Ongoing issues with L drive, so it has been recommended that we change the 10% buffer to 20% buffer. so the job stops earlier, but has less impact to live service and easier to support the job and provides more headroom if necessary. Will have an impact on how long the job to run.

“The StringFormat::GenericTypographic method creates a generic, typographic StringFormat object.”

Microsoft docs. I wanted to know what StringFormat.GenericTypographic actually does. Still non-the-wiser

 It comes bundled with a few really interesting tools developed by the CoreOS team, such as etcd, fleet, and flannel.

most organizations seem to be quite attached to an antediluvian model of testing all components in unison. We had two services on the backend — a gevent based API server and some asynchronous Python background workers which had a tangle of gnarly native dependencies including the C++ boost library which, if memory serves me right, was compiled from scratch every time a new Vagrant box got spun up

If you’re an Erlangista, you’re probably familiar with Fred Hébert’s manual on using the Erlang VM’s primitives to debug production systems while they are running. Languages like Go come with built in support for obtaining the heap, mutex, CPU and goroutine profiles of any running Go process Unit testing such service-critical I/O with mocks inherently embodies a sellout since it not just sacrifices accuracy at the altar of speed, but also ends up shaping our mental model in a way that’s almost entirely dissonant with the actual characteristics of the system we’re building.

Some good words thrown about in this blog: https://medium.com/@copyconstruct/testing-microservices-the-sane-way-9bb31d158c16
Me 11:35: 
have you heard of a kibibyte

Daniel 11:35: 
nope

Me 11:35:  
any serious programer know the difference between kilo and kibi... – Florian Peschka 

apparently its 1024 bytes whereas a kilobyte is 1000

In computing, a nibble (often nybble or nyble to match the vowels of byte) is a four-bit aggregation,[1] or half an octet. It is also known as half-byte[2] or tetrade.[3] 

Moreover, 1982 documentation for the Integrated Woz Machine refers consistently to an “8 bit nibble”

Wikipedia
Me 15:41: 
one day I'm gonna work out what Memoize() does and use it
Andrew 15:42: 
What is memoization and how can I use it in Python? 
if you don't know what it is then don't bother trying to use it
end of
Me 15:42: 
it sounds like a great word
"such as in simple mutually recursive descent parsing[1] in a general top-down parsing algorithm[2][3] that accommodates ambiguity and left recursion in polynomial time and space" 
Andrew 15:43: 
haha that's gotta be some sort of joke
Me 15:43: 
It says "simple" so it must be. You just aren't smart enough"Me 15:41: 
one day I'm gonna work out what Memoize() does and use it

I’d like to use NodeJS NPM package manager to setup a small gatling/postma/newman box for REST API testing. However NPM seems to have a problem with the corporate proxy. Does anyone have any tips for making the installation process easier?

Developer

“Before you can deploy Helm in an RBAC-enabled AKS cluster, you need a service account and role binding for the Tiller service.”

“making it volatile means it chucks out the thread-cached value for the variable each time it’s read. Therefore getting the actual value each time” 

Developer

The KeyStore Web Services 8.1 uses a contract first approach to web service development. This approach defines the message contract for each web method requests and responses up front using xsd schemas and WSDL. This allows KeyStore to establish a suite of fixed web service methods that can be managed and versioned between releases.  

Hierarchical xml messages are constructed using xsd type definitions in order to establish a request and response message for each web method. When referenced using tools such as visual studio .Net, this will create a client side proxy classes that developers can use to call the web methods.  These proxy classes represent a strongly-typed client side object class model for each method request and its response. This removes the need for web service clients to work with raw xml. It also has the added advantage of ensuring type-safety for many input parameters (e.g. Dates/Integers etc).

“STAThreadAttribute indicates that the COM threading model for the application is single-threaded apartment.”

Available now: Single-threaded apartment (fully-furnished)

Andrew with a joke

For Gafana those who want to use the dashboard I created the JSON attached just needs to copied into import for your local Gafana ,Can someone try this I am interested to see how ‘intelligent’ Gafana is and if it exports the Data Sources it should be looking for as well or if the user importing needs to get them up as well

We have a CIS hardened ubuntu image with ssm access as a base image. I have installed all my software dependency and then made it as an ami release image. When i use this new ami image as launch template and create ec2 instance i can’t able to connect ssm. I have enabled ssh connection and check the status of ssm it is enabled & running.

Developer question. Can you help him?

 I’m trying to create an Alias and a CMK key and trying to associate the alias with a secret. I was getting the following error during deployment using CDK “The operation failed because of an invalid KMS key: Alias arn:aws:kms:eu-west-2:xxxx:alias/rejs-alias-int-secret is not found”. I tried to directly associate the CMK key instead of the alias with the secret and it is working fine. I have also tried associating the alias of the same CMK key with other resources like s3 and it is working fine in that case too. I’m facing issue only with the secret and CMK alias combination. Am I missing out anything here? TIA

Developer question. Can you help him?

I’ve added some instrumentation to the FireInternal method on the EventBroker class to include the eventid in the exception message so we can try and identify where the null event is originating from. Going forward, maybe we should replace the .net 2 lock, queue approach with the ConcurrentQueue class in .net 4 to try and prevent any possible cross threaded operations / race conditions on the eventbroker. It looks like this issue isn’t just occurring on the quick access toolbar select patient operation but also on SessionControllers._messageReceivedWorker_DoWork method.

Developer

Kafka™ is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies. This can be done in a round-robin fashion simply to balance load or it can be done according to some semantic partition function

Likewise for streaming data pipelines the combination of subscription to real-time events make it possible to use Kafka for very low-latency pipelines; but the ability to store data reliably make it possible to use it for critical data where the delivery of data must be guaranteed or for integration with offline systems that load data only periodically or may go down for extended periods of time for maintenance. The stream processing facilities make it possible to transform data as it arrives.

https://thirdeyedata.io/apache-kafka/

–parallel

Similar to –stream, but completely disregards concurrency and topological sorting, running a given command or script immediately in all matching packages with prefixed streaming output. This is the preferred flag for long-running processes such as npm run watch run over many packages.

$ lerna run watch –parallel

Note: It is advised to constrain the scope of this command when using the –parallel flag, as spawning dozens of subprocesses may be harmful to your shell’s equanimity (or maximum file descriptor limit, for example).

Lerna

In parallel computing, an embarrassingly parallel workload or problem (also called embarrassingly parallelizable, perfectly parallel, delightfully parallel or pleasingly parallel) is one where little or no effort is needed to separate the problem into a number of parallel tasks.[1] This is often the case where there is little or no dependency or need for communication between those parallel tasks, or for results between them.[2]

Thus, these are different from distributed computing problems that need communication between tasks, especially communication of intermediate results. They are easy to perform on server farms which lack the special infrastructure used in a true supercomputer cluster. They are thus well suited to large, Internet-based volunteer computing platforms such as BOINC, and do not suffer from parallel slowdown. The opposite of embarrassingly parallel problems are inherently serial problems, which cannot be parallelized at all.

A common example of an embarrassingly parallel problem is 3D video rendering handled by a graphics processing unit, where each frame (forward method) or pixel (ray tracing method) can be handled with no interdependency.[3] Some forms of password cracking are another embarrassingly parallel task that is easily distributed on central processing units, CPU cores, or clusters.

https://en.wikipedia.org/wiki/Embarrassingly_parallel

Recruiting Graduates #4: The Applicants

Introduction

Other blogs in this series Recruiting Graduates #1, Recruiting Graduates #2, Recruiting Graduates #3.

Fredrik Christenson (I didn’t make a note of the exact video it was from) once stated good developers can be judged by:

  1. How they reason about a problem
  2. Their way of communicating with people
  3. How they voice their concerns/make decisions. Asking the right questions, pushing back in the right circumstances in order to get the right requirements; have “Guiding conversations”.

I think the general set-up of our interview can lead to this. The first part is for them to present the take-home test we gave them. They have to write a simple application with a UI and present data it retrieved through an API. The second part is to do some live coding, and define a few technical terms. Then the final section was some behavioural questions led by Colin.

Colin’s Update

Colin had interviewed several candidates for the Graduate Developer role in India. I asked him if the interviews had been going well, and he said the Graduates “couldn’t write code“. He said there was someone with a Masters degree, who then said they

just learnt the course material a few days before the university exams then instantly forgot it”.

applicant

I guess at that point in a programming interview, when the interviewers are asking why you can’t write any code, then there is probably no way to get yourself out of that situation.

Saying you are forgetful is just instant rejection, although points for honesty, I suppose.

My Preparation

When it was my turn to do some interviews for the UK-based applicants, I was worried. I hadn’t been given any training or guidance, and the questions we had come up with were poor and I didn’t feel comfortable asking them. I was also scrutinising their applications and was trying to come up with questions based on their descriptions of their university course, or small amount of work experience. However, when it actually came to interviewing, there was actually someone else leading the interview, and Colin turned up too. So Colin had misled me that I would have a big part in the interviews. Also, Colin said he never asks questions about their CV, and sticks to coding or behavioural questions – so I’d wasted my time.

To be honest, I’d wasted my time anyway – because the first 2 interviews I was lined up to do were cancelled with half a day’s notice. Not sure if the HR team were slack or if the candidates backed out late. Colin speculated that people were dropping out because they couldn’t do the take-home test we gave them (which they would present in the interview). Maybe that means it is a good test. Colin said that he didn’t give the take-home test to the applicants in India, which could explain why he ended up interviewing people that couldn’t write code at all. 

He didn’t give them the test due to our Indian Senior Developers saying the test was too hard for Indian Graduates to do (see Recruiting Graduates #1). To me, this seems like an admission that Indians are generally inferior, especially if they are happy for us to give the challenge to the UK applicants. This seems a very strange admission indeed. 

The Cheats

Colin also said many of the applicants were caught cheating. On the questions where they were asked to define technical terms, they were reading the definitions from a website. He said some of them hid it well in terms of eye/arm movements (since they had to have their webcams on). However, the phrasing was a bit suspect, so Colin Googled the response and found the website they were reading it from.

He said another candidate seemed to pause whilst they thought about a question, then all of a sudden pasted in a block of code plagiarised from a website. 

“HERE’S SOMETHING I PREPARED EARLIER”

fictional quote, inspired by the classic Blue Peter line.

Scoring

Colin did actually hire a few of the Indian applicants though, but when I looked through their Interview Feedback, the interviewers were scoring them 2/5 on most sections, but then a few sections were 0. So the scores were clearly a fail but we were hiring them anyway.

I also noticed that candidates who provided the programming answers in Python were scoring lower, even though, when I looked at the code – it looked correct. The problem is that it is a C# job and the interviewers only know C#. However, many of the Universities we were targeting used Python as their main language and we knew this up front.

So for the same job, we have a stricter process for UK candidates, and are also biassed towards C# candidates even though we only ask for knowledge of programming and don’t require prior C# knowledge.

Applicants

Time Magazine’s “Person of the Year 2006”

I did read through the CV’s of the people we hired. We hired Time Magazine’s “Person of the Year 2006”. I did wonder if Colin or the other interviewers had read that because it’s an instant red flag to me. It doesn’t sound like a legitimate claim, but then if you research who the award went to, it went to YOU. To put that on your CV is a joke though, unless you really did contribute significantly to online content. So if the candidate couldn’t justify it, I would just reject them.

Game Developer

For one of the guys that dropped out, I had some concerns with his application. Maybe he was legitimate but I think his claims weren’t backed up by the evidence he provided.

The first thing I noticed is that he stated “deep knowledge and proficiency in Java, Python, HTML, CSS, and JavaScript.” but I didn’t see any examples on his GitHub page, and there’s no commercial experience listed in his Work History. I wanted to ask him:

 “Can you tell me what kinds of applications you have developed using these?”

My proposed question

He did say that his GitHub profile “included group projects.” but which ones were Group Projects? Working on group projects is fine, but I think it needs to be clearer so you can judge what he has done on his own. If they had used source control properly, you would see the commits by each user – which is where I saw the major red flag. All the commits were actually done by someone else. The only thing the applicant had done on the entire repository in his name was to initialise the repo, and fix a build issue at the end.

Your profile has another “contributor”, can you tell me who that is?  – They have committed all the games to this repo.

My proposed question

Many of the games on the repository were Unity games, and I downloaded them, looked through the source code and play-tested them. For someone who had done a Games Degree, I was disappointed in the quality. Most of them I felt I could have made, and there were some really basic game design mistakes, and he said one of his University modules was “Advanced Game Design”. I wanted to ask this:

“If you worked on these games again: to fix bugs or improve the game design, what would you change about them?”

My proposed question

Example answers would be: In the Platforming game, you can stick to walls and the sides of platforms if you hold down the arrow key – which seems like an obvious bug. In his Snake game, it wasn’t clear what was happening, and you can move over enemy spawn positions to instantly kill them as they spawn in. 

For his experience working in Home Bargains, he claims he

“Engaged with customers and built relationships to advise customers on products they’d like to know about”.

Candidate, clearly blagging

Home Bargains is basically just a supermarket, and he is hyping it up as if it is a sales job and personally gets customers returning. That doesn’t sound like a valid description of this role. I shop at Home Bargains and I don’t ever recall seeing anyone talk to the staff there unless there is some kind of dispute. 

Python, Machine Learning Expert

The first guy I actually interviewed was about to finish his Masters degree, and has a Machine Learning degree. He seemed decent enough at Python to be able to do the take-home assignment, which he said he rushed through in a few hours because that was the only time he could dedicate to it. However, he seemed to struggle on the live coding part. I tried to prompt the candidate to talk us through his code, but he seemed to prefer coding in silence. I even helped him out by pointing out a bug in his code, but he ignored me, then wasted another 5 minutes working it out. I did wonder if he understood what I was saying. His CV claimed “Good communication and Presentation skills” but his presentation was full of “erms”, and during the live coding, he barely said anything, even when I reminded him to explain his thought process in order to gain more marks. By our scoring system, he scored very average but he has good credentials and I think there is potential there. You would think with his credentials, he would aim for a fancier job which could utilise machine learning though.

Possible Cheat

The second guy I interviewed got off to a good start. The program he demonstrated looked very complex. He said he was new to C#, and had good knowledge of C++, but he used our task as a good opportunity to learn C#. He actually used ASP.Net with Razor. It was mainly C# but it also contained some Javascript. He explained the program reasonably well, but then suddenly seemed to doubt himself and say that his program wasn’t very good. I assured him it was actually very impressive. However, when we moved onto the technical definitions, he couldn’t answer them very well at all. He really struggled with the live coding questions, then reminded us he is a C++ developer. However, after letting him re-attempt using C++, he still struggled to get something even close to what we asked. I find it hard to read C++ but he came up with some strange approaches and couldn’t explain his thought process at all. It made me think that he got someone else to write the take-home test.

3rd Guy

The third guy I interviewed seemed like a much well-rounded person. He explained his code well, asked questions when he was unsure of what we were asking, and showed he could debug (well, to a basic level anyway) when his code didn’t work. I made it clear to Colin that I thought he was the best candidate, but sadly he got offered a job elsewhere for way more money than what we could offer.

WE HAVE FLEXIBLE 
WORKING HOURS. 
INTERVIEWER 
NO. 
WE DECIDE YOUR 
WORKING HOURS. 
J) 
WorkChronicIes.com 
Fo//ow me on 
GREAT! 
SO 1 DECIDE MY 
WORKING HOURS ? 
WE STRETCH IT AS 
MUCH AS WE CAN. 
IT'S VERY FLEXIBLE. 
b

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.

Employee Profiles: Jeremy

Yesterday’s Employee Profiles, “Steve“, took me hours to put together, so here is a shorter one (but sadly not as interesting).

At the time I knew Jeremy, I think the older software Developers tended to be Seniors or Team Leads, then the majority of developers were in the 22-30 age range. Jeremy was probably early 40’s and was just a Developer, so that fact probably illustrated how good he was.

To be honest, I didn’t really know the quality of his work in detail, but just like Steve, he didn’t know many staff members, was quiet, and just generally came across as a bit dim. (Steve was actually a decent developer, he just lacked attention to detail, and then often just played it up for comedy).

“I barely know what I’m doing, never mind innovating”

Jeremy (his thoughts on “Innovation Week”)

There was one time he was waiting to speak to someone so he stood behind their desk, but he was perfectly still; just completely zoned out. I slowly pulled out my phone to try and video him but he suddenly sprang to life.

One day, I overhead his team update, he said:

 “I don’t understand what you want; but I don’t think I can do it anyway”

Jeremy

It’s an interesting quote when you think about it. If you don’t understand the requirement, how do you know that you cannot do it? But then you could look at it in another way: If you didn’t understand what they were asking, maybe it is just way above your ability, so you knew you couldn’t do it.

On a colleague’s leaving do, the team went bowling. One person was entering the names but missed Jeremy. It’s not a problem, it was easy to add players in.

“I seem to have been missed oooooout; I want my money baaaaaack”

Jeremy

He actually said calmly, but his slow way of talking just made it hilarious.

There was a manager, Jill, who was leaving. On her last day, she went over to Jeremy and asked if he could give an updated estimate on his work. For some reason Jeremy flipped:

What do you care!? it’s your laaaaaaast day!

Jeremy

Since he was quiet, it was really jarring to hear him raise his voice like that. Must have just had a bad day. I think I will always remember that day for his out-of-character outburst. That’s his legacy.

Employee Profiles: Steve

I found loads of chat logs from work, and additionally found a few quotes I wrote down from various employees. So today we are going to discuss the legendary employee Steve.

“Steve looks like a confused garden gnome that lost his hat”

Adam – colleague

Introduction

Steve joined as a Software Developer, and I think Steve’s carefree attitude meant his code was a bit inconsistent in quality. I liked working with Steve though, he was often quiet and just got on with his work, not really paying attention to anything else. It’s a pro and con really. Work got done (though often you had to prompt him to tidy parts up, or spot mistakes for him to perfect it), but then he didn’t know who many employees were because of the lack of attention around him. When he joined in the banter, he was quite “laddish”. A simple northern lad, Steve was well known to like his food and beer.

I just looked on his Facebook – and under “Political Views” it says “Democratic Alliance for the Betterment of Hong Kong.”

Andy

Sometimes he seemed to be quite unlucky and trivial events became more hilarious. Once, Steve opened up the window to let a butterfly out, and another one came in.

He always wore a t-shirt and even when the aircon was chilly, he loved opening the window. Sometimes even had the fan on whilst sat next to the open window.

Me 13:13:
how come Steve has a different body temperature to everyone else? Sometimes I think he isn't human
Andy 13:13:
haha, has he got his fan on?
Me 13:14:
he has the window open. Last week the air was directed at us so we were freezing. Now we have got him to open a different window, it's not so bad. Although, after a while, it does get freezing but Steve insists he isn't cold. Meanwhile Liam just said "I'm wearing my headset to keep my ears warm"

Knowledge of Colleagues

“I know people that are relevant to me”

Steve
Matt: "Do you remember Colin?"
Steve: "No, of course I don't"

“out of all the companies I’ve worked at before, I can only remember about 2 names”

Steve
Me: "Why is Simon leaving?"
Steve: "I don't care"

After our team member Paula moved up to Scotland and worked in our office there, Steve asked if Paula “was on her own, or if there was someone else on her team up there“. Paula is on our team, therefore if someone else was on her team, they would be on our team.

Charlotte asked Steve who wanted all these database changes and he said “John Bundy”. There is no colleague called John Bundy, and there never has been.

Matt: "The documents work item needs moving off the board because the Documents team are doing it"
Steve: "who is doing that? is it Gary?"
Matt: "No, it's Tony. You emailed him about it last week"
Steve: "Oh yeah, I did"

In his update, Steve once said “A chap called Jon Reaves has made some changes”. Jon had worked there for several years and is well known to everyone. Saying “a chap called” suggests he had never heard of him and thought he was new.

Food

Having 2 glasses of wine a week is unhealthy. You should be aiming for 30 units a week, mainly from beer.

Steve

“I’d rather eat my own feet than a KFC”

Steve

“Giving up beer and pizza is never a good idea”

Steve

Tracey was explaining how she went to London and had a fancy meal in Gordon Ramsey‘s restaurant. Steve chimes in:

“I went to Sheffield and had a kebab”

Steve
Matt: "I tried loads of stuff in Vietnam, no idea what it was"
Steve:[loud and affirmatively] "Bollocks"

It could have been testicles, Matt was explaining the interesting and different meals they have there, but it was funnier the way he said it like he had no doubt it was that.

“Four pints is what I call breakfast”

Steve

Steve was complaining that the office canteen has had “Toad in the Hole” for 2 days running. I said “I bet you ate it anyway”. Then he replies in a passive-aggressive tone:

“what else am I gonna do? eat the vegetarian option? Not likely.”

Steve

We once had 2 offices located close together. Our team had moved to the other office but we received a mass email from Mark stating he had brought cake in and placed it in the kitchen. Steve started walking to our kitchen (in the different office), Matt told him it’s not in that kitchen… but Steve checked anyway! He was desperate for that cake.

“Chickens come from seed which comes from oil”

Steve

Matt was originally talking about cars. Then Steve said all food comes from oil, then said that. I was instantly lost.

Software Development/Attitude to Work

“Matt! Myself and Phil are having a bit of a disagreement, and it’s about to turn to blows”

Steve
Matt: "Steve, have you done your Information Governance training?"
Steve: "I did it last year"
Matt: "what does the email say?"
Steve: "It said it is fine"
Matt: "Read it again"

In our team “Retrospective” meeting, we had to vote for “Team Member of the Sprint”. Steve voted for me. Matt asked him for the reason and he said

“I was hoping there wasn’t a second round of questioning”

Steve

A few weeks after finishing the Online Request project:

“Do you know how to switch on ‘Online Requests’?”

Steve
Me 13:41
guess how many unread emails Steve has. It's like he has been on holiday for weeks
Dan 13:42:
100
Me 13:42:
way higher
Dan 13:42:
500
Me 13:42:
closer, higher!
Dan 13:42:
I give up
Me 13:43:
550

No wonder he didn’t know what was going on.

His manager, Matt once stood at his desk and simply stated “Steve”, and Steve was baffled. I correctly assumed it was his one-to-one meeting. Even after Matt told him to check his calendar, Steve was still baffled what it could be. Classic Steve. Probably a meeting request in one of his unread emails.

We once had a meeting located in the main office. All our team dialled in remotely apart from Steve. From the video feed, we saw him walk into the meeting room late and say something to Adam.

Andy 12:36:
did you see Steve randomly turn up to the meeting?
funny as can be
Me 12:36:
yeah
Andy 12:36:
Mia had tears streaming down her face
Me 12:36:
why?
Andy 12:36:
cos why did he turn up when everyone else on his team dialled in
Me 12:37:
did he ask Adam if he was at the right meeting?
Andy12:37:
yeah!

“I was thinking of going for ‘Looks Good’ because there’s too many files”

Steve on doing Code Reviews. Too many files gets instant approval.
Charlotte: "what did everyone think of the meeting yesterday?"
Steve: "What meeting?"
Charlotte: "the meeting with Ronnie"
Steve: "oh, that. I'll be honest with you. I wasn't listening. I have no idea what was said"
Steve took an extended lunch break, and then later he went for a long walk. Matt challenged him on it "Didn't you go out for lunch as well?"
Steve said "yes" with a right cheesy grin
Doesn't care.

“Soon, I’m gonna be introducing lots of bugs. I’ve nearly finished my work; and I’m not dev-testing it”

Steve
Dan 16:18:
is he… what!? is he trying to get fired in the same way you'd act like a jerk to encourage your partner to split up so you get to feel morally superior?
Me 16:18:
haha, great example

A similar example…

Matt: "Steve, are you sure these changes haven't broken anything?"
Me (with fake confidence): "Yeah, because he ran the unit tests"
Steve: "Have I? I only ran the build"

Steve wrote a unit test with the following test data (Michael Jackson).

string doesNotContainsNumeric = "you know I'm bad, I'm bad, you know it, I'm bad";

He often used his name in variable names. He was supposed to choose good names before submitting it to review, but he sometimes forgot. Examples:

boolSteve
strSteve
SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "IOn", Justification = "steve") 
Me 13:53:
user.Surname = "O'Cake";
user.GivenName = "Pat";
Andy M13:53:
i'm sure i've seen that before
Me 13:54:
reminds you of your days in Pre-school
singing children's songs
Me 14:14:
OMG STEVE IS HILARIOUS
Matt googled Pat O'Cake and its a character from Bottom. He asked Steve about it, and he said "I wouldn't Google them all though, sometimes I use pornstar names"

Then a week later:

private const string _vouchingUser = "Bearstrangler McGee"; 
Andy 10:52: 
wtf
Me 10:52: 
Steve special
I never dare search for anything Steve puts in unit tests after he said "I sometimes use porn star names"
Andy 10:54: 
haha
i hope that's not the name of porn star

Then there were some interesting reasons:

Me 14:48:
"CancellationReason\": \"patient has lost keys to handcuffs\"
why is Steve different?
Andy 14:48:
what the hell?
Me1 4:48:
const string cancellationReason = "patient was visiting a massage parlour";
Andy 14:49:
is he checking this stuff in?!
Me14:49:
yes, it's in our branch
Andy14:50:
he's an absolute lunatic

Steve was working on fixing a bug that Matt was also fixing (but we didn’t know it at the time). The next day Matt and Steve were both on annual leave, so Matt had handed his work over to me, and Steve handed his over to Jim. I finished my work, and Jim even passed my code review without even realising the similarity. It’s like a comedy show sometimes.

Steve had completed a feature, but his changes had broken Matt’s last bug fix.

“it worked for my user story”

Steve. It’s like the classic “it worked on my machine” that software developers love to say

Steve completed the work for saving Users to the database. I just tried it and it crashed. We asked him how much testing he did and he claimed it was all working. I showed him and he said “I forgot about that way”. There are only two scenarios, add from existing user, and add new user.

“I don’t think the Database Tool is working. I think it is completely goosed”

Steve

I just caught Steve smurf naming even though in his last code review, Phil told him not to.
So then he looks up Smurfs on wikipedia. He clicks Smurfette and says “I’ll see if she is fit“.

I have no idea who brought a “dunce hat” in, but we decided that if you somehow break the build, then you wear the hat. Steve wore the hat quite a bit.

“I don’t need to wear the hat; I haven’t broken the build. I’ve just broken the product”

Steve

Not sure how he did it, but Steve once sent code to review which had the same title as the previous change he did. It also had the wrong User Story linked to it. (-‸ლ)

I told Steve that he was supposed to roll back one of his work items. After a few seconds he said it was done. I was sceptical. He said that I had already deleted the other part of the change. So I looked, and I hadn’t. He then said

“to be honest, I didn’t even look at it. I didn’t even compile it”

Steve

Miscellaneous

“Any advice that starts with ‘do not expose’ is good advice”

Steve

Liam was telling Steve that an angry resident left him a note on his car telling him not to park there again. Steve then comes out with this…

“Just piss through their letterbox”

Steve

We were playing badminton after work, and Steve said he had to rush off. Mike asked “are you doing something interesting?”. He said his parents were coming over later and he had a massive stash of weed to hide or smoke.

“I accidentally googled porn with my mum on mother’s day”

Steve

He was helping her with a crossword and the clue was “goddess of nature” and he wrote “goddess of mature

Farcical Development: Templates

The Plan

A developer in my team, Isobel, was free to pick up some work, and she knew another team had too many items assigned, so their Team Lead contacted us to ask if we could pick up the work instead. 

I wasn’t opposed to the idea, but we didn’t know what the enhancement was at the time, so didn’t know how long it would take and didn’t know if our Testers would be available to test it, or would the other team test it? It’s unclear, but their Team Lead wanted me to commit and accept reassigning it to us.

When I looked at the enhancement details, there was loads of confusion because it had loads of code changes linked to it, and was logged about a year and a half ago. It turns out, a year ago, a developer had done the work, checked the code in, but then got told to “roll it back” due to lack of testing resources. Then instead of going into the next release, it was somehow delayed a year… Now we have a lack of development and testing resources! 

There was this comment too:

The change will then need to go out as an urgent/emergency release. As the functionality is deemed potentially unsafe, we only have 7 days to get it out, it’s actually 6 now as it was logged yesterday.

1.5 years later… 

There was another item I was assigned recently, and that had similar chaos with how long it sat on our backlog

10th November 2020 - bug logged
15th September 2021 - assigned to the team

No wonder our users are often reluctant to report bugs because we don’t seem bothered about fixing them. Then our release process is also really long so sometimes there’s a 6 month lead time after we fix it.

I'll try and quickly explain the feature: Users can create these Templates which are composed of components. There's these special "calculation" components which use data added to the record and give you a score. Users can add data-entry components to the template which can be used by the calculation components. However, it's not clear which data is used, and we can change the calculation formula at any time; which makes it “unsafe”. You can also group several components together to make a Group Component. So the plan is basically to stop users from adding these calculator components, and they have to use our own Group Components which will have the calculator and the prerequisite data-entry components with it. For existing templates, we just have to show a message, telling the users their template isn’t recommended to be used.

I was invited to a meeting along with Isobel, and the managers tell us that all we need to do is take the old code, update some user-facing text which the UX team will confirm, then it just needs to be tested, but it should all work since it was ready for testing over a year ago. So in terms of development work, it sounds like we’d spend more time in meetings and generally discussing the work – than actually doing the work. (I later find out this is not true).

Assigned to Isobel

I tell Isobel to go through the changes and make sure they really do meet the requirements. A few days later, Isobel says she is on annual leave for 2 week but the changes are fine. The next day, I’m told I should look at it instead.

Assigned to Me

After an hour of testing it out, I find that there was:

  • A control partially truncated
  • Some extra spacing in one of the error messages
  • Some components that were disabled that shouldn’t be
  • Inconsistency in behaviour between “Templates” and “Templates Pro”
  • Group Item logic was completely wrong
  • Blank warnings were appearing for all other components

So how did the original developer think this was ready? Why did Isobel think it was ready?

So I start to fix the issues and I find copy-and-pasted code, redundant code, unclear code, code which could easily be unit tested but isn’t. I spent around 3 weeks sorting it out and it still wasn’t perfect. Meanwhile, I was invited to other meetings to say they changed their mind about some features. I had to undo some changes, change more UI text, and disable a few more components. In hindsight, I think I may as well have binned it, and started it again from scratch.

When I thought it was ready, I had the Pull Request created in the first week of January, ready to be checked-in for testing, however, there were no testers free, so it sat there for a month.

Eventually, the testers begin testing it and find a few problems with it. I fixed 3 out of 4 issues, but the last one seemed to be impossible to fix due to another bug which really needed to go to the specialist team that dealt with that area. 

The actual template knows where it came from, but the Group item inside doesn’t. There was this interesting variable name that made me smile.

isOneOfOurs

I showed it to a colleague

“seems like Britain First wrote this”

Bants from colleague

There was some code where we set the originID to either the user’s or our organisationID. However, it set it to 0 which then assumed it was one of ours. I tried looking at one of the other properties which was a different type of ID; a GUID, but it was blank, so it was broken there too. 

I couldn’t see a simple way to fix this. It would be far too risky for me to change, and I definitely didn’t have time. So I got told to abandon it and it would be reprioritised.

I think it was around 6 weeks later, it was assigned to another team. So it is now it’s with its 4th team, approaching 2 years later. Maybe we can call this a “pass the parcel” enhancement.

Assigned to Kumar

I was aware that the development re-started (along with some other requirement changes) when I saw a Pull Request for it. It was from Kumar, a developer in India that is absolutely rubbish. Not only that, it is quite hard to help him because his English is fairly poor. I also can’t tell if he is trolling, or if he really is that bad.

I would have thought that Kumar would have been told to speak to me about the work so I can “hand it over”, or at least he should have seen my name and comments on the item and shown some initiative and asked me about it. As it goes, this new change was something I already had fixed, it just wasn’t checked in. I could tell his fix wouldn’t work just by reading his changes. I message him telling him this.

He later responds with this conversation:

Kumar  10:11
Hi Mate
10:12
With the changes i have raised as a PR, I created a page as Group item and section as well with itself containing the components as Group as well as non Group items and it seems working  .
can i share you the screen mate ?
Me  10:14
so a user authored page/section Group item which contains one of the components - shows the message
and a Officially-authored page/section Group item which contains one of the calculators - does not show the message

Kumar  10:14 Exactly mate Kumar  12:34 Hi Mate, Shall i comment out that the fix has completed the scenario we discussed here ?

I didn’t believe him, so I checked his code out, built it and tested it out myself. Obviously broken as expected.

Me  12:50
just trying it now and it looks broken to me
got an Officially Authored Group Page and all the components have warnings next to them
Kumar  13:10
Ok dude, I will have a look on it.
Kumar  13:31
Hi Mate, As u said it was showing up all the warning
I might have not removed the Pages and section flag check for showing warnings
will debug the code mate,

The next day

Kumar  07:12
Hi Mate
Good Morning Mate

I look at the latest Pull Requests and see his new changes. Instead of taking my code that I know works, he has come up with his own solution. I think it might work, just harder to read.

Me  08:59 did you test my changes or just write that yourself? 
Kumar  09:11
no mate i have took it from latest service branch of my team
was everything fine mate ?
i tested that locally and working fine
Me  09:13
it is similar to what I had done, just more lines of code
Kumar  09:14
haha, ok mate i will make the changes as suggested in the comments
Thanks Mate

It’s not really funny. You just wasted a full day’s work because you didn’t just use my code.

I explained to him that this item is a bit of a nightmare since there’s multiple places you need to change due to “Templates” and “Templates Pro” which doesn’t share much code. Then there’s some existing bugs, and many different combinations of templates you can create. He doesn’t seem to test his work at all, so I think he had no chance of getting this working. I was trying to emphasise how much testing needs doing with every change to try and get him to put some effort in. Unit testing would help alleviate some of the manual testing. The next day…

Kumar  13:27
Hi mate, Good noon
It is becoming a night mare as u said :joy:, i have completed with the unit test case also have fixed other area like Warnings were happening in the “Admin org” too. i have fixed that now. Kindly review and guide me to proceed further
Me  15:58
<send him picture> that should have the main yellow banner at the top shouldn't it?
Kumar  15:58
If it was a “Admin org” org, it should not have mate
Me  15:59
it's not
Kumar  15:59
Then it should have i believe
haah, one more PR patch upcoming ..?
:exploding_head: literally with this work
Me  16:17
I suggested 2 unit tests. You have only done 1. I think it is the other scenario where it doesn't work
Kumar  16:32
Ok , but if the method will not execute if the template was Group template mate, so do i need to do that as well ? in turn it returns empty
Me  16:40
isn't your requirement that it shows the message regardless if it is Officially-authored or User-authored
Kumar  16:41
yes, that is the requirement
i will check on the code once again mate
haah lil confusing

Although the overall work is confusing, this is one of the simplest parts of it: Show a message regardless of who created it. If the method is “returning empty” then that is the bug, it should return a message.

There was a line of code like

if (!configEnabled && activeSubscription)

and he changed it to

if ((!configEnabled && activeSubscription)
||
(configEnabled && activeSubscription))

so I wrote: “so just activeSubscription then

Kumar: I am not able to get ur point here, kindly guide me

Me: “true or false” is always true isn’t it?

Kumar
yes mate, so shall it be framed like this
if ((configEnabled || !configEnabled) && activeSubscription)

NO! That still says “true or false”. I was trying to think of how I can write a response without telling him he doesn’t understand the very basics of programming. This is like Day 1 of learning how to write code.

Kumar: haah, I got it, just “activeSubscription” is enough isn’t it?

I was glad he seemed to understand in the end, because I was tempted to tell him to change his career…then he adds:

“correct me if I am wrong”

He has zero confidence.

The very next day he then tells me there is another requirement to remove the banner that he has been changing, so “is there any point carrying on?”. He sends me a screenshot of the requirement rather than giving me a link. He is definitely sent here to troll.

I’m sure he must have known about this, and I don’t know why he either:

  • didn’t make the deletions first (it would reduce the amount of code and reduce confusion)
  • not change any code he knew he was going to delete

So he made changes trying to fix a feature he knew he was going to remove. I had invested time reading the code, manually testing it, and all this back and forth communication. What a waste of my time.

Unassigned?

The good news is that he is leaving so he is going to be another company’s problem. The bad news is this enhancement is going to be reassigned to someone else.

I’ll probably write another blog about Kumar; I’ve got some more notes on previous development work he has done. If this enhancement ever goes live, maybe I will write a follow-up blog on it too.

Game Review: Say No! More

My previous blog was a review for the game “Game Dev Tycoon” which was relevant to this blog due to being directly about software development. “Say No! More” isn’t about software development, but it is about office culture and seems like a social commentary on people being overly obedient to please managers in order to progress through the hierarchy.

You play as an office intern who starts a new job alongside two others. The boss introduces the company and jokes that you have to say “yes” to go far. One of the interns is excited because she is someone who loves saying “yes” and pleasing managers.

Your character struggles to speak but he soon finds a cassette player with a motivational tape which teaches him to say “No” with confidence.

This manager has left his lunchbox at home so he steals yours. This leads you to chase him to his office to get it back, but you are constantly stopped by your colleagues with random requests. You shoot them down with your newly learned word: saying “no”.

“Can you get me a coffee?” “no!”

“Can you copy these documents?” “no!”

There’s even a few dialogues where you can wait for something different to happen, but there’s no negative repercussions if you do say “No” to them. The movement is automatic with on-rails movement and you just press a button to say “no” and move on.

In each chapter, your character listens to more of the motivational tape, and so he learns new powers like charging up your “NO” for a more forceful statement, or sarcastically laughing, clapping or nodding which catches people off guard, allowing you to shout them down. You also learn different tones: cold, heated, crazy, lazy. However, it doesn’t actually make a difference even though the Tutorial makes out that these different types are necessary against some people.

The game hasn’t really got any gameplay, it’s more of a humorous experience, relying on the comedy, quirkiness, and the ragdoll/destruction you see when you say “no” and knock them down.

I say it does succeed; it did keep me entertained for the 1.5 hours. If it was longer, then it would become tedious. It reminds me of Weebl’s cartoons; its wacky style, combined with some of the “No” voice samples which sounds like “Weebl and Bob“‘s way of speaking.