problemhardood

Object-Oriented Design for LinkedIn

Problem

Design an object-oriented system for LinkedIn: a professional social network where members maintain rich profiles (experience, education, skills), connect with other professionals, share posts and messages, follow companies, and search for people, companies, and jobs. The system should support notifications, connections, company pages, job postings, groups, and profile statistics.

LinkedIn

Solution

1. Requirements Analysis

Functional requirements (derived from the existing notes):

  • Members can create and update profiles including experiences, education, skills, and accomplishments.
  • Members can search for other members, companies, and jobs.
  • Members can send and accept connection requests and follow other members or companies.
  • Members can create posts, comment, like, share, and send direct messages.
  • System must send notifications for messages, connection invites, and post activity.
  • Members can create and join groups and companies can create job postings.

Non-functional requirements:

  • Support large-scale read/write (feed updates, messaging) with low latency for notifications.
  • Ensure data privacy and account security (account status management).
  • Support efficient search and recommendation (scalability of SearchIndex and indices).

2. Use Case Diagram

Actors:

  • Member, Admin, System (notification service)

Use cases: Add/update profile; Search; Send message; Create post; Follow/unfollow; Send notifications.

graph TD
    subgraph "LinkedIn System"
        UC1(Add/Update Profile)
        UC2(Search Members/Companies/Jobs)
        UC3(Send Message)
        UC4(Create Post / Comment / Like)
        UC5(Follow / Unfollow)
        UC6(Manage Company / Job Posting)
        UC7(Notifications)
    end
    Member --> UC1
    Member --> UC2
    Member --> UC3
    Member --> UC4
    Member --> UC5
    Admin --> UC6
    System --> UC7

LinkedIn Use Case Diagram

3. Class Diagram

Core classes and responsibilities (from the original content):

  • Account / Person / Member: user accounts and profile data.
  • Profile, Experience, Education: profile sub-entities.
  • Post, Comment, Group, Message: social primitives.
  • Company, JobPosting: company pages and job listings.
  • Search, SearchIndex: search abstraction and index implementation.
  • Notification: notification delivery and eventing.
classDiagram
    class Account {
        -String id
        -String password
        -AccountStatus status
        +reset_password()
    }
    class Member {
        -Profile profile
        -List connections
        -List follows
        +send_message()
        +create_post()
        +send_connection_invitation()
    }
    class Profile {
        -String summary
        -List<Experience> experiences
        -List skills
        +add_experience()
    }
    class Post {
        -String text
        -List comments
        -int total_likes
    }
    class Message {
        -Member sent_to
        -String body
    }
    class Company {
        -String name
        -List<JobPosting> active_job_postings
    }
    class JobPosting {
        -Date date_of_posting
        -String description
    }
    class SearchIndex {
        -Map member_names
        -Map company_names
        -Map job_titles
        +search_member(name)
    }
    Account <|-- Member
    Member "1" -- "*" Post : creates
    Post "1" -- "*" Comment : has
    Company "1" -- "*" JobPosting : lists

LinkedIn Class Diagram

4. Activity Diagrams

Activity: Add experience to profile

graph TD
    A[Member opens profile edit] --> B[Select add experience]
    B --> C[Enter experience details]
    C --> D[Validate details]
    D -- valid --> E[Persist to Profile]
    D -- invalid --> F[Show error]
    E --> G[Update profile view]

Activity: Send message (happy path)

graph TD
    A[Member composes message] --> B[Select recipient(s)]
    B --> C[Validate membership/permissions]
    C --> D[Persist message]
    D --> E[Trigger notification to recipient(s)]
    E --> F[Deliver message]

LinkedIn Profile Activity Diagram LinkedIn Send Message Activity Diagram

5. High-Level Code Implementation

The code below is skeleton-only: signatures, enums, and class outlines suitable for further implementation.

Java

public enum AccountStatus {
    ACTIVE, BLOCKED, BANNED, COMPROMISED, ARCHIVED, UNKNOWN
}

public class Account {
    private String id;
    private String password;
    private AccountStatus status;

    public void resetPassword() {}
}

public class Member extends Account {
    private Profile profile;

    public void sendMessage(Message m) {}
    public void createPost(Post p) {}
}

public class SearchIndex {
    // maps and methods
    public Member searchMember(String name) { return null; }
}

Python (type-hinted, Google style skeletons)

from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
from typing import List, Optional
from datetime import datetime


class AccountStatus(Enum):
    ACTIVE = "ACTIVE"
    BLOCKED = "BLOCKED"


@dataclass
class Profile:
    summary: str
    experiences: List["Experience"]
    skills: List[str]


class Member:
    def __init__(self, id: str) -> None:
        self._id = id
        self._profile: Optional[Profile] = None

    def send_message(self, recipient_id: str, body: str) -> None:
        raise NotImplementedError

    def create_post(self, text: str) -> None:
        raise NotImplementedError


class SearchIndex:
    def __init__(self) -> None:
        self._member_names: dict = {}

    def add_member(self, member: Member) -> None:
        raise NotImplementedError

    def search_member(self, name: str) -> Optional[Member]:
        raise NotImplementedError

Appendix: Original reference Python code

The original detailed Python examples from the source are preserved below for reference.

from enum import Enum


class ConnectionInvitationStatus(Enum):
    PENDING, ACCEPTED, CONFIRMED, REJECTED, CANCELED = 1, 2, 3, 4, 5


class AccountStatus(Enum):
    ACTIVE, BLOCKED, BANNED, COMPROMISED, ARCHIVED, UNKNOWN = 1, 2, 3, 4, 5, 6


class Address:
    def __init__(self, street, city, state, zip_code, country):
        self.__street_address = street
        self.__city = city
        self.__state = state
        self.__zip_code = zip_code
        self.__country = country


from abc import ABC
from datetime import datetime
from .constants import AccountStatus
from .profile import Profile


class Account:
    def __init__(self, id, password, status=AccountStatus.Active):
        self.__id = id
        self.__password = password
        self.__status = status

    def reset_password(self):
        None


class Person(ABC):
    def __init__(self, name, address, email, phone, account):
        self.__name = name
        self.__address = address
        self.__email = email
        self.__phone = phone
        self.__account = account


class Member(Person):
    def __init__(self):
        self.__date_of_membership = datetime.date.today()
        self.__headline = ""
        self.__photo = []
        self.__member_suggestions = []
        self.__member_follows = []
        self.__member_connections = []
        self.__company_follows = []
        self.__group_follows = []
        self.__profile = Profile()

    def send_message(self, message):
        None

    def create_post(self, post):
        None

    def send_connection_invitation(self, connection_invitation):
        None


class Admin(Person):
    def block_user(self, customer):
        None

    def unblock_user(self, customer):
        None


class Profile:
    def __init__(self, summary, experiences, educations, skills, accomplishments, recommendations):
        self.__summary = summary
        self.__experiences = experiences
        self.__educations = educations
        self.__skills = skills
        self.__accomplishments = accomplishments
        self.__recommendations = recommendations
        self.__stats = []

    def add_experience(self, experience):
        None

    def add_education(self, education):
        None

    def add_skill(self, skill):
        None

    def add_accomplishment(self, accomplishment):
        None

    def add_recommendation(self, recommendation):
        None


class Experience:
    def __init__(self, title, company, location, date_from, date_to, description):
        self.__title = title
        self.__company = company
        self.__location = location
        self.__from = date_from
        self.__to = date_to
        self.__description = description


from datetime import datetime


class Company:
    def __init__(self, name, description, type, company_size):
        self.__name = name
        self.__description = description
        self.__type = type
        self.__company_size = company_size

        self.__active_job_postings = []


class JobPosting:
    def __init__(self, description, employment_type, location, is_fulfilled):
        self.__date_of_posting = datetime.date.today()
        self.__description = description
        self.__employment_type = employment_type
        self.__location = location
        self.__is_fulfilled = is_fulfilled


class Group:
    def __init__(self, name, description):
        self.__name = name
        self.__description = description
        self.__total_members = 0
        self.__members = []

    def add_member(self, member):
        None

    def update_description(self, description):
        None


class Post:
    def __init__(self, text, owner):
        self.__text = text
        self.__total_likes = 0
        self.__total_shares = 0
        self.__owner = owner


class Message:
    def __init__(self, sent_to, message_body, media):
        self.__sent_to = sent_to
        self.__message_body = message_body
        self.__media = media


class Search:
    def search_member(self, name):
        None

    def search_company(self, name):
        None

    def search_job(self, title):
        None


class SearchIndex(Search):
    def __init__(self):
        self.__member_names = {}
        self.__company_names = {}
        self.__job_titles = {}

    def add_member(self, member):
        if member.get_name() in self.__member_names:
            self.__member_names.get(member.get_name()).add(member)
        else:
            self.__member_names[member.get_name()] = member

    def add_company(self, company):
        None

    def add_job_posting(self, job_posting):
        None

    def search_member(self, name):
        return self.__member_names.get(name)

    def search_company(self, name):
        return self.__company_names.get(name)

    def search_job(self, title):
        return self.__job_titles.get(title)

Comments