<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CS446/CS646/ECE452 S26</title><link>https://lanortha.github.io/CS446-S26/</link><description>Recent content on CS446/CS646/ECE452 S26</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://lanortha.github.io/CS446-S26/index.xml" rel="self" type="application/rss+xml"/><item><title>Lecture Slides</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/slides/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/slides/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_001.pdf"&gt;Introduction to Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_002.pdf"&gt;Introduction to Software Architecture, Stakeholders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_003.pdf"&gt;Non-Functional Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_004.pdf"&gt;User Scenarios, Use Cases, Human Values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_005.pdf"&gt;Software Modeling, UML Diagrams&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_006.pdf"&gt;Decomposition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../../pdf/CS446_007.pdf"&gt;Architectural Views&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Overview</title><link>https://lanortha.github.io/CS446-S26/docs/project/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/overview/</guid><description>&lt;h1 id="overview"&gt;
 Overview
 &lt;a class="anchor" href="#overview"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;The project forms an integral part of this course. You will work in teams to design and implement a mobile app, during which you practice the software design and architecture knowledge you learn in class.&lt;/p&gt;
&lt;h2 id="goals"&gt;
 Goals
 &lt;a class="anchor" href="#goals"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The goals of the project include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;to create something useful;&lt;/li&gt;
&lt;li&gt;to learn about architecture styles and design patterns through application in a development setting;&lt;/li&gt;
&lt;li&gt;to leverage current software development technologies;&lt;/li&gt;
&lt;li&gt;most importantly, to have fun along the way!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The scope of the project should assume at least 6h/week development time (e.g., 6 team members * 6h/week * ~10 weeks = ~360 hours in total). This should be enough time to complete an interesting project.&lt;/p&gt;</description></item><item><title>Pipe-Filter</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/pipe-filter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/pipe-filter/</guid><description>&lt;h1 id="pipe-filter"&gt;
 Pipe-Filter
 &lt;a class="anchor" href="#pipe-filter"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Pipe-Filter is suitable for applications that require a defined series of (mostly) independent computations to be performed on a stream of data entries.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Example component diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="topology-network.png" alt="Pipe-Filter topology example" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component: &lt;strong&gt;Filters&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;each filter transforms input data entry/entries to output data entry/entries.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;local transformations&lt;/em&gt;: no shared state between filters, and minimal knowledge of upstream/downstream.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;incremental processing&lt;/em&gt;: outputs can begin before all inputs are consumed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connector: &lt;strong&gt;Pipes&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;carry data between filters (streams, files, in-memory queues).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pros-and-cons"&gt;
 Pros and cons
 &lt;a class="anchor" href="#pros-and-cons"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pros
&lt;ul&gt;
&lt;li&gt;Maintainability: filters can be replaced or improved locally, as long as their input and output formats are stable.&lt;/li&gt;
&lt;li&gt;Efficiency (throughput): supports concurrency naturally by parallelization and stream processing.&lt;/li&gt;
&lt;li&gt;Observability: performing throughput and deadlock analyses is possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons
&lt;ul&gt;
&lt;li&gt;Efficiency (latency): (de)serialization and data copying across pipes can be expensive.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;variant&lt;/em&gt;: using different data formats for each pipe, improves efficiency but adds complexity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Complexity: debugging end-to-end behaviors across many stages can be non-trivial.&lt;/li&gt;
&lt;li&gt;Not ideal for interactive systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="variants"&gt;
 Variants
 &lt;a class="anchor" href="#variants"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="pipeline"&gt;
 Pipeline
 &lt;a class="anchor" href="#pipeline"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;This variant requires a linear sequence of filters (i.e., each filter has exactly one input pipe and one output pipe).
An example is the pipe operator &lt;code&gt;|&lt;/code&gt; in Unix shells, e.g., the following component diagram shows the command &lt;code&gt;ls | grep '.pdf' | wc -l&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Stakeholder Interviews</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/interview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/interview/</guid><description>&lt;h1 id="workshop-stakeholder-interviews"&gt;
 Workshop: Stakeholder Interviews
 &lt;a class="anchor" href="#workshop-stakeholder-interviews"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;At this point, you may have some rough ideas about what kind of mobile app you want to build.
Well, there are many different features you can try to support, and many non-functional requirements that you can target, but how do you know which ones are actually &lt;em&gt;useful&lt;/em&gt;?
Meeting with your stakeholders is the best way to find out.&lt;/p&gt;
&lt;p&gt;In this workshop, we will talk about tips for interviewing stakeholder to discover their needs and constraints.
We will also run practice interviews with each other.
The goal is to leave the workshop with (1) a few concrete requirements items of your app, and (2) an actionable procedure for turning your project idea into concrete requirements items.&lt;/p&gt;</description></item><item><title>Structural Patterns</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/design-patterns/structural/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/design-patterns/structural/</guid><description>&lt;h1 id="structural-design-patterns"&gt;
 Structural Design Patterns
 &lt;a class="anchor" href="#structural-design-patterns"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Structural patterns concern the composition of classes and objects into larger structures.
They help ensure that when parts of a system change, the overall structure remains flexible and efficient.&lt;/p&gt;
&lt;h2 id="adapter"&gt;
 Adapter
 &lt;a class="anchor" href="#adapter"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Motivation&lt;/strong&gt;: We need to use an existing class whose interface is incompatible with what our code expects, and we cannot (or do not want to) modify that class (e.g., because it lives in a third-party library).&lt;/p&gt;</description></item><item><title>Android Toolchain</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/android-toolchain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/android-toolchain/</guid><description>&lt;h1 id="workshop-android-toolchain"&gt;
 Workshop: Android Toolchain
 &lt;a class="anchor" href="#workshop-android-toolchain"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;In this workshop we will introduce the toolchain for building Android: the IDE, Android Studio; the programming language, Kotlin; and the build system, Gradle.
We will walk through the steps of setting up a hello-world Android project, meanwhile introducing these tools and providing pointers for further learning.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pengyunie/cs446-1261-demos/tree/main/HelloWorld"&gt;Demo code for this topic&lt;/a&gt; is available on GitHub.&lt;/p&gt;
&lt;h2 id="android-studio"&gt;
 Android Studio
 &lt;a class="anchor" href="#android-studio"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="install-android-studio"&gt;
 Install Android Studio
 &lt;a class="anchor" href="#install-android-studio"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Android Studio is the recommended IDE for building Android apps. It comes with a built-in SDK manager and emulator to help you setup a development environment. It is supported on Windows, Max, Linux, and ChromeOS. The editor experience is based on JetBrains (e.g., IntelliJ IDEA, PyCharm).&lt;/p&gt;</description></item><item><title>Behavioral Patterns</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/design-patterns/behavioral/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/design-patterns/behavioral/</guid><description>&lt;h1 id="behavioral-design-patterns"&gt;
 Behavioral Design Patterns
 &lt;a class="anchor" href="#behavioral-design-patterns"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Behavioral patterns concern the interaction and communication between objects.
They help distribute responsibilities among objects and define how they collaborate to carry out complex tasks.&lt;/p&gt;
&lt;h2 id="observer"&gt;
 Observer
 &lt;a class="anchor" href="#observer"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Motivation&lt;/strong&gt;: When a system is partitioned into cooperating classes, a common need is to keep related objects in sync&amp;mdash;when one object changes state, others that depend on it should be notified.
The Observer design pattern implements the &lt;a href="../..//architectural-styles/implicit-invocation/"&gt;Implicit Invocation&lt;/a&gt; architectural style.&lt;/p&gt;</description></item><item><title>Layered</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/layered/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/layered/</guid><description>&lt;h1 id="layered"&gt;
 Layered
 &lt;a class="anchor" href="#layered"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Layered architecture is suitable for applications that can be organized into a hierarchy of layers, where each layer provides services to the layer above and uses services from the layer below.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Example component diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="topology-3layer.png" alt="Layered topology example" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component: &lt;strong&gt;Layers&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;each layer groups components at similar abstraction level (e.g., UI, domain/business, data/infrastructure).&lt;/li&gt;
&lt;li&gt;a layer usually only depends on layers below it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connector: method calls (or RPC) across layer boundaries, typically behind interfaces.&lt;/li&gt;
&lt;li&gt;Configuration: a common constraint is that communication happens only between adjacent layers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pros-and-cons"&gt;
 Pros and cons
 &lt;a class="anchor" href="#pros-and-cons"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pros
&lt;ul&gt;
&lt;li&gt;Maintainability: it is often possible to swap implementations within a layer (e.g., replace storage) if contracts are kept; changes in one layer affects at most two adjacent layers.&lt;/li&gt;
&lt;li&gt;Readability: each layer has a consistent abstraction level, making the system easier to understand.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons
&lt;ul&gt;
&lt;li&gt;Efficiency: abstractions in high-level functions can add overhead; performance requirements may force the coupling of high-level functions to their low-level implementations (breaking the encapsulation of the layers).&lt;/li&gt;
&lt;li&gt;Not all systems map cleanly to layered structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="variants"&gt;
 Variants
 &lt;a class="anchor" href="#variants"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="allowing-non-adjacent-layer-communication-layer-bypass"&gt;
 Allowing non-adjacent layer communication (layer bypass)
 &lt;a class="anchor" href="#allowing-non-adjacent-layer-communication-layer-bypass"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;This variant relaxes the adjacent-layer constraint: a higher layer may call a lower layer directly (e.g., UI calling the data layer) to reduce overhead or boilerplate. It can improve efficiency and development speed for simple flows, but it tends to erode boundaries over time and makes testing/refactoring harder.&lt;/p&gt;</description></item><item><title>Creational Patterns</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/design-patterns/creational/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/design-patterns/creational/</guid><description>&lt;h1 id="creational-design-patterns"&gt;
 Creational Design Patterns
 &lt;a class="anchor" href="#creational-design-patterns"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Creational patterns concern the process of object creation.
They help make a system independent of how its objects are created, composed, and represented.&lt;/p&gt;
&lt;h2 id="singleton"&gt;
 Singleton
 &lt;a class="anchor" href="#singleton"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Motivation&lt;/strong&gt;: Some classes must have exactly one instance (e.g., a file system, a database connection pool, a window manager).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intent&lt;/strong&gt;: Ensure a class has only one instance and provide a global point of access to it.&lt;/p&gt;
&lt;p&gt;&lt;img src="singleton.png" alt="Singleton class diagram" /&gt;&lt;/p&gt;</description></item><item><title>Jetpack Compose</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/jetpack-compose/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/jetpack-compose/</guid><description>&lt;h1 id="workshop-jetpack-compose"&gt;
 Workshop: Jetpack Compose
 &lt;a class="anchor" href="#workshop-jetpack-compose"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;In this workshop, we will introduce the Jetpack Compose framework used for building Android apps.
The demo we will be following is &lt;a href="https://github.com/pengyunie/cs446-1261-demos/tree/main/NotesDemo"&gt;a minimal online Notes app&lt;/a&gt;.
You can clone this code, follow the &lt;a href="#setup-firebase"&gt;steps to setup Firebase&lt;/a&gt;, then you should be able to run the app yourself as well.&lt;/p&gt;
&lt;p&gt;This document will explain several key concepts and steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How to create UI with Jetpack Compose, following the MVVM architecture;&lt;/li&gt;
&lt;li&gt;How to connect with Firebase, which provides various of backend services including authentication and database.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="jetpack-compose"&gt;
 Jetpack Compose
 &lt;a class="anchor" href="#jetpack-compose"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="ui-composable"&gt;
 UI (Composable)
 &lt;a class="anchor" href="#ui-composable"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;In Jetpack Compose, each UI element is called a &lt;em&gt;composable&lt;/em&gt;, and creating UI is essentially a top-down process of writing composables that contains smaller composables.&lt;/p&gt;</description></item><item><title>Repository</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/repository/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/repository/</guid><description>&lt;h1 id="repository"&gt;
 Repository
 &lt;a class="anchor" href="#repository"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Repository (a.k.a. data-centered) style is suitable when the central challenge is establishing, augmenting, and maintaining a shared body of information.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Example component diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="topology-minimal.png" alt="Repository topology example" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: persistent central data store representing the current system state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools and services&lt;/strong&gt;: independent components that can read and write the repository, monitor changes, and perform concurrent computations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connector: data CRUD operations and change notifications.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An example of this style is a code editor: many features interact through a shared document buffer.&lt;/p&gt;</description></item><item><title>Teams and Presentation Schedules</title><link>https://lanortha.github.io/CS446-S26/docs/project/schedule/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/schedule/</guid><description>&lt;h1 id="teams-and-presentation-schedules"&gt;
 Teams and Presentation Schedules
 &lt;a class="anchor" href="#teams-and-presentation-schedules"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;You can find your assigned TA and the presentation slots (for P4 and P5) on this page.&lt;/p&gt;
&lt;h2 id="ta-assignment"&gt;
 TA Assignment
 &lt;a class="anchor" href="#ta-assignment"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Each team will be assigned to a TA, who will provide technical guidance and feedback on your project and grade your deliverables.
Your TA will provide feedback in the comments returned to your deliverables, and be available during most of the workshop sessions to answer questions.
Please reach out to your TA if you need additional feedback (depending on their availability).&lt;/p&gt;</description></item><item><title>Implicit Invocation</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/implicit-invocation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/implicit-invocation/</guid><description>&lt;h1 id="implicit-invocation"&gt;
 Implicit Invocation
 &lt;a class="anchor" href="#implicit-invocation"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Implicit invocation is suitable when components producing events/data do not directly know which other components will consume them.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Example component diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="variant-pubsub.png" alt="Publish-subscribe topology" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Publishers&lt;/strong&gt;: emit events/messages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscribers&lt;/strong&gt;: register interest and react when events arrive.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connector: &lt;strong&gt;Events/messages&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;often grouped by topic/channel.&lt;/li&gt;
&lt;li&gt;publishers do not call subscribers directly; the runtime delivery mechanism handles the fan-out to current subscribers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pros-and-cons"&gt;
 Pros and cons
 &lt;a class="anchor" href="#pros-and-cons"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pros
&lt;ul&gt;
&lt;li&gt;Maintainability: add/remove subscribers without changing publishers; supports pluggable components at runtime.&lt;/li&gt;
&lt;li&gt;Scalability: asynchronous delivery and buffering can be scaled up to handle spikes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons
&lt;ul&gt;
&lt;li&gt;Readability: hidden dependencies between components and unpredictable ordering/timing of execution.&lt;/li&gt;
&lt;li&gt;Debugging/testing: often needs tracing, structured logging, and careful test harnesses to reason about the execution order.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="variants"&gt;
 Variants
 &lt;a class="anchor" href="#variants"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="event-based"&gt;
 Event-based
 &lt;a class="anchor" href="#event-based"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;This variant introduces a shared event bus. Components publish events to the bus and subscribe to events from the bus.
Compared to direct publish-subscribe, the bus makes routing and buffering explicit.&lt;/p&gt;</description></item><item><title>Presentation Tips</title><link>https://lanortha.github.io/CS446-S26/docs/project/presentation-tips/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/presentation-tips/</guid><description>&lt;h1 id="presentation-tips"&gt;
 Presentation Tips
 &lt;a class="anchor" href="#presentation-tips"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="time-management"&gt;
 Time Management
 &lt;a class="anchor" href="#time-management"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Sticking to the 10-minute total time limit for your team is crucial.&lt;/p&gt;
&lt;p&gt;During the prototype presentation (6 minutes presentation + 4 minutes Q&amp;amp;A/feedback), we will be slightly flexible as you get used to the classroom equipment, but please try to stay within the limit to ensure there is time for feedback.&lt;/p&gt;
&lt;p&gt;During the final presentation (8 minutes presentation + 2 minutes Q&amp;amp;A), the time limit is strict and exceeding it will result in point deductions.&lt;/p&gt;</description></item><item><title>Testing</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/testing/</guid><description>&lt;h1 id="workshop-testing"&gt;
 Workshop: Testing
 &lt;a class="anchor" href="#workshop-testing"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;In this workshop, we will introduce the fundamentals of software testing, and then demonstrate how to write and run tests in Android (unit tests and UI tests).&lt;/p&gt;
&lt;h2 id="testing-basics"&gt;
 Testing Basics
 &lt;a class="anchor" href="#testing-basics"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Testing or Quality Assurance (QA) is the software development phase where we test software against its requirements and validate whether it meets stakeholders&amp;rsquo; expectations.
Testing help you identify and fix bugs early, before they are exposed to users and cause more serious issues.
You should start adding tests as soon as you start coding; some argue that tests should be written before the code is written, as executable specifications of the software requirements (&lt;a href="https://en.wikipedia.org/wiki/Test-driven_development"&gt;Test-Driven Development&lt;/a&gt;).&lt;/p&gt;</description></item><item><title>Continuous Integration</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/continuous-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/continuous-integration/</guid><description>&lt;h1 id="workshop-continuous-integration"&gt;
 Workshop: Continuous Integration
 &lt;a class="anchor" href="#workshop-continuous-integration"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;In this document, we will introduce continuous integration (CI) and walk through setting up a simple CI pipeline for an Android project using GitHub Actions.&lt;/p&gt;
&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Continuous integration means integrating code changes into a shared main branch frequently (often many times per day) and verifying each integration with an automated build and tests.
Everyone on the team pushes to the same main branch regularly, so changes are visible and conflicts are surfaced early.
The goal is to avoid the pain of a long, chaotic integration phase at the end of a release; instead, each integration is small and easier to debug.&lt;/p&gt;</description></item><item><title>MVVM (MVC, MVP)</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/mvvm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/mvvm/</guid><description>&lt;h1 id="mvvm"&gt;
 MVVM
 &lt;a class="anchor" href="#mvvm"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;MVVM (Model–View–ViewModel) is a presentation-oriented architectural style commonly used in modern UI applications (including Android).
The primary goal is to separate the UI logic (which usually needs to be real-time interactive), UI state, and business logic.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Example package/class diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="topology-mvvm-demo.png" alt="MVVM topology example" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Components
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;View&lt;/strong&gt;: renders UI; listens to user events; reacts to UI state changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ViewModel&lt;/strong&gt;: holds UI state; redirects user events to business logic; fills data into UI state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model&lt;/strong&gt;: business logic, network calls, data access, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connector:
&lt;ul&gt;
&lt;li&gt;control flows from View to ViewModel to Model;&lt;/li&gt;
&lt;li&gt;data flows backwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pros-and-cons"&gt;
 Pros and cons
 &lt;a class="anchor" href="#pros-and-cons"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pros
&lt;ul&gt;
&lt;li&gt;Maintainability: UI logic and business logic are easier to maintain separately.&lt;/li&gt;
&lt;li&gt;Separation of concerns: UI logic and business logic do not mix together; UI elements can have different (usually shorter) lifetimes than the ViewModel and Model classes.&lt;/li&gt;
&lt;li&gt;Reusability: one ViewModel can be shared by multiple Views when needed.&lt;/li&gt;
&lt;li&gt;Testability: ViewModel and Model can be easily unit-tested without rendering UI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons
&lt;ul&gt;
&lt;li&gt;Overkill for simple state: the extra abstraction may slow down simple projects.&lt;/li&gt;
&lt;li&gt;Debugging: reactive flows and state propagation can be harder to trace without good tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="variants"&gt;
 Variants
 &lt;a class="anchor" href="#variants"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;MVC and MVP are older versions of MVVM that aim for similar goals (separation of concerns) but differ in where UI logic/state lives and how tightly the &amp;ldquo;middle&amp;rdquo; component is coupled to the view.&lt;/p&gt;</description></item><item><title>Release Engineering</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/release-engineering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/workshops/release-engineering/</guid><description>&lt;h1 id="workshop-release-engineering"&gt;
 Workshop: Release Engineering
 &lt;a class="anchor" href="#workshop-release-engineering"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;In this document, we will introduce release engineering and walk through deployment strategies that reduce risk during release, plus pointers for publishing an Android app on Google Play.&lt;/p&gt;
&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Release engineering is the practice of getting built software to users reliably.
CI (covered in the &lt;a href="./continuous-integration"&gt;Continuous Integration&lt;/a&gt; workshop) keeps the Integrate and Build stages healthy; release engineering focuses on the Deploy stage: how to ship a new version without excessive downtime or risk.&lt;/p&gt;</description></item><item><title>Server-Client (Microservices, Serverless)</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/server-client/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/server-client/</guid><description>&lt;h1 id="server-client"&gt;
 Server-Client
 &lt;a class="anchor" href="#server-client"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Server-client is suitable for applications that involve distributed data and processing across multiple components over a network.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Basic component diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="topology-minimal.png" alt="Server-client topology example" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clients&lt;/strong&gt;: initiate requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servers&lt;/strong&gt;: respond to requests and provide services/data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connector:
&lt;ul&gt;
&lt;li&gt;request/response (HTTP, REST, RPC) or message-based communication (queues/streams).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Server-client is widely adopted in various applications:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;img src="examples-db.png" alt="Database viewer / server" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;img src="examples-file.png" alt="File explorer / server" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;img src="examples-terminal.png" alt="Terminal window / server" /&gt;&lt;/p&gt;</description></item><item><title>Process-Control</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/process-control/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/architectural-styles/process-control/</guid><description>&lt;h1 id="process-control"&gt;
 Process-Control
 &lt;a class="anchor" href="#process-control"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Process-control (aka feedback-control) style is suitable when the system’s purpose is to maintain certain properties of a process output near a desired reference value (set point), despite disturbances.&lt;/p&gt;
&lt;h2 id="topology"&gt;
 Topology
 &lt;a class="anchor" href="#topology"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Example component diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src="topology-feedback-loop.png" alt="Feedback control loop topology" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Controller&lt;/strong&gt;: computes actions based on the set point and feedback.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor&lt;/strong&gt;: the (physical or software) component being controlled; it usually comes with some observers/sensors to collect telemetry data as feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pros-and-cons"&gt;
 Pros and cons
 &lt;a class="anchor" href="#pros-and-cons"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pros
&lt;ul&gt;
&lt;li&gt;Robustness: can adapt to changing conditions and keep the system within acceptable bounds.&lt;/li&gt;
&lt;li&gt;Autonomy: supports self-correcting behaviors (within designed limits).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cons
&lt;ul&gt;
&lt;li&gt;Cost and complexity: requires monitoring/telemetry, calibration, and control logic.&lt;/li&gt;
&lt;li&gt;Sensitive to latency: delayed or noisy feedback can cause oscillations/instability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="real-world-examples"&gt;
 Real-world examples
 &lt;a class="anchor" href="#real-world-examples"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="autonomous-driving"&gt;
 Autonomous driving
 &lt;a class="anchor" href="#autonomous-driving"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Many components in an autonomous driving system are built around the process-control style.
Consider steering: given a desired steering angle to follow a trajectory (set point), the system (controller) computes the torque command needed to reach that angle and send it to the vehicle&amp;rsquo;s steering actuator (processor); a sensor continuously reports the actual angle (feedback) back to the controller, which can be different than the desired angle because of road conditions, so that the controller can adjust the torque command accordingly.
The same style applies to other components like throttle and braking.&lt;/p&gt;</description></item><item><title>P0: Team Formation</title><link>https://lanortha.github.io/CS446-S26/docs/project/p0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p0/</guid><description>&lt;h1 id="p0-team-formation"&gt;
 P0: Team Formation
 &lt;a class="anchor" href="#p0-team-formation"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: May 22, 11:59pm Eastern Time&lt;/p&gt;
&lt;p&gt;Rules for team formation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teams must consist of six students.
&lt;ul&gt;
&lt;li&gt;There might be a few exceptions for teams of four/five students when the total number of students is not divisible by six. But in that case, note that a smaller team means more work to do for each member.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Everyone must commit to attending team activities. Make sure to agree on how you plan to meet and collaborate.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="book-hint warning"&gt;
&lt;p&gt;&lt;strong&gt;Start finding teammates NOW&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>A1: UML Practice</title><link>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a1/</guid><description>&lt;h1 id="a1-uml-practice"&gt;
 A1: UML Practice
 &lt;a class="anchor" href="#a1-uml-practice"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: (updated) Jun 10, 11:59pm Eastern Time&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Select &lt;em&gt;one&lt;/em&gt; of the following software components/modules, and draw a UML class diagram for it. The options are in different programming languages, so you can pick the one that you are most familiar with.&lt;/p&gt;
&lt;p&gt;For each component/module, I will point you to its source code files, and a set of primary classes that &lt;em&gt;must&lt;/em&gt; be included in the class diagram.&lt;/p&gt;</description></item><item><title>P1: Project Setup</title><link>https://lanortha.github.io/CS446-S26/docs/project/p1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p1/</guid><description>&lt;h1 id="p1-project-setup"&gt;
 P1: Project Setup
 &lt;a class="anchor" href="#p1-project-setup"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: May 29, 11:59pm Eastern Time&lt;/p&gt;
&lt;p&gt;Once your team has been formed, you should create a GitHub repository for your project.
This repository should be the central place to access your project&amp;rsquo;s codebase, artifacts, documentations, meeting notes, etc.
For this milestone, we require two important documents to be initialized: a README, and a team contract.&lt;/p&gt;
&lt;h2 id="create-github-project"&gt;
 Create GitHub Project
 &lt;a class="anchor" href="#create-github-project"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Create a new GitHub repository for your project. Make sure to follow the following requirements:&lt;/p&gt;</description></item><item><title>A2: Decomposition Practice</title><link>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a2/</guid><description>&lt;h1 id="a2-decomposition-practice"&gt;
 A2: Decomposition Practice
 &lt;a class="anchor" href="#a2-decomposition-practice"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: Jun 19, 11:59pm Eastern Time&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Select &lt;em&gt;one&lt;/em&gt; of the following software systems (hypothetical or your project), and write a short report on how you would decompose the system.&lt;/p&gt;
&lt;p&gt;Your report should be a PDF document.
Formatting requirements: &lt;strong&gt;1&amp;ndash;2 pages&lt;/strong&gt; (including the figures, but excluding acknowledgements and references); letter size; main text font size should be at least 11pt.&lt;/p&gt;
&lt;p&gt;The report should include the following parts:&lt;/p&gt;</description></item><item><title>P2: Weekly Updates</title><link>https://lanortha.github.io/CS446-S26/docs/project/p2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p2/</guid><description>&lt;h1 id="p2-weekly-updates"&gt;
 P2: Weekly Updates
 &lt;a class="anchor" href="#p2-weekly-updates"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: the first Monday at 11:59pm Eastern Time following the week, for weeks 4-6, 8-12.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: right"&gt;Week&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Date&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;4&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jun 01 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;5&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jun 08 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;6&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jun 15 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;8&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jun 29 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;9&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jul 06 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;10&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jul 13 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;11&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jul 20 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: right"&gt;12&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Jul 27 Mon&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Each week, you should submit a brief update on your project, in the form of a plain text document (with markdown-style formatting).
Your update should include a list of tasks done during the week, and pointers to the relevant artifacts (e.g., code, requirement documents, meeting minutes, etc.) as the outcome of the tasks.&lt;/p&gt;</description></item><item><title>A3: Architectural Style Example</title><link>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a3/</guid><description>&lt;h1 id="a3-architectural-style-example"&gt;
 A3: Architectural Style Example
 &lt;a class="anchor" href="#a3-architectural-style-example"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: Jul 10, 11:59pm Eastern Time&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;We will cover several architectural styles in this course.
This assignment is designed to evaluate if you have understood the architectural styles.
This assignment requires you to choose &lt;em&gt;one&lt;/em&gt; architectural style from the following list and come up with an example.&lt;/p&gt;
&lt;p&gt;List of architectural styles allowed for this assignment (including their variants):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../lectures/architectural-styles/pipe-filter/"&gt;Pipe-Filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../lectures/architectural-styles/layered/"&gt;Layered&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../lectures/architectural-styles/repository/"&gt;Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../lectures/architectural-styles/implicit-invocation/"&gt;Implicit Invocation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../lectures/architectural-styles/process-control/"&gt;Process-Control&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your example can be:&lt;/p&gt;</description></item><item><title>A4: Design Pattern Example</title><link>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/individual-assessments/a4/</guid><description>&lt;h1 id="a4-design-pattern-example"&gt;
 A4: Design Pattern Example
 &lt;a class="anchor" href="#a4-design-pattern-example"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: July 24, 11:59pm Eastern Time&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;We will cover several design patterns in this course.
This assignment is designed to evaluate if you have understood the design patterns.
This assignment requires you to choose &lt;em&gt;one&lt;/em&gt; design pattern from the following list, and describe an example of how the pattern has been / could be applied in a software system.&lt;/p&gt;
&lt;p&gt;List of design patterns allowed for this assignment:&lt;/p&gt;</description></item><item><title>P3: Project Proposal</title><link>https://lanortha.github.io/CS446-S26/docs/project/p3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p3/</guid><description>&lt;h1 id="p3-project-proposal"&gt;
 P3: Project Proposal
 &lt;a class="anchor" href="#p3-project-proposal"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: June 5, 11:59pm Eastern Time&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The proposal document should be a PDF document.
Formatting requirements: &lt;strong&gt;4&amp;ndash;6 pages&lt;/strong&gt; (including the figures, but excluding acknowledgements and references); letter size; main text font size should be at least 11pt.&lt;/p&gt;
&lt;p&gt;The document should include the following sections.&lt;/p&gt;
&lt;h3 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Introduce your project topic in a couple of paragraphs. Focus on answering the following questions:&lt;/p&gt;</description></item><item><title>P4: Prototype Presentation</title><link>https://lanortha.github.io/CS446-S26/docs/project/p4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p4/</guid><description>&lt;h1 id="p4-prototype-presentation"&gt;
 P4: Prototype Presentation
 &lt;a class="anchor" href="#p4-prototype-presentation"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;June 22/24 in class&lt;/p&gt;
&lt;p&gt;By midterm, you should have explored some design options, implemented some basic features, and have a prototype to demonstrate the user experience of your app.
The goal of prototype presentation is to evaluate your progress so far (focusing on the requirements and architecture/design phases rather than detailed implementations) and to provide timely feedback on that.&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The presentation slot is 10 minutes, including 6 minutes for presentation and 4 minutes for questions and feedback.
Check &lt;a href="./schedule"&gt;the schedule tables&lt;/a&gt; for your assigned slot.&lt;/p&gt;</description></item><item><title>P5: Final Presentation</title><link>https://lanortha.github.io/CS446-S26/docs/project/p5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p5/</guid><description>&lt;h1 id="p5-final-presentation"&gt;
 P5: Final Presentation
 &lt;a class="anchor" href="#p5-final-presentation"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Aug 04/05 in class&lt;/p&gt;
&lt;p&gt;The goal of final presentation is to evaluate your final product, namely how well it is designed and implemented and whether it meets the requirements set in the beginning of the project.
We will evaluate that through a slideshow (which should be brief) and demonstration (which will be more extensive than the prototype presentation).&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The presentation slot is 10 minutes, including 8 minutes for presentation and 2 minutes for questions.
Check &lt;a href="./schedule"&gt;the schedule tables&lt;/a&gt; for your assigned slot.&lt;/p&gt;</description></item><item><title>P6: Final Report</title><link>https://lanortha.github.io/CS446-S26/docs/project/p6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/p6/</guid><description>&lt;h1 id="p6-final-report"&gt;
 P6: Final Report
 &lt;a class="anchor" href="#p6-final-report"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Deadline: Aug 05, 11:59pm Eastern Time&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 Requirements
 &lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The final report document should be a PDF document.
Formatting requirements: &lt;strong&gt;8&amp;ndash;12 pages&lt;/strong&gt; (including the figures, but excluding acknowledgements and references); letter size; main text font size should be at least 11pt.&lt;/p&gt;
&lt;p&gt;The document should include the following sections.&lt;/p&gt;
&lt;h3 id="app-description"&gt;
 App Description
 &lt;a class="anchor" href="#app-description"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;suggested length: 1 page&lt;/p&gt;
&lt;p&gt;Using one paragraph and a few screenshots, describe the app you built and its key features. This should be similar to a front page of the app in the app store.&lt;/p&gt;</description></item><item><title>Bonus Points</title><link>https://lanortha.github.io/CS446-S26/docs/project/bonus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/project/bonus/</guid><description>&lt;h1 id="bonus-points"&gt;
 Bonus Points
 &lt;a class="anchor" href="#bonus-points"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;There are a number of ways to earn bonus points for your project.
Some of them are competitive, i.e., awarded to the teams presenting the best artifacts at different stages of the project.
Others are non-competitive, i.e., awarded as long as you take extra effort to finalize and release your project.
This page documents their requirements.&lt;/p&gt;
&lt;p&gt;All value are percentages of the total project grade.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Bonus&lt;/th&gt;
 &lt;th style="text-align: right"&gt;Value&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Outstanding project proposal&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Outstanding prototype presentation&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Outstanding final presentation&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Uploading demonstration video&lt;/td&gt;
 &lt;td style="text-align: right"&gt;4%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Publishing to app store&lt;/td&gt;
 &lt;td style="text-align: right"&gt;4%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Best app awards by the audience&lt;/td&gt;
 &lt;td style="text-align: right"&gt;6%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Best app awards by the course staff&lt;/td&gt;
 &lt;td style="text-align: right"&gt;6%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="outstanding-project-proposal-2"&gt;
 Outstanding project proposal (2%)
 &lt;a class="anchor" href="#outstanding-project-proposal-2"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This is awarded to top-20% of the teams based on the quality of their project proposal.
They are nominated by the TAs from their pool of assigned teams, and verified by the course staff.&lt;/p&gt;</description></item><item><title>Graduate Student Project</title><link>https://lanortha.github.io/CS446-S26/docs/individual-assessments/graduate-project/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/individual-assessments/graduate-project/</guid><description>&lt;h1 id="graduate-student-project"&gt;
 Graduate Student Project
 &lt;a class="anchor" href="#graduate-student-project"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;blockquote class="book-hint warning"&gt;
&lt;p&gt;This assessment only applies to graduate students enrolled in CS646.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You will perform an individual graduate project. Three types of graduate projects are possible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Literature Survey: The goal of this kind of project is to gain a more complete understanding of a topic relevant to this course. The outcome of this project will be a critical summary of the state-of-the-art on your selected topic; this summary should be 6-8 pages. It is essential that this summary synthesizes the surveyed literature to identify important themes, findings, and open questions.&lt;/p&gt;</description></item><item><title>Evolution of Software Design and Architecture</title><link>https://lanortha.github.io/CS446-S26/docs/lectures/evolution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lanortha.github.io/CS446-S26/docs/lectures/evolution/</guid><description>&lt;div class="title-slide"&gt;
&lt;h1 id="evolution-of-software-design-and-architecture"&gt;
 Evolution of Software Design and Architecture
 &lt;a class="anchor" href="#evolution-of-software-design-and-architecture"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h3 id="cs446cs646ece452-software-design-and-architecture-pengyu-nie"&gt;
 CS446/CS646/ECE452 Software Design and Architecture, Pengyu Nie
 &lt;a class="anchor" href="#cs446cs646ece452-software-design-and-architecture-pengyu-nie"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;!-- ![Four eras of software engineering evolution](evolution-timeline.png) --&gt;
&lt;/div&gt;
&lt;!-- 
&lt;aside class="notes"&gt;
Welcome to the last lecture before final presentations. Today we're stepping back from specific patterns and styles to look at the big picture: how has software design and architecture evolved over the past 40 years, and where is it going? This is meant to give you perspective on WHY we studied what we studied, and how the field keeps changing.
&lt;/aside&gt; --&gt;
&lt;hr&gt;
&lt;h2 id="software-design-is-a-moving-target"&gt;
 Software Design is a Moving Target
 &lt;a class="anchor" href="#software-design-is-a-moving-target"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;bottleneck&lt;/strong&gt; in software engineering keeps shifting as we solve old problems and discover new ones.&lt;/p&gt;</description></item></channel></rss>