How do I do software architecture and design?

How do I do software architecture and design?

Mostly I sleep on it.

Seriously – I’ll can sleep on a problem for months before coming back to it.

Or some problems I’ll chip at – an hour here, a couple of hours there. Not thinking about it in between, then coming back with a fresh mind.

Sometimes I build on previous work, and other times I might scrape it and start again.

Obviously I think a and work hard to develop a solution, but the element of design that I never hear talked about is “walking away and leaving it be for a bit”.

Working in the corporate consulting world, every project that has gone belly up I want to attribute [in hindsight] to the architecture and sales team(s) writing a proposal literally up to the 11th hour to submit by a deadline.

That’s no way to design a solution.

Like a published book, great software is never created in the first draft.

Non Inclusive. Divisive. Discriminatory

I follow (and am a patron of) someone on YouTube who creates content about games.

He’s colour blind.

And he continually makes me think about how shit the world must be to people who… I was going to say: “who are colour blind or not as able bodied as the creators of things”.

But I realised how narrow my thinking is.

What about women in male dominated workforces?
And people of colour?
And everyone else who is not in the exact group as the people who design and build the things that are thrust upon the rest of the world to use?

The Western technology world (Silicon Valley, etc) produces a whole lot of technology “solutions” that are not so much what I would call “discriminatory” as they are just “narrow minded” – because they’re designed from a self-centred ignorance more than from malice.

The solution: Usability testing.

Gather a diverse range of people and ask for feedback.
Simple.
It doesn’t even have to be a lot of people for high gain. A few dozen people spread across the spectrum.

But that costs money. And may prove the designers wrong.

First Draft Software

Something a lot of software business leaders don’t realise (and more than a few software developers):

Writing software is like writing a book.
Authors never get it right on the first draft (software: first deployment).
And they rarely even get it right on the second draft, and sometimes not even the third.
Some parts of a book can take many drafts to get right before it’s published.

Yet there’s a lot of software that gets released after the first draft and not touched for man years (even in the age of agile).

If a software business is not iterating over its product – i.e. reviewing, refactoring and iterating – then they’re not producing a quality product.
And the benefit of software is that unlike a book, software can be updated (corrections, bug fixes, improvements) after it has been published.

Would I buy a “first draft” book? No.
So why should I accept first draft software products?

The Usability of Movies

Everything people create for other people has a usability/UX component, including movies.

What is the thing people interact with in movies? The “story”.

We may not interact with it in the same way we do software, equipment and real-world objects – we can’t touch or control it – but it has an “effect on us” as an audience.
A reverse interaction, from the audience’s point of view.

The same can be said for music, books, art, blog posts, documentation, teaching…

Creators of content need to be just as aware of UX as creators of things people use.

The state of software development accreditation (and why technical tests are needed)

The need for technical tests when hiring software developers (of mid-junior experience) is a sign of 2 things:

1) The industry is not regulated and does not have the backing of professional certification authorities to enter the industry, which would largely negate the need for the rudimentary testing we see across the board today.

2) Our education institutions (e.g. universities) are failing when their name and reputation is not enough to get the “average” candidate through the door without the need for additional testing (not talking about the FAANGs of the world).

(Speaking primarily from observation in Australia.)

Do we need regulation and accredited certification in the software industry? Hell yeah!

The software industry might only be a a handful of decades old at this point, but the exponential impact software developers have on the world means we can’t wait the 500 years other accredited industries have had to see people requiring accreditation before they can practise the craft.

Software Developer Priorities

Reading threads on Twitter, it’s a telling sign that almost all discussions from software developers/engineers I follow revolve around code, software architecture and technical stuff.

Very few think to mention customers or the greater impact on people from what do.

My priorities are:
1) People. Our customers.
2) Security and data privacy.
3) People. Our customers.
4) Code.

(The only reason security isn’t #1 is because without people, security isn’t a concern in the first place.)

But to be clear, I do spend a hefty amount of time thinking about code and software architecture. They’re just not my priority.

Dark Matter Software Developers

Let’s not forget, for every software developer who is active on social media, blogging or the speaking circuit – there are at least 100,000 developers working 9-to-5 jobs and keeping the world running. People you’ve never heard of and don’t have open source projects.

These people are the backbone of our economy.
They do their best while living full, balanced lives.
And a lot of them are as wise, if not wiser, than the big names and voices in our industry.

Let’s also consider: there are no Einstein’s in software development yet – only people who have written books, made their name on social media, or got lucky building a publicised software company.

Software development is an industry founded primarily on collaboration, incremental development, and more failure than success.

So, remember the quiet person who does their contractual hours every week and contributes to a product that affects thousands of people.

These are the people we must celebrate.

“Doing Cloud Software” – Since Before It Was Fashionable

I’ve been doing “cloud software” since 2007 – the year I registered my first domain.

I built and hosted my first website on https://discountasp.net/.
And I’ve since built WordPress websites that run in cPanel on system managed by https://www.digitalpacific.com.au/.

I’ve never had to create a network or a virtual machine.
Every software product I’ve designed and build has run on platforms other people mange, and service I can just deploy into.

DiscountASP.net gave me an ASP.NET platform and SQL Server.
Digital Pacific gave me PHP, WordPress and MySQL.

I never had to worry about infrastructure – just my application code. The rest was APIs.

Since then I’ve moved to Microsoft Azure and used only their serverless offerings – what is now Azure App Services, Azure SQL, Functions, Table Storage, Blog Storage and now Cosmos DB.
All “API” based.

I’ve never had to worry about infrastructure or anything I couldn’t access and control via a dashboard.

And to be honest, any time someone talks about Docker or Kubernetes, I can’t help but think “that sounds like too much work”.

.NET Linq .Select() often means “project”

I’m old school so I haven’t worked much with Linq (Language-Integrated Query (LINQ) (C#) | Microsoft Docs) – beyond the absolute basics – until this year.

One of the methods I’ve needed to use quite a bit is the Enumerable.Select Method. Which has been hard to wrap my head around until I realised something:

The method name doesn’t fit my mental model.

And the reason is in the first line on the Microsoft documentation page:

Projects each element of a sequence into a new form.

The key word being “projects” (as in, a “projection”). Which in cody-cody speak means “take the data I’m giving it and turn it into something else”.

See, when I see “select” I think of SQL “SELECT”, and in most cases we’re just picking data columns you want to return. Though, to be far, now I think about it you can also “project” with it.

But still, when I think “select” in the context of data it’s “you’re going to give me some data, and I’m going to pick the bits I want”. Whereas with “project” – particular in the context of the code I’m working with – means we’re “transforming” the data and often pulling in other data peripherally linked to it (in a way acting as a join). This is often doing by calling another method that takes the current item in the data and does something with it – e.g. used some value from it to lookup or generate other data structures.

The Microsoft docs page Projection Operations (C#) | Microsoft Docs start with the following which explains it well:

Projection refers to the operation of transforming an object into a new form that often consists only of those properties that will be subsequently used. By using projection, you can construct a new type that is built from each object. You can project a property and perform a mathematical function on it. You can also project the original object without changing it.

So what I need to do in a lot of cases for the code I’m dealing with is mentally swap .Select( x => x. ... ) for .Project( x => x. ... ) and it makes much more sense.