<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Fragmented | AI Developer Podcast - Episodes</title><link>https://fragmentedpodcast.com/episodes/</link><description>Recent content - Fragmented | AI Developer Podcast - Episodes</description><language>en-US</language><lastBuildDate>Tue, 14 Apr 2026 04:00:00 UTC</lastBuildDate><image><url>https://fragmentedpodcast.com//images/favicon.png</url><title>Fragmented | AI Developer Podcast - Episodes</title><link>https://fragmentedpodcast.com/episodes/</link></image><atom:link href="https://fragmentedpodcast.com/episodes/feed.xml" rel="self" type="application/rss+xml"/><item><title>310 - Mitchell Hashimoto on Ghostty &amp; His Agentic Coding Workflow</title><link>https://fragmentedpodcast.com/episodes/310/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0eb15b2c-1134-4031-b4f8-cdbc725d0566?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Mitchell Hashimoto co-founded
&lt;a href="https://en.wikipedia.org/wiki/HashiCorp"&gt;HashiCorp&lt;/a&gt;, built some of the most
impressive DevOps tools like &lt;a href="https://developer.hashicorp.com/vagrant"&gt;Vagrant&lt;/a&gt;
and &lt;a href="https://developer.hashicorp.com/terraform"&gt;Terraform&lt;/a&gt;,
&lt;a href="https://newsroom.ibm.com/2025-02-27-ibm-completes-acquisition-of-hashicorp,-creates-comprehensive,-end-to-end-hybrid-cloud-platform"&gt;sold&lt;/a&gt;
the company to IBM — and then built a terminal. Ghostty is now where a huge
chunk of agentic coding actually happens. Mitchell was an AI skeptic. We walk
through his six-step adoption framework and the workflows he uses day to day —
warm-start research, Hail Mary prompts across twenty GitHub issues, and knowing
when to let the agent slam dunk it.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="ghostty"&gt;
Ghostty
&lt;a class="heading-anchor" href="#ghostty" aria-label="Link to Ghostty"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ghostty.org"&gt;Ghostty&lt;/a&gt; - Mitchell&amp;rsquo;s fast, native terminal built for
platform integration across Mac and Linux&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Shell_(computing)"&gt;Terminal shells&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Secure_Shell"&gt;SSH - secure shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Pseudoterminal"&gt;PTY - pseudoterminals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Terminal_multiplexer"&gt;Terminal Multiplexers&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Tmux"&gt;tmux&lt;/a&gt; - most popular open source one&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Device-Control-functions"&gt;XTGETTCAP&lt;/a&gt;
by &lt;a href="https://en.wikipedia.org/wiki/Xterm"&gt;xterm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ghostty-org/ghostty"&gt;libghostty&lt;/a&gt; - the cross-platform
terminal emulation library that powers Ghostty&amp;rsquo;s core&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xtermjs.org/"&gt;xterm-js&lt;/a&gt; - powers terminal for apps like VSCode and
the cloud&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JetBrains/jediterm"&gt;Jedi Term&lt;/a&gt; - Intellij&amp;rsquo;s embedded
terminal&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mitchellh.com/writing/ghostty-non-profit"&gt;Ghostty is now a non-profit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/manaflow-ai/cmux"&gt;cmux&lt;/a&gt; - native macOS terminal
multiplexer built on libghostty — a fork Mitchell champions&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/The_Free_Software_Definition"&gt;Free Software Definition&lt;/a&gt; -
the 4 essential freedoms
&lt;ol&gt;
&lt;li&gt;The freedom to run the program as you wish, for any purpose.&lt;/li&gt;
&lt;li&gt;The freedom to study how the program works, and change it to make it do
what you wish.&lt;/li&gt;
&lt;li&gt;The freedom to redistribute copies so you can help others.&lt;/li&gt;
&lt;li&gt;The freedom to distribute copies of your modified versions to others.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Mitchell&amp;rsquo;s
&lt;a href="https://x.com/mitchellh/status/1986933060643045646"&gt;tweet on unsolicited PRs and transfer of ownership&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-ai-adoption-journey"&gt;
The AI Adoption Journey
&lt;a class="heading-anchor" href="#the-ai-adoption-journey" aria-label="Link to The AI Adoption Journey"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mitchellh.com/writing/my-ai-adoption-journey"&gt;My AI Adoption Journey&lt;/a&gt; -
Mitchell&amp;rsquo;s blog post outlining his five-step framework&lt;/li&gt;
&lt;li&gt;Step 1: Drop the Chatbot
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/301"&gt;Episode 301 - AI Coding ladder&lt;/a&gt; - Different stages of AI
adoption&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Step 2: Reproduce Your Own Work&lt;/li&gt;
&lt;li&gt;Step 3: End-of-Day Agents
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/introducing-deep-research/"&gt;OpenAI Deep Research&lt;/a&gt; -
kick off research tasks for a &amp;ldquo;warm start&amp;rdquo; the next morning&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getspine.ai/"&gt;Spine AI research&lt;/a&gt; - deep research tool for
longer, hour-long analysis tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Step 4: Outsource the Slam Dunks
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.com/kaushikgopal/status/2023919843016348027?s=20"&gt;Claude status hooks - warcraft peons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.conductor.build/"&gt;Conductor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Step 5: Engineer the Harness
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/307"&gt;Episode 307 - Harness Engineering&lt;/a&gt; - Fragmented&amp;rsquo;s deep dive
on harness engineering, heavily inspired by Mitchell&amp;rsquo;s post&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Step 6: Always have an Agent running&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Peter_Steinberger_(programmer)"&gt;Peter Steinberger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex-plugin-cc"&gt;Codex plugin for Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/310/</guid><pubDate>Tue, 14 Apr 2026 04:00:00 UTC</pubDate></item><item><title>309 - Background Agents</title><link>https://fragmentedpodcast.com/episodes/309/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e081ccaa-08cb-448a-9d6b-222de9bc4316?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Andrej Karpathy says the goal is to maximize how long an agent runs without your
intervention. But there&amp;rsquo;s a false summit most teams hit first: individual speed
goes up while system speed stalls, laptops roar under four parallel Gradle
builds, and review queues keep growing. Kaushik and Iury trace the full arc —
from local multitasking to cloud-hosted async work to fully autonomous agents
that fire on repo events and send you PRs to approve.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/309"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=kwSVtQ7dziU"&gt;Andrej Karpathy on agents and token throughput&lt;/a&gt; -
NoPriors podcast — maximize agent runtime, not token burn&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/changelog/2-0#multi-agents"&gt;Cursor Agent Mode - Multiagent interface&lt;/a&gt; -
introduced the multi-agent board as a new paradigm for local parallel agents&lt;/li&gt;
&lt;li&gt;&lt;a href="https://antigravity.google/docs/agent-manager"&gt;Google Antigravity - Agent Manager interface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/agent-teams"&gt;Claude Code Agent Teams&lt;/a&gt; - spawn
sub-agents from a main orchestrator, with tmux pane integration&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/ProgrammerTIL/comments/mtjg0c/git_til_about_git_worktrees/"&gt;Git worktrees&lt;/a&gt; -
/reddit&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="remote-background-agents-in-the-cloud"&gt;
Remote Background Agents in the cloud
&lt;a class="heading-anchor" href="#remote-background-agents-in-the-cloud" aria-label="Link to Remote Background Agents in the cloud"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jules.google.com/"&gt;Google Jules&lt;/a&gt; - hosted GitHub-connected agent,
proposes a plan, edits code, runs tests, opens a PR&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/blog/cloud-agents"&gt;Cursor Cloud Agents&lt;/a&gt; - remote agents
that clone your repo in the cloud and work in parallel&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/blog/introducing-codex/"&gt;OpenAI Codex&lt;/a&gt; - cloud software
engineering agent for parallel tasks&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claude.ai/code"&gt;Claude Code on the web&lt;/a&gt; - cloud-hosted Claude Code
sessions decoupled from your local machine&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="building-trust"&gt;
Building trust
&lt;a class="heading-anchor" href="#building-trust" aria-label="Link to Building trust"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/307"&gt;Episode 307 - Harness Engineering&lt;/a&gt; - the earlier episode on
shaping agent environments — and why this ceiling exists&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/309/</guid><pubDate>Wed, 01 Apr 2026 04:00:00 UTC</pubDate></item><item><title>308 - How Image Diffusion Models Work - the 20 minute explainer</title><link>https://fragmentedpodcast.com/episodes/308/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9252f1b2-f2ed-4ffd-afd7-bcd89387ef0c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You already know how LLMs work — text into tokens, tokens into math, predict the
next one. Image generation uses the same broad ideas but flips the training
game: instead of predicting the next token, the model learns to predict and
remove noise. Starting from pure static, it chips away — step by step — until a
coherent image emerges. What does Michelangelo have to do with any of this? More
than you&amp;rsquo;d think. This is how image diffusion models work, in 20 minutes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/308"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/303"&gt;Episode 303 - How LLMs work in 20 minutes&lt;/a&gt; - text generation&lt;/li&gt;
&lt;li&gt;VAE -
&lt;a href="https://www.ibm.com/think/topics/variational-autoencoder"&gt;Variational Autoencoder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/RGB_color_model"&gt;RGB Color model&lt;/a&gt; - wikipedia&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Word2vec"&gt;Word2Vec technique&lt;/a&gt; - wikipedia
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/1301.3781"&gt;Efficient Estimation of Word Representation&lt;/a&gt; -
original Word2Vec paper by Mikolov et al.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2112.10752"&gt;High-Resolution Image Synthesis with Latent Diffusion Models&lt;/a&gt; -
Rombach et al. (2022) — the paper behind Stable Diffusion&lt;/li&gt;
&lt;li&gt;Image Training data
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2210.08402"&gt;LAION-5B&lt;/a&gt; - 5 billion image-text pairs
scraped from the web, used to train many image generation models&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aibase.com/news/15390"&gt;WebLI&lt;/a&gt; - Google&amp;rsquo;s internal image-text
dataset&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodreads.com/quotes/1191114-the-sculpture-is-already-complete-within-the-marble-block-before"&gt;Michelangelo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/308/</guid><pubDate>Tue, 24 Mar 2026 04:00:00 UTC</pubDate></item><item><title>307 - Harness Engineering - the hard part of AI coding</title><link>https://fragmentedpodcast.com/episodes/307/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2df7170e-ee7c-4a4c-ae2d-a78537512c67?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;The hard part of AI coding isn&amp;rsquo;t generating code — it&amp;rsquo;s controlling quality,
safety, and drift. Drawing from OpenAI&amp;rsquo;s Codex case study, Mitchell Hashimoto&amp;rsquo;s
post on AI workflows, Stripe&amp;rsquo;s Minions project, and real-world experience,
Kaushik and Iury break down harness engineering: the five pillars for shaping an
agent&amp;rsquo;s environment, and what it looks like when teams build custom harnesses
from scratch.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/307"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="why-it-matters"&gt;
Why it matters
&lt;a class="heading-anchor" href="#why-it-matters" aria-label="Link to Why it matters"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mitchellh.com/"&gt;Mitchell Hashmito&lt;/a&gt; first coined this term in his post
&lt;a href="https://mitchellh.com/writing/my-ai-adoption-journey#step-5-engineer-the-harness"&gt;My AI Adoption Journey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/harness-engineering/"&gt;Harness Engineering&lt;/a&gt; -
OpenAI&amp;rsquo;s post on building their Codex codebase (~1M lines of code, 1,500 PRs
merged, zero manually written)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="shaping-the-harness"&gt;
Shaping the harness
&lt;a class="heading-anchor" href="#shaping-the-harness" aria-label="Link to Shaping the harness"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/newsletter/the-feeds-lost-and-found-01/"&gt;The Feed&amp;rsquo;s Lost and Found&lt;/a&gt; -
Iury&amp;rsquo;s newsletter consolidating harness engineering themes&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Agent legibility&lt;/li&gt;
&lt;li&gt;Closed feedback loops&lt;/li&gt;
&lt;li&gt;Persistent memory&lt;/li&gt;
&lt;li&gt;Entropy control&lt;/li&gt;
&lt;li&gt;Blast radius controls&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="building-the-harness"&gt;
Building the harness
&lt;a class="heading-anchor" href="#building-the-harness" aria-label="Link to Building the harness"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents"&gt;Minions: Stripe&amp;rsquo;s one-shot, end-to-end coding agents&lt;/a&gt; -
Stripe forked Goose to build custom agents for their codebase&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/block/goose"&gt;Goose&lt;/a&gt; - open-source coding agent from Block&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/obra/superpowers"&gt;Superpowers&lt;/a&gt; by Jesse Vincent - skills
that enforce a proper software engineering process&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/"&gt;Open Code&lt;/a&gt; - open-source coding agent you can fork and
customize&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-resources"&gt;
Other resources
&lt;a class="heading-anchor" href="#other-resources" aria-label="Link to Other resources"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://latentpatterns.com/glossary/agent-harness"&gt;Agent Harness Glossary&lt;/a&gt; -
Latent Patterns&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/blog/self-driving-codebases"&gt;Towards self-driving codebases&lt;/a&gt; -
Cursor&lt;/li&gt;
&lt;li&gt;&lt;a href="https://githubnext.com/projects/agentic-workflows"&gt;Agentic Workflows&lt;/a&gt; -
GitHub Next&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf"&gt;Future of Software Development&lt;/a&gt; -
ThoughtWorks&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/307/</guid><pubDate>Tue, 17 Mar 2026 04:00:00 UTC</pubDate></item><item><title>306 - Keeping your agent instructions in sync and effective</title><link>https://fragmentedpodcast.com/episodes/306/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/7bcd5461-9e74-4cf9-95bb-6b3bd45fed0c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;AGENTS.md is becoming the common language for AI coding tools, but keeping repo
rules, personal rules, and tool-specific files in sync is still messy. In this
episode, Kaushik and Iury break down the sync problem, compare their own setups,
and unpack what the latest AGENTS.md research actually says.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/306"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="the-sync-problem"&gt;
The sync problem
&lt;a class="heading-anchor" href="#the-sync-problem" aria-label="Link to The sync problem"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agents.md"&gt;AGENTS.md&lt;/a&gt; - Official spec&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/guides/agents-md/"&gt;Custom instructions with AGENTS.md&lt;/a&gt; -
Open AI&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kau.sh/blog/agents-md/"&gt;Keep your AGENTS.md in sync&lt;/a&gt; - Kaushik&amp;rsquo;s post&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jpcaparas/rulesync"&gt;Rulesync&lt;/a&gt; - What Iury uses&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/ryancarson/status/2024144258702143782"&gt;Tweet by Ryan Carson and Claude frustrations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-links"&gt;
Other links
&lt;a class="heading-anchor" href="#other-links" aria-label="Link to Other links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2602.11988"&gt;Evaluating AGENTS.md: Are Repository-Level Context Files Helpful for Coding Agents?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/harness-engineering/"&gt;Harness engineering - Check the section about using AGENTS.md as a table of contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/"&gt;OpenCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/306/</guid><pubDate>Mon, 09 Mar 2026 04:00:00 UTC</pubDate></item><item><title>305 - Subagents explained: What they are, when (not) to spawn them</title><link>https://fragmentedpodcast.com/episodes/305/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/97eb062b-911e-425f-a484-b73a1426fc80?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/97eb062b-911e-425f-a484-b73a1426fc80/audio/1f585e94-e022-4dcd-833c-9355e0e144ed/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Subagents are becoming a core primitive for serious AI-assisted development. In
this episode, Kaushik and Iury disambiguate &amp;ldquo;agent&amp;rdquo; terminology, unpack plan
mode vs subagents, and explain how parallel, scoped workers improve research
quality without polluting the main thread.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/305"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="resources--documentation"&gt;
Resources &amp;amp; Documentation
&lt;a class="heading-anchor" href="#resources--documentation" aria-label="Link to Resources &amp;amp; Documentation"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="official-documentation"&gt;
Official Documentation
&lt;a class="heading-anchor" href="#official-documentation" aria-label="Link to Official Documentation"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Agents, Modes, Subagents: official harness docs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/sub-agents.md"&gt;Claude Code Subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geminicli.com/docs/core/subagents/"&gt;Gemini CLI Subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/docs/agents/"&gt;Opencode Subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/docs/context/subagents"&gt;Cursor Subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://antigravity.google/docs/agent-modes-settings"&gt;Antigravity Agent Modes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=0b9p6NNlfM8"&gt;AOE Scouting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="research-papers--articles"&gt;
Research Papers &amp;amp; Articles
&lt;a class="heading-anchor" href="#research-papers--articles" aria-label="Link to Research Papers &amp;amp; Articles"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/claude-opus-4-5"&gt;Introducing Claude Opus 4.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2508.06600v1#S4"&gt;Deep-Research Agents Paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/i/status/2020922190775058608"&gt;Post: GPT-5 System Card&lt;/a&gt; by Alex
Xu&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/blog/self-driving-codebases"&gt;Self-Driving Codebases Blog&lt;/a&gt; -
multi-agent systems making 1,000 commits/hour&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/305/</guid><pubDate>Mon, 16 Feb 2026 04:00:00 UTC</pubDate></item><item><title>304 - Agent Skills - when to use them and why they matter</title><link>https://fragmentedpodcast.com/episodes/304/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c3bf3b11-1c58-482b-8ddd-f2741e3dd2b4?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c3bf3b11-1c58-482b-8ddd-f2741e3dd2b4/audio/2de2d02a-06a1-49e6-8ad9-290e24431e0a/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Agent Skills look simple, but they are one of the most powerful building blocks
in modern AI coding workflows. In this episode, Kaushik and Iury break down when
to use skills, how progressive disclosure works, and how skills compare with
commands, instructions, and MCPs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/304"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="main-references"&gt;
Main References
&lt;a class="heading-anchor" href="#main-references" aria-label="Link to Main References"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#three-types-of-skill-content-three-levels-of-loading"&gt;Progressive Disclosure&lt;/a&gt; -
how skills are loaded into context&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentskills.io/specification"&gt;Agent Skills Open Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation"&gt;AAIF (Agentic AI Foundation)&lt;/a&gt; -
Linux Foundation initiative for AI interoperability&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2307.03172"&gt;Needle in a Haystack Problem&lt;/a&gt; - original
&amp;ldquo;Lost in the Middle&amp;rdquo; paper&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/trq212/status/2014836841846132761"&gt;Agent-Invokable vs User-Invokable&lt;/a&gt; -
merging skills and commands in Claude Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="creating-skills"&gt;
Creating Skills
&lt;a class="heading-anchor" href="#creating-skills" aria-label="Link to Creating Skills"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/skills/tree/main/skills/skill-creator"&gt;Skill Creator&lt;/a&gt; -
Anthropic&amp;rsquo;s skill for creating new agent skills&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/skills#frontmatter-reference"&gt;Claude Code frontmatter reference&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;see &lt;code&gt;model: *&lt;/code&gt; &amp;amp; &lt;code&gt;context: fork&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="using-other-skills"&gt;
Using other Skills
&lt;a class="heading-anchor" href="#using-other-skills" aria-label="Link to Using other Skills"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/skills"&gt;Anthropic Skills GitHub Repository&lt;/a&gt; -
official collection of Claude skills and examples&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clawhub.ai/"&gt;Clawdhub&lt;/a&gt; - Clawdbot&amp;rsquo;s skill hub. All versions are
archived &lt;a href="https://github.com/openclaw/skills"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skills.sh/"&gt;SKILLS.sh&lt;/a&gt; - Vercel&amp;rsquo;s skills hub&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="warnings-before-installing-random-skills"&gt;
Warnings before installing random skills
&lt;a class="heading-anchor" href="#warnings-before-installing-random-skills" aria-label="Link to Warnings before installing random skills"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="warning" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-alert-triangle"&gt;&lt;path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"&gt;&lt;/path&gt;&lt;path d="M12 9v4"&gt;&lt;/path&gt;&lt;path d="M12 17h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
Don&amp;rsquo;t install from hubs blindly.
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;Inspect the repo code before adding anything to your agent.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://genai.owasp.org/llmrisk/llm01-prompt-injection/"&gt;Prompt Injection Attacks&lt;/a&gt; -
OWASP guide to LLM prompt injection vulnerabilities&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openclaw.ai/"&gt;OpenClaw &amp;lt;- MoltBot &amp;lt;- Clawdbot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.giskard.ai/knowledge/openclaw-security-vulnerabilities-include-data-leakage-and-prompt-injection-risks"&gt;OpenClaw Security Analysis&lt;/a&gt; -
analysis of prompt injection risks in open agent frameworks&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/DanielLockyer/status/2019422410018267328"&gt;Malware found in a top-downloaded Clawhub skill&lt;/a&gt; -
incident report thread&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="additional-resources"&gt;
Additional resources
&lt;a class="heading-anchor" href="#additional-resources" aria-label="Link to Additional resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/few-shot-prompting"&gt;Few-Shot Prompting&lt;/a&gt; -
improving outputs with examples&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/embirico/status/2018415923930206718"&gt;.agents/skills&lt;/a&gt; - proposal
to standardize the skills folder path&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals"&gt;Vercel: AGENTS.md vs Skills&lt;/a&gt; -
comparison of agent instruction methods&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/304/</guid><pubDate>Mon, 09 Feb 2026 05:00:00 UTC</pubDate></item><item><title>303 - How LLMs Work - the 20 minute explainer</title><link>https://fragmentedpodcast.com/episodes/303/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d0e8970a-e53d-453d-92be-1061cc6a1077?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/d0e8970a-e53d-453d-92be-1061cc6a1077/audio/edc5a514-6970-472d-a6c5-ae9fab11751e/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Ever get asked &amp;ldquo;how do LLMs work?&amp;rdquo; at a party and freeze? We walk through the
full pipeline: tokenization, embeddings, inference — so you understand it well
enough to explain it. Walk away with a mental model that you can use for your
next dinner party.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/303"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="words---tokens"&gt;
Words -&amp;gt; Tokens:
&lt;a class="heading-anchor" href="#words---tokens" aria-label="Link to Words -&amp;gt; Tokens:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI &lt;a href="https://platform.openai.com/tokenizer"&gt;Tokenizer visualizer&lt;/a&gt; -
Visualize how text becomes tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tokens---embeddings"&gt;
Tokens -&amp;gt; Embeddings:
&lt;a class="heading-anchor" href="#tokens---embeddings" aria-label="Link to Tokens -&amp;gt; Embeddings:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/RGB_color_model"&gt;RGB Color model&lt;/a&gt; - wikipedia&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Word2vec"&gt;Word2Vec technique&lt;/a&gt; - wikipedia
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/1301.3781"&gt;Efficient Estimation of Word Representation&lt;/a&gt; -
original Word2Vec paper by Mikolov et al.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="embeddings---inference"&gt;
Embeddings -&amp;gt; Inference:
&lt;a class="heading-anchor" href="#embeddings---inference" aria-label="Link to Embeddings -&amp;gt; Inference:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Word_embedding"&gt;Word embedding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codefinity.com/blog/Understanding-Temperature%2C-Top-k%2C-and-Top-p-Sampling-in-Generative-Models"&gt;Temperature, Top-k, Top-p samping&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on. We want to make the show better for you so let us know!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/303/</guid><pubDate>Mon, 02 Feb 2026 08:00:00 UTC</pubDate></item><item><title>302 - MCPs Explained - what they are and when to use them</title><link>https://fragmentedpodcast.com/episodes/302/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3950092c-154b-4a66-acdf-74983f895165?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/3950092c-154b-4a66-acdf-74983f895165/audio/6ff0e5ac-be30-422b-afd5-f3274136db63/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;MCPs are everywhere, but are they worth the token cost? We break down what Model
Context Protocol actually is, how it differs from just using CLIs, the tradeoffs
you should know about, and when MCPs actually make sense for your workflow.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/302"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;MCP - Model Context Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.glean.com/guides/mcp"&gt;Remote MCP server example - Glean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AAIF -
&lt;a href="https://aaif.io/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation-aaif-anchored-by-new-project-contributions-including-model-context-protocol-mcp-goose-and-agents-md/"&gt;Agentic AI Foundation setup by Linux foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/github-mcp-server"&gt;Github MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.github.com/"&gt;Github gh CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/playwright-mcp"&gt;Playwright MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://context7.com/"&gt;Context7 MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Anthropic&amp;rsquo;s announcement on
&lt;a href="https://www.anthropic.com/engineering/advanced-tool-use"&gt;Advanced Tool Use&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="tips"&gt;
Tips
&lt;a class="heading-anchor" href="#tips" aria-label="Link to Tips"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Iury: use &lt;a href="https://github.com/ast-grep/ast-grep"&gt;ast-grep&lt;/a&gt; to structurally
search code faster&lt;/li&gt;
&lt;li&gt;KG: use &lt;a href="https://agent-browser.dev/"&gt;agent-browser by Vercel&lt;/a&gt; to give browsing
power to your agent&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="get-in-touch"&gt;
Get in touch
&lt;a class="heading-anchor" href="#get-in-touch" aria-label="Link to Get in touch"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;We&amp;rsquo;d love to hear from you. &lt;a href="mailto:contact@fragmentedpodcast.com"&gt;Email&lt;/a&gt; is the
best way to reach us or you can check our &lt;a href="https://fragmentedpodcast.com/contact"&gt;contact page&lt;/a&gt; for other
ways.&lt;/p&gt;
&lt;p&gt;We want to hear all the feedback: what&amp;rsquo;s working, what&amp;rsquo;s not, topics you&amp;rsquo;d like
to hear more on. We want to make the show better for you so let us know!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/302/</guid><pubDate>Mon, 26 Jan 2026 00:00:00 UTC</pubDate></item><item><title>301 - The AI coding ladder</title><link>https://fragmentedpodcast.com/episodes/301/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/aa0766a9-30bd-4a71-bb18-f83e15ef9455?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/aa0766a9-30bd-4a71-bb18-f83e15ef9455/audio/b30427b6-c805-45d4-a98c-5d11bbf2becc/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Most folks reference &amp;ldquo;AI coding&amp;rdquo; like it&amp;rsquo;s one thing. It&amp;rsquo;s really not. In this
foundational episode Kaushik &amp;amp; Iury walk through (at least) four paradigms —
from super autocomplete to agent orchestration — each with different workflows,
expectations, and mental models.&lt;/p&gt;
&lt;p&gt;What do most developers follow today? Where is the frontier? What&amp;rsquo;s coming in
the future?&lt;/p&gt;
&lt;p&gt;Listen to the episode and find out!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/301"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="gen-1-super-autocomplete"&gt;
Gen 1: Super autocomplete
&lt;a class="heading-anchor" href="#gen-1-super-autocomplete" aria-label="Link to Gen 1: Super autocomplete"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/visualstudio/ide/using-intellisense?view=visualstudio"&gt;Intellisense - regular autocomplete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/ai-powered-suggestions"&gt;Github Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/docs/tab/overview"&gt;Cursor Tab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gen-2-chat-oriented-programming"&gt;
Gen 2: Chat Oriented Programming
&lt;a class="heading-anchor" href="#gen-2-chat-oriented-programming" aria-label="Link to Gen 2: Chat Oriented Programming"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cursor.com/"&gt;Cursor IDE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebender.com/"&gt;Firebender&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gen-3-agent"&gt;
Gen 3: Agent
&lt;a class="heading-anchor" href="#gen-3-agent" aria-label="Link to Gen 3: Agent"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.nvidia.com/blog/introduction-to-llm-agents/"&gt;Nvidia&amp;rsquo;s definition of an Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.promptingguide.ai/techniques/react"&gt;ReAct Prompting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2310.06117v2"&gt;Chain of Thought was a prompting hack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deepseek.com/en/"&gt;DeepSeek&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/pdf/2501.12948"&gt;DeepSeek - R1 paper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TUI tools (or Harnesses):
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-code"&gt;Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/"&gt;Open Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex"&gt;Codex Cli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google-gemini/gemini-cli"&gt;Gemini Cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IDE style tools
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cursor.com/learn/agents"&gt;Cursor Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/features/copilot"&gt;Copilot (MS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/junie/"&gt;Junie - Intellij&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://antigravity.google/"&gt;Antigravity - Google&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Headless Tools:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jules.google/"&gt;Jules - Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/claude-code-on-the-web"&gt;Claude Code on the Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/cloud/"&gt;Codex Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gen-4-agent-orchestration"&gt;
Gen 4: Agent Orchestration
&lt;a class="heading-anchor" href="#gen-4-agent-orchestration" aria-label="Link to Gen 4: Agent Orchestration"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-worktree"&gt;Git worktrees&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="tips"&gt;
Tips
&lt;a class="heading-anchor" href="#tips" aria-label="Link to Tips"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Iury: Transfer between agents using your own
&lt;a href="https://gist.github.com/AtlantisPleb/1dbe12a0bc8c668efe1f79c614d36400"&gt;compact command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KG: Ask the agent to clarify your prompt&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="note" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-pencil"&gt;&lt;path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"&gt;&lt;/path&gt;&lt;path d="m15 5 4 4"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
cclarify
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Confirm if my requirements are clear. If you have follow up questions, ask me
first and clarify before executing anything.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-callout-metadata="" data-callout-fold="" data-callout="fyi" class="callout"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-info"&gt;&lt;circle cx="12" cy="12" r="10"&gt;&lt;/circle&gt;&lt;path d="M12 16v-4"&gt;&lt;/path&gt;&lt;path d="M12 8h.01"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;
We transitioned from Android development to AI starting with
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Ep. #300&lt;/a&gt;. Listen to that episode for the full story behind
our new direction.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/301/</guid><pubDate>Mon, 19 Jan 2026 09:00:00 UTC</pubDate></item><item><title>300 - From Vibe coding to Software engineering</title><link>https://fragmentedpodcast.com/episodes/300/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/63d7400c-f368-4af6-a6ae-cf09f46e6349?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/63d7400c-f368-4af6-a6ae-cf09f46e6349/audio/56b5d652-11b6-4964-8281-146f3e9380dc/default_tc.mp3"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Fragmented is changing. New direction, new cohost. Kaushik explains the pivot
from Android to AI development and introduces Iury Souza.&lt;/p&gt;
&lt;p&gt;From vibe coding to software engineering — one episode at a time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://fragmentedpodcast.com/episodes/300"&gt;Full shownotes at fragmentedpodcast.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buttondown.com/fragmentedcast"&gt;Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-hosts"&gt;
Co-hosts:
&lt;a class="heading-anchor" href="#co-hosts" aria-label="Link to Co-hosts:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;Kaushik Gopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/"&gt;Iury Souza&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/300/</guid><pubDate>Mon, 12 Jan 2026 09:00:00 UTC</pubDate></item><item><title>257 - Future of AndroidDev in an AI world with Vinay Gaba</title><link>https://fragmentedpodcast.com/episodes/257/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c70df156-a79e-44a3-9ebe-30e28c033f32?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c70df156-a79e-44a3-9ebe-30e28c033f32/audio/2d474979-fbc9-41d3-8b21-6f2e0666ac22/default_tc.mp3"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Join us as we talk with Vinay Gaba, Android GDE and leading voice in Android development, about the future of the field. Vinay shares insights from interviews with top Android devs on their three-year predictions, and offers his own perspective. We cover AI&amp;rsquo;s impact, evolving development roles, and crucial future skills.&lt;/p&gt;
&lt;p&gt;You can find the &lt;a href="https://fragmentedpodcast.com/episodes/257"&gt;full shownotes over at fragmentedpodcast.com&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.vinaygaba.me/writing/"&gt;Vinay&amp;rsquo;s personal website&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jetpackcompose.app/newsletter"&gt;Dispatch - Jetpack Compose newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetpackcompose.app/newsletter/dispatch-issue-11"&gt;Issue #11 - Future of AndroidDev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cursor.com/"&gt;Cursor AI IDE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/ai/"&gt;Jetbrains AI assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/junie/"&gt;Jetbrains Junie - the coding agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pessimists avoid risk, Optimists change the world.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Discuss on &lt;a href="https://bsky.app/profile/fragmentedpodcast.com/post/3ljjtfdcstk26"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/1j34lw0/future_of_androiddev_with_vinay_gaba_fragmented/"&gt;Reddit&lt;/a&gt;, &lt;a href="https://youtu.be/M66B3buM-mY"&gt;Youtube&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/257/</guid><pubDate>Tue, 04 Mar 2025 06:00:00 UTC</pubDate></item><item><title>256 - Rapid prototyping with Kotlin</title><link>https://fragmentedpodcast.com/episodes/256/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/983a52d2-a331-4eb6-9326-d8e2de785fd7?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/983a52d2-a331-4eb6-9326-d8e2de785fd7/audio/abc1aa36-e447-4a15-b336-0470e1192998/default_tc.mp3"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we dive into the power of rapid prototyping for Android developers using Kotlin. We explore how this crucial skill can impress stakeholders, accelerate your workflow, and help you stay ahead in today&amp;rsquo;s fast-paced tech landscape. We&amp;rsquo;ll cover use cases across scripting, web development (with Ktor &amp;amp; HTMX), mobile apps (Jetpack Compose), and even touch upon how AI is changing the game!&lt;/p&gt;
&lt;p&gt;You can find the &lt;a href="https://fragmentedpodcast.com/episodes/256/"&gt;full shownotes over at fragmentedpodcast.com&lt;/a&gt;.&lt;/p&gt;
&lt;!-- Full Shownotes at https://fragmentedpodcast.com/episodes/256/ --&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Simple scripting
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/kotlin/2024/11/state-of-kotlin-scripting-2024/"&gt;State of Kotlin Scripting 2024 - Jetbrains blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kotlin mini-app repo &lt;a href="https://github.com/kaushikgopal/playground-kt"&gt;playground-kt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adventofcode.com/"&gt;Advent of Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web sites
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; static site generator&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pages.cloudflare.com/"&gt;Cloudflare Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Slashdot_effect"&gt;Slashdot effect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;Fragmented Podcast Website&lt;/a&gt; powered by &lt;a href="https://github.com/kaushikgopal/henry-hugo"&gt;Henry&lt;/a&gt; (Kaushik&amp;rsquo;s custom theme)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web apps
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ktor.io/"&gt;Ktor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://htmx.org/"&gt;HTMX&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Ajax_(programming)"&gt;Ajax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions"&gt;CSS Transitions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events"&gt;Server Sent Events&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=wdOs8HGnYyE"&gt;Youtube Video showing Ktor + HTMX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mobile apps
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/252/"&gt;Episode 252&lt;/a&gt; talking about &lt;a href="https://github.com/kaushikgopal/playground-android"&gt;playground-android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutter.dev/"&gt;Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/multiplatform.html"&gt;Kotlin Multiplatform KMP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactnative.dev/"&gt;React Native&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LLM Based apps
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://streamlit.io/"&gt;Streamlit&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://techcrunch.com/2022/03/02/snowflake-acquires-streamlit-for-800m-to-help-customers-build-data-based-apps/"&gt;Snowflake acquires Streamlit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aistudio.google.com/"&gt;Google AI Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlin.ai/"&gt;Kotlin AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/SullyOmarr/status/1893757471799308321"&gt;Vibe coding an AirBnb clone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discuss on &lt;a href="https://bsky.app/profile/fragmentedpodcast.com/post/3lixz6jfqtc2u"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/1ixmh94/rapid_prototyping_with_kotlin_fragmented_256/?utm_source=share&amp;amp;utm_medium=web3x"&gt;Reddit&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=PIIyggbPczE"&gt;Youtube&lt;/a&gt;.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/256/</guid><pubDate>Mon, 24 Feb 2025 20:03:49 -0800</pubDate></item><item><title>255 - Data Oriented Programming</title><link>https://fragmentedpodcast.com/episodes/255/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9bcca143-e2b6-4afb-a7f3-0dce45e31cc1?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/9bcca143-e2b6-4afb-a7f3-0dce45e31cc1/audio/f3ab5d78-6763-4031-a9fa-57d164604420/default_tc.mp3"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we dive into the programming paradigm — Data Oriented Programming (DOP) and why making data the star can simplify your code. Learn how well-modeled data reduces defensive logic, prevents invalid states, and keeps your apps stable. We&amp;rsquo;ll also contrast DOP with Object Oriented Programming (OOP) and Functional Programming (FP), sharing practical examples, tips, and resource links to deepen your understanding.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://fragmentedpodcast.com/episodes/255/"&gt;full shownotes with illustrations are on fragmentedpodcast.com&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[announcement] Fragmented has an &lt;a href="https://buttondown.com/fragmentedcast?tag=podcast"&gt;email newsletter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Programming Paradigms
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Object-oriented_programming"&gt;Object Oriented Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Functional_programming"&gt;Functional Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data-oriented-programming-dop"&gt;
Data Oriented Programming (DOP)
&lt;a class="heading-anchor" href="#data-oriented-programming-dop" aria-label="Link to Data Oriented Programming (DOP)"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;figure &gt;
&lt;div align="center"&gt;
&lt;img src="https://fragmentedpodcast.com/images/uploads/2025/255-dop-1.png"
alt="Bank Transaction - OOP style"
loading="lazy" decoding="async"
/&gt;
&lt;figcaption&gt;
Bank Transaction - OOP style
&lt;/figcaption&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;figure &gt;
&lt;div align="center"&gt;
&lt;img src="https://fragmentedpodcast.com/images/uploads/2025/255-dop-2.png"
alt="Bank Transaction - DOP style"
loading="lazy" decoding="async"
/&gt;
&lt;figcaption&gt;
Bank Transaction - DOP style
&lt;/figcaption&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Universally_unique_identifier"&gt;UUID&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc4122"&gt;RFC 4122&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kotlin &lt;a href="https://www.youtube.com/watch?v=V5EOsE_eJLE"&gt;now&lt;/a&gt; &lt;a href="https://github.com/Kotlin/KEEP/blob/uuid/proposals/stdlib/uuid.md"&gt;includes&lt;/a&gt; &lt;a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.uuid/-uuid/"&gt;UUID&lt;/a&gt; in the standard lib even for kotlin multiplatform.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure &gt;
&lt;div align="center"&gt;
&lt;img src="https://fragmentedpodcast.com/images/uploads/2025/255-dop-3.png"
alt="Network Result api"
loading="lazy" decoding="async"
/&gt;
&lt;figcaption&gt;
Network Result api
&lt;/figcaption&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;figure &gt;
&lt;div align="center"&gt;
&lt;img src="https://fragmentedpodcast.com/images/uploads/2025/255-dop-4.png"
alt="Search or find api"
loading="lazy" decoding="async"
/&gt;
&lt;figcaption&gt;
Search or find api
&lt;/figcaption&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;h2 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Brian Goetz&amp;rsquo;s &lt;a href="https://www.infoq.com/articles/data-oriented-programming-java/"&gt;seminal article&lt;/a&gt; on DOP&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/ixLMO4iPIHo?si=Ikokk9UyXYERGFsJ"&gt;Ties Van de Ven&lt;/a&gt; Advanced Kotlin Dev Day in 2022&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manning.com/books/data-oriented-programming-in-java"&gt;Data Oriented Programming in Java&lt;/a&gt; by Chris Kiehl (by Manning Publications)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=8FRU_aGY4mY"&gt;Devoxx talk by Nicolai Parlog&lt;/a&gt; on youtube&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/255/</guid><pubDate>Tue, 18 Feb 2025 05:36:00 UTC</pubDate></item><item><title>254 - 8× faster 5× memory savings with Dan Rusu’s Immutable Arrays</title><link>https://fragmentedpodcast.com/episodes/254/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a7ad9258-e0f2-4aa6-9db4-a4f7169917d0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/a7ad9258-e0f2-4aa6-9db4-a4f7169917d0/audio/9d96d8bd-e37b-429e-b81d-a388b4615c3d/default_tc.mp3"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, discover how Dan Rusu’s pods4k Immutable Arrays library can deliver 2–8× speed boosts and 5× lower memory usage in Kotlin/Android apps. We first revisit the fundamentals of autoboxing/unboxing and immutability to understand their impact on performance. Then we hear from Dan himself on his library, motiviations for building it, how the benchmarks were calculated and much much more. Our grand finale episode for 2024. Hope you enjoy it!&lt;/p&gt;
&lt;p&gt;Full Shownotes at &lt;a href="https://fragmentedpodcast.com/episodes/254"&gt;https://fragmentedpodcast.com/episodes/254&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/daniel-rusu/pods4k/tree/main/immutable-arrays"&gt;Immutable Arrays on github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/66/"&gt;Immutability episode #66&lt;/a&gt; on Immutability with Ryan Harter&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkov.com/tutorials/java-performance/jmh.html"&gt;JMH&lt;/a&gt; - Java Microbenchmark Harness&lt;/li&gt;
&lt;li&gt;Immutable Arrays &lt;a href="https://github.com/daniel-rusu/pods4k/blob/main/immutable-arrays/BENCHMARKS.md"&gt;Benchmarks page&lt;/a&gt; for Immutable Arrays (pods4k)&lt;/li&gt;
&lt;li&gt;Dan&amp;rsquo;s post - &lt;a href="https://proandroiddev.com/kotlin-avoids-entire-categories-of-java-defects-89f160ba4671"&gt;Kotlin avoids entire categories of Java defects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/k2-compiler-migration-guide.html"&gt;K2 compiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dan Rusu
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://danrusu.com/"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/daniel-rusu/pods4k/discussions"&gt;pods4k github discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discuss on &lt;a href="https://bsky.app/profile/fragmentedpodcast.com/post/3le26qnlg5l2i"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/1hlkulw/8_faster_5_memory_savings_with_dan_rusus/"&gt;Reddit r/androiddev&lt;/a&gt; &lt;a href="https://www.reddit.com/r/Kotlin/comments/1hlbge9/8_faster_5_memory_savings_with_dan_rusus/"&gt;r/kotlin&lt;/a&gt;, &lt;a href="https://youtu.be/aRkZAlBJTcA"&gt;Youtube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Links shared might be affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/254/</guid><pubDate>Tue, 24 Dec 2024 09:00:00 UTC</pubDate></item><item><title>253 - logcat - a new look at logging with Piwai from Square</title><link>https://fragmentedpodcast.com/episodes/253/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f4e36c96-b9d2-4caa-aa7f-55ffddf98ad3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/f4e36c96-b9d2-4caa-aa7f-55ffddf98ad3/audio/b3ff6ab2-29eb-4c00-9e9f-cadb80c781e8/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Kaushik looks at a new logging library from Square called &lt;a href="https://github.com/square/logcat"&gt;logcat&lt;/a&gt;. He starts by seeing how the popular &lt;a href="https://github.com/JakeWharton/timber"&gt;Timber&lt;/a&gt; library does it along with the benefits. He then interviews Pierre-Yves Ricau (Piwai) of Square, the creator of logcat, to explore its origins and advantages.&lt;/p&gt;
&lt;p&gt;You can find the &lt;a href="https://fragmentedpodcast.com/episodes/253"&gt;full shownotes over at fragmentedpodcast.com&lt;/a&gt;.&lt;/p&gt;
&lt;!-- Shownotes: https://fragmentedpodcast.com/episodes/253 --&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/timber"&gt;Timber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/logcat"&gt;logcat&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/logcat?tab=readme-ov-file#motivations"&gt;Motivations in README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/logcat/issues/6"&gt;Compiler plugin issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android?tab=readme-ov-file"&gt;Playground android app demonstrating logcat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitdrift.io/"&gt;bitdrift.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/41qKR0U"&gt;Design of everyday things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/191/"&gt;Previous episode #191 on logging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contact Piwai:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://p-y.wtf/"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bsky.app/profile/p-y.wtf"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;You can find us on a few places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discuss on &lt;a href="https://bsky.app/profile/fragmentedpodcast.com/post/3lcwwkv57rs2o"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/1hbcn5h/logcat_a_new_look_at_logging_with_piwai_from/"&gt;Reddit&lt;/a&gt;
or &lt;a href="https://youtu.be/zQjx0ZI_gCo"&gt;Youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Links shared might be affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/253/</guid><pubDate>Tue, 10 Dec 2024 09:00:00 UTC</pubDate></item><item><title>252 - Everyone needs a starter template</title><link>https://fragmentedpodcast.com/episodes/252/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c81b3f94-53b8-4962-9dfe-4506fb61d9fc?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c81b3f94-53b8-4962-9dfe-4506fb61d9fc/audio/e5a9a560-eea7-4f64-96cf-16e16ac859b6/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Kaushik dives into the importance of creating your own starter template to streamline app development and minimize decision fatigue. He shares insights from his own starter template - &lt;a href="https://github.com/kaushikgopal/playground-android"&gt;Playground Android&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Looking to the future, JetBrains has an exciting tool called &lt;a href="https://blog.jetbrains.com/amper/"&gt;Amper&lt;/a&gt; that might make all of this much easier. Kaushik chats with JetBrains’ &lt;a href="https://bsky.app/profile/zsmb.co"&gt;Márton Braun&lt;/a&gt; about Amper, an exciting new tool that could revolutionize Kotlin &amp;amp; Android project setups.&lt;/p&gt;
&lt;p&gt;Tune in to learn how to go from idea to code with less friction!&lt;/p&gt;
&lt;p&gt;You can find the &lt;a href="https://fragmentedpodcast.com/episodes/252"&gt;full shownotes over at fragmentedpodcast.com&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android"&gt;Playground Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/android/architecture-templates"&gt;The Architecture Templates&lt;/a&gt; (&lt;a href="https://medium.com/androiddevelopers/introducing-the-architecture-templates-3151323e4e34"&gt;blog post&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Inspiration (Other starter templates):
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bloco.io/blog/android-app-starter-update"&gt;Bloco&amp;rsquo;s starter template&lt;/a&gt; &lt;em&gt;what i referenced a lot&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpstartrails.com/android"&gt;Donn&amp;rsquo;s project - Jumpstart Android&lt;/a&gt; &lt;em&gt;if you care about quickly getting a Rails app integrated with Android in a hybrid experience&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/android/nowinandroid"&gt;Now in Android&lt;/a&gt; &lt;em&gt;too much functionality for my taste&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/u2020"&gt;Jake&amp;rsquo;s u2020&lt;/a&gt; &lt;em&gt;for some good times nostalgia&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android"&gt;Playground Android&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;gradle &lt;a href="https://github.com/kaushikgopal/playground-android/blob/master/gradle/libs.versions.toml"&gt;version catalog&lt;/a&gt; - BOM &amp;amp; Bundles (one source of truth)&lt;/li&gt;
&lt;li&gt;&lt;a href="./build-logic/README.md"&gt;sharing build logic&lt;/a&gt; with &lt;a href="https://docs.gradle.org/current/samples/sample_convention_plugins.html"&gt;gradle convention plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android/blob/master/Makefile"&gt;Makefile&lt;/a&gt; with common cli commands&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android/pull/5/files"&gt;Custom lint-rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android/tree/master?tab=readme-ov-file#app-module-diagram-multi-module-setup"&gt;Multi module setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android/pull/12"&gt;dependency injection with kotlin-inject-anvil&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/251/"&gt;Episode 251 - There&amp;rsquo;s a new king in DI town&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/playground-android/pull/9/commits/aad254957a003982633006fb2f350ee7a372f11d"&gt;function-injection&lt;/a&gt; demo in &lt;code&gt;@Composable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/amper/"&gt;Amper&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/logcat"&gt;logcat&lt;/a&gt; lib and injecting &lt;a href="https://github.com/kaushikgopal/playground-android/blob/master/common/log/src/main/java/sh/kau/playground/common/log/CompositeLogger.kt"&gt;multiple loggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;basic networking with &lt;a href="https://ktor.io/docs/client.html"&gt;ktor&lt;/a&gt; &lt;a href="https://github.com/kaushikgopal/playground-android/pull/10/files#diff-61300620752e698467343ba4270127d0cbb3c9e3153bb001ff51102244d2c7b2"&gt;#10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;compose-navigation between feature modules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iurysouza.dev/kotlin-devex-is-not-great-amper-could-fix-it/"&gt;Iury&amp;rsquo;s post on Kotlin Devex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/amper/"&gt;Amper&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/amper/"&gt;blog posts on Amper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://surveys.jetbrains.com/s3/kotlin-slack-sign-up"&gt;Feedback on Amper - kotlinlang slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contact &lt;a href="https://bsky.app/profile/zsmb.co"&gt;Márton Braun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;You can find us on a few places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Links shared might be affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/252/</guid><pubDate>Tue, 26 Nov 2024 09:00:00 UTC</pubDate></item><item><title>251 - There's a new king in DI town</title><link>https://fragmentedpodcast.com/episodes/251/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d08442d5-ae7d-4687-ba4f-f5f2d56bcd52?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/d08442d5-ae7d-4687-ba4f-f5f2d56bcd52/audio/ed095bc6-5981-428a-9ce0-189d3daf55cc/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Kaushik explores the evolution of dependency injection (DI) in Android development. Dagger has been the de-facto solution for DI in Android but there might be a new king in DI-town. He also chats with friend of the show and dependency injection expert Ralf Wondratschek for a final gut check.&lt;/p&gt;
&lt;p&gt;Listen to find out more.&lt;/p&gt;
&lt;!-- Shownotes: https://fragmentedpodcast.com/episodes/251 --&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://square.github.io/dagger/"&gt;Dagger 1&lt;/a&gt; &amp;gt; &lt;a href="https://dagger.dev/"&gt;Dagger 2&lt;/a&gt; &amp;gt; &lt;a href="https://dagger.dev/dev-guide/android.html"&gt;dagger.android&lt;/a&gt; &amp;gt; &lt;a href="https://insert-koin.io/"&gt;Koin&lt;/a&gt; &amp;gt; &lt;a href="https://dagger.dev/hilt/"&gt;Hilt&lt;/a&gt; &amp;gt; &lt;a href="https://github.com/amzn/kotlin-inject-anvil?tab=readme-ov-file"&gt;Anvil&lt;/a&gt; &amp;gt; Manual DI &amp;gt; &lt;a href="https://github.com/evant/kotlin-inject"&gt;kotlin-inject&lt;/a&gt; &amp;gt; &lt;a href="https://github.com/amzn/kotlin-inject-anvil"&gt;kotlin-inject-anvil&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/kotlin-inject"&gt;kotlin-inject&lt;/a&gt; on github
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/amzn/kotlin-inject-anvil"&gt;kotlin-inject-anvil&lt;/a&gt; on github
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/r0adkll/kimchi"&gt;Kimchi&lt;/a&gt; similar alternative to Anvil-izing kotlin-inject&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Using kotlin-inject &lt;a href="https://github.com/evant/kotlin-inject/blob/main/docs/android.md"&gt;in Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kaushik&amp;rsquo;s kotlin-inject-anvil &lt;a href="https://github.com/kaushikgopal/playground-android"&gt;playground app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Contact &lt;a href="https://ralf-wondratschek.com/"&gt;Ralf Wondratschek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact-us"&gt;
Contact us
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discuss on &lt;a href="https://www.reddit.com/r/fragmentedpodcast/comments/1gphdxm/251_theres_a_new_king_in_di_town/"&gt;Reddit&lt;/a&gt;, &lt;a href="https://youtu.be/A_D6zqlGGLE?si=6K3MCBOnAZJnZni1"&gt;Youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Links shared might be affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/251/</guid><pubDate>Tue, 12 Nov 2024 09:00:00 UTC</pubDate></item><item><title>250 - Bittersweet beginnings</title><link>https://fragmentedpodcast.com/episodes/250/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6334f44e-ba1e-4176-9996-003c36525191?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/6334f44e-ba1e-4176-9996-003c36525191/audio/f46e45eb-01df-43f4-a444-4222bbcbeb95/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re back from the hiatus with our SemiQuicentennial episode! With the momentous 250 comes some big announcements and a shift in the way we do things.&lt;/p&gt;
&lt;p&gt;Listen to find out the details!&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/1flhweh/is_android_broken_or_am_i_out_of_touch/"&gt;Is Android broken or am I out of touch? (Reddit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://knurlfitness.com/"&gt;Knurl - Donn&amp;rsquo;s fitness timer app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;You can find us on a few places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/contact"&gt;Contact us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@fragmentedpodcast"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn"&gt;
Donn
&lt;a class="heading-anchor" href="#donn" aria-label="Link to Donn"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Donn&amp;rsquo;s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://donnfelker.com/"&gt;Donn&amp;rsquo;s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/contact"&gt;kau.sh&lt;/a&gt; (links to everything)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threads.kau.sh"&gt;Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bluesky.kau.sh"&gt;Bluesky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh"&gt;Youtube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.kau.sh"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Links shared might be affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/250/</guid><pubDate>Tue, 29 Oct 2024 09:00:00 UTC</pubDate></item><item><title>249 – Java and the JDK: Powering the Android Landscape with Michael Bailey</title><link>https://fragmentedpodcast.com/episodes/249-java-and-the-jdk-powering-the-android-landscape-with-michael-bailey/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c763ebae-3eb3-47f4-aa35-f4c4d0a2a30f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c763ebae-3eb3-47f4-aa35-f4c4d0a2a30f/audio/0e9f5ec5-9869-46f9-a3b1-765bf29ff246/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of our podcast, we explore the diverse landscape of Java versions within the Android ecosystem. Our guest is Michael Bailey, a seasoned Java expert who has been a frequent presence on our show since the early days of our podcast. We kick off with a solid foundation, discussing the differences between JDK and JRE, as well as the distinctions between the available Java JDKs. We also guide listeners through Android Studio settings, exploring how to select a suitable JDK, its utilization, and how it relates to JAVA_VERSION on one’s home path/terminal.&lt;/p&gt;
&lt;p&gt;As we dig deeper, we start to unpack some of the crucial Android app settings. From compileOptions to sourceCompatibility/targetCompatibility, we shed light on why these versions are important. We also demystify the compileSdk vs minSdk vs targetSdk, and how they interconnect. Drawing from Kaushiks’s recent experience in building a new app, we provide real-life examples that can better clarify these topics for our listeners.&lt;/p&gt;
&lt;p&gt;We conclude the episode by providing some valuable resources for further understanding and exploration. This episode is designed to be a comprehensive guide to understanding and navigating the intricacies of Java versions in Android development.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/9/"&gt;Michaely Fragmented Episode 9 (Google IO Special)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/10/"&gt;Fragmented Episode 10 (core java)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/78/"&gt;Fragmented Episode 78 (testing strategies)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openjdk/jdk"&gt;OpenJDK on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://foojay.io/"&gt;FooJay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/tools/gradle-api/7.2/com/android/build/api/dsl/CompileOptions"&gt;Compile Options Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/sdk-extensions"&gt;SDK extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://file+.vscode-resource.vscode-cdn.net/Users/donnfelker/Library/CloudStorage/Dropbox/2%20Areas/Fragmented-Shared/2_Areas/episodes/1_Recorded/249-bailey/..."&gt;@Yogurtearl explanation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jpackage.org/"&gt;Jpackage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find Michael Online&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/yogurtearl"&gt;@yogurtearl on Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO 🎉&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; on Twitter or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our YouTube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donn&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Donn’s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://donnfelker.com/"&gt;Donn’s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaushik&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;kau.sh&lt;/a&gt; (has links to all my networks)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;twitter.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.kau.sh/"&gt;mastodon.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh/"&gt;youtube.kau.sh&lt;/a&gt; (on YouTube)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/249-java-and-the-jdk-powering-the-android-landscape-with-michael-bailey/</guid><pubDate>Mon, 10 Jul 2023 10:45:00 UTC</pubDate></item><item><title>248 – Feature Flags &amp; A/B Testing: A Deep Dive with Ishan Khanna</title><link>https://fragmentedpodcast.com/episodes/248-feature-flags-a-b-testing-a-deep-dive-with-ishan-khanna/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f27a36f8-4b2c-45a5-b35f-12ec055a9579?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/f27a36f8-4b2c-45a5-b35f-12ec055a9579/audio/04a9e235-0e68-4f53-b312-5cdde4af09dc/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this edition of Fragmented, we’re thrilled to host Ishan Khanna, a software engineer at Tinder who possesses great enthusiasm for feature flags and A/B testing. Donn discusses why he invited Ishan on the show, highlighting Ishan’s passion for feature flagging and A/B testing. The conversation kicks off with an insightful story from Ishan about feature flagging at Booking.com, leading to a discussion on the difference between A/B Testing and Feature Flags, when and why to introduce feature flagging, and how to measure its effectiveness. The show also focuses on the benefits and risks of feature flagging, along with ways to manage potential complexities in the codebase.&lt;/p&gt;
&lt;p&gt;We then delve deeper into the topic of feature flagging, covering how to get started, what to look for in a tool, and the role of testing. Discussion points include the best practices for rollout percentages, considerations for multi-platform implementation, and the specifics of targeting in feature flagging. The conversation wraps up with an exploration of available tools for those looking to introduce feature flagging or A/B testing frameworks into their operations, examining when it might be necessary to build a bespoke solution.&lt;/p&gt;
&lt;p&gt;The episode offers a wealth of resources for listeners, including links to an array of feature flagging and A/B testing tools, such as Firebase Remote Config, Optimizely, and LaunchDarkly. For more insight into the topics discussed, Ishan recommends his Droidcon Berlin talk on ‘Customer Driven Development’ and Stuart Frisby’s talk on A/B Testing. To reach out to Ishan, listeners can contact him via Twitter, LinkedIn, or his website.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Here are the links mentioned in the document, in markdown format:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/products/remote-config"&gt;Firebase Remote Config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.optimizely.com/"&gt;Optimizely&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://launchdarkly.com/"&gt;LaunchDarkly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/mt/using-aws-appconfig-feature-flags/"&gt;AWS AppConfig for Feature Flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vwo.com/"&gt;VWO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getunleash.io/"&gt;Unleash – Open Source Feature Flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://posthog.com/"&gt;Posthog Feature Flags and A/B Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.droidcon.com/2019/07/03/customer-driven-development-what-why-how/"&gt;Ishan’s Droidcon Berlin Talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=VQpQ0YHSfqM"&gt;Stuart Frisby’s Talk on A/B Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erindoesthings.com/"&gt;Erindoesthings&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="contact-ishan"&gt;
Contact Ishan
&lt;a class="heading-anchor" href="#contact-ishan" aria-label="Link to Contact Ishan"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://twitter.com/droidchef"&gt;Ishan on Twitter – @droidchef&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/droidchef/"&gt;Ishan on LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.droidchef.dev/"&gt;Ishan’s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO 🎉&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; on Twitter or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our YouTube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donn&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Donn’s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://donnfelker.com/"&gt;Donn’s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaushik&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;kau.sh&lt;/a&gt; (has links to all my networks)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;twitter.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.kau.sh/"&gt;mastodon.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh/"&gt;youtube.kau.sh&lt;/a&gt; (on YouTube)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/248-feature-flags-a-b-testing-a-deep-dive-with-ishan-khanna/</guid><pubDate>Mon, 26 Jun 2023 05:00:00 UTC</pubDate></item><item><title>247: The Art of App Modularization with Siggi Jonsson</title><link>https://fragmentedpodcast.com/episodes/247-the-art-of-app-modularization-with-siggi-jonsson/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/826d28dd-aad2-4f86-99ff-ac1957ed7b66?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/826d28dd-aad2-4f86-99ff-ac1957ed7b66/audio/cbb50aab-67b4-4730-b6cf-da9e26509a13/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to, Siggi Jonsson. Siggi helps guide us through the complex and often confusing world of Android app modularization. Our conversation will begin by shedding light on the importance of modularization, what triggers the need for breaking projects into multiple modules, and how modularization relates to team size, feature teams, and code ownership. This discussion is aimed at demystifying how and why developers often choose to modularize their applications.&lt;/p&gt;
&lt;p&gt;As we move forward, we’ll dive into more advanced aspects of modularization, such as the challenges of scaling and the potential missteps in over-modularization. Drawing on real-world experiences, we’ll examine the red flags that signal a need for revising your modularization strategy. This part of our discussion will also highlight some specific tools and techniques that can help manage and visualize your project’s modularization, and Siggi will share his own experiences and insights into how these tools have assisted in his modularization strategy.&lt;/p&gt;
&lt;p&gt;In the final part of the episode, we’ll touch on the benefits and strategies of proper modularization. Siggi will share practical advice on how to tackle big projects, fix issues with modularization, and make a smooth transition from monolithic to modular structures. We’ll also talk about some tools that can be handy in this process. Before closing, Siggi will offer his top tips for developers embarking on their modularization journey and share some valuable resources to help them. Siggi will also provide updates on his latest work and how listeners can reach out to him.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Sure, here are the links provided in the text, formatted in Markdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.droidcon.com/2022/06/28/solid-modularization-untangling-the-dependency-graph/"&gt;Siggi Jonsson’s Droidcon Talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jraska/modules-graph-assert"&gt;Graph Assert Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin"&gt;Dependency Analysis Android Gradle Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/siggijons/graph-untangler-plugin"&gt;Graph Untangler Plugin by Siggi Jonsson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphviz.org/"&gt;GraphViz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gephi.org/"&gt;Gephi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=k4H20WxhbsA"&gt;Driving architectural improvements with dependency metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/inyaki_mwc"&gt;Inaki Villar Twitter – Build Engineer Siggi Mentioned&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find Siggi online here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/siggijons"&gt;Siggi Jonsson on Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/siggijons"&gt;Siggi Jonsson on Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.siggijons.net/"&gt;Siggi Jonsson’s Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/siggijons/"&gt;Siggi Jonsson on LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livekindred.com/"&gt;Kindred&lt;/a&gt; – Use code SIG.JON to register.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course, you’ll learn everything you need to know to start working with Git daily. &lt;a href="https://www.donnfelker.com/git/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO 🎉&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; on Twitter or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our YouTube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donn&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Donn’s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://donnfelker.com/"&gt;Donn’s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaushik&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;kau.sh&lt;/a&gt; (has links to all my networks)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;twitter.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.kau.sh/"&gt;mastodon.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh/"&gt;youtube.kau.sh&lt;/a&gt; (on YouTube)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/247-the-art-of-app-modularization-with-siggi-jonsson/</guid><pubDate>Mon, 12 Jun 2023 05:00:00 UTC</pubDate></item><item><title>246 – Dependency Injection: Kotlin Inject with Fred Porciúncula</title><link>https://fragmentedpodcast.com/episodes/246-dependency-injection-kotlin-inject-with-fred-porciuncula/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/7c168db3-00e0-47ce-ae1c-1b7afc19f7d3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/7c168db3-00e0-47ce-ae1c-1b7afc19f7d3/audio/29e0f235-5960-4554-a3c7-e1c41f854675/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this podcast episode, we have the pleasure to host Fred Porciúncula, a Google Developer Expert (GDE) known for his work with Kotlin Inject and his invaluable contributions to the Android development community. Fred offers his expertise on Dependency Injection (DI), Kotlin Multiplatform (KMP), and how they intersect.&lt;/p&gt;
&lt;p&gt;We kick off the conversation by discussing Dependency Injection (DI), its importance, and the options available to developers, including Dagger, Hilt, Anvil, Koin, and Kotlin-Inject. Fred explains the use and impact of DI in the Kotlin Multiplatform (KMP) world, considering Dagger’s current lack of KMP support and debating whether one should use separate DI tools for Android apps and KMP components.&lt;/p&gt;
&lt;p&gt;Delving further into Kotlin-Inject, we explore its features, usage, and how it differentiates itself from other DI solutions. Topics discussed include its unique handling of Scopes, its support of constructor injection, and its utility in building dependency graphs. Furthermore, we examine the timeless debate of Dependency Injection versus Service Locator.&lt;/p&gt;
&lt;p&gt;Toward the end of the episode, Fred presents his thoughts on the advantages and disadvantages of exclusively using Kotlin-Inject throughout an application. We also tackle the concept of “Vanilla Injection” – refraining from using DI libraries at all.&lt;/p&gt;
&lt;p&gt;For further learning, we recommend resources like Fred’s insightful article on transitioning from Dagger/Hilt to Kotlin-Inject, a Dagger issue discussing KSP support, and a Kotlin-Inject discussion on Anvil-like features. Links to these resources, among others, are provided below. Don’t miss out on this engaging and informative episode with Fred Porciúncula!&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/kotlin-inject"&gt;Kotlin Inject Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://proandroiddev.com/from-dagger-hilt-into-the-multiplatform-world-with-kotlin-inject-647d8e3bddd5"&gt;Fred’s Kotlin Inject Article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/kotlin-inject/blob/main/docs/testing.md"&gt;Testing with Kotlin Inject&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/kotlin-inject/issues/187"&gt;Kotlin Inject Scope Issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/kotlin-inject/blob/main/docs/android.md#pull-code-out-of-the-platform-class"&gt;Pulling code out of the platform class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/cs/dependency-injection-vs-service-locator#:~:text=The%20Dependency%20Injection%20is%20explicit,depend%20on%20the%20Service%20Locator"&gt;DI vs Service Locators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/dagger/issues/2349"&gt;Dagger KSP Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/kotlin-inject/issues/212"&gt;Kotlin Inject Anvil Like Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/CIZU_NNAZsA?t=3439"&gt;Making Your Android Application Work on iOS (Touchlab mentioning interfaces over expect)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/icerockdev/moko-resources"&gt;Moko Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://klima.hashnode.dev/"&gt;Klima Engineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find Fred Online Here&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/tfcporciuncula"&gt;Twitter – @tfcporciuncula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androiddev.social/@fred"&gt;androiddev.social/@fred&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://klima.hashnode.dev/"&gt;Klima Engineering Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO 🎉&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/?utm_campaign=fragmented&amp;amp;utm_source=podcast_notes&amp;amp;utm_medium=textlink"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; on Twitter or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our YouTube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donn&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Donn’s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://donnfelker.com/"&gt;Donn’s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaushik&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;kau.sh&lt;/a&gt; (has links to all my networks)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;twitter.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.kau.sh/"&gt;mastodon.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://youtube.kau.sh/"&gt;youtube.kau.sh&lt;/a&gt; (on YouTube)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/246-dependency-injection-kotlin-inject-with-fred-porciuncula/</guid><pubDate>Mon, 29 May 2023 05:00:00 UTC</pubDate></item><item><title>245: Treehouse, Redwood and Zipline with Colin White</title><link>https://fragmentedpodcast.com/episodes/245-treehouse-redwood-and-zipline-with-colin-white/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/349bd9af-af59-4d52-9549-73b633192262?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/349bd9af-af59-4d52-9549-73b633192262/audio/4dccbcdc-2138-4e33-8673-d33f2ac4b5a0/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk to an old friend of the show, Colin White, about Treehouse, a combination of the Redwood and Zipline libraries.&lt;/p&gt;
&lt;p&gt;Colin is a Staff Engineer at Cash App (Block).&lt;/p&gt;
&lt;p&gt;Redwood is a multiplatform Compose library that allows you to target multiple UI toolkits on various native platforms. Ultimately this allows you to share presentation logic.&lt;/p&gt;
&lt;p&gt;Zipline is a multiplatform JavaScript engine for Android, iOS, and the JVM, which uses Kotlin for calls in/out of the JavaScript land. This allows you to update the application logic of your apps without the traditional song and dance of the app store approval and release process.&lt;/p&gt;
&lt;p&gt;Treehouse is the combination of both libraries, Redwood and Zipline. Listen in to learn more …&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cashapp/redwood"&gt;Redwood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cashapp/zipline"&gt;Zipline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bellard.org/quickjs/"&gt;QuickJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=G4LK_euTadU"&gt;Kotlin Conf Talk on Treehouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jakewharton.com/native-ui-with-multiplatform-compose/"&gt;Droicon NY talk – Redwood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.droidcon.com/2022/09/29/dynamic-code-with-zipline/"&gt;Droidcon NY talk – Zipline&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="find-colin-online-here"&gt;
Find Colin Online here
&lt;a class="heading-anchor" href="#find-colin-online-here" aria-label="Link to Find Colin Online here"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/colinwhi"&gt;Twitter – @colinwhi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androiddev.social/@colin"&gt;Mastodon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO!&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; on Twitter or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donn&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker (Instagram)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Donn’s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://donnfelker.com/"&gt;Donn’s Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaushik&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/"&gt;kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mastodon.kau.sh/"&gt;mastodon.kau.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://y.kau.sh/"&gt;kaushikgopal – YouTube&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/245-treehouse-redwood-and-zipline-with-colin-white/</guid><pubDate>Mon, 15 May 2023 05:00:00 UTC</pubDate></item><item><title>244: Reviving Our Passion for Android Development</title><link>https://fragmentedpodcast.com/episodes/244/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/bc0a1eb9-a4bc-43a1-9e63-d9499346c775?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/bc0a1eb9-a4bc-43a1-9e63-d9499346c775/audio/cf89cb1a-5747-4cce-ba77-759691a52083/default_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik announce that they are steering the podcast back into Android waters. In other words, the Fragmented Podcast is returning to its roots … we’re back to being a 100% Android Development focused show.&lt;/p&gt;
&lt;p&gt;We’re glad to have you as a listener, here’s to the future of Android Development. 🚀&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO 🎉&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or our Youtube channel&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and donnfelker (on Instagram)&lt;/li&gt;
&lt;li&gt;[kaushikgopal] (on YouTube) or &lt;a href="https://kau.sh/blog"&gt;kau.sh/blog&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/244/</guid><pubDate>Wed, 10 May 2023 18:36:09 UTC</pubDate></item><item><title>243: Mastering the Art of Switching Careers in Tech with Dan Lew</title><link>https://fragmentedpodcast.com/episodes/243/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/476bb5e5-6029-4c91-bd1b-7317d48e2ca2?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/476bb5e5-6029-4c91-bd1b-7317d48e2ca2/audio/e317db83-2238-46f1-8617-f8fad0bd6a92/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk to long-time friend Dan Lew about his recent career switch from Android developer to TypeScript/Node.js/Progressive Web App Developer (and more).&lt;/p&gt;
&lt;p&gt;It’s an interesting discussion that covers …&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why Dan decided to leave the Android world&lt;/li&gt;
&lt;li&gt;The challenges he faced when he moved from one tech stack to another&lt;/li&gt;
&lt;li&gt;How to prepare for a big change like this (mentally, financially, etc.)&lt;/li&gt;
&lt;li&gt;How to create the life you want live vi by identifying what’s important to you&lt;/li&gt;
&lt;li&gt;and much more …&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rheaply.com/"&gt;Rheaply&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course, you’ll learn everything you need to know to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs every week as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.kau.sh/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://kau.sh/blog/"&gt;kau.sh/blog&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/243/</guid><pubDate>Mon, 10 Apr 2023 01:00:00 UTC</pubDate></item><item><title>242 – Kotlin Code Formatting with ktfmt and spotless</title><link>https://fragmentedpodcast.com/episodes/242/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f7e8b5bc-8872-49e2-94f6-cf354591449b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/f7e8b5bc-8872-49e2-94f6-cf354591449b/audio/98e95abc-7a69-4687-8847-af97139422ba/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about one of the age old bike shedding topics – code formatting, and how you can solve it with automation and tools.&lt;/p&gt;
&lt;p&gt;Code formatting can turn into an endless debate amongst peers and teams, and what Kaushik and Donn have found is that this can be delegated to a tool and automated. Freeing you and your team of having to worry about proper indentation, bracket placement, etc. By relying on a well defined tool and some automation you can clean your code up, make it much more uniform and easier maintain.&lt;/p&gt;
&lt;p&gt;We talk about ktfmt, a Kotlin code formatter that was released by Facebook. We dive into ktlint, detekt and more. We also dive into spotless which can help you by integrating ktfmt into your gradle build pipeline.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ktfmt – &lt;a href="https://facebook.github.io/ktfmt/"&gt;website&lt;/a&gt;, &lt;a href="https://github.com/facebook/ktfmt"&gt;github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;spotless – &lt;a href="https://github.com/diffplug/spotless"&gt;github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;detekt – &lt;a href="https://detekt.dev/"&gt;website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ktlint – &lt;a href="https://pinterest.github.io/ktlint/"&gt;website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.kau.sh/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://kau.sh/blog/"&gt;kau.sh/blog&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/242/</guid><pubDate>Mon, 20 Mar 2023 01:00:00 UTC</pubDate></item><item><title>241: The Pressure to Ship. Fear, Uncertainty and Doubt</title><link>https://fragmentedpodcast.com/episodes/241/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/60e26fb1-acf3-42e9-88a1-12f63c5004e3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/60e26fb1-acf3-42e9-88a1-12f63c5004e3/audio/e7b6d3f8-61fb-43ca-ba9c-15ebe9c9e166/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about the fear of shipping, some impostor syndrome and how it contributes to uncertainty and doubt in your capabilities as a software developer.&lt;/p&gt;
&lt;p&gt;Recently Donn embarked on a mission to come up with an idea and ship it within 24 hours (which he did do). The end result was a net benefit of confidence, speed and skill acquisition. This helped reduce any doubt, uncertainty and ultimately fear of shipping a product faster.&lt;/p&gt;
&lt;p&gt;That’s what this conversation is about … how to doing a project like the 24 hour MVP can remove fear, uncertainty and doubt and help you ship your side project/products faster.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://exifr.com/"&gt;Donn’s 24 Hour Project – EXIFR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpstartrails.com/"&gt;Jumpstart Rails Template that Donn Used&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.books-ai.app/"&gt;Books-AI App&lt;/a&gt; by &lt;a href="https://twitter.com/flo_walther"&gt;Florian Walther&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/"&gt;Open AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.kau.sh/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://kau.sh/blog/"&gt;kau.sh/blog&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/241/</guid><pubDate>Tue, 10 Jan 2023 08:30:00 UTC</pubDate></item><item><title>240: Important Kotlin Constructs</title><link>https://fragmentedpodcast.com/episodes/240/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/36f2a3e2-6b0b-4996-89f2-afc9223bf731?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/36f2a3e2-6b0b-4996-89f2-afc9223bf731/audio/b797d487-587e-4d99-afa5-a2c460743203/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about 5 new-ish Kotlin constructs that you might not be aware of.&lt;/p&gt;
&lt;p&gt;The constructs that they talk about are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;fun interface (SAM – Single Abstract Method), and they juxtapose them vs function types&lt;/li&gt;
&lt;li&gt;type alias&lt;/li&gt;
&lt;li&gt;import alias&lt;/li&gt;
&lt;li&gt;value class&lt;/li&gt;
&lt;li&gt;data object&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You’ll learn what they are, how you can use them and when or when you might not want to use them, and more. We hope you enjoy.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kau.sh/blog/important-kotlin-constructs/"&gt;Kaushik’s Blog Post – Important Kotlin Constructs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/fun-interfaces.html"&gt;SAM Interface – Kotlin Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/lambdas.html#function-types"&gt;Function Types – Kotlin Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/type-aliases.html"&gt;Type Aliases – Kotlin Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/packages.html#imports"&gt;Import Alias – Kotlin Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/KEEP/blob/master/notes/value-classes.md"&gt;Value Class – KEEP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/KEEP/pull/316/files"&gt;Data Object – KEEP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/240/</guid><pubDate>Thu, 15 Dec 2022 00:00:00 UTC</pubDate></item><item><title>239: Require PR Reviews with CODEOWNERS</title><link>https://fragmentedpodcast.com/episodes/239/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a8950c84-3830-4dcb-8047-bd7ac338860b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/a8950c84-3830-4dcb-8047-bd7ac338860b/audio/6c1ae7bd-90b1-41da-bdce-a538b39ebd26/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this short episode, Donn talks about the CODEOWNERS file and how it can help you ensure teams review the code that they are responsible for before merging.&lt;/p&gt;
&lt;p&gt;The CODEOWNERS file is a file that you drop into the root of your project (or into the /docs or .github/ directory) that tells GitHub (or whatever git host you’re using) to require a review for any code changes that match the patterns as defined in the CODEOWNERS file. You’ll specify a matching pattern and users, or teams that own that pattern of files and they will be required to review the PR before it can be merged. This helps prevent unwanted changes to files that may or may not be owned by one team or another. This is useful as teams grow larger and need more control over the changes in their application codebase.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners"&gt;CODEOWNERS GitHub Doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/12/"&gt;Episode 012 – CI and Collective Code Ownership&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/organizations/organizing-members-into-teams/about-teams"&gt;GitHub Organization Teams&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/239/</guid><pubDate>Mon, 28 Nov 2022 11:00:00 UTC</pubDate></item><item><title>238: How to Land a Job (if you got laid off or if you’re just starting out)</title><link>https://fragmentedpodcast.com/episodes/238/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1a86efc0-ed64-49e2-904f-026f83321c1e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/1a86efc0-ed64-49e2-904f-026f83321c1e/audio/e4db4d61-e751-4305-bf6a-6ac9f3a30b53/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about the tips and tricks he’s used over the last 20 years of consulting, freelancing and working full time to find jobs and new opporftunities. We’re hoping some of these tips help those affected by the recent tech layoffs.&lt;/p&gt;
&lt;p&gt;These are tips that Donn still uses to this day. They work wonders to help you land a job quickly when you do them.&lt;/p&gt;
&lt;p&gt;The tips:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Update your LinkedIn Profile and Build a Resume with the LinkedIn Resume Builder&lt;/li&gt;
&lt;li&gt;Set your LinkedIn status to “Open to Work” via the “Open to Work” feature on LinkedIn&lt;/li&gt;
&lt;li&gt;Directly Reach out to Recruiters you know or have interacted with&lt;/li&gt;
&lt;li&gt;Manual Discovery: Visit various companies career pages and job board and apply directly&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ancillary Tips to Boost Your Chances of Landing a Job:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Blog about the technology you’re looking to get a job in&lt;/li&gt;
&lt;li&gt;Create a demo app or an app you can use to showcase your talents and put it on GitHub&lt;/li&gt;
&lt;li&gt;Record a How To Video and post it to YouTube showing how to do something, such as a tutorial&lt;/li&gt;
&lt;li&gt;Record/Start a podcast or reach out to hosts of other podcasts and offer to share some deep knowledge you have, or even talk about soft skills, etc&lt;/li&gt;
&lt;li&gt;Speak at local user groups or conferences (where you don’t need to worry about travel and costs, just show up and speak)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/help/linkedin/answer/a507508/let-recruiters-know-you-re-open-to-work?lang=en"&gt;LinkedIn Open to Work Feature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/help/linkedin/answer/a551182/linkedin-resume-builder?lang=en"&gt;LinkedIn Resume Builder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;Android Jobs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/238/</guid><pubDate>Mon, 21 Nov 2022 00:00:00 UTC</pubDate></item><item><title>237: Compose vs XML – Which one should you learn as an Android Dev?</title><link>https://fragmentedpodcast.com/episodes/237/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/ebb47ada-582d-4eea-b362-a4873145832f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/ebb47ada-582d-4eea-b362-a4873145832f/audio/42f088ca-461f-4dc1-837e-046f0fd614b6/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about their thoughts on Jetpack Compose and XML for Android layouts and which one you should learn first.&lt;/p&gt;
&lt;p&gt;As with every conversation in tech … it depends on what you’re trying to do, where you are at in your career, what the company is doing and more. Donn and Kaushik go into both of their thought processes around Compose and XML and when you should learn one or the other, or even both and whether Jetpack is the future … or is XML here to stay?&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tuthub.io/"&gt;TutHub.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/codinginflow"&gt;Coding in Flow YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=cDabx3SjuOY&amp;amp;list=PLQkwcJG4YTCSpJ2NLhDTHhi6XBNfk9WiC"&gt;Philip Lackner’s Compose Playlist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/231/"&gt;Episode 231: Learning Jetpack Compose with Vinay Gaba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/172/"&gt;Episode 171: Jetpack Compose with Leland Richardson from Google&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO. Post your Android Job and get it in front of thousands of Android pros.&lt;/li&gt;
&lt;li&gt;Are you an Android Dev? Sign up to get notified of new jobs on a weekly basis.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io/"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg/"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/237/</guid><pubDate>Mon, 14 Nov 2022 12:00:00 UTC</pubDate></item><item><title>236: A Terminal for Android?</title><link>https://fragmentedpodcast.com/episodes/236/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/aa34ab69-8cad-424b-987e-48487297f203?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/aa34ab69-8cad-424b-987e-48487297f203/audio/230e242f-dad4-492a-b0b4-b5015ce5543d/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about the thought of having a terminal for Android.&lt;/p&gt;
&lt;p&gt;Have you ever wished you could whip up a quick script to get the current location of a device, add it to cron and do some automated tasks on your phone? Wouldn’t it be nice to have low level access to your system like you do on your desktop?&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik dive into the details of what that might look like and why they find it intriguing.&lt;/p&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/236/</guid><pubDate>Tue, 25 Oct 2022 09:00:00 UTC</pubDate></item><item><title>235: Pair programming with Ben Orenstein &amp; Tuple</title><link>https://fragmentedpodcast.com/episodes/235/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/7031dbf6-0b33-4c41-ab91-c89ffc7cfd36?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/7031dbf6-0b33-4c41-ab91-c89ffc7cfd36/audio/88518df9-5707-4c56-b0c8-48222f20d721/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Kaushik goes solo and interviews Ben Orenstein. Ben is a prolific Ruby developer, an amazing conference speaker, an ardent vim-ster, and now the CEO of Tuple.&lt;/p&gt;
&lt;p&gt;Kaushik has been a big fan of Ben’s work and was super stoked to talk to Ben and pick his brains on a host of topics: starting the company Tuple, pair programming in general, learning different programming languages and technology, giving better conference talks and more!&lt;/p&gt;
&lt;p&gt;This episode is chock full of wisdom from Ben. Enjoy!&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/"&gt;Pragmatic Programmer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/status/1291202657856573440?s=20&amp;amp;t=oFtM2aVNMagWPgPpmptqhQ"&gt;Tweet: Best Android Studio Pair Programming Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learntopair.com/"&gt;learntopair.com – Tuple’s Pair programming guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sfhbook.netlify.app/"&gt;Speaking for Hackers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tuple.app/oss/"&gt;Tuple App – OSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ben’s talks:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=DC-pQPq0acs"&gt;Refactoring from Good to Great by Ben Orenstein&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=C4WOfEyogo8&amp;amp;t=1922s"&gt;Idea to Validation to Launch – Microconf 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=SkdrYWhh-8s"&gt;Write code faster: expert-level vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Ben is &lt;a href="https://twitter.com/r00k"&gt;@r00k&lt;/a&gt; listen to &lt;a href="https://artofproductpodcast.com/"&gt;his podcast – The Art of Product&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Follow &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kau.sh/blog/"&gt;kau.sh’s blog&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; (on Twitter)&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/235/</guid><pubDate>Tue, 20 Sep 2022 20:00:00 UTC</pubDate></item><item><title>234: More Product. Less Architecture?</title><link>https://fragmentedpodcast.com/episodes/234/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c33a02b1-39cb-42ee-b89c-8c28780dc6b5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c33a02b1-39cb-42ee-b89c-8c28780dc6b5/audio/7dfb8557-9eff-4025-a7f7-47f71c6890f4/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about how many Android applications seem to suffer from the disease of over-architecture while neglecting the product (UI/UX) itself. They discuss why this is deterimental to the user experience in the Android platform and how they’ve seen it evolve over the years. They attempt to provide some thoughful ideas on how this can be rectified in the future and more.&lt;/p&gt;
&lt;p&gt;We’re looking for your feedback on this show. What are your favorite product apps that are just a joy to use on Android? Let us know on Twitter at &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/234/</guid><pubDate>Mon, 08 Aug 2022 01:00:00 UTC</pubDate></item><item><title>233: UI Screenshot Testing with Paparazzi and John Rodriguez</title><link>https://fragmentedpodcast.com/episodes/233/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/921f5263-fd0b-41af-b982-0159860c30ad?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/921f5263-fd0b-41af-b982-0159860c30ad/audio/876699b9-0075-488a-8989-06bdef1c692f/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk to John Rodriguez (jrod) about the &lt;a href="https://cashapp.github.io/paparazzi/"&gt;Paparazzi&lt;/a&gt; library which allows you to perform UI screenshot testing on Android without emulators or physical devices.&lt;/p&gt;
&lt;p&gt;They talk to John about what screenshot testing is, why it’s important, advantages and it’s disadvantages as well. You’ll learn how to use Paparazzi and how it can test various different screen configurations without having to run an emulator. You read that correct … without an emulator.&lt;/p&gt;
&lt;p&gt;If you’re looking to incorporate screenshot testing into your app, this is the episode for you.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cashapp.github.io/paparazzi/"&gt;Paparazzi Project website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cashapp/paparazzi"&gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jrodbx"&gt;John’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cashapp"&gt;Cashapp GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/TestParameterInjector"&gt;TestParameterInjector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/052/"&gt;Fragmented Episode 52&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/233/</guid><pubDate>Wed, 29 Jun 2022 08:00:00 UTC</pubDate></item><item><title>232: Frustration, Flow State and “The Madness”</title><link>https://fragmentedpodcast.com/episodes/232/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/679ce3c1-ea7a-4286-86fa-b705f9d75910?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/679ce3c1-ea7a-4286-86fa-b705f9d75910/audio/9396a030-28b4-475d-b627-f9f623e1fd6e/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik talk about frustration, finding “flow state” and how it’s known as “the madness” and how to deal with it.&lt;/p&gt;
&lt;p&gt;We originally were going to talk about an other topic, but during the off air banter Donn brought up how he was frustrated with losing/burning so much time on a task that he had for his side project. He only meant to spend a little bit of time on it and then spent WAY more time than he meant to. He got to the point where he had to stop working on the project, yell at himself for not time boxing it and then he had to refocus. This piqued Kaushik’s interest and they decided to hit record to talk about this topic as its something they both deal with and have also hear many other developers deal with too. &lt;/p&gt;
&lt;p&gt;The “Madness” is when you get consumed by your work and you’re so passionate that you lose track of time, eating and more. You’ve become consumed … you have “The Madness”. This happens to all developers, and Donn and Kaushik talk about how to not let this derail your day when you have other responsibilities as well as life and work. We hope you enjoy today’s off the cuff developer discussion.&lt;/p&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/232/</guid><pubDate>Mon, 13 Jun 2022 01:00:00 UTC</pubDate></item><item><title>231: Learning Jetpack Compose with Vinay Gaba</title><link>https://fragmentedpodcast.com/episodes/231/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/13676b56-e3b0-4037-aa02-c5577e0fc037?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/13676b56-e3b0-4037-aa02-c5577e0fc037/audio/c7481697-43df-429b-80ec-2699d50af4b4/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk to Android GDE &lt;a href="https://twitter.com/vinaygaba"&gt;Vinay Gaba&lt;/a&gt; about learning Jetpack Compose.&lt;/p&gt;
&lt;p&gt;They talk about how to learn how to use Jetpack Compose by example (and &lt;a href="https://www.youtube.com/watch?v=33W2_fxq5mk"&gt;Vinay’s excellent talk by the same name&lt;/a&gt;). How to use &lt;a href="https://www.jetpackcompose.app/"&gt;Jetpackcompose.app&lt;/a&gt; to help you find the right Jetpack Compose component and how to use &lt;a href="https://medium.com/airbnb-engineering/introducing-showkase-a-library-to-organize-discover-and-visualize-your-jetpack-compose-elements-d5c34ef01095"&gt;ShowKase&lt;/a&gt; to organize discover and visualize your Jetpack Compose Elements. &lt;/p&gt;
&lt;p&gt;We then dive into why someone might want to learn Jetpack Compose and how to start learning it. They touch briefly on the parts of Compose, such as the compiler, runtime, UI, foundation, and more. They wrap up by talking about Unidirectional State flow and by answering the hot question … “Is Jetpack Compose ready for production?” &lt;/p&gt;
&lt;p&gt;If you’re looking to learn more about Jetpack Compose, this is an episode for you. &lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/vinaygaba"&gt;Vinay’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=33W2_fxq5mk"&gt;Vinays Learning Jetpack Compose by Example Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetpackcompose.app/"&gt;JetpackCompose.app (find the Jetpack Compose component you’re looking for by typing in the XML equivalent)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/airbnb-engineering/introducing-showkase-a-library-to-organize-discover-and-visualize-your-jetpack-compose-elements-d5c34ef01095"&gt;ShowKase – A library to organize, discover and visualize your Jetpack Compose Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/jetpack/compose"&gt;Jetpack Compose Official Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/jetpack/androidx/releases/compose-runtime"&gt;Compose Runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/takahirom/inside-jetpack-compose-diagram"&gt;Inside Jetpack Compose Diagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Other Jetpack Compose Episodes
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/172/"&gt;EP 172&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/196/"&gt;EP 196&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/231/</guid><pubDate>Mon, 06 Jun 2022 01:00:00 UTC</pubDate></item><item><title>230: Feeling Like an Idiot</title><link>https://fragmentedpodcast.com/episodes/230-2/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c00853f8-236b-4699-94e9-2382aed9649e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c00853f8-236b-4699-94e9-2382aed9649e/audio/abf3a9fd-ee07-4f93-9946-626286907d1c/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn talks about that pit of the stomach feeling we all get when we feel like we should know something but we  don’t. It’s that voice in our head as developers that makes you feel like an idiot even when you’re not.&lt;/p&gt;
&lt;p&gt;Donn gives examples of how even senior engineers are subject to this feeling and how they are often the ones to not speak up about it simply because of their experience level and seniority. &lt;/p&gt;
&lt;p&gt;This episode talks about why we get this feeling and how to combat it going forward. &lt;/p&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/230-2/</guid><pubDate>Mon, 30 May 2022 01:00:00 UTC</pubDate></item><item><title>229: Native Where You Need It with Turbo (Launch Your Side Projects Faster)</title><link>https://fragmentedpodcast.com/episodes/230/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e5cbbcc5-c6da-487e-bfe0-45b97cdfca80?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/e5cbbcc5-c6da-487e-bfe0-45b97cdfca80/audio/455f2027-651b-4160-91cc-0e1075ee8f88/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Kaushik peppers Donn with questions about his foray into Android Turbo, Hotwire, and the concept of “Native Where You Need It”.&lt;/p&gt;
&lt;p&gt;Donn recently launched Android Jumpstart, the Android client for the Jumpstart Rails trifecta. Jumpstart Rails allow you to launch your SaaS business much faster than if you were to do it from the ground up.&lt;/p&gt;
&lt;p&gt;The Android client for Jumpstart Rails builds on top of Turbo and Hotwire, two technologies that help power the Hey email client and Basecamp (the project management app). By using Turbo and Hotwire you’re able to get very fast response times and speed with “HTML Over the Wire” (aka Hotwire) with Websockets and much more. This allows your web app to be super fast and when packaged with Android Turbo, allows your web app to live within a native shell. HOWEVER, this doesn’t mean its simply a web wrapper. With Android Turbo you can specify which URL routes you’d like to be as native and which ones you’d like to remain web-based. This means you can choose to use Native when you need it, and delegate back to the web for everything else.&lt;/p&gt;
&lt;p&gt;This is the solo founder, indie-hacker, and startup SaaS dream come true. You can come to market faster, iterate with a smaller team and get native benefits when and where you need it, all while also allowing your application to be flexible in a web manner.&lt;/p&gt;
&lt;p&gt;If you’re thinking about building a SaaS app that needs a web presence, Android and iOS presence but want fully native experiences in certain areas then this will be the episode for you.&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hotwired.dev/"&gt;Hotwired.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stimulus.hotwired.dev/"&gt;Stimulus JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpstartrails.com/android"&gt;Jumpstart Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpstartrails.com/"&gt;Jumpstart Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jumpstartrails.com/ios"&gt;Jumpstart iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/220/"&gt;Episode 220 with Jay Ohms – Turbo Native for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gorails.com/"&gt;Go Rails Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-git-course"&gt;
Donn’s Git Course
&lt;a class="heading-anchor" href="#donn8217s-git-course" aria-label="Link to Donn&amp;amp;#8217;s Git Course"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Need to learn Git? Donn has the course for you. In this FREE course you’ll learn everything you need to know in order to start working with Git everyday. &lt;a href="https://www.donnfelker.com/git/"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/230/</guid><pubDate>Mon, 23 May 2022 08:15:00 UTC</pubDate></item><item><title>228: Expo Development with Konstantin Liakhovskii</title><link>https://fragmentedpodcast.com/episodes/228/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6e75ca3f-5397-4544-930c-8896d0e37eba?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/6e75ca3f-5397-4544-930c-8896d0e37eba/audio/6cb57772-4f20-474e-8bb8-57087088c6e2/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik talk to Konstantin Liakhovskii about Expo development and how it takes cross platform development and its productivity to the next level. &lt;/p&gt;
&lt;p&gt;Konstantin dives deep into the usages and reasons why Expo (and React Native) are still very good options for companies that are looking to adopt a cross-platform application. &lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://expo.dev/"&gt;Expo.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/getKonstantin"&gt;Konstantin’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/129/"&gt;Reactive Native Episode with Gabriel Peal #129&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/130/"&gt;Reactive Native Episode with Gabriel Peal #130 (Part 2)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="stoa"&gt;
Stoa
&lt;a class="heading-anchor" href="#stoa" aria-label="Link to Stoa"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Stoa is a community platform for creators and anyone who wants to monetize their community. Sign up at &lt;a href="https://getstoa.com"&gt;getstoa.com&lt;/a&gt; and get 3 months free when we launch. Early access coming soon.&lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/228/</guid><pubDate>Mon, 18 Apr 2022 01:00:00 UTC</pubDate></item><item><title>227: Exotic Car Salesman to Mobile Developer with Ephraim Schmitt</title><link>https://fragmentedpodcast.com/episodes/227/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/82784c68-10a4-4008-b890-f7ef0c88260b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/82784c68-10a4-4008-b890-f7ef0c88260b/audio/9c8accf9-9170-4116-8f61-4809defe5b1b/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn sits down and talks to Ephraim Schmitt about how he changed careers from being an exotic car salesman to a mobile software developer. It’s a fascinating and inspiring story for anyone looking to get into software development. &lt;/p&gt;
&lt;p&gt;We talk about the mental and financial struggles, how he learned to start coding, how you can find opportunities everywhere, how to interview better, where to look for positions when you’re just starting out, why volunteering/doing something for free early on is fast way to open doors and build your network and so much more.&lt;/p&gt;
&lt;p&gt;If you or anyone you know is looking to break into the software industry, this is the podcast for you. You’ll leave with a couple  pages of notes, tips and the inspiration you need to jump into the world of software development.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://1stphorm.com"&gt;1st Phorm&lt;/a&gt; (Ephraim’s current employer)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="heading"&gt;
 
&lt;a class="heading-anchor" href="#heading" aria-label="Link to  "&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h3 id="stoa"&gt;
Stoa
&lt;a class="heading-anchor" href="#stoa" aria-label="Link to Stoa"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Stoa is a community platform for creators and anyone who wants to monetize their community. Sign up at &lt;a href="https://getstoa.com"&gt;getstoa.com&lt;/a&gt; and get 3 months free when we launch. Early access coming soon.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/227/</guid><pubDate>Mon, 11 Apr 2022 01:00:00 UTC</pubDate></item><item><title>226: The Reunion – Themes, VS Code and More</title><link>https://fragmentedpodcast.com/episodes/226/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a16c82af-cfbc-4056-9b10-a516f0cff196?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/a16c82af-cfbc-4056-9b10-a516f0cff196/audio/5749d6a6-1b8e-448f-9eef-eb1b5fd7a70d/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik are back together on the mic. After an extended break, they both returned renewed and ready to dive into all things software, starting off with IDE themes, plugins and what they’ve been up to since they were last on the show together.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Monokai Pro Theme
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://monokai.pro/"&gt;VS Code &amp;amp; Atom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plugins.jetbrains.com/plugin/13643-monokai-pro-theme"&gt;IntelliJ/Android Studio/WebStorm/etc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VS Code Plugins
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify"&gt;Beautify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bbugh.change-color-format"&gt;Change Color Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=skyapps.fish-vscode"&gt;Fish VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance"&gt;Pylance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format"&gt;Shell Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens"&gt;Git Lens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"&gt;ES Lint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"&gt;Prettier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv"&gt;Rainbow CSV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss"&gt;TailwindCSS Intellisense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby"&gt;Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-next"&gt;TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.caper.ai/"&gt;Caper.AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getstoa.com"&gt;Stoa – Community Platform for Creators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community"&gt;Freelance Faction – Donn’s Freelance Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing 
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing "&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/226/</guid><pubDate>Mon, 04 Apr 2022 01:00:00 UTC</pubDate></item><item><title>225: Don’t Give Up – Persevere</title><link>https://fragmentedpodcast.com/episodes/225/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/4b2aea3b-0048-4f35-a6f1-f9dcae981629?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/4b2aea3b-0048-4f35-a6f1-f9dcae981629/audio/4ea024b1-c185-4048-8601-39b01e7776c8/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn talks about something not giving up and persevering when the going gets tough in software, your career and more. It’s easy to give up, but the real reward is when you persevere.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3qBbZHw"&gt;Growth Mindset Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software-freelancing"&gt;
Software Freelancing 
&lt;a class="heading-anchor" href="#software-freelancing" aria-label="Link to Software Freelancing "&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/community/"&gt;Donn’s Freelance Faction Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube"&gt;Donn’s Freelancing Content on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://jkl.gg/b/"&gt;jkl.gg/b&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/225/</guid><pubDate>Mon, 28 Mar 2022 01:00:00 UTC</pubDate></item><item><title>224: Our Latest Book Recommendations</title><link>https://fragmentedpodcast.com/episodes/224/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/5151dbef-6277-4b5d-af29-4c54cae8b814?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/5151dbef-6277-4b5d-af29-4c54cae8b814/audio/8c224fcb-bd92-4386-8251-e05ee1f8a13f/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about some of the books that they’re reading and thoughts and recommendations on each.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="donn8217s-books"&gt;
Donn’s Books
&lt;a class="heading-anchor" href="#donn8217s-books" aria-label="Link to Donn&amp;amp;#8217;s Books"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3kWAQm2"&gt;Designing Data Intensive Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/30Q1ZjK"&gt;Systemology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3DGMYPs"&gt;Who Not How&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/32m8taJ"&gt;Skin in the Game&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2ZepDpC"&gt;Zero To Sold&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik8217s-books"&gt;
Kaushik’s Books
&lt;a class="heading-anchor" href="#kaushik8217s-books" aria-label="Link to Kaushik&amp;amp;#8217;s Books"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3qX8Z9t"&gt;Staff Engineer&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CBFADW"&gt;An Elegant Puzzle: Systems of Engineering Management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3oOPm0v"&gt;Grokking Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3DFUYR1"&gt;Coders At Work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3kYZZN0"&gt;A Philosophy of Software Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3HDtv4K"&gt;Androids&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-book-on-freelancing-tactics"&gt;
Donn’s Book on Freelancing Tactics
&lt;a class="heading-anchor" href="#donn8217s-book-on-freelancing-tactics" aria-label="Link to Donn&amp;amp;#8217;s Book on Freelancing Tactics"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3cC7Xat"&gt;Freelance Tactics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/224/</guid><pubDate>Mon, 22 Nov 2021 00:00:00 UTC</pubDate></item><item><title>223: Productivity with TODO Apps and Personal Knowledge Management Systems</title><link>https://fragmentedpodcast.com/episodes/223/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0665b01e-4220-4e85-af97-eea9f78ed540?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/0665b01e-4220-4e85-af97-eea9f78ed540/audio/4e86ff01-14eb-4b11-9a2d-d6167f6b5835/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik reunite for an episode on how they use productivity tools like various todo apps as well as how the organize information for storage and easy retrieval in their day to day lives.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;In this episode, Donn and Kaushik reunite for an episode on how they use productivity tools like various todo apps as well as how the organize information for storage and easy retrieval in their day to day lives.&lt;/p&gt;
&lt;h3 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Asg5E4"&gt;Taskwarrior&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Asg5E4"&gt;GTD Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortelabs.co/blog/para/"&gt;P.A.R.A. Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.buildingasecondbrain.com/"&gt;Building a Second Brain Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bulletjournal.com/pages/learn"&gt;Bullet Journal Method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taskwarrior.org/"&gt;Task Warrior&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wingtask.com/"&gt;Wing Task for Task Warrior&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Parkinson%27s_law"&gt;Parkinsons Law&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kanbanflow.com/"&gt;Kanbanflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://culturedcode.com/things/"&gt;Things App for Mac and iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://happenapps.com/"&gt;Quiver Code Snippet Organizer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.
m* &lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/223/</guid><pubDate>Mon, 11 Oct 2021 01:00:00 UTC</pubDate></item><item><title>222: Managing Android devices (EMM) with Prabhjot</title><link>https://fragmentedpodcast.com/episodes/222/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d5acb034-3257-4a80-a3c7-c9dcec19f919?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/d5acb034-3257-4a80-a3c7-c9dcec19f919/audio/7275d606-deae-48c8-b5fb-d62b016eaad6/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Kaushik talks to his good friend Prabhjot and learns about “&lt;a href="https://developers.google.com/android/work/overview"&gt;Android Enterprise&lt;/a&gt;“. This is the official way for companies or organizations to enable the use of Android devices and apps in the workplace. &lt;/p&gt;
&lt;p&gt;Prabhjot talks about how he setup the infrastructure to provision devices and the different capabilities the solution allows.&lt;/p&gt;
&lt;p&gt;If you ever wondered what kind of control is possible, listen to this episode and get a nice scary reality check. After listening to this episode, you’ll think twice before accepting free devices from companies or letting policy apps be installed on your phone.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/android/work/overview"&gt;Android Enterprise&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/android/work/terminology"&gt;Terminology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/android/work/requirements"&gt;Feature List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="oracle.com/cloud/free/"&gt;Oracle Cloud Free (not a referral link)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;10 TB of outbound data transfer free (vs 1GB from competitors)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/singh_prabhjot"&gt;Prabhjot on Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Donn&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaushik&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube)  or &lt;a href="https://jkl.gg/b"&gt;Kaushik’s Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/222/</guid><pubDate>Mon, 27 Sep 2021 01:00:00 UTC</pubDate></item><item><title>221: How to Introduce Seams into Legacy Code</title><link>https://fragmentedpodcast.com/episodes/221/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c52401d1-990c-4a55-8f9f-a6fffa45ed9c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c52401d1-990c-4a55-8f9f-a6fffa45ed9c/audio/f6de3688-9e3c-4a68-9d00-e7d88087dd21/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn continues to dive into his favorite software book: Working Effectively with Legacy Code. He talks about one of the fundamental tactics of the book: Introducing seams&lt;/p&gt;
&lt;p&gt;You’ll learn what a seam is according to the book, as well as how Donn interprets it so that you can get the same benefit he has gotten from it. You’ll learn how to introduce seams into your codebase through method injection, interfaces, abstract classes, and the static gateway pattern (aka: wrapper pattern).&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3hOFzp6"&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/221/</guid><pubDate>Sun, 08 Aug 2021 01:00:00 UTC</pubDate></item><item><title>220: Turbo Native for Android and Hotwire with Jay Ohms</title><link>https://fragmentedpodcast.com/episodes/220/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a65ba266-78bf-4982-b5ef-ab55a63126f9?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/a65ba266-78bf-4982-b5ef-ab55a63126f9/audio/834dc4d4-a48d-43b4-92ba-5bd79ae1efbe/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks to Jay Ohms about Turbo Native for Android, Hotwire, and how to build apps faster with Hotwire, Turbo, Stimulus, and Strata. Jay is an Android developer at &lt;a href="https://basecamp.com"&gt;Basecamp.com&lt;/a&gt; and &lt;a href="https://hey.com"&gt;Hey.com&lt;/a&gt; and has been building Hey with Android Turbo since it has been released (he’s one of the developers of it).&lt;/p&gt;
&lt;p&gt;You’ll learn what Hotwire is, how to use it with Android Turbo (and Stimulus and Strata) and how you can create apps faster and more maintainable by marrying the concepts of the web with native code. It’s a fascinating technology, and one that Donn will be using very shortly for a SaaS product he’s working on.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hotwire.dev/"&gt;Hotwire.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hotwired/turbo-android"&gt;Turbo Native for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hotwired/turbo-ios"&gt;Turbo Native for iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hotwired/stimulus"&gt;Stimulus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hey.com"&gt;Hey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://basecamp.com"&gt;Basecamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basecamp is Hiring an Android Dev – email jay @ basecamp dot com&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="get-ahold-of-jays-contact"&gt;
Get Ahold of Jays Contact
&lt;a class="heading-anchor" href="#get-ahold-of-jays-contact" aria-label="Link to Get Ahold of Jays Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jayohms"&gt;Jay’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email: jay @ basecamp dot com&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/220/</guid><pubDate>Mon, 02 Aug 2021 01:00:00 UTC</pubDate></item><item><title>219: The Legacy Code Change Algorithm</title><link>https://fragmentedpodcast.com/episodes/219/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a843b1aa-838d-4d73-9283-2a6e34c15ec8?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/a843b1aa-838d-4d73-9283-2a6e34c15ec8/audio/ba540ba3-f7d1-4a6e-8ff7-fad62b781558/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks dives into his favorite software book: Working Effectively with Legacy Code. He talks about one of the introduction level topics: The Legacy Code Change Algorithm&lt;/p&gt;
&lt;p&gt;You’ll learn what it is and how you can use it as the basis for this new series that will be focused on the book, Working Effectively with Legacy Code.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3hOFzp6"&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/219/</guid><pubDate>Mon, 19 Jul 2021 01:00:00 UTC</pubDate></item><item><title>218: Growth Mindset with Software Developer Alan Hill</title><link>https://fragmentedpodcast.com/episodes/218/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/284b5386-12ed-4caf-a32c-810d83c322fb?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/284b5386-12ed-4caf-a32c-810d83c322fb/audio/14bfc160-8fd2-4a12-b3a3-ddbd653b312c/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks to software developer Alan Hill about the Growth Mindset and how it applies to software development and life in general.&lt;/p&gt;
&lt;p&gt;They chat about pull request feedback lifecycle, learning new tech, and how applying a growth mindset can advance you in your career further than you could have imagined. They wrap up by going through Fixed Mindset vs Growth Mindset “back and forth” to discuss the differences.&lt;/p&gt;
&lt;img decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2021/07/Fixed-and-growth-mindset-infinity-scaled.jpeg" alt="Mindset Image" /&gt;
&lt;h2 id="alans-link"&gt;
Alans Link
&lt;a class="heading-anchor" href="#alans-link" aria-label="Link to Alans Link"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://followalan.online/"&gt;Alan Hill Social and Web Links&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3yfcOqM"&gt;Can’t Hurt Me – David Goggins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3hxRZ30"&gt;Mindset by Carol S. Dweck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2TyVi1X"&gt;Extreme Ownership – Jocko Willink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/tombilyeu/?hl=en"&gt;Tom Bilyeu Instagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/218/</guid><pubDate>Mon, 05 Jul 2021 01:00:00 UTC</pubDate></item><item><title>217: Working at a Big Tech Company vs Freelancing</title><link>https://fragmentedpodcast.com/episodes/217/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/51e23d87-03f2-43f1-9436-558780cea1aa?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/51e23d87-03f2-43f1-9436-558780cea1aa/audio/df542b8b-e5ac-4759-a55a-c8a69d960024/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about the difference between working at a big tech company vs freelancing.&lt;/p&gt;
&lt;p&gt;There are many pro’s and con’s for each. What is best for you? Listen to the episode and find out.&lt;/p&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/217/</guid><pubDate>Wed, 30 Jun 2021 03:00:00 UTC</pubDate></item><item><title>216: Code Conventions – Why It’s Important to Follow Them</title><link>https://fragmentedpodcast.com/episodes/216/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8048dee3-d664-4071-827e-f8ac58344ab8?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/8048dee3-d664-4071-827e-f8ac58344ab8/audio/0bdcdff0-7172-4472-bd6b-12d6e2652bf8/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about the importance of following code conventions and coding styles in codebases.&lt;/p&gt;
&lt;p&gt;You’ll run into various different coding conventions throughout your career. Sometimes it’s as an employee, sometimes it’s as a freelancer or consultant or just a small side project. The number of coding “styles” that you’ll see will blow your mind as you work through your career. The big question is … should you adhere to the current coding convention that is used in the app/file/etc or should you use your own favorite or an industry standard?&lt;/p&gt;
&lt;p&gt;In this episode, I’ll help explain the differences so you can make an informed decision going forward.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/"&gt;Martin Fowlers Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/216/</guid><pubDate>Wed, 23 Jun 2021 13:51:29 UTC</pubDate></item><item><title>215: From Side Project to Full Time via Watch Faces with David Whittaker and Ross Manges</title><link>https://fragmentedpodcast.com/episodes/215/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9991faff-b6e8-4c80-9808-2d193be5668a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/9991faff-b6e8-4c80-9808-2d193be5668a/audio/25f72d80-3b84-4a62-ab93-d97000e3f1e6/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks to David and Ross from Squeaky Dog Studios about building a business out of a side project.&lt;/p&gt;
&lt;p&gt;David and Ross are long-time serial side project developers with experience that dates back to the Palm era. They’ve built games, apps, and now Watch Faces.&lt;/p&gt;
&lt;p&gt;We dive deep into how they went from building their watch faces for Android as a side project and how they turned it into a full-time business in which one of the co-founders works full-time. We talk about building the app, pricing, support, which features to build, paid vs free, trial conversions, supporting your app and much much more.&lt;/p&gt;
&lt;p&gt;If you’ve ever wanted to build a side project into a business, and it’s app-based… this one is for you.&lt;/p&gt;
&lt;h2 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="david-and-ross8217s-links"&gt;
David and Ross’s Links
&lt;a class="heading-anchor" href="#david-and-ross8217s-links" aria-label="Link to David and Ross&amp;amp;#8217;s Links"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Android Apps by Squeaky Dog Studios on Google Play&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.sparkistic.photowear"&gt;Photowear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.sparkistic.justaminute"&gt;Just A Minute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.sparkistic.justaminutepride"&gt;PrideTime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.sparkistic.unicornwear"&gt;UnicornWear&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other links by Squeaky Dog Studios&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://squeaky.dog/"&gt;Squeaky Dog Studios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtube.com/c/Sparkistic"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/codelikeadog"&gt;Company Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linkedin.com/company/codelikeadog"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://instagram.com/codelikeadog"&gt;Instagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/codelikeadog"&gt;Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rundavidrun"&gt;David’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postings are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/215/</guid><pubDate>Mon, 14 Jun 2021 01:00:00 UTC</pubDate></item><item><title>214: 3 Things Every Developer Needs To Know How To Do</title><link>https://fragmentedpodcast.com/episodes/214/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3b77f2bd-fe43-4344-8a01-d9f6eb43e71f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/3b77f2bd-fe43-4344-8a01-d9f6eb43e71f/audio/76e9d7f4-5ca6-4a10-aaed-ed0e66d667fb/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about the three things that every developer needs to know how to do.&lt;/p&gt;
&lt;p&gt;These three things include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How to identify and stop premature optimization&lt;/li&gt;
&lt;li&gt;How to write tests and know the difference between unit, integration and end-to-end tests.&lt;/li&gt;
&lt;li&gt;How to set up a continuous integration server&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While there are vast arrays of other things all developers need to know how to do, and we will cover them in future episodes, this small list will help you vastly in your career. It has helped mine (Donn) a ton.&lt;/p&gt;
&lt;h3 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="continuous-integration-server-platforms"&gt;
Continuous Integration Server Platforms
&lt;a class="heading-anchor" href="#continuous-integration-server-platforms" aria-label="Link to Continuous Integration Server Platforms"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Managed Services
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com"&gt;GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org"&gt;Bitbucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;Azure Devops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com"&gt;CircleCI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitrise.io"&gt;Bitrise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codemagic.io"&gt;Codemagic&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Self hosted
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="book"&gt;
Book
&lt;a class="heading-anchor" href="#book" aria-label="Link to Book"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3z7JeVs"&gt;Working Effectively with Legacy Code by Michael Feathers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Job postigns are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notififed of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancing-rates"&gt;
Donn’s Free E-Book on Freelancing Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancing-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/214/</guid><pubDate>Mon, 07 Jun 2021 01:00:00 UTC</pubDate></item><item><title>213: How to Pick What Technology to Learn Next</title><link>https://fragmentedpodcast.com/episodes/213/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c45c96db-f3e3-4454-8cd9-61b9aa87e1f3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/c45c96db-f3e3-4454-8cd9-61b9aa87e1f3/audio/8a419da2-1024-4037-b71a-c21b4ca62afb/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn answers a listener’s question. The listener wanted to know how to choose what to learn next in Tech.&lt;/p&gt;
&lt;p&gt;Donn provides 6 tips (actually 7 if you count a hidden one) on how to pick what technology to learn next. He provides a simple framework that will help you check whether you should pursue a particular technology or not.&lt;/p&gt;
&lt;h3 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.startupsfortherestofus.com/"&gt;Startups for the Rest of Us Podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://robwalling.com/"&gt;Rob Walling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="androidjobsio"&gt;
AndroidJobs.IO
&lt;a class="heading-anchor" href="#androidjobsio" aria-label="Link to AndroidJobs.IO"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://androidjobs.io"&gt;Job postings&lt;/a&gt; are FREE on AndroidJobs.IO during the early release phase (at the time of this recording).&lt;/li&gt;
&lt;li&gt;Sign up to get notified of new jobs on a weekly basis as well.&lt;/li&gt;
&lt;li&gt;Post jobs and sign up here: &lt;a href="https://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/213/</guid><pubDate>Mon, 31 May 2021 01:00:00 UTC</pubDate></item><item><title>212: Growing an Online Presence in the Software Industry with Philipp Lackner</title><link>https://fragmentedpodcast.com/episodes/212/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9dc1056a-3e23-4854-aefa-8afb2fa4b2b8?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/9dc1056a-3e23-4854-aefa-8afb2fa4b2b8/audio/ac4c36bc-df1b-4f49-9067-d2ef802760d6/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks with Philipp Lackner about growing an online presence within the Software Industry with Instagram and YouTube.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;You’ll learn how Philipp went from 0 to over 80,000 followers on Instagram. This was done all organically by posting valuable content every single day to his feed.&lt;/p&gt;
&lt;p&gt;You’ll also learn how he uses YouTube (as well as Instagram) as a marketing channel for his own course products that he sells via his site.&lt;/p&gt;
&lt;p&gt;We wrap up by talking about content strategy, what tools are used, captions and hashtags. This episode is chock full of great info if you’re learning how to grow your following online.&lt;/p&gt;
&lt;h3 id="tools-that-philipp-mentioned"&gt;
Tools that Philipp Mentioned
&lt;a class="heading-anchor" href="#tools-that-philipp-mentioned" aria-label="Link to Tools that Philipp Mentioned"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://canva.com"&gt;Canva&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.adobe.com/creativecloud.html"&gt;Adobe Creative Cloud – Photoshop/After Effects/Illustrator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freepik.com/"&gt;FreePik – Images and Icons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techsmith.com/video-editor.html"&gt;Camtasia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://later.com/r/donnfelker-626995"&gt;Later.com – Social Scheduling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.contentrow.com"&gt;ContentRow.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="find-philipp-lackner-online-here"&gt;
Find Philipp Lackner online here
&lt;a class="heading-anchor" href="#find-philipp-lackner-online-here" aria-label="Link to Find Philipp Lackner online here"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://instagram.com/philipplackner_official"&gt;Instagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtube.com/c/PhilippLackner"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/plcoding"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/philipp-lackner-a0b2201b3/"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pl-coding.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancingconsulting-rates"&gt;
Donn’s Free E-Book on Freelancing/Consulting Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancingconsulting-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing/Consulting Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/212/</guid><pubDate>Mon, 24 May 2021 01:00:00 UTC</pubDate></item><item><title>211: Why Learning React is Good For You as a Developer</title><link>https://fragmentedpodcast.com/episodes/211/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b63bf3dd-25c7-417d-9f05-be281581984c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/b63bf3dd-25c7-417d-9f05-be281581984c/audio/1ff2033d-a444-4941-89cc-16146bec994e/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn talks about why you need to learn React (or Flutter) – so you can truly understand the Unidirectional data flow pattern in a framework that was built for that purpose alone.&lt;/p&gt;
&lt;p&gt;Working with other frameworks which bolt on a custom unidirectional data flow is often hard to understand. When you work with React and learn how it works, the concept of Unidirectional data flow starts to make much more sense as that is the default way to implement UI’s in technologies like React (and Flutter).&lt;/p&gt;
&lt;p&gt;This exposes you to the pattern and helps you understand it. In turn, this will help you become a better developer.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.donnfelker.com/wp-content/uploads/2021/05/unidirectional-donnfelker.png"&gt;Unidirectional Data flow Image&lt;/a&gt;&lt;/p&gt;
&lt;img decoding="async" src="http://www.donnfelker.com/wp-content/uploads/2021/05/unidirectional-donnfelker.png" alt="http://www.donnfelker.com/wp-content/uploads/2021/05/unidirectional-donnfelker.png" /&gt;
&lt;p&gt;How to learn React:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ui.dev/react/"&gt;Tyler McGinnis Course on React (this is how I learned it)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ui.dev/react-hooks/"&gt;Tyler McGinnis React Hooks Course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to Learn Flutter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLI-zgtmWlWvXEaogxCUejByJxwv5Vl-X3"&gt;Rohan Taneja’s Flutter from Zero to Hero Course&lt;/a&gt; (Free)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=x0uinJvhNxI"&gt;Flutter Crash Course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancing-rates"&gt;
Donn’s Free E-Book on Freelancing Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancing-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/211/</guid><pubDate>Tue, 18 May 2021 01:00:00 UTC</pubDate></item><item><title>210: Kotlin Multiplatform Mobile (KMM) with Mitch Tabian</title><link>https://fragmentedpodcast.com/episodes/210/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/421a6c25-57fe-4902-a027-ad73595fe0cd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/421a6c25-57fe-4902-a027-ad73595fe0cd/audio/f87b555c-a857-4695-b3aa-579ea0074b6d/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks with Mitch Tabian about Kotlin Multiplatform Mobile, also known as KMM.&lt;/p&gt;
&lt;p&gt;Mitch explains what KMM is, why he decided to use it, and how it works from a developer’s perspective. The goal was to build an app and develop both the iOS and Android versions. Mitch talks about his experience in building a KMM app. We cover the pros and cons, what worked vs what did not, and his advice on using KMM going forward. Mitch also shares content about how to build native components in Jetpack Compose and SwiftUI as well as architectures used in his KMM project.&lt;/p&gt;
&lt;h3 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/mobile/"&gt;KMM Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/mobile/getting-started.html"&gt;KMM Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/joreilly"&gt;John O’Reilly Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/mitchtabian/KMM-Playground/test/extras/clean_architecture_kmm.png"&gt;Diagram from Mitch for KMM clean architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cashapp.github.io/sqldelight/"&gt;SQL Delight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ktor.io/"&gt;Ktor Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/kotlinx-datetime"&gt;kotlinx-datetime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/kotlinx.serialization"&gt;kotlinx.serialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/mobile/connect-to-platform-specific-apis.html"&gt;Expect-actual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/"&gt;Hacking with Swift Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/100/swiftui"&gt;100 days of SwiftUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=L8Xq15NTuCc"&gt;Is KMM ready for production? – A Video by Mitch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.droidcon.com/media-detail?video=491032635"&gt;D-KMP architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="find-mitch-online-here"&gt;
Find Mitch online here:
&lt;a class="heading-anchor" href="#find-mitch-online-here" aria-label="Link to Find Mitch online here:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/mitch_tabian"&gt;Mitch’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/codingwithmitch/"&gt;Mitch’s Instagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/codingwithmitch"&gt;Mitch’s YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codingwithmitch.com"&gt;Mitch’s Website and Courses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/mitchtabian/KMM-Playground/test/extras/clean_architecture_kmm.png"&gt;Mitch’s KMM Clean Architecture diagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancing-rates"&gt;
Donn’s Free E-Book on Freelancing Rates
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancing-rates" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing Rates"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/youtube-channel-from-podcast"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/210/</guid><pubDate>Mon, 10 May 2021 01:00:00 UTC</pubDate></item><item><title>209: Secure Development Lifecycle with Glenn Leifheit</title><link>https://fragmentedpodcast.com/episodes/209/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/72da4121-c057-44df-91ee-8f1d24ea7fd7?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/72da4121-c057-44df-91ee-8f1d24ea7fd7/audio/760c8c18-4685-45c5-9379-cf76ba9bff63/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks with Glenn Leifheit from Microsoft about a concept known as “Secure Development Lifecycle”. Glenn is a Senior Security Program Manager at Microsoft.&lt;/p&gt;
&lt;p&gt;Glenn explains to you what the secure development lifecycle is, how it works and how you can implement something like this in your company. He also shares the top tips you can implement in order to get the quickest benefit of the Secure Development Lifecycle&lt;/p&gt;
&lt;h3 id="links-from-the-show"&gt;
Links from the show
&lt;a class="heading-anchor" href="#links-from-the-show" aria-label="Link to Links from the show"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Application Inspector:  &lt;a href="https://github.com/Microsoft/ApplicationInspector"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DevSkim:  &lt;a href="https://github.com/microsoft/devskim"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Attack Surface Analyzer:  &lt;a href="https://github.com/Microsoft/AttackSurfaceAnalyzer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OSS Gadget:  &lt;a href="https://github.com/typescript-eslint/typescript-eslint"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recursive Extractor:  &lt;a href="https://github.com/microsoft/RecursiveExtractor"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft SDL: &lt;a href="https://www.microsoft.com/en-us/securityengineering/sdl/"&gt;Microsoft Security Development Lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CodeQL: &lt;a href="https://securitylab.github.com/tools/codeql/"&gt;CodeQL for research | GitHub Security Lab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OWASP:  &lt;a href="https://owasp.org/"&gt;OWASP Foundation | Open Source Foundation for Application Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OWASP Top 10: &lt;a href="https://owasp.org/www-project-top-ten/"&gt;OWASP Top Ten Web Application Security Risks | OWASP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OWASP Web Security Testing Guide: &lt;a href="https://owasp.org/www-project-web-security-testing-guide/"&gt;OWASP Web Security Testing Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python basic code analysis:  &lt;a href="https://pylint.org/"&gt;Pylint – code analysis for Python | www.pylint.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeScript basic code analysis: &lt;a href="https://github.com/typescript-eslint/typescript-eslint"&gt;GitHub – typescript-eslint/typescript-eslint: Monorepo for all the tooling which enables ESLint to support TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="find-glenn-online-here"&gt;
Find Glenn online here
&lt;a class="heading-anchor" href="#find-glenn-online-here" aria-label="Link to Find Glenn online here"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/gleifhe/"&gt;Glenn’s LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gleifhe"&gt;Glenn’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="donn8217s-free-e-book-on-freelancing"&gt;
Donn’s Free E-Book on Freelancing
&lt;a class="heading-anchor" href="#donn8217s-free-e-book-on-freelancing" aria-label="Link to Donn&amp;amp;#8217;s Free E-Book on Freelancing"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/ebook"&gt;Free E-Book on Freelancing Rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCX-K1HK8ejnnQF_GWcMHveg"&gt;Freelancing for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/209/</guid><pubDate>Mon, 03 May 2021 01:00:00 UTC</pubDate></item><item><title>208: Developing Software at Startups with Jason Roberts</title><link>https://fragmentedpodcast.com/episodes/208/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1f2b990c-6d15-465b-9cf2-b229709e14eb?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/1f2b990c-6d15-465b-9cf2-b229709e14eb/audio/1e47a49a-b9a1-470b-847d-1914adb6f460/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This is the original story of how Uber was built … this is a fascinating story. You don’t want to miss this. Donn talks to Jason Roberts. Jason was chosen to be Uber’s CTO when the company was in its infancy (but didn’t accept the offer). Jason shares the story of developing the code that eventually ran Uber from a couple of cars to a highly distributed system with an impressive amount of rides.&lt;/p&gt;
&lt;p&gt;We talk about building what is needed when it’s needed, the tools that he chose to build Uber’s platform on. Early startup learnings, and how Uber originally ran on PHP before he chose to move it to Node.js.&lt;/p&gt;
&lt;p&gt;Jason shares his story of how he met Travis (Uber’s CEO who took it from a small company to a huge international corporation), how they built the systems, and team and much more. You’ll learn how networking, working on interesting things, and seizing the moment and luck played into him landing his role at Uber.&lt;/p&gt;
&lt;p&gt;Finally, we wrap up by chatting a bit about how being a generalist in an early-stage startup is beneficial (vs being a specialist).&lt;/p&gt;
&lt;h3 id="find-jason-online-here"&gt;
Find Jason online here
&lt;a class="heading-anchor" href="#find-jason-online-here" aria-label="Link to Find Jason online here"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/exojason"&gt;Jason’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codusoperandi.com/posts/"&gt;Jason’s Blog&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codusoperandi.com/posts/how-i-screwed-up-my-google-acquisition"&gt;How I Screwed up My Google Acquisition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mathacademy.us/"&gt;Jason’s New Project – Math Academy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCX-K1HK8ejnnQF_GWcMHveg"&gt;Consulting for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links we share to products are affiliate links. They help support the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/208/</guid><pubDate>Mon, 26 Apr 2021 01:00:00 UTC</pubDate></item><item><title>207: How to Optimize Your Home Office</title><link>https://fragmentedpodcast.com/episodes/207/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f66bde19-8e46-4bb1-81e0-a48049d2a84d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/f66bde19-8e46-4bb1-81e0-a48049d2a84d/audio/8901a9a2-08d7-407e-8fff-42d83065ce96/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn outlines how you can optimize your home office so that you look, sound, and perform the best that you can. From audio to video, to your body, and everything beyond, it’s covered here.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;In this episode, Donn outlines how you can optimize your home office so that you look, sound, and perform the best that you can. From audio to video, to your body, and everything beyond, it’s covered here.&lt;/p&gt;
&lt;p&gt;Donn talks about everything you can do to improve your home office. From microphones, lighting, and webcams for your video calls to chairs, standing desks, and more. This episode has all the links below for all the products discussed.&lt;/p&gt;
&lt;p&gt;Take even 20% of the recommendations and apply them to your home office and you’ll see a drastic difference in your productivity and happiness in your home office.&lt;/p&gt;
&lt;h3 id="links-to-items-discussed"&gt;
Links to Items Discussed
&lt;a class="heading-anchor" href="#links-to-items-discussed" aria-label="Link to Links to Items Discussed"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Microphones&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3tAn0Il"&gt;Audio-Technica ATR2100x-USB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dwsFtE"&gt;Blue Snowball&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dvxgMx"&gt;Blue Yeti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3sDZ5qi"&gt;Shure MV7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3tzBqJ3"&gt;Shure SM7B (High End)&lt;/a&gt; &amp;amp; &lt;a href="https://amzn.to/3n0Wfuo"&gt;CloudLifter&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3gD7zfd"&gt;Lower Cost Preamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bhphotovideo.com/c/product/734341-REG/Sound_Devices_USBPRE_2_USBPre_2_Microphone.html"&gt;High End Preamp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Boom arms for Mics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2RKzDTb"&gt;Rode PSA 1 Boom Arm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2RTDa1T"&gt;Heil PL-2T&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dE7ztv"&gt;Gator Frameworks Boom (same one used on Joe Rogans podcast)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Webcams&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3nb0hAn"&gt;Logitech C920x HD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xcRaUk"&gt;Logitech Brio Ultra HD 4k&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/32JpWXH"&gt;DSLR HDMI Capture Card by Elgato – Camlink 4k&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docking Hub&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dxc60r"&gt;CalDigit TS3 Docking Hub for Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2QE0tMj"&gt;Brydge Vertical Dock for Mac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lighting&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2P4rJ6e"&gt;LumeCube Video Conference Lighting Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2P4rJ6e"&gt;LumeCube Suction Cup Mount (indluced in kit above)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3gkF3ia"&gt;Benq Desklap (high end)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Headphones&lt;/p&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3v8cqsO"&gt;JVC Xtreme-Xplosivs Wired Earbuds – Donn’s Go to&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3egiQPv"&gt;Sony MDR-7506 Professional Headphone&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3x9ImPc"&gt;Audio Technical M20x&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No, I don’t use Bluetooth headsets at work, though many do. If they work for you, you might want to check out the &lt;a href="https://amzn.to/3vaDFCZ"&gt;Audio Technica ATHM50XBT’s&lt;/a&gt; or the &lt;a href="https://amzn.to/3n2XqJL"&gt;Bose Quiet Comfort 35’s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chairs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://store.hermanmiller.com/office/office-chairs/aeron-chair/100077461.html"&gt;Herman Miller Aeron – make sure you know your size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://store.hermanmiller.com/office/office-chairs/mirra-2-task-chair/1453.html?lang=en_US"&gt;Herman Miller Mirra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/32zn9A9"&gt;Steelcase Leap V2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Standing Desk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.autonomous.ai/standing-desks"&gt;Autonomous AI Standing Desks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ikea.com/us/en/cat/bekant-office-desks-18962/"&gt;IKEA Bekant Standing Desk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fully.com/standing-desks/jarvis.html"&gt;Jarvis Standing Desks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3as12jh"&gt;VariDesk Adjustable Standing Desk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anti-Fatigue Mats&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3gpSk8Z"&gt;ErgoDriven Topo Comfort Mat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3sx6mrT"&gt;Cheap Anti-Fatigue Mat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Monitor and Monitor Arms&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3sx6mrT"&gt;LG 5K Monitor – this thing is amazing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3tzvlwc"&gt;Amazon Basics Monitor Arm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3n2mn80"&gt;Ergotron Tall Monitor Mount (this is what I have)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keyboard&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3va6hMy"&gt;Kinesis Advantage 2 (my keyboard)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zsa.io/moonlander/"&gt;Moonlander Keyboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mouse&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3n2nUeg"&gt;Magic Trackpad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xeeUHF"&gt;Logitech Trackman Marble Ergonomic Mouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3sCmWXr"&gt;Logitech M570 Wireless Trackball Mouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Air Quality&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3su9d4Y"&gt;Awair Element&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MRqh8oLY7Ik"&gt;DHH Video on Air Quality&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Focus Music&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.brain.fm/"&gt;Brain.fm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coffitivity.com/"&gt;Coffitivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://freedom.to/"&gt;Freedom.to&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://heyfocus.com/"&gt;HeyFocus Mac App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sereneapp.com/website-blocker/"&gt;Serene Blocker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getcoldturkey.com/"&gt;Cold Turkey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mobility, Desk Ergo, and Back Pain Resources&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3aoTv4O"&gt;Deskbound Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3x9aPVl"&gt;8 Steps to a Pain Free Back&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3nbXbME"&gt;Foot Rubz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3tNvEmU"&gt;Lacrosse Ball&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thereadystate.com/product/shoulder-pain-protocol/"&gt;Shoulder Pain Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ay3xNBukCTo"&gt;Standing Desk Video 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=A3pCN86lm5Y"&gt;Standing Desk Video 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=X6oyEI_vxL8"&gt;Standing Desk Video 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCX-K1HK8ejnnQF_GWcMHveg"&gt;Consulting for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Many of the links are affiliate links. They help suppor the production of Fragmented. Thank you for your support.&lt;/em&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/207/</guid><pubDate>Tue, 20 Apr 2021 09:30:00 UTC</pubDate></item><item><title>206: DevOps for Developers with Will Button</title><link>https://fragmentedpodcast.com/episodes/206/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9c41e942-22bb-404e-b201-d8b27728aac0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/9c41e942-22bb-404e-b201-d8b27728aac0/audio/8ce9099e-9d58-4936-8d32-dd2bb70209d4/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks with DevOps expert, Will Button about everything DevOps-related. If you’re ever wondered how and what DevOps is, then listen in.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Will walks you through the definition of DevOps and how it’s used in a company. You’ll learn the 20% of DevOps you should know that will get you 80% of the benefit. You’ll also learn about a bunch of automation technology that will help you and your team level up your environments so that you can become super efficient in your day-to-day engineering activities.
 
In this episode, Donn talks about the best way to learn a new technology from the ground up. Want to learn something new?  This episode is for you.&lt;/p&gt;
&lt;p&gt;You’ll learn Donn’s proven 5-step methodology for learning new technology. This is the same method Donn has used for over 2 decades of learning new technology. We hope it helps you.  &lt;/p&gt;
&lt;h3 id="find-will-online"&gt;
Find Will Online
&lt;a class="heading-anchor" href="#find-will-online" aria-label="Link to Find Will Online"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC5ZFyTivwhmZXUcOoMavyAQ"&gt;DevOps for Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/wfbutton"&gt;Will’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devopsfordevelopers.io"&gt;DevOps for Developers Website&lt;/a&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCX-K1HK8ejnnQF_GWcMHveg"&gt;Consulting for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/206/</guid><pubDate>Mon, 12 Apr 2021 01:00:00 UTC</pubDate></item><item><title>205: How to Learn New Technologies</title><link>https://fragmentedpodcast.com/episodes/205/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2a4d5996-df58-4f70-9a54-57403361b87f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/2a4d5996-df58-4f70-9a54-57403361b87f/audio/09d772ec-06c3-49a2-87ae-fd4051e35192/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about the best way to learn a new technology from the ground up. Want to learn something new?  This episode is for you.&lt;/p&gt;
&lt;p&gt;You’ll learn Donn’s proven 5-step methodology for learning new technology. This is the same method Donn has used for over 2 decades of learning new technology. We hope it helps you.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The 5 Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose a Simple Problem Domain (Note Taking app or Calorie/Protein Tracker)&lt;/li&gt;
&lt;li&gt;Do not worry about best practices&lt;/li&gt;
&lt;li&gt;Start Small, then go smaller: Super tiny nibbles of work&lt;/li&gt;
&lt;li&gt;Build Something Ugly and just “Get it working”&lt;/li&gt;
&lt;li&gt;Don’t Conflate Technologies if you don’t have to. Keep it simple.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="donn8217s-free-9-hour-kotlin-course"&gt;
Donn’s Free 9+ Hour Kotlin Course
&lt;a class="heading-anchor" href="#donn8217s-free-9-hour-kotlin-course" aria-label="Link to Donn&amp;amp;#8217;s Free 9&amp;#43; Hour Kotlin Course"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=wuiT4T_LJQo"&gt;Watch the entire course here, for free&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCX-K1HK8ejnnQF_GWcMHveg"&gt;Consulting for Mobile Developers&lt;/a&gt; (Donn’s YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/205/</guid><pubDate>Thu, 08 Apr 2021 01:00:00 UTC</pubDate></item><item><title>204: Quality over Quantity</title><link>https://fragmentedpodcast.com/episodes/204/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3667db0e-0145-4cda-8ed8-e850404331fe?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/3667db0e-0145-4cda-8ed8-e850404331fe/audio/ed7c1e80-62bf-4e7a-b948-036baf78abf0/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn returns for a solo episode to talk about his thoughts on Quality over Quantity and why it’s important to software development and productivity in general. &lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is being “in Flow”? – &lt;a href="https://en.wikipedia.org/wiki/Flow_(psychology)"&gt;Learn more&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram) &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCX-K1HK8ejnnQF_GWcMHveg"&gt;Consulting for Mobile Developers &lt;/a&gt;(Donn’s YouTube)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/204/</guid><pubDate>Mon, 29 Mar 2021 01:00:00 UTC</pubDate></item><item><title>203: Jetbrains Projector with Joaquim</title><link>https://fragmentedpodcast.com/episodes/203/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/567299f0-d2f5-4cd9-811f-0ee71739112a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/567299f0-d2f5-4cd9-811f-0ee71739112a/audio/298ee60a-d73a-4869-b19c-479f4f7b8322/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to acclaimed Android developer Joaquim Verges. He recently embarked on a journey of making is laptop not burn like a furnace when using Android Studio. He landed up on this unknown effort by Jetbrains called Projector and seems to have found programmer Nirvana.&lt;/p&gt;
&lt;p&gt;Listen to his adventures.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/swlh/how-to-run-android-studio-on-any-device-with-jetbrains-projector-3d9d23a8c179"&gt;How to Run Android Studio on ANY Device With JetBrains Projector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Adambl4/mirakle"&gt;Mirakle Gradle plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jetbrains M1 Macbook updates:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtrack.jetbrains.com/issue/JBR-2526"&gt;Jetbrains JBR-2526&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/idea/2020/12/intellij-idea-2020-3-1/"&gt;IntelliJ IDEA 2020.3.1 Is out with Apple Silicon Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="jetbrains-projector"&gt;
Jetbrains Projector
&lt;a class="heading-anchor" href="#jetbrains-projector" aria-label="Link to Jetbrains Projector"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JetBrains/projector-server"&gt;Projector-Server: Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jetbrains.github.io/projector-client/mkdocs/latest/"&gt;Projector Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Swing_(Java)"&gt;Swing UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joaquim-verges/ProjectorAndroidStudio/blob/main/README.md"&gt;Joaquim’s Projector Instructions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/joenrv"&gt;@joenrv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.jkl.gg/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/203/</guid><pubDate>Sun, 07 Mar 2021 19:00:00 UTC</pubDate></item><item><title>202: Dagger on the Anvil with Ralf Wondratschek</title><link>https://fragmentedpodcast.com/episodes/202/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/985790b0-f982-46be-b670-39ad0a9696bc?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/985790b0-f982-46be-b670-39ad0a9696bc/audio/b3060bed-d76d-4ab3-9c84-8840e18dd32a/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Anvil is a Kotlin compiler plugin that makes your life a tad bit easier when using Dagger 2. In this episode we talk to Ralf Wondratschek from Square who created the library and open sourced it for all of us.&lt;/p&gt;
&lt;p&gt;After touching on some of the basics, Ralf dives into the thinking behind Anvil and how it evolved into the tool it is today. It’s filled with nuggets of wisdom especially if your app uses Dagger for Dependency Injection.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/anvil"&gt;Anvil&lt;/a&gt; for Dagger&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.droidcon.com/media-detail?video=380843878"&gt;Ralf’s talk at Droidcon: Android at Scale @Square&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/vrallev/android-at-scale-at-square"&gt;Slides for above talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/vRallev"&gt;@vRallev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/202/</guid><pubDate>Mon, 01 Feb 2021 07:56:21 UTC</pubDate></item><item><title>201: State of the Testing Union with Valera Zakharov</title><link>https://fragmentedpodcast.com/episodes/201/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b020803f-4116-41e9-b3fd-5a5027594738?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/b020803f-4116-41e9-b3fd-5a5027594738/audio/4f7b8f35-e69d-4783-a982-015b482b492c/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In episode 1 of Fragmented we talked about Testing. 200 episodes in, we decided it’s a good time to do a state of the union for mobile testing. We talk with Valera Zakharov who’s a Staff Engineer at Slack and considered one of the experts in the field of mobile testing. Hope you enjoy this one!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/training/testing/espresso"&gt;Espresso Testing with Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/training/testing/junit-runner.html#using-android-test-orchestrator"&gt;Android Test Orchestrator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/163/"&gt;Flank : Fragemented Episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/linkedin/bluepill"&gt;Bluepill : LinkedIn’s iOS Testing Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.droidcon.com/media-detail?video=380845617"&gt;Valera’s Droidcon Talk – E2E2U: Slack’s Journey to Developer-driven End-to-end Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.engineering/android-ui-automation-part-1-building-trust/"&gt;Valera’s blog post on Slack – Android UI Automation: Part 1, Building Trust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jakewharton.com/testing-robots/"&gt;Jake Wharton’s Testing Robots&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/valera_zakharov"&gt;@valera_zakharov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/201/</guid><pubDate>Mon, 02 Nov 2020 05:00:00 UTC</pubDate></item><item><title>200: Serverless Programming</title><link>https://fragmentedpodcast.com/episodes/200/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/4005772a-63b7-4c1d-bb24-4510ae5a293f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/4005772a-63b7-4c1d-bb24-4510ae5a293f/audio/9bc64330-f32b-4170-af91-0bfcba1a6022/default_tc.mp3?aid=rss_feed&amp;amp;feed=LpAGSLnY"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In our 200th episode, we talk about Serverless Programming.&lt;/p&gt;
&lt;p&gt;What is it? What’s an example of a service I could build with Serverless Programming? What are the advantages or disadvantages? We talk about it all in this episode.&lt;/p&gt;
&lt;p&gt;Also, 🙏 for being listeners. We’ve stuck together for 200 of these. Kaushik &amp;amp; Donn are incredibly grateful to have you folks as listeners.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.heroku.com/"&gt;Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service"&gt;Platform as a Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Donn’s gif service &lt;a href="https://gifstagram.com/"&gt;gifstagram.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flippa.com/"&gt;Flippa&lt;/a&gt; : Buy and Sell services online&lt;/li&gt;
&lt;li&gt;&lt;a href="https://baremetrics.com/founder-chats/josh-pigford"&gt;Founder’s Chats: Ep 41&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Options for different services:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/lambda/"&gt;AWS Lambda Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/functions/"&gt;Azure Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; : The Collaboration Platform for API Development&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/200/</guid><pubDate>Mon, 05 Oct 2020 06:07:27 UTC</pubDate></item><item><title>199: iOSDev vs AndroidDev.lazy().not()</title><link>https://fragmentedpodcast.com/episodes/199/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/46c87779-d526-4a7f-89af-1f29e9d31c3f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f35050-e836-44cd-8f7f-fd13e8cb2e44/episodes/46c87779-d526-4a7f-89af-1f29e9d31c3f/audio/8d21f235-6bb7-4e67-b4e7-6fa39b69f9ae/default_tc.mp3?aid=rss_feed"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A tweet from a famous tech journalist about Android vs iOS spurs a storm. In this episode, Donn and Kaushik given their honest thoughts on iOS vs Android; and being developers for the platform.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.jkl.gg/iphones-pixels-lazy-android-developers/"&gt;KG’s post – iPhones, Pixels and lazy Android developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/benthompson/status/1301909021977227265"&gt;Ben Thompson’s tweet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/the-rule-of-thirds/"&gt;Donn’s post – The Three Buckets (The Rule of Thirds)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/garageband/id408709785"&gt;Garage Band – Apple iPhone app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.apple.com/us/app/reeder-4/id1449412357"&gt;Reeder 4 – iOS RSS Reader app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://culturedcode.com/things/"&gt;CultureCode’s Things – iOS Todo app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/199/</guid><pubDate>Mon, 21 Sep 2020 06:37:53 UTC</pubDate></item><item><title>198: Fragmented.reset( Mode.Indie )</title><link>https://fragmentedpodcast.com/episodes/198/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/eb75aecf-c022-41e9-ae20-49b5673f7266?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/eb75aecf-c022-41e9-ae20-49b5673f7266/198_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We’re back and Fragmented is going Indie again. A quick episode on the future of Fragmented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@SwapnilBorkar/fragmented-podcast-breaking-down-the-rebrand-2675eb478f01"&gt;New Artwork! Story on how Swapnil helped with our new artwork&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/198/</guid><pubDate>Mon, 14 Sep 2020 09:00:19 UTC</pubDate></item><item><title>✊🏽✊🏾✊🏿</title><link>https://fragmentedpodcast.com/episodes/xxx/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/cb62e51b-b1a6-473e-b0aa-2a7385cb9f03?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/cb62e51b-b1a6-473e-b0aa-2a7385cb9f03/blacklivesmatter_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We interrupt our regular programming for this extremely important message.&lt;/p&gt;
&lt;p&gt;We stand with our black sisters and brothers against the evil that is racism. The recent events of police brutality and oppression against black people have been truly horrifying.&lt;/p&gt;
&lt;p&gt;Please take the time to listen to the audio snippet on the #BlackLivesMatter movement from today’s episode. It is a &lt;a href="https://www.youtube.com/watch?v=Sd-VUOgS3rE"&gt;TedX talk by the far more eloquent Kennedy Cook&lt;/a&gt; who’s voice and words are more powerful than ours.&lt;/p&gt;
&lt;p&gt;We’ve never been very vocal about political issues on Fragmented. But that doesn’t mean we don’t care about these issues. On the contrary! We do our best to have our actions speak louder than our words and let others with first-hand experience speak out. Then importantly &lt;strong&gt;we aim to listen&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But these aren’t regular times are they? The horrifying brutality we’re seeing against people of color is nauseating. The Covid-19 outbreak has made action particularly difficult so for today we will start with these words.&lt;/p&gt;
&lt;h3 id="more-resources-on-how-we-can-help"&gt;
More Resources on how we can help:
&lt;a class="heading-anchor" href="#more-resources-on-how-we-can-help" aria-label="Link to More Resources on how we can help:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bet.com/news/national/2020/05/31/bet-statement-george-floyd.html"&gt;BET’s consolidated list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.change.org/t/racial-justice-4"&gt;change.org [racial justice]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/xxx/</guid><pubDate>Mon, 08 Jun 2020 05:55:05 UTC</pubDate></item><item><title>197: .git internals with Gordon 🔧</title><link>https://fragmentedpodcast.com/episodes/197/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1cc1a828-c854-48c3-942f-9d7a0386414e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1cc1a828-c854-48c3-942f-9d7a0386414e/197_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;OK, If you &lt;strong&gt;really&lt;/strong&gt; want to know how git works, this is the episode for you. KG talks with his longtime colleague and mentor Gordon McCreight. Gordon is a wiz in general but his knowledge of git goes deep. So in this episode, KG goes solo and really dives in-depth about how git works.&lt;/p&gt;
&lt;p&gt;Buckle up and listen on; you’ll come out on the outer side with a much sounder understanding of &lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain"&gt;Plumbing and Porcelain commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alblue.bandlem.com/2011/11/git-tip-of-week-gc-and-pruning-this.html"&gt;git gc vs prune&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Objects which are no longer referenced can be evicted with git prune; though this is a low-level operation which is often called from git gc. By default it will not remove commits newer than 2 weeks old, and of course the commits that are reachable from that; so provided the branch (or tag) deleted has recent commits, it will stay around in the git repository for up two a fortnight afterwards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=lG90LZotrpo&amp;amp;feature=youtu.be"&gt;Git internals by John Britton of GitHub – CS50 Tech Talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="L.Educative.io..2."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="educativeio"&gt;
&lt;a href="https://educative.io/fragmented"&gt;Educative.io&lt;/a&gt;
&lt;a class="heading-anchor" href="#educativeio" aria-label="Link to Educative.io"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Learn and practice Android development from inside your browser. Visit &lt;a href="https://educative.io/fragmented"&gt;Educative.io/Fragmented&lt;/a&gt; to get 10% off.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gmccreight"&gt;@gmccreight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/197/</guid><pubDate>Mon, 04 May 2020 05:00:00 UTC</pubDate></item><item><title>196: Composing with Leland 👨‍🎨</title><link>https://fragmentedpodcast.com/episodes/196/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/ba0fd5dc-5c96-4e4e-87a3-fcf8a795cdc6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/ba0fd5dc-5c96-4e4e-87a3-fcf8a795cdc6/196_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we chat with friend of the show Leland Richardson. Leland is a main contributor to Jetpack Compose. But in this episode, we pepper him with questions on how he came to the position he’s in viz. a reputed Software Engineer contributing to probably the most cutting edge library in development for Android.&lt;/p&gt;
&lt;p&gt;This was a treat and inspiring episode! Listen on:&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/172/"&gt;Jetpack Compose with Leland Richardson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Q9MtlmmN4Q0"&gt;Understanding Compose (Android Dev Summit ’19)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adambennett.dev/2020/04/adventures-in-compose-the-doom-fire-effect/"&gt;Adventures in Compose – The Doom fire effect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Gap_buffer"&gt;Gap Buffer – Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vinaygaba/Learn-Jetpack-Compose-By-Example"&gt;Learning Jetpack Conpose by example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="L.Educative.io..2."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="educativeio"&gt;
&lt;a href="https://educative.io/fragmented"&gt;Educative.io&lt;/a&gt;
&lt;a class="heading-anchor" href="#educativeio" aria-label="Link to Educative.io"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Learn and practice Android development from inside your browser. Visit &lt;a href="https://educative.io/fragmented"&gt;Educative.io/Fragmented&lt;/a&gt; to get 10% off.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/intelligibabble"&gt;@intelligibabble&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/196/</guid><pubDate>Mon, 27 Apr 2020 05:00:00 UTC</pubDate></item><item><title>195: Going on-call 🚨</title><link>https://fragmentedpodcast.com/episodes/195/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8a77bc11-9c3c-40da-914b-b81615033f1c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8a77bc11-9c3c-40da-914b-b81615033f1c/195_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Have you ever gone on on-call rotations for your company? What is on-call? How to operate a successful on-call strategy? What does on-call for mobile mean? What are some tools and resources to help with on-call rotations?&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik dive into these topics.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/crashlytics"&gt;Firebase Crashlytics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pagerduty.com/docs/guides/rollbar-integration-guide/"&gt;Rollbar Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/software/opsgenie"&gt;Ops Genie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="www.pagerduty.com/"&gt;Pager Duty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.statuspage.io/"&gt;Statuspage.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://status.io/"&gt;Status.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stairways.com/action/kmdiscount?REF6JZA"&gt;Keyboard Maestro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Good.resources"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="good-resources"&gt;
Good resources
&lt;a class="heading-anchor" href="#good-resources" aria-label="Link to Good resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://increment.com/on-call/when-the-pager-goes-off/"&gt;What happens when the pager goes off?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pagerduty.com/eng/engineering-needs-incident-commanders/"&gt;Why Your Engineering Teams need Incident Commanders&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Steps.to.handle.on-call"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="steps-to-handle-on-call"&gt;
Steps to handle on-call
&lt;a class="heading-anchor" href="#steps-to-handle-on-call" aria-label="Link to Steps to handle on-call"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Triage&lt;/li&gt;
&lt;li&gt;Coordinate&lt;/li&gt;
&lt;li&gt;Mitigate&lt;/li&gt;
&lt;li&gt;Resolve&lt;/li&gt;
&lt;li&gt;Follow up (Root Cause Analysis or Post Mortem)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="L.Educative.io..2."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="educativeio"&gt;
&lt;a href="https://educative.io/fragmented"&gt;Educative.io&lt;/a&gt;
&lt;a class="heading-anchor" href="#educativeio" aria-label="Link to Educative.io"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Learn and practice Android development from inside your browser. Visit &lt;a href="https://educative.io/fragmented"&gt;Educative.io/Fragmented&lt;/a&gt; to get 10% off.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/195/</guid><pubDate>Mon, 20 Apr 2020 05:00:00 UTC</pubDate></item><item><title>194: Polyglot programmers 🐙</title><link>https://fragmentedpodcast.com/episodes/194/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/02aa2f28-0b33-462b-9d5f-6ebf925659b5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/02aa2f28-0b33-462b-9d5f-6ebf925659b5/194_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;What are Polyglot programmers, should you be one? Listen to this episode and find out!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=LaHIQ2Bwvjo"&gt;KG’s youtube screencast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/AWK"&gt;awk&lt;/a&gt; programming language&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.joelonsoftware.com/2007/06/05/smart-and-gets-things-done/"&gt;Smart and Gettings Things Done : Joel Sposky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/119/"&gt;Ep #119: Flutter with GDE Eugenio
Marletti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://poignant.guide/"&gt;Learning Ruby: Why’s poignant GUIDE to Ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="L.Educative.io..2."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="educativeio"&gt;
&lt;a href="https://educative.io/fragmented"&gt;Educative.io&lt;/a&gt;
&lt;a class="heading-anchor" href="#educativeio" aria-label="Link to Educative.io"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Learn and practice Android development from inside your browser. Visit &lt;a href="https://educative.io/fragmented"&gt;Educative.io/Fragmented&lt;/a&gt; to get 10% off.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://y.jkl.gg"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://b.jkl.gg/"&gt;b.jkl.gg&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/194/</guid><pubDate>Mon, 13 Apr 2020 05:00:00 UTC</pubDate></item><item><title>193: Working from Home – Pandemic on hard mode 🏡</title><link>https://fragmentedpodcast.com/episodes/193/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e0851c1e-7cce-4722-bcb4-226c291b5594?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/e0851c1e-7cce-4722-bcb4-226c291b5594/193_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Well, the world took a crazy turn and everyone’s working from home now. How do
you work from home? An experienced developer who’s done this before talks to a
newbie and discuss their thoughts.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.paulgraham.com/makersschedule.html"&gt;Maker’s schedule vs Manager’s schedule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit --allow-empty -m &amp;quot;todo: listen to fragmented&amp;quot; -m &amp;quot;send KG &amp;amp; DF&amp;lt;br /&amp;gt; tweet&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;git &lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/squash_and_merge.html"&gt;squash &amp;amp; merge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instacart.com/"&gt;Instacart.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.autonomous.ai/"&gt;Autonomous AI Smart desk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/android-from-the-trenches/"&gt;Android from the trenches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fully.com/jarvis-adjustable-height-desk-bamboo.html"&gt;Jarvis Bamboo Standing desk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.standingdesknation.com/products/ergodriven-topo-mat?variant=15388030763042"&gt;Ergo driven TOPO footmat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="L.Educative.io..2."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="educativeio"&gt;
&lt;a href="https://educative.io/fragmented"&gt;Educative.io&lt;/a&gt;
&lt;a class="heading-anchor" href="#educativeio" aria-label="Link to Educative.io"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Learn and practice Android development from inside your browser. Visit &lt;a href="https://educative.io/fragmented"&gt;Educative.io/Fragmented&lt;/a&gt; to get 10% off.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/193/</guid><pubDate>Mon, 06 Apr 2020 05:55:00 UTC</pubDate></item><item><title>192: What is your backup strategy? 📼</title><link>https://fragmentedpodcast.com/episodes/192/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/4b903c35-6b47-4691-aa06-3d8489e14828?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/4b903c35-6b47-4691-aa06-3d8489e14828/192_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk about what a good backup strategy looks like and the different kinds of data you should be backing up.&lt;/p&gt;
&lt;p&gt;Stay safe and think about your backup strategies.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="3-2-1-backup-rule"&gt;
3-2-1 Backup Rule
&lt;a class="heading-anchor" href="#3-2-1-backup-rule" aria-label="Link to 3-2-1 Backup Rule"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.backblaze.com/blog/the-3-2-1-backup-strategy/"&gt;The 3-2-1 Backup Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nakivo.com/blog/3-2-1-backup-rule-efficient-data-protection-strategy/"&gt;The 3-2-1 Backup Rule – An Efficient Data Protection Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unitrends.com/blog/3-2-1-backup-sucks"&gt;Why 3-2-1 Backup Sucks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="backup-software"&gt;
Backup Software
&lt;a class="heading-anchor" href="#backup-software" aria-label="Link to Backup Software"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;KG’s primary Mac:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html"&gt;SuperDuper! by Shirt Pocket&lt;/a&gt; for bootable backups&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.arqbackup.com/"&gt;Arq Backup&lt;/a&gt; for versioned backups -&amp;gt; &lt;a href="https://www.backblaze.com/b2/cloud-storage.html"&gt;Backblaze B2 Cloud Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rsync script that KG uses:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This mirrors both drives defensively (-n is dry run)&lt;/p&gt;
&lt;pre&gt;&lt;code class="sh"&gt; rsync --partial --progress --archive --update \
--verbose\
--human-readable\
--exclude='$RECYCLE.BIN' --exclude='$Recycle.Bin' --exclude='.AppleDB' \
--exclude='.AppleDesktop' --exclude='.AppleDouble' --exclude='.com.apple.timemachine.supported'\
--exclude='.dbfseventsd' --exclude='.DocumentRevisions-V100*' --exclude='.DS_Store'\
--exclude='.fseventsd' --exclude='.PKInstallSandboxManager' --exclude='.Spotlight*'\
--exclude='.SymAV*' --exclude='.symSchedScanLockxz' --exclude='.TemporaryItems'\
--exclude='.Trash*' --exclude='.vol' --exclude='.VolumeIcon.icns' --exclude='Desktop DB'\
--exclude='Desktop DF' --exclude='hiberfil.sys' --exclude='lost+found'\
--exclude='Network Trash Folder' --exclude='pagefile.sys' --exclude='Recycled'\
--exclude='RECYCLER' --exclude='System Volume Information' --exclude='Temporary Items' --exclude='Thumbs.db'\
-n\
/Volumes/xhd_strg/ /Volumes/xhd_strg_bkp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://thewirecutter.com/reviews/best-portable-hard-drive/"&gt;Wirecutter recommends SeaGate drives&lt;/a&gt; instead of the Western Digital Kaushik uses 🤷‍♀️&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="square"&gt;
&lt;a href="https://www.youtube.com/squaredev"&gt;Square&lt;/a&gt;
&lt;a class="heading-anchor" href="#square" aria-label="Link to Square"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Check out the new Square &lt;a href="https://www.youtube.com/squaredev"&gt;YouTube channel for developers&lt;/a&gt;. Square has SDKs and APIs to make payments and run a business.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/kequinoxed/videos?view=0&amp;amp;sort=dd&amp;amp;shelf_id=0"&gt;kaushikgopal&lt;/a&gt; (on YouTube) or &lt;a href="https://blog.kaush.co/"&gt;blog.kaush.co&lt;/a&gt; or &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/192/</guid><pubDate>Tue, 17 Mar 2020 04:36:00 UTC</pubDate></item><item><title>191: Logging 🌲</title><link>https://fragmentedpodcast.com/episodes/191/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/4a007945-c684-4805-b75c-cc393dff4698?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/4a007945-c684-4805-b75c-cc393dff4698/191_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Today we talk about logging. When to log, how to log, what to log – our thoughts on the subject.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gdpr-info.eu/"&gt;GDPR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/studio/debug/am-logcat#WriteLogs"&gt;Android Logging priorities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://logdna.com"&gt;LogDna&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.loggly.com/lp-loggly-general/"&gt;Loggly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datadoghq.com/"&gt;Datadog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.papertrail.com/"&gt;Papertrail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android logging: &lt;a href="https://github.com/JakeWharton/timber"&gt;Timber by Jake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JS Logging: &lt;a href="https://github.com/winstonjs/winston"&gt;Winston&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/libphonenumber"&gt;Google – libphonenumber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=2c2o10Pr90Y"&gt;Fragmented Podcast Episode #145: Tracking Network Requests With x-Request-ID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="Square"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="square"&gt;
&lt;a href="https://www.youtube.com/squaredev"&gt;Square&lt;/a&gt;
&lt;a class="heading-anchor" href="#square" aria-label="Link to Square"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Check out the new Square &lt;a href="https://www.youtube.com/squaredev"&gt;YouTube channel for developers&lt;/a&gt;. Square has SDKs and APIs to make payments and run a business.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://blog.kaush.co"&gt;blog.kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/191/</guid><pubDate>Mon, 09 Mar 2020 14:56:00 UTC</pubDate></item><item><title>190: The Privacy of ***********</title><link>https://fragmentedpodcast.com/episodes/190/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1dbfbaee-6382-4402-aead-85abad32e18e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1dbfbaee-6382-4402-aead-85abad32e18e/190-privacy_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and KG talk about the post Tim Bray recently wrote – &lt;a href="https://www.tbray.org/ongoing/When/202x/2020/02/09/Why-Android"&gt;Why Google did Android&lt;/a&gt;. They then touch on Chrome becoming a monopoly and tips on what folks can do to be a little more privacy conscious on the web.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tbray.org/ongoing/When/202x/2020/02/09/Why-Android"&gt;Why Google did Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KG privacy notes &lt;a href="https://blog.kaush.co/2019/01/21/new-year-2019/#care-about-your-privacy"&gt;2019&lt;/a&gt; -&amp;gt; &lt;a href="https://blog.kaush.co/2020/02/04/2020/#care-about-your-privacy"&gt;2020&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/bang"&gt;DuckDuck Bang syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Google.Chromium.and.Ad-blocking"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="google-chromium-and-ad-blocking"&gt;
Google Chromium and Ad-blocking
&lt;a class="heading-anchor" href="#google-chromium-and-ad-blocking" aria-label="Link to Google Chromium and Ad-blocking"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://9to5google.com/2019/05/29/chrome-ad-blocking-enterprise-manifest-v3/"&gt;Google to restrict modern ad blocking Chrome extensions to enterprise users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wired.com/story/google-chrome-ad-blockers-extensions-api/"&gt;Google saying it isn’t killing Ad Blockers. Ad Blockers Disagree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Misc"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.microsoft.com/en-us/help/4501095/download-the-new-microsoft-edge-based-on-chromium"&gt;New Microsoft Edge is based on Chromium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download &lt;a href="https://www.mozilla.org/en-US/firefox/new/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Firefox &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/"&gt;Multi-Account Containers&lt;/a&gt; add-on + &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/temporary-containers/"&gt;Temporary Containers&lt;/a&gt; for the privacy conscious.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Follow.up.from.a.previous.episode:"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="follow-up-from-a-previous-episode"&gt;
Follow up from a previous episode:
&lt;a class="heading-anchor" href="#follow-up-from-a-previous-episode" aria-label="Link to Follow up from a previous episode:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://svelte.dev/"&gt;Svelte : framework that spawned from New York Times&lt;/a&gt;. Thanks &lt;a href="https://twitter.com/midhunhk/status/1227055151967502336"&gt;Midhun&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; or &lt;a href="https://blog.kaush.co"&gt;blog.kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/190/</guid><pubDate>Mon, 24 Feb 2020 05:00:00 UTC</pubDate></item><item><title>189: The 2038 Problem</title><link>https://fragmentedpodcast.com/episodes/189/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b04326c5-b8f2-4c13-87cf-a9637671bae6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b04326c5-b8f2-4c13-87cf-a9637671bae6/189-problem-2038_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We’ve all heard of the &lt;a href="https://en.wikipedia.org/wiki/Year_2000_problem"&gt;Y2K problem&lt;/a&gt;, but there’s also a similar coming up this 2038 for us programmers. In this episode we dive into the 2038 problem (… after of course talking about our opinions on new year resolutions).&lt;/p&gt;
&lt;p&gt;Get 1% better every day folks… Listen here:&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://en.wikipedia.org/wiki/Year_2000_problem"&gt;Year 2000 problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://en.wikipedia.org/wiki/Year_2038_problem"&gt;Year 2038 problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=yd1i3vkkh-0"&gt;The Leap Year as Explained by Neil deGrasse Tyson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.kaush.co/2020/02/04/2020/"&gt;KG’s 2020 New Year Resolution blog post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; or &lt;a href="https://blog.kaush.co"&gt;blog.kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/189/</guid><pubDate>Mon, 17 Feb 2020 05:00:00 UTC</pubDate></item><item><title>188: Containerized applications with Docker</title><link>https://fragmentedpodcast.com/episodes/188/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/fc3441f0-e4d1-4b89-bd81-036fe76fd6d0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/fc3441f0-e4d1-4b89-bd81-036fe76fd6d0/188-containerized-applications-with-docker_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode KG and Donn talk about KG’s recent jaunt with Docker. In the attempt to setup continuous deployment for his blog, KG explains his simple requirement and how it lands up requiring some basic Docker. Donn then closes it out with some interesting in-depth knowledge on how to use Docker&lt;/p&gt;
&lt;h3 id="personal-website-hosting"&gt;
Personal website hosting
&lt;a class="heading-anchor" href="#personal-website-hosting" aria-label="Link to Personal website hosting"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com"&gt;Donn Felker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://2kg.dev"&gt;Kaushik’s website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gjtorikian/html-proofer"&gt;html-proofer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wordpress.com"&gt;WordPress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jekyllrb.com"&gt;jekyll static website blogging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Domain.checking.services"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="domain-checking-services"&gt;
Domain checking services
&lt;a class="heading-anchor" href="#domain-checking-services" aria-label="Link to Domain checking services"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://domainr.com"&gt;Domainr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leandomainsearch.com/search/?q=cow"&gt;Lead Domain Search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Docker"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="docker"&gt;
Docker
&lt;a class="heading-anchor" href="#docker" aria-label="Link to Docker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com"&gt;Docker Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/circleci-public/dockerfile-wizard"&gt;Circle CI : dockerfile wizard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/r/kaushikgopal/ruby-node/tags"&gt;KG’s ruby-node docker container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rabbitmq.com"&gt;RabbitMq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io"&gt;Kubernetes : K8s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/course/docker-and-kubernetes-the-complete-guide/"&gt;Udemy course: Docker &amp;amp; Kubernetes – The complete guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vuejs.org"&gt;Vue Js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/de/docs/guides/nodejs-docker-webapp/"&gt;Dockerizing a Node.JS Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/188/</guid><pubDate>Mon, 03 Feb 2020 05:03:00 UTC</pubDate></item><item><title>187: Coroutines with Manuel Vivo &amp; Sean McQuillan</title><link>https://fragmentedpodcast.com/episodes/187/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b989c251-2548-449b-b0e9-bf0d486b2604?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b989c251-2548-449b-b0e9-bf0d486b2604/187-coroutine_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It finally happens! KG and Donn talk about Coroutines with two experts at Google Manuel &amp;amp; Sean. We’ve waited quite sometime on Fragmented to discuss this topic. We wanted to make sure Coroutines was mature enough to be compared with the contenders. Listen to find out more!&lt;/p&gt;
&lt;h1 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/androiddevelopers/suspending-over-views-19de9ebd7020"&gt;Chris Banes – Suspending over Views Animations &amp;amp; Coroutines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="" target="_blank" rel="nofollow"&gt;KotlinConf 2018: Exploring Coroutines in Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/coroutines"&gt;Coroutines Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/kotlinx.coroutines/tree/master/kotlinx-coroutines-test"&gt;Coroutines test library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#0"&gt;Codelab: Kotlin Coroutines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/advanced-kotlin-coroutines/index.html#0"&gt;Codelab: Kotlin Advanced Coroutines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=KMb0Fs8rCRs"&gt;Testing Coroutines Talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=w0kfnydnFWI"&gt;Cancellation and Exceptions in Coroutines Talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/androiddevelopers/coroutines-on-android-part-i-getting-the-background-3e0e54d20bb"&gt;Sean’s Coroutines blog series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/androiddevelopers/lessons-learnt-using-coroutines-flow-4a6b285c0d06"&gt;Manuel’s blog post about Flow in the Android Developer Summit app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/objcode"&gt;Sean McQuillan @objcode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/manuelvicnt"&gt;Manuel Vivo @objcode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/187/</guid><pubDate>Tue, 21 Jan 2020 05:00:00 UTC</pubDate></item><item><title>186: Announcement 2020</title><link>https://fragmentedpodcast.com/episodes/186/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d0aa3490-d293-42a9-8ab3-21ab46765fc7?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d0aa3490-d293-42a9-8ab3-21ab46765fc7/186-announcement-2020_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;An important announcement.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/186/</guid><pubDate>Mon, 06 Jan 2020 05:01:00 UTC</pubDate></item><item><title>185: Year End Decompress</title><link>https://fragmentedpodcast.com/episodes/185/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/27886e9e-8b05-4f23-b2e5-39369ecc39de?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/27886e9e-8b05-4f23-b2e5-39369ecc39de/185-yearenddecompress_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this decompress episode, Donn and KG talk about how their 2019 went. It goes from Dagger talk to Kotlin talk to Kotlin Conf talk. Give it a listen and enjoy!&lt;/p&gt;
&lt;h1 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;a name="Square"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="square"&gt;
&lt;a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__youtube.com_squaredev&amp;amp;d=DwMFaQ&amp;amp;c=Hso5VlsiAbVjjQbjbkggFA&amp;amp;r=5rswfIrZ3jVQKjXDtb9aJ7x0EBd4bwewuxP5wKrNbTY&amp;amp;m=hPRbjx-2eHbr8PV9JaOdTBJ-Ma1mfUz__WKALHiX4eg&amp;amp;s=yf1KdtXZj8B_Q8t6Tz0vHxYCMYT9l5u5-dOst-u3Pn8&amp;amp;e="&gt;Square&lt;/a&gt;
&lt;a class="heading-anchor" href="#square" aria-label="Link to Square"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Square has SDKs and APIs to make payments and run a business. Even better, Square has a new YouTube channel for developers! Check out Square’s new YouTube Channel for Developers at &lt;a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__youtube.com_squaredev&amp;amp;d=DwMFaQ&amp;amp;c=Hso5VlsiAbVjjQbjbkggFA&amp;amp;r=5rswfIrZ3jVQKjXDtb9aJ7x0EBd4bwewuxP5wKrNbTY&amp;amp;m=hPRbjx-2eHbr8PV9JaOdTBJ-Ma1mfUz__WKALHiX4eg&amp;amp;s=yf1KdtXZj8B_Q8t6Tz0vHxYCMYT9l5u5-dOst-u3Pn8&amp;amp;e="&gt;youtube.com/squaredev&lt;/a&gt; and let them know you heard about it from us.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/185/</guid><pubDate>Mon, 16 Dec 2019 05:00:00 UTC</pubDate></item><item><title>184: Should I use a BaseActivity in my Android apps?</title><link>https://fragmentedpodcast.com/episodes/184/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1e53848d-d102-473e-988d-cdd7503e8b12?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1e53848d-d102-473e-988d-cdd7503e8b12/184-should-i-use-a-baseactivity-in-my-android-apps_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Kaushik tries to talk through this question.&lt;/p&gt;
&lt;p&gt;Thanks to friends of the show &lt;a href="https://twitter.com/molsjeroen"&gt;Jeroen&lt;/a&gt;, &lt;a href="https://twitter.com/yigitboyar?lang=en"&gt;Yigit&lt;/a&gt; and a bunch of others who ran through some ideas on this one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/app/Application#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks)"&gt;Application.registerActivityLifecycleCallbacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/lifecycle"&gt;Android X Lifecycle Component&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/16/"&gt;Ep 16: Favor composition over inheritance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;a name="Square"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="square"&gt;
&lt;a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__youtube.com_squaredev&amp;amp;d=DwMFaQ&amp;amp;c=Hso5VlsiAbVjjQbjbkggFA&amp;amp;r=5rswfIrZ3jVQKjXDtb9aJ7x0EBd4bwewuxP5wKrNbTY&amp;amp;m=hPRbjx-2eHbr8PV9JaOdTBJ-Ma1mfUz__WKALHiX4eg&amp;amp;s=yf1KdtXZj8B_Q8t6Tz0vHxYCMYT9l5u5-dOst-u3Pn8&amp;amp;e="&gt;Square&lt;/a&gt;
&lt;a class="heading-anchor" href="#square" aria-label="Link to Square"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Square has SDKs and APIs to make payments and run a business. Even better, Square has a new YouTube channel for developers! Check out Square’s new YouTube Channel for Developers at &lt;a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__youtube.com_squaredev&amp;amp;d=DwMFaQ&amp;amp;c=Hso5VlsiAbVjjQbjbkggFA&amp;amp;r=5rswfIrZ3jVQKjXDtb9aJ7x0EBd4bwewuxP5wKrNbTY&amp;amp;m=hPRbjx-2eHbr8PV9JaOdTBJ-Ma1mfUz__WKALHiX4eg&amp;amp;s=yf1KdtXZj8B_Q8t6Tz0vHxYCMYT9l5u5-dOst-u3Pn8&amp;amp;e="&gt;youtube.com/squaredev&lt;/a&gt; and let them know you heard about it from us.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/184/</guid><pubDate>Mon, 02 Dec 2019 05:00:00 UTC</pubDate></item><item><title>183: The Testing Paradox</title><link>https://fragmentedpodcast.com/episodes/183/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3342b5c8-5e71-4228-ab0d-46da21e62702?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3342b5c8-5e71-4228-ab0d-46da21e62702/183-the-testing-paradox_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;How do you know what to test when you don’t even know how to write the code that you need to test? This is a paradox that many developers find themselves in daily.&lt;/p&gt;
&lt;p&gt;In this episode Donn talks about his strategy for dealing with unknowns in programming, namely around testing and how to figure out how to write tests for new code that might be difficult, unfamiliar or even legacy code.&lt;/p&gt;
&lt;p&gt;&lt;a name="Links"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/RonJeffries/status/1197173969520136197"&gt;Ron Jefferies Tweet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/erluxman/status/1197548362137948160"&gt;Luxman Tweet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker/status/1197559979789766656"&gt;Donn Tweet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Spike_(software_development)"&gt;What is a Spike?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;a name="Square"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="square"&gt;
&lt;a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__youtube.com_squaredev&amp;amp;d=DwMFaQ&amp;amp;c=Hso5VlsiAbVjjQbjbkggFA&amp;amp;r=5rswfIrZ3jVQKjXDtb9aJ7x0EBd4bwewuxP5wKrNbTY&amp;amp;m=hPRbjx-2eHbr8PV9JaOdTBJ-Ma1mfUz__WKALHiX4eg&amp;amp;s=yf1KdtXZj8B_Q8t6Tz0vHxYCMYT9l5u5-dOst-u3Pn8&amp;amp;e="&gt;Square&lt;/a&gt;
&lt;a class="heading-anchor" href="#square" aria-label="Link to Square"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Square has SDKs and APIs to make payments and run a business. Even better, Square has a new YouTube channel for developers! Check out Square’s new YouTube Channel for Developers at &lt;a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__youtube.com_squaredev&amp;amp;d=DwMFaQ&amp;amp;c=Hso5VlsiAbVjjQbjbkggFA&amp;amp;r=5rswfIrZ3jVQKjXDtb9aJ7x0EBd4bwewuxP5wKrNbTY&amp;amp;m=hPRbjx-2eHbr8PV9JaOdTBJ-Ma1mfUz__WKALHiX4eg&amp;amp;s=yf1KdtXZj8B_Q8t6Tz0vHxYCMYT9l5u5-dOst-u3Pn8&amp;amp;e="&gt;youtube.com/squaredev&lt;/a&gt; and let them know you heard about it from us.&lt;/p&gt;
&lt;p&gt;&lt;a name="Flatiron.School"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="flatiron-school"&gt;
&lt;a href="https://flatironschool.com/fragmented"&gt;Flatiron School&lt;/a&gt;
&lt;a class="heading-anchor" href="#flatiron-school" aria-label="Link to Flatiron School"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Learn UX/UI design &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt; in 24 weeks and discover our global community on campus or online and go back to school with Flatiron School! &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Change careers with confidence with 1:1 support from our dedicated Career Coaches and a money-back guarantee. Complete details at &lt;a href="https://flatironschool.com/terms"&gt;flatironschool.com/terms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See you in class!&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/183/</guid><pubDate>Mon, 25 Nov 2019 05:00:00 UTC</pubDate></item><item><title>182: Where do I put DB objects in a modularized Android app?</title><link>https://fragmentedpodcast.com/episodes/182/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3fca4317-0433-4060-a721-8d3988da946e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3fca4317-0433-4060-a721-8d3988da946e/182_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;App Modularization has plenty of benefits and a lot of Android devs today are starting to modularize their android app.&lt;/p&gt;
&lt;p&gt;A common problem though that most folks will start to run into is – how do you manage your database objects in these modules? do you create a single module with all your database dependencies (modularize by layer), do you do the right thing and modularize by feature so each module has it’s own database file etc.?&lt;/p&gt;
&lt;p&gt;In this episode Kaushik grapples with that question and tries to come up with an answer.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="Modularization..KG.s.favorite.resources."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="modularization-kg8217s-favorite-resources"&gt;
Modularization (KG’s favorite resources)
&lt;a class="heading-anchor" href="#modularization-kg8217s-favorite-resources" aria-label="Link to Modularization (KG&amp;amp;#8217;s favorite resources)"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=PZBg5DIzNww"&gt;Google IO 19&lt;/a&gt; : Build a modular Android app architecture&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeroenmols.com/blog/2019/03/06/modularizationwhy/"&gt;Jeroen Mols’s posts&lt;/a&gt; : Modularization – Why you should care&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developer-experts/modularizing-android-applications-9e2d18f244a0"&gt;Joe Birch’s posts&lt;/a&gt; : Modularizing Android Appications&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/117"&gt;Ep 117&lt;/a&gt; : Multi Module Builds in Gradle&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/mindorks/writing-a-modular-project-on-android-304f3b09cb37"&gt;Karan Trehan’s post&lt;/a&gt; : Writing a modular project on Android&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="Vettery"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="vettery"&gt;
&lt;a href="https://www.vettery.com/tech?utm_source=podcast&amp;amp;utm_medium=fragmented&amp;amp;utm_term=tech&amp;amp;utm_content=grouped&amp;amp;utm_campaign=ad-92136"&gt;Vettery&lt;/a&gt;
&lt;a class="heading-anchor" href="#vettery" aria-label="Link to Vettery"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Vettery is an online hiring marketplace that is changing the way people hire and get hired. Make a free profile, name your salary, and connect with hiring managers from top employers today.&lt;/p&gt;
&lt;p&gt;Listeners of Fragmented get a $300 bonus if you accept a job through Vettery! Sign up at &lt;a href="https://www.vettery.com/tech?utm_source=podcast&amp;amp;utm_medium=fragmented&amp;amp;utm_term=tech&amp;amp;utm_content=grouped&amp;amp;utm_campaign=ad-92136"&gt;vettery.com/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;&lt;a name="Flatiron.School"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="flatiron-school"&gt;
&lt;a href="https://flatironschool.com/fragmented"&gt;Flatiron School&lt;/a&gt;
&lt;a class="heading-anchor" href="#flatiron-school" aria-label="Link to Flatiron School"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Learn UX/UI design &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt; in 24 weeks and discover our global community on campus or online and go back to school with Flatiron School! &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Change careers with confidence with 1:1 support from our dedicated Career Coaches and a money-back guarantee. Complete details at &lt;a href="https://flatironschool.com/terms"&gt;flatironschool.com/terms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See you in class!&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/182/</guid><pubDate>Mon, 18 Nov 2019 05:00:00 UTC</pubDate></item><item><title>181: In Functional Programming how to do IO and database operations</title><link>https://fragmentedpodcast.com/episodes/181/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d7cbd1e4-c893-40b9-8464-078c326808f5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d7cbd1e4-c893-40b9-8464-078c326808f5/181-how-to-do-io-operations-in-functional-programming_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In the world of Functional programming where pure functions don’t encourage side-effects, how does on actually do any IO?&lt;/p&gt;
&lt;p&gt;So in this brave new world where everyone is adopting more FP principles, do we just stop doing database operations? Listen to this episode to find out.&lt;/p&gt;
&lt;h3 id="functional-programming-basics"&gt;
Functional Programming basics
&lt;a class="heading-anchor" href="#functional-programming-basics" aria-label="Link to Functional Programming basics"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/83/"&gt;Ep 83&lt;/a&gt; : Learning the basics of functional programing with Anup Cowkur&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/120/"&gt;Ep 120&lt;/a&gt; : Functional Programming with Kotlin Arrow team&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/121/"&gt;Ep 121&lt;/a&gt; : Functional Programming with Kotlin Arrow team (Part 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Unidirectional.State.Flow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="unidirectional-state-flow"&gt;
Unidirectional State Flow
&lt;a class="heading-anchor" href="#unidirectional-state-flow" aria-label="Link to Unidirectional State Flow"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/148"&gt;Ep 148&lt;/a&gt; and &lt;a href="https://fragmentedpodcast.com/episodes/151"&gt;Ep 151&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KG’s &lt;a href="https://speakerdeck.com/kaushikgopal/architecting-android-and-ios-apps-in-2020?slide=65"&gt;speakerdeck slide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KG’s Movie search apps &lt;a href="https://github.com/kaushikgopal/movies-usf-android"&gt;Android app&lt;/a&gt; + &lt;a href="https://github.com/kaushikgopal/movies-usf-ios"&gt;iOS app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Resources.for.FP.IO.contention"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="resources-for-fpio-contention"&gt;
Resources for FP/IO contention
&lt;a class="heading-anchor" href="#resources-for-fpio-contention" aria-label="Link to Resources for FP/IO contention"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/8406261/most-common-pattern-for-using-a-database-in-a-functional-language-given-desire"&gt;StackOverflow Q&amp;amp;A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flyingfrogblog.blogspot.com/2015/03/functional-programming-and-databases.html"&gt;Flying Frog Blog: Functional programming and databases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="Flatiron.School"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="flatiron-school"&gt;
&lt;a href="https://flatironschool.com/fragmented"&gt;Flatiron School&lt;/a&gt;
&lt;a class="heading-anchor" href="#flatiron-school" aria-label="Link to Flatiron School"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Learn UX/UI design &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt; in 24 weeks and discover our global community on campus or online and go back to school with Flatiron School! &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Change careers with confidence with 1:1 support from our dedicated Career Coaches and a money-back guarantee. Complete details at &lt;a href="https://flatironschool.com/terms"&gt;flatironschool.com/terms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See you in class!&lt;/p&gt;
&lt;p&gt;–&lt;/p&gt;
&lt;p&gt;&lt;a name="Vettery"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="vettery"&gt;
&lt;a href="https://www.vettery.com/tech?utm_source=podcast&amp;amp;utm_medium=fragmented&amp;amp;utm_term=tech&amp;amp;utm_content=grouped&amp;amp;utm_campaign=ad-92136"&gt;Vettery&lt;/a&gt;
&lt;a class="heading-anchor" href="#vettery" aria-label="Link to Vettery"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Vettery is an online hiring marketplace that is changing the way people hire and get hired. Make a free profile, name your salary, and connect with hiring managers from top employers today.&lt;/p&gt;
&lt;p&gt;Listeners of Fragmented get a $300 bonus if you accept a job through Vettery! Sign up at &lt;a href="https://www.vettery.com/tech?utm_source=podcast&amp;amp;utm_medium=fragmented&amp;amp;utm_term=tech&amp;amp;utm_content=grouped&amp;amp;utm_campaign=ad-92136"&gt;vettery.com/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/181/</guid><pubDate>Wed, 13 Nov 2019 05:00:00 UTC</pubDate></item><item><title>180: Code Comments</title><link>https://fragmentedpodcast.com/episodes/180/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e548da84-85c0-46eb-90ce-e6c306334c9f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/e548da84-85c0-46eb-90ce-e6c306334c9f/180-code-comments_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn talks about when it’s appropriate to comment your code.&lt;/p&gt;
&lt;p&gt;Donn then dives into the types of code comments, when you might want to comment vs when you might not want to (depending upon your consumer) and then gets into how he decides to comment his code with a simple two-step process.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2 id="things-mentioned"&gt;
Things Mentioned
&lt;a class="heading-anchor" href="#things-mentioned" aria-label="Link to Things Mentioned"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/code-comments/"&gt;Commenting Code Post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;a name="Bitrise"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="bitrise"&gt;
&lt;a href="https://go.bitrise.io/fragmented"&gt;Bitrise&lt;/a&gt;
&lt;a class="heading-anchor" href="#bitrise" aria-label="Link to Bitrise"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Build amazing apps in Java, Kotlin or whatever tech you prefer and use Bitrise to automate your Android integration, build, test and deploy process quickly and easily.&lt;/p&gt;
&lt;p&gt;Sign up for an exquisite pair of Bitrise Branded Socks at &lt;a href="https://go.bitrise.io/fragmented"&gt;https://go.bitrise.io/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Flatiron.School"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="flatiron-school"&gt;
&lt;a href="https://flatironschool.com/fragmented"&gt;Flatiron School&lt;/a&gt;
&lt;a class="heading-anchor" href="#flatiron-school" aria-label="Link to Flatiron School"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Learn UX/UI design &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt; in 24 weeks and discover our global community on campus or online and go back to school with Flatiron School! &lt;a href="https://flatironschool.com/fragmented"&gt;flatironschool.com/fragmented&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Change careers with confidence with 1:1 support from our dedicated Career Coaches and a money-back guarantee. Complete details at &lt;a href="https://flatironschool.com/terms"&gt;flatironschool.com/terms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See you in class!&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/180/</guid><pubDate>Mon, 04 Nov 2019 05:00:00 UTC</pubDate></item><item><title>179: Kaushiks Top Tips For Giving A Technical Talk</title><link>https://fragmentedpodcast.com/episodes/179/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/7892be37-26cb-47ea-92c2-71173bdbc84c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/7892be37-26cb-47ea-92c2-71173bdbc84c/179-technical-talk-tips_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Kaush breaks down how he begins creating and writing technical talks, using a talk he’s about to give at the Mobilization Conference.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;h2 id="things-mentioned"&gt;
Things Mentioned
&lt;a class="heading-anchor" href="#things-mentioned" aria-label="Link to Things Mentioned"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://twitter.com/kaushikgopal/status/1187662994253193216"&gt;Mobilization conference – KG is about to give a talk at&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Post it notes &lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2019/10/IMG_1900-1024x768.jpg"&gt;pic1&lt;/a&gt; &lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2019/10/IMG_1901-1024x768.jpg"&gt;pic 2&lt;/a&gt;
*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/kaushikgopal/"&gt;My Speakerdeck&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/kaushikgopal/san-jose-theme"&gt;San Jose Theme&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/nickbutcher"&gt;Nick Butcher – speakerdeck&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://speakerdeck.com/cyrilmottier"&gt;Cyril Motier – speakerdeck&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;a name="Vettery"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="vettery"&gt;
&lt;a href="https://www.vettery.com/tech?utm_source=podcast&amp;amp;utm_medium=fragmented&amp;amp;utm_term=tech&amp;amp;utm_content=grouped&amp;amp;utm_campaign=ad-92136"&gt;Vettery&lt;/a&gt;
&lt;a class="heading-anchor" href="#vettery" aria-label="Link to Vettery"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Vettery is an online hiring marketplace that is changing the way people hire and get hired. Make a free profile, name your salary, and connect with hiring managers from top employers today.&lt;/p&gt;
&lt;p&gt;Listeners of Fragmented get a $300 bonus if you accept a job through Vettery! Sign up at &lt;a href="https://www.vettery.com/tech?utm_source=podcast&amp;amp;utm_medium=fragmented&amp;amp;utm_term=tech&amp;amp;utm_content=grouped&amp;amp;utm_campaign=ad-92136"&gt;vettery.com/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Bitrise"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="bitrise"&gt;
&lt;a href="https://go.bitrise.io/fragmented"&gt;Bitrise&lt;/a&gt;
&lt;a class="heading-anchor" href="#bitrise" aria-label="Link to Bitrise"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Build amazing apps in Java, Kotlin or whatever tech you prefer and use Bitrise to automate your Android integration, build, test and deploy process quickly and easily.&lt;/p&gt;
&lt;p&gt;Sign up for an exquisite pair of Bitrise Branded Socks at &lt;a href="https://go.bitrise.io/fragmented"&gt;https://go.bitrise.io/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/179/</guid><pubDate>Mon, 28 Oct 2019 05:00:00 UTC</pubDate></item><item><title>178: Learning New Languages</title><link>https://fragmentedpodcast.com/episodes/178/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/88f088c9-f814-4ffa-9d4a-af7f1c9494d0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/88f088c9-f814-4ffa-9d4a-af7f1c9494d0/178-learning-new-languages_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As Android developers we know Java and now Kotlin. But to become even more seasoned developers, learning newer languages can be a level booster.&lt;/p&gt;
&lt;p&gt;The list can go on and on, especially if you’ve been in the industry awhile. So, when does it make sense for you to learn a new language?&lt;/p&gt;
&lt;p&gt;When should you learn a new language? When does it make sense? How do you do it?&lt;/p&gt;
&lt;p&gt;In this episode KG and Donn discuss the merits of learning new languages, what new languages they’ve picked up and how they feel its important for them and their careers as developers.&lt;/p&gt;
&lt;h1 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Build amazing apps in Java, Kotlin or whatever tech you prefer and use Bitrise to automate your Android integration, build, test and deploy process quickly and easily.&lt;/p&gt;
&lt;p&gt;Sign up for an exquisite pair of Bitrise Branded Socks at &lt;a href="https://go.bitrise.io/fragmented"&gt;https://go.bitrise.io/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/178/</guid><pubDate>Mon, 14 Oct 2019 05:00:00 UTC</pubDate></item><item><title>177: Over-Engineered Code</title><link>https://fragmentedpodcast.com/episodes/177/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1e13a98d-be01-4710-8956-56f2907b3598?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1e13a98d-be01-4710-8956-56f2907b3598/177-overengineering-code_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;How do you know if some code is over-engineered?&lt;/p&gt;
&lt;p&gt;What does that even look like?&lt;/p&gt;
&lt;p&gt;How do you know if you’re over-engineering the code that you’re writing?&lt;/p&gt;
&lt;p&gt;What if you recently started at a new company, how do you know if the code you’re working with is over-engineered?&lt;/p&gt;
&lt;p&gt;In this episode, Kaushik and Donn go back and forth on this topic …&lt;/p&gt;
&lt;h1 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;This episode is sponsored by &lt;a href="https://instabug.com/android/sdk?utm_source=fragmented&amp;amp;utm_medium=podcasts&amp;amp;utm_campaign=fragmented-podcasts-q419-october"&gt;Instabug&lt;/a&gt; –&lt;/p&gt;
&lt;p&gt;Understand How Your App is Doing with Real-Time Contextual Insights From Your Users&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/177/</guid><pubDate>Mon, 07 Oct 2019 05:00:00 UTC</pubDate></item><item><title>176: Kotlin’s !! Operator is a Code Smell</title><link>https://fragmentedpodcast.com/episodes/176/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1e13a98d-be01-4710-8956-56f2907b3598?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1e13a98d-be01-4710-8956-56f2907b3598/177-overengineering-code_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Kotlin isn’t a magic bullet that prevents NullPointerExceptions.&lt;/p&gt;
&lt;p&gt;Not at all.&lt;/p&gt;
&lt;p&gt;What Kotlin does do is force you to think about how you want to handle your nulls. through Kotlin forcing you to think this through, the hope is that you’ll avoid NullPointerExceptions. The only problem is, Kotlin has the !! operator, also known as the “Not Null Assertion Operator”. This operator basically says “Hey Kotlin, trust me, I’m a pro, I know what I’m doing … I KNOW THIS WON’T BE NULL”.&lt;/p&gt;
&lt;p&gt;This… is a code smell.&lt;/p&gt;
&lt;p&gt;In this episode, Donn walks through why Kotlin’s Not Null Assertion Operator (!!) is a code smell and what you can do to alleviate it.&lt;/p&gt;
&lt;h1 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;This episode is sponsored by &lt;a href="https://go.bitrise.io/fragmented"&gt;Bitrise&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Build and operate better apps, faster with Bitrise.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://go.bitrise.io/fragmented"&gt;Learn more about Bitrise&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/176/</guid><pubDate>Mon, 30 Sep 2019 05:00:00 UTC</pubDate></item><item><title>175: Kotlin or Java – Which one should you learn?</title><link>https://fragmentedpodcast.com/episodes/175/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/79644160-c7af-498e-aaa7-31ee29a95c65?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/79644160-c7af-498e-aaa7-31ee29a95c65/175-kotlin-or-java-which-one-should-you-learn_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;One question that Kaushik and I get all the time is this …&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m starting to learn how to build Android apps, which language should
I learn? Kotlin or Java?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this episode Donn answers this question and gives valid points on why both languages are valid options and why you might want to consider one over the other.&lt;/p&gt;
&lt;p&gt;He provides caveats to why you might want to use one language over another and some of the trade offs of Java and Kotlin and how they operate together.&lt;/p&gt;
&lt;p&gt;If you’re wrestling with this question, this is the show for you …&lt;/p&gt;
&lt;p&gt;&lt;a name="Thanks.to.this.week.s.sponsor:.Bitrise"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="thanks-to-this-week8217s-sponsor-bitrise"&gt;
Thanks to this week’s sponsor: &lt;a href="https://go.bitrise.io/fragmented"&gt;Bitrise&lt;/a&gt;
&lt;a class="heading-anchor" href="#thanks-to-this-week8217s-sponsor-bitrise" aria-label="Link to Thanks to this week&amp;amp;#8217;s sponsor: Bitrise"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Build amazing apps in Java, Kotlin or whatever tech you prefer and use Bitrise to automate your Android integration, build, test and deploy process quickly and easily. Sign up for an exquisite pair of Bitrise Branded Socks, here! &lt;a href="https://go.bitrise.io/fragmented"&gt;https://go.bitrise.io/fragmented&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/175/</guid><pubDate>Mon, 23 Sep 2019 05:00:00 UTC</pubDate></item><item><title>174: Testing RxJava, Debugging and More</title><link>https://fragmentedpodcast.com/episodes/174/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2cda6b4a-b77f-48d1-aeec-5104cc55a7b5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/2cda6b4a-b77f-48d1-aeec-5104cc55a7b5/debugging_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Kaushik is back in this weeks podcast. 🎉&lt;/p&gt;
&lt;p&gt;Donn and Kaushik talk about testing RxJava streams with a Kotlin extension method and how and when to test various scenarios. Donn talks about his thoughts on the Testing Pyramid and why he thinks it’s incorrect and how you can help shift your thinking in regards to it. They then talk about IDE themes and how the theme can help you with your day to day development and more.&lt;/p&gt;
&lt;p&gt;They wrap up with some talk about developing on Macs vs Windows and Linux.&lt;/p&gt;
&lt;p&gt;We hope you enjoy …&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2019/09/Screen-Shot-2019-08-19-at-4.02.51-PM.png"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2019/09/Screen-Shot-2019-08-19-at-4.02.51-PM.png" alt="" width="2784" height="2338" class="aligncenter size-full wp-image-552" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2019/09/Screen-Shot-2019-08-19-at-4.02.51-PM.png 2784w, https://fragmentedpodcast.com/images/wp-content/uploads/2019/09/Screen-Shot-2019-08-19-at-4.02.51-PM-300x252.png 300w, https://fragmentedpodcast.com/images/wp-content/uploads/2019/09/Screen-Shot-2019-08-19-at-4.02.51-PM-768x645.png 768w, https://fragmentedpodcast.com/images/wp-content/uploads/2019/09/Screen-Shot-2019-08-19-at-4.02.51-PM-1024x860.png 1024w" sizes="(max-width: 2784px) 100vw, 2784px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/174/</guid><pubDate>Mon, 02 Sep 2019 05:00:00 UTC</pubDate></item><item><title>173: What Pattern Should I Use – MVP, MVVM, MVI …?</title><link>https://fragmentedpodcast.com/episodes/173/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3b5b4586-5946-473b-8912-262cd81d56bc?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3b5b4586-5946-473b-8912-262cd81d56bc/what-pattern-should-i-use-mvp-mvvm-mvi_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This week Donn talks about what pattern you should use when developing your application. Is it MVP? MVVM? Mabye MVI? Perhaps it’s something else. Find out in this episode.&lt;/p&gt;
&lt;p&gt;We hope you enjoy …&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a name="Patters"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="patters"&gt;
Patters
&lt;a class="heading-anchor" href="#patters" aria-label="Link to Patters"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/mvp"&gt;MVP Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/android-mvvm-pattern"&gt;MVVM Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//caster.io/courses/android-mvi-pattern"&gt;MVI Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/android-mvrx-fundamentals"&gt;MvRx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/android-clean-architecture"&gt;Clean Arhictecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Mocking.Out.the.API.in.Espresso"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="mocking-out-the-api-in-espresso"&gt;
Mocking Out the API in Espresso
&lt;a class="heading-anchor" href="#mocking-out-the-api-in-espresso" aria-label="Link to Mocking Out the API in Espresso"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/mockwebserver"&gt;MockWebServer Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiremock.org/docs/android/"&gt;WireMock Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/173/</guid><pubDate>Mon, 26 Aug 2019 05:00:00 UTC</pubDate></item><item><title>172: Coil Image Loading Library with Colin White</title><link>https://fragmentedpodcast.com/episodes/171/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6bc8f871-7403-48a1-848e-872f817b0083?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6bc8f871-7403-48a1-848e-872f817b0083/jetpackcompose_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik sit down with Instacart Engineer Colin White to discuss a new image library he has created called Coil.&lt;/p&gt;
&lt;p&gt;Coil is a Kotlin-first image library that focuses on ease of use, simplicity and extensibility. In this episode we ask him the question you’re probably wondering … “Why create an image library, isn’t this a solved problem already?” and then move onto the details of how the library works, and what it offers developers.&lt;/p&gt;
&lt;p&gt;From Donn’s perspective – It’s an interesting library and gives you what you need with minimal footprint but offers you the extensibility that you’d want in the future. Its a good balance of “just enough” and “I might need this”.&lt;/p&gt;
&lt;p&gt;Enjoy&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coil-kt.github.io/coil/"&gt;Coil Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/colinwhi"&gt;Colin’s Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://colinwhite.me/"&gt;Colin’s Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.instacart.com/introducing-coil-kotlin-first-image-loading-on-android-f0fdc7a2a99e"&gt;Introducing Coil: Kotlin-first image loading on Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/171/</guid><pubDate>Mon, 12 Aug 2019 05:00:00 UTC</pubDate></item><item><title>171: Jetpack Compose with Leland Richardson</title><link>https://fragmentedpodcast.com/episodes/172/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/08b8bd57-be65-4e33-b8de-1565200df937?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/08b8bd57-be65-4e33-b8de-1565200df937/172-coil_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This week Donn and Kaushik talk to Leland Richardson from the Android team at Google about Jetpack Compose.&lt;/p&gt;
&lt;p&gt;Jetpack Compose is declarative component-based UI runtime for Android. With compose you can build your UI with functions in Kotlin to easily “compose” what your UI would look like.&lt;/p&gt;
&lt;p&gt;We dive deep in this episode. We talk about the background and influence React had on the project, we dive deep into some of the decisions made regarding the library and much much more…&lt;/p&gt;
&lt;p&gt;We hope you enjoy …&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://intelligiblebabble.com/compose-from-first-principles/"&gt;Jetpack Compose First Principels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/lelandrichardson/react-meet-compose"&gt;React, Meet Compose Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/jetpack/compose"&gt;Jetpack Compose Android Dev Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Leland.s.Contact.info:"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="leland8217s-contact-info"&gt;
Leland’s Contact info:
&lt;a class="heading-anchor" href="#leland8217s-contact-info" aria-label="Link to Leland&amp;amp;#8217;s Contact info:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/intelligibabble"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://intelligiblebabble.com"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Fragmented.Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="fragmented-contact"&gt;
Fragmented Contact
&lt;a class="heading-anchor" href="#fragmented-contact" aria-label="Link to Fragmented Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/172/</guid><pubDate>Mon, 29 Jul 2019 05:00:00 UTC</pubDate></item><item><title>170: Developer Growth – Public Speaking</title><link>https://fragmentedpodcast.com/episodes/170/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/813e17d3-e0fd-4e9b-b038-fb2aaab01eaf?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/813e17d3-e0fd-4e9b-b038-fb2aaab01eaf/170-developer-growth-public-speaking_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about public speaking and how it can help you grow your career.&lt;/p&gt;
&lt;p&gt;He dives in by telling a story of his first speaking engagement and how he was riddled with fear, insecurity, doubt and anxiety. He then talks about why speaking can help you grow your career and life leaps and bounds. He wraps up with possible things you can speak about when starting out as well as where you can get your break into the speaking circuit.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/154"&gt;Fragmented #154 – Developer Growth: Start Writing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnfelker.com/the-single-best-thing-you-can-do-for-your-career/"&gt;The Single Best Thing You Can Do For Your Career&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsor"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;This episode is sponsored by &lt;a href="https://instabug.com/fragmented?utm_source=fragmented&amp;amp;utm_medium=podcasts&amp;amp;utm_campaign=fragmented-podcasts-q319-july"&gt;Instabug&lt;/a&gt;.
Squash bugs 🐞 in less than a minute with Instabug!&lt;/p&gt;
&lt;p&gt;Special offer for all listeners, go to &lt;a href="https://instabug.com/fragmented?utm_source=fragmented&amp;amp;utm_medium=podcasts&amp;amp;utm_campaign=fragmented-podcasts-q319-july"&gt;instabug.com/fragmented&lt;/a&gt;
Signup for free, install the SDK, and you will get Instabug’s brand new t-shirt!&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/170/</guid><pubDate>Tue, 23 Jul 2019 05:00:00 UTC</pubDate></item><item><title>169: Testing and JUnit 5 with Marcel Schnelle</title><link>https://fragmentedpodcast.com/episodes/169/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8c2a5039-b2b7-4cea-a707-b4b1015d5aaa?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8c2a5039-b2b7-4cea-a707-b4b1015d5aaa/169-testing-and-junit-5-with-marcel-schnelle_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Marcel Schnelle joins Donn in this episode to talk about how to get your application under test and some steps to go from scared to confident in your testing process. The second half of the show they dive in deep to JUnit 5 and its new features.&lt;/p&gt;
&lt;p&gt;JUnit 5 is backwards compatible with JUnit 4 and offers a slew of new features and extensibility points which make the framework much more appealing going forward. We’re convinced you’ll enjoy this episode and leave wanting to get your app under test – even more than it already is.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/junit5-fundamentals"&gt;Caster.IO JUnit 5 Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mannodermaus/android-junit5"&gt;JUnit 5 Android Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://junit.org/junit5/docs/current/user-guide/"&gt;JUnit5 User Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5fIkkoPtPaw"&gt;Danny Preussler: The next gen of testing – Droidcon NYC 2018 (YouTube)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=r-8EGXMFJaw"&gt;Marc Philipp: JUnit 5 Extensions – Joker 2017 (YouTube)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spekframework/spek"&gt;Spek Framework Testing for Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get ahold of Marcel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/marcelschnelle"&gt;Marcel Schnelle Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mannodermaus.de"&gt;Marcel Schnelle Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/169/</guid><pubDate>Mon, 15 Jul 2019 05:00:00 UTC</pubDate></item><item><title>168: Learning Kotlin: Lambda Expressions Part 2</title><link>https://fragmentedpodcast.com/episodes/168/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/79af803a-7537-41a5-a8e4-98043f463812?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/79af803a-7537-41a5-a8e4-98043f463812/168_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn continues his talks about Kotlin Lambda Expressions. He explains how you can use lambda expressions as function parameters and as return types for functions.&lt;/p&gt;
&lt;p&gt;This is a very dense episode – if you get lost look at the code snippets below or view on them on &lt;a href="https://fragmentedpodcast.com/episodes/168/"&gt;fragmentedpodcast.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;LogReader&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processFile&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;file&lt;/span&gt;: File, processLine: (String) -&amp;amp;gt; Unit = {}) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;file&lt;/span&gt;.forEachLine {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;Number of Chars: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${it.length}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; processLine(&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;Line Done Processing&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processFileWithHandlers&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;file&lt;/span&gt;: File, logHandler: LogHandler) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;file&lt;/span&gt;.forEachLine {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;Start of Processing&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logHandler.handleLine().forEach { handler -&amp;amp;gt; handler(&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;Line Done Processing&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;LogHandler&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleLine&lt;/span&gt;(): List&amp;amp;lt;(String) -&amp;amp;gt; Unit&amp;amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; reader = LogReader()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; textFile = File(&lt;span style="color:#e6db74"&gt;&amp;#34;/Users/donnfelker/scratch/lorem.txt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Process with single lambda
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;reader.processFile(textFile, { println(&lt;span style="color:#e6db74"&gt;&amp;#34;First 10 Chars: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${it.substring(0..9)}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;) })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; logHandler = &lt;span style="color:#66d9ef"&gt;object&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;: &lt;/span&gt;&lt;span style="color:#a6e22e"&gt;LogHandler&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleLine&lt;/span&gt;(): List&amp;amp;lt;(String) -&amp;amp;gt; Unit&amp;amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; listOf&amp;amp;lt;(String) -&amp;amp;gt; Unit&amp;amp;gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { line -&amp;amp;gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${line.substring(0, 1)}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;) },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { line -&amp;amp;gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${line.substring(2, 4)}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;) },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { line -&amp;amp;gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${line.substring(5, 10)}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Process with multipe handlers via the logHandler
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;reader.processFileWithHandlers(textFile, logHandler)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/168/</guid><pubDate>Mon, 08 Jul 2019 05:00:00 UTC</pubDate></item><item><title>167: Clean Architecture with Joe Birch</title><link>https://fragmentedpodcast.com/episodes/167/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3f5adf25-ff4b-4ece-a8ae-514a5c247b8d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3f5adf25-ff4b-4ece-a8ae-514a5c247b8d/clean-architecture-with-joe-birch_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Donn sits down with Buffer Android Lead, Joe Birch. Joe is a GDE for Android, Google Actions, Flutter and Google Pay. In this episode Donn and Joe talk about Clean Architecture, what it is, and why you might want to use it.&lt;/p&gt;
&lt;p&gt;They break down the concept of what Clean Architecture is in a manner that is easy for even a beginner to understand.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/android-clean-architecture"&gt;Caster.IO Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[Uncle Bob Clean Arch]&lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html"&gt;https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bufferapp/android-clean-architecture-boilerplate"&gt;Buffer Clean Architecture BoilerPlate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chordassist.com/"&gt;Chord Assist Guitar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get ahold of Joe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/hitherejoe"&gt;Joe Birch Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://instagram.com/hitherejoe"&gt;Joe Birch Instagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/167/</guid><pubDate>Mon, 01 Jul 2019 05:00:00 UTC</pubDate></item><item><title>166: Cross platform development talk with Jesse Wilson</title><link>https://fragmentedpodcast.com/episodes/166/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d92d25dd-092c-4843-b528-b7206cef57ab?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d92d25dd-092c-4843-b528-b7206cef57ab/167_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Kaushik decides to hit record on a skype call he has with friend of the show Jesse Wilson. They start off by discussing building features across different platforms today. Jesse talks about a clever mechanism of using javascript to change logic on the fly across the Square cash app, that’s worked out pretty well. They then go on to discussing how one can try and converge across platforms in terms of business logic, architecture, naming etc. They then wind it down by discussing the state of Flutter, Kotlin multiplatform and reaching the promised land.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.objc.io/"&gt;objc.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kpgalligan"&gt;Kevin Galligan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Strongolopolis"&gt;Alec Strong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EgorAnd"&gt;Egor Andreevich&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://instabug.com/fragmented?utm_source=fragmented&amp;amp;utm_medium=podcasts&amp;amp;utm_campaign=fragmented-podcasts-q219-june"&gt;Instabug&lt;/a&gt; – Instabug is an SDK that completely takes care of your beta testing and user feedback process so you can debug, fix, and improve your app quality faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go to &lt;a href="https://instabug.com/fragmented?utm_source=fragmented&amp;amp;utm_medium=podcasts&amp;amp;utm_campaign=fragmented-podcasts-q219-june"&gt;instabug.com/fragmented&lt;/a&gt;, signup, install the SDK, and you will get their brand new t-shirt and a 14-day free trial.&lt;/p&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jessewilson"&gt;@jessewilson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chrismlacy"&gt;@chrismlacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/166/</guid><pubDate>Mon, 24 Jun 2019 05:00:00 UTC</pubDate></item><item><title>165: Learning Kotlin: Lambda Expressions Part 1</title><link>https://fragmentedpodcast.com/episodes/165/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9667b3d9-010e-4eae-9de7-8737c4bc1059?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/9667b3d9-010e-4eae-9de7-8737c4bc1059/fragmented-ef-java-17-final_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about Kotlin Lambda Expressions. He explains the syntax and how to build a couple of simple lambda expressions with and without type inference and declaration. We wrap up with a small example of passing a small lambda with multiple values to a function. See the show notes below for more info. This is part 1 of a multi-part series on Lambda Expressions in Kotlin.&lt;/p&gt;
&lt;p&gt;The basic syntax of a lambda expression:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; myLambda : Type = { argumentList &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; codeBody }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The codeBody is the only section that is not optional.&lt;/p&gt;
&lt;p&gt;Double lambda expression (doubles an integer) with type inference&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; double = { number: Int &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; number * &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; result = double(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// result = 8 now
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Double string multi-line lambda with type inference.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; doubleString = { number: Int &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// codebody
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; doubleResult = number * &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doubleResult.toString()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Kotlin knows this will return a string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Type declaration in a lambda&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; myLambda: (String, Int) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; String = { str, int &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$str&lt;/span&gt;&lt;span style="color:#e6db74"&gt; - &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${int.toString()}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// &amp;#34;Donn - 32&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; result = myLambda(&lt;span style="color:#e6db74"&gt;&amp;#34;Donn&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// result = &amp;#34;Donn - 32&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Preview of next week … passing a lambda to a function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;doWork&lt;/span&gt;(name: String, favoriteNumber: Int, someLambda: (String, Int) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; String) { &lt;span style="color:#75715e"&gt;// Do some processing, this is a contrived example
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; repeatedString = &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$name$name&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; result = someLambda(repeatedString, favoriteNumber)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(result)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Usage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;doWork(&lt;span style="color:#e6db74"&gt;&amp;#34;Donn&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;) { str, int &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; someNewValue = &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$str&lt;/span&gt;&lt;span style="color:#e6db74"&gt; is my parameter and so is &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$int&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; someNewValue.length.toString() &lt;span style="color:#75715e"&gt;// this is returned
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// &amp;amp;#8217;37&amp;amp;#8217; is printed via println
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Or use it like this, the lambda code body is what can change, this is where the power is at
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;doWork(&lt;span style="color:#e6db74"&gt;&amp;#34;Donn&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;) { name, count &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; result = &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt;.count) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$name&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#75715e"&gt;// this is returned
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// loops over and concatinates &amp;#34;Donn&amp;#34; until
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// the favorite number (aka count) is met.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Output looks like: &amp;#34;DonnDonnDonnDonnDonnDonn...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// and so on...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><guid>https://fragmentedpodcast.com/episodes/165/</guid><pubDate>Mon, 17 Jun 2019 05:00:00 UTC</pubDate></item><item><title>164: Learning Kotlin: Sealed Classes</title><link>https://fragmentedpodcast.com/episodes/164/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8c860232-bf6d-4546-b0c5-9b8ad39ad487?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8c860232-bf6d-4546-b0c5-9b8ad39ad487/fragmented-ef-java-17-final_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, you’ll learn all about Kotlin Sealed classes. Donn walks you through what they are, how to create them, how to use data classes, objects and regular classes to create a restricted type hierarchy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/sealed-classes.html"&gt;Kotlin Sealed Classes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/164/</guid><pubDate>Mon, 10 Jun 2019 05:00:00 UTC</pubDate></item><item><title>163: Parallelize Your Espresso Tests with Flank w/ Matt Runo</title><link>https://fragmentedpodcast.com/episodes/163/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/af395b4c-c791-4685-acc7-396ee8f8e223?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/af395b4c-c791-4685-acc7-396ee8f8e223/matt-runo_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks to Matt Runo about the Flank project. Using Flank you can run your Espresso test suite in parallel on Firebase Test Lab (FTL). This allows you to lower your feedback loop time and increase developer productivity and throughput. You’ll learn all about Flank, how it works and how to get started in this episode.&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/163/</guid><pubDate>Mon, 03 Jun 2019 05:00:00 UTC</pubDate></item><item><title>162: Catching up on Google IO 2019</title><link>https://fragmentedpodcast.com/episodes/162/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8fcd26fb-1e66-47cb-abad-c7a9dc96de79?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8fcd26fb-1e66-47cb-abad-c7a9dc96de79/io-2019-roundup_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;What happened at Google IO 2019?&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.digitaltrends.com/mobile/google-pixel-3a-vs-pixel-3-vs-pixel-2/"&gt;Digital trends: Comparing Pixel 2, 3 and 3A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://myactivity.google.com/"&gt;Google Activity tracking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://myaccount.google.com/activitycontrols"&gt;Google Activity tracking Controls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/flutter-io/bringing-flutter-to-the-web-904de05f0df0"&gt;Flutter for Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Ljtz7T8R_Hk"&gt;New navigation paradigm in Android Q&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=8rfvfojtRss"&gt;What’s new in Android Deveopment Tools – Torr’s IO talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://instabug.com/fragmented"&gt;Instabug&lt;/a&gt; – Instabug is an SDK that completely takes care of your beta testing and user feedback process so you can debug, fix, and improve your app quality faster. Go to &lt;a href="https://instabug.com/fragmented"&gt;instabug.com/fragmented&lt;/a&gt;, signup, install the SDK, and you will get their brand new t-shirt and a 14-day free trial.&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/162/</guid><pubDate>Mon, 27 May 2019 05:00:00 UTC</pubDate></item><item><title>161: Machine Learning on Android with ML Kit and TensorFlow with Dan Jarvis</title><link>https://fragmentedpodcast.com/episodes/161/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/07ece4e4-c2a6-4383-ad0c-c49b342b6252?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/07ece4e4-c2a6-4383-ad0c-c49b342b6252/161-machine-learning-on-andorid-with-ml-kit-tnesorflow_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this show, Donn talks with Dan Jarvis about Machine Learning on Android with ML Kit and Tensor flow.&lt;/p&gt;
&lt;p&gt;They dive deep into what ML (Machine Learning) is, what you need to know as a developer and how to apply those things to build ML applications on Android.&lt;/p&gt;
&lt;p&gt;They tal about what you can do on Android in regards to ML, model training and running the models on the device. You may be wondering if you should include the model in your app or if it should live on a server, that’s discused as well and the reasons for it.&lt;/p&gt;
&lt;p&gt;They wrap up the show with some examples of what you could build and some great resources to get you started.&lt;/p&gt;
&lt;p&gt;Enjoy&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@daj/what-can-machine-learning-do-f126d010c478_"&gt;What Can Machine Learning Do?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/ml-kit"&gt;ML Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ejrn_JHksws&amp;amp;feature=youtu.be"&gt;ML Kit Demo Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/firebase/quickstart-android/tree/master/mlkit?authuser=0"&gt;ML Kit Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/ml-kit/label-images"&gt;Image Labeling Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/ml-kit/use-custom-models"&gt;Custom Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@daj/how-does-prisma-work-f434273da92a"&gt;How Does Prisma Work?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/products/gcp/how-a-japanese-cucumber-farmer-is-using-deep-learning-and-tensorflow"&gt;Cucumber Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/capital-one-tech/tensorflow-image-classifiers-on-android-android-things-and-ios-82cee88095d3"&gt;Tensorflow Demo Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://inside.com/ai"&gt;Inside AI Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tensorflow.org/lite/guide"&gt;TensorFlow Lite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=DKosV_-4pdQ"&gt;TensorFlow Lite (TF Dev Summit ’19) – [VIDEO]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.googleblog.com/2018/05/custom-on-device-ml-models.html"&gt;Custom On-Device ML Models with Learn2Compress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tensorflow.org/lite/microcontrollers/overview"&gt;Microcontoller Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theverge.com/2018/12/17/18144356/ai-image-generation-fake-faces-people-nvidia-generative-adversarial-networks-gans"&gt;Face Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=B6Xx67liMCk"&gt;DroidCon NYC Applied Tensorflow iN Android Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Contact Dan Jarvis on &lt;a href="https://www.linkedin.com/in/danielalanjarvis/"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://medium.com/@daj"&gt;Medium&lt;/a&gt; or &lt;a href="https://github.com/daj"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Donn Felker – &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; (Twitter) and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (Instagram)&lt;/li&gt;
&lt;li&gt;Kaushik Gopal – &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; (Twitter) and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (Instagram)&lt;/li&gt;
&lt;li&gt;Fragmented on Twitter: &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;Our YouTube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join thousands of other developers on &lt;a href="17"&gt;our free chat server&lt;/a&gt;. Ask questions, answer questions, be part of the community at our &lt;a href="https://discord.gg/zBSfhwk"&gt;The Fragmented Discord chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/161/</guid><pubDate>Mon, 20 May 2019 05:00:00 UTC</pubDate></item><item><title>160: Increase App Engagement with Android Q</title><link>https://fragmentedpodcast.com/episodes/160/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d812623c-2b9f-4603-8aca-bd03c67103af?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d812623c-2b9f-4603-8aca-bd03c67103af/160-increase-app-engagement-with-android-q_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;With the release of Android Q we now have the settings panel and all its glory. This panel, while most likely overlooked as a minor feature, is actually a diamond in the rough.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Simply because it’s going to lower the abandonment rate of your app and increase the engagement of your app at the same time. Donn talks about this in depth in this episode.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/preview/features"&gt;Android Q Features&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/160/</guid><pubDate>Mon, 13 May 2019 05:00:00 UTC</pubDate></item><item><title>159: Improve Your App with the Android Material Components (feat. Cameron Ketcham &amp; Connie Shi)</title><link>https://fragmentedpodcast.com/episodes/159/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9e6489c8-9360-4dbe-93d8-a80dd3d350ad?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/9e6489c8-9360-4dbe-93d8-a80dd3d350ad/159-material-components_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this show, Donn and Kaushik talk to Cameron Ketcham and Connie Shi from the Android Material Components team at Google.&lt;/p&gt;
&lt;p&gt;The Android Material Components are material designed components that you can easily drop into your application with just a few small tweaks. You get a bunch of fully built out material components, from the Android Material team at Google. From Chips, to Cards, to Buttons and much much more … the goal is to enable you to build your application faster when using these components.&lt;/p&gt;
&lt;p&gt;Donn and Kaushik talk to Cameraon and Connie about the components and how to use them in this episode.&lt;/p&gt;
&lt;p&gt;Enjoy&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://material.io"&gt;Material.io Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/develop/android/"&gt;Android Material Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/material-components/material-components-android"&gt;Material Components GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.tasks&amp;amp;hl=en_US"&gt;Tasks App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/collections/developer-tutorials/#android-kotlin"&gt;Developer Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=DPH3F0v1jB0"&gt;AndroidDev Summit Talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/tools/theme-editor/"&gt;Material Theme Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Contact Cameron and Connit at – &lt;a href="https://github.com/material-components/material-components-android/issues"&gt;GitHub Issues&lt;/a&gt;, &lt;a href="https://stackoverflow.com/questions/tagged/material-components-android"&gt;StackOverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Donn Felker – &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; (Twitter) and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (Instagram)&lt;/li&gt;
&lt;li&gt;Kaushik Gopal – &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; (Twitter) and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (Instagram)&lt;/li&gt;
&lt;li&gt;Fragmented on Twitter: &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;Our YouTube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join thousands of other developers on &lt;a href="17"&gt;our free chat server&lt;/a&gt;. Ask questions, answer questions, be part of the community at our &lt;a href="https://discord.gg/zBSfhwk"&gt;The Fragmented Discord chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/159/</guid><pubDate>Mon, 06 May 2019 05:00:00 UTC</pubDate></item><item><title>158: Building High Performance Audio on Android</title><link>https://fragmentedpodcast.com/episodes/158/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/fd4500fc-a3e2-4a12-987b-7315071d75b6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/fd4500fc-a3e2-4a12-987b-7315071d75b6/158-don-turner_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this show, Donn and Kaushik talk to Don Turner about how to build high-performance audio apps on Android.&lt;/p&gt;
&lt;p&gt;We dive deep into history of audio on Android, some of the problems that the platform faced. Then look into the tools that we now have to solve those problems so that developers like you can build killer audio apps.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/preview/features/midi"&gt;Android Midi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/oboe"&gt;Oboe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=csfHAbr5ilI&amp;amp;list=PLWz5rJ2EKKc_duWv9IPNvx9YBudNMmLSa"&gt;Intro to Oboe&lt;/a&gt; (Video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://events.google.com/io/schedule/events/ad90afc2-bf1f-4318-abc0-d7e8df67bf07"&gt;Google IO 2019 Talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Don Turner – &lt;a href="https://twitter.com/donturner"&gt;@donturner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Donn Felker – &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; (Twitter) and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (Instagram)&lt;/li&gt;
&lt;li&gt;Kaushik Gopal – &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; (Twitter) and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (Instagram)&lt;/li&gt;
&lt;li&gt;Fragmented on Twitter: &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;Our YouTube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join thousands of other developers on &lt;a href="17"&gt;our free chat server&lt;/a&gt;. Ask questions, answer questions, be part of the community at our &lt;a href="https://discord.gg/zBSfhwk"&gt;The Fragmented Discord chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/158/</guid><pubDate>Mon, 29 Apr 2019 05:00:00 UTC</pubDate></item><item><title>157: Effective Java Item# 20 – Prefer interfaces to abstract classes</title><link>https://fragmentedpodcast.com/episodes/157/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/bb01aa88-0a76-4d1a-84c4-f59cb1ff6ea8?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/bb01aa88-0a76-4d1a-84c4-f59cb1ff6ea8/effective-java-item20_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about Item #20 in the Effective Java book (third series) by Joshua Bloch. He discusses why you should think about using interfaces over abstract classes, how they can add mixin like behavior to retrofit existing classes with new behavior, default methods, skeleton implementations and more.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/157/</guid><pubDate>Mon, 01 Apr 2019 05:00:00 UTC</pubDate></item><item><title>Fragmented Podcast Update – TSHIRTS 🐤</title><link>https://fragmentedpodcast.com/misc/rubber-duck-android-shirt/</link><description>
&lt;p&gt;We’re extremely excited to announce a brand new T-shirt sale from Fragmented.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="https://fragmentedpodcast.com/misc/sol2/"&gt;last run&lt;/a&gt; with the Spacedroid was so successful with listeners that we decided to work again with our good friend &lt;a href="http://twitter.com/taylorling"&gt;Taylor Ling&lt;/a&gt; for this brand new design.&lt;/p&gt;
&lt;p&gt;Taylor’s DroidTee designs have gained legendary fame amongst Android devs and this time he’s made something extra special just for us:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2019/03/fragmented-t2.png"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2019/03/fragmented-t2.png" alt="" width="1274" height="1650" class="aligncenter size-full wp-image-518" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2019/03/fragmented-t2.png 1274w, https://fragmentedpodcast.com/images/wp-content/uploads/2019/03/fragmented-t2-232x300.png 232w, https://fragmentedpodcast.com/images/wp-content/uploads/2019/03/fragmented-t2-768x995.png 768w, https://fragmentedpodcast.com/images/wp-content/uploads/2019/03/fragmented-t2-791x1024.png 791w" sizes="(max-width: 1274px) 100vw, 1274px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The pragmatic programmers will astutely observe why this design is so close to our hearts. We’re big fans of the &lt;a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging"&gt;Rubber duck&lt;/a&gt; approach to debugging and we hope you’ll proudly wear these as you champion on with your development.&lt;/p&gt;
&lt;p&gt;The campaign closes April 7th, so please place your order before then. We hope you love the t-shirt as much as we do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://teespring.com/fragmented2"&gt;Purchase the t-shirt here!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/misc/rubber-duck-android-shirt/</guid><pubDate>Mon, 25 Mar 2019 12:20:58 UTC</pubDate></item><item><title>156: Increase App Engagement with Android Q</title><link>https://fragmentedpodcast.com/episodes/156/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/11ac84b7-dc58-4d00-bfaf-00fef743f5d4?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/11ac84b7-dc58-4d00-bfaf-00fef743f5d4/3-increase_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;With the release of Android Q we now have the settings panel and all its glory. This panel, while most likely overlooked as a minor feature, is actually a diamond in the rough.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Simply because it’s going to lower the abandonment rate of your app and increase the engagement of your app at the same time. Donn talks about this in depth in this episode.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/preview/features"&gt;Android Q Features&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/156/</guid><pubDate>Mon, 18 Mar 2019 05:00:00 UTC</pubDate></item><item><title>155: Naming conventions for RxJava Observables</title><link>https://fragmentedpodcast.com/episodes/155/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/16f76968-17a4-4e59-9b0d-9f2703b9620e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/16f76968-17a4-4e59-9b0d-9f2703b9620e/fragment-observable-naming-project_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The Android community has come to use Rx pretty heavily but surprisingly there hasn’t been any one convention that’s won, when it comes to how we name our functions that return Observables. &lt;code&gt;getUser()&lt;/code&gt;, &lt;code&gt;user()&lt;/code&gt;, &lt;code&gt;userUpdates()&lt;/code&gt; ? In this mini-episode dutifully does the yak-shaving for you and discusses what some options are and what the community has been gravitating towards.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.hanselman.com/blog/YakShavingDefinedIllGetThatDoneAsSoonAsIShaveThisYak.aspx"&gt;yak-shaving&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="upday8217s-convention"&gt;
Upday’s convention:
&lt;a class="heading-anchor" href="#upday8217s-convention" aria-label="Link to Upday&amp;amp;#8217;s convention:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fmuntenescu/status/771268111563653120"&gt;Florina’s tweet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://upday.github.io/blog/reactive_frustrations_1/#reasoning-about-the-code"&gt;Upday’s blog post – Reactive Frustrations 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="options"&gt;
Options
&lt;a class="heading-anchor" href="#options" aria-label="Link to Options"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// option 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getUser&lt;/span&gt;(): Single&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// yuck
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// option 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;(): Observable&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// but what does this mean?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// option 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;(): Single&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;userUpdates&lt;/span&gt;(): Observable&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// or
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;userStream&lt;/span&gt;(): Observable&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// this is looking good
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// option 4 (upday style)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;userOnce&lt;/span&gt;(): Single&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;userStream&lt;/span&gt;(): Observable&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;userOnceAndStream&lt;/span&gt;(): Observable&amp;lt;User&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Stay tuned for a future episode, where we discuss more details and more complicated cases to handle (like emitting a list of user, policies for fetching the first user as quickly as possible etc.).&lt;/p&gt;
&lt;p&gt;Also #FinishNotation.&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/155/</guid><pubDate>Mon, 11 Mar 2019 05:00:00 UTC</pubDate></item><item><title>154: Developer Growth: Start Writing</title><link>https://fragmentedpodcast.com/episodes/154/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/661cd642-be70-4565-acb4-e570ecff8f72?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/661cd642-be70-4565-acb4-e570ecff8f72/154-developer-growth-start-writing_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Growing as a developer is important for you, your career and your future. One of the best ways to grow your career is to start writing.&lt;/p&gt;
&lt;p&gt;Donn recommends starting a blog or contributing to a blog. The process of writing will expose your weak points in your comprehension of a topic. Refining your communication skills through writing and putting thoughts out into the universe via a blog will broaden your skills as a developer.&lt;/p&gt;
&lt;p&gt;Ultimately, writing is about communication and communication is the cornerstone of success in much of anything. In this episode, Donn walks you through why you should start writing to help you grow as a developer.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt; – Your code is broken. Let’s fix it together – &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://instabug.com/fragmented"&gt;Instabug&lt;/a&gt; -They’re giving a special offer for all listeners, go to &lt;a href="https://instabug.com/fragmented"&gt;instabug.com/fragmented&lt;/a&gt;, signup, install the SDK, and you will get a free Instabug t-shirt and a 14-day free trial.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or [our Youtube channel][10]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/154/</guid><pubDate>Tue, 05 Mar 2019 05:00:00 UTC</pubDate></item><item><title>153: How to be an indie Android developer with Chris Lacy</title><link>https://fragmentedpodcast.com/episodes/153/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e50411cd-3f95-4528-b331-48c7962f5d30?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/e50411cd-3f95-4528-b331-48c7962f5d30/153_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Listen to all star Indie developer and friend of the show Chris Lacy. Chris Lacy created the beloved Action Launcher – arguably one of the best Launcher apps on Android. In this epiisode, he talks to us about what it’s like being an indie developer, starting on Action Launcher and of course his newest creation – &lt;a href="https://blog.actionlauncher.com/actiondash-android-digital-wellbeing-alternative-2765746aad51"&gt;ActionDash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.tweetlanes.com/"&gt;TweetLanes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://actionlauncher.com/"&gt;Action Launcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theblerg.net/post/2015/08/05/ive-sold-link-bubble-tappath-and-all-related-assets"&gt;On selling Link Bubble&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brave.com/"&gt;Brave browser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="ActionDash"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="actiondash"&gt;
ActionDash
&lt;a class="heading-anchor" href="#actiondash" aria-label="Link to ActionDash"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.actionlauncher.com/actiondash-android-digital-wellbeing-alternative-2765746aad51"&gt;Introducing ActionDash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.actiondash.playstore"&gt;Download on the play store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PhilJay/MPAndroidChart"&gt;Slick graph library MPAndroidChart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.actionlauncher.com/now-hiring-7d33d5e12540"&gt;Action Launcher is hiring!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nevercode
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;Nevercode – CI/CD for Android, iOS, React Native &amp;amp; Ionic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codemagic.io/"&gt;Try Codemagic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.codemagic.io/"&gt;Join Flutter CI/CD Slack Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chrismlacy"&gt;@chrismlacy&lt;/a&gt; or &lt;a href="https://blog.actionlauncher.com/now-hiring-7d33d5e12540"&gt;work with him&lt;/a&gt; or &lt;a href="https://play.google.com/store/apps/details?id=com.actiondash.playstore&amp;amp;hl=en_US"&gt;leave a 5 star reviews on ActionDash :)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/153/</guid><pubDate>Tue, 19 Feb 2019 05:00:00 UTC</pubDate></item><item><title>152: Should I Rewrite My App? with Jeroen Mols</title><link>https://fragmentedpodcast.com/episodes/152/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/48f73b97-3d0a-44ce-b6fd-17f8eee9ca1e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/48f73b97-3d0a-44ce-b6fd-17f8eee9ca1e/152-should-i-rewrite-my-app-with-jeroen-mols_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;After you’ve been working on an app for sometime, the most common quandry one runs into is the need to rewrite the app. We’ve all been there, there’s technical debt, we’ve improved our understanding, the tools have become better, we’ve become better. So should you go back and just rewrite the whole app? Jeroen walks us through his thinking.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The big Rewrite – Jeroen’s talk
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=he27mDanZgA"&gt;Droidcon Italy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/open?id=1VzjEdMG9MZtaLbzS_RQiFPg0oIl3Vgco"&gt;Slides for the talk with notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www2.meethue.com/en-us"&gt;Philips Hue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.meethue.com/"&gt;Philips Hue API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Resources"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://chadfowler.com/2006/12/27/the-big-rewrite.html"&gt;The big rewrite – Chad Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jvaneyck.wordpress.com/2015/03/12/the-big-rewrite/"&gt;The big rewrite – Jo Van Eyck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.intracto.com/paying-technical-debt-how-to-rescue-legacy-code-through-refactoring"&gt;Paying technical depth – Jeroen Moons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/"&gt;Things you should never do – Joel Spolsky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeroenmols.com/blog/2017/02/16/unittests/"&gt;Write awesome unit tests – Jeroen Mols&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeroenmols.com/blog/2018/04/26/androidstudioshortcuts2/"&gt;Pro Android Studio – refactoring – Jeroen Mols&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eng.uber.com/rewrite-uber-carbon-app/"&gt;Why We Decided to Rewrite Uber’s Driver App – Nandhini Ramaswamy and Adam Gluck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eng.uber.com/author/lzeyuuber-com/"&gt;How to Ship an App Rewrite Without Risking Your Entire Business – James Barr, and Zeyu Li&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Sponsors....."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="Contact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/molsjeroen"&gt;@molsjeroen&lt;/a&gt; or &lt;a href="https://jeroenmols.com/blog/"&gt;his blog&lt;/a&gt; or &lt;a href="https://speakerdeck.com/jeroenmols"&gt;his speakerdeck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/152/</guid><pubDate>Mon, 11 Feb 2019 05:00:00 UTC</pubDate></item><item><title>151: Evolving Android architectures (Part 2)</title><link>https://fragmentedpodcast.com/episodes/151/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a311ac7f-af8b-4ea1-bdef-4abca47e18eb?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a311ac7f-af8b-4ea1-bdef-4abca47e18eb/151_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we continue our discussion from episode 148 on evolving android architectures. We collected some of the questions from the community and try to answer them.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/148/"&gt;Listen to the recap in episode 148&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.instacart.com/lce-modeling-data-loading-in-rxjava-b798ac98d80"&gt;LCE: Modeling Data Loading in RxJava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/kaushikgopal/learning-rx-by-example-2?slide=7"&gt;Rx example pull from db then network&lt;/a&gt; (from KG’s presentation)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/rxjavas-obseravble-amb-operator"&gt;Donn’s caster.io episode on the amb operator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/115/"&gt;Akshay’s episode on Arch components (specifically Live Data)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-i-single-activities-e49fd3d202ab"&gt;Jose’s cheatseet on Activity lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/movies-usf/pull/12"&gt;KG’s example of using this architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="www.codemagic.io"&gt;Try Codemagic – CI/CD for Fultter apps by Nevercode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://join.slack.com/t/flutterci/shared_invite/enQtNDcwODIzMjM4MzI2LWJhNWRkMjZlMjk1YzgzNGUwZjQ5NmUxYTI3YjQzODdlMGU1Nzg5OWQ3NGM3NDdhNGIyNjY1YTUzZTgyNTJkMTc"&gt;Join Flutter CI/CD Slack Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/151/</guid><pubDate>Mon, 04 Feb 2019 05:00:48 UTC</pubDate></item><item><title>150: Learning Kotlin – Returns, Jumps &amp; Labels</title><link>https://fragmentedpodcast.com/episodes/150/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6ac744ed-2694-4cf5-963f-1b229cca833c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6ac744ed-2694-4cf5-963f-1b229cca833c/learning-kotlin-returns-jumps-and-labels_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Another Learning Kotlin episode. We talk about Returns, Jumps &amp;amp; Labels!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/returns.html"&gt;Kotlin Returns and Jumps Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="code"&gt;
Code
&lt;a class="heading-anchor" href="#code" aria-label="Link to Code"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;data&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Customer&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; isPlatinum: Boolean)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; customer = Customer(&lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;Number of points customer has: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${calculatePoints(customer)}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Break out of the loop once we&amp;#39;re over 25
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (i &amp;gt; &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(i)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Skip all even numbers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (i % &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(i)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Break out of the outer loop (which breaks out of the inner too) using a label
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; donn&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (j &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100.&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (j &amp;gt; &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;@donn&lt;/span&gt; &lt;span style="color:#75715e"&gt;// This will break out of the inner loop and outer loop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;i: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$i&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, j: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$j&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Continue processing the next outer loop value when a condition is met.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; donn&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (j &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100.&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (j &amp;gt; &lt;span style="color:#ae81ff"&gt;150&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;@donn&lt;/span&gt; &lt;span style="color:#75715e"&gt;// This will break out of the inner loop and outer loop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;i: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$i&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, j: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$j&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// returns with label
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; example1()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; example2()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;I&amp;#39;m done processing!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calculatePoints&lt;/span&gt;(customer: Customer): Int {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (customer.isPlatinum) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;example1&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listOf(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;).forEach {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt; &amp;gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;This wont print :( because return exited the bar() function&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;example2&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listOf(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;).forEach bin&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt; &amp;gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;@bin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;This will print! :) return exited the forEach!&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://nevercode.io"&gt;Nevercode&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nevercode is taking Flutter revolution extremely serious and is prepared to offer kick-ass CI/CD for Flutter projects with &lt;a href="https://codemagic.io/"&gt;codemagic.io&lt;/a&gt;. Check it out and get started at &lt;a href="https://codemagic.io/"&gt;https://codemagic.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://sentry.io/for/android/"&gt;Sentry.io&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sentry tells you about errors in your code before your customers have a chance to encounter them. Check them out at: &lt;a href="https://sentry.io/for/android/"&gt;https://sentry.io/for/android/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/150/</guid><pubDate>Mon, 21 Jan 2019 14:50:27 UTC</pubDate></item><item><title>149: Learning Kotlin: inline classes and Type driven design</title><link>https://fragmentedpodcast.com/episodes/149/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c2b82606-0114-4f21-8413-1b62db145b96?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/c2b82606-0114-4f21-8413-1b62db145b96/149_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this quick fragment, Kaushik talks about the new Kotlin 1.3 experimental feature “inline classes” and how it helps with Type driven design.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/kotlin/2018/10/kotlin-1-3/"&gt;Kotlin releases 1.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/116/"&gt;Fragmented episode #116 – inline, noinline &amp;amp; crossinline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typealias.com/guides/introduction-to-inline-classes/"&gt;Think strong types and simple values&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://typealias.com/guides/introduction-to-inline-classes/"&gt;typealias.com blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="type-driven-design-resources"&gt;
Type driven design resources
&lt;a class="heading-anchor" href="#type-driven-design-resources" aria-label="Link to Type driven design resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/presentations/Type-Functional-Design"&gt;Type drive approach to Functional design – Michael Feathers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://becoming-functional.com/type-driven-design-in-elm-f8ad90e642aa"&gt;Type driven design in Elm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ploeh.dk/2015/08/10/type-driven-development/"&gt;blog.ploeh – Type driven design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kotlin-keep"&gt;
Kotlin KEEP
&lt;a class="heading-anchor" href="#kotlin-keep" aria-label="Link to Kotlin KEEP"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/KEEP/blob/master/proposals/inline-classes.md"&gt;KEEP proposal – inline classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/KEEP/issues/104"&gt;KEEP discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="vs-typealias"&gt;
vs typealias
&lt;a class="heading-anchor" href="#vs-typealias" aria-label="Link to vs typealias"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/122/"&gt;Fragmented Ep #122 – typealiases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/inline-classes.html#inline-classes-vs-type-aliases"&gt;inline classes vs typealiases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/132/"&gt;How to represent money in programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/inline-classes.html#experimental-status-of-inline-classes"&gt;Kotlin experimental&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jakewharton.com/inline-classes-make-great-database-ids/"&gt;Jake Wharton – inline classes make great database ids&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io/blog/what-we-learned-about-ci-cd-tool-analysing-75k-builds/"&gt;Blog post on developing apps 20% faster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/149/</guid><pubDate>Tue, 15 Jan 2019 18:57:06 UTC</pubDate></item><item><title>148: Evolving Android architectures (Part 1)</title><link>https://fragmentedpodcast.com/episodes/148/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e679ae38-2f8a-4988-888a-7b66c57f82a1?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/e679ae38-2f8a-4988-888a-7b66c57f82a1/148-android-features_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about the state of android architectures and how they’ve stared to evolve. Kaushik recently worked on a project of coming up with an evolved version of an MVVM architecture, very similar to what the Android community now calls MVI.&lt;/p&gt;
&lt;p&gt;Special request: if you have follow up questions or clarifications or things you’d like to see specifically with respect to this dicussion, hit us up on the &lt;a href="https://discord.gg/zBSfhwk"&gt;Discord #fragmented-podcast channel&lt;/a&gt; with your thoughts and we’ll make sure to address them in future parts!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/kaushikgopal/unidirectional-state-flow-patterns-a-refactoring-story"&gt;MBLT-Dev talk by KG : Unidirectional state flow patterns – a refactoring story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/kaushikgopal/movies-usf/"&gt;github sample repo with this pattern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="salient-features-of-the-pattern"&gt;
Salient features of the pattern:
&lt;a class="heading-anchor" href="#salient-features-of-the-pattern" aria-label="Link to Salient features of the pattern:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;I. Screens are driven by a single ViewModel&lt;/p&gt;
&lt;p&gt;II. Screens listen to a single Observable&lt;viewstate&gt; exposed from the ViewModel&lt;/p&gt;
&lt;p&gt;III. Events are sent into the VM through a single function processInputs&lt;/p&gt;
&lt;p&gt;IV. Break(ing) the Chain VI. Testing strategy&lt;/vieweffect&gt;&lt;/viewstate&gt;&lt;/p&gt;
&lt;h3 id="inspiration"&gt;
Inspiration
&lt;a class="heading-anchor" href="#inspiration" aria-label="Link to Inspiration"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jakewharton.com/the-state-of-managing-state-with-rxjava/"&gt;The state of managing state with RxJava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/103/"&gt;MVI patterns with Hannes Dorfmann&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/airbnb-engineering/introducing-mvrx-android-on-autopilot-552bca86bd0a"&gt;MVRx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io/blog/what-we-learned-about-ci-cd-tool-analysing-75k-builds/"&gt;Blog post on developing apps 20% faster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sentry.io/for/android/"&gt;sentry.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/zBSfhwk"&gt;Discord chat&lt;/a&gt; or &lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/148/</guid><pubDate>Mon, 07 Jan 2019 16:28:33 UTC</pubDate></item><item><title>147: Disposing RxJava 2 Streams with AutoDispose</title><link>https://fragmentedpodcast.com/episodes/147/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3ec53c68-0dbf-4b8b-bc7f-12721e148b81?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3ec53c68-0dbf-4b8b-bc7f-12721e148b81/147-autodispose_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this short fragment episode, Donn explains how you can clean up your RxJava 2 streams and ensure no memory leaks are occurring by using the AutoDispose library from Uber.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/uber/AutoDispose"&gt;AutoDispose Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/akarnokd/RxJava2Interop"&gt;Tool to help migrate to RxJava 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hzsweers/CatchUp"&gt;CatchUp Library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="code-samples"&gt;
Code Samples
&lt;a class="heading-anchor" href="#code-samples" aria-label="Link to Code Samples"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;myObservable
.map(...)
.as(AutoDispose.&amp;lt;SomeType&amp;gt;autoDisposable(AndroidLifecycleScopeProvider.from(this)))
.subscribe(...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kotlin&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;myObservable
.map(...)
.autoDisposable(AndroidLifcycleScopeProvider.from(this))
.subscribe(...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;With Scope Event Provided&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;myObservable
.map(...)
.autoDisposable(AndroidLifcycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY))
.subscribe(...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// File: CustomerService.kt
class CustomerService @Inject constructor(...) {
lateinit var scopeProvider: ScopeProvider
}
// Usage in Fragment/Activity/etc
val service = CustomerService(...).apply {
scopeProvider = AndroidLifecycleScopeProvider.from(this)
}
// Usage in Test
val service = CustomerService(...).apply {
scopeProvider = TestScopeProvider.create()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/misc/fragmented-discord-chat-server/"&gt;Fragmented Chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/147/</guid><pubDate>Mon, 31 Dec 2018 11:06:46 UTC</pubDate></item><item><title>146: 3 Things Every Android Developer Needs to Know</title><link>https://fragmentedpodcast.com/episodes/146/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/afd615b3-f3b9-46ce-bc91-ead305b0cfb0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/afd615b3-f3b9-46ce-bc91-ead305b0cfb0/3-things-every-android-developer-needs-to-know_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn digs into three things that every Android developer needs to know.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dependency Injection&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Constructor\_setter\_method injection
2. Service Locators or other DI frameworks
3. Common Frameworks
1. [Dagger](https://google.github.io/dagger/android.html)
2. [Koin](https://github.com/InsertKoinIO/koin)
3. [Kodein](https://github.com/Kodein-Framework/Kodein-DI)
4. [ToothPick](https://github.com/stephanenicolas/toothpick)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How to test&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Functional / System&lt;/li&gt;
&lt;li&gt;Integration&lt;/li&gt;
&lt;li&gt;Unit&lt;/li&gt;
&lt;li&gt;Tools:
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://junit.org"&gt;jUnit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/training/testing/espresso/"&gt;Espresso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spekframework.org/"&gt;Spek&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keep it simple simple&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;KISS principle &lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;KISS principle – Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Examples
&lt;ol&gt;
&lt;li&gt;Code Duplication
&lt;ol&gt;
&lt;li&gt;“Extract this into a method”&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Lets create a framework for this&lt;/li&gt;
&lt;li&gt;Kaushik’s – 3x rule
&lt;ul&gt;
&lt;li&gt;if something is duplicated 3 or more times, think about extracting it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3/6 Rule – In 6 months, will I be able to understand this in under 3 minutes?&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://instagram.com/donnfelker"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://instagram.com/kaushikgopal"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/146/</guid><pubDate>Mon, 24 Dec 2018 16:08:21 UTC</pubDate></item><item><title>145: Tracking Network Requests With x-Request-ID</title><link>https://fragmentedpodcast.com/episodes/145/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/15504d6e-9e45-4da4-939a-26ad82ff4a14?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/15504d6e-9e45-4da4-939a-26ad82ff4a14/145_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this short fragment, Kaushik explains how you can trace network requests from your app by adding a special header. Easily trace an HTTP request all the way from a client to your backend web process.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/25433258/what-is-the-x-request-id-http-header"&gt;What is the X-Request-ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.heroku.com/http_request_id_s_improve_visibility_across_the_application_stack"&gt;HTTP Request IDs improve visibility across the application stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039"&gt;How HTTP headers work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_HTTP_header_fields"&gt;Where does the X- come from?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codemagic.io"&gt;codemagic.io by NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Join their &lt;a href="https://join.slack.com/t/flutterci/shared_invite/enQtNDcwODIzMjM4MzI2LWJhNWRkMjZlMjk1YzgzNGUwZjQ5NmUxYTI3YjQzODdlMGU1Nzg5OWQ3NGM3NDdhNGIyNjY1YTUzZTgyNTJkMTc"&gt;Flutter Community here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/145/</guid><pubDate>Tue, 18 Dec 2018 18:07:18 UTC</pubDate></item><item><title>144: Developer Productivity Tools</title><link>https://fragmentedpodcast.com/episodes/144/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3be18546-22fe-4d05-aef2-130efe8f81b7?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3be18546-22fe-4d05-aef2-130efe8f81b7/144_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk about productivity tools for developers. As developers, what are some additional tools and utilities that really up your game. If you wanted to see how they tweak their development environments and workstations in general, this is a good episode to listen. Also introducing a Fragmented Discord Chat server!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/misc/fragmented-discord-chat-server/"&gt;Fragmented Discord Chat Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="productivity-tools"&gt;
Productivity tools
&lt;a class="heading-anchor" href="#productivity-tools" aria-label="Link to Productivity tools"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h3 id="keyboard-maestro"&gt;
Keyboard Maestro
&lt;a class="heading-anchor" href="#keyboard-maestro" aria-label="Link to Keyboard Maestro"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.stairways.com/action/kmdiscount?REF6JZA"&gt;Keyboard Maestro – Mac&lt;/a&gt; (Referral code with 20% discount)&lt;/li&gt;
&lt;li&gt;Sample macros:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=FmgT3baY4Qw"&gt;Demo: Better auto pairing with BBEdit and Keyboard Maestro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=KqDrfVij7_g"&gt;Demo: Autocopy text from one program to another&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.autohotkey.com"&gt;AutoHotkey – Windows&lt;/a&gt; (Windows equivalent of sorts)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/"&gt;DuckDuckGo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/bang"&gt;Bang Syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://muzzleapp.com/"&gt;Muzzle App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Window management tools:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mizage.com/divvy/"&gt;Divvy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.spectacleapp.com"&gt;Spectacle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://magnet.crowdcafe.com"&gt;Magnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://manytricks.com/moom/"&gt;Moom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kasper/phoenix"&gt;Phoenix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VSCode
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sdras/night-owl-vscode-theme"&gt;Night owl theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ohmyz.sh"&gt;OhMyZsh&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/denysdovhan/spaceship-prompt"&gt;Spaceship prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zsh-users/zsh-autosuggestions"&gt;Auto Suggestions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fishshell.com/docs/current/tutorial.html"&gt;Fish Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getkap.co"&gt;Kap&lt;/a&gt; – Screen recording tools&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sipapp.io/index2.html"&gt;Sip&lt;/a&gt; – Color Management&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codemagic.io"&gt;codemagic.io by NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Join their &lt;a href="https://join.slack.com/t/flutterci/shared_invite/enQtNDcwODIzMjM4MzI2LWJhNWRkMjZlMjk1YzgzNGUwZjQ5NmUxYTI3YjQzODdlMGU1Nzg5OWQ3NGM3NDdhNGIyNjY1YTUzZTgyNTJkMTc"&gt;Flutter Community here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/144/</guid><pubDate>Mon, 10 Dec 2018 05:00:25 UTC</pubDate></item><item><title>Fragmented Discord Chat Server</title><link>https://fragmentedpodcast.com/misc/fragmented-discord-chat-server/</link><description>
&lt;p&gt;Kaushik and I are excited to announce that we’ve created a public Discord server that &lt;strong&gt;you can join, for free&lt;/strong&gt; to chat with other folks in the community.&lt;/p&gt;
&lt;p&gt;We wanted to create a place where listeners could get together, ask questions, communicate and &lt;em&gt;help each other&lt;/em&gt;. The goal of our podcast has always been to share knowledge and we feel that this is only a natural extension of our original vision.&lt;/p&gt;
&lt;h3 id="join-here"&gt;
Join Here
&lt;a class="heading-anchor" href="#join-here" aria-label="Link to Join Here"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;You can join the discord group by installing the Discord app and joining the server via the link below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install App: &lt;a href="https://discordapp.com/download"&gt;Mac, Windows, Linux, Android, iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Invite link: &lt;a href="https://discord.gg/zBSfhwk"&gt;https://discord.gg/zBSfhwk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="why-didnt-you-use-slack"&gt;
Why didn’t you use Slack?
&lt;a class="heading-anchor" href="#why-didnt-you-use-slack" aria-label="Link to Why didn’t you use Slack?"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;This is a great question, and one that we grappled with for a bit. Ultimately it came down to the fact that Slack has a 10,000 message limit on the free plan. This severely limits the usefulness of Slack (in our opinions). Without message history its a limited chat. With history, it provides a rich history of searchable content for the community.&lt;/p&gt;
&lt;p&gt;Therefore we decided to go with Discord. It is free to use and has unlimited message history that can be searched.&lt;/p&gt;
&lt;h3 id="why-didn8217t-you-use-telegram-discord-is-mainly-for-gamers-8230"&gt;
Why didn’t you use Telegram? Discord is mainly for gamers …
&lt;a class="heading-anchor" href="#why-didn8217t-you-use-telegram-discord-is-mainly-for-gamers-8230" aria-label="Link to Why didn&amp;amp;#8217;t you use Telegram? Discord is mainly for gamers &amp;amp;#8230;"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Discord allows us to have various channels/rooms where discussions can be broken out into. We have rooms for design, testing, architecture, etc. Using Telegram, this would not be possible.&lt;/p&gt;
&lt;p&gt;While Discord is very popular for gamers, it is used widely in various other industries as well.&lt;/p&gt;
&lt;h3 id="code-of-conduct"&gt;
Code of Conduct
&lt;a class="heading-anchor" href="#code-of-conduct" aria-label="Link to Code of Conduct"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;We do our best to model ourselves as responsible stewards of the community and in doing such we have established a code of conduct that all members of the discord server must abide by. Read it &lt;a href="https://fragmentedpodcast.com/code-of-conduct"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As always, please let us know if you have any comments, questions, etc.&lt;/p&gt;
&lt;p&gt;-✌️ Donn &amp;amp; Kaushik&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/misc/fragmented-discord-chat-server/</guid><pubDate>Wed, 05 Dec 2018 11:18:21 UTC</pubDate></item><item><title>143: Real world testing thoughts</title><link>https://fragmentedpodcast.com/episodes/143/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/afd8db8e-1a75-4511-9b58-5c811ebdd846?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/afd8db8e-1a75-4511-9b58-5c811ebdd846/143_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini fragment, Donn and Kaushik share some thoughts on real world testing with Android development – a favorite topic of theirs.&lt;/p&gt;
&lt;p&gt;Kaushik recently ran into a case where an espresso test fails because the UI stops performing. It’s an interesting discussion on figuring out what matters when you write your tests. They dive into strategies and techniques around testing. What makes a good test, what should you be testing?&lt;/p&gt;
&lt;p&gt;They then talk about why Hermetic testing is pretty hard on mobile and ideas around a simple solution that could be provided out of the box. They then round it up talking about TDD and it’s role in today’s world.&lt;/p&gt;
&lt;p&gt;Hope you enjoy this one!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/training/testing/espresso/lists"&gt;Espresso Testing lists (onData)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/support/test/espresso/action/ViewActions.html#swipeUp()"&gt;Espress test swipe action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.webvanta.com/post/2014-07-06/responsive-design-above-the-fold"&gt;What is the fold&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testing.googleblog.com/2012/10/hermetic-servers.html"&gt;Hermetic Servers testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/okhttp/tree/master/mockwebserver"&gt;MockWebServer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiremock.org/docs/android/"&gt;WireMock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-"&gt;
Sponsors 🙏
&lt;a class="heading-anchor" href="#sponsors-" aria-label="Link to Sponsors 🙏"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://americanexpress.io/android-jobs"&gt;American Express Jobs&lt;/a&gt; – American Express is hiring Android developers!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io/blog/what-we-learned-about-ci-cd-tool-analysing-75k-builds/"&gt;Blog post on developing apps 20% faster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jebstuart"&gt;@jebstuart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/143/</guid><pubDate>Mon, 03 Dec 2018 15:51:58 UTC</pubDate></item><item><title>142: Indie development on Android and iOS with Matt Logan</title><link>https://fragmentedpodcast.com/episodes/142/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/22b191c0-34ce-43e2-aa92-fd4dd855f85d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/22b191c0-34ce-43e2-aa92-fd4dd855f85d/143-matt-logan_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to our friend Matt Logan. Matt took some time off and worked on an indie app called Sessions. He built this for both &lt;a href="https://play.google.com/store/apps/details?id=co.apexpark.sessions"&gt;Android&lt;/a&gt; and &lt;a href="https://itunes.apple.com/us/app/sessions-music-practice-log/id1396222207"&gt;iOS&lt;/a&gt;. In this episode we talk to him about his experience building apps on both platforms, techniques, advice and other good stuff.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sessions &lt;a href="https://play.google.com/store/apps/details?id=co.apexpark.sessions"&gt;Android&lt;/a&gt; &lt;a href="https://itunes.apple.com/us/app/sessions-music-practice-log/id1396222207"&gt;iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.strava.com"&gt;Strava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.actionlauncher.com/@chrismlacy?gi=c2da8c0138a9"&gt;Chris Lacy – Action Launcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.indiehackers.com/podcast"&gt;Indie Hacker’s podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/064/"&gt;Fragmented Ep #64 – Garbage Collection (Android) vs Reference Counting (iOS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mattlogan.me/sharing-code-between-ios-and-android/"&gt;Matt’s blog post on code sharing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://instabug.com/fragmented"&gt;Instabug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io/blog/what-we-learned-about-ci-cd-tool-analysing-75k-builds/"&gt;Blog post on developing apps 20% faster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/_mattlogan"&gt;@_mattlogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/142/</guid><pubDate>Mon, 19 Nov 2018 07:00:52 UTC</pubDate></item><item><title>141: Impostor Syndrome</title><link>https://fragmentedpodcast.com/episodes/141/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8fc40e24-da4c-4d0d-9c18-79aed8b32c63?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8fc40e24-da4c-4d0d-9c18-79aed8b32c63/141-impostor-syndrome_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini fragment, Donn and KG talk about Impostor syndrome. Most of us developers are plagued by this. Does this feeling ever go away? How do we deal with this? Listen to this short episode to find out more.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Karl the Fog (&lt;a href="https://en.wikipedia.org/wiki/San_Francisco_fog"&gt;wikipedia page&lt;/a&gt;) &lt;a href="https://twitter.com/KarlTheFog"&gt;@KarlTheFog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/_mattlogan/status/1014700235543597056"&gt;Matt’s twitter post on background process limit 0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/135/"&gt;#135 – You can’t learn everything&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.kaush.co/2012/06/17/learning-and-looking-foolish/"&gt;I’m willing to look foolish, if it means I’ll learn something.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!msg/comp.lang.java/aSPAJO05LIU/ushhUIQQ-ogJ"&gt;Larry page 1996- Java thread&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fragmentedpodcast.com/episodes/76/"&gt;#76: Taming the activity lifecycle with Kristin Marsicano&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ppvi/status/1048510840423501824"&gt;Jose Alcérreca’s lifecycle cheatsheet bookmark&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://instabug.com/fragmented"&gt;Instabug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io/blog/what-we-learned-about-ci-cd-tool-analysing-75k-builds/"&gt;Blog post on developing apps 20% faster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/preusslerberlin"&gt;@preusslerberlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/141/</guid><pubDate>Mon, 12 Nov 2018 07:00:43 UTC</pubDate></item><item><title>140: ProGuard with Jeb Ware</title><link>https://fragmentedpodcast.com/episodes/140/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1ab9bfb9-5dc7-45bf-884e-f0a1f09e7062?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1ab9bfb9-5dc7-45bf-884e-f0a1f09e7062/140-jeb-proguard_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We all know of ProGuard, we want to use it and like it. But let’s face it proGuard ain’t pretty. In this episode we have Jeb walk us through the magic of ProGuard.&lt;/p&gt;
&lt;p&gt;We talk to Jeb Ware of American Express. Jeb works as an Android developer and has given some great talks on ProGuard. He walks us through what ProGuard is, how it works, advancements with R8 and more.&lt;/p&gt;
&lt;p&gt;By the end of this episode, you should have a new found appreciation for proGuard and bravely approach adding proGuard to your projects.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=F9ymcWoDEtc"&gt;How ProGuard works – Jeb at Droidcon Boston&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.guardsquare.com/en/products/proguard/manual/usage"&gt;ProGuard Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html"&gt;D8/R8 announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://issuetracker.google.com/issues?q=componentid:326788"&gt;R8 issue tracker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jebstuart"&gt;@jebstuart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/140/</guid><pubDate>Mon, 05 Nov 2018 07:00:32 UTC</pubDate></item><item><title>139: Static code analysis with Manu Sridharan</title><link>https://fragmentedpodcast.com/episodes/139/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/30726b89-005e-4bf9-89f8-15fab3b168b0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/30726b89-005e-4bf9-89f8-15fab3b168b0/139_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik talk to Uber’s Manu Sridharan on static code analysis. Manu’s a badass who did his PhD on the subject! He explains how static code analysis works, how Uber leverages these tools in their app development pipeline and how we can use such tools to build high quality Android apps.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="note-from-manu"&gt;
Note from Manu:
&lt;a class="heading-anchor" href="#note-from-manu" aria-label="Link to Note from Manu:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;I found the story I was thinking about: Reed Hastings founded the company that built the Purify tool for debugging memory errors in C programs before founding Netflix. But, that’s actually not a static analysis tool; it does dynamic analysis by adding extra metadata at runtime.&lt;/p&gt;
&lt;p&gt;As far as the history of lint goes, from Wikipedia looks like Kaushik’s guess was exactly right as to why it’s called lint. Looks like the name goes back to the late 1970s.&lt;/p&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://errorprone.info"&gt;ErrorProne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/studio/write/lint"&gt;Improve your code with Android lint checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://checkstyle.sourceforge.net"&gt;checkstyle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/uber-research/RxThreadEffectChecker"&gt;RxThreadEffectChecker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://checkerframework.org"&gt;The Checker framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/uber/NullAway"&gt;NullAway – Uber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fbinfer.com"&gt;Infer – Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fbinfer.com/docs/racerd.html"&gt;Infer: RacerD – Facebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; (on Twitter) or &lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;our Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rakingleaves"&gt;@rakingleaves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/139/</guid><pubDate>Thu, 25 Oct 2018 02:56:32 UTC</pubDate></item><item><title>138: Decompress – kotlin scripting</title><link>https://fragmentedpodcast.com/episodes/138/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/877e5bb4-069f-4ba0-9fd5-d4b59960b428?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/877e5bb4-069f-4ba0-9fd5-d4b59960b428/decompress-20180822-hackathon_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini fragment, Donn asks KG about a recent hackathon side project that he worked on with Kotlin scripting.&lt;/p&gt;
&lt;p&gt;We go into kotlin scripting (using kscript), pros cons, setting it up and more. We’ve added links some interesting resources, so you want to make sure you check out the shownotes for this one, so you too can explore kotlin scripting and see if it’s a fit for you.&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="existing-solutions-for-pollvote-tabulation"&gt;
Existing solutions for poll/vote tabulation
&lt;a class="heading-anchor" href="#existing-solutions-for-pollvote-tabulation" aria-label="Link to Existing solutions for poll/vote tabulation"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.polleverywhere.com"&gt;polleverywhere.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.surveymonkey.com"&gt;surveymonkey.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://polldaddy.com"&gt;polldaddy.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/holgerbrandl/kscript"&gt;kscript by holgerbrandl&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://tech.instacart.com/free-hackathon-vote-tabulation-using-google-forms-kotlin-3c7b7080ea"&gt;blog post on the hackathon vote tabulation script&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/kaushikgopal/kotlin-scripts/blob/master/star-wars-demo-results.csv"&gt;what the csv output from google forms looks like&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/kaushikgopal/kotlin-scripts#tabulate-hackathon-votes"&gt;github repo for script – with installation instructions&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://talkingkotlin.com/kscript-with-holger-brandl/"&gt;Highly recommended – Talking kotlin episode on kscript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt; // slick kotlin usage&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;override fun onCreate(savedInstanceState: Bundle?) = super.onCreate(savedInstanceState).also {
setContentView(R.layout.activity_something)
// ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://americanexpress.io/android-jobs"&gt;American Express Jobs&lt;/a&gt; – American Express is hiring Android developers!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/138/</guid><pubDate>Mon, 15 Oct 2018 05:00:12 UTC</pubDate></item><item><title>137: Decompress KISS DRY Testing</title><link>https://fragmentedpodcast.com/episodes/137/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/01834508-774a-427d-904f-b95473e75273?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/01834508-774a-427d-904f-b95473e75273/137_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, DF and KG decompress. They start off talking about ideas around KISS vs DRY in software engineering. They move on then to talk about a dear topic – functional vs unit testing and then dive into some of the woes of having a testing infrastructure spun up. Also announcing our youtube channel!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UC7fT84G-G25w7Bdd-e1rnyw/videos"&gt;Fragmented’s Youtube channel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://americanexpress.io/android-jobs"&gt;American Express Jobs&lt;/a&gt; – American Express is hiring Android developers!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/137/</guid><pubDate>Wed, 10 Oct 2018 19:56:36 UTC</pubDate></item><item><title>136: Kotlin Extension Functions</title><link>https://fragmentedpodcast.com/episodes/136/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/7e70e6ce-d01f-4223-8c0c-e3c9b297eb31?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/7e70e6ce-d01f-4223-8c0c-e3c9b297eb31/project-extension-functions_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this fragment episode, Donn talks about Kotlin extension functions. He discusses what they are, how to build them, why they’re useful, how to organize them, visibility and how to call them Java and much more.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/extensions.html"&gt;Kotlin Extension Functions Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/28364983"&gt;Calling Extension Functions from Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.github.io/android-ktx/core-ktx/androidx.view/android.view.-view/index.html"&gt;Kotlin KTX View Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; android.view.View
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;View&lt;/span&gt;.gone() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.visibility = &lt;span style="color:#a6e22e"&gt;View&lt;/span&gt;.GONE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;View&lt;/span&gt;.visible() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.visibility = &lt;span style="color:#a6e22e"&gt;View&lt;/span&gt;.VISIBLE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; view.gone()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; view.visible()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/136/</guid><pubDate>Tue, 25 Sep 2018 22:47:47 UTC</pubDate></item><item><title>135: You can’t learn everything</title><link>https://fragmentedpodcast.com/episodes/135/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/21eeef88-c0b8-453d-ba7d-271877161788?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/21eeef88-c0b8-453d-ba7d-271877161788/135-you-cant-learn-everything_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Donn’s on a roll again this week and talks to us about his experience having developed Android for a while. In the early days of Android development, as app developers we felt like we had a decent grasp of everything you needed to know to pump out decent apps.&lt;/p&gt;
&lt;p&gt;But with the time, and the latest updates, that has become a tricky thing. This is a good problem to have for the ecosystem but it can make it seem very daunting for developers, both new and old.&lt;/p&gt;
&lt;p&gt;Donn gives his 2 cents on this subject.&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/135/</guid><pubDate>Mon, 17 Sep 2018 05:26:50 UTC</pubDate></item><item><title>134: Get Effective Help with an SSCCE</title><link>https://fragmentedpodcast.com/episodes/134/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/57ff4539-f8fe-4ec2-b0c3-1ef9cd000201?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/57ff4539-f8fe-4ec2-b0c3-1ef9cd000201/134-get-effective-help-with-an-sscce_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about how you can get effective help with your coding problems with an SSCCE – a Simple, Self-Contained, Correct (Compilable), Example.&lt;/p&gt;
&lt;p&gt;Using an SSCCE provides others with a quick, concise way to examine the problem without extraneous libraries, UI toolkits and various other parts of your application that do not matter to the problem at hand.&lt;/p&gt;
&lt;p&gt;Donn breaks down each component of the SSCCE so you can wrap your head around what you need to get help quickly.&lt;/p&gt;
&lt;h1 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sscce.org/"&gt;SSCCE.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.instabug.com/fragmented"&gt;Instabug&lt;/a&gt; – Instabug is the simplest yet most comprehensive bug reporting and In-app feedback SDK.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/134/</guid><pubDate>Mon, 06 Aug 2018 13:14:53 UTC</pubDate></item><item><title>133: Dependency Injection and Service Locators in a Kotlin world with Danny Preussler</title><link>https://fragmentedpodcast.com/episodes/133/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/67954cba-8ff3-498e-be92-a84549ef503a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/67954cba-8ff3-498e-be92-a84549ef503a/danny-di_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A hotly debated topic at the moment is the use of a library like Dagger for dependency injection in the world of Kotlin. In this episode, we talk to Danny Preussler. Danny’s a pro who’s been around from the Java 1.0 days! He helps trace the history of dependency injection in Java all the way to today, in a Kotlin world where there exists alternatives like Koin and Kodine.&lt;/p&gt;
&lt;p&gt;We dive into how some of these use a Service Loader/Locator pattern and the subtle differences with dependency injection. Listen on for an action packed episode.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/dpreussler/to-inject-or-not-inject-dependency-injection-in-a-kotlin-world-appbuilders-dot-ch-2018"&gt;Danny’s slides (DI in a Kotlin world) talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://insert-koin.io"&gt;Koin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stephanenicolas/toothpick"&gt;Toothpick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xQGm4O84PLE"&gt;how to pronounce reified&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="service-locators-vs-dependency-injection"&gt;
Service Locators vs Dependency Injection
&lt;a class="heading-anchor" href="#service-locators-vs-dependency-injection" aria-label="Link to Service Locators vs Dependency Injection"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Your application is aware it’s using a Service Locator, but your application should be totally un-aware that it’s using a Dependency Injection Container.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/1557781/whats-the-difference-between-the-dependency-injection-and-service-locator-patte"&gt;SO post on the difference between DI &amp;amp; SL pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/injection.html"&gt;Martin Fowler’s post on DI, IOC, SL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/dagger-2-part-5"&gt;Caster.IO (paid) course by DF on setting up testing with Dagger 2 and Espresso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/"&gt;Mark Seeman on Service Locators being an anti-pattern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bitrise.io/?utm_source=fragmented_spec&amp;amp;utm_medium=podcast&amp;amp;utm_campaign=w30"&gt;Bitrise&lt;/a&gt; – Bitrise is your mobile continuous integration and delivery for your whole team, with dozens of integrations for your favorite services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/preusslerberlin"&gt;@preusslerberlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;donnfelker&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;kaushikgopal&lt;/a&gt; (on Instagram)&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/133/</guid><pubDate>Mon, 23 Jul 2018 07:20:22 UTC</pubDate></item><item><title>132: Dealing with Money in programming</title><link>https://fragmentedpodcast.com/episodes/132/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/44c38505-46f9-4140-b849-2493b0075996?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/44c38505-46f9-4140-b849-2493b0075996/frament-money_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini fragment Kaushik talks about dealing with the Money object. With money we need decimals, but the obvious solution of using a float or double may not work as advertised. Listen to this episode to find out why and how you can go about dealing with this.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/29/"&gt;The infamous Short – Ep029: All about the infamous 65,536 dex method count&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/IEEE_754"&gt;IEEE_754 float storage format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://floating-point-gui.de/formats/binary/"&gt;How binary fractions work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Problematic snippet 1:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;println(1.03-0.42) # prints 0.6100000000000001
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Problematic snippet 2:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var x = 0F
(1..100).forEach { i -&amp;gt;
x += 0.01F
}
println(x) # 0.99999934 vs 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bitrise.io/?utm_source=fragmented_spec&amp;amp;utm_medium=podcast&amp;amp;utm_campaign=w28"&gt;Bitrise&lt;/a&gt; – Bitrise is your mobile continuous integration and delivery for your whole team, with dozens of integrations for your favorite services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/132/</guid><pubDate>Wed, 18 Jul 2018 09:07:37 UTC</pubDate></item><item><title>131: ARCore with Yulia Kaleda</title><link>https://fragmentedpodcast.com/episodes/131/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a767940e-2f4b-49f7-b04e-116025de041f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a767940e-2f4b-49f7-b04e-116025de041f/131_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We live in a time of booming AR (and VR). We wanted to talk to someone who’s worked with it and would know a thing or two about the subject. Then we found Yuliya – also known as the walking wizard of ARCore. In this episode, she teaches Kaush and Donn about ARCore, the differences between AR/VR, the fundamental building blocks of ARCore, some of the newer concepts introduced like Sceneform. An action packed episode to say the least. Listen on !&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/79/"&gt;ep 79 – How do i get started with VR Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theverge.com/2017/12/15/16782556/project-tango-google-shutting-down-arcore-augmented-reality"&gt;Tango shutting down&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/ar/discover/"&gt;ARCore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/arkit/"&gt;ARKit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/ar/develop/java/cloud-anchors/cloud-anchors-overview-android"&gt;Cloud Anchors: Share AR experiences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/ar/discover"&gt;ARCore – Geometry detection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/ar/develop/java/sceneform/"&gt;Sceneform – 3d view rendering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google-ar"&gt;Google ARCore github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@YuliyaKaleda/the-power-of-arcore-5e77c63a7bcf"&gt;Yuliya’s blog post &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=g0dn-jH2aRw&amp;amp;index=30&amp;amp;list=PLb1A91j1236pm38EMCT2Ue-fo3j-WfYbX&amp;amp;t=1167s"&gt;Yuliya’s talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bitrise.io/?utm_source=fragmented_spec&amp;amp;utm_medium=podcast&amp;amp;utm_campaign=w28"&gt;Bitrise&lt;/a&gt; – Bitrise is your mobile continuous integration and delivery for your whole team, with dozens of integrations for your favorite services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/yuliyakaleda"&gt;@yuliyakaleda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/131/</guid><pubDate>Mon, 09 Jul 2018 15:21:52 UTC</pubDate></item><item><title>130: Sunsetting ReactNative at Airbnb with Gabriel Peal – Part 2</title><link>https://fragmentedpodcast.com/episodes/130/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b01eb4f0-22d1-4175-865b-e9b0849c5f80?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b01eb4f0-22d1-4175-865b-e9b0849c5f80/gabriel-reactnative-2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we resume our conversation with Airbnb’s Gabriel Peal. If you haven’t listened to part 1, you really really should go back and do that. In that episode, we kicked it off by first trying to understand the goals and the story behind why React Native was chosen as the code sharing technology/tool.&lt;/p&gt;
&lt;p&gt;After two years, 220 screens, and 120,000 lines of javascript, Gabriel tells us why they’re moving away from React Native.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/airbnb-engineering/react-native-at-airbnb-f95aa460be1c"&gt;The post that kicked it all off&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flow.org/en/"&gt;Flow – static type checker for Javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://babeljs.io"&gt;Babel -Javascript compiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Heisenbug"&gt;Heisenbugs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bugsnag.com"&gt;Bugsnag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/ui/layout/recyclerview"&gt;RecyclerView&lt;/a&gt; : &lt;a href="https://developer.apple.com/reference/uikit/uicollectionview"&gt;UICollectionView&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react-native/blog/2018/06/14/state-of-react-native-2018"&gt;Facebook blot post: State of React Native 2018&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/extensions.html"&gt;Kotlin Extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/delegated-properties.html"&gt;Kotlin Delegated properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/epoxy"&gt;Epoxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gpeal8"&gt;@gpeal8&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/130/</guid><pubDate>Wed, 04 Jul 2018 05:40:23 UTC</pubDate></item><item><title>129: Sunsetting ReactNative at Airbnb with Gabriel Peal – Part 1</title><link>https://fragmentedpodcast.com/episodes/129/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/89404f0a-9967-4dfa-967a-bf4050f412c6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/89404f0a-9967-4dfa-967a-bf4050f412c6/gabriel-reactnative-1_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;If you haven’t heard, Airbnb has decided to move away from React Native. Friend of the show Gabriel Peal wrote an in-depth series of blog posts about this. We had so many questions around this that we asked him to come on the show and he graciously accepted to answer some of our questions.&lt;/p&gt;
&lt;p&gt;It’s always a pleasure listening to his insights and this episode is no exception!&lt;/p&gt;
&lt;p&gt;Listen on:&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react-native/"&gt;React Native&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/airbnb-engineering/react-native-at-airbnb-f95aa460be1c"&gt;The post that kicked off this show&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/spikebrehm"&gt;Spike Brehm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/intelligibabble"&gt;Leland Richardson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://airbnb.design/building-a-visual-language/"&gt;Building a visual language – DLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/yoga"&gt;Yoga library – cross layout engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/yoga/tree/master/android"&gt;YogaLayout – Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bitrise.io/?utm_source=fragmented_spec&amp;amp;utm_medium=podcast&amp;amp;utm_campaign=w27"&gt;Bitrise&lt;/a&gt; – Bitrise is your mobile continuous integration and delivery for your whole team, with dozens of integrations for your favorite services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gpeal8"&gt;@gpeal8&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/129/</guid><pubDate>Mon, 02 Jul 2018 05:00:27 UTC</pubDate></item><item><title>128: gRPC on Android with Sam Bobra</title><link>https://fragmentedpodcast.com/episodes/128/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a0ddb17f-c015-4247-9102-9c1afa951ba5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a0ddb17f-c015-4247-9102-9c1afa951ba5/grpc-evangelism_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In today’s episode, we are joined by Sam Bobra – engineering manager @VSCO, android fangirl and gRPC magician (some would even say evangelist !) to talk about gRPC on Android. Super informative episode!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vsco.co"&gt;VSCO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=D-vuRmuSwUA"&gt;Sam’s DroidconSF 2017 – Thinking Beyond the REST API: gRPC for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Microservices"&gt;Microservices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://golang.org"&gt;Go (programming language)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="implementation"&gt;
Implementation
&lt;a class="heading-anchor" href="#implementation" aria-label="Link to Implementation"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/protocol-buffers/docs/javatutorial"&gt;Protocol Buffers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/protobuf-gradle-plugin"&gt;protobuf-gradle-plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/salesforce/reactive-grpc"&gt;Reactive gRPC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12349282"&gt;Differences between gRPC &amp;amp; graphQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;codegen &lt;a href="https://github.com/grpc/grpc-java"&gt;grpc-Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;codegen &lt;a href="https://github.com/google/protobuf/blob/master/java/lite.md"&gt;grpc-Lite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;codegen &lt;a href="https://github.com/square/wire"&gt;Wire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fullstorydev/grpcurl"&gt;Curling: grpcurl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.envoyproxy.io"&gt;envoy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="bitrise.io"&gt;Bitrise.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.bitrise.io/introducing-solid-and-snappy-virtual-device-testing-for-android"&gt;Virtual Device Testing: full integration with Firebase Test Lab, run emulators quickly and reliably&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/samwritescode"&gt;@samwritescode&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ryanjsalva"&gt;@ryanjsalva&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/128/</guid><pubDate>Mon, 25 Jun 2018 14:18:27 UTC</pubDate></item><item><title>127: Audio playback on Android with Caren Chang</title><link>https://fragmentedpodcast.com/episodes/127/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d88c0636-518a-4475-a57a-aab811f3bcae?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d88c0636-518a-4475-a57a-aab811f3bcae/calren_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In today’s episode, we sit down with Caren Chang from June to talk about audio engineering for Android. Audio APIs can be tricky so Caren walks us through how she maneuvered around them to get the notifications and audio feedback for June’s ovens.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@calren24/kotlin-in-action-chapter-1-what-and-why-9d2899560755"&gt;Caren’s “Learning Kotlin in Action” summary blog post series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://juneoven.com"&gt;June Oven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=lCuLxqGd0go"&gt;June Oven Video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="apis"&gt;
Apis
&lt;a class="heading-anchor" href="#apis" aria-label="Link to Apis"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/ndk/guides/audio/audio-latency"&gt;Audio Latency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/media/MediaPlayer"&gt;MediaPlayer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/media/SoundPool"&gt;SoundPool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/media/exoplayer"&gt;ExoPlayer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=JOl0QNJWQ6g"&gt;Droidcon Boston&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/exoplayer-introduction-to-audio-playback"&gt;Caster.IO – ExoPlayer course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/calren24"&gt;@calren24&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ryanjsalva"&gt;@ryanjsalva&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/127/</guid><pubDate>Wed, 13 Jun 2018 14:56:35 UTC</pubDate></item><item><title>126: GraphQL and Apollo with GDE Mike Nakhimovich (Part 2)</title><link>https://fragmentedpodcast.com/episodes/126/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0bd31339-55ca-4140-92f1-7ad5dfbc8624?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/0bd31339-55ca-4140-92f1-7ad5dfbc8624/apollo-part2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we continue with Part 2 of this GraphQL series. If you haven’t listed to episode 125 already, it might make sense to first listen to that one cause we go into the basics of GraphQL.&lt;/p&gt;
&lt;p&gt;In this episode, we dive into the specifics of Apollo and how Mike went about creating a GraphQL client for Android. Let’s get on with Part 2.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://GraphQL.org/"&gt;GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/graphql/draft/"&gt;GraphQL specification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="apollo"&gt;
Apollo
&lt;a class="heading-anchor" href="#apollo" aria-label="Link to Apollo"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/apollographql/apollo-android"&gt;Apollo Android – GraphQL Client for Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ugUFKB1LsNE"&gt;droidcon NYC 2017 – GraphQL on Android is here!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/friendlymikhail"&gt;@friendlymikhail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/126/</guid><pubDate>Mon, 04 Jun 2018 05:58:29 UTC</pubDate></item><item><title>125: GraphQL and Apollo with GDE Mike Nakhimovich (Part 1)</title><link>https://fragmentedpodcast.com/episodes/125/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a1067dda-8112-40ed-ab3c-67d1a85d3a63?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a1067dda-8112-40ed-ab3c-67d1a85d3a63/apollo-part1_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk about GraphQL. Friend and GDE Mike Nakhimovich helped create the library Apollo for Android, which is the defacto official GraphQL client for Android.&lt;/p&gt;
&lt;p&gt;In this first part of two, we take a step back and first try to understand what GraphQL is, why one would use it, how Mike set out to create and contribute Apollo for Android and his journey and satisfaction with open sourcing it when he worked at the New York Times.&lt;/p&gt;
&lt;p&gt;If you’ve ever been interested in GraphQL, this is a good show to get you up to speed.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://GraphQL.org/"&gt;GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sample-graphql-servers"&gt;
Sample GraphQL servers
&lt;a class="heading-anchor" href="#sample-graphql-servers" aria-label="Link to Sample GraphQL servers"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.github.com/v4/explorer/"&gt;Github explorer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Star Wars &lt;a href="https://swapi.co/"&gt;api&lt;/a&gt; &lt;a href="https://graphiql.graphcms.com/simple/v1/swapi"&gt;GraphQLCMS visualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.shopify.com/api/custom-storefronts/storefront-api/GraphQL-explorer"&gt;Shopify GraphQL Explorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.nytimes.com/react-relay-and-GraphQL-under-the-hood-of-the-times-website-redesign-22fb62ea9764"&gt;React, Relay and GraphQL: Under the hood of the Times website redesign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open.nytimes.com/the-new-york-times-now-on-apollo-b9a78a5038c"&gt;The New York Times – Now on Apollo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/friendlymikhail"&gt;@friendlymikhail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="ttps://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/125/</guid><pubDate>Mon, 28 May 2018 05:00:51 UTC</pubDate></item><item><title>124: IO 2018 first impressions with Android Dialogs &amp; Pocket Casts team</title><link>https://fragmentedpodcast.com/episodes/124/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/20c8a65e-88eb-4b47-8da1-5bc599365ccd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/20c8a65e-88eb-4b47-8da1-5bc599365ccd/124-googleio-2018_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Kaushik talks to Chiuki &amp;amp; Huyen from Android Dialogs and Russell &amp;amp; Philip from Pocket Casts. Fresh after IO we huddled in a room to talk about our first impressions and what we thought were some of the highlights for us Android developers. Hope you enjoy the show! (if you want to see a behind the scenes crossover special, make sure to subscribe to Android Dialogs!)&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="android-dialogs"&gt;
Android Dialogs
&lt;a class="heading-anchor" href="#android-dialogs" aria-label="Link to Android Dialogs"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Chiuki &lt;a href="https://twitter.com/chiuki"&gt;@chiuki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Huyen Tue Dao &lt;a href="https://twitter.com/queencodemonkey"&gt;@queencodemonkey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCMEmNnHT69aZuaOrE-dF6ug"&gt;Android Dialogs on YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pocket-casts"&gt;
Pocket Casts
&lt;a class="heading-anchor" href="#pocket-casts" aria-label="Link to Pocket Casts"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Russell Ivanovic &lt;a href="https://twitter.com/rustyshelf"&gt;@rustyshelf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Phil of PocketCasts &lt;a href="https://twitter.com/geekygecko/"&gt;@geekygecko&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.shiftyjelly.com/pocketcasts/"&gt;Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wsj.com/articles/public-radio-organizations-buy-pocket-casts-1525366680"&gt;Wall Street Journal – Public Radio organizations buy Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="io2018-stuff"&gt;
io2018 stuff
&lt;a class="heading-anchor" href="#io2018-stuff" aria-label="Link to io2018 stuff"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android-developers.googleblog.com/2018/05/google-io-2018-whats-new-in-android.html"&gt;Google I/O 2018: What’s new in Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=bd1mEm2Fy08"&gt;Google Duplex announcement at Google IO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/jetpack/"&gt;Android Jetpack&lt;/a&gt; (&lt;a href="https://www.youtube.com/watch?v=LmkKFCfmnhQ"&gt;intro video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=8GCXtCjtg40"&gt;Android Jetpack: manage UI navigation with Navigation Controller (Google I/O ’18)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/design/material-theming/#material-theming"&gt;Material theming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/tools/theme-editor/"&gt;Material Theme Editor (Sketch plugin)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Video 1: &lt;a href="https://www.youtube.com/watch?v=1Dh8ZBQp9jo"&gt;Guide to the new material.io website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Video 2: &lt;a href="https://www.youtube.com/watch?v=Ty6VjgVHiko"&gt;Build great Material Design products across platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/platform/technology/app-bundle/"&gt;Android App Bundles&lt;/a&gt; (&lt;a href="https://www.imore.com/app-thinning-ios-9-explained"&gt;iOS App thinning&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=st1XVfkDWqk"&gt;Android Jetpack: sweetening Kotlin development with Android KTX (Google I/O ’18)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=a7IVH5aNwwc"&gt;Android Slices: build interactive results for Google Search (Google I/O ’18)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=lu3L6DxUBRA"&gt;Getting started with App Actions (Google I/O ’18)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidpolice.com/2017/03/28/google-is-working-on-bringing-android-studio-to-chrome-os/"&gt;Google is working on bringing Android Studio to Chrome OS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="ttps://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/124/</guid><pubDate>Mon, 14 May 2018 05:00:28 UTC</pubDate></item><item><title>123: Android Micro Frustrations</title><link>https://fragmentedpodcast.com/episodes/123/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6c89e94e-8b51-4dc7-bca7-876927a68468?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6c89e94e-8b51-4dc7-bca7-876927a68468/rant_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;With good –most of the time– also comes the bad. In this episode, Kaushik and Donn chat about the small annoying things about being an Android developer, or more aptly – “Micro Frustrations”.&lt;/p&gt;
&lt;p&gt;We usually cover the new, latest, greatest and awesome developments. But it helps to step back and also point out the things that are broken and the 1000 cuts so to speak.&lt;/p&gt;
&lt;p&gt;Sit back and enjoy this hearty rant!&lt;/p&gt;
&lt;h2 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@drinfo/fuck-you-android-framework-ddbb02c4ae48"&gt;F**k you Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="layout-complaints"&gt;
layout complaints
&lt;a class="heading-anchor" href="#layout-complaints" aria-label="Link to layout complaints"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/anko/wiki/Anko-Layouts"&gt;Kotlin Android Extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/anko/wiki/Anko-Layouts"&gt;Anko layouts&lt;/a&gt; (slightly different from Kotlin Android extensions)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/49517661/android-studio-3-1-stable-build-successful-but-can-not-resolve-error/49519615#49519615"&gt;Android Studio 3.1 Stable – Build successful but can’t resolve error&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="navigation--system-bar-frustrations"&gt;
Navigation &amp;amp; System bar frustrations:
&lt;a class="heading-anchor" href="#navigation--system-bar-frustrations" aria-label="Link to Navigation &amp;amp; System bar frustrations:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/20264268/how-do-i-get-the-height-and-width-of-the-android-navigation-bar-programmatically"&gt;How do I ge the height and width of the android navigation bar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re looking for a solution to just hide system bar (and not the navigation bar), here’s what Kaushik landed up using (you’re welcome):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Window&lt;/span&gt;.makeStatusBarTransparent(activity: Activity) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sdkUpto(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setWindowFlag(activity, &lt;span style="color:#a6e22e"&gt;WindowManager&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;LayoutParams&lt;/span&gt;.FLAG_TRANSLUCENT_STATUS, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; decorView.systemUiVisibility = &lt;span style="color:#a6e22e"&gt;View&lt;/span&gt;.SYSTEM_UI_FLAG_LAYOUT_STABLE or &lt;span style="color:#a6e22e"&gt;View&lt;/span&gt;.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sdk(&lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setWindowFlag(activity, &lt;span style="color:#a6e22e"&gt;WindowManager&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;LayoutParams&lt;/span&gt;.FLAG_TRANSLUCENT_STATUS, &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setTranslucentStatusBarLollipop()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setWindowFlag&lt;/span&gt;(activity: Activity, bits: Int, on: Boolean) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; win = activity.window
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; winParams = win.attributes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (on) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; winParams.flags = winParams.flags or bits
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; winParams.flags = winParams.flags and bits.inv()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; win.attributes = winParams
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@TargetApi&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Build&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;VERSION_CODES&lt;/span&gt;.LOLLIPOP)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Window&lt;/span&gt;.setTranslucentStatusBarLollipop() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; statusBarColor = &lt;span style="color:#a6e22e"&gt;Color&lt;/span&gt;.TRANSPARENT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="ttps://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/123/</guid><pubDate>Mon, 07 May 2018 05:00:29 UTC</pubDate></item><item><title>122: Learning Kotlin – typealias</title><link>https://fragmentedpodcast.com/episodes/122/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b3310eb0-7f64-4c57-a17f-f5cc3f945744?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b3310eb0-7f64-4c57-a17f-f5cc3f945744/122-learning-kotlin-typealias_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of learning kotlin, we look at the &lt;code&gt;typealias&lt;/code&gt; keyword. The &lt;code&gt;typealias&lt;/code&gt; keyword allows you to provide alternate names for existing types and and function types. Learn how, why and when you can use it in this episode&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/type-aliases.html"&gt;Kotlin Inline functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="ttps://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/122/</guid><pubDate>Mon, 23 Apr 2018 05:00:42 UTC</pubDate></item><item><title>121: Functional Programming with Kotlin Arrow team – II</title><link>https://fragmentedpodcast.com/episodes/121/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2acf4fd8-6036-4495-aeb6-85b1d615611f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/2acf4fd8-6036-4495-aeb6-85b1d615611f/arrow-p2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, we wrap up another 2 part series. We dive into the details of the Arrow library with this one. Arrow is a library in Kotlin that helps bring many of the functional paradigms of programming to your daily development. We talk to the team about how it all started, the history of the library, why we even need arrow, how Arrow is structured, some of the pitfalls, and in the end some resources on getting us started with Arrow.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="arrow-library"&gt;
Arrow library
&lt;a class="heading-anchor" href="#arrow-library" aria-label="Link to Arrow library"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.47deg.com/blog/announcing-arrow-for-kotlin/"&gt;Raul: Announcing Arrow for Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/functional-programming-in-kotlin-with-arrow"&gt;Jorge: Caster.io course – FP in Kotlin with Arrrow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qI1ctQ0293o"&gt;Jorge: Kotlin Conf – Architectures Using Functional Programming Concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pacoworks.com/2018/01/15/arrow-functional-companion-to-kotlin-standard-library/"&gt;Paco: Arrow as a companion to Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pacoworks.com/2018/02/25/simple-dependency-injection-in-kotlin-part-1/"&gt;Paco: Simple dependency injection in Kotlin (part 1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.packtpub.com/application-development/functional-kotlin"&gt;Mario: Book on FP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Arrow Library eco system: &lt;a href="https://github.com/arrow-kt/ank"&gt;Ank&lt;/a&gt;, &lt;a href="https://github.com/47deg/kollect"&gt;Kollect&lt;/a&gt;, &lt;a href="https://github.com/47deg/helios"&gt;Helios&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.47deg.com/blog/arrow-v0-7-0-now-available/"&gt;Arrow V 0.7.0 – now available&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/6246719/what-is-a-higher-kinded-type-in-scala"&gt;Higher Kinded types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/KEEP/pull/87"&gt;KEEP – Type classes and Higher Kinded Types proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arrow-kt.io/docs/"&gt;Kotlin Arrow docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="get-help-on-arrrow"&gt;
Get help on Arrrow
&lt;a class="heading-anchor" href="#get-help-on-arrrow" aria-label="Link to Get help on Arrrow"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://slack.kotlinlang.org/"&gt;KotlinLang slack channel #arrow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitter.im/arrow-kt/Lobby"&gt;Gitter: Arrow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/pacoworks"&gt;Paco&lt;/a&gt; (&lt;a href="http://www.pacoworks.com/"&gt;website&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/raulraja"&gt;Raúλ Raja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jorgecastillopr"&gt;Jorge Castillo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dh44t"&gt;Mario Arias (in spirit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/arrow_kt"&gt;Arrow KT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/121/</guid><pubDate>Mon, 16 Apr 2018 05:00:28 UTC</pubDate></item><item><title>120: Functional Programming with Kotlin Arrow team</title><link>https://fragmentedpodcast.com/episodes/120/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/31c592f8-a78a-47c8-9183-53b0dc251b2a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/31c592f8-a78a-47c8-9183-53b0dc251b2a/arrow-p1_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, we kick off another 2 part series. This time it’s with the Kotlin Arrow team! In the first part, we talk to Jorge, Raul and Paco about Functional programming in general, some core FP concepts, do we already use functional programming today, what are pure functions, do I need to know complicated math to do FP, Immutability, Referential transparency and so much more. These are all pretty daunting words, but the Arrow team break it down and make it really simple for us to understand.&lt;/p&gt;
&lt;p&gt;Listen on to the show.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="kotlin-arrow-team"&gt;
Kotlin Arrow team
&lt;a class="heading-anchor" href="#kotlin-arrow-team" aria-label="Link to Kotlin Arrow team"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/pacoworks"&gt;Paco&lt;/a&gt; (&lt;a href="http://www.pacoworks.com/"&gt;website&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/raulraja"&gt;Raúλ Raja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jorgecastillopr"&gt;Jorge Castillo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dh44t"&gt;Mario Arias (in spirit)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/arrow_kt"&gt;Arrow KT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.47deg.com/"&gt;47 degrees&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/functional-programming-in-kotlin-with-arrow"&gt;Jorge’s caster.io course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arrow-kt.io/docs/quickstart/blogs/"&gt;Blogs &amp;amp; Presentations on FP – Arrow docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.47deg.com/blog/functional-programming-patterns-v3/"&gt;Raul’s presentation on Functional programming patterns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/pacoworks"&gt;Paco&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/raulraja"&gt;Raúλ Raja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jorgecastillopr"&gt;Jorge Castillo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dh44t"&gt;Mario Arias (in spirit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/120/</guid><pubDate>Mon, 09 Apr 2018 05:00:59 UTC</pubDate></item><item><title>119: Flutter with GDE Eugenio Marletti – Part 2</title><link>https://fragmentedpodcast.com/episodes/119/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0a5cffce-0baa-4f2f-810a-ffb37a96d42c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/0a5cffce-0baa-4f2f-810a-ffb37a96d42c/119-flutter-part-2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In part 2 of this series,&lt;/p&gt;
&lt;p&gt;To help us understand Flutter in-depth we talk to Flutter’s &lt;a href="https://twitter.com/@workingkills"&gt;GDE Eugenio Marletti&lt;/a&gt;. In Part 1 of this 2 part series, Eugenio helps us understand what flutter is, why it was created, how it works, some really cool features with Flutter and why an AndroidDev today should really give Flutter a good look.&lt;/p&gt;
&lt;p&gt;We got so carried away in conversation, that we were forced to break this episode into two parts. If you missed part 1 but want to go back and listen you’ll find it here: &lt;a href="https://spec.fm/podcasts/fragmented/125975"&gt;118: Flutter and cross-platform development with GDE Eugenio Marletti – Part 1&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveX/rxdart"&gt;RxDart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dartlang.org/"&gt;Dart 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutterweekly.net/"&gt;Flutter Weekly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitter.im/flutter/flutter"&gt;Flutter on Glitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutter.io/get-started/codelab/"&gt;Flutter on Codelab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flutter/flutter/tree/master/examples/flutter_gallery"&gt;Flutter on Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=io.flutter.gallery&amp;amp;hl=en"&gt;Flutter Gallery app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/@workingkills"&gt;@workingkills&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/119/</guid><pubDate>Mon, 02 Apr 2018 06:47:58 UTC</pubDate></item><item><title>118: Flutter and cross platform development with GDE Eugenio Marletti – Part 1</title><link>https://fragmentedpodcast.com/episodes/118/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/601f7fbb-8ea6-472d-ae0f-01e63e2798e3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/601f7fbb-8ea6-472d-ae0f-01e63e2798e3/fragmented-flutter_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we dive into one of our most requested topics and highly anticipated ones – Flutter.&lt;/p&gt;
&lt;p&gt;To help us understand Flutter in-depth, we talk to Flutter’s GDE Eugenio Marletti. In Part 1 of this 2 part series, Eugenio helps us understand what flutter is, why it was created, how it works, some really cool features with Flutter and why an AndroidDev today should really give Flutter a good look.&lt;/p&gt;
&lt;p&gt;We got so carried away in conversation, that we were forced to break this episode into two parts. Stay tuned for Part 2.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://helloclue.com/"&gt;Clue app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/flutter-io/announcing-flutter-beta-1-build-beautiful-native-apps-dc142aea74c0"&gt;Announcing Flutter beta 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flutter/flutter/issues/14821"&gt;Embedding Flutter into an existing app&lt;/a&gt; (examples &lt;a href="https://github.com/flutter/flutter/tree/master/examples/flutter_view"&gt;flutter_view&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/flutter/flutter/tree/master/examples/platform_view"&gt;platform_view&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/guidelines/components/steppers.html"&gt;Stepper widget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutter.io/get-started/install/"&gt;Getting started on Flutter (docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/3265357/compiled-vs-interpreted-languages"&gt;Compiled vs Interpreted languages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/@workingkills"&gt;@workingkills&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/118/</guid><pubDate>Mon, 19 Mar 2018 07:00:50 UTC</pubDate></item><item><title>117: Multi-Module Builds in Gradle</title><link>https://fragmentedpodcast.com/episodes/117-multi-module-builds-in-gradle/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/27c28bc8-5e93-4c15-8d41-db08f35fd956?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/27c28bc8-5e93-4c15-8d41-db08f35fd956/fragmented-multi-module-builds_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik sit down to talk about multi-module builds with Gradle. They talk about how you can separate your build into multiple different modules and how you might go about implementing it. They discuss build performance with incremental compilation, isolation of features, code ownership and how to handle cross-cutting concerns like persistence and networking.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/90/"&gt;Instant Apps Episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/44140208/android-library-module-vs-feature-module"&gt;Android Library Module vs Feature Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/mindorks/implementation-vs-api-in-gradle-3-0-494c817a6fa"&gt;Implementation vs Compile – A Visual Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/mindorks/writing-a-modular-project-on-android-304f3b09cb37"&gt;Writing a Modular app in Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/butterknife/issues/974#issuecomment-307585969"&gt;ButterKnife Woes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/how-to-use-android-studio-to-write-pure-java-23cbe49186e8"&gt;Android Studio and Pure Java Modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://handstandsam.com/2018/02/11/kotlin-buildsrc-for-better-gradle-dependency-management/"&gt;Sam Edwards buildSrc and build.gradle Autocomplete Post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/gradle-dependency-management-using-gradle-extra-properties-ext"&gt;Sam Edwards Gradle Ext Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/gradle-dependency-management-using-kotlin-and-buildsrc-for-buildgradle-autocomplete-in-android-studio"&gt;Sam Edwards Gradle AutoComplete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/renaming-your-gradle-build-files/"&gt;Phil Breault Renaming Gradle Build Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-architecture-components/blob/master/versions.gradle"&gt;Google Arch Samples – versions.gradle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/117-multi-module-builds-in-gradle/</guid><pubDate>Mon, 12 Mar 2018 05:00:57 UTC</pubDate></item><item><title>116: Learning Kotlin – inline, noinline and crossinline</title><link>https://fragmentedpodcast.com/episodes/116/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/156fd53b-0079-4d17-b724-8cdf2a24b74a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/156fd53b-0079-4d17-b724-8cdf2a24b74a/116_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of learning kotlin, we look at 3 important keywords – inline, noinline and crossinline. The inline keyword is super common and you’ve probably run across this one at some point. What does it mean and when is it useful? We also look at the related but seldom used variants noinline and crossinline.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/inline-functions.html"&gt;Kotlin Inline functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="code-snippets"&gt;
Code Snippets:
&lt;a class="heading-anchor" href="#code-snippets" aria-label="Link to Code Snippets:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="simple-inlined-function"&gt;
Simple inlined function:
&lt;a class="heading-anchor" href="#simple-inlined-function" aria-label="Link to Simple inlined function:"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(args: Array&amp;lt;String&amp;gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; functionA()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inline&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;functionA&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;awesomeness !&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Warning: Expected performance impact of inlining ‘public inline fun functionA() can be insignificant. Inlining works best for functions with lambda parameters&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What the code looks like in Java:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String var1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;awesomeness !&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(var1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="function-with-lambda-parameter"&gt;
Function with lambda parameter:
&lt;a class="heading-anchor" href="#function-with-lambda-parameter" aria-label="Link to Function with lambda parameter:"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(args: Array&amp;lt;String&amp;gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; functionA({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;double awesomeness&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inline&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;functionA&lt;/span&gt;(lambda: () &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; Unit) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;awesomeness !&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lambda.invoke()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What the code looks like in Java (&lt;strong&gt;without inline&lt;/strong&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; functionA(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Function() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(&lt;span style="color:#e6db74"&gt;&amp;#34;double awesomeness&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;functionA&lt;/span&gt;(Function0 lambda) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String var1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;awesomeness !&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(var1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lambda.&lt;span style="color:#a6e22e"&gt;invoke&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What the code looks like in Java (&lt;strong&gt;with inline&lt;/strong&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String var1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;awesomeness !&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(var1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; String var2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;double awesomeness&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(var2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Function0:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Function0&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;out R&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; : Function&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;R&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/** Invokes the function. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; operator fun &lt;span style="color:#a6e22e"&gt;invoke&lt;/span&gt;(): R
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="misc"&gt;
Misc:
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-published-api/index.html"&gt;PublishedApi annotation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mattlogan.me/kotlins-inline-keyword/"&gt;Matt Logan’s post on inline keyword&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/inline-noinline-crossinline-what-do-they-mean-b13f48e113c2"&gt;Ben Daniel Medium post – inline, noinline, crossinline — What do they mean?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/116/</guid><pubDate>Mon, 05 Mar 2018 08:18:22 UTC</pubDate></item><item><title>115: Architecture Components with Akshay Chordiya</title><link>https://fragmentedpodcast.com/episodes/115/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/01f853a6-5fe9-484c-a64f-7fa4698f4de1?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/01f853a6-5fe9-484c-a64f-7fa4698f4de1/115-architecture-components-w-akshay-chordiya_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk about the different parts of Android architecture components. We’ve had episodes on Room and the paging library, so in this one, we thought we’ll touch a little on Lifecycle Owners &amp;amp; Observers, ViewModels, and LiveData. Akshay Chordiya helps break it down. Listen on!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/index.html"&gt;Android Architecture Components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lifecycle"&gt;
Lifecycle
&lt;a class="heading-anchor" href="#lifecycle" aria-label="Link to Lifecycle"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/lifecycle.html"&gt;Handling lifecycles with Lifecycle-Aware Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/lifecycle/LifecycleOwner.html"&gt;Lifecycle Owner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/lifecycle/LifecycleObserver.html"&gt;Lifecycle Observer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/lifecycle.html#lc-bp"&gt;Best practices for lifecycle-aware components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/lifecycle.html#onStop-and-savedState"&gt;Caveat: handling onStop events&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="viewmodels"&gt;
ViewModels
&lt;a class="heading-anchor" href="#viewmodels" aria-label="Link to ViewModels"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/viewmodel.html"&gt;Architecture Guide: ViewModels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/lifecycle/ViewModel.html"&gt;View Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Code snippet for a ViewModelFactory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class UserVMFactory(
val user: MyUser
) : ViewModelProvider.Factory {
override fun &amp;lt;T : ViewModel?&amp;gt; create(modelClass: Class&amp;lt;T&amp;gt;): T {
return when {
modelClass.isAssignableFrom(UserVM::class.java) -&amp;gt;
UserVM(user) as T
else -&amp;gt; throw IllegalArgumentException(&amp;quot;Unknown ViewModel class&amp;quot;)
}
}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="livedata"&gt;
LiveData
&lt;a class="heading-anchor" href="#livedata" aria-label="Link to LiveData"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/lifecycle/LiveData.html"&gt;Live Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData.html"&gt;MediatorLiveData&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/android-architecture-components-deep-dive"&gt;Android Architecture Components Deep Dive Course on Caster.IO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/95/"&gt;Fragmented – Room episode with Florina&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/97/"&gt;Fragmented – AAC Paging library with Florina&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt; – Sign up now on appcenter.ms and spend less time managing your app lifecycle and more time coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Akshay_Chordiya"&gt;@Akshay_Chordiya&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/115/</guid><pubDate>Mon, 26 Feb 2018 07:00:18 UTC</pubDate></item><item><title>114 : All About CI &amp; CD on App Center w/ Patrick Nikoletich</title><link>https://fragmentedpodcast.com/episodes/114/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/eb5772a9-4b18-43ce-988a-692304b4d85c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/eb5772a9-4b18-43ce-988a-692304b4d85c/patrick-nikoletich_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Patrick Nikoletich from Microsofts App Center team. We explore the intricacies of the Continuous Integration server system on the App Center platform. From what App Center is, all the way down into the weeds to how to get your app building on App Center in a few short steps. We also get into the nitty-gritty details around how you can customize your build with build hooks, install utilities and binaries, work with a command line interface, shell scripts, the App Center API much much more. This episode shows a new side of Microsoft that we have not seen in a long time and it’s a breath of fresh air.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VSTS: &lt;a href="https://www.visualstudio.com/team-services/"&gt;https://www.visualstudio.com/team-services/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft on GitHub: &lt;a href="https://github.com/Microsoft"&gt;https://github.com/Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The App Center CLI: &lt;a href="https://github.com/Microsoft/appcenter-cli"&gt;https://github.com/Microsoft/appcenter-cli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Azure function that automatically creates branch configurations for PR’s and communicates status back to Github.: &lt;a href="https://github.com/pniko/function-appcenter-build-"&gt;https://github.com/pniko/function-appcenter-build-&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;App Center API: &lt;a href="https://docs.microsoft.com/en-us/appcenter/api-docs/"&gt;https://docs.microsoft.com/en-us/appcenter/api-docs/&lt;/a&gt; &amp;amp; &lt;a href="https://openapi.appcenter.ms/"&gt;https://openapi.appcenter.ms/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Detox fo React Native Native: &lt;a href="https://github.com/wix/detox"&gt;https://github.com/wix/detox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Azure Server Functions: &lt;a href="https://azure.microsoft.com/en-us/services/functions/"&gt;https://azure.microsoft.com/en-us/services/functions/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt; – Android developers don’t have to settle for a default same-map-no-matter-what option in their Android app. Mapbox offers complete map design control, allowing you to create beautiful custom maps to meet the needs of your Android users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/@lbcpat"&gt;@lbcpat&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/114/</guid><pubDate>Mon, 19 Feb 2018 05:00:35 UTC</pubDate></item><item><title>113: Chatting with Pinterest’s Christina Lee</title><link>https://fragmentedpodcast.com/episodes/113/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/789a4aca-045b-4f34-8466-a9771ccaca9c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/789a4aca-045b-4f34-8466-a9771ccaca9c/113_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we catch up with a highly energetic but sick Christina Lee about the delightful details in the Pinterest app, delving with the dark side (Swift), giving live coding presentation talks and touching on some Kotlin details like covariance and contravariance. Listen on for a power-packed 40 minutes.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/84/"&gt;Google IO episode (#84)&lt;/a&gt; for Christina’s running story&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/developer?id=Pinterest&amp;amp;hl=en"&gt;Pinterest app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chrisjenx/Calligraphy"&gt;Calligraphy by Chris Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html"&gt;Android 8.0 Custom fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/guidelines/"&gt;Material design guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slideslive.com/38898711/pushing-androids-boundaries-for-pinterests-new-look"&gt;Brio design system by Pinterest’s Lin Wang and Thorben Primke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pinterest stars you should follow on Twitter -&amp;gt; &lt;a href="https://twitter.com/mallikaandroid"&gt;Mallika&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/Names_Alice"&gt;Alice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/christinalee/dcnyc17"&gt;Christina’s code from Kotlintown talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=OmwjrVawHqA"&gt;Christina &amp;amp; Huyen presentation from KotlinConf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt; – Android developers don’t have to settle for a default same-map-no-matter-what option in their Android app. Mapbox offers complete map design control, allowing you to create beautiful custom maps to meet the needs of your Android users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="show-notes-1"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes-1" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/84/"&gt;Google IO episode (#84)&lt;/a&gt; for Christina’s running story&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/developer?id=Pinterest&amp;amp;hl=en"&gt;Pinterest app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chrisjenx/Calligraphy"&gt;Calligraphy by Chris Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html"&gt;Android 8.0 Custom fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://material.io/guidelines/"&gt;Material design guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slideslive.com/38898711/pushing-androids-boundaries-for-pinterests-new-look"&gt;Brio design system by Pinterest’s Lin Wang and Thorben Primke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pinterest stars you should follow on Twitter -&amp;gt; &lt;a href="https://twitter.com/mallikaandroid"&gt;Mallika&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/Names_Alice"&gt;Alice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/christinalee/dcnyc17"&gt;Christina’s code from Kotlintown talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=OmwjrVawHqA"&gt;Christina &amp;amp; Huyen presentation from KotlinConf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors-1"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors-1" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt; – Android developers don’t have to settle for a default same-map-no-matter-what option in their Android app. Mapbox offers complete map design control, allowing you to create beautiful custom maps to meet the needs of your Android users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/runChristinaRun"&gt;@runChristinaRun&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/113/</guid><pubDate>Mon, 12 Feb 2018 15:45:54 UTC</pubDate></item><item><title>112: Effective Java v3 – Item #9 – Prefer try with resources to try finally</title><link>https://fragmentedpodcast.com/episodes/112/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d1fa5afb-54fd-4a90-bd6f-910ef2caa928?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d1fa5afb-54fd-4a90-bd6f-910ef2caa928/112-effective-java-9-v3_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-fragment episode, Donn talks about Item #9 of the Effective Java (Third Edition) book – &lt;strong&gt;Prefer try with resources to try finally&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Please note, this episode references the third edition of the Effective Java book that recently came out. Previously we were doing the entire series on version 2, but we are now upgrading to version 3 of the book. We will not be re-doing any of the existing lessons, but if one was inserted in the mix, then we will do that lesson.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Listen on:&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2DGJY6M"&gt;Effective Java (3rd Edition) Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt; – Android developers don’t have to settle for a default same-map-no-matter-what option in their Android app. Mapbox offers complete map design control, allowing you to create beautiful custom maps to meet the needs of your Android users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check them out today at &lt;a href="http://mapbox.com/android"&gt;mapbox.com/android&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/112/</guid><pubDate>Thu, 08 Feb 2018 05:30:11 UTC</pubDate></item><item><title>111: Effective Java v3 – Item #5 – Prefer Dependency Injection to Hardwiring Resources</title><link>https://fragmentedpodcast.com/episodes/111/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/eb403e6f-626f-471f-89cd-0f67b415a857?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/eb403e6f-626f-471f-89cd-0f67b415a857/fragmented-ef-java-5-final-auphonic_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-fragment episode, Donn talks about Item #5 of the Effective Java (Third Edition) book – Prefer Dependency Injection to Hardwiring Resources.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Please note, this episode references the third edition of the Effective Java book that recently came out. Previously we were doing the entire series on version 2, but we are now upgrading to version 3 of the book. We will not be re-doing any of the existing lessons, but if one was inserted in the mix, then we will do that lesson.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the case with Item #5. We did Item #5 previously for v2 of the book, but v3 introduced a new Item 5 (and bumped the previous Item 5 up to 6).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;TLDR; Item #5 is new in the third edition of the Effective Java book. So listen closely. :)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Listen on:&lt;/p&gt;
&lt;h2 id="links"&gt;
Links
&lt;a class="heading-anchor" href="#links" aria-label="Link to Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2DGJY6M"&gt;Effective Java (3rd Edition) Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt; – Android developers don’t have to settle for a default same-map-no-matter-what option in their Android app. Mapbox offers complete map design control, allowing you to create beautiful custom maps to meet the needs of your Android users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check them out today at &lt;a href="http://mapbox.com/android"&gt;mapbox.com/android&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/111/</guid><pubDate>Mon, 29 Jan 2018 05:00:45 UTC</pubDate></item><item><title>110: BuddyBuild and CI/CD services</title><link>https://fragmentedpodcast.com/episodes/110/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/63f9aed9-ec01-423d-86f4-71656327731e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/63f9aed9-ec01-423d-86f4-71656327731e/110_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, we talk about CI, CD and CD services. That’s Continuous Integration, Continuous Delivery, and Continuous Deployment. BuddyBuild a beloved 3rd party service of ours (and previous sponsor) is sunsetting their Android service, so Donn and KG discuss alternatives and the options they’ve been keeping an eye on.&lt;/p&gt;
&lt;p&gt;Listen on:&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.buddybuild.com/blog/buddybuild-is-now-part-of-apple"&gt;BuddyBuild is now part of Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theverge.com/2012/7/20/3172222/google-buys-sparrow-mail"&gt;Google buys Sparrow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="differences-between-cicds-services"&gt;
Differences between CI/CDs services
&lt;a class="heading-anchor" href="#differences-between-cicds-services" aria-label="Link to Differences between CI/CDs services"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/continuous-integration"&gt;Good article on CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gocd.org/2017/10/17/difference-between-continuous-delivery-continuous-deployment-infographic.html"&gt;Nice infomatic explaining CD vs CD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2018/01/110_md.png" alt="differences between CI/CD/CD" /&gt;
&lt;h3 id="options-for-ci-services"&gt;
Options for CI Services
&lt;a class="heading-anchor" href="#options-for-ci-services" aria-label="Link to Options for CI Services"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudbees.com/"&gt;CloudBees – enterprise Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bitrise.io"&gt;Bitrise&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bitrise-docker/android/issues/35"&gt;Bitrise and Firebase test lab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="nevercode.io"&gt;NeverCode&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nevercode.io/looking-buddybuild-alternative-welcome-nevercode/"&gt;Welcoming Android developers blog post by NeverCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Microsoft AppCenter&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/104/"&gt;Ep 104 – Donn talks to the Samina from AppCenter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com/"&gt;Circle CI&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://circleci.com/docs/2.0/"&gt;2.0 docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com/docs/1.0/firebase-test-lab/"&gt;Testing with Firebase test lab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/teamcity/"&gt;Team City – Jetbrains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeship.com/"&gt;Code Ship&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ryanjsalva"&gt;@ryanjsalva&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://www.instagram.com/donnfelker/"&gt;📷 donnfelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://www.instagram.com/kaushikgopal/"&gt;📷 kaushikgopal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/110/</guid><pubDate>Mon, 22 Jan 2018 16:08:38 UTC</pubDate></item><item><title>109: Learning Kotlin – Sequences the new Iterables</title><link>https://fragmentedpodcast.com/episodes/109/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8a6b0def-44d2-4aaf-aca1-4726d8f72bd9?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8a6b0def-44d2-4aaf-aca1-4726d8f72bd9/109-kotlin-sequences_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, we go back to learning some Kotlin and look at the Iterable like data structure introduced called “Sequences”. What is a sequence? How is it different from Iterable? When should I use it?&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/-sequence/index.html"&gt;Kotlin Sequence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/6863258"&gt;Java Iterable vs Iterator – stackoverflow.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="eagerlazy"&gt;
Eager/Lazy
&lt;a class="heading-anchor" href="#eagerlazy" aria-label="Link to Eager/Lazy"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Eager evaluation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; lst = listOf(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; lstMapped: List&amp;lt;Int&amp;gt; = lst.map { print(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$it&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&lt;/span&gt;); &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt; * &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;before sum &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; sum = lstMapped.sum()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// prints &amp;#34;1 2 before sum&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lazy evaluation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; seq = sequenceOf(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; seqMapped: Sequence&amp;lt;Int&amp;gt; = seq.map { print(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$it&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&lt;/span&gt;); &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt; * &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;before sum &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; sum = seqMapped.sum()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// prints &amp;#34;before sum 1 2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://stackoverflow.com/a/35630670"&gt;Source stackoverflow.com answer&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="intermediate-and-terminal-operations"&gt;
Intermediate and terminal operations
&lt;a class="heading-anchor" href="#intermediate-and-terminal-operations" aria-label="Link to Intermediate and terminal operations"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Notice that at each chain operation, a new temporary list is created:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;data&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Person&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; name: String, &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; age: Int)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(args: Array&amp;lt;String&amp;gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; people =
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listOf(Person(&lt;span style="color:#e6db74"&gt;&amp;#34;Chris Martin&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;31&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;Will Champion&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;Jonny Buckland&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;33&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;Guy Berryman&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;34&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Person(&lt;span style="color:#e6db74"&gt;&amp;#34;Mhris Cartin&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(people
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .filter { &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;.age &amp;gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt; } &lt;span style="color:#75715e"&gt;// new temp. list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; .map {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;.name.split(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;).map {&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]}.joinToString(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#75715e"&gt;// new temp. list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; .map { &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;.toUpperCase() }) &lt;span style="color:#75715e"&gt;// new temp. list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using a sequence:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(people
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .asSequence() &lt;span style="color:#75715e"&gt;// convert to sequence
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; .filter { &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;.age &amp;gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt; } &lt;span style="color:#75715e"&gt;// lazy eval (intermediate op)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; .map {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;.name.split(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;).map {&lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]}.joinToString(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#75715e"&gt;// lazy eval (intermediate op)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; .map { &lt;span style="color:#66d9ef"&gt;it&lt;/span&gt;.toUpperCase() } &lt;span style="color:#75715e"&gt;// lazy eval (intermediate op)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; .toList() &lt;span style="color:#75715e"&gt;// terminal operation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Without a terminal operation, Sequences won’t print anything:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; seq = sequenceOf(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(seq) &lt;span style="color:#75715e"&gt;// prints address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; println(seq.toList()) &lt;span style="color:#75715e"&gt;// [1, 2, 3]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can’t pick an index from a sequence:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; println(seq[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#75715e"&gt;// throws ERROR &amp;#34;No get method providing array access&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; println(seq.toList()[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]) &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/109/</guid><pubDate>Tue, 16 Jan 2018 05:00:45 UTC</pubDate></item><item><title>108: State of React Native for Android with Ryan Salva</title><link>https://fragmentedpodcast.com/episodes/108/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/42dae3d7-bc29-4a1a-a24a-eeee643b2239?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/42dae3d7-bc29-4a1a-a24a-eeee643b2239/108_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn talks to React Native magician Ryan Salva. React native and cross-platform development is typically one of our most requested topics so we kick the new year off with React Native. Ryan and Donn dive into the state of React Native today for mobile development, how it’s matured since inception, what kinds of apps are suited to be built with React Native, what kinds aren’t, what are the benefits to using React Native, some tips like pushing updates without having to upload to the play store every time and so much more.&lt;/p&gt;
&lt;p&gt;Listen on!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://audio.simplecast.com/9487e311.mp3"&gt;Download directly&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cordova.apache.org/"&gt;(Apache) Cordova&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react-native/"&gt;React Native&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Microsoft/code-push"&gt;CodePush&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://microsoft.github.io/code-push/"&gt;CodePush moving to App Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;App Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/fundamentals/primers/service-workers/"&gt;Service workers: an Introduction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://expo.io/"&gt;Expo JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/creationix/nvm"&gt;nvm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="noteworthy-quotes-from-this-episode"&gt;
Noteworthy quotes from this episode:
&lt;a class="heading-anchor" href="#noteworthy-quotes-from-this-episode" aria-label="Link to Noteworthy quotes from this episode:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;As developers, we are empowered to break things; it’s our god given right!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Javascript is a beautiful disaster&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mapbox.com/android"&gt;Mapbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ryanjsalva"&gt;@ryanjsalva&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/108/</guid><pubDate>Mon, 08 Jan 2018 15:09:01 UTC</pubDate></item><item><title>107: Shape shifting SVGs with Alex Lockwood</title><link>https://fragmentedpodcast.com/episodes/107/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/cbce48b7-a64d-4967-8531-86fb970e32dd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/cbce48b7-a64d-4967-8531-86fb970e32dd/107_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Alex Lockwood who created shapeshifter.design, while at Google. Shape Shifter is an amazing tool that can help developers create Animated Vector Drawables without losing all their hair. Think of shapeshifter as a developer-friendly, open source, After Effects alternative for Android developers.&lt;/p&gt;
&lt;p&gt;Alex talks to us about how and why he created Shape Shifter, the different tools that have evolved out of its creation and just getting a good grasp of its working.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="abt-alex-lockwood"&gt;
Abt Alex Lockwood
&lt;a class="heading-anchor" href="#abt-alex-lockwood" aria-label="Link to Abt Alex Lockwood"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.androiddesignpatterns.com/"&gt;Alex’s blog – androiddesignpatterns.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html"&gt;How to Leak a Context: Handlers &amp;amp; Inner Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html"&gt;Handling configuration changes with Fragments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="shape-shifter"&gt;
Shape Shifter
&lt;a class="heading-anchor" href="#shape-shifter" aria-label="Link to Shape Shifter"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://shapeshifter.design/"&gt;shapeshifter.design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.androiddesignpatterns.com/2016/11/introduction-to-icon-animation-techniques.html"&gt;Blog post on icon animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androiddesignpatterns.com/2016/11/introduction-to-icon-animation-techniques.html"&gt;An Introduction to Icon Animation Techniques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="svgo"&gt;
SVGO
&lt;a class="heading-anchor" href="#svgo" aria-label="Link to SVGO"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/svg/svgo"&gt;SVGo – optimizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jakearchibald.github.io/svgomg/"&gt;SVG-OMG – webapp that runs svgo on web by Jake Archibald&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="shape-shifting--icon-animations"&gt;
Shape Shifting &amp;amp; Icon animations
&lt;a class="heading-anchor" href="#shape-shifting--icon-animations" aria-label="Link to Shape Shifting &amp;amp; Icon animations"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=JhryKMOM6GI"&gt;Alex Lockwood Droidcon SF 2017 Talk – In-depth parth morphing w/Shape Shifter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=2aq3ljlnQdI"&gt;Building play to pause animation with ShapeShifter&lt;/a&gt; &lt;a href="j.mp/path-morph"&gt;[slides]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=v7I6eo4Fo6U"&gt;Animal morph animation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dzB-1VlHJW8"&gt;Nick Butcher talk – Learn some new moves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm"&gt;Needleman-Wunsch algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alexjlockwood/avdo"&gt;AVDO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alexjlockwood/avdo/issues/19"&gt;github issue: AVDO -&amp;gt; 🥑&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://airbnb.design/introducing-lottie/"&gt;Lottie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Thanks to &lt;a href="https://www.buddybuild.com/?ref=fragmented"&gt;Buddybuild&lt;/a&gt; for sponsoring this episode of Fragmented! Ship apps faster with BuddyBuild 🚀 Give them a try for free at &lt;a href="https://www.buddybuild.com/?ref=fragmented"&gt;fragmentedpodcast.com/buddybuild&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="twitter.com/alexjlockwood"&gt;@alexjlockwood&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/107/</guid><pubDate>Mon, 18 Dec 2017 14:00:51 UTC</pubDate></item><item><title>106: The Reactive Workflow Pattern with Ray Ryan</title><link>https://fragmentedpodcast.com/episodes/106/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a6f434b0-0858-45a0-a3ce-0353311eb620?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a6f434b0-0858-45a0-a3ce-0353311eb620/106-rayryan_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we sit down and talk to Ray Ryan from Square about the Reactive Workflow pattern that he recently gave a talk on. This pattern goes deep into RootViews, containers, ViewFactories and much much more.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ray’s “The Rx Workflow Pattern” talk at Droidcon NYC: &lt;a href="https://www.youtube.com/watch?v=KjoMnsc2lPo"&gt;droidcon NYC 2017 – The Rx Workflow Pattern – YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flow Navigation –&lt;a href="https://github.com/square/flow"&gt;GitHub – square/flow: Name UI states, navigate between them, remember where you’ve been.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Square Coordinator Library – &lt;a href="https://github.com/square/coordinators"&gt;GitHub – square/coordinators: Simple MVWhatever for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Composable State Machine Pattern – &lt;a href="https://gist.github.com/andymatuschak/d5f0a8730ad601bcccae97e8398e25b2"&gt;A composable pattern for pure state machines with effects (draft v3) · GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rjrjr"&gt;@rjrjr&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/106/</guid><pubDate>Wed, 13 Dec 2017 21:56:46 UTC</pubDate></item><item><title>105: Jake Wharton on the Android Kotlin Guides</title><link>https://fragmentedpodcast.com/episodes/105/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/db9f7456-db36-4540-b968-983e493aa44c?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/db9f7456-db36-4540-b968-983e493aa44c/105-interview-w-jake-wharton_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Jake Wharton of &lt;em&gt;Google&lt;/em&gt; on a recent Kotlin coding style guide that they released: the Android Kotlin Guides. In this episode, we pick his brains and ask him how he structured the guide, how he partitioned it to fit some of the idiosyncrasies of Kotlin, what some of the challenges were, when coming up with the guide and much more.&lt;/p&gt;
&lt;p&gt;Jake’s one of the best out there and it’s always such a pleasure to have him on the show.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="the-style-guides"&gt;
The style guides
&lt;a class="heading-anchor" href="#the-style-guides" aria-label="Link to The style guides"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.github.io/kotlin-guides/index.html"&gt;Android Kotlin Guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/android/kotlin-guides"&gt;official github repo for Android Kotlin guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/styleguide/javaguide.html"&gt;Google Java Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/docs/reference/coding-conventions.html"&gt;Jetbrains Coding conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jetbrains &lt;a href="http://kotlinlang.org/docs/reference/idioms.html"&gt;collection of Kotlin idioms&lt;/a&gt; (also very useful)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="building-the-style-guide"&gt;
Building the style guide
&lt;a class="heading-anchor" href="#building-the-style-guide" aria-label="Link to Building the style guide"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/android-testing-support-library/"&gt;Android Testing support library website (inspiration for how to set it up)&lt;/a&gt; (&lt;a href="https://github.com/google/android-testing-support-library"&gt;github&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="android-kotlin-guides"&gt;
Android Kotlin Guides
&lt;a class="heading-anchor" href="#android-kotlin-guides" aria-label="Link to Android Kotlin Guides"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets"&gt;Annotation use-site targets with Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.github.io/kotlin-guides/interop.html#file-name"&gt;guide on interop and file-names for use-site targets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/android/kotlin-guides/issues/11"&gt;logical ordering explanation for ordering companion object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://beust.com/weblog/2017/07/17/i-am-the-reason-for-hungarian-notation-in-android/"&gt;I am the reason for Hungarian notation – Cedric Beust blog post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mockito-when-problems"&gt;
Mockito &lt;code&gt;when&lt;/code&gt; problems:
&lt;a class="heading-anchor" href="#mockito-when-problems" aria-label="Link to Mockito when problems:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/keyword-reference.html"&gt;Kotlin reserved keywords&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nhaarman/mockito-kotlin"&gt;Mockito Kotlin library&lt;/a&gt; (aliases when -&amp;gt; whenever)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.github.io/kotlin-guides/style.html#where-to-break"&gt;Where to break lines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/kotlinx.collections.immutable"&gt;Immutable collection prototypes for Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kotlin/status/755339965194731521"&gt;@Kotlin tweet on immutable collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.github.io/kotlin-guides/interop.html#function-overloads-for-defaults"&gt;@JvmOverloads&lt;/a&gt; (we love this!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="contributing"&gt;
Contributing
&lt;a class="heading-anchor" href="#contributing" aria-label="Link to Contributing"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/android/kotlin-guides/issues"&gt;Contribute to github issues on Android Kotlin Guides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jakewharton"&gt;@JakeWharton&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/105/</guid><pubDate>Mon, 04 Dec 2017 05:00:50 UTC</pubDate></item><item><title>104: Conversations with GNOME/Mono/Xamarin creator Miguel and VS App Center PM Simina</title><link>https://fragmentedpodcast.com/episodes/104/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9b7e17f1-fba3-4062-a866-3435462bc85d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/9b7e17f1-fba3-4062-a866-3435462bc85d/104-microsoft-interviews_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn makes the pilgrimage to Microsoft Connect 2017. Connect is Microsoft’s annual developer conference where they announce a bunch of new products and services.&lt;/p&gt;
&lt;p&gt;Donn got to interview a bunch of folks, and in this episode, we talk to two of them: Miguel De Icaza (leading open source proponent who also helped create Gnome, Mono, Xamarin etc.) and Simina Pasat (Program manager for Microsoft’s very new CI like service AppLink). Both of them were terrific guests and had quite a few gems to share, for us Android devs!&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/en-us/connectevent/default.aspx"&gt;Microsoft Connect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="miguel"&gt;
Miguel
&lt;a class="heading-anchor" href="#miguel" aria-label="Link to Miguel"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Miguel_de_Icaza"&gt;MiguelDeIcaza (Wikipedia)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Wine_(software)"&gt;Wine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Midnight_Commander"&gt;Midnight Commander&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Gnumeric"&gt;Gnumeric speedsheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linux.com/learn/use-evolution-connect-microsoft-exchange-linux"&gt;Evolution – Outlook clone for linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cross-platform-development"&gt;
Cross platform development
&lt;a class="heading-anchor" href="#cross-platform-development" aria-label="Link to Cross platform development"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mono-project.com/"&gt;Mono project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xamarin.com/"&gt;Xamarin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xamarin.com/live"&gt;Xamarin Live Player&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.xamarin.com/workbooks/"&gt;Xamarin Workbooks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://channel9.msdn.com/Events/Connect/2017/T256"&gt;Scott Hanselman on using Visual Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.visualstudio.com/"&gt;Download Visual Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://foundation.fsharp.org/"&gt;F# (programming language)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=8pTEmbeENF4"&gt;Bret Victor – The Future of Programming (youtube)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="simina-pasat"&gt;
Simina Pasat
&lt;a class="heading-anchor" href="#simina-pasat" aria-label="Link to Simina Pasat"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hockeyapp.net/"&gt;HockeyApp platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appcenter.ms/"&gt;Visual Studio App Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.msdn.microsoft.com/vsappcenter/introducing-visual-studio-app-center/"&gt;Introducing App Center: Build, Test, Distribute and Monitor Apps in the Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=2TXuZ5LkzA4"&gt;How to upload an Espresso Test to Visual Studio App Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/VSAppCenter"&gt;@vsappcenter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/MiguelDeIcaza"&gt;@MiguelDeIcaza&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/SiminaPasat"&gt;@SiminaPasat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/104/</guid><pubDate>Mon, 27 Nov 2017 05:00:29 UTC</pubDate></item><item><title>103: MVI pattern with Hannes Mosby Dorfmann</title><link>https://fragmentedpodcast.com/episodes/103/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d2c9aff1-0378-4dbf-aa60-b98f42a5ad5b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d2c9aff1-0378-4dbf-aa60-b98f42a5ad5b/103-hannes_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, we talk to Hannes Dorfmann about using the Model View Intent (MVI) pattern for Android. The MVI pattern was sparked through cycle.js (for javascript). Hannes took this pattern and tried to adapt it to Android. This pattern has gained a lot of traction and interest in the Android community.&lt;/p&gt;
&lt;p&gt;In this episode, he breaks down the pattern for us. He tells us how to implement it, how it helps with testing, the benefits of the pattern and some of the pitfalls. Recording this episode was riveting for us and we dive into some juicy technical details. Listen on!&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="about-hannes"&gt;
About Hannes
&lt;a class="heading-anchor" href="#about-hannes" aria-label="Link to About Hannes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/"&gt;hannesdorfmann.com blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/mosby/"&gt;Mosby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tickaroo.com/"&gt;Tickaroo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freeletics.com/en"&gt;Freeletics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artem-zinnatullin/TheContext-Podcast"&gt;The Context podcast&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mv-patterns"&gt;
MV* patterns
&lt;a class="heading-anchor" href="#mv-patterns" aria-label="Link to MV* patterns"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cycle.js.org/getting-started.html"&gt;cyclejs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/andrestaltz"&gt;André “Staltz” Medeiros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel"&gt;MVVM pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter"&gt;MVP pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vimeo.com/191068122"&gt;KG – What i learnt using Presenter patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MVC by &lt;a href="https://en.wikipedia.org/wiki/Trygve_Reenskaug"&gt;Trygve Reenskaug&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mvi-like-patterns"&gt;
MVI like patterns
&lt;a class="heading-anchor" href="#mvi-like-patterns" aria-label="Link to MVI like patterns"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Hannes series on MVI for Android (must read!) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-1"&gt;Reactive apps with MVI Part 1 – Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-2"&gt;Reactive apps with MVI Part 2 – View and Intent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-3"&gt;Reactive apps with MVI Part 3 – State Reducer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-4"&gt;Reactive apps with MVI Part 4 – Independent UI components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-5"&gt;Reactive apps with MVI Part 5 – Debugging with Ease&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-6"&gt;Reactive apps with MVI Part 6 – Restoring state&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/android/mosby3-mvi-7"&gt;Reactive apps with MVI Part 7 – Timing (Single live event problem)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kategory.io/"&gt;Kategory&lt;/a&gt; – (&lt;a href="https://twitter.com/JorgeCastilloPr"&gt;Jorge&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redux.js.org/"&gt;Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redux-saga.js.org/"&gt;Redux Saga – alternative side effect model for Redux apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/redux-observable"&gt;Redux Observable – AirBnB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/groupon/grox"&gt;Groupon Grux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tech.instacart.com/lce-modeling-data-loading-in-rxjava-b798ac98d80"&gt;Instacart LCE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=UsuzhTlccRk"&gt;The Journey of Android Engineers: Redux-ing UI Bugs by Christina Lee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=0IKHxjkgop4"&gt;Managing State with RxJava by Jake Wharton&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rollbar/rollbar-java/blob/v1.0.0-alpha-1/README.md"&gt;Rollbar open source library (alpha)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/sockeqwe"&gt;@sockeqwe&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/103/</guid><pubDate>Mon, 13 Nov 2017 05:00:24 UTC</pubDate></item><item><title>102: All Things Kotlin and notes from KotinConf</title><link>https://fragmentedpodcast.com/episodes/102/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f6933423-4b6c-479e-a765-d26f89007c9e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f6933423-4b6c-479e-a765-d26f89007c9e/102_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn and I decompress. I had the pleasure of attending KotlinConf 2017 – Jetbrain’s very first conference dealing completely just on Kotlin. I have a quick chat after Day 1 with Donn, giving him the juicy updates.&lt;/p&gt;
&lt;p&gt;We talk about how the conference was organized, some of the technical talks I attended (our thoughts on these…) and some of the folks I had the opportunity to meet.&lt;/p&gt;
&lt;p&gt;Overall it was an amazing time at KotlinConf and if you want to vicariously enjoy it, listen on to the show.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="pixel-2"&gt;
Pixel 2
&lt;a class="heading-anchor" href="#pixel-2" aria-label="Link to Pixel 2"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://store.google.com/product/pixel_2"&gt;Google Store – Pixel 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dbrand.com/"&gt;dbrand skins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/mandybess/status/910556038461407232"&gt;Amanda’s tweet on Samsung being annoying&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kotlinconf"&gt;
KotlinConf
&lt;a class="heading-anchor" href="#kotlinconf" aria-label="Link to KotlinConf"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kotlinconf.com"&gt;KotlinConf 2017 page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.westedgedesignfair.com/wp-content/uploads/2015/05/Pier-27.jpg"&gt;Pier 27 photo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="meeting-folks"&gt;
Meeting folks
&lt;a class="heading-anchor" href="#meeting-folks" aria-label="Link to Meeting folks"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Erik_Meijer_(computer_scientist)"&gt;Erik Meijer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://talkingkotlin.com/"&gt;Talking Kotlin podcast&lt;/a&gt; – &lt;a href="https://twitter.com/hhariri"&gt;Hadi Harriri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="talks-at-kotlinconf"&gt;
Talks at KotlinConf
&lt;a class="heading-anchor" href="#talks-at-kotlinconf" aria-label="Link to Talks at KotlinConf"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/mandybess/kotlinconf-2017-view-state-machine-for-network-calls-on-android"&gt;Amanda Hill – View state machine for network calls on Android (slides)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/elizarov/introduction-to-kotlin-coroutines"&gt;Roman Elizarov – Introduction to Coroutines (slides from another conference)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/jorgecastilloprz/kotlinconf-architectures-using-functional-programming-concepts"&gt;Jorge Costillo: Architectures Using Functional Programming Concepts (slides)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@JorgeCastilloPr"&gt;Jorge’s medium blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="coroutine-introduction"&gt;
Coroutine introduction
&lt;a class="heading-anchor" href="#coroutine-introduction" aria-label="Link to Coroutine introduction"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/a-first-walk-into-kotlin-coroutines-on-android-fe4a6e25f46a"&gt;Antonio Levia’s post – A first walk into Kotlin coroutines on Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://antonioleiva.com/kotlin-android-developers-book/"&gt;Book – Kotlin for Android developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-interesting-stuff"&gt;
Other interesting stuff
&lt;a class="heading-anchor" href="#other-interesting-stuff" aria-label="Link to Other interesting stuff"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.github.io/kotlin-guides/"&gt;Kotlin Style Guide&lt;/a&gt; – courtesy Jake Wharton&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/styleguide/javaguide.html"&gt;Google Java Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/google-java-format"&gt;google-java-format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/status/926200425002409984"&gt;now for google-kotlin-format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/android/kotlin-guides/issues/3"&gt;github isse (+1 this :D)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#overloads-generation"&gt;@JvmOverloads overloads generation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;Thanks to &lt;a href="https://www.buddybuild.com/?ref=fragmented"&gt;Buddybuild&lt;/a&gt; for sponsoring this episode of Fragmented! Ship apps faster with BuddyBuild 🚀 Give them a try for free at &lt;a href="https://www.buddybuild.com/?ref=fragmented"&gt;fragmentedpodcast.com/buddybuild&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/102/</guid><pubDate>Mon, 06 Nov 2017 05:00:36 UTC</pubDate></item><item><title>101: Learning Kotlin – visibility modifiers, internal modifier, modules</title><link>https://fragmentedpodcast.com/episodes/101/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c8124dde-820a-4966-af33-836aab8d3361?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/c8124dde-820a-4966-af33-836aab8d3361/101-minifragment-kotlinw-kaush_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Another day, another opportunity to learn more Kotlin. In this episode, Kaushik walks through the concept of visibility modifiers. How do the modifiers in Kotlin differ from the ones in Java? What is this new internal modifier? When should I use each of the operators?&lt;/p&gt;
&lt;p&gt;Listen on to find out!&lt;/p&gt;
&lt;h1 id="shownotes"&gt;
Shownotes:
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes:"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/visibility-modifiers.html"&gt;Visibility modifiers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/63/"&gt;Effective Java Item #13 – Ep 63&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discuss.kotlinlang.org/t/kotlins-default-visibility-should-be-internal/1400"&gt;discussion: Why the default should be internal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://phobos.ramapo.edu/~amruth/grants/problets/courseware/scope/home.html"&gt;Scopes in programming language (white paper)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Scope_(computer_science)"&gt;Scopes in programming language (wikipedia)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/10/Evernote-Snapshot-20171026-075041.png"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/10/Evernote-Snapshot-20171026-075041.png" alt="" width="2310" height="951" class="aligncenter size-full wp-image-381" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/10/Evernote-Snapshot-20171026-075041.png 2310w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/10/Evernote-Snapshot-20171026-075041-300x124.png 300w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/10/Evernote-Snapshot-20171026-075041-768x316.png 768w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/10/Evernote-Snapshot-20171026-075041-1024x422.png 1024w" sizes="(max-width: 2310px) 100vw, 2310px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.baeldung.com/kotlin-visibility-modifiers"&gt;Excellent resource explaining visibility modifiers in Kotlin&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // public by default
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible
override val b = 5 // 'b' is protected
}
class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/101/</guid><pubDate>Mon, 30 Oct 2017 05:00:34 UTC</pubDate></item><item><title>100: Episode 100 Listener questions</title><link>https://fragmentedpodcast.com/episodes/100/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a5910acf-cb62-4e4a-a037-5b060b098c6e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a5910acf-cb62-4e4a-a037-5b060b098c6e/ep-100_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This is the 100th episode of Fragmented. We do things a little differently for our 100th episode and field a bunch of listener questions that came in. We’re going a little meta and talking about our experience starting Fragmented, our process, how we pick guests and topics, our setups, our favorite Android libraries and classes (?!).&lt;/p&gt;
&lt;p&gt;Thank you so much for being a listener. We cannot express how grateful we are to have you.&lt;/p&gt;
&lt;h1 id="shownotes"&gt;
Shownotes
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/android-from-the-trenches/"&gt;Android from the trenches (first talk KG saw of Donn’s)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sivers.org/hellyeah"&gt;No “yes.” Either “HELL YEAH!” or “no.”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://store.google.com/gb/product/pixel_2"&gt;Google Pixel 2 store&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;
Setup
&lt;a class="heading-anchor" href="#setup" aria-label="Link to Setup"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="kg"&gt;
KG
&lt;a class="heading-anchor" href="#kg" aria-label="Link to KG"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/dp/B0002BACBO/ref=wl_it_dp_o_pC_nS_ttl"&gt;Shure Beta 87A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bhphotovideo.com/c/product/734341-REG/Sound_Devices_USBPRE_2_USBPre_2_Microphone.html"&gt;USB Pre 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/dp/B00Y09G6JG/ref=wl_it_dp_o_pC_nS_ttl"&gt;LG 34UC87C 34 ultra wide display&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Headphones (KG has too many – ping em if you’re curious)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn"&gt;
Donn
&lt;a class="heading-anchor" href="#donn" aria-label="Link to Donn"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/dp/B0002BACBO/ref=wl_it_dp_o_pC_nS_ttl"&gt;Shure Beta 87A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/PR-40-Dynamic-Studio-Recording-Microphone/dp/B000SOYOTQ/ref=sr_1_2"&gt;Heil PR 40&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Focusrite-Scarlett-Audio-Interface-Tools/dp/B01E6T56EA/ref=dp_ob_title_ce"&gt;Focusrite Scarlett 2i2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Mackie-Onyx-Blackjack-Recording-Interface/dp/B06X9TNYVN/ref=sr_1_1?s=musical-instruments&amp;amp;ie=UTF8&amp;amp;qid=1508722021&amp;amp;sr=1-1&amp;amp;keywords=Black+Jack+Onyx"&gt;Mackie Onyx Blackjack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Dell-E2715H-27-Inch-LED-Lit-Monitor/dp/B00M9B3XN4"&gt;Dell E2715H monitor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="android-resources"&gt;
Android Resources
&lt;a class="heading-anchor" href="#android-resources" aria-label="Link to Android Resources"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://androidweekly.net/"&gt;Android Weekly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androiddevdigest.com/"&gt;Android dev digest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/a-tool-to-help-keeping-up-with-android-development-61a3112850c7"&gt;Android resources (curated) one where we point people to&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JStumpp/awesome-android"&gt;Awesome android github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.. and many many more&lt;/p&gt;
&lt;h2 id="favorite-class-and-libs"&gt;
Favorite class and libs
&lt;a class="heading-anchor" href="#favorite-class-and-libs" aria-label="Link to Favorite class and libs"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/view/View.html"&gt;Android View class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/graphics/Canvas.html"&gt;Android Canvas class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveX/RxJava"&gt;RxJava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/dagger"&gt;Dagger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/roboguice/roboguice"&gt;Roboguice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/make-the-most-of-your-time/"&gt;Donn Felker – make the most of your time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.robinhood.android&amp;amp;hl=en"&gt;Robinhood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.squareup.cash"&gt;Square Cash app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.music&amp;amp;hl=en"&gt;Google Play music app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidniceties.tumblr.com/"&gt;Android niceties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/mvp/"&gt;Caster io – MVP series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/RxJava-Android-Samples"&gt;RxJava Android samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/instacart/truetime-android"&gt;TrueTime Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rollbar/rollbar-java/blob/v1.0.0-alpha-1/README.md"&gt;Rollbar open source library (alpha)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/100/</guid><pubDate>Mon, 23 Oct 2017 05:00:35 UTC</pubDate></item><item><title>099: Effective Java – Item #17: Design and Document for Inheritance or Else Prohibit It</title><link>https://fragmentedpodcast.com/episodes/99/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/7c8eff05-cd51-467d-ac4e-8ff895b01468?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/7c8eff05-cd51-467d-ac4e-8ff895b01468/fragmented-ef-java-17_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks about Item #17 from the Effective Java book: Design and Document for inheritance or else prohibit it. Learn how you should be documenting your code that is built for inheritance when you should not call overridable methods and much more.&lt;/p&gt;
&lt;h2 id="show-links"&gt;
Show Links
&lt;a class="heading-anchor" href="#show-links" aria-label="Link to Show Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/effective-java/"&gt;Fragmented – Effective Java Fragments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/99/</guid><pubDate>Mon, 09 Oct 2017 05:00:03 UTC</pubDate></item><item><title>098 : Droidcon NYC 2017 – Kotlin, React Native, Android Security, Design Patterns and Doppl</title><link>https://fragmentedpodcast.com/episodes/98/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d1048610-a5bc-4eb6-8687-21d66ae1170a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d1048610-a5bc-4eb6-8687-21d66ae1170a/fragmented-droidconnyc-2017_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn is at Droidcon NYC 2017. He sits down to chat with Dan Kim about Kotlin, Gabriel Peal about React Native, Scott Alexander-Bown about Android Security, Jose Alcérreca about the Android Architecture Blueprints and Kevin Galligan about the history of Droidcon NYC and his new library – Doppl.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2:07 – Dan Kim (Kotlin)
&lt;ul&gt;
&lt;li&gt;10:07 – Gabriel Peal (React Native)&lt;/li&gt;
&lt;li&gt;23:43 – Scott Alexander-Bown (Android Security)&lt;/li&gt;
&lt;li&gt;33:32 – Jose Alcérreca (Android Architecture Blueprints)&lt;/li&gt;
&lt;li&gt;43:09 – Kevin Galligan (Droidcon &amp;amp; Doppl)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="show-links"&gt;
Show Links
&lt;a class="heading-anchor" href="#show-links" aria-label="Link to Show Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/82/"&gt;082: Airbnb’s Gabriel tells us how to animate with Lottie – Fragmented&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/85/"&gt;085: Casual Kotlin conversation with Dan Kim – Fragmented&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-architecture"&gt;GitHub – googlesamples/android-architecture: A collection of samples to discuss and showcase different architectural tools and patterns for Android apps.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.touchlab.co/doppl/"&gt;doppl by touchlab — touchlab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;BuddyBuild – fragmentedpodcast.com/buddybuild&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dankim"&gt;Dan Kim (@dankim) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gpeal8"&gt;Gabriel Peal (@gpeal8) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/scottyab"&gt;Scott Alexander-Bown (@scottyab) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ppvi"&gt;Jose Alcérreca (@ppvi) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kpgalligan"&gt;Kevin Galligan (@kpgalligan) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/98/</guid><pubDate>Mon, 02 Oct 2017 05:00:27 UTC</pubDate></item><item><title>097 : Android Architecture Paging Library with Florina Muntenescu</title><link>https://fragmentedpodcast.com/episodes/97/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/69792bd3-9f0a-4b8e-a99c-55ad97c37fb3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/69792bd3-9f0a-4b8e-a99c-55ad97c37fb3/096-florina-paging_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Florina returns to talk to us about Google’s recently announced paging library!&lt;/p&gt;
&lt;p&gt;The paging library is a powerful take on implementing paging functionality in general, not necessarily linked to a particular technology or library. Florina breaks down the different components and explains what specific function each of them play.&lt;/p&gt;
&lt;p&gt;We start off with DataSources, talk about when one would want to use “Tiled” or “Keyed” data sources, and then talk about making them work with RecyclerViews (which is really what 99% of us eventually want). Florina also explains the role of PagedLists, PagedListAdapters and so much more.&lt;/p&gt;
&lt;p&gt;If you ever wanted to get an overarching view of Google’s first take on implementing the paging library, this is a great starting point. Listen on so you can understand, try it out and then give feedback to Google, to participate in the making of this new library.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Ts-uxYiBEQ8&amp;amp;feature=youtu.be&amp;amp;t=856"&gt;Google Developer Days – Florina’s segment on paging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/paging.html"&gt;Paging library – developer docs&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/paging/DataSource.html"&gt;DataSources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/paging/PagedList.html"&gt;PagedList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/paging/PagedListAdapter.html"&gt;PagedListAdapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/paging/LivePagedListProvider.html"&gt;LivePagedListProvider&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kobiton.com/fragmented"&gt;Kobiton – 15-day Free trial with no credit card required 🙌&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fmuntenescu"&gt;@fmuntenescu&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/97/</guid><pubDate>Mon, 18 Sep 2017 05:00:34 UTC</pubDate></item><item><title>096 : Romain Guy on Displays, CPU’s, GPU’s and Color</title><link>https://fragmentedpodcast.com/episodes/96/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6de6828c-69b2-48fa-b902-5c5eb1ae5048?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6de6828c-69b2-48fa-b902-5c5eb1ae5048/096-romainguy_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Romain Guy from Google gives us the lowdown on a bunch of Hardware related stuff.&lt;/p&gt;
&lt;p&gt;He starts off by explaining how the refresh rates on screens matter, what it would mean to have something like a 120Hz display for Android screens, how things like V-Sync and double buffering work, using different screen technologies, how much work is done by the CPU and GPU and so much more.&lt;/p&gt;
&lt;p&gt;This was one of those episodes where we tried so hard to hold back for fear of recording for another 2 more hours. Romain is clearly one of the most knowledgable and interesting engineers to talk to today in the hardware land of Android. What a blast!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="photography"&gt;
Photography
&lt;a class="heading-anchor" href="#photography" aria-label="Link to Photography"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/romainguy/"&gt;Romain on Instagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.flickr.com/photos/romainguy/"&gt;Romain on Flicker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://us.leica-camera.com/Photography/Leica-M/Leica-M10"&gt;Leica M10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.usa.canon.com/internet/portal/us/home/products/details/cameras/dslr/eos-5ds-r"&gt;Canon EOS 5DS R&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="screens-refreshingrednering-color"&gt;
Screens, refreshing/rednering Color
&lt;a class="heading-anchor" href="#screens-refreshingrednering-color" aria-label="Link to Screens, refreshing/rednering Color"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/91/"&gt;Fragmented 91 – Reddit AMA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/dkfwnmw/"&gt;Romain on Reddit being spoiled by 120Hz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pcworld.com/article/229024/computers/geek101-vsync.html"&gt;What is V-Sync&lt;/a&gt; (pcworld.com) and &lt;a href="https://en.wikipedia.org/wiki/Screen_tearing"&gt;Screen tearing&lt;/a&gt; (Wikipedia)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Three-two_pull_down"&gt;Three-two pull down technique (filmaking)&lt;/a&gt; (wikipedia)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-is-the-difference-between-OLED-and-AMOLED-What-are-its-advantages"&gt;OLED vs AMOLED&lt;/a&gt; (quora.com)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.trustedreviews.com/opinion/oled-vs-led-lcd-2924602"&gt;OLED vs LCD&lt;/a&gt; (quora.com)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=r8NeG0wmFXM"&gt;Romain Guy’s 2017 IO Talk on Colors fundamentals&lt;/a&gt; YOU OWE IT TO YOURSELF TO WATCH THIS!!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kobiton.com/fragmented"&gt;Kobiton – 15-day Free trial with no credit card required 🙌&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/romainguy"&gt;@romainguy&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/96/</guid><pubDate>Mon, 11 Sep 2017 05:00:50 UTC</pubDate></item><item><title>095 : Room Databases with Florina Muntenescu</title><link>https://fragmentedpodcast.com/episodes/95/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/dccb53c5-98cd-4bd3-ab17-63841e7eff9d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/dccb53c5-98cd-4bd3-ab17-63841e7eff9d/095-florina-muntenescu_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Florina from Google about the recently released Database library Room. Room was introduced as part of the Android Architecture components and has been picking up a lot of steam in the community.&lt;/p&gt;
&lt;p&gt;Room focuses on being a beautiful api layer to Sqlite. Florina explains to us how we can use Room to create a database, creating entities and how they map to tables using DAOs to access data and even “observe” them. Listen on for more of the details!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="official-docs"&gt;
Official docs
&lt;a class="heading-anchor" href="#official-docs" aria-label="Link to Official docs"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://d.android.com/arch"&gt;Android Architecture Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/architecture/room.html#db-migration-testing"&gt;Room migration docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.html#runInTransaction"&gt;runInTransaction api (which Florina recommended if you’re executing more than one SQL statement and don’t want multiple event fired)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-architecture-components"&gt;Google Samples – Android Architecutre Components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="florina8217s-posts"&gt;
Florina’s posts
&lt;a class="heading-anchor" href="#florina8217s-posts" aria-label="Link to Florina&amp;amp;#8217;s posts"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@florina.muntenescu"&gt;Florina’s Medium blog posts&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/room-rxjava-acb0cd4f3757"&gt;Room &amp;amp; RxJava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/7-steps-to-room-27a5fe5f99b2"&gt;7 steps to Room&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/understanding-migrations-with-room-f01e04b07929"&gt;Understanding migrations with Room&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/testing-room-migrations-be93cdb0d975"&gt;Testing Room migrations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="360andev-talks"&gt;
360|AnDev talks
&lt;a class="heading-anchor" href="#360andev-talks" aria-label="Link to 360|AnDev talks"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://academy.realm.io/posts/360-andev-2017-yigit-boyar-android-architecture-components/"&gt;Room – Behind the scenes (Yigit Boyar)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://academy.realm.io/posts/360-andev-2017-florina-muntenescu-data-persistence-android-room/"&gt;Data Persistence in Android: Room for Improvement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="micellaneous-questions-about-room-that-we-chopped-off-for-lack-of-time"&gt;
Micellaneous questions about Room (that we chopped off for lack of time)
&lt;a class="heading-anchor" href="#micellaneous-questions-about-room-that-we-chopped-off-for-lack-of-time" aria-label="Link to Micellaneous questions about Room (that we chopped off for lack of time)"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="q-does-room-use-reflection"&gt;
Q: Does Room use reflection?
&lt;a class="heading-anchor" href="#q-does-room-use-reflection" aria-label="Link to Q: Does Room use reflection?"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;A: There’s only 1 reflection call (at the time of finding the database implementation, when you call Room.builder). Most of the other stuff is generated code (with compile time verification!).&lt;/p&gt;
&lt;h4 id="q-does-room-provide-compile-time-sql-checks"&gt;
Q: Does Room provide compile-time SQL checks
&lt;a class="heading-anchor" href="#q-does-room-provide-compile-time-sql-checks" aria-label="Link to Q: Does Room provide compile-time SQL checks"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;A: Yes, Room was designed to provide compile-time checks.&lt;/p&gt;
&lt;h4 id="q-does-room-handle-sql-injection-attacks-security"&gt;
Q: Does Room handle SQL injection attacks (security)
&lt;a class="heading-anchor" href="#q-does-room-handle-sql-injection-attacks-security" aria-label="Link to Q: Does Room handle SQL injection attacks (security)"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;Yes … for all practical purposes. &lt;a href="https://medium.com/@appmattus/android-security-sql-injection-with-the-room-persistence-library-69f4e286960f"&gt;See this post for times when it doesn’t&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="q-do-we-have-tools-to-access-the-sqlite-database-file-directly"&gt;
Q: Do we have tools to access the sqlite database file directly?
&lt;a class="heading-anchor" href="#q-do-we-have-tools-to-access-the-sqlite-database-file-directly" aria-label="Link to Q: Do we have tools to access the sqlite database file directly?"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;Nope, at the moment, adb is your friend. Use that to download the file manually from your device.&lt;/p&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fmuntenescu"&gt;@fmuntenescu&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/95/</guid><pubDate>Tue, 05 Sep 2017 05:00:49 UTC</pubDate></item><item><title>094: Design Patternitis – 5 Tips to Help You</title><link>https://fragmentedpodcast.com/episodes/94/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e6217e34-7bc5-481b-89d7-98c4671d0729?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/e6217e34-7bc5-481b-89d7-98c4671d0729/designpatternitis_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn talks about a common problem almost all software engineers face in their career – Design Patternitis.&lt;/p&gt;
&lt;p&gt;So, you’ve read the books on design patterns and now you’re applying them everywhere. Just because some code can be put into a pattern doesn’t mean you should. Or should you? How can you apply them when needed? Donn shares 5 tips with you that you can use to help combat Design Patternitis.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Head-First-Design-Patterns-Brain-Friendly/dp/0596007124"&gt;Head First Design Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=pd_sim_14_3?_encoding=UTF8&amp;amp;pd_rd_i=0201633612&amp;amp;pd_rd_r=0HJJHQS8TPTHBCQE3A7C&amp;amp;pd_rd_w=L0Vq6&amp;amp;pd_rd_wg=6p3Bn&amp;amp;psc=1&amp;amp;refRID=0HJJHQS8TPTHBCQE3A7C"&gt;Design Patterns – GoF Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=pd_sim_14_4?_encoding=UTF8&amp;amp;pd_rd_i=0321127420&amp;amp;pd_rd_r=4CXVH0SEBJTV6QFJW1FZ&amp;amp;pd_rd_w=Gm437&amp;amp;pd_rd_wg=mTZAB&amp;amp;psc=1&amp;amp;refRID=4CXVH0SEBJTV6QFJW1FZ"&gt;Patterns of Enterprise Application Archicture – Fowloer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codereview.stackexchange.com/"&gt;Code Review StackExchange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codementor.io/code-review-experts"&gt;Code Mentor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This episode is made possible by &lt;a href="https://kobiton.com/freetrial/?utm_source=Fragmented%20Podcast&amp;amp;utm_medium=Fragmented&amp;amp;utm_campaign=Fragmented%20Podcast&amp;amp;utm_content=no%20commitment%20free%20trial"&gt;Kobiton – Fragmented&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They’re giving listeners a &lt;strong&gt;15-day FREE trial&lt;/strong&gt; with no credit card required! 🙌
Give them a try at &lt;a href="https://kobiton.com/freetrial/?utm_source=Fragmented%20Podcast&amp;amp;utm_medium=Fragmented&amp;amp;utm_campaign=Fragmented%20Podcast&amp;amp;utm_content=no%20commitment%20free%20trial"&gt;Kobiton.com/fragmented&lt;/a&gt; and let them know we sent you.&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/94/</guid><pubDate>Mon, 28 Aug 2017 20:07:45 UTC</pubDate></item><item><title>093 : RxJava intervention with Dan Lew</title><link>https://fragmentedpodcast.com/episodes/93/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/64eea16c-db61-4b69-86ec-c5996ce93c25?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/64eea16c-db61-4b69-86ec-c5996ce93c25/093-dan-lew-interview_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, our friend and RxJava paragon of the Android – Dan Lew, returns for a record 3 and 1/2 time.&lt;/p&gt;
&lt;p&gt;We’ve been using RxJava over the years now and have even talked to Dan about it in previous episodes.&lt;/p&gt;
&lt;p&gt;How has our understanding of Rx use in Android changed over the years? We know some of the super standard usecases for RxJava in AndroidDev. But the important question to be asking is: when are the times we “shouldn’t” be using RxJava? Are we over-complicating our code by shoe-horning it in different places. Concepts like functional programming and reactive state management have picked up steam again, how has this influenced our RxJava use?&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/3/"&gt;Fragmented Ep.3 Dan Lew – The RxJava show (Part 1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/4/"&gt;Fragmented Ep.4 Dan Lew – The RxJava show (Part 2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html"&gt;Futures in Java (7)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/sqlbrite"&gt;SqlBrite – lighteweight Rx wrapper for SQLiteOpenHelper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/"&gt;Error handling with RxJava – Dan Lew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/j256/ormlite-android"&gt;OrmLite – Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2017/08/02/why-not-rxlifecycle/"&gt;Why not RxLifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/status/892917432104361986"&gt;Tweet quote – boilerplate is ok&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/"&gt;Introduction to Functional Reactive Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="kobiton.com/fragmented"&gt;Kobiton – Fragmented&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/93/</guid><pubDate>Mon, 14 Aug 2017 05:00:02 UTC</pubDate></item><item><title>092: Learning Kotlin – dealing with static-ness and (companion) objects costs</title><link>https://fragmentedpodcast.com/episodes/92/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/95cd7ca2-307f-4b38-935d-00b15e987222?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/95cd7ca2-307f-4b38-935d-00b15e987222/092-kotlin-kaush-part2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this second episode of our learning Kotlin series, we talk about Kotlin’s support for static members or … lack thereof. Kotlin as a language was designed so that there’s no such thing as a “static member” in a class but there are times when having static members can be useful.&lt;/p&gt;
&lt;p&gt;So what do we do in those cases? do we just avoid static members? are there better alternatives? what are the costs with some of these approaches?&lt;/p&gt;
&lt;p&gt;Listen on to find out more!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="static-alternatives"&gt;
Static alternatives
&lt;a class="heading-anchor" href="#static-alternatives" aria-label="Link to Static alternatives"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#package-level-functions"&gt;Package level functions (Kotlin docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/kotlin/2013/06/static-constants-in-kotlin/"&gt;Static constants in Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations"&gt;Object declarations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/43814616/kotlin-difference-between-object-and-companion-object-in-a-class#comment74679942_43817845"&gt;Objects vs companion objects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cost-of-approaches"&gt;
Cost of approaches
&lt;a class="heading-anchor" href="#cost-of-approaches" aria-label="Link to Cost of approaches"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.egorand.me/where-do-i-put-my-constants-in-kotlin/"&gt;Where do i put my constants in Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@BladeCoder/exploring-kotlins-hidden-costs-part-1-fbb9935d9b62"&gt;Exploring Kotlin’s hidden costs – Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discuss.kotlinlang.org/t/best-practices-for-top-level-declarations/2198/2"&gt;Kotlin discussion – best practices for top level declarations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Look at the end of these notes for code snippets&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="misc"&gt;
Misc:
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/89/"&gt;Ep.89 – Learning Kotlin: Properties a first class language feature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manning.com/books/kotlin-in-action"&gt;Kotlin in Action – Manning Publications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="code-snippets"&gt;
Code snippets
&lt;a class="heading-anchor" href="#code-snippets" aria-label="Link to Code snippets"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="cost-effectiveness"&gt;
Cost effectiveness
&lt;a class="heading-anchor" href="#cost-effectiveness" aria-label="Link to Cost effectiveness"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// ----------------------------------------
// THIS IS BAD
class Foo {
companion object {
val myVar = &amp;quot;testing&amp;quot;
}
}
// calling from Kotlin
Foo.myVar
// calling from Java
Foo.Companion.getMyVar(); // yuck
// ----------------------------------------
// THIS IS OK
// notice the Jvm annotation
class Foo {
companion object {
@JvmField val myVar = &amp;quot;testing&amp;quot;
}
}
// calling from Kotlin
Foo.myVar
// calling from Java
Foo.myVar;
// ----------------------------------------
// THIS IS AWESOME
// notice the const keyword
class Foo {
companion object {
const val myVar = &amp;quot;testing&amp;quot;
}
}
// calling from Kotlin
Foo.myVar
// calling from Java
Foo.myVar;
// compiler additionally inlines this
// myVar is not a primitive or String?
// use @JvmField or @JvmStatic for methods
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="package-level-options"&gt;
Package level options
&lt;a class="heading-anchor" href="#package-level-options" aria-label="Link to Package level options"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// inside BottomSheetView.Kt
class BottomSheetView {
companion object {
const val BOTTOM_SHEET_ANIMATION_TIMING = 500L
}
// ...
}
// accessed as:
animation.setTiming(BottomSheetView.BOTTOM_SHEET_ANIMATION_TIMING)
// ----------------------------------------
// INSTEAD DO THIS
// inside BottomSheetView.Kt
const val BOTTOM_SHEET_ANIMATION_TIMING = 500L
class BottomSheetView {
// ...
}
// accessed as:
animation.setTiming(BottomSheetViewKt.BOTTOM_SHEET_ANIMATION_TIMING)
&lt;/code&gt;&lt;/pre&gt;</description><guid>https://fragmentedpodcast.com/episodes/92/</guid><pubDate>Mon, 07 Aug 2017 05:00:18 UTC</pubDate></item><item><title>091 : Decompress – Reddit AMA highlights, package by feature not layer and testing!</title><link>https://fragmentedpodcast.com/episodes/91/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d8dade9a-aeb2-4886-8a80-207749b8131d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d8dade9a-aeb2-4886-8a80-207749b8131d/091-decompress-reddit-ama_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this decompress episode, DF and KG kick it off with a brief discussion of the highlights from the recent reddit AMA that the Android Engineering folk conducted. What were the interesting things they learnt or were surprised by etc.? They then go on to briefly discuss two topics they’ve always chatted about (off-air) packaging by feature (not layer) and most recent thoughts on testing. Listen on to find out more:&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="360--andev"&gt;
360 | AnDev
&lt;a class="heading-anchor" href="#360--andev" aria-label="Link to 360 | AnDev"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://360andev.com/about/"&gt;360|AnDev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/45/"&gt;045: Bluetooth (LE) with Dave (devunwired) Smith&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/059/"&gt;059: Chiu-Ki Chan explains Mocking and Stubbing with Mockito&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ama-reddit"&gt;
AMA Reddit
&lt;a class="heading-anchor" href="#ama-reddit" aria-label="Link to AMA Reddit"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/"&gt;AMA – complete reddit thread&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/dkfzxa2/"&gt;Alarm Manager or JobScheduler thread – reddit thread&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yigit/android-priority-jobqueue"&gt;Android Priority Job Queue – Yigit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evernote/android-job"&gt;Android Job (Evernote)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/app/job/JobScheduler.html"&gt;JobScheduler – Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/dkcewfs/"&gt;Fragment backstack manager thread – reddit thread&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker/status/887704982375542784"&gt;DF Tweet thread on using Fragments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/dkctlad/"&gt;Soft keyboard API shortcomings – reddit thread&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/4312319/how-to-capture-the-virtual-keyboard-show-hide-event-in-android"&gt;SO question 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/3793093/android-edittext-soft-keyboard-show-hide-event"&gt;SO question 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android"&gt;SO question 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/24388492/listen-for-keyboard-show-or-hide-event-in-android"&gt;SO question 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/dkenbnx/"&gt;Night light on Nexus 6P – reddit thread&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://justgetflux.com/"&gt;Flux software&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/androiddev/comments/6nuq0a/were_on_the_engineering_team_for_android_o_ask_us/dkfwnmw/"&gt;Sharp device: 120hz refresh rate- reddit thread&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=TvrIa-UaFl4"&gt;iPad demo 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=TvrIa-UaFl4"&gt;iPad demo 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theverge.com/circuitbreaker/2016/7/2/12087608/sharp-aquos-mini-sh-m03-android-smartphone-japan"&gt;Sharp Aquos 120Hz Android phone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="package-by-feature-not-layer"&gt;
Package by feature not layer
&lt;a class="heading-anchor" href="#package-by-feature-not-layer" aria-label="Link to Package by feature not layer"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/1086041/locate-current-file-in-intellij"&gt;Alt F1 keyboard shortcut – Select in… Project View&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/68/"&gt;068: Talking Buck with Uber engineer Gautam Korlam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/90/"&gt;090: Make your apps instant with Zarah Dominguez&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.realm.io/news/kau-jake-wharton-testing-robots/"&gt;Instrumentation Testing Robots – Jake Wharton talk&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/okhttp/tree/master/mockwebserver"&gt;okHttp Mock WebServer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiremock.org/"&gt;Wiremock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kobiton.com/fragmented"&gt;Kobiton – start your 15 day free trial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/91/</guid><pubDate>Mon, 24 Jul 2017 05:00:55 UTC</pubDate></item><item><title>090: Make your apps instant with Zarah Dominguez</title><link>https://fragmentedpodcast.com/episodes/90/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/fa115b3c-aa6d-4f33-9194-e52186a3a801?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/fa115b3c-aa6d-4f33-9194-e52186a3a801/090-interview-with-zarah_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;At I/O ’16 Google announced the super cool new feature Instant Apps. At IO’17 we started to see real world examples and third parties pull off this feature. In this episode, we talk to GDE Zarah Dominguez who’s company “Domain” was one of the partners for this program.&lt;/p&gt;
&lt;p&gt;What is the Instant Apps feature? What are some usecases where this comes in handy? How does it actually work internally? What does it take for a developer to implement this feature in their own app? Listen on to find out!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://g.co/instantapps"&gt;Instant apps – official page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.domain.com.au/"&gt;Domain (Zarah’s company)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tech.domain.com.au/2017/06/making-the-domain-android-app-instant-%E2%9A%A1/"&gt;Making the Domain Android app “Instant”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/vimeo-engineering-blog/vimeo-android-instant-apps-2f8b1e94760c"&gt;Android Instant Apps, step-by-step: how Vimeo went about it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=F42Rbi3WIlA"&gt;IO’17 Fireside chat with 3rd party partner who implemented Instant Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-instant-apps"&gt;Google samples repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/zarahjutz"&gt;@zarahjutz&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/90/</guid><pubDate>Mon, 17 Jul 2017 05:00:38 UTC</pubDate></item><item><title>089: Learning Kotlin – Properties a first class language feature</title><link>https://fragmentedpodcast.com/episodes/89/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/527abf15-4577-4ff0-b80f-2131ba46c805?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/527abf15-4577-4ff0-b80f-2131ba46c805/089-learning-kotlin-with-kaush_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, KG talks about his journey learning Kotlin as a newb. Given that Kotlin is most likely going to be the de-facto language for most developers, it makes sense to deepen our understanding of the language (as we have strived with Java over the years).&lt;/p&gt;
&lt;p&gt;“Properties” in Kotlin are a first class language feature. But what does that actually mean? What are the nifty features we get with properties? How are these resolved from a Java class when there’s potential a name clash? What are some other gotchas and learnings from using properties? Listen on to find out:&lt;/p&gt;
&lt;h1 id="shownotes"&gt;
Shownotes:
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes:"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/properties.html"&gt;Kotlin docs – Properties and Fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manning.com/books/kotlin-in-action"&gt;Kotlin in Action – Manning Publications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html"&gt;java.util.Calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/"&gt;Mutable vals in Kotlin – Dan Lew&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/89/</guid><pubDate>Mon, 10 Jul 2017 05:00:36 UTC</pubDate></item><item><title>088: Offensive programming with Piwai from Square</title><link>https://fragmentedpodcast.com/episodes/88/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/aee9f318-e166-48f1-a39c-cc46d72a5a0f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/aee9f318-e166-48f1-a39c-cc46d72a5a0f/086-working-effectively-w-legacy-code_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented we talk to our friend Piwai from Square.&lt;/p&gt;
&lt;p&gt;Piwai’s a pro at testing and breaking apps (he built LeakCanary – so not terribly unexpected). He teaches us some strategies on debugging app crashes and briefs us on this concept he calls “offensive programming” which has helped him a lot with his Android development.&lt;/p&gt;
&lt;p&gt;It’s good stuff and we hope you enjoy the show.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Defensive_programming"&gt;Defensive programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="py8217s-libraries"&gt;
Py’s libraries:
&lt;a class="heading-anchor" href="#py8217s-libraries" aria-label="Link to Py&amp;amp;#8217;s libraries:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://androidannotations.org"&gt;AndroidAnnotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/leakcanary"&gt;LeakCanary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc-resources"&gt;
Misc resources:
&lt;a class="heading-anchor" href="#misc-resources" aria-label="Link to Misc resources:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Luhn_algorithm"&gt;Luhn check – algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whatis.techtarget.com/definition/debouncing"&gt;Debouncing in general&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whatis.techtarget.com/definition/debouncing"&gt;Debounce operator in RxJava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/square-corner-blog/advocating-against-android-fragments-81fd0b462c97"&gt;Advocating against Android Fragments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pending-touches-and-ui-event"&gt;
Pending touches and UI event:
&lt;a class="heading-anchor" href="#pending-touches-and-ui-event" aria-label="Link to Pending touches and UI event:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/view/View.html#cancelPendingInputEvents()"&gt;Cancel pending touches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/butterknife/blob/master/butterknife/src/main/java/butterknife/internal/DebouncingOnClickListener.java"&gt;DebouncingOnClickListener (RxBindings)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atscaleconference.com/videos/all-apps-shall-crash"&gt;Py’s talk – All apps shall crash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/piwai"&gt;@piwai&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/88/</guid><pubDate>Mon, 03 Jul 2017 05:00:50 UTC</pubDate></item><item><title>087: Effective Java – Item #16: Favor Composition over Inheritance</title><link>https://fragmentedpodcast.com/episodes/87/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/bed74da6-b2bb-4b58-8cc0-1654eb613573?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/bed74da6-b2bb-4b58-8cc0-1654eb613573/087-item16-of-the-effective-java_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Donn talks about Item #16 of the Effective Java series – Favor Composition over Inheritance. You’ll learn why using inheritance is not always a great idea and how you can use composition in place of it to make your code more anti-fragile, resilient and clean.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/87/</guid><pubDate>Mon, 19 Jun 2017 13:19:55 UTC</pubDate></item><item><title>086: Working Effectively with Legacy Code</title><link>https://fragmentedpodcast.com/episodes/86/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/aee9f318-e166-48f1-a39c-cc46d72a5a0f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/aee9f318-e166-48f1-a39c-cc46d72a5a0f/086-working-effectively-w-legacy-code_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Donn talks about Working Effectively with Legacy Code. He doesn’t just talk about the book itself, but he talks about how to approach a legacy code base and start delivering value as soon as possible, yet with confidence. If you’ve recently started a new job, moved to a new team, started working on an existing code base, then this episode is bound to help you.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2skNUrS"&gt;Working Effectively with Legacy Code Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/86/</guid><pubDate>Mon, 12 Jun 2017 15:28:49 UTC</pubDate></item><item><title>085: Casual Kotlin conversation with Dan Kim</title><link>https://fragmentedpodcast.com/episodes/85/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/db8d2a13-2c46-4147-bf98-d011482d2038?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/db8d2a13-2c46-4147-bf98-d011482d2038/085-interview-w-dan-kim_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Dan Kim about Kotlin. Dan is an Android developer at the company Basecamp and has some great Kotlin posts on the company’s famous blog Signal Vs Noise. He was pretty early, on the Kotlin train and has been working with the new language for quite sometime now.&lt;/p&gt;
&lt;p&gt;Instead of trying to go into every single detail about Kotlin, the nuances of the language, it’s syntax etc. we take a more general approach and talk about starting out on Kotlin, how does on go about migrating an Android codebase to Kotlin, what are things we should watch out for when using the language. This and a whole lot more!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://m.signalvnoise.com/"&gt;Basecamp blog – Signal vs. Noise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1ReS3ep-hjxWA8kZi0YqDbEhCqTt29hG8P44aA9W0DM8/edit#heading=h.zi7eb2clrbue"&gt;Jake Wharton – Using project Kotlin for Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/20/"&gt;Fragmented – Ep 20 with Hadi (spl. mention shownotes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/"&gt;Dan Lew – Mutable vals in Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/idioms.html"&gt;Kotlin idioms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/coding-conventions.html#functions-vs-properties"&gt;Kotlin – coding conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/kapt.html"&gt;kapt – Annotation processing for Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/android-overview.html"&gt;Kotlin website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/reference/android-overview.html"&gt;Kotlin website (source)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kotlin-view-binding-libs"&gt;
Kotlin view (binding) libs
&lt;a class="heading-anchor" href="#kotlin-view-binding-libs" aria-label="Link to Kotlin view (binding) libs"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/tutorials/android-plugin.html"&gt;Kotlin Android extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/kotterknife"&gt;Kotterknife&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kotlin/anko"&gt;Anko&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JetBrains/kotlin-web-site/blob/8ab6c4bde70216c1defce626268c3bee06097371/pages/docs/tutorials/android-plugin.md#importing-synthetic-properties"&gt;Synthetic properties&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Jake’s youtube video&lt;/li&gt;
&lt;li&gt;Dan’s blog posts:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://m.signalvnoise.com/how-we-made-basecamp-3s-android-app-100-kotlin-35e4e1c0ef12"&gt;How we made Basecamp 3’s Android app 100% Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.signalvnoise.com/some-of-my-favorite-kotlin-features-that-we-use-a-lot-in-basecamp-5ac9d6cea95"&gt;Some of my favorite Kotlin features&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=A2LukgT2mKc"&gt;Android development with Kotlin – Jake Wharton&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=X1RVYt2QKQE"&gt;Introduction to Kotlin – Google I/O 17&lt;/a&gt; (video)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dankim"&gt;@dankim&lt;/a&gt; or &lt;a href="mailto:dan@basecamp.com"&gt;email Dan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/85/</guid><pubDate>Mon, 05 Jun 2017 07:00:05 UTC</pubDate></item><item><title>084: Kaush and Donn go to Google IO 2017</title><link>https://fragmentedpodcast.com/episodes/84/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0763652e-c1a5-4e12-9bfc-ce9ff8264351?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/0763652e-c1a5-4e12-9bfc-ce9ff8264351/084-kaush-and-donn-at-google-io_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This was truly one of the most memorable IOs Google has ever conducted. In keeping with tradition, Donn and Kaushik talk with a bunch of awesome #AndroidDev and get their opinions/thoughts on IO and Android in general. As always, these are super fun episodes.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dan Kim&lt;/strong&gt; (&lt;a href="https://basecamp.com/"&gt;Basecamp&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dankim"&gt;@dankim&lt;/a&gt; or &lt;a href="mailto:dan@basecamp.com"&gt;dan@basecamp.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vysor.io/"&gt;Vysor app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/status/864925854219984896"&gt;Mark Allison – being brave with the O preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patryk Poborca&lt;/strong&gt; (&lt;a href="http://www.koziodigital.com/"&gt;Kozio Digital&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/patrykpoborca"&gt;@patrykpoborca&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.trello"&gt;Trello app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jerrell Mardis&lt;/strong&gt; (&lt;a href="https://www.salesforce.com/"&gt;Salesforce&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jerrellmardis"&gt;@jerrellmardis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.robinhood.android&amp;amp;hl=en"&gt;Robinhood app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=FrteWKKVyzI"&gt;Android architecture components talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annyce Davis&lt;/strong&gt; (&lt;a href="http://offgrid-electric.com/#home"&gt;Offgrid Electric&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/brwngrldev"&gt;@brwngrldev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=cc.forestapp"&gt;Forest app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/learning/react-native-building-mobile-apps"&gt;React Native: Building Mobile apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zac Sweers&lt;/strong&gt; (Uber)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/pandanomic"&gt;@pandanomic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.unplugged"&gt;YouTube TV app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.Slack"&gt;Slack app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Matt Kranzler&lt;/strong&gt; (&lt;a href="https://www.salesforce.com/"&gt;Salesforce&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/mattkranzler"&gt;@mattkranzler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.samruston.twitter"&gt;Flamingo app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roberto Orgiu&lt;/strong&gt; (&lt;a href="https://caster.io/"&gt;Caster&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/_tiwiz"&gt;@_tiwiz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Christina Lee&lt;/strong&gt; (&lt;a href="https://www.pinterest.com/"&gt;Pinterest&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/RunChristinaRun"&gt;@RunChristinaRun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.crowdrise.com/runningacrossamerica"&gt;Christina’s Fundraiser – Running across America&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.robinhood.android&amp;amp;hl=en"&gt;Robinhood app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=fPzxfeDJDzY&amp;amp;list=WL&amp;amp;index=7"&gt;Talk at IO – Life is Great and Everything Will Be Ok, Kotlin is Here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo Visser&lt;/strong&gt; (&lt;a href="http://littlerobots.nl/"&gt;Little Robots&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/botteaap"&gt;@botteaap&lt;/a&gt; or &lt;a href="https://plus.google.com/+HugoVisser"&gt;+HugoVisser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/hvisser/android-apt"&gt;Android APT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Raveesh Bhalla&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/raveeshbhalla"&gt;@raveeshbhalla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.enki.com/"&gt;Enki app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Etienne Caron&lt;/strong&gt; (&lt;a href="https://www.shopify.com/"&gt;Shopify&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kanawish"&gt;@kanawish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.safariflow.queue"&gt;Safari Queue app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chris Jenkins&lt;/strong&gt; (&lt;a href="http://owlr.com/"&gt;Owlr&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chrisjenx"&gt;@chrisjenx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chrisjenx/Calligraphy"&gt;Calligraphy font lib by Chris&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.waze"&gt;Waze app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brenda Cook&lt;/strong&gt; (&lt;a href="https://web.seesaw.me/"&gt;Seesaw&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kenodoggy"&gt;@kenodoggy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.mint"&gt;Mint app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.memrise.android.memrisecompanion"&gt;Memrise app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joaquim&lt;/strong&gt; (&lt;a href="https://www.twitch.tv/"&gt;Twitch&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/joenrv"&gt;@joenrv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.realm.io/news/joaquim-verges-making-falcon-pro-3/"&gt;The Making of Falcon Pro 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getfalcon.pro/"&gt;Falcon Pro (Joaquim’s app)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.strafe.android"&gt;Strafe Esports app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="previous-google-io-episodes"&gt;
Previous Google IO Episodes
&lt;a class="heading-anchor" href="#previous-google-io-episodes" aria-label="Link to Previous Google IO Episodes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/43"&gt;Ep 43 – Google IO 2016 (part 2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/42/"&gt;Ep 42 – Google IO 2016 (part 1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/9/"&gt;Ep 9 – Google IO 2015&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Living Dangerously&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_122811.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_122811.jpg" alt="" width="4048" height="3036" class="aligncenter size-full wp-image-331" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_122811.jpg 4048w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_122811-300x225.jpg 300w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_122811-768x576.jpg 768w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_122811-1024x768.jpg 1024w" sizes="(max-width: 4048px) 100vw, 4048px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What a baller&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170518_133534.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170518_133534.jpg" alt="" width="3036" height="4048" class="aligncenter size-full wp-image-336" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170518_133534.jpg 3036w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170518_133534-225x300.jpg 225w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170518_133534-768x1024.jpg 768w" sizes="(max-width: 3036px) 100vw, 3036px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;geared up and ready to 🎤&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_145732.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_145732.jpg" alt="" width="3036" height="4048" class="aligncenter size-full wp-image-335" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_145732.jpg 3036w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_145732-225x300.jpg 225w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_145732-768x1024.jpg 768w" sizes="(max-width: 3036px) 100vw, 3036px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Find the KG (hint: his Pixel is more prominent in this picture than his face)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_125400.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_125400.jpg" alt="" width="3036" height="4048" class="aligncenter size-full wp-image-332" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_125400.jpg 3036w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_125400-225x300.jpg 225w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_125400-768x1024.jpg 768w" sizes="(max-width: 3036px) 100vw, 3036px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;How so many Android ❤️s were won&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_131018.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_131018.jpg" alt="" width="3036" height="4048" class="aligncenter size-full wp-image-333" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_131018.jpg 3036w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_131018-225x300.jpg 225w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_131018-768x1024.jpg 768w" sizes="(max-width: 3036px) 100vw, 3036px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Troll masters as they revel the name of Android O to us&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_144357.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_144357.jpg" alt="" width="3036" height="4048" class="aligncenter size-full wp-image-334" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_144357.jpg 3036w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_144357-225x300.jpg 225w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170517_144357-768x1024.jpg 768w" sizes="(max-width: 3036px) 100vw, 3036px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many stickers were collected&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170519_075411.jpg"&gt;&lt;img loading="lazy" decoding="async" src="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170519_075411.jpg" alt="" width="4048" height="3036" class="aligncenter size-full wp-image-338" srcset="https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170519_075411.jpg 4048w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170519_075411-300x225.jpg 300w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170519_075411-768x576.jpg 768w, https://fragmentedpodcast.com/images/wp-content/uploads/2017/05/IMG_20170519_075411-1024x768.jpg 1024w" sizes="(max-width: 4048px) 100vw, 4048px" /&gt;&lt;/a&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/84/</guid><pubDate>Mon, 22 May 2017 05:00:17 UTC</pubDate></item><item><title>083: Learning the basics of functional programing with Anup Cowkur</title><link>https://fragmentedpodcast.com/episodes/83/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9b8d1b50-dc19-4256-bf3a-dc854ea6bd4a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/9b8d1b50-dc19-4256-bf3a-dc854ea6bd4a/083-anup-cowkur-interview_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;RxJava is considered a functional reactive programming library. But the paradigms of functional programming have existed for a very long time. In this episode we talk to Android GDE Anup Cowkur, about his experience experimenting with “pure” functional languages. He breaks down some of the basic concepts, explaining the different terms along the way.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Gordon_Moore"&gt;Gordon Moore &amp;amp; Moore’s law&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/interviews/hickey-clojure/"&gt;Rich Hickey on Clojure’s Features and Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hrldcpr/pcollections"&gt;PCollections – persistent Java collections library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="functional-languages"&gt;
Functional languages:
&lt;a class="heading-anchor" href="#functional-languages" aria-label="Link to Functional languages:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://elixir-lang.org/"&gt;Elixir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://elm-lang.org/"&gt;Elm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;Lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.haskell.org/"&gt;Haskell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Erlang_(programming_language)"&gt;Erlang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.freecodecamp.com/functional-programming-for-android-developers-part-1-a58d40d6e742"&gt;Anup’s multi part series on functional programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artem-zinnatullin/TheContext-Podcast/releases/tag/Episode_8"&gt;The Context podcast – Functional programming with Paco Estevez&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=e-5obm1G_FY&amp;amp;feature=youtu.be"&gt;Anjana Vakil: Learning Functional Programming with JavaScript – JSUnconf 2016&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/javascript-scene/the-rise-and-fall-and-rise-of-functional-programming-composable-software-c2d91b424c8c"&gt;Learning functional programming and compositional software techniques in JavaScript – Eric Elliot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anupcowkur/here-be-dragons"&gt;Here Be Dragons IntelliJ Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/anupcowkur"&gt;@anupcowkur&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/83/</guid><pubDate>Mon, 15 May 2017 01:00:23 UTC</pubDate></item><item><title>082: Airbnb’s Gabriel tells us how to animate with Lottie</title><link>https://fragmentedpodcast.com/episodes/82/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0b20dce6-c3f0-43a4-93d6-062746d596d5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/0b20dce6-c3f0-43a4-93d6-062746d596d5/interview-w-gabriel-airbnb_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It’s pretty awesome, when you use a third party library, love using it and finally get to talk to the person who actually helped build it. In this episode, we talk to Gabriel Peal. Besides having quite the illustrious career in Android development, Gabriel now works at Airbnb and helped build Lottie – an animation library.&lt;/p&gt;
&lt;p&gt;What is Lottie, how do you use Lottie? why is so Lottie so cool? how does it actually work under the hood? Listen to this episode and find out.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/lottie-android"&gt;Lottie for Android (github)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bodymovin/bodymovin"&gt;Bodymovin (github)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://creative.adobe.com/addons/products/12557"&gt;Install via Adobe cloud extensions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lottiefiles.com/"&gt;lottiefiles.com – sample Lottie animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/lottie-android#using-lottie"&gt;Using lottie – example snippets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Lotte_Reiniger"&gt;Lotte Reiniger- the animator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gpeal8"&gt;@gpeal8&lt;/a&gt; or &lt;a href="mailto:lottie@airbnb.com"&gt;lottie@airbnb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/82/</guid><pubDate>Mon, 08 May 2017 04:30:35 UTC</pubDate></item><item><title>081: Talking Android Things with Rebecca Franks</title><link>https://fragmentedpodcast.com/episodes/81/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6d4ca8f6-3d23-4d34-9a1f-2f2a2b03c0ff?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6d4ca8f6-3d23-4d34-9a1f-2f2a2b03c0ff/interview-with-rebecca-frank_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It is the world of the Internet of Things (IoT) and Google’s answer to that is the Android Things. In this episode, we talk to the amazing Rebecca Franks. She explains how Android things works and talks of some of the adventures and examples she’s embarked on with Android Things. If you’ve had that hobby Raspberry Pi or Arduino board lying around and not sure how to put it to use, this episode’s for you.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/42/"&gt;Ep 42 – Google IO episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rebecca’s blog posts:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://riggaroo.co.za/android-things-building-distributed-piano/"&gt;Distributed Piano with Android Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riggaroo.co.za/android-things-electricity-monitoring-app/"&gt;Electricity Monitoring app with Android Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riggaroo.co.za/android-things-hardware-basics/"&gt;Hardware basics for the Software Engineer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/things/hardware/developer-kits.html"&gt;Android Things Developer Kits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.arduino.cc/en/Main/ArduinoStarterKit"&gt;Arduino Starter Kit (includes the h/w book she recommends)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/androidthings"&gt;Android Things – official github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/androidthings/contrib-drivers"&gt;Android things Contrib drivers – (e.g. button gradle dependency)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kobiton.com/fragmented"&gt;Kobiton&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/riggaroo"&gt;@riggaroo&lt;/a&gt; and &lt;a href="https://riggaroo.co.za"&gt;riggaroo.co.za&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/81/</guid><pubDate>Mon, 01 May 2017 07:00:26 UTC</pubDate></item><item><title>080: 10 Books Android developers should read</title><link>https://fragmentedpodcast.com/episodes/80/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/cfecb12a-3aa2-4b32-a670-634d8cfe4c53?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/cfecb12a-3aa2-4b32-a670-634d8cfe4c53/080-10-books-to-read_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik recommend 10 books on Software programming that they think every Android developer would greatly benefit from reading. These are books that helped them become better programmers and have had the most impact in their daily lives as Android developers.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2nDhCBs"&gt;Effective Java – Joshua Bloch&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/effective-java/"&gt;Effective Java Items (Fragmented fragments)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oHqFTK"&gt;Working effectively with legacy code – Michael Feathers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oBXrbK"&gt;Head first Design Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oHsKPO"&gt;Don’t make me think – Steve Krug, 3rd edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oHqMPe"&gt;Java Concurrency in Practice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2nDkkHd"&gt;XUnit testing patterns&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://xunitpatterns.com/"&gt;Website xunitpatterns.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oBPgfu"&gt;Patterns of Enterprise Application Architecture – Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oBPi74"&gt;Javascript the good parts – Douglas Crockford&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.destroyallsoftware.com/talks/wat"&gt;Gary Bernhardt – WAT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oHzRYo"&gt;Clean Code – Robert.C.Martin&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pluralsight.com/courses/writing-clean-code-humans"&gt;Clean Code: Writing code for humans (Puralsight)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oZJelu"&gt;Coders at Work – Peter Seibel&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="honorable-mentions"&gt;
Honorable mentions
&lt;a class="heading-anchor" href="#honorable-mentions" aria-label="Link to Honorable mentions"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oC9iqd"&gt;Release it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2nDiWEC"&gt;Design Patterns: Elements of Reusable Object-Oriented Software (Gang of Four)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oBY70M"&gt;Pragmatic Programmer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oC51TR"&gt;CODE – The Hidden Language of Computer Hardware and Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2o8NS3k"&gt;Soft Skills – John Sonmez&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2naeGkz"&gt;Deskbound – Kelly Starett&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/2oBYCYT"&gt;8 steps to a pain free back – Esther Gokhale&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/80/</guid><pubDate>Mon, 17 Apr 2017 05:00:35 UTC</pubDate></item><item><title>079: How do i get started with VR apps? Etienne Caron explains</title><link>https://fragmentedpodcast.com/episodes/79/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2ad77346-5870-4e17-9d34-6587a3e7bde0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/2ad77346-5870-4e17-9d34-6587a3e7bde0/079-interview-w-etienne-caron_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Have you ever thought about building VR (Virtual Reality) apps? Where do you start? How difficult is it? How similar is to Android development? Do you still code in Java? In this episode, Etienne Caron AndroidDev extraordinaire and expert VR hobbyist gets us up to speed on what you need to know, to start creating VR apps.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://engineering.shopify.com/blogs/engineering/tagged/virtual-reality"&gt;Shopify Engineering Blog (VR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Demoscene"&gt;Demoscene&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=9NoAQ1Ocvv4"&gt;Save a cat from a skyscraper (VR game)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Rajawali/Rajawali"&gt;Rajawali – Android OpenGL engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/build-your-first-google-vr-app-in-ten-minutes/"&gt;Build your first Google VR app in 10 minutes : caster.io course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/vr/android/get-started"&gt;developer docs on Google VR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Unity_(game_engine)"&gt;Unity game engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Vulkan_(API)"&gt;Vulkan API (open GL)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/dotnet/2016/01/13/project-rider-a-csharp-ide/"&gt;Project Rider – C# IDE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.shadertoy.com/"&gt;Shadertoy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Introduction/Introduction.html"&gt;OpenGL ES Apple docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.learnopengles.com/"&gt;Learn OpenGL ES.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kanawish"&gt;@kanawish&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/79/</guid><pubDate>Mon, 10 Apr 2017 05:05:29 UTC</pubDate></item><item><title>078: Ten Testing Strategies with Michael Bailey</title><link>https://fragmentedpodcast.com/episodes/78/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/474eb635-be88-4668-927f-d46d19bf2a01?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/474eb635-be88-4668-927f-d46d19bf2a01/078-michaelbailey_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn sits down with fellow Android GDE, Michael Bailey to cover 10 testing strategies to help you get your application under test and to make sure your testing environment is top notch. They start off with the basics and then progress further down the testing rabbit hole eventually covering topics like cloud-based testing labs, hermetic testing and much much more. This episode will help provide you with a blueprint of how to get your Android app under test and get you to a level where you can develop your app with confidence.&lt;/p&gt;
&lt;h2 id="the-ten-tips"&gt;
The Ten Tips
&lt;a class="heading-anchor" href="#the-ten-tips" aria-label="Link to The Ten Tips"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Use Espresso for functional/integration testing&lt;/li&gt;
&lt;li&gt;Mock data and API endpoints to keep tests hermetic&lt;/li&gt;
&lt;li&gt;Utilize JUnit JVM Tests and patterns for a fast dev cycle&lt;/li&gt;
&lt;li&gt;Utilize a git branching strategy and utilize pull requests (PR’s) for code reviews&lt;/li&gt;
&lt;li&gt;Use CI to run the tests and provide constant feedback&lt;/li&gt;
&lt;li&gt;Speed up testing and ease of testing with shell helpers and helper classes for testing&lt;/li&gt;
&lt;li&gt;Cloud Testing Services&lt;/li&gt;
&lt;li&gt;Mutation Testing&lt;/li&gt;
&lt;li&gt;Thoughts on code coverage &amp;amp; value based testing&lt;/li&gt;
&lt;li&gt;Don’t let flaky tests linger&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://google.github.io/android-testing-support-library/docs/espresso/"&gt;Espresso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiremock.org/"&gt;Wiremock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/okhttp/tree/master/mockwebserver"&gt;MockWebServer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/mockwebserver/"&gt;MockWebServer Course on Caster.IO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/054/"&gt;Git Branching Strategies Fragmented Episode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/test-lab/"&gt;Firebase Test Lab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xamarin.com/test-cloud"&gt;Xamarin Test Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/device-farm/"&gt;Amazon Device Farm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.genymotion.com/cloud/"&gt;Genymotion Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Mutation_testing"&gt;Mutation Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pitest.org/"&gt;Pit Mutation Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=_pCwcdNtxog"&gt;Matt Logan’s Talk on Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=28d7q-jQdyw&amp;amp;t=5m41s"&gt;Michael Bailey on Android Dialogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nativewheel.house/"&gt;Michaels Podcast – Native Wheel House&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/yogurtearl"&gt;@yogurtearl&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/78/</guid><pubDate>Mon, 03 Apr 2017 05:05:14 UTC</pubDate></item><item><title>077: Chatting ADB with Genymotion’s Eyal Lezmy</title><link>https://fragmentedpodcast.com/episodes/77/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6514ec3f-4999-4af9-af22-bba4ab6d5bf3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6514ec3f-4999-4af9-af22-bba4ab6d5bf3/077-eyal-lezmy_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Today on Fragmented, we talk to Eyal Lezmy. Eyal works as an Android developer for Genymotion. While working for Genymotion he had to deal with the Android Debug Bridge a whole bunch, so in this episode we dive into the details of ADB, some super slick commands and in general just get a better understanding of this tool we use every single day.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.genymotion.com/"&gt;Genymotion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/studio/command-line/adb.html"&gt;ADB – Android Debug Bridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dzx81sAKylg"&gt;Droidcon NYC – ADB, Break On Through To the Other Side&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.androidcentral.com/look-back-google-sooner-first-android-phone"&gt;HTC Sooner (juicy non-developer article alert)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/pidcat"&gt;pidcat (adb logcat tool)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pbreault/adb-idea"&gt;Phillipe’s ADB IDEA plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/enabling-fingerprint-on-the-android-emulator/"&gt;Caster IO – Enabling Fingerprint on the Android emulator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="helpful-commands"&gt;
Helpful commands
&lt;a class="heading-anchor" href="#helpful-commands" aria-label="Link to Helpful commands"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# input some text from your keyboard
adb shell input text &amp;quot;keyboard text&amp;quot;
# download database file
# see http://stackoverflow.com/questions/18471780/android-adb-retrieve-database-using-run-as
adb exec-out run-as package.name cat databases/file &amp;gt; file
# run-as mentioned in episode
adb shell &amp;quot;run-as package.name chmod 666 /data/data/package.name/databases/file&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/eyal_lezmy"&gt;@eyal_lezmy&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/77/</guid><pubDate>Mon, 20 Mar 2017 07:00:51 UTC</pubDate></item><item><title>076: Taming the activity lifecycle with Kristin Marsicano</title><link>https://fragmentedpodcast.com/episodes/76/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/859fa7c7-a204-479a-93d6-f356f885e837?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/859fa7c7-a204-479a-93d6-f356f885e837/076-kristinm-interview_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Kaushik talks to Kristin of the Big Nerd Ranch. You would think that the Android lifecycle is pretty standard and basic stuff, but as Kristin begins to unpack the nuances of the Android lifecycle, we learn there’s a world of details that’s easy to miss. Listen on, to get an ironclad grip on the Activity lifecycle.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/books/android-programming/"&gt;Android programming : The Big Nerd Ranch Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realm.io/news/activities-in-the-wild-exploring-the-activity-lifecycle-android/"&gt;Activities in the Wild: Kristin at 360AnDev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/kristinmars/activities-in-the-wild-exploring-the-activity-lifecycle-360-andev-july-2016?slide=106"&gt;Kristin’s Lifecycle diagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/kaushikgopal/5c1b029798b73c73193d"&gt;Notes on opportune moments to do “stuff” in the Android lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/blog/android-activity-lifecycle-onStop/"&gt;Kristin’s follow up blog post to the Activity lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kristinmars"&gt;@kristinmars&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/76/</guid><pubDate>Mon, 13 Mar 2017 09:00:48 UTC</pubDate></item><item><title>075: Effective Java for Android Developers – Item #15: Minimize Mutability</title><link>https://fragmentedpodcast.com/episodes/75/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/dd6469ac-fa5d-46d6-8cbf-a92bd3ae4ddc?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/dd6469ac-fa5d-46d6-8cbf-a92bd3ae4ddc/075-effective-java-item15_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Donn talks about Item #15 of the Effective Java series – Minimize Mutability. You’ll learn what mutable and immutable objects are, how and why immutability is a good thing and how you can implement it.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ryanharter.com/blog/2016/03/22/autovalue/"&gt;Ryan Harter’s Intro to AutoValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/autovalue/?utm_source=fragmented_075"&gt;Caster.IO Course on AutoValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/75/</guid><pubDate>Mon, 06 Mar 2017 15:39:43 UTC</pubDate></item><item><title>074: Ben Oberkfell talks Fingerprint API</title><link>https://fragmentedpodcast.com/episodes/74/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/3b7e7046-e123-4b74-a59b-2c4c6de9442b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/3b7e7046-e123-4b74-a59b-2c4c6de9442b/074-ben-fragmented-podcast_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It’s almost a given these days that most phones will have Fingerprint APIs. But how does the hardware actually work? How does the Software work? How does an Android developer make use of these APIs? Ben Oberkfell breaks it down for us in great detail. Listen on!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.nytimes.crossword&amp;amp;hl=en"&gt;NY Times Crossword app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidbackstage.blogspot.com/2015/11/episode-38-fingerprint.html"&gt;Chicken Wing test – ADB Ep 38&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.android.com/compatibility/cdd.html"&gt;Android CDD – Compatibility Definition Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@vrypan/explaining-public-key-cryptography-to-non-geeks-f0994b3c2d5#.vhcid82d"&gt;Explaining public/private encryptino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.elcomsoft.com/2016/06/fingerprint-unlock-security-ios-vs-google-android-part-ii/"&gt;Android vs iOS fingerprint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/benoberkfell/android-fingerprint-demo"&gt;Ben’s fingerprint demo app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=JWMpvDWwdJY"&gt;Ben’s Droidcon NYC 2016 presentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.android.com/security/keystore/"&gt;Android hardware keystore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/business/docs/iOS_Security_Guide.pdf"&gt;Apple’s security whitepaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/whorlwind"&gt;Whorlwind – Reactive fingerprint library courtesy Square&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/benlikestocode"&gt;@benlikestocode&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Kaushik, I forget: do you have a Nexus 6P or a Pixel?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; I have a Pixel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Really? Do you like it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Oh, I love it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Where’s the fingerprint scanner on that? Is it on the back or the front?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; It’s on the back, exactly like the 6P’s.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Do you use it for anything, like unlocking?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I use it for everything. I absolutely love it. It’s one of those technologies where, once you start using it, you can’t live without it. I obviously use it for unlocking my phone. I also use an application called 1Password, which stores all my passwords. Thankfully, after much online harassment, they have implemented fingerprint authentication as well. I even use it at Starbucks through Android Pay. I use it all over the place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; It’s absolutely fantastic. I have a 6P, and it was the same way for me. Now that I’ve started using it, I can’t give it up. I will never again buy a phone that doesn’t have fingerprint support.&lt;/p&gt;
&lt;p&gt;That brings up a good point: we have a guest today who should help us dive deeply into this topic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Absolutely. I think it was at &lt;a href="http://droidcon.nyc/"&gt;DroidCon NYC&lt;/a&gt; where this gentleman gave &lt;a href="https://www.youtube.com/watch?v=JWMpvDWwdJY"&gt;a talk about Fingerprint ID&lt;/a&gt;. We’ve been excited about this interview for a long time, because we’ve been wanting to talk about this. Without further ado, we welcome Ben onto the show.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ben Oberkfell:&lt;/strong&gt; Hi! I’m really glad to be here. Thanks for having me on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Ben, for any folks who aren’t familiar with you (even though you’re pretty active in the community), can you give us a bit of background about yourself and tell us about where you work and how you got into Android?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; I live in St. Louis. Until recently, I worked for American Express, where I helped build fingerprint login into their app. Now I work for the New York Times, where I’m building the Android version of &lt;a href="https://play.google.com/store/apps/details?id=com.nytimes.crossword&amp;amp;hl=en"&gt;the crossword app&lt;/a&gt;. In other words, I get paid to do the crosswords, which is really fun!&lt;/p&gt;
&lt;p&gt;I got on this journey back in 2010, when the Nexus One came out, and I started goofing around with it. Then this conference called “Google I/O” surfaced on my feed. The registration window was open for 90 days, so I had plenty of time to decide whether I wanted to go or not. It wasn’t a complete free-for-all back then (like it later became). I fell in love with developing on Android through that. I did some side projects here and there while I was working on cancer research, and then wound up going into this full time about four years ago.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s cool! Don’t you also work with the Google Developers Group in St. Louis?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Yeah, I’m one of the two co-organizers of the &lt;a href="https://www.meetup.com/GDG-St-Louis-Google-Developers-Group-St-Louis/"&gt;St. Louis GDG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Is the New York Times crossword app an independent application, or is it part of the New York Times app itself?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; It’s a separate app, with a separate subscription—although if you subscribe to the digital news, you’ll get a $20 discount on that. Also, if you want to buy one-off puzzle packs, we have in-app purchases for those. So, if you don’t want to commit to a year, you can buy a set of puzzles to play on the train.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s very cool. We’ll add a link to that in the show notes, because I’m a big fan of the New York Times. It’s one of the few newspapers that I try to read regularly.&lt;/p&gt;
&lt;p&gt;Ben, Donn and I want to talk about the fingerprint API, because that’s the thing that really excites us, but we want to step back a little. As developers, it makes a lot more sense to us if we understand the hardware as well. Do you think we can start off there? Could you talk about how this whole fingerprint authentication mechanism works at a hardware level, just so we can get a brief understanding before we dive into the actual software, which is typically where we try to do all the magic?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How does the fingerprint hardware on the back of the Nexus 6P, the Pixel, and a bunch of other devices actually work? Do you know?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Some of the scanners that were on some of the older Samsung phones were optical sensors, but today’s sensors are actually capacitative. It’s similar to the sensor your screen uses, but at a much higher resolution. There’s a grid of capacitors, and the grooves, the valleys, and everything else in your fingerprint will affect the current that’s passed through. Reading off that grid basically forms an image—a grid of pixels. That’s how a sensor resolves a fingerprint image without having to use a camera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I didn’t know that, but it makes so much sense when you describe it that way. I thought it was just a low-end camera that took an image, since I heard that if you scratch it (or simply use your phone for some time, so that it wears out) then it wouldn’t work because the image would not have a high enough resolution to resolve your fingerprint. Obviously, I imagine it still wouldn’t work, but I understand why it happens now. That’s amazing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Qualcomm has a new sensor that can scan through glass and some metals, and can handle things like wet fingers, so you don’t actually need that big round circle on the back of your phone anymore. There aren’t many devices that have that right now, though. I think it’s just a few from Xiaomi and Le Eco.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s interesting. Funnily enough, I bought my dad a Pixel phone recently, because he was due for an upgrade. He mentioned that he had gone to the pool or something, and after he came back, he tried to unlock his phone. It didn’t work. It makes sense now, because I imagine those ridges and valleys took a completely contorted shape as they shriveled up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; The other thing that I’ve found is that if your fingers are wet (or even a little bit damp) that can affect the conductivity that it ends up measuring. If I’ve just washed my hands, even if I’ve dried them off, that can sometimes affect the sensor. Most phones have their issues with that from time to time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I think I remember hearing something related to fingerprint recognition on &lt;a href="http://androidbackstage.blogspot.com/2015/11/episode-38-fingerprint.html"&gt;Episode 38&lt;/a&gt; of the Android Developers Backstage podcast. They mentioned the Chicken Wing test: they wanted to make sure that Android fingerprint authentication worked so well that if you happened to be eating chicken wings, and you wiped your finger on a napkin quickly and put it on the fingerprint sensor, it would still be able to read it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; I’m imagining them sending test devices out to a Super Bowl party to see if it worked…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Anyway, I’ve heard that the fingerprint reader is tied to something on the actual chip itself. Do you know anything about how that works?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Yes, it’s called a Trusted Execution Environment, and it’s either part of the CPU itself or on a separate chip called a secure element. But ARM CPUs have something called a trust zone, which is almost like a secure system within a system. Code running on Android can’t actually get at the memory used by what’s in the trust zone. If there’s rogue software running on your phone—maybe you have a virus, or maybe you’re rooted and you’re intentionally trying to pick at it—it still can’t exfiltrate what’s going on inside that trust zone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So you are saying this is almost like a physical hardware component on your phone? Typically, secure phones don’t allow API level access, or even much lower-level access, to any of that information. There’s no reading, just writing. Is that right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; There are channels in and out, but yes: the Android OS kernel can’t actually see what’s going on in there or read that memory. There have been researchers who have tried to break the trust zone barrier, but it’s theoretically a firewall between the potentially insecure Android world and the world of cryptography and fingerprint scanning and matching.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Got it. So there’s something called a trust zone, which I imagine is a marketing thing from the folks at ARM. And the Trusted Execution Environment is basically the genetic term for where the secure information is held. So, all Android phones have a Trusted Execution Environment?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Not every one. This is something that a lot of older Android phones either did not have or make use of.&lt;/p&gt;
&lt;p&gt;That’s one thing that you’ll find in the Android Compatibility Definition Document, which is a great piece of bedtime reading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; A cure for insomnia?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Print it out and keep it on the nightstand. Anyway, it’s basically the Bible of what you have to comply with to ship a version of Android that contains the Google Play Store and all of the Google accoutrements that come with an Android phone. One of the things that it specifies is how you should build your hardware if you’re have a fingerprint reader. For instance, fingerprint matching has to happen in trusted hardware, and the fingerprint reader has to have a secure channel straight to that. It can’t go to the user space on the Android side. Also, cryptography (which we’ll get to later today, I imagine) has to happen in that trusted zone as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That kind of bridges the gap into the software component, because the hardware and the software have to talk together. This reminds me of when the Nexus 5X and 6P came out. They used what was called “Nexus Imprint”, which was the software/hardware combination that allowed Nexus phones to support fingerprint authentication. Do you know if this something that all devices have to implement? Or is this specific to Nexus devices? I know there are some Samsung devices, like a friend of mine has, that use fingerprint authentication, but is that the same thing?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Donn, anyone who uses a Samsung phone is not your friend.&lt;/p&gt;
&lt;p&gt;Just kidding….&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; No, you’re not. You’re not kidding, and that’s the truth! [laughs] We’ll get into that in a minute, don’t worry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; The Nexus Imprint, as far as I can tell, is really just a brand name for the fingerprint framework that arrived in Android 6. The underlying implementation of that fingerprint experience is what you’ll find in any device that has a fingerprint reader and runs Android 6 or better. Anything that meets these criteria under the CDD (i.e. it gets a fingerprint reader and all of that other good stuff that we talked about) is going to use the Android SDK. It’s effectively the same thing without the fancy branding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Basically, if I understand this right, the CDD is global to all Android phones, and anyone who implements the CDD allows the fingerprint feature on a phone. And Nexus Imprint is essentially a Google implementation of the CDD, but on the Nexus and Pixel phones, so it’s more like a marketing term.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; You got it. There is one wrinkle, though, since we mentioned Samsung. They started using fingerprint readers back with the Note 4 and the Galaxy S5, and their fingerprint API doesn’t do any of the really cool cryptography stuff that the Android API (since Marshmallow) lets you do. It doesn’t actually meet the CDD. If you try to use the fingerprint API on one of these devices (now that they run Marshmallow), Android will report that they don’t actually have fingerprint hardware.&lt;/p&gt;
&lt;p&gt;You’ll probably get some 1-star reviews for this. I know I’ve seen them on apps that I’ve used (like 1Password, for instance), and the authors have to go chime in on their support forums, saying, “We’re really sorry, but while these two phones have fingerprint readers, they don’t meet the standards that Google set for this SDK. We can’t use them.” That’s one thing that you’ll have to fight against. Their SDK is simply a call-back of, “Hey, did you get a successful scan or not?” It doesn’t have any of the really fun cryptography stuff that we’ll see in the Android 6 API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So you’re basically saying that Samsung phones have weak security in their Fingerprint ID, and nobody should ever use Samsung phones ever in their life? And if they get new phones for different people, they should not be buying Samsung phones? That’s basically what you just said, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; I can’t fully agree with that, but I can say that if you’re going home for the holidays and your family asks, send them in the direction of a Pixel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Okay, I’m clearly a little biased here.&lt;/p&gt;
&lt;p&gt;Anyway, I’m tracking with you so far. All of this makes sense. So, let’s dive into what actually happens once this fingerprint data gets encrypted. I’m curious about how the encryption model works, because (in all seriousness) this is very important. If you’re saying that this is a biometric way of unlocking your phones, and it’s secure, we need to understand how secure it really is, as developers. You also mentioned cryptography. Can you dive a little into that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; One of the things that also comes in the Android CDD (with Android 6 and the fingerprint reader) is what’s called a “hardware keystore”. That’s really just an abstraction around a place where encryption keys can be placed, and where they can’t be exfiltrated out of the system by a rogue app, the government, rooting, or whatever else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Sorry, can we step back a little? What exactly is a keystore (for those of us who are wondering)?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; In Android, when you create an encryption key—either a symmetric key (which can be used to encrypt and decrypt a piece of data), or asymmetric keys (where you retain a private key and give your friends the public key, and vice versa)—it’s saved in what’s called the keystore, which is essentially an abstraction of the place where keys wind up being saved. Some of the older Android devices, way back in the Jelly Bean and Gingerbread dark days, actually didn’t have a place in the hardware where the key material was saved. If you were rooted, all bets were off.&lt;/p&gt;
&lt;p&gt;Now, what actually happens is that all of the key manipulation and and actual cryptography happens inside the Trusted Execution Environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s something we should really hit home. Essentially, you’re saying that after Android M, they began enforcing that encryption should happen only inside this Trusted Execution Environment, so even if you have root access to a phone that runs this operating system that is M and above, then you’re safe, but if you did it before M, then you’re probably not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; So if you have an Android phone that runs M, the private key or symmetric key for any encryption operation will be safely locked up in that vault. It’s never going to be able to leave the friendly confines of the Trusted Execution Environment and get out into the world.&lt;/p&gt;
&lt;p&gt;Where that plays in though, is when you create encryption keys on your device. You can actually set a property on those keys that says that authentication via the fingerprint reader is required before anyone can use them. That’s how you can actually use the fingerprint reader to sign data (if you’re using a public/private key pair) or encrypt and decrypt data you have on disk. In either case, you have some assurance that the only way you’re ever going to actually use those keys is if you put your finger to that reader.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; This actually could be very useful in situations where you need to provide some type of encryption mechanism for HIPAA compliance, or you need to encrypt a local database. For example, Realm has AES-256 encryption out of the box, but you have provide it a key. You could base it off of a fingerprint, so that if someone wants to have access to your app, and you need to make sure that it’s secure to that particular user, they have to authenticate with a fingerprint to unlock the database.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Since there’s an OS handle for each key, you can just pass that off to whatever API needs the key to do its work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I have one quick follow-up question. You mentioned that you can set a property on the key that you are encrypting that basically says “user fingerprint required.” The question is: if you don’t have a user fingerprint—say, you only have a pattern or a PIN code—can you only unlock this with a fingerprint?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; I haven’t played with it, but as far as I remember, there’s also a way to unlock that key using the passcode, or (effectively) anything else that can open a lockscreen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Okay. I imagine they’re grouped as a specific sort of thing, because I remember that there was this talk about how Smart Lock is a trust agent thing, but isn’t necessarily as secure. I imagine that there are groups of authentication methods, like “this is super secure” and “this is a convenience kind of security.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So we talked a little bit about the hardware and some of the higher level software stuff—about how it works and what we can use it for. But if I’m a developer listening to this podcast, and I think, “This is cool. I really have a use for it. I have the HIPAA use case, or maybe I have a financial app that I need to unlock, or something else with security stuff,” what are some of the things that I need to do to implement fingerprint support? Is there a particular library that I need to use?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; The first thing that you need to do is make sure that you’re targeting Android 6.0 or better in your app. Once you’ve done that, you should go look in the Android SDK &lt;a href="https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.html"&gt;documentation for FingerprintManager&lt;/a&gt;. That lits all of the lovely methods that you’re going to use to check if fingerprint hardware exists and whether or not your device has fingerprints added to it, and for performing the authentication itself.&lt;/p&gt;
&lt;p&gt;Handily, the support library gives us a class called &lt;code&gt;FingerprintManagerCompat&lt;/code&gt;, which wraps a lot of this in SDK-level-safe versions. You don’t need a lot of version checks peppered throughout your code to do &lt;code&gt;FingerprintManager&lt;/code&gt; calls. On older versions of Android, this will be a no-op, but on versions that actually support fingerprint, this will call into the &lt;code&gt;FingerprintManager&lt;/code&gt; and do the real work.&lt;/p&gt;
&lt;p&gt;The first thing you want to do in your UI is query, “Hey, does this phone have the hardware?” Then you could go and present a message to the user: either “You have fingerprints enrolled. Great,” or “I see you have a fingerprint reader. If you go and enroll fingerprints, then you can enable fingerprint authentication in our app.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Are these standard UI dialogs that come with the support library, or is this something you have to implement?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; You’d think that you’d get this for free in the support library, but not so. It’s never this easy with Android. However, if you go to the Google’s Material Design guidelines page, they have &lt;a href="https://material.io/guidelines/patterns/fingerprint.html"&gt;a really great page about Fingerprint&lt;/a&gt; which gives you some helpful guidelines on how to design your layouts for standard look and feel. They have a standard icon which they’d like you to use across all the apps, so that when you enroll a fingerprint, Android can say, “Hey, look for this icon. When you see it, you can use your fingerprint to unlock this app, or anything else that requires a fingerprint operation.” It also has some really good recaps of what fingerprint flows your user might run into as they’re interacting with the app and the fingerprint reader.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let me make sure I’m hearing this correctly: there is no built-in dialog, so I have to build my own dialog that looks like Material Design. I have to do all that work if I want to implement this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Unfortunately, yes. If you go to the Google samples, they have a sample fingerprint app with some layout files that you could pilfer, so that’s always a good start.&lt;/p&gt;
&lt;p&gt;One great example that I’ve seen is the Target app. They’ve added fingerprint authentication, but they’ve done a bit of a spin on the dialog. They use more of a flat look, and instead of the white on green Android color, they use white on red. It’s very Target branded, but the Material guidelines do say that you can use your brand colors, as long as you keep that icon somewhere, so people know what to look for across all their interactions with their phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let me take a step back. We’ve talked about &lt;code&gt;FingerprintManager&lt;/code&gt; and &lt;code&gt;FingerprintManagerCompat&lt;/code&gt;. You can check to see if the hardware is detected, if it has enrolled fingerprints, and all of that good stuff. You can perform different actions given those scenarios, but to take it back to the fantastic Samsung devices that we all love, what happens to some of those older devices with these methods? If there’s a fingerprint reader, is it detected, and are there any weird things that we should expect when working with Samsung fingerprint readers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; The older Samsung phones (like the Galaxy S5 and the Note 4) are going to give you back &lt;code&gt;FALSE&lt;/code&gt; if you query for whether fingerprint hardware exists. One thing that I have found in crash logs on those Samsung phones (those are always fun) is that a smattering of devices (and I don’t think I was ever able to resolve what specific type it was) would throw a security exception if there weren’t any fingerprints actually enrolled in the phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Thanks, Samsung.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; A word of caution from those who have been there before is to definitely wrap stuff like that in handlers, because you never know what Samsung or some other vendor is going to throw at you in this kind of stuff that has deeper hardware interactions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s an excellent bit of advice there. So, if we have the &lt;code&gt;FingerprintManager&lt;/code&gt; at this point in time, and we’re ready to implement this, how do we go about generating the keys that we talked about? Myself and a bunch of other folks consider ourselves security dolts, so maybe you could walk us through what that would look like and how to get it set up?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Android has a couple classes that help you create and save keys straight to the keystore. There’s a &lt;code&gt;KeyGenerator&lt;/code&gt;, which is what you use for symmetric cryptography (i.e. the same key will encrypt and decrypt a piece of data). Then there’s also a &lt;code&gt;KeyPairGenerator&lt;/code&gt;, which lets you generate public/private key pairs for public/private cryptography. The flavor of which classes you’re going to use depends upon what method of cryptography you’re using and what your use case is. For instance, if I’m just going to sign data (rather than encrypt it), I still need to use a key pair generator, because that will allow me to sign data with my private key, and ensure that the only way I can ever sign it is if I put my finger to that reader.&lt;/p&gt;
&lt;p&gt;The way we do that is by passing in an instance of a class called a &lt;code&gt;KeyGenParameterSpec&lt;/code&gt;. That basically encapsulates all the parameters necessary for creating a key. It comes with a builder, and the builder methods contain things like the algorithm you’re using—you know, like AES and Elliptic Curve—how many bits in the key, etc.&lt;/p&gt;
&lt;p&gt;Also, one of those builder methods (after you’ve decided on your algorithm and key complexity) is going to be &lt;code&gt;setUserAuthenticationRequired&lt;/code&gt;. This is what puts that key in the vault, so to speak, that’s guarded by the fingerprint reader.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Got it. That’s step one, I suppose: generating the key. You’ve managed to take this key and store it inside the Trusted Execution Environment, but through the API, so you don’t necessarily have to do it yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Yeah. Now, you have to figure out what you want to do with this key. One thing that’s really handy is fingerprint authentication to a remote backend. You can actually sign a piece of data with your private key that authenticates you. Since the only way that I’m able to use that key is by using the fingerprint reader, if I want to prove to a backend server that I put my fingerprint on there, I can sign a piece of data with that private key and the back-end can register it.&lt;/p&gt;
&lt;p&gt;For instance, maybe I’m adding fingerprint authentication to an app that has not had it before. In the past, you would sign in with a username and password and get back a session token. Well, you sign a request with your session token and your public key wrapped in that, and send that up to the backend to register your public key as part of the data that’s maintained for you. The next time around, if you send a login request, you don’t send in a username and password. Instead, you send a blob of data that’s signed with that private key, saying, “I want to log in as Donn and I’m signing this with my private key.” Then you can validate that signature on the backend and say, “This passes the signature check by verifying with the public key. I know that he actually has access to that private key, so I can go ahead and log in using that request instead of a username and password.”&lt;/p&gt;
&lt;p&gt;What’s really handy is that if I request to enroll my device in this new backend feature, I can give back a device ID that I saved locally. Now, on the backend side, I have the ability to revoke an individual device login. Since I’m not sending a live username and password over the wire anymore, I can remotely disable that device’s ability to login with fingerprint. That gives a little bit more security for your users if they lose their phone, and someone else might have access to the fingerprint.&lt;/p&gt;
&lt;p&gt;A really good analogy is if you’ve ever used SSH to login to a server and enrolled your public key on the server side. After that, you basically turbo login. That’s the pretty much exact same thing we’re doing here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Exactly. That actually brings up two quick follow-up points. First, you mentioned symmetric and asymmetric cryptography off-hand. Just to give folks a quick understanding, symmetric and asymmetric encryption use two different mechanisms. The difference is that symmetric uses the same key to unlock and lock, but asymmetric uses two separate keys to unlock and lock.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Right. With an asymmetric key, you have a private key and a public key. You guard the private key with your life. It’s yours, and yours alone. But you can go and send out your public key anywhere. You could post it on Twitter, or mail it to everyone in the world. In fact, they actually need that key to be able to encrypt data that’s destined for you. So I can go and encrypt data using your public key, and that data is now for your eyes only. Only you can use your private key to unlock it.&lt;/p&gt;
&lt;p&gt;What’s also handy is that you can basically use your private key as a digital notary stamp. I can sign a piece of data with my private key, and then (if you have my public key) you can come back and validate that it was really me who signed it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If folks are really trying hard to wrap their heads around how public/private key encryption works, and if they’ve never really dived into it, it can be a really confusing beast. I’m going to put a link in the show notes to &lt;a href="https://blog.vrypan.net/2013/08/28/public-key-cryptography-for-non-geeks/"&gt;a blog post&lt;/a&gt; where the author explains very easily, and through a great analogy, how public/private key encryption works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; My last follow-up question was: you mention sending stuff to your backend. That brings up a question: does fingerprint authentication only work when you’re online? What if I’m offline? Does it not work then? If I’m using an application, and I’m in a tunnel, riding in a bus, does that mean that I can’t use the Touch ID?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Well, if you don’t actually care about having this implemented in your backend side, you can encrypt with a symmetric key to save data offline, and also use that. For instance, maybe I have a diary app. I can use a symmetric key to encrypt every piece of every single journal entry. Maybe I’m using Realm to back this up, as Donn suggested earlier. I could use that locally-saved symmetric key to encrypt some local data and pull it back up later on when I’m offline, or if I don’t want to have any kind of server interaction at all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Just to wrap this up, we’ve signed the requests with a private key. What happens after that? I have this key, so what do I do now? I imagine I have to use one of the APIs that’s provided to me by Android, and that this is the final step. So what happens? At what point do I get a boolean saying “Yes, you are authenticated,” or “No, you are not authenticated”?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Once you’ve generated this key, you can call &lt;code&gt;authenticate&lt;/code&gt; on an instance of the &lt;code&gt;FingerprintManager&lt;/code&gt;. You pass in what’s called a &lt;code&gt;CryptoObject&lt;/code&gt;, which is really just a generic box to hold a handle to the key. That just tracks whether you’re going to use a key pair or a symmetric key. What that will do is activate the fingerprint reader. When you call this, you also pass in a callback, and you implement a listener. Depending on how that scan went, you’re going to get some calls into this. There’s a success callback that gives you your cryptography object back, blessed by the fingerprint reader. You can pluck your key handle out and go use it to sign or encrypt some data.&lt;/p&gt;
&lt;p&gt;Then there are a couple different flavors of error conditions which are handled by two different callbacks that you’ll need to implement. One is for a hard error, where you scan the wrong finger five times and it locks you out. Try it the next time you try to log in to your bank or unlock your lock screen. After five bad tries, it locks you out of the hardware.&lt;/p&gt;
&lt;p&gt;The other is a soft error, and there’s a handler for that. Maybe you moved your finger too quickly on the sensor, so it asks you to try again. We’ve all seen that one. There is another one in there that goes back to the hot wing example here: the “The finger is too dirty” error condition that asks someone to use a different finger, go wash their hands, or something.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Take a bath!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; What’s really handy about these soft and hard errors is that you don’t actually have to worry too much about disambiguating what the error is. Android is nice enough to pass in a string with these callbacks that has localized error text which you can show in your UI. This might also be because some vendors and OEMs have their own failure cases for why their sensor didn’t work, so they can handle that and you don’t have to worry about it. Or, you won’t have the messages localized to each language, so you don’t need to enumerate localized translations for all of these different error conditions. One thing that you will find in the Material guidelines is that when the framework gives you back those callbacks, don’t try to dream up your own error messages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense. Just to wrap up what you just said, you have a cryptography object, which you pass to the &lt;code&gt;FingerprintManager&lt;/code&gt;. At that point, the device starts reading your fingerprint. Once the person puts his finger on the sensor, the data comes in, and the callback that you passed in initially when constructing this comes back with a success or failure. Then you can perform accordingly to what you need to do. Is that the high-level overview?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Yep, you’ve got it. If you get a success, you can go and use that key to encrypt or decrypt some data or sign something. At that point, the key is yours to use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; There is a ton of stuff out there about fingerprints. There is the Android documentation and so forth, but I wanted to highlight some of the things that we’ve noticed that you’ve done, Ben. One is that you have an actual &lt;a href="https://github.com/benoberkfell/android-fingerprint-demo"&gt;Android Fingerprint demo&lt;/a&gt; up on Github, correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Yeah, I put this together for my talk at DroidCon NYC last fall. What you’ll find in there is a super simple implementation of an app that does fingerprint. I did Uber for baked potatoes, and called it Tuber. You’ll also find a sample backend that handles public key verification. If you want to use a signature based request pattern, you’ll find a starting point in there, so you can pretty easily spin up that backend.&lt;/p&gt;
&lt;p&gt;It’s all lovingly done in Kotlin, which you can run locally in the emulator as well, side-by-side. There are some instructions on how to make sure that your emulator can talk to that sample backend, and you can play with Fingerprint there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Ben, I’m really excited to check out that Github link. I didn’t know there was a server component to it as well, so I’m going to check that out—and fork it, and probably create an Uber for Chipotle, because I need some burritos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Burrito bowls on the go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Here’s my money. Take it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Ben, thank you so much. This has been really exciting. It opens up a whole bunch of possibilities. I’m sure that many folks are curious to see what’s involved in implementing fingerprint authentication, so this is extremely useful stuff. Thank you so much for coming on the show and helping us understand this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Thank you very much for having me on. I hope this is a good starting point for a lot of people.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Absolutely. If folks want to reach out to you and want to find out more about fingerprints, what’s a good way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BO:&lt;/strong&gt; Definitely check out the Github repo in the show notes. If you still have any questions, you can hit me up on Twitter. My handle is &lt;a href="https://twitter.com/benlikestocode"&gt;@benlikestocode&lt;/a&gt;. I’ll be happy to field questions there, for sure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I know Donn likes to code as well. Where do folks hit you up?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Just like Ben, I’m on Twitter. You can hit me up at &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;. What about you, Kaushik? Where can folks find the illustrious Kaushik Gopal?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Well, I have a very creative Twitter username: &lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt;. You can hit me up there if you have any questions. Thank you all so much for listening, and thanks again, Ben, for coming on this show.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/74/</guid><pubDate>Mon, 20 Feb 2017 05:42:17 UTC</pubDate></item><item><title>073: Effective Java for Android Developers – Item #14: In public classes, use accessor methods, not public fields</title><link>https://fragmentedpodcast.com/episodes/73/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9e212b0c-b934-4943-bbaa-e8ba627228f1?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/9e212b0c-b934-4943-bbaa-e8ba627228f1/073-effectivejavaitem14_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Donn talks about Item #14 of the Effective Java series – In public classes, use accessor methods, not public fields. You’ll learn why it’s important to use accessors in your public classes and some caveats to this rule.&lt;/p&gt;
&lt;p&gt;For example, you may decide that the class is a private inner class or package private. Donn digs into the details in this week’s episode. This is a glimpse of what’s to come in Item #15, which is coming soon…&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html"&gt;Java Access Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Today, I’m going to talk about Item 14 in &lt;a href="https://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/"&gt;Effective Java&lt;/a&gt;,
by Joshua Bloch.&lt;/p&gt;
&lt;p&gt;For those of you who are just joining us, we do a small “mini-Fragment”
episode every once in a while. Some of these episodes are based around
&lt;em&gt;Effective Java&lt;/em&gt;, a book that’s packed full of great information for
every single Java developer. It gives a bunch of patterns and practices
that you should implement in order to be a good Java developer. Our goal
here is to relate them to Android development, and to talk about each of
the items as we come across them.&lt;/p&gt;
&lt;p&gt;Today, I’m talking about Item 14, which states: “In public classes, use
accessor methods, not public fields.” I think the key phrase here is “In
public classes…” Keep that in mind: Joshua is not talking about private
or package-private classes, but about public classes only.&lt;/p&gt;
&lt;p&gt;Some folks are tempted to create data objects that, instead of having
accessors and mutators (getters and setters, respectively), just make
their fields public. They’ll make a public value, and they’ll just
access it that way. One of the reasons that this is looked upon badly by
some of the hard-line, object-oriented programmers is because it doesn’t
offer the benefits of encapsulation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can’t change the representation without changing the API, you
can’t enforce invariants, and you can’t take auxiliary action when a
field is accessed. &lt;strong&gt;Effective Java, page 71&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are a bunch of problems which you can encounter when you expose
these values as public fields.&lt;/p&gt;
&lt;p&gt;On a personal note, I agree with him that when it comes to public
classes, which are accessible outside of their package, you should
provide some type of getter or accessor method. This allows you to
preserve some flexibility around that class’s internal representation.&lt;/p&gt;
&lt;p&gt;If (for some reason) your class does expose a public field, all hope of
ever changing its representation is basically lost. That public
class—again, a public field or method—is a part of the API that you’re
giving. If you build a library and make something public, it’s going to
be used by people who are using your library. You need to think hard and
long about whether something should be public. If it’s a field, you’re
kind of tied to it. If you realize later (for some reason), “Ooh, I need
to change that because of these problems,” there will be all sorts of
folks who are using that public field.&lt;/p&gt;
&lt;p&gt;Instead, you should probably think about encapsulating the field in some
type of accessor (i.e. a getter method), and that’s exactly what item 14
is saying.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Effective Java&lt;/em&gt; then dives in, saying that the main reason for this
item (again) is to preserve the class’s internal representation of the
data and give you some flexibility in how it works (if you need to
change it).&lt;/p&gt;
&lt;p&gt;Now, there is a flip side to this coin (which everyone probably has on
the tip of their tongue): if the class is package-private or within a
private nested class, there’s nothing inherently wrong about exposing
its data fields, assuming that they do a good job of describing any type
of data or abstraction provided by said class. The reason for this is
that it generates less visual clutter (i.e. you have less code lying
around) than the typical accessor method approach. I’m sure you’ve seen
this: if you have ten fields in your class, and then (for some reason)
you generate getters and setters using Android Studio or IntelliJ, your
class suddenly explodes from 15 lines of code to 30-50 lines of code,
and you have a larger set of code to maintain. So, if the class is
private or package-private, you can go ahead and set your fields to
public.&lt;/p&gt;
&lt;p&gt;One of the reasons why it’s okay to do this in a private or
package-private class is because the client code (your library, or
whatever) is tied to the class’s internal representation and the package
containing that class. If changing something in the class is desirable,
you can make that change without having to worry about what it will do
to the public API. You aren’t changing a method name, its signature, or
anything like that which could be a breaking change.&lt;/p&gt;
&lt;p&gt;However, you still have to be careful about what you’re doing to the
data, since you could be changing what’s happening (against the users
expectations). If (for some reason) you’re changing a value when another
method is called, you need to (of course) notate that in your release
notes.&lt;/p&gt;
&lt;p&gt;Please note that you’ve probably seen different classes in Java itself
that completely violate this advice—for instance, the &lt;code&gt;Point&lt;/code&gt; class and
the &lt;code&gt;Dimension&lt;/code&gt; class. Apparently, according to the book, some internals
of the &lt;code&gt;Dimension&lt;/code&gt; class which are exposed create a serious performance
problem that’s still in Java today. I haven’t dug into this exact issue,
so this is just from &lt;em&gt;Effective Java&lt;/em&gt;, but Joshua is explaining, “Look,
Java has actually suffered from this, and they’re realizing it too.”
He’s giving the advice to provide a public accessor method, which helps
you fix or alleviate some of the problems that existing Java classes
have run into.&lt;/p&gt;
&lt;p&gt;There’s also another caveat to this (which a lot of the folks out who
are really into immutable data types are probably screaming at me right
now): while it’s never a good idea for a public class to expose fields
directly, it’s usually less harmful if those fields are immutable. You
can’t change the representation of that data because it’s immutable.&lt;/p&gt;
&lt;p&gt;Suppose I have a class called &lt;code&gt;Time&lt;/code&gt; with two variables: &lt;code&gt;Hour&lt;/code&gt; and
&lt;code&gt;Minute&lt;/code&gt;. We could set those as &lt;code&gt;public final int Hour&lt;/code&gt; and
&lt;code&gt;public final int Minute&lt;/code&gt;. We could then pass those values in when we
create an instance of the &lt;code&gt;Time&lt;/code&gt; class. So you would say &lt;code&gt;new Time&lt;/code&gt;,
pass in the hour and the minute, and those public fields would then be
instantiated. There are no setter methods. These are &lt;code&gt;public final&lt;/code&gt;
fields, so you cannot change them. In that case, the class guarantees
that each instance represents a valid time, and something will not be
changed.&lt;/p&gt;
&lt;p&gt;In summary, item 14 states that public classes should never expose
mutable fields. Of course, there are some caveats to that, such as inner
private and package-private classes, and also if those fields are not
going to be mutable.&lt;/p&gt;
&lt;p&gt;I really hope that this helps you. Please pay attention to the next item
(item 15), where we’re going to be talking about minimizing mutability.
This is a huge topic in Android right now, and we’ll talk about these in
the next Fragment.&lt;/p&gt;
&lt;hr&gt;</description><guid>https://fragmentedpodcast.com/episodes/73/</guid><pubDate>Mon, 13 Feb 2017 05:00:23 UTC</pubDate></item><item><title>072: App Shortcuts with Andrew Orobator</title><link>https://fragmentedpodcast.com/episodes/72/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/ccfc3fb4-970c-4294-8ac7-3d60bb020d8f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/ccfc3fb4-970c-4294-8ac7-3d60bb020d8f/072-andrew-orobator_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Android developer Andrew Orobator. He gives us the lowdown on the new feature App Shortcuts that was introduced in Android. We talk about static and dynamic shortcuts, use cases for other shortcuts and how to implement them for your app. We also cover what the feature lacks and things to watch out for, while implementing them. Listen on!&lt;/p&gt;
&lt;p&gt;Fragmented also has spanking new music from the super talented Blueprint: you can find out more at &lt;a href="mailto:info@printmatic.net"&gt;info@printmatic.net&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="andrew8217s-medium-posts"&gt;
Andrew’s Medium posts
&lt;a class="heading-anchor" href="#andrew8217s-medium-posts" aria-label="Link to Andrew&amp;amp;#8217;s Medium posts"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@andreworobator/taking-control-of-your-music-playback-experience-ed4c6a30c85#.d6flbdrfz"&gt;Introducing Auracle: A queue based music player: Andrew’s new music player&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@andreworobator/implementing-android-app-shortcuts-74feb524959b"&gt;Implementing Android App shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@andreworobator"&gt;Andrew’s medium posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techbeacon.com/best-productivity-tools-android-developers"&gt;Best productivity tools for Android developers&lt;/a&gt; (another article Andrew wrote)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/shareables/design/app-shortcuts-design-guidelines.pdf"&gt;App shortcuts design guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AOrobator/Konstellations"&gt;Konstellation&lt;/a&gt; (Kotlin demo app using App Shortcuts)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/aorobator"&gt;@aorobator&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Kaushik, it’s been a while, but we’re finally back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; Yes we are. How has your 2017 been so far?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Well, it’s a new year, so I think it’s only right to talk about
something new which neither you or I have done. I work with an
individual named Andrew, and we’ve invited him on the show to talk with
us about application shortcuts, a newly released Android feature.
Without further ado, welcome to the show, Andrew.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrew Orobator:&lt;/strong&gt; Thank you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; For folks who aren’t familiar with you and haven’t read any of
your really good blog posts, can you tell us a little bit about your
background—how you got started in Android development, where you work,
and so forth?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Sure thing. In the summer of 2013, I had just finished up a
class on Java. I had a new HTC One (M7) that I wanted to put some music
on, instead of carrying around my old iPod Classic. I tried out several
music players, but none of them really worked the way I wanted them to.
So I set out to make my own—which I actually just released to beta in
the first week of January. It’s called &lt;a href="https://play.google.com/store/apps/details?id=com.kurumilabs.auracle"&gt;Auracle Music Player&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I currently work as a Android engineer for American Express (which is
how I met Donn), although I’ll be joining the team at &lt;a href="https://www.7parkdata.com/"&gt;7Park Data&lt;/a&gt; in a few weeks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What does 7Park do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; 7Park Data generates analytics for millions of users of popular
apps. Then they take all of that data and apply machine learning
algorithms to it, and they essentially provide consumer insights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Very cool! That sounds exciting. Are you excited about it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Yeah, I’m super excited. I did a couple of machine learning
classes in college (just the basics, but enough to get by), so it’s
going to be really exciting to work closely on the Android side with
machine learning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Will you be building the client-facing consumption point for
that data?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; That’s correct. I’ll be working on the app that’s accumulating
data and sending it to their backends.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; We’ll stay tuned and have you back on the show sometime so we
can learn more. Look at us, already pushing the next episode!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Andrew, when I was visiting New York, you showed me a &lt;a href="https://medium.com/@andreworobator/implementing-android-app-shortcuts-74feb524959b"&gt;blog post&lt;/a&gt;
you had written about implementing app shortcuts, so we thought it would
be perfect to have you on the show to talk about that. Have you written
just the one blog post, or have you written or talked more about it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; So there was a blog post, a talk I gave about it at AmEx, and an
&lt;a href="https://github.com/AOrobator/Konstellations"&gt;open-source repository&lt;/a&gt; on
GitHub to go along with all of this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Fantastic.&lt;/p&gt;
&lt;p&gt;To kick this off, what exactly are app shortcuts? I know that Google has
recently released a whole bunch of new features in Android 7. I know
that app links, instant apps, and app shortcuts exist, but I know
nothing about app shortcuts. Could you tell me what app shortcuts are,
and why they’re interesting as Android developers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; App shortcuts are primary actions or deep links into your app
that can be accessed via a long press on the app icon. You can pin these
shortcuts to your home screen by long pressing and dragging them from
the menu that appears. For all of you iOS folks, this is pretty similar
to a Force Touch, although app shortcuts are implemented in software,
not hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Got it. So in iOS, there’s some pressure-sensitive aspect in the
hardware that triggers an app shortcut, but in Android, it’s just a long
press.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Where exactly are these app shortcuts available? Can I only do
them on my home screen, or can I do it the app launcher? What about
custom launchers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; It really depends on the launcher’s implementation, since
they’re the apps that actually choose how to display these shortcuts.
You implement app shortcuts by providing data that says, “Hey, this is
what I want to display,” and then the launcher figures out how and when
to display it. In both Nova Launcher and the Google Now Launcher, you
can access shortcuts on the home screen, but you can also access app
shortcuts in the app drawer using the Google Now Launcher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. So, even if you did have it technically implemented
in your application, it would only be seen in the specific launchers
that are capable of launching it, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; That’s correct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; How else can you use this? Donn and I have been wondering if you
actually use these from the home screen. For example, I have a to-do
application, and there’s one task that I keep doing, to the point where
I’m thinking, “You know what? This should just be the default.” Is there
a way to pin that specific action to my home screen, in my list of app
shortcuts?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Absolutely. Individual shortcuts can be pinned to the home
screen, but (again) this is up to the launcher app that the user
uses—although I haven’t seen any that diverge from that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let’s reel back for a second. You’re an application developer.
When you developed Auracle, why did you decide to implement app
shortcuts? How do they benefit the user?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Personally, I’m a big fan of playlists. I love making custom
playlists, and I mostly listen to playlists when I’m listening to music.
Sometimes I know the exact playlist I want to listen to. Auracle
provides shortcuts to my most listened to playlists, and I can just pin
my favorites on my home screen. Instead of opening the app and
navigating to the playlist, I can just click on the playlist right from
the home screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I used to work at MyFitnessPal, which had a calorie tracking
app. If they wanted to allow folks to go straight to the food diary,
they could implement a custom shortcut to do that, correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Yeah, that sounds about right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Since we are talking about example applications, it’s easier to
sell app shortcuts as a feature when people can see examples of
applications that do this. You said that your music player has a
playlist menu. I could have sworn that Pocket Casts (a podcast player
that many of us use) also has something along those lines. Are there any
other apps that jump out to you as doing this pretty well?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Yeah. Google Maps has really good app shortcuts. When you press
on the Maps icon, two shortcuts appear: “Home” and “Work”. When you
click on “Home,” it’s opens up directions to your home.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Why have I not done this? Immediately, I’m understanding why you
use this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Okay, end the podcast. Thanks, we’re good to go!&lt;/p&gt;
&lt;p&gt;No, I’m literally on my phone right now, playing with this. I’m long
pressing random icons. Pocket Casts has a bunch of options. Google Play
Music has everything. It’s almost as if, if you have analytics on your
application and you’re able to tell what users do the most, it would be
a good thing to implement that as an app shortcut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; That’s actually a really solid idea.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, I’m looking at Play Music now. Every time I open it, I
always seem to go to “My Library”, because I create playlists (just like
you, Andrew). I have a productivity playlist (music with no lyrics) and
another playlist for working out. I always open the app, and I’m buried
in some search that I was doing. Then I have to navigate back to the
home screen, go to “My Library”, and then to “My Playlists”.&lt;/p&gt;
&lt;p&gt;But with this app shortcut that they have, I can go straight to “My
Library” or my recent activity. I skipped all of these steps. Just like
you said for Maps, it’s just a huge timesaver—I mean, let’s be honest:
every time you open Maps you’re either going somewhere from home, or
you’re going home. You’re probably going home 50% of the time, so that’s
a humongous time savings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Donn, you know that I have problems with to-do applications. I
go a little bonkers about a whole bunch of them: Trello, Asana, Todoist,
etcetera (yes, I’ve used all of them—and actually still do!). One thing
that I find super helpful about the app shortcuts is the ability to hold
and press the icon and quickly add tasks to specific projects. You can
also do searches faster, which makes sense. This is pretty slick. I’m
really liking this, especially for applications that primarily use one
action really quickly. I imagine that an app shortcut is a great thing
there.&lt;/p&gt;
&lt;p&gt;It’s funny though. I was looking at Uber and Lyft and thinking about the
Maps thing. Being developers, we’re kind of lazy that way. I was
thinking, “Maybe Uber and Lyft should have a ‘Get me a ride home’
button.” I’m sure that’s coming down the line, though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; That would actually be awesome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That would be pretty slick. It would be a huge time saver.&lt;/p&gt;
&lt;p&gt;Alright, so we’ve been talking about all the advantages this has, but
are there any limitations to this? For example, are these only available
on an API level? Because if you’re a developer, you’re thinking, “Oh my
God, this is amazing,” but then you use API 14 or 15 and no one sees it.
Can you tell us a little more about some of those limitations?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Sure. App shortcuts were introduced in Android 7.1, so they can
only be used on API level 25 or above. When you’re actually writing
code, you have to check against &lt;code&gt;Build.VERSION_CODES.N_MR1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s the hidden beast in Android sometimes. You’ve got a new
cool feature that comes out in the new APIs, but you can’t use it until
everyone is using it.&lt;/p&gt;
&lt;p&gt;Thankfully, I have it, though!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; And that’s all that matters!&lt;/p&gt;
&lt;p&gt;One quick follow-up question to that: there are actually two limitations
here, right? One is the API level, which (you rightly mentioned) is API
25. Then there’s also the fact that only certain launchers allow this.
Developers have to keep that in mind, because we can’t just say, “Okay,
set the minimum API to 25.” If you can…oh man, you’re living the life.
But it’s not just about setting your SDK to 25. It’s also about the fact
that it’s only currently available in certain launchers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Right. When you’re testing, it makes a lot of sense to test your
implementation on different launchers, like Nova Launcher, Action
Launcher, and the Google Now Launcher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What are some of the challenges that you’ve encountered while
implementing app shortcuts on your personal projects?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; For starters, you can’t have an unlimited number of app
shortcuts. In theory, you’re allowed a maximum of 5, which are any mix
of static and dynamic shortcuts. Your app will actually crash if you
provide more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Oh, that’s aggressive. I like it!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; They’re hard and fast with their limitations. In practice, you
only see four app shortcuts, anyway. You can provide five, but I’ve
never actually gotten that to show up. It’s kind of weird like that.&lt;/p&gt;
&lt;p&gt;Another gotcha when you’re making app shortcuts comes when you want to
disable shortcuts if the actions they represent become unavailable in
your app. In Auracle, I include the most listened to playlists as
shortcuts. But if they’ve pinned that shortcuts to their home screen,
and then they delete the playlist, it’s a dead link. If they try to open
a deleted playlist, the app could potentially crash. So every time a
user deletes a playlist, I disable the shortcut for the playlist as
well. When they try to click on the deleted playlist, the launcher will
display a “shortcut disabled” message instead of potentially crashing
your app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Those are considerations that you have to make, but in the
larger scheme of things, this is pretty amazing! You know what? You’ve
sold me. I want to implement this right away, because it sounds really
interesting to me. How do I go about implementing app shortcuts? Where
do I start? I mean, I have no clue. So, as a developer, what’s step 1?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; The first thing you should know is that there are two different
types of app shortcuts: dynamic and static.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What’s the difference between the two? When would you use a
static one, and when would you use a dynamic one?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; A static shortcut is defined in the XML that’s bundled in your
APK. That means that you can only update them when you update your app
in the Play Store. Dynamic shortcuts, on the other hand, can be updated
at runtime.&lt;/p&gt;
&lt;p&gt;You’d use a static shortcut to represent core action for your app. For
example, Google Maps has two shortcuts that offer directions to your
home and your work. While I don’t have the source for the Maps
application, I would have made those static shortcuts, because they’re
core actions. They don’t just disappear at the whim of the user. On the
other hand, if your app shortcuts represent actions performed on
user-generated content, you should consider using dynamic app shortcuts.
For example, a messaging app could provide shortcuts to a user’s most
recent conversations or favorite contacts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Let’s keep step one simple. I know that are some cool things I’m
already thinking of that can be done with dynamic shortcuts, but suppose
I just want to make a basic application to help me get a feel of how
this thing works. Let’s talk about just static shortcuts. How do I go
ahead and implement one?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; When you’re implementing a static shortcut, it’s all in the XML,
so the first thing you’re going to do is edit your Android Manifest.
You’ll need to add a metadata tag to your launcher activity. You can
actually drop this tag onto any launcher activity, so if you have
multiple activities showing up in the launcher, each one can be assigned
separate app shortcuts. So you add a metadata tag to your launcher
activity, with the name &lt;code&gt;android.app.shortcuts&lt;/code&gt; and the resource
&lt;code&gt;@xml/shortcuts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The next step is to actually create the &lt;code&gt;shortcuts.xml&lt;/code&gt; file in the
&lt;code&gt;xml-v25&lt;/code&gt; folder. Note the resource qualifier saying that it’s only for
version 25 and above. Technically, Android won’t crash without it, but
Android Studio gives you a warning about it, so it’s best practices to
just use the qualifier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You said that you were going to create an &lt;code&gt;@xml/shortcuts&lt;/code&gt;
resource. What’s contained inside of that XML metadata?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; There are a bunch of attributes which you can specify for static
app shortcuts. The major ones are the shortcut labels (the text that you
see associated with your shortcut), the icon (which you usually see to
the left of the text), and the intent(s) used to launch the user into
your app. You can actually specify multiple intents as you’re defining
these in XML, if you would like to create a back stack when the user
taps on your shortcut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. Actually, that makes sense now, assuming (like you
said) that you have an action which takes you into an activity, and you
want to back out into another activity—for example, if Twitter had a new
tweet shortcut, and after backing out of that, they wanted to take you
back into the timeline—you can do that. The framework allows that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; That’s exactly right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Is there any possibility of shortcuts being enabled and
disabled? How does that work? For example, maybe I don’t want a certain
shortcut (taking the example of Twitter again, a new tweet) to happen,
if they aren’t logged in. You cannot enter a new tweet unless you’re
signed in, or something along those lines. Is there any way to handling
that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; You can mark your shortcut as disabled in code. Just as a note:
you cannot modify static shortcuts at runtime. You will get an
exception, and your app will crash. You can only disable dynamic
shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Oh, that’s good to know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; If you want to disable a static shortcut, you’ll have to do it
in XML on the next APK update from the Play Store. But when you disable
a shortcut, the launcher (at least, Google Now Launcher) turns the
shortcut icon into grayscale. Then, even if it was pinned on the home
screen, it’s not going to appear in the shortcuts menu at all either. If
you click on the grayed out icon, a short toast will pop up containing
the shortcut disabled message. The default is literally “Shortcut
disabled,” but you can override that to provide more information to your
user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Now you have these various different static and dynamic
shortcuts. But from what I’ve been able to read, it seems that you can
provide an icon to go with that. Does that icon have to be your app
icon, or can it be a custom icon?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; It’s really a mix of both custom and app icons. So the app
shortcut’s main icon will be the one you provide. That’s the big icon
that you’ll see—the main icon. It’s going to appear as a small badge on
top of the app shortcut icon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Okay. Are there any icon design guidelines we should follow as
we develop these app shortcut icons?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Absolutely. Google actually released &lt;a href="https://developer.android.com/shareables/design/app-shortcuts-design-guidelines.pdf"&gt;design guidelines for app shortcuts&lt;/a&gt;.
The basic gist of it is that you have a 48 dp square icon, which should
feature a Material Gray 100 circle with a diameter of 44 dp. In the
middle of that circle, you have a 24 dp square icon specifying the
action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wow. I guess that’s to bring some consistency to it, especially
since it’s so visible to users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Exactly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. A quick follow-up question to that: you can’t use
vectors there, I imagine—or can you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Vectors were introduced in API 21, and you’re on version 25 when
you do app shortcuts, so you can definitely use vectors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Along the same lines of controlling what the user sees, what
options do I have?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; You can control the label that the user sees in a couple of
ways. There’s a short label and a long label. It’s recommended that the
short label be less than or equal to 10 characters, and the long label
be less than or equal to 25 characters. Android picks the appropriate
one to display based on the space available, but I’ve noticed that the
short label is usually used when something is placed on the home screen,
and the long label is usually used whenever there is space in the app
shortcut menu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. So that’s just a general guideline so far.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Right, but if any of these labels are too long, they’ll just be
truncated with ellipses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So how do we control what a shortcut does? Do they use the
intent system? Do we have to create an intent? How does that work?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; It’s just a regular intent, but it has some requirements. It has
to have an action specified, and you’ll crash if you don’t have one. If
having an action doesn’t really make sense for your application, you
still need to put something. I’d recommend using the value
&lt;code&gt;android.intent.action.VIEW&lt;/code&gt;, although the string you use doesn’t really
matter. It could be an empty string if you wanted it to be. You’ll also
need to specify the target class (the activity you want to launch) and
the target package (your package name). Then, if you want to create a
back stack (like we talked about earlier), you can define multiple
intents in a list, and the last one in the list will be what the user
sees when they click on your app shortcut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense. I’m sufficiently intrigued by static
shortcuts, so I want to up my game and do dynamic shortcuts. Can you
walk us through how dynamic shortcuts actually work, so that I can get a
better understanding of how I’d go about implementing them?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Dynamic app shortcuts have all the same attributes as static app
shortcuts, but they can be updated, modified, created, or destroyed at
runtime. That’s the main difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; What’s the reason why I’d want to use one of these, again (just
so we refresh our understanding of this)?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; I would recommend using dynamic shortcuts if you’re going to
deep-link to user generated content. In Auracle, I have dynamic
shortcuts to the user’s most listened to playlists. Or, a messaging app
could provide shortcuts for the most recent or most active
conversations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You said before that there’s a limitation to the number of
shortcuts you can have, but when I think of something dynamic, I think
of something that can be updated at runtime. If I can’t have more than
five shortcuts, would I be correct in assuming that I could technically
update one particular shortcut with an infinite number of options?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; That totally makes sense. It’s a dynamic shortcut, so you can
continuously update it, and it will continuously change. You could even
change what actions it represents in code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. So, in that case, can even the short and long
labels that you talked change, or would those have to be generic?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; When you’re creating a shortcut, you pass in a &lt;code&gt;ShortcutInfo&lt;/code&gt;.
That contains all of the attributes of the shortcut, including the long
label and the short label. As long as you pass in the ID of the
shortcut, it’ll update everything that’s in there with the current
values from the &lt;code&gt;ShortcutInfo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; How do I go about creating, destroying, or even updating these
shortcuts?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; You have to go through the &lt;code&gt;ShortcutManager&lt;/code&gt;. The
&lt;code&gt;ShortcutManager&lt;/code&gt; is the class that you interact with whenever you’re
dealing with app shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So if I’m going to work with the &lt;code&gt;ShortcutManager&lt;/code&gt;, how do I get
an instance of it? Where does it come from?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; You can get an instance using context:
&lt;code&gt;getSystemService(ShortcutManager.class)&lt;/code&gt;. Make sure to only do that on
API 25 and above, since &lt;code&gt;ShortcutManager&lt;/code&gt; doesn’t exist on previous
versions of Android. If you try to do this on API 24, you’re going to
get a “class not found” exception.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Does Lint warn us of that? I know there’s the Lint max API
option, and there’s a Lint error that specifies when something is
available only beyond your max API, but do you know (off the top of your
head) if Lint warns you of this?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; I’ve got Android Studio open. I can check.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Nice! That’s how we do it here!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Let’s see. Android Studio doesn’t currently provide a Lint
warning. My min SDK version is 19, and there’s no warning. Maybe I can
file a bug for that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I was going to say that. You should hit those folks up, because
they’re very open to suggestions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If we update shortcuts, what’s the procedure by which we need to
go about it? Is there anything special we need to do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Whenever you’re interacting with the &lt;code&gt;ShortcutManager&lt;/code&gt;, you’re
usually interacting with batches of shortcuts, not just a single one. If
you wanted to update some shortcuts, you would have a list of
&lt;code&gt;ShortcutInfo&lt;/code&gt;s. Make sure that they all have the appropriate IDs and
all of the up-to-date information, and then pass that list of
&lt;code&gt;ShortcutInfo&lt;/code&gt;s to &lt;code&gt;ShortcutManager.updateShortcuts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; What are the steps again to create a dynamic shortcut?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; The first thing that you’re going to do is create a
&lt;code&gt;ShortcutInfo&lt;/code&gt; object. This details the attributes of the app shortcut,
like the ID, the icon, the label, etc. There’s a really nice builder
that you can use to get this done that helps you out with everything.
You have to do this for every dynamic shortcut you make.&lt;/p&gt;
&lt;p&gt;Then you pass the list of these shortcut info objects to
&lt;code&gt;ShortcutManager.setDynamicShortcuts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How do we get a reference to a particular shortcut? Say we
wanted to remove one of those dynamic shortcuts—how would we go about
that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; If you know the ID of the shortcut, you could pass in a list of
string IDs, because the IDs are strings. You call
&lt;code&gt;ShortcutManager.removeDynamicShortcuts&lt;/code&gt; and pass in that list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; And then it just goes ahead and removes all of those.&lt;/p&gt;
&lt;p&gt;It sounds like dynamic shortcuts are more work, but it seems that they
do give you more flexibility. Would that be an accurate assessment?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Yeah, that’s spot on. They’re super flexible.&lt;/p&gt;
&lt;p&gt;In Auracle, the playlist icons for each app shortcut come from an icon
font and color that’s customizable by the user. This means that there’s
a ton of icon color combinations needed for the app shortcut icons.
Instead of having my designer make assets for each and every different
combination of icon color (bloating the APK), I have a custom view that
draws the app shortcut icon to a bitmap. Then I use
&lt;code&gt;Icon.createWithBitmap&lt;/code&gt;, and pass the resulting icon to the
&lt;code&gt;ShortcutManager&lt;/code&gt; when I’m creating the shortcut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty slick! You could play around with these things in
so many ways.&lt;/p&gt;
&lt;p&gt;So, is there some sort of heuristic that I can use when I’m starting out
with a new application? Is there an easy way to say, “Okay, this is when
you use a static shortcut, and this is when you use a dynamic shortcut”?
This is just for people who want to try this out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; In general, you should use a static shortcut for actions that
your user can perform in your app that remain constant. For example,
Evernote has an app shortcut that creates a note.&lt;/p&gt;
&lt;p&gt;You should use dynamic shortcuts if you want to link to user-generated
content, like conversations or playlists—things that are going to change
over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; While we were having this conversation, I unlocked my device and
went to Pandora. They actually have app shortcuts, and they’re great. It
actually lists the top three stations that I play, which is a fantastic
use of dynamic shortcuts.&lt;/p&gt;
&lt;p&gt;Are there any best practices that you would recommend for app shortcuts
in general?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Every time a user navigates to a part of your app that’s
accessible via shortcut, whether they got there using the shortcut or by
navigating through the app, you should call
&lt;code&gt;ShortcutManager.reportShortcutUsed&lt;/code&gt;. That gives launcher apps the
information they need to build a prediction model and promote the
shortcuts that are likely to be used at any given moment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; As you were mentioning this, I was playing around, and I opened
up developer options and noticed something curious: there’s an option to
“Reset ShortcutManager rate-limiting”. What’s up with that? I don’t even
understand this concept. What does resetting the rate-limit mean?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; When you’re actively developing, you’re probably going to be
using the &lt;code&gt;updateShortcuts&lt;/code&gt;, &lt;code&gt;setDynamicShortcuts&lt;/code&gt;, and
&lt;code&gt;addDynamicShortcuts&lt;/code&gt; methods pretty frequently. It’s important to know
that Android limits how often these methods can be called if your app is
in the background. If your app is backgrounded, Android just won’t let
it update your shortcuts that often. It’s probably best for the user,
actually.&lt;/p&gt;
&lt;p&gt;In a production environment, this limit can be reset by bringing your
app to the foreground. But in a development environment, you can go to
developer options and hit “Reset ShortcutManager rate-limiting” to get
rid of this limit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense. It’s nice to have the option there, so that
you don’t have to manually figure out a way to trigger that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Can the same thing be done through ADB, if I wanted to automate
this?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; There is an ADB shell command called &lt;code&gt;reset-throttling&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That makes it easier, especially in a test environment. That
could be very useful.&lt;/p&gt;
&lt;p&gt;Let’s bring this full circle. For me, one of the best ways I’ve found to
learn things is by looking at sample apps and just reading and
interacting with the code. Do you know of any sample apps that someone
could inspect or download to see how to use static or dynamic shortcuts?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; I actually made a sample app called “Konstellations”. It simply
has a list of constellations, and information about each one. Then I
track the usage of each shortcut, so that on the home screen, it always
provides app shortcuts for the most visited constellations. There’s also
a static shortcut in there that will take you to a random constellation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Sweet. Where is this available at?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; On Github. Another thing to note about this project is that you
can also toggle whether a shortcut is enabled or disabled via the app,
so you get that behavior as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wait a minute…I just opened it up, and is this written in
Kotlin?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; It’s 100% Kotlin. There’s a little bit of Java in there from the
generated tests, but the entire project is written in Kotlin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; People, if you also want to get a little dose of Kotlin, then
this project is right up your alley as well.&lt;/p&gt;
&lt;p&gt;App shortcuts seem to have been implemented pretty well. It doesn’t
necessarily seem very daunting as a developer. I’m super curious about
this, and I definitely want to try them out. Listeners, especially if
you’re building apps, it’s easy enough to give this functionality to
your users. I would encourage you to do it.&lt;/p&gt;
&lt;p&gt;Thank you so much for letting us know about this, Andrew. It’s been an
absolute pleasure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; Thanks for having me on the show.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; If folks want to reach out to you with questions on some the
nitty-gritty, interesting aspects of app shortcuts, is there a way they
can do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; The best way to reach me online is via Twitter
(&lt;a href="https://twitter.com/aorobator"&gt;@aorobator&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I will say that you probably have one of the coolest last names
of any guest we’ve ever had. It’s pretty badass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AO:&lt;/strong&gt; It’s Nigerian.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Thank you so much again for coming on the show, Andrew.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Thank you, Andrew.&lt;/p&gt;
&lt;hr&gt;</description><guid>https://fragmentedpodcast.com/episodes/72/</guid><pubDate>Mon, 06 Feb 2017 05:00:31 UTC</pubDate></item><item><title>071: UI UX development with GDE Raveesh</title><link>https://fragmentedpodcast.com/episodes/71/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2efcc263-d7c3-44e6-920a-2461e843f81f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/2efcc263-d7c3-44e6-920a-2461e843f81f/071interview-with-raveesh-bhalla_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we change the tune and talk with Raveesh Bhalla; Raveesh is a GDE for design specialized in UI/UX.&lt;/p&gt;
&lt;p&gt;He starts off by helping us get a good understanding of what UI/UX involves. He then shares his experiences and learnings from having conducted extensive research specifically for Android. What are some good patterns today, what are anti-patterns, what should we watch out for. Listen on to find out more!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="apps-with-interesting-designs"&gt;
Apps with interesting designs
&lt;a class="heading-anchor" href="#apps-with-interesting-designs" aria-label="Link to Apps with interesting designs"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.todoist.com/android"&gt;Todoist (Karma points)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.foursquare.robin&amp;amp;hl=en"&gt;Swarm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.enki.com/"&gt;Enki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.fastfilmz.android&amp;amp;hl=en"&gt;Fastfilmz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/facebook-research/embarking-on-international-research-a485cc160f22#.ahwt864xp"&gt;Facebook research medium post: Embarking on international research&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Rocket-Surgery-Made-Easy-Yourself/dp/0321657292"&gt;Rocket Surgery Made Easy: The Do-It-Yourself Guide to Finding and Fixing Usability Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.UCMobile.intl&amp;amp;hl=en"&gt;UC Mobile browser app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gv.com/sprint/"&gt;Google Ventures : The design sprint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://buddybuild.com/?ref=fragmented012317"&gt;BuddyBuild&lt;/a&gt; is a continuous integration and continuous deployment system built specifically for mobile developers. Thousands of development teams love BuddyBuild because it’s the fastest way to build, distribute and gather feedback for their apps. Give it a try for FREE at &lt;a href="http://buddybuild.com/?ref=fragmented012317"&gt;buddybuild.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/raveeshbhalla"&gt;@raveeshbhalla&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Let’s hop right into it, folks. Today, we’re going to
be talking about some fun stuff related to UX and UI. We have a special
guest here with us. Please welcome Raveesh Bhalla, a GDE. Welcome to the
show, Raveesh!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raveesh Bhalla:&lt;/strong&gt; Hey, guys. Thanks for having me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; For the folks who aren’t familiar with you (particularly with
your background in Android), can you give us the Reader’s Digest version
of how you got into Android and what you’re currently doing with it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I got into Android (on the development side of things) back in
2009 or 2010. Smartphones were just starting to take off over here in
India, and I wanted to start writing code for mobile applications. I
started out with Nokia, and then realized that it was a big mistake.
That was a big thing in India for a long time, though.&lt;/p&gt;
&lt;p&gt;But after building a few applications, I noticed that I was spending a
lot more of my time with the design elements of things, particularly the
UX. Slowly, as a result of that, I moved into a design role. I still
write some Android code on the side—in fact, I just released an
application last month that aids my design work—but that’s only a hobby
now.&lt;/p&gt;
&lt;p&gt;I just joined an Indian design and development agency called Uncommon,
and I’m advising a few more startups on the side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So you’re like a wild unicorn—someone who can both develop and
design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I actually don’t think it’s that rare. I really think that
developers have a huge role to play in design, and they’re already doing
that. I think that there are at least a few developers out there who are
actually already pretty good at design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; My friend, you overestimate the capabilities of developers. To
be fair, there are actually a bunch of developers who have pretty good
design tastes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; It’s not just their design tastes, but also the roles that they
play. There are other sides of the table that they need to take care of
besides just visual elements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s actually a great segue. Before we get into that, though,
I had a quick follow-up question. When you started off with Nokia, did
you actually have to write apps for the Symbian OS?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Yeah, they used Symbian C++ and the QT IDE. That thing took
forever to get the hang of, and I eventually gave up and thought, “You
know what? I think I’m just going to write for Android, because that’s
in Java.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; What does it say if you actually pick Java as a language over
something else? “This is too annoying. I’m just going to go with Java.”
That speaks volumes about what it was like.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; It was awful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You mentioned that UX isn’t just about visual design, and I find
that fascinating, because a bunch of my friends who are designers also
mention that. Obviously, there’s that famous Steve Jobs quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most people make the mistake of thinking design is what it looks like.
People think it’s this veneer – that the designers are handed this box
and told, “Make it look good!” That’s not what we think design is.
It’s not just what it looks like and feels like. Design is how it
works. – &lt;a href="http://www.nytimes.com/2003/11/30/magazine/the-guts-of-a-new-machine.html"&gt;Steve Jobs on design&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Could you talk a little about that topic? To you, what is design? What
does it mean to you, especially as someone who’s worked as a developer
before? You have the unique advantage of translating this mystical world
for us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; A lot of people confuse design with art. They think that since
they can’t draw or aren’t good with colors, they don’t have a role to
play in design. But visuals are just a part of design itself. I look at
design as the strategy that you’re using to solve certain challenges
that come your way. I almost consider it a science, personally. I
believe that good design can be measured, and that you can quantify what
is and isn’t working. It takes a lot of logic, which is why I believe
developers can actually make pretty good designers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Usually, I try to think of it as the difference between UI (the
art, the illustration, and the other visuals that you see) and UX (the
overall experience). Does the science aspect that you mentioned play
more heavily into UX, or is there a conjunction there? Is it something
that you can even demarcate?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think it plays slightly more into the UX side of things, but
it does play into UI as well. The point is that you’re essentially
measuring a certain design change (for instance), quantifying whether a
user is able to do what you wanted them to do. That doesn’t necessarily
mean that you should do the old Google A/B tests with 50 different
colors of blue for links, or something like that. I think that’s a
little overblown.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Are there are any other misconceptions regarding design that you
think are important to iron out at this point?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Design needs to be thought of as strategy itself. It needs to be
at the core of a product team. For example, most of the startups I
advise have a product team that decides on what needs to be solved and
how to solve it. Then they go to their designers and tell them, “Okay,
we want you to design the UI for this.” But I think that designers need
to have a seat at the table on the strategy side of things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; In other words, right where you’re building this product to
begin with—at the stage where product managers are doing their whole
business evaluation of the application’s objectives?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Exactly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I completely agree with that statement. It seems like at every
company I’ve consulted with, an idea comes down from the higher levels
to designers too late in the product life cycle. Then they feel like
they’re just applying a coat of paint on top of something, solely to
make it look better.&lt;/p&gt;
&lt;p&gt;But if design was brought in earlier, management might actually see,
“Hey, we can do this thing a little bit differently, and it’ll make more
sense to users than the wizard flow that we’re building.” I think that’s
a great idea, and I completely agree that we should be bringing
designers into the fold a lot earlier in these conversations.&lt;/p&gt;
&lt;p&gt;Now, how can you tell by looking at an app if it has a good user
experience?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I won’t necessarily be able tell immediately. I mean, I can
probably point out a few things that are done wrong if they just stick
out, but I think that good UX is something that you realize over a
period of time. Quite often, you don’t even notice it because it feels
so natural, and you aren’t paying too much attention to it.&lt;/p&gt;
&lt;p&gt;For example, a lot of applications will do a lot of animations (and
things like that) just to wow you. Over a period of time, though, you’ll
probably get tired of them, or maybe they don’t have as much impact as
you might think.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Do you think that some folks have gone overboard in the Android
world today? I don’t want this to be a leading question, but do you
think that folks have gone overboard with Material Design, or do you
think it’s not being used enough? That’s one interesting conversation
that I’ve had with quite a few folks. Now, they’ve always said,
“Material Design is great,” and I feel that way too. I don’t see it as
being overboard—but then again, I am an Android user, so maybe I’m being
biased. What are your thoughts, as someone who works in design? I
imagine you have a slightly more objective outlook on that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think that a lot of people get the original goals of Material
Design wrong. If you talk to a lot of people, most of them think, “If we
do Material Design, we need to have a floating action button, a toolbar,
and stuff like that.” I don’t think that’s how you need to think of it.
Go back to what Material was originally supposed to stand for: trying to
bridge the divide between digital interfaces and physical products;
taking some of the affordances that we have in physical products and
applying them to digital products. Essentially, they wanted to add
shadows and make the way things move feel very natural.&lt;/p&gt;
&lt;p&gt;Because of that, I do think many people get it wrong, in the sense that
they’ll put a floating action button in a place it probably doesn’t need
to be in. I think that Google also missed a big beat over here. The
original Material Design guidelines talked about a floating action
button as a promoted action, and I felt that that wording was imperfect.&lt;/p&gt;
&lt;p&gt;I also think a lot of designers feel very constrained by Material
Design. As a result of that, we’re seeing very homogeneous designs. I
think that good designers try to step away from that, understanding that
(while there are guidelines) it absolutely makes sense to deviate from
the guidelines every now and then.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; One of the easiest ways to help someone understand good design
is to point them to applications that do it really well. Can you point
out four or five applications have good design in general (not
necessarily just Material Design)?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think that one which a lot of people have probably used is
&lt;a href="https://play.google.com/store/apps/details?id=com.todoist"&gt;Todoist&lt;/a&gt;.
It’s a todo application which I absolutely love (and I’ve tried out a
bunch). It feels like a very standard Material Design application, but
one of the things that I really like about it is a little feature called
“karma points”. It essentially promotes being a little more active in
terms of keeping track of your tasks and marking them off. They use this
small indicator, which points up or down in terms of your trend,
gamifying getting your tasks done.&lt;/p&gt;
&lt;p&gt;Another app I really like is &lt;a href="https://play.google.com/store/apps/details?id=com.foursquare.robin"&gt;Foursquare Swarm&lt;/a&gt;.
There’s a little known feature in Swarm that indicates when you’re on a
streak. I saw someone who did a 52 week streak of checking in at a gym,
and I tried to do that this year as much as possible. I got up to about
44 weeks, but couldn’t go further with that, but I still got 44
consecutive weeks of going to the gym!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty good. Donn has a three year record.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Not lately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Another one that I just came across is this little app called
&lt;strong&gt;&lt;a href="https://www.enki.com/"&gt;Enki&lt;/a&gt;&lt;/strong&gt;. It’s actually meant to help improve
your programming capabilities. They also have a small little
gamification thing which lets you know how many days in the past week
you’ve spent five minutes in the app, going through one of the
workflows. Also, they position that by telling you that all you have to
do is spend five minutes in the app. That convinces you to take that
much time out of every day.&lt;/p&gt;
&lt;p&gt;One that I came across recently, while doing some research here in
India, was called
&lt;a href="https://play.google.com/store/apps/details?id=com.fastfilmz.android"&gt;Fastfilmz&lt;/a&gt;.
I love this because it’s completely different from what you’d expect
from a Material application. Fastfilmz is a startup based out of South
India which does movie streaming in three of the languages spoken here.&lt;/p&gt;
&lt;p&gt;They have a completely different UI. One of the things that I’ve noticed
during my research on Indian users is that nobody here really uses
search. So, their entire navigation is actually based on movie stars,
because one of the major reasons that people watch movies is to keep
track of their favorite stars.&lt;/p&gt;
&lt;p&gt;During the stream itself, they have a couple of buttons on the screen
that you can tap. One of them essentially mimics a whistle for you, and
the other displays firecrackers all over the screen. If you’ve ever been
to a South Indian movie screening in a theater, you know exactly what
I’m talking about. People over there go nuts at times with firecrackers
and other stuff inside. No one cares about fire codes at all. Fastfilmz
just replicates that behavior for people on the phone itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I’m chuckling because I know exactly what you’re talking about.
Are you used to whistling in movies, Donn?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I mean, it’s going to get a little rowdy in certain theaters in
New York City, but throughout the majority of the US, if you go to a
movie theater, people may clap when certain things happen in a Star Wars
movie, but they generally just sit there and watch them. You don’t hear
a single thing. Apparently, that’s different in India. What’s it like
over there?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; It’s very dependent on the region and the stars themselves.
Bollywood films get it for Samachar, for example, but most of the other
movies don’t have it. I’ve never particularly experienced this, but I’ve
heard of a lot of people who have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Back when I was in India, there was an extremely famous movie
star named Rajinikanth. He was from South India, and he was basically
our equivalent of Chuck Norris. Some of his movies are outright crazy.
He’ll catch bullets and shove them back at people! But people have a
devotion towards him because he’s also a good person in real life. Even
though people know that what they’re seeing is completely bizarre,
they’ll go to his movies just for the experience of enjoying it with
other folks and reveling in the ridiculousness of it all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; It kind of signifies how big their user base is overall. You
could never expect NetFlix (for example) to do something like this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; It makes sense that NetFlix doesn’t do it, but Fastfilmz does.
It’s all about that target demographic.&lt;/p&gt;
&lt;p&gt;That brings up another point, then: if you’re in a startup that’s doing
well, and you’re expanding to different countries, should you localize
your app specifically to every single country that you go to? I don’t
mean the technical localization that most of us developers are used to.
I mean, do you tailor your app to the specific countries that you’re
moving toward? For example, does the Uber app need to be completely
different when used in India, China, or the US? What are your thoughts?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think it makes sense to make that investment once you know
that a market is becoming important for you. For example, I know that a
bunch of companies are starting to do a lot of research in India to
understand the market better, now that they’ve determined that that’s
where they’re going to see their next big growth. Facebook wrote &lt;a href="https://medium.com/facebook-research/embarking-on-international-research-a485cc160f22#.vkkgub31f"&gt;a great post&lt;/a&gt;
recently with their best suggestions for international research. It
doesn’t need to be a completely different app, but I wouldn’t be
surprised if there are a few things here and there that need to be
changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So, as we move forward, if I want to mimic some of these
applications that have good UIs, UX, and so forth, do I need to worry
about building a particular team in a certain way to accomplish that? If
I do, should I just start with engineers, or should I try to get a
designer first? Is there any particular way that you advise companies to
structure their teams in order to make sure that they nail their design
and UX?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; One of the benefits of the last few years has been that a lot of
startups tend to have a design founder right from the get-go. That means
that design has a significant voice at the strategic level itself. But
if you don’t have that, I do think it makes sense to hire a designer, if
you can. If you can’t afford it, I’m not going to stop you.&lt;/p&gt;
&lt;p&gt;Having said that, the biggest investment you can make early on is in
research. You don’t necessarily have to hire someone else to do it. You
probably can pick it up yourself, at least to a degree. There’s a book
by Steve Krug called &lt;a href="http://a.co/3W90Ucl"&gt;Rocket Surgery Made Easy&lt;/a&gt;
about doing user research yourself. I haven’t actually gone through it
yet, but some people whom I respect recommend it a lot.&lt;/p&gt;
&lt;p&gt;One of the strategies that I recommend early on is to understand your
target users, see what kinds of applications they’re using, and keep
your design as similar to those applications as possible. For example, I
worked with a startup recently that’s designing a chat app for customer
care. What I essentially did (in the early versions of the application)
was copy WhatsApp’s design and behavior, except for adding a little few
things here and there which I felt polished it a little bit more (like
typography).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You said that user research is pretty helpful early on. How
should I go about this specifically, as an engineer? Since most of our
listeners (in the end) are engineers/developers, I imagine they’re
interested in knowing how.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Just to add on to that really quickly: in other platforms (like
the web), there are things that can kickstart you into getting a decent
design and UX (like Bootstrap, Foundation, and so forth). Do you know of
anything similar in the Android world that developers can rely on?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think you can rely on the Material Design guidelines
themselves right now. They give you at least the basics. After that,
it’s going to be largely a case of going through the guidelines and
being aware of them.&lt;/p&gt;
&lt;p&gt;More to Kaushik’s point about what he should do, what I’m actually going
to say is: don’t get into a rush with code. I would highly recommend
taking a step back and ensuring that you spend time on your designs
while they’re in sketch. Create some prototypes for them and test them
out in InVision. That’s how you should probably go about it. There’s a
little quote from IBM’s research wing which talks about how every dollar
spent on design and research can save you about ten dollars in
development costs and a hundred dollars in post-release maintenance. I
highly recommend remembering that.&lt;/p&gt;
&lt;p&gt;The process that I would recommend is something called a &lt;a href="http://www.gv.com/sprint/"&gt;design sprint&lt;/a&gt;. Google talks about it quite a bit.
It essentially gets you to really understand your users, do a lot of
prototyping really quickly, and test it out with them—all inside a
week—so you’ll know whether your design is actually working.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So can you talk a little about design sprints? For example, if
Donn and I were to sit down and say, “Let’s build this thing together
with a design sprint integrated into our workflow,” what would that look
like?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; The first day should be spent doing interviews. Ideally, I’m
talking about interviews within your team, but if it’s just the two of
you, you’ll have to figure out who else you can do this with. In these
interviews, you’re trying to create a user journey map, where you put
the user on the left side of it and the goal that they’re trying to
reach on the right. Then you kind of draw a map of how they’re getting
to this goal currently—through an existing product, through a bunch of
products, or whatever. In this map, you essentially need to find where
the pain points are for the user. The suggestion is simply to fix those
pain points. So day one just shows you the opportunity.&lt;/p&gt;
&lt;p&gt;After that, you try to go as wide as possible. You sketch out a bunch of
different ways that you could potentially solve the problem. You’re just
doing very rough designs yourself, using pen and paper—not even touching
your laptop yet. Then you share these between the two of you or the rest
of your team, and you talk through each thing, determining what seems to
be a positive idea and what seems less strong. Then, on day three, you
essentially create a storyboard, where you agree upon how you’re going
to solve this problem. Once you have the storyboard, it becomes a lot
easier to create your designs and make a prototype, since you now know
exactly what designs you need to create. That’s the remainder of days
three and four.&lt;/p&gt;
&lt;p&gt;Day five involves finding five people whom you can test these prototypes
out on. Take them through it, and see whether or not it’s working for
them. Try to ask them questions which aren’t very leading. Don’t ask
them, “Is this the best design you’ve ever seen?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; “Is your mind blown by this design? Is this the best thing
you’ve ever seen in your entire life?” Those are probably not great
questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; One of the most common mistakes that people make in user
research is asking people whether they would use something that does
this. Particularly if the feature is free, users will almost always say
yes. It doesn’t matter whether they would actually use it or not. What
you need to do is glance at their behavior, and then understand from
that whether it’s a good fit for them or not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense. The user journey maps you mentioned are
actually pretty fascinating. Even as you were saying it, it made sense
to me. If folks are interested in coming up with an application design
or something, I imagine that that could be pretty useful.&lt;/p&gt;
&lt;p&gt;You said that you studied about different patterns. Can you talk about
that process? What were your findings, specifically on Android? Did you
discover any patterns of usage when you conducted these studies on
Android users?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; In the second half of 2016, I did a lot of research in India, a
part of a demographic called “the next billion users”. It’s not really a
marketing term, though it comes across like that. Cisco has data
pointing to an increase of about a billion internet users between
2014-2019. As you’d imagine, a lot of these users are in India itself,
where internet penetration is pretty low (but it’s picking up a lot).&lt;/p&gt;
&lt;p&gt;Companies like Google and Facebook, for example, are promoting this a
lot, but they focus on the technical side. One of the things that I
realized was that these users have never used a computer in their lives.
The first computing device that they’ve used is probably the smartphone
that they picked up. So far, they’ve only used a feature phone. So, one
goal of mine was to test out a few very different, but common patterns
(or gestures) that we have—things like search, buttons, and swipes.&lt;/p&gt;
&lt;p&gt;I gave these people very easy goals to test out with prototypes, whether
or not it works for them. That’s when I realized, for example, that
search is something they’ve never used. They have no idea, because
(since they’ve only been on feature phones) they’ve never really
performed a search. How I recognized that was by giving them a fairly
standard dialer application and asking them to dial the number of a
contact starting with the letter R. Every user would scroll down to get
that, instead of tapping on the search icon right there in front of
them. Then, when you talk to them about it, you realize that they’ve
never been taught the concept.&lt;/p&gt;
&lt;p&gt;Another thing that they’ve never really done is horizontal swipes.
Again, that’s something that (on Android in particular) we take for
granted with the top tabs themselves. When the argument of top nav
versus bottom nav comes up, we say, “Hey, you just have to swipe to get
to the next one.” But these people aren’t used to it. Even when they
figure out that this is a tab interface, they tap on the ones on top
instead of swiping through it.&lt;/p&gt;
&lt;p&gt;The buttons are especially tricky, because we take it for granted that
people will understand the icons that they have in front of them. But
the thing is that icons are sometimes not really clear to the person. We
sometimes joke about how millennials have no clue what the save icon is,
since they’ve never seen a floppy disc. But these people have never seen
a mouse in their lives. Communicating these things to them becomes even
more challenging at that point.&lt;/p&gt;
&lt;p&gt;Simultaneously, a lot of these people are illiterate, which means that
they can’t even read their own regional language, and certainly not
English. So buttons in particular get very challenging for these people.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; And these folks are still using smartphones today, even if they
can’t read the language?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; The people whom I researched about were specifically people who
had never used a smartphone. They were just about to, though, because
they had signed up to drive for Uber. I had the opportunity to go there
and interview them before they got their smartphones. A lot of Uber
drivers in India are new to smartphone itself, and you can see how
they’re struggling with much of the interface. For example, I saw one
driver on his first day who had actually missed out on cash from his
previous ride because he canceled the ride by mistake instead of ending
it. He kind of held onto me and said, “Please, end this ride for me.”
They have a button to end the ride that you have to swipe across, so he
swiped across it. Then every next button that came up after that, he
tried to swipe across. When it asked him to rate me, he tried to swipe
across to give me five stars instead of just tapping on the fifth one.
When it came time to submit, he again tried to swipe across the button
instead of simply tapping on it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wow, that’s fascinating. He’s straining his model in real-time
to understand how this interface works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; The thing that I noticed is that these people need very clear
cut affordances to make them understand what they need to do. The swipe
button at the beginning had a color gradient that comes across the
rectangular button, and he didn’t quite get that. It’s very possible
that in the bright sunlight, he didn’t even notice that glare going
across. Then he was trained to swipe across, so he just kept swiping
across every button he sees.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I didn’t even think about that.&lt;/p&gt;
&lt;p&gt;Following up quickly on something you mentioned (I’m pretty sure
everyone is interested in this): you know how Google has finally added
bottom navigational tabs officially to Material Design as well. So (you
know where I’m going with this) what are your thoughts about adding
bottom tabs, because this is something that comes up all the time?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; It’s one of those things where I’ve come to accept it recently.
It makes sense if you have a hamburger menu with options hidden in
there. Ultimately, the entire reason for the bottom nav is that the
devices are getting bigger. We’re at a point where the average device is
about five inches, and it starts getting really difficult for users to
reach the top. In that sense, I’m okay with it. I do think that you
shouldn’t just say, “I have to add a bottom nav because it’s the flavor
of the season.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So are there any interesting quirks or differences in behavior
that you’ve noticed when you’re designing for the next billion? I know
that you brought that up in your presentation at DroidCon NYC. You also
mentioned the studies you did on folks who were signing up to be an Uber
driver. Is there anything we take for granted as Android developers that
probably should be highlighted?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; As an Android developer, the biggest thing to keep in mind is
that a lot of these users don’t download your apps from Google Play. I
don’t necessarily mean that they pirate your stuff. The tend to get even
free applications through Bluetooth from their friends. There are a few
applications which are really popular over here called Xender and
SHAREit. They essentially allow you to rip out the APK of your current
application and share it over Bluetooth or local WiFi with somebody
else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That disturbs me on so many levels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I came across this with the messaging application that I’ve
worked at. One of the users was complaining about how he was unable to
receive the messages, and I asked him what device he was on. He was on a
Nokia X—and I was thinking, “How did you get the app?!” They only put
the app on Google Play, and it requires Play Services. That’s when I
came across these.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How does this work? How are they getting these apps?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Xender and SHAREit essentially allow you to rip out the APK of
an app that you have installed, and you can just keep sharing it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So I just walk up to you, and it helps us share the app via NFC,
Bluetooth, or whatever?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think it establishes a connection over Bluetooth or local
WiFi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; And that’s a completely normal thing in that region?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Exactly. It’s a complicated market. I don’t have the data to
back this up, but a few people have pointed out to me that Chrome only
has a 50% market share of mobile browsers in India, despite the fact
that Android itself has a 90-95% market share.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Wow. What other browsers are these folks using?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; There’s a browser called UC Browser that’s very popular over
here. It’s primary goal is to boost data saving, because a lot of people
are on 2G (or even 3G) connections with very small packs of data—maybe
300 MB per month.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I remember that Opera had an app called Opera Turbo which tried
to minimize data usage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I used to use Opera Mini back in my Nokia days. I think it’s
still around, but UC Browser is really big in the market right now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; The other thing you mentioned scares me, though. Sharing of
APKs… I imagine that it somehow figures out the architecture? What if
it’s an ARM architecture that’s completely different? What if it was
built specifically for one architecture? That boggles my mind. I imagine
that the app accounts for that. Play Services are a problem. The other
thing is that I imagine these are rooted phones? Otherwise, how do they
pull the APKs, since this is an external APK, not their own application?
My mind is already hurting from thinking about this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I’m just going to make it worse for you: users in India do not
tend to update their apps as quickly as you would expect. Once you put
an app out there, it’s going to stay around for a very long time,
installed on these people’s devices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; And shared across multiple devices, so it compounds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Be very careful of what you push out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Folks, no bugs. Ever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; There are so many folks out there included the next billion, so
I’m just going to stick to the region of India, which is where you have
the most experience. What kind of devices do they mainly have? If you
had to guess (I’m not looking for exact data here), how many folks are
currently using a smartphone, versus a regular old feature phone?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; If I remember correctly, the number is around 300 million
smartphone users. The Internet Association over here points to about 400
million Indian internet users. A lot of us don’t believe that to be
true. Facebook shared some data recently about it’s 170 million users in
India, so I think the number is probably going to be closer to 250
million or so. What could be happening is simply that these people &lt;em&gt;are&lt;/em&gt;
internet users, just very, very infrequently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If I’m designing an application, taking into consideration these
next billion users and all of the things that you’ve talked about—from
folks swiping buttons because they’re still learning, to people being
introduced to mobile phones in general—what’s the lowest common
denominator that I should be designing for? Are there any tips and
tricks you can provide to developers so that they can give their app the
best chance of being user-friendly to that next billion?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; I think a lot of us take pride in not having tutorials in our
application. We don’t want any coach marks or stuff like that. You need
to realize that these people are trying to pick up the design of your
application itself. Especially if you’re using gestures, something that
might seem easy to you is probably not the so easy for other people,
even those who have regularly used smartphones previously. Providing
menus, suggestions, and stuff like that helps.&lt;/p&gt;
&lt;p&gt;Of course, that also means that you don’t just do one tutorial. What
I’ve found from my limited tests so far is that it really helps when
tutorials are done in context. What you want to do is design your
application in a way that promotes performing a certain action on the
first try.&lt;/p&gt;
&lt;p&gt;For example, there’s an application in India called
&lt;a href="https://play.google.com/store/apps/details?id=com.phonepe.app"&gt;PhonePe&lt;/a&gt;.
It’s a new application for transferring money from your bank account to
another person’s bank account using a pretty popular framework over here
called UPI. They’re trying to promote people at least making their first
transaction, because getting them to use their phones for banking is
pretty new here. So they’re saying, “Even if you just transfer 1 rupee,
we’ll give you 50 rupees back.” A lot of people are doing that just to
get the cash back, but the huge power of it is that it gets them to
realize how simple it actually is to do this. Once someone experiences
your application this way, it gives you a better chance to bring them in
the next time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; They’re betting on convenience being the thing that wins them
over eventually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Exactly. The other side of it, of course, is the fact that it’s
essentially going through the old Dropbox referral system. They’re not
spending money on user acquisition through Facebook ads or something
else. They’re just giving it to the users themselves.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; A quick follow up question to that: you mentioned that, in order
to maintain that high level of quality, you sometimes need to do in-app
tutorials and a wizard-like interface. Are there any examples you’ve
seen of applications that do that pretty well?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; The problem is that I can only point out the ones that do this
really badly—the ones that give you all of the tutorials right at the
beginning, and you’re just blindly skipping through them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s a great point. When I think of the simplest
implementation of what most folks call the “new user experience”,
usually it just stores in your shared preferences, “If it hasn’t been
activated before, load this new user experience.” What’s going to happen
if it’s a new device? Essentially, you’re just going to have four of
these new user experiences popping up, one after the other. A good way
to handle that would be to actually provide it with context. When folks
use that feature, that’s when you pop it up for the first time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; One thing I can think is called “activation”, where you’re
trying to get your user to harness the real power of the app. Twitter
does this really well when they’re trying to get new users to follow a
lot of accounts at the beginning. They’ve determined that when people
follow a lot of users, they stay engaged for longer. Previously, they
would just push up certain accounts, but now they make you point out
what your interests are and try to make you follow accounts based on
that. It’s not really coaching, but it gets a user to invest in your
application early on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Actually, that’s a better definition of what a new user
experience would be: “How you get a new user to ‘get’ your product.”&lt;/p&gt;
&lt;p&gt;Stepping back from a little from user experience, since we have an
opportunity to actually talk to someone who understands both engineering
and design, what are some common design trends that you think work well?
Or even if there are some design trends which you don’t think work well,
maybe you can let us know. Many times, we’ve noticed that a lot of the
Android design aesthetic is suggested by the developers themselves,
because designers tend to be iOS-focused. That’s just the nature of how
things started. Many a time, I’ve found that the suggestions for Android
applications come from the engineers themselves. So what are some design
trends that you think work well, and some things that we should be aware
of?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; On Android in particular, a good Material Design app is a given
at this point. Users now expect it, so you have to meet those guidelines
to have an application which does even half-decently.&lt;/p&gt;
&lt;p&gt;A new trend that’s taken over this year is something called “complexion
reduction”. The focus of this is to remove as much complexity from an
interface as possible. That means a lot more white spaces and a lot less
color, and tends to mean a lot more line icons and things like that. The
point of it is to get straight to the content itself. It’s used by
applications like Instagram, Medium, and Uber, and it works really well.
What happens is that point where you really want users to focus is where
most of the color and other stuff lies, so it points their attention
over there. Human beings have a desire to just reduce the complexity of
anything that they see to its bare minimum, and this fits in right
there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. Would you say this is similar to iOS 7’s flat
design, where everything was just a line or a box? I assume this is a
little different from that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; Flat UI essentially means that you don’t have a z index. You
might have fake depth in the sense that users may perceive a background
and a foreground, but you’re essentially completely flat. Complexion
reduction doesn’t worry about that. You can still have the drop shadows,
but you’re going to use them a lot more carefully. For example, you
would probably not want a Card UI with shadows in a simple list view.
That just adds color on your screen when it doesn’t need to be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; As Android developers, we don’t necessarily get the time to
think about these things in such detail, so this was super helpful.
Thank you so much, Raveesh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; You’re welcome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; If folks want to reach out to you and throw in some more Android
developer questions, what’s the best way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RB:&lt;/strong&gt; You can reach me at Twitter. I’m
&lt;a href="https://twitter.com/raveeshbhalla"&gt;@raveeshbhalla&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Excellent. If folks want to draw out on your startup experience
and all of the wicked designs you’ve been working on, Donn, how do they
do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You can reach me at
&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;, which would be the best
way. But Kaushik, how do folks get ahold of you and your wicked design
skills?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I don’t know about wicked design skills, but if you want to
reach out to me, &lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; is
usually the best way. Thank you folks for listening, and thank you so
much for joining us, Raveesh.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/71/</guid><pubDate>Mon, 23 Jan 2017 05:00:09 UTC</pubDate></item><item><title>070: An honest discussion about Realm</title><link>https://fragmentedpodcast.com/episodes/70/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/50645e76-77d4-4d51-abe6-395c86b49535?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/50645e76-77d4-4d51-abe6-395c86b49535/070_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik have an honest discussion about Realm (a client side database). Donn has worked pretty extensively with Realm and even consulted for their Android platform previously. But Kaushik has only recently tried it out on a production app.&lt;/p&gt;
&lt;p&gt;In this episode they have an honest and frank discussion about using Realm, the advantages, the disadvantages, the gotchas and if it makes sense to use a database like Realm as an Android developer today.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/27/"&gt;Fragmented episode with Realm Android developer Christian Melchior&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/sqlbrite"&gt;Sqlbrite by Square (Reactive SQLiteOpenHelper wrapper)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.pushtorefresh.com/2015/07/02/storio-modern-replacement-for-sqlitedatabase-and-contentresolver-apis/"&gt;StorIO: wrapper for SQLite or ContentResolver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realm.io/docs/java/latest/#auto-updating-objects"&gt;Feature: auto updating objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/064/"&gt;Fragmented episode on GC vs Reference counting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/tree/master/examples/rxJavaExample"&gt;Realm RxExample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www2.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf"&gt;The problem with Threads – Edward Lee&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sync-stuff"&gt;
Sync stuff
&lt;a class="heading-anchor" href="#sync-stuff" aria-label="Link to Sync stuff"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realm.io/products/realm-mobile-platform/"&gt;Realm Mobile platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inessential.com/vespersyncdiary"&gt;Building a sync engine (Vesper Sync diary)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="github-issues-tracked-on-realm"&gt;
Github issues tracked on Realm
&lt;a class="heading-anchor" href="#github-issues-tracked-on-realm" aria-label="Link to Github issues tracked on Realm"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/issues/1129"&gt;Request: Compound primary key support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/issues/2538"&gt;Request: Value object support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/issues/1470"&gt;Request: Custom column names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/issues/931"&gt;Feature: Copy from Realm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realm.io/docs/java/latest/"&gt;Latest Realm docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/tag/realm-course/"&gt;Caster.io series for Realm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://buddybuild.com/?ref=fragmented012317"&gt;BuddyBuild&lt;/a&gt; is a continuous integration and continuous deployment system built specifically for mobile developers. Thousands of development teams love BuddyBuild because it’s the fastest way to build, distribute and gather feedback for their apps. Give it a try for FREE at &lt;a href="http://buddybuild.com/?ref=fragmented012317"&gt;buddybuild.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; So, Kaushik, we don’t have anyone on the show this week.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; No, we don’t, so we thought we’d catch up on these chats we have all the time. We keep telling folks, “Donn and I talk about this all the time, and one day, we’ll do an episode about it.” This is one of those days. We’ve decided to capture one of our chats and push it out as an episode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, for folks who don’t know, we usually have chats after we hop off the call for our recordings. We’ll intend to chat for about five to six minutes, full of catching up, saying “Hey, I’ll do this and you do this,” and other follow-up stuff—but then it turns into an hour-long chat about technology, and we think, “Well, that would’ve been great to record.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That has happened way more often than you’d think.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Exactly, so we’re hoping to capture more of that today. One topic that’s come up a few times in those chats is &lt;a href="https://realm.io/"&gt;Realm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yeah. Some time back, we had &lt;a href="https://GitHub.com/cmelchior"&gt;Christian Melchior&lt;/a&gt; on the show, and we &lt;a href="http://fragmentedpodcast.com/episodes/27/"&gt;talked about Realm&lt;/a&gt; in great detail.&lt;/p&gt;
&lt;p&gt;Recently, my team at Instacart started to experiment with Realm for one of the apps that we make. I know that you have a lot of knowledge about Realm and have worked very closely with that time, and I had a lot of questions, so I pinged you a bunch of times. I also pinged the Realm team a lot. Several extremely interesting things came up, so I thought, “Hey, why not just hop on a call with Donn and see where it goes from here.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Definitely. I’ve been using Realm for a while. In fact, we first talked about it back in one of our first few episodes. We mentioned it in the “Awesome Picks” section we used to have. Ever since then, I’ve been highly interested in it, because I come from with Rails (and a few other programming languages that have some kind of active record system built-in), and I’ve always wanted that functionality with Android. I’ve tried other ORMs, but none of them ever felt like they were “it”, even though they did a good job. I never felt like, “This is awesome!”&lt;/p&gt;
&lt;p&gt;But right out of the gate, I was attracted to Realm. Like you said, I started working with it for a while, building it into various apps. I recently released another app that’s gaining a lot of traction, and it’s all Realm-based.&lt;/p&gt;
&lt;p&gt;For me, it makes sense to use it because I like it and I’m very familiar with it, but what got you thinking, “You know what? It’s time to start evaluating other data persistence mechanisms”?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; At least in the app that I experimented with, we started out with a flat JSON structure. Any persistence that we needed was serialized into a JSON file and stored in the external storage area. This was done for many reasons. Historically, when we started out, we decided that we didn’t want to use a full-blown database since only a few models—the user preferences, and maybe one other object—were persisting. In those early days, our app was also heavily driven by a web-based architecture. Essentially, it served as a shell for a glorified web service. It wasn’t a &lt;code&gt;WebView&lt;/code&gt;, but it used a lot of APIs. Pretty much everything came down through APIs. Essentially, every screen was an API hit, because the state was managed on the server side.&lt;/p&gt;
&lt;p&gt;For the longest time, that structure worked out pretty well for us, but it got to a point where the app was far more sophisticated than that. Also, there’s been a shift recently towards thinking about mobile devices as mini computers, because they’re pretty powerful. You can do some very cool stuff with them. So, to get the best experience, we wanted to move toward doing everything on-device.&lt;/p&gt;
&lt;p&gt;The flat JSON structure we used worked pretty well, if you think about it in terms of performance. Realm has amazing performance compared to SQLite and a bunch of other alternatives. That’s one of their tagline features, in fact. They say, “Hey, we’re way more efficient than any alternative you can use.” For the most part, I think that’s completely true. But in terms of performance, I still think that a flat file structure is comparable to (if not better than) Realm. Again, there are many caveats. It depends on how deep your structure goes and how complicated the serialization is, so take that with a grain of salt. But at least in my experience, I’ve found that they were similar in terms of performance.&lt;/p&gt;
&lt;p&gt;So what really won us over was when our objects got complicated enough that there were two relationships between them. There were nested objects. To give a simple example, think of a chat conversation, which has chat messages. Those messages might have small sub-objects—say, different kinds of messages. Anyway, it was getting to the point where relationship queries were a little more difficult. When we used a flat JSON file structure, we essentially had to write the entire ORM layer ourselves. We had to write queries, and really dive into serializing those objects, and filtering them with list queries. It was getting a little crazy, and we were thinking, “At this point, we should be exploring a database for our convenience.”&lt;/p&gt;
&lt;p&gt;I know you talk about Realm a lot, so I said, “Hey, this is a great opportunity, because we don’t want to lose the advantage we have in terms of performance.” That’s what got me started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, I think it’s important to note that there are ways to both use and misuse various tools. You can use Realm incorrectly and make it slow. You can use SQL incorrectly and make it slow. On the flip side, you can optimize the various SQL ORMs to be very fast. In other words, we’re not trying to say, “You have to use Realm!” Use whatever tool is right for the job. If you’re familiar with SQL, and you want to use a SQL RxJava client, do it. If you want to use an ORM, do it. But if our conversation sparks your interest, then give Realm a try.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; This is one of the reasons that &lt;a href="https://GitHub.com/square/sqlbrite"&gt;SQLBrite&lt;/a&gt; was created. The developers got comfortable with writing SQL queries, so they added that layer to make it reactive. That’s also gotten a lot of traction.&lt;/p&gt;
&lt;p&gt;So, what was your tagline feature? What made you think, “Okay, this is why Realm is really cool”? Let’s talk about what really won us over, in terms of development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; The first thing that really struck a chord with me came a couple of years ago when I looked at the first example: I would be working with straight Java objects. I didn’t have to write in another language. A lot of times people who are familiar with both SQL and Java will think, “They kind of work together.” Not really. There is an adapter built between the two systems, but SQLite runs on its own engine, and then Java code runs your Android application. You still have to write SQL (Structured Query Language) code to talk to the database.&lt;/p&gt;
&lt;p&gt;With Realm, I don’t have to do any of that. I just say, “Hey, here’s an object” and use the &lt;code&gt;.save()&lt;/code&gt; method—and suddenly, everything is in the database. If I want to get it back out, I say, “Hey Realm, go get all objects from the ‘person’ class, and find the guy whose name starts with ‘Donn’.” Then it gives me that object back, and I can work with it. And I thought, “Well, that’s awesome.” That was the initial spark that got me going.&lt;/p&gt;
&lt;p&gt;What really solidified it for me was one of those side projects that we all have. I fired it up and said, “You know what? I’m going to try Realm.” It was a simple to-do list app, so I said “Alright, I need a database,” and I created a couple of objects. Then I needed to save them, and later retrieve them. I thought to myself, “I spent just 15 minutes learning this and setting it up, and I’m already saving data. I don’t have to do anything else.” That’s what blew my mind. It was way more productive than building a SQL table, making sure to hydrate, setting up &lt;code&gt;ContentValues&lt;/code&gt;, and deciding whether to use a content provider, a loader, or something else.&lt;/p&gt;
&lt;p&gt;So what interested you? I mean, I’d already been in your ear about it before, but other than that, what attracted you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; The simplicity was definitely a big win. Like you mentioned, the fluent interface made it so easy to work with queries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; For folks who’re wondering what he’s talking about, when you query a Realm database, you basically say, “Hey Realm: go look for the people in the person class. I want you to find all the people whose name starts with ‘D’.” You literally just chain these operations together, and you get back a list. And it’s not just a &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;. No, it’s a &lt;code&gt;RealmList&lt;/code&gt;, which is a souped up version of &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;. It has a bunch of extra features for Realm itself, so you can do updating and so forth. But it just makes it so easy to query.&lt;/p&gt;
&lt;p&gt;The other thing that I really loved about Realm when I first started was that everything was done on the main thread. I’m sure villages are burning down right now, as I say that! But it was so fast, and they said, “Look, you can just run this on the main thread, because it’s fast.” We can get into why that is shortly, but I tried it, and it was so fast that I never had any problems. They now have an asynchronous API, which can do things on a different thread and return them to you, and their advice is to use that if you’re concerned with it not being fast enough. But, to make a long story short, I was blown away by how fast it was.&lt;/p&gt;
&lt;p&gt;There’s also the &lt;a href="https://GitHub.com/realm/realm-browser-osx"&gt;Realm Browser&lt;/a&gt;. Realm is pretty popular in iOS, so let’s say that you go to a company, and they say, “We have this iOS app, and we need you to create an Android version.” That happens all the time. Well, if they’re using Realm, they can actually open the Realm file inside of the Realm Browser (which only exists on macOS right now), and use the file to create the basic Java classes for the app. The browser will generate all of the classes for you, so that can easily share modeling between the two different apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I read about that, but I didn’t realize that that was the benefit. That’s pretty slick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You’re not really sharing between two different platforms (you’re just sharing the model files), but it helps you get jump-started. Android and iOS developers are probably going to model things a bit differently, but if you’re building an app with a lot of models, that’s still going to help you jump-start your application.&lt;/p&gt;
&lt;p&gt;So I saw all of these things, and I thought, “Wow, this is pretty freakin’ cool.” I didn’t even learn about the reactive features that really make Realm shine until I actually started working with their team. We’ll get into those shortly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s definitely something I want to talk about, because it’s essentially what won me over. I basically said, “We’re definitely going to Realm because of the reactive architecture.”&lt;/p&gt;
&lt;p&gt;But to step back, you mentioned the fluent interface and queries. Now, some folks might think, “Is it really that tricky in SQL? Is there really any benefit to that?” There was one query that I wrote that made me think, “Wow, this is so much easier.” When you have a list and you want to negate queries, you use not equal to. It’s a very common condition. For instance, “Pick all the messages that aren’t read,” or something along those lines. When you want to run the not query in Realm, it’s done beautifully. I was really surprised, because all you have to do is throw a &lt;code&gt;.not()&lt;/code&gt; on any condition inside a &lt;code&gt;.beginGroup()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If I had to implement that back in my file structure days, I’d have take that list and run a filter on it. I’m not saying it’s difficult to do, but Realm makes it ridiculously simple. In the end, that’s what we want. We don’t want to spend our time filtering lists, taking lists, converting between arrays and lists, and making sure something is an array list. We shouldn’t have to deal with such simple things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Like you said, you can filter your code, but you’d end up checking nulls and doing sorts of other stuff. You actually end up with quite a bit of (very simple) plumbing code to get the data that you need. Like you said, if you’ve set your column width to be wide enough in Lint, you could (quite literally) fit the whole query for Realm into one line of code. You just say, “Realm, get me all of the people whose age is not less than 5.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Their fluent API works really well.&lt;/p&gt;
&lt;p&gt;When you brought up the reactive architecture, you said that &lt;code&gt;RealmLists&lt;/code&gt; are just a really souped-up version of &lt;code&gt;list&amp;lt;t&amp;gt;&lt;/code&gt;s—as in, they have some crazy features. This is another thing that won me over, so let’s spend some time on it. It’s really cool, though I don’t think it gets much credit in the documentation. When I actually saw it working, I thought, “Whoa, this is mind-blowing.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’m not consulting with Realm anymore, but I was at this time last year. And last November or December, I read through the documentation, talked to a few guys on the team, and learned about &lt;code&gt;RealmLists&lt;/code&gt;. And I thought, “Whoa! This is actually the really sweet stuff in Realm, and nobody really knows about it.” They call it the “reactive architecture” or the “auto-updating objects”.&lt;/p&gt;
&lt;p&gt;I’m going to give an example here. Let’s say that I have a list of ten person objects in a database. Then I make a query that says, “Hey Realm: go get me all the person objects whose age is greater than 18,” and I get back a &lt;code&gt;RealmResult&lt;/code&gt; with 5 people in it.&lt;/p&gt;
&lt;p&gt;Now, for some reason, let’s say I have an Android &lt;code&gt;IntentService&lt;/code&gt; doing something else in a different thread in the background. Maybe it’s doing a pull from my server to check for new items or respond to a push notification. All of a sudden, it says, “I need to update some data in the database,” so it pulls down some stuff from the API and starts updating the Realm database. Suppose it adds another person to the person table (if you want to call it that). That person is age 30, so he or she should be included in that query now.&lt;/p&gt;
&lt;p&gt;Behind the scenes, Realm updates the list for you. It’s actually updated on every iteration of the Android run loop, so you can attach a change listener to an object, a &lt;code&gt;RealmResult&lt;/code&gt;, or even the whole Realm database itself, and say, “Hey, any time this data is updated, call me back.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I didn’t really understand this until I saw it happen. Folks, you can attach listeners to your whole database. You can say, “Any time anything in my database is updated, notify me.” That’s crazy! Whether you should really be doing that is another issue, but the fact that it allows that is pretty cool. You can also attach a listener to this object—say, a “persons” table: “Anytime anything changes in the persons table, send me a change notification.” You can even attach one to a query. You can say, “Hey, I’ve executed this really complicated query where I’ve negated all of these conditions and get a list back. If something in that set of elements changes, send it back to me.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, it could be an object getting updated, a new object being inserted, or another being deleted. It’ll say, “Hey, something has changed in this query result, so we’re going to call you back, and you can do something with it.” It’s completely reactive. You aren’t pulling the database. Instead, the database itself is actually telling you, “Hey, this changed. Go do something.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; When I heard about this in a casual conversation, it didn’t really hit home. I thought, “Oh well, I get that with RxJava anyway. I mean, I can build that architecture myself, so why is it really that amazing?” It took me some time to understand why it was so cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; One of the reasons why it was so cool to me was that I could actually create essentially a unidirectional data flow application. For example, let’s say that I’ve made a kiosk application that’s running in the mall, showing data about how many people are currently in the building. As they walk by a sensor, it updates the data in the database, and everything happens in the background. Your application doesn’t need to do anything. It just respond to these notifications. All of a sudden, everything is super reactive.&lt;/p&gt;
&lt;p&gt;On top of that, if you’re just using the core Realm concepts and you want to use something like Rx, you can. They actually have Rx bindings. Have you used them at all yet?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yes, those are basically what I use, because I’m very comfortable with Rx. I try to switch an element morphing to Rx, as a personal preference, because I understand it decently well. I feel very comfortable with it because I understand the things that happen in it.&lt;/p&gt;
&lt;p&gt;The interesting thing about this is that you can attach to it as a change listener or to the first-party bindings (as you said), so you can switch directly to Rx and still get all of these benefits. The reason I think that’s interesting is because if I did have to implement this in Rx—which I could totally do—the complexity arrives in two levels.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I’d have to keep executing the query. Otherwise, how else would I know that the database had changed? Alternatively, I could use another option, like SQLBrite or &lt;a href="https://GitHub.com/pushtorefresh/storio"&gt;StorIO&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Secondly, I might have to use something like a &lt;a href="https://GitHub.com/ReactiveX/RxJava/wiki/Subject"&gt;Subject&lt;/a&gt;, which (again) you can do if you understand Rx well enough, but it’s still boilerplate that you have to write manually.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are both things that you get automatically, for free, by using Realm. The first-party bindings are as simple as adding &lt;code&gt;.asObservable()&lt;/code&gt; Boom! It’s converted to Rx. It’s funny that the example you gave was so similar to what I wanted to achieve, which pushed me toward using Realm in the end.&lt;/p&gt;
&lt;p&gt;At Instacart, we had this chat conversation model. As our customers are navigating and doing things on their screens, if they let us know about a change that they want made to their order, it’s extremely important for us to get this to the shoppers. So we basically had a shopper/customer model: we want the shoppers to immediately see any customer notifications.&lt;/p&gt;
&lt;p&gt;I’m not going to go into the details of the business logic, but it was extremely important that, no matter what activity or screen shoppers were on, that message needed to surface immediately. That was ridiculously simple to implement. All I did was create a &lt;code&gt;RealmObject&lt;/code&gt; for the chat conversations, and any time it updated, it would know immediately and pop up the unread indicator. All I did was write one-time logic to query the model, and then I said, “Hey, listen to this model on the screen.” Boom! I got that for free on every screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I think you mentioned this already, but I want to make it very apparent: if you’re querying Realm and you want to get an Observable back, you literally just add a method on the result that says &lt;code&gt;.asObservable()&lt;/code&gt;. It gives you an Rx observable, and from then on, you’re off to the races with Rx.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That was really compelling to me, because having to implement this by hand is pretty tricky. But there were some other things that I found interesting. This is a little more meta, but the way they do their development really impressed me. Realm is entirely open-source, and they don’t just do that as a way to get brownie points from developers. As I got interested in Realm, I started to poke around in the code and the GitHub issues to see how things were done. There are some things in those issues which are still lacking in Realm, and we’ll get to those shortly. But any time I had a doubt, I would do is hop onto the GitHub database and look around. It’s impressive how responsive the core team is.&lt;/p&gt;
&lt;p&gt;In fact, that’s another thing I wanted to talk to you about. What are your thoughts about the core team and how they do their open development? You’ve worked firsthand with them, and I’ve seen a couple of your comments in the database. So, how has that been?&lt;/p&gt;
&lt;p&gt;To me, it’s really impressive. They’re very structured, and it seems like a no BS situation. They’re not trying to impress you. They’ll say, “Hey, this is in our road map, so we’re going to do this.” Or, “Okay, these are the different points which we have to think about. We have these other considerations, so how can we attack this?” They’re very, very clear, in terms of their process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Interestingly, they’re actually quite distributed, geographically. They have offices in San Francisco and Copenhagen, but (as he said in our previous episode) Christian actually lives in a totally different part of Denmark. Long story short, developers all over the world work for Realm, and they do it very effectively. They do all their development right out in public, so if there’s something that needs to be done, like a new feature idea, they’ll throw it right there in the GitHub issues.&lt;/p&gt;
&lt;p&gt;In fact, if you ever have a problem, the best place to go is the GitHub issues. Search through those to see if it’s been solved, because someone has mostly likely already asked the question. They have an internal Slack group where they discuss new tickets as they come up—”Alright, how should we handle this one? Okay”—and then boom! one of the team members replies, if someone hasn’t already. It’s very, very interactive, and they take every single thing from the community very seriously.&lt;/p&gt;
&lt;p&gt;You’ll see lots of issues linked to other issues: “Hey, we’re covering this over here.” In fact, a lot of times when I have an issue that I can’t figure out, I’ll ping one of the guys on the team and say, “Hey, I’m trying to do this,” and the first thing they’ll do is link me to a GitHub issue which I didn’t find and say, “We’re already handling it right here,” “It’s coming,” or “Yep, we fixed that two weeks ago. It’s in this release.”&lt;/p&gt;
&lt;p&gt;They do this with all of the bindings: with Realm Java, Realm Cocoa, Realm Core, etc. They have discussions right there. Sometimes, they’ll do planning right there in the GitHub issues. They’ll say, “Okay, here’s what we’re thinking. This is the current plan.” They’ll even create little example test branches and push them, saying, “Here’s what we’re thinking. Please provide feedback.” Then the community hops in and interacts from that point onward.&lt;/p&gt;
&lt;p&gt;Furthermore, they’re also very active in different communities. If you’re in the various Android development Slacks, their folks will sometimes be in there. They’re also very active on Stack Overflow. If you happen to post a question there, some of the team, like Christian and &lt;a href="https://GitHub.com/emanuelez"&gt;Emanuele Zattin&lt;/a&gt;, are answering those questions. So they take everything seriously, and it’s fantastic to be a part of it. If you’re ever interested to see how things are done there, just hop into the Realm issues, and you’ll see a whole bunch of stuff going on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I think they do a phenomenal job. It must be said that these folks who work at Realm are some extremely smart people. People sometimes ask me, “Hey, why do you always recommend Square libraries? There are other libraries.” I always answer, “There are, and if they’re good, I’ll start recommending them. But I’ve noticed this bizarre correlation that when you have super smart people working on a library, it tends to be pretty good.” I think that holds true here.&lt;/p&gt;
&lt;p&gt;Some of my friends have mentioned that Realm also has some open-source libraries for the iOS platform—for example, a Swift linting library that’s apparently pretty well known. They know what they’re doing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; They contribute to the community in many other ways too. Go to &lt;a href="https://GitHub.com/realm"&gt;their GitHub page&lt;/a&gt;. Everything is open: &lt;a href="https://GitHub.com/realm/SwiftLint"&gt;SwiftLint&lt;/a&gt;, &lt;a href="https://GitHub.com/realm/realm-java"&gt;realm-java&lt;/a&gt;, &lt;a href="https://GitHub.com/realm/realm-core"&gt;realm-core&lt;/a&gt;, &lt;a href="https://GitHub.com/realm/realm-dotnet"&gt;realm-dotnet&lt;/a&gt;, and all kinds of other things.&lt;/p&gt;
&lt;p&gt;Also, a lot of people who are reading this have probably videos on the Realm website. They’re very active in recording lessons and giving content back to the community. That’s been a big help.&lt;/p&gt;
&lt;p&gt;But to rewind for a second to your point about intelligent folks, I can’t agree more. I was talking to some of the core guys, learning about some of the internals while I was helping to write the documentation, and some of the things that they explained to me melted my mind: “What did you just say? Whoa, that’s crazy!” They’re very intelligent.&lt;/p&gt;
&lt;p&gt;Now, you actually learned a lot by just browsing the repositories, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Absolutely. If I wanted to understand how something worked, I would just hop onto certain issues. The other funny thing is how they would cross-link between repositories. Sometimes I would see an issue that said, “Hey, this happens because of x in Realm Core, so we’re waiting on that app.” Then they would link to the other issue, and I would follow the thread.&lt;/p&gt;
&lt;p&gt;Just going through the repository is immensely helpful. That’s the advantage of open-source. I mean, many folks in our community can see the open-source code (even if it’s in the AOSP) and understand why a certain thing happens. It works really well: you have the code, and you can just dive in and see what’s happening. That’s the truest form of documentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; But by the same token, it’s also a huge problem: some things are not as exposed as well as they could be. You can hop into the code and say, “Oh, that’s how it works,” but it could have something that could have easily been exposed through the documentation. That’s one of the downsides of Realm: sometimes, there’s so much going on that you don’t even know something is there. Again, I know from speaking with the team that that’s something they’re working on. But if you do want to understand it, as I said in &lt;a href="https://twitter.com/donnfelker/status/819200058910527489"&gt;a recent tweet&lt;/a&gt;, go look at the source code.&lt;/p&gt;
&lt;p&gt;If you have a problem, they’re also very open to bug reports. Look at the contributor list—it’s massive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; At this point, people might be reading this and thinking, “Hey, these guys are really pushing hard for Realm. What’s the deal with that?” It isn’t all sunshine and roses. Even to this day, there are some problematic areas, and I think we should spend some time on that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Definitely. What are some of the things that you ran into, and felt like, “Okay, this is still a little painful”?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; The first thing I wanted to bring up is actually the primary key situation. Like an database, Realm uses primary keys. The strange thing is that they &lt;a href="https://github.com/realm/realm-java/issues/1129"&gt;don’t have compound primary keys&lt;/a&gt;. What are compound primary keys? Let’s say you have an object and you select “ID” as your primary key. All is good there. You just slap on the primary key annotation, and you’re ready to go. But if I wanted a combination of two keys—for example, a person’s name and email address—to be primary keys (which is very common), that’s not possible. There is a workaround, but you can’t just apply the primary key on more than one attribute. Realm is not happy with that.&lt;/p&gt;
&lt;p&gt;I found that very perplexing. I thought, “I don’t understand the internals, but that isn’t too big of a thing to ask. I want a combination of two fields to be the primary key.” I found that interesting, because my use case involved a model that comes down from a server, so I don’t necessarily dictate what the ID is. The server sends back a JSON response which says, “Hey, the combination of this type and this ID is unique. The ID alone is not unique, so you have to take into consideration the object’s type.” That basically means that I need a compound primary key, but I couldn’t directly achieve that with Realm. What are your thoughts on that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s something I’ve seen a few people complain about as well.&lt;/p&gt;
&lt;p&gt;The other thing that really bothered folks for a long time is that you have to extend &lt;code&gt;RealmObjects&lt;/code&gt;. A lot of people don’t like being forced to extend anything that they don’t create themselves, but that’s how a lot of the bindings were created. A lot of the stuff was done in an annotation processor, so the code was written for you. That’s where you get all of your helper methods from: “Hey, is this object valid? Can I find this query? Can I delete the object?”&lt;/p&gt;
&lt;p&gt;They’ve recently implemented the &lt;code&gt;@RealmClass&lt;/code&gt; annotation, so you don’t have to extend &lt;code&gt;RealmObjects&lt;/code&gt;. The only difference there is that you have to use other helper methods (the Realm static methods) to actually get things working.&lt;/p&gt;
&lt;p&gt;Then there’s the thing that a lot of folks are very heavy on using: value objects, which we recently &lt;a href="http://fragmentedpodcast.com/episodes/66/"&gt;talked to Ryan Harter about&lt;/a&gt;. That’s &lt;a href="https://github.com/realm/realm-java/issues/2538"&gt;not implemented yet&lt;/a&gt;. There are a bunch of tricky things going on if you want to use immutable value types in Realm. It’s very interesting.&lt;/p&gt;
&lt;p&gt;Have you noticed anything else? I remember you talking to me about getters and setters at some point. Did you ever work that out?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; It’s kind of funny, actually. This is very, very perplexing when you start up, but they have it in their FAQ, so if you look through their documentation, you’ll reach this at some point. Suppose I’m debugging an application. If I’m in a class, and I want to check what the value of an object is, I’d normally pull the object and add &lt;code&gt;.name()&lt;/code&gt;. For instance, if I have a variable called &lt;code&gt;m_person&lt;/code&gt; (I’m using Hungarian notation here, just because it makes it easy to explain), I’d say &lt;code&gt;m_person.m_name()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But in Realm, it will return null. In fact, all of the values will be null. And you’ll wonder, “What am I doing wrong? Did I understand Realm incorrectly? What’s happening?” It took me some time, but I eventually realized that it’s a very different model (this is something you should note) where getters and setters are actually pretty important. They’re not just regular, POJO getters and setters. Realm has this thing called a proxy class that works a little differently. Instead of saying &lt;code&gt;m_person.m_name()&lt;/code&gt; and accessing the variable directly, if you say &lt;code&gt;m_person.getName()&lt;/code&gt; and use the actual accessor method, you’ll find the value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; This actually segues back to the previous topic about how Realm is so fast. I’m gonna give you the 30,000 foot view here. When you’re working with one of those objects and you say, “Hey, get me the name of the object,” it actually reaches directly into the Realm database to give you that value. It’s not querying the database, loading it into memory, putting it into some buffers, copying it over, and finally bringing it to you (and by then the data is out of date). It’s actually reaching directly into the database and saying, “Give me that name.”&lt;/p&gt;
&lt;p&gt;If something was to happen in the background, and the name changed from “Donn” to “Kaushik”, and you pulled it both now and two seconds later, when you pulled it again it would say “Kaushik”. You’re not working with a copy, but with the real database. Besides, all of that code is inside the core, which is C++ from the ground up. That’s another why it’s so fast. So it’s literally reaching directly into the database, and the proxy helps get that done. That’s probably one of the reasons you saw that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s so interesting. I didn’t realize that. It’s almost like you get the best of both worlds: it’s lazy loading (in some ways), but it’s actually direct loading. Now that I realize what that is, that’s actually pretty cool. But still, watch out for that.&lt;/p&gt;
&lt;p&gt;One quick follow up question: since you typically use Realm, do you use the composition style or the inheritance style? Do you extend &lt;code&gt;RealmObjects&lt;/code&gt;, or do you use &lt;code&gt;@RealmClasses&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’ve been using Realm since before the &lt;code&gt;@RealmClass&lt;/code&gt; annotation was around, so I just use inheritance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s another thing. I’ve noticed that some things just inherently work better if you extend &lt;code&gt;RealmObjects&lt;/code&gt;. For example, if you don’t want to have getters and setters, and you just want to have basic public fields, I’ve found that it tends to work better with a &lt;code&gt;RealmObject&lt;/code&gt;. That might just be a bug or something, and I apologize because I don’t remember the specifics. Also, if you just stick to using getters and setters and use it as advertised, it works without too many issues, but the minute you start to customize the objects, you run into issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I stick with inheritance. It works for me. But there are some folks who do prefer the &lt;code&gt;@RealmClass&lt;/code&gt; annotation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I use &lt;code&gt;@RealmClass&lt;/code&gt; myself. One of my reasons for that is that I already had a model defined in POJOs in my application which already implemented certain things and extended certain classes. I didn’t want to complicate those things, so I just slapped on the annotation that said “Hey, this is a &lt;code&gt;@RealmClass&lt;/code&gt;. Implement the &lt;code&gt;RealmObject&lt;/code&gt;.” Basically, that was an easy way for me to not disrupt the existing state of affairs in my application and still get going with Realm, so I stuck to just using that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s a very good point. You don’t have to go all in when you want to try out Realm. One of the best use cases I’ve seen is exactly what you’re talking about. Usually, you have a couple of objects and some type of state persistence—say, a local cache. That’s a perfect time to try out Realm. Just throw it in there and use it for the cache. A cache is also a perfect example, because you need to know when it’s invalidated or updated. You can attach those change listeners, and get that reactive nature from it. If you want to, you can also take your existing objects, throw the &lt;code&gt;@RealmClass&lt;/code&gt; annotation on them, and use them to test it out. That’s a great introduction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Speaking about gotchas, the other thing that got me multiple times was the whole concept of the Realm instance closing. Correct me if I’m wrong, but this is what I’ve noticed in practice: essentially, any time you open up a &lt;code&gt;RealmObject&lt;/code&gt;, you also have to close it. That’s a very traditional, database transaction level thing.&lt;/p&gt;
&lt;p&gt;Initially, when I started with Realm, I thought there was some magic happening, but it isn’t magic. It’s just basic reference counting, which is actually pretty cool. They don’t have a garbage collector. We actually did &lt;a href="http://fragmentedpodcast.com/episodes/064/"&gt;an episode&lt;/a&gt; on the difference between garbage collection and reference counting a while back, so you can alway give a listen to that. Since Realm is reference counted, though, if you open up an instance, you need to make sure that you close it. If you don’t, you’ll start leaking memory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Usually, I’ll just wrap it in a try/catch. At a higher level, I’m also using Dagger. Some people may agree or disagree with this, but I actually have one instance just for the main thread. I create that, and then I can inject it anywhere I want as long as I’m on the main thread. I’m careful about staying there, which we’ll talk about in a second. When I’m using it, I make sure I’m on the main thread, and I don’t use it anywhere else. Then, if I need to use anything in a background thread, I’ll make sure to open, close, and so forth from that point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I really want to ask you some follow-up questions on threading, because I think that’s super interesting. Like I mentioned before, I’m using Realm in conjunction with Rx. It gets really tricky, because when it returns the observable of elements, it’s returning a &lt;code&gt;RealmList&lt;/code&gt; or an observable of &lt;code&gt;RealmObjects&lt;/code&gt;. That really got me, because I didn’t understand how to close it. The problem is that when you expose an observable, you’re going to use those elements. But if you closed the Realm instance inside the observable, like you’re supposed to, any time you access an element, it throws an exception, saying, “Hey, this Realm instance has already been closed. You can’t take any more actions on top of this.”&lt;/p&gt;
&lt;p&gt;So it took me some time. Again, because I’m comfortable with Rx, I know the workaround here. For folks who are curious, you just add an &lt;code&gt;.onTerminate()&lt;/code&gt; call. The advantage of observables is that you can say, “Hey, execute this when you are done with the observable,” as long as you make sure that you’re terminating the whole composite subscription correctly. If you do that, you can say “do &lt;code&gt;.onTerminate()&lt;/code&gt;,” and close the Realm instance inside that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; We’re really getting into the weeds of RxJava implementation here. If you’re interested in how this works, Christian actually created Realm’s &lt;a href="https://github.com/realm/realm-java/tree/master/examples/rxJavaExample"&gt;RxJava example&lt;/a&gt;. He does a bunch of stuff in that where he’s in the observables, and so forth. You should definitely check that out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Let’s go ahead and talk about this threading thing. This is another very interesting aspect of Realm. Whenever you create a Realm instance, it’s tightly bound to the thread that it’s created in. You mentioned that you can inject a Realm instance that’s linked to the main thread through Dagger. Can you tell us a little more about this?&lt;/p&gt;
&lt;p&gt;The reason for this binding, I believe, is because if you try to access the same &lt;code&gt;RealmObject&lt;/code&gt; on a different thread—say you’re between a Rx call, and you hop onto your I/O thread and access that Realm instance—it will blow up on you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Exactly. Multi-threading has been the elephant in the Realm room for the longest time. As I said before, you can run everything on the main thread, and it’s still fast. But the reason why Realm is basically thread-bound is because multi-threading is hard. There’s a white paper written by Edward Lee (a professor at the University of California at Berkeley) called “&lt;a href="https://www2.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf"&gt;The Problem with Threads&lt;/a&gt;“. This is a little snippet from it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Concurrency in software is difficult. […] non-trivial, multi-threaded programs are &lt;em&gt;incomprehensible to humans&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Threads run over a period of time. If you put them on an x/y axis, left to right being time-bound, and if you have multiple different operations happening at different times—well, just try to get three in your head. You can probably manage that okay, but you’ll still get some bugs. When you get over three, the Cartesian product suddenly becomes insane. You’ve got 16 different possible combinations of things that could happen at any given time. Add another one, and it’s even harder. It just gets crazy.&lt;/p&gt;
&lt;p&gt;So, how have previous databases solved these problems? Well, they’ve normally just applied locks. Let’s take a typical example: I want to read from a database, but I’m going to make sure that the data is consistent. If someone is writing to the database at the same time, I may get inconsistent data. I might ask for one thing, and something else may come back. How do we solve that? Typically, we throw a lock on it: I can’t write to it until someone else is done reading from it, and vice-versa. So you end up placing locks all over the place.&lt;/p&gt;
&lt;p&gt;But locks are essentially slow, and that creates a humongous problem, because we have locks all over the place. If you’re trying to do the same thing in your application, you’re going to eventually create some bugs, because even though you’ll think you’ve got all the cases covered, you’re bound to miss some. Threading is insanely hard. This is a decades-old problem. It’s one of the reasons that JavaScript, for instance, came up with Promises, just to make things easier to read.&lt;/p&gt;
&lt;p&gt;And so the big sell for Realm with this threading lock comes &lt;a href="https://realm.io/docs/java/latest/"&gt;from the documentation&lt;/a&gt;, actually. This is a quote that I got from Alexander Stigson, one of the co-founders of Realm:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The only limitation [of Realm] is that you cannot randomly pass Realm objects between threads. If you need the same data on another thread you just need to query for that data on the that other thread. Furthermore, you can observe the changes using Realms reactive architecture. Remember – all objects are kept up-to-date between threads – Realm will notify you when the data changes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s basically saying, “Look, we can get rid of all the threading problems that you’ve had. The only limitation is that you need to make sure that you’re using the same Realm instance on every thread.” Each Realm instance is thread-bound, meaning that you can have a Realm instance open on Android’s main thread. But if you’re watching some data to update my activity, or if you have an &lt;code&gt;IntentService&lt;/code&gt; updating data, you’re going to have to open a different Realm instance in that thread. You’ll have to call &lt;code&gt;Realm.init()&lt;/code&gt;, which will give you a Realm instance. You can work with it, and when it’s closed, Realm will sync up in the background, because it’s a multi-version concurrency control database. In other words, at any given time multiple versions of the database are running, and everything gets squished together and brought up to date on the next run loop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty complex. I remember reading an article or seeing a talk about this, but I just want to highlight a point that you mentioned. You put it beautifully: the locks are a problem, but you don’t want a situation where the data you’re accessing changes underneath you. Realm solves this problem. It’s a trade-off, basically. All you have to do is make sure that the Realm instance you’re accessing belongs to the same thread, and it will handle all the other problems for you, even on other threads. It’s the same concurrency problem that you mentioned. Did you update data on a background thread? Your current thread handles that. You aren’t going to get stale data. You’ll get the most up-to-date data when you access that object again. The only limitation is that you have to stick to the same thread or Realm instance. I just want to call that out, because it’s a really good thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; One of the drawbacks of Realm is that it takes a complete paradigm shift to work with it, especially if you’re used to working with Rx, where you’re just tossing around threads left and right, and changing them around. You can’t really do that in Realm. You’re have to think, “Okay, I need to stay on this thread if I’m going to work with this data. Then, when I’m done, I can do something else.” If you don’t remember that, you’ll get into those weird instances where you get the error you talked about: “Hey, the Realm instance has already been closed. You can’t do this operation on this object.” But Realm solves all of those huge problems for you: “Hey, don’t worry about the threads. Do it on the same thread, and we’ll take care of everything else for you.”&lt;/p&gt;
&lt;p&gt;As developers, it’s hard to let go sometimes. We’re control freaks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I had to wrestle with that too, but the explanation that you just gave me makes so much more sense. I understand that it’s a trade-off, and I’m willing to make that trade-off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, because you otherwise just get locks, and that’s slow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Let me give you another example where I found this to be tricky. I usually like to model my architecture like the repository pattern that some people follow. Essentially, I have a POJO—a DB service—and all my database operations are relegated towards this service. The reason I do this is to make unit testing easy. In my unit tests, I can mock out this DB service object and swap it out with elements, saying, “Whenever anyone calls you, return this set of elements.” That very typical setup allows me to do proper unit testing.&lt;/p&gt;
&lt;p&gt;The thing people have to realize is that Realm works very closely with Android. In fact, you need an Android framework to work with Realm. You can’t spin Realm on a pure Java environment. That can get a little tricky, because what am I going to do in unit tests? I don’t have an Android instance. I’m running this on the JVM.&lt;/p&gt;
&lt;p&gt;To give you an example, a typical query that I might like to execute is &lt;code&gt;dbService.getPeople()&lt;/code&gt;. The trick here is that it returns a list of &lt;code&gt;RealmObjects&lt;/code&gt;. Those are (again) bound to the Realm instance, so even my unit test isn’t going to work. There are multiple problems, and it also points to the closing of the instance: “At what time do you close the instance? If I have the dbService object return the results, and I’m accessing it at multiple points, then how do I know when to close the Realm instance?”&lt;/p&gt;
&lt;p&gt;One way I could avoid that is by passing in a Realm instance and saying, “Whenever you query, use this Realm instance.” Then, at the activity layer, I could call &lt;code&gt;onResume()&lt;/code&gt;. Many of the examples that I see follow this pattern. Then I’d create the Realm instance in my activity, and pass it down the chain all the way to the DB service object. I’d use that, and then make sure that the object is closed in the end. Personally, I feel like that’s a little clumsy. It feels like I’m adding way more boilerplate than is necessary.&lt;/p&gt;
&lt;p&gt;But I did find a workaround eventually. This (again) points back to the documentation not necessarily highlighting things in a way that makes sense. Inside this DB service object, I would open the instance, execute the query, and then close the instance. I would try to contain it entirely within the DB service object, and I would instead return a copy of the object. I wouldn’t return the exact &lt;code&gt;RealmObject&lt;/code&gt;, which is being pointed to at the source of the DB, but rather a deep copy.&lt;/p&gt;
&lt;p&gt;Let’s say I have this “person” &lt;code&gt;RealmObject&lt;/code&gt;. All I want is a similar Java object that’s one-to-one, but not linked to Realm. If I could make a copy of this, that would work, because the responsibility for what goes out is mine. Whatever comes out of the DB service object is just like any random Java object—I can do whatever I please with it.&lt;/p&gt;
&lt;p&gt;It took me some time, but I eventually realized (from a GitHub issue where Christian pointed this out) that Realm has a really cool operation called &lt;code&gt;.copyFromRealm()&lt;/code&gt;. I believe this feature was requested and added later, so I’ll make sure to add a link to &lt;a href="https://github.com/realm/realm-java/issues/931"&gt;that GitHub issue&lt;/a&gt;. When people asked for this, they said, “Hey, all I want is just a Java copy. Sometimes I don’t have access to the &lt;code&gt;RealmObject&lt;/code&gt; in a typical use case for unit tests. All I want is a Realm copy, because I’m not necessarily testing my DB service. I’m testing something else that requires the DB service object.” This copy from Realm does just that: it creates a deep copy. It says, “Okay, I’m going to create an exact copy of this object, and then I’ll give it to you and you can do what you please.”&lt;/p&gt;
&lt;p&gt;Essentially, that’s what I did. It was really easy, because I’m using an Rx architecture. I just slapped on an operation saying, “map, and &lt;code&gt;.copyFromRealm()&lt;/code&gt;,” and boom! I got a copy, and everything is still contained in my DB service object. It took me some time to understand that, but it now works perfectly well. I don’t even have to worry about creating and closing that activity. I just create the Realm as and when I need it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; The only issue that you’re going to have with that is that those are unmanaged deep copies of those objects, meaning that Realm is not watching after them anymore, further meaning that you’re not going to be notified of any updates to those objects, and they’re going to be invalid at that point. It’s just an in-memory copy of those objects. That’s something to be aware of, since you can’t attach listeners or anything like that to those objects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; What I do, essentially, is expose an observable from the DB service object itself. That keeps returning a new copy every time, so I get the advantages of both in some ways. Internally, I’m using a listener and exposing an observable, so that internal DB service object is getting those changes. There’s a very Realm-like behavior to that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How many objects are you returning on average from that? Do you know? Is it just a couple? A hundred? Five thousand?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; It’s just a couple of objects. If I’m was on a Twitter feed stream, returning a billion objects, I would run into memory issues. So far, though, I haven’t run into a need to use that many objects. But yeah, these deep copies are still a copy, which means more memory.&lt;/p&gt;
&lt;p&gt;There’s also a helper, which gets really tricky. If you read the GitHub issue, Christian actually talks about that. You can pass in how many levels of nesting you want, because you can have child &lt;code&gt;RealmObjects&lt;/code&gt; of the copy from Realm. For example, if I had a chat composition &lt;code&gt;RealmObject&lt;/code&gt; which internally had chat messages, those messages might have an image object and a content object, and you’re storing all of these as independent Realm database tables—a typical one-to-many relationship. I could say, “Hey, just get me to one layer. I don’t care about the nested objects.” I think that’s done for performance reasons. I could also say, “Hey, give me everything. I want the truest representation of the object.” Again, this is something that you have to understand is happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; People are probably wondering, “What if I have a ton of data in my database?” Let’s say I’m using connected, regular &lt;code&gt;RealmObjects&lt;/code&gt;. I’m not using &lt;code&gt;.copyFromRealm&lt;/code&gt;; I’m just doing regular queries. If I create a list and say, “Find all of the persons in the database,” and that’s 200,000 records, please note that you’re not loading all 200,000 records into the memory. Think of it as a pointer down into the databases. I’m currently on this record, and it’s going to pull more objects out as I iterate over them. It’s not loading everything into memory all at once, so it’s very memory efficient as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; For sure. If you go the traditional route, this thing is crazy optimized, so you won’t have any issues. It’s good that you brought that up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You also ran into an issue doing a very similar thing where you were trying to read stuff in from your API. You had some situation with weird API naming conventions, and you wanted to change them over. Do you remember what that situation was?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; This is one where I couldn’t find a workaround, but I think there’s an issue tracking it. For example, say my API sends down an object. Since this is a typical back end, it’s a JSON. I’ll use the same person example. Maybe one variable is “first name”. The column name would be &lt;code&gt;first_name&lt;/code&gt;—typical snake casing. But that’s very un-Java-like. In my actual &lt;code&gt;RealmObject&lt;/code&gt;, I don’t want to change the name of the variable to &lt;code&gt;firstName&lt;/code&gt; (in camelCase).&lt;/p&gt;
&lt;p&gt;The problem with Realm—and this seems so basic that it’s surprising they don’t have it already—is that you can’t have custom column names in your database. You cannot say, “Hey, in my Java &lt;code&gt;RealmObject&lt;/code&gt;, keep it in camelCase, but when you save it in the database, I want it to be named &lt;code&gt;first_name&lt;/code&gt;.” I couldn’t find a workaround for this. It’s kind of funny, because we added it to both the iOS and Android applications, and we were thinking, “Hey, we need to keep this consistent”. This is one point we remembered to touch on, because they have their own mobile platforms. One day, everything can just synchronize across platforms, but I didn’t want to change my variable names.&lt;/p&gt;
&lt;p&gt;I couldn’t find a workaround for this, so if you open up the Realm database for my Android application, the column name would be &lt;code&gt;firstName&lt;/code&gt;, which is kind of iffy. But I think they’re thinking about solving this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What was the value coming down from the API? Would it be &lt;code&gt;first_name&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; If you had a JSON object of “person”, &lt;code&gt;first_name&lt;/code&gt; would be the key, and the value would be the string “Donn”. Then &lt;code&gt;last_name&lt;/code&gt; would be “Felker”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How are you storing that in the database now?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I parse the JSON object (and you can use a very typical JSON deserialization library—GSON, Jackson, Mushy, or whatever works for you), and I have to convert that API object to (in this case) a Java &lt;code&gt;RealmObject&lt;/code&gt;, which I can then save into my database. The problem is that when I do the deserialization, converting it from the JSON object &lt;code&gt;first_name&lt;/code&gt; to a Java object, it goes into camelCase, because it’s a Java object at this point. If I provide a Java object and then say &lt;code&gt;.saveToRealm()&lt;/code&gt;, it essentially maps it to the variable name in your Java objects. Essentially, I’ve lost &lt;code&gt;first_name&lt;/code&gt;. My Realm database is in camelCase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I guess the other issue that I’m having is whether you want it to be &lt;code&gt;first_name&lt;/code&gt; in your database?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I do, potentially, because that would mean that the iOS folks don’t have to have camelCasing. camelCasing is not common in iOS land, I hear. The other tricky thing is that we have some objects which use Hungarian notation, so it’s like &lt;code&gt;m_firstName&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; OK, I finally see what you’re saying. You want to keep the naming convention from the API, so that it says &lt;code&gt;first_name&lt;/code&gt; when it gets saved to the database, but in Java, you’d like it to say &lt;code&gt;firstName&lt;/code&gt;. I see what you’re saying. I haven’t had to deal with that, because what I’ll typically do when I get some crazy API is to just save everything in the Java format. If I come down, and it’s &lt;code&gt;_ID&lt;/code&gt; or something, I’m not saving that. I’ll just use the serialized name property of GSON or whatever library I’m using, and it will just change it so that the field is actually called &lt;code&gt;ID&lt;/code&gt;. Then it gets saved in the proper format, and I don’t worry about it from that point forward. But I guess if you’re trying to share these objects across different platforms, that could be an issue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; In all fairness, you’re right. This is a problem that you would see later on, but it’s not something I immediately see. At some point, though, it might get a little tricky.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; They are &lt;a href="https://github.com/realm/realm-java/issues/1470"&gt;tracking this&lt;/a&gt;, again, on the issue tracker, but it’s currently in their backlog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; There was another tricky situation. What was it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Was it partial updates?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yes. This is not specific to Realm. In fact, it’s a very common problem. Essentially, I get a new Java object from my API, and I say, “Hey, update the copy of Realm with this.” The tricky thing is that what you’d usually like to happen is for it to only update the non-null values. Usually, your API will only send certain attributes (say, three or four) in order to make sure you don’t have a very big payload. So I’ll use GSON or something to serialize this into a Java object, which works perfectly. Those three fields that I need will get updated as required, so no issues there.&lt;/p&gt;
&lt;p&gt;The problem I would run into is that, other than those three values that came down from the API, everything else is null (as it should be in a serialization). In Java, you cannot say, “Don’t have a value”—it’s either null or not null. So, when I say &lt;code&gt;.copyToRealm()&lt;/code&gt;, I’m going to run into an issue where it updates all the other values to null. So I’m getting an API that says “Only update these three values,” but when I actually update my &lt;code&gt;RealmObject&lt;/code&gt; after having serialized that, it wipes out all the other values and make them null.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That can be tricky at first. You’re like, “What? This is not the expected behavior.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Right. But this is very common too. Initially, when I did a little research, I thought, “Maybe this is something that’s only typical to Realm,” but that’s actually not the case. Many databases have this problem.&lt;/p&gt;
&lt;p&gt;It should be pointed out that there is a solution for this, because Christian actually pointed me to one. Realm also has a feature where you can copy a JSON directly into the database. Instead of going through the serialization, you can say, “Hey, take this JSON and straight up map it into my database.” If you provide a JSON object, Realm understands that the values which have not been provided shouldn’t be updated, so that’s perfect for our use cases.&lt;/p&gt;
&lt;p&gt;But again, this is the problem that I was telling you I ran into. If you save from the API and copy to Realm directly, the keys from my API object are going to be in &lt;code&gt;snake_case&lt;/code&gt;, which means it won’t find that value when it’s copying into Realm. That’s a problem. So I had to write a minor mapping. I had to construct another JSON object which would map the fields from my &lt;code&gt;RealmObject&lt;/code&gt;, and then use that to copy to Realm directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Wow. That’s kind of a pain. You should fix your API (just kidding).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Problem solved, right? But like you rightly said, if you don’t care about these things (like in a typical use case), you won’t run into this problem. But if you want to use a combination of two features, where you want to copy only certain attributes to realm, and you don’t want to change your Java class to have the same variable names as my API, then you run into this problem. I had to work around that by writing a custom serialization mechanism, which serializes it into a JSON that maps one-to-one with my Java object, and then save that into Realm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So do you guys actually share your Realm databases between iOS and Android, or are you just preparing for that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That is a good question. We’re just preparing for it. You’re right in calling me out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; It’s just preparing for what you don’t know. Then again, you brought up the point of things we’re used to having in other languages, like an active record. If you wanted to change a database, how would you do that? In an active record, you’d use migrations. Well, Realm actually has the same thing. If you needed to change that column name, you could write that migration in. One of my clients uses fifteen or sixteen migrations, where we add a class, add a field to a class, add a couple other classes, etc. That’s another nice thing about Realm: it’s very easy to update the database, so you aren’t stuck with that same scheme that you started with. You can actually add to and modify it as time goes on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Speaking about migrations, there is one cool thing that I should point out. Realm has a really cool helper which can delete the entire database if you think a migration is needed. So if you don’t want to maintain the local data, and you also don’t want to deal with migrations, you can just slap that on. Any time Realm thinks that your schema has changed, instead of writing custom migrations (which can get very tricky to understand sometimes), you can just say, “Actually, I want to just delete the database, because my API will pull the objects down and I’ll recreate it.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, if you have that ability, you can just rehydrate on the next screen load. That’s such a huge time saver, because if you have to manage that data migration process, it’s not perfect. Data migration is always going to be a manual task, where you’re extracting, transforming, and loading into different areas. But if you can, use those little helpers where you can just delete it and restart. It makes it so much easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; To your point, if it’s a pure offline app, sometimes you don’t get the luxury of just wiping your local data, because you’ll lose everything. In those cases, you have to go through the migration route.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You bring up a good point. There are a lot of situations involving offline apps. You did this at Wedding Party, if I remember correctly. You guys had an offline app, and you needed to write custom server sync logic, correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; At Wedding Party, we were very proud of the sync mechanism we wrote, because we wrote it all by hand. It seems like a very simple thing, but it’s not simple, folks. Writing a good sync engine can be ridiculously hard. There are so many considerations to make. You’ve got to make sure that you’re not sending the complete data—just incremental data—but you’ve also got to know which data to pull and which not to pull. Wedding Party had a pure offline mode app where each thing would function independently, but we also had a web application that was the master that all the data would be synced up against.&lt;/p&gt;
&lt;p&gt;We can point to some links in the show notes where folks have &lt;a href="http://inessential.com/vespersyncdiary"&gt;talked about sync engines&lt;/a&gt;. They’re very complicated, trust me. I have written one. It worked really well, but if people came and asked me to write one, I’d say, “No, let’s just pick a solution.” The amount of work that goes into writing a sync engine is almost always not worth it, unless you have a team that’s just willing to work ridiculously hard on that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That segues perfectly into something that Realm recently released, which I unfortunately haven’t had any time to play with yet. It’s known as the &lt;a href="https://realm.io/products/realm-mobile-platform/"&gt;Realm Mobile platform&lt;/a&gt;. It’s basically a Realm sync engine with an object store that sits in the cloud. It has two-way data sync, with synchronization and conflict resolution built in for you. You don’t have to build any of that stuff that you fought through before.&lt;/p&gt;
&lt;p&gt;They also do a bunch of other stuff, like events that trigger server-side notifications when they need data changes on the server. They have their own custom authentication access control, and (of course) it’s encrypted. I believe it uses AES-256. I haven’t had a chance to play with it, but I really want to. I might do it next week on vacation—just poking around to see what it’s like. If this solves what they say it’s going to solve, I can’t imagine how many man-hours are going be saved by doing this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s another thing. It wasn’t just about convincing myself. I had to convince my team too, because adding a database is not something you simply do on a whim. But this was something that we felt was very convincing. Again, we’re starting to move offline. That’s a big project that we’re doing for our shopper app at Instacart. If we get to a point where we need to sync data between multiple platforms, this makes it ridiculously easy. Again, like you rightly said, I haven’t used it either, but the way it’s being pitched is: “Hey, you have this iOS Realm database and this Android database. You don’t have to write the sync logic. All you have to do is use the Realm mobile platform.” If I issue an update—say I correct the name variable in my Android app—the next time it’s pulled from the iOS application, you’ve already got that update. They’re basically saying that you get the sync engine for free.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I think that the developer version is free now, but if you get into the professional version for enterprises, it’s actually one of the things that they charge for (I’m looking at the pricing page right now). I know that if you’re doing the developer version, you can get all the syncing for free, and so forth. But again, if you’re paying for that product, it’s simple.&lt;/p&gt;
&lt;p&gt;I’m very against the NIH (Not Invented Here) syndrome. People are like, “We’re going to write our own status page and analytics engine!” Then you start adding it up, and say, “You’re gonna spend $150-200K writing this, and waste six months of time that’s not spent pushing your business forward. Why don’t you just spend a little bit of money on this other product that does it for you, so you can focus on fixing problems for the customers, not fixing technology problems?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; The strongest skill a software engineer can have is to know when to make it someone else’s problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s the biggest truth, and it can’t be said any better. I have no words other than what you said. So hands down to Kaushik.&lt;/p&gt;
&lt;p&gt;If folks wanted to get started with Realm…I already know how to use it, and it’s become second nature to me. It’s still kind of fresh to you, though, so if you were to recommend how to get started with Realm, what would you tell someone to do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Almost all of the content that I need, I get from two places. One is obviously &lt;a href="https://realm.io/docs/java/latest/"&gt;the documentation&lt;/a&gt;. It’s not as detailed, but it’s a very good place to start to get a feel for what things are.&lt;/p&gt;
&lt;p&gt;But an even better recommendation (this is my standard go-to now) is your Caster.io course on this. Donn did not prod me to say that, by the way. He just genuinely asked this question, but this is what I really do. When I started out with Realm, I was like, “This Realm thing sounds interesting. I’ve talked to Christian, and I understand the theory. But what does it feel like? I want to get a better understanding of what it is.” So I made myself a hot cup of coffee, opened up Caster.io, and saw that Donn used Realm. So I thought, “I’ll see how things are.” When you see the code, you get a good feeling of how things work. That’s basically what I did, because I didn’t want to invest that much time in it if it wasn’t something that looked appealing to me.&lt;/p&gt;
&lt;p&gt;Any video course would work, but Caster.io works pretty well. So, I opened Caster.io, looked at the courses, got an understanding of how it works, and thought, “Okay, this looks like something I can get behind.” Then I went to the documentation. As you implement, you’ll run into these small quirks, like we mentioned over the course of this episode. Usually, you’ll find them either in the documentation or the GitHub issues, so that was my strategy. What are your thoughts?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I agree. I usually tell people to just go to &lt;a href="https://realm.io"&gt;https://realm.io&lt;/a&gt;. Here’s the key thing: today, we’re mainly focused on Realm Java, because this is an Android podcast. But they also support Objective-C and Swift. There’s starting to be quite a few folks listening to this show from the React Native crowd, and there’s a React Native binding too. And if you’re on the .NET side of things, doing cross-platform development, they have Xamarin bindings as well. So go the website, choose your platform, read the docs, and start hacking away. That’s usually what I recommend. If you need any help, you can always check out the Caster.io course.&lt;/p&gt;
&lt;p&gt;I hope that this conversation has answered a lot of your questions about what we think about Realm in general, without having someone directly on the Realm team here to talk about it. These are our actual real thoughts. I have apps in production with Realm, and have had some for close to year now. It’s been performing well. Kaushik, you’re starting to use it now, and I have a bunch of other friends who already use it.&lt;/p&gt;
&lt;p&gt;Hopefully, this answers your questions. If it didn’t, please hit us up on Twitter, and we’ll try to help you out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; If there are things we mentioned offhand that you would like more clarification on, feel free to hit us up on Twitter, and we’ll make sure to give you the details, the context, or the specifics on the stuff that we mentioned.&lt;/p&gt;
&lt;p&gt;If folks wanted to reach out to you and find out more about Realm’s specifics, what would be a good way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; They can reach me at &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; on Twitter. What about if they want to ask you about the weird nuances of Realm?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Please do! Do it on Twitter at &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;. Seriously, folks, we’re very interested, and this is a big part of the learning process for us, too. If you keep asking quirky questions or the things that come up that seem like a no-go for you, this is how we’re fortunate enough to be able to find answers, so that we can jointly learn in the process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; We’ve had many folks ask us specifically about our thought process on the the MVP pattern (and other MV* patterns), so we have another one of these conversations planned for those type of things. Please ask your questions, and we’ll get them in here!&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/70/</guid><pubDate>Mon, 16 Jan 2017 07:56:12 UTC</pubDate></item><item><title>069: Talking Buck with Uber engineer Gautam Korlam (part 2)</title><link>https://fragmentedpodcast.com/episodes/69/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c6a91644-24c7-4d7a-ae3a-b30a1b20d2a1?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/c6a91644-24c7-4d7a-ae3a-b30a1b20d2a1/069-interview-part-2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We’re back with part 2 of our Buck episode. We continue our chat with Uber Engineer, Gautam. We dive into the details of how buck is used, how you can use it and how it can help you and your team. Learn about how to use it with Gradle and more with OkBuck.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="build-systems"&gt;
Build systems
&lt;a class="heading-anchor" href="#build-systems" aria-label="Link to Build systems"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buckbuild.com/about/overview.html"&gt;Buck overview (Facebook/Uber)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bazel.io/"&gt;Bazel (Google)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pantsbuild.org/"&gt;Pants (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kageiit/android-studio-gradle-test"&gt;Android test app comparing different build systems&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/uber/okbuck"&gt;okBuck (adopting Buck easily)&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buckbuild.com/article/exopackage.html"&gt;Buck – Exopackage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/watchman/docs/install.html"&gt;Watchman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://buckbuild.slack.com"&gt;Buck Slack group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buckbuild.com/concept/what_makes_buck_so_fast.html"&gt;What makes Buck so fast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=j6CiHlapado"&gt;Gautam’s talk on okBuck at Droidcon NYC&lt;/a&gt; [youtube.com] (&lt;a href="https://speakerdeck.com/kageiit/lightning-fast-android-builds-with-gradle-plus-buck"&gt;Slides&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kageiit"&gt;@kageiit&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;This is Part 2 of a two-part interview. Part 1 can be found at &lt;a href="http://fragmentedpodcast.com/episodes/68/"&gt;http://fragmentedpodcast.com/episodes/68/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; As an Android developer, I’m very familiar with the Gradle build system, so I’m apprehensive about leaving for something brand new—there’s probably a large learning curve, and so on. But I hear that you guys have created a Gradle plugin for Buck called okBuck. Can you tell us a little bit about what okBuck is, and maybe why we would want to use it as compared to regular Buck?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gautam Korlam:&lt;/strong&gt; That’s a great question. We were in that same exact boat, because change is hard (especially when you have hundreds of developers working on a codebase). All our developers were familiar with Gradle, so we wondered, “Hey, is there any way that we can use our existing structure along with Buck?” It would have been a nightmare to force a large migration on all our developers, bringing all the cognitive overhead from the tooling changes.&lt;/p&gt;
&lt;p&gt;So we started looking at an open-source project called okBuck. It wasn’t originally written by us, but by a guy in Beijing named Piasy Xu. He wrote it as a hobby project, and it was building very basic Android projects by the time we discovered it. At the time, a lot of things in it were not flexible enough to actually be considered production ready, so we went in and almost rewrote it from scratch over three to four months. We brought it to a high-quality state that can be considered production ready.&lt;/p&gt;
&lt;p&gt;We use a lot of different tools at Uber. For instance, we pretty much use everything under the sun that Google puts out. All of that needs to work in alternate build systems. Sometimes there are no convenient analogs, so we had to bridge the gap, and that’s where okBuck comes in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; Let’s just step back a little. Right now, this is a little confusing to me. You’re saying that okBuck is a Gradle plugin—but fundamentally, Gradle and Buck are on opposite sides, so how does that work? Right now, my mind is split into two parts. There’s Gradle, and there’s Buck—but wait, both of these are working together? I don’t understand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Let’s say that you have a project which is currently being built with Gradle, and you want to try out this new system from curiosity. In other words, you don’t want to spend all the time and effort it takes to migrate over. What will you be looking for? “Is there anything that can make the transition automatic for me?” If you think of a project converter, okBuck is kind of like a build system converter.&lt;/p&gt;
&lt;p&gt;The way it’s currently written, it’s very easy to convert a Gradle project into any other build system. If you remember Maven from back in the day, Android Studio used to come with something called a Maven to Gradle converter, which did something similar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Oh yeah, I remember those days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It’s similar to that, but there’s actually a huge gap between the concepts of the two build systems. There’s a level of complexity that needs to be bridged so that developers don’t have to spend time wondering “Hey, how does this work, exactly?”&lt;/p&gt;
&lt;p&gt;To make that even easier, okBuck sets up something for you called a Buck wrapper. It’s very similar to the Gradle wrapper, so we kind of stole the name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So it’s essentially &lt;code&gt;buckw&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Exactly. In fact, we called it that. If you want to build an APK, you just say &lt;code&gt;./buckw build apk&lt;/code&gt;. If you want to test something, you say &lt;code&gt;./buckw test module&lt;/code&gt; Or if you lend something, it’s &lt;code&gt;./buckw lend [whatever]&lt;/code&gt;. It bridges the gap, taking the overhead of understanding the system away. That’s why okBuck is a very quick way for you to try Buck and see if it’s right for your project, and what value it can bring to your project or your codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Suppose I want to try Buck. What would my first steps be?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How do we get started?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; okBuck has a sample project containing a lot of different examples. It also has a very extensive &lt;a href="https://github.com/uber/okbuck/wiki"&gt;wiki and migration guide&lt;/a&gt;. But 90% of the time, you can just apply the plugin, and it should just work.&lt;/p&gt;
&lt;p&gt;Admittedly, there are particular cases—especially in large, enterprise-level builds—where you may want to customize it, or you may have a bunch of legacy Gradle hackiness somewhere in your build that doesn’t work with Buck.&lt;/p&gt;
&lt;p&gt;Another company that uses okBuck very extensively right now is AirBnB. Once we open-sourced it, they were pretty interested. They have basically the same problem (along with a lot of other companies that are hitting this issue): they started with Gradle, but they’re reaching this point of scale where it’s just not working out for them and they need alternatives. But they don’t have the bandwidth or time to go research, and that’s where this solution fits in. AirBnB basically did their conversion in three days to a week. Two engineers sat down, understanding what the system looks like, and just tried it out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So I guess our first step would be to go and look at the examples and instructions in the README, and that would help us understand where to move from there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; I also gave &lt;a href="https://www.youtube.com/watch?v=j6CiHlapado"&gt;a talk in September&lt;/a&gt; at DroidCon NYC which covers what the migration path looks like and the kinds of gotchas that users might encounter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You said that okBuck is something that you and Airbnb are using. Is it production ready, or are you guys just testing it out still? To me (and from what I can tell, to Kaushik), it’s very interesting, and I kind of want to go play with it. If I’m able to convince clients that, “Hey, this is going to cut down your build time significantly, which is going to increase your developer productivity, which affects your bottom line”—is this something that I can go use today?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; We’ve been using it to build the new Uber Android app ever since we started developing it six months ago. At this point, all of Uber uses Buck to build for Android (as well as iOS), and we use okBuck on a daily basis. So it goes through a lot of churn as we make sure to add any new features that people request. For example, we added support for things like SQLite, Square, Lambda, and the Gradle transform plugin. It actually supports a lot of those use cases out of the box.&lt;/p&gt;
&lt;p&gt;It’s really a situation where you can try it out, and if something’s broken, it’s easy for us to add that support, because it’s super easy to extend. Also, we get a lot of excellent contributions to okBuck that make it easy for us to make these changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; There’s a good question. Is okBuck open-source?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yes, it’s completely open-source. You can check out all the code at &lt;a href="https://github.com/uber/okbuck"&gt;https://github.com/uber/okbuck&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; It looks like you guys are MIT licensed too, for those who are wondering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Excellent, that’s a good license to have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Also, in terms of the quality of the product itself, Airbnb isn’t the only one using it. I think Lyft has been using it for a while, and the guys at Square are currently evaluating it.&lt;/p&gt;
&lt;p&gt;Also, Facebook has set up a Buck-focused Slack, where a bunch of companies are usually chatting about different elements of Buck, how it’s being used, and the unique situations that they’re facing. That’s open for people to join, if they’re interested in learning more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; We’re all software engineers, so we understand that not everything in the land of Android development is sunshine and roses. Right now, hearing about Buck’s advantages is pretty much just sunshine and roses, but I think it’s also fair to say that there have to be some disadvantages, right? For example, one thing that I’ve heard is that external dependencies aren’t supported right out of the box. Is that still true? I remember that that was thrown around a lot in the early days of Buck, when people were super frustrated with Gradle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Those still aren’t supported in the broad sense. With Gradle, you have a lot of finetuning abilities, so you can say, “Hey, I want this dependency, but not the transitive dependencies that it brings in.” Actually, there’s no concept of Maven in Buck yet, but you have to understand that Buck was built for the multi-people situation that Facebook is currently in—one where the whole codebase is filled with all sorts of JARs and external dependencies.&lt;/p&gt;
&lt;p&gt;That may not work for everyone, which is why okBuck bridges that gap as well. It uses Gradle’s caching solution. You basically get the exact same dependencies that you would get in Gradle, but it downloads them to a local cache that Buck can actually reuse to build the codebase. If you just use Buck, it still doesn’t do external dependencies. There’s a basic command called &lt;code&gt;buck fetch&lt;/code&gt; that can fetch external code, but there’s no dependency management in the Maven sense. So okBuck is definitely useful for people who are coming from the Maven world and want to bridge that gap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Essentially, I guess that the disadvantage (if you can call it that) is that all those dependencies would be pulled locally, versus having direct references.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Exactly. Having them locally can bloat up your repository if you’re not using things like Intellifast, for example.&lt;/p&gt;
&lt;p&gt;Those kinds of things are not documented really well on the Buck website. They just say, “Hey, you can have this checked in, and you can pretty much go with it.” The fact of the matter is that Facebook has tailored their BCS solution to scale really well. They use Material, and they have a lot of custom in-house things that make it very easy to work with large-scale codebases. But that’s not within everyone’s reach.&lt;/p&gt;
&lt;p&gt;okBuck basically says, “It may not matter on small-scale projects, but eventually, as your project grows, your build will grow with you and not slow you down.” So a comes from here at Uber. Our codebase has grown from 40 modules at the get go 3 months ago to 170 modules in the released app. That doesn’t even count any of the external libraries that are used for networking and other stuff like that. That’s just the new app. But we haven’t actually changed, in terms of the build speed. It’s exactly the same.&lt;/p&gt;
&lt;p&gt;We also have something called a network cache, which I forgot to mention. Buck comes with something called a remote build cache, which means that if you build something on CI (for example), it’s cached on the network cache. Let’s say that CI has the build master, and I come in tomorrow and say, “&lt;code&gt;git rebase&lt;/code&gt;. Okay, I have the latest master.” Then I try &lt;code&gt;buck build&lt;/code&gt;, and it says, “Build done in 3 seconds.” What just happened there? It downloaded the exact apk for that job from the network cache, and it says, “Okay, you don’t really need to build anything. It’s already been built on a different machine; you can just go ahead and use it.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s magical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s brilliant. So basically, it’s a shared build cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; We can do that because builds are reproducible. You couldn’t do it if they weren’t equivalent on different machines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense. So it’s like coming full circle in terms of reproducibility.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Currently, our build times on a fresh clone from the repo are 12 seconds on Wi-Fi and 3 seconds on Ethernet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Uber has also open-sourced our Buck HTTP cache implementation. That’s linked to in the README of okBuck, if you’re interested in trying it out. I think the Airbnb folks already use it for their builds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Kudos to you folks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I guess there are two points to be made. First, this is a network cache. Hopefully, you’re in a company and on Ethernet, but it depends on the internet. If your network connection is slow, don’t expect 3 seconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It might be 30 seconds then, because you also have a local cache on your machine. There are multiple levels of cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You mentioned the documentation, and that’s something that we should let our listeners know about. At this point, the documentation is not necessarily up to snuff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; We found that lot when we were working in Buck, actually. There are lots of things inside the Buck codebase that are not immediately obvious from the public documentation. That’s not problematic, generally, because you can typically look at the source code and get a good understanding of what’s going on once you dig in, but it was definitely a surprise to us when we initially started to start develop with Buck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Before we hopped on this call for the podcast, I took a look (over the last couple of days) at the Buck website. I started hopping into the docs, thinking, “You know what? I’m going to see if I can try this out.” But what I immediately felt was an apprehension to learn it—not because I didn’t want to learn something new. I love learning. But it seemed like a big thing, like when you first learn Dagger or dependency injections. It’s a very large, steep learning curve that turned me off. Have you seen that with Buck as well? Is there a large or steep learning curve?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; For some parts of it, yes. If you’re doing a very basic build, most of the systems have very, very basic examples on their websites. But they won’t list, for example, how to hook up annotation processors, do build flavors, or other instant things like those. It may not be easy to access that information, so while there’s not a steep learning curve, there’s definitely a longer one. It will take you longer to find that information.&lt;/p&gt;
&lt;p&gt;But okBuck just says, “Okay, that’s too much information. Let’s try to bring it all together into a nice API interface. Just build that thing, and we’ll get out of the way.” That’s why we really like okBuck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; The other question that I had about Buck is that, while I’m very enthused to try it out, one of the biggest advantages of Gradle is the concepts of product flavors and build variants. Does Buck support the same thing, because that’s actually a pretty useful feature for many folks?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Certainly. Buck has no concept of build variants (as such), but okBuck supports them. We do the translation logic in such a way that it doesn’t really make a big difference. Let’s say that with Gradle, you’d do something like, &lt;code&gt;assembleFlavor1Debug&lt;/code&gt;. With Buck, you’d say, &lt;code&gt;buck build Flavor1Debug&lt;/code&gt; instead. We did that translation because Buck doesn’t really have a concept of build flavors or variants, but you can map what Gradle does to say, “Hey, when you build Flavor1Debug and Flavor2Debug, you’re pretty much recompiling twice.” All the source code is compiled twice and treated as two separate targets, so we kind of do the mapping that way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So that’s where okBuck comes into play.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; If you did that manually, it can take quite a lot of time. I think some of the largest build files we have are our 5,000-10,000 lines of Buck files for really complex builds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Even beyond time, I would imagine that complexity is the tricky thing, right? These are things that you want to be careful about, especially if you’re building multiple variants.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; In terms of other features, I think that okBuck supports unit tests and espresso tests. Gradle transforms have been added recently.&lt;/p&gt;
&lt;p&gt;We’re working on Kotlin support right now because the community is moving towards it very heavily. Kotlin build times are not exactly where they’re supposed to be, as far as the developer feedback I’ve been hearing goes. That’s very important to us. We do have some internal tooling in Kotlin, but we don’t have it in production yet. We basically want to have a way to build it at scale, so we’re definitely looking at that in the next few weeks or so.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You said that it supports testing, like Android tests and unit tests. Do you know if the unit tests are faster? I would have a hard believing that the Android tests would run faster, because you’re waiting on espresso, online resources, and stuff like that. But what about the unit tests themselves?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Unit tests are faster, purely because it can run multiple targets in a very interesting way. It runs multiple threads for different targets. Let’s say I change one single file somewhere in the codebase. Since it knows how that bubbles up, it’ll say, “Only these particular test cases have to be rerun,” and it’ll just run that subset of test targets, which makes it very fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I have one question about Kotlin support, because I’m sure our listeners would want to ask this. You mentioned that Kotlin build times are significantly longer than what people want. Would Buck be able to solve that problem in some way, or is it something that’s inherently a problem with generating Java classes from Kotlin?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Sure, I can talk a little bit about that. I forgot to mention one important detail: Buck does something called ABI (application binary interface) checking. Let’s say that you have two classes, A and B, in two different modules. B depends on A. Let’s say you change A. Gradle says, “Hey, A is changed, so B has to rebuild itself.” But if you changed a private method that doesn’t really affect anything in B, Buck won’t rebuild B. It will just rebuild A, and it’ll pack the text files together directly inside the APK.&lt;/p&gt;
&lt;p&gt;When you go with Kotlin, the same thing would apply. For every JAR that comes out of a module, it creates this ABI JAR with all of the public APIs. Especially if you’re iterating on something really quick or you’re changing methods, it’s similar to instant turn on the command line, which can skip a significant portion of the build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; How does that play into the Kotlin support? Does it apply the same logic to Kotlin?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yes, because all of these targets are actually generating JAR files at the end of the day. Buck doesn’t really care how the JAR file is materialized. It could be from Kotlin, Scala, Ruby, or Java. It doesn’t really matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So because of the way incremental compilation is approached, you get its benefits across other languages. That’s pretty slick.&lt;/p&gt;
&lt;p&gt;Okay, so all of this is amazing, but what’s the future for okBuck? What’s on the road map? You mentioned Kotlin support. That’s pretty cool. Are there any other things that you want to tell us about to get us even more excited?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Well, at this stage, we have so many modules that the slowest part of our build is the time we actually take to run okBuck, because it’s still based in Gradle. So I just made some changes that basically make it run these things in parallel. We’re looking at incremental task execution.&lt;/p&gt;
&lt;p&gt;At this point, we’re doing more polishing of our incremental build support. Some of our APIs are still not finalized, so we’re trying to make them stable. Also, we ought to have feature parity (at the end of the day) with whatever the Android Gradle plugin has. At this point, we’re at about 90%, but some features are still not supported. We’re slowly whittling down all the features that people are requesting and trying to make sure that it’s airtight.&lt;/p&gt;
&lt;p&gt;At this point, Kotlin is the next big thing for us, along with making okBuck faster and scalable. People might be tempted to switch all the way to Buck, but then you’d lose access to the Gradle plugins that the community puts out. Square might put out a great Gradle plugin tomorrow, and you’d be thinking, “Oh man, I wish I was still using Gradle so I could use that.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wow, that’s fantastic. It’s a lot to digest, but I’m super amped up now. For folks who are listening, what are some good resources to look at, and how do I get started?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; If you want to just admire how fast it is, there’s a test project that we put up to stress test Android Studio and Gradle. The funny thing is that it’s now used by the tools team and the Gradle guys to ignition test their performance on every release. It’s a very buggy project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So it’s a legit thing, not some convoluted project that just shows how Buck is doing better?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It’s basically our project, but we removed all the code and obfuscated all the project names. It’s like an Uber project that has no actual information in it, just dependencies. That gives you an idea of how fast it is. There’s also the okBuck Github page, where you have the actual project; the DroidCon NYC talk; and a Buck Slack that Facebook maintains, where that people can hop in and get an understanding of what’s currently going on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Fantastic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; I want to mention something else really quickly. There’s support for generating Bazel from okBuck now. The Bazel team in New York said, “Hey, this is a great project. Let’s try adding Bazel support”—so they actually did. The next version of okBuck will probably ship with Bazel, so you can compare all three systems side-by-side if you wanted to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Ooh, that’s very interesting. Gautam, thank you so much. I can’t wait to hop off this call and start exploring okBuck more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I have shiny object syndrome times 5.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; You should definitely try it out. It’s low investment. Just apply the plugin and see if it works out. There is no upfront cost to do the migration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Thank you so much for spending your time and sharing your wisdom on okBuck. I think this is going to be great. Our listeners will definitely appreciate it.&lt;/p&gt;
&lt;p&gt;In fact, if they want to reach out to you, what’s an easy way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; I’m on Twitter (&lt;a href="https://twitter.com/kageiit"&gt;@kageiit&lt;/a&gt;). I’m not super active, but I do monitor it from time to time, so that might be a good way to reach out to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; All right, that makes sense. Donn, if folks want to reach out to you after you’ve tried Buck…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; The best way, again, is Twitter (&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;), but the real question is: how do they get ahold of you, Kaushik?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I’m &lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; on Twitter. If you give me some time, I’ll also try Buck, and that’s a good place for folks to reach out to me.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/69/</guid><pubDate>Tue, 10 Jan 2017 13:39:15 UTC</pubDate></item><item><title>068: Talking Buck with Uber engineer Gautam Korlam</title><link>https://fragmentedpodcast.com/episodes/68/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a25ff481-4c31-4150-80c9-40bcfb2e1379?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a25ff481-4c31-4150-80c9-40bcfb2e1379/068-interview-w-gautam_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We kick off 2017 talking to Uber Engineer Gautam. In first part of this 2 part series, Gautam talks to us about the Uber Android app, the complexity in the architecture, the scaling challenges, the pain points Android developers faced working on such a massive app.&lt;/p&gt;
&lt;p&gt;He then goes on to explain how his team (Android Developer Experience) at Uber have approached these challenges and come up with elegant solutions.&lt;/p&gt;
&lt;p&gt;We then dive head deep into Buck – the build system for Android development, it’s advantages and the benefits that the folks at Uber have observed having migrated.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="build-systems"&gt;
Build systems
&lt;a class="heading-anchor" href="#build-systems" aria-label="Link to Build systems"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buckbuild.com/about/overview.html"&gt;Buck overview (Facebook/Uber)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bazel.io/"&gt;Bazel (Google)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pantsbuild.org/"&gt;Pants (Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kageiit/android-studio-gradle-test"&gt;Android test app comparing different build systems&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/uber/okbuck"&gt;okBuck (adopting Buck easily)&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buckbuild.com/article/exopackage.html"&gt;Buck – Exopackage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/watchman/docs/install.html"&gt;Watchman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buckbuild.com/concept/what_makes_buck_so_fast.html"&gt;What makes Buck so fast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=j6CiHlapado"&gt;Gautam’s talk on okBuck at Droidcon NYC&lt;/a&gt; [youtube.com] (&lt;a href="https://speakerdeck.com/kageiit/lightning-fast-android-builds-with-gradle-plus-buck"&gt;Slides&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kageiit"&gt;@kageiit&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; How are you doing, Kaushik?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; I am doing good. How has your day been?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; My day has been fantastic. Just another day in paradise, as they say.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That sounds pretty good! My day has been interesting. I had a pleasant Uber ride, but it took me a quick minute to get here.&lt;/p&gt;
&lt;p&gt;Speaking about Uber, I hear we have an excellent engineer from Uber with us today. Can you tell us more?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’m just going to hop right into it. Without further ado, I’d like to welcome Gautam to the show. Welcome to the Fragmented podcast!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gautam Korlam:&lt;/strong&gt; Thanks for having me, guys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Gautam, I think it would be good for our listeners to become familiar with you, and I think the best way you can do that is by giving us a little background information on yourself: how you got into Android development, where you work at now, and what you’ve been up to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; I’ve been an Android developer for about three years now. On my first job out of college, I joined a company called Lookout Mobile Security. I’m sure you know some people who work there. There was a guy there named Israel Ferrer (he works at Twitter now).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Hey, he was on our show before!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yeah, I used to work with him. Anyway, when I joined the company, I didn’t know anything about Android. I did a bunch of stuff with Ruby on Rails back in college, and I wasn’t really sure of what mobile did, but I was given the job. I started with Android UI. I think one of my first projects was designing a live wallpaper (those actually used to exist!).&lt;/p&gt;
&lt;p&gt;Eventually, while working at that company, I began to develop an interest in Android tooling, especially in continuous integration (CI) and the build system. That was at a time when we didn’t have Gradle or any of the other tools that we have today. It was mostly just Eclipse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Oh man, that word brings back nightmares for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Back in the day, we weren’t even on Maven.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So you had to deal with all that good XML stuff, huh?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Exactly. Those were interesting times.&lt;/p&gt;
&lt;p&gt;But at that point in time, Gradle came out. I was pretty interested in the build system and all the new stuff that was coming out. I think they announced it during Google I/O. So I began diving into that stuff, and I migrated the company’s build system over to Gradle. So I grew into more of a tooling background.&lt;/p&gt;
&lt;p&gt;When I was starting to look for another job, I landed at Uber. The first thing I said during my interview was that I wanted to make tools for developers—and today, I’m on the Android developer experience team at Uber. We focus a lot on things—the build system, the IDE, and any general productivity tools that developers use in day-to-day jobs. We try to help them do their job better. That’s the gist of my Android experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So you help the Android team at Uber do their jobs more effectively? That’s cool. I had no idea there was even a position like that at Uber.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It was a very organic thing. I was on the platform team before, which used to coordinate many of the core libraries, like networking, experimentation, and analytics. Since my main passion was in tooling, I carved this team out over time, so I have a couple of people on it right now.&lt;/p&gt;
&lt;p&gt;I think this sort of team becomes very important as you scale a company. Especially with a lot of developers, you get a lot of unique challenges and problems. I think we currently have a couple hundred Android engineers at Uber.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Oh wow! That explains a lot of stuff. That seems like paradise!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yeah, there are a lot of smart people—and a lot of people committing core changes. People tend to step on each other’s toes, so I want to make sure that they’re doing their job effectively, and (at the same time) that they’re able to commit fast and move quickly. That’s where we come in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Suddenly, the whole Android developer experience team is like, “Oh my God, we obviously need someone who’ll help with that.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It wouldn’t be much of an Android developer experience team if we had just two engineers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Holy cow, that’s amazing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; One of the topics that both Donn and I have been really interested in (we’ve always wanted to talk about this) is the Buck system. I know that Uber now uses Buck, so it looks like you’ve transitioned from Gradle to that. Is that true? Did you ever use Gradle, or did you always use Buck?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; To give you a bit of a background about why we did this, when I joined the company, there were a handful of engineers. We had a very small codebase: the rider app, the driver app, and one common library, (which was conveniently called “Android Library”) that contained the shared code between these two apps. There was no versioning for that artifact, so people would just consume it and build off of it, basically. Those were dark times!&lt;/p&gt;
&lt;p&gt;When I joined, I wanted to transition us onto a system where we could add more libraries and start taking things apart. We began looking at things like Artifactory, which is a Maven server for artifacts. We already had a very basic setup of Gradle, so we pushed all of our libraries up to the Artifactory server and all the apps consumed them. Organically, over time, we’ve grown to a situation where we have somewhere close to a hundred libraries with a lot of different functions. So things have gotten interesting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I have a question about that. I have a friend who worked, very early on, at Uber. He told me that everything is based on micro-services there. Does same thing happen in the Android ecosystem too? In other words, does everyone creates these micro-libraries for various different components or what?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; When we initially started out, we had a macro situation, where we’d try to dump all of our common utility code (along with anything that could be a secondary) into this library. But we later realized that if you start doing that, there will be a lot of bad coupling, and that can be a very big problem. So we started splitting out into micro-libraries, but not to the extent that there are only two or three classes in a library. That would just get ridiculous to maintain over time.&lt;/p&gt;
&lt;p&gt;If you think about it at a high level, you’d probably have a bunch of different components in your app: stuff for networking, threading, UI, analytics, experimentation, and mapping and navigation, for instance. So we started splitting out our libraries based on the core feature specs of the app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; How many submodules does a typical app the size of Uber have?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It’s totally dependent on the particular app. Some apps, when they were being developed, didn’t have any modules in their repository. They had other modules outside the repository that were all built individually and uploaded to this artifact server, and would later consume it in their different ways.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You guys consume a ton of modules and libraries, so (at some point) you have to have run into some kind of scaling issues with Gradle. Actually, I haven’t ever had that many submodules (and most other developers probably haven’t, either), so I guess the big question is: did you run into any scaling issues with Gradle when you reached that level?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I mean, I had a project that I worked on in the early days of Gradle that had three submodules, and it was already a nightmare, so I’m really curious to find out how that’s worked out. I imagine there are more than three in Uber!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yeah, definitely more than three. To answer the question, when you initially start a new project in Android Studio, the wizard tells you, “Hey, you can make can make an app module”, right? I’m sure that if you started a hobby project or something on the side, you’ll just use one module. But the interesting thing about that module is, as you start adding more code to it, every single change you make needs the to recompile the entire module. As time goes on, you get to a state where small changes take so much time that you can go for a coffee break or do a lap around the office. We actually did that at Uber.&lt;/p&gt;
&lt;p&gt;At that point, a lot of the engineers said, “Hey, this is too big. Let’s break it apart.” They started breaking things apart, but then they started seeing something interesting. Their Gradle sync times started getting really slow. Whenever they’d make a change, they’d think, “Oh my God, Gradle is telling me that the project is out of sync. I need to re-sync this,” but then it took a while. That can be a very grating proposition for engineers when they’re working, and they just want to keep working on their codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Like, “Oh my God, do not change your Gradle file—don’t even add a space!—because then it’s going to ask you to sync, and that’s going to take another five minutes.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Exactly. That’s the situation where we started putting stuff outside, because they had pre-built artifacts, which means that they didn’t need to read their tests or recompile it.&lt;/p&gt;
&lt;p&gt;With scale, that came with other problems, though. If you have hundreds of libraries, it’s very hard to make big refactors in a safe, automatic manner. Whenever you want to make a change in the networking library, there could be hundreds of other libraries that depend on it. That could be very problematic, and you can break an API. And, since everything has to be compiled, you won’t even see the problem until it’s a runtime issue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yikes. That doesn’t sound too pleasant, especially in terms of discovering the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; For a while, I think we were still kind of in a system where we had a lot of different instances. So, to alleviate that, we had a system internally where, whenever some dependency changed, we recompiled and retested all the code for that particular version, to make sure that everything was compatible.&lt;/p&gt;
&lt;p&gt;But that’s not really feasible as well, when you have a lot of different instances. At some point, our Gradle build times started getting ridiculous: around 20-40 minutes for a single line change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; No more going to coffee! Go to get lunch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; If you guys think that’s bad, look at Swift build times. I don’t know if you have any iOS friends…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; 20 minutes is dysfunctional. Wow! How does anyone get any work done?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; I we started seeing this issue back in May.&lt;/p&gt;
&lt;p&gt;I don’t know if you guys have used the new Uber app. Have you tried it out yet?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You mean the new redesign that came out? Yeah, it’s pretty slick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I used it yesterday.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; That app actually started out around that time. It was a brand new architecture, where a lot of the principles relied on the code being broken apart into a lot of modules. This was very worrying for me, as an Android developer, because I was thinking, “The platform team wants to bring out this cool new architecture, and they have a lot of modules coming up, but then the build times are going to suck.” I didn’t want to stop them from progressing, but…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So you get to this level, break everything apart, and have all of these modules. Then you have this humongous build time. What did you do at that point to speed everything up?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; We didn’t even think about speeding it up at first. We just waited to see if we could make it work. We talked with the Android tools team quite a bit and tried to see if it could scale well at the longest time. But then we realized (at some point) that it didn’t scale, so we started looking at other companies that had scaled, like Google, Facebook, and Twitter. They have a gigantic amount of repos, with a lot of code, but they’re still functional. That got us interested in what they’re using to build their codebases.&lt;/p&gt;
&lt;p&gt;At that point, we evaluated some of the automated build systems out there, and there were a couple of different contenders: &lt;a href="https://buckbuild.com/about/overview.html"&gt;Buck&lt;/a&gt;, from Facebook; &lt;a href="https://www.bazel.io/"&gt;Bazel&lt;/a&gt;, from Google (which they open-sourced); and &lt;a href="http://www.pantsbuild.org/"&gt;Pants&lt;/a&gt;, from Twitter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Just so I understand, and so it’s clear to our listeners, these are all alternatives to Gradle? They’re all completely one-to-one build systems?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; They are all independent build systems, so you can build a lot of different Java or mobile codebases. But they’re all built by different companies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Does Bazel, the one that Google open-sourced, have anything do with Gradle? I know that Gradle is independent (i.e. it’s not part of Google), but that’s a question that could come up with the listeners: “There’s Gradle and there’s Bazel. Does Google internally use Gradle? Do they use Bazel? Do we know?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Gradle (the build system) and the Android Gradle plugin (a plugin that lets you build Android projects with Gradle) are two separate things. If you treat it separately like that, it starts making sense. Gradle is something that was open-sourced by a company called Gradleware. At that point in time (I believe), it was very easy for small projects get coding started very quickly. So the Android tools team, at that point in time, decided to create a way for extra developers to start using the system, because it was really low-friction.&lt;/p&gt;
&lt;p&gt;At that stage, Bazel was not open-sourced yet. Google had something (which they still use internally) called Blaze. In fact, a lot of the systems I just talked about are all designed by engineers who left that team at Google and moved on to different companies. They built a very similar system, based on the ways that Google internally builds most of their codebase.&lt;/p&gt;
&lt;p&gt;We wanted to focus more on something that would work really well for mobile, and Android specifically. At that point in time, Buck was the only one which had a lot of the features that we already get in the Android Gradle plugin, so that was something we began to take a closer look at. It had really good features. It promised so many different things, like really fast incremental builds, a lot of customizability, and being built to scale for the codebases the size of Facebook’s.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You’re talking about “fast”. Do you have an approximate idea of how fast? Is it two seconds faster? A minute faster? 2x faster? Do we have any idea?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Take Uber. How long is your build now, compared to how long it was before?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; I’ll give you a break down by different phases. When we started looking at Buck, we initially did everything by hand. We wrote all of the different files for Buck, and the build times were maybe 2x-3x faster than what Gradle gave us. That was very early on.&lt;/p&gt;
&lt;p&gt;When you do incremental builds especially, there are a lot of operations Buck makes. There’s a thing called &lt;a href="https://buckbuild.com/article/exopackage.html"&gt;exopackage&lt;/a&gt;, which is very similar to multi-text. That was way before multi-text existed, which uploads changed class files to the device whenever you try to rebuild the project after you’ve changed some Java files. That cuts down the build time even further, and we started seeing 6x improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; 6X?! Holy cow! Okay, just to backtrack a little, is this similar to what happens with Instant Run in that case?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Instant Run is very similar, but it has a bunch of limitations. When it has anything to do with annotation processors, it basically does a full reboot, purely because the processors a lot of the Android community uses these days (like Dagger and ButterKnife) require the entire code. Anytime you change a file, it’s very hard for Instant Run to predict what’s actually supposed to be re-built, so it has to run the annotation processor again and rebuild the code again. If you notice, a lot of the samples you actually see from Instant Run don’t have the annotation processor turned on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Oh, interesting!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Enlightenment just hit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So how does Buck handle that, then? I imagine it’s the same thing. Nothing has changed about the annotation processors, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Buck actually takes a different approach to this. It knows that incremental builds are very hard to do in general. If you looked at the world of, say, Ant back in the day, you saw that incremental builds would give you correct results 98% of the time, but 2% of the time, you had to do a full build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That happens even today, and it’s super frustrating.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Buck prefers really small, usable modules, so any individual module can be built or rebuilt really quickly. That means that you have a lot of flexibility with how long and how much you want to scale your build process. Let’s say that you have one giant application module in Gradle. There are some parts of that module that aren’t required to be recompiled every time, so you can start spreading things out. There are parts where you don’t even have to run annotation processors. So, as you start spreading things out, the build time becomes a function of how small you can get the modules and how many of them you actually have to build.&lt;/p&gt;
&lt;p&gt;Which brings us into the next point about Buck: it’s very heavily based on inputs and outputs, compared to Gradle, which is task based (similar to how Ant worked). Let’s say that you want to build an Android library. Buck builds by looking at all the different inputs that are required—resources, sources, and other dependencies—and saying, “Hey, are all the dependencies currently ready for me to start building this or not?” If they’re not, it will go down one more level try to build the ones that are further down. It’s a very simple execution model that can catalyze really, really well. That’s what makes it very input/output based. There’s no more task model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Here’s a quick question then: you said that it encourages the use of smaller submodules, right? Does that mean that when I write a generic application, it would serve me better to force myself to use these submodules, or does that not necessarily matter? The alternative question is: if I don’t have submodules, am I going to see a benefit with Buck?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Submodules definitely help with build times, but they’re not the only way that Buck is faster—for instance, the parallel execution model. The parallel execution model is very, very fine-grained. All it cares about is the input and the output. So, if you had multiple modules, it’s kind of like the Gradle switch that you can turn on called “parallel build”, except that Buck makes really good use of all the cores in your machine. It understands what the best way is to run all of these targets. Even when you have a vanilla Gradle module setup and you haven’t really spent time to speed it up, you typically see gains of 2x-3x for a clean build.&lt;/p&gt;
&lt;p&gt;To actually prove that fact, we have a &lt;a href="https://github.com/kageiit/android-studio-gradle-test"&gt;test project on GitHub&lt;/a&gt; that shows how the different build systems stack against each other. You can actually build a project with Gradle and build the exact same thing with Buck, and you can see for yourself how it makes a big difference with clean builds.&lt;/p&gt;
&lt;p&gt;Since everything is declared beforehand in Buck (both input and output), there is no such thing as the Gradle configuration time. I don’t know if you ever saw this message: “Gradle configuring project x of y.” You wonder what it’s actually doing in the background. It’s actually doing a lot of stuff to configure the tasks, and figuring out what the inputs and outputs are, but all of that stuff is given to Buck, since the build language it uses makes it very easy for it to skip that configuration phase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s interesting. You said it’s highly customizable, and then you mentioned the build language. Gradle is written in Groovy, right? So Groovy is the language that’s used. Does Buck also use a language, or is it more declarative (like Android Maven)?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; The Buck build files are actually mostly just Python rules. It’s a macro, if you think of it that way. You can actually write Python in the Buck files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Do know what the Buck build system is written in? Is it purely Python, or what is it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; The actual build system is written in Java.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I know Java!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; No more Groovy! Yes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Even Gradle is mostly written in Java nowadays. Older versions of Gradle were written in Groovy, but almost 90% of Gradle is currently in Java.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s interesting and surprising. I mean, I guess it’s more of a familiarity thing as well, but Groovy is supposed to be a better language. Well, actually, I shouldn’t say that…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Who are you talking to?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I’m probably going to get a lot of hate mail on that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; From what I understand, Buck isn’t just used for building Android projects. It’s a build system, so you can use it to build both Android or other projects, like a Go project. Is that correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yeah, it actually supports quite a few languages, and it’s really easy to add new ones. I think it natively supports Java on Android, and Objective-C on iOS (Swift is in the works right now), along with C++, Go, Rust, Haskell, and what have you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I imagine Facebook is using this for their iOS applications, but have you seen Buck being used for other iOS applications?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Actually, we have a counterpart at Uber called the iOS Developer Experience team, and they migrated to Buck before we did. So we basically have both iOS and Android builds orchestrated in Buck at Uber.&lt;/p&gt;
&lt;p&gt;The other really nice thing about Buck, which I have to quickly mention, is that it’s really good at caching stuff. Since it’s based on the input/output rule, if the inputs haven’t changed, it reads the output as up to date. It’s similar to Gradle, but the checks are a lot faster, since they’re not based on timestamps but on the file content. Let’s say you make a build right now, change a file, and do a build. Then you later change your mind and want to go back to the previous state, and you build again. It basically says that everything is up-to-date, because it has already previously built that state of the codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s so cool! How does it do that? Since it doesn’t look at timestamps, does it use a hash or something?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; It maintains a hash, and it also does something else very clever. It runs a file watching service in the background (like a daemon). It’s called &lt;a href="https://facebook.github.io/watchman/docs/install.html"&gt;Watchman&lt;/a&gt;, and it watches certain files which are a part of this target chain. It knows before you even pick a build what has changed already, so it can make decisions really, really fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. So this is like an additional thing that you have, beyond just the regular Buck system?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; You don’t really need it to build in Buck, but it actually makes it much faster, so it’s nice to have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Okay, that’s pretty cool. I know that one of the other advantages that has been for Buck is reproducible builds. How does that work? First, what does it mean? Why is reproducibility important? Why do you need it? And how does Buck provide it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Have you ever had a situation where you or another colleague adds some configuration that depends on things like the version to your build.gradle file? I know that a lot of people want to have the version of the codebase in the build.config, so they typically add it to the build.config fields in Gradle. That means that every time you build, the build.config of the Java changed, so it’ll end up being a full reboot.&lt;/p&gt;
&lt;p&gt;Basically, we’re talking about state that’s outside of the build systems that you’re trying to build in. It’s very easy to do in Gradle. Sometimes, if you’re (say) developing annotation processors, and you include the Tool JAR, those JARs are actually different on every different machine and JDK. Your coworker could have a different JDK from you, which means that what you’re building might be slightly different in terms of hardware, which means that the actual APK that you’re building might have some differences from what you’re seeing. That can be very frustrating when you have small changes that are very hard to debug.&lt;/p&gt;
&lt;p&gt;It’s really hard to do with Buck, because you have to be very clear to have that happen to you. The way that the build language is defined, you can’t depend on environment variables or have dynamic hardcore strings. You can’t really have dynamic dependencies that change for every invocation, for that matter, the way you can with Gradle. That’s part of the usability, which means that if I check out a particular version of the codebase and run it on any machine at any given point of time, I would always be guaranteed to get the same exact output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; And this is not necessarily something you can guarantee with Gradle at the moment?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; You can actually guarantee it, but it’s very easy to mess up. We had an instance where we made this mistake ourselves. When we started migrating it to Buck, we realized, “Hey, why is this target being rebuilt every time?” Then we figured it out: “Oh, it’s because in Gradle, it’s not a problem. We were already used to it being rebuilt every time. But with Buck, it can get pretty annoying, especially when you’re used to really fast build times.” Anything that rebuilds that can be a problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So I’m an Android developer. You’re an Android developer. Kaushik is an Android developer. Everyone who listens is usually an Android developer. We spend all of our day inside of Android Studio, so any time I hear about any of these new tools or things I can use, the number one question in my mind is, “Does this work with Android Studio?” Does Buck work with Android Studio?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Android Studio is purely based off the excellent IntelliJ IDE by the JetBeans folks. If you think about it that way, Buck actually does work with Android Studio, but you may not see all the latest features that Studio might push out. For example, constraint layout is a new thing that Google pushed out. It hadn’t been upstreamed to IntellJ for a long time, but the latest version actually has constraint layout. Eventually, these do end up in IntelliJ, but Studio is definitely something people want to use with any build system. It does work with Android Studio in a limited capacity, but typically, we at Uber use IntelliJ instead of Android Studio, because we don’t miss the Gradle sync times. But that’s completely gone out of the picture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So you use it with IntelliJ, but I imagine you can potentially use it with Android Studio, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GK:&lt;/strong&gt; Yes, you totally can use it with Android Studio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Okay, so we talked about some of the major pain points in the build system for a company as big as Uber, and we found out some of the cool ways in which Buck can help. In the next episode, we’ll actually dive into more specifics with &lt;a href="https://github.com/uber/okbuck"&gt;okBuck&lt;/a&gt;, which makes it way easier to add a build system like Buck to your Android project. Stay tuned for part two!&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/68/</guid><pubDate>Mon, 02 Jan 2017 05:00:48 UTC</pubDate></item><item><title>067: Cross platform development with Xamarin cofounder Joseph Hill</title><link>https://fragmentedpodcast.com/episodes/67/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0047ad19-0291-46a4-809c-c86ad100948d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/0047ad19-0291-46a4-809c-c86ad100948d/067_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn talks with Xamarin cofounder on how one can use Xamarin for Android development.&lt;/p&gt;
&lt;p&gt;They start off chatting about using Xamarin just for business logic sharing. This Joseph tells us was the original intention for use. They also touch on Xamarin forms which allows you to additionally build UI elements cross platform.&lt;/p&gt;
&lt;p&gt;Even if you don’t use Xamarin or plan to use Xamarin right away, this was a fantastic insight into the platform, from the creators directly. They touch on advantages, how to really leverage the platform and potential downsides.&lt;/p&gt;
&lt;p&gt;This is our last episode for 2016 and we’re glad we get to end on an high note. See you in 2017!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.xamarin.com/platform"&gt;Xamarin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.xamarin.com/guides/android/"&gt;Developer guides&lt;/a&gt; (Joseph mentioned they’re particularly proud of this one)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xamarin.com/university"&gt;Xamarin University&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.visualstudio.com/vs/android/#downloadvs"&gt;Download Visual Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xamarin.com/forms"&gt;Xamarin Forms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="apps-using-xamarin-for-code-sharing"&gt;
Apps using Xamarin for Code sharing
&lt;a class="heading-anchor" href="#apps-using-xamarin-for-code-sharing" aria-label="Link to Apps using Xamarin for Code sharing"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.alaskaairlines.android"&gt;Alaska Airlines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.outback.tampa"&gt;Outback steakhouse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="notable-alternatives"&gt;
Notable alternatives:
&lt;a class="heading-anchor" href="#notable-alternatives" aria-label="Link to Notable alternatives:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cordova.apache.org/"&gt;Cordova&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/react-native/"&gt;React Native&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/josephhill"&gt;@josephhill&lt;/a&gt; and &lt;a href="mailto:jhill@microsoft.com"&gt;jhill@microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; I have someone quite special here today. He’s talking about a topic that I’ve been very interested in getting to: cross-platform development. We’ve actually had quite a few people ask us about this. I’d like to welcome Joseph to the show.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Joseph Hill:&lt;/strong&gt; Thanks for having me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Joseph, can you give our listeners who aren’t familiar with you some background information—who you are, what you’re working on, what you’ve worked on in the past, and so forth?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I currently work for Microsoft, since they’ve acquired the company I helped co-found (&lt;a href="https://www.xamarin.com/platform"&gt;Xamarin&lt;/a&gt;). We created Xamarin as a company focused on cross-platform mobile development. The thing that was special for us was understanding that, while people need to create cross-platform apps, they need to create native apps as well. I think that turned out to be the thing that gave the company length.&lt;/p&gt;
&lt;p&gt;Of course, my background before that was as a C# developer and a member of the open-source community. Xamarin itself took the open-source model of technology, and then wanted people to write C# applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Our audience here at Fragmented is mainly made up of Android engineers. We’re highly focused on that. We get a lot of questions about cross-platform development. There are a bunch of different tools for that nowadays, like Xamarin, &lt;a href="http://facebook.github.io/react-native/"&gt;React Native&lt;/a&gt;, &lt;a href="https://cordova.apache.org/"&gt;Cordova&lt;/a&gt;, and who knows what else. But for folks who aren’t familiar with what Xamarin is: if you were in an elevator together, how would you explain Xamarin to another engineer?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; First and foremost, Xamarin has always been focused on letting developers do anything with C# that they could do with Objective-C or Swift on iOS, or Java on Android. The idea is basically a complete mapping of Android APIs to C#, giving the ability to use things like Native Android Layout, XML, Android resources, and even libraries, but with the C# programming language. The benefits to that are obvious if you’re a C# developer already; but even if you aren’t, it’s nice to have a language that’s powerful, and available on Android, iOS, Windows, and web servers, because you don’t have rewrite code. Also, it helps you avoid bugs—you don’t fix a bug on one platform and then find out months later that you still have the same bug in a different code base on another platform.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You said that I can use C# to develop Android apps, but you also mentioned iOS. Does that mean that I just write the code once and compile it, and I get two outputs from the one app, or do I have to code for each individual platform?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; You can share code, but at the end of the day, you’re writing a native iOS app and a native Android app. Historically speaking, we started by putting C# on iOS. We wanted to enable the developers (Windows developers, at the time) who were telling us, “Hey, we need to get to iOS. Can you help us do it?” There was a temptation to just give them all the APIs they had on Windows, so that they could make ugly Windows apps running on iOS. But we didn’t want to do that. We wanted them to make great iOS apps.&lt;/p&gt;
&lt;p&gt;At first, once we produced the iOS product, people would ask us about Android, and we’d say, “Android uses Java. Java’s enough like C#. Just use it.” But these forward-thinking developers would say, “Well, it’s about the advantages of using a single language. Plus Visual Studio is a great IDE, and I want to be able to leverage all of the benefits of this ecosystem.” So it was from that tipping point at the very beginning that we said, “This actually resonates with developers—not being ‘write once, run anywhere’, but to actually be native first while keeping cross-platform capabilities.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let’s dig a little deeper into the weeds here. Say upper management hears about how great cross-platform development is—it’s going to save a lot of money in the future, since developers only have to write apps in one language, and so forth. If I wanted to build both an iOS app and an Android app and share some code between them, what does that look like from a developer perspective? Do I have different projects in GitHub, or do I just have one big project with shared code?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; In the Visual Studio build system, we have the concept of solutions, where each solution can have multiple projects in it. Android Studio follows essentially the same model, of course. When you’re working with Xamarin, you would have a head project for each platform that you’re targeting. You might have one project for your Android-specific code, another project for your iOS-specific code, and a shared project, like you said.&lt;/p&gt;
&lt;p&gt;You can share libraries. You can either write the libraries or use libraries that other people have written which are cross-platform. You might end up with multiple shared projects within your solution. We also make a library called &lt;a href="https://www.xamarin.com/forms"&gt;Xamarin.Forms&lt;/a&gt;. It’s an abstraction toolkit that focuses on some kinds of UI sharing, so you could share UI code as well.&lt;/p&gt;
&lt;p&gt;But typically, you’re going to have a project with code that’s specific to each platform that you’re targeting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So I would keep pertinent business logic that applies across all projects in those shared projects. Is that correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Right. Let’s say you’re making an app that needs to render some financial calculations, so you write some logic that creates amortization tables. If you did that on the web, you would just do it all on the server. You wouldn’t want to run calculations on the device, because you can’t trust those calculations.&lt;/p&gt;
&lt;p&gt;But you’re going to render these tables on the phone, and you want to run the calculations locally on the device so that the user has a responsive experience when they see what the models look like or what the final costs are going to be. But you’re going to run the same logic you ran on the server, since you trust those models.&lt;/p&gt;
&lt;p&gt;Then there’s also code sharing for things like authentication. Maybe you have ten apps, but they always run against the same user/password login system—the same authorization-granting API. So you put that logic in a library which ends up getting used across your apps. Or, if you’re in a large organization, other parts of the organization can use those same components in their apps as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; To bring it full circle (keeping it simple), we have one shared library where we have all of our authentication logic, and where we build those amortization tables and any other financial things we’re going to work on. Then, on top of that, we have Xamarin for Android, Xamarin for iOS, and so forth, which talk to those same shared libraries.&lt;/p&gt;
&lt;p&gt;But as a developer, I only have to write that code once. Then I unit test it, or whatever, and it’s good to go. I know that it works, and that it’s going to work the same on both platforms, since both platforms talk to the same shared library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Right. Importantly, if you find a problem in your model and fix it, you know that you fixed it on both platforms. And if you’re working in a single solution and change an API in your shared code, you get feedback right away from your iOS and Android projects that those guys are still building. You didn’t really break anything that both apps are depending on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Just to make sure that I’m for with the listeners, all of this is written in C#, right? As in, is Xamarin all C#, top to bottom?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Talking specifically about Android code, we expose all of the Android APIs as C# code. So, when you have an Android specific project in your solution, you write all of that code in C#.&lt;/p&gt;
&lt;p&gt;The exception comes when you’re also using Android XML for layout. If you were using other tools for processing Android layouts, you would have access to all of those, but we’re not making you write Java code—although you can bind Java code. On the iOS side, you can bind Objective-C code. You can bind C code. All of that is available to you, but we give you the ability to just write C#.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You bring up a very good point there. In Java (actually, in pretty much all of the languages now), we have a very big open-source community with tons of libraries available. Especially in Android, if you look at your &lt;code&gt;build.gradle&lt;/code&gt; file, every project has a ton of dependencies that are pulled in—logging libraries, API libraries, and everything else. If I want to continue using libraries that I’m already kind of familiar with, since they do a great job, can I continue to do so?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Absolutely. Now, they don’t become inherently cross-platform when you do that. It’s not like when you opt into Xamarin, your Android JAR files can be used by your Xamarin iOS app. But by all means, you can continue using any Android libraries you were using before.&lt;/p&gt;
&lt;p&gt;Occasionally, if it’s an open-source library, customers will opt to port it from Java to C#, since that’s fairly straightforward. That’s also an option, and that might give you the ability to make the code more portable to iOS, but you don’t have to do that.&lt;/p&gt;
&lt;p&gt;In fact, some of our customers who already have an app written in Java will keep a big chunk of that app, compile it as a JAR, and just start building new code in C# tomorrow. They won’t necessarily mess with the working Java code they already have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s important, because a lot of the teams that I work with on a day-to-day basis build a lot of Android custom views that do a specific thing in Android which we don’t really want in iOS (or isn’t even iOS specific)—think floating action buttons and Material Design things that we’ve custom built. It sounds like just I can pull those in and use them in the Android version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Like I said, there’s a gradient. You can pull those in and make them as Xamarin specific as you want, or just leave them as is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I think that when a lot of people hear about Xamarin, they’re afraid of leaving everything that they know to hop over to something like this: “I know all of these libraries, but now I’m going to hop over here, and I can’t use them.” I think that knowing you can still use them is a big win.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Historically, in the case of .NET and Java, you can almost always find the same libraries in the other language, or forks and ports of those libraries. At the same time, making it easy to consume libraries as is has always been a top tenet for us. You can start with one approach and switch to the other, so it’s very easy to ease yourself into it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So you guys basically run C#, and you’re able to talk to all of the Android and iOS API bindings. But let’s say I’m building an Android app. How is the bridge made from writing C# to actually getting a native Android application? What happens and how is that maintained?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; At the end of the day, Xamarin uses the Mono runtime (at the core) to compile C# to Intermediate Language (IL)—like how Java compiles to Java bytecode. Then, in the case of Android, that IL is turned into ARM executables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What is IL, for those who are coming from the Java world?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; The Intermediate Language is very much like bytecode, but C# compiles and F# compile to it. Then it’s the job of (on Android) the JIT to just-in-time turn that intermediate representation into an actual native ARM executable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So it’s truly native? It’s not like running a WebView inside of my app?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Correct. When we talk about these bindings, what we’re really saying is that we’re using JNI with that. It’s a bridge between the .NET code and the Java code. Also, we have cooperative garbage collector that makes sure that when we dispose of an object on the Java side, it goes away on the .NET side (and vice versa).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Are there any performance implications to doing that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; That’s what I was about to say. There’s a performance implication to speaking across the bridge. If you were in a tight loop, creating an Android button, and you made a list in an odd way, you might stack a bunch of buttons up and create all of them. There is an additional cost to doing that.&lt;/p&gt;
&lt;p&gt;On the flip side, we have a very high performance JIT. When comparing strict C# (which is not speaking across the bridge) to strict Java, we perform at least as well. I don’t have specific benchmarks in front of me, but there are even places where C# code would actually perform better. Typically, I just wouldn’t really consider that there’s a performance cost to choosing to use C#. It really only comes to light when you’re doing something the wrong way, like I just described—where you’re doing a lot of cross-talking from C# to Java that you probably shouldn’t be. Instead, you would just take a different approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Does the same thing happen for iOS?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; iOS is not JIT-ted. When we talk about JIT, we’re talking about just-in-time conversion of the intermediate representation to the ARM executable code. On Android, that’s completely allowable. Basically, you generate some code you want to execute, make it executable, and run that code.&lt;/p&gt;
&lt;p&gt;But on iOS, that’s not allowed as a security restriction. When you start writing to memory, you’re not able to make that memory executable, which means you can’t have a JIT on the device. You could certainly generate all the code, but iOS will never let you execute that ARM code once you’ve generated it. So, we use ahead-of-time compilation on iOS. Our AOT uses LLVM, which is an optimizing compiler. It’s the same back end used for Objective-C and Swift, so (at the end of the day) you’re generating the same ARM code that you would generate from those languages. But it’s all generated ahead of time on your Mac, before it’s compiled into the app that you ship.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Lt’s go back and really hop into the weeds here. Suppose I’m writing an app, and I need to put a text box into and Android form, and then get a reference from it. In Android, we normally do things like &lt;code&gt;findViewById()&lt;/code&gt;. Then we get a reference to that, and we can work with it. If I’m doing this in Xamarin, am I working with a .NET text box or with the Xamarin representation of an Android text box?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; You’re speaking directly to the Android text box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So it would be like a TextView, an EditText, or something like that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; And you could do exactly what you just said. It’s still “find by ID”. It’s the same resources pile, which gives you the same handles (the same IDs). That model should be instantly familiar to any Android developer, because it’s the same.&lt;/p&gt;
&lt;p&gt;Going back to what I said earlier with Android XML, layout is also going to be the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; We still write our layouts in XML, then?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Correct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; From my personal experience as a previous C# developer, I know that making the change from C# to Java (and vice versa) is actually quite easy, because the languages are very similar. Personally, I actually prefer C#, which might come as a shock to a lot of our listeners. I think it’s a beautiful language. I know that my co-host Kaushik also loves C# and feels it’s a very beautiful language. That’s one thing which I definitely miss from working inside of Java for the last eight years, which is having access to the beautiful language that is C#. It seems like Xamarin gives you that ability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; If you look at early versions of C#—which is probably what most Java developers who have been around for a while made their assumptions about what the language from—C# and Java look very similar. But actually, C# has evolved quite a bit. Java has even evolved to pick up some of the C# idioms. C# continues to evolve, bringing in nice features like &lt;code&gt;async&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, that’s a beautiful one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I’m biased toward C# (many people are), but at the same time, there is a common heritage. They’re clearly inspired by the same C-type constructs, with semi-colons and curly braces. Typically, people give it an objective look. First off, it’s something you can get comfortable with very quickly, and moving the other direction is fine as well, though you’re going to miss the features that you got used to on the C# side.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, when I came over to Java, I had an array list of something and I went to go use a lambda expression, but it just wasn’t there. I found myself writing so many verbose for-loops and so forth, so I can definitely relate.&lt;/p&gt;
&lt;p&gt;But let’s take this in a slightly different direction here. Android releases new operating systems all the time. They’ve released Marshmallow, N, etc. They just keep coming out (and will hopefully continue coming out). When a new Android version is coming out, either as a developer preview or when it’s being released, how does that get into Xamarin? If I’m using Xamarin, can I actually use those new APIs?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Every time there’s a preview of a new Android release, we have a team of engineers who download it and start creating bindings right away. We have tools for generating those bindings, so it’s typically a process of coming along behind the generated bindings and saying, “This is not quite what you would expect the C# API to look like.” So we go through and refine it, bringing async into APIs that need to be async-ified. Or, if developers would expect a more delicate model for raising events or whatever, we try to bring in the C# behaviors that we think they would expect to see on top of that.&lt;/p&gt;
&lt;p&gt;What’s really neat is that Xamarin was (of course) a proprietary solution for the past 5+ years, but after Microsoft’s acquisition of us, they open-sourced everything. So, if you watch it all on GitHub, you can actually see this whole binding process take place publicly. We aren’t just dumping this out there. We encourage the community to come participate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So if I find a bug in a particular implementation of a UI widget, for instance, can I create a pull request back to the project?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Yes, please do. We would love to have those. Also, it’s nice to be in a situation where we have a community that’s anxious to have this kind of help. If Google drops a new preview of the next version of Android, and there’s an API that you’re really anxious to try, jump in! We’re here to help you take advantage of that API, start binding it, and get involved with the community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s excellent to hear, especially since it’s open-source now. Just to be clear, if a new version of Android comes out and it has a new UI widget, your team of engineers will hop in there and create that binding so that you can expose it inside of Xamarin, correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; That’s our priority—making sure that it’s not only exposed, but that it’s a beautiful looking API that developers want to use. But you’re absolutely free to go bind it yourself. You don’t have to contribute it back if you think we’re going to do it anyway. If you just want a quick and dirty hack to be able to try something out, you can do that as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What’s the average turnaround time that you guys usually have when a new release is pushed out before it is available to the public?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; That’s a good question. We have an excellent track record of tracking these things very closely with iOS. Apple gives us a nice, long lead time. You start seeing previews that we can start tracking with our own previews in the summer (at WWDC). By the time they get close to GM, we have everything bound and most of the kinks worked out, and people can start submitting apps to the app store before the release.&lt;/p&gt;
&lt;p&gt;On the Android side, we’ve historically lagged more behind. Because of the adoption curve of new versions, it hasn’t been as pressing that we track them closely, and we’ve never gotten publicly dinged for not doing that. But the nice thing is that, as we’ve gotten more developers on board, we’ve begun having more customers that even Google cares about. They have a vested interest in us supporting this new API soon as well, because they want to push adoption of new versions. So I don’t think we’re quite the same day yet, but I think we are in a position to be close.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Would you say it’s within the month? Two months?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I was shying away from that, because I don’t remember what the exact period was on the latest release. I do know that a year ago, we were out within days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s amazing, though. I personally don’t have a problem with that, especially when you’re creating a bridge between two different languages. A couple of days? I can wait. If I’m a C# developer (and I used to be on many C# teams), and I need to support the new version of Android, I can probably wait a couple of days afterward. Again, I know there are people who feel differently, but I don’t see why it’s a humongous problem (although the fact that you guys are trying to push forward is great).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Having a community there and people who care about native development certainly pushes it forward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You mentioned something called Xamarin.Forms. Yesterday, here at the Microsoft Connect event (right now, we’re in the New York City Microsoft offices), they were saying that they had used both shared libraries (like we were talking about earlier) and Xamarin.Forms to build an application, basically allowing for over 90% code sharing between the platforms. What is Xamarin.Forms, and if I’m a new Xamarin developer, why should I care about it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; From day one, we kept telling developers that they should be creating native experiences. But a lot of times, businesses would be coming back to developers, saying, “We really just want you to write it once.” So Xamarin.Forms is basically a library that we created to fit that need: giving the developers the ability to do write once, run anywhere with Xamarin when they need to, without necessarily giving up completely on the ability to do native things.&lt;/p&gt;
&lt;p&gt;Xamarin.Forms is an abstraction toolkit that gives you layouts and controls for writing cross-platform apps. Depending on the kind of app you want, you can share up to 100% of the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Between platforms? As in…iOS and Android?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; iOS, Android, and Windows UDP. The trade-off is less control over exactly how things get rendered, but since it’s still an abstraction, it’s still using native rendering. When you make a Xamarin.Forms app, you define a layout, and then Xamarin.Forms decides how to use native buttons, native text boxes, etc. So you end up with a native look and feel, even though you may not have quite the complete control to say, “This is the native behavior I expected.”&lt;/p&gt;
&lt;p&gt;Xamarin.Forms was designed to keep those native capabilities at arms length. With the first release, we had this idea of custom renderers. As soon as you realize, “I need this screen to be native,” we’ll give you the ability to put a native screen in there. What you saw James demonstrate on stage yesterday was how we’ve made native embedding even easier. Instead of having to figure out what a custom renderer is, or how you should go about writing one (which is probably creating a new class, extending something, or whatever), the native embedding…&lt;/p&gt;
&lt;p&gt;Actually, let me take a quick step back. Xamarin.Forms layout is done in XAML (another XML format, separate from iOS storyboards or Android XML). Typically, if you’re making your UI in Xamarin.Forms, you can write it in C#, but you can also write it declaratively in XAML.&lt;/p&gt;
&lt;p&gt;Anyway, in his example, James took an iOS segmented control and said, “That’s the control I want. It’s iOS specific, but I want it in the middle of this Xamarin.Forms page.” So, in the XAML, he was able to start a new tag that says, “Give me the iOS segmented control right here.” On Android, that’s nothing. It’s ignored. It doesn’t exist. But on iOS, it’s going to render that control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Suppose I’ve built a nice little custom UI widget for Android and for iOS that has a certain behavior for my particular business needs. Is there a way to say in XAML, “Hey, if we’re running Android, show this one; but if we’re running iOS, show this one”?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Absolutely. That’s what the custom renderer is. With the custom renderer, you tell Xamarin.Forms at the shared code level, “I’ve written a custom pie chart that renders the way my business wants it. On iOS, it’s rendered one way; on Android, in another. Give me the thing that on this platform is the pie chart.” That’s how Xamarin.Forms itself works under the cover. We give you a lot of renderers packaged in, but the community has created many custom controls of their own. So that’s how you go about doing that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Okay, let me bring it from top to bottom again for our listeners. If we start at the bottom, we have the shared libraries, which talk to our API and hold our authentication, business logic, and so forth. That’s shared across both iOS and Android. Then, from there, we’ve now introduced this new layer (Xamarin.Forms) which allows us to write our UI once and display it on various different platforms. Then, on top of that, we have our independent platforms (Android and iOS). That stack reduces that layer to a much thinner surface area. Would you agree?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; That’s the objective.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Basically, I have very little Android and iOS specific code. The rest of it is shared.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Again, we’re developers. We recognize the productivity benefits that developers want to get from sharing code, and what businesses want to get from sharing code. With Xamarin.Forms, we want to make that possible. At the same time, we recognize that when you put the app into the hands of users, they may say, “This is not the behavior I was expecting. When I’m running my other Android apps, they do the right thing. Why can’t you do that?” We don’t want developers to be stuck with an abstraction. Instead, we want to give them the power to come back and put some native polish on it, like a floating action button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So that means that if I want to implement the Material Design guidelines on Android (this is a big thing), I can add some custom renderers and have that full, nice, fluid motion; the ripple effects; and all of that stuff. Then for iOS—well, I’m not an iOS developer, so I don’t know the exact terms, but I can implement everything iOS-style there as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Correct. That’s the power we want to put in the developer’s hands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Which brings up a question that Kaushik really wanted me to ask you: “Can you build really complex apps with Xamarin, or are you shoehorned into creating simple applications that are just forms over data?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I think that’s a leading question for Xamarin.Forms. Sometimes, developers only try the Xamarin.Forms approach since it has the same name as Xamarin. I do think it’s nice to be able to speak specifically to this topic, because that perception might be true with Xamarin.Forms—that it’s good for forms over data apps. It’s powerful for other things (like prototyping) as well, but it’s not the right solution for everything.&lt;/p&gt;
&lt;p&gt;With Xamarin itself, the functionality is better than just a toy. We not only want you to be able to build any kind of app you want, but we want your apps to be better. Since you were able to be more productive with C#, Visual Studio, and sharing that code in more places, you can spend more time making new features, rather than implementing the same feature twice.&lt;/p&gt;
&lt;p&gt;C# is powerful and performant. It powers a lot of games. It’s big in VR and AR. All of that functionality and power being back in the hands of the developer—that’s much more than just a toy app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; For example, I recently got done with a client project: building a fitness application. Google has released an audio player called ExoPlayer, which is a very configurable audio player for Android. We played audio classes through that, because we needed to control buffering and all of this other stuff. As you said before, I can still use that library for Android with Xamarin. I can still connect to that library, do the audio playback, and everything, correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Absolutely. The situation here, then, is finding an equivalent library over on the iOS side (if you want to have that functionality over there).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So I can build those media playback applications, and I’m not limited to the Forms. Even though it’s called “Xamarin.Forms”, I’m not shoehorned into x amount of controls. I have those, and if I want to hop into fine-grained Android, I can go back and do that too.&lt;/p&gt;
&lt;p&gt;What apps or companies that we’d be familiar with are currently using Xamarin?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; A lot of businesses are going mobile, so many of the stories I keep hearing are from shipping companies and airlines (like &lt;a href="https://play.google.com/store/apps/details?id=com.alaskaairlines.android"&gt;Alaska Airlines&lt;/a&gt;) putting devices in the hands of field workers and field engineers.&lt;/p&gt;
&lt;p&gt;But one of my favorite stories recently has been &lt;a href="https://play.google.com/store/apps/details?id=com.outback.tampa"&gt;Outback Steakhouse&lt;/a&gt;. They’ve written a five-star app in Xamarin. Almost every restaurant has an app these days. It’s kind of like a web page. They have to put some information on the page so that people know where to call to make reservations, and can get directions and see the menu.&lt;/p&gt;
&lt;p&gt;But what Outback asked, “Customers have these devices in their hands. How can we provide a better experience to them when everybody has a mobile app?” The app is reviewed very well not only because it’s native and provides a pleasant experience, but because it lets you do cool things like pay directly from your phone (so you don’t have to wait for the server). That’s transformative to business. Those are the things that make being in this space now a fun place to be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’ve worked with a lot of startups, and I get courted by a lot more. They often ask me a question: “Should we use Xamarin, PhoneGap, or React Native?” To be honest, I don’t have any experience with PhoneGap or React Native, other than just perusing the documentation. I’ve actually built apps with Xamarin, though, so I can speak to it. I know that you’re going to be biased toward Xamarin, but what’s your response to that when a company comes to you? Do you have a set of parameters, so you can say, “Well, in this case, you’ll probably want to go with React Native,” or “In this case, you’ll want to go with Xamarin,” or is it always Xamarin?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I’m incredibly biased, but let me at least give you my justifications for being biased. All the other solutions you mentioned (Cordova, PhoneGap, and React Native) fall into a class of APIs that are frankly closer to (at best) the Xamarin.Forms experience.&lt;/p&gt;
&lt;p&gt;In the world of React Native, for instance, you’re given a limited set of APIs to build your apps. If you like Javascript…I mean, it’s popular for a reason. It lets you do some cool things, and also makes for great demos. I’m biased toward C# because I think it’s a more powerful language, but at the end of the day, despite the name, React Native is not the 100% mapping of native APIs that Xamarin gives you. With Xamarin, you’re never caught in a place where you need something and can’t get to it.&lt;/p&gt;
&lt;p&gt;The other argument people typically use is, “Well, it’s only two platforms. I don’t like writing in two different code bases, but it’s only Objective-C (or Swift) and Java. We’ve decided we need a native experience, but do we even care about sharing code?” A lot of times, people will end up with an iOS-specific app (or a Java specific app) because that was their requirement at the time—you know, “We’re buying iPads, so I know I’m writing an iOS app. I’m just going to use Objective-C or Swift, because it’s just the iPad today.”&lt;/p&gt;
&lt;p&gt;But then, six months later, you’re done with the iPad app and everyone is pleased with it—and you have to do a new app on Android. Suddenly, your app is cross-platform, and you wish you could use some of the code that you had before: “Oh, I just wrote authentication for that app on the iPad. Now I’m going to be writing authentication and all of these web service calls again, and offering data synchronization. It’s a totally different app—except it’s not. It’s still the same model, so I’m still using the same business objects that used in the other app.”&lt;/p&gt;
&lt;p&gt;So you’re not necessarily a cross-platform developer, because you’re not writing a single app cross-platform; but (over the course of the year) you are a cross-platform developer, because you keep having to write for this platform, then that platform, then bringing it back to the web. It’s when you’re in that mode that you realize that cross-platform is more than just trying to write one app for multiple platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let’s say that I’m an engineer or an engineering manager. After hearing this interview, I go take a look at Xamarin and say, “This looks like something interesting for me or my team. I want to take us there. But we already have an existing Android application. How do we go from that native Java Android app to Xamarin? Is there any help for that?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; There is help, but there’s also just the fact that Java is pretty approachable. Hopefully by now, you understand that the structure of Xamarin compared to Android with Java has a lot of similarities beyond just the language—for instance, you’re using the same Android XML.&lt;/p&gt;
&lt;p&gt;A lot of it depends on the size and complexity of your app, and what your objectives are for getting to the other side. It probably needs to be decided on a case by case basis.&lt;/p&gt;
&lt;p&gt;At a minimum, though you should enter this thinking, “Oh, I can file a new app, and copy over my Android XML resources and everything else that’s not the code into my new Xamarin Android project and leverage that. That’s not being rewritten. Then I can take the Java and convert that, though it might be a little tedious. You can probably find tools out there that can convert Java to C#, so that could help.&lt;/p&gt;
&lt;p&gt;Lastly, you could get back to that part about bindings, and being able to leverage native libraries. You could just take the Java you’ve already written, keep it compiled as a JAR, and save it for porting later. Make sure you’re committed to moving over, add some Xamarin functionality, and use those two things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; So you could just see if it works—kind of kick the tires a bit. That makes sense. It seems like a very viable approach, especially if I can compile at least the non-Android stuff down into a JAR and reuse it. I think that would ease a lot of pain and apprehension that some folks have about transitioning over a larger existing project.&lt;/p&gt;
&lt;p&gt;Here’s the million-dollar question: if I’m developing for Xamarin, it’s in C#. Let’s be honest: when everybody thinks of C#, they think of Windows. Do I have to buy a Windows machine to do this? Where can I develop this? What do I need?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; That’s a great question. If you’re going to develop for Android, you can currently do it on Windows or Mac. We’ve now open-sourced the full toolchain, so you could even (with a lot fewer IDE conveniences) do a lot of it on Linux if that’s what you wanted to do. But from our tooling perspective, if you’re on Mac or Windows, it’s not going to be that different. You have Visual Studio on Windows, of course; and yesterday, we announced Visual Studio for Mac. That was previously Xamarin Studio, which was a mobile-specific IDE that’s very Visual Studio-like. We’re beginning to bring Visual Studio functionality into it, so that you aren’t just writing mobile apps, but are able to write your ASP.Net core back inside the IDE and share that code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That will run on Unix based systems too, with the announcements that were made yesterday that .NET will run on those systems. So it doesn’t matter: you can deploy your back-end to Linux as well.&lt;/p&gt;
&lt;p&gt;The last real question that I have here is: are there are any real gotchas about Xamarin? Is there anything we developers should be aware of when looking into Xamarin?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; Way to end it on a happy note! I think that the challenges I see people hitting today are very different from what they were a few years ago. We used to get dinged on the size of the runtime, but apps are now so big that when the Mono runtime adds a couple of MB, it can still be smaller than most of your other apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s a good question. How much size does it add? Just a couple MB?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; It starts at about 4 MB. I think we’re actually under that, and we’re constantly trying to trim it down. When you bring in portions of .NET libraries that you’re using, we use a linker to link away the portions that you aren’t, so we give you the minimum amount of Xamarin and Xamarin libraries that are needed to support your app. That does add some size, and I know that people still look at that, so you do have to be aware that that’s coming in there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let me interject on your sizing comment there. A lot of folks who listen to this worry about the size of their Android applications and about how many methods they have. It turns into an almost religious war inside of Android itself. Personally, I’m very pragmatic about the situation. If I can gain a ton of productivity by using a different tool—Xamarin or whatever—and it’s going to cost me a few MB, at the end of the day, I don’t care. It’s allowing me to ship my app faster and be much more productive, so a couple of MB are really not that big of a deal. I think that people need to recognize that they are building something, and not focus on these minute details and tear something apart because it adds a couple of MB.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; There’s something we refer to as the power of defaults. We give you defaults that make things work, but they can always be tuned later. You can choose what ARM processors and API levels you’re targeting. So I pretty much agree with you: on the runtime side, I don’t think you should sweat it.&lt;/p&gt;
&lt;p&gt;And the challenges of large Android apps are something that hit everyone, regardless of whether you are using our framework. We’re all learning together what strategies to use to reduce late loading. We all share in figuring that stuff out together. I would hope that if you’re pragmatic (and you should be), this is not something you’re sweating about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If folks want to get started with Xamarin, where should they go? How do they learn more about it? Where do they download it? What does that look like?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; There is of course, &lt;a href="https://www.xamarin.com/download"&gt;https://www.xamarin.com/download&lt;/a&gt;. You can &lt;a href="https://www.visualstudio.com/vs/android/#downloadvs"&gt;get Visual Studio&lt;/a&gt; or our own IDE, Xamarin Studio, directly from there. We have a developer portal, &lt;a href="https://developer.xamarin.com/guides/android/"&gt;https://developer.xamarin.com/guides/android/&lt;/a&gt;, which has tons of great documentation. We’re very proud of the work we put into the that.&lt;/p&gt;
&lt;p&gt;We also have &lt;a href="https://www.xamarin.com/university"&gt;Xamarin University&lt;/a&gt;. Prior to our acquisition, it was a fairly expensive service that provided a lot of great instruction for learning Xamarin development and mobile development in general. That still exists, and it’s still a great product. One thing that we’ve been doing over the past month is turning some of that content into self-guided learning, so that’s a really great place to start. You can learn a lot about mobile development, development with C#, and just getting started with Xamarin by checking that out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I think it’s important to note to our listeners: as a very heavily focused Android podcast, we’re all Java developers here. But I’ve been part of a gaming company in Minnesota for years. We recently went through a big rewrite. Everything was all native Objective-C and Android Java, and we rewrote it all in Xamarin. I don’t think you should dismiss this simply because it’s a Microsoft product. It’s a very viable product, which I have used previously, all the way back to when it was just called MonoTouch. It saved me a lot of time in developing applications like that.&lt;/p&gt;
&lt;p&gt;You’re going to have some of bugs regardless, but if you’re having problems building applications and doing cross-platform stuff, or running into business logic issues or weird platform bugs, Xamarin and Xamarin.Forms are definitely worth taking a look at. This is from my own personal experience, and it’s been fantastic.&lt;/p&gt;
&lt;p&gt;Is there anything you would like to share with the listeners here before we wrap up?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I’d just like to piggyback off of what you said there. We have a great community that’s been very passionate for the years we have been around. It’s large, and it’s been growing at a healthy clip. But when Microsoft acquired us and made everything not only free, but open source, it grew our community by multiples, so it’s a great time to get involved. There are lots of other people learning it at the same time.&lt;/p&gt;
&lt;p&gt;People always have had concerns about our company, with a commercial product that we were charging a lot for that could go away: “Do I want to stake my business on this?” Now it’s such a big part of what we are doing with Visual Studio (and of course, on the Microsoft side, with Azure) that it’s really brought down barriers for a lot of people to adopt it. It’s been great for the community.&lt;/p&gt;
&lt;p&gt;Like I said, any developers who care about C# being a great language aside, I think we have a good approach for the cross-platform challenges we’re all facing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If folks want to reach you, what’s the best way to do that? Are you on Twitter?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I am &lt;a href="https://twitter.com/josephhill"&gt;@josephhill&lt;/a&gt; on Twitter. You can also email me at &lt;a href="mailto:jhill@microsoft.com"&gt;jhill@microsoft.com&lt;/a&gt;. I love Twitter and have a lot of fun there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; We appreciate you coming on the show. This has been super informative. The topic has been requested quite a few times over the last year. A lot of folks want to hear about cross-platform development, Xamarin, and what we think about it. This has been a phenomenal, really good deep dive into what Xamarin is. I can’t say thanks enough, and I know that Kaushik would say the same thing if he were here. Thank you for coming on the show, Joseph.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JH:&lt;/strong&gt; I appreciate that. I hope your audience enjoys this—and if they do, we have lots of great people in the community that you should have on your show in the future.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/67/</guid><pubDate>Mon, 19 Dec 2016 05:00:29 UTC</pubDate></item><item><title>066: Let’s talk Immutability, Value Types and AutoValue with Ryan Harter</title><link>https://fragmentedpodcast.com/episodes/66/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d6f46c3e-b052-4406-88b9-613b13ac1b43?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d6f46c3e-b052-4406-88b9-613b13ac1b43/066_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to our good friend and immutability champ Ryan Harter. We start off talking about the benefits and disadvantages of immutability, then we dive into Value types and the subtle difference with Value types. Finally we close out by talking about AutoValue and how you can extend it using the super nifty auto-value extension system for functionality like Parcelability, Json parsing etc.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h2 id="about-ryan"&gt;
About Ryan
&lt;a class="heading-anchor" href="#about-ryan" aria-label="Link to About Ryan"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.pixite.pigment&amp;amp;hl=en"&gt;Pigment (coloring for adults)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.pixite.fragment&amp;amp;hl=en"&gt;Fragment (prismatic photography art)&lt;/a&gt; (His &lt;a href="http://ryanharter.com/blog/2014/08/21/bringing-an-app-to-android/"&gt;blog post&lt;/a&gt; on the same)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/42/"&gt;Fragmented: Google IO special (Ryan was one of our guests)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;
References
&lt;a class="heading-anchor" href="#references" aria-label="Link to References"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/bliki/ValueObject.html"&gt;Martin Fowler’s updated article on ValueObjects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Effective Java Fragments:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/14"&gt;Ep 14: Consider providing static factory methods instead of constructors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/31/"&gt;Ep 31: Obey the general contract when overriding equals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/34/"&gt;Ep 34: Always Override hashcode when overriding equals&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.methodscount.com/"&gt;Methods Count (check number of methods for a library)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="autovalue"&gt;
AutoValue
&lt;a class="heading-anchor" href="#autovalue" aria-label="Link to AutoValue"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/auto/tree/master/value"&gt;AutoValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/auto/blob/master/value/userguide/builders.md"&gt;AutoValue Builders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/auto/tree/master/factory"&gt;AutoValue Factory&lt;/a&gt; (different from AutoValue Builders)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/757743/what-is-the-difference-between-builder-design-pattern-and-factory-design-pattern"&gt;Difference between Builder and Factory patterns &lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="autovalue-extensions"&gt;
AutoValue extensions
&lt;a class="heading-anchor" href="#autovalue-extensions" aria-label="Link to AutoValue extensions"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ryanharter.com/blog/2016/05/16/autovalue-extensions/"&gt;Ryan’s blog post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rharter/auto-value-parcel"&gt;AutoValue Parcel&lt;/a&gt; [github.com/rharter]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gabrielittner/auto-value-cursor"&gt;AutoValue Cursor&lt;/a&gt; [github.com/gabrielittner]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/auto-value-redacted"&gt;AutoValue Redacted&lt;/a&gt; [github.com/square]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rharter/auto-value-moshi"&gt;AutoValue Moshi&lt;/a&gt; [github.com/rharter]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rharter/auto-value-gson"&gt;AutoValue Gson&lt;/a&gt; [github.com/rharter]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mattlogan/auto-value-firebase"&gt;AutoValue Firebase&lt;/a&gt; [github.com/mattlogan]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://projectlombok.org/"&gt;Project Lombok&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/auto"&gt;Google’s Auto Libraries (code generating helpers)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ryanharter.com/blog/"&gt;Ryan’s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/instructors/ryan-harter/"&gt;Ryan’s Caster.io series&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chicagoroboto.com/"&gt;Chicago Roboto 2017&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rharter"&gt;@rharter&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Kaushik, we’re back again, my friend.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; Yes, we are. It’s another morning. What’s the time there?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; It’s 9:45 in the morning. It’s pretty early for you, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yes, it’s 6:45 here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Thank you so much for getting up that early. I know it’s difficult, especially when you’re working all hours of the night for a startup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Well, it’s enjoyable, especially when we have great guests on the show and great topics to talk about. So, who do we have on today?&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; We have a close friend of the show, who we’ve spoken to before and know through various other channels. Today, this individual is an expert in the area of value objects, and so forth. He’s another Android GDE and an &lt;a href="https://caster.io/instructors/ryan-harter/"&gt;instructor on Castor.io&lt;/a&gt;, and is very active in the community. With that said, I’d like to welcome Ryan Harter to the show. Welcome to the show, Ryan!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ryan Harter:&lt;/strong&gt; Thank you! It’s great to be here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; For folks who aren’t familiar with who you are, can you give us some information about your background, where you work, and how you got into Android?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Sure. Let me start with how I got into Android. While I was in college, I was a Mac desktop developer. In fact, I managed all the Macs on campus. When I graduated, the iPhone was really big, so I went into mobile development. Android was still in its really early stages then, and the consulting firm I was at just didn’t have anyone who programmed for Android. So, I took up that role and became the Android lead there in 2009 or so.&lt;/p&gt;
&lt;p&gt;Since then, I’ve struck out on my own. For the last four years or so, I’ve been a freelancer. I work with a lot of different companies on a lot of really cool projects. It’s been really good. One of my personal projects is working with five other guys in San Diego. We do graphics and entertainment apps, and one that we’re just about to release for the holiday season is called &lt;a href="https://play.google.com/store/apps/details?id=com.pixite.pigment&amp;amp;hl=en"&gt;Pigment&lt;/a&gt;. It’s an adult coloring book app that we’re really excited about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I saw that (I think you tweeted about it or something), and it looked super interesting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; It’s really fun. I wasn’t into adult coloring before, but since writing that app, I’ve been spending a lot of my free time coloring in artwork, which is also a lot of fun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; For folks who’ve listened to this show for some time now, you made a guest appearance in &lt;a href="http://fragmentedpodcast.com/episodes/42/"&gt;our last IO episode&lt;/a&gt;. You told us some of the interesting things that you had to say, and you mentioned an app. Was that also Pigment, at the time?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; One of the other apps that we do is called &lt;a href="https://play.google.com/store/apps/details?id=com.pixite.fragment&amp;amp;hl=en"&gt;Fragment&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s a great name!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; So I hear! Fragment is sort of for the Instagram crowd. It lets you do artistic edits to your photos. You basically get to put what we call “prismatic shapes” over your photos, and they add some really cool effects and let you do some really artistic stuff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; We definitely will add links in the show notes to both of these apps.&lt;/p&gt;
&lt;p&gt;Donn and I have been really excited about this show, specifically because we wanted to talk to you about something we thought was very interesting—a topic that we’ve spent hours and hours talking about: the world of immutability, &lt;a href="https://github.com/google/auto/tree/master/value"&gt;AutoValue&lt;/a&gt;, value types, and value objects. All of these things are super interesting, and we’ve heard that you know a thing or two about them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; That sounds great. I’ve been working really closely with immutability, value types, and all of those things over the last two years or so, so it’s a topic near and dear to my heart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Let’s start off with the concept of immutability. The graybeards of our industry love this topic. They’re like, “Oh my God, immutability is the best thing. We should try to add it in, because it adds simplicity and purity.” But for those of us who don’t know what immutability is, can you tell us why we should use it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Absolutely! Simply put, an immutable object is one that can’t be changed once it’s created. It’s a really simple idea, but think about a lot of the code that you normally write. I think when most of us initially write a class, we think of it as “mutable”, or changeable—something we can set properties on. But that adds a lot of complexity that we don’t initially think about, or which may be unintuitive.&lt;/p&gt;
&lt;p&gt;By making things immutable, or unchangeable, you need to make an entirely new copy of them if you want to get a slightly different object. There are a lot of benefits. Like I said, simplicity is a huge benefit. The reason that immutable objects are so simple is clear if you think of an object like a credit card transaction. If you can always change all of the properties of a transaction (the transaction time, the customer ID, etc.), it’s really easy for that object to get into an invalid state, because there are so many ways it can change. Immutability offers simplicity, in that you know it’s always valid once you create it. That’s one of the really big benefits of immutability.&lt;/p&gt;
&lt;p&gt;The other big benefit (in my mind) is that immutable objects are thread safe by default. If properties can’t change, you never have to worry about another thread changing the properties of a class out from under you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Let’s take a step back. When we’re talking about how objects can’t be changed, someone who is looking at immutability as a beginner may be thinking: “Well, I can just create an object—but how do I make a particular object immutable, so that it can’t be changed?” What does it look like if I were to build this by hand? How would someone go about making an object immutable?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; There’s actually more complexity to this than you might initially think. If you follow the normal, plain old Java object path, you create an object which has private members (that’s important), and then use getters and setters. The most obvious (and simplest) step is to just remove the setters. That’s step 1: remove setters from these classes, because you can’t set values once they’re created.&lt;/p&gt;
&lt;p&gt;But then we move into the things that people tend to not think about. First of all, Java classes can be subclassed by default. You need to make the class final, so that it can’t be subclassed. If you don’t, you can end up in a situation where, say, you have this credit card transaction which you thought was immutable, but some malicious programmer or developer who’s not paying attention is going to subclass that and make it mutable. So you want to make the class final.&lt;/p&gt;
&lt;p&gt;The final thing to do is to make all the member variables final. That means that once they are created, you can’t change them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Quick question making member variables final: if the member variable is final, does that mean that I have to provide that value through the constructor?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; You have to provide the value at creation time, which means (depending on how closely you follow Effective Java) that it could be in the constructor or in static factory methods.&lt;/p&gt;
&lt;p&gt;I may be getting ahead of myself, but speaking of static factory methods, one of the challenges of immutable types is that you sometimes want to &lt;em&gt;slightly&lt;/em&gt; modify something. Maybe you want to copy something and change just one property. Static factory methods give you a really easy way to do that. You can either make either static factory methods that make another credit card transaction object (or whatever this object might be), or you can make copy methods that will return a new object, with all of the same properties (or a few changed), without changing the original object. You do have to set all of your member variables at creation time, but using things like static factory methods makes that really flexible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’m sure someone who’s listening right now is thinking, “Well, what about reflection? Can I change these value types with reflection?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; That’s one of the questions which we get in the AutoValue community quite a bit, and it’s one of the downsides. As far as I know, there isn’t a way to prevent changing these values via reflection, since you can change the modifiers by using reflection, so you can remove the final modifier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; A quick follow-up question: specifically in the world of Android, immutability was initially seen as a negative thing. Why is that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; One of the challenges of immutability is overhead. Since you can’t change the values of object properties, you need to make a new copy if you want to modify anything. That adds overhead for the garbage collector (and for memory management in general). That’s a challenge.&lt;/p&gt;
&lt;p&gt;For instance, on my app Fragment, you can modify all of these settings on photos using your fingers, by brushing rotating, and all of that. Initially, I tried to use an immutable state object to record an Undo stack. That’s a pretty straightforward approach. But when you rotate, there are so many settings that are changing all the time. That adds a lot of overhead—a lot of new objects being created, and a lot of letting the garbage collector collect old objects. So, there are some cases (depending on how frequently your properties need to change) that immutability might not be for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Basically, if you have a requirement in your application where you have a ton of objects being generated because of immutability, that may be a case where you have to rethink its applicability. In other words, are you actually getting the benefits of immutability?&lt;/p&gt;
&lt;p&gt;Do you think that’s a fair summary?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Absolutely. In the case of Fragment, I made the state objects mutable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I think I now have a decent understanding of immutability and its benefits and disadvantages.&lt;/p&gt;
&lt;p&gt;Earlier, you referenced “AutoValue”. I know that (for all practical purposes) AutoValue is something which helps with the concept of immutability. But what exactly are these things that people also talk about called “value objects” and “value types”?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; A value type is an object whose equality (when you’re comparing two of them) is dependent on the values of the properties, not the actual object instance. Going back to credit card transactions, if we were to compare transactions, comparing whether they are the same instance (i.e. in the same memory space in the JVM) is unimportant. Instead, we care about whether they both represent the same transaction. I like to think of a value object as something whose importance is determined by what it represents, not its actual instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Recently, I saw a tweet by Martin Fowler. As we all know, he’s one of the graybeards in our industry. Usually, if he publishes something, you should go back and read it, because he has some very interesting and intelligent things to say. He recently updated &lt;a href="http://martinfowler.com/bliki/ValueObject.html"&gt;his article on value objects&lt;/a&gt;, and folks who are interested in learning more about value types and value objects, and really want to dive deep into the nitty-gritty details, should take a look at that.&lt;/p&gt;
&lt;p&gt;I know that you’ve done some amazing work with AutoValue. So, now that we have an understand of immutability, value types, and value objects, where does AutoValue fit in? Is it basically a library that helps us with immutability? Is that its sole purpose?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; AutoValue is an annotation processor that basically helps you generate a lot of the boilerplate which goes into writing immutable value types.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; What is the additional boilerplate? If I remember right, you said it’s only setters and getters, but is there anything else that’s involved? I’m trying to understand what the benefit of AutoValue is. Where does it come into that picture?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; We talked about how we need to finalize everything and remove our setters for immutable types. For value types, specifically, there’s a little bit more to do. We have to override equals(), toString(), hashCode(), and all of that. We have to make sure that when we do compare objects (since this is a value object), equals() is true if the property values are equal, and that sort of thing. AutoValue will generate all of that really tedious boilerplate for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You brought up a great point. It just hit me now. You mentioned the difference between value objects and immutable objects. I think there’s an interesting point to be made there. Immutable objects are purely about the fact that they don’t have direct references, and you cannot change the values in them. But with value objects, there is this concept of overriding equals(), toString(), and that stuff. Why would I need to do that again, just to refresh our memory? Why would I need to override equals()? If I just compare two Java objects, doesn’t that work? Shouldn’t the equals() method work, or is there something else to this?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; This touches on the heart of value types. The way that Java compares objects in the default equals() method is by the memory addresses of the objects. A really good way to see this is by looking in the debugger. If you set a break point somewhere in the debugger and look at a variable that you have, you’ll notice that there will be a string attached to it made up of nonsensical numbers and letters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Like a hash code, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Exactly. That’s the memory address. Anyway, the way that Java compares objects is by comparing the memory addresses. If objects 1 and 2 both point to the same object in memory space in the JVM, then they’re considered equal.&lt;/p&gt;
&lt;p&gt;But that’s not what a value type is. A value type says that if object 1 represents the user “Kaushik Gopal” and object 2 (a different object in memory space) represents the same user, they’re both equal. What AutoValue does is it makes that comparison by saying, “Does Object 1 match Object 2’s first name, last name, User ID, and whatever else there might be?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Interesting. So it actually goes through the fields, looks at their “values”, and then establishes that relationship if they’re actually equal, versus just asking if the “x456” reference is equal to “x123”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; One of the things that makes this very important is that if you want to compare objects for both hashCode() and equals(), you want to make sure that two objects representing the same thing are considered equal. equals() is obvious, but a lot of us don’t think about hashCode(). The reason that’s really important is because if you want to use the object in a set, sets can only have one of each object. Equality is really important there and it uses hashCode() to determine that. And if you want to use it as the key in a map…when I update the values of Kaushik’s favorite things, and use “Kaushik Gopal” as the key in that map, it’s going to use the hash code to determine if it’s updating the right objects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wow, there are a lot of details that go into these things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If folks really want to dig into equals() and hashCode() a little bit deeper, that’s in &lt;a href="http://a.co/ev2FIyN"&gt;Effective Java, by Joshua Bloch&lt;/a&gt;. We’ve also done two episodes on that. Back in &lt;a href="http://fragmentedpodcast.com/episodes/31/"&gt;episode 31&lt;/a&gt;, we talked about overriding equals(); and in &lt;a href="http://fragmentedpodcast.com/episodes/34/"&gt;episode 34&lt;/a&gt;, we talked about overriding hashCode(). We have some content there if folks are interested.&lt;/p&gt;
&lt;p&gt;This AutoValue stuff is super interesting, and I want to go use it immediately. How do I get it? How do I use it? How do I install it? Is it a JAR? What does it look like, in practice?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; As I mentioned, AutoValue is a compile time annotation processor. That means that it’s distributed as a JAR. You can use Gradle, Maven, or whatever you use to add it. One of the important things to note (especially for Android with Gradle) is that we put usually most of our dependencies in the compile configuration. For instance, you might write:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dependencies {&amp;lt;br /&amp;gt; …&amp;lt;br /&amp;gt; compile &amp;quot;[name of support library package]&amp;quot;&amp;lt;br /&amp;gt; }&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You don’t want to do that with AutoValue, because it’s an annotation processor that runs at compile time. It doesn’t actually add its dependencies into your compiled APK. The reason that’s important is that when you go on something like &lt;a href="http:%5Cmethodscount.com"&gt;methodscount.com&lt;/a&gt; and look at how many methods are in there (since you don’t want to go over the DEX limit), it doesn’t make a difference, because AutoValue doesn’t get included in your final app.&lt;/p&gt;
&lt;p&gt;The way to do it in Gradle, then, is to use the annotation processing tool (APT) configuration. That makes sure that the tool is available at compile time for annotation processing, but is not bundled into your final app. AutoValue (which is a Google project on Github, by the way) specifically points out in both the documentation there and the documentation for all of the extensions: “Use the APT or provided scopes for this sort of thing.”&lt;/p&gt;
&lt;p&gt;Once you have it added as a dependency, you need to add the AutoValue annotation to an abstract class. The way that AutoValue works is that you write an abstract class as your value object, using abstract methods for the properties, and you simply add the AutoValue annotation. The next time that you compile, AutoValue will generate an implementation of that abstract class for you.&lt;/p&gt;
&lt;p&gt;So the reason that it does this is because one of the ideals of AutoValue is that it should be a transparent API. Your users (if you’re writing a library) or other developers on your team should never need to know or care that you used AutoValue to make these value objects. When you create an abstract class, you’re effectively writing the API for your value object, and that’s what users are going to interact with is your class. The fact that it is implemented by AutoValue is unimportant to users.&lt;/p&gt;
&lt;p&gt;One of the drawbacks to this is that you can’t use constructors. Because this is an abstract class, we don’t have constructors. But that’s actually a benefit, because it allows us to follow effective Java item #1: “Use static factory methods”. With AutoValue classes, your users will simply call a static factory method to provide whatever properties they want. Then the static factory method is going to internally construct the AutoValue generated object.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So this is a feature, not a bug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Exactly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If this gets built at compile time, do I check these files into source code?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; No, not the generated files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I guess those are put in the “Generated” folder in the build output somewhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Exactly. Those are going to be inside your build folder. Just like you don’t check in compiled class files, you wouldn’t check in these.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense.&lt;/p&gt;
&lt;p&gt;You mentioned that I have to use abstract classes, which means I can’t use constructors, which means I’d have to build my object. In that case, do I have to use builder methods? Also, since we’re on a roll with reducing boilerplate through AutoValue, is there some alternative that I can use to doing that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; I’ve mentioned static factory methods, which are great if you have value objects that only have a few properties—but, as we all know, that never lasts very long. So, AutoValue also has support for builders. Basically, this ends up being another abstract class which you annotate with AutoValue builder annotation, and it generates a builder class for you. This builder, if you’re unfamiliar with the pattern, basically allows you to set all of the properties via methods, and then (once those are all set) actually build the final object.&lt;/p&gt;
&lt;p&gt;There are other languages out there that use named parameters when you call a method. Java isn’t like that, right? You don’t say, “Create User. First name: ‘This’. Second Name: ‘This’.” You just list them in order, which gets really confusing when you require a whole bunch of strings, or something like that. A builder lets you set those properties by name, so it’s really fluent and easy to read.&lt;/p&gt;
&lt;p&gt;AutoValue can generate that for you. Just like the AutoValue classes, the fact that you used it to generate the builder is unimportant to your users. It’s another abstract class that you simply write the API for, and AutoValue generates the code backing it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s a very interesting design goal. Technically speaking, because it’s an abstract class, I could come back tomorrow and say, “Actually, I don’t want to use AutoValue”, and swap it out for something else, but my API has not necessarily changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Exactly. That’s one of the core tenets (and benefits) of AutoValue. For one of my clients, I wrote an SDK that customers were using. We used AutoValue to create these immutable value types, and our customers never knew or cared. If at some point we needed some functionality—say we needed them to be mutable instead of immutable—and AutoValue no longer fit, they were abstract classes, so we could just create our own implementation and the customer never knew.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty slick. One last question I had about the implementation of AutoValue. I haven’t used AutoValue as much as I would like to, but I have noticed that generated classes have this “autoValue_” prefix. What’s the deal with that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; The autoValue_ prefix is for the classes that AutoValue generates behind the scenes. But as we mentioned, given this ideal of a transparent API, your users will never use that; and you, when you use that class elsewhere, won’t use the prefix. You’ll use it internally in your static factory methods; and when you want to construct the actual implementation of your abstract class or builder, you use the autoValue_ prefix. But outside of your implementation and the AutoValue annotated abstract class, you wouldn’t use that.&lt;/p&gt;
&lt;p&gt;Actually, you can’t. The classes that AutoValue generates are package private. This is part of their transparent API. If you distribute a library that uses AutoValue to generate its immutable model value types, users are never going to see the implementation because they’re package private.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; You talked about a couple of the benefits—mainly about the compile time only dependencies, the invisible API, and that users never know that you’re using AutoValue. What are some other benefits? I’ve been an IntelliJ user for a long time, and I wondered right away: “Why don’t I just use IntelliJ templates? What’s the difference?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; IntelliJ does a really good job of creating templates and generating all of this for you, but here’s the challenge: suppose you’ve made an immutable value type. You used IntelliJ to generate getters, setters, equals(), hashCode(), toString(), constructors, and whatever. Then, six months later, you need to add a property. Now you have to add that member variable into the class, and you need to remember to delete and recreate the existing toString(), hashCode(), equals(), etc. The challenge is that it’s really on the developer to remember that they need to regenerate all that any time they update anything in the class. The AutoValue ideal is that that’s a waste of developer energy. If we can generate all of this stuff, we can do it every time we compile. That way, it’s always up to date. You never have to worry about forgetting to update the equals() method.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Oh man, I can imagine how many times that would come back to bite you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yeah, I didn’t think about that, but you’re totally right. If you change that object later on, it’s going to be a pain.&lt;/p&gt;
&lt;p&gt;While we are on a roll with these benefits, what are some other benefits? I know we briefly touched on the thread safety thing. Are there any other points you want to add in respect to thread safety?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Just to reiterate, now that multi-threading is so easy, thread safety is a big concern. Suppose you have a value type (say the credit card transaction), and some other thread (say a service thread, or something like that) changes properties on that instance. Then you run into issues. You can never be certain that the value you’re showing in the UI is current. But since AutoValue creates immutable value types, it gives you thread safety for free. You know that if you have an instance of an AutoValue type, it’s always going to be valid. It will never be out of date.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s true. It comes back to immutability.&lt;/p&gt;
&lt;p&gt;In a blog post last year, you announced AutoValue extensions. What are AutoValue extensions, how do I use them, and why are they useful?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; AutoValue by itself is super useful, and I’ve been using it for a long time. But it does one job (which it does it very well): generating immutable value types. As an Android developer, that’s difficult for me, because I want lot of the value types that I’m interested in to be Parcelable, for instance. That was the big driver behind extensions. I can get into some of the details about that a little bit more, but the basic idea is that I wanted more from these implementations. I wanted to be able to customize them to fit my needs.&lt;/p&gt;
&lt;p&gt;About two years ago, I went to the AutoValue project, which (as I mentioned before) is a Google project that’s hosted on GitHub. I noticed that there were other people asking for extensions, so that they could extend AutoValue and what it can do. The alternatives of the time were forks of the project—other projects that copied the implementation of AutoValue and extended it to different needs. But the problem is that that’s not mix and match. If I want Gson support and Parcel support, I have to pick one or the other, because these are forks. They don’t work together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; It’s extending vs. implementing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Exactly. So one summer, I ended up working on AutoValue, writing extension support into it. The idea here is that there are other annotation processors which you can add on to AutoValue. AutoValue does a lot of stuff internally that’s really unimportant if you’re a user. It doesn’t matter what you name the methods, since it figures out if there is a builder present. All of that stuff is done really well internally, so it’s very flexible.&lt;/p&gt;
&lt;p&gt;What these extensions do is hook into AutoValue, after it’s already figured out all the details about your annotated classes, and provide added functionality. A good example of this (actually, the first extension that was written) is the &lt;a href="https://github.com/rharter/auto-value-parcel"&gt;AutoValue Parcel&lt;/a&gt; extension. What this did, like I said, was add Parcelable support to AutoValue.&lt;/p&gt;
&lt;p&gt;One of the things that I wanted to do with this was to make it super easy for developers. If you want Parcelable and Gson in addition to AutoValue, I didn’t want you to have a 180 character long line of annotation that you’re adding. Basically, since this ties directly into AutoValue, all you have to do to make an AutoValue class Parcelable, using the AutoValue Parcel extension, is add “implements Parcelable”. That’s it. The extension is will know when that’s processed that it needs the Parcelable bits generated too, and it’s will do that automatically behind the scenes. You’ve literally added two words to your class, and you get it all for free.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty slick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s like magic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; That’s certainly the goal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’ve used AutoValue Parcel, so thank you for that. It works fantastically well. What other extensions are available?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; When I wrote extension support, it was prompted by Parcelable, but that’s not the only thing it covers. It was meant to be flexible. One of the things I did right off the bat—not only to make it useful for me, but also to demonstrate this flexibility—was to write extensions for &lt;a href="https://github.com/rharter/auto-value-gson"&gt;Gson&lt;/a&gt; and &lt;a href="https://github.com/rharter/auto-value-moshi"&gt;Moshi&lt;/a&gt;. If you haven’t used them, they’re two JSON serializers. If you work with any sort of Web API, you’ve likely worked with JSON, and probably even used one of these already. What those extensions do is generate type adapters, so that you have a type-safe way, without reflection, to serialize and de-serialize your value types in Gson or Moshi. That’s a really useful extension.&lt;/p&gt;
&lt;p&gt;Another extension is for &lt;a href="https://github.com/mattlogan/auto-value-firebase"&gt;Firebase Datastore&lt;/a&gt;. I’ve been using it on my latest Firebase projects, and it’s really useful. It lets you easily get your value types from and put them into the Firebase Datastore. If you use SQLite instead of Firebase, as many of us do, there’s also &lt;a href="https://github.com/gabrielittner/auto-value-cursor"&gt;AutoValue Cursor&lt;/a&gt;. It helps you read value types out of cursors and write them to content values objects, so you can write them into your database.&lt;/p&gt;
&lt;p&gt;Lastly, there’s an extension by Square called &lt;a href="https://github.com/square/auto-value-redacted"&gt;AutoValue Redacted&lt;/a&gt;. Since Square works with finances, if they log or print objects using the toString(), they have a need to exclude certain values, like account numbers and things like that. Redacted adds another annotation (the “Redacted” annotation) that you can put on any property in your AutoValue class, and that property will not be included in the toString().&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Do you know how many times I’ve written that myself?!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s so cool! I can add Redacted to all my passwords—and maybe my music choices!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’ve been using AutoValue for a while, but I recently ran into a couple of developers who are using a different library called &lt;a href="https://projectlombok.org/"&gt;Project Lombok&lt;/a&gt;. From what I can tell, it looks like an annotation processor that does similar things, like reducing boilerplate. How is this different from AutoValue?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Project Lombok does very similar things to what AutoValue does. Its goal is to reduce boilerplate, and it actually does a lot more than just value types. It will generate a lot of what your class needs—constructors, different types, and all sorts of stuff like that. What’s interesting about Project Lombok is that it masquerades as an annotation processor, but it’s not a true annotation processor, in the sense that it doesn’t comply with the annotation processing tool spec. The documentation for Java and Java SE says that an annotation processor can generate new classes, but that’s all it can do. It can’t modify existing sources. That’s the underlying reason why AutoValue uses abstract classes and provides an implementation, as opposed to letting you annotate any class and providing the implementation within that class. That’s forbidden by the spec.&lt;/p&gt;
&lt;p&gt;Project Lombok has found a hack for this. They use private APIs in Java SE and the Eclipse Compiler for Java (ECJ) to modify the abstract syntax tree (AST). Basically, an annotation processor is provided an object-based representation of your source code—things like a class object, which has method properties on it that represent all of the methods within your class. An annotation processor has those provided so that it can learn things about your class and source code, and then generate a new class. That’s how AutoValue works.&lt;/p&gt;
&lt;p&gt;Lombok uses these private APIs to actually modify the AST. With Lombok, you’re not using abstract classes and getting a different implementation. You actually annotate the class itself, and it modifies that in the compile phase. By the time it’s written to the class file, it actually has the implementation.&lt;/p&gt;
&lt;p&gt;That’s actually one of the reasons I don’t use it. There’s some inherent risk there. It’s using these private APIs, and using the annotation processing tool in a way that’s forbidden. If you want to use it (a lot of people do), that’s perfectly fine. You don’t really have to worry about your app breaking at runtime, since this is a compile time thing, but you still risk having to re-implement everything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; So you’ll know beforehand if things go wrong, but if they do, it potentially involves more work. Also, Project Lombok has been around for some time, so it isn’t like, “Oh my God, this is going to break with the new release of Android Studio or something.” Things aren’t going to break. But that’s good to know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; It’s a great project. I know a lot of people who have used it, and I’ve even used it in the past. It’s a personal choice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You know what I think the true genius behind Project Lombok is? It’s the fact that they have “Project” as a prefix! When you create anything, calling it Project X immediately adds so much legitimacy. I think Project Lombok sounds much better than just Lombok. If you build something called “Project AutoValue”, I’ll that, because it sounds pretty legitimate.&lt;/p&gt;
&lt;p&gt;I want to just remind folks that, while we’ve talked about AutoValue a lot, AutoValue is part of &lt;a href="https://github.com/google/auto"&gt;a suite of libraries&lt;/a&gt; that Google has created. It’s a collection of source code generating tools. So there’s &lt;a href="https://github.com/google/auto/tree/master/value"&gt;AutoValue&lt;/a&gt;, &lt;a href="https://github.com/google/auto/tree/master/factory"&gt;AutoFactory&lt;/a&gt;, &lt;a href="https://github.com/google/auto/tree/master/service"&gt;AutoService&lt;/a&gt;, and &lt;a href="https://github.com/google/auto/tree/master/common"&gt;Common&lt;/a&gt;. This is the whole suite that they made—out of which, AutoValue is one that most Android developers have found tremendously useful, especially if it’s in conjunction with an extension like AutoValue Parcel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Yeah, it’s a great suite of tools. I actually use some of the other tools. All of my extensions use AutoService.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’ve used that before too, as well as AutoFactory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Ryan, this was amazing, and I think we could keep going on and on. I have so many interesting questions to ask. But I figure that you’ll have to get to work at some point, so we don’t want to keep you on. Thank you so much for coming on today’s show and helping us understand about AutoValue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Thank you for having me! It’s been great being here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; If our listeners want to reach out to you with more questions, or want to ask for more ideas and stuff, what’s the best way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; The best way to reach me is on Twitter (&lt;a href="https://twitter.com/rharter"&gt;@rharter&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Perfect. You also have a blog where you write some amazing posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; I do. Since I started doing Caster, I haven’t been writing as much, but my blog is at &lt;a href="http://ryanharter.com"&gt;ryanharter.com&lt;/a&gt;. In addition to Caster, there’s some really good information about AutoValue and lots of other Android coding topics there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I hear that if folks actually want to meet you in person, there’s going to be an opportunity soon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; There is! I go to a fair number of conferences, and I have to travel so far to get to them that I thought it was time we had one here in Chicago. I’ve been working with some other great developers and organizers, and we’re going to be hosting Chicago Roboto on April 20-21. It’s going to be the first Android developer conference in Chicago, so that should be a lot of fun. We’ve got great keynote speakers lined up, like Jake Wharton and Jesse Wilson. You can go to &lt;a href="http://chicagoroboto.com/"&gt;chicagoroboto.com&lt;/a&gt; to order your tickets, submit a talk, and get more information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Fantastic. Thank you so much again for coming on today’s show.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RH:&lt;/strong&gt; Thank you for having me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Alright, that’s all for the show, folks. We’ll catch you in the next episode.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/66/</guid><pubDate>Mon, 12 Dec 2016 07:00:55 UTC</pubDate></item><item><title>065: Developer Platform engineering with Ty Smith</title><link>https://fragmentedpodcast.com/episodes/65/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/bc149b7c-261c-404f-a094-9b003c4edbc5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/bc149b7c-261c-404f-a094-9b003c4edbc5/065-interview-w-tysmith_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we talk to Ty Smith about all things Developer Platform. Currently a tech lead at Uber, Ty has quite the illustrious career having worked on some of the biggest names you’ve heard like Uber, Twitter(Fabric), Evernote, Zagat etc.&lt;/p&gt;
&lt;p&gt;Unlike regular client app development, Developer Platform spans a variety of interesting topics like building consumable SDKs, building libraries with good APIs, creating Android integrations and App to app communication via components like Content Providers, AIDL Integrations, Intent APIS and deep links.&lt;/p&gt;
&lt;p&gt;We ask Ty how he got started in this field, how one should go about thinking about it and the interesting challenges that one would run across in this intriguing field.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="ty8217s-all-star-dallas-crew"&gt;
Ty’s all star Dallas crew
&lt;a class="heading-anchor" href="#ty8217s-all-star-dallas-crew" aria-label="Link to Ty&amp;amp;#8217;s all star Dallas crew"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chrisbanes"&gt;Chris Banes&lt;/a&gt; [@chrisbanes] previously on &lt;a href="http://onelouder.com/friendcaster"&gt;FriendCaster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ChrisArvinSF"&gt;Chris Arvin &lt;/a&gt; [@ChrisArvinSF] previously on &lt;a href="http://baconreader.com/"&gt;BaconReader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/_juandg"&gt;Juan Gomez&lt;/a&gt; [@_juandg] on &lt;a href="https://play.google.com/store/apps/details?id=com.netflix.mediaclient&amp;amp;hl=en"&gt;Netflix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://parallelcross.com/"&gt;Matt Wear&lt;/a&gt; [parallelcross.com] prevoiusly on &lt;a href="https://play.google.com/store/apps/details?id=com.evernote&amp;amp;hl=en"&gt;Evernote&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="developer-platform"&gt;
Developer Platform
&lt;a class="heading-anchor" href="#developer-platform" aria-label="Link to Developer Platform"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=lTqUbDXUUXk"&gt;Tests? Ain’t Nobody Got Time For That! by Ty Smith&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/providers/content-providers.html"&gt;Content providers&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/components/aidl.html"&gt;AIDL (Andorid Interface Definition Language)&lt;/a&gt; [developer.android.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/os/TransactionTooLargeException.html"&gt;TransactionTooLargeException&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/tsmith"&gt;@tsmith&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Okay, here we are again. How are you doing, Kaushik?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; I’m doing well. How are you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; I’m doing really well. I’m very excited about today’s topic. It’s something I’ve dabbled in for a couple of clients, but not at the level of the gentleman who we have on today’s show.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Yeah, this gentleman is known for having a sound understanding of the subject.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Definitely. Let’s go ahead and introduce him before we really dive in. Ty Smith, welcome to the show!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ty Smith:&lt;/strong&gt; Thank you, guys. How are you doing today?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; We’re doing well. Thanks for coming on the show. For folks who haven’t been introduced to you, could you give a little background information about yourself? You know: who you are, where you work, and where you’ve worked before. You have quite an impressive background in Android, and learning a bit about it would be a great help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Sure. I’m currently a Android engineer at Uber. I’m the tech lead on the mobile platform’s external API, which is our group that focuses on external partners and how they integrate with our platform. I’ve been working for developer platform related companies within the Android space for quite a while, but before that, I was just doing pure product development on Android.&lt;/p&gt;
&lt;p&gt;The very first step I took is actually a pretty funny story. I was working at this small consulting company as a Ruby on Rails developer. I was going along my merry way, not worried about the really hard world of mobile. I wasn’t worried about fragmentation or anything else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; No concurrency training. No main threads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; No semi-colons. Ruby was nice! So my boss, the founder of the company, came to me one day and said, “Hey, we’ve got this pretty large client.” You guys may have heard of &lt;a href="https://www.zagat.com"&gt;Zagat&lt;/a&gt;. They’re a restaurant review company based in New York. They were purchased by Google years after I worked on the project.&lt;/p&gt;
&lt;p&gt;Anyway, he said, “We secured this project. We were subcontracting, working on the Zagat app, and we hired this Android contractor.” This was 2009, so Android was pretty fresh. I think we were working with Android 1.6 on an LG G1. “We hired this contractor, but due to some issues, he’s going to have to step off the project.” This was two or three weeks in. “We have a really tight timeline. How do you feel about learning Android and shipping the first version of this in 3-4 months?” I think I said something to the effect of, “I don’t think you’re really asking my opinion.” He was like, “Well, that’s the state of the world.” So I dove right in and worked on it. I don’t think we made it on time, but it went out and worked fine. It was great.&lt;/p&gt;
&lt;p&gt;I stuck around at that job for a little while, working on a few other small app contracts. Then I ended up moving to the company that had contracted to us for Zagat. It was a small company out in Texas, called Handmark at the time. They ended up splitting off into another company called &lt;a href="http://onelouder.com/"&gt;OneLouder&lt;/a&gt;, which you guys may have heard of. &lt;a href="https://twitter.com/chrisbanes"&gt;Chris Banes&lt;/a&gt; worked on a Facebook app called Flow that they purchased, which then became &lt;a href="http://onelouder.com/friendcaster"&gt;FriendCaster&lt;/a&gt;. So I worked on Zagat directly there for a little while, and then I worked on an app for Sprint. They were a big partner with Sprint to write their SMS, MMS, and group messaging app.&lt;/p&gt;
&lt;p&gt;It was almost amusing, because several names who are pretty well-known in the Android community worked there with me at the time. When Chris Banes’ app was bought, he helped out for a little bit as a contractor. &lt;a href="https://twitter.com/ChrisArvinSF"&gt;Chris Arvin&lt;/a&gt; did &lt;a href="http://baconreader.com/"&gt;BaconReader&lt;/a&gt;, which they bought. Then he went to &lt;a href="https://play.google.com/store/apps/details?id=com.expedia.bookings&amp;amp;hl=en"&gt;Expedia&lt;/a&gt; with &lt;a href="https://twitter.com/danlew42"&gt;Dan Lew&lt;/a&gt;. &lt;a href="https://twitter.com/_juandg"&gt;Juan Gomez&lt;/a&gt;, who is now at &lt;a href="https://play.google.com/store/apps/details?id=com.netflix.mediaclient&amp;amp;hl=en"&gt;Netflix&lt;/a&gt;, came in there to take over the project I was on right as I left. Matt Wear was another guy in this community. He was at Evernote, and is now at &lt;a href="https://www.homeaway.com/"&gt;HomeAway&lt;/a&gt;. So there’s this tiny little Dallas based consulting company who had a few of the Android community folks float through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wow, that’s an Android all-star crew there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Yeah, it was interesting. After a year or so there, I moved out of Texas into the Bay Area. That’s when I got my first taste of Silicon Valley life. I joined Evernote to do Android work. It started with normal product work—doing different features and design-related stuff. I was there when we did the Holo redesign, which was interesting. That was a fun project.&lt;/p&gt;
&lt;p&gt;Then I started working a lot on business development and Partner Integrations for different specific partners who we worked with. I started working with the developer relations folks, and developed a passion for interacting with external developers and for these integrations. I began to see how Android could really become a platform there. I thought, “Wow, I really like this developer advocacy and ‘Android engineering as a platform’ perspective.”&lt;/p&gt;
&lt;p&gt;After I worked there for a couple of years, I moved to Twitter and worked on Fabric, which I’m sure most of you are familiar with. It was a very small team at the time, right after the acquisition of Crashlytics. I worked pretty heavily, and saw it move from a single SDK to a suite of SDKs. Now, finally, I’m at Uber, working on building a new developer platform. I’m trying to make Uber a platform and build strong use cases that people want to integrate with. It’s pretty interesting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; If you had to explain what a developer platform is to someone who’s just getting into Android development, how would you do it, and why would they want to use it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; I think there are a few different elements to a developer platform. There are all the APIs, docks, and everything else that you expect to be able to interact with. But you have these different companies who view developer platforms in slightly different ways. Some companies build tooling, and that’s their primary value—companies like &lt;a href="https://www.optimizely.com/"&gt;Optimizely&lt;/a&gt;, &lt;a href="https://www.leanplum.com/"&gt;Leanplum&lt;/a&gt;, &lt;a href="https://www.buddybuild.com/"&gt;BuddyBuild&lt;/a&gt;, and even Crashlytics (before they were acquired by Twitter). Their primary job is selling an SDK, an API, or some sort of other developer tool to their audience. For those companies, their developer platform and tooling is their lifeblood.&lt;/p&gt;
&lt;p&gt;But then you have other companies—like Twitter, Facebook, and Dropbox—who see the developer platform as a way to extend outside of their core competencies and build up power users who have multiple integrations. They try to encourage new apps to build in and create a stronger platform with higher retention.&lt;/p&gt;
&lt;p&gt;So you have these two different perspectives. The bigger companies (which I’ve been working with more recently) view it as just one other way to acquire users and then provide value to them. But some of the other companies (which I’ve invested in and give advising to) focus more explicitly on the developer platform as a tool that’s directly served to their customer, which they try to make revenue on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You summed it up really well. So essentially, there are two aspects to this: there are companies who want to expose a service that they provide (for example, Uber exposing the service of using Uber) as a platform; and there are companies that provide with developer tooling as a product.&lt;/p&gt;
&lt;p&gt;So developer platforms actually encompass both business development support &lt;em&gt;and&lt;/em&gt; the whole SDK, along with any integration that had to be done on the back end. Essentially, any company that has an API that’s consumable from the outside needs to up their game on the developer platform scene.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; It depends on the company. I mean, for a long time, Twitter just had a restful API that people could hit. It wasn’t until after the acquisition of Crashlytics that they started building multiple teams which were focused on how to give a good development experience to mobile developers (as well as, potentially, server developers).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s a good distinction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; It definitely went through its ups and downs, but the main third-party library for consuming the API (&lt;a href="http://twitter4j.org/en/index.html"&gt;Twitter4J&lt;/a&gt;) was completely community developed. It wasn’t until Fabric that they started bringing some of that in house, saying, “How can we control this piece of the platform?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; A lot of folks who listen to this show are on teams that are either building or wanting to build some type of developer platform—or even just an SDK that they can ship to other users. I know that you’ve worked on these things at the various companies that you’ve worked at. I’d like to start discussing what the best way would be for folks to build consumable SDKs for different developers and teams.&lt;/p&gt;
&lt;p&gt;The reason why I want to talk about that right now is that I’ve actually had a small bit of experience doing this for previous clients. We had built some things with AIDL services, content providers, and all kinds of different ways to expose data. But I was wondering if you had thoughts on what you would consider most important when you’re building and shipping these SDKs. Is it stability? Is it a consistent API? Is it package visibility? Is it testing? Is it hosting? Let’s hop into that for a little bit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; I think that stability is probably your number one concern. This is incredibly important for a few reasons. First, when you roll out an SDK, you’re rolling out a binary to a hosted location. Say you’re on Maven Central, and people are consuming it. Maybe you are even just putting out the source code on Github, and you don’t have a binary. But you put this out in a steady state and say, “Okay, I have an SDK that my customers should start using.”&lt;/p&gt;
&lt;p&gt;Now if I’m an app developer and push out a crashy update, I can notice that. I can check Crashlytics or Bugsnag. I can see that I have bugs, get user reports, and (potentially) roll out a fix pretty quickly.&lt;/p&gt;
&lt;p&gt;But when you roll out an SDK that has issues, the developers that are consuming it aren’t thinking about it past the point where they integrate it. That’s not the business value that they’re providing. They just want to include it so that they can get some analytics, load an image, do some dependency injection, or whatever use case drove them to do that. But once they’ve put it in (with very few exceptions), they’re not actively thinking about it, watching the new releases that you’re putting out, and seeing the communication that you’re trying to drive to your community. If you put out an SDK that crashes—one that’s a horrible experience for the consumers of your customer’s application (your customer being the developer)—this application may be their lifeblood. They may be indie developers who are making their income off of this, and you’re causing a poor experience for their users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; It isn’t just indie developers, though. Even when you work at a medium-size company (like I do), if an SDK or a library that you use crashes, you immediately lose all faith in it. The whole idea is to save our time. We don’t want to actually build this on our own (which most engineers typically love doing). The only reason to use it is so that you don’t have to deal with the problems—and the minute the library starts crashing, it becomes your problem. That’s a big no-no.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; It’s like a black box, too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Absolutely, depending on whether it’s open source or not. But one of the bigger problems with that is that once it’s crashing and you push it out, it may not be a clear crash. What if your SDK needs to talk to a web service, and you’re improperly using the Alarm Manager, the Job Scheduler, or something like that, and you start DDOS-ing your own web service? You have to try to communicate to the different implementers of your SDK that, “Hey, you guys are seeing a lot of users. Because you’re seeing a lot of users, we’re getting a lot of traffic on our SDK. But we had a bug in our SDK, so you need to put out another update.” That’s a terrible relationship to have with your developer.&lt;/p&gt;
&lt;p&gt;Even once you put out the update, it may be weeks or months before they see there is one. Then, if they’re not on a regular build train, it may be months more before the update is out in the wild. So if you put out a crashy update, the crash might be out in the wild for months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Just thinking about that sends shivers up my spine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; What that makes you do is think about strong engineering rigor. Test the quality of your APIs. Dogfood them. Get really strong user feedback. It instills a lot of the other qualities that you have to think about when you’re building SDKs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I have two quick follow up questions. First, when you’re building an SDK or working on developer platforms, does that mean that you can’t afford to move as fast as startups typically do? For example, if you’re building a front-end consumer product, most startups intend to accelerate at neck-breaking paces. They understand the trade-off: “Sure, if we move fast and release a feature, sometimes there might be crashes. We’re willing to accept the pain that’s associated with users facing that crash.” That isn’t necessarily a luxury you can get as a library or SDK maintainer. Does that mean that you intentionally slow down your pace, or do you try to adjust that by having more tests?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; I think it requires a different mentality, honestly. I believe that you can still move quickly while testing. If you’re thorough in your architecture and hire the right quality of engineers, it’s possible to write testable code in a well-architected, separated way, so that you can have confidence in it and sleep at night, even when you’re on call while moving at startup speed.&lt;/p&gt;
&lt;p&gt;I gave a satirical talk on this at Square last year called &lt;a href="https://www.youtube.com/watch?v=lTqUbDXUUXk"&gt;“Tests? Ain’t Nobody Got Time for That!”&lt;/a&gt; It was about the other qualities that having to test your code makes you think about. Once you get into the mindset of separated, proper interfaces with modular, more maintainable code, it actually becomes somewhat challenging to go back to thinking about coupled spaghetti code. In my mind, it’s made me a much better engineer to think about systems in this way.&lt;/p&gt;
&lt;p&gt;Maybe you can’t move quite as fast as someone who’s constantly pumping out features, but in the end, they’re thinking about different product requirements than you are. They’re retaining users by having new features to compete against their competitors. You’re retaining your developer users by building developer trust, ease of integration, and a developer community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That makes sense. Second, you mentioned that when your interface crashes, you use something like Crashlytics to see what your crash metrics are. I was curious: if you develop an SDK and discover a crash happening, how do you monitor that on the other side of the equation? For example, if my app is crashing, I use Crashlytics—but can you use Crashlytics inside your SDK?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; I think there isn’t one straightforward answer to that question. In general, I think that putting analytics in an open-source SDK would be viewed pretty negatively. One of the conversations that I had at Twitter when we were putting out the Twitter single sign-On SDK, the embedded tweet SDK, and all of that, was, “How do we record impressions on the different things? From a business value, we care about that, but developers may not want this open-source library that they’re including to be sending up analytics events.” I think there is a balance to be had. You have to be clear with your developer community as to what you’re tracking and why you’re tracking it, so that they can trust the transparency that you’re providing.&lt;/p&gt;
&lt;p&gt;But when it comes specifically to crashing, that’s difficult as well. When a Java crash happens, the UncaughtExceptionHandler is thrown. It’s a global system that’s going to handle it from that point. So when you use something like Crashlytics, it makes it pretty easy to see, “Hey, we had a crash in our code,” and they can funnel that stack trace down, such that the SDK or the developer app can get information on the crash.&lt;/p&gt;
&lt;p&gt;But that’s a unique case, where the platform owner sees that. When you’re developing something like the Evernote SDK or the Uber SDK, it becomes a lot more challenging. You have to rely a lot more on communication from your developers, who see the crashes going on. I can imagine scenarios where you would do things like install your own UncaughtExceptionHandler and then wrap their UncaughtExceptionHandler, but there are a lot of edge cases that could come along with that. You could have conflicts. You could be dual-reporting. You could prevent their crashes from going up. I’m not saying that you shouldn’t, and I’m sure that some companies have figured out how to do that the right way, but I think that relying on communications from your developer community is paramount.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Naming is one of the hardest things in software, it seems. There are a lot of arguments about how you should name things. In your experience, have you come across any tips or tricks about accurately naming something? What are your thoughts on that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; It’s a little more complex when you’re dealing with SDKs or libraries than when you’re just managing your own project. It can be a really big problem when you put out an API in one version, and then say, “Oh, I have a better name for that”, and change it in the next version. Suddenly, you’ve broken the consumer side when they auto-update. Once you put a name out, you’re stuck with it unless you want to deprecate it. I think that having a better name is not a very good reason to deprecate a method! So putting out some guidelines up front on how you want to name your call-backs, how you want to engage with your methods, or how you keep some consistency between multiple platforms (such as iOS and Android) is pretty important, so that you have a general environment that people become familiar with.&lt;/p&gt;
&lt;p&gt;There’s a funny saying that I like to throw around. I don’t know where I originally heard it, but it’s that an API is like a baby: they’re fun to make, but you have to support them for 18 years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s so true. Breaking APIs can be a big problem. A simple method change essentially translates into breaking an API, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Yeah, adding new parameters, removing them, changing the name…the list goes on. When you put something out there, you’re stuck with that for a while. You don’t always have the best name. Sometimes, you just have to suck it up and move on. But having some guidelines on how you want to build that out, and having consistency between those, is going to give a much better experience than iteratively trying to choose the best possible name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I imagine things like semantic versioning also help. People understand that if it’s moving from 1.0 to 2.0, something is breaking. The expectation is that some API is broken, so there’s some level of effort involved in adapting your code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; That’s true, but in practice, I find that very idealistic. I stick with semantic versioning (like everyone else), but I see projects all over the place (even very well known projects) that do breaking API updates in minor version updates or patch updates. Also, especially when you have a broad range of users, not all developers understand that a move from 1.0 to 2.0 implies that it’s broken. Even with a broad range of shotgun communication—where you’re updating your changelog, sending out communications to the consumers of your SDK, and talking about it on Twitter (or the other channels that you frequently use for engaging with people)—you’re still going to run into people who have problems with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; You touched, offhand, on hosting in Maven Central. You said that if something is open-source, it’s probably on GitHub. Could you tell us about some of the options that you have as someone who maintains an SDK? What are your different options to host an SDK; and, in your experience, which options have worked pretty well?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; There are a couple different binaries that are pretty prevalent in the Android/Java ecosystem. One is the standard JAR, and the other is the AAR. We also have the APK library, which was an older format from when more people were using Maven. That was kind of community inspired, but it’s not really prominent these days. AAR is going to be more useful if you’re doing any sort of resource or view related work, whereas JAR is probably just fine if you’re doing pure Java. Depending on how you want to set up your Gradle builds to generate your SDK, AAR is probably simpler if you actually want to reference Android classes. Otherwise, you have to try to do source linking and build a Java project if you want to build a JAR that still references context, activities, or stuff like that.&lt;/p&gt;
&lt;p&gt;But once you have your binary, there are a few different options (like you said). Maven Central and JCenter are two prevalent ones, but they both require you to have an open-source library. There is no concept of an induced license agreement acceptance or terms of service acceptance. As a consumer, you put in the Gradle dependency, the Maven dependency, or the Ivy dependency, and it’s consumed. There’s an explicit acceptance of the Terms of Service. Therefore, those hosting providers require that anything uploaded to them that’s available in the default repos be open-source. So if you’re open-source, it’s not too bad. You can just put it in Maven Central or JCenter.&lt;/p&gt;
&lt;p&gt;I find that JCenter is slightly easier to work with. They have better plug-ins. The Gradle plug-ins are now hosted out of JCenter as well, I believe. It’s kind of a superset of Maven Central and some others. But Maven Central is a little bit more traditional—a little older. There’s still a lot of tooling that references it directly, so you have to add in JCenter manually. I don’t have a strong suggestion towards one or the other.&lt;/p&gt;
&lt;p&gt;But if you aren’t hosting an open-source SDK, it becomes more problematic. You have to host your own repo, which would commonly be used by Artifactory. If you want to host it yourself, I’ve seen companies that just throw up an S3 repo with the Maven structure in it, but it becomes more of a headache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; In fact, one of the options that you have (obviously, this wouldn’t really work with large commercial applications) is JitPack, which is something Donn suggested to me sometime back. It works perfectly well. They alleviate a lot of the boilerplate and nasty setup that’s required to host your stuff on Maven Central or JCenter. But obviously, JitPack is not a standard. It’s privately owned. That’s something to weigh in and think about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; I’ve consumed a few things from JitPack, but I’ve never hosted anything on it. But it’s pulling it from GitHub, and I’ve heard stories of GitHub getting onto people who are using it as a hosting repository when higher amounts of traffic start going to it. That may be better for a small open-source library, but my intuition is that if you’re building a company’s developer platform, and you started getting heavy amounts of traffic to it, you might have representatives from GitHub knocking on your door.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I think that they only pull from GitHub when you make a change, and then they cache it, but I could be wrong. I’m not entirely sure of the internals, but it would definitely be something to keep in mind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; If that’s the case, that might alleviate the concern that I had. But one of the negatives for the user is still that they have to explicitly add the repo, which complicates the build sculpt and increases the complexity of the integration. Especially as you’re trying to target a broad range of developers, that’s something that you want to minimize.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Now that we’ve talked a bit about building SDKs, sharing them, and other high level stuff, let’s hop a bit more into the weeds and talk about when we want an app to talk to another app. One of the primary examples of this is an app that has some type of single sign-on. Have you ever built anything that has single sign-on? If so, what were the main benefits of doing so?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Yeah, I’ve worked on the Evernote single sign-on, the Twitter single sign-on, and the Uber single sign-on, so I have quite a bit of experience with that! I’ve also contributed, both through security reviews and pull requests, to Facebook’s and Dropbox’s, along with a few others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; How does that work? If you build one, what does it look like? If I want to implement that in my application for my developer platform, what are the steps, tools, and concepts that I need to be aware of?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; The primary benefit to a third-party developer is to allow their users to authenticate against a third-party app with less overhead. Let’s say that you wanted to integrate with the Uber API. You have a couple different options. You can include the Uber Android SDK and hit some wrapped APIs.&lt;/p&gt;
&lt;p&gt;But maybe you want to get the status of a trip that’s in progress, so you need to get an authentication token, such that you can check on the status of that trip. With the Uber app installed, you can navigate the user directly over to the Uber app, where they’re already signed in. They can authorize your third-party application, granting the scopes that are required for the information that you’re expecting, and then return the authorization token back to your application. Then you can make the API requests on behalf of the user.&lt;/p&gt;
&lt;p&gt;Normally, you would want to some sort of graceful fallback for that, so that if the app was not installed the user would be able to complete the use case as well. For instance, when the app is installed, you take them to the app and have an experience for them to authorize the scopes. But when the app is not installed, you take them to an oAuth WebView where they can enter their credentials, and it will still return the authorization token so you can make the API request.&lt;/p&gt;
&lt;p&gt;Let’s say that the second one had more overhead to it. Maybe you were using Chrome tabs, and they would have to sign in there as well. That’s a little extra complexity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; In the first use case, that’s going to be a deep link, correct?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; It can be a couple of different things. It can be just a standard URI (a deep link), where you’re either using a universal deep link (with the app overwriting a specific HTTP URL that’s equivalent to the login for your page) or an explicit scheme for your application (say, “uber://”) and some content to get over to that.&lt;/p&gt;
&lt;p&gt;However it could always be just a standard intent. The SDK could say, “Let’s construct an intent with this package set.” Maybe it has a specific action that we want to integrate with—say, one called “Authenticate User”, and it’s fired. My app is registered to receive that in the manifest. Or, if I was the developer, I could also use the Android account manager. That would have to have the extra permissions for “Get Account” and “Manage Accounts”, but with that in place, I could use the Account Manager to authenticate an access token as well. There are a several different implementation methods that can get you to the same experience, but in the end, they all drive the same use case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Along the same theme of sharing data or information across applications, there’s also the concepts of &lt;a href="https://developer.android.com/guide/topics/providers/content-providers.html"&gt;content providers&lt;/a&gt; and &lt;a href="https://developer.android.com/guide/components/aidl.html"&gt;AIDL integrations&lt;/a&gt;. I know that Donn has worked on AIDL integrations, so you two would probably understand this better, but will you explain when I would use a content provider and when I would just use an AIDL? Why not just use one? Why do I need multiple ways of doing the same thing? Obviously, it’s not the same thing, but if you can call out the differences, it’ll be helpful for our listeners.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; The content provider is usually styled by a URI. It’s more loosely typed data that you might want to consume with a cursor. There are use cases where that might be valid. Maybe you want to look at specific types of data that are coming back in a list, which you can iterate on a cursor. There are methods in content providers to stream files, so you can use them to specifically access a file.&lt;/p&gt;
&lt;p&gt;A great example of a content provider if from when I was working at Evernote. We wanted to implement &lt;a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_EDIT"&gt;ACTION_EDIT&lt;/a&gt; and &lt;a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_VIEW"&gt;ACTION_VIEW(intent)&lt;/a&gt; in Android to have an attachment to an Evernote note be utilized by a third-party app which could specifically handle the MIME type of that attachment. Let’s say that you had a note which had an Microsoft Word .doc attached to it. When the user engages with that, we launch the &lt;a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_EDIT"&gt;ACTION_EDIT(intent)&lt;/a&gt; with that MIME type specified. Now any application on the device can say, “Hey, I’m available to handle that sort of thing.” Then the user picks one, and we construct the intent. We set the data to the URI of that attachment, which will be provided through the content provider. We’re going to be streaming that file, so we need to grant read or write access to it temporarily as well (depending on if they called ACTION_VIEW or ACTION_EDIT, respectively).&lt;/p&gt;
&lt;p&gt;Where it can get a little hairy is that there’s a lot of volatility in an integration like that on the Android platform. Third-party apps would say they could handle that MIME type. When you sent the URI over there, sometimes they would edit it directly, call setResult(), and finish(). That’s a straightforward example. You gave them a URI, they edited the URI, and you got an activity result—a RESULT_OK, a RESULT_CANCELED, or whatever the valid response was.&lt;/p&gt;
&lt;p&gt;But we started running into other weird use cases as well. Some apps would copy the URI, write it into a different file as the user edited it, and then return the new data URI. Now you have the original data URI that you provided them and the new data URI that you are consuming from them, which is likely being streamed from their content provider. That was a use case where they did call setResult().&lt;/p&gt;
&lt;p&gt;But there was another use case where apps would edit the URI and then call finish() without calling setResult(). You wouldn’t get a valid RESULT_OK, but the URI was changed, since the user engaged with it. We had to set up a weird fallback mechanism. When the user specified interest in handling a file, we first copied the file. We then handed out the URI for the temporary copy that was a representation of it. The third-party app then edited the file. When it returned it, we checked first: was the MD5 of the URI that we sent over the same as the one for the URI from the onResume()? If they setResult() and gave us a URI, is it the same URI, or has it changed? If there was no change at all, that’s another use case. We started prompting the user, based on this data set: “Hey, we got a result back from the app. Do you want to save it?”&lt;/p&gt;
&lt;p&gt;Different apps behave different ways. Those all consume from streaming a file over the content provider, which is one specific use case. To take that a step outside of the realm of streaming data, files, or big data sets that you may want to iterate on with a cursor for a list, the AIDL is more statically typed. It explicitly binds a service between their app and your app. It requires them to have a generated code set based on a common defined interface. This allows you to transfer objects directly between them. That’s a little more useful for statically typed content, where the content provider has a looser mechanism for defining the data and handling it, based on the URI.&lt;/p&gt;
&lt;p&gt;You could manipulate both of them to handle very similar use cases, so it just depends on what you’re thinking about from a maintainability perspective.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; The way that I think about content providers is that they are more of a placeholder, whereas AIDL Integration is more of a service which allows you to be a little more flexible in the kinds of things that you can potentially do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Definitely. You can send any type of parseable object across an AIDL directly, but that requires that both the consumer and the provider have the same method definitions and class definitions. So if you have an app (maybe your app) that provides a service which has updated, but the third-party app consuming the JAR that you provide is not updated, then you could have weird versioning issues in the AIDL. You could run into similar issues with the content provider, but those are more loosely typed, since you’re specifically assembling a URI when you’re parsing that out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; The thing is, if you are using AIDL, there is something to be aware of—a weird gotcha that you’ll never know about until you hit it: the &lt;a href="https://developer.android.com/reference/android/os/TransactionTooLargeException.html"&gt;TransactionTooLargeException&lt;/a&gt;, meaning that the binder transaction failed because the objects that you’re trying to send across are just too big to handle. The binder transaction buffer has a limited, fixed size of 1 MB. That’s it. It’s in the Android documentation. But that’s one of the ones that I ran into. We were sending a humongous amount of data over an AIDL service—and one day, it suddenly started breaking, because we were sending more data back than the binder could handle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Absolutely. That’s a great use case for using an AIDL with a content provider and streaming that out directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Wow, so my 10 MB JSONs are a no go with AIDL integration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s not going to work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Dang.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; This is good information, but there are more ways that we can share data. You touched on a couple of these. That’s going to be through intents, and I even mentioned deep links. Have you used deep links at all to share data? If so, what did you do? If not, do you use deep links at all?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Actually, in working on the Uber app, I’ve been a little more focused on deep links specifically. The Uber SDK generates a deep link to start the user’s trip, to apply promotions, or for a handful of other use cases that are generated through non-published developer means. For example, suppose a marketing email is sent out to re-engage folks. That will have a deep link that fires back into the app. More often than not, that’s going to be a universal deep link, where it’s potentially just a standard URI with query parameters that you’re parsing out, reading, and trying to do stuff with. You could do intent APIs over Chrome until version 24, which allowed for explicitly defined intent APIs. However, as soon as you’re thinking about cross-platform (iOS and Android), using a standard native scheme in your deep links or using universal deep links will serve you much better, in my opinion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; What is a universal deep link?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; A universal deep link is an HTTP URL that has a backing server which understands what type of device is connecting to it. It can redirect appropriately to either the Play Store, the App Store, or the application, such that it can be consumed. You can get into some interesting complexity, like deferred deep linking, where you want to fire over a referrer ID to the Play Store. The Play Store then installs the application on behalf of the user. It then emits that referrer ID (in the install vendor BroadcastReceiver) to your application. You would then catch that, read out that data, see the original deep link that the user was trying to engage with, and just continue the flow for that user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; That’s just a great user experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt;. Absolutely. They click a link, which installs the app, and they’re suddenly on the specific page that they were trying to link into, or it’s starting up a ride for them, or whatever use case they had. That’s a fantastic experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; I remember that when I worked at Wedding Party, this was exactly the kind of thing we wanted. Essentially, if there was a marketing email that went out, we wanted our users to be able to click a button, go to the Play Store or the App Store, and download the app. After the app was downloaded, since we already had some of that information via the intent, we wanted to be able to repopulate the information. It makes the user experience so much nicer.&lt;/p&gt;
&lt;p&gt;The funny thing is that this can actually be done (and there are services that apparently do this) by essentially finger printing that call. It’s actually pretty fuzzy. In some ways, they try to see what the last call that was made was. It has to be made within that time frame, with certain attributes matching up (the same device, model, and version). They actually do a lot of fuzzy logic to come up with that solution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; They definitely do. You can use a service like Tune that does the fuzzy matching, but you can define that pretty easily yourself as well (at least on Android), because if you just had a URL encoded string in the referrer ID, you could pass the specific deep link that you cared about and pull that out yourself, without ever having to have any server integration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; That’s pretty cool! On that happy note, thank you so much, Ty. Some of this information is mindblowing. It’s a completely different side or aspect to what we’re typically used to. This is great information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Yeah, this has been great.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Of course! It’s a fun field to work in, and it’s a very interesting subset of overall Android development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; If folks want to know more about this and want to reach out to you, what’s the best way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Follow me on Twitter at &lt;a href="https://twitter.com/tsmith"&gt;@TSmith&lt;/a&gt;. I’m pretty active on there, and I’m happy to take messages directly. My website is &lt;a href="http://tysmith.me/"&gt;TySmith.me&lt;/a&gt;, where I have some information for further contact. Feel free to reach out to me there. If you want to learn more about developer platform, and potentially work in that space, my team is hiring as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; Donn, if folks want to reach out to you about your adventures with AIDL Integrations and other stuff, what’s the best way to do that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF:&lt;/strong&gt; Test and fastest way is to hit me on Twitter &lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt;. What about you, Kaushik? How can folks get ahold of you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KG:&lt;/strong&gt; &lt;a href="https://twitter.com/kaushikgopal/"&gt;@KaushikGopal&lt;/a&gt; on Twitter. Twitter is the way to go these days. It’s definitely the fastest way to reach out to me.&lt;/p&gt;
&lt;p&gt;Alright, thanks so much for listening! We’ll catch you in the next episode.&lt;/p&gt;
&lt;hr&gt;</description><guid>https://fragmentedpodcast.com/episodes/65/</guid><pubDate>Mon, 05 Dec 2016 05:00:17 UTC</pubDate></item><item><title>064: Garbage Collection (Android) vs Reference Counting (iOS)</title><link>https://fragmentedpodcast.com/episodes/064/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/456d73a1-62a1-4edc-8254-0d94c052c7c6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/456d73a1-62a1-4edc-8254-0d94c052c7c6/064garbage-collection-android-vs-reference-counting-ios_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Kaushik talks about the process of Garbage collection and how it compares to Reference counting (which is the equivalent process in iOS).&lt;/p&gt;
&lt;p&gt;How does each work? What are the differences? Which is better 😁 ? Listen on for all the juicy details…&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="garbage-collection-android"&gt;
Garbage collection (Android)
&lt;a class="heading-anchor" href="#garbage-collection-android" aria-label="Link to Garbage collection (Android)"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)"&gt;Garbage collection&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@nitinkumargove/how-garbage-collection-works-in-dalvik-vm-in-android-bf781ab48531#.srrig644u"&gt;How GC works in Dalvik&lt;/a&gt; [medium.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1910194/how-does-java-garbage-collection-work-with-circular-references"&gt;How GC works with circular references&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reference-counting-ios"&gt;
Reference counting (iOS)
&lt;a class="heading-anchor" href="#reference-counting-ios" aria-label="Link to Reference counting (iOS)"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Reference_counting"&gt;Reference counting&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tomdalling.com/blog/cocoa/an-in-depth-look-at-manual-memory-management-in-objective-c/"&gt;An in-depth look at manual memory management in Objective C&lt;/a&gt; [tomdalling.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rypress.com/tutorials/objective-c/memory-management"&gt;Memory management in Objective C&lt;/a&gt; [rypress.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://krakendev.io/blog/weak-and-unowned-references-in-swift"&gt;Weak, strong, unowned, oh my! (references in Swift)&lt;/a&gt; [krakendev.io]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Kaushik Gopal:&lt;/strong&gt; I was talking to one of my colleagues who works on our iOS applications the other day. We started off the conversation talking about advantages and disadvantages of the different local database options—like &lt;a href="https://realm.io/"&gt;Realm&lt;/a&gt; and &lt;a href="https://sqlite.org/"&gt;SQLite&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then he mentioned something that blew my mind. A parent-child relationship is a typical use case in any marginally complex system, and we were talking about how to model them in a local database. Then he said, “Yeah, you’ve got to be extra careful with those relationships. You don’t want retain cycles.” This sounded a lot like a memory leak to me, so I probed a bit further, and that led me to the idea behind this mini-Fragment episode: the world of garbage collection and reference counting.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;As I chatted more with my colleague and did some research, I began to understand the differences between how garbage collection (GC) is done in Java (specifically, on Android) and how the equivalent concept (reference counting) is done on iOS.&lt;/p&gt;
&lt;p&gt;Let’s start off with a little theory. Most of us are already aware of what GC is. In a nutshell, it’s the process by which we free up memory. If you’re done using a whole bunch of variables and objects in your method, class, or activity, those still take up memory in what’s called the “heap”. Since you don’t have infinite memory, that space has to be released at some point, and the process that releases it is called garbage collection.&lt;/p&gt;
&lt;p&gt;To be accurate, there are many different algorithms for garbage collection, but the most common one (which Android uses, for the most part) is called “mark and sweep”. The advantage of the “mark and sweep” algorithm is that it’s the first that could actually reclaim cyclic data structures. This is important, especially when you compare it to iOSes’ method of reference counting,—but we’ll get to that in due course.&lt;/p&gt;
&lt;p&gt;When using “mark and sweep,” unreferenced objects are not reclaimed immediately. Instead, the garbage is allowed to accumulate until all the available memory has been exhausted. When that happens, the program’s execution is suspended temporarily while the algorithm collects all of the garbage, so to speak.&lt;/p&gt;
&lt;p&gt;By the way, when this happens, it actually halts your UI for a brief moment. This is what we usually call “UI stutter” or “jank”. If you run low on memory and this begins to happen a lot, it’s then called “trashing”. Garbage collection trashing happens, unfortunately. But coming back to the topic, once all of the unreferenced objects have been reclaimed, the normal execution of the program just resumes.&lt;/p&gt;
&lt;p&gt;An interesting question you may be asking at this point is, “How exactly does the OS detect if an object is unused?” The evaluation for whether something needs to be collected or not starts at a point called a “garbage collection route”. Think of this as a type of link-less structure, where you have a starting node or a tree structure. From that node, you keep trying to track the next reference. If you started with object A, and that references another object, you then jump to that object and see all of its references. Then you continue this process, marking the objects as you go along the way. Then, at the very end, the garbage collection process steps back and says, “Which objects were not marked? If they weren’t marked, then they’re not referenced by anyone. That basically amounts to garbage, so I can release the resources that were used up by those objects.” That’s how the “mark and sweep” algorithm functions, in a very simple and basic way.&lt;/p&gt;
&lt;p&gt;Now you should remember that this mechanism also accounts for cyclic references, which is pretty cool. We’ll touch on that again a little later when we try compare and contrast the differences between these methods.&lt;/p&gt;
&lt;p&gt;We’ve talked about how GC works at this point, so we have a pretty good understanding of that. Let’s dive into some dark territory and see how iOS does its version of garbage collection: reference counting. Reference counting is similar to GC in that the objective is the same, but the way that it’s achieved is radically different. In the early days of iOS programming (or more accurately, Objective-C programming), programmers had to manually count and release the references that are automatically taken care of for us in GC. So every time you created a variable, you actually had to write code saying, “Hey, retain this,” or “Release that.” Retain and release were real Objective-C matters that you had to write. I know what you’re thinking: “That’s barbaric!” Well, that’s what the process was for the longest time. They called it Manual-Retain-Release (MRR).&lt;/p&gt;
&lt;p&gt;But then, in Xcode 4.2, Apple introduced a concept called Automatic Reference Counting (ARC). ARC automatically inserts all of these retain and release matters that we just talked about for you, so that you don’t have to manually write them. As a developer, it’s similar to GC in that you don’t have to take care of it. It just happens on its own. But you still have to remember that the process is the same. It’s very much a reference counting process, which is different from the garbage collection process that we previously discussed.&lt;/p&gt;
&lt;p&gt;Reference counting basically works by marking heap objects with the number of parties or variables that refer to them. It actually keeps a running tally of the number of references on the side. Say person #1 needs this resource. It would bump the reference count up to ‘1’. Then person #2 needs the same thing, and it bumps the count up to ‘2’. Then another person needs this, and it bumps the reference count up to ‘3’. Now person #1 says, “Actually, I person no longer need it, so release it.” Then the reference count goes down to ‘2’, and so on. Basically, it keeps a running tally of references throughout the program for an object.&lt;/p&gt;
&lt;p&gt;When that number finally drops to zero, it assumes that the object is no longer needed, because it has zero references. That’s how the memory is released.&lt;/p&gt;
&lt;p&gt;As you can see, it’s very, very different from garbage collection. While GC waits for some time before kickstarting this side process, reference counting is always happening. It’s constantly checking references and releasing them at every single step. It’s a very different approach. GC clumps the complete process and does it all at once, but reference counting distributes the work. Instead of doing it all in one big chunk, it breaks it into extremely small chunks, and constantly keeps doing that process.&lt;/p&gt;
&lt;p&gt;Now that you have an idea about how each of these processes work, let’s enter the holy war territory. Which is better: GC or reference counting? It’s really hard to answer that question, because there are so many variables. In different situations, one approach works better, and in other situations, the other works better. How much total memory do you have? How often do you do object allocations? All of that plays into this decision.&lt;/p&gt;
&lt;p&gt;Instead of trying to come up with a single answer, let’s talk about the advantages and disadvantages of each approach in general. That way, we can make an educated guess about situations where one would beat the other. Let’s start off with GC. The biggest ding against garbage collection is that it’s unpredictable. We know it will happen, but we don’t exactly know when. The garbage collector can essentially kick off anytime. The GC will just decide, “You know, I feel like now is a good time to run the process.” This can be a problem, because if you don’t know exactly when this process kicks off, then if you’re running this crazy cool animation in your UI and the GC decides to kick in, it will cause a jank. There’s no guarantee of a consistent delta time between one frame and the next, so some frames will be skipped because your GC process decided to kick in at that point. Then everyone who cares about buttery smooth UI performance will call us out.&lt;/p&gt;
&lt;p&gt;Reference counting, though, is super predictable. These retain and release matters are automatically jotted down at compile time. From the ARC mechanism, you know exactly when the references will go down, because that code is right in front of you. It’s all in the variables that you see.&lt;/p&gt;
&lt;p&gt;I should say that there isn’t a guarantee that ARC will happen, but it’s what we call “deterministic”. The lifetime of every object is clearly defined, and you know with a great deal of assurance that it’s going to kick in. Also, the actual collection happens in a very incremental fashion, as we discussed. It isn’t in a big chunk, but is distributed in very small chunks, so it’s constantly happening in very small time periods. Because of this, there are no long pauses for collection cycles, so the chances of jank happening are far lower. You can clearly see the state of all of your objects and can decide when it should kick in and when it shouldn’t.&lt;/p&gt;
&lt;p&gt;Many folks say that this is the primary reason why Android was considered to be pretty janky in its early days. It never had the buttery smooth experience that our iOS counterparts enjoyed. With recent efforts, like Google’s Project Butter, this has changed significantly, and the arguments don’t necessarily hold. But conceptually, the concepts are still the same. You still have a GC that kicks in, but reference counting still happens incrementally at each point.&lt;/p&gt;
&lt;p&gt;Along the same lines, the other disadvantage is RAM usage. With reference counting, objects are released as soon as they can no longer be referenced. The minute an object drops to zero in the side tally, it gets immediately collected. Typically, memory constrained environments like mobile devices, this is great. You don’t want to hold onto a reference any longer than you actually need to, because once the reference goes down, you immediately open up usable memory. Your RAM is reclaimed faster. But in garbage collection, on the other hand, you keep accumulating that garbage for a longer period of time. Until the GC finally decides to kick in, your RAM is basically going to be used up.&lt;/p&gt;
&lt;p&gt;This is also why (again, in the early days) Android phone manufacturers used to advertise, “Our phones now have 2 GB or 3 GB of RAM,” but the iPhone (for the longest time) had just 1 GB of RAM. People would go nuts online: “How is it that Apple is so cheap? They don’t want to spend any of their own money, so they put just 1 GB of RAM in their phones—and it still manages to beat the UI from Android phones in terms of performance!”&lt;/p&gt;
&lt;p&gt;In the early days of Android, the big reason for this difference was that the garbage collection wasn’t really optimized. Again, I keep saying “the early days”. Now the GC process is tuned to run correctly. Potentially, instead of waiting for the RAM to get full, it kicks in faster, when it isn’t necessarily at a point where it’s going to stall the UI. There are other episodes that we’ve done, and other podcasts that talk in detail about this process. Just keep that in mind.&lt;/p&gt;
&lt;p&gt;At this point, you’re probably thinking, “Wait a minute, this whole reference counting thing is probably a better idea than garbage collection.” You’ve already seen its advantages. Well, it’s not all rosy there, either. Let’s talk about some of the disadvantages of ARC and the advantages of garbage collection.&lt;/p&gt;
&lt;p&gt;Retain cycles were actually the topic that spawned this all for me. My iOS colleague was saying that retain cycles were a pain in the butt to deal with it. They happen because of circular references. What does that mean? Let me just give an example: say that Object A references Object B, and Object B references Object C, so you have this straight “A depends on B depends on C” structure. But then, Object C goes all the way back and references Object A. You have this circular reference: “A depends on B depends on C, which now comes back and depends on A.&lt;/p&gt;
&lt;p&gt;If you think about it, this is actually a big problem for reference counting. Even today, iOS engineers have nightmares about this, because it’s so simple to introduce a circular reference. Think about the reference count tally that’s happening in the background. If A depends on B depends on C, it’s essentially never going to go down, because you have a circular reference in a loop.&lt;/p&gt;
&lt;p&gt;This is very easy to introduce. You may think that it’s a contrived example, but it really happens. Take a simple example: say you have this parent object in your application—a father or a mother. That parent has a child, so there’s a strong reference between a parent and his or her child. But if you pull the child object alone, then this son or daughter would have a parent object again, so there would be a strong reference back to the parent. Parent depends on child in a strong reference; child depends on parent in a strong reference. It’s a retain cycle.&lt;/p&gt;
&lt;p&gt;I’m being a little dramatic, but the way that you deal with this is to essentially say, “No, no, no. One of these references is a weak reference. If the parent depends on the child, let’s not make that a strong reference, but a weak reference.” This type of weak reference is very similar to weak references in Java, so I’m not going to go into those details.&lt;/p&gt;
&lt;p&gt;But this is still a real problem. Even with Swift, Objective-C, and all of the cool new things that they have, they have to worry about retain cycles, because circular references are an inherent problem—one that’s pretty easy to run into. As an iOS developer, you have to remember to not shoot yourself in the foot with these bi-directional references.&lt;/p&gt;
&lt;p&gt;If you’re curious, you may ask, “Wait a second? Isn’t that also the case for us as Android developers?” If you think about it, if the references never go, all of those references are still intact. How does the GC figure this out? Doesn’t it also get tricked into always thinking that we need these references? Won’t they live in memory forever and never be released? If you remember what I mentioned earlier about the definition of how GC works, this actually won’t happen. This is pretty cool. Because of the way that GC works, the evaluation starts from the GC root and keeps traversing and marking those objects.&lt;/p&gt;
&lt;p&gt;But if it so happens that the chain is not reachable in a spot, which is what would happen here, it’s free to garbage collect all the rest of the objects. From the GC root, you haven’t touched those references. It doesn’t matter if you’re in your happy, private, merry-go-round reference circle. As long as you’re not in the GC root, you will be collected. If you actually learn the computer science concepts, the “mark and sweep” algorithm for garbage collection was a kind of breakthrough, because it was the first that could actually deal with circular references. Even to this day, ARC still cannot deal with circular references.&lt;/p&gt;
&lt;p&gt;The final thing is that when you think about these computer science reference concepts that have come along, garbage collection is supposed to be more efficient for larger complicated systems. As our systems become more complex, GC will eventually win. This is because you will tend to have non-trivial object life cycles with large applications. Even now, we already have that. So you wind up spending a lot of your time trying to figure out, “How exactly do those life cycles work? Do I have a reference here? Do I have a reference there? Is there a retain cycle here?” With garbage collection, you get to write your program much faster, and (in the long run) you’ll just be more efficient. Therein lies this huge advantage.&lt;/p&gt;
&lt;p&gt;I’ll leave you with some parting thoughts that I found on a Reddit thread. Android was originally designed to be a general purpose computing platform, so there were many complex things like background services and true multitasking that came to us early. A large part of the reason why we were able to get these things early was because we had garbage collection that was built to accommodate these complicated systems. But what that meant was that there were compromises made, and UI fluidity and RAM usage suffered. We bit the bullet there, but we got some of these other features.&lt;/p&gt;
&lt;p&gt;By the way, the Android Runtime, which is what we currently use, is super optimized. With initiatives like Project Butter, most of these things are almost indistinguishable. The performance and UI fluidity are almost neck to neck.&lt;/p&gt;
&lt;p&gt;iOS, on the other hand, was designed from the ground up to be very smooth and responsive. Low-input latency and smooth redraws were top priorities, which was why early versions of iOS were super smooth compared to early versions of Android. But again, they had to make compromises. Reference counting is much easier to do with simple systems, but it’s very hard to pull of in an efficient way with complicated systems. This, in my opinion, is the main reason why iOS got features like background services and multitasking super late relative to the Android world. Obviously, they’ve caught up with Android and have a lot of similar features these days.&lt;/p&gt;
&lt;p&gt;So, in the end, it’s neck to neck. Everyone is pretty much in the same boat. There isn’t necessarily one better way. It’s not easy to say that garbage collection is better than reference counting or vice versa, because each of them has its advantages. Both Google and Apple are obviously coming up with some really cool and innovative ways of circumventing the problems that are inherently present with each of their mechanisms.&lt;/p&gt;
&lt;p&gt;I hope you enjoyed this deep dive into a rather pitiful topic. If you have questions, feel free to hit me up on Twitter (&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt;). I had to do a lot of research, especially in the iOS part of the world, since I don’t really do iOS development. I could have said something that’s not factually accurate about iOS, so I’ll make sure to include all the different links and resources that I used for my research in &lt;a href="https://spec.fm/podcasts/fragmented/53383"&gt;the show notes&lt;/a&gt;. That’s all, folks!&lt;/p&gt;
&lt;hr&gt;</description><guid>https://fragmentedpodcast.com/episodes/064/</guid><pubDate>Sun, 20 Nov 2016 21:00:35 UTC</pubDate></item><item><title>063: Effective Java for Android Developers – Item #13: Minimize the accessibility of classes and members</title><link>https://fragmentedpodcast.com/episodes/63/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/24fbefec-dc9b-44f6-b1fc-eddf4c97f51a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/24fbefec-dc9b-44f6-b1fc-eddf4c97f51a/063-effectivejava13_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Donn talks about Item #13 of the Effective Java series – Minimize the accessibility of classes and members. You’ll learn why it’s important to limit the access on your public API, how it can help you with development and performance. You’ll also learn how changing a public API can affect the consumers of your API, for good and bad.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html"&gt;Java Access Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.fragmentedpodcast.com/buddybuild"&gt;BuddyBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="transcript"&gt;
Transcript
&lt;a class="heading-anchor" href="#transcript" aria-label="Link to Transcript"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Donn Felker:&lt;/strong&gt; Today, I’m going to talk about Item #13 from &lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java, by Joshua Bloch&lt;/a&gt;. For those of you who are just joining us, Kaushik and I are covering all of the items inside this book in relation to how they apply to Android developers. We’ve already gone through the first 12, so I’ll be talking about #13: Minimize the accessibility of classes and members.&lt;/p&gt;
&lt;p&gt;Joshua puts this very well right out of the gate, so I’m going to read this verbatim:&lt;/p&gt;
&lt;!--more--&gt;
&lt;blockquote&gt;
&lt;p&gt;The single most important factor that distinguishes a well-designed module from a poorly designed one is the degree to which the module hides its internal data and other implementation details from other modules. A well-designed module hides all of its implementation details, cleanly separating its API from its implementation. Modules then communicate only through their APIs and are oblivious to each others’ inner workings. This concept, known as &lt;em&gt;information hiding or encapsulation&lt;/em&gt;, is one of the fundamental tenets of software design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To be honest, I spent about ten minutes trying to think of a better way to say that, so that I didn’t have to quote it exactly, but it was too hard. Joshua hit this nail right on the head. The way that he said this was so succinct and perfect that I couldn’t come up with a better way to say it.&lt;/p&gt;
&lt;p&gt;Why is it important to hide the implementation details and only expose parts of your API? While there are many reasons, it’s mostly due to how it decouples your modules from how people are consuming them. Furthermore, it allows you to speed up the system development, since the different modules underneath the hood can be developed in parallel.&lt;/p&gt;
&lt;p&gt;Suppose you’re building a library or module which has a public API. All of the internals of that could be split apart to multiple different developers, and the work could be done internally. Then the actual API component could be delivered to some other third party, so that they can code against that—basically, an interface. It’s the API which they’re going to be working with.&lt;/p&gt;
&lt;p&gt;The great thing about this is that since you’re hiding all of the implementation details, you can actually build those modules internally without worrying about breaking anyone else’s code. As long as you adhere to the public API that you’ve put out, and you’re not exposing the internals of how you’re doing all of the work, then you don’t need to wonder, “Hey, are we breaking anybody else?” You can actually design it, test it, make sure that it works, and move much more efficiently behind a wall. One of the great things about this is that it allows you to essentially ship faster. If you’re able to do all of these things without impacting the consumers of your API, you can deliver the product quicker.&lt;/p&gt;
&lt;p&gt;Furthermore, while this does not give immediate performance benefits, it does enable effective performance tuning. Let’s assume that you’ve built your library. You have a public API of 5-10 methods or classes that people are using. Underneath it, you have 50 other files. At some point, you realize: “Wow, this one part of the library is super slow. How can I fix that? Well, I know that it’s in this component down here. Because it’s part of the internals of my library, and I haven’t exposed those internals, I can hop in there and change the way that works.”&lt;/p&gt;
&lt;p&gt;Maybe you’re using an improper data structure, or maybe it’s something simple, like a memory leak. You can go in and change the internals of that underlying part of the library, and then ship an update to that library. The interface to it (the public API) doesn’t change, but the internals have now changed. You’re enabled to have some type of effective performance tuning without affecting any consumers of the API.&lt;/p&gt;
&lt;p&gt;Okay, that makes sense, but how does Java facilitate any type of information hiding? Well, the &lt;a href="https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html"&gt;access control mechanism&lt;/a&gt; that Java uses is something which we use every day: modifiers like public, protected, private, and all of the other types of modifiers that are essential to information hiding. To most of us, they’re second nature. We really don’t think about them at all. But understanding when to use them is key to developing software. The rule of thumb that Joshua clearly gives here is to make each class or member as inaccessible as possible. In other words, use the lowest possible access level that you can while enabling your application or library to do the work that it needs to do.&lt;/p&gt;
&lt;p&gt;For top-level classes and interfaces, you’re basically always going to go with public. Some people do go with packaged private, and there are some weird idioms around that which you can follow, but these top-level classes are the things that people will implement. They’re basically not nested. You’re going to make them public. They’re wide-open—things that folks can use.&lt;/p&gt;
&lt;p&gt;Here’s the thing, though: if you make something public, you’re obligated to support it forever to maintain compatibility. For those of you who listen to one of our other favorite podcasts—”&lt;a href="https://androidbackstage.blogspot.com/"&gt;Android Developers Backstage&lt;/a&gt;,” hosted by Chet Haase and Tor Norbye—I’ve heard Chet talk about building an API on various occasions. When you make a decision to implement a particular API, it’s the best decision you can make at that time. The Android developers can make an API public. At that point in time, it’s the right decision, but two months down the road they may have realized (after they shipped that Android OS update) that it was actually a bad decision. That API probably wasn’t the best one. They may have made note of this in the podcast, since hindsight is 20/20, but they still can’t go back and change it.&lt;/p&gt;
&lt;p&gt;Why? Let’s assume that Android has shipped a public API. This has happened before. Once it’s released, all kinds of apps suddenly start using it: Facebook, Instagram, Twitter—you name it. Then the Android team determines: “Wow, that was not the best decision. We should not have made that one public.” Or, “We let that slip through a code review by accident.” Any number of things can happen. But now they have to support it anyway.&lt;/p&gt;
&lt;p&gt;Suppose they decide to yank it in the next version of Android. What would happen? Let’s assume that a major application like Instagram is using the API. I’m not saying anything negative about Instagram. I’m just using them as an example. This can happen to any application, but I’m using Instagram since it’s a very popular application that would affect millions of people. Anyway, folks decide to update their phones up to the newest version of Android. So they update them, and then open the Instagram app—and the app suddenly crashes. If the Android team removed an API that they’ve already released as a public API, they would not be maintaining backwards compatibility. In other words, as soon as a new version of Android comes out and someone updates to it, the app is going to crash. It’s going to look for that method, but it’s just not there.&lt;/p&gt;
&lt;p&gt;What the Android team has done over time is to mark these classes or methods as deprecated and provide alternatives: “Please start using this one.” You’ve probably seen deprecation notices all throughout your applications. AndroidLint does a good job of catching these in the IDE so that you can see them. It puts a little strike-through in the IDE, saying, “That doesn’t look right.” That usually means that you’ll have to take a look at the implementation. You’ll hit Command+B (if you’re on a Mac) and look at the definition of that class. It will actually have some notes in the Javadoc, such as, “This class is now deprecated”, or “This method is deprecated. Go use X, Y, or Z.” Then you can decide which one to use.&lt;/p&gt;
&lt;p&gt;To kind of bring this full circle, this is important as an API developer because you have to make the best decisions possible. Realize that when you release something with a public API, you’re stuck with that API. You can’t just pull it, even if you hate it, don’t like it, or it just makes it painful. You have to keep it and work around it.&lt;/p&gt;
&lt;p&gt;Of course, there will always be times when people remove them, which can cause pain and so forth. Is that something you would want to do? That’s up to each team to determine. Maybe you’re developing an shared internal library at your company that’s used by just ten other apps. Then you can make a judgment call and say, “Hey, we’re going to yank this API. It was a bad decision. Let all the other developers know so that we can update it within the company.” However, if you’re releasing a public SDK (for instance, the Facebook SDK) and you remove a method, that could become very problematic. All of a sudden, people’s applications break, and they have to fix them. This has happened to all of us before. We’ve used a third-party API, things change when versions change, and stuff suddenly breaks.&lt;/p&gt;
&lt;p&gt;This is also why it’s very important to specify exact version numbers in your build.gradle file. Let’s say that the version of the library that you’re depending on is 9.0.1. But in your build.gradle file, you’ve said “9.0.+”, or even “9.+”. What that’s basically telling gradle is, “You know what? So long as it’s version 9 or 9.0, it’s cool. Don’t worry about it. Just pull the new one down.”&lt;/p&gt;
&lt;p&gt;Many developers have had weird instances where they build something in the morning, do a bunch of development, rebuild, and it’s broken. Why is that? Perhaps it’s because some other developer has released a new version of that library, upgrading it to 9.0.2. That had a breaking change in it, which removed or changed an API call. Suddenly, an app that worked 10 minutes ago doesn’t work anymore, even though you didn’t change anything. Why is it breaking? Because you didn’t specify your exact version number in your build.gradle file. This is a good reason why you want to use a particular version number in build.gradle. We’ll go into this in detail here on Fragmented at a later time, but this is something that can affect you as an Android developer.&lt;/p&gt;
&lt;p&gt;Let’s step back into this effective Java item and talk about how you can lock down access to particular parts of you application or module. Let’s assume that you’re building a module with a bunch of internals. You’ve probably looked at the source of many open source projects and noticed that they have a package called something like “com.example.fu.internal”. It’s a very common pattern for folks to put everything they want internal to the library inside of an internal package. A lot of the time, everything that’s outside of the internal package will be public. This isn’t written in stone. It’s just a common practice that a lot of folks do.&lt;/p&gt;
&lt;p&gt;When they put those things in those packages, you’ll notice that they use different Java access modifiers. Let’s talk about this for a second. We have four different access modifiers. The first one is “private”. Private is basically saying that members are only accessible from the top-level class where they’re declared. Say we have a “customer” class with an integer age field called “private.int.age”. That age field is only accessible within that instance of that class. Nobody else can access it. If someone’s trying to call “customer.age”, they cannot get access to it. It’s not allowed.&lt;/p&gt;
&lt;p&gt;The second modifier that we have is “package private”. This one says that the member is accessible from any class in the package where it is declared. This is technically known as default access. This is the access level you get if you don’t provide any type of access modifier on a member. Let’s say you create a class called “customer”. That class is now package private. Anything that’s in the same package can access that class. Again, let’s just use that integer age field. But instead of saying “private.int.age”, we just say “int.age”. Any class that’s inside of the same package can access that age, because it’s package private. But only classes within that package can access all of those members.&lt;/p&gt;
&lt;p&gt;The third modifier is “protected”. Protected is accessible from subclasses of the class where it’s declared. Again, let’s say that we have a “customer” class and with an “age” field, and we’ve used “protected.int.age”. At this point, we’ve said, “You know what? We need to change our application to support platinum customers and gold customers.” So you inherit from the superclass, which is now customer, and have a sub-class of customer called “platinum customer”. Well, because the customer’s age is marked as protected, the platinum customer can access the age. The “gold customer”, which is also a sub-class of customer, can also access the age. But anything else—perhaps an employee object, which is a completely different class—cannot access the age, because they’re not a sub-class of “customer”.&lt;/p&gt;
&lt;p&gt;Finally, we have the very popular “public”. This is a member that’s accessible from anywhere. This is one that we’re very familiar with. When you mark something as public, anyone can access it. If you have that customer class again, and mark that age as public.int.age, anyone can access that age. We can have a whole bunch of problems there, which I’ll talk about in a second, but it’s the most open option. As soon as you mark something public, you basically need to support it from that point forward.&lt;/p&gt;
&lt;p&gt;Let’s talk about public classes for a second. If you use a public class, you have a huge increase in accessibility. The access level goes from package private—basically saying that you have to be a part of this package to access it—to protected. A protected member is part of the class’s exported API and must be also supported forever. Let’s say again that we have a library which exposes a customer object that was previously package private. No one could talk to that int unless they were in the same package. But your application, since you’re consuming that third-party library, is not part of the same package. You don’t have access to that integer.&lt;/p&gt;
&lt;p&gt;Now let’s say that we changed that from the default access level to protected, for some reason. As soon as we do that, we now open that that as part of the public API. Now I can sub-class the customer object and create my own type of customer. I have access to that age, because it’s now a protected access modifier level. It’s part of the public API, so be very aware of that. As soon as you change something that was package private before to protected, it does become part of your public API. That’s something that you need to think about quite a bit.&lt;/p&gt;
&lt;p&gt;There’s one rule that you need to make sure you’re aware when you’re trying to reduce accessibility of methods. If you have a method which overrides a superclass method—maybe it calculates some type of value for your object, and you override that int for me in the subclass—you cannot change the visibility of that, saying, “Hey, this was protected before. Now I want it to be private.” If you do, the compiler is going to complain and not let you do it. You have to keep the same accessibility.&lt;/p&gt;
&lt;p&gt;I’ve been on both sides of the field, as an API developer as well as an API consumer. Throughout the years, there have been many times when I wished a particular class or something of that nature was much more accessible. Maybe I wished it was public, so that I could have access to it. The main reason for that was that either I needed to provide some sort of implementation which the class didn’t allow, or I needed to facilitate testing. If you need to facilitate testing, you may be tempted to make everything more protected or more public so that you can have access to it. But realize that that’s not necessary. If you’re building the API yourself, you can provide an interface for folks to use. They can go ahead and mock things out, and with new versions of the mocking tools, you could even mock final classes, which is amazing.&lt;/p&gt;
&lt;p&gt;But if you’re worried about testing a library that you’re going to be publishing to external folks, you don’t have to make all of those things public. Your tests are going to be internal to your application anyway, so if you have things that are package private, you can leave them that way. Your tests can still access those, because you’re part of the same package. There’s not really a need to open up your API for testing as much as you think you need to.&lt;/p&gt;
&lt;p&gt;Joshua makes a couple of other statements inside of this item which are very important. One of those is that instance fields should never be public. Say it’s that customer’s age again. He’s saying, “Never mark that public, because you give up the ability to take any action when the field is modified. Classes with public, mutable fields are not thread-safe.” That was a big “Aha” moment for a lot of folks—especially me, when I first read this. I wasn’t super aware of that, and never really thought of that in too much detail.”&lt;/p&gt;
&lt;p&gt;This also applies to static fields, with one exception: you can expose constants via public static final fields, assuming that the constants are basically primitive values or references to immutable objects themselves. You’ll want to be aware and stick to that rule, except for that one little variation there.&lt;/p&gt;
&lt;p&gt;Joshua also makes mention of something that’s very tricky when you think about it: non-zero length arrays are always mutable, so it’s wrong for a class to have a public static final array field or an accessor that returns such a field. What that means is that if you’re returning an array of customer values, that can always be mutated outside of the class. You’ll run into a bunch of problems, crazy bugs, and security holes when you expose a public static final array field or an accessor that returns such a field itself. You want to be careful around that as well.&lt;/p&gt;
&lt;p&gt;You may be wondering, “I need to return an array of things. How do I do that?” There are a couple of ways to fix the problem. You can make the public array private and add a public, immutable list; you can use things like collections.unmodifiableList, which will return an unmodifiable list using the collections utilities; or you can make a copy of that private array and return that copy, so that it’s not the same one. That could be confusing to folks, who think, “Hey, I’m getting back an array. I think I can modify it. It should modify my existing array in memory,” which could add some confusion to your application. You may want to be aware of that too.”&lt;/p&gt;
&lt;p&gt;In the end, you need to choose between these alternatives if you’re returning an array, and think about what the client is likely to do with the result. Which return type will be more convenient for him, and maybe even what will give him more performance?&lt;/p&gt;
&lt;p&gt;That kinda wraps it up for Item #13. It’s all about accessibility and minimizing your API footprint. Remember: if you mark something as public, or it’s available as part of the public API, you’ll have to support it, because people are going to rely on it. You want to hide the internals away. Why is it easy to hide the internals away? It allows us to develop in parallel much quicker. We can iterate and build tests. It also enables effective performance tuning, because if that library we ship doesn’t really function that well, we can hop in there, take a look at the internals, fix it, ship another version, and still not break the public API. I hope that helps. Talk to you next time.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Transcription and editing provided by &lt;a href="https://1017scribes.com"&gt;10:17 Transcription&lt;/a&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/63/</guid><pubDate>Mon, 14 Nov 2016 04:11:00 UTC</pubDate></item><item><title>062: Effective Java for Android Developers – Item #12: Consider Implementing Comparable</title><link>https://fragmentedpodcast.com/episodes/62/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/ea2d364f-a55a-4578-942d-d57e261f0123?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/ea2d364f-a55a-4578-942d-d57e261f0123/062_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment episode, Donn talks about Item #12 of the Effective Java series – Consider Implementing Comparable. You’ll learn about how you can use the Comparable interface to give your code the extra sorting boost it needs. Work with Arrays.sort(), Collections utilities and even sorted data structures. Donn breaks down what it takes to implement the compareTo method of the Comparable interface.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html"&gt;Comparable Interface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.fragmentedpodcast.com/buddybuild"&gt;BuddyBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/62/</guid><pubDate>Mon, 07 Nov 2016 04:06:52 UTC</pubDate></item><item><title>061: The state of event bus(es) today</title><link>https://fragmentedpodcast.com/episodes/061/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8e20971b-7a3e-4cbd-8862-8df95557c3bf?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8e20971b-7a3e-4cbd-8862-8df95557c3bf/061-thegreateventbusepisode_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The age old question: should I be using an event bus today? What is an event bus? what are still some good use cases for an event bus? Can i replace an event bus with RxJava?&lt;/p&gt;
&lt;p&gt;Donn and Kaushik have at it and try to answer this question that gets asked constantly in the AndroidDev circles. Listen on for our take.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="what8217s-an-event-bus"&gt;
What’s an event bus
&lt;a class="heading-anchor" href="#what8217s-an-event-bus" aria-label="Link to What&amp;amp;#8217;s an event bus"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/using-prisms-compositewpf-eventaggregator/"&gt;Donn’s blog post on event aggregators (event buses)&lt;/a&gt; [donnfelker.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.kaush.co/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/"&gt;KG’s blog post on implementing an event bus with Rx&lt;/a&gt; [blog.kaush.co]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="libraries"&gt;
Libraries
&lt;a class="heading-anchor" href="#libraries" aria-label="Link to Libraries"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/otto#deprecated"&gt;Otto – Square’s Event Bus library&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/greenrobot/EventBus"&gt;EventBus – greenrobot&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://markhudnall.com/2013/11/13/gcm-foreground-and-background/"&gt;Handling GCM messages in the foreground and background by Mark Hudnall&lt;/a&gt; [markhudnall.comm]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/053-jake-wharton-on-rxjava-2/"&gt;Ep 53: Jake on RxJava 2&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/RxRelay"&gt;RxRelays&lt;/a&gt; [github.com/JakeWharton]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/RxJava-Android-Samples/commit/dedadafd88cd3a5a926d4a7f2761822a43121569"&gt;Diff change set for converting RxBus to an RxRelay&lt;/a&gt; [github.com/kaushikgopal]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/courses/event-bus/"&gt;Caster.io EventBus course – Annyce Davis&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/buddybuild"&gt;BuddyBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/061/</guid><pubDate>Mon, 24 Oct 2016 05:00:48 UTC</pubDate></item><item><title>060: Smoke and Mirror Android UI tricks with Israel</title><link>https://fragmentedpodcast.com/episodes/060/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/5160ca31-ce8a-4467-8ca6-686e8cda8428?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/5160ca31-ce8a-4467-8ca6-686e8cda8428/060-interview-with-israel_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We talk with Android UI magician Israel. In this episode, Israel does what magicians are never supposed to do, reveal those exciting magic tricks. He talks about tricks you can use in your Android apps to create a super slick UI, citing examples from Google Photos, Twitter and other apps.&lt;/p&gt;
&lt;p&gt;Dazzle your Android users with these UI tricks.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/26/"&gt;Israel’s last appearance on Fragmented (Ep 26)&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="smoke-and-mirros"&gt;
Smoke and Mirros
&lt;a class="heading-anchor" href="#smoke-and-mirros" aria-label="Link to Smoke and Mirros"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rallat/smokeAndMirrors"&gt;Israel’s sample app&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://photos.google.com/share/AF1QipMFXmZvx7yW0oaAgNMkjy4-BkQ9ikNHJ_-MwanFXWVAjKpoVcwAlUSDonqgt8e0ew?key=emRlWjh2M2drX1Q3dF9QdGFuZE1XMjdrMEJsaThn"&gt;Slides (with animation demos)&lt;/a&gt; [photos.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://photos.google.com/share/AF1QipMFXmZvx7yW0oaAgNMkjy4-BkQ9ikNHJ_-MwanFXWVAjKpoVcwAlUSDonqgt8e0ew/photo/AF1QipPy1IRLkCD9gS5k14Z68QDBj2GNdPexUba82N_6?key=emRlWjh2M2drX1Q3dF9QdGFuZE1XMjdrMEJsaThn"&gt;Google Photos Recycler View pinch to expand/shrink&lt;/a&gt; [photos.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://photos.google.com/share/AF1QipMFXmZvx7yW0oaAgNMkjy4-BkQ9ikNHJ_-MwanFXWVAjKpoVcwAlUSDonqgt8e0ew/photo/AF1QipPnALK2LYsODJLefeJsN-Oqm8z2g2OjUlDapNWs?key=emRlWjh2M2drX1Q3dF9QdGFuZE1XMjdrMEJsaThn"&gt;ClipChildren demo&lt;/a&gt; [photos.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://photos.google.com/share/AF1QipMFXmZvx7yW0oaAgNMkjy4-BkQ9ikNHJ_-MwanFXWVAjKpoVcwAlUSDonqgt8e0ew/photo/AF1QipPgbNlY78Lj0NHfvaqvLYqvK3yMjpGSsuMqivzA?key=emRlWjh2M2drX1Q3dF9QdGFuZE1XMjdrMEJsaThn"&gt;Utils method – traverse hierarchy and clip&lt;/a&gt; [photos.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://photos.google.com/share/AF1QipMFXmZvx7yW0oaAgNMkjy4-BkQ9ikNHJ_-MwanFXWVAjKpoVcwAlUSDonqgt8e0ew/photo/AF1QipOJhw_Bo9C6U2XkZQHn-qCTO6lIntqZR0_wXTou?key=emRlWjh2M2drX1Q3dF9QdGFuZE1XMjdrMEJsaThn"&gt;Tap image to show full screen&lt;/a&gt; [photos.google.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nickbutcher/plaid"&gt;Nick Butcher’s Plaid app&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evernote/android-job"&gt;Android-Job library by Evernote&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rallat"&gt;@rallat&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/060/</guid><pubDate>Mon, 17 Oct 2016 05:00:01 UTC</pubDate></item><item><title>059: Chiu-Ki Chan explains Mocking and Stubbing with Mockito</title><link>https://fragmentedpodcast.com/episodes/059/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8dbcb8bb-fb30-4ac6-8fa1-86c2c9961087?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8dbcb8bb-fb30-4ac6-8fa1-86c2c9961087/059-interview-with-chiu-ki_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We talk with the all-star multi-talented GDE Chiu-Ki Chan about testing. Specifically, we dive into leveraging Mockito for your testing needs. What is Mocking, what is Stubbing, what are the different test doubles, how does mockito help with this? Listen on to find about that and some more interesting stuff on testing!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.google/products/pixel/introducing-pixel-our-new-phone-made-google/"&gt;Introducing Pixel&lt;/a&gt; [blog.google]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codebetter.com/jpboodhoo/2007/10/15/the-static-gateway-pattern/"&gt;Static Gateway Pattern&lt;/a&gt; [codebetter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="about-chiu-ki"&gt;
About Chiu-Ki:
&lt;a class="heading-anchor" href="#about-chiu-ki" aria-label="Link to About Chiu-Ki:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCMEmNnHT69aZuaOrE-dF6ug"&gt;Android Dialogs | youtube&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://360andev.com/about/"&gt;360|AnDev co-organizer | conference&lt;/a&gt; [360andev.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tinyletter.com/techspeak"&gt;Technically Speaking| newsletter&lt;/a&gt; [tinyletter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fake-sharedpreferences-implementations-from-aosp"&gt;
fake SharedPreferences implementations from AOSP
&lt;a class="heading-anchor" href="#fake-sharedpreferences-implementations-from-aosp" aria-label="Link to fake SharedPreferences implementations from AOSP"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/android/platform_packages_apps_calendar/blob/master/tests/src/com/android/calendar/FakeSharedPreferences.java"&gt;FakeSharedPreferences | fake in-memory SharedPreferences implementation &lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/android/platform_frameworks_base/blob/4b1a8f46d6ec55796bf77fd8921a5a242a219278/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeSharedPreferences.java"&gt;BridgeSharedPreferences | empty SharedPreferences that does nothing implementation&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gumroad.com/l/AndroidTestSharedPref"&gt;Testing SharedPreferences&lt;/a&gt; [gumroad.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="different-kinds-of-test-doubles"&gt;
Different kinds of Test doubles
&lt;a class="heading-anchor" href="#different-kinds-of-test-doubles" aria-label="Link to Different kinds of Test doubles"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://testing.googleblog.com/2013/07/testing-on-toilet-know-your-test-doubles.html"&gt;Know your test doubles&lt;/a&gt; [testing.googleblog.com]&lt;/li&gt;
&lt;li&gt;[Test Doubles: Mocks, Stubs, and More](&lt;a href="https://www.objc.io/issues/15-testing/mocking-stubbing/"&gt;https://www.objc.io/issues/15-testing/mocking-stubbing/&lt;/a&gt; &lt;a href="http://www.javaworld.com/article/2074508/core-java/mocks-and-stubs&amp;amp;#8212;understanding-test-doubles-with-mockito.html"&gt;http://www.javaworld.com/article/2074508/core-java/mocks-and-stubs&amp;amp;#8212;understanding-test-doubles-with-mockito.html&lt;/a&gt;) [objc.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks aren’t Stubs&lt;/a&gt; [martinfowler.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mockito"&gt;
Mockito
&lt;a class="heading-anchor" href="#mockito" aria-label="Link to Mockito"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mockito/mockito"&gt;Mockito library&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#stubbing_consecutive_calls"&gt;Stubbing consecutive calls&lt;/a&gt; [mockito.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://site.mockito.org/mockito/docs/current/org/mockito/ArgumentCaptor.html"&gt;Argument Captor&lt;/a&gt; [mockito.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jayway/powermock"&gt;PowerMock&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chiuki/friendspell"&gt;friendspell | Chiu-Ki’s example project with a variety of testing strategies&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sqisland.com/2015/12/mock-application-in-espresso.html"&gt;Mock Application in Espresso for Dependency Injection&lt;/a&gt; [sqisland.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/lessons/mockwebserver-introduction/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep059&amp;amp;utm_campaign=fragmented-ep059"&gt;Chiu-Ki’s caster.io courses on Testing | MockWebServer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chiuki"&gt;@chiuki&lt;/a&gt; and &lt;a href="https://plus.google.com/+ChiuKiChan"&gt;+ChiuKiChan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/059/</guid><pubDate>Mon, 10 Oct 2016 05:00:34 UTC</pubDate></item><item><title>058: Effective Java for Android Developers – Item #11: Override clone Judiciously</title><link>https://fragmentedpodcast.com/episodes/058/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f5667441-74d7-4615-819f-73e107bd82a0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f5667441-74d7-4615-819f-73e107bd82a0/058-effective-java-item11_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment, Donn talks about Item #11 of the Effective Java series – Override clone Judiciously. You’ll learn about the extralinguistic behavior of clone and the Cloneable interface. Clone and Cloneable are very special, and this episode helps explain the nuances.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()"&gt;Object#clone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/058/</guid><pubDate>Mon, 03 Oct 2016 05:00:03 UTC</pubDate></item><item><title>057: Data Binding with GDE Lisa Wray</title><link>https://fragmentedpodcast.com/episodes/057/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b6caa0a2-b1b2-4970-bdac-5fc38cd73af6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b6caa0a2-b1b2-4970-bdac-5fc38cd73af6/57-lisa-wray_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we talk with, Lisa Wray, first of her job title, mother of the Genius app and sorceress of Data Binding.&lt;/p&gt;
&lt;p&gt;What is Data Binding? How does it work? What can you do with it? … and what you can &lt;em&gt;really&lt;/em&gt; do with it ! Listen on and find out more. Lisa walks us through the basics and then talks to us about how we can really push the envelope with Data Binding and do some really cool things.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="about-lisa-wray"&gt;
About Lisa Wray
&lt;a class="heading-anchor" href="#about-lisa-wray" aria-label="Link to About Lisa Wray"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.xwray.com"&gt;xwray.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://genius.com"&gt;Genius&lt;/a&gt; [genius.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/42/"&gt;Fragmented Ep 042 – Google IO 2016 special&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="data-binding-resources"&gt;
Data Binding Resources
&lt;a class="heading-anchor" href="#data-binding-resources" aria-label="Link to Data Binding Resources"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/topic/libraries/data-binding/index.html"&gt;Data Binding Library&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=NBbeQMOcnZ0"&gt;Data Binding – Writing Apps Faster (Android Dev Summit 2015)&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=WdUbXWztKNY"&gt;Data Binding Techniques – Jacob Tabak’s Droidcon NYC 2015 talk&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zYGVsTE_scI"&gt;talk:title=&amp;quot;@{dataBinding}&amp;quot; – Lisa’s lightning talk at Square Android Spring Cleaning&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/blog/descent-into-databinding/"&gt;Descent into Data Binding – Bill Phillips at Big Nerd Ranch&lt;/a&gt; [bignerdranch.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=DAmMN7m3wLU"&gt;Advanced Data Binding – Google I/O 2016&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidbackstage.blogspot.com/2015/09/episode-35-data-bound.html"&gt;ADB Ep 35 – Data Bound&lt;/a&gt; [androidbackstage.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double the signing bonus!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lisawrayz"&gt;@lisawrayz&lt;/a&gt; and &lt;a href="https://plus.google.com/+LisaWrayZeitouni"&gt;+LisaWrayZeitouni&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/057/</guid><pubDate>Mon, 19 Sep 2016 05:00:44 UTC</pubDate></item><item><title>056: GDE Philippe Breault on tinkering with Android Studio (Part II)</title><link>https://fragmentedpodcast.com/episodes/056/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/ce31613f-fd45-4ae2-a486-9611ff1615f6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/ce31613f-fd45-4ae2-a486-9611ff1615f6/056_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We wind this two part series down with GDE Philippe by chatting about postfix completion, live templates, structural search/replace, integrating with external tools, cool configurations and much more. Prepare to be mind blown.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/055"&gt;Ep 55 – Fragmented: Part 1 of this series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/360andev/status/752921824812498945"&gt;Phil’s talk at 360Andev talk (coming soon): Android Studio like a boss&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/collection/wtO0PB"&gt;Phil’s Android Studio Tip of the day series&lt;/a&gt; [plus.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/timber"&gt;Timber logging : courtesy JakeWharton&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pbreault/adb-idea"&gt;ADB Idea plugin by Phil&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;Caster.io AS stuff:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/episode-3-android-studio-productivity-custom-shortcuts?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep056&amp;amp;utm_campaign=fragmented-ep056"&gt;Lesson 3: Android Studio Productivity – Custom Shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/integrating-robolectric-3-with-android-studio-2/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep056&amp;amp;utm_campaign=fragmented-ep056"&gt;Lesson 47: Integrating Robolectric 3 with Android Studio 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/android-studio-applying-logcat-filters/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep056&amp;amp;utm_campaign=fragmented-ep056"&gt;Lesson 66: Android Studio – Applying Logcat Filters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/pbreault"&gt;@pbreault&lt;/a&gt; and &lt;a href="http://developerphil.com"&gt;developerphil.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/056/</guid><pubDate>Tue, 13 Sep 2016 05:00:45 UTC</pubDate></item><item><title>055: GDE Philippe Breault discusses Tinkering with Android Studio (Part I)</title><link>https://fragmentedpodcast.com/episodes/055/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/5b7d6185-b049-41d6-aca4-559c1fd03845?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/5b7d6185-b049-41d6-aca4-559c1fd03845/055_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this 2 part series, we talk to the illustrious Philippe of Android Studio tinkering fame. He starts off by discussing the intermediate basics that everyone should know about using Android Studio: window configuration, keyboard shortcuts, navigating the code smoothly, debugging etc. Gradually he moves into ninja mode and starts blowing DF &amp;amp; KG’s minds with cool tips and configurations.&lt;/p&gt;
&lt;p&gt;We refused to let him go early and decided to record a second part as well. Stay tuned for the second part which should come out very shortly.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/buy/"&gt;JetBrains Toolbox subscription&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/collection/wtO0PB"&gt;Phil’s Android Studio Tip of the day series&lt;/a&gt; [plus.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://2015.droidcon.ca/"&gt;DroidCon Montreal 2015&lt;/a&gt; [droidcon.ca]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hadihariri.com/2014/06/24/no-tabs-in-intellij-idea/"&gt;No tabs in IntelliJ – Hadi Hariri&lt;/a&gt; [hadihariri.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/20/"&gt;Ep 20 – Fragmented : One with Hadi Hariri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/stetho/"&gt;Facebook Stetho&lt;/a&gt; [github.io]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double the signing bonus!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/pbreault"&gt;@pbreault&lt;/a&gt; and &lt;a href="http://developerphil.com"&gt;developerphil.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/055/</guid><pubDate>Mon, 12 Sep 2016 07:37:35 UTC</pubDate></item><item><title>054: git development workflow and branch versioning for App devs</title><link>https://fragmentedpodcast.com/episodes/054/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/50b53922-675c-4354-b7d3-b2a9f2ddddf0?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/50b53922-675c-4354-b7d3-b2a9f2ddddf0/054-git-development-workflow-and-branch-versioning-for-app-devs_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Donn and Kaushik discuss how they use git for their development workflow. They also touch on semantic versioning and how they rollout new versions of their app in a controlled fashion.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="follow-up"&gt;
Follow up
&lt;a class="heading-anchor" href="#follow-up" aria-label="Link to Follow up"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/052/"&gt;Ep 052: Junit tricks with Parameterized and Enclosing tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ppvi/status/765513456749514752"&gt;Jose Alcerecca showing some Stephan Linzer love&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/burst"&gt;Burst : Better Parameterized testing by Square&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tortoisesvn.net/"&gt;TortoiseSVN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;A successful git branching model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sourcegear.com/diffmerge/"&gt;DiffMerge by SourceGear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/branches"&gt;realm-java open source repo&lt;/a&gt; (shows branch naming convention)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://semver.org/"&gt;Semantic versioning spec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double the signing bonus!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/054/</guid><pubDate>Tue, 06 Sep 2016 05:00:36 UTC</pubDate></item><item><title>053: Jake Wharton on RxJava (2)</title><link>https://fragmentedpodcast.com/episodes/053-jake-wharton-on-rxjava-2/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8011feff-17b8-44cb-a9d9-3b256be9ab47?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8011feff-17b8-44cb-a9d9-3b256be9ab47/053-jake-wharton-on-rxjava-feat-olive_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We have Jake Wharton and RxJava in one episode ?. In this power-packed episode we talk to Jake about the advances in RxJava 1.x since the last time he was on the show and also looking ahead at the advancements coming down with RxJava 2. If you’re interested in RxJava, this episode will definitely be a treat!&lt;/p&gt;
&lt;p&gt;Watch out for a special &lt;a href="https://twitter.com/jakewharton/status/749293555970023425"&gt;guest cameo&lt;/a&gt; by the adorable &lt;a href="https://www.instagram.com/LeFrenchOlive/"&gt;Olive&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/6/"&gt;Fragmented Episode 6: with Jake&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/7/"&gt;Fragmented Episode 7: with Jake&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sched.droidcon.nyc/showTopicSquarespace/61360"&gt;Looking ahead to RxJava 2&lt;/a&gt; [droidcon.nyc] – Jake’s upcoming talk at DroidCon 2016&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/evant/gradle-retrolambda#usage"&gt;Retrolambda usage&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;Single
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://reactivex.io/documentation/single.html"&gt;Documentation&lt;/a&gt; [reactivex.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveX/RxJava/issues/1594"&gt;Origin github issue discussion&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Libraries used:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/RxRelay"&gt;RxRelay&lt;/a&gt; [github.com/JakeWharton]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/RxReplayingShare"&gt;RxReplayingShare&lt;/a&gt; [github.com/JakeWharton]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/sqlbrite"&gt;SqlBrite&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/RxBinding"&gt;RxBindings&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.kaush.co/2015/07/11/a-note-about-the-warmth-share-operator/"&gt;Note about the warmth of the share operator&lt;/a&gt; [blog.kaush.co]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="looking-ahead"&gt;
Looking ahead
&lt;a class="heading-anchor" href="#looking-ahead" aria-label="Link to Looking ahead"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.reactive-streams.org/"&gt;Reactive Streams specification&lt;/a&gt; [reactive-streams.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/documentation/rx-java/2341/backpressure/10629/creating-backpressured-data-sources#t=201607290718331225652"&gt;Using Observable fromAsync&lt;/a&gt; [stackoverflow.com/documentation] (released with 1.1.7)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveX/RxJava/tree/2.x#releases"&gt;RxJava2 release schedule &lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;Completable&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveX/RxJava/issues/2787"&gt;RxJava 2.0 Design: Naming&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;Backpressure types – buffer, latest, drop&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/buddybuild"&gt;BuddyBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/JakeWharton"&gt;@JakeWharton&lt;/a&gt; and &lt;a href="http://jakewharton.com/"&gt;jakewharton.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/053-jake-wharton-on-rxjava-2/</guid><pubDate>Mon, 22 Aug 2016 05:00:50 UTC</pubDate></item><item><title>052: Junit4 tricks with Parameterized Enclosing tests</title><link>https://fragmentedpodcast.com/episodes/052/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d584463c-22eb-47fc-b28e-d34204b2e2f6?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d584463c-22eb-47fc-b28e-d34204b2e2f6/052-testing_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini fragment Kaushik talks about some cool Junit 4 tricks using Parameterize, Enclosing test runners.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tools.android.com/tech-docs/unit-testing-support"&gt;Junit4 introduced with Android Studio 1.1&lt;/a&gt; [tools.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/junit-team/junit4/wiki/parameterized-tests"&gt;Junit4 Parameterized tests&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-testing/blob/master/runner/AndroidJunitRunnerSample/app/src/androidTest/java/com/example/android/testing/androidjunitrunnersample/CalculatorAddParameterizedTest.java"&gt;Calculator example from googlesamples&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/kaushikgopal/b6aa7d111d48705435ce93d4a2c22b3e"&gt;Sample template code for Enclosed.class&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/buddybuild"&gt;BuddyBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/052/</guid><pubDate>Mon, 15 Aug 2016 00:00:40 UTC</pubDate></item><item><title>051: Annotation processing Q&amp;A with GDE Mike Evans</title><link>https://fragmentedpodcast.com/episodes/051/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/d9845088-cb03-48cd-bf6e-3adc5f93ef1e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/d9845088-cb03-48cd-bf6e-3adc5f93ef1e/051-interview-with-mike-evans_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We’ve always wanted to know more about annotation processing, so in this episode we pick GDE Mike Evans’ brains on the topic and ask him a whole bunch of questions. If you’ve thought about diving into Annotation processing but never quite grappled with what it’s all about, this is a good episode to listen to.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dBUAqPs0TB0"&gt;Mike’s DroidCon NYC 2015&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/DeepLinkDispatch"&gt;AirBnB’s deep link dispatch&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jakewharton.github.io/butterknife/"&gt;ButterKnife from Jake Wharton&lt;/a&gt; [github.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://michaelevans.org/blog/2015/07/14/improving-your-code-with-android-support-annotations/"&gt;Improving your code with Android Support Annotations&lt;/a&gt; [michaelevans.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dOcs-NKK-RA"&gt;Jake Wharton and Jesse Wilson – Annotation Processing Boilerplate Destruction&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/021/"&gt;021: Fragmented – Jesse Wilson on Linker&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/ElementType.html"&gt;@Target Element Types&lt;/a&gt; [docs.oracle.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/javapoet"&gt;JavaPoet by Square&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/auto/tree/master/service"&gt;AutoService library by Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/kotlin/2015/05/kapt-annotation-processing-for-kotlin/"&gt;kapt – Annotation processing for Kotlin&lt;/a&gt; [blog.jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hannesdorfmann.com/annotation-processing/annotationprocessing101"&gt;Annotation processing 101&lt;/a&gt; [hannesdorfmann.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MichaelEvans/Aftermath"&gt;Aftermath by Michael Evans&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/buddybuild"&gt;BuddyBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/m_evans10"&gt;@m_evans10&lt;/a&gt; and &lt;a href="https://plus.google.com/+MichaelEvans"&gt;+MichaelEvans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/051/</guid><pubDate>Mon, 08 Aug 2016 06:37:32 UTC</pubDate></item><item><title>050: GDE gentleman Mark Allison dissects Constraint Layouts</title><link>https://fragmentedpodcast.com/episodes/050/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c3932a30-985c-47f6-a171-9d2df54353e8?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/c3932a30-985c-47f6-a171-9d2df54353e8/50-interview-with-mark-allison_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Friend of the show -and one of the finest gentlemen we know- Mark Allison chats with us about Constraint Layouts, what they are, why you need them, what to watch out for and how you can start using them in your application.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://blog.stylingandroid.com/"&gt;Styling Android – Mark’s blog&lt;/a&gt; [stylingandroid.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Marks’ Constraint Layout Series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-1/"&gt;Part 1&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-2/"&gt;Part 2&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-3/"&gt;Part 3&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-4/"&gt;Part 4&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-5/"&gt;Part 5&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-6/"&gt;Part 6&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-7/"&gt;Part 7&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/constraintlayout-part-8/"&gt;Part 8&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://android-developers.blogspot.com/2016/05/android-studio-22-preview-new-ui.html"&gt;Introducing Constraint Layout&lt;/a&gt; [tools.android.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.grokkingandroid.com/thoughts-on-constraintlayout-and-design-editor/"&gt;Wolfram’s post: Some thoughts on Android’s new Constraint Layout and Android Studio’s new Design Editor&lt;/a&gt; [grokkingandroid.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://androidbackstage.blogspot.com/2016/06/episode-50-constraint-layout.html"&gt;ADB episode-50&lt;/a&gt; [androidbackstage.blogspot.com]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double the signing bonus!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/MarkIAllison"&gt;@MarkIAllison&lt;/a&gt; and &lt;a href="https://blog.stylingandroid.com/"&gt;Styling Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/050/</guid><pubDate>Mon, 01 Aug 2016 05:00:25 UTC</pubDate></item><item><title>049: Translating an app for different languages with Dan Lew</title><link>https://fragmentedpodcast.com/episodes/049/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1ef27aad-be6c-45fb-b8df-cbcea20e382b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1ef27aad-be6c-45fb-b8df-cbcea20e382b/049-dan-lew_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Friend of the show Dan Lew makes a return! In this show Kaushik talks to Dan about translating an app for other languages.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/39/"&gt;Ep 39: Elliot Chenger&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grantland/android-autofittextview"&gt;AutoFitting TextViews&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.transifex.com"&gt;Transifex – service for helping with translations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2015/04/06/pseudolocalization-visiting-androids-bizarro-world/"&gt;Pseudo localization&lt;/a&gt; [danlew.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/XLIFF"&gt;Xliff&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/phrase"&gt;Phrase lib by Square&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=4dJHtT4-vBE"&gt;Ahmed’s Droidcon SF talk: From Right to Left and Back&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=0j74jcxSunY"&gt;Internationalis(z)ing Code – Computerphile&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://motherboard.vice.com/read/what-the-emoji-youre-sending-actually-look-like-to-your-friends"&gt;What your emojis actually look like&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double the signing bonus!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/danlew42"&gt;@danlew42&lt;/a&gt; [twitter.com] and &lt;a href="http://blog.danlew.net"&gt;Dan’s website&lt;/a&gt; [danlew.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/049/</guid><pubDate>Mon, 18 Jul 2016 00:01:36 UTC</pubDate></item><item><title>048: AndroidDev tips and tricks from 2016 (I)</title><link>https://fragmentedpodcast.com/episodes/048/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1eca091d-e270-49b9-82c5-e72ba5581c2e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1eca091d-e270-49b9-82c5-e72ba5581c2e/048-tips-and-tricks_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;2016’s first installment of a grand bonanza of tips and tricks for #AndroidDev! Donn and Kaushik talk about all the tips and tricks they’ve picked up over the first part of this year.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://spec.fm/podcasts/orthogonal"&gt;Orthogonal podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/groups/"&gt;GDG – Google Developer Groups&lt;/a&gt; [developers.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/28/"&gt;Ep 028: Fragmented – tips and tricks from 2015&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;DF: Developer happiness is &lt;a href="https://gettingreal.37signals.com/ch10_Optimize_for_Happiness.php"&gt;a real thing&lt;/a&gt;; Learn &lt;a href="http://kotlinlang.org"&gt;Kotlin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;KG: Prevent logcat clearing on app crash
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/a/31040015/159825"&gt;link 1&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/35415101/prevent-android-logcat-clear-during-app-restart"&gt;link 2&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KG: IntelliJ command line launcher:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://brian.pontarelli.com/2013/10/25/using-idea-for-git-merging-and-diffing/"&gt;git diffing&lt;/a&gt; [pontarelli.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/help/idea/2016.1/running-intellij-idea-as-a-diff-or-merge-command-line-tool.html"&gt;regular diffing&lt;/a&gt; [jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/hHnTIMjd1Y8?t=1m59s"&gt;IO 2016 session: Expert guide to Android Studio&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DF:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://plugins.jetbrains.com/plugin/4455"&gt;KeyPromoter plugin&lt;/a&gt; [jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-1/"&gt;Philippe Breault&lt;/a&gt; [developerphil.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DF: Window management tool
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mizage.com/divvy/"&gt;Divvy&lt;/a&gt; [mizage.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://manytricks.com/moom/"&gt;Moom&lt;/a&gt; [manytricks.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slant.co/topics/526/~window-manager-for-mac"&gt;Slant article comparing window management tools (for the Mac)&lt;/a&gt; [slant.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kasper/phoenix"&gt;Phoenix – lightweight open source js configurable tool&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/instructors/annyce-davis/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep048&amp;amp;utm_campaign=fragmented-ep048"&gt;Annyce’ caster.io videos&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;DF:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en"&gt;Postman chrome extension&lt;/a&gt; [chrome.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.runscope.com/posts/new-import-feature-support-for-swagger-postman"&gt;Runscope&lt;/a&gt; [blog.runscope.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/donnfelker/5e919828c889e5e82173929cb53969be"&gt;Donn’s git alias (un)watch&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;li&gt;git config:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/donnfelker/e8c51a98e22f2bf1c2d5"&gt;Donn&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/kaushikgopal/c9cc3c2307cbfd2dfc7addd119daa7a1"&gt;KG&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KG: &lt;a href="https://gist.github.com/kaushikgopal/90135e035147870e037b723e6e94c6e2"&gt;LogExOnlySubscriber.java – log exceptions only subscriber&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;li&gt;KG: &lt;a href="https://gist.github.com/kaushikgopal/b680b69953cc5a5692581f69b8c9c65c"&gt;RxSchedulerHook.java – Lazy man’s RxJava Espresso scheduler hooks&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;li&gt;DF: &lt;a href="http://mizage.com/shush/"&gt;Shush&lt;/a&gt; [mizage.com]&lt;/li&gt;
&lt;li&gt;KG: Intellij plugins
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plugins.jetbrains.com/plugin/2162?pr=idea"&gt;String Manipulation&lt;/a&gt; [plugins.jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plugins.jetbrains.com/plugin/5919?pr=clion"&gt;Lines Sorter&lt;/a&gt; [plugins.jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jetbrains.com/objc/2014/03/github-right-in-your-ide/"&gt;Open on Github – see last line in blog post&lt;/a&gt; [blog.jetbrains.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DF:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amzn.to/29jNSUR"&gt;8 steps to a pain free back&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ikea.com/us/en/catalog/products/S19022530/"&gt;IKEA – Bekant standup desk&lt;/a&gt; [ikea.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.autonomous.ai/desk"&gt;Autonomous – SmartDesk&lt;/a&gt; [autonomous.ai]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double the signing bonus!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/048/</guid><pubDate>Mon, 11 Jul 2016 00:01:46 UTC</pubDate></item><item><title>047: Custom Views &amp; ViewGroups with Huyen Tue Dao</title><link>https://fragmentedpodcast.com/episodes/047/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b00cf2bc-f125-4056-a002-2550254d13ab?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b00cf2bc-f125-4056-a002-2550254d13ab/047-interview-with-huyen-dao_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we talk to Trello engineer, GDE, YouTuber, Caster IO instructor and View magician Huyen about all things custom View/ViewGroups.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCMEmNnHT69aZuaOrE-dF6ug"&gt;Android Dialogs&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/custom-views-and-viewgroups-part-1/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep047&amp;amp;utm_campaign=fragmented-ep047"&gt;Huyen’s Custom Views/View Groups Part 1&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/ui/how-android-draws.html"&gt;How Android draws views&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/instructors/huyen-tue-dao?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep047&amp;amp;utm_campaign=fragmented-ep047"&gt;Huyen’s caster.io series&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-8M5nDABiqg"&gt;New Circle – Enhancing Android UI with Custom Views&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-xAdDqwaWJk"&gt;Loving Lean Layouts – DroidCon SF 2016&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lucasr.org/2014/05/12/custom-layouts-on-android/"&gt;Custom Layouts on Android – Lucas Rocha&lt;/a&gt; [lucasr.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/jF6Ad4GYjRU"&gt;Taming Android UI’s – Erik Burke – Square&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/zK2i7ivzK7M"&gt;Android Performance Patterns – Custom Views and Performance&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/queencodemonkey"&gt;@queencodemonkey&lt;/a&gt; or &lt;a href="http://www.randomlytyping.com"&gt;randomlytyping.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; or &lt;a href="http://fragmentedpodcast.com/contact/"&gt;Contact form&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; or &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; or &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/047/</guid><pubDate>Tue, 05 Jul 2016 00:01:05 UTC</pubDate></item><item><title>046: okJesse – A deep discussion on okHttp, okio and Retrofit</title><link>https://fragmentedpodcast.com/episodes/46/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/1c289d22-8e6d-4fef-89fe-395eb58258a7?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/1c289d22-8e6d-4fef-89fe-395eb58258a7/046-fragmented-interview-with-jesse-wilson_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Everyone loves Retrofit &amp;amp; okHttp. But how did they come about? Why ok? What was the need for such libraries? We went knocking on the doors of Square trying to find the answers to these question. We were lucky cause we found probably the nicest most brilliant Android/Java developer of our times – our good friend Jesse Wilson and without surprise, he crushes it!&lt;/p&gt;
&lt;p&gt;He gives us the scoop on the origin stories of these amazing libraries and also gives us insight into okio and why it’s such a game changer today.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://audio.simplecast.com/40224.mp3"&gt;Direct download&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/guice"&gt;Guice – DI lib&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/021/"&gt;Fragmented 21 : Diving Deep with Dagger (Cameo by Jesse Wilson)&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;Android’s HTTP Clients
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/java/net/HttpURLConnection.html"&gt;Apache Http Client&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/java/net/HttpURLConnection.html"&gt;Http URL Connection&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html"&gt;Jesse’s blog post on the subject&lt;/a&gt; [android-developers.blogspot.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="okio"&gt;
Okio
&lt;a class="heading-anchor" href="#okio" aria-label="Link to Okio"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://corner.squareup.com/2014/04/okio.html"&gt;Announcing okio&lt;/a&gt; [squareup.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/okio"&gt;okio source&lt;/a&gt; [okio.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="retrofit-github-throwback"&gt;
Retrofit github throwback
&lt;a class="heading-anchor" href="#retrofit-github-throwback" aria-label="Link to Retrofit github throwback"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/retrofit/tree/17886a10eecccada75e736cb2ffb30b8b8a58b55"&gt;Retrofit very first commit – crazybob&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/retrofit/blob/fb98822a9c17acfb6846d3f07d368804e155fd3f/modules/android/src/retrofit/android/ShakeDetector.java"&gt;ShakeDetector in Retrofit&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="moshi"&gt;
Moshi
&lt;a class="heading-anchor" href="#moshi" aria-label="Link to Moshi"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/moshi"&gt;Moshi – json parsing&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/gson"&gt;Gson&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jessewilson"&gt;@jessewilson&lt;/a&gt; and &lt;a href="https://plus.google.com/+JesseWilson"&gt;+JesseWilson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/46/</guid><pubDate>Mon, 20 Jun 2016 12:39:40 UTC</pubDate></item><item><title>045: Bluetooth (LE) with Dave (devunwired) Smith</title><link>https://fragmentedpodcast.com/episodes/45/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f0290714-7909-4f1e-9514-a83e30e66e13?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f0290714-7909-4f1e-9514-a83e30e66e13/045-interview-with-dave-smith_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We’ve always been curious about technology and the software surrounding embedded devices and the like. One such technology that’s ubiquitous these days is Bluetooth (LE). In this show we talk with embedded technology expert and all round super smart AndroidDev Dave Smith a.k.a the wonderful devunwired.&lt;/p&gt;
&lt;p&gt;We try to get a high level understanding of how Bluetooth works. From a developer’s perspective, how does this tech work? Why should we as AndroidDevs be interested in this technology. What boundaries can we push? How can we effectively use this technology? In this episode we pick Dave’s brain and try to answer some of these questions.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="dave8217s-talks-on-bluetooth"&gt;
Dave’s talks on Bluetooth
&lt;a class="heading-anchor" href="#dave8217s-talks-on-bluetooth" aria-label="Link to Dave&amp;amp;#8217;s talks on Bluetooth"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qx55Sa8UZAQ"&gt;Android Lollipop: Bluetooth LE Matures&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=x1y4tEHDwk0"&gt;Developing Bluetooth Smart Applications for Android Tutorial&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=TZf4WquRGJU"&gt;Dave’s talk: Google Beacons – AnDevCon&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-resources"&gt;
Other resources:
&lt;a class="heading-anchor" href="#other-resources" aria-label="Link to Other resources:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/connectivity/bluetooth.html#TheBasics"&gt;Bluetooth Classic&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/connectivity/bluetooth-le.html"&gt;Bluetooth LE&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/bluetooth/"&gt;Apple docs – Bluetooth for Developers&lt;/a&gt; [developer.apple.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=245130"&gt;Bluetooth specification&lt;/a&gt; [bluetooth.org]
&lt;ul&gt;
&lt;li&gt;check Advertisements: Volume 3, Part C, Section 11&lt;/li&gt;
&lt;li&gt;check GATT: Volume 3, Part G&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="360andev"&gt;
360|Andev
&lt;a class="heading-anchor" href="#360andev" aria-label="Link to 360|Andev"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use special code &lt;a href="http://360andev.com/#tile_registration"&gt;“Fragmented”&lt;/a&gt; if you’re registering for the &lt;a href="http://360andev.com/#tile_registration"&gt;360|Andev conference&lt;/a&gt; to get a 10% discount.&lt;/p&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/devunwired"&gt;@devunwired&lt;/a&gt; and &lt;a href="https://plus.google.com/+DaveSmithDev"&gt;+DaveSmithDev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="https://plus.google.com/+DonnFelker"&gt;+DonnFelker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; and &lt;a href="https://plus.google.com/+KaushikGopalIsMe"&gt;+KaushikGopalIsMe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/45/</guid><pubDate>Mon, 13 Jun 2016 00:30:15 UTC</pubDate></item><item><title>044 – Effective Java for Android Developers – Item #10</title><link>https://fragmentedpodcast.com/episodes/44/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/09d27f15-3d6f-4082-b355-cd85bfd56f59?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/09d27f15-3d6f-4082-b355-cd85bfd56f59/044_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini-Fragment, Donn talks about Item #10 of the Effective Java series – Always Override toString. You’ll learn why it’s important for your own sanity, future developers, and overall developer happiness.&lt;/p&gt;
&lt;p&gt;This episode is sponsored by Hired.com.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString%28%29"&gt;Object#toString&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1RUCko3"&gt;Effective Java Book&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/44/</guid><pubDate>Mon, 06 Jun 2016 11:16:18 UTC</pubDate></item><item><title>043: Google IO 2016 (Part 2)</title><link>https://fragmentedpodcast.com/episodes/43/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/4c16d38a-148f-4618-a79c-f437a164bb67?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/4c16d38a-148f-4618-a79c-f437a164bb67/043-googleio-part-2_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In Part 2 of our Google IO special we continue asking some simple questions to the best AndroidDev today. This concludes our IO special for this year. Hope you enjoyed it as much as we did!&lt;/p&gt;
&lt;p&gt;By popular demand we added some extra specials at the very end so make sure to listen all the way through :)&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pierre-Yves Ricau (&lt;a href="https://squareup.com"&gt;Square&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/piwai"&gt;@Piwai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pyricau/fragnums"&gt;Fragnums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.pennyapp"&gt;Penny – Conversational Finance app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Israel @rallat Ferrer Camacho (&lt;a href="https://squareup.com"&gt;Square&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rallat"&gt;@rallat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/26/"&gt;Fragmented 026: the show with Israel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts"&gt;Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tor Norbye
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/tornorbye"&gt;@tornorbye&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.javaposse.com"&gt;The Java Posse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidbackstage.blogspot.com"&gt;Android Developers Backstage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kelly Shushter
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kellyshuster"&gt;@kellyshuster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/40/"&gt;Fragmented 40: Episode with Kelly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.clue.android"&gt;Clue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Eugenio Marletti (&lt;a href="https://helloclue.com/"&gt;Clue&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/workingkills"&gt;@workingkills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/rock3r/life-without-fragments-with-eugenio-marletti"&gt;Life without fragments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sebastiano Poggi (&lt;a href="https://www.novoda.com/"&gt;Novoda&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/seebrock3r"&gt;@seebrock3r&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=k3IT-IJ0J98"&gt;What the Fragment – Google IO session&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.photos"&gt;Google Photos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/20/"&gt;Fragmented 20: Episode with Hadi Harriri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mike Evans
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/m_evans10"&gt;@m_evans10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.robinhood.android"&gt;Robinhood&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://droidista.blogspot.com/"&gt;Zarah Dominguez&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/zarahjutz"&gt;@zarahjutz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts"&gt;Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/43/</guid><pubDate>Wed, 01 Jun 2016 01:00:11 UTC</pubDate></item><item><title>042: Google IO 2016 (Part 1)</title><link>https://fragmentedpodcast.com/episodes/42/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/64859faf-9cb3-4160-9807-1f2baf2fd92a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/64859faf-9cb3-4160-9807-1f2baf2fd92a/042-google-io-part-1_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In Part 1 of our Google IO special we talk to a whole bunch of amazing AndroidDev. We go around asking them a few simple questions. Questions, that you probably thought to ask when you saw them in person, but just forgot to.&lt;/p&gt;
&lt;p&gt;Oh and you really should listen all the way to the end :)&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Annyce Davis (&lt;a href="http://offgrid-electric.com/#home"&gt;Offgrid Electric&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/brwngrldev"&gt;@brwngrldev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/33/"&gt;Fragmented episode 33 : talking Gradle with GDE Annyce Davis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.fitbit.FitbitMobile&amp;amp;hl=en"&gt;Fitbit Android app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mark Allison (Freelancer currently contracting for AMEX)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/MarkIAllison"&gt;@MarkIAllison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com"&gt;Styling Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiebe-elsinga.com"&gt;Wiebe Elsinga&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/welsinga"&gt;@welsinga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jake Wharton (&lt;a href="https://squareup.com"&gt;Square&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/JakeWharton"&gt;@JakeWharton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.meetup.com/kotlin-android/events/230353449/"&gt;Kotlin Night in SF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ryan Harter
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rharter"&gt;@rharter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts"&gt;Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lisa Wray (&lt;a href="http://genius.com"&gt;Genius&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lisawrayz"&gt;@lisawrayz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://riggaroo.co.za"&gt;Rebecca&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/riggaroo"&gt;@riggaroo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.twentytwoseven.android"&gt;22Seven&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Erik Hellman
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ErikHellman"&gt;@ErikHellman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=co.thefabulous.app"&gt;Fabulous – Motivate Me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/contact/"&gt;Contact form&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stay tuned for Part 2 where we talk to another list of top notch Android developers and get their answers for these questions.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/42/</guid><pubDate>Tue, 31 May 2016 01:00:42 UTC</pubDate></item><item><title>041: YAGNI</title><link>https://fragmentedpodcast.com/episodes/41/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/25158cc8-d24f-4931-8b84-726bc6a92a42?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/25158cc8-d24f-4931-8b84-726bc6a92a42/041-yagni_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, Donn talks about one of his favorite topics, YAGNI. YAGNI is an acronym that stands for “You Aren’t Gonna Need It”. Donn explains what it is, why its useful and shares a personal story of how he was introduced to the YAGNI concept back in 2008.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://audio.simplecast.com/37662.mp3"&gt;Direct download&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://c2.com/xp/YouArentGonnaNeedIt.html"&gt;YAGNI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it"&gt;YAGNI on Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.marketwatch.com/"&gt;MarketWatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io"&gt;Caster.IO&lt;/a&gt; Use the coupon code “fragmented” to receive 15% off any monthly subscription.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/41/</guid><pubDate>Tue, 24 May 2016 16:15:03 UTC</pubDate></item><item><title>040: Internal Library Dependency Management with Kelly Shuster</title><link>https://fragmentedpodcast.com/episodes/40/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/87646040-b5dd-4687-bd34-1f9a6b04c9f5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/87646040-b5dd-4687-bd34-1f9a6b04c9f5/040-kelly-shuster_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini episode, we talk with the lovely Kelly Shushter about Internal Library Dependency Management. Kelly is a GDE, the Director of Women Who Code (Denver chapter), a developer at Thoughtbot, a mind blowingly good AndroidDev and just an all round boss of everything.&lt;/p&gt;
&lt;p&gt;She gives us the rundown explaining different strategies for maintaining and managing internal libraries in your organization/company.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.womenwhocode.com/boulder"&gt;Women Who Code&lt;/a&gt; [womenwhocode.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ld-ikhhv57s"&gt;Droidcon SF 2015 – Android Internal Library Dependency Management&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/133824/is-it-significantly-costlier-to-fix-a-bug-at-the-end-of-the-project"&gt;Fixing a bug later is costly?&lt;/a&gt; [programmers.stackexchange.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="solutions"&gt;
Solutions
&lt;a class="heading-anchor" href="#solutions" aria-label="Link to Solutions"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules"&gt;Git submodules&lt;/a&gt; [git-scm.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.android.com/source/developing.html"&gt;Repo by Google&lt;/a&gt; [source.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jfrog.com/artifactory/"&gt;Artifactory – Jfrog&lt;/a&gt; [jfrog.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jitpack.io"&gt;Jitpack&lt;/a&gt; [jitpack.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/KioKrofovitch/dependency-sample/tree/06-maven-plus-source-code"&gt;Kelly’s hack to toggle between maven lib dependency and local source&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://caster.io"&gt;Caster.io&lt;/a&gt; [Coupon code: Fragmented]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kellyshuster"&gt;@kellyshuster&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kiodev.com"&gt;kiodev.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/40/</guid><pubDate>Mon, 16 May 2016 01:00:36 UTC</pubDate></item><item><title>039: Talking TextView with Elliott Chenger</title><link>https://fragmentedpodcast.com/episodes/39/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/086f029f-06bd-4010-aac4-2ce674c25a2f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/086f029f-06bd-4010-aac4-2ce674c25a2f/039_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we chat with our friend an all round amazing AndroidDev Elliott Chenger. Elliot does Android development for Under Armour and knows a thing or two about TextViews. We talk TextViews, font rendering complications in Android, performance optimizations, localization (vs internationalization), ECDC (it’s a thing!) and wind the discussion off with some design software tools out there.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.underarmour.com/en-us/healthbox"&gt;Under Armour : Health box&lt;/a&gt; [underarmour.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=bScUAmg-7EQ"&gt;Droidcon NYC 2015 – TextView how to turn design into reality for multiple languages&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@romainguy/androids-font-renderer-c368bbde87d9#.idw9u3ov3"&gt;Android’s Font Renderer : Efficient text rendering with OpenGL ES&lt;/a&gt; Romain Guy [medium.com]&lt;/li&gt;
&lt;li&gt;DÖnn Fëlker&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/erchenger/textviews-and-localization"&gt;TextView packages : Slide from Elliott’s talk&lt;/a&gt; [speakerdeck.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/text/StaticLayout.html"&gt;Static Layout&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/text/BoringLayout.html"&gt;Boring Layout&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="performance"&gt;
Performance
&lt;a class="heading-anchor" href="#performance" aria-label="Link to Performance"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tools.android.com/tips/traceview"&gt;Traceview in Android Studio&lt;/a&gt; [tools.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/performance/profile-gpu-rendering/index.html"&gt;Profile GPU rendering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/text/StaticLayout.html"&gt;Static Layout : for text that will not be edited after it is laid out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/text/DynamicLayout.html"&gt;Dynamic Layout : text layout that updates itself as the text is edited&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://instagram-engineering.tumblr.com/post/114508858967/improving-comment-rendering-on-android"&gt;Improving comment rendering on Android&lt;/a&gt; [instagram-engineering.tumblr.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/29860276/how-to-use-textlayoutview-of-instagram-in-improving-textview-rendering-on-andr"&gt;Sample implementation of technique Instagram describes&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinadamek.com/2011/01/05/performance-of-android-listview-containing-textviews/"&gt;Simple trick explaining TextView wrap_content vs fixed height&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/smartphone-enerlytics/apple-music-the-latest-music-app-also-has-energy-glitches-how-we-reduced-its-battery-drain-by-18-3a82b62b1178"&gt;Energy glitches with Apple music app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/distribute/tools/localization-checklist.html"&gt;Google Localization Checklist&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="design-tools"&gt;
Design tools
&lt;a class="heading-anchor" href="#design-tools" aria-label="Link to Design tools"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zeplin.io"&gt;Zeplin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redpen.io"&gt;Red Pen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=bipEyYaxFNU"&gt;Sketch 3 For Android Developers (Big Android BBQ 2015)&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sketchapp.com"&gt;Sketch app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nrdryjobs.com/fragmented"&gt;The Nerdery&lt;/a&gt; [nrdryjobs.com/fragmented]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Echenger"&gt;@Echenger&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/39/</guid><pubDate>Mon, 09 May 2016 00:00:59 UTC</pubDate></item><item><title>038: What you Need to know about N</title><link>https://fragmentedpodcast.com/episodes/38/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/29f0711b-7dd6-488c-b62b-3c65c0fcaa5d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/29f0711b-7dd6-488c-b62b-3c65c0fcaa5d/038-android-n-developer-preivew-highlights_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, Donn and Kaushik look at the Android N developer preview. They highlight the biggest changes that you as an Android Developer should keep an eye out for. There are tonne of features in N, so listen to this episode to get the highlights.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2016/03/first-preview-of-android-n-developer.html"&gt;First preview of Android N: Developer API &amp;amp; Tools&lt;/a&gt; [android-developers.blogspot.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/preview/setup-sdk.html"&gt;Instruction for setting up your dev environment for the N preview (~=&amp;gt; Lambda support)&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/preview/j8-jack.html#supported-features"&gt;Java 8 Language features&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidbackstage.blogspot.com/2016/03/episode-45-state-of-art.html"&gt;ADB episode : 45 State of the Art&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lambdas do not retain enclosing reference (unless really needed)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93"&gt;commit note on Jack toolchain&lt;/a&gt; [android.googlesource.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93/jack/src/com/android/jack/ir/impl/JackIrBuilder.java#1347"&gt;JacklrBuilder source createMethodInfoforLambda&lt;/a&gt; [android.googlesource.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/RxJava-Android-Samples/tree/kg/2-1_prev_lambda"&gt;RxJava Android Samples using lambdas&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html"&gt;javap – The Java class file Disassembler&lt;/a&gt; [docs.oracle.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/android/issues/detail?id=204065"&gt;Issue tracking Annotation processing options in Jack&lt;/a&gt; [code.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/preview/j8-jack.html"&gt;Other Java 8 language features for N&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/preview/features/multi-window.html"&gt;Android MultiWindow features&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/cloud-messaging/network-manager"&gt;GCM Network Manager a.k.a Job Scheduler&lt;/a&gt; [developers.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/app/Notification.Style.html"&gt;Android Notification styles&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;
Resources
&lt;a class="heading-anchor" href="#resources" aria-label="Link to Resources"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=CsulIu3UaUM"&gt;What’s new in Android N: Ian Lake + Joanna smith&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/5-tips-for-preparing-for-multi-window-in-android-n-7bed803dda64#.mcs2o5rpy"&gt;5 tips for preparing for multi window in Android N: Ian Lake&lt;/a&gt; [medium.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=IL50oWdgfNY"&gt;DroidCon SF keynote: Chet and Romain&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commonsware.com/blog/2016/03/09/random-musings-n-developer-preview.html"&gt;Random musing on the N developer preview&lt;/a&gt; [commonsware.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double your accepting bonus $2000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/38/</guid><pubDate>Mon, 02 May 2016 00:00:42 UTC</pubDate></item><item><title>037: Decompress 1 : Xcode, Fonts sizes, Testing and yes Agera!</title><link>https://fragmentedpodcast.com/episodes/37/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/c8ec5ca1-9475-4556-b4ab-35f8baaeb0be?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/c8ec5ca1-9475-4556-b4ab-35f8baaeb0be/36-decompress-vol-1_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this very first edition of our Decompress episode we talk about the fonts we love to use, some Xcode hating, Testing woes and the intensely discussed library that Google recently released Agera!&lt;/p&gt;
&lt;h1 id="shownotes"&gt;
Shownotes:
&lt;a class="heading-anchor" href="#shownotes" aria-label="Link to Shownotes:"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/agera/wiki"&gt;Agera&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hired.com/fragmented/"&gt;Hired – special offer: double your accepting bonus $2000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/37/</guid><pubDate>Mon, 25 Apr 2016 02:00:33 UTC</pubDate></item><item><title>036: Working Remotely</title><link>https://fragmentedpodcast.com/episodes/036/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/22988fa6-f016-49e9-bbb0-43cb97eb255e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/22988fa6-f016-49e9-bbb0-43cb97eb255e/036-donn-felker-on-working-remotely_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment we touch on a highly requested topic – working remotely. Donn talks about how to ease into remote working, tools for working remotely, tips and tricks for staying sane and productive while remote and he wraps it up by discussing the benefits employers have when hiring a remote workforce.&lt;/p&gt;
&lt;h1 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Remote work is best suited for information workers (programmers, designers, engineers, etc)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1NiaztU"&gt;Read Remote by DHH and Jason Fried&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Great book that echoes what I feel about working remote.&lt;/li&gt;
&lt;li&gt;Tip: Listen to it on Audible, it’s faster to consume.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to ease into remote work at your current job
&lt;ul&gt;
&lt;li&gt;Convince manager to allow a 1 day trial for one – three months.&lt;/li&gt;
&lt;li&gt;Remote day should be on Friday (fewer critical things happen on Friday, on average)&lt;/li&gt;
&lt;li&gt;After trial, if success, aim for 2-3 days of remote work. (Again, do this at the end of the week. Wed,Thu, Fri)&lt;/li&gt;
&lt;li&gt;Once successful, rally for full week of remote with an occasional in office visit (a day every week work two)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="staying-sane-while-working-remote"&gt;
Staying sane while working remote
&lt;a class="heading-anchor" href="#staying-sane-while-working-remote" aria-label="Link to Staying sane while working remote"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/working-remotely-tips/"&gt;Donn’s blog post on this topic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a work day schedule (5am-2pm, 8am-5pm, 10am-7pm, etc)
&lt;ul&gt;
&lt;li&gt;When you’re done, you’re done. Leave work (your office/etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Schedule. Schedule. Schedule. Stick to a schedule.
&lt;ul&gt;
&lt;li&gt;Get up at the same time&lt;/li&gt;
&lt;li&gt;Get dressed for work (no PJ’s etc)&lt;/li&gt;
&lt;li&gt;Do your hair.&lt;/li&gt;
&lt;li&gt;Be presentable&lt;/li&gt;
&lt;li&gt;This is all mental&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prepare for the day
&lt;ul&gt;
&lt;li&gt;Get coffee/tea/water and snacks&lt;/li&gt;
&lt;li&gt;Try to limit the opportunity of distractions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;During the day
&lt;ul&gt;
&lt;li&gt;Take a lunch, away from your desk.&lt;/li&gt;
&lt;li&gt;Go out for lunch with someone (significant other, friend, etc) at one to two times a week.&lt;/li&gt;
&lt;li&gt;Work out of the house a couple times a week, this increases our creativity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Outside of Work
&lt;ul&gt;
&lt;li&gt;You need social interaction, Cabin Fever is a real thing.&lt;/li&gt;
&lt;li&gt;Exercise 3-4 times a week if possible.&lt;/li&gt;
&lt;li&gt;Group classes are perfect for this.
&lt;ul&gt;
&lt;li&gt;CrossFit&lt;/li&gt;
&lt;li&gt;Martial Arts&lt;/li&gt;
&lt;li&gt;Yoga&lt;/li&gt;
&lt;li&gt;Pilates&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Communication When Remote
&lt;ul&gt;
&lt;li&gt;Put 3x-4x more effort into communicating than previous. You’re not visible seen so you need to be more vocal.
&lt;ul&gt;
&lt;li&gt;Call&lt;/li&gt;
&lt;li&gt;SMS&lt;/li&gt;
&lt;li&gt;Blow up the Slack/Hipchat channel/etc&lt;/li&gt;
&lt;li&gt;Objective – Clear your own path&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tools"&gt;
Tools
&lt;a class="heading-anchor" href="#tools" aria-label="Link to Tools"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For remote to work effectively, everything should be considered remote. If one employee is remote, then all meetings should occur as if the team is remote. This ensures that everyone can work effectively without missing anything.&lt;/li&gt;
&lt;li&gt;Communication
&lt;ul&gt;
&lt;li&gt;Group Chat
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.slack.com"&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hipchat.com"&gt;HipChat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Video Chat
&lt;ul&gt;
&lt;li&gt;Google Hangouts&lt;/li&gt;
&lt;li&gt;Skype&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.join.me"&gt;Join.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.zoom.us"&gt;Zoom.us&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Task Management
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.trello.com"&gt;Trello&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.asana.com"&gt;Asana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.github.com"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="remote-for-employers"&gt;
Remote for Employers
&lt;a class="heading-anchor" href="#remote-for-employers" aria-label="Link to Remote for Employers"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Benefits from Remote workforce
&lt;ul&gt;
&lt;li&gt;Much larger talent pool than the exhausted pool (or non-existent one that local). Higher quality employees/contractors/consultants for the same overhead.&lt;/li&gt;
&lt;li&gt;Remote creates much more loyal employees. You’re giving them their life back and this is reciprocated.&lt;/li&gt;
&lt;li&gt;Your company becomes anti-fragile as you’re able to adapt with the industry faster. You can hire in areas others cannot.&lt;/li&gt;
&lt;li&gt;On average, remote employees work harder and are more productive than their office counterparts.&lt;/li&gt;
&lt;li&gt;Less overhead! No need to pay for additional office space.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/036/</guid><pubDate>Mon, 18 Apr 2016 10:52:59 UTC</pubDate></item><item><title>035: All about Vector support on Android</title><link>https://fragmentedpodcast.com/episodes/35/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/454ea459-4146-4f2d-807e-e721f72cee7d?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/454ea459-4146-4f2d-807e-e721f72cee7d/035-vector-assets_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment we touch base on all the things you need to know about Vector drawables for Android development. How one can use it today, the recommended usage for vector drawable and formats, the limitations and everything else you need to know as an Android developer.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html"&gt;Vector Drawable&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/trello/victor"&gt;Trello’s Victor&lt;/a&gt; [github.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=fVq4_HhBK8Y"&gt;What’s our Vector Victor&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2015/09/android-studio-14.html"&gt;Android Studio 1.4 release (with Vector Asset Studio announcement)&lt;/a&gt; [android-developers.blogspot.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="support-library-announcements"&gt;
Support library announcements
&lt;a class="heading-anchor" href="#support-library-announcements" aria-label="Link to Support library announcements"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2016/02/android-support-library-232.html"&gt;Android Support Library v23.2&lt;/a&gt; [android-developers.blogspot.com]
&lt;ul&gt;
&lt;li&gt;Vector Drawable backported&lt;/li&gt;
&lt;li&gt;Ian Lake also gives us the instructions in this post&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chris.banes.me/2016/02/25/appcompat-vector/"&gt;9% of AAR saved on AppCompat&lt;/a&gt; [chris.banes.me]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/+AndroidDevelopers/posts/BZgzpAqkd8G"&gt;Android Support v23.3.1 announced&lt;/a&gt; [plus.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/help/vector-asset-studio.html"&gt;Vector Asset Studio&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="animated-vector-drawable"&gt;
Animated Vector Drawable
&lt;a class="heading-anchor" href="#animated-vector-drawable" aria-label="Link to Animated Vector Drawable"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable.html"&gt;AnimatedVectorDrawable&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sqisland.com/2014/10/first-look-at-animated-vector-drawable.html"&gt;Chiuki on Animated Vector Drawables&lt;/a&gt; [sqisland.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/glomadrian/RoadRunner"&gt;Road Runner library&lt;/a&gt; [github.com]
&lt;ul&gt;
&lt;li&gt;see &lt;a href="https://www.youtube.com/watch?v=1ru8vBtywHE"&gt;youtube demo&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="problems"&gt;
Problems:
&lt;a class="heading-anchor" href="#problems" aria-label="Link to Problems:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dlew/android-svg-drawable-test"&gt;Dan Lew’s SVG test project&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/android/issues/detail?id=196452"&gt;bug report on no gradient support for vectors&lt;/a&gt; [code.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/help/vector-asset-studio.html#apilevel"&gt;Vector format restrictions : Vector Asset Studio&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inloop.github.io/svg2android/"&gt;Better conversation tool svg2android – Juraj Novák&lt;/a&gt; [inloop.github.io]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-references"&gt;
Other references:
&lt;a class="heading-anchor" href="#other-references" aria-label="Link to Other references:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/vectordrawables-part-1/"&gt;Mark Allison – Vector Drawable Part 1&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/vectors-for-all-almost/"&gt;Mark Allison – Vectors for all (Almost)&lt;/a&gt; [stylingandroid.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.tutsplus.com/articles/using-androids-vectordrawable-class--cms-23948"&gt;Using Android Vector Drawable&lt;/a&gt; [code.tutsplus]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsor"&gt;
Sponsor
&lt;a class="heading-anchor" href="#sponsor" aria-label="Link to Sponsor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/35/</guid><pubDate>Mon, 11 Apr 2016 08:00:12 UTC</pubDate></item><item><title>034: Effective Java for Android Developers – Item #9</title><link>https://fragmentedpodcast.com/episodes/34/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/81bc6da4-2e61-488d-bf98-e0adc5393bf2?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/81bc6da4-2e61-488d-bf98-e0adc5393bf2/034-effective-java_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, we introduce Joshua’s ninth Item. After the last somewhat mind boggling item, this is a much welcomed simple, practical yet important one: Always override hashCode when you override equals.&lt;/p&gt;
&lt;p&gt;Donn goes into the importance of implementing hashCode and why it’s so important to override it for maintaining harmony with the equals method. Also 42 and the answer to life ? He then goes into some tips on implementing a good hashCode and a standard recipe for the same.&lt;/p&gt;
&lt;p&gt;Go forth and override them hashCodes!&lt;/p&gt;
&lt;p&gt;This episode is brought to you by Rollbar. Go to &lt;a href="http://rollbar.com/fragmented"&gt;rollbar.com/fragmented&lt;/a&gt; to get their Bootstrap plan for free for 90 days. Stay tuned for more items from our &lt;a href="http://fragmentedpodcast.com/category/effective-java/"&gt;“Effective Java for Android developers” Fragment series&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/34/</guid><pubDate>Mon, 04 Apr 2016 05:00:24 UTC</pubDate></item><item><title>033: Talking Gradle with GDE Annyce Davis</title><link>https://fragmentedpodcast.com/episodes/33/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/fdc0a78d-f0fa-4941-bd74-fa343d9cab8f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/fdc0a78d-f0fa-4941-bd74-fa343d9cab8f/33-groovy-with-gradle-feat-annyse-davise_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we talk Gradle with the amazing and awesome Annyce Davis. We deal with the basics of Android’s build system and dabble with some tips on improving your build times.&lt;/p&gt;
&lt;p&gt;Also we released our first ever &lt;a href="https://teespring.com/fragmented"&gt;Fragmented T-shirt&lt;/a&gt; in collaboration with another amazing GDE – Taylor Ling of AndroidTee fame.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=gTXSMiotz6Q"&gt;Annyce’s talk where she mentions Cyclomatic complexity&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://offgrid-electric.com/"&gt;OffGrid Electric&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/13/"&gt;Corey Latislaw on TDD and Testing&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/instructors/annyce-davis/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep033&amp;amp;utm_campaign=fragmented-ep033"&gt;Annyce Davis’ Caster.io videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph"&gt;DAG: Directed Acyclic Graph&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://spec.fm/podcasts/fragmented/26032"&gt;DAG discussion on Fragmented – Seek to 18:35&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/22479145/what-commands-does-android-studios-gradle-aware-make-perform"&gt;What commands does Andorid Studio’s gradle aware make perform?&lt;/a&gt; [stackoverflow.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.googlesource.com/platform/tools/adt/idea/+/55fa5d46d8b9f9ed9b3e19938b1c2783007f5610/android/src/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProvider.java"&gt;MakeBeforeRunTaskProvider source&lt;/a&gt; [android.googlesource.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/creating-a-gradle-plugin/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep033&amp;amp;utm_campaign=fragmented-ep033"&gt;Creating a Gradle Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discuss.gradle.org/t/usage-of-apply-from-in-buildscript-scope/1844"&gt;Use apply from in gradle to include external files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://groovy-lang.org/learn.html"&gt;Learn Groovy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html#sec:dry_run"&gt;Gradle dry run flag&lt;/a&gt; [docs.gradle.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=AbNhen_zn-c"&gt;Madis Pink – Optimizing gradle build time : Droidcon Paris&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="annyce8217s-talks--videos"&gt;
Annyce’s talks &amp;amp; videos:
&lt;a class="heading-anchor" href="#annyce8217s-talks--videos" aria-label="Link to Annyce&amp;amp;#8217;s talks &amp;amp; videos:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=gTXSMiotz6Q"&gt;Be a good citizen: Develop Maintainable apps&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/instructors/annyce-davis/?utm_source=fragmentedpodcast&amp;amp;utm_medium=shownotes&amp;amp;utm_term=ep033&amp;amp;utm_campaign=fragmented-ep033"&gt;Caster.io videos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fragmented-t-shirts"&gt;
Fragmented T-shirts
&lt;a class="heading-anchor" href="#fragmented-t-shirts" aria-label="Link to Fragmented T-shirts"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://teespring.com/fragmented"&gt;Purchase here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/brwngrldev"&gt;@brwngrldev&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/33/</guid><pubDate>Mon, 28 Mar 2016 05:00:27 UTC</pubDate></item><item><title>Fragmented Podcast Update – Sol 2 – TSHIRTS!</title><link>https://fragmentedpodcast.com/misc/sol2/</link><description>
&lt;p&gt;Everybody loves t-shirts! More than one listener in the past has asked us when Fragmented is going to have a t-shirt – one they can wear at &lt;a href="http://events.google.com/io2016/"&gt;conferences and such&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We thought about it, but never could hone in on a wicked design. The bar is set SUPER high for good t-shirts these days! The design has to be iconic, yet you should be able to comfortably wear it to work and it shouldn’t turn you into a public billboard. Most importantly though – the design should be distinctly Android…&lt;/p&gt;
&lt;p&gt;That calls for an extra special t-shirt and we’re stoked to tell you this… we have something extra special for you … check it out …&lt;/p&gt;
&lt;p&gt;Announcing the Limited Edition Fragmented T-Shirt:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fragmentedpodcast.com/images/wp-content/uploads/2016/03/fragmentedT.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;If the design is familiar, it should be. We worked with &lt;a href="http://twitter.com/taylorling"&gt;Taylor Ling&lt;/a&gt; who’s released a &lt;a href="http://teespring.com/droid03#pid=369&amp;amp;cid=6513&amp;amp;sid=front"&gt;bunch&lt;/a&gt; of &lt;a href="http://teespring.com/droid04#pid=369&amp;amp;cid=6513&amp;amp;sid=front"&gt;amazing&lt;/a&gt; DroidTees in the past. Taylor Ling is a phenomenal designer, who also happens to be a GDE for design and clearly understands Android design intimately.&lt;/p&gt;
&lt;p&gt;We asked Taylor if he would do a limited edition special Fragmented t-shirt and he gladly obliged (thanks a ton, Taylor). We are super stoked to be releasing these t-shirts. They’re available in a whole bunch of colors and sizes for a limited time. We would be honored if you got one for yourself!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://teespring.com/fragmented"&gt;Purchase the t-shirt here&lt;/a&gt;.&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/misc/sol2/</guid><pubDate>Sat, 26 Mar 2016 07:30:24 UTC</pubDate></item><item><title>032: Making sense of Android Support Library version numbers</title><link>https://fragmentedpodcast.com/episodes/32/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f5c0c866-cad5-4883-97b0-32951526470b?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f5c0c866-cad5-4883-97b0-32951526470b/ep-032-version-numbers-support-library_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The Android Support library framework is the biggest boon to Android developers. But how does one makes sense of the different versions and revisions available? In this fragment we try to address that question.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html"&gt;Introducing AppCompat V21&lt;/a&gt; [android-developers.blogspot.com]
[android-developers.blogspot.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/30"&gt;Prev episode with Mike Wolfson&lt;/a&gt; [fragmentedpodcast.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/support-library/index.html"&gt;Android Support Library – “Revision” changelog&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1056912/source-control-vs-revision-control/1056947"&gt;Revision vs Version&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2015/05/android-design-support-library.html"&gt;Introducing Design Support Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Command to see dependency graph:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;`&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; ./gradlew -q app:dependencies
+--- com.android.support:design:23.1.1
| +--- com.android.support:appcompat-v7:23.1.1 (*)
| +--- com.android.support:recyclerview-v7:23.1.1
| | +--- com.android.support:support-annotations:23.1.1
| | \--- com.android.support:support-v4:23.1.1 (*)
| \--- com.android.support:support-v4:23.1.1 (*)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;`&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vwSpDDczIdg"&gt;Seinfeld Auditions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://spec.fm/"&gt;Fragmented Spec channel&lt;/a&gt; (sign up at the bottom)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/contact/"&gt;Contact email form&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/32/</guid><pubDate>Mon, 14 Mar 2016 06:00:56 UTC</pubDate></item><item><title>031: Effective Java for Android Developers – Item #8</title><link>https://fragmentedpodcast.com/episodes/31/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/cbd6cff5-ae25-4d71-974f-de5cc2d50d1e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/cbd6cff5-ae25-4d71-974f-de5cc2d50d1e/031-effective-java-item-8_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, we introduce Joshua’s eighth Item. This one is a doozy, probably one of the longest items in the group of the effective Java series, but most definitely quite important.&lt;/p&gt;
&lt;p&gt;This episode is brought to you by Rollbar. Go to &lt;a href="http://rollbar.com/fragmented"&gt;rollbar.com/fragmented&lt;/a&gt; to get their Bootstrap plan for free for 90 days.&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our &lt;a href="http://fragmentedpodcast.com/category/effective-java/"&gt;“Effective Java for Android developers” Fragment series&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=donnfelker-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Obey the general contract when overriding equals&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="when-to-not-override-equals"&gt;
When to not override equals:
&lt;a class="heading-anchor" href="#when-to-not-override-equals" aria-label="Link to When to not override equals:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Each instance of the class is inherently unique.&lt;/li&gt;
&lt;li&gt;You don’t care whether the class provides a “logical equality” test.&lt;/li&gt;
&lt;li&gt;A superclass has already overridden &lt;em&gt;equals&lt;/em&gt;, and the superclass behavior is appropriate for this class.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-equals-method-implement-an-equivalence-relation-which-states-it-must-be"&gt;
The &lt;strong&gt;equals&lt;/strong&gt; method implement an equivalence relation which states it must be:
&lt;a class="heading-anchor" href="#the-equals-method-implement-an-equivalence-relation-which-states-it-must-be" aria-label="Link to The equals method implement an equivalence relation which states it must be:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reflexive&lt;/li&gt;
&lt;li&gt;Symmetric&lt;/li&gt;
&lt;li&gt;Transitive&lt;/li&gt;
&lt;li&gt;Consistent&lt;/li&gt;
&lt;li&gt;For any non-null reference &lt;em&gt;x&lt;/em&gt;, &lt;em&gt;x.equals(null)&lt;/em&gt; must return false.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="a-recipe-for-a-high-quality-equals-method-is-as-such"&gt;
A recipe for a high-quality &lt;strong&gt;equals&lt;/strong&gt; method is as such:
&lt;a class="heading-anchor" href="#a-recipe-for-a-high-quality-equals-method-is-as-such" aria-label="Link to A recipe for a high-quality equals method is as such:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use the &lt;strong&gt;==&lt;/strong&gt; operator to check for references to this object.&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;instanceof&lt;/strong&gt; operator to check if the argument has the correct type &lt;/li&gt;
&lt;li&gt;Cast to the correct type.&lt;/li&gt;
&lt;li&gt;Check all field types and corresponding field types.&lt;/li&gt;
&lt;li&gt;Finally, when done, ask yourself – is this method symmetric, transitive and consistent?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="caveats"&gt;
Caveats
&lt;a class="heading-anchor" href="#caveats" aria-label="Link to Caveats"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Always override &lt;strong&gt;hashcode&lt;/strong&gt; when you override &lt;strong&gt;equals&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Don’t be too clever!&lt;/li&gt;
&lt;li&gt;Don’t substitute another type for &lt;strong&gt;Object&lt;/strong&gt; in the equals declaration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/31/</guid><pubDate>Mon, 07 Mar 2016 15:32:59 UTC</pubDate></item><item><title>030: Material Design for developers with GDE Mike Wolfson</title><link>https://fragmentedpodcast.com/episodes/30/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/ef8372be-59bd-4093-be38-f9dcc0cec005?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/ef8372be-59bd-4093-be38-f9dcc0cec005/030-material-design-feat-mike-wolfson_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we talk to Material Design Master and Google Developer Expert Mike Wolfson. What does Material design mean to us developers? How does one use the numerous support libraries to help with this? What widgets should and shouldn’t we be using? Listen to the show and find out.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://design.google.com"&gt;Material Design – Official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/design/spec/material-design/introduction.html"&gt;Material Design – The Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/design/spec/style/color.html#color-color-palette"&gt;Google Color Palette – list of “approved” colors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://willowtreeapps.com/blog/palette-the-new-api-for-android/"&gt;Google Color Palette Library – picking colors from an image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/status/703105617410437120"&gt;Android Support Lib 23.2 video&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;Resource for getting better at Material Design:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.materialdoc.com/"&gt;Materialdoc.com – curated blog post for developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mwolfson/android-historian"&gt;Android Historian – Mike’s Material Design demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.materialup.com/posts/material-design-icon-template-psd"&gt;PSD resources – Up Labs&lt;/a&gt; [materialup.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/design/spec/resources/layout-templates.html"&gt;Official PSD layout templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/material-design-icons"&gt;Official Material Design Icons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5u0dtzXL3PQ"&gt;DroidconNYC 2015: Material design everywhere using the Android Support Libraries – Mike’s talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sponsors"&gt;
Sponsors
&lt;a class="heading-anchor" href="#sponsors" aria-label="Link to Sponsors"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rollbar.com/fragmented"&gt;Rollbar – special offer: Bootstrap plan free for 90 days&lt;/a&gt; [rollbar.com/fragmented]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mike Wolfson: &lt;a href="https://twitter.com/mikewolfson"&gt;Twitter&lt;/a&gt; &lt;a href="https://plus.google.com/+michaelwolfson"&gt;Google+&lt;/a&gt; &lt;a href="http://www.mikewolfson.com/"&gt;mikewolfson.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/30/</guid><pubDate>Mon, 29 Feb 2016 06:00:06 UTC</pubDate></item><item><title>029: All about the infamous 65,536 dex method count</title><link>https://fragmentedpodcast.com/episodes/29/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/a22d1b65-3df8-4a25-9390-46a9d7c89092?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/a22d1b65-3df8-4a25-9390-46a9d7c89092/029-dex-64k-methods-limit_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;If you’ve been an Android developer in the last 2 years, you must have seen this dreaded exception: &lt;code&gt;dex: method ID not in [0, 0xffff]: 65536&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Quick googling would immediately bring up the phrase “65K method count” and the recommended solution “multi-dexing”. But if you want to really understand this mysterious number and the reason behind its existence, listen on!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html"&gt;Official Dalvik specification&lt;/a&gt; [source.android.com] (look for invoke- prefix methods)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.contentful.com/blog/2014/10/30/android-and-the-dex-64k-methods-limit/"&gt;Android and the Dex limit&lt;/a&gt; (great post)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidbackstage.blogspot.com/2014/08/android-developers-backstage-episode-11.html"&gt;ADB Ep 11 : ART, pART 2 (Trash Talk)&lt;/a&gt; (discussion on ART)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/building/multidex.html"&gt;MultiDexing&lt;/a&gt; [developer.android.com] (solution to your 65K method count woes)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/29/</guid><pubDate>Mon, 22 Feb 2016 06:00:14 UTC</pubDate></item><item><title>Fragmented Podcast Update – Sol 1</title><link>https://fragmentedpodcast.com/misc/sol1/</link><description>
&lt;p&gt;Heya Folks,&lt;/p&gt;
&lt;p&gt;We wanted to let you know what we’ve been up to with the Fragmented podcast lately. Don’t worry, all things below are good for you as the listener.&lt;/p&gt;
&lt;p&gt;You may or may not have noticed that the episode length has been getting gradually shorter. We’re trying to get it under 40 minutes.&lt;/p&gt;
&lt;p&gt;Why under 40 minutes?&lt;/p&gt;
&lt;p&gt;Well, simply because we’ve heard nothing but good things about all of our shorter episodes. Plus, &lt;a href="https://blog.bufferapp.com/optimal-length-social-media"&gt;research shows&lt;/a&gt; that the optimal length of a podcast is somewhere in the realm of 22 minutes.&lt;/p&gt;
&lt;p&gt;Ha. 22 minutes. That’s funny.&lt;/p&gt;
&lt;p&gt;Have you ever tried explaining a complex topic like dependency injection in 22 minutes, with an intro and outro? Yeah, probably not going to happen … and if we did try to do it … well … the show would be as dry as scarfing down an entire bag of saltines without a gulp of water … #knowwhatwemean? For us, we’re finding that an action packed episode comes somewhere between 30-40 minutes (sometimes over – it is what it is).&lt;/p&gt;
&lt;p&gt;Secondly, the shorter fragment episodes are coming back. We’ve taken a short break from fragments to re-identify our strategy with them. We’re still going to cover the Effective Java series, but we’re going to sprinkle those in with other Fragments we want to do. We learned that the listeners really loved the super actionable content like we had in &lt;a href="http://fragmentedpodcast.com/episodes/12/"&gt;episode 12&lt;/a&gt; (Continuous Integration and Collective Code Ownership). Therefore we’re going to do more of those kind of fragment episodes with Effective Java fragments episodes sprinkled in here and there – think of them like cute little surprise Android cupcakes that you occasionally run into &amp;lt;– See what we did there? Cupcake, Android, get it? .. Ok, stop throwing tomatoes – we get it, we admit … it was a bad joke… :)&lt;/p&gt;
&lt;p&gt;Lastly, we’ve decided to join the &lt;a href="http://spec.fm/"&gt;Spec.FM&lt;/a&gt; network. This is the same network that is the home to many other great podcasts, such as – Developer Tea, Design Details, Immutable, Does Not Compute and more.&lt;/p&gt;
&lt;p&gt;Why are we joining a network? Simply put – they help us get content out faster and handle a bunch of the administrative workload that we have to deal with. With this extra help we can focus more on the show, the content and getting more episodes out to you folks much faster and efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does that mean for you as a listener?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;More awesome of course! Hopefully, you notice anything but better content and more frequent releases. That said, we’ve already started moving our feeds over to our new podcast media host at Spec.FM. Hopefully, your podcatcher realizes this and does not double up episodes for you. If it does, let us know so we can try to remedy the situation for others.&lt;/p&gt;
&lt;p&gt;Joining a network also helps us out on the admin side too, especially in an area we’re not too versed in … let us explain. There’s an old saying that we’re all familiar with – Time is money. This is also the case with the podcast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We LOVE doing the podcast&lt;/strong&gt;, so much in fact that we’d probably both do it full time if we could.&lt;/p&gt;
&lt;p&gt;Unfortunately, that’s not possible as we don’t make anything off of the show. It’s actually the opposite – it costs us a bit of cash to keep this thing going. Not that we’re going broke, but it definitely does make the “time is money” adage ring true. That said, we have had quite a bit of interest from companies who have offered to sponsored the show. We tried to figure out how that would look and how it would work and how to set that up. Long story short – we’re not good ad salesmen. We’re good developers (we think … err … we hope we are … Kaushik … we’re good dev’s right ?? … man … I hope so … anyway …).&lt;/p&gt;
&lt;p&gt;Spec.FM will help us with some advertising spots on the show. Here’s the thing though, we will only be advertising things we feel our listeners can get value out of. Therefore, you won’t see us advertising used cars, enhancement pills or mortgage deals (wow, that combo of keywords should put us on some spam lists….). The only time an ad will be on our show is when we approve it and feel that listeners could possibly benefit from the product in the ad.&lt;/p&gt;
&lt;p&gt;We hope these small, incremental changes help improve the podcast in the long run. &amp;lt;– See what we did there again? Small. Incremental. Just like software! Iterative … releases … Ugh… yeah … bad joke again. Hey, we tried. :)&lt;/p&gt;
&lt;p&gt;As always, if you have any questions, &lt;a href="http://fragmentedpodcast.com/contact/"&gt;let us know&lt;/a&gt;, we’d love to hear from you.&lt;/p&gt;
&lt;p&gt;Hugs and bunnies and robots and stuff, your Android ear-bud buddies (say that 10 times fast) –&lt;/p&gt;
&lt;p&gt;Donn &amp;amp; Kaushik&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/misc/sol1/</guid><pubDate>Mon, 15 Feb 2016 18:48:25 UTC</pubDate></item><item><title>028: Tips and tricks we picked from 2015</title><link>https://fragmentedpodcast.com/episodes/28/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/438831a4-95e5-40db-9ea1-f9a85edd6d04?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/438831a4-95e5-40db-9ea1-f9a85edd6d04/028-tips-tricks_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Feast yourselves to a grand bonanza of tips and tricks with this episode! Donn and Kaushik talk about the tips and tricks they’ve picked up over the course of 2015.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Y2GC6P5hPeA&amp;amp;feature=youtu.be&amp;amp;t=6m28s"&gt;Android Dev Summit demo – Structural replace&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Software_design_pattern"&gt;Software Design patterns&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;Reformatting code:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/help/reformatting-source-code.html"&gt;Reformatting Source code&lt;/a&gt; [jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/help/reformat-file-dialog.html"&gt;Reformat dialog&lt;/a&gt; [jetbrains.com] (only VCS changed text)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Library dependency management:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jitpack.io/"&gt;JitPack&lt;/a&gt; (publishing jvm and android libraries)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=EsOTPNAaH6o"&gt;Internal library dependency managment – Kelly Shushter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/20/"&gt;Hadi Hariri on Fragmented Ep 20 talking Intellij shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/using-uiautomatorviewer-to-help-write-espresso-tests/"&gt;Using UiAutomatorViewer to help write espresso tests – Ep. 23: Caster.io&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/kaushikgopal/10f7f77a69b142d98f67"&gt;git pre-commit hook&lt;/a&gt; [gist]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/help/working-with-embedded-local-terminal.html"&gt;Intellij – work with embedded Terminal&lt;/a&gt; [jetbrains.com] (yes, you can customize btw zsh/bash)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/kaushikgopal/0a0397669fd00f96249b"&gt;KG’s Update script – morning ritual&lt;/a&gt; [gist]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cyrilmottier.com/2014/11/17/grid-spacing-on-android/"&gt;Cyril on Grid Spacing on Android&lt;/a&gt; [cyrilmottier.com] (showdividers/divider)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/android/issues/detail?id=72061"&gt;Tor’s issue on maven vs jcenter&lt;/a&gt; [code.google.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/28/</guid><pubDate>Sun, 14 Feb 2016 18:27:05 UTC</pubDate></item><item><title>027: Talking Realm with Christian Melchior</title><link>https://fragmentedpodcast.com/episodes/27/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/b950e460-f194-49cc-8b9d-ccae38fc2d17?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/b950e460-f194-49cc-8b9d-ccae38fc2d17/027_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Realm pro and overall genius Christian Melchior joins us in this episode to talk about all things Realm.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realm.io/docs/java/latest/"&gt;Realm.io for Java/Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/articles/schemaless/"&gt;Martin fowler on schema-less&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/realm/realm-java/issues/1756"&gt;github issue on extending Realm Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/realm-for-android-developers/"&gt;Caster.io video tutorial – Intro to Realm for Android Devs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vGFInG96KH4"&gt;Christian’s talk at Droidcon NYC 2015&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chrmelchior"&gt;@chrmelchior&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/realm"&gt;@realm&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/27/</guid><pubDate>Fri, 05 Feb 2016 17:56:26 UTC</pubDate></item><item><title>026: LetMeExplainYou AndroidDev like a pro</title><link>https://fragmentedpodcast.com/episodes/26/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6620c28e-f64f-4d72-9d66-32316be9ac02?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6620c28e-f64f-4d72-9d66-32316be9ac02/026_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik chat with the one and only Israel Ferrer Camacho (&lt;a href="http://twitter.com/rallat"&gt;@rallat&lt;/a&gt;). They discuss a talk Israel gave sometime back on “Android development like a pro”, exchanging war stories on patterns like MVP, MVVP clean architecture etc.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dropbox.com/s/jkn5aat1458f74t/AndroidDevLikeAPro.pdf"&gt;Rallat’s slides&lt;/a&gt; [pdf]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rallat/effectiveandroid"&gt;Rallat’s sample repo using different patterns&lt;/a&gt; [github]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rallat/status/676800521924050944"&gt;Burrito Design Pattern&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052"&gt;Working Effectively with Legacy Code&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html"&gt;The Clean architecture&lt;/a&gt; [blog.8thlight.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vimeo.com/43612849"&gt;Uncle Bob’s talk on Vimeo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome Picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome Picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="rallat"&gt;
Rallat:
&lt;a class="heading-anchor" href="#rallat" aria-label="Link to Rallat:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rallat/status/687413035590356992"&gt;Rallat’s tweet on Dagger 2 &amp;amp; Scope Provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/track/22VdIZQfgXJea34mQxlt81"&gt;Music for the week! The Weeknd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cmd Shift A – one shortcut to rule them all&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn"&gt;
Donn:
&lt;a class="heading-anchor" href="#donn" aria-label="Link to Donn:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://2016.phillyemergingtech.com/"&gt;Philly ETE (April 11/12)&lt;/a&gt; (Donn’s giving a talk)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paulgraham.com/vb.html"&gt;Life is Short&lt;/a&gt; [paulgraham.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io?utm_source=fragmented_ep_26_notes"&gt;7 videos on UI Testing and TDD with Espresso : Caster.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik"&gt;
Kaushik:
&lt;a class="heading-anchor" href="#kaushik" aria-label="Link to Kaushik:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create a pared-down “lite” version of the app&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mattlogan.me/making-pancakes-an-alternative-to-fragmentmanager-for-views.html"&gt;Pancakes library – alternative to Fragment Manager for views&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rallat"&gt;@rallat&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/26/</guid><pubDate>Thu, 21 Jan 2016 09:23:22 UTC</pubDate></item><item><title>025: Effective Java for Android developers : Item 7</title><link>https://fragmentedpodcast.com/episodes/25/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/0073d8ad-ff29-49db-8b2b-9d6d48728400?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/0073d8ad-ff29-49db-8b2b-9d6d48728400/025_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, we introduce Joshua’s seventh Item and a momentous end to the first chapter: &lt;strong&gt;Avoid finalizers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our &lt;a href="http://fragmentedpodcast.com/category/effective-java/"&gt;“Effective Java for Android developers” Fragment series&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Avoid finalizers&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you don’t know what they are, ignorance is bliss. If you know what they are, avoid them!&lt;/li&gt;
&lt;li&gt;Finalizers in Java != destructors in C++ (C++ counterparts to constructors).&lt;/li&gt;
&lt;li&gt;In C++ destructors
&lt;ul&gt;
&lt;li&gt;you reclaim resources here (Java has GC)&lt;/li&gt;
&lt;li&gt;you also reclaim non-memory resources (use the try-finally block in Java)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(unpredicatable amt of time between object becoming unreachable and finalizer being executed) Never do anything time critical in finalizer!
&lt;ul&gt;
&lt;li&gt;System.gc + System.runFinalization increase chances – no guarantee&lt;/li&gt;
&lt;li&gt;System.runFinalizersOnExit + Runtime.runFinalizersOnExit are the ones that do – but they are fatally flawed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Java 7 has &lt;a href="https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html"&gt;try with resources&lt;/a&gt;, which is also interesting and &lt;a href="http://examples.javacodegeeks.com/core-java/java-autocloseable-interface-example/"&gt;auto-closeables&lt;/a&gt;. [Android] devs can only dream of these.&lt;/li&gt;
&lt;li&gt;If an uncaught exception is thrown in a finalizer, it is ignored, and the finalization abruptly terminates.&lt;/li&gt;
&lt;li&gt;Severe performance penalty for using finalizers – (one e.g.) time to create and destroy simple object goes from 5.6ns -&amp;gt; 2400ns&lt;/li&gt;
&lt;li&gt;Only valid use: as a safety net or to terminate noncritical native resources.&lt;/li&gt;
&lt;li&gt;[Android] you’re probably better off using Android’s lifecycle methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/25/</guid><pubDate>Mon, 28 Dec 2015 02:47:04 UTC</pubDate></item><item><title>024: Effective Java for Android developers : Item 6</title><link>https://fragmentedpodcast.com/episodes/24/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/2de30948-e0b3-4ba5-bc27-398adc3fe91e?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/2de30948-e0b3-4ba5-bc27-398adc3fe91e/024_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Joshua’s sixth Item: &lt;strong&gt;Eliminate obsolete object references&lt;/strong&gt;, in a distinctively croaky voice.&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our &lt;a href="http://fragmentedpodcast.com/category/effective-java/"&gt;“Effective Java for Android developers” Fragment series&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Eliminate obsolete object references&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="supplemental-reading-for-the-diligent-ones-that-follow-shownotes"&gt;
Supplemental reading (for the diligent ones that follow shownotes)
&lt;a class="heading-anchor" href="#supplemental-reading-for-the-diligent-ones-that-follow-shownotes" aria-label="Link to Supplemental reading (for the diligent ones that follow shownotes)"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/5002589/memory-leakage-in-event-listener"&gt;Do click listeners leak memory?&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/leakcanary"&gt;Square’s LeakCanary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html"&gt;How to leak a context – Handlers and inner classes&lt;/a&gt; [androiddesignpatterns.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html"&gt;Avoiding Memory leaks&lt;/a&gt; [android-developers.blogspot.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/24/</guid><pubDate>Tue, 15 Dec 2015 18:48:43 UTC</pubDate></item><item><title>023: Android Dev Summit Recap</title><link>https://fragmentedpodcast.com/episodes/23/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f96ca62e-b6a7-45ad-b309-6114b37fe9c5?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f96ca62e-b6a7-45ad-b309-6114b37fe9c5/023_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Donn and Kaushik cover the happenings of Google’s very first Android Developer conference – “Android Dev Summit”. Together, they attended the conference both virtually and physically! Listen on for the highlights.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://androiddevsummit.withgoogle.com/schedule"&gt;Android Dev Summit Schedule&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/AndroidDev/status/669314468518621184"&gt;AndroidDev Twitter account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sessions"&gt;
Sessions
&lt;a class="heading-anchor" href="#sessions" aria-label="Link to Sessions"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xdItHEVfQ4U"&gt;Android Dev Summit 2015 Keynote&lt;/a&gt; [youtube]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Y2GC6P5hPeA"&gt;Android Studio for Experts&lt;/a&gt; [youtube]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vdasFFfXKOY"&gt;Android Testing&lt;/a&gt; [youtube]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-VNfWh5UkfY"&gt;Firechat – Framework team&lt;/a&gt; [youtube]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=LMyfEtElLQQ"&gt;Firechat – Android Tools and Testing team&lt;/a&gt; [youtube]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sample-projects"&gt;
Sample projects
&lt;a class="heading-anchor" href="#sample-projects" aria-label="Link to Sample projects"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-topeka"&gt;Android Topeka&lt;/a&gt; [github]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AndroidBootstrap/android-bootstrap"&gt;Android Bootstrap&lt;/a&gt; [github]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/u2020"&gt;u2020&lt;/a&gt; [github]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.code-labs.io/"&gt;Google code labs&lt;/a&gt; + &lt;a href="https://github.com/googlecodelabs"&gt;github link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/23/</guid><pubDate>Mon, 30 Nov 2015 00:53:50 UTC</pubDate></item><item><title>022: Effective Java for Android developers : Item 5</title><link>https://fragmentedpodcast.com/episodes/22/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f4dd7624-70a3-48cf-88ab-988ef5ccca39?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f4dd7624-70a3-48cf-88ab-988ef5ccca39/022_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, we introduce Joshua’s fifth Item: &lt;strong&gt;Avoid creating unnecessary objects&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our &lt;a href="http://fragmentedpodcast.com/category/effective-java/"&gt;“Effective Java for Android developers” Fragment series&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Avoid creating unnecessary objects&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/training/articles/perf-tips.html#ObjectCreation"&gt;Google says – Avoiding creating unnecessary objects&lt;/a&gt; too!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pca.st/uAyx#t=53m51s"&gt;Episode 10 with Michael Bailey – String optimization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="snippet-to-demonstrate-autoboxing-problems"&gt;
Snippet to demonstrate AutoBoxing problems
&lt;a class="heading-anchor" href="#snippet-to-demonstrate-autoboxing-problems" aria-label="Link to Snippet to demonstrate AutoBoxing problems"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// sum of all positive values
Long sum = 0L;
for (long i=0; i&amp;lt; Integer.MAX_VALUE; i++) {
sum+=i;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/22/</guid><pubDate>Fri, 20 Nov 2015 06:26:59 UTC</pubDate></item><item><title>021: Diving Deep with Dagger</title><link>https://fragmentedpodcast.com/episodes/021/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/880f6a9f-7215-49c3-9afa-0b0f8850efac?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/880f6a9f-7215-49c3-9afa-0b0f8850efac/021_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="in-other-news"&gt;
In other news
&lt;a class="heading-anchor" href="#in-other-news" aria-label="Link to In other news"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker/status/660493375129432064"&gt;Donn in a Banana Suit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Max/status/660200673242300416"&gt;KG as a Storm Trooper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidto.com/"&gt;AndoridTO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fragmentedpodcast.com/episodes/20/"&gt;020 – Talking Kotlin with Hadi Hariri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://officialandroid.blogspot.com/2015/10/podcasters-welcome-to-google-play-music.html"&gt;Google entering podcast scene and we’re on it&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dagger"&gt;
Dagger
&lt;a class="heading-anchor" href="#dagger" aria-label="Link to Dagger"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Topological_sorting"&gt;Topological Sort&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="jesse-wilson-cameo"&gt;
Jesse Wilson Cameo
&lt;a class="heading-anchor" href="#jesse-wilson-cameo" aria-label="Link to Jesse Wilson Cameo"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/dagger/blob/master/core/src/main/java/dagger/internal/Linker.java#L286"&gt;Dagger Linker class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/guice/blob/master/extensions/mini/src/com/google/inject/mini/MiniGuice.java"&gt;Jesse’s MiniGuice proof of concept&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-references"&gt;
Other references
&lt;a class="heading-anchor" href="#other-references" aria-label="Link to Other references"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/20477417/use-dagger-modules-without-the-injects-directive"&gt;Avoiding injects with library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!topic/dagger-discuss/QgnvmZ-dH9c/discussion"&gt;Assisted Injection for Dagger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/auto/tree/master/factory"&gt;AutoFactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/"&gt;caster.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/support/test/rule/ActivityTestRule.html"&gt;Activity Test Rule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.parleys.com/tutorial/architecting-android-applications-dagger"&gt;Jake Wharton – Architecting Android Applications with Dagger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="donn8217s-picks"&gt;
Donn’s picks:
&lt;a class="heading-anchor" href="#donn8217s-picks" aria-label="Link to Donn&amp;amp;#8217;s picks:"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/episode-9-dagger-part-1/"&gt;Dagger 1&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/rxjava-for-android-developers/"&gt;Intro to RxJava for Android Developers&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/realm-for-android-developers/"&gt;Intro to Realm for Android Developers&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.howtogeek.com/57481/how-to-make-custom-silicone-ear-molds-for-your-in-ear-monitors/"&gt;Custom Silicone earbuds&lt;/a&gt; [howtogeek.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dhh/reconsider-41adf356857f"&gt;DHH – Reconsider&lt;/a&gt; [medium.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="kg8217s-picks"&gt;
KG’s picks:
&lt;a class="heading-anchor" href="#kg8217s-picks" aria-label="Link to KG&amp;amp;#8217;s picks:"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/DreaminginCodeZH/MaterialColdStart"&gt;Cold start illusion&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://songexploder.net/jeff-beal"&gt;Song Exploder – House of Cards&lt;/a&gt; [songexploder.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://songexploder.net/ramin-djawadi"&gt;Song Exploder – Game of Thrones&lt;/a&gt; [songexploder.net]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/021/</guid><pubDate>Fri, 13 Nov 2015 16:36:35 UTC</pubDate></item><item><title>020: Talking Kotlin with Hadi Hariri</title><link>https://fragmentedpodcast.com/episodes/20/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/851fd081-5054-49c9-a04c-661c0753e330?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/851fd081-5054-49c9-a04c-661c0753e330/020_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A tonne of folks have been asking for a show on Kotlin. We got the best person in the business to take us through what could possibly be our new hope.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hadihariri.com/2014/06/24/no-tabs-in-intellij-idea/"&gt;No tabs in Intellij&lt;/a&gt; [hadihariri.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="jetbrains-products"&gt;
Jetbrains products
&lt;a class="heading-anchor" href="#jetbrains-products" aria-label="Link to Jetbrains products"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Java – &lt;a href="https://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;.Net – &lt;a href="https://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CI server – &lt;a href="https://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Issue tracking – &lt;a href="https://www.jetbrains.com/youtrack/"&gt;YouTrack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="smaller-ides"&gt;
Smaller IDES
&lt;a class="heading-anchor" href="#smaller-ides" aria-label="Link to Smaller IDES"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Web/Node.js – &lt;a href="https://www.jetbrains.com/webstorm/"&gt;WebStorm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python/Django – &lt;a href="https://www.jetbrains.com/pycharm/"&gt;PyCharm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ruby/Rails – &lt;a href="https://www.jetbrains.com/ruby/"&gt;RubyMine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;C++ – &lt;a href="https://www.jetbrains.com/clion/"&gt;CLion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ObjectiveC – &lt;a href="https://www.jetbrains.com/objc/"&gt;AppCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hadi8217s-3-tips-for-intellij"&gt;
Hadi’s 3 tips for Intellij
&lt;a class="heading-anchor" href="#hadi8217s-3-tips-for-intellij" aria-label="Link to Hadi&amp;amp;#8217;s 3 tips for Intellij"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Don’t use the Mouse! &lt;a href="https://vimeo.com/98922030"&gt;Mouseless driven development&lt;/a&gt; [vimeo.com]&lt;/li&gt;
&lt;li&gt;Cmd Shift A – look up other commands&lt;/li&gt;
&lt;li&gt;Don’t use the Find box to find things: Prefer shortcuts like Cmd O/Cmd Shift O&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="kotlin"&gt;
Kotlin
&lt;a class="heading-anchor" href="#kotlin" aria-label="Link to Kotlin"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; – An open source JVM targeted language&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1ReS3ep-hjxWA8kZi0YqDbEhCqTt29hG8P44aA9W0DM8/edit#heading=h.zi7eb2clrbue"&gt;Jake’s doc on Using Project Kotlin for Android&lt;/a&gt; [docs.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;Execution in the kingdom of nouns&lt;/a&gt; [blogspot.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realm.io/news/droidcon-michael-pardo-kotlin/"&gt;Kotlin : a new hope – talk by Michael Pardo&lt;/a&gt; [realm.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Tony_Hoare"&gt;Tony Hoare saying Null is his Billion dollar mistake&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="getting-started-with-kotlin"&gt;
Getting started with Kotlin
&lt;a class="heading-anchor" href="#getting-started-with-kotlin" aria-label="Link to Getting started with Kotlin"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/docs/tutorials/"&gt;Kotlin Tutorials&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/tutorials/koans.html"&gt;Kotlin Koans&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://try.kotlinlang.org/"&gt;Try Kotlin online : online &amp;amp; interactive&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=viiDaLpPfN4"&gt;Kotlin in two minutes&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Kotlinlang.slack.com"&gt;Kotlin Slack channel&lt;/a&gt; [slack.com]&lt;/li&gt;
&lt;li&gt;Books:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leanpub.com/kotlin-for-android-developers"&gt;Antonio’s book on Kotlin&lt;/a&gt; [leanpub.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manning.com/books/kotlin-in-action"&gt;Kotlin in Action&lt;/a&gt; [manning.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kotlin-tools"&gt;
Kotlin tools
&lt;a class="heading-anchor" href="#kotlin-tools" aria-label="Link to Kotlin tools"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JetBrains/anko"&gt;Anko&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/tutorials/android-plugin.html"&gt;Kotlin Android extensions&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="sample-projects-with-kotlin"&gt;
Sample projects with Kotlin
&lt;a class="heading-anchor" href="#sample-projects-with-kotlin" aria-label="Link to Sample projects with Kotlin"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hzsweers/palettehelper"&gt;Palette Helper&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/IzanRodrigo/Cinesapp-Android-Kotlin"&gt;Cinesapp Android Kotlin&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mgouline/android-samples/tree/master/kotlin-demo"&gt;Kotlin demo&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.fogcreek.com/killing-off-wasabi-part-1/"&gt;Killing off Wasabi: Part 1&lt;/a&gt; [fogcreek.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.fogcreek.com/killing-off-wasabi-part-2/"&gt;Killing off Wasabi: Part 2&lt;/a&gt; [fogcreek.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="hadi-hariri"&gt;
Hadi Hariri
&lt;a class="heading-anchor" href="#hadi-hariri" aria-label="Link to Hadi Hariri"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.microsoft.com/on-the-issues/2015/10/20/the-collapse-of-the-us-eu-safe-harbor-solving-the-new-privacy-rubiks-cube/"&gt;The collapse of the US-EU Safe Harbor: Solving the new privacy Rubik’s Cube&lt;/a&gt; [http://blogs.microsoft.com/]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oracle.com/javaone/index.html"&gt;JavaOne Conference&lt;/a&gt; [oracle.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When looking for solutions to a problem, search the source code first before StackOverflow&lt;/li&gt;
&lt;li&gt;When working on a feature, change your launcher activity (temporarily) to the one you’re working on&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/a/3320183/5210"&gt;git – assume unchanged&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amzn.to/1Lk1eP4"&gt;The Martian Audio Book&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leanpub.com/kotlin-for-android-developers"&gt;Antonio’s book on Kotlin&lt;/a&gt; [leanpub.com]&lt;/li&gt;
&lt;li&gt;Also check out &lt;a href="http://antonioleiva.com/"&gt;his blog&lt;/a&gt; [antonioleiva.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/hhariri"&gt;@hhariri&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/20/</guid><pubDate>Mon, 26 Oct 2015 09:35:37 UTC</pubDate></item><item><title>019: Effective Java for Android developers : Item 4</title><link>https://fragmentedpodcast.com/episodes/19/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/70e3e9d3-9bf8-4e6c-94d3-35780f4f42dd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/70e3e9d3-9bf8-4e6c-94d3-35780f4f42dd/ep-19_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Singer and Android developer Donn Felker explores Joshua Bloch’s fourth Item: &lt;strong&gt;Enforce noninstantiability with a private constructor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned, cause we got more of these quick ones coming.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes:
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Enforce noninstantiability with a private constructor&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="examples-where-you-don8217t-want-class-to-be-instantiated"&gt;
Examples where you don’t want class to be instantiated
&lt;a class="heading-anchor" href="#examples-where-you-don8217t-want-class-to-be-instantiated" aria-label="Link to Examples where you don&amp;amp;#8217;t want class to be instantiated"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;class that groups static methods and static fields (Util like classes think java.lang.Math/java.util.Arrays)&lt;/li&gt;
&lt;li&gt;class that groups static methods (including factory methods) for objects implementing specific interfaces (think java.util.Collections)&lt;/li&gt;
&lt;li&gt;class that group methods on a final class (vs. extending the class)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="considerations"&gt;
Considerations
&lt;a class="heading-anchor" href="#considerations" aria-label="Link to Considerations"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Makes no sense to instantiate such “Util” classes&lt;/li&gt;
&lt;li&gt;Private constructors prevent instantiation&lt;/li&gt;
&lt;li&gt;Important side effect: prevents subclassing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/19/</guid><pubDate>Thu, 15 Oct 2015 06:59:37 UTC</pubDate></item><item><title>018: Effective Java for Android developers : Item 3</title><link>https://fragmentedpodcast.com/episodes/18/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/17ba77a6-b621-4c8e-a052-d9f289319332?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/17ba77a6-b621-4c8e-a052-d9f289319332/ep-18_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this mini Fragment, we introduce Joshua’s third Item: &lt;strong&gt;Enforce the Singleton property with a private constructor or an enum type&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our “Effective Java for Android developers” Fragment series.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes:
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Enforce the Singleton property with a private constructor or an enum type&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="approaches"&gt;
Approaches
&lt;a class="heading-anchor" href="#approaches" aria-label="Link to Approaches"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Create a public static final INSTANCE variable and privatize constructor&lt;/li&gt;
&lt;li&gt;Same as 1 but privatize variable and expose access with provide factory method &lt;code&gt;getInstance&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Single element Enums&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="considerations"&gt;
Considerations
&lt;a class="heading-anchor" href="#considerations" aria-label="Link to Considerations"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;First two approaches are open to Serialization attacks (deserializing creates new instance)&lt;/li&gt;
&lt;li&gt;To protect from those declare the fields transient + provide &lt;code&gt;readResolve&lt;/code&gt; method&lt;/li&gt;
&lt;li&gt;Enums are concise, provide free serialization and ironclad Singleton guarantees and are functionally equivalent to first approach&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="supplemental-reading-for-the-diligent-ones-that-follow-shownotes"&gt;
Supplemental reading (for the diligent ones that follow shownotes)
&lt;a class="heading-anchor" href="#supplemental-reading-for-the-diligent-ones-that-follow-shownotes" aria-label="Link to Supplemental reading (for the diligent ones that follow shownotes)"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/+AnderWebbs/posts/DsfpW51Vvow"&gt;Dianne Hackborn regretting exposing the base Application class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/3826905/singletons-vs-application-context-in-android"&gt;DH again saying Application is a Singleton with crappier semantics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Elvis_sightings"&gt;Elvis sightings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/18/</guid><pubDate>Thu, 08 Oct 2015 17:50:20 UTC</pubDate></item><item><title>017: Getting Close with Android Nearby</title><link>https://fragmentedpodcast.com/episodes/17/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/fc04f8ff-453a-4e09-8c56-a576926cd68a?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/fc04f8ff-453a-4e09-8c56-a576926cd68a/ep-17-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this power-packed episode, Donn returns… If that wasn’t amazing enough, Andrew and Akshay from Google join us to talk about Android Nearby.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="follow-up"&gt;
Follow up
&lt;a class="heading-anchor" href="#follow-up" aria-label="Link to Follow up"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.soundcloud.com/fragmentedcast"&gt;Fragmented is on SoundCloud&lt;/a&gt; [soundcloud.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/maltzj/status/637669677171236864"&gt;ViewPropertyAnimator has better performance&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sriramramani.com/droidinspector/"&gt;Droid Inspector&lt;/a&gt; [sriramramani.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/scalpel"&gt;Jake Wharton’s Scalpel&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nearby"&gt;
Nearby
&lt;a class="heading-anchor" href="#nearby" aria-label="Link to Nearby"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/+GoogleDevelopers/posts/4zbED7ppxUu"&gt;100 days of Google Dev, Episode 47/100 – Andrew on Nearby&lt;/a&gt; [plus.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.google.com/chromecast/answer/6109286?hl=en"&gt;Chromecast Guest mode when Nearby&lt;/a&gt; [support.google.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="examplesdocumentation"&gt;
Examples/Documentation
&lt;a class="heading-anchor" href="#examplesdocumentation" aria-label="Link to Examples/Documentation"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-nearby/blob/master/messages/NearbyDevices/app/src/main/java/com/google/android/gms/nearby/messages/samples/nearbydevices/MainFragment.java"&gt;google sample for Nearby&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/nearby/"&gt;Nearby official docs&lt;/a&gt; [developers.google.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks-for-the-week"&gt;
Awesome picks for the week:
&lt;a class="heading-anchor" href="#awesome-picks-for-the-week" aria-label="Link to Awesome picks for the week:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="andrew"&gt;
Andrew:
&lt;a class="heading-anchor" href="#andrew" aria-label="Link to Andrew:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/japgolly/svg-android"&gt;svg-android&lt;/a&gt; [github] and its various forks&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zUIOEXssTSE&amp;amp;list=PLGLfVvz_LVvTSi9bKrvGR2_DBg0Tv8Dxo"&gt;inkscape tutorials by Derek Banas&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="akshay"&gt;
Akshay
&lt;a class="heading-anchor" href="#akshay" aria-label="Link to Akshay"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.engadget.com/products/xiaomi/mi/band/"&gt;Xiaomi mi band&lt;/a&gt; [engadget.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="df"&gt;
DF:
&lt;a class="heading-anchor" href="#df" aria-label="Link to DF:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/karma"&gt;Karma Wifi&lt;/a&gt; (donnfelker.com)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://modess.io/2015/08/16/one-year-of-working-remote/"&gt;Working Remote&lt;/a&gt; (modess.io)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kg"&gt;
KG:
&lt;a class="heading-anchor" href="#kg" aria-label="Link to KG:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/google-tone/nnckehldicaciogcbchegobnafnjkcne?hl=en"&gt;Google Tone – Chrome extension&lt;/a&gt; (chrome.google.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="fragmented"&gt;
Fragmented
&lt;a class="heading-anchor" href="#fragmented" aria-label="Link to Fragmented"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/andrewbunner"&gt;@andrewbunner&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="mailto:akshayk@google.com"&gt;Akshay’s email&lt;/a&gt; [@google.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/17/</guid><pubDate>Mon, 21 Sep 2015 16:15:36 UTC</pubDate></item><item><title>016: Effective Java for Android developers : Item 2</title><link>https://fragmentedpodcast.com/episodes/16/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/de1e4007-b48b-4eff-8e5e-6d469f6a92bd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/de1e4007-b48b-4eff-8e5e-6d469f6a92bd/ep-16-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In our third Fragment installment, we introduce Josh’s second Item: &lt;strong&gt;Consider a builder when faced with many constructor parameters&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our “Effective Java for Android developers” Fragment series.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="consider-a-builder-when-faced-with-many-constructor-parameters"&gt;
Consider a builder when faced with many constructor parameters
&lt;a class="heading-anchor" href="#consider-a-builder-when-faced-with-many-constructor-parameters" aria-label="Link to Consider a builder when faced with many constructor parameters"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="telescoping-constructor-pattern"&gt;
Telescoping Constructor Pattern
&lt;a class="heading-anchor" href="#telescoping-constructor-pattern" aria-label="Link to Telescoping Constructor Pattern"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Provide constructor with only required parameters, another with a single optional param, a third with 2 optional params… and so on.
&lt;ul&gt;
&lt;li&gt;Advantage: Works well for small number of parameters&lt;/li&gt;
&lt;li&gt;Disadvantage: Does NOT scale well&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="javabeans-pattern"&gt;
JavaBeans Pattern
&lt;a class="heading-anchor" href="#javabeans-pattern" aria-label="Link to JavaBeans Pattern"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Call parameterless constructor to create the object; then call setter methods to set required parameter and each optional param of interest.
&lt;ul&gt;
&lt;li&gt;Advantage: Scales well, easy (but wordy) to read resulting code&lt;/li&gt;
&lt;li&gt;Disadvantage: Allows inconsistency (if all required params not called); impossible to make classes immutable if using this pattern.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="builder-pattern"&gt;
Builder pattern
&lt;a class="heading-anchor" href="#builder-pattern" aria-label="Link to Builder pattern"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;winner!
&lt;ul&gt;
&lt;li&gt;Advantage: Simulates named optional parameters; allows immutable objects to be constructed; flexible&lt;/li&gt;
&lt;li&gt;Disadvantage: more ceremony to actually construct the Builder Class and finally use.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="example-usage-from-android-source"&gt;
Example usage from Android source:
&lt;a class="heading-anchor" href="#example-usage-from-android-source" aria-label="Link to Example usage from Android source:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/app/AlertDialog.java#371"&gt;AlertDialog Builder&lt;/a&gt; [androidxref.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tip"&gt;
Tip:
&lt;a class="heading-anchor" href="#tip" aria-label="Link to Tip:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/help/replace-constructor-with-builder.html"&gt;Use IntelliJ to generate your Builders easily&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/16/</guid><pubDate>Tue, 01 Sep 2015 17:33:32 UTC</pubDate></item><item><title>015: Amanimations – Animations with Amanda</title><link>https://fragmentedpodcast.com/episodes/15/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/962637bf-cba8-4bd4-aa4b-7ea0be61d696?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/962637bf-cba8-4bd4-aa4b-7ea0be61d696/ep-15-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we talk to Amanda about how she got started as an Android developer, working at Venmo, her path to mastering Java and Android, dabbling with the dark side and Animations in Android!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="learning-java-and-android"&gt;
Learning Java and Android
&lt;a class="heading-anchor" href="#learning-java-and-android" aria-label="Link to Learning Java and Android"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Java-For-Dummies-Computer-Tech/dp/1118407806?tag=httpkaushco-20"&gt;Java for Dummies&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/we-write/android-programming/"&gt;Android programming: The Big Nerd Ranch Guide&lt;/a&gt; [bignerdranch.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="computer-science"&gt;
Computer Science
&lt;a class="heading-anchor" href="#computer-science" aria-label="Link to Computer Science"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLF8A834F810575A94"&gt;CS50 by Harvard University: David Malan&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=QMV45tHCYNI&amp;amp;list=PL4BBB74C7D2A1049C"&gt;CS61B by UCBerkely: Jonathan Shewchuk&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=k6U-i4gXkLM"&gt;MIT 6.00 by MIT Opencourseware&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="venmo"&gt;
Venmo
&lt;a class="heading-anchor" href="#venmo" aria-label="Link to Venmo"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=UEr0KuEFWog"&gt;Venmo: The Musical 2015 (lip dub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.venmo.com/hf2t3h4x98p5e13z82pl8j66ngcmry/2015/8/6/ft3gso77apqsy32o759a092htxkcmi"&gt;Hack Week at Venmo&lt;/a&gt; [venmo.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="swiftios-and-other-languages"&gt;
Swift/iOS and other languages
&lt;a class="heading-anchor" href="#swiftios-and-other-languages" aria-label="Link to Swift/iOS and other languages"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="animations"&gt;
Animations
&lt;a class="heading-anchor" href="#animations" aria-label="Link to Animations"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/snowdream"&gt;Snowdream github repo&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc_XOgcRukSoKKjewFJZrKV0"&gt;DevBytes youtube playlist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html"&gt;Chet Haase on Animations in Honeycomb&lt;/a&gt; [blogspot.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sriramramani.com/droidinspector/"&gt;Droid Inspector&lt;/a&gt; [sriramramani.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ksoichiro/Android-ObservableScrollView"&gt;Android ObservableScrollView&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks-for-the-week"&gt;
Awesome picks for the week:
&lt;a class="heading-anchor" href="#awesome-picks-for-the-week" aria-label="Link to Awesome picks for the week:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="amanda"&gt;
Amanda
&lt;a class="heading-anchor" href="#amanda" aria-label="Link to Amanda"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.kitchensoap.com/2012/10/25/on-being-a-senior-engineer/"&gt;On being a senior engineer&lt;/a&gt; [kitchensoap.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kg"&gt;
KG:
&lt;a class="heading-anchor" href="#kg" aria-label="Link to KG:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="guillotine-animation"&gt;
Guillotine animation
&lt;a class="heading-anchor" href="#guillotine-animation" aria-label="Link to Guillotine animation"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yalantis.com/blog/how-we-developed-the-guillotine-menu-animation-for-android/"&gt;how we developed the guillotine menu animation for Android&lt;/a&gt; [yalantis.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yalantis.com/blog/how-we-created-guillotine-menu-animation/"&gt;how we developed the guillotine menu animation for iOS&lt;/a&gt; [yalantis.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="timely-like-animations"&gt;
Timely like Animations
&lt;a class="heading-anchor" href="#timely-like-animations" aria-label="Link to Timely like Animations"&gt;#&lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dFpkZiU4ptQ&amp;amp;feature=youtu.be"&gt;Visualizing the Timely number tweening animation&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sriramramani.wordpress.com/2013/10/14/number-tweening/"&gt;Implementing Timely’s tweening animation&lt;/a&gt; [sriramramani.wordpress.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="amanda-1"&gt;
Amanda
&lt;a class="heading-anchor" href="#amanda-1" aria-label="Link to Amanda"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/mandybess"&gt;@mandybess&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fragmented"&gt;
Fragmented
&lt;a class="heading-anchor" href="#fragmented" aria-label="Link to Fragmented"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/15/</guid><pubDate>Fri, 21 Aug 2015 07:15:23 UTC</pubDate></item><item><title>014: Effective Java for Android developers : Item 1</title><link>https://fragmentedpodcast.com/episodes/14/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/28e051eb-f914-476c-9827-fc86e37cbdd4?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/28e051eb-f914-476c-9827-fc86e37cbdd4/ep-14-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We’ve mentioned the book “Effective Java” by Joshua Bloch quite a few times on previous episodes. At this point, everyone knows they should have read this book (quadruple times). But it’s a dense read and everyone could use a reading buddy. Also, what does Effective Java look like through the eyes of an Android developer?&lt;/p&gt;
&lt;p&gt;In this second installment of our Fragment (a.k.a mini-episode), we thought we’ll do our listeners a favor and help with that reading. We introduce the very first of these venerable “Items”: &lt;strong&gt;Consider providing static factory methods instead of constructors&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Stay tuned for more items from our “Effective Java for Android developers” Fragment series.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/?tag=httpkaushco-20"&gt;Effective Java (2nd Edition) – Joshua Bloch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="consider-providing-static-factory-methods-instead-of-constructors"&gt;
Consider providing static factory methods instead of constructors
&lt;a class="heading-anchor" href="#consider-providing-static-factory-methods-instead-of-constructors" aria-label="Link to Consider providing static factory methods instead of constructors"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/widget/Toast.java#283"&gt;static factory method makeText for Toast class&lt;/a&gt; [androidxref.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/animation/ObjectAnimator.java"&gt;ObjectAnimator&lt;/a&gt; [androidxref.com]:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/animation/ObjectAnimator.java#217"&gt;.ofInt&lt;/a&gt; [androidxref.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/animation/ObjectAnimator.java#372"&gt;.ofArgb&lt;/a&gt; [androidxref.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/animation/ObjectAnimator.java#411"&gt;.ofFloat&lt;/a&gt; [androidxref.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="advantages"&gt;
Advantages:
&lt;a class="heading-anchor" href="#advantages" aria-label="Link to Advantages:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;You can control the name and thus give it much more meaningful names&lt;/li&gt;
&lt;li&gt;You are not required to create a “new” object each time they are invoked&lt;/li&gt;
&lt;li&gt;You can even return an object that’s a subtype of the return type (unlike constructors which only return class type)
&lt;ul&gt;
&lt;li&gt;e.g. &lt;a href="http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java"&gt;Java Collections framework&lt;/a&gt; [grepcode.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="disadvantages"&gt;
Disadvantages:
&lt;a class="heading-anchor" href="#disadvantages" aria-label="Link to Disadvantages:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Classes without public or protected constructors cannot be subclassed&lt;/li&gt;
&lt;li&gt;Static factory methods are not readily distinguishable from other static methods&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="takeaways"&gt;
Takeaways
&lt;a class="heading-anchor" href="#takeaways" aria-label="Link to Takeaways"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;“Consider” using static factory methods (not always)&lt;/li&gt;
&lt;li&gt;Use &lt;a href="http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html"&gt;newInstance when creating Fragments&lt;/a&gt; [androiddesignpatterns.com]&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;newIntent&lt;/code&gt; static factory method for creating intents inside the target activity.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="contact-us"&gt;
Contact us:
&lt;a class="heading-anchor" href="#contact-us" aria-label="Link to Contact us:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/14/</guid><pubDate>Mon, 10 Aug 2015 08:00:10 UTC</pubDate></item><item><title>013: Corey Latislaw on TDD and Testing</title><link>https://fragmentedpodcast.com/episodes/13/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/e81f458e-356f-4701-8ac3-24493a972813?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/e81f458e-356f-4701-8ac3-24493a972813/ep-13-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we revisit the topic of Testing, looking at it from a TDD perspective. Globetrotter, Kata Queen, TDD practitioner and overall boss of Android development – Corey Latislaw joins us in this episode with thoughts, tips and tricks on pulling off TDD. She also shares some of her wicked sketchnoting tips and made a very special Sketchnote just for this episode! Have a &lt;a href="https://fragmentedpodcast.com/images/wp-content/uploads/2015/08/sketchnote_fragemented_13.jpeg"&gt;look at the sketchnote here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/groups/"&gt;GDG&lt;/a&gt; [developers.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/experts/"&gt;GDE&lt;/a&gt; [developers.google.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/experts/people/corey-latislaw"&gt;GDE Android – Ms.Latislaw&lt;/a&gt; [developers.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/experts/people/donn-felker"&gt;GDE Android – Mr.Felker&lt;/a&gt; [developers.google.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sketchnoting"&gt;
Sketchnoting
&lt;a class="heading-anchor" href="#sketchnoting" aria-label="Link to Sketchnoting"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.amazon.com/The-Sketchnote-Handbook-illustrated-visual/dp/0321857895?tag=httpkaushco-20"&gt;The Sketchnote Handbook&lt;/a&gt; – Mike Rohde [amazon.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://coreylatislaw.com/sketchnoting-for-techies/"&gt;Sketchnoting for Techies&lt;/a&gt; [coreylatislaw.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://coreylatislaw.com/google-io-2015/"&gt;Corey’s Google I/O Sketchnotes&lt;/a&gt; [coreylatislaw.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://coreylatislaw.com/sketchnoting-the-global-gdg-summit/"&gt;Corey’s live sketchnoting (with videos)&lt;/a&gt; [coreylatislaw.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.kidsoncomputers.org/"&gt;Kids on Computers&lt;/a&gt; [kidsoncomputers.org]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="corey8217s-books"&gt;
Corey’s books
&lt;a class="heading-anchor" href="#corey8217s-books" aria-label="Link to Corey&amp;amp;#8217;s books"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://gumroad.com/l/androidactivitybook"&gt;Android Activity Book&lt;/a&gt; [gumroad.com] &lt;strong&gt;(coupon “fragmented” for $5 off)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://gumroad.com/l/androidtheorybook"&gt;Android Theory Book&lt;/a&gt; [gumroad.com] &lt;strong&gt;(coupon “fragmented” for $5 off)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/a/30177710"&gt;Running Code Coverage in Android Studio&lt;/a&gt; [stackoverflow.com]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="katas"&gt;
Katas
&lt;a class="heading-anchor" href="#katas" aria-label="Link to Katas"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://gum.co/androidkataintro"&gt;Video workshop&lt;/a&gt; [gum.co] &lt;strong&gt;(coupon “fragmented” for $5 off)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coreylatislaw.com/robolectric-kata/"&gt;Simple Android app&lt;/a&gt; [coreylatistlaw.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coreylatislaw.com/kata-robolectric-integration/"&gt;Robolectric Integration&lt;/a&gt; [coreylatistlaw.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks-for-the-week"&gt;
Awesome picks for the week:
&lt;a class="heading-anchor" href="#awesome-picks-for-the-week" aria-label="Link to Awesome picks for the week:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="df"&gt;
DF:
&lt;a class="heading-anchor" href="#df" aria-label="Link to DF:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hiten.com/issues/19?utm_content=bufferd12f8&amp;amp;utm_medium=social&amp;amp;utm_source=athnshah&amp;amp;utm_campaign=buffer"&gt;Stop Using General CTA’s Text – be specific&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/baremetrics/status/557968441177833472"&gt;Founder’s Journey Podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://soundcloud.com/baremetrics/build-vs-buy-how-to-blow-100000-saving-money"&gt;Baremetrics – Episode – Build vs. Buy: How to blow $100,000 saving money&lt;/a&gt; [soundcloud.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kg"&gt;
KG:
&lt;a class="heading-anchor" href="#kg" aria-label="Link to KG:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sahandsaba.com/nine-anti-patterns-every-programmer-should-be-aware-of-with-examples.html"&gt;ANTI PATTERNS every programmer should be aware of&lt;/a&gt; [sahandsaba.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="corey"&gt;
Corey
&lt;a class="heading-anchor" href="#corey" aria-label="Link to Corey"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/corey_latislaw"&gt;@corey_latislaw&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coreylatislaw.com"&gt;coreylatislaw.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fragmented"&gt;
Fragmented
&lt;a class="heading-anchor" href="#fragmented" aria-label="Link to Fragmented"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/fragmentedcast"&gt;@fragmentedcast&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal/"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/13/</guid><pubDate>Mon, 03 Aug 2015 18:05:36 UTC</pubDate></item><item><title>012: Continous Integration and Collective Code Ownership</title><link>https://fragmentedpodcast.com/episodes/12/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/30a4c024-0be4-47bc-b092-29cd98d46fb8?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/30a4c024-0be4-47bc-b092-29cd98d46fb8/ep-12-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode we’re trying something new. Everyone has requested more episodes of the podcast. In short, everyone wants a weekly show. So this week, we’re introducing what we call a mini-episode … or as we like to call them a “Fragment”. Fragment episodes will be shorter in length but still packed with goodness. They will range from ~7-25 minutes in length and will showcase either Kaushik, myself (Donn) or both of us.&lt;/p&gt;
&lt;p&gt;In the first “Fragment” installment we’re going to talk about Continuous Integration (CI) and Collective Code Ownership (CCO). Donn talks about what CI is, why its important and how it benefits you and your team. He then dives right into CCO and how it can be facilitated through testing.&lt;/p&gt;
&lt;p&gt;We hope you enjoy these new mini-episodes … aptly named … Fragments. :)&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.thoughtworks.com/continuous-integration"&gt;Thoughtworks – Continuous Integration&lt;/a&gt; [thoughtworks.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052?tag=httpkaushco-20"&gt;Working Effectively with Legacy Code – Michael Feathers&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="continuous-integration-solutions"&gt;
Continuous Integration solutions:
&lt;a class="heading-anchor" href="#continuous-integration-solutions" aria-label="Link to Continuous Integration solutions:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jenkins-ci.org/"&gt;Jenkins CI&lt;/a&gt; [jenkins-ci.org]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cloudbees.com/"&gt;Cloud solution- Cloudbees&lt;/a&gt; [cloudbees.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt; [jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.circleci.com"&gt;CircleCI&lt;/a&gt; [circleci.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caster.io/episodes/episode-2-android-continuous-integration-with-circleci/"&gt;Setting up CI for Android&lt;/a&gt; [caster.io]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ship.io/"&gt;Ship.IO&lt;/a&gt; [ship.io]&lt;/li&gt;
&lt;li&gt;TravisCI
&lt;ul&gt;
&lt;li&gt;(open source) &lt;a href="https://travis-ci.org/"&gt;Travis CI org&lt;/a&gt; [travis-ci.org]&lt;/li&gt;
&lt;li&gt;(commercial) &lt;a href="https://travis-ci.com/"&gt;Travis CI com&lt;/a&gt; [travis-ci.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="continuous-delivery"&gt;
Continuous Delivery:
&lt;a class="heading-anchor" href="#continuous-delivery" aria-label="Link to Continuous Delivery:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://deploybot.com/"&gt;Deploybot (previously) Dploy.io&lt;/a&gt; [deploybot.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeship.com/"&gt;Codeship&lt;/a&gt; [codeship.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/12/</guid><pubDate>Tue, 21 Jul 2015 18:23:23 UTC</pubDate></item><item><title>011: The Fowler Road to a Clean Architecture</title><link>https://fragmentedpodcast.com/episodes/11/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/58164c4a-0122-4a6c-b6e9-d8eb339f26ba?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/58164c4a-0122-4a6c-b6e9-d8eb339f26ba/ep-11-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode – Donn and Kaushik dive into a topic that is very near and dear their hearts – application architecture. They talk about how Martin Fowler has inspired a lot of their architectural decisions and how they’re moving towards defining what a clean architecture means to them and other developers. They talk about Model View Presenter, Model View Controller and many other topics that surround these two common patterns. Take a listen and go for the ride on architecture train … all aboard!&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h2 id="chit-chat"&gt;
Chit-chat:
&lt;a class="heading-anchor" href="#chit-chat" aria-label="Link to Chit-chat:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/RxJava-Android-Samples#repeat-with-exponential-backoff"&gt;Exponential backoff with RxJava&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Reactive-Extensions/RxJS"&gt;RxJs – ReactiveExtensions for Javascript&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="follow-up"&gt;
Follow up:
&lt;a class="heading-anchor" href="#follow-up" aria-label="Link to Follow up:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Moving GC only applicable when app goes into background:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.anandtech.com/show/8231/a-closer-look-at-android-runtime-art-in-android-l/2"&gt;A closer look at ART in Android L&lt;/a&gt; (see last paragraph) [anandtech.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=EBlTzQsUoOw"&gt;Google I/O 2014: The ART Runtime&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-road-to-a-clean-architecture"&gt;
The road to a clean architecture:
&lt;a class="heading-anchor" href="#the-road-to-a-clean-architecture" aria-label="Link to The road to a clean architecture:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bad practices:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Cargo_cult_programming"&gt;Cargo cult programming&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/God_object"&gt;God objects&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Martin Fowler’s articles on Patterns of Enterprise Application Architecture:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/eaaDev/SupervisingPresenter.html"&gt;Supervising Controller&lt;/a&gt; [martinfowler.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/eaaDev/PresentationModel.html"&gt;Presentation Model&lt;/a&gt; [martinfowler.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/eaaDev/PassiveScreen.html"&gt;Passive View&lt;/a&gt; [martinfowler.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420?tag=httpkaushco-20"&gt;Martin Fowler’s Book P of EAA&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mattlogan.me/decoupling-the-presenter"&gt;Decoupling the presenter&lt;/a&gt; [mattlogan.me]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-approaches-to-clean-architectures"&gt;
Other approaches to clean architectures:
&lt;a class="heading-anchor" href="#other-approaches-to-clean-architectures" aria-label="Link to Other approaches to clean architectures:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.willowtreeapps.com/blog/mvvm-on-android-what-you-need-to-know/"&gt;MVVM on Android – what you need to know&lt;/a&gt; [willowtreeapps.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.teehanlax.com/blog/model-view-viewmodel-for-ios/"&gt;Model View ViewModel for iOS&lt;/a&gt; [teehanlax.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.objc.io/issues/13-architecture/viper/"&gt;VIPER architecture on iOS&lt;/a&gt; [objc.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/richk/clean-android-architecture"&gt;VIPER inspired Clean Android architecture&lt;/a&gt; [speakerdeck]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/"&gt;Architecting Android the clean way&lt;/a&gt; [fernandocejas.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://antonioleiva.com/mvp-android/"&gt;MVP Android&lt;/a&gt; [antonioleiva.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Donn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://newcircle.com/s/post/1744/2015/06/29/learning-rxjava-for-android-by-example"&gt;Learning RxJava for Android by example – Kaushik’s talk&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/"&gt;Loading data from multiple source&lt;/a&gt; [danlew.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.pushtorefresh.com/2015/07/02/storio-modern-replacement-for-sqlitedatabase-and-contentresolver-apis/?utm_source=androiddevdigest"&gt;StorIO&lt;/a&gt; [engineering.pushtoreresh.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks aren’t Stubs&lt;/a&gt; [martinfowler.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kaushik:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/rebound/"&gt;Rebound animation library&lt;/a&gt; [facebook.github.io]
&lt;ul&gt;
&lt;li&gt;Will Bailey (creator of Rebound):
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/willbailey/8811581"&gt;OrigamiActivity.java&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.facebook.com/posts/509869769120198/under-the-hood-building-and-open-sourcing-the-rebound-animation-library-for-android/"&gt;Under the hood&lt;/a&gt; [code.facebook.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=h9F7iKogkaY"&gt;Example 1&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=JWzIqMLfx3c"&gt;Example 2&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ebAno8nxbTg"&gt;Example 3&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ZifkBivC4C4"&gt;Example 4&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://parallelcross.com/post/96597851715/springy-animations-with-facebook-rebound-for"&gt;Springy animations with Rebound&lt;/a&gt; [parallelcross.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://donnfelker.com"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/11/</guid><pubDate>Tue, 14 Jul 2015 18:12:12 UTC</pubDate></item><item><title>010: Boning Up on Core Java</title><link>https://fragmentedpodcast.com/episodes/10/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f3c1020b-f7d3-4068-8d06-d23072998666?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f3c1020b-f7d3-4068-8d06-d23072998666/ep-10-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode Donn and Kaushik talk to the very talented Michael Bailey about core Java principles and practices. Michael has quite the deep and passionate understanding of Java and we thought it would only be perfect to share this episode with a very passionate Java crowd – Android developers. We talk about IntelliJ, Testing, Inheritance, Static Code analysis, Garbage Collection, Data Structures and much more in this episode. If you’re looking to learn a thing or two about Java, then this is your episode. We hope you enjoy.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtimeNanos%28%29"&gt;elapsedRealtimeNanos for getting wall time&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://officialandroid.blogspot.co.uk/2015/05/pay-your-way-with-android.html"&gt;Android Pay announcement&lt;/a&gt; [officialandroid.blogpost.co.uk]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="intellij-information"&gt;
Intellij information:
&lt;a class="heading-anchor" href="#intellij-information" aria-label="Link to Intellij information:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.jetbrains.com/idea/2015/04/a-curated-list-of-ide-plugins-for-android-development/"&gt;Curated list of IDE plugings by Jetbrains&lt;/a&gt; [blog.jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plugins.jetbrains.com/plugin/4455"&gt;Key promoter plugin&lt;/a&gt; [plugins.jetbrains.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/help/using-productivity-guide.html"&gt;Productivity Guide&lt;/a&gt; [jetbrains.com/help]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/help/selecting-text-in-the-editor.html#d1395590e179"&gt;Extending + Shrinking selection&lt;/a&gt; [jetbrains.com/help]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="testing-talk"&gt;
Testing talk:
&lt;a class="heading-anchor" href="#testing-talk" aria-label="Link to Testing talk:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://techcrunch.com/2014/06/25/google-appurify/"&gt;Google acquires Appurify&lt;/a&gt; [techcrunch.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/cloud-test-lab/"&gt;Cloud Test Lab (erstwhile Appurify)&lt;/a&gt; [developers.google.com/cloud-test-lab]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="great-books-on-improving-your-java-skills"&gt;
Great books on improving your Java skills:
&lt;a class="heading-anchor" href="#great-books-on-improving-your-java-skills" aria-label="Link to Great books on improving your Java skills:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented-ebook/dp/B000SEIBB8"&gt;Gang of Four&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Effective-Java-2nd-Edition-Series-ebook/dp/B00B8V09HY/ref=dp_kinw_strp_1"&gt;Effective Java (2nd Edition)- Joshua Bloch&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://www.osnews.com/story/19266/WTFs_m"&gt;Effective code review technique (WTFs a minute)&lt;/a&gt; [cryhavok.org]&lt;/p&gt;
&lt;h2 id="on-inheritance"&gt;
On inheritance:
&lt;a class="heading-anchor" href="#on-inheritance" aria-label="Link to On inheritance:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Item 15 : Design and document for inheritance or else prohibit it&lt;/li&gt;
&lt;li&gt;Item 16 : Favor composition over inheritance&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/chrisbanes/status/591180993542938624"&gt;Chris Banes on using AppCompatDelegate&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="static-code-analyzers"&gt;
Static code analyzers:
&lt;a class="heading-anchor" href="#static-code-analyzers" aria-label="Link to Static code analyzers:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/checkstyle/checkstyle/wiki/Java-static-code-analysis-tools"&gt;Checkstyle, PMD, Findbugs&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/help/lint.html"&gt;Android Lint&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://findbugs.sourceforge.net"&gt;Findbugs&lt;/a&gt; [sourceforge.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pmd.sourceforge.net"&gt;PMD&lt;/a&gt; [sourceforge.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vincentbrison.com/2014/07/19/how-to-improve-quality-and-syntax-of-your-android-code/"&gt;blog post setup static code analysis tools&lt;/a&gt; [vincentbrison.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.facebook.com/posts/1648953042007882/open-sourcing-facebook-infer-identify-bugs-before-you-ship/"&gt;Infer by Facebook&lt;/a&gt; [code.facebook.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gamasutra.com/view/news/128836/InDepth_Static_Code_Analysis.php"&gt;John Carmack In-Depth: static code analysis&lt;/a&gt; [gamasutra.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="garbage-collection"&gt;
Garbage collection:
&lt;a class="heading-anchor" href="#garbage-collection" aria-label="Link to Garbage collection:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=_CruQY55HOk"&gt;Google IO 2011 talk&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/developing-for-android-i-understanding-the-mobile-context-fd2351b131f8"&gt;Medium article – Garbage Collection&lt;/a&gt;[medium.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/leakcanary"&gt;LeakCanary by Square&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/279507/what-is-meant-by-immutable"&gt;What is meant by immutable&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data-structures-for-android"&gt;
Data structures for Android
&lt;a class="heading-anchor" href="#data-structures-for-android" aria-label="Link to Data structures for Android"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/util/ArrayMap.html"&gt;ArrayMap&lt;/a&gt; (Android alt. to HashMap) [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/support/v4/util/SimpleArrayMap.html"&gt;SimpleArrayMap&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/util/SparseArray.html"&gt;SparseArray&lt;/a&gt; (Android alt. to mapping int -&amp;gt; Objects) [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="benchmarking-ds"&gt;
Benchmarking DS:
&lt;a class="heading-anchor" href="#benchmarking-ds" aria-label="Link to Benchmarking DS:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/caliper"&gt;Caliper&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/vogar/wiki/Examples"&gt;Vogar examples&lt;/a&gt; [code.google.com]&lt;/li&gt;
&lt;li&gt;ADB Ep. 27 (forEach quirks) (&lt;a href="https://overcast.fm/+BaKNoy7TY/9:08"&gt;minute 9:07&lt;/a&gt;) [androidbackstage.blogpost.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.devahead.com/blog/2011/12/coding-for-performance-and-avoiding-garbage-collection-in-android/"&gt;Coding for performance blog post&lt;/a&gt; [devahead.com]&lt;/li&gt;
&lt;li&gt;See Item 21 in Effective Java (Ed. 1) about typesafe enum patterns (this was before enums existed)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/docs/reference/null-safety.html"&gt;Null safety in Kotlin&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/?title=Mondegreen"&gt;Mondegreen&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;Mad Gab&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Michael:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tools.android.com/filing-bugs"&gt;Learn how to file high quality bug report for Android tools&lt;/a&gt; [tools.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidstudygroup.github.io/conferences/"&gt;List of Android conferences&lt;/a&gt; [androidstudygroup.github.io]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googletesting.blogspot.com/2015/05/gtac-2015-coming-to-cambridge-greater.html"&gt;GTAC 2015 conference&lt;/a&gt; [googletesting.blogpost.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-developers/developing-for-android-introduction-5345b451567c"&gt;Developing for Android – blog post series by Google developers&lt;/a&gt; [medium.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kaushik:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mcharmas/Android-ReactiveLocation"&gt;library: Android-ReactiveLocation&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://onetoday.google.com/"&gt;Google App for Donation OneToday&lt;/a&gt; [onetoday.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techdirt.com/articles/20150526/16550931121/obama-administration-files-totally-clueless-argument-concerning-software-copyrights-supreme-court-case.shtml"&gt;An article discussing the case between Oracle vs Google&lt;/a&gt; [techdirt.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Donn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://droidcon.nyc/2015/sched/"&gt;Vote for my android talks at DroidCon NYC&lt;/a&gt;! :)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Anker-Desktop-Charger-PowerIQ-Technology/dp/B00GTGETFG"&gt;Anker Charging Station&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iamnotaprogrammer.com/Ikea-Standing-desk-for-22-dollars.html"&gt;22$ Standing Desk&lt;/a&gt; [iamnotaprogrammer.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="michael-bailey"&gt;
Michael Bailey
&lt;a class="heading-anchor" href="#michael-bailey" aria-label="Link to Michael Bailey"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/yogurtearl"&gt;@yogurtearl&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/10/</guid><pubDate>Wed, 24 Jun 2015 02:32:09 UTC</pubDate></item><item><title>009: Google IO Special</title><link>https://fragmentedpodcast.com/episodes/9/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/8b5f4965-3d49-458b-89d6-d67164c93125?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/8b5f4965-3d49-458b-89d6-d67164c93125/ep-9-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This is the special Google I/O 2015 episode. In this episode – Kaushik makes the trek to Google I/O and chats with various Android developers about their favorite part of Google IO. I was not able to make it but Kaushik was able to interview of top developers in the industry and I’ll tell you what – this is a great episode – I really wish I was there to join him. I know he had a great time chatting and interacting with everyone. We hope you enjoy the show as much as we enjoyed creating it.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dan Lew&lt;/strong&gt; (Trello)
&lt;ul&gt;
&lt;li&gt;@danlew42 – &lt;a href="http://www.twitter.com/danlew42"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dan’s Blog – &lt;a href="http://danlew.net"&gt;danlew.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ty Smith&lt;/strong&gt; (Twitter)
&lt;ul&gt;
&lt;li&gt;@tsmith – &lt;a href="http://twitter.com/tsmith"&gt;twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eric Cochran&lt;/strong&gt; (IFTTT)
&lt;ul&gt;
&lt;li&gt;NightlyNexus – &lt;a href="http://github.com/nightlynexus"&gt;github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;+EricCochranNightlyNexus – &lt;a href="http://plus.google.com/+EricCochranNightlyNexus"&gt;plus.google.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cyril Mottier&lt;/strong&gt; (Capitaine Train)
&lt;ul&gt;
&lt;li&gt;@cyrilmottier – &lt;a href="http://twitter.com/cyrilmottier"&gt;twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;About page – &lt;a href="http://cyrilmottier.com/about/"&gt;cyrilmottier.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shifty Jelly Team&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Pocket Casts – &lt;a href="http://www.pocketcasts.com"&gt;pocketcasts.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Philip Simpson&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;@geekygecko – &lt;a href="http://twitter.com/geekygecko"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Russell Ivanovic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;@rustyshelf – &lt;a href="http://twitter.com/rustyshelf"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amanda Hill&lt;/strong&gt; (Venmo)
&lt;ul&gt;
&lt;li&gt;@mandybess – &lt;a href="http://twitter.com/mandybess"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dave Smith&lt;/strong&gt; (New Circle)
&lt;ul&gt;
&lt;li&gt;@devunwired – &lt;a href="http://twitter.com/devunwired"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;+DaveSmithDev – &lt;a href="http://plus.google.com/+DaveSmithDev"&gt;plus.google.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Corey Latislaw&lt;/strong&gt; (CapitalOne)
&lt;ul&gt;
&lt;li&gt;@corey_latislaw – &lt;a href="https://twitter.com/corey_latislaw"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coreylatislaw.com"&gt;coreylatislaw.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chet Haase&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;@chethaase – &lt;a href="http://twitter.com/chethaase"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android Backstaage – &lt;a href="http://androidbackstage.blogspot.com"&gt;blogspot.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chiu-ki Chan&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;@chiuki – &lt;a href="http://twitter.com/chiuki"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Elliott Chenger&lt;/strong&gt; (Under Armour)
&lt;ul&gt;
&lt;li&gt;@echenger – &lt;a href="https://twitter.com/echenger"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;blog – &lt;a href="http://omitneedlesscode.com"&gt;omitneedlesscode.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maria Neumayer&lt;/strong&gt; (Citymapper)
&lt;ul&gt;
&lt;li&gt;@marianeum – &lt;a href="http://twitter.com/marianeum"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Danny Roa&lt;/strong&gt; (Foursquare)
&lt;ul&gt;
&lt;li&gt;@dannyroa – &lt;a href="http://twitter.com/dannyroa"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Michael Bailey&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;@yogurtearl – &lt;a href="http://twitter.com/yogurtearl"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Donn Felker&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;@donnfelker – &lt;a href="http://twitter.com/donnfelker"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://donnfelker.com"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaushik Gopal&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;@kaushikgopal – &lt;a href="http://twitter.com/kaushikgopal"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/9/</guid><pubDate>Wed, 03 Jun 2015 16:52:34 UTC</pubDate></item><item><title>008: Pocket Casts Amazingness with Philip Simpson</title><link>https://fragmentedpodcast.com/episodes/8/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/45f23762-443d-4344-b49e-6dca74c09a22?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/45f23762-443d-4344-b49e-6dca74c09a22/ep-8-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode, we talk to Philip Simpson, one of the rockstar developers of the amazing Pocket Casts Android Application. We learn about how Philip and his partner, Russell, started Shifty Jelly and how they grew their team from a two-person shop to a small staff all while creating one of top apps on Google Play, Pocket Casts. We also talk about some of the tools, tips and tricks that they’ve used to help them scale, grow and become more effective as indie app developers. We eventually hop into some deep talk about audio software and all kinds of tech in general. If you’ve always wondered what it takes to be an indie app developer then this is the episode for you – Philip does not let us down.&lt;/p&gt;
&lt;h1 id="show-noteslinks"&gt;
Show Notes/Links
&lt;a class="heading-anchor" href="#show-noteslinks" aria-label="Link to Show Notes/Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts"&gt;Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.android.pocketweatherau"&gt;Pocket Weather (for Australia)&lt;/a&gt; [play.google.com]&lt;/li&gt;
&lt;li&gt;Phil’s stuff
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/LG-Electronics-34-Inch-LED-Lit-34UC97-S/dp/B00OKSEWL6/"&gt;LG 34” Ultrawide curved monitor (that Phil uses)&lt;/a&gt; [amazon.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/geekygecko/status/557773181462007810"&gt;device test lab&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/geekygecko/0ea6358baed26636a08d"&gt;Android cheatsheet&lt;/a&gt; [gist.github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.shiftyjelly.com/2015/03/05/its-finally-here/"&gt;Audio effects and features in Pocket Casts&lt;/a&gt; [blog.shiftyjelly.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.marco.org"&gt;Marco Arment&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://atp.fm/episodes/101"&gt;Accidental Tech Podcast&lt;/a&gt; [minute 1:10 he talks of using Go for podcast feed parsing] [atp.fm]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://5by5.tv/buildanalyze"&gt;Build and Analyze podcast&lt;/a&gt; (now retired) [5by5.tv]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.pocketcasts.com/web"&gt;Pocket Cast Web client&lt;/a&gt; [play.pocketcasts.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lifehacker.com/pocket-casts-gets-a-syncing-web-player-for-podcasts-1647665765"&gt;Pocket cast gets sync&lt;/a&gt; [lifehacker.com]&lt;/li&gt;
&lt;li&gt;Pocket Casts supporting service:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pingdom.com/features/"&gt;Pingdom&lt;/a&gt; (monitoring uptime)[pingdom.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mysql.com/"&gt;MySql&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.org/"&gt;Mongo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mariadb.org/"&gt;MariaDb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hockeyapp.net/features/"&gt;HockeyApp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Android latency:
&lt;ul&gt;
&lt;li&gt;Android latency problem [superpowered.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=cU-eAzNp5Hw"&gt;The Tonight show starring Jimmy Fallon&lt;/a&gt; (with Billy Joel) [youtube.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://loopyapp.com"&gt;Looper app&lt;/a&gt; (iOS only :( )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pocket Casts 3rd party libs
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/butterknife"&gt;Butter Knife&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nostra13/Android-Universal-Image-Loader"&gt;Android Universal Image Loader&lt;/a&gt; &amp;gt; &lt;a href="http://square.github.io/picasso/"&gt;Picasso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/afollestad/material-dialogs"&gt;Material Dialog library&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MrEngineer13/SnackBar"&gt;SnackBar&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/telly/MrVector"&gt;Mr.Vector&lt;/a&gt; (now deprecated) [github.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/trello/victor"&gt;Victor by Trello&lt;/a&gt; [github.com] (Friend of the show – Dan’s library that we also talked about)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gimletmedia.com/show/startup/"&gt;StartUp podcast&lt;/a&gt; (by Gimlet media) [gimletmedia.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/about/dashboards/index.html"&gt;Android Device Dashboard&lt;/a&gt; (showing OS breakup)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Philip:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mortenjust/androidtool-mac"&gt;Android tool for mac&lt;/a&gt; [github.com]
&lt;ul&gt;
&lt;li&gt;Makes it easy to take screenshots, videos, run scripts, bug reports..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gettingreal.37signals.com/"&gt;37 Signals – Getting Real&lt;/a&gt; [37signals.com]
&lt;ul&gt;
&lt;li&gt;A book Phil read when we were starting Shifty Jelly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Donn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.getsidekick.com/"&gt;Sidekick By HubSpot&lt;/a&gt; [getsidekick.com]
&lt;ul&gt;
&lt;li&gt;Allows you to see when someone has opened your email etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourhourworkweek.com/2015/05/07/noah-kagan/"&gt;Tim Ferriss Show with Noah Kagan&lt;/a&gt; [fourhourworkweek.com]
&lt;ul&gt;
&lt;li&gt;Great productivity hacks for everything and overall great show&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/grammarly-spell-checker-g/kbfnbcaeplbcioakkpcpgfkobkghlhen?hl=en"&gt;Grammarly Chrome Extension&lt;/a&gt; [chrome.google.com]
&lt;ul&gt;
&lt;li&gt;Fix your grammatical errors before the internet fixes them for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whenihavetime.com/2014/07/08/10-lessons-from-4-years-working-remotely/"&gt;10 Lessons from 4 Years Working Remotely&lt;/a&gt; [whenihavetime.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kaushik:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sriramramani.wordpress.com/2015/05/06/custom-viewgroups/"&gt;Custom View Groups&lt;/a&gt;– engineer at Facebook [wordpress.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://corner.squareup.com/2015/05/leak-canary.html"&gt;LeakCanary&lt;/a&gt; by Square&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="philip-simpson"&gt;
Philip Simpson
&lt;a class="heading-anchor" href="#philip-simpson" aria-label="Link to Philip Simpson"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/geekygecko"&gt;@geekygecko&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shiftyjelly.com"&gt;shiftyjelly.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pocketcasts.com"&gt;pocketcasts.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co/"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/8/</guid><pubDate>Tue, 19 May 2015 13:30:43 UTC</pubDate></item><item><title>007: Jake Wharton on Testing, SqlBrite, NotRxAndroid, RxJava and Much More</title><link>https://fragmentedpodcast.com/episodes/7/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/295b0f6b-f165-4b82-9502-8d7b510e888f?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/295b0f6b-f165-4b82-9502-8d7b510e888f/ep-7-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In the final part of this two-part segment, we continue our talk with Jake Wharton. We dive right into the topic of testing. Jake then talks about his approach to testing apps in Android and the different languages that he finds interesting. We then move on to RxJava, NotRxAndroid, SqlBrite and many other libraries and topics to round out this great second episode. Again, we’d love to thank Jake for joining us here on the Fragmented Podcast show; it has been an honor. We hope you enjoy it as much as we did.&lt;/p&gt;
&lt;h1 id="show-noteslinks"&gt;
Show Notes/Links
&lt;a class="heading-anchor" href="#show-noteslinks" aria-label="Link to Show Notes/Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/u2020"&gt;u2020 Demo App by Jake&lt;/a&gt; [github.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/u2020/blob/master/src/main/java/com/jakewharton/u2020/data/IntentFactory.java"&gt;Real Intent Factory&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/u2020/blob/master/src/internalDebug/java/com/jakewharton/u2020/data/DebugIntentFactory.java"&gt;Fake Intent Factory&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/mattprecious/debug-builds-a-new-hope-droidcon-mtl-2015?slide=130"&gt;Slides on Real/Fake Intent Factory&lt;/a&gt; [speakerdeck.com – DroidCon Presentation]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="server-side-frameworks-with-java"&gt;
Server side frameworks with Java
&lt;a class="heading-anchor" href="#server-side-frameworks-with-java" aria-label="Link to Server side frameworks with Java"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jersey.java.net/"&gt;Jersey&lt;/a&gt; [jersey.java.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jax-rs-spec.java.net/"&gt;Jax-rs&lt;/a&gt; [jax-rs-spec.java.net]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; [golang.org]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-languages"&gt;
Other languages
&lt;a class="heading-anchor" href="#other-languages" aria-label="Link to Other languages"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/+JakeWharton/posts/WSCoqkJ5MBj"&gt;Jake on using Kotlin for Android&lt;/a&gt; [plug.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; (by JetBrains) [kotlinlang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JetBrains/anko"&gt;Anko&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kotlinlang.org/docs/tutorials/android-plugin.html"&gt;Kotlin Android Extensions&lt;/a&gt; [kotlinlang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gradle.org/docs/2.4-rc-1/release-notes#support-for-%E2%80%9Cannotation-processing%E2%80%9D-of-groovy-code"&gt;Annotation processing for Groovy code&lt;/a&gt; [gradle.org]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="non-square-libraries-that-jake-uses"&gt;
Non-Square libraries that Jake uses
&lt;a class="heading-anchor" href="#non-square-libraries-that-jake-uses" aria-label="Link to Non-Square libraries that Jake uses"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ReactiveX/RxJava"&gt;RxJava&lt;/a&gt; [github.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/frankiesardo/auto-parcel"&gt;AutoParcel&lt;/a&gt; [github.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/emilsjolander/StickyListHeaders"&gt;StickyListHeaders&lt;/a&gt; [github.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/square/sqlbrite"&gt;SQLBrite&lt;/a&gt; [github.com]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/JakeWharton/NotRxAndroid"&gt;NotRxAndroid&lt;/a&gt; [github.com]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Donn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android Testing is ten years behind &lt;a href="http://philosophicalhacker.com/2015/04/17/why-android-unit-testing-is-so-hard-pt-1/"&gt;http://philosophicalhacker.com/2015/04/17/why-android-unit-testing-is-so-hard-pt-1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SquiDB is Yahoo’s new SQLite layer for Android:  &lt;a href="https://github.com/yahoo/squidb"&gt;https://github.com/yahoo/squidb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Jake:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diversify Your Learning
&lt;ul&gt;
&lt;li&gt;Rust – &lt;a href="http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html"&gt;http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Internals of Git – &lt;a href="https://codewords.recurse.com/issues/two/git-from-the-inside-out"&gt;https://codewords.recurse.com/issues/two/git-from-the-inside-out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GZip Encoding – &lt;a href="http://jvns.ca/blog/2015/02/22/how-gzip-uses-huffman-coding/"&gt;http://jvns.ca/blog/2015/02/22/how-gzip-uses-huffman-coding/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Java 10 value objects – &lt;a href="http://cr.openjdk.java.net/~briangoetz/valhalla/specialization.html"&gt;http://cr.openjdk.java.net/~briangoetz/valhalla/specialization.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kaushik:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.codinghorror.com/the-ips-lcd-revolution/"&gt;27” IPS LCD Monitors for Korean eBay vendors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ebay.com/itm/First-FSM-270YG-LED-LG-S-IPS-WIDE-2560x1440-WQHD-27inch-Computer-Monitor-/320933726714?pt=LH_DefaultDomain_0&amp;amp;hash=item4ab92409fa"&gt;New FIRST FSM-270YG 27″ LED 2560×1440&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.netflix.com/WiMovie/80018294"&gt;The new DareDevil show on Netflix!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="jake-wharton"&gt;
Jake Wharton
&lt;a class="heading-anchor" href="#jake-wharton" aria-label="Link to Jake Wharton"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@jakewharton [&lt;a href="http://twitter.com/JakeWharton"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jakewharton.com/"&gt;jakewharton.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@donnfelker [&lt;a href="https://twitter.com/donnfelker"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@kaushikgopal [&lt;a href="https://twitter.com/kaushikgopal/"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co/"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/7/</guid><pubDate>Thu, 07 May 2015 03:55:47 UTC</pubDate></item><item><title>006: Jake Wharton on Becoming a Better Developer and Creating Successful Open Source Projects (Part 1)</title><link>https://fragmentedpodcast.com/episodes/6/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6b0a0b0b-9dc5-4c24-a304-644411ffa5ae?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6b0a0b0b-9dc5-4c24-a304-644411ffa5ae/ep-6-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In part one of this two-part segment, we talk to the one and only Jake Wharton. He gives us the scoop on how he operates day to day, what he looks for in a good Android developer and how to become a better Android developer. He also touches upon the various sources and non-Java platforms that he draws inspiration from. Finally, he talks about open source and gives tips on leading an open source project.&lt;/p&gt;
&lt;h1 id="show-noteslinks"&gt;
Show Notes/Links
&lt;a class="heading-anchor" href="#show-noteslinks" aria-label="Link to Show Notes/Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h2 id="follow-up"&gt;
Follow up:
&lt;a class="heading-anchor" href="#follow-up" aria-label="Link to Follow up:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/105979641354189463768/posts/bahdgRWvMUD"&gt;Michel Panzer on UIL&lt;/a&gt; [plus.google.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="episode-topics"&gt;
Episode topics:
&lt;a class="heading-anchor" href="#episode-topics" aria-label="Link to Episode topics:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/ActionBarSherlock"&gt;ActionBar Sherlock&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;Jake’s working environment
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/java-code-styles"&gt;Square Github Styles&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hadihariri.com/2014/06/24/no-tabs-in-intellij-idea/"&gt;No tabs in Intellij&lt;/a&gt; [hadihariri.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Android source code browsing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/android-sdk-search/hgcbffeicehlpmgmnhnkjbjoldkfhoin?hl=en"&gt;Android SDK Search by Roman Nurik&lt;/a&gt; [chrome.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.android.com/source/downloading.html"&gt;Download the Android AOSP Source&lt;/a&gt; [source.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidxref.com/"&gt;AndroidXref&lt;/a&gt; [androidxref.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android"&gt;Grepcode Android&lt;/a&gt; [grepcode.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/about/dashboards/index.html"&gt;Device Platform Versions&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;non-Java languages and platforms to draw inspiration from:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; [golang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rust-lang.org/"&gt;Rust&lt;/a&gt; [rust-lang.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/staltz/cycle"&gt;CycleJs&lt;/a&gt; [github.com ]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=PCxz2LEmuL4"&gt;Droidcon Montreal keynote by JW and JW&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="jake-wharton"&gt;
Jake Wharton
&lt;a class="heading-anchor" href="#jake-wharton" aria-label="Link to Jake Wharton"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@jakewharton [&lt;a href="http://twitter.com/JakeWharton"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jakewharton.com/"&gt;jakewharton.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@donnfelker [&lt;a href="https://twitter.com/donnfelker"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@kaushikgopal [&lt;a href="https://twitter.com/kaushikgopal/"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co/"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/6/</guid><pubDate>Thu, 30 Apr 2015 04:19:57 UTC</pubDate></item><item><title>005: Image libraries for Android</title><link>https://fragmentedpodcast.com/episodes/5/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/15339bfa-0053-4a2d-8ffe-5d8235092ac3?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/15339bfa-0053-4a2d-8ffe-5d8235092ac3/ep-5-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn and Kaushik start off by discussing the tips and tricks available for efficiently loading images in an Android app. Good image libraries make use of these techniques and perform all the heavy lifting in the background. So they then discuss the different image library options available for Android developers.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h2 id="techniquestips-on-effective-image-rendering-in-android"&gt;
Techniques/tips on effective image rendering in Android:
&lt;a class="heading-anchor" href="#techniquestips-on-effective-image-rendering-in-android" aria-label="Link to Techniques/tips on effective image rendering in Android:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="bitmap-sizes-and-allocation"&gt;
Bitmap sizes and allocation:
&lt;a class="heading-anchor" href="#bitmap-sizes-and-allocation" aria-label="Link to Bitmap sizes and allocation:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/training/displaying-bitmaps/index.html"&gt;Displaying bitmaps efficiently&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/graphics/Bitmap.Config.html"&gt;RGB_565, ARGB_888 and other different bitmap configurations&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/reference/android/hardware/camera2/package-summary.html"&gt;Android Camera2 apis&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=rsQet4nBVi8"&gt;Chet Haase DevByte : Bitmap allocation&lt;/a&gt; [youtube.com] (bitmaps managed in Dalvik heap post 3.0; so large bitmaps implies large heap implies GC could happen more often)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reuse-bitmaps"&gt;
Reuse bitmaps:
&lt;a class="heading-anchor" href="#reuse-bitmaps" aria-label="Link to Reuse bitmaps:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/training/displaying-bitmaps/manage-memory.html#inBitmap"&gt;inBitmap option for Android 3.0 and later&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inBitmap"&gt;before Android 4.4 only equal sized bitmaps with inSampleSize 1 supported&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inBitmap"&gt;Reusing bitmap objects on Android&lt;/a&gt;[booking.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="downsample-bitmaps"&gt;
Downsample bitmaps
&lt;a class="heading-anchor" href="#downsample-bitmaps" aria-label="Link to Downsample bitmaps"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap"&gt;Load a scaled down version into memory&lt;/a&gt; [developer.android.com]
&lt;ul&gt;
&lt;li&gt;see code for calculateInSampleSize&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="caching"&gt;
Caching
&lt;a class="heading-anchor" href="#caching" aria-label="Link to Caching"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cache_algorithms#Examples"&gt;Cache Algorithms – see LruCache&lt;/a&gt; [wikipedia.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/util/LruCache.html"&gt;LruCache object in Android&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/DiskLruCache"&gt;JakeWharton DiskLruCache&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html"&gt;Don’t use Soft or Weak References for your Caches&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/+AndroidDevelopers/posts/QMoo7zV3dzP"&gt;Android Performance Pattern DevByte – why 60fps&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="image-libraries-for-android"&gt;
Image libraries for Android:
&lt;a class="heading-anchor" href="#image-libraries-for-android" aria-label="Link to Image libraries for Android:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://square.github.io/picasso/"&gt;Picasso&lt;/a&gt; by Square [github.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/picasso/blob/master/CHANGELOG.md#version-250-2015-02-06"&gt;fetch introduced in V 2.5.0 (Changelog)&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/picasso/issues/114"&gt;Picasso doesn’t&lt;/a&gt; do bitmap recycling&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/square/picasso/issues/672"&gt;Jake Wharton’s thoughts on Picasso not having a bitmap pool&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bumptech/glide"&gt;Glide&lt;/a&gt; [github.com]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bumptech/glide/issues/73"&gt;github issue where author explains tags being used to store metadata&lt;/a&gt; [github.com]&lt;/li&gt;
&lt;li&gt;Glide &lt;a href="https://github.com/bumptech/glide/wiki/Resource-re-use-in-Glide"&gt;does bitmap recycling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/koush/ion"&gt;Ion&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=yIMltNEAKZY"&gt;DeepZoom with Ion&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html"&gt;Uses BitmapRegionDecoder to implement DeepZoom&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/training/volley/index.html"&gt;Volley&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=yhv8l9F44qo"&gt;Ficus Kirkpatrick introduces Volley in Google.IO&lt;/a&gt; [youtube.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/19396852/volley-image-caching"&gt;Doesn’t come with an image caching mechansim out of the box&lt;/a&gt; [stackoverflow.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://frescolib.org/"&gt;Fresco&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.facebook.com/posts/366199913563917/introducing-fresco-a-new-image-library-for-android/"&gt;Introducing Fresco&lt;/a&gt; [code.facebook.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/romainguy/status/581241987656880128"&gt;Romain Guy concern over native api call&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Other noteworthies that we did not discuss:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nostra13/Android-Universal-Image-Loader"&gt;Universal Image Loader&lt;/a&gt; Library comparisons by others:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en"&gt;Picasso vs Glide&lt;/a&gt; [inthecheesefactory.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="image-library-comparisons"&gt;
Image library comparisons:
&lt;a class="heading-anchor" href="#image-library-comparisons" aria-label="Link to Image library comparisons:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jessewilson/status/581235604740042752"&gt;JesseWilson on Picasso vs Fresco :P&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jessewilson/status/581422137463992320"&gt;JesseWilson Picasso:Glide :: Coke:Pepsi&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/103583939320326217147/posts/bfAFC5YZ3mq%20Bitmap%20reuse%20(not%20done%20in%20Picasso)"&gt;Image comparisons by Koushik Dutta&lt;/a&gt; [plus.google.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/blog/solving-the-android-image-loading-problem-volley-vs-picasso/"&gt;Volley vs Picasso &lt;/a&gt;[bignerdranch.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Donn
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/square/moshi"&gt;Moshi – A new modern JSON library for Android and Java from the Square guys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jsonschema2pojo.org/"&gt;JsonSchemaToPojo: Take json or a json schema and turn it into POJOs. &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.parcelabler.com/"&gt;Parcelabler: Generate Parcelable implementations with a click of a button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/johncarl81/parceler"&gt;Parceler: Android parcels created through Code generation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KG:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.paralleluniverse.co/2014/05/01/modern-java/"&gt;Not your father’s Java: 3 part blog post series An opinionated guide to modern Java development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=iyXpdkqBsG8"&gt;Stetho caster.io screencast: Debugging Android with Stetho – Donn’sscreencast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://cleartones.net"&gt;Cleartones: professional ringtones!&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@donnfelker [&lt;a href="https://twitter.com/donnfelker"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@kaushikgopal [&lt;a href="https://twitter.com/kaushikgopal/"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co/"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/5/</guid><pubDate>Fri, 17 Apr 2015 05:51:35 UTC</pubDate></item><item><title>004: The RxJava show with Dan Lew (Part 2)</title><link>https://fragmentedpodcast.com/episodes/4/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/6069a8db-63b9-4032-a818-d6902fa118cd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/6069a8db-63b9-4032-a818-d6902fa118cd/ep-4-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;figure class="borderless"&gt;
&lt;div align="center"&gt;
&lt;img src="https://fragmentedpodcast.com/images/wp-content/uploads/2015/03/rxjava-part2.png"
class="borderless"
alt="Rx Mascot"
width="300"
height="300"
loading="lazy" decoding="async"
/&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;p&gt;In this episode of Fragmented, Donn and Kaushik continue their conversation with Dan Lew on RxJava. In the final part of this 2 part series, they talk about many useful RxJava operators and other intricacies of using RxJava in Android.&lt;/p&gt;
&lt;h2 id="show-notes"&gt;
Show Notes
&lt;a class="heading-anchor" href="#show-notes" aria-label="Link to Show Notes"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="rxjava-operators"&gt;
RxJava Operators:
&lt;a class="heading-anchor" href="#rxjava-operators" aria-label="Link to RxJava Operators:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Observable.just [&lt;a href="http://reactivex.io/documentation/operators/just.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.from [&lt;a href="http://reactivex.io/documentation/operators/from.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.defer [&lt;a href="http://reactivex.io/documentation/operators/defer.html"&gt;reactivex.io&lt;/a&gt;]
&lt;ul&gt;
&lt;li&gt;Using defer to handle “&lt;strong&gt;Old, Slow Code&lt;/strong&gt;” [&lt;a href="http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/"&gt;blog.danlew.net&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Observable.map [&lt;a href="http://reactivex.io/documentation/operators/map.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.flatmap [&lt;a href="http://reactivex.io/documentation/operators/flatmap.html"&gt;reactivex.io&lt;/a&gt;]
&lt;ul&gt;
&lt;li&gt;map vs flatmap (alchemist and cheese shredding analogy [&lt;a href="http://www.reddit.com/r/androiddev/comments/2y8exc/what_is_the_difference_between_map_and_flatmap_in/"&gt;reddit&lt;/a&gt;])&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Observable.zip [&lt;a href="http://reactivex.io/documentation/operators/zip.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.combineLatest [&lt;a href="http://reactivex.io/documentation/operators/combinelatest.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable. switchMap [&lt;a href="http://reactivex.io/documentation/operators/images/switchMap.png"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.distinctUntilChanged [&lt;a href="http://rxmarbles.com/#distinctUntilChanged"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.lift explanation [&lt;a href="https://github.com/ReactiveX/RxJava/wiki/Implementing-Your-Own-Operators"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.compose
&lt;ul&gt;
&lt;li&gt;Don’t break the chain (using compose) [&lt;a href="http://blog.danlew.net/2015/03/02/dont-break-the-chain/"&gt;blog.danlew.net&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Observable.filter [&lt;a href="http://reactivex.io/documentation/operators/filter.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Observable.take [&lt;a href="https://github.com/ReactiveX/RxJava/wiki/Filtering-Observables#take"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;subscribeOn vs observeOn [&lt;a href="http://stackoverflow.com/questions/7579237/whats-the-difference-between-subscribeon-and-observeon"&gt;stackoverflow.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Understanding debounce, buffer, debouncedBuffer [&lt;a href="http://nerds.weddingpartyapp.com/tech/2015/01/05/debouncedbuffer-used-in-rxbus-example/"&gt;nerds.weddingpartyapp.com&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rxjava-components"&gt;
RxJava Components:
&lt;a class="heading-anchor" href="#rxjava-components" aria-label="Link to RxJava Components:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subjects&lt;/strong&gt;: when is it appropriate to use [.net but still applies] [[davesexton.com]&lt;a href="http://nerds.weddingpartyapp.com/tech/2015/01/05/debouncedbuffer-used-in-rxbus-example/"&gt;19&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Implementing an event bus using RxJava [&lt;a href="http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/"&gt;nerds.weddingpartyapp.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RxJava plugins&lt;/strong&gt; [&lt;a href="https://github.com/ReactiveX/RxJava/wiki/Plugins"&gt;github.com&lt;/a&gt;]
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RxJavaDebug&lt;/strong&gt; plugin – for hooking to start/end/error [&lt;a href="https://github.com/ReactiveX/RxJavaDebug"&gt;github.com&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.toBlocking() [&lt;a href="http://reactivex.io/RxJava/javadoc/rx/Observable.html#toBlocking()"&gt;reactivx.io&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Composite Subscriptions [&lt;a href="http://reactivex.io/RxJava/javadoc/rx/subscriptions/CompositeSubscription.html"&gt;reactivex.io&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="retrolambda"&gt;
Retrolambda
&lt;a class="heading-anchor" href="#retrolambda" aria-label="Link to Retrolambda"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Retrolambda library [&lt;a href="https://github.com/orfjackal/retrolambda"&gt;github.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Retrolambda gradle plugin [&lt;a href="https://github.com/evant/gradle-retrolambda"&gt;github.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Common Issue with Retrolambda (NoClassDefFoundError) [&lt;a href="https://github.com/orfjackal/retrolambda/issues/37"&gt;github.com&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hot-vs-cold-observables-8211-from-the-rxjs-wiki-githubcom"&gt;
Hot  vs Cold observables – From the RxJs wiki [&lt;a href="https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables"&gt;github.com&lt;/a&gt;]
&lt;a class="heading-anchor" href="#hot-vs-cold-observables-8211-from-the-rxjs-wiki-githubcom" aria-label="Link to Hot  vs Cold observables &amp;amp;#8211; From the RxJs wiki [github.com]"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;uses js instead of java, but concepts are the same and this is the best explanation I’ve found so far.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rxjava-wiki-on-backpressure-githubcom"&gt;
RxJava wiki on Backpressure [&lt;a href="https://github.com/ReactiveX/RxJava/wiki/Backpressure"&gt;github.com&lt;/a&gt;]:
&lt;a class="heading-anchor" href="#rxjava-wiki-on-backpressure-githubcom" aria-label="Link to RxJava wiki on Backpressure [github.com]:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ring buffer size: `System.setProperty(“rx.ring-buffer.size”, “128”);`&lt;/li&gt;
&lt;li&gt;Issue with changing buffer ring size [&lt;a href="https://github.com/ReactiveX/RxJava/issues/1820"&gt;github.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;It’s 16 on Android, down from 1024 originally. :P So it’s actually 64x smaller.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dan Lew:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple Made Easy (talk by Rich Hickey creator of Clojure) [&lt;a href="http://www.infoq.com/presentations/Simple-Made-Easy"&gt;infohq&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Victor by Trello (SVG assets) [&lt;a href="https://github.com/trello/victor"&gt;github.com&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Donn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Realm Object Database [&lt;a href="http://realm.io/"&gt;realm.io&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kaushik:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Therapeutic Refactoring (talk by Katrina Owen) [&lt;a href="https://www.youtube.com/watch?v=J4dlF0kcThQ"&gt;youtube.com&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="dan-lew"&gt;
Dan Lew
&lt;a class="heading-anchor" href="#dan-lew" aria-label="Link to Dan Lew"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@danlew42 [&lt;a href="https://twitter.com/danlew42"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Dan Lew’s blog [&lt;a href="http://blog.danlew.net/"&gt;danlew.net&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@donnfelker [&lt;a href="https://twitter.com/donnfelker"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/"&gt;donnfelker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;@kaushikgopal [&lt;a href="https://twitter.com/kaushikgopal/"&gt;twitter.com&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaush.co/"&gt;kaush.co&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/4/</guid><pubDate>Wed, 01 Apr 2015 15:32:23 UTC</pubDate></item><item><title>003: The RxJava show with Dan Lew (Part 1)</title><link>https://fragmentedpodcast.com/episodes/3/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/f6b9015d-0cc4-4752-a085-13799c3fc887?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/f6b9015d-0cc4-4752-a085-13799c3fc887/ep-3-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;figure class="borderless"&gt;
&lt;div align="center"&gt;
&lt;img src="https://avatars3.githubusercontent.com/u/6407041?v=3&amp;amp;#038;s=400"
class="borderless"
alt="Rx Mascot"
width="300"
height="300"
loading="lazy" decoding="async"
/&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;p&gt;In this episode of Fragmented, Donn and Kaushik interview Dan Lew – druid of RxJava &amp;amp; RxAndroid! In part 1 of this 2 part series, we find out more about the one they call Dan Lew. We ask Dan how he started off as a developer, how he stays on top of development, where he draws inspiration from for amazing Android development and much more. We then begin disarming the glorious beast that is RxJava touching upon it’s benefits and begin discussion of some common operators.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://audio.simplecast.com/7f5a4992.mp3"&gt;Downloads&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="dans-open-source-contributions"&gt;
Dan’s open source contributions:
&lt;a class="heading-anchor" href="#dans-open-source-contributions" aria-label="Link to Dan’s open source contributions:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dlew/joda-time-android"&gt;Joda-Time Android&lt;/a&gt; [github]
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-5wpm-gesOY"&gt;Why developers hate Timezones [youtube]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dlew/android-gfycat"&gt;Gfycat&lt;/a&gt; [github]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/trello/victor"&gt;Victor&lt;/a&gt; by Trello  [github]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="staying-on-top-of-android-development"&gt;
Staying on top of Android Development:
&lt;a class="heading-anchor" href="#staying-on-top-of-android-development" aria-label="Link to Staying on top of Android Development:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://androidweekly.net/"&gt;Android Weekly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.androiddevdigest.com/"&gt;Android Dev Digest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google RSS reader app – &lt;a href="https://play.google.com/store/apps/details?id=com.noinnion.android.greader.reader&amp;amp;hl=en"&gt;gReader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reddit.com/r/androiddev/"&gt;androiddev&lt;/a&gt; [reddit]&lt;/li&gt;
&lt;li&gt;Best Book on learning Java &lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683?tag=httpkaushco-20"&gt;[Effective Java: Joshua Bloch]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dans-favorite-apps"&gt;
Dan’s  favorite apps:
&lt;a class="heading-anchor" href="#dans-favorite-apps" aria-label="Link to Dan’s  favorite apps:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=ch.bitspin.timely&amp;amp;hl=en"&gt;Timely&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts&amp;amp;hl=en"&gt;Pocket Casts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=reddit.news&amp;amp;hl=en"&gt;Reddit News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=net.nurik.roman.muzei&amp;amp;hl=en"&gt;Muzei&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.noinnion.android.greader.reader&amp;amp;hl=en"&gt;gReader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.linkbubble.playstore&amp;amp;hl=en"&gt;Link Bubble&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;For more inspiration: &lt;a href="http://androidniceties.tumblr.com/"&gt;Android Niceties&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="android-games-that-dan-plays"&gt;
Android Games that Dan plays
&lt;a class="heading-anchor" href="#android-games-that-dan-plays" aria-label="Link to Android Games that Dan plays"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=vo.threes.exclaim"&gt;Threes!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.magmafortress.hoplite"&gt;Hoplite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.concreterose.wordiest&amp;amp;hl=en"&gt;Wordiest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="working-remotely"&gt;
Working Remotely:
&lt;a class="heading-anchor" href="#working-remotely" aria-label="Link to Working Remotely:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://trello.com/"&gt;Trello&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.com/"&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hueniverse.com/2015/02/23/notes-on-managing-remote-teams/"&gt;Notes by Eran Hammer [hueniverse.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="getting-started-with-rxjava"&gt;
Getting started with  RxJava:
&lt;a class="heading-anchor" href="#getting-started-with-rxjava" aria-label="Link to Getting started with  RxJava:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/"&gt;Dan Lews RxJava Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nerds.weddingpartyapp.com/tech/2014/09/15/learning-rxjava-with-android-by-example/"&gt;Learning RxJava with Android by example&lt;/a&gt; [nerds.weddingpartyapp.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/Android-RxJava"&gt;Android-RxJava [github.com/kaushikgopal]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/staltz/868e7e9bc2a7b8c1f754"&gt;Intro to Rx you’ve been missing &lt;/a&gt;[gist]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rx"&gt;
Rx
&lt;a class="heading-anchor" href="#rx" aria-label="Link to Rx"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://msdn.microsoft.com/en-us/data/gg577609.aspx"&gt;Rx – Reactive Extensions by Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://reactivex.io/"&gt;ReactiveX [official page for Reactive Extensions] &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveX/RxAndroid"&gt;RxAndroid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/3/</guid><pubDate>Wed, 18 Mar 2015 20:27:32 UTC</pubDate></item><item><title>002: Android Studio</title><link>https://fragmentedpodcast.com/episodes/2/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/351aa384-32e5-4a3e-a8a0-0a54d90279dd?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/351aa384-32e5-4a3e-a8a0-0a54d90279dd/ep-2-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In this episode of Fragmented, Donn and Kaushik talk about the official IDE for Android development – “&lt;strong&gt;Android Studio&lt;/strong&gt;”. Why should you care about your IDE? Is Android Studio really open source? What are some of the advantages of using Android Studio? How can you customize and tweak Android Studio so you take your android development game to the next level? Listen to this episode and find out. The awesome picks for this episode are particularly awesome too.&lt;/p&gt;
&lt;h1 id="show-noteslinks"&gt;
Show Notes/Links
&lt;a class="heading-anchor" href="#show-noteslinks" aria-label="Link to Show Notes/Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;h3 id="android-studio-official-ide"&gt;
Android Studio (official IDE):
&lt;a class="heading-anchor" href="#android-studio-official-ide" aria-label="Link to Android Studio (official IDE):"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://android-developers.blogspot.com/2013/05/android-studio-ide-built-for-android.html"&gt;Google announces Android Studio&lt;/a&gt; [Google I/O 2013]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;Developer frontpage – Android Studio is the official editor&lt;/a&gt;  [developer.android.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="open-source-ness-of-android-studio"&gt;
“Open source-ness” of Android Studio:
&lt;a class="heading-anchor" href="#open-source-ness-of-android-studio" aria-label="Link to “Open source-ness” of Android Studio:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jetbrains.org/pages/viewpage.action?pageId=983889"&gt;IntelliJ open source platform for building IDEs&lt;/a&gt; [jetbrains.org]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/sdk/eclipse-adt.html"&gt;Eclipse plugin ADT&lt;/a&gt; [developer.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tools.android.com/build/studio"&gt;Build Android Studio from command line [tools.android.com]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JakeWharton/u2020"&gt;Jake Wharton’s u2020 Demo App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environment-customizations"&gt;
Environment customizations:
&lt;a class="heading-anchor" href="#environment-customizations" aria-label="Link to Environment customizations:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kaushikgopal/jetbrains_env"&gt;Kaushik’s Android studio environment&lt;/a&gt; (codestyle, livetemplates, keymap etc) [github.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chriskempson.github.io/base16/#ocean"&gt;Chris Kempson – original theme&lt;/a&gt; [chriskempson.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="annotation-magic"&gt;
Annotation Magic:
&lt;a class="heading-anchor" href="#annotation-magic" aria-label="Link to Annotation Magic:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://anupcowkur.com/posts/a-look-at-android-support-annotations/"&gt;A look at Android support animations&lt;/a&gt; [anupcowkur.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tools.android.com/tech-docs/support-annotations"&gt;Support Annotations&lt;/a&gt; [tools.android.com]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.jetbrains.com/idea/2013/10/better-control-flow-analysis-with-contract-annotations-and-intellij-idea-13/"&gt;Contract Annotations&lt;/a&gt; [blog.jetbrains.com]&lt;/li&gt;
&lt;li&gt;Tools prefix: &lt;a href="https://medium.com/sebs-top-tips/tools-of-the-trade-part-2-b91271892d10"&gt;Tools of the trade by Sebastiano Poggi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="learning-android-studio-resources"&gt;
Learning Android Studio resources:
&lt;a class="heading-anchor" href="#learning-android-studio-resources" aria-label="Link to Learning Android Studio resources:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Donn Felker Android Studio Tips:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/androidstudio/"&gt;Screencasts on Android Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/wp-content/uploads/AndroidDeveloperTools-Chapter6.pdf"&gt;Android Tools Book – Android Studio Chapter (FREE)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Philippe Breault [developerphil.com]:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-1/"&gt;Android studio tips roundup #1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-2/"&gt;Android studio tips roundup #2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-3/"&gt;Android studio tips roundup #3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-4/"&gt;Android studio tips roundup #4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-5/"&gt;Android studio tips roundup #5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-most-important-things-on-the-internet"&gt;
The most important things on the internet:
&lt;a class="heading-anchor" href="#the-most-important-things-on-the-internet" aria-label="Link to The most important things on the internet:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.washingtonpost.com/news/post-nation/wp/2015/02/26/breaking-two-llamas-are-on-the-run/"&gt;Llamas in Arizona&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/interactive/2015/02/28/science/white-or-blue-dress.html"&gt;Blue Black White Gold dresses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.facebook.com/posts/393927910787513/stetho-a-new-debugging-platform-for-android/"&gt;Stetho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/"&gt;Dan Lew’s RxJava Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rounded ImageView:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/kaushikgopal/6c25bc9470bbd11fcf7c"&gt;Rounded Bitmap drawable usage&lt;/a&gt;[gist]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://evel.io/2013/07/21/rounded-avatars-in-android/"&gt;Evelio blog post&lt;/a&gt; on different approaches to creating rounded image views&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chris.banes.me/"&gt;Chris Banes&lt;/a&gt; For questions, comments or suggestions you can reach us at&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; and &lt;a href="http://www.twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt;&lt;/p&gt;</description><guid>https://fragmentedpodcast.com/episodes/2/</guid><pubDate>Tue, 03 Mar 2015 19:49:00 UTC</pubDate></item><item><title>001: Welcome &amp; Testing in Android</title><link>https://fragmentedpodcast.com/episodes/1/</link><description>
&lt;div class="overflow-hidden sm:h-[200px]"&gt;
&lt;iframe class="w-full h-full border-0" data-simplecast-player scrolling="no"
src="https://player.simplecast.com/9d624e0d-8384-4422-8e11-036ccd394dde?dark=true"&gt;
&lt;/iframe&gt;
&lt;/div&gt;&lt;p class="mt-2!"&gt;
&lt;a class="download-link font-bold text-right text-sm block" href="https://cdn.simplecast.com/audio/20f350/20f35050-e836-44cd-8f7f-fd13e8cb2e44/9d624e0d-8384-4422-8e11-036ccd394dde/ep-1-fragmented_tc.mp3?nocache"&gt;Download directly&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Welcome to the very first episode of Fragmented. Donn and Kaushik talk about why they started the podcast, the structure of the podcast and a little about who they are. The main topic for this episode is &lt;strong&gt;Testing&lt;/strong&gt;! What are the benefits of testing, in general? Why does testing specifically help Android developers? What is the state of testing in Android and how does one test in Android?&lt;/p&gt;
&lt;h1 id="show-noteslinks"&gt;
Show Notes/Links
&lt;a class="heading-anchor" href="#show-noteslinks" aria-label="Link to Show Notes/Links"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://caster.io/android/episode-1-android-testing-getting-started-with-espresso-2-0/?utm_source=fragmented&amp;amp;utm_campaign=free"&gt;Free Getting Started with Espresso 2.0 Screencast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tools.android.com/tech-docs/unit-testing-support"&gt;Unit testing support –  Android Tools site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/android-from-the-trenches/"&gt;Donn – Android from the trenches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-xQCNf_5NNM&amp;amp;feature=youtu.be"&gt;Michael Bailey – (yogurtearl)&lt;/a&gt; – espresso, spoon and wiremock&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mattlogan.me/decoupling-the-presenter"&gt;Matt Logan – decoupling the presenter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.kaush.co/2015/01/11/interested-in-an-android-developer-focused-podcast/"&gt;KG – interested in an android developer podcast?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://everybodytests.blogspot.com/2012/11/uiautomatorjar-what-happened-when.html"&gt;UiAutomator – Junit and Monkeyrunner got drunk and hooked up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052"&gt;Working Effectively With Legacy Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=z9quxZsLcfo#t=442"&gt;Kent Beck talking about TDD – [Youtube Is TDD Dead]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/android-testing-support-library/docs/espresso/cheatsheet/"&gt;Espresso 2.0 Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/JakeWharton/1c2f2cadab2ddd97f9fb"&gt;Jake Wharton – ActivityRule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joel-costigliola.github.io/assertj/"&gt;AssertJ&lt;/a&gt;  / &lt;a href="http://square.github.io/assertj-android/"&gt;AssertJ-Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xkcd.com/303/"&gt;XKCD – Compiling Comic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren’t Stubs – Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.donnfelker.com/android-studio-espresso-2-0-classnotfoundexception/"&gt;ClassNotFoundExceptoin – Espresso 2.0 Dagger Issue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="testing-links"&gt;
Testing Links
&lt;a class="heading-anchor" href="#testing-links" aria-label="Link to Testing Links"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/tools/testing/testing_android.html"&gt;Testing fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/android-test-kit/wiki/Espresso"&gt;Espresso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.robolectric.org"&gt;Robolectric&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/mockito/"&gt;Mockito&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://square.github.io/spoon/"&gt;Spoon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.google.com/p/robotium/"&gt;Robotium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="misc"&gt;
Misc
&lt;a class="heading-anchor" href="#misc" aria-label="Link to Misc"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.androiddevdigest.com"&gt;Android Dev Digest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://androidjobs.io"&gt;AndroidJobs.IO&lt;/a&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sample-android-testing-projects"&gt;
Sample Android Testing Projects:
&lt;a class="heading-anchor" href="#sample-android-testing-projects" aria-label="Link to Sample Android Testing Projects:"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/googlesamples/android-testing"&gt;Google Samples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="awesome-picks"&gt;
Awesome picks:
&lt;a class="heading-anchor" href="#awesome-picks" aria-label="Link to Awesome picks:"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://devicelab.vanamco.com/"&gt;Device Lab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/fonts/specimen/Inconsolata"&gt;Inconsolata-&lt;/a&gt;dz&lt;a href="http://www.google.com/fonts/specimen/Inconsolata"&gt; font for development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fontpalace.com/font-details/Consolas/"&gt;Consolas font for development&lt;/a&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a class="heading-anchor" href="#contact" aria-label="Link to Contact"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="donn-felker"&gt;
Donn Felker
&lt;a class="heading-anchor" href="#donn-felker" aria-label="Link to Donn Felker"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/donnfelker"&gt;@donnfelker&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaushik-gopal"&gt;
Kaushik Gopal
&lt;a class="heading-anchor" href="#kaushik-gopal" aria-label="Link to Kaushik Gopal"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.twitter.com/kaushikgopal"&gt;@kaushikgopal&lt;/a&gt; [twitter.com]&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://fragmentedpodcast.com/episodes/1/</guid><pubDate>Tue, 17 Feb 2015 03:30:24 UTC</pubDate></item></channel></rss>