A few weekends ago, I attended a DevFest jointly organized by GDG Cincinnati and GDG Columbus. Ohio DevFest 2018 was held in the Tangeman University Center at the University of Cincinnati, and offered a full day of talks, organized into four tracks. Many local speakers and attendees from across the state showed up at 08:00 to get the day started.
I skipped the first time slot of the morning, to do some last minute tweaking on my slides!
Not Har Gow: Using Custom Models with ML Kit
I'm fortunate to be encouraged and financially supported by my employer to speak at conferences. Although Shopify does use machine learning in its core products, my interest recently has been at the intersection between ML and mobile.
For my talk, I wanted to walk through how to use a custom TensorFlow Lite model with ML Kit. One way to demonstrate this, is to take an existing image classification sample and retrain the underlying model. In my case, I used pictures of dumplings. For the live demo, I purchased dim sum from a local restaurant, brought some on-stage, and streamed the app's live camera view with the help of Vysor.
Getting feedback is usually a gift, so I was pleased when several people took the time to approach me to ask some questions, both after my talk and at the after-party as well.
Refactoring: Saving Your Code From Itself
The first presentation I attended was by Lorien Rensing (@MakerLorien). She spoke about concrete techniques to refactor code, as well as quantitative methods to measure code maintainability.
One of the oldest books on this subject is by Martin Fowler, who just completed the 2nd edition of Refactoring: Improving the Design of Existing Code. Lorien quoted a concise definition of refactoring given by Fowler:
a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior
We reviewed a number of code smells, things that are possibly indicative of a deeper problem: long methods (hard to understand), poorly named symbols (not meaningful), duplicated code (maintenance headaches), and poor organization.
Coming from a non-Microsoft world, the maintainability index was new to me, but it's a metric that's been in Visual Studio for over a decade. It complements other measurements like cyclomatic complexity and SLOC.
I also learned about the Gilded Rose Refactoring Kata, an exercise to give you deliberate practice in refactoring. Also, JetBrains offers a code-analysis and refactoring extension for .NET developers called ReSharper.
Slaying the Long-Lived Branch
As a fan of small, focused pull requests, I looked forward to hearing this talk by Kat Fairbanks (@DerKatzenbar) about dealing with branches that incorporate a significant amount of work. In her particular case, she was asked to review 3 weeks of work over 90 commits, which, when deployed, led to a production error requiring a rollback.
It's obvious that a massive set of changes is painful to review, and even the most experienced reviewer can miss something in the sea of code they are examining. Kat brought up the human element in code review. Feedback can be hard to give to someone, and a conscientious reviewer might be reluctant to point out a problem, because it would result in another QA pass.
Some sensible strategies Kat suggested were not adding small, unrelated changes to a pull request; keeping refactoring separate from feature work; and finding a balance between fewer, but larger PRs, and the cognitive overhead of many small, unrelated PRs.
On the topic of rolling out a huge set of changes into production, we learned about a few ways to reduce risk when doing so. One was the concept of feature toggles, deploying functionality that can be turned on and off. Of course, adding conditionals introduces its own complexity.
Another way to roll out large features is to do so incrementally, by breaking down large features into smaller chunks, and introducing them one at a time. Kat recommended reading GitHub's blog post about how they upgraded their 10-year old code base over 1.5 years to the most recent version of Rails. (Shopify's engineering blog also has an article about how we upgraded to Rails 5 last year.)
Large Scale Resource Planning and Management
I went to this session mostly out of curiosity, as I know nothing about how "the Cloud" is actually built. Arathi Mani spoke about how Google's datacenters are physically planned, built, and managed.
One of the first slides in her deck raised several dozen questions related to datacenters including: Where should you build it? Where do you get power from? Do you use existing hardware or design your own? Consider that every new feature in every web app (e.g. Gmail) needs its compute and storage needs to be forecast, in order to plan when to build another datacenter (each of which costs $200 million USD). Arathi mentioned an example of when a forecast is wrong, the launch of Pokémon Go.
There were so many eye-opening facts and figures in this talk:
- Google's 3-year trailing capital expenditure is a staggering $40 billion
- Physical pen tests are conducted annually
- Collectively, the world's datacenters use 2% of all electricity (3% according to this Forbes article)
- AI can be used to improve Power Usage Effectiveness, the ratio between energy used to run computers versus cooling and other overhead
This talk felt like a promotion for Google's datacenters, but I still enjoyed learning about what it takes to operate at Google's scale.
Panel: Non-Traditional Paths to Technology
The last session I attended featured a panel of women and men who didn't land in tech in the "traditional" way, i.e. study computer science or programming at school. Their previous careers included receptionist, audiologist, marketer, legal assistant, and sheet metal fabricator.
I learned about some of the local programs to get you started on a tech career:
- Cincy Code IT Bootcamp
- i.c.stars, which offers a free bootcamp to qualified interns
- Operation Code, a non-profit that helps the military community
With so much instructional content available online, someone raised a question about whether a bootcamp or MOOC was better. Of course, the answer completely depends on the learner, but someone pointed out that in-person interaction, like learning with other students, and networking with people at meetups, can be important. While changing careers requires learning new skills, there are character traits such as grit, resilience, being curious, being confident, etc. that can help you succeed in whatever you do.
I wandered into the last event of the day, which turned out to be a casual Q&A with all of the speakers.
Some tidbits from our discussion:
- Don't stay at your first job too long (not for 9 years!)
- You have the ultimate responsibility for your own career
- Everyone thinks machine learning is the next big thing
The day ended with beer and pizza at the wonderful Rhinegeist Taproom. I didn't know that Cincinnati has an almost 200-year history of breweries, thanks to waves of German immigrants arriving in the mid-1800s.