Taro Logo
1

Is Investing in a High-Cost Android Course Worth It for Career Growth?

Profile picture
Mid-Level Software Engineer [61] at Microsoft5 months ago

I’ve been working as an Android developer for four years and have contributed to two major Microsoft apps with 10M and 1B+ downloads. I also published a small app on the Play Store in just a week and have invested in improving my skills by reading Android-related books and taking courses. With this background, I felt confident about my expertise and began applying for Android roles.

However, I faced multiple rejections during interviews. The interviewers focused heavily on the internal workings of Android APIs—details beyond my practical usage, like understanding the mechanics behind coroutines rather than just knowing how to use them.

Recently, I came across a course by a highly experienced Android instructor (10+ years) who has transitioned to full-time teaching. His demo session stood out because of its focus on internal details, experiments, and case studies. It resonated with me, and I believe it could help me not only crack interviews but also become part of the top 1% of Android developers globally.

The challenge is the cost: ₹40,000 upfront (25% of my monthly salary) and ₹2 lakhs (10% of my annual salary) after securing a new job. It’s a significant investment, and I’m wondering:

  • Is it worth taking this course given my situation and goals?
  • Are there more cost-effective alternatives to achieve the same level of expertise and confidence for interviews?
61
5

Discussion

(5 comments)
  • 2
    Profile picture
    I just work here @ Robinhood
    5 months ago
    • No.
    • Focus on building 1 good app and learning the concepts behind it along the way.

    As a fairly senior Android engineer, I don't know the internals of many of the newer frameworks. And I honestly don't need to: the skills needed to grow to senior and beyond is heavily skewed towards non-technical skills. If I need to learn it in order to accomplish a critical task or goal for the team/company, I will learn it. Else, the knowledge doesn't give me that much value.

  • 2
    Profile picture
    Tech Lead/Manager at Meta, Pinterest, Kosei
    5 months ago

    The course could be worthwhile if:

    • There are some selective criteria (so the fact that you got in is a positive sign) OR
    • You meet very smart people who are also doing the course

    You are smart to be a bit skeptical since most programs won't offer the above.

    You already have some major accomplishments as an Android engineer. Have you tried changing your approach to applying for jobs before the major time + financial commitment of this course?

  • 1
    Profile picture
    Tech Lead @ Robinhood, Meta, Course Hero
    5 months ago

    From first glance, the course doesn't seem worth it. I think it's much better to organize all the ways you've been failing Android interviews, look for patterns, and then honestly just use ChatGPT (and Google) to fill in those knowledge gaps. For your coroutines example, ChatGPT's explanation is decent if you just ask it "What are the mechanics of coroutines in Android?".

    ChatGPT Coroutines Explanation

    Coroutines in Android (and Kotlin in general) provide a lightweight way to manage background threads and perform asynchronous tasks without blocking the main thread. They're built on the idea of suspending functions, which can pause execution without blocking a thread and resume later.

    Here's a breakdown of the core mechanics of coroutines in Android:


    1. Coroutine Basics

    • A coroutine is a function that can be paused (suspended) and resumed later.

    • Defined using suspend keyword or launched with builders like launch, async, or runBlocking.

    suspend fun fetchData() {
        // Suspends without blocking the thread
        delay(1000)
        println("Data fetched")
    }
    

    2. Coroutine Builders

    • launch: Fire-and-forget, returns a Job, used when result isn’t needed.

    • async: Returns a Deferred<T>, used when a result is expected (like a Future).

    • runBlocking: Blocks the current thread until coroutine finishes; used for testing or main functions.

    GlobalScope.launch {
        val data = fetchData()
    }
    

    3. Dispatchers

    Dispatchers define where (i.e., on which thread) the coroutine runs:

    • Dispatchers.Main: Main thread (UI operations)

    • Dispatchers.IO: For I/O operations (network, database)

    • Dispatchers.Default: For CPU-intensive work

    • Dispatchers.Unconfined: Starts in the current thread, but can resume elsewhere

    CoroutineScope(Dispatchers.IO).launch {
        val result = fetchFromNetwork()
        withContext(Dispatchers.Main) {
            updateUI(result)
        }
    }
    

    4. Scopes

    A CoroutineScope manages the lifecycle of coroutines:

    • Android provides lifecycleScope and viewModelScope to tie coroutine lifetimes to components.
    // In a ViewModel
    viewModelScope.launch {
        val data = repository.getData()
        _uiState.value = data
    }
    

    5. Suspending Functions

    Functions marked with suspend can be paused and resumed:

    • Cannot be called from regular functions.

    • Can call other suspending functions.

    • Do not block threads.


    6. Structured Concurrency

    Coroutines launched within a scope are automatically cancelled when the scope is cancelled (e.g., when an Activity is destroyed). This prevents memory leaks and orphaned background work.


    7. Cancellation

    Coroutines are cancellable:

    • Use isActive or ensureActive() to check/cancel cooperatively.

    • Use withTimeout() or withTimeoutOrNull() for automatic timeouts.


    8. Exception Handling

    Use try-catch blocks or CoroutineExceptionHandler:

    • launch propagates exceptions to its parent.

    • async requires await() to observe exceptions.

    val handler = CoroutineExceptionHandler { _, exception ->
        Log.e("CoroutineError", exception.message ?: "Unknown error")
    }
    
    CoroutineScope(Dispatchers.IO + handler).launch {
        throw Exception("Oops!")
    }
    

    Summary Table:

    ConceptDescription
    suspendMarks a function as pausable/resumable
    launchStarts a coroutine that returns a Job
    asyncStarts a coroutine that returns a Deferred
    DispatcherDetermines thread execution context
    CoroutineScopeManages coroutine lifecycle
    viewModelScope / lifecycleScopeAndroid-specific scopes
    withContextSwitches context (like threads) within a coroutine

    My Final Words

    At the end of the day, interviews are inherently random (and dumb), so don't worry too much about the straggler interview asking you dumb trivia nobody else did. It's really hard to control for those.

    • 0
      Profile picture
      Mid-Level Software Engineer [61] [OP]
      Microsoft
      2 days ago

      Thanks — I got your point. Unfortunately, the link isn’t accessible; could you share an updated one?

    • 0
      Profile picture
      Tech Lead @ Robinhood, Meta, Course Hero
      a day ago

      I just inlined it into my original comment. I assume that's what I got before haha.