Iteration 2 Details for MPCS 51205

Each iteration will deliver an incremental accretion of work toward the final project deliverable.  Some assignments will require you to work individually and each team member will submit his or her deliverable, and other assignments will require you to work as a team and submit a single team deliverable.  Generally (see specifics within each Iteration), each student will be responsible for delivering some piece of the work (documentation, code, etc.).  You will be evaluated on the clarity and depth of your analysis of these and other deliverables.  "Deep Thinking" as well as "Shallow Thinking" are generally obvious.  Deep Thinking requires time and....thought.

Unless use of a tool is specified, you may take pictures of whiteboards, papers, napkins, etc. as submission artifacts.  From a remote collaborative design perspective, previous teams have happily leveraged free tools including excalidraw.com, which allows for collaborative brainstorming among remote team members.  However, some artifact deliverables will need to be in the form of formal models.  When a formal artifact is required, it will be so specified.

See the syllabus for information on grading.  Turning in Iteration assignments is required.  Submit your assignments as a tarball to the repository according to the directions on each Iteration page.

Iteration 2   Due: 5:00 pm, November 6, 2023

High Level Microservices Architecture and Initial Domain Model: 

You are to work together as a team on these deliverables except when you are instructed to individually deliver something.
Considering the functional and technical requirements of the system (to be named by the class as a whole), envision the high level Microservices architecture and domain models. 

Deliverable One:  Microservices Architecture Blueprint

Leveraging your Context Map and Domain Vision Statement and your first pass at a high-level architecture, produce a draft of a Microservices Architecture Blueprint.  This is a draft-level model of the Microservices that you envision (at this point in your thinking) developing in the final system.  This can and should be quite high-level, and should look something like this example taken from a hypothetical airline's Microservice architecture:

snippet

As a team, continue your development of your high level Microservices architecture model of your proposed solution.  This model will be a continuation of the "rough sketch" of your "current architectural approach", becoming much refined (and implementable) during this iteration.  Your depiction should become formal at this point.  Your architecture rendition should continue to include more key architectural components and  interactions as your architecture takes on more form. It should also become more "realizable".  You should include technologies that you envision will come into play within the different Microservices (the technology stacks).  This will depend largely on your teams choice of core language (e.g., python, Java, etc.) 

Notice that each Microservice will have its own data store, in addition to its own technology stack.  Technologies may certainly (and often will) repeat across multiple Microservices.  That said, there is nothing wrong with using several common frameworks and tools within the Microservices, including core languages.  For example, if one person on your team wants to tackle (just using the above example unrelated to our project) the "Reservation" Microservice in Java, another person on your team could (theoretically) tackle the "Boarding" Microservice with a python stack.  Your goal is neither to produce a polyglot Tower of Babel nor a singular technology stack standardized across all Microservices, but rather, and this is the goal, to choose the best set of technologies for the each Microservice, as a bounded context implementing a core business capability.  As a simple example, some data store requirements might best be suited to a NoSQL database such as Cassandra or MongoDB, and other requirements might best be suited to a relational database, such as Oracle or MySQL.  The ability to choose the right technologies for each Microservice is one of the key "selling points" of such an architecture.

Deliverable Two:  Define Your Messages & Services Model

Based on the functional requirements of the system, use whatever tool you prefer to create a first pass of the following artifacts from Lecture 2:

Microservice Architecture Catalog (cf. MP Table 2.2 p. 62)
Service Operation Analysis (you can leave Actor and Use Case/User Story blank for this first draft)
Service Operation Decomposition (you can focus on Responsibilities and Parameters and Return Value for this first draft)
Technology Stack Decomposition (fill in what you can for this first draft)
Event Model

Follow the API-FIRST principle and describe the central messages that will be passed between the various services and services and components in your model.  Feel free to modify the five artifacts above to suit your team's needs.  They are intended to help you as a team think and communicate about what you are going to build.  These will need to be created in some tool, the choice of which is up to your team.  You may choose Word, Excel, Visual Paradigm, or any other tool.

Specifically, think about what messages will be passed from one service to another asynchronously, say over RabbitMQ (we will get to the technical details of this communication later)?  What messages should be passed in a synchronous fashion, perhaps via RPC/RMI/gRPC or a RESTful interface?  What patterns might you leverage in your communication (e.g., Request/Reply, which we will talk about in our conversation about asynchronous communication)?  Again, we will get to the technical details of these various patterns later.  This messaging model does not need to be complete (and certainly not "final"), but it does need to depict your understanding at the moment of the services you have identified along with their responsibilities and relationships and key communication paths.  You are to work collaboratively in producing this initial model, whiteboarding various design alternatives, finally documenting the current state of your model in and the above artifacts in your tool of choice.

Deliverable Three:  Produce a Draft of One Domain Model

Working as a team and based on the functional requirements of the system and your understanding of our discussion of analysis modeling and the Building Blocks of Domain Driven Design (see especially Evans, Domain-Driven Design Part II, pp. 63ff), produce a draft Domain Model for a single Bounded Context drawn from your working Context Map and High Level Architecture as a first Analysis exercise (cf. Evans, 293ff.).  You are free to choose whichever one of your Bounded Contexts you feel is especially rich in content.  Using any UML-based drawing tool or whiteboard, produce a Domain Model draft depicting the salient Entities, Value Objects, Services, Modules, Aggregates, Factories and Repositories you feel may play a useful role in your eventual solution.  The goal of this analysis activity is to articulate a high-level vocabulary of the "things" you feel will drive your eventual design of your auction site, focusing again on a single bounded context.

The intent here is not to design a particular microservice in terms of how it is going to be implemented, but rather to focus on the requirements and WHAT the Bounded Context of the microservice is responsible for.

Deliverable Four:  Begin Documenting your Architecture Decisions

Referring to Michael Nygard's documentation of ADR usage here and https://adr.github.io and
https://adr.github.io/madr/, begin documenting your key architectural decisions.  You should store your ADRs in your github repository.  You may find Richards & Ford, Fundamenntals of Software Architecture, chapters 4, 7, 8, 9 and 19 helpful in this exercise.

Resources:

You may find the following online resources helpful as you work together to produce these deliverables:

Domain-Driven Design Reference
Domain-Driven Design Quickly
GitHub References Points on Domain-Driven Design
http://guide.agilealliance.org/guide/crc.html
http://agilemodeling.com/artifacts/crcModel.htm
http://css.dzone.com/articles/crc-cards-primer

You should also begin to contemplate your user HTML and REST-based interface.  You may find the following sites helpful:

http://getbootstrap.com/
http://learn.shayhowe.com/html-css/
http://www.codecademy.com/
You can find a quick index to UML diagrams here.



Submission:

For Iterations:

Have your designated Team Lead upload your team's IterationN files and any supporting materials to the repo. Please include a README text file that contains any instructions or additional details for the TAs to assist with grading.

Setup:

When you open the invitation URL in a browser tab, you will have to complete the following steps:

Github may ask you to grant permission for GitHub Classroom to have access to your GitHub account. If you are asked this question, you should say yes and grant access to Github Classroom.

You must click “Accept this assignment” or your repository will not actually be created. Do not skip this step!

If you run into any issues, please ask for help.