Foundations of Software Architecture-1-Building Blocks
By: Huseyin Kutluca
Tags: Software Architecture

What a good software engineer/architect should know and what competencies should he/she have are among the most frequently asked questions. This issue has been one of the areas that I have been thinking about and trying to answer. I find it worth examining two studies in this field that I have come across recently. Khalil Smeller has constructed his knowledge on top of each other like ISO layers and interpreted one layer to use the accumulation in the next layer. Kamran Ahmet has created the technology roadmap for positions such as backend developer, frontend developer and devops. Both studies are really valuable. Personally, I am one of those who believe in the importance of starting out based on knowledge, not technology. I adapted the layered structure below from Khalil Stemler according to my knowledge and approach. In fact, I think I created a more complementary layer structure by constructing the layered structure in the form of two columns.

I consider it important in terms of showing that the system will not stand still no matter which software architecture we choose when the software engineering knowledge and foundations are not solid. In other words, when we use Micro service architecture, RabbitMQ, Kubernates, Amazon Web Services, we do not develop the best quality software. In order to use these features, we need infrastructures that we need to apply properly, from clean code practices to algorithms, from good design practices to design patterns.



At the base you should have good coding practics. In this context, it is important to develop code that is compatible with coding standards. Robert c. Martin’s Clean Code book and Code Complete written by Steve McConnell include good coding practices. They explains best practices about how to develop code that is easy to understand, can be changed and prevents mistakes from being made. Code Complete book covers a wide range of defensive design techniques, variable naming, basic data types, code enhancement techniques with recommendations on code expressions. Coding standards such as Misra C, MISRA C ++, JSF C ++ guide us on how to write clean code with the least mistakes.

Object oriented design principles are also basic knowledge that should be learned and applied. Concepts such as inheritance, encapsulation, abstraction, interface design and abstract classes should be well understood and used correctly.

Another key issue is data structures and algorithms. In addition to basic data structures such as list, queue, binary tree, it is necessary to know the properties of advanced data structures such as map, string (graph), B-tree and to be competent in writing efficient algorithms on these data structures. In order to develop efficient algorithms, we must know and apply the concept of algorithm complexity.

If we are writing embedded and real-time software, we will not develop software without using state machines. Similarly, we need to design code as multiple tasks and we can develop high performance applications by using task design patterns effectively.

We use good design practices such as SOLID, DRY, YAGNI to establish a proper architectural structure within the component that we will develop. In addition to these, we learn dozens of design patterns that have been in the literature for a long time and use the right design pattern in the right place without over-engineering.

As the project size grows, the importance of software architecture and related concepts increases. Architectural design patterns and architectural design principles become indispensable in larger projects. Similarly, architectural documents and technologies such as UML and SYSML are essential for managing large projects.

Middleware technologies come to the forefront to provide communication between software with distributed architecture. MQTT, DDS, AMQP and Kafka stand out in this regard.

After laying the foundations solid, we can use Quality Attributes Based Design, which is a systematic design approach, to develop large-scale projects. It is necessary to define the quality attributes of the software we will develop such as availability, performance, modifiability and testability, and to implement solutions that meet these features in design decisions. In order to analyze the architecture developed with this approach, we can review the ATAM approach and reveal the risks, trade-off points and sensitivities that arise as a result of design decisions. While developing software, the shortcut decisions we make consciously or unconsciously are used to express the design deficiencies that we call technical debt and which we have to pay later.

After establishing such a solid foundation, if we are working on corporate software, we can learn and apply the infrastructure of micro-service architecture, cloud systems and serverless architecture.

On the other hand, if you work on defense projects you need to know Open Architecture standards such as Open Architecture Computing Architecture (OACE), Future avionics Capability environment (FACE), Nato Generic Vehicle Architecture (NGVA). Similarly, AUTOSAR and AUTOSAR-Adaptive architectures in the Automotive Field , Robot Operating System (ROS) and ROS2 in the field of robotics. Furthermore if you are in the field of Industrial Internet of Things, you should look to Industrial Internet Reference Architecture, GE Predix, IBM Watsons, EdgeX Faundry etc.