Skip to content

ippontech/mobile-framework-decision-tree

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 

Repository files navigation

How to decide which mobile framework to use

Decision flowchart

---
config:
  theme: neutral
  look: classic
---
flowchart TD
    TargetOS["I target only one operating system"] -->|yes| Native["Native"]
    TargetOS -->|no| LimitedBudget["I have a very limited budget"]
    
    LimitedBudget -->|yes| CrossPlatformDependencies["Every dependency I will use has a cross platform implementation"]
    LimitedBudget -->|no| PerformanceTuning["I want to fine-tune my application performance"]
    
    PerformanceTuning -->|yes| CodebaseSharing["I am willing to learn an additional framework and complexify my codebase to share my domain and data layer"]
    PerformanceTuning -->|no| NativeAPIUsage["My application will use many native APIs"]
    
    CodebaseSharing -->|yes| DeveloperSkills["Developers are willing to work with Kotlin and Android Studio"]
    CodebaseSharing -->|no| Native
    
    DeveloperSkills -->|yes| UIFrameworkSharing["I am ready to use an additional beta framework to share at least part of my user interface between the targeted
operating systems"]
    DeveloperSkills -->|no| Native
    
    UIFrameworkSharing -->|yes| ComposeMultiplatform["Compose Multiplatform"]
    UIFrameworkSharing -->|no| KotlinMultiplatform["Kotlin Multiplatform"]
    
    NativeAPIUsage -->|yes| CodebaseSharing
    NativeAPIUsage -->|no| LibraryReliance["I am opposed to rely on community-maintained libraries"]
    
    LibraryReliance -->|yes| CodebaseSharing
    LibraryReliance -->|no| OSAPIImplementation["I want to implement new operating system APIs as quickly as possible"]
    
    OSAPIImplementation -->|yes| CodebaseSharing
    OSAPIImplementation -->|no| AppResponsiveness["Application responsiveness is a competitive advantage"]
    
    AppResponsiveness -->|yes| CodebaseSharing
    AppResponsiveness -->|no| ListComplexity["The application displays many nested non standard elements in lists"]
    
    ListComplexity -->|yes| CodebaseSharing
    ListComplexity -->|no| UserExperienceOptimization["I want an operating system optimized user experience"]
    
    UserExperienceOptimization -->|yes| CodebaseSharing
    UserExperienceOptimization -->|no| TerminalFleetManagement["I manage my terminal fleet"]
    
    TerminalFleetManagement -->|yes| TerminalSDKDependency["I depend on native software development kit provided by my terminals manufacturers"]
    TerminalFleetManagement -->|no| TechnicalStackMaintenance["I want to ensure my technical stack will be maintained for the longest possible time"]
    
    TerminalSDKDependency -->|yes| CodebaseSharing
    TerminalSDKDependency -->|no| TechnicalStackMaintenance
    
    TechnicalStackMaintenance -->|yes| CodebaseSharing
    TechnicalStackMaintenance -->|no| CrossPlatformDependencies
    
    CrossPlatformDependencies -->|yes| DesignCriticality["I want a dedicated UI engine that garantees a UI consistency across the targeted OS"]
    CrossPlatformDependencies -->|no| NativeLibrarySkills["I have skills to develop my own native libraries"]

    NativeLibrarySkills -->|yes| DesignCriticality
    NativeLibrarySkills -->|no| LibraryCriticality["The aforementioned libraries are critical for my application"]
    
    LibraryCriticality -->|yes| CodebaseSharing
    LibraryCriticality -->|no| DesignCriticality
    
    DesignCriticality -->|yes| Flutter["Flutter"]
    DesignCriticality -->|no| LanguagePreference["I absolutely want to work with a statically typed language that enforces type soundness"]
    
    LanguagePreference -->|yes| Flutter
    LanguagePreference -->|no| EcosystemCapitalization["I absolutely want to capitalize on the Javascript and React ecosystem already present in my company"]
    
    EcosystemCapitalization -->|yes| ReactNative["React Native"]
    EcosystemCapitalization -->|no| DependencyUpgradeAvoidance["I want to avoid investing time in upgrading dependency clusters"]
    
    DependencyUpgradeAvoidance -->|yes| Flutter
    DependencyUpgradeAvoidance -->|no| ApplicationBootstrapping["I absolutely want to use a ready to use tool to bootstrap my application"]
    
    ApplicationBootstrapping -->|yes| ReactNative
    ApplicationBootstrapping -->|no| LearningEase["I want the cross platform framework that is easiest to become familiar with"]
    
    LearningEase -->|yes| Flutter
    LearningEase -->|no| WebEcosystemPreference["I like the web ecosystem"]
    
    WebEcosystemPreference -->|yes| ReactNative
    WebEcosystemPreference -->|no| Flutter

    TargetOS@{ shape: circle}
    Native@{ shape: terminal}
    Flutter@{ shape: terminal}
    ReactNative@{ shape: terminal}
    KotlinMultiplatform@{ shape: terminal}
    ComposeMultiplatform@{ shape: terminal}

    TargetOS:::StartStep
    Native:::FinalStep
    Flutter:::FinalStep
    ReactNative:::FinalStep
    KotlinMultiplatform:::FinalStep
    ComposeMultiplatform:::FinalStep

    classDef StartStep stroke-width:2px, stroke-dasharray:none, stroke:#00C853, fill:#C8E6C9, color:#000000
    classDef FinalStep stroke-width:4px, stroke-dasharray:none, stroke:#FBB35A, fill:#FFEFDB, color:#8F632D

    linkStyle 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48 stroke:#00C853
    linkStyle 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49 stroke:#D50000
Loading

Explanation

According to us, there are many keypoints that make crossplatform development risky. We like native apps, and most of all we like that our clients can be autonomous when they develop. We typically don't develop basic mobile apps without much complexity. We instead target mobile applications that may scale.

These apps require a well defined architecture and organization. To us, we have to avoid many traps that are typically not shown when we begin mobile development :-)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published