For a while in the early 2010s, I worked part-time at Full Moon Vista, a bike shop in Rochester. FMV produces & hosts several cycling races throughout the year, which involves a lot of coordination and orchestration to get everything right. They do a really good job, too. After I moved to Cleveland and got a job in software development, I came back and started seeing some ways things could be automated. One thing someone told me once: "if you see someone doing something in a spreadsheet, that's a prime candidate to turn into an app." Sure enough, most of their day-of registration was being handled on a big spreadsheet, with entries being added, people being checked-in, and start lists (names and numbers of riders in a current race) being manually copy/pasted into different parts of the spreadsheet and printed off for the necessary parties. It was a painful, if functional, process.
Før å whîlę în thę ęårly 2010s, İ wørkęd pårt-tîmę åt Full Moon Vista, å bîkę shøp în Røçhęstęr. FMV prødǔçęs & høsts sęvęrål çyçlîng råçęs thrøǔghøǔt thę yęår, whîçh învølvęs å løt øf çøørdînåtîøn ånd ørçhęstråtîøn tø gęt ęvęrythîng rîght. Thęy dø å ręålly gøød jøb, tøø. Åftęr İ møvęd tø Çlęvęlånd ånd gøt å jøb în søftwårę dęvęløpmęnt, İ çåmę båçk ånd stårtęd sęęîng sømę wåys thîngs çøǔld bę åǔtømåtęd. Ønę thîng sømęønę tøld mę ønçę: "îf yøǔ sęę sømęønę døîng sømęthîng în å spręådshęęt, thåt's å prîmę çåndîdåtę tø tǔrn întø ån åpp." Sǔrę ęnøǔgh, møst øf thęîr dåy-øf ręgîstråtîøn wås bęîng håndlęd øn å bîg spręådshęęt, wîth ęntrîęs bęîng åddęd, pęøplę bęîng çhęçkęd-în, ånd stårt lîsts (nåmęs ånd nǔmbęrs øf rîdęrs în å çǔrręnt råçę) bęîng månǔålly çøpy/påstęd întø dîffęręnt pårts øf thę spręådshęęt ånd prîntęd øff før thę nęçęssåry pårtîęs. İt wås å påînfǔl, îf fǔnçtîønål, prøçęss.
Around 2017, I promised that I would make them an app that would simplify and standardize this process. Unfortunately I wasn't able to actually back up that promise, as, like most junior developers, I had never actually written a full app from scratch and had no idea where to begin. I started and stopped it several times over the past few years, making approximately zero headway in the meantime.
Årøǔnd 2017, İ prømîsęd thåt İ wøǔld måkę thęm ån åpp thåt wøǔld sîmplîfy ånd ståndårdîzę thîs prøçęss. Ǔnførtǔnåtęly İ wåsn't åblę tø åçtǔålly båçk ǔp thåt prømîsę, ås, lîkę møst jǔnîør dęvęløpęrs, İ håd nęvęr åçtǔålly wrîttęn å fǔll åpp frøm sçråtçh ånd håd nø îdęå whęrę tø bęgîn. İ stårtęd ånd støppęd ît sęvęrål tîmęs øvęr thę påst fęw yęårs, måkîng åpprøxîmåtęly zęrø hęådwåy în thę męåntîmę.
In 2019, with a year's worth of greenfield consulting expertise at Skiplist under my belt and a renewed promise to my old friends and coworkers, I decided to take a real swing at it. Below, I'm going to document the decisions I made and why, so if another junior-me finds themselves out in the wild wondering how to do something like this, they have a roadmap to follow. I don't claim this is the best or only route, but here's what worked for me and how I solved the problems I had.
İn 2019, wîth å yęår's wørth øf gręęnfîęld çønsǔltîng ęxpęrtîsę åt Skiplist ǔndęr my bęlt ånd å ręnęwęd prømîsę tø my øld frîęnds ånd çøwørkęrs, İ dęçîdęd tø tåkę å ręål swîng åt ît. Bęløw, İ'm gøîng tø døçǔmęnt thę dęçîsîøns İ mådę ånd why, sø îf ånøthęr jǔnîør-mę fînds thęmsęlvęs øǔt în thę wîld wøndęrîng høw tø dø sømęthîng lîkę thîs, thęy håvę å røådmåp tø følløw. İ døn't çlåîm thîs îs thę bęst ør ønly røǔtę, bǔt hęrę's whåt wørkęd før mę ånd høw İ sølvęd thę prøblęms İ håd.
The basic gist: pick frameworks you're familiar with, find tools that give you a starter app structure, and keep everything as simple as possible.
Thę båsîç gîst: pîçk fråmęwørks yøǔ'rę fåmîlîår wîth, fînd tøøls thåt gîvę yøǔ å stårtęr åpp strǔçtǔrę, ånd kęęp ęvęrythîng ås sîmplę ås pøssîblę.
-
I started with a simple Trello board for brainstorming the features I'd need to make an MVP and created cards for anything I considered a unit of work or a question that needed to be answered. I picked Trello because it's the simplest work-tracking software to get started for a basic work tracker.
İ stårtęd wîth å sîmplę Trello bøård før bråînstørmîng thę fęåtǔręs İ'd nęęd tø måkę ån MVP ånd çręåtęd çårds før ånythîng İ çønsîdęręd å ǔnît øf wørk ør å qǔęstîøn thåt nęędęd tø bę ånswęręd. İ pîçkęd Tręllø bęçåǔsę ît's thę sîmplęst wørk-tråçkîng søftwårę tø gęt stårtęd før å båsîç wørk tråçkęr.
-
I used the flask-skeleton variant of cookiecutter to stand up a dockerized python backend. SQLAlchemy makes for simple model definition, flask makes for simple endpoints, cookiecutter sets up the app structure, docker keeps everything clean.
İ ǔsęd thę flask-skeleton vårîånt øf cookiecutter tø stånd ǔp å døçkęrîzęd pythøn båçkęnd. SQLÅlçhęmy måkęs før sîmplę mødęl dęfînîtîøn, flåsk måkęs før sîmplę ęndpøînts, çøøkîęçǔttęr sęts ǔp thę åpp strǔçtǔrę, døçkęr kęęps ęvęrythîng çlęån.
-
I built a simple frontend with create-react-app (using the beauty and simplicity of hooks introduced in 16.8) and bootstrapped the UI with semantic UI. I built a form using semantic UI once and was blown away by how easy it was to implement and how powerful the components were out of the box. I highly recommend it based on my experience. Using hooks and avoiding redux simplified the frontend code dramatically. The only time I wished I had redux was for auth, but that was even replaceable by using Context.
İ bǔîlt å sîmplę frøntęnd wîth create-react-app (ǔsîng thę bęåǔty ånd sîmplîçîty øf hooks întrødǔçęd în 16.8) ånd bøøtstråppęd thę Ǔİ wîth semantic UI. İ bǔîlt å førm ǔsîng sęmåntîç Ǔİ ønçę ånd wås bløwn åwåy by høw ęåsy ît wås tø împlęmęnt ånd høw pøwęrfǔl thę çømpønęnts węrę øǔt øf thę bøx. İ hîghly ręçømmęnd ît båsęd øn my ęxpęrîęnçę. Ǔsîng høøks ånd åvøîdîng rędǔx sîmplîfîęd thę frøntęnd çødę dråmåtîçålly. Thę ønly tîmę İ wîshęd İ håd rędǔx wås før åǔth, bǔt thåt wås ęvęn ręplåçęåblę by ǔsîng Context.
-
I deployed the app with Heroku (backend) and Netlify (frontend). Netlify was dead simple: just connect it to the github repo and it deployed automatically. Truly impressive! Heroku took a few minutes more, having to create a customer docker entrypoint to fit their deploy requirements, but soon that was up and running also.
İ dępløyęd thę åpp wîth Heroku (båçkęnd) ånd Netlify (frøntęnd). Nętlîfy wås dęåd sîmplę: jǔst çønnęçt ît tø thę gîthǔb rępø ånd ît dępløyęd åǔtømåtîçålly. Trǔly împręssîvę! Hęrøkǔ tøøk å fęw mînǔtęs mørę, håvîng tø çręåtę å çǔstømęr døçkęr ęntrypøînt tø fît thęîr dępløy ręqǔîręmęnts, bǔt søøn thåt wås ǔp ånd rǔnnîng ålsø.
I built the app and had it deployed in a weekend. The only thing missing was a 3rd party API integration with their registration app (BikeReg) that I haven't tackled yet, but the basic functionality is all there. It was exciting to finally see my knowledge of prototype/MVP construction come together.
İ bǔîlt thę åpp ånd håd ît dępløyęd în å węękęnd. Thę ønly thîng mîssîng wås å 3rd pårty ÅPİ întęgråtîøn wîth thęîr ręgîstråtîøn åpp (BîkęRęg) thåt İ håvęn't tåçklęd yęt, bǔt thę båsîç fǔnçtîønålîty îs åll thęrę. İt wås ęxçîtîng tø fînålly sęę my knøwlędgę øf prøtøtypę/MVP çønstrǔçtîøn çømę tøgęthęr.
The one potential hitch: when I started looking into integrating with the BikeReg API, I found a news item from Feb 2019 that dropped a pit into my stomach: Event Day Check-In, which basically does everything I just spent the time and energy building. (::screaming-and-crying-endlessly-dot-gif::) However! Upon talking to my friends, it sounds like their internet connection is unreliable, and they would strongly prefer just running a local instance of the frontend and dockerized backend on a laptop. So it seems like the actual work (except deployment) wasn't throwaway after all, though I could probably throw away several features I had built planning on having it deployed publicly.
Thę ønę pøtęntîål hîtçh: whęn İ stårtęd løøkîng întø întęgråtîng wîth thę BîkęRęg ÅPİ, İ føǔnd å nęws îtęm frøm Fęb 2019 thåt drøppęd å pît întø my stømåçh: Event Day Check-In, whîçh båsîçålly døęs ęvęrythîng İ jǔst spęnt thę tîmę ånd ęnęrgy bǔîldîng. (::sçręåmîng-ånd-çryîng-ęndlęssly-døt-gîf::) Høwęvęr! Ǔpøn tålkîng tø my frîęnds, ît søǔnds lîkę thęîr întęrnęt çønnęçtîøn îs ǔnręlîåblę, ånd thęy wøǔld strøngly pręfęr jǔst rǔnnîng å løçål înstånçę øf thę frøntęnd ånd døçkęrîzęd båçkęnd øn å låptøp. Sø ît sęęms lîkę thę åçtǔål wørk (ęxçępt dępløymęnt) wåsn't thrøwåwåy åftęr åll, thøǔgh İ çøǔld prøbåbly thrøw åwåy sęvęrål fęåtǔręs İ håd bǔîlt plånnîng øn håvîng ît dępløyęd pǔblîçly.
I'm hoping that we get to actually use this app to manage some races later this year. I'll post updates if we do. In the meantime, the repos are located here:
İ'm høpîng thåt wę gęt tø åçtǔålly ǔsę thîs åpp tø månågę sømę råçęs låtęr thîs yęår. İ'll pøst ǔpdåtęs îf wę dø. İn thę męåntîmę, thę rępøs årę løçåtęd hęrę: