Designing Offerwise: A Modular Android App for Smart Job Offer Evaluation

ANDROID STUDIO

JAVA

ANDROID JETPACK

In today’s job market, choosing between offers involves more than just comparing base salaries. To better understand the full lifecycle of software development and demonstrate my proficiency in both system design and mobile engineering, I developed Offerwise, an Android application that helps users compare job offers holistically. The app evaluates not just salary but also benefits, cost-of-living adjustments, and user-defined preferences to compute a data-driven ranking of potential jobs.

This article showcases the technical decisions made during the design and development of the app, from modeling the object hierarchy to implementing the comparison logic and ensuring architectural clarity.

Problem Context & Functional Scope

Offerwise supports four core user actions:

  1. Enter or edit current job details

  2. Add and manage job offers

  3. Adjust comparison settings via user-defined weights

  4. Rank and compare offers based on a weighted scoring algorithm

The application is single-user, offline-only, and optimized for responsiveness and low resource overhead on Android 14+ devices.

Architecture and System Design

To promote scalability and maintainability, the app adopted the Model-View-ViewModel (MVVM) architecture. This allowed a clean separation of business logic from the user interface:

  • Activities serve as entry points for each user flow (e.g., adding jobs, editing settings, viewing comparisons).

  • ViewModels process data and handle user actions while preserving UI state across configuration changes.

  • Repositories and DAOs abstract the data layer, allowing interaction with RoomDB for local persistence.

  • Model classes (Job, Compensation, Location, Benefits) encapsulate structured data and include validation logic.

This structure made it easy to test components independently and iterate on UI without disrupting core logic.

Comparison Algorithm & Ranking

To translate user preferences into actionable comparisons, I designed a weighted scoring algorithm that evaluates each job based on salary, bonus, and benefits adjusted for local cost of living of the job offer location. Users assign weights (0–9) to each factor, and the app computes a composite score. All offers are stored in a TreeMap sorted by score, allowing the app to automatically rank jobs and present side-by-side comparisons through an intuitive UI.

Team Collaboration & Engineering Practices

While this was a collaborative project, I led the architectural design and owned the implementation of the comparison engine.

Key engineering practices applied in the project included:

  • Developing UML diagrams (class, sequence, component) to define system architecture

  • Leveraging use case modeling to guide functional decomposition

  • Applying test-first development with validation scenarios and error handling

  • Conducting design reviews to refine and consolidate ideas into a cohesive team architecture

Outcome

The result is a robust, modular Android app with intuitive UX, persistent local storage, and flexible comparison logic. This project gave me the opportunity to apply full-stack Android development skills in a realistic, end-to-end setting and sharpened my ability to:

  • Break down abstract requirements into concrete class and data structures

  • Build user-focused features with strong validation and usability

  • Architect maintainable systems with a clear separation of concerns

Published April 2025

CREATED WITH LOVE IN SAN FRANCISCO

Go back home