Missing Quality Attributes
Any software development degrees should already include Software Architecture in the curriculum. Anyway, in practice, most people just simply... forget them. In order to build a good software, we need to remember some quality attributes - because we want to build it to "last", not to "die". And imagine how people are working today. It was not long time ago when I asked my colleague how painful it was to do that "manual work", which was the same question I asked not so long before that. And the answer was always the same: very painful. "I did that for 5 times already." And oh, my dear God. How could people endure that?
I would say that I prefer to "work smart than deligently". If you are going to say that I'm lazy, go on. I'm lazy. I'm lazy. I'm not making an excuse. Anyway, I could finish my tasks. I think completion of the assigned tasks is more important than working "deligently". We count by the amount of work done, not by the number of hours you work. If you are working the longer hours but you could not finish anything, it means that your productivity is low anyway.
In this era, we are working with the software. And since I'm the software developer, analyst, I would love to make sure that my tasks done very easily and the expansion of the software is easy to build. Hence, designing the very first foundation of the software is essential and critical to the livelihood of the whole project. Here, we could see that there are so many quality attributes that we should keep in mind whenever we design the system in order to make it lasts longgggggggggggg:
1. Reusability - we, software engineer, are "lazy"... right? So, we would love to reuse anything that we could so we do not have to code everything once again... That would be very painful. For example, you are viewing my blog right now, and my blog could be seen on my home page, my blog page, and it can also be filtered by categorys and tags - the function that retrieves the articles, of course, is shared across all these pages - with only parameters that are different. Reuse it. Pass parameters to make sure you are getting the right thing for the specific use case. That's it.
2. Readability - some people coded in a very unique way and other people cannot understand. My very first software I read, I found a function called "configuration" but within the function, I saw it retrieves the user row from the database and compare the hash (md5) of the password. Umm... Hello! This is "authentication" function, not "configuration", bro! You wrote this way, how could other people understand your code? I have not yet talked about the "pokkrong.html" file. The webpage was for the "Student Disciplinary Office" of the school, and see what the page was called? It was, yes, the Office's name in Thai. And we have not yet talked about the complicated calculations with no comments to explain how the developer came up with the calculations.
3. Extendability - new business needs are always popping up. To better clarify, for a simple e-commerce business, every Black Friday companies would obviously love to have a very BIG NEW SALES which could kill the I.T. guys. "I want to create the bundles." But our systems could not handle that bundling of products! Creating new SKUs will cause nightmare to the inventory and the packing staff. Hence, the system should be flexible enough for these kinds of things to be done easily, always.
4. Scalability - we want the company to increase our salaries, right? Then, how could the company get more revenue? Sell more! Hooray! Then, what we need to do is to make sure the system can handle more sales, more data, more transaction, etc, so the company can sell more. Load testing is becoming more and more important because of this fact. Business needs to grow. I rarely sees this problem, until now... September 2020 when the Thai people are protesting the Government and the mobile networks across the capital of Thailand broke down. News reporters could not do live streaming sponteneously. And many live reports were suddenly cut off due to weak connections. A talk with Shopee's expert revealed that they only have to "buy" enough servers to handle the spike before the specific time when the sales is forecasted to hit the new high. Finger-crossed. No one could confirm that they bought enough.
5. Reliability/Availability - to select the server, we have to pick the good one. My friend once picked GoDaddy service but his main target audiences were all located in Thailand and the website was very slow because GoDaddy has no servers in the country. And sometimes, he said that his website was down but I could still browse it and it was fast for me. After a while, he could not endure the situation and purchased another server in Thailand instead. The speed was much faster in Thailand and he was very happy. Anyway, I suffered because the reliability of the Thai server is very low in Singapore. So, to pick the server, you have to pick wisely. You have to find out who are your target audiences and pick the server that could give them reliability.
6. Security - HTTPS is the web standard for this era. Buying an SSL certificate for your website is the best option for businesses where payments are needed over the web. For most websites, DV (domain validated) certificate is enough (it validates that the domain is correct). Anyway, for e-commerce and big companies, OV (organization validated) certificate is preferred because customers could check for the authenticity of the company and the website. Anyway, EV (extended validated) certificate is also available for those who needed. It is the OV with the organization name showing up on the address bar of the browser. Anyway, don't do anything that is bad for your own reputation. I was once saw the SSL certificate of the Bank when I was accessing the Government website. Obviously, the Government got the Bank to build the website and the bank simply included the Government website into the existing certificate. This was very bad for reputation.
7. Performance - A few years ago I faced the problem with website's performance. I knew one of the API allows us to retrieve multiple items at once but my colleague wrote the cronjob that calls the API for a single item. The cronjob runs for 3+ minutes every 15-30 minutes and increases the workload of the server so badly. This was bad. Anyway, we have to understand that coding is very easy and anyone can code BUT only a few people can code well. Not everyone can code with lowest Big O, which is used to describe the performance of the software. The lower the Big O value is, the faster the software could be. For example, mostly the Big O of a simple sorting algorithm is O(n2) or even more, but for those with more experiences, they could code the sorting algorithm yielding O(n·logn).
8. Usability - no one would like to use the system if it is not useful, hence we need to build it so it answers business needs.
9. User-friendly - Without UX/UI designers, it could be difficult for software engineer to make sure the software is user-friendly. Listening to the designers is very essential. Sometimes, software engineers never think of the user flows (HTA, hierarchical task analysis) and does something that is against common sense of the users, causing human errors for most of the time. And obviously this is not expected.
Well, I just hope that this article is useful and before you code, you can spend more time thinking of how you would code your software. Enjoy!