Categories
aside

I love Billie Eilish’s music, and I don’t know why.

Billie Eilish Spotify

It’s the originality, the melodies, the aura of a young pop star — no, it’s got to be the fact the loves The Office.

I learned about Billy Eilish early last year. She was already kind of big, but she did this YouTube video with Rainn Wilson, aka Dwight.

Her new album didn’t even release yet, so I just looked up her other hits and albums. Instantly, I was digging her music. I don’t know why but I kept listening— because all her songs were catchy. and just lyrically witty and mature for a 16-17 year old.

https://open.spotify.com/album/7fRrTyKvE4Skh93v97gtcU?si=ycIeNBtlS0GE66N_ITdEeg

Embarrassingly, I find out her fanbase is in the same 15-18 yo age group (surprise). I would ask all my friends if they knew who Billie Eilish was, and responses were either ‘never heard of her’ or lukewarm at best.

I mean, at this point, I don’t think anyone can possibly think it’s uncool to like Billie Eilish, Her album ‘when we sleep, we do we go?’ exploded in 2019. It’s just madness how fast she ascended the mainstream music charts. She deserves it. I would not be surprised if she won album of the year in the coming Grammys.

Anyways, my girlfriend Nicole knew how much I loved her, so she got me tickets to see her this coming March. YEEEEE boi.

Categories
work

Learning how to make sales calls – yay.

Sales is pretty fun once when your heart stops beating so hard.

Me after my first cold call.

I started a sales course for tech founders last month, and one of my early assignments is to find people who are in fitness that are willing to talk to me. Ask them about their work, their jobs and things that really bother them— seemed simple enough.

It’s really not so bad, at least not at the moment. Most of the people I’ve contacted are friends or loose acquaintances, so it’s like calling an old friend and explaining why I forgot to wish them a happy birthday for the last 3 years (kidding).

This week, I’ve gotten with calls with about 10 people, so I’m off to a great start. Now if I can get back on the social media grind and start posting more content on SuperFit and @imleokwan. So many things to do, but just one of me.

Another thing I learned about doing sales and scheduling calls— way more people than I imagined are willing to give their insight and perspective as help. Phrasing a chat in that context makes everything seem much more natural, and we all almost forget the sales intent of my call.

Thanks friends and others for speaking with me. I appreciate you and every bit of guidance helps.

Categories
personal work

28 years old. What I learned in 2019

2019 might have been the most difficult year in my life. It shouldn’t have been, but it couldn’t have felt any worse. I’m aware that I’m raised in a privileged country, and that I’m just privileged, I have a set of AirPods Pro, they work well.

Starting a business is hard. I never learned what it truly meant, despite working for many companies before.

The issue is that I’m a pretty stubborn and contrarian person. These traits sound negative, but they’ve steered me pretty far in life. I usually don’t settle with how good something is because I’m always considering how it can be better; for example, my jumpshot, company dogma, coding skills— you know, this type of stuff. It’s a little hypercompetitive, and it definitely rubs some people the wrong way.

Being Stubborn

This approach screwed me up big time with my bootstrapped business. I didn’t listen to others. Better yet, I didn’t even ask. I assumed I knew it all and that people who did not understand my idea were not my target population. This thought might have been true for some occasions, but I really wish I tried asking for more feedback before writing code like a maniac.

Being a contrarian and doing what’s ‘right’

I always told myself, if someone does something stupid — you need to tell them. It is your duty to let them know, ‘this is wrong’. This year I learned that this mentality is driving a lot of my temper issues. I get angry a lot about stupid things that other people are doing, so much to the point that it all came boiling down one night in December where I came down hard and was just in a bad place, details not important.

Even at that point, I still didn’t get it. I just told myself to chill out more.

It was when I started a sales course last week in hopes to reach profitability in 2020, that I realized — being upset at people’s tendencies and behaviors are not traits to be mad about, they are opportunities to profit from.

This sounds disgustingly salesy, but through the context of growing my business, I learned that people are often who they are and don’t have a weird inkling like me to never settle and continually improve at everything. They often just want to pay to fix a problem if it’s painful enough. I wish I had a more profound experience that taught me to “leave people be”, but it’s only typical I learned a personal lesson while working on the job. I need to get out more.

Create something that solves a real pain, not just a problem.

Continuing from my last point, this learning was the most important for me personally despite the business context. There are a lot of things people want and find problems with, but just aren’t willing to pay to fix. When I built my fitness app, I thought a lot of people would want to use it— they didn’t. There are many others reasons why it didn’t work— didn’t market well, niche audience, etc.

One thing was very clear though, no one came banging on the door for it. That’s the product market fit I did not have.

And then I thought about myself.

I’m pretty weird.

I don’t use QWERTY, rather in Colemak. I track a lot of things because I lack long term memory; I definitely have OCD and I even think I possess some level of ADD, (even before the social media age).

I’m also not a fast learner, so I’m the type of person to spend the extra time to understand and adopt something, even if it’s very unintuitive. As you might imagine, this mindset is terrible for a solo-run business because I think athletes might actually care enough to navigate my app and even come back often.

Aside finished, I learned the hard way that your focus and intent as a business is at the mercy of your selected customers, not you — no matter how fitting you believe you are to them. As a result the untethered motivation and excitement is no longer there with building my business, but I don’t intend on quitting. I’m not sure if it’s ‘right’ for founders to feel this way about their business. Shouldn’t one be waking up with a bright-orange sunshine in frame of her, hitting the morning coffee and zealous to growing something awesome?

I don’t know the answer,

but I’ll finish with what I think are positives to my hard learnings. My customer voice and my actual customer’s voice are now separate. I don’t assume what’s not fulfilling my interests is what’s best for my business. Because I’m not as emotionally invested, I wholeheartedly feel more steady, mentally, since 2020 began. (random: I also started taking multi-vitamins so that helps.)

I also give less shits about putting in the daily hours working because though I will never downplay the need for hard work, I’ll always prefer losing sleep working for my personal interests over that of others— contextualize this positively, please. I hope this mindset continues to help me work with a more balance attitude and schedule. More time to do random things, and more time to cook with my girlfriend.

Categories
personal

New Hobby: Running

I started running not too long ago— 8 months ago to be exact, and I was in your shoes. I never liked running and I never played sports for endurance. In swimming, I always swam the 100m freestyle; in basketball, all I always sprinted down the court. Running for distance was never my element.

Earlier this year, my friend texts me urging me to sign up for the Brooklyn Half Marathon 2019. I did, and my running journey began! I was excited, but mainly really intimidated by the idea of running 13.1 miles. I had never even run a 5k, not to mention a half. I trained and ran 3x a week for 10 weeks until a week before race day.

Finishing the Brooklyn Half 2019
Finishing the Brooklyn Half 2019

I was crushing the first 7 miles. By mile 9-10 though… game over. I started feeling exhausted, and the heat shining down the open Ocean Parkway boulevard did not help. I was gassed out and I essentially had to hobble run to the finish. 13.1 miles might have been too much for my 10 week training window.

11: 16 pace. Finished though.

What I am proud of

I was truly happy to check “run half marathon” off my bucket list, but I still wish I performed better in the end. On the flip side— sometimes I get so caught up on my last two miles, I forget that my 10 weeks of training made my first 7 miles feel like a breeze! There was a point earlier this year when I was intimidated by running 3 miles! I made significant progress on my standards, and that’s all that matter.

Where I’m at now

Two days after the race and somewhat recovered, I confirmed to myself, “running is actually fun. I’m signing up for more races.”

And I did. I signed up for the Queens 10K, 5 Mile Pride Run, the Bronx 10 mile, and Staten Island Half Marathon. I continued to consistently run and began to enjoy the workouts because I no longer feel exhausted 3 miles in my workout!

My next race is the Staten Island Half Marathon in two weeks. I’m hoping I average under a 9:30 pace, 🤞, I’ll keep you posted 🏃🏻‍♂️.

Categories
work

Solopreneurs beware: Stripe Atlas

Last year, my company SuperFit was selected to Y Combinators’ online startup school program. If you don’t know, Y Combinator is a popular tech incubator in Mountain View, California that, in exchange for 7% of your company for a 130k seed investment~, provides support, mentorship and the most popular platform for showcasing your startup’s purpose to investors and the world.

What I really like about Y Combinator if we look past its venture motives, is their efforts to democratize the science of entrepreneurship, mainly with respect to technology. For one thing, most of their tips and nuggets of wisdom are posted on their youtube channel.

The largest tangible benefit I got out of Startup School’s was their  long list of freebies in partnership with many other companies and services like AWS, Digital Ocean, and Stripe Atlas. (Digital Ocean offered 30k in credits to all their services!). Let’s talk about Stripe Atlas.

Okay, my gripe isn’t necessarily with Stripe as it really should be with one piece of advice from one of Y Combinator’s video lectures on business formation.

Should you elect for an LLC or C Corp?

Based on Y Combinator’s suggestion, C Corp was a no brained. My business SuperFit is already incorporated in NY as an LLC— I thought to myself, “gahh, I should have done a C Corp in the first place!”

I did not plan on doing anything about my decision until I found out Stripe launched a program called Stripe Atlas, which aimed at making the filing for C Corps super easy, and if you were accepted into Y Combinator’s startup school program, you were eligible for the Atlas program at half the price the package would normally cost!

So I did it— Stripe is an amazing company, I trusted the advice from Y Combinator in partnership with Stripe Atlas without hesitation.

Annnnnd then the fees came.

I signed up for a C Corp late in the year, October, and now I’ve got to pay about 50+ dollars on Delaware franchise taxes.

Preface: I am not a lawyer. Y Combinator will often preach that start up companies undoubtedly start C-Corp formations. That may be sound advice for companies lined up for YC’s winter and summer pipelines, but for its Startup School program, which is their equivalent of an online MOOC with office hours, that advice does not hold up with as much certainly, especially for my case. If I had to make an educated guess, I would imagine that got to be at least a quarter of companies in Startup School (~1500) that plan on bootstrapping their business long term as indie hackers.

With that said, there is still a resounding case for forming a C-Corp over an LLC.

https://www.indiehackers.com/forum/i-strongly-recommend-starting-your-business-entity-as-a-c-corp-instead-of-an-llc-38d98594f8

For me personally, I’ve decided with an accountant that I should hold off on dissolution of my Stripe Atlas C Corp until the end of 2019, in case I decide that it’s worth going that direction over my current LLC.

To give some credit to LLCs, Facebook started as an LLC and became a C Corp years after— Basecamp and Wildbit are very successful companies building software on an LLC formation.

Bootstrapping for now

If I learned anything on this path to the right business formation, it’s that my interests and long term motivation lean closer to the www.indiehackers.com community than YC. YC is great— their podcast series is terrific and they are without question a thought leader in startup culture and tech, but I’ve found that people and companies list on Indie Hackers are more relatable to my daily challenges.

Categories
Uncategorized

Mobile first developers— we must expand our skillset.

I’m a coding boot camp grad.

I should be proud to be one— but I’m not. I’m aware that becoming a software developer has opened so many opportunities, experiences and friendships for me over the last 4 years— but still, I’m not proud to be a boot camp grad.

I think it has to do with my perception the typical boot camp grads only know what’s needed to get an entry level software developer job. As someone who’s been around boot camp grads as peers and mentors, it sure feels that way many times.

I’m being mean. Back when I was learning to code in 2015, I was not the smart whiz who completed every code module first. I was the complete opposite- the slow poke. I was the student who needed a lot of help and just took a bit longer to understand the difference between an array and a dictionary. Did I mention my first real structured experience in learning to program was iOS programming? I feel that it’s crucial that we learn to code beyond our isolated environments and mobile frameworks. For me, that means going beyond Swift, Objective-C and Xcode.

As a mobile-first developer, I’m one of few boot camp grads who did not enter a “traditional” boot camp path. And yes, I think we are at the point where natural selection has chosen its winning boot camp structure and curriculum through nearly a decade of trial and error. Nowadays, most boot camps’ flagship course is a 3 month full-time intensive full stack developer program. When I was applying for coding camps, a full-stack web curriculum was actually what I wanted to pursue, but Full-Stack Academy in NY rejected me, and as an alternative I luckily got accepted into an iOS bootcamp at the Flatiron School.

I don’t know many for-profit coding camps with a dedicated mobile development curriculum anymore. Last year, The Flatiron School actually discontinued their mobile program, probably because its careers team simply could not source the growing list of graduating mobile developers into substantial full time work in the New York City area. (Thank you Plated for believing in me)

I do not believe native mobile programming is dying anytime soon. On the android side, new operating systems and technologies like project Fuschia and Android Q are in the works; on iOS land, iOS may soon extend to MacOS development natively, allowing iOS apps to possibly run on Macs.

We’re going to be okay, and if you’re really good with build custom UI on either platforms, you’ll be even more okay.

My plead to mobile-first developers is only aimed at the “mobile-only” mindset of developers. Make time to go beyond our dedicated IDEs and push yourself to learn something new. The most complementary skillset for mobile devs in my opinion to getting your feet web in web server + API development. After all, if there is no data provided to our apps, we don’t have much of an app.

Or, you can also stay on the frontend and learn how to leverage popular web frameworks like React and Angular. This will expose you to writing good old HTML, CSS and Javascript with some magic annotations sprinkled in between.

Or, if you’re interested in scaling applications and improving server resiliency, play around with populate infrastructure services like AWS or Digital Ocean and try launching a simple web application.

The point I’m trying to make is: create really good reasons for mobile bootcamp grads to be respected. Most companies that have mobile apps are not solely based on mobile. Besides the hand few that come to mind like Tinder, Day One, Lyft, Uber, most engineering teams allocate most of its horsepower on building and maintaing backend systems and integrity of those systems. In a smaller to midsized engineering team, I am almost certain you can be a greater helping hand if you have some full stack experience or just the interest in it.

When building the MVP of SuperFit, I made a hard stance that I was not going to use Firebase, but instead use the junior experience I had with node.js and stand up my own backend on Heroku. This was just one year after starting my bootcamp at Flatiron. Even with Express & Heroku, there was still a steep learning curve to writing and deploying a web server on my own.

If I only thought about taking my side-project to the moon back in 2016, I might have just stuck with Firebase. It turns out the best business decision vs. the best career advancing decision almost always clash.

But selfishly, my stance back then was about challenging myself to learn more on improving my resume and overall programming experience. Many other bootcamp grads can attest to this—

Even when you land your first job, you still feel absolutely unsure if you can even last in the industry beyond a year,  at least I did.

Do it. Take a course, expand your skillset and try something new. I promise, it’ll make you a better mobile developer by tying concepts, big or small that you never expect to benefit you.

Categories
Uncategorized

Running is way more fun in the city.

I started running a bit more regularly a year ago when a coworkers from my past job started a running club for all running enthusiasts in the office. I was definitely interested.

A year later, that same person who who started the running club convinced me recently to do the Brooklyn Half marathon this May.

I’ve got some training to do; I’ve never ran a 5k before, let alone 12 miles ever in an entire day. I’ve been running occasionally in Flushing, Queens— where I’m currently living, but it’s hard to run in the neighborhood with all the stop signs, crazy drivers— as well as some crazy people.

Fortunately I found that a long commute out to Central Park is well worth the effort because the park is surrounded with runners and people just enjoying the far-reaching spaces of foliage, smack center in a city where dedicated space for anything  else is less than achievable.

Best part about the run is you can stop by the MET afterwards if you’re on the Upper East Side.

Categories
Uncategorized

Childhood Friends

This is my team. Before the concept of a Followers Friend Request, and now — a  “Close Friend” on Instagram, these are my first true friends.

From left to right, that’s Thomas, Karen, Richie, and finally me.

Thomas and Richie were those friends— you know, the ones who were down the block who I’d swing by to see if they were free to hang out. We went to the same elementary school, PS20, in … shoot, I don’t even remember— 4th grade?

Thomas and Richie were those friends— the ones who crushed on the same girl (not Karen, more on her later) you liked because she was cool and hung out with us after school.

We did everything together. We would go to the corner deli after school, walk home together as a group, watch The Simpsons relentlessly, and team up for battle on snow days.

Books and Quiet Time

I don’t know why and how this happened, but another important place Thomas, Richie and I would go to together was the Flushing Library. Yes, I say libary with emphasis because, in retrospect, Flushing is not the best town to raise your kid.

Before the superstore gentrification of Flushing, my home streets were pretty dangerous to walk around at night, ridden with gang violence, theft, and just a lot of poverty I never stopped to notice.

But this grand libary opened in 1998, right before I met my friends. By the time we were in 5th and 6th grade, this libary offered after school tutoring and help for kids free of charge. This is where we met Karen.

Karen

Karen, the girl in the photo above, was a student teacher for that afterschool program in Flushing Library. Karen’s seven years older than we are— so back in 2001 she was padding her volunteer credits for her high school honors diploma at Townsend Harris High School.

Karen was the best, but she was mean, partly because I was the biggest brat, full of energy (from that candy), and had a terrible mouth (think the Asian Cartman).

I don’t think any of us realized this back then, but Karen acted as an incredibly powerful role model for us at an important stage of our childhood. It’s honestly very easy to screw up and get caught up with the ‘wrong’ crowd after school. For whatever good reason I can’t figure to remember, Thomas, Richie and I would attend after school tutoring frequently to do work, but mainly just hang out in a safe haven within Flushing Library.’

Glue

It’s been  around 14 years since I first met the crew, and with all friends, not just your first ones, it takes massive effort to keep the friendship and memories going. I’ll admit I am the worst of the crew with keeping tabs on our group and actively going out of my way to make plans. Karen is the glue to our group, she’s always the person wrangling us together for dinner and meetups, and I’m thankful for that. I go through highs and lows with grasping the importance of upholding friendships; not later, now. I’m going to try and do a better job moving forward, but even to this day, Karen is still serving as an amazing role model for me.


Parsing old memories is a strange thing— I can barely remember the unforgettable moments with my friends in elementary school. I guess what I’m trying to say is that I remember what I felt more than what I actually did.

Moments from 2011 feel so long ago, but not 8 years long. Jeez.

And pictures from today look like they should be swapped with ones from past because I appear even younger now. As distorted as my timeline feels to me, I’ll never forget my childhood friends.

Categories
Uncategorized

New habits I haven’t dropped in 2018

I just came back from a casual 4.5 mile run in the rain and I feel terrific.

Before blogging on this website, I wrote all my personal blog content on the Day One app. It’s my safe haven for notes, thoughts and feelings I live that I prefer to keep private.

One promise I made to start 2018 off was to start the new year being more physically active in ways I haven’t tried before. I’ve been playing basketball my whole life, and most of it was ultra-competitive practicing and chaos.

So I started 2018 by attending a boxing class. The cover image above is an image of Overthrow, a boxing studio down in down at Soho, NY.

I’ll admit, a big reason that made achieving this resolution way easier was the emergerce of fitness class marketplaces like ClassPass. I think I would have been way more relunctant to indulge in a cycling class had it required a dedicated studio membership.

So I cycled more often. I also ran more too, but more on that later. I dabbled a little with rock climbing. (To be fair, I lived directly under a Brooklyn Boulder gym in Long Island City so it’d be sad if I didn’t).

If you’ve tried ClassPass before in the New York City area, you’ll begin to realize strength training, cycling/treadmill and yoga classes account for most options on the platform. I wish there were more options for team sport activities like volleyball or soccer, but I think that’s a genal issue with NYC constrained space than it is ClassPass.

I was actually going to jump right into running and talk about why it’s been growing as a casual passion, but thinking more about cycling and bouldering, I actually have more love so spread.

Rock Climbing/ Bouldering

With all these activities, keep in mind I’ve only scratched the surface of each of them, so these feelings are based just on early experience.

In indoor bouldering, there are rocks and groves of many, many colors splattered across many, many walls. The goal of the game is to simply put two hands on a flagged rock, usually at a high point of a wall. The challenge is, your hands and feet can only touch certain rocks, usually based on the flagged rock’s color.

This sport is unlike any physical activity I have ever encountered. Its pace is akin to the structure and flow of chess if you were thrown into the middle of a match.

While I’m sure you need to think fast in competion due of time constaints, my takeaway as a novice (with limited grip strengh) was that a lot of consideration needs to go into the first moves you make. When I didn’t, I ended up stuck, unsure, and energy inefficient since my grip strengh was depleted by the seconds. And fall.

Boundering gave me an appreciation for positional techniques to best leverage my body while hanging onto a very little surface area.

I didn’t even mention the element of fear. I really do want to try the outdoors one day, but as a novice… even jumping onto a soft mat 12-15 feet off the ground can be a bit nerve-wrecking. I don’t know the science, but there’s a direct correlation with the amount of time you stay calm to the stamina of your wrists and grip. If you panic, you just feel Spiderman with his powers taken away all of a sudden.

Photo by Mike Kotsch / Unsplash

Cycling

I have a hard time with cycling/treadmill/fitness classes because I zone out really fast if the music is not rap, trap or hip hop. I never understood how other people in the class holler in excitement after a tough stretch— you were focused the whole time? One time I walked out of a fitness class 15 minutes in, because I couldn’t stop thinking about a code problem at work. (I walked out and across the street back to the office to relieve the distraction.)

Anyways, despite the lack of focus I put into classes like Peloton Studio, cycling at Peloton is my default class for ClassPass. I appreciate the personal intensity you can set your bike to, as well as a well-lit instructor in the middle of the room. I must admit, I think the real reason why Peloton is my workout of choice is the customer service and amenities. Something as simple as a free branded water bottle to go alongside your workout stands out to me.

peloton chelsea

2019

This year, I’m hoping to learn a thing or two about Soccer. Again I wish ClassPass offered more sports based classes in the NYC area, but in the meantime I’ll just have to learn on my own!

Categories
Uncategorized

Making network requests more reactive with RxMoya.

The Rx ecosystem is strong. Before RxSwift, I used a brittle wrapper of an “Observable” type in my codebases, just so I could “subscribe” to values. It was really helpful to start, as I personally saw the benefits of being able to bind value changes to your UI, or any side effect really.

It worked to begin with, but then I realized:

  1. My wrapper had 0 tests
  2. My “Observable” lacked access control features. anything could observe and push values to an observable stream.
  3. RxSwift is way more popular and does what I want… times 1000

So if you’re like me and you’ve added reactive paradigms like RxSwift to your codebase to slowly introduce yourself to Observables, you’re probably still confused. Because the learning curve is STEEP.

RxSwift artwork from RayWenderlich.com

Fortunately, I spend without thinking on educational resources like raywenderlich.com and Egghead.io, where there’s plenty on content about Rx in iOS, Android and JavaScript.

I’ve written briefly about Moya, networking library that sits on top of Alamofire, and how to get started with the library way back. (It’s actually my most viewed blog post, yet the tutorial is so outdated, sorry.)

It’s a great library, and aside from some desolate areas in SuperFit iOS where URLSession is used here and there, Moya does a really great job with extending a codebase’s networking requirements from various endpoints, or “providers” in Moya speak.

One big mistake I’ve been making with having both Moya and RxSwift in my codebase is that I’m manually wrapping Moya requests and operations inside an Observable.

In the code block below, I am making a network request to a remote resource that returns “Sections”; With the sections data, I want to persist the models, as well as append any client-side sections, such as a tool-tip, to my list before ultimately handing it off to a ViewController to render.

self.listSections = fetchCatalogSectionsProperty.asObservable()  .flatMap { (_) -> RxSwift.Observable<[ListDiffable]> in
    return RxSwift.Observable<[ListDiffable]>.create({ observer -> RxSwift.Disposable in
      programCatalogManager.fetchAndCacheCatalogSections(liveOnly: !AppEnvironment.current.authorizationManager.isAdmin, { (result) in
        switch result {
        case .success(let sections):
          var sectionsToShow = [ListDiffable]()
          // add catalog sections
          let orderedCatalogSections = Array(sections).sorted(by: {$0.title < $1.title})
          sectionsToShow.append(contentsOf: orderedCatalogSections)
          observer.onNext(sectionsToShow)
          return
        case .failure(let error):
          throw error
        }
      })
      return Disposables.create()
    })
}

I used to have a sensitive instinct to drying up code or refactoring code smells, but more recently, I accepted that I cannot spend too much time figuring out the better way to do something on lines of code that really don’t matter in the grand scheme of a business.

However, regarding this code block, and the 10 others places in my code where I manually encapsulate network requests in observables, it was finally time to consider a smarter approach and figure out how I could make the networking layer more “reactive”.

And. yeah, the answer is literally in Moya’s repo. They have Rx extensions you can use, aliased as “RxMoya”. Instead of pod Moya in your Podfile, simply change that to pod 'Moya/RxSwift'.

This is what my code block looks like now using observable network requests with RxMoya.

func fetchAndCacheCatalogSections(liveOnly: Bool)-> Single<[CatalogSection]> {
  let endpoint: CatalogSectionService = liveOnly ? .getLiveOnlyCatalogSections : .getAllCatalogSections
  return catalogSectionService.rx.request(endpoint)
    .map { response -> [CatalogSection] in
      do {
        // Core Data Stuff here
        return sections
      } catch let error {
        AppEnvironment.current.logger.print(error.localizedDescription)
        throw CatalogManagerError.errorDecoding(CatalogSectionRemote.self)
      }
  }
}

And what the caller of fetchAndCacheCatalogSections looks like:

self.listSections = fetchCatalogSectionsProperty
  .flatMap({ (_) -> Observable<[CatalogSection]> in
    return programCatalogManager.fetchAndCacheCatalogSections(liveOnly: !AppEnvironment.current.authorizationManager.isAdmin).asObservable()
  })
  .map({ (sections) -> [ListDiffable] in
    var sectionsToShow = [ListDiffable]()
    // add catalog sections
    let orderedCatalogSections = Array(sections).sorted(by: {$0.title < $1.title})
    sectionsToShow.append(contentsOf: orderedCatalogSections)
    return sectionsToShow
  })
  .asDriver(onErrorRecover: { (error) in
    print(error.localizedDescription)
    let request = AppEnvironment.current.coreDataStack.fetch(request: CatalogSection.defaultFetchRequest())
    guard let cachedSections = request.result else {
      return Driver.just([])
    }
    let sortedSections = Array(cachedSections).sorted(by: {$0.title < $1.title})
    return Driver.just(sortedSections)
  })

Instead of fetchAndCacheCatalogSections calling back with the actual response, I now begin with a request Observable from RxMoya,  and I perform response data parsing and transformations in a map against the observable. Finally, CatalogSectionListViewModel, the struct that invokes fetchAndCacheCatalogSections maps the observable once more to attach any additional UI sections beyond the data from the network, then returns a `Driver` (an observable with specific traits), which my view controllers can then consume.

Using RxMoya freed me up from having to ever create an Observable type myself. (Of course, creating the observable needs to happen somewhere; in this case; RxMoya is doing that in its extensions, but I don’t see it, which is all that matters~).

I’m clearly able to fetch my data, map my data, and centralize error handling with observables and some Rx goodies like Driver and Single.

In the end, all my view controller needs to do is subscribe and bind to its viewmodel’s list observable and render a collection view.

catalogSectionListViewModel.outputs.listSections.drive(onNext: { [weak self] sections in
      self?.uiSections = sections
      self?.adapter.performUpdates(animated: true)
      self?.feedRefresh.endRefreshing(updates: nil, completion: nil)
    }).disposed(by: bag)

For all the IGListKit fans out there, you may be thinking… there’s are Rx extensions for IGListKit as well. Until then, progress is better than nothing— I’ll get there when I get there!