<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Andrew Hood</title>
        <link>https://aphlab.vercel.app</link>
        <description>APH Lab</description>
        <lastBuildDate>Sat, 28 Jan 2023 01:29:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Andrew Hood</title>
            <url>https://aphlab.vercel.app/favicon.ico</url>
            <link>https://aphlab.vercel.app</link>
        </image>
        <copyright>All rights reserved 2023</copyright>
        <item>
            <title><![CDATA[Lessons learned from 365 days on Duolingo]]></title>
            <link>https://aphlab.vercel.app/articles/lessions-from-duolingo-365-day-streak</link>
            <guid>https://aphlab.vercel.app/articles/lessions-from-duolingo-365-day-streak</guid>
            <pubDate>Tue, 31 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[At the beginning of 2022 I decided to attempt to learn Italian, the 3rd language I have tried to learn on Duolingo. I am now on day 225 and this is what I have learned...]]></description>
            <content:encoded><![CDATA[<p>At the beginning of 2022 I decided to attempt to learn Italian, the 3rd language I have tried to learn on Duolingo. I am now on day 225 and this is what I have learned...</p>
<h2>The motivation</h2>
<p>When I decided to attempt to learn a new language for the third time, I didn&#x27;t really have a huge expectation. I had already tried learning Vietnamese and French in past
but ultimately gave up very quickly.</p>
<p>The reasons I gave up on my previous attempts was for separate reasons. At least for Vietnamese the motivation was for a good reason,
I wanted to be able to communicate with my engineering collegues in Vietnam. However, the reason I gave up was purely just out of difficulty.</p>
<p>My other attempt at learning a language was French. There wasn&#x27;t any real reason why I decided to learn French other than I knew some one else that had some
french vocabuary, so I figured they could keep me motivated. Unfortunately I ultimately gave up in 2017 only a month after I started. I didn&#x27;t open the Duolingo app
until the start of 2022.</p>
<h2>What kept me invested</h2>
<p>There was one new feature that kept me hooked but before I reveal that reason, there are few other reasons that I believe made me more invested this time round.</p>
<ol>
<li>
<p><strong>Paying for an annual subscription</strong>. In the past when I&#x27;ve used Duolingo, I always used the free plan.
I can&#x27;t even remember if they had a paid subscription, but after a couple days into my Italian journey I decided to pay for the annual subcription. I now had a financial
motivation to stick with it so as to get my money&#x27;s worth.</p>
</li>
<li>
<p><strong>Having an ambitious goal</strong>. I told myself that if I persisted and could get to a level that I thought was good enough to converse with, that I could justify
travelling to Italy at the end of the year. I didn&#x27;t hit that goal as I don&#x27;t think I am at that level but that goal doesn&#x27;t really matter anymore. It
was able to motivate me enough at the beginning that by the time I realise I wouldn&#x27;t reach that goal by the end of year, I had already invested so much into the course
that it had become a habit.</p>
</li>
<li>
<p><strong>Not putting any pressure and just having fun</strong>. As mentioned in the previous point, I didn&#x27;t end up reaching my goal but I&#x27;m not disappointed. There was no real pressure for
me to actually reach it, and all it comes down to is the journey.</p>
</li>
</ol>
<p>Note that these three points can be applied to most habit building or new year resolutions, for example, exercising better. Paying for a gym membership, setting a goal
and just having fun on the journey will get you far into building a healthy habit.</p>
<p>So back to that one new feature that kept me hooked on Duolingo. Leaderboards. I would describe myself as somewhat competitive. Not overally where I would get mad if I&#x27;m
not winning but just enough that I will make an effort. How Duolingo has implemented their leaderboards is really quite facinating. In traditional games, the leaderboard
would include everyone that&#x27;s playing or atleast some subset by a specific classification, whether that&#x27;s by country, age, etc. For large competitions, when comparing yourself
against thousand&#x27;s of people, even if you&#x27;re in the top 5%, that could still mean you&#x27;re no where near the winners.</p>
<p>Duolingo does something different, they only make you compete against 20-25 random users that change each week. This means you have a much greater chance
at getting placed in the top 3. By also rotating the users each week, it means you&#x27;re not competeing with the same people and develop unhealthy rivalries.</p>]]></content:encoded>
            <author>andy.hoody@gmail.com (Andrew Hood)</author>
        </item>
        <item>
            <title><![CDATA[The third age of app development]]></title>
            <link>https://aphlab.vercel.app/articles/the-third-age-of-app-development</link>
            <guid>https://aphlab.vercel.app/articles/the-third-age-of-app-development</guid>
            <pubDate>Mon, 02 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Why I believe we have entered a new age for app development thanks to AI model services]]></description>
            <content:encoded><![CDATA[<p>The first age of app development was all about mobile apps. With the launch of the iPhone in 2007, a new era of computing was born. Suddenly, people had access to a wealth of information and functionality right at their fingertips. Mobile apps allowed us to connect with friends and family, access the latest news and entertainment, and even conduct business from anywhere with an internet connection.</p>
<p>The second age of app development was centered around content platforms. With the rise of social media and streaming services, people began to spend more and more time consuming content on their devices. Companies like Facebook, Instagram, and Netflix became household names as they delivered a never-ending stream of photos, videos, and stories to keep us entertained and engaged.
In this period, content was king, meaning unless you had access to quality content, it was difficult to get a start your own app.</p>
<p>Now, we are entering the third age of app development: the age of AI apps. Artificial intelligence is beginning to revolutionize the way we interact with our devices. AI-powered apps can understand and respond to our needs in ways that were previously unimaginable. They can anticipate our desires and make recommendations based on our past behavior. They can even hold conversations with us, learning and adapting as they go.</p>
<p>The best part about using AI as a Service (AIaaS) is that you don&#x27;t need to have access to millions of data. I built an <a href="https://lessonbuilder.aphlab.com">AI tool</a> in very little time to gerenate custom lessons.
The app doesn&#x27;t have any lesson data when you first create an account, but as the user uses the app and asks for lessons on demand, they start building
a library of content.</p>
<p>The possibilities for AI apps are endless. They could help us manage our schedules, find the best deals online, or even diagnose medical conditions. As AI continues to advance, we can expect to see even more impressive and useful applications in the future.</p>
<p>So what does the third age of app development mean for developers and users? It means that the competition will be fierce as companies race to create the most innovative and useful AI apps. It also means that the bar for app development will be higher than ever before, as users demand more from their devices,
but the entry for new app developers is actually lower, thanks to these general purpose models available.</p>]]></content:encoded>
            <author>andy.hoody@gmail.com (Andrew Hood)</author>
        </item>
        <item>
            <title><![CDATA[Building my first component library]]></title>
            <link>https://aphlab.vercel.app/articles/building-my-first-component-library</link>
            <guid>https://aphlab.vercel.app/articles/building-my-first-component-library</guid>
            <pubDate>Thu, 22 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[I have worked with many different component libraries and even maintained a couple but I had never built one from scratch until now.]]></description>
            <content:encoded><![CDATA[<p>Most companies will have there own component library for what ever framework they use to greatly improve the consistency and efficience of building UI pages.
At Go1 we have had the Go1d (short for Go1 Design) component library for almost five years. Over that time, the library has grown to be more mature and
support more different UI scenarios. Although I was working at Go1 when Go1d was created, I wasn&#x27;t really involved in much of the development other than
occassionally adding a few components or fixing some bugs. The lack of exposure to the underlining architecture lead me to create a new component library
that extended Go1d but for a very specific use case, API Documentation.</p>
<img alt="" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fstorybook-screenshot.7a55eeb5.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fstorybook-screenshot.7a55eeb5.png&amp;w=3840&amp;q=75" width="3584" height="2034" decoding="async" data-nimg="future" loading="lazy" style="color:transparent"/>
<p>At the beginning of 2022, I was part of the Go1 DevX team, which was responsible for maintaining the exteral API interfaces. Our main goal was just to
migrate the current API infrastructure to use a standardised structure with Azure. We didn&#x27;t get to touch any of the API UIs or documentation but it
was definitely on my mind on what we could do to uplift the current API documentation.</p>
<p>Part of mirgrating the current API to use the new infrastructure was to rely more on automated systems that ensured there was less human intervention when
publishing new API changes. One of the most common ways to standardise the structure of the API is to use OpenAPI specs (commonly referred to as swagger).
These documents written in YAML, clearly outlines the API structure including endpoints, parameters and responses.</p>
<p>Since swagger documents included everything about an API, I kept thinking about how we could build the entire UI based on just the swagger document.
There are platforms out there that already do this, but usually it&#x27;s not super customisable, you just add your swagger doc, select a few config details
and it renders everything else for you. I wanted to build a component library that included all the small components to allow for full customisation.</p>
<p>The other advantage of using a react component is that it can be built directly into your app rather than having it hosted on some other platform and
needing to use iframes to embed it. Below is the only lines you need to render documenation (including request/response examples) into your app.</p>
<pre class="language-jsx"><code class="language-jsx"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">Endpoint</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;go1-api-doc&#x27;</span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Endpoint</span></span> <span class="token attr-name">operations</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token spread operator">...</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre>
<p>Try out the library yourself</p>
<ul>
<li><a href="https://www.npmjs.com/package/go1d-api-doc">https://www.npmjs.com/package/go1d-api-doc</a></li>
<li><a href="https://go1d-api-doc.onrender.com/?path=/docs/components-endpoint--basic">https://go1d-api-doc.onrender.com/?path=/docs/components-endpoint--basic</a></li>
</ul>]]></content:encoded>
            <author>andy.hoody@gmail.com (Andrew Hood)</author>
        </item>
    </channel>
</rss>