Category Archives for Become an Awesome Software Architect, Book 1: Foundation 2019

What is Software Architecture?

Anatoly Volkhover

The main purpose of software architecture is to reduce the cost of building and changing the software.

Chapter 1: The Architect’s Hit List

Anatoly Volkhover

  • Programming languages, their features, readability, and interoperation
  • Code reuse across platforms (server vs web vs mobile)
  • Early error detection (compile-time vs runtime error detection, breadth of validation)
  • Availability of talent and cost of hiring the right talent; learning curve for new hires
  • Readability and refactorability of code
  • Approach to code composition, embracing the change
  • Datastore and general approach to data modeling
  • Application-specific data model, and the blast radius from changing it
  • Performance and latency in all tiers and platforms
  • Scalability and redundancy
  • Spiky traffic patterns, autoscaling, capacity overprovisioning for spikes
  • Error recovery
  • Logging, telemetry, and other instrumentation
  • Reducing the complexity of business logic
  • User interfaces and their maintainability
  • External interfaces, APIs, contracts
  • User identity and security
  • Hardware and human costs of the infrastructure and its maintenance
  • Creating multiple workstreams
  • Enabling testability
  • Third-party frameworks

Chapter 2: Programming Languages

Anatoly Volkhover

The choice of programming language isn’t obvious, and shall not be taken lightly. Consider strong static typing, support of interfaces, isomorphism, OOP vs FP capabilities, readability, third-party support, and the cost of hiring.

Chapter 3: Datastore

Anatoly Volkhover

Datastore implementation must depend on the Business Logic, and not the other way around. Ditch CRUD in favor of CQRS. Consider Event Store pattern for its flexibility.

Chapter 4: Data Model

Anatoly Volkhover

Domain-Driven Design helps you create a data model that closely follows the business concepts, and therefore is easy to evolve alongside with the business requirements. Use CQRS to keep your interfaces clean.

Chapter 5: Layering

Anatoly Volkhover

Break your system into layers and keep them separate. Consider creating a domain-specific language (DSL) for the application layer, as a way to promote simplicity and separation. If using general-purpose language (GPL) for building the application layer, create a restrictive framework and a process to keep the application layer from intermingling with the layers below.

Break your system into layers and keep them separate. Consider creating a domain-specific language (DSL) for the application layer, as a way to promote simplicity and separation. If using general-purpose language (GPL) for building the application layer, create a restrictive framework and a process to keep the application layer from intermingling with the layers below.

Chapter 6: Code Composition

Anatoly Volkhover

Apply SOLID principles to test if your architecture is compliant. Mentor your team to fully understand SOLID; those principles apply to almost everything in the software development. Refactor the code at the earliest signs of violation of any of the SOLID principles.

Chapter 7: Latency

  • October 12, 2019

Anatoly Volkhover

Break your server-side processing into synchronous and asynchronous aspects. Make it easy for developers to code the asynchronous part by creating a framework. Optimize images and compress script and style assets. Use CDN for delivery of static assets. Collect telemetry to continuously monitor latency in your system.

Chapter 8: Error Recovery

  • October 12, 2019

Anatoly Volkhover

Embrace errors. Make your endpoints idempotent. Then use retries to recover.

Chapter 9: Logging

  • October 12, 2019

Anatoly Volkhover

Make logs accessible from a single point. Collect logs from both client and server. Support filtering of log entries by application-specific context parameters. Alert someone to crashes. Embrace chatty log levels. Shipping of client-side logs to the server helps troubleshooting. Shipping of server-side logs to the client at dev time speeds up development.

1 2 3
>