Let me introduce you Bob and Chris.
Bob is a musician.
Chris is a software developer.
Bob plays different instruments. But today he decides to play a rock song, so he chooses a guitar.
Meanwhile Chris, who is a great full stack developer, is thinking of creating a public web site to promote his services as a software consultant. That’s why he chooses to built a .NET web application.
Bob has a lot of guitars – classical, electric, even 12-strings instrument, but now he is going to take an acoustic guitar with 6 strings.
Chris will implement his project with C# as a programming language.
Depending of the purpose of use, the feeling during use and some personal preferences the guitar type can vary a lot.
It can have different measures, shapes and parts:
- size of the body
- material of all the different parts
- height of the frets
- type and size of the strings
- number of strings
Likewise the software project have an architecture for the given purpose and different layers, based on the size, scale and specificity of the business it serves:
- Chris should build the architecture based on the project scope, dependencies and accessibility.
- He should consider the overall picture from a global point of view and decide where to place the new solution and how it will communicate with the external systems (if any).
- As I said earlier Chris have chosen the programming language and the platform he is going to use. Now he has to think of the basic functional modules of the application and to decide what design patterns to use. Like the strumming pattern makes a specific sound and creates a desired rhythm, the same way applying a certain design pattern solves a specific problem.
- The layers and the communication between them should be considered.
- Chris will make the decision whether he is going to use some 3rd party libraries to achieve a certain functionality or he will write those by himself.
Before starting to play any song Bob first have to tune his instrument. For that purpose he needs a tool called tuner. Likewise Chris is preparing his solution by adding the needed libraries and packages.
For both of them there are multiple options to achieve a particular goal. For instance Bob can tune his guitar using a guitar tuner, a tuner pedal, a tuner application on his phone, a tuning fork, or another tuned instrument, etc.
Chris can also use different approaches and packages for achieving his aim. For example if he wants to implement logging in his application there are a lot of available options like log4net, NLog, Splat, Serilog, the .NET Core built-in provider and much more.
Bob is about to make a decision about the tuning. Depending on what he wants to play he can tune his guitar differently. Assuming he is going for a standard tuning of his instrument. The standard tuning of a guitar defines the strings pitches as E2, A2, D3, G3, B3 & E4 from the lowest string to the highest:
|String||Frequency||Scientific pitch notation|
|1 (E)||329.63 Hz||E4|
|2 (B)||246.94 Hz||B3|
|3 (G)||196.00 Hz||G3|
|4 (D)||146.83 Hz||D3|
|5 (A)||110.00 Hz||A2|
|6 (E)||82.41 Hz||E2|
So Bob needs to be pretty precise doing this set-up in order to have the correct frequencies and respectively the right sound afterwards.
The tuning Chris should think about is first of all to choose what kind of web project is he going to create – .NET MVC, .NET Core, Web API, ASP.NET Core Blazor App. He needs to set-up the desired view engine, UI framework, configurations, connection strings and so on.
Another aspect the musicians are looking for is the outlook of the instrument. Bob has his preferences about the color and the elements which identifies the brand.
Chris is thinking about the UI – colors, fonts, white spaces, pictures, shadings, animations, effects, etc. He can choose from a big variety of frameworks and packages to help him with implementing the desired UI.
What about configurations and flexibility of use?
For instance Bob’s instrument allows easy strings replacement and fretboard adjustment. A project should be flexible enough to allow customization and behavior changes with the help of configurations.
There are many similarities in terms of effort, aim, aspects and points of view between working on a software product and creating a guitar or some other instrument.
So every time you are part of a software development just suppose you are a luthier and you are building a musical instrument. Consider the following questions:
- What will be the side effect if you neglect the architecture or the implementation?
- Will you like the final piece and the “music” out of it?
- Will the “listeners” like what they see and “hear” using your product?
Be a good craftsman and your users will like you, advertise you, and keep shopping from your “music store”.