Bulk Approvals Feedback

In our software, we have a task list where “requests” go. They can be created by our users, or online by their customers. We have 2 boxes where these go: “Requests” and “Requests With Queries“. As far as I understand, the Requests are often safe to approve because it’s basically just a repeat order and added by the staff member so has already had one official approval on it. When there is some uncertainty, they go into the “With Queries” box for more scrutinisation. The requests coming from online always go into “With Queries” and require more scrutinisation.

The time it took to click approve and then load up the next task was quite slow. We added a Bulk Approval feature where the user can view tasks quickly, then approve several at once which means they don’t have to go through the load/send/load/send/load/send workflow. It’s more like load/load/load; and the sending can be done in a background process.

For Requests, this bulk feature worked fine because they can be quickly reviewed, then sent. For ‘With Queries’, it made sense that our users would want to bulk review the user-created ones, but the customer-created ones would require further time to review. So we decided to create a new box where the customer-created ones go.

This was requested by some of our users, and it made sense to us. However, we didn’t ask all our users if it was appropriate for them.

So when it went out, many users complained that we had “doubled their work“.

The comments from our users often seemed strange, but many seemed to be saying they had a Receptionist that went through all the tasks and reassigned the task owner to different staff members so they all had an even amount of tasks. Then each user would check their tasks and approve them. They referred to this as “regulated distribution”. We were baffled why having the same number of tasks as before but just located in 2 boxes rather than one would be a problem.

One user said this:

“unfortunately we don’t work like that. The requests have to be counted – so many queries and so many straightforward. They are allocated daily and completed but have to be collected and centralised first.. Nightmare for us.”

Another user said this:

We cannot work out now within this new box which are queries and which are not so we are having to open every single one ( 500 today) in order to sort them out.

But before, all these tasks would appear in the Requests With Queries box because they were all customer-created. Now in the Requests With Queries box, they should be able to review these faster because each one would require the same level of scrutiny, whereas before, they would have to keep looking at the “source” to see if it was from a user or customer to decide what level of checking it required.

I think it must be the case of just being shocked when something changes and reluctant to adapt.

During development, we also debated what the Review Date really meant. If it was set, then we check if the date has passed and don’t allow these to be bulk approved. However, customers can have no Review Date at all which we interpreted to mean it wasn’t applicable to them, so we allowed all their tasks to be bulk approved. However, one particular organisation thought this was very unsafe for them. They wrote an interesting write-up, full of capitalised letters and very much geared to a Hazard Matrix:

This issue has been discussed at the Joint IT Committee, who are expecting feedback in due course. 

The Committee's concern is that there is a HAZARD that items may be issued through Bulk Approvals that have not been appropriately reviewed. The CAUSE of concern is that the Bulk Approvals module includes orders for customers who have no items Review date. Where an organisation's business operations involve using items Review date to govern their ordering, the EFFECT may be that a customer whose items has not been appropriately reviewed may have bulk approved orders (potentially repeatedly). The HARM to the customer may be any of the wide range of harms that can come about through unreviewed access to order items including death. Therefore a LIKELIHOOD needs to be calculated (you are best placed to do so as you can audit your records to identify how many customers have had repeat orders issued through Bulk Approvals, describe any case reports you have had of customers who have been harmed (and near-misses), and estimate the future risk by identifying how many customers have repeatable orders and no review date.

I believe that on your hazard matrix, the CONSEQUENCES therefore could plausibly result in death = CATASTROPHIC

The LIKELIHOOD I would appreciate your guidance on, but I wonder if it might be UNLIKELY i.e. likely to occur some time (the longer it is running the higher the chance), or if you have other CONTROLs I'm not aware of, possibly EXCEPTIONAL i.e. unlikely, but may occur exceptionally, which would give the HAZARD a rating of HIGH or MEDIUM.

The Committee would therefore be grateful for more detailed feedback on the HAZARD so that we can respond to our Members. This might be the relevant row from your Hazard Log for example, but a narrative description would be fine.

The suggested REACTIVE CONTROL is to consider excluding those customers from Bulk Approvals which would ELIMINATE this cause. There are alternative controls but none that would eliminate the cause entirely that we are aware of. In any interim, a organisation could mitigate this risk until any change in module behaviour if they audited their customer records to identify customers who have current active repeat orders but no review date.

Incompetent Developer Tales

We had an Indian Developer who wasn’t very good and he wasn’t that great at communicating in English. I don’t mind people starting out as a Junior and improving over time, but sometimes I think you need to have a mindset for quality and care about your work, and Manikandan didn’t seem to have that.

Text

Making a change which involves updating text is one of the easiest changes in software development. This particular area of the code had unit tests to check the message we were displaying to the user. So if the requirement changed, you would have to update the unit tests, then change the actual logic. Manikandan changes the code, but for some reason puts an extra space at the end, and doesn’t update the unit tests.

“As suggested the changes were made and PR got patched.” 

Manikandan

Another change he did involved changing the file path of where a specific file (sqlite) was meant to be. He ends up changing the file path for some other file instead. I pointed it out and he claimed he had tested it.

“I have dev tested this yesterday, it looks like i have missed sqlite folder path.

Mistakenly i have taken up the cache folder.

Will update and patch the PR. Apologies as i have misplaced the path location mistakenly and have corrected it now and done dev testing”

Manikandan

Corrupt Files

When viewing files that have been attached by users, some of these we natively support like text and images, whereas specialist files we allow opening externally. Some we blocked completely. 

A new change would allow files to be saved regardless if they were unsupported or we suspected them to be corrupt. We will inform the user of this though, so this was the 2 requirements:

When you attach:

This file “xxxxx.tif” has been successfully attached. However the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.

When you select “open file”:

This file “xxx.tif” cannot be opened because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.”

He writes the following note in the bug report:

Made a proper message information need to be displayed to the user as well as restricted further attachment of the corrupted file into user record history.

Manikandan

So that sounds like he is blocking suspected corrupted files, which is not the requirement.  When I looked at his code changes, it seemed like he had done the wrong thing.

So I ask him:

“Have the requirements changed since the product owner’s comment? It looks like you have the message that should be displayed, and it sounds like the attachment should still be saved.”

Me

he replies

“Corrupted Document will not be attached to the record. Once again checked in the database to confirm”.

Manikandan

So I reply again:

“Who has decided that it shouldn’t be attached to the record? The Product Owner said it should be attached and there should be a specific message shown to the user.”

Me

“Apologies for that, will check once again with product owner”

Manikandan

Got the update and have made the changes as per Document gets attached to the record irrespective of the document was corrupt or not. Will show a message to the user regarding the file corruption but allows the user to attach the doc irrespective of its correctness

Manikandan

So it seems he finally understands the requirement. However, when he submitted his change to review, it will show a message on Loading (but not the one the Product Owner asked for), but will still crash on Save so he hadn’t really changed anything.

Finishing my work

I had made loads of changes for a new set of validation, but didn’t have time to finish it off as I got moved onto a different project. I had to hand over my work to him. He made some changes and submitted it to me for review. One file I had already wrote the code to show the new message, but then he had added another IF statement, and added the exact same message, however it had some extra spaces in it! So redundant code, and it was wrong.

Another requirement was 

This Warning should be available irrespective of Admin Org flag...”. Yet he had an If statement to check for the flag.

else if(IsAdminOrg)
 {

There should be no IF statement because it should happen regardless if the flag is on or off.

In another code block, his logic was based on a check :

specialisedCode.Equals(SpecialisedCode.HDS3)

This equals check wouldn’t actually ever equate to “true” because the comparison was against different object types. And even if it did work, won’t this display the same text twice? He already added code to add it to the list, then had some code to add it again if the If statement was true:

 if (matchedItems != null)
{
	var displayName = matchedItems.GetAttribute("displayName");
	var specialisedCode = matchedItems.GetAttribute("code"); ;
	if (!allComponentNames.Contains(displayName))
	{
		allComponentNames.Add(displayName);

		if (specialisedCode.Equals(SpecialisedCode.HDS3) || specialisedCode.Equals(SpecialisedCode.HDS4))
		{
			allComponentNames.Add(displayName);
		}
	}
}

In another part of the code, he had this code

var hasExceptionalComponents = HasExceptionalComponents(sectionDefinition);

if(!data.IsSystemLibraryItem || (data.IsSystemLibraryItem && hasExceptionalComponents))

So if the first part of the if statement wasn’t true (“!data.IsSystemLibraryItem”), then it would evaluate the second part, but data.IsSystemLibraryItem would always be true (since it is just the inverse, and the opposite of “false” is “true”). So that bit could be excluded; so yet more redundant code from Manikandan. This would mean you could write:

if(!data.IsSystemLibraryItem || hasExceptionalComponents)

but what was he doing if this statement was true or false? Here is more of the code:

if (!data.IsSystemLibraryItem || hasExceptionalComponents)
	FormListFromTemplateSectionDefinition(sectionDefinition, allComponentNames);
else
	FormListFromTemplateSectionDefinition(sectionDefinition, allComponentNames);

That’s right, he was doing the exact same thing, so that code block can actually be one line:

FormListFromTemplateSectionDefinition(sectionDefinition, allComponentNames);

So the majority of the code he writes is just redundant. How can you be so incompetent?

When I flagged it to Manikandan, he said

or i am i missing it somewhere, sorry. lil bit confused on this, as i am alone working on this project.

Manikandan

This isn’t a misunderstanding of the requirements, it’s just a lack of care and thought.

The Curious Case of Paul’s Holiday: A Software Saga

This is a story of how you can find a bug before users report it, but don’t end up fixing it due to other priorities or communication breakdown.

I was trying to investigate a bug with our software, and ventured into a related module to try and configure it. However, it crashed. After looking at the code where the crash occurred, I found the developer that had likely caused it, and it was a change he made in the previous month. I sent a message directly to Paul to alert him to it. There was a chance the change hadn’t been released yet, and he could fix it in time. Or if it had been released, then it probably needed to be fixed urgently because the feature looked unusable as far as I could tell.

Paul replied stating that he had realised his change had caused a bug elsewhere and this was essentially the same mistake, so he would add it to his list of things to fix. However, he was going on annual leave in a couple of days so would need to hand it over to his team.

He sent an email to his team and copied me in.

Recently my change had caused a bug in Resource Manager. If you archive and unarchive a template it causes a crash. It became evident that there is the potential for two more crashes to occur that are related.

Schedules (clicking on any folder, demonstrated by Praveen)
Assessment (found today, but we believe this only is used by 1 site)

Root cause is that the control that I changed is the same in these other areas, however these “resources” do not have a file size.

I have created a bug for it, and raised a draft change which I believe would fix the issues (I have done some local testing but more required).

This could be picked up by someone else in my absence if it needs to be progressed asap (code is live and not behind a feature flag).

These discoveries have been through our own efforts, not through Support.

Needless to say, this feature has had its fair share of issues, and I will write up a report/lessons learned document upon my return.

A few days later, Paul returns back from his annual leave.

[15:13] Paul Marshall 
you know that bug in assessments module you highlighted the other day?
Major Incident raised. Only 2 complaints so far, but we have found more occurrences when browsing the error logs.

[15:35] Paul Marshall
I raised the PR (draft) but did not progress it as I was literally going on holiday that day. I emailed a bunch of folks and gave the full picture to them, including all the evidence and PR but it wasn’t moved on.
When I was back I raised it and it sat there not reviewed by the team even though I asked repeatedly to have it reviewed.

Sorry, bit of a rant there....
its moving now

[15:40] Me
let's write a blog post for Viva Engage about how we came close to preventing a Major Incident
others foiled our attempt

Emails were flying, managers were sighing, and somewhere, a developer was crying.

AI
The Curious Case of Paul’s Holiday: A Software Saga

Once upon a time, in the not-so-far-away land of Software Developmentia, there was a developer named Paul. Paul was a diligent worker, known for his sharp eye for detail and his love for datagrids. One fateful day, Paul made a change to a datagrid that was nothing short of genius… for a certain group of people. For another group, however, it was a disaster waiting to happen.

Paul, with his developer senses tingling, caught the potential calamity before it unleashed chaos upon the unsuspecting second group. He crafted a fix as elegant as a ballroom dance and sent out an email to his manager and team, detailing the issue, the solution, and the testing needed. It was a masterpiece of communication, a symphony of technical jargon and urgent pleas. And with that, Paul packed his bags and set off on a well-deserved holiday, visions of bug-free code dancing in his head.

But alas, in the twist of all twists, Paul’s team, perhaps too mesmerized by his email’s eloquence or too entranced by their own holiday plans, did nothing. The fix sat, lonely and unimplemented, as Paul’s toes wiggled in the sand and his out-of-office reply cheerfully told people he’d be back soon.

Upon his return, Paul found his inbox flooded with the digital cries of users caught in the datagrid debacle. The issue had gone live, and chaos reigned. Emails were flying, managers were sighing, and somewhere, a developer was crying.

What can we learn from this tale of holiday woe? Perhaps it’s that communication, no matter how clear, is only as good as the action it inspires. Or maybe it’s that one should never go on holiday without ensuring their work is done… or at least assigned to someone who isn’t equally holiday-bound.

So let us raise our mugs of coffee to Paul, the developer whose holiday will forever be remembered in the annals of Software Developmentia. May his next vacation be free of datagrid disasters and full of completed tasks.

And to all the Pauls out there, a word of advice: double-check your team’s to-do list before you hit that out-of-office button. It might just save your holiday… and your datagrids.

Early Morning Meetings

We had our daily “Stand-up” meetings at 9:45, where the team states what they did yesterday and what they will aim to complete today. In our “Retrospective” meeting, where the team reflects on what went well and what didn’t go well over the last 2 weeks, and also what improvements could be made, one developer questioned why we have our meetings at 9:45 rather than 9:00.

Most people in the team start their day at 9:00, so to do a bit of work, then have to go on the meeting seemed like a distraction. After thinking about it, the longest serving team members said they might have set that time due to the previous Product Owner having several teams and it was the best slot for them to attend. Then no one questioned it and so it remained.

I suggested that we start at 9:05, given that if we turn on our laptops at 9:00, we will end up being late. Often if team members request help at the start of the day, they often reply “let me get my coffee”, so it made sense to allow people to finish their breakfast and get a drink. People seemed to think it was a good idea.

However, the next week, the meeting invite was set at 9:00. I questioned some of the team members.

[Monday 09:19] Me
has Sam ignored my idea of starting at 9:05 instead

[Monday 09:20] Dennis
must've

[Monday 09:24] Dean
what was the 9:05 idea? can't remember that

[Monday 09:25] Me
I said if we start at 9, it gives us a chance to get logged in, and you get your coffee
then everyone was like, "yeah dude that is sick idea mate", and you kicked off about being falsely accused of wanting coffee

[Monday 09:26] Dean
haha i don't fully understand
i get logged in and get my coffee based on what time the call is
T - 5 mins
doesn't matter whether that's 9am or 9:07

Dean had previously criticised me for being late to a meeting that was arranged for 8:30 (before my 9:00 start), and I had missed another that was arranged less than an hour’s notice. I felt like he was using this as another opportunity to question my attitude towards meetings.

On the third day, Dean then says he is finding it really hard to get used to starting at 9:00 and might consider asking for it to be moved back to 9:45. He finds it hard to wake up and be alert for the meeting. Some days he will be late from childcare because it’s a bit of a rush back and can be hard with the traffic.

Quite interesting how he made out he always starts working before 9:00, and made sure he is ready for any meeting 5 minutes before it starts. Then when it comes down to it, he admits he starts late some days due to childcare, and other days he isn’t fully alert to work efficiently. So when we had our meeting at 9:45, it seemed like he was never really working at 9:00 like he claimed, whereas I would be ready at 9:05.

Self-Assessment

Recently, we were filling in our forms for the end of year performance reviews. We have tried all kinds in the past, but have settled on something simplistic in recent years. It’s basically structured around open questions of “what went well?”, “what didn’t go well?”, “What have you learned?”, “What would you like to learn?”. 

Since we had already just evaluated ourself, it was  a surprise to get an email directly from the CTO wanting us to evaluate ourselves.

Hope you are well. 

We are currently conducting an assessment exercise across our Portfolio to establish our strengths and areas for improvement, with the goal of growing our capability as a department and to drive to our long term vision of moving to development on our new product.

To facilitate this process, we have developed an assessment questionnaire that will help us understand your capabilities and your career trajectory.

Could you please complete this form by selecting the option that best reflects your current capability or skill.

It’s an unexpected email, states urgency, and contains a suspicious link. All the hallmarks of a phishing email. I waited for a colleague to click the link before clicking mine. Given that it asks similar questions to what is on our performance review, as well as many others that are specific for our job role; why wouldn’t they just standardise the review process in order to get the information?

Clicking the link loads up a Microsoft form with Employee ID and Name filled in with editable fields but the question says “Please do not change this”. My name had double spaces in it which was really annoying. What would happen if I did correct it? Does Microsoft Forms not allow you to have non-editable fields? Seems a weird limitation regardless.

The questions were labelled with the following categories:

Delivery, Code Quality, Problem Solving, Accountability, Technical Proficiency, Domain Proficiency, Cloud Knowledge, New Gen Tech Stack Proficiency, Joined Up, Process and Communication, Innovation. 

I really didn’t like the way the questions were written. There are 5 answers labelled A-E, but C is often written to sound like a brilliant option when you would expect that to be average. B and A just sound like behaviour reserved for the Architects/Engineering Managers/Principal Developers.

Given that the answers just seem to link directly to your job role, then it reminded me of those online quizzes where it is gonna decide what TV Character/Superhero you are, but you can easily bias your answers because you can see exactly where it is going. In this case, this assessment just seems like it is gonna rank you Architect, Expert, Senior, Junior based on your answers.

Some of the wording for the lowest answers seem like a strange thing to admit.

“Only engages in innovation efforts when directly instructed, showing a complete lack of accountability. “

Why would you admit to showing a complete lack of accountability? Most people probably don’t “innovate” but selecting an answer with “showing a complete lack of accountability” seems crazy.

So given that some answers are never gonna be selected because it’s a difficult thing to admit, and given some answers were clearly based on your job description; then people would just select answers based on what they SHOULD be doing, rather than what they ACTUALLY do. So therefore, it’s a pretty pointless survey. Also there is bias that it was given during the review period so people would suspect it would be used to decide pay-rises and promotions rather than just for some team reshuffle. 

This one on Code Quality is weird because B and C seem similar in standard, but then when you read D, it sounds like you admit you are an incompetent Software Developer.

Code Quality 
(cq.a) Established as code guru and plays a key role in shaping optimal code quality in the team through effective reviews, acting on insights from tools, identifying and resolving inefficiencies in the software and process.
(cq.b) Effectively uses insights from tools like Sonarcloud and influences team quality positively by enforcing standards and showing an upward trend of improved quality and reduced rework.
(cq.c) Upholds the highest standards of unit testing, coding practices, and software quality in self-delivery and ensuring the same from the team through effective code reviews.
(cq.d) Rarely identifies refactoring opportunities, misses critical issues in code reviews, and struggles to positively influence the team's approach to code quality.
(cq.e) Engages minimally in code reviews, allowing issues to slip through; unit tests are skipped and/or yet to begin influencing the code quality of the team.

This one seems applicable to only the top people, or ones that love the limelight and want attention from the managers.

Joined-up
(ju.a) Designs personalised learning paths for team members to ensure comprehensive skill development.
(ju.b) Takes ownership of training needs, seeking opportunities for personal growth. Takes the initiative to identify advanced training opportunities for skill enhancement.
(ju.c) Demonstrate robust team communication, encourage team to contribute in weekly Lunch and Learn sessions, actively recognising peers, support juniors wherever needed. Be active in recruitment.
(ju.d) While excelling as an individual contributor, there is an opportunity to engage more with team members by sharing ideas, seeking input, recognition and offering support in team/organisation initiatives
(ju.e) Need to start taking on a mentoring role by sharing knowledge, providing guidance, and offering constructive feedback to the juniors help them grow and succeed.

I think it is difficult to make meaningful surveys or assessments, but you need to put some thought into the value, and the accuracy of the results.

Employer of Choice: Lack of Progress

Employer of Choice Programme

A few years ago, my employer came up with this idea of “Employer of Choice” which sounds like they wanted to be classed as a “Best Employer to Work For”, but it’s more of a self-award. At its core, it’s about listening to employee feedback and implementing it, but I never think there’s that much scope really. Surely no matter what the pay is like, people are always gonna want more. Same with benefits, amount of annual leave etc.

”This is a business critical programme with a number of Senior Leadership-sponsored work-streams that are focused on making us an employer of choice; where we attract, recruit and retain the people we need, enabling everyone to be their best self and deliver high performance.”

During all the development updates, they were hyping up the changes they made no matter how trivial. There were some beneficial ones which some people really benefited from, such as improving maternity and paternity leave conditions.

“50 colleagues are working behind the scenes in the employer of choice programme”

Comments are useful

I did critique how the survey was a simple scale of 1-5 but comments were optional. Surely the comments are where the key data lies, so they should be mandatory. Despite the managers claiming that they learned this from the first survey, the next survey was completely unchanged. They also said it was difficult to collate the feedback, since they had hundreds of free text entries and had to try to categorise it. Or that was their excuse not to act on it. Yet they still claimed they did implement a lot, and just looking at the feedback was “insightful and empowering”.

“Cynicism around such surveys and their purpose is understandable when there is little to show for the amount of feedback submitted but, as I say below, you can see how powerful the data can be through the series of enhancements driven through the Employer of Choice programme. I also know that it has helped initiate change locally with managers finding the personalised dashboards particularly insightful and empowering.

The more responses and open comments we get, the richer the data set will be. This will ensure that the Employer of Choice programme can continue to focus on the right things and make informed decisions based on your experiences, suggestions and insight, and managers have the data to share with their teams and agree on local actions together.”

Starlight Session

There was a meeting with the pretentious title of “Starlight Session”. This sounded like it was specific to the Development department. Even though they hyped it up, they didn’t disclose what was actually discussed or implemented.

“Yesterday I had the privilege of hosting the second in our wider leadership team strategy session. This session brings together the Senior Leadership team in the Development department, and their direct reports to tackle challenges that we face in the department.

Whenever I work with this team I’m reminded of the depth of expertise and commitment we have in our business. I feel upbeat and positive about the things we’re doing and have achieved together.”

Wizard of Oz style

One of the managers leading the Employer of Choice changes was talking about making the Benefits Portal more helpful: “we trialled the use of chat bots….however that process was very manually intensive”

How can the process be manually intensive? was it the classic “Wizard of Oz style” where it was actually a person pretending to be a computer!?

Employee Reps update

We were supposed to give suggestions to our Employer representatives who then met with the managers to discuss the feasibility of our requests. We haven’t heard from them in months despite them promising to provide monthly updates.

So over the last 3 months, here are their achievements:

(On the subject of Optician Vouchers, they gave this incoherent rambling)

“We contacted the voucher provider who confirmed they will accept vouchers that are from opticians not listed on their portal if they accept them. We also changed the wording on the portal to advise staff should contact their opticians to see if they will accept the voucher.”

is the process that the voucher provider gives you a voucher. You give it to the optician. They then claim the money from the voucher provider. So we needed to know if the voucher provider would accept the vouchers from unspecified sources. But then surely the optician needs to contact the voucher provider if there isn’t a pre-existing agreement between them, otherwise the optician will just reject it. so I think what that post is saying, is that you should just ask the optician if you can use it, which is pretty standard really.

“Increased visibility of employee reps” – they attended a company event…which was mandatory. And they didn’t present anything, they just attended. We are being completely fobbed off here.

One employee rep won a raffle at the company event.

We are really clutching at straws here. Literally nothing has happened over this time.

Old Employee Forum

I found some notes on when we had a suggestion box, and occasionally got updates on these. Someone suggested we have newspapers in the canteen “preferably a range of broadsheets”. This got declined

  1. due to the high turnover of staff (not staying in the canteen for extended periods of time)
  2. additional weekly cost 
  3. WIFI available to use smart phones

Surely the amount of staff that go in means the newspaper is a good idea. Why would they reject it based on cost. You’d only really need about 5 newspapers which is a trivial amount of money considering how wasteful they are in other areas. It just shows you that there isn’t much intent to listen to staff.

Team of the Year

When it came to our annual awards ceremony, the Employer of Choice team won one of the awards. That seems a little biassed to me. The directors created this team, and it’s the directors that are dishing out the awards. There could have been a chance that they deemed it a failure, but it seemed predictable that they would win: who made the biggest impact? Well, maybe the team we designed to create the biggest impact. 

Apart from the fact they didn’t really make an impact, like I discussed.

Goodbye Slack

For the last several years, we have used Slack as our primary way of communicating in the Development department. However, company-wide we have Microsoft Office 365 licences, so other departments use Teams. I always thought it was a dumb decision to use Slack due to essentially paying twice for a communication tool. Slack isn’t that expensive on the lower tiers but it adds up when you have a large amount of staff. Plus, due to stricter security policies, we wanted to use single-sign on so had to upgrade to the Business+ licence which didn’t seem to be worth the cost.

As time goes on, we keep “improving security” which I often think is just an excuse to get rid of certain software. How do you really determine which software or companies are secure anyway? They could tell you they use certain security practices or have some accreditation but if your data is exposed in a data breach is another story.

“not sure what you can hack via Slack. Just over reacting like everything these days. 2FA all the things!”

me

On Slack’s Enterprise licence, they boast even more security features and with our new strict security policies, the management decided that we would have to pay significantly more to keep using Slack, or just get rid of it. So they decided to get rid of it.

To be fair, Teams has improved a bit over the years, and although I prefer the way Slack looks, and its excellent emoji support (you can add custom emojis!); I can’t justify the cost.

why is slack not secure as opposed to teams? probably just nonsense. Where does the data go when it is lost? surely doesn’t leak out onto the dark web!

Rob

We somehow had over 900 members according to Slack Analytics but I reckon that was every historic user since we started using it. Scrolling down the list and roughly estimating, we seemed to have around 300 which could reasonably be called “active”. Then looking at the Business+ costing, it should cost $45,000 per year. Enterprise is one of those tiers where it says “contact sales for a quote”. One manager reckoned it would cost $250k a year to use which doesn’t sound right. How can you justify such an expense for a chat application? Even if it did cost that much on paper, surely you can haggle that down significantly. I’m sure Slack won’t want to lose us. Surely charging $60k is good profit for them.

I often think the way companies charge for software licences doesn’t make sense. They often just charge “per user per month” but there will be times where people don’t actively use the licence due to the work they are doing, or maybe have annual leave to take. Then there’s people that join temporarily, then people just naturally join/leave the business over time. So who really tracks what the accurate amount you need to pay. Companies just end up overpaying for licences they don’t need. Slack seem to suggest they charge just for active users. But what happens if you just send a few messages for 1 day in the month; is that an active user for the month? I often think the best approach would be to charge for a certain amount of users, but then give out an extra 25% keys for light usage.

One thing that I found interesting when looking at Slack Analytics is that most people seemed to be sending as little as 20 messages per day. I think that they are either super focussed and just work independently, or they are chilling out. It’s hard to believe that you can work well in a team, or even have a good relationship with them if you only send 20 messages. I find that some people use instant messaging by sending a sentence per message, which will inflate the message count which makes the numbers even more surprising. For example, they could send 4 messages for this interaction:

Hi

Are you free?

I was wondering if you can help me work out this error

I have just got the latest code but am unable to log in

The decision to remove Slack was disappointing for some, but the bizarre thing is that we got told by our manager on the Wednesday, it was formally announced on Thursday, and gone by Friday 4pm. If you were on annual leave that week, you would be confused when you could no longer access Slack on the following Monday. There was some great information that we had on there, and was great to search for common errors and find solutions to them. We didn’t have enough warning to try and extract the information.

“Has the cost of the loss of productivity and collaboration been factored into the decision to remove slack?”

Sad developer

One developer had a crazy idea of  developing our own solution:

“We are a software development company. If we’re that desperate, can’t we write our own messaging system, protected to the security standard we want?”

Ambitious developer

The thing is, we already made a chat application for our users. I never understood why users would want a native chat app when they could use something more widespread. Since we already have a chat app, then it could actually make sense to add more features to it; then use it internally.

Making your own tools isn’t as cheap as you would think. If a developer’s wage is £35k, then paying only 1 developer to develop and maintain it each year is £35k. You may as well just pay for Slack then. But if we are using it and selling it to our users, then it does make more sense.

The weird thing is, for our upcoming software, we originally used Okta for the login functionality but it was decided it was too expensive, so a few developers got together and made their own solution. That seems bonkers to me because that is about security, so surely you should leave it up to the company that specialises In security. So the fact that we do make custom authentication makes the idea of making a chat app even more realistic.

However one of the architects working on this upcoming software ironically replied:

“We need to move away from homegrown solutions, especially based on the presentation happening now from our Head of Security”

Hypocritical software architect

Another architect supported this claim:

“This is about minimising home grown solutions when an off-the-shelf solution would do just as well”

Software Architect

Does that mean he should be bringing Okta back?

Minimum requirements when logging defects

A colleague wrote a list of ideas to improve bug reports. The more detail a report has, the more stakeholders are aware of the impact and can triage it accordingly. When it comes to fixing it, software developers can work out the issue more easily…

It is important that all the required information is added to a defect at the time of raising it. This stops the need to refer it back to the original author for more information and therefore saves time.

It should also be noted that we report all defects raised to certain user groups, and it is important that they are able to understand what the issue is and how severe the issue is to them.

In order to meet the minimum requirement all bugs should contain the following:

Title

  • The title must be clear and concise
  • It should describe the problem
  • Avoid using technical jargon

Description

  • The description must clearly outline the problem being experienced
  • It should explain the impact to the customer
  • It should describe a workaround if known.

 Reproduction steps

  • Reproduction steps to recreate the issue
  • These should be clear and easy to follow
  • Include any required environment configuration
  • Include the actual and the expected outcome

 System info

  • Enter the version of software the bug was found in

 Other checks

  • Have the Area and Iteration paths been set correctly?
  • Are relevant examples present with the record? (record number, sample data, screenshots etc.)
  • Have the relevant error details been included? (stack trace, error message, error number etc.)
  • Has the bug been linked to the test case/user story etc?
  • Has this been linked to a relevant user story, requirement, or similar bug report?

 Root Cause Analysis (RCA)

If the defect is found during integration testing, the following must also be completed

  • Stage Detected In
  • Use Release Testing
  • Complete Release Introduced In field

Notes On: The Art of Captivating Conversation – Patrick King

Introduction

I’ve finished reading The Art of Captivating Conversation by Patrick King. I made notes from the most interesting points and ideas. I’ve always found small-talk to be awkward and the author gives tips on how to make the conversation flow and sound more interesting, and more interested in the other person.

Conversations 

Conversations are the threads that weave the fabric of social interaction, and they serve two primary purposes: entertainment and utility. The art of conversation lies in the delicate balance between these two elements, ensuring that our interactions are both enjoyable and productive.

At the heart of our interactions are the six primary emotions: happiness, sadness, fear, anger, surprise, and disgust. These emotions are universal and often drive the direction and tone of our conversations. Recognizing and responding to these emotions in others can lead to more meaningful and empathetic communication.

Small talk

Small talk plays a crucial role in initiating conversations and building rapport. Common small talk questions include inquiries about one’s day, weekend, work, family, and plans. Small talk, often seen as a necessary evil, is widely disliked for its superficial nature. It’s a societal construct designed to convey politeness, yet it often feels insincere. The key to transcending small talk lies in personalising the conversation with genuine interest and shared stories.

To engage effectively in small talk, one should aim to provide entertainment, make the other person feel good, and offer substantial content that allows the conversation to flow with minimal effort. This can be achieved through two methods:

1. Answering a fuzzy version of the question: This involves focusing on a keyword from the question and expanding on it with a more interesting or entertaining anecdote. For example, if asked about the weekend, one might share a memorable weekend experience from the past rather than a mundane recount of the past days.

2. Completely redirecting the conversation: By briefly acknowledging the question and then pivoting to a more engaging topic, one can steer the conversation away from generic small talk. Using transitional phrases like “it was good, but did you hear about…” can quickly shift the focus to something of mutual interest.

What Would Jay Leno Do?

“You can make more friends in two months by becoming truly interested in other people than you can in two years by trying to get other people interested in you.” 

Dale Carnegie

When people sense you care, they respond in kind and open up. The best way to articulate this is to picture your favourite talk show host. The guest is the centre of his world for the next ten minutes. His genuine curiosity, enthusiastic reactions, and positive demeanour not only make his guests feel valued but also entertain and engage his audience. This approach is highlighted as a model for personal interactions, where showing real interest in others can lead to more meaningful and reciprocal relationships.

Everyone has unique knowledge and experiences. By being curious about others, we acknowledge that every person we meet can teach us something new, thereby enriching our own lives. This mindset encourages a sense of humility and openness to learning from others.

Be aware of social narcissism, where conversations are dominated by one’s own interests, disregarding the value of others’ experiences. This behaviour is characterised by listening only to respond rather than to understand, and it hinders the development of genuine connections.

Break The Ice

Social interactions, especially in settings such as networking events or parties, can often feel like navigating a minefield. The challenge of breaking into a conversation group can seem daunting, as if invisible barriers are erected around them. Common internal objections include the fear of interrupting, appearing awkward, or being perceived as strange.

However, the key to overcoming these social hurdles lies in establishing a “Social Goal.” This goal acts as a beacon, overriding any social defence mechanisms. It could be as specific as learning about an individual, collecting a set of business cards, or memorising names at a gathering.

To facilitate this process, icebreakers can be invaluable. They can be categorised into three types:

1. Subjective Queries: These involve asking for personal opinions on topics of mutual interest, such as the music at a party. It’s a way to show curiosity and invite others to share their passions.   

2. Objective Inquiries: These are questions about factual information, like the time, directions to the nearest café, or the location of the host. Such questions are non-threatening and serve as a natural entry point into a conversation.   

3. Comments on Shared Reality: Observations about the immediate environment or universally acknowledged truths can also serve as icebreakers. By expressing an opinion on something already within the other person’s awareness, it opens up the floor for a shared discussion.

Interestingly, it’s perfectly acceptable to ask questions to which you already know the answers. The primary aim is not to seek information but to initiate interaction and establish a connection.

In essence, breaking the ice is less about the content of the conversation and more about the willingness to engage. Remember, the objective is to engage, not to impress. With practice, the art of conversation becomes less of a challenge and more of a rewarding journey.

Never Laugh First

Initiating laughter in a conversation might inadvertently pressure others to conform to your emotional state, potentially creating discomfort. Moreover, it hinders your ability to assess the genuine humour of your remarks.

Belief Police

We feel that since we know so much better than the other person, we have some sort of responsibility to correct them. We then take it upon ourselves to prove to them just how smart we are. We can’t stand someone believing something wrong to what we believe. This habit is obnoxious to talk to. 

Questions

When you ask a general question, you will get a general answer. Questions like “what do you do for fun?” are hard to answer because no one thinks about their life in such broad terms. You want to enable people to be lazy and open ended questions actually make us think quite a bit and inject lulls into the conversation. “What is your favourite movie of all time?” This is hard because it wants one single answer and to represent you in a positive light. It can be hard to think of a single movie. A better question is “what’s a good movie you have seen recently?”. You can easily recall a movie you have seen recently and it doesn’t have to be the best. So the advice is to put boundaries and qualifiers on your question to make it less specific. You can even provide answers/prompts, so “what do you do for fun?” can be prompted with “playing sports, go outdoors, or music”.

Take The Hint

Recognizing cues of disinterest, such as a lack of engagement, prolonged silences, or shifting to generic topics, is crucial in respecting the other person’s boundaries and maintaining a comfortable conversation flow.

Eye Contact

Balancing eye contact is key; too much can be as disconcerting as too little. A general guideline is to maintain eye contact 80% of the time when listening and 50% when speaking to foster a sense of ease and attentiveness.

HPM, SBR, & EDR

HPM emphasises the use of personal experiences (History), personal opinions (Philosophy), and associative thinking (Metaphor) to engage in a conversation. 

SBR is a method of guiding a conversation by asking questions. ‘Specific‘ questions delve into the details of a topic, ‘Broad‘ questions open up new avenues for discussion, and ‘Related‘ questions tie in relevant but potentially separate ideas, allowing the conversation to flow naturally and informatively.

EDR focuses on emotional intelligence, asking for specifics, and confirming understanding. By acknowledging emotions (Emotion), probing for more information (Detail), and paraphrasing what has been said (Restatements), a person can demonstrate empathy, interest, and attentiveness, which are crucial for meaningful interactions.

Together, these strategies provide a comprehensive framework for effective communication, whether in casual conversations or more formal discussions. They encourage a deeper connection between individuals by fostering an environment where personal stories, emotions, and details are valued and explored.

Storytelling

1. Detail-Oriented Approach: Instead of crafting a full narrative, focus on providing five distinct, specific details. These serve as hooks, leading the listener from one piece of information to another, creating a chain of engaging tidbits.

2. Emotion-Driven Narrative: Concentrate on encapsulating a single motion or emotion in one sentence. Stories should evoke emotional responses, such as happiness, empathy, surprise, or curiosity.

Breaking into banter

Use light misunderstandings, double entendres, puns, and comical confusion to break the ice and introduce humour into the conversation.

Flow

Avoid stagnation by shifting the conversation to related topics, delving deeper into subjects, sharing personal experiences, inquiring about favourites, discussing emotions, expressing nuanced opinions, posing hypothetical questions, or referencing friends and articles.

Conversation Threading

This technique enhances your ability to respond quickly and thoughtfully in conversations. As a listener, use the storytelling method to pick up on topics and steer the conversation in a direction that interests you. For instance, if skiing is mentioned but holds no interest for you, pivot the discussion to talk about mountains or related experiences.

By employing these methods, you can transform simple exchanges into memorable conversations that resonate with those involved. Whether you’re a storyteller or a keen listener, the key is to keep the conversation moving, engaging, and full of life. Remember, the goal is not just to talk but to connect.

This is very concerning to hear

On a code review, a Senior Developer, Lee questioned why there was no database changes when the Developer Neil had removed all the related C# server code. Neil replied that he “wasn’t sure how the patching process worked” (despite being here years, and was in a team with experienced developers), and wasn’t sure if there were any backwards compatibility issues to consider.

So what was his plan? just hope it gets past the code review stage unchallenged? Then we would have some obsolete stored procedures, and unused data lingering in the database for years?

I initially thought his claim for backwards compatibility issues was nonsensical but from an architectural standpoint, it makes sense due to how it works in our system. The server code doesn’t call the other’s server; it goes direct. So that means if the old version calls the new version, then it would expect the stored procedures and data to exist. However, for this particular feature there were no cross-database calls at all.

I suppose being cautious and not deleting the data makes sense from a rollback point of view. It’s hard to restore the data if it is lost, but easy to restore the C# code. I have never seen us use this approach though.

The Senior Developer said :

This is very concerning to hear, can you please work with your team lead to understand how our versions are deployed, and if they are unable to answer all the questions, please reach out to someone. We do not support any version changes by default, though there are cases where we do have cross version server/database calls, but these are for specific cross organisation activities.
You can safely remove these columns, update these stored procedures.
There is no value in leaving something half in the system, if it is no longer needed, remove all references, database rows/columns/tables, class Properties, etc.

In my previous blog, I discussed Project vs Domain Teams. This is kinda linked in the sense that specialising in a certain area of the system means you gain knowledge of the functionality and architecture of that area. There would be less chance of this scenario happening where the developer is questioning if there could be backwards compatibility issues. However, he could have also found this information out by raising questions.

This example does cover many topics I have discussed on this blog:

  • Poor communication
  • Bad decisions
  • Funny quote from a senior developer ”This is very concerning to hear”