Sami Omar

Sami Omar

Mobile Developer | iOS & Android

iOS Kenntnisse Android Kenntnisse UI/UX Grundlagen Firebase Kenntnisse

Über mich

Fresh Graduate mit intensiver Praxisausbildung und Leidenschaft für moderne App-Entwicklung

2300
Stunden Intensivausbildung
8
Portfolio-Projekte
8
Monate iOS & Android
2024
Abschlussjahr

Als frisch ausgebildeter Mobile Developer mit 12-monatiger Intensivausbildung (2300 Stunden) entwickle ich iOS- und Android-Anwendungen mit modernen Architekturen. Meine Ausbildung beim Syntax Institut umfasste 4 Monate iOS und 4 Monate Android Development mit praktischen Projekten. Ich suche meinen Berufseinstieg als Junior Developer und bringe solide Kenntnisse in Swift, Kotlin, MVVM und modernen Frameworks mit.

Kernkompetenzen

Technologien und Frameworks, die ich täglich einsetze

Kernkompetenzen

  • Swift & SwiftUI (4 Monate intensiv)
  • Kotlin & Jetpack Compose (4 Monate intensiv)
  • MVVM Architecture
  • Git & GitHub

Erweiterte Kenntnisse

  • Firebase Integration
  • REST APIs
  • Room Database
  • Core Data

In Einarbeitung

  • Objective-C (für Legacy iOS Apps)
  • Mobile Security
  • CI/CD Pipelines
  • Testing Frameworks

Meine Projekte

Alle entwickelten Anwendungen im Überblick

Zertifizierung

IT-Fachkraft für App-Entwicklung (iOS & Android) – Syntax Institut

Syntax Institut Zertifikat
  • 2300 Unterrichtseinheiten • Abschluss: Juli 2024
  • iOS (Swift) und Android (Kotlin) – je 4 Monate intensiv
  • Projektorientiertes Lernen mit Abschlussprojekten
  • Note/Bewertung: (falls vorhanden)

Code Excellence

Sauberer, wartbarer und performanter Code ist meine Priorität

MVVM Architecture with Repository Pattern
// Beispiel aus Lernprojekt: Clean Architecture Implementation
// Demonstriert Verständnis von SOLID Principles und Dependency Injection
protocol UserRepositoryProtocol {
    func fetchUser(id: String) async throws -> User
    func updateUser(_ user: User) async throws
}

class UserViewModel: ObservableObject {
    @Published private(set) var state: ViewState = .idle
    private let repository: UserRepositoryProtocol
    private var cancellables = Set<AnyCancellable>()
    
    init(repository: UserRepositoryProtocol = UserRepository()) {
        self.repository = repository
        setupBindings()
    }
    
    @MainActor
    func loadUser(id: String) {
        state = .loading
        
        Task {
            do {
                let user = try await repository.fetchUser(id: id)
                state = .loaded(user)
            } catch {
                state = .error(error)
            }
        }
    }
}
Combine Framework - Reactive Streams
// Beispiel aus Lernprojekt: Reactive Programming with Combine
// Debounce, Fehlerbehandlung und Main-Thread-Delivery
class SearchViewModel: ObservableObject {
    @Published var searchText = ""
    @Published private(set) var results: [SearchResult] = []
    
    private let searchService: SearchService
    private var cancellables = Set<AnyCancellable>()
    
    init(searchService: SearchService) {
        self.searchService = searchService
        
        // Debounce search input and filter empty strings
        $searchText
            .debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
            .removeDuplicates()
            .filter { !$0.isEmpty }
            .flatMap { [weak self] query -> AnyPublisher<[SearchResult], Never> in
                guard let self = self else {
                    return Just([]).eraseToAnyPublisher()
                }
                
                return self.searchService
                    .search(query: query)
                    .catch { _ in Just([]) }
                    .eraseToAnyPublisher()
            }
            .receive(on: DispatchQueue.main)
            .assign(to: &$results)
    }
}
Comprehensive Unit Testing
// Beispiel aus Lernprojekt: Test-Driven Development
// Unit-Tests für ViewModel-State und Repository-Interaktionen
import XCTest
@testable import MyApp

class UserViewModelTests: XCTestCase {
    var sut: UserViewModel!
    var mockRepository: MockUserRepository!
    
    override func setUp() {
        super.setUp()
        mockRepository = MockUserRepository()
        sut = UserViewModel(repository: mockRepository)
    }
    
    func testLoadUserSuccess() async {
        // Given
        let expectedUser = User(id: "123", name: "Test User")
        mockRepository.userToReturn = expectedUser
        
        // When
        await sut.loadUser(id: "123")
        
        // Then
        switch sut.state {
        case .loaded(let user):
            XCTAssertEqual(user.id, expectedUser.id)
            XCTAssertEqual(user.name, expectedUser.name)
        default:
            XCTFail("Expected loaded state")
        }
    }
}
Performance Optimization
// Beispiel aus Lernprojekt: Efficient List Rendering with Lazy Loading
// Performance: Prefetching, Lazy-Stacks und bedingtes Laden
struct OptimizedListView: View {
    @StateObject private var viewModel = ListViewModel()
    @State private var visibleRows = Set<Int>()
    
    var body: some View {
        ScrollView {
            LazyVStack(spacing: 0) {
                ForEach(viewModel.items.indices, id: \.self) { index in
                    ItemRow(item: viewModel.items[index])
                        .onAppear {
                            visibleRows.insert(index)
                            // Prefetch next batch when approaching end
                            if index == viewModel.items.count - 5 {
                                Task {
                                    await viewModel.loadMoreItems()
                                }
                            }
                        }
                        .onDisappear {
                            visibleRows.remove(index)
                        }
                        .task {
                            // Load high-res image only when visible
                            if visibleRows.contains(index) {
                                await viewModel.loadHighResImage(for: index)
                            }
                        }
                }
            }
        }
        .scrollIndicators(.hidden)
    }
}

Warum ich als Junior starte

Solide Grundlagen aus 2300 Praxisstunden – bereit, professionell zu wachsen

Nach meiner intensiven 12-monatigen Ausbildung mit 2300 Praxisstunden verfüge ich über solide Grundlagen in der Mobile-Entwicklung. Ich suche bewusst eine Junior-Position, um:

07/2023 - 07/2024

Intensivausbildung Mobile Development

12-monatige Vollzeit-Weiterbildung (2300 Stunden) am Syntax Institut
• 2 Monate UI/UX Design
• 2 Monate Programmierung Grundlagen
• 4 Monate Android Development (Kotlin)
• 4 Monate iOS Development (Swift)
• Abschlussprojekte für beide Plattformen

2024 - Heute

Berufseinstieg & Weiterbildung

• Selbststudium Objective-C für Legacy iOS Apps
• Vertiefung Mobile Security & Verschlüsselung
• Entwicklung eigener Portfolio-Projekte
• Vorbereitung auf Junior Developer Position

Let's Connect

Offen für Berufseinstieg als Junior Mobile Developer