Iheanyi EkechukwuThe thoughts and writings of Iheanyi Ekechukwu.https://iheanyi.com/journal2021-12-18T21:10:00+00:00Iheanyi EkechukwuThe Monetization Model for Musicianshttps://iheanyi.com/journal/2021/12/18/the-monetization-model-for-musicians2021-12-18T21:10:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>From a consumer perspective, music is something that every single individual consumes in some way, shape, or form. But, it’s also a hobby that is pretty easy to get into these days as well. With the rise of Digital Audio Workstations (DAWs) such as <a href="https://ableton.com" class="b link highlight-link">Ableton</a> and <a href="https://www.image-line.com/" class="b link highlight-link">FL Studio</a> for music production, the barrier to entry for music production has been significantly lowered. Before these DAWs existed, music production required analog hardware for producing music, often with a high price-tag attached to it. DAWs levelled this playing field, allowing anybody with a laptop and headphones to enter the music production game. It is no secret that with the popularity of <a href="https://soundcloud.com" class="b link highlight-link">Soundcloud</a> and other music streaming platforms, there’s been a rise in music producers, both professionally and at the hobbyist level. When it comes to making money as a musician though, it gets pretty difficult. For producing a song, not only do you have to clear any samples used for the track, if you collaborate with another musician (like a singer or rapper), you will also have to split the money. And that is not including the share that the record label also takes. After everybody’s piece of the pie is accounted for, you may be left with crumbs.</p>
<p>There’s an analogy that’s always used that during a gold rush, don’t go digging for gold but sell the shovels. This same idea is being applied in unique ways within music production these days. In this case, rather than trying to strike gold with getting production credits on a gold/platinum song or album, a lot of producers are finding success in recording and selling original sample packs filled with stems, loops, and one-shots of various instruments. Some take it to the next level by selling Virtual Studio Technology (more commonly known as VST) plugins that emulate these sounds. Two of my favorite producers taking this approach are <a href="https://twitter.com/THEK0UNT" class="b link highlight-link">the Kount</a> with his various <a href="https://thekount.sellfy.store/" class="b link highlight-link">sample packs for sale</a> and <a href="https://twitter.com/kaelinellis" class="b link highlight-link">Kaelin Ellis</a> with his sample packs and <a href="https://www.kaelinellis.com/drumsculptr" class="b link highlight-link">Drum Sculptr</a> Ableton Live plugin. Thus, by selling these sample packs and tools for music production, these musicians are enabling other musicians to create music.</p>
<p>Of course, this recipe isn’t necessarily something new. <a href="https://splice.com" class="b link highlight-link">Splice</a> figured this out very early on, enabling musicians to sell their own original samples on a marketplace as a way to monetize their talents. But, as with any marketplace, you will also have a lot of competition for being <strong>discovered</strong> without leveraging marketing. The size of Splice’s store makes it difficult for artists to shine without being featured or promoted. You are also competing against every other artist on the platform. Similar to how we are seeing a renaissance of talented writers building their own newsletters on platforms like <a href="https://buttondown.email" class="b link highlight-link">Buttondown</a> and <a href="https://substack.com" class="b link highlight-link">Substack</a>, over time we will see more and more producers selling their own sample packs, whether it’s via <a href="https://gumroad.com" class="b link highlight-link">Gumroad</a> or <a href="https://sellfy.com" class="b link highlight-link">Sellfy</a>.</p>
<p>With the power of social media, these producers have figured out a great recipe for marketing their sample packs. There’s no need to pay for targeted ads or anything in order to sell these sample packs, Kaelin and the Kount have figured out the recipe for plugging their products – beat videos. Both of these producers are talented in their own right, so they can keep on sharing their beats and videos of them in the studio, which frequently go viral. The only difference is that instead of plugging their Soundcloud, all they have to do is plug their sample packs and tools. The effect of this can be way more targeted than traditional advertisements. Other music producers are following these artists. When these beat videos are posted, they are then retweeted and shared throughout Twitter, spreading to other music producers. And of course, a network effect takes off.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">If you want percussion sounds, I recorded 60 one shots of them in this pack ⚡️ <a href="https://t.co/VjXzno9P1c">https://t.co/VjXzno9P1c</a></p>— THE KOUNT (@THEK0UNT) <a href="https://twitter.com/THEK0UNT/status/1431021775828234245?ref_src=twsrc%5Etfw">August 26, 2021</a></blockquote>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">like the sounds? check out my packs! i got a new volume brewing soon <a href="https://t.co/gYM6XmIb4W">https://t.co/gYM6XmIb4W</a></p>— KAELIN ELLIS (@kaelinellis) <a href="https://twitter.com/kaelinellis/status/1432713928023412743?ref_src=twsrc%5Etfw">August 31, 2021</a></blockquote>
<p>At least for them, this recipe has definitely worked. Don’t believe me? I just take Madlib’s word for it.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">THE KOUNT 🔥🔥</p>— Madlib (@madlib) <a href="https://twitter.com/madlib/status/1332403493961748481?ref_src=twsrc%5Etfw">November 27, 2020</a></blockquote>
<p>As other music producers start using these sample packs, it’s not uncommon to see them plugging some of their favorite sounds from the sample packs on social media as well. And we’re also seeing other producers wise up to the game.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">MONTE BOOKER SOUNDS<br><br>ALL MY FAVORITE SOUNDS IN ONE PLACE<a href="https://t.co/cll2hIfFYg">https://t.co/cll2hIfFYg</a><br><br>LOVE YALL 🤎 <a href="https://t.co/yXi9LEzKXh">pic.twitter.com/yXi9LEzKXh</a></p>— monte booker (@montebooker) <a href="https://twitter.com/montebooker/status/1356350916664782849?ref_src=twsrc%5Etfw">February 1, 2021</a></blockquote>
<p>I’m pretty excited with the way music technology is evolving these days, not just in the hardware front but also in the software front. More and more affordable tools and products are being sold to enable others to take the leap into music production. No longer do you need to have some expensive DAWS to make music, when you can buy <a href="https://www.koalasampler.com/" class="b link highlight-link">Koala Sampler</a> for a few bucks and make beats directly from your smartphone. Or you can leverage free options such as <a href="https://serato.com/studio" class="b link highlight-link">Serato Studio</a> to cook up beats as well. With so many tools being offered for music production, folks are going to need a lot of sounds and samples to use in their music. What a wonderful time to be a music producer.</p>
On Learning and Creativityhttps://iheanyi.com/journal/2020/09/13/on-learning-and-creativity2020-09-13T22:21:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Creativity is something that I feel I’ve never really understood as a concept, I really viewed a “creative” as somebody who knows how to create works of art through various mediums, whether it is music, film, photography, artwork, dancing, or even theatre. As somebody who really never excelled at “creative” things, I never really viewed myself as a <em>creative</em> person. Who really is a “creative”? I have a lot of friends who are talented musicians, artists, designers, photographers, you name it. Before, I thought these folks as being a gold standard of “creative”. But quite frankly, my feelings have started to shift because I do not think that being creative stems from the <em>proficiency</em> of what you creating, but merely the regular act of creating. </p>
<p>So I decided to take a stab at improving my creativity.</p>
<p>My adventure into discovering my creative side began with the pandemic. Back in March when the entirety of New York City closed down and the quarantine started, I decided to seriously start learning how to make music. I used to use <a href="https://ableton.com" class="b link highlight-link">Ableton</a> in college to chop samples / make music mixes, but I never really produced any tracks seriously or tried to really learn how it works. During the quarantine, Ableton was having a 30% sale on their software, so I decided to pull the trigger and get both Ableton Live Suite and a <a href="https://www.ableton.com/en/push/" class="b link highlight-link">Push 2</a>, a MIDI controller that integrates with Ableton. Little did I know that this would trigger something inside of me. As I started this new hobby, I really had this internal fear of “failure”. Even though it was just a casual hobby, I still thought I could fail at being a producer with my music not being good enough or the songs not sounding like the type of producer I wanted to be. I was expecting to be as good as <a href="[https://www.youtube.com/watch?v=ownXgkMQv8g](https://www.youtube.com/watch?v=ownXgkMQv8g)" class="b link highlight-link">J Dilla</a>, <a href="[https://www.youtube.com/watch?v=tkFOBx6j0l8](https://www.youtube.com/watch?v=tkFOBx6j0l8)" class="b link highlight-link">Kanye West</a>, or <a href="[https://www.youtube.com/watch?v=8tXqw4xKMzg&list=PLOl2cf7NAZ65rcbVwN5sbPIJknp96UW1v&index=8&t=0s](https://www.youtube.com/watch?v=8tXqw4xKMzg&list=PLOl2cf7NAZ65rcbVwN5sbPIJknp96UW1v&index=8&t=0s)" class="b link highlight-link">Madlib</a> from the jump, which is unrealistic. But, then I remembered a wise quote by Jake from Adventure Time.</p>
<p><img src="https://i.kym-cdn.com/photos/images/newsfeed/001/141/641/6dc.gif" alt="Jake from Adventure Time" /></p>
<p>The irony of learning how to produce music is that it has taught me a variety of things that aren’t necessarily music-related, but stemming from this journey in growing creatively. </p>
<p>It taught me patience, because I’ve had to sit and chop samples and arrange them to sound just right, and adding various layers onto a song. It taught me how to be nicer to myself, because I had to recognize that I was still learning and the growing that I was doing and that I am still learning. </p>
<p>It taught me delayed gratification, especially as I stuck with it and listened to songs from the beginning of the journey as I kept on growing and noticing the elements that have gotten better. Seriously, take a listen to these two songs below and see for yourself. Here’s the first beat I made back in March:</p>
<p><iframe class="mv2" width="100%" height="300" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/804184693&color=%23ff5500&auto_play=false&hide_related=true&show_comments=false&show_user=true&show_reposts=false&show_teaser=false&visual=true"></iframe><div style="font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;"><a href="https://soundcloud.com/kwuchu" title="bodega milk" target="_blank" style="color: #cccccc; text-decoration: none;">bodega milk</a> · <a href="https://soundcloud.com/kwuchu/waitin" title="(w)aiting" target="_blank" style="color: #cccccc; text-decoration: none;">(w)aiting</a></div></p>
<p>And here’s one from last month:</p>
<p><iframe class="mv2" width="100%" height="300" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/876600895&color=%23ff5500&auto_play=false&hide_related=true&show_comments=false&show_user=true&show_reposts=false&show_teaser=false&visual=true"></iframe><div style="font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;"><a href="https://soundcloud.com/kwuchu" title="bodega milk" target="_blank" style="color: #cccccc; text-decoration: none;">bodega milk</a> · <a href="https://soundcloud.com/kwuchu/iloveyou-demo" title="i.love.you" target="_blank" style="color: #cccccc; text-decoration: none;">i.love.you</a></div></p>
<p>It taught me self-compassion, because it’s normal not to be good at something immediately, that’s the first step in the growing process. </p>
<p>It taught me community, as I started a <a href="[https://twitter.com/kwuchu/status/1262418343987945474](https://twitter.com/kwuchu/status/1262418343987945474)" class="b link highlight-link">Discord community for music producers</a>, where we push each other to grow, offer feedback, and collaborate on things together.</p>
<p>It taught me curiosity. Music has so many layers to it, the software is just one layer. It becomes more involved with music theory and piano theory, but I’m happily going down the rabbithole of learning so many new things.</p>
<p>And lastly, it taught me creativity. I did not think I was really a creative person before, and while I don’t feel I’m as creative as my other friends, I do know that I have a creative part of my brain that can produce things other than just software.</p>
<p>If you’re thinking about exploring your creative side and started something, whether it’s music, painting, writing, photography, cooking, fashion, whatever it is, do not let the fear of “being bad” hold you back. Even your favorite musicians started from somewhere, nobody is born immediately knowing how to play an instrument. Do not be afraid to take that first step. And if you do take that step into finding your creativity, here are a few tips that I have for you to get the most out of your learning:</p>
<ol>
<li><strong>Document your growth.</strong> This allows you to have an objective point of reference for when you are doubting yourself and think you aren’t improving. After awhile, you will start to see the improvements.</li>
<li><strong>Practice regularly</strong>. When I first started, I was practicing regularly. When I say regularly, I literally mean I was chopping a sample and flipping a track pretty much every single day, or at least working on one every day. This regularity for 3 months helped my growth a lot. I kind of get the dedication that Kanye put into growing himself as a producer when he rapped about “5 beats a day for 3 summers”.</li>
<li><strong>Be patient and kind with yourself.</strong> A lot of people, myself included, are used to having external validation from their jobs/careers and may not be used to not being proficient at something. It’s okay to suck. There’s nowhere to go but up from here.</li>
<li><strong>Ask for feedback from friends.</strong> If you’re comfortable with it, ask for feedback from your friends that have the creative skills you’re trying to improve. That feedback will allow you to refine your focus and know what areas you can grow with, while also allowing you to know which areas are your strongest parts. I realized the weakest part of my songs were basslines and also drums, so I focused a lot more of time into that. But when it comes to sampling, I have been really good at that from the jump.</li>
<li><strong>Have fun.</strong> I can’t stress the importance of this enough. This is a hobby and it should be low-stakes. Don’t view “being the best” as the means to the end, but rather letting the learning and enjoyment be enough. I guarantee that so long as you enjoy it, you will stick with it.</li>
</ol>
<p>If you’re thinking about learning a new skill, especially something creative, or you just want to talk about music production, feel free to shoot me a message <a href="https://twitter.com/kwuchu" class="b link highlight-link">on Twitter</a>. I wish you the best of luck in your creative journey and I hope that you can discover or grow your creative side!</p>
<p><em>Thanks to <a href="https://twitter.com/justinmduke" class="b link highlight-link">Justin Duke</a> for reading over a draft of this blog post and providing feedback!</em></p>
Dynamic Page Titles in Djangohttps://iheanyi.com/journal/2020/04/04/dynamic-page-titles-in-django2020-04-04T18:48:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Often in a web application/website, you want each page or view to have a title that semantically describes what the current page is showing. In a web application, these may be dynamic titles, based on some attribute of the primary model being displayed on the page. I recently encountered this problem while working on the new version of <a href="https://seeker.company" class="b link highlight-link">Seeker</a>, but I did not find that many appealing solutions through my usual Google/StackOverflow search. After a little bit of thought and trial and error, I ended up coming with a pretty good mixin-based solution.</p>
<p>First, you should make a <code>base.html</code> file that all your other templates inherit from and add the following to the <code><head></head></code> section.</p>
<div class="highlight"><pre class="highlight html"><code><span class="c"><!-- Assuming this is in a template called `base.html` that gets inherited by other templates --></span>
<span class="nt"><title></span>
{{page_title}}
<span class="nt"></title></span>
</code></pre></div>
<p>This is saying that whatever exists at the <code>page_title</code> attribute in the <code>context</code> object will be the title of the page. Now, let’s create a mixin for our views that will set this <code>page_title</code> attribute.</p>
<div class="highlight"><pre class="highlight python"><code><span class="k">class</span> <span class="nc">PageTitleMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_page_title</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"page_title"</span><span class="p">,</span> <span class="s">"Default Page Title"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">().</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s">"page_title"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">get_page_title</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">return</span> <span class="n">context</span>
</code></pre></div>
<p>This gives us two ways of defining a page title for our views that use this mixin.</p>
<ol>
<li>Define a <code>page_title</code> attribute on the class.</li>
<li>Override <code>get_page_title</code> to dynamically set the page title.</li>
</ol>
<p>Now that we got this mixin defined, let’s actually use it.</p>
<div class="highlight"><pre class="highlight python"><code><span class="c1"># Renders "Static Page Title" as the page title
</span><span class="k">class</span> <span class="nc">StaticPageTitleView</span><span class="p">(</span><span class="n">PageTitleMixin</span><span class="p">,</span> <span class="n">View</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s">"index.html"</span>
<span class="n">page_title</span> <span class="o">=</span> <span class="s">"Static Page Title"</span>
<span class="c1"># Renders "Default Page Title" as the page title
</span><span class="k">class</span> <span class="nc">DefaultPageTitleView</span><span class="p">(</span><span class="n">PageTitleMixin</span><span class="p">,</span> <span class="n">View</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s">"index.html"</span>
<span class="c1"># Renders "Some Model Attr" as the page title
</span><span class="k">class</span> <span class="nc">DynamicPageTitleView</span><span class="p">(</span><span class="n">PageTitleMixin</span><span class="p">,</span> <span class="n">DetailView</span><span class="p">)</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s">"index.html"</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">OurModel</span> <span class="c1"># assume that it has an attribute called `title`
</span> <span class="n">context_object_name</span> <span class="o">=</span> <span class="s">"model"</span>
<span class="k">def</span> <span class="nf">get_page_title</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
<span class="k">return</span> <span class="n">context</span><span class="p">[</span><span class="s">"model"</span><span class="p">].</span><span class="n">title</span> <span class="c1"># Assume this returns "Some Model Attr"
</span></code></pre></div>
<p>Lastly, let’s say you have another mixin that dynamically populates the context and you want to use that as the default value. That’s possible too, we just need to make some minor tweaks to our mixin code. Check this out.</p>
<div class="highlight"><pre class="highlight python"><code><span class="k">class</span> <span class="nc">PageTitleMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_page_title</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">"page_title"</span><span class="p">,</span> <span class="n">context</span><span class="p">[</span><span class="s">"user_settings"</span><span class="p">].</span><span class="n">site_title</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">().</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s">"page_title"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">get_page_title</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">return</span> <span class="n">context</span>
<span class="c1"># We want to inject the `user_settings`object into every single context.
</span><span class="k">class</span> <span class="nc">UserSettingsContextMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">().</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="n">subdomain_user</span>
<span class="c1"># assume the user has a settings object with a title attribute
</span> <span class="n">context</span><span class="p">[</span><span class="s">"user_settings"</span><span class="p">]</span> <span class="o">=</span> <span class="n">user</span><span class="p">.</span><span class="n">settings</span>
<span class="k">return</span> <span class="n">context</span>
<span class="c1"># Use another mixin to encapsulate all mixins for our page.
</span><span class="k">class</span> <span class="nc">PageMixin</span><span class="p">(</span><span class="n">PageTitleMixin</span><span class="p">,</span> <span class="n">UserSettingsContextMixin</span><span class="p">):</span>
<span class="k">pass</span>
<span class="c1"># Renders "Some User's Title" as the page title
</span><span class="k">class</span> <span class="nc">DefaultPageTitleView</span><span class="p">(</span><span class="n">PageMixin</span><span class="p">,</span> <span class="n">View</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s">"index.html"</span>
</code></pre></div>
<p>And that’s it! The nice thing about this mixin pattern is that you can extend this to other <code>meta</code> attributes in the page as necessary as well. I hope this was helpful! Do you have a different way of dynamically handling page titles in Django or have any questions? Feel free to let me know on <a href="https://twitter.com/kwuchu" class="b link highlight-link">Twitter</a>!</p>
Building My First Gaming Computerhttps://iheanyi.com/journal/2020/04/03/building-my-first-gaming-computer2020-04-03T20:26:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>You know, it’s been my dream to build a gaming computer for a while. I had talked about it with friends jokingly for a minute, but back in January, I finally sat down and made it happen. I haven’t used Windows in almost 10 years, since my freshman year of University, but during that time, I also switched to using macOS. I came to fall in love with the UNIX environment that macOS provides, while also being able to use macOS for my design classes. The design school labs all had Mac Pros in them, which was pretty dope, and I wanted to make sure that I kept my workflow the same between both of them. Now, fast forward to the present, I finally had some extra cash that I could use to build a pretty sick gaming computer.</p>
<p>When I was taking notes on what kind of computer I wanted, I outlined the following criteria.</p>
<ol>
<li>I wanted to experiment with an AMD build, given the awesome reviews I’ve heard about their CPUs.</li>
<li>I wanted to have a top of the line GPU. I couldn’t bring myself to actually shell out the dough for a 2080 TI, but, I figured that the 2070 TI would be good enough.</li>
<li>As a frequent lurker of the <a href="https://reddit.com/r/sffpc" class="b link highlight-link">sffpc subreddit</a>, I wanted to have a small form factor case. I actually had bought a <a href="https://www.dan-cases.com/dana4.php" class="b link highlight-link">Dan Case A4 v2</a> back in 2018 or so, but once against procrastinated on actually buying parts for it. So, I was fortunate to already have this case lying around.</li>
</ol>
<p>With that, I started doing my research and asking my friends. My buddy <a href="https://twitter.com/jedmund" class="b link highlight-link">Justin</a>, was an amazing source of knowledge and also helped me figure out minor details I missed while making my parts list. After a day or so of research and messing around, I finally had a <a href="https://pcpartpicker.com/b/ygYTwP" class="b link highlight-link">finalized parts list</a> and we were ready to order and build.</p>
<p><img src="../../../../../assets/images/gaming-computer/parts-199ecb90.jpg" alt="My collection of computer parts" /></p>
<p>With the parts all ordered, it was time to get building! The first thing was getting the CPU installed in the motherboard properly. For the motherboard, I went with the <a href="https://www.gigabyte.com/us/Motherboard/X570-AORUS-PRO-WIFI-rev-1x#kf" class="b link highlight-link">X570 Aorus Pro Wifi Motherboard</a>, primarily because it was the one I found that was AMD-compatible and also had a Wifi card built into it.</p>
<p><img src="../../../../../assets/images/gaming-computer/motherboard-unboxed-084995ea.jpg" alt="X570 Aorus Pro Wifi Motherboard" /></p>
<p>For the CPU, I ended up going with the <a href="https://www.amd.com/en/products/cpu/amd-ryzen-7-3800x" class="b link highlight-link">AMD Ryzen 7 3800X</a>, it seemed to have the best balance of both price and performance that I was looking for in a CPU, which was perfect.</p>
<p><img src="../../../../../assets/images/gaming-computer/amd-cpu-boxed-9cf0bb8d.jpg" alt="AMD Ryzen 7 3800X Boxed" /></p>
<p>First things first, it still amazes me how much power is installed in such a tiny little square. This tiny little thing is responsible for some hardcore computing power? It blows my mind. It was also quite easy to install, just dropping it in the relevant square and you’re finished.</p>
<p><img src="../../../../../assets/images/gaming-computer/cpu-installed-motherboard-d73414e6.jpg" alt="CPU installed in motherboard" /></p>
<p>I had my first hitch with the build because I ordered the wrong <a href="https://noctua.at/en/nh-l9i" class="b link highlight-link">Noctua Fan</a> that I purchased had the wrong mounting brackets. I didn’t realize the “i” in that stood for Intel. But, luckily, my CPU came with a stock fan, so I ended up just installing that temporarily and figuring out the fan situation later. Afterwards, installing the memory was the easy part, you just click those bad boys in and you’re good to go.</p>
<p><img src="../../../../../assets/images/gaming-computer/cpu-fan-installed-41c3dfcc.jpg" alt="Stock CPU fan installed" /></p>
<p>With the motherboard pretty much all put together, it was time to start putting it together in the case. Like I mentioned earlier, I had a <a href="https://www.kickstarter.com/projects/33753221/dan-cases-a4-sfx-v2-an-ultra-compact-sff-case" class="b link highlight-link">Case Case A4-SFX v2</a> that I had ordered from Kickstarter years ago, but never ended up using…until now. It was literally collecting dust in my closet for years. So, it was time to get installing. First thing I installed in the case was the power supply unit, because that’s where everything was going to be hooked up into.</p>
<p><img src="../../../../../assets/images/gaming-computer/psu-installed-90e8c722.jpg" alt="Case with PSU" /></p>
<p>Afterwards, I went ahead and started installing and mounting the CPU and my graphics card. Rather than buying a 2080, I went with the <a href="https://www.evga.com/products/product.aspx?pn=08G-P4-3071-KR" class="b link highlight-link">RTX 2070 Super Black</a> because I figured that would be good enough for gaming at high graphics at a 1440p resolution. I kind of did the whole “draw an owl” meme here and forgot to actually take photos of this in-between process of installing these parts.</p>
<p><img src="../../../../../assets/images/gaming-computer/pc-standing-6482bc1a.jpg" alt="Finished computer build" /></p>
<p><img src="../../../../../assets/images/gaming-computer/draw-an-owl-be3375aa.jpg" alt="Step 1, draw two circles. Step 2, draw the rest of the fucking owl." />
<em>Step 1, draw two circles. Step 2, draw the rest of the fucking owl.</em></p>
<p>As you can see, I had a computer up and running, even though it looks like a time machine of sorts. And there was no way in hell that my computer was going to close with that big ass fan protruding. But, this was enough for me to get the machine up and booting and start gaming on it, which was great. After a couple of weeks, Noctua actually ended up releasing an AMD version of the original fan I purchased, and even better, <a href="https://noctua.at/en/nh-l9a-am4-chromax-black.html" class="b link highlight-link">it was all black</a>. I ordered it and received it with two day shipping quite quickly, and wasted no time in installing it.</p>
<p><img src="../../../../../assets/images/gaming-computer/pc-proper-fan-0b043222.jpg" alt="Final PC Build with the right fan" /></p>
<p>Honestly, because of how sloppily my cables are connected, I wasn’t able to close the case on the side of the CPU. And plugging things into this computer was quite painful because the case is small and I don’t have small hands. So, for now, the case runs while being opened up. Eventually, I will actually get some better cables for the case and redo the cabling, but for now, I don’t care so long as it runs. </p>
<p>It feels good to finally be gaming on a computer and I am also excited to do more programming on my Windows machine. I’ve had this computer for almost 3 months now and I’m using it for both gaming and working on my non-work related code. I’ll have to talk more about my experience programming on Windows in a separate blog post though, because I have a lot of thoughts on it! But, in the meantime, enjoy <a href="https://www.youtube.com/watch?v=j0PPcUUtHlw" class="b link highlight-link">this video</a> of me and <a href="https://twitter.com/shanselman" class="b link highlight-link">Scott Hanselman</a> getting WSL up and running on my new Windows box. Thanks for reading, feel free to reach out to me on <a href="https://twitter.com/kwuchu" class="b link highlight-link">on Twitter</a> with any Windows 10 tips that you may have or to talk more about building a computer.</p>
Reflections on 2019https://iheanyi.com/journal/2020/02/06/reflections-on-20192020-02-06T23:02:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>I am so late to the party in writing and publishing this article, but hey, better late than never. This year was a somewhat busy and interesting year, mostly focused on things outside of programming and work.</p>
<h2>What happened?</h2>
<h3>Traveled to Canada, Kenya, Ghana, Japan (again), and Nigeria (again)</h3>
<p>Last year, I was fortunate enough to be able to travel to five countries, three of them being completely new to me – Canada, Kenya, and Ghana. Honestly speaking, the most interesting trips were Japan (huge fan of Japanese culture, like the weeb I am, also the food is amazing) and going to Nairobi, Kenya and Accra, Ghana. What fascinated me the most about Nairobi was how the innovation that comes from their tech industry. I had the honor of helping mentor participants of a hackathon at Nairobi Tech Week, and I noticed a few common themes around folks choices. </p>
<p>1) Folks are really into agricultural technology. The most interesting idea that I saw was “Airbnb but for arable land” (I learned what arable meant from that team). Basically, being able to book available land for farming through an app for an extended period of time, optimized based off of previous crops, etc. </p>
<p>2) <a href="https://en.wikipedia.org/wiki/Unstructured_Supplementary_Service_Data" class="b link highlight-link">USSD</a> is a popular choice for building out the front-end for mobile applications rather than native apps. Why? Because it works with feature (a.k.a dumb) phones, not only smartphones.</p>
<p>I thoroughly enjoyed my time in both Nairobi, Kenya and Accra, Ghana. All of the folks in both cities were warm and welcoming and mad kind. It was interesting going back to Nigeria this year, especially given that I had <a href="https://twitter.com/kwuchu/status/1205923831388475398" class="b link highlight-link">a</a> <a href="https://twitter.com/kwuchu/status/1206761259313618949" class="b link highlight-link">few</a> stressful incidents, so needless to say, I’ve gotten my fill of my motherland for a few years. My blood pressure will thank me.</p>
<p>As usual, Japan was amazing. I’m always amazed by the quality of the establishments there, the food, the culture (fashion, art, architecture), and just general vibe of the country as a whole. I was able to go to some new cities this time too (Hokuto and Okayama) and of course, making new friends is always a treat. Shout out to <a href="https://twitter.com/justinmduke" class="b link highlight-link">Justin</a> for being my travel buddy, it was dope.</p>
<p>Montreal was cool, not my speed, but was fun to visit. </p>
<h3>Helped release <a href="https://github.com/features/actions" class="b link highlight-link">GitHub Actions</a> to the world</h3>
<p>Last year, we finally got out of the GitHub Actions beta and made it generally available. I don’t even how to describe the feeling and growth that came from being a part of the team to release this product. Lots of flights, meetings, and code written, but overall I am so proud of being a small part of an amazing product’s release. And the work doesn’t stop there, don’t worry. 2020 has some exciting new features for Actions planned, so stay tuned.</p>
<h3>Started going to therapy</h3>
<p>I started regularly going to therapy last year, going every week unless I was out of town. Quite frankly, I think everybody needs therapy. You may think you are completely healthy, but we all have something that therapy can help us improve upon and gain understanding and clarity with. Honestly, I struggle a lot with feelings of anxiety, lack of self-confidence, and I wanted to improve just my mental and emotional health. My friend Greg recommended his therapist and urged me randomly one day to text him and setup an appointment. I’m forever grateful to him for that, because it’s been life changing. Each session is worth it, unpacking a lot of things from my past that I had buried deep inside of me and gaining a better understanding of myself and how to handle situations. It takes vulnerability and may be uncomfortable, but honestly, if you can afford to go to therapy, please do.</p>
<h3>Weddings, so many weddings (but not my own)</h3>
<p>It seems the older I get, the more weddings I start attending. I went to one in 2017, one in 2018, and three in 2019. For 2020? I have been invited to four, which is wild. People weren’t lying when your late 20s and early 30s just turn into weddings after weddings. That being said, nothing brings me more joy than seeing friends and family members enter an eternal union of love and joy.</p>
<h3>Started on the next version of Seeker</h3>
<p>Honestly, I fell off with working on Seeker, but it’s okay. I was able to get through a redesign, mostly through my homeboy <a href="https://twitter.com/chobberoni" class="b link highlight-link">Corey</a> holding me accountable and stepping in as an interim PM. I’m happy with where the final redesign landed, all that’s left now is to ship it. Stay tuned.</p>
<h2>What did I learn?</h2>
<h3>It’s okay to not work on side projects</h3>
<p>I had a feeling of guilt for not “doing enough” with regards to Seeker or other projects like <a href="https://twoblacknerds.com" class="b link highlight-link">my podcast</a>. But quite frankly, I am getting more and more comfortable with doing nothing, so long as I am happy in lieu of it. We’re constantly fed that we’re always needing to do more, the hustle porn culture is big on this. But it’s okay. You don’t have to do everything. </p>
<h3>It’s okay to set boundaries</h3>
<p>A takeaway from therapy. If you’re a people-pleaser like me and hate the idea of being disliked, you may let people get away with disrespectful things. It’s okay to unapologetically set boundaries and enforce those boundaries. It may suck losing somebody who you thought as a friend, but if you communicate a reasonable boundary and they cross it repeatedly, that’s not a real friend.</p>
<h3>Mental health is just as important as physical health</h3>
<p>Like I mentioned earlier, mental health is quite important. A lot of us think we’re mentally healthy (like me for awhile), but pretty much everybody has some form of emotional scars internally. You may be conscious of them, you may not be, but who we are as adults is shaped by our past experiences, especially from our childhood / developmental years. So, if you are on the fence or scared to go to therapy, I want to make a few things clear. <strong>There is no shame in going to therapy. You are not broken if you go to therapy. Everybody needs therapy.</strong> We don’t really shame folks for going to the gym to improve their health, or for going to the doctor for check-ups. Your mind and emotions are just as important, so take care of them. I’m always happy to answer questions about therapy, so if you’re curious, just <a href="https://twitter.com/kwuchu" class="b link highlight-link">send me a Twitter DM</a>.</p>
<h3>I really want to move to Japan or live there for an extended period of time</h3>
<p>It’s no secret that I love Japan. I don’t speak that much Japanese, but damn, I hope to be able to live there for a little bit of time sometime in the future, hopefully soon. You never know.</p>
<h2>Goals for 2020</h2>
<p>I’m going to do something different this year and not list any intense goals. I want to be a better version of myself, whether it’s mentally, emotionally, or physically. While I’m not (that) depressed, I am feeling like I’m learning more how to find joy in smaller things and beauty in daily life experiences. Here’s to that journey.</p>
<h2>Until next time</h2>
<p>I am looking forward to seeing how 2020 plays out (with some recent events, it’s off to a rough start, R.I.P Kobe), but I am still looking forward to the journey ahead. Happy belated new year folks.</p>
Engineering Products vs. Engineering Primitiveshttps://iheanyi.com/journal/2019/07/12/engineering-products-vs-engineering-primitives2019-07-12T19:13:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Throughout the duration of my career, I’ve noticed that you can divide engineers into two groups, <strong>primitive engineers</strong> and <strong>product engineers</strong>. The primitive engineers enjoy building primitives that are used within various systems. A primitive<sup id="fnref1"><a href="#fn1">1</a></sup> is a building block<sup id="fnref2"><a href="#fn2">2</a></sup> of software that can be used by other pieces of software to build a larger part of a system. Examples of these primitives could be anything from an internal database<sup id="fnref3"><a href="#fn3">3</a></sup>, a rate limiting service, or even something such as a job queuing service. The other group, product engineers, then use these primitives while building out systems and products for their end-users. These engineers are the ones who work more closely with product managers and designers in order to build a product for users.</p>
<p>In my career, I’ve always leaned towards product engineering, because I enjoy being close to the user. When I worked on the Networking Products team at DigitalOcean and helped build the Cloud Firewalls and Virtual Private Cloud products, people often assume that I helped build the firewall and VPC daemons that live on the hypervisors. In reality, other engineers created the primitives that talked to the hypervisors and handled the networking rules. Then my team used these primitives in order to create a product for our users. Our systems had the responsibility of storing and updating the state of things such as firewall rules and making sure they were applied correctly on the hypervisor, while also ensuring that they were correctly being shown back to the user. It’s a joint collaboration between the primitive engineers and the product engineers, everybody has a part.</p>
<p>There is an intersection of product and primitive engineering (often in the cloud computing space), in which a primitive is so valuable internally that it is open-sourced and/or developed into a product for customers. This is how various software and products were released to the public, such as <a href="https://aws.amazon.com/dynamodb/" class="b link highlight-link">Amazon DynamoDB</a>, <a href="https://cloud.google.com/spanner/" class="b link highlight-link">Google Cloud Spanner</a>, and <a href="https://github.com/kubernetes/kubernetes" class="b link highlight-link">Kubernetes</a><sup id="fnref4"><a href="#fn4">4</a></sup>. What makes this intersection interesting is when a primitive is first created but then transforms into a full-fledged product offering, it indirectly causes the primitive engineer to assume a hybrid role as both a primitive and product engineer.</p>
<p>Expanding more on this thought of primitives as a product, a fair amount of SaaS<sup id="fnref5"><a href="#fn5">5</a></sup> that is used within developer tooling can be thought of as a “primitive as a service”. When developing a product, you have the classic “build” vs. “buy” situation for a lot of functionality. Do you have the time to build your own transactional email service? Proably not. <a href="https://mailgun.com" class="b link highlight-link">Mailgun</a>, <a href="https://sendgrid.com" class="b link highlight-link">SendGrid</a>, and <a href="https://postmarkapp.com/" class="b link highlight-link">Postmark</a> are primitives for sending transactional emails. Similarly, <a href="https://stripe.com" class="b link highlight-link">Stripe</a> and <a href="https://braintree.com" class="b link highlight-link">Braintree</a> are primitives for online payments and billing for products. Lastly, <a href="https://aws.amazon.com/s3/" class="b link highlight-link">Amazon S3</a>, <a href="https://cloud.google.com/storage/" class="b link highlight-link">Google Cloud Storage</a>, and <a href="https://azure.microsoft.com/en-us/services/storage/" class="b link highlight-link">Azure Storage</a> are primitives for object storage. Additionally, a lot of these services have been battle-tested and are known to scale<sup id="fnref6"><a href="#fn6">6</a></sup>, so it allows engineers to spend more time focusing on building out the actual system and product. Knowing these primitives exist and how to use them is invaluable to all engineers.</p>
<p>While a lot of the focus of this article has been back-end systems focused, this distinction also applies to the front-end as well. From a front-end engineering perspective, this distinction can also be seen, especially when thinking about <a href="https://www.designsystems.com" class="b link highlight-link">design systems</a>. In various engineering organizations, there normally are entire teams dedicated to maintaining a design system for the user interfaces<sup id="fnref7"><a href="#fn7">7</a></sup>. These front-end engineers responsible for building and maintaining the various components of a design system can be seen as primitive engineers. The front-end engineers who then use these components to build out the user interfaces for their products can be seen as product engineers. In some situations, an engineer may both build and maintain these design system components and build out products<sup id="fnref8"><a href="#fn8">8</a></sup>, thus becoming a hybrid, similar to what we discussed earlier.</p>
<p>As with a lot of things, product and primitive engineering are not mutually exclusive. A product engineer may build a new primitive for their system that does not yet exist, which can then be extracted and reused across an engineering organization. Or, like we discussed earlier, a primitive engineer may create something that evolves into a product. An engineer may be working on both products and primitives at the same time. In conclusion, while there are differences in what product and primitive engineers create, one is not smarter or better than the other. A healthy and successful engineering organization requires a mixture of both product and primitive engineers, who have a symbiotic relationship. What kind of engineer do you think you are: primitive or product?</p>
<p><em>Special thanks to <a href="https://kellysutton.com" class="b link highlight-link">Kelly Sutton</a> and <a href="https://jacky.wtf" class="b link highlight-link">Jacky Alcine</a> for reading early drafts of this post.</em></p>
<div class="footnotes">
<hr>
<ol>
<li id="fn1">
<p>At first thought, “primitive” seems like a misnomer within software given that they usually are not so simple under the hood. <a href="#fnref1">↩</a></p>
</li>
<li id="fn2">
<p>I believe I first read of this definition in <a href="https://stratechery.com/2016/the-amazon-tax/" class="b link highlight-link">The Amazon Tax</a> on Stratechery. <a href="#fnref2">↩</a></p>
</li>
<li id="fn3">
<p><a href="https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf" class="b link highlight-link">Dynamo</a> by Amazon is a good example of this. <a href="#fnref3">↩</a></p>
</li>
<li id="fn4">
<p>Kubernetes has seen a rise in adoption rates within various engineering organizations, so Google created <a href="https://cloud.google.com/kubernetes-engine/" class="b link highlight-link">Google Kubernetes Engine</a>, a hosted Kubernetes option. <a href="#fnref4">↩</a></p>
</li>
<li id="fn5">
<p>Software as a Service. <a href="#fnref5">↩</a></p>
</li>
<li id="fn6">
<p>Of course, this adds risk to a system by adding an external piece of software to the infrastructure, but this still sounds less risky than creating the primitive yourself and ensuring that it scales and stays up. <a href="#fnref6">↩</a></p>
</li>
<li id="fn7">
<p>My current employer, <a href="https://github.com" class="b link highlight-link">GitHub</a>, is an example of this. <a href="#fnref7">↩</a></p>
</li>
<li id="fn8">
<p>I haven’t met anybody yet who has done this extensively, but I am sure they exist. <a href="#fnref8">↩</a></p>
</li>
</ol>
</div>
Lessons from Design School for Software Engineershttps://iheanyi.com/journal/2019/02/03/lessons-from-design-school-for-software-engineers2019-02-03T21:58:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>When I graduated from college back in 2014, I did so with two bachelor’s degrees, one in computer science and the other in design. I was able to do so through the <a href="https://reilly.nd.edu/reilly-dual-degree-in-arts-and-letters-and-engineering/" class="b link highlight-link">Reilly Dual-Degree Program</a>, a five-year program for students to graduate with a degree from the College of Engineering and College of Arts and Letters. I originally chose design because I wanted to learn the necessary design skills in order to improve the usability and appearance of my personal projects. While I originally joined the program to acquire these hard, <em>intrapersonal</em> skills, it was the soft, <em>interpersonal</em> skills and knowledge that proved to be more valuable in my career. I’m here to share these same teachings, so other engineers can hopefully learn from them.</p>
<h2>Lesson #1: You are not your audience</h2>
<p>For various things in visual communication design, you are supposed to keep your audience in mind. This requires extra thinking and nuance when you are designing to keep these people in mind. You are not designing something for yourself, but rather you are designing to communicate something to an audience. How will they interpret it?</p>
<h3>The Lesson for Software Engineers</h3>
<p>Similarly for engineers, when you are building a product, this phrase transforms into “<strong>you are not your users.</strong>” Even though your users can be <em>similar</em> to you, they will never be exactly like you. When you work at companies with a significant global presence, such as Google, this becomes more readily apparent as you have to engineer products for users in both developing countries and developed countries. Never assume that your end-users will be thinking the same thing as you.</p>
<h2>Lesson #2: Constructive, objective feedback is always better than reductive, subjective feedback</h2>
<p>Robert Sedlack, my professor for Visual Communication Design I (who also happened to be my advisor and the driving reason why I decided to join the design program) banned two phrases during critiques in his class – “I like” and “I don’t like”. Rather, he encouraged us to use to give more thorough and substantial feedback by using stronger phrasing with less subjective language. Here are some example phrases:</p>
<ul>
<li>“I think that this is successful because…”</li>
<li>“I don’t think is successful because…”</li>
<li>“The way you did X strengthens this work because…”</li>
<li>“I think that the direction of X is stronger because…”</li>
</ul>
<p>The rationale behind this is because anybody can say, “I like this” or “I don’t like this” and name the first prominent thing that speaks to them in a piece. Through rephrasing the delivery of feedback/critique, we were forced to give a deeper analysis of the design and clearly articulate our reasoning behind our critique. The same communication was expected when we were explaining the directions we were taking for our pieces as well, forcing us to deeply analyze our own work and really think things through.</p>
<h3>The Lesson for Software Engineers</h3>
<p>Constructive and objective feedback and language is helpful for software engineers when doing code reviews. While I believe there’s nothing wrong in using the forbidden phrase “I like how you structured this specific piece of code or solved this problem”, I do think that you shouldn’t use the words, “I don’t like how…” Rather, transform your language to be constructive and objective feedback in code reviews. For example, let’s look at two forms of feedback.</p>
<ul>
<li>“I don’t like the way this code is structured. Use a hash map instead of an array.”</li>
<li>“Have you considered storing it in a hash map instead of an array? I think that might have better performance.”</li>
</ul>
<p>Both have the same underlying message, but the second one has more substance because it contains a <strong>why</strong>, while the first one does not.</p>
<p>Additionally, use this when thinking about defending your implementation decisions in your code. If you are ignoring feedback or suggested changes to your code because “you like doing it this way” instead of an alternative approach, your emotions may be getting the best of you. Step back and ask yourself, “Is this truly the best way this could be done given the requirements, or will this feedback help improve my code?”</p>
<h2>Lesson #3: You are not your designs/work</h2>
<p>Another gem that Sedlack would constantly reiterate is that “you are not your designs”. Meaning, you should not have any sense of ego or personal attachment when it comes to your work. Through learning this, I realized that while it’s great to take pride in your work, you should not attach your sense of self into your work. This is often because once you attach a sense of self or personal attachment into your work, it can become harder to accept criticism of your work and strive to iterate or improve on it. I’ve found that through removing my sense of self and personal attachment to my design pieces, it became easier for me to go back and iterate on my work, to see if I can push it in a stronger direction from feedback from critiques.</p>
<h3>The Lesson for Software Engineers</h3>
<p>I think this is one of the most valuable lessons for software engineers. Too often, both in professional and open-source codebases, there are cases where people attach a sense of self to the code that they write. This makes collaboration way more difficult once somebody’s ego is involved, especially if you think that all the code you write has no room for improvement. Have you ever met somebody who was always against exploring suggested changes to their code in a pull request? Perhaps they got upset if somebody else went in and refactored some code they worked on in the past? Or maybe they get defensive in response to constructive feedback on their code. I personally believe that these all stem from being too attached to your code, so let that go. Through letting it go, you will be more open to iterating and improving upon your code without letting your ego hold you back.</p>
<h2>Lesson #4: Iteration is key for improvement</h2>
<p>While designing, it’s very rare that the first direction you take for a project is going to be the best one. Rather, through iterating and exploring different directions and presenting them during critique, you can use critiques to help you find the strongest direction. Even if you don’t present them for critique, having multiple works to compare to one another can help you find strengths and shortcomings once you have multiple pieces to compare to one another. Once you decide on a solid direction to take for a design, you can keep on iterating on that design and critiquing it until you are sure that it’s at its best form.</p>
<h3>The Lesson for Software Engineers</h3>
<p>Similarly with coding, the first direction that you take with tackling a problem may not be the best way. Many times I’ve coded something up but then realized there’s a more optimal and/or simple way of solving something. During a pull request, a coworker may present an alternative solution that you didn’t think about that is simpler or faster. In the end, these iterations will ultimately help you grow, since you learn something new in the process.</p>
<h2>Lesson #5: Always critique your work</h2>
<p>A common element in all of these previous lessons is critique. The most valuable feedback or ideas for improvement on my design work always came during critiques, whether they are alone or with classmates. During critiques in the classroom, you throw your work up on a board in front of the class, explain the direction you are taking with the piece and the reasoning behind that, and then you open the floor to feedback. Often, my classmates would find things that I had overlooked or help me figure out which directions are the strongest.</p>
<p>Even outside of the classroom, it helped to step away from designing and hold a critique on my own. Asking yourself questions such as, “What does this design do well and what does it not do well? What does it communicate? Is this the message I want to communicate?” Stepping back and critiquing my own work pushed me to create the best piece possible.</p>
<h3>The Lesson for Software Engineers</h3>
<p>As a software engineer, the lesson that I took away from that is that you should always do code review. Even on side projects, it’s not often that I push to the master branch unless it’s a small and quick fix. For most features, I do my work in a separate branch and open up a pull request, even if I’m the only one working on the project. During these pull requests, I go through and review my code myself, to make sure there aren’t any bugs or that I did not miss anything. I even add friends to my side project repos and ask them for code reviews on more complicated features, just to make sure I didn’t miss anything.</p>
<p>At work, while you may need to have a team member review it before merging it in, you should do a passthrough of the code one or two times yourself. You can also use these pull requests to tell the reviewers, “This is the direction I took, but I also thought about doing it this way, thoughts?” This is the same as getting feedback on two directions you may take for a design during critique and it can be useful to have feedback to lead you down the right path.</p>
<hr>
<p>Overall, these are the main things from design school that have been invaluable to my career as a software engineer and I have design school to thank for this. I’m hoping these lessons provide the same value to you.</p>
Reflections on 2018https://iheanyi.com/journal/2018/12/26/reflections-on-20182018-12-26T20:41:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Can’t believe it’s time to write another reflection. This year has been challenging for a myriad of reasons, both professional and personal, but I do think that it was a year of growth nonetheless. It’s easy to forget how many positive things happened in a year until you sit back and actually reflect on it, hence why I always write these blog posts over the holidays at the end of the year.</p>
<h2>What happened?</h2>
<p>This year, a few things happened to me, from launching my most successful side project, speaking at a highly respected conference, to other personal life things such as moving into a new apartment and going through a breakup. All of these forced me to grow in different ways.</p>
<h3>Launched <a href="https://seeker.company" class="b link highlight-link">Seeker</a></h3>
<p>Seeker started off as an idea after I worked on <a href="https://interfacelovers.com" class="b link highlight-link">InterfaceLovers</a> last year. The job board within InterfaceLovers is powered by <a href="https://panda.jobs" class="b link highlight-link">Panda Jobs</a> and after integrating it, I realized that jobs are a pretty unobtrusive but beneficial way for content creators and community organizers to monetize their content/community. It works out for all parties involved. The content creators and community organizers get compensated for the time they spend creating content or building the community. Companies get their job postings in front of a uniquely tailored audience of individuals. Lastly, the readers or members of a community get exposed to jobs that are relevant to them, rather than traditional ads that are enticing users to purchase something or sign up for a service. </p>
<p>Seeker is my most successful side project to date. When it <a href="https://www.producthunt.com/posts/seeker-2" class="b link highlight-link">launched</a> on ProductHunt, it was the #3 product of the day. Since its launch in April, Seeker’s users have made $8,551 through their job boards and Seeker itself has made $3,148.03. This was in line with a goal of mine from <a href="https://iheanyi.com/journal/2018/01/06/reflections-on-2017/" class="b link highlight-link">last year’s reflection</a> where I aimed to increase my passive income. I’m looking forward to working on Seeker more in 2019 and growing its user-base and feature-set where possible.</p>
<h3>Moved into a new apartment with no roommates</h3>
<p>Last year, I also had it as a goal to move into my own apartment. After living with roommates for the last two years, I figured it was time to get my own space and live by myself. Even though apartment hunting in New York City sucks, I happily found an apartment building that I really vibe with and feels like home. Since moving, I’ve noticed better improvements to my mood and also increases to my productivity. There’s something to be said about being able to have your own space without any distractions. Paying the extra money sucks but it’s worth the freedom and peace of mind you get from having your own space. In 2019, I look forward to adding more decorations to it and making it feel more like home.</p>
<h3>Spoke at Strange Loop</h3>
<p>I had the honor of speaking at <a href="https://www.thestrangeloop.com/" class="b link highlight-link">Strange Loop</a> this year, where I gave a talk on “Building a Canary Testing Framework”, based off the canary system I helped maintain while at DigitalOcean. Alex (the organizer) had reached out to me earlier in the year and invited me to submit a CFP. Needless to say, I was honored because Strange Loop is a conference that a lot of people that I respect and admire speak highly of, and it was quite nerve-wracking prepping a talk for it. In the end, it was an amazing conference filled with amazing people and talks and I hope to be able to attend again in the future. If you’re interested, you can check out my talk on <a href="https://www.youtube.com/watch?v=o_itm_xzR4Y" class="b link highlight-link">YouTube</a> and the slides on <a href="https://speakerdeck.com/iheanyi/building-a-canary-testing-framework" class="b link highlight-link">SpeakerDeck</a>.</p>
<h3>Started a new (remote) job at <a href="https://github.com" class="b link highlight-link">GitHub</a></h3>
<p>In August, I started a new job as a Senior Software Engineer at GitHub, working on the new <a href="https://github.com/features/actions" class="b link highlight-link">GitHub Actions</a> product. To be honest, a lot of people I know work at GitHub and a few of them had encouraged me to apply in the past, but Actions was the first product at GitHub that I could really see myself working on. Since joining the Actions team, I’ve already been exposed to so much growth and development. And also, I haven’t been this excited to work on a product in awhile from a work setting. Whether it’s the complexity of the product itself, to the scaling issues we encounter with it, or just the tight deadlines we had to ship the beta version, it’s been a fun challenge since my first day and I’ve loved it. I’m looking forward to 2019 and the future of not only Actions, but GitHub as well. It’s been a great company to work for and I’m loving my productivity as a remote employee.</p>
<h3>Traveled to Berlin (again) and Vienna</h3>
<p>This is nothing major really, I had a work trip to Berlin in March where I got a <a href="https://www.instagram.com/p/Bhtiqx5BGQ8/" class="b link highlight-link">new tattoo</a>. I also decided to head to Vienna after Berlin, where I got to meet with some awesome internet people like <a href="https://twitter.com/mxstbr/status/979671950774632449" class="b link highlight-link">Max Stoiber</a>. I always like visiting Berlin, it’s a dope city and I still recommend that everybody visit if they get the chance. Vienna is also a beautiful city with a lot of history. It’s a bit quieter than Berlin, but it was fun nonetheless to experience and visit.</p>
<h3>Got two new tattoos</h3>
<p>While I was in Berlin, I got a really <a href="https://www.instagram.com/p/Bhtiqx5BGQ8/" class="b link highlight-link">dope tattoo</a> on my left arm by <a href="https://www.instagram.com/agathaschnips/" class="b link highlight-link">Agatha Schips</a> at <a href="https://www.instagram.com/PechschwarzTattoo/" class="b link highlight-link">Pechschwarz Tattoo</a>. The design was inspired by clothes traditionally worn by Igbo women in Nigeria. In New York City, I got <a href="https://www.instagram.com/p/Bnv9ZmOBDD2/" class="b link highlight-link">another awesome piece</a> on my right arm by visiting artist <a href="https://www.instagram.com/anibal_tattoo/" class="b link highlight-link">Anibal Franco</a> at <a href="https://www.instagram.com/bangbangnyc/" class="b link highlight-link">Bang Bang Tattoo</a>. This piece is a tribute to my mother, Angela. I’m not sure if I’ll get new tattoos in 2019, it is tied to me liking an artist’s style and how accessible they are to me.</p>
<h3>Paid off all of my student loans</h3>
<p>In April, I paid off my student loans after calculating how much money I’d have after using my savings to pay them off. I realized that I’d have a decent chunk of savings left after paying them off, so I went ahead and paid off the remaining balance in full. This financial freedom has made it easier for me to save and also feels great being debt-free. I look forward to improving upon my personal finance knowledge and skills and growing not only my savings but also getting more into investing in the new year.</p>
<h3>Went through a breakup</h3>
<p>While 2018 had a lot of positive moments, it also had a few negative moments. One of those was going through a breakup. I don’t really talk much on romantic relationships in the context of this blog, but it was a major event of the year that I’ve had to reflect on throughout the 2nd half of the year. Without going into too much detail, my (now ex) girlfriend of almost 3 years and I broke up back in June. The feeling of getting dumped and the aftermath of breakups really sucked, but I think I’ve grown stronger since the breakup and honestly was able to re-focus attention on myself. It wasn’t the end of the world and life goes on, time helps to heal all wounds eventually. Staying optimistic helped me out a lot and nonetheless, I’m looking forward to what the future holds regardless.</p>
<h2>What did I learn?</h2>
<h3>Tech interviews are demoralizing and not fun, but don’t give up</h3>
<p>I got rejected over <a href="https://twitter.com/kwuchu/status/1031694935878262785" class="b link highlight-link">15 times</a> by a variety of tech companies during this last interviewing cycle. It was really demoralizing to always do well during the practical elements of the interview cycle (such as writing code or doing take-home assignments), but then getting rejected in the final round. But, the key is to not get too down, or rather not let the rejections be a reflection of self-worth. You are not dumb if you get rejected for a job position. Rather, view it as not being a good fit for the position or not being prepared for the interview. The most important thing is to realize what your weaknesses were in the interview (if any) and see if you can improve upon them afterwards. And if you felt like you did really well in an interview and get rejected (this happened to me in some cases), then it probably wasn’t a great fit for you anyways.</p>
<h3>There can always be growth from rejection and failure</h3>
<p>Whether it’s getting rejected after a job interview or getting broken up with, I think that nothing good from just moping around after it happens. In every situation, you can try and learn from it through reflecting on what went well, what did not go so well, and what you could do differently the next time when possible. Through getting rejected from job interviews and going through a breakup, I was able to figure out more about myself upon further reflection and how to improve myself and what my values are for the future.</p>
<h3>Stop procrastinating / perfecting, launch and iterate on your project</h3>
<p>I procrastinated on launching Seeker for the longest because I was scared it wasn’t “perfect” enough to launch. But it was good enough to launch and start providing value to users, so I just made the marketing page and launched it on a whim. The reception was overwhelming and I was able to fix bugs that other users found after launching and gain great feedback from users that I wouldn’t have gained by perfecting Seeker. So stop trying to perfect your product, once you get it in “good enough” shape to provide value, launch and then keep on adding new features. You’ll get great feedback to help you build new features and also be able to delight your users with more features as you build the product.</p>
<h2>Goals for 2019</h2>
<h3>Improve and grow Seeker</h3>
<p>As it exists now, Seeker is a good product, but it could be improved upon in multiple ways. I want to add new features to it and improve on its design in the new year, while also doing more of the sales process to grow its user base and revenue. I’m new to this whole sales process, so it’ll be a learning experience for me.</p>
<h3>Launch a new product (or two)</h3>
<p>I can’t say much, but I will say that I’m working with a really talented individual on something new. It’s been great having a designer/developer hybrid to work with and I’m looking forward to launching a new product with him in the new year.</p>
<h3>Lose 20 pounds</h3>
<p>I always say that I want to get in shape every year but I think that’s too broad of a goal to actually act on. So, rather than having an abstract goal of “get in shape”, I want to lose at least 20 pounds in the new year. That’s all I’m going to say on that. </p>
<h3>Continue to grow and develop myself and interests</h3>
<p>Something I gained a newfound appreciation for in the new year is getting back in touch with interests and hobbies that I forgot I enjoyed. I also just realized that there are a lot of things that I had forgotten about myself or lost sight of. I look forward to regaining focus on myself and improving on myself and hobbies in the new year.</p>
<h2>See you next year!</h2>
<p>Thanks for reading and I hope you all had a wonderful 2018. I also hope that the new year will be great and that you all grow, improve, or do whatever you want to do in the new year as well. If you want to talk to me about anything, such as interviewing, I’m just a <a href="https://twitter.com/kwuchu" class="b link highlight-link">Twitter DM</a> away. Happy New Year!</p>
The G-Unit Stack: Go, GraphQL, and gRPChttps://iheanyi.com/journal/2018/05/12/the-g-unit-stack-go-graphql-and-grpc2018-05-12T20:03:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>One of the technologies that has caught my eye in recent days is <a href="http://graphql.org" class="b link highlight-link">GraphQL</a>. Additionally, I’ve been doing a lot of work with <a href="https://golang.org" class="b link highlight-link">Go</a> and <a href="https://grpc.io" class="b link highlight-link">gRPC</a> at work, so I was curious if there was a way that these technologies could play nicely with one another. Then, it hit me. GraphQL fits really nicely into a service-oriented architecture (SoAs). Before we talk about the role GraphQL plays, let’s get some background on building out SoAs first.</p>
<h2>gRPC & Service-Oriented Architectures</h2>
<p>gRPC is an RPC framework extended from Protocol Buffers that is used for service-to-service communication. gRPC is quite useful for building out services with a specific role and allows you to generate client libraries in any language that can then be imported into another codebase in order to talk with that service. It takes out the need to memorize every URL path for an API, as all the calls are just functions. Now the question is, how do we get that information from the gRPC services to the front-end? This is where an API Gateway comes into play.</p>
<h2>API Gateways</h2>
<p>So, you have all of these separate services, right? Some of them have their own databases and their own data, but generally if you need more information from that service in your codebase, you can call that necessary service as needed through it’s gRPC client. But the question is, how does the front-end present things from these services? Enter the API Gateway. Microsoft has a really <a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/gateway-routing" class="b link highlight-link">good reading</a> on this specific concept, but the general idea is, rather than creating a separate JSON API service for each internal service that you have, you have a single gateway service that can route requests to the relevant service. See this diagram that I drew as reference.</p>
<p><img src="../../../../../assets/images/APIGatewayPattern-6b35a631.png" alt="API Gateway Pattern" /></p>
<p>But Microsoft also has a really good diagram that I think gives a more real-world view of things.</p>
<p><img src="https://docs.microsoft.com/en-us/azure/architecture/patterns/_images/gateway-routing.png" alt="API Gateway Pattern" /></p>
<p>So looking at these diagrams, let’s say that the gateway is normally implemented as a JSON API. And then that JSON API just calls each relevant gRPC service as necessary. Then it can be converted back to the relevant JSON response for the consumer. But when working in complicated architectures, this can easily get messy in itself. For example, imagine the cart service is called by the checkout service. There’s two ways one could display this information. There can be two separate API calls by the client to get the cart information and show it in the checkout page. Or, the checkout page can call the cart service internally and return that back to the gateway, but that seems kind of messy to do every single time. So how do we fix this? Well, this is where GraphQL comes into play.</p>
<h2>GraphQL as the API Gateway</h2>
<p>The beauty of GraphQL is that the queries are made for getting the exact data that the client needs. Thinking about this from a microservices perspective, this is kind of cool right? If a GraphQL server becomes the API Gateway to our various services, it then can call these services as necessary to resolve the data the front-end needs. Most GraphQL client libraries can handle this automatically, of course with other features such as batching and subscriptions as well. Amazing, right? Additionally, another benefit of GraphQL is that its <a href="http://graphql.org/learn/schema/" class="b link highlight-link">schemas</a> serve as a really good means of enforcing the contracts of our various API services and the information that we need from them. It’s a blessing in disguise, to be honest.</p>
<h2>So why (or why not) Go?</h2>
<p>I think Go is nice in this sense because it feels nice to work with in a mono-repo context. Plus, it has static typing. And lastly, I’m just pretty fond of it. The beauty of gRPC’s language-agnosticism is that your API gateway doesn’t necessarily have to be written in Go. You could use <a href="https://github.com/apollographql/apollo-server" class="b link highlight-link">apollo-server</a> as the API gateway and just call the services from the resolver functions if you really wanted to do so. But I do think that Go has some niceties (such as working with <a href="https://blog.golang.org/context" class="b link highlight-link">contexts</a>) that are nice to haves. But on the other hand, other tooling for GraphQL stuff is definitely Node.js-focused, so it also is understandable why that you’d use Node for the GraphQL server. Use whatever works best for your needs.</p>
<h2>Less talk, more code</h2>
<p>Okay, so you’re probably like, “Iheanyi, I don’t care about all of this thinking you’ve put into it, show me how I can utilize it.” <a href="https://github.com/iheanyi/go-grpc-graphql-simple-example" class="b link highlight-link">Here’s an old repo</a> that shows the underlying concepts about what I’m talking about. I want to come back to this with a more nuanced example, but for now, I think this will do. Feel free to <a href="https://twitter.com/kwuchu" class="b link highlight-link">hit me up</a> if you have any questions though, I’m happy to answer them!</p>
Reflections on 2017https://iheanyi.com/journal/2018/01/06/reflections-on-20172018-01-06T19:47:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Time really does fly by, it’s already that time where we have to write a new
year in when we fill out dates. But, last year was another pretty darn good year
for the books and it makes me excited for what the new year has in store.</p>
<h2>What Happened?</h2>
<p>There was a lot going on in the last year. Between launching a new project,
speaking at a few conferences, and traveling to a lot of countries, I do think
it’s been a year of growth for me in a lot of ways.</p>
<h3>Launched <a href="https://interfacelovers.com" class="b link highlight-link">InterfaceLovers</a></h3>
<p>I created Interface Lovers over the course of two months with <a href="https://twitter.com/timothyachumba" class="b link highlight-link">Timothy Achumba</a> and <a href="https://twitter.com/williamchanner" class="b link highlight-link">William Channer</a>. We launched in May 2017 and to be honest, I was not expecting such positive and huge reception from it. With almost half a million pageviews since May, I’d say that this is the most impressive thing I have ever built. It’s done well since it’s inception and on launch day, it even reached <a href="https://www.producthunt.com/posts/interface-lovers" class="b link highlight-link">#1 on Product Hunt</a> the day it was released and #3 for the week. Traffic to the site has been pretty high and steady, and the content is going to keep on coming.</p>
<h3>Joined a new team at DigitalOcean</h3>
<p>My old team at DigitalOcean, Community and Creative Engineering, got disbanded and I was moved into the Network Pillar at DigitalOcean. On this team, I moved into doing more back-end engineering work and I helped with adding new features to the <a href="https://www.digitalocean.com/products/cloud-firewalls/" class="b link highlight-link">Cloud Firewalls</a> product. This new team has introduced me to a lot of new technologies, like <a href="https://grpc.io" class="b link highlight-link">gRPC</a>, <a href="https://golang.org" class="b link highlight-link">Go</a>, distributed tracing, Prometheus, and the technology goes on and on. While I’m not working on Cloud Firewalls anymore, I am excited to say that I will be working on bringing a Virtual Private Cloud offering to DigitalOcean this year.</p>
<h3>Got a promotion</h3>
<p>This year, I got promoted at DigitalOcean. While this may not be a big deal, I will admit that it’s my first time in my career that I’ve ever promoted, so it’s pretty cool. Plus, with greater titles come greater responsibilities, so I’m pretty excited about that.</p>
<h3>Spoke at JSCamp Romania and Asbury Agile</h3>
<p>I gave a talk at <a href="https://www.youtube.com/watch?v=uAEd7n50ezY" class="b link highlight-link">JSCamp Romania</a> and Asbury Agile on Protocol Buffers and gRPC. JSCamp Romania was my first international conference, which was really exciting to be a part of and I had a blast speaking there. While not international, Asbury Agile was also a really enjoyable conference to speak at as well!</p>
<h3>Visited four countries (three of them new)</h3>
<p>This year, I had the luxury of spending at least a night in four countries: Romania, Germany, the Netherlands, and Nigeria. While it was my first time visiting any of the first three countries, I hadn’t been to Nigeria in 16 years, so I felt like I was visiting a new country. While I can talk about all of the countries I visited, I have to say that my two weeks in Nigeria was my favorite out of all of them. Between seeing extended family, being surrounded and immersed with my people, and also just eating my favorite Nigerian foods for two weeks straight, I have to say that I’m excited to head back to Nigeria. From an entrepreneurial perspective, I do think that there is a lot of opportunity there as well, and I’m excited to do some more exploration around this as well.</p>
<h3>Gained a brother-in-law</h3>
<p>While I didn’t get married, my older sister got married to an amazing man. She’s the first out of my three siblings to get married, and while it was stressful helping her out with the wedding details, I can definitely say that I couldn’t be any happier for our families to come together.</p>
<h3>Created Creative Black, LLC</h3>
<p>I did some light consulting work this year and I realized that it would be best to have an official company to work under. And thus, <a href="http://creative.black" class="b link highlight-link">Creative Black</a> was born. I’m available for some part-time consulting work, you should <a href="mailto:hello@iheanyi.com" class="b link highlight-link">reach out</a> if I can be of assistance to you in the new year. </p>
<h3>Launched my Ember.js Egghead Course</h3>
<p>After a long, anticipated wait, I finally was able to finish my <a href="https://egghead.io/courses/ember-2-fundamentals" class="b link highlight-link">Ember 2 Fundamentals</a> course on Egghead. It literally took me over a year to finish recording and editing these videos. Why? I over-commit to things and I take on more than I should and suck at prioritizing. Reception has been somewhat decent, but not as widely received as I would’ve expected. But nonetheless, it was a great learning experience creating the content and shipping it.</p>
<h3>Got pretty good at Go, amongst other things</h3>
<p>One of my goals for 2017 was to get good at Go. Joining the Network pillar at DigitalOcean with very little experience with Go allowed me to hit the ground running with Go. Needless to say, I’ve grown to love it and writing various projects with it, it’s been a joy to use and is really fun. I’m looking forward to continuing to use Go more both at work and in my personal projects.</p>
<h3>Started teaching at the School of Visual Arts</h3>
<p>Over the summer, <a href="https://twitter.com/gregmihalko" class="b link highlight-link">Greg</a> approached me and asked me if I’d be interested in co-teaching an Interaction Design course at the <a href="http://sva.edu" class="b link highlight-link">School of Visual Arts</a> in Manhattan once a week with him. Given that I enjoy teaching, I excitedly agreed and wow, the first semester went amazing. Seeing the growth from the students’ first projects and final projects was just amazing. And also gives me confidence that what we’re teaching is actually beneficial to their growth.</p>
<h2>What did I learn?</h2>
<h3>gRPC is pretty lit, GraphQL is too</h3>
<p>I’ve never used an RPC framework like Thrift or gRPC before until I started working on the Firewalls product at DigitalOcean. Needless to say, it made a lot of things really clear to me, especially when it comes to building out services and defining their boundaries. Another thing I really like is that when working in a monorepo, working with gRPC is nice because it becomes trivial to use various gRPCs clients in one’s application. If you haven’t used gRPC yet, I highly suggest doing so.</p>
<h3>Closing clients is a tough thing</h3>
<p>I had some small client work done in this past year, but honestly. A lot of clients got cold feet or asked me to lower my rate. I’m not doing consulting work to make a living, I’m just doing it for supplemental income. I do think that I need to improve on pitching the value that I can provide to my clients in order to make them more at ease with my rate. It’s something I really do have to improve on.</p>
<h3>Collaboration makes launching new things easier</h3>
<p>When working on side projects, I definitely find myself burning out somewhat working on them by myself sometimes. Between doing both design and development, it can be a lot for one person to handle. Working on <a href="https://interfacelovers.com" class="b link highlight-link">Interface Lovers</a> made me realize that when possible, collaboration reduces that burden. I was able to work at a faster pace just because Timothy is an amazing designer and provided extensive mocks, thus allowing me to think about the code and only that. Only problem is finding reliable enough people to collaborate with, not everybody wants to work on side projects every day after work.</p>
<h3>Home isn’t only defined by where you live</h3>
<p>My trip to Nigeria definitely started a conversation with my heart. I was born and raised in the United States, but traveling to Nigeria made me feel like I was born there. Granted, I have an American accent still, the warmth of the welcome that I got there was amazing. It definitely felt like a second home to me and I know that I’ll always be welcome there whenever I go.</p>
<h2>Goals for 2018</h2>
<h3>Get a solid routine down</h3>
<p>I haven’t fallen into a solid routine since moving to New York City. I just generally stay at home more often than not, but I do think that having a routine will make me be more active. Solidifying this routine is my biggest goal for 2018.</p>
<h3>Find a new apartment</h3>
<p>While having a roommate has been chill for the last two years, I think it’s time for my own place. Closer to a subway station, in addition to having windows and such in the kitchen so I can get back into the flow of cooking and saving money again. My lease is up in May, so we’ll see how this goes.</p>
<h3>Get a workout plan going</h3>
<p>I think it’s time to explore lifting weights in a serious manner and getting active. I said I would do it in 2017, but that didn’t happen. This year is the year. Right now I’m going to give either Starting Strength or Strong Lifts a try, since they seem to be the most approachable.</p>
<h3>Continue teaching</h3>
<p>Whether it’s on Egghead, at SVA, or on my own, I want to continue teaching and sharing my knowledge with others.</p>
<h3>Launch at least two projects</h3>
<p>I want to launch at least two products this year, some of which I started working on in 2017. I’m looking forward to publicly launching these in 2018, one of them is in the earliest phase and the other one is in the final stages of polish. I’m making excuses for launching the more complete of the two, but I’m working on overcoming that. No more excuses.</p>
<h3>Figure out how to increase my passive income</h3>
<p>Launching projects is definitely cool, but I don’t want to launch anything that does not make revenue anymore. I’m hoping to increase my passive income through products, educational material, and more.</p>
<h2>Until Next Year</h2>
<p>Thanks for reading! Happy New Year everybody, make 2018 an amazing year and I wish you luck on achieving all of your goals and dreams!</p>
Deploying an SPA as a Go Binary Using Webpack and Statikhttps://iheanyi.com/journal/2017/11/22/deploying-an-spa-as-a-go-binary-using-webpack-and-statik2017-11-22T00:24:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>It’s no secret that I’ve been doing a lot of Go work recently and dabbling with some Vue.js here and there. While there are many guides on how to build a single page web application in Vue, React, Ember, <latest JS framework here> and serve it separately via S3 or NGINX, how would one build and deploy the application via Go? I’ve found what I think is a simple way of making this work, so bear with me. For reference, the source to this can be found in the following <a href="https://github.com/iheanyi/go-vue-statik" class="b link highlight-link">repo</a>. This project assumes that you have a working Go environment properly configured and Node.js + <code>npm</code> installed.</p>
<h2>Creating the project structure</h2>
<p>First things first, let’s make our project. Create the project at <code>mkdir -p $GOPATH/github.com/iheanyi/go-vue-statik</code>. After creating this, let’s create a <code>cmd</code> folder with <code>mkdir cmd</code>. By the way, for managing our Go dependencies, we’ll be using <a href="https://github.com/golang/dep" class="b link highlight-link">dep</a>, so make sure you have that installed. Similarly, for front-end dependency management, make sure that you have <a href="https://yarnpkg.com/en/docs/install" class="b link highlight-link">yarn</a> installed as well. </p>
<p>Let’s create our Vue.js project. Make sure you have <code>vue-cli</code> installed by running <code>npm install -g vue-cli</code>. Then switch into the <code>cmd</code> directory by running <code>cd cmd</code> and the Vue.js project by running <code>vue init sampleapp</code>. Go through the project and enable things like Vue Router, Airbnb linting, ES6 modules, and unit tests, then run <code>cd sampleapp && yarn</code> in order to change into the project’s directory and install its dependencies. Also, this will be explained later, but let’s go ahead and build our project by running <code>npm run build</code>. This will build our project via Webpack. If all is well, you should be able to see a directory called <code>dist</code> after running <code>ls -la</code>. </p>
<h2>Getting our files into Go</h2>
<p>All right, so we got our front-end and it’s building properly. Let’s bundle this up in our Go project, yeah? You should still be in <code>sampleapp</code> project. So now, let’s do the go parts, shall we? For this part, we’re going to need to install <a href="https://github.com/rakyll/statik" class="b link highlight-link">Statik</a> by <a href="https://twitter.com/rakyll" class="b link highlight-link">rakyll</a>. Do so by running <code>go get github.com/rakyll/statik</code>. Done? Cool. Ensure that <code>statik</code> is installed by running <code>which statik</code>, if you get some output, that’s a good thing. Let’s generate the <code>statik</code> directory by running <code>statik -src=./dist</code>. If all is fine, you should have a directory called <code>statik</code> in your sample app folder now. Here’s how your <code>sampleapp</code> directory should look like by this point.</p>
<div class="highlight"><pre class="highlight plaintext"><code>.
├── README.md
├── build
├── config
├── dist
├── index.html
├── node_modules
├── package.json
├── src
├── static
├── statik
├── test
└── yarn.lock
</code></pre></div>
<p>Coolio. Okay, so you’re probably wondering, how do we even serve this file up? Well, don’t worry, we’re about to find out.</p>
<p>So in your <code>sampleapp</code> directory that you’ve been hanging out in, let’s create a file called <code>main.go</code>. Here’s what the structure of this file is going to look like.</p>
<div class="highlight"><pre class="highlight go"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
<span class="s">"log"</span>
<span class="s">"net/http"</span>
<span class="n">_</span> <span class="s">"github.com/iheanyi/go-vue-statik/cmd/sampleapp/statik"</span>
<span class="s">"github.com/rakyll/statik/fs"</span>
<span class="p">)</span>
<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
<span class="n">statikFS</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">fs</span><span class="o">.</span><span class="n">New</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="n">staticHandler</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">FileServer</span><span class="p">(</span><span class="n">statikFS</span><span class="p">)</span>
<span class="c">// Serves up the index.html file regardless of the path.</span>
<span class="n">http</span><span class="o">.</span><span class="n">HandleFunc</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span> <span class="k">func</span><span class="p">(</span><span class="n">w</span> <span class="n">http</span><span class="o">.</span><span class="n">ResponseWriter</span><span class="p">,</span> <span class="n">r</span> <span class="o">*</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">)</span> <span class="p">{</span>
<span class="n">r</span><span class="o">.</span><span class="n">URL</span><span class="o">.</span><span class="n">Path</span> <span class="o">=</span> <span class="s">"/"</span>
<span class="n">staticHandler</span><span class="o">.</span><span class="n">ServeHTTP</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="p">})</span>
<span class="n">http</span><span class="o">.</span><span class="n">Handle</span><span class="p">(</span><span class="s">"/static/"</span><span class="p">,</span> <span class="n">staticHandler</span><span class="p">)</span>
<span class="n">http</span><span class="o">.</span><span class="n">ListenAndServe</span><span class="p">(</span><span class="s">":1337"</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div>
<p>Before we begin analyzing, ensure that you have all the relevant dependencies installed by running <code>dep ensure</code>. This will import and vendor all the dependencies your project needs. Now, onto analyzing.</p>
<p>First line of analysis.</p>
<p><code>_ "github.com/iheanyi/go-vue-statik/cmd/sampleapp/statik"</code></p>
<p>We’re importing the generated <code>statik</code> package. Nothing is being exported in this package, but there is some initialization in the <code>statik/fs</code> package being done here, primarily a call to <code>fs.Register()</code> that instantiates the binary data we’ll be calling.</p>
<p>Next lines of business.</p>
<div class="highlight"><pre class="highlight go"><code><span class="n">statikFS</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">fs</span><span class="o">.</span><span class="n">New</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div>
<p>We’re instantiating a new instance of an <code>http.FileSystem</code> here, using the zip data that was defined to the call to <code>fs.Register</code> on import. Lit.</p>
<p>Now, into the final pieces of code.</p>
<div class="highlight"><pre class="highlight go"><code><span class="n">staticHandler</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">FileServer</span><span class="p">(</span><span class="n">statikFS</span><span class="p">)</span>
<span class="c">// Serves up the index.html file regardless of the path.</span>
<span class="n">http</span><span class="o">.</span><span class="n">HandleFunc</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span> <span class="k">func</span><span class="p">(</span><span class="n">w</span> <span class="n">http</span><span class="o">.</span><span class="n">ResponseWriter</span><span class="p">,</span> <span class="n">r</span> <span class="o">*</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">)</span> <span class="p">{</span>
<span class="n">r</span><span class="o">.</span><span class="n">URL</span><span class="o">.</span><span class="n">Path</span> <span class="o">=</span> <span class="s">"/"</span>
<span class="n">staticHandler</span><span class="o">.</span><span class="n">ServeHTTP</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="p">})</span>
<span class="n">http</span><span class="o">.</span><span class="n">Handle</span><span class="p">(</span><span class="s">"/static/"</span><span class="p">,</span> <span class="n">staticHandler</span><span class="p">)</span>
<span class="n">http</span><span class="o">.</span><span class="n">ListenAndServe</span><span class="p">(</span><span class="s">":1337"</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span>
</code></pre></div>
<p>Breaking down what we’re doing here. We’re creating a <code>FileServer</code> from our filesystem that we just defined. The <code>http.HandleFunc</code> function essentially is saying, “For every single URL path, serve up the file server.” This will serve up the <code>index.html</code> page from our <code>dist</code> folder regardless of what path we’re at. Why would we want to do this? Well, since we’re using <a href="https://router.vuejs.org/en/" class="b link highlight-link">vue-router</a>, we can handle routing client-side rather than server-side. How dope is that?</p>
<p><code>http.Handle("/static/", staticHandler)</code> ensures that all of the files that were in the <code>dist/static</code> folder are served up correctly as well. It’s a wildcard match as well, so as long as files are being exported to that directory via Webpack, they’ll load just fine. </p>
<p>Let’s try it all together now? Run <code>go install ./...</code> and then run <code>sampleapp</code> locally. Alternatively, you can also run <code>go run main.go</code>. Then go to <a href="http://localhost:1337" class="b link highlight-link">http://localhost:1337</a> in your browser. If things went properly, you should see the starter Vue.js app that says, “Welcome to your Vue.js App”. How awesome!</p>
<h2>Cleaning this up</h2>
<p>There’s some ways that this could be cleaned up. For one, Vue Router by default uses the <code>hash</code> mode for tracking history. Let’s change it’s mode to <code>history</code>. Open up <code>src/router/index.js</code> and add <code>mode: history</code> to the object input to the Router’s constructor. If all goes well, it should look like this now.</p>
<div class="highlight"><pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">Vue</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">vue</span><span class="dl">'</span>
<span class="k">import</span> <span class="nx">Router</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">vue-router</span><span class="dl">'</span>
<span class="k">import</span> <span class="nx">HelloWorld</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@/components/HelloWorld</span><span class="dl">'</span>
<span class="nx">Vue</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">Router</span><span class="p">)</span>
<span class="k">export</span> <span class="k">default</span> <span class="k">new</span> <span class="nx">Router</span><span class="p">({</span>
<span class="na">mode</span><span class="p">:</span> <span class="dl">'</span><span class="s1">history</span><span class="dl">'</span><span class="p">,</span>
<span class="na">routes</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="na">path</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/</span><span class="dl">'</span><span class="p">,</span>
<span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">HelloWorld</span><span class="dl">'</span><span class="p">,</span>
<span class="na">component</span><span class="p">:</span> <span class="nx">HelloWorld</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">})</span>
</code></pre></div>
<p>Rebuild this file by running <code>npm run build</code> and then running <code>statik -src=./dist</code>. Then, either recompile and run <code>sampleapp</code> and run <code>go run main.go</code>. Try navigating to a random URL in the browser now and notice how it doesn’t redirect anymore and still properly renders the Vue.js application. </p>
<h2>Bonus Round: Go Generators</h2>
<p>Open up the <code>package.json</code> file and modify the <code>"build"</code> command in scripts to be <code>"build": "node build/build.js && statik -src=./dist"</code>. This way, when we run <code>npm run build</code> it will build the assets and compile them into Go. That way, when your binary is built, it will always be updated with the latest assets. Next, open up the <code>main.go</code> file and add the following line on Line 1: <code>//go:generate npm run build</code>. In the end, the file should look like this:</p>
<div class="highlight"><pre class="highlight go"><code><span class="c">//go:generate npm run build</span>
<span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
<span class="s">"log"</span>
<span class="s">"net/http"</span>
<span class="n">_</span> <span class="s">"github.com/iheanyi/go-vue-statik/cmd/sampleapp/statik"</span>
<span class="s">"github.com/rakyll/statik/fs"</span>
<span class="p">)</span>
<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
<span class="n">statikFS</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">fs</span><span class="o">.</span><span class="n">New</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="n">staticHandler</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">FileServer</span><span class="p">(</span><span class="n">statikFS</span><span class="p">)</span>
<span class="c">// Serves up the index.html file regardless of the path.</span>
<span class="n">http</span><span class="o">.</span><span class="n">HandleFunc</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span> <span class="k">func</span><span class="p">(</span><span class="n">w</span> <span class="n">http</span><span class="o">.</span><span class="n">ResponseWriter</span><span class="p">,</span> <span class="n">r</span> <span class="o">*</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">)</span> <span class="p">{</span>
<span class="n">r</span><span class="o">.</span><span class="n">URL</span><span class="o">.</span><span class="n">Path</span> <span class="o">=</span> <span class="s">"/"</span>
<span class="n">staticHandler</span><span class="o">.</span><span class="n">ServeHTTP</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="p">})</span>
<span class="n">http</span><span class="o">.</span><span class="n">Handle</span><span class="p">(</span><span class="s">"/static/"</span><span class="p">,</span> <span class="n">staticHandler</span><span class="p">)</span>
<span class="n">http</span><span class="o">.</span><span class="n">ListenAndServe</span><span class="p">(</span><span class="s">":1337"</span><span class="p">,</span> <span class="no">nil</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div>
<p>Now whenever we’re in <code>sampleapp</code>, we can run <code>go generate</code> in order to build our application. This can come in handy when you are working in a Go ecosystem with other services. Pretty cool, huh?</p>
<h2>Future Possibilities</h2>
<p>While this is a pretty simple example, this can be a really good productivity boost. Since we have things compiled to a binary, it can be deployed anywhere. Deploy it to your Kubernetes cluster, Heroku, or to your dedicated VPS instance (like a DigitalOcean droplet). It’s just a binary, it’ll run anywhere. Also, running it in a Docker container probably will be really easy. What I like about this approach is that I can develop my front-end web app using modern tooling like Webpack Dev Server, but when it comes to building and deploying our application, we can just deploy it like any other Go application. Pretty cool, right? </p>
<p>Additionally, if you have a service like an API service, you can use this same strategy to embed your front-end application within it and deploy it with your API, eliminating the need for things like CORS in production. This approach shouldn’t only be limited to Vue.js with Webpack. It should be applicable to any front-end build system, whether it’s Webpack, Broccoli, Rollup, etc. It’s should be fine regardless of the library/framework you’re using.</p>
<p>I’m interested in hearing alternative approaches to deploying front-end applications in Go applications, feel free to let me know on <a href="https://twitter.com/kwuchu" class="b link highlight-link">Twitter</a>. I’m always a message away. Thanks for reading!</p>
On Friendtorshiphttps://iheanyi.com/journal/2017/08/18/on-friendtorship2017-08-18T18:04:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>I’m not that big of a fan of the word <strong>mentor</strong>. In my opinion, the word sounds overly formal and impersonal and for some reason, I feel like it’s one-sided in terms of perception. One person is donating their time to help the growth of an individual. That being said, I realized that I’ve had individuals make the offers of being “mentors” to me without there being any foundation to our relationship. Essentially, these “mentor/mentee” relationships never really went anywhere and fizzled out. That being said, working at <a href="https://digitalocean.com" class="b link highlight-link">DigitalOcean</a> has given me the opportunity to work closely with really talented software engineers, in addition to becoming friends with them. Rather than considering them mentors, I consider them “friendtors”. Friends who often help frequently as professional mentors. I know I can talk to them whenever about whatever. Sometimes it’s about needing some technical advice or guidance. Sometimes it’s about just something totally random and just a normal conversation that friends have. There’s no expectation of “give” and “take” in the relationship, friends just look out for each other and help them when necessary.</p>
<p>I’m grateful to have this and I didn’t realize the value of friendtorship until I got to work with <a href="https://twitter.com/AntoineGrondin" class="b link highlight-link">some</a> <a href="https://twitter.com/cagedmantis" class="b link highlight-link">really</a> <a href="https://twitter.com/raetoes" class="b link highlight-link">dope</a> <a href="https://twitter.com/bryanl" class="b link highlight-link">people</a>. At my previous job, I had never really spent time outside of work hanging out with my coworkers. There wasn’t room in the office to bond either, with no team events or lunches. But being able to hang out with my coworkers and become friends (not only colleagues), really allowed me to feel more comfortable around them. You don’t become as scared to ask for help and you know that they will be there to help you grow and improve. Additionally, the relationship isn’t only tied to both being at the same company. While some of my coworkers have moved on, we still stay in touch and hang out together. I also know that I can always reach out to them if necessary. This isn’t to say this isn’t possible with mentorship, but I do believe that having that base friendship before letting the mentorship come naturally makes a huge difference.</p>
<p>Friendtorship doesn’t necessarily have to start offline. There are millions of people connected through <a href="https://twitter.com" class="b link highlight-link">Twitter</a> and a plethora of <a href="https://slack.com" class="b link highlight-link">Slack</a> channels out there. Through both mediums, I’ve been able to meet some dope people as well that constantly drop wisdom and knowledge on me that helps me grow as a person. There may be a person you’re friends with who you really respect, ask them if you could meet with them to get some advice or help with something. If you all would hang out with each other normally, there’s probably no reason for them to say no. Good luck!</p>
On Temporalityhttps://iheanyi.com/journal/2017/08/13/on-temporality2017-08-13T14:59:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Something that has been on my mind recently is <a href="https://en.wikipedia.org/wiki/Temporality" class="b link highlight-link">temporality</a>. I graduated from college back in December of 2014 and yet, nothing really seems that distinct about my life since then. From childhood to the end of my college career, there seems to be enough entropy throughout our lives that it keeps life interesting and entertaining. The college years especially, because that’s where most people experience a huge amount of change and (hopefully) growth. </p>
<p>So many memories were made over those years. I remember being a freshman and being nervous moving into my dorm room, my first time living away from home. The trials and tribulations of attending a rigorous University. My first college party. The excitement of turning 21 and being able to legally imbibe alcohol. The memories of popping champagne with the friends I made over 4 years on the steps of the main building on Notre Dame’s campus. Needless to say, it was a successful “college experience”. But, where do we go from there?</p>
<p>These thoughts around temporality first arose after I found myself unhappy at my first job after college. In college, while you may fall into a specific routine, every day is pretty different. Depending on the day, your classes are different. You may have a nightly commitment <em>X</em> days per week, etc. It’s just naturally different. Whereas in the professional world, I really just realized that each week was passing by and the days just melded together. It was hard telling days apart because everything just seemed the same. Wake up, go to the office, sit through meetings, write code, eat lunch, go home, repeat. Before you know it, a year has flown by in a heartbeat and it didn’t even feel like it. Throughout college, you have discrete markers for time passing, such as midterms and finals. These are shared markers for the passage of time. But they are non-deterministic once you escape that academic setting and its often dependent on others.</p>
<p>My older sister, Nneka, got married last June (2017) and that was when this thought of time passing hit me again. It seems like just yesterday me, her, and our other two siblings were fighting, laughing in the car, or playing with one another. It’s weird seeing her married (although my brother-in-law is amazing), because it is that signifier of, “We’re not kids anymore.” In my eyes, events like marriage, childbirth (for a married couple, anyways), and death are constant reminders of the passage of time. Marriage hit close to home because of family and it was a wakeup call that we’re not kids anymore. Childbirth because it’s a signifier of one’s family growing larger, in addition to seeing that growth of a child as a prominent indicator of time and a new beginning. And lastly/sadly, death because it serves as a marker of the end of someone’s time on this earth and the end of the ability to make new memories with said individual. All three of these things are constant reality checks in a young adult’s life to the passage of time and serve as infrequent reminders of time’s passage since the days seem to just blend together now.</p>
<p>Perhaps one can create their own markers of temporality by creating vivid memories through various experiences to bookmark that point in time, I’m not sure of that. What I do know is that our time on this earth is limited, so I think that we should do our best to make the most of it while we are still here.</p>
Lost Patiencehttps://iheanyi.com/journal/2017/03/25/lost-patience2017-03-25T23:59:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Remember back before high-speed internet was a thing? I fondly remember going
outside to the yard and playing various games with my siblings. Whether it’s
soccer or football, with arbitrary plants in the yard being designated as the
goal lines. I also remember other hobbies of mine, such as video games and
sketching. While I still play video games, something I have noticed as my career
has progressed is that outside of programming, I find that I have lost my patience
for refining other skills.</p>
<h2>Why?</h2>
<p>My hypothesis? Unfair expectations. The longer I program professionally, the
more adept I become at it. I think it’s because I’ve spent so long polishing
this skill that I’ve lost the patience for polishing other skills that I may
have been more proficient at in the past. When it comes to starting on a new
programming project, I am able to knock it out within a couple of days if I
am really focused. Yet, when it comes to almost anything else, such as drawing,
music production, or any other thing requiring creativity, I get frustrated with
the gaps in my knowledge or the level I’m at. With programming, I find it easy
to focus on filling gaps in my knowledge. There are various resources online for
filling in knowledge gaps and also, I have good friends and mentors (<em>friendtors</em>,
for short), that will readily answer any questions I may have. For other
hobbies, that’s something I lack now.</p>
<h2>The Solution?</h2>
<p>During college, I used to breakdance and I also used to mess around with Ableton
a little bit. Much like I have friends and mentors for programming now, I had a
lot of friends in college who taught me the ropes and foundations and helped me
practice/refine my craft. Perhaps finding that type of friendtorship once again
will be beneficial. Or perhaps I should just reframe my perspective and remind
myself that Rome wasn’t built in a day. Who knows? It’ll be an interesting
mental obstacle to overcome.</p>
Reflections on 2016https://iheanyi.com/journal/2017/01/07/reflections-on-20162017-01-07T22:22:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Hey y'all, happy new year! This post is a wee bit delayed, but 2016 was a year
of major changes for me, so I figured it’d be good to make another personal
reflection on my life in 2016.</p>
<h2>What Happened?</h2>
<p>2016 was an eventful year.</p>
<h3>Left IBM Watson and joined DigitalOcean</h3>
<p>Back in March, I left my job at IBM Watson and moved to New York City to work
for DigitalOcean. I honestly have to say that this is probably one of the best
decisions I’ve ever made, just because of how much I’ve learned since joining
the company. From leveling up my Ruby and Ruby on Rails skills to learning about
Go and TCP dumps, it’s been a wonderful year and I am so glad that I joined.
There’s still so much for me to learn in this cloud computing space, so I’m
looking forward to what 2017 has to offer.</p>
<h3>Moved to New York City</h3>
<p>Because DigitalOcean is based in Manhattan, I had to move to New York City to
work at headquarters. The Big Apple. The city that never sleeps. New York, New
York. I had visited New York City a couple of times back in 2015 on business
trips and I knew from my first visit that I had to live there at some point in
time in my life. While the initial move has been rough, I’ve been loving my time
in the city.</p>
<h3>Spoke at three conferences</h3>
<p>In 2016, I also spoke at three conferences, <a href="https://www.youtube.com/watch?v=VYfqIWqOKEQ" class="b link highlight-link">NPM
Camp</a>, <a href="https://www.youtube.com/watch?v=iv31dDHCCjM" class="b link highlight-link">MadisonRuby</a>, and <a href="https://www.youtube.com/watch?v=Y3Ta1cshtEY" class="b link highlight-link">Wicked Good Ember</a>. My talks were centered around the lessons learned about deployment while building <a href="https://github.com/iheanyi/ember-cli-deploy-digitalocean" class="b link highlight-link">ember-cli-deploy-digitalocean</a> and it was a fun talk to give. I was also glad I made that plugin because it taught me a fair amount about system administration and deploying applications.</p>
<h3>Traveled to two new countries, Japan and Greece</h3>
<p>I took time in 2016 to travel more, having hit two new countries this
year. In March, I traveled to Tokyo and Kyoto in Japan with my good buddy
<a href="https://twitter.com/rickie" class="b link highlight-link">Rickie</a>, right before I started working at
DigitalOcean. This gave me the time I needed to mentally reset and prepare for a
new job. In December, I went to Athens and Santorini in Greece with my family
and came back to work recharged and ready to code. </p>
<h3>Continued recording episodes of <a href="http://twoblacknerds.com" class="b link highlight-link">Two Black Nerds</a></h3>
<p><a href="https://twitter.com/kwiromeo" class="b link highlight-link">Romeo</a> and I continued recording episodes of our
podcast and I think we reached a pretty good level of traction with
number of listeners. Compared to 2015, there has been a slight increase in
weekly listens, so hopefully we can continue that growth in 2017.</p>
<h2>What did I learn?</h2>
<h3>New York City is a really different way of life</h3>
<p>As much as I love New York City, it was really a huge culture shock for me. I always make the joke that when I first visited New York City, I got more diversity in ten minutes than I did in my entire life. And being born and raised in a city with a population of around 30,000 people, it took me awhile to adjust to the New York City lifestyle. Arguably, I’m still adjusting to it, just because it’s so different and there’s so much for me to learn still.</p>
<h3>When it comes to making decisions, trust your gut</h3>
<p>I wouldn’t have taken this opportunity with DigitalOcean if it wasn’t for my gut
telling me that it’s the right move to make. I knew it was an opportunity to
learn more and that it was the right move for my career. Trust your gut, it
will rarely lead you wrong.</p>
<h3>Marketing is king</h3>
<p>I think the key reason for <a href="http://twoblacknerds.com" class="b link highlight-link">Two Black Nerds</a> growth
in 2016 was through better marketing of our episodes. Through marketing the
content through Twitter to relevant accounts/organizations, it helped us tap
into their audiences and gain more listeners. We’re still nailing down this
process, but it was a small observation and hopefully we can use it to grow even
more in 2017! </p>
<h3>How to use many new technologies</h3>
<p>Joining DigitalOcean gave me the chance to learn about a lot of new technologies
that I would have never gotten to learn before, such as
<a href="https://chef.io" class="b link highlight-link">Chef</a>, <a href="https://prometheus.io" class="b link highlight-link">Prometheus</a>, and
<a href="http://kubernetes.io/" class="b link highlight-link">Kubernetes</a>. Additionally, I was also
able to start learning <a href="https://golang.org" class="b link highlight-link">Go</a> and found out that there’s a low
level programming language that I actually like (I don’t miss C).
I’m looking forward to further refining my Go skills in 2017.</p>
<h3>Taking a real vacation can do wonders for your stress levels</h3>
<p>If you have the time and the
money, I highly recommend taking a vacation at least once a year to a new country, because it really did wonders for my mental and emotional state. I had some stressful situations going on in my life throughout the course of the year, but traveling helped ease that stress and put it at the back of my mind. You can peep pictures from my travels on my <a href="https://instagram.com/iheanyie" class="b link highlight-link">Instagram</a>.</p>
<h2>Goals for 2017</h2>
<h3><a href="https://knowyourmeme.com/memes/git-gud" class="b link highlight-link">Git gud</a> at Go</h3>
<p>As mentioned before, I got reintroduced to Go after joining DigitalOcean. I hope
to move towards polishing my Go programming skills in the coming year so I can
be more productive with it. Hopefully, through using it at work and also in side
projects, I will be extremely comfortable with it by the end of the year,
especially for building out back-end services.</p>
<h3>Read at least one book a month</h3>
<p>Moving to New York City has taught me that the subway is the best place to get
reading done, so I’m hoping to read at least a book a month during my commute to
and from work.</p>
<h3>Get Active</h3>
<p>Whether it’s dancing, running, yoga, something physical, I want to start off
small by doing one physical form of exercise per week and hopefully getting into
a better momentum from there. At work, we used to play basketball every
Wednesday and that was killing two birds (socializing and exercising), with one
stone (or in this case, ball).</p>
<p>…</p>
<p>Here’s to a new year, let’s make it count. I’m looking forward to what 2017 has
to offer. Cheers!</p>
Making New Waves – Goodbye ATX, Hello NYChttps://iheanyi.com/journal/2016/02/16/making-new-waves-goodbye-atx-hello-nyc2016-02-16T00:00:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>A year ago, I started working at IBM Watson on the Watson Life team. I’ve had the privilege of working on innovative projects such as <a href="http://ibmchefwatson.com" class="b link highlight-link">IBM Chef Watson</a> and others in the works. While I’ve had a year filled with personal growth and learning the ins and outs of a large corporation, the time has come for the next chapter in my career. In March, I will be moving to New York City to work at <a href="http://digitalocean.com" class="b link highlight-link">DigitalOcean</a> on the Community Engineering team. I’m going to answer some of the questions I’ve been frequently asked below.</p>
<h2>Why DigitalOcean?</h2>
<p>I mean, have you seen their product? It’s bloody gorgeous. I’ve been a DigitalOcean customer for almost 3 years now and they’ve done nothing but constantly improve the product. When recruiters and individuals from other companies started reaching out to me, I made a promise to myself that I would only work for a company in which I was personally invested as a frequent customer OR one that had a mission that resonated greatly with me. DigitalOcean definitely fit this bill in both regards. I truly believe that the more you’re personally invested in your company, the better your work will be.</p>
<h2>What are you going to miss most about Austin?</h2>
<p>Well, besides no state income tax, mostly always warm and sunny weather, and cheap cost of living, I am definitely going to miss the BBQ here, in addition to breakfast tacos and Torchy’s. Do they have breakfast tacos in New York City?</p>
<h2>Do you plan on moving back to Austin?</h2>
<p>Perhaps, I just know that I can’t buy a house in New York City unless I win the lottery, so I’m gonna have to move somewhere where I can. If Austin fits that bill, then perhaps I’ll move back. We’ll see. :P</p>
<h2>What borough/neighborhood are you going to live in?</h2>
<p>I’m going to be living in Chinatown and SoHo for a couple of months, before moving to Brooklyn. I haven’t figured out which neighborhood in Brooklyn yet, but so far Bed-Stuy and Flatbush are on the radar. If you have any other recommendations for neighborhoods, let me know!</p>
<h2>Are you starting your new job immediately?</h2>
<p>Not really. My last day at IBM Watson is February 26, and while I’ll be moving to New York City March 1st, I’m going to travel for a bit and start at DigitalOcean mid-March. I truly believe it is always good to mentally reset/recharge before starting a new adventure.</p>
<p>…</p>
<p>I want to thank the amazing friends in Austin I’ve made over the last year who have made my time in this city so damn amazing. I’m
really going to miss all of you and I hope that you will come and see me in the Big Apple! Thanks everybody for your support and I’m excited for this next out. I’m definitely looking for new friends.</p>
Reflections on 2015https://iheanyi.com/journal/2015/12/29/reflections-on-20152015-12-29T00:00:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>The year 2015 has been a pretty good year nonetheless and I think it is always good for
one to reflect on their past year and see where they grew, where they fell short, and to start thinking about changes for the next year.</p>
<h2>So what happened?</h2>
<p>Here are my highlights of 2015. </p>
<h3><a href="http://pageunliker.com" class="b link highlight-link">Facebook Page Unliker</a> reached #1 on ProductHunt.</h3>
<p>The first major milestone I had was having one of my weekend side
projects, <a href="http://pageunliker.com" class="b link highlight-link">Facebook Page Unliker</a>, reach #1 on
<a href="https://www.producthunt.com/tech/facebook-page-unliker" class="b link highlight-link">ProductHunt</a>. I wrote a
<a href="https://medium.com/@kwuchu/lessons-learned-from-hacker-news-and-product-hunt-2134266bbab8#.j059vfqul" class="b link highlight-link">Medium post</a> on the lessons learned from this achievement, and the main thing I learned is that even if an application itself is not polished, people will still use it and enjoy it if it solves a real problem.</p>
<h3>Moved to Austin, Texas and started my first job.</h3>
<p>In February, I relocated to Austin and started working at IBM Watson. The most
challenging part of moving to a new city for me is the social aspect. In the
Watson Life team in Austin, I’m the youngest person on the team. The huge age
difference between my coworkers and I made hanging with coworkers outside of
worker kind of difficult. Luckily, I was able to meet people at local meetups,
so if you move to a new city, do not hesitate to use <a href="http://meetup.com" class="b link highlight-link">Meetup</a>! </p>
<h3>Helped launch <a href="https://www.ibmchefwatson.com" class="b link highlight-link">Chef Watson</a>.</h3>
<p>In the workplace, I was part of the team that helped take <a href="https://www.ibmchefwatson.com" class="b link highlight-link">Chef Watson</a> out of beta and into GA as a full-stack developer. Working on Chef Watson taught me how to work better on a team and also helped improve my communication skills since the majority of the team is distributed remotely. I have since moved onto a new project, but I have to say that working on Chef Watson was a blast.</p>
<h3>Spoke at two conferences, FrontPorch and ThunderPlains.</h3>
<p>I was lucky enough to have the opportunity to speak at both <a href="http://frontporch.io" class="b link highlight-link">FrontPorch</a> and <a href="thunderplainsconf.com" class="b link highlight-link">ThunderPlains</a> about Ember.js and Ember-CLI. While I was extremely nervous speaking at FrontPorch, I still think that both talks went extremely well. It definitely gets easier to speak after your first time.</p>
<h3>Launched <a href="http://twoblacknerds.com" class="b link highlight-link">Two Black Nerds</a>.</h3>
<p>I think my biggest accomplishment was launching <a href="http://twoblacknerds.com" class="b link highlight-link">Two Black
Nerds</a> with my buddy
<a href="https://twitter.com/kwiromeo" class="b link highlight-link">Romeo</a>. What started off as just as a
collaborative project for us to keep in touch and have good conversation evolved
into something actively listened to and appreciated by others. It’s been awesome
hearing from our listeners about how much they enjoy our podcast and getting
<a href="https://modelviewculture.com/pieces/an-interview-with-two-black-nerds" class="b link highlight-link">interviewed by ModelViewCulture</a>, and I look forward to recording more episodes with Romeo in 2016.</p>
<h3>Volunteered at <a href="http://www.rootstechnology.info/" class="b link highlight-link">ROOTs Technology</a>.</h3>
<p><a href="http://www.rootstechnology.info/" class="b link highlight-link">ROOTs Technology</a> is an initiative started by my friend <a href="https://twitter.com/ToluVsTj" class="b link highlight-link">TJ</a> that aims to create a space for people of color in technology. TJ asked me if I was interested in volunteering to help teach PoC within Austin how to code. It’s been an amazing experience to see the young and brilliant lives within Austin and how their worlds have changed from being exposed to the world of coding.</p>
<h3>Some other secret things ;D</h3>
<p>I will say that some awesome things are coming in 2016 and I cannot wait to
share the news once the time comes!</p>
<h2>Lessons Learned</h2>
<p>Upon reflecting on my experiences in the past year, here are my key takeaways. </p>
<h3>Your voice matters.</h3>
<p>Two Black Nerds has taught me the importance of visibility from people from
underrepresented groups in the tech industry. We’ve received emails from people
of all ages, some even in high school, stating how they are fans of the show and
asking for general advice. Having somebody to relate to is important and why I
am a huge advocate for increasing racial diversity in tech.</p>
<h3>Work/Life balance is really important.</h3>
<p>Seriously, you may want to be the all-star employee that works 60 hours a week
and zooms through deadlines, but while that is cool and all, it is really
difficult to keep that up without burning yourself out. If you find yourself
constantly taking work home with you or staying late in the office, it may be
good to talk to your project manager about it and see if you can refine the
scope of your tasks better so you aren’t as overwhelmed and/or overworked.</p>
<h3>Make friends outside of work.</h3>
<p>In addition to work/life balance, there’s nothing wrong with making friends
outside of work. In fact, I found this important to do since I am the youngest
member of my team in Austin. Go to meetups and meet other developers there, it’s
good to have a diverse network of contacts. Being a homebody and not hanging out
with anybody outside of work took a toll on my emotional health, so socializing
was definitely a good way of keeping myself in good spirits!</p>
<h3>Put yourself out there. It leads to new opportunities.</h3>
<p>Speaking at conferences took me way out of my comfort zone, but I
had a lot of opportunity for growth through that experience. After giving my
first talk, I was invited to speak again at another conference, so putting
myself out there led to more opportunities. More doors have been opened through
speaking at meetups and conferences than I ever expected. </p>
<h3>Never stop growing and learning.</h3>
<p>Just because I graduated from college, it doesn’t mean that I’ve learned
everything that there is to know about computer science, software development,
or design. There was still much to learn, both inside and outside of the
workplace. Be hungry for knowledge and if you ever feel yourself growing too
comfortable, challenge yourself to learn something new. Be a lifelong student.</p>
<h3>Get active in some way.</h3>
<p>Moving to a job that has you sitting in front of a computer for at least 7 hours
a day definitely takes a toll on your body. Since I’m not constantly walking
between buildings for classes anymore, my step count reduced to around 3500
steps/day. Whether it’s taking walks around lunchtime or maybe running in the
morning/evening, it’s important to get active in some way and take care of your
body.</p>
<h2>Simple Goals for 2016</h2>
<p>I want to use this section to talk more about simple goals of mine in 2016.</p>
<h3>Travel more.</h3>
<p>Traveling is good for creative inspiration. While I flew to a fair amount of
different cities in the United States this year, my goal is to make at least two
international trips in 2016.</p>
<h3>Relax more.</h3>
<p>I was a workaholic in 2015, constantly grinding and not really taking time to
truly relax. Given that I’m only 23, I’m still young and I don’t always have to
be giving 150%. Sometimes you just have to stop and smell the roses. 2016 will
be the year of relaxing more in my free time.</p>
<h3>Invest more.</h3>
<p>And finally, I want to invest more. Whether it is time in myself or money into
stocks or mutual funds, I want to make more investments in 2016. </p>
<p>…</p>
<p>Here’s to a pretty good year in 2015. I’m excited for what 2016 has to offer.
Happy New Year everybody!</p>
On Building Coding Confidencehttps://iheanyi.com/journal/2015/07/10/on-building-coding-confidence2015-07-10T01:31:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>A common complaint that I hear from Computer Science graduates is that their CS classes do not prepare them enough for working in the real world as a Software Developer. Thus, it is not uncommon for people to have a lack of self-confidence in their coding ability. In all honesty, I would argue that no set of Computer Science classes from any school are going to give you self-confidence as a developer. But, the CS curriculum is not the only means for you to improve your software development skills. I would humbly argue that I am proof of this, because while my GPA may not have been the highest amongst my peers, I often found myself more confident as a software developer than my peers. Why? It really comes down to one short and simple rule, <strong>“always be learning”</strong>.</p>
<p>When I say, “always be learning”, I mean to take the time to learn new things outside of the classroom walls. By doing <strong>research</strong> and <strong>side projects</strong> in your free time, you can furhter improve your self-confidence as a developer as you gain knowledge in new areas of computing and work with new frameworks and technologies. Many of the professors, if not all, that teach you your Computer Science courses are involved in some form of research and most likely are looking for fresh undergraduate talent. <strong>Get into an undergraduate research assistant position as soon as possible.</strong></p>
<p>The first Computer Science lab I worked in was the Cooperative Computing Lab during my second semester of my sophomore year, under the Fundamentals of Computing I professor from the previous semester. <strong>It is important to go to office hours in order to establish a relationship with your professor, and ask them about their research</strong>. Trust me, they can talk about it for days and showing the slightest of interest gets your foot in the door and opens up the opportunity. Through this research in distributed systems and computing, I was able to first learn some PHP, but the more valuable skill I acquired was Python through my summer research fellowship with Professor Thain. <strong>In lieu of a summer internship, summer research positions hold just as much opportunity for professional growth and learning</strong>. I felt an increase in coding confidence after that research position, as my research partner and I were able to build a Python tool that automated and distributed the computation of protein folding simulations. Research is cool, do not fear it.</p>
<p>The second Computer Science lab I worked in was in iCeNSA, where I did data mining and machine learning research, in addition to building applications and designing systems for the collection of the data that we will be mining. I acquired this position through my Android side projects, and one of my classmates recommended me to their professor, who needed an Android developer for a project, and I ended up working on other projects as well. Through this project, I was able to gain experience doing Android development, database design, and Django and EmberJS development, while also increasing my theoretical knowledge around Data Mining and Machine Learning. Trust me, working in this research lab had me feeling HIGHLY confident by the time I graduated and had to leave the lab and I attribute this lab experience as another reason why I am always thirsty for knowledge. But, I would not have been able to get this second lab position without showing my qualifications, which I did through side projects.</p>
<p>A lot of people make the excuse that they “do not have time for side projects” during their undergraduate career, but to be honest, <strong>I would suggest making time for side projects. Side projects become a vehicle to teach yourself something that may not be taught in classes</strong>, such as Ruby on Rails, EmberJS, AngularJS, etc. Sometimes, your side projects could even start off small in scope and as study breaks. I created Bandcamp Downloader (https://github.com/iheanyi/bandcamp-dl) as study break, a trivial solution to a problem I had. Similarly, a classmate of mine built a small Python program to scrape the dining hall menu every day and it hooked into the Twilio API and would send him a text message when North or South Dining Hall had one of his favorite meals. While it seems pretty silly, he taught himself Python in order to build this project and he learned something new. Side projects allow you to step outside of your comfort zone, learn something new, and grow as a software developer. <strong>When you finish these side projects, make sure to create a GitHub account (https://github.com/) and upload your side projects there</strong>. This allows you to not only build up a portfolio, but it also serves as a good point of reference for your growth as a developer, so don’t hesitate to put yourself out there!</p>
<p>Small aside, <strong>hackathons are a good way of getting your skills up and knocking out a project over a weekend</strong>. Get your homework done early and head to hackathons, such as MHacks (http://mhacks.org) or PennApps (http://2015f.pennapps.com/), because they are a prime opportunity for learning. There are brilliant minds from all over the country, sometimes world, attending these hackathons, and many of these hackathons offer a travel stipend or reimbursement for applicants (often, not always). These are prime locations for growth and opportunity (and networking with employers), so attend as many of these as possible if you can. </p>
<p>If you do not make the time for side projects, you can always <strong>use your class projects as a challenge to learn more</strong>. If you are given creative freedom for your final projects in class, I would try to use it as an opportunity to learn something new to add to your repertoire of skills. For my Interaction Design final project (https://ndsearch.co), I used this opportunity to learn EmberJS and Ruby on Rails. For my Data Mining final project, I learned EmberJS & Django (http://iheanyi.com/projects/imbalanced-data-analyzer/) in order to automate analyses of large sets of imbalanced data. I was not proficient in any of these frameworks before I started doing these projects, but working on these allowed me to grow as a software developer as my knowledge grew. I suggest that you take the opportunity to do the same. </p>
<p>In conclusion, here are the main means of growing as a software developer and improving your coding confidence. First, join a Computer Science research lab on campus, which allow you to code in an academic setting and often teach you new things about theoretical Computer Science. Secondly, make time to work on side projects, no matter how small, to continually refine and improve your skills as a developer. Thirdly, try to attend as many hackathons as possible. Lastly, use class projects as another opportunity to acquire more knowledge outside of the scope of the classroom, especially in classes that offer creative freedom for final projects. I hope these suggestions and my story will help you all become amazing developers by the end of your four years. If you have any questions, feel free to reach out and <a href="http://iheanyi.com/contact" class="b link highlight-link">contact me</a>.</p>
On Needing to Starthttps://iheanyi.com/journal/2015/03/25/on-needing-to-start2015-03-25T12:00:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>When it comes to starting something new, whether it is a project, a change in lifestyle, or just a simple chore, how often do you find yourself telling yourself, “I need to ‘X’”, yet you do not take the time to actually start? I am guilty of this, really guilty in fact. Personally, I find myself saying, “I need to work on a side project or I need to exercise or I need to clean my room”, but yet I just find my self wasting time, whether it is watching TV or browsing Facebook or Twitter.</p>
<p>Maybe you and I are similar in that we use the acknowledgment of the task as a replacement for actual execution, which I see as a fatal flaw. For the future, I’m going to challenge not only myself, but you, to rethink using the words, “I need to” and just replacing them with immediate action, whether it is actually doing the task at hand or setting a reminder for yourself later in the day to execute the action. Do not merely acknowledge the task at hand, make the steps to execute as soon as possible.</p>
<h3>Notes</h3>
<p>The inspiration for this topic originally arose through a conversation with my best friend Romeo for our podcast, <a href="http://twoblacknerds.com" class="b link highlight-link">Two Black Nerds</a>. Listen to the pilot episode <a href="http://twoblacknerds.com/episodes/9485-episode-zero-this-is-not-serial" class="b link highlight-link">here</a>!</p>
A List of Open Source Ember.js Applicationshttps://iheanyi.com/journal/2015/03/24/a-list-of-open-source-emberjs-projects2015-03-24T22:37:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>In my opinion, one of the main strengths of Ember is that its strong opinions on directory structure and code organization makes it quite easy to open up any open source project and easily locate where certain business logic resides. While first learning Ember, I found myself looking at other open-source Ember projects in order to get a better understanding of how it works. Of course, you can take a look at Ember.js projects in the wild at <a href="http://builtwithember.io" class="b link highlight-link">Built with Ember</a>, but for studying purposes, let’s take a look at popular open source Ember.js projects.</p>
<p><strong><a href="http://www.discourse.org/" class="b link highlight-link">Discourse</a></strong><br>
Created by <a href="http://blog.codinghorror.com/" class="b link highlight-link">Jeff Atwood</a>, Discourse is a platform for community discussion, using a Ruby on Rails back-end.<br>
<a href="https://github.com/discourse/discourse" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://hummingbird.me" class="b link highlight-link">Hummingbird</a></strong><br>
I’m a fan of this one, given that I’m a fan of anime. Hummingbird is an anime discovery platform built with a Rails back-end, I found myself referencing this repo for an idea of how authentication works.<br>
<a href="https://github.com/hummingbird-me/hummingbird" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://ghost.org" class="b link highlight-link">Ghost</a></strong><br>
A somewhat new-ish blogging platform, Ghost uses a back-end developed in NodeJS.<br>
<a href="https://github.com/TryGhost/Ghost/tree/master/core/client" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://www.wordset.org" class="b link highlight-link">Wordset</a></strong><br>
Wordset is an open-source, collaborative dictionary that aims to democratize language. The back-end is built using Ruby on Rails and <a href="http://intridea.github.io/grape/" class="b link highlight-link">Grape</a> for the API server.<br>
<a href="https://github.com/wordset/wordset-ui" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://chancancode.github.io/hn-reader/about" class="b link highlight-link">HN Reader</a></strong><br>
An embitious Hacker News reader built using Ember.JS.<br>
<a href="https://github.com/chancancode/hn-reader" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://emberobserver.com" class="b link highlight-link">Ember Observer</a></strong> - <em>Thanks <a href="https://github.com/johnotander" class="b link highlight-link">John</a>!</em><br>
A website built for discovering and comparing Ember-CLI addons.<br>
<a href="https://github.com/emberobserver/client" class="b link highlight-link">View Source</a> </p>
<p><strong><a href="https://diesel.aptible.com" class="b link highlight-link">Diesel</a></strong><br>
The dashboard for the Aptible PaaS. This project serves as a good example for organizing your projects with <a href="http://www.ember-cli.com/#pod-structure" class="b link highlight-link">pods</a>.<br>
<a href="https://github.com/aptible/diesel.aptible.com" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://emberaddons.com" class="b link highlight-link">Ember Addons</a></strong><br>
Another website for finding addons for Ember-CLI.<br>
<a href="https://github.com/gcollazo/ember-cli-addon-search" class="b link highlight-link">View Source</a></p>
<p><strong><a href="http://ember-twiddle.com" class="b link highlight-link">Ember Twiddle</a></strong> - <em>Thanks <a href="https://github.com/Gaurav0" class="b link highlight-link">Gaurav</a>!</em><br>
A JSFiddle type web editor for creating Ember-CLI style code.<br>
<a href="https://github.com/ember-cli/ember-twiddle" class="b link highlight-link">View Source</a> </p>
<p><strong><a href="http://hospitalrun.io" class="b link highlight-link">HospitalRun</a></strong><br>
Open source software for developing world hospitals. The cool thing about this
is that it’s an offline-first application using PouchDB.<br>
<a href="https://github.com/HospitalRun/hospitalrun-frontend" class="b link highlight-link">View Source</a> </p>
<p><strong>Have suggestions for another open-source project to add? Please <a href="https://github.com/iheanyi/iheanyi.github.io/issues/new" class="b link highlight-link">open an issue</a> on this repo!</strong></p>
New Website Designhttps://iheanyi.com/journal/2015/01/29/new-website-design2015-01-29T19:20:00+00:002022-10-26T16:41:36+00:00Iheanyi Ekechukwu<p>Today I am pleased to announce the launch of the new and improved <a href="http://iheanyi.com" class="b link highlight-link">iheanyi.com</a>, which I designed and developed over the last few weeks. Rather than using a CMS such as WordPress, I opted to use <a href="http://middlemanapp.com" class="b link highlight-link">Middleman</a>, an amazing static site builder instead. For handling the grid and styling, I decided to use <a href="http://neat.bourbon.io" class="b link highlight-link">Neat</a> and <a href="http://bitters.bourbon.com" class="b link highlight-link">Bitters</a>, mixed in with <a href="http://bourbon.io" class="b link highlight-link">Bourbon</a>.</p>
<h2>Acknowledgments</h2>
<p>I’d like to thank <a href="http://tympanus.net/codrops" class="b link highlight-link">Codrops</a> for the <a href="http://tympanus.net/codrops/2014/06/19/ideas-for-subtle-hover-effects/" class="b link highlight-link">inspirational hover effects</a>, which allowed me to spruce up my project thumbnails.</p>
<p>Additionally, I’d like to thank the countless people who viewed my website as I was developing it and reported any bugs that occurred to me; your quality testing helped make this website better.</p>
<p>Thanks for visiting and reading, I’m looking forward to experiencing and building amazing things in 2015. Please don’t hesitate to <a href="/contact.html" class="b link highlight-link">contact</a> me with feedback and comments.</p>