<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Geshan's Blog]]></title>
  <link href="http://geshan.com.np/atom.xml" rel="self"/>
  <link href="http://geshan.com.np/"/>
  <updated>2017-01-04T11:04:09+04:00</updated>
  <id>http://geshan.com.np/</id>
  <author>
    <name><![CDATA[Geshan Manandhar]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[3 Podcasts Every Software Engineer/developer Should Subscribe to - Part 3]]></title>
    <link href="http://geshan.com.np/blog/2017/01/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to-part-3/"/>
    <updated>2017-01-04T09:47:54+04:00</updated>
    <id>http://geshan.com.np/blog/2017/01/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to-part-3</id>
    <content type="html"><![CDATA[<p>Podcasts open up a new horizon for learning, it is easier than reading and you can do it while commuting. This is a part 3 is the series (do check part <a href="http://geshan.com.np/blog/2015/10/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to/">1</a> and
<a href="http://geshan.com.np/blog/2016/05/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to-part-2/">2</a>) of podcasts you must subscribe to and listen to as a software engineer. Same as the last 2 times the 3 podcasts listed below have superb content and amazing sound quality too. Below is the list:</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-3/3-podcasts-sw-eng-part-03.jpg" title="3 podcasts every software engineer should subscribe to - part 3" alt="3 podcasts every software engineer should subscribe to - part 3"></p>

<!-- more -->


<h2><a href="http://www.heavybit.com/library/podcasts/to-be-continuous/">To Be Continuous by Heavybit</a></h2>

<p>This is a gem of a podcast. Hosted by Paul and Edith it has the right mix of technical and non-technical content.
Paul is the co-founder of Circle CI and Edith is the co-founder of LaunchDarkly. Together they make a great pair.
They put forward their ideas about continuous delivery and software engineering topics.
Sometimes they even bring in guests which is like a cherry on the cake. The last episode #28 on <a href="http://www.heavybit.com/library/podcasts/to-be-continuous/ep-28-goal-setting/">Goal setting</a> was amazing.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-3/to-be-continuous.jpg" title="To Be Continuous Podcast" alt="To Be Continuous Podcast"></p>

<h2><a href="http://www.gistia.com/techpeople/">Tech People by Gistia Labs</a></h2>

<p>In-depth interviews is what tech people by Gistia Labs podcast excels on. They bring in leaders from the
tech industry to discuss topics from Angular in the enterprise to UX for Lean startup.
The interviews are a bit long, still they are insightful and relay important information.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-3/tech-people.jpg" title="Tech People Podcast" alt="Tech People Podcast"></p>

<h2><a href="https://mixergy.com/interviews/">Mixergy by Andrew</a></h2>

<p>Another admirable podcast is Mixergy hosted by <a href="http://www.andrewwarner.com/">Andrew Warner</a>.
With over a 1000 interviews with proven entrepreneurs, he knows how to ask the right questions.
Andrew sometimes elicits such insightful information out of his guest. It is intriguing how he does it.
If you ever want to learn how to interview people this is one podcast you can&rsquo;t afford do miss.
He generally interviews tech entrepreneurs. The interviews usually last like an hour.
You even as a software engineer get to know important things about how to run a business.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-3/mixergy.jpg" title="Mixergy Podcast" alt="Mixergy Podcast"></p>

<blockquote><p>I hope you had a great start to the new year and continue your learning listening to amazing podcasts. Cheers!</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Different Types of Web Hosting Compared to Types of Housing [Infographics]]]></title>
    <link href="http://geshan.com.np/blog/2016/11/different-types-of-web-hosting-compared-to-types-of-housing/"/>
    <updated>2016-11-29T15:28:50+04:00</updated>
    <id>http://geshan.com.np/blog/2016/11/different-types-of-web-hosting-compared-to-types-of-housing</id>
    <content type="html"><![CDATA[<p>Looking for the right web hosting provider for your website/app idea? It is like finding a housing for yourself. You have to first agree on the type like you want an apartment in a building, your own house/villa or may be a mansion. It will also depend on your budget and what you want to do in your housing. A similar process applies for your web hosting. You can go for a shared host or dedicated host or some cloud Infrastructure As A Service (IAAS ) provider.</p>

<p>In the infographics below I will do a basic comparison between shared host, dedicated host and cloud provider. They are roughly comparable to an apartment, house or a mansion. I am over simplifying things grouping Virtual Private Server (VPS) and dedicated hosting together.</p>

<!-- more -->


<p><img class="center" src="http://geshan.com.np/images/web-host-as-housing/web-host-as-housing-med.png" title="Different types of web hosting compared to types of housing" alt="Different types of web hosting compared to types of housing"></p>

<blockquote><p>I hope this helps you to make the right choice about your hosting provider.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to Do a Minimum Viable Feature Switch, Includes a Simple Code Example]]></title>
    <link href="http://geshan.com.np/blog/2016/09/how-to-do-a-minimum-viable-feature-switch/"/>
    <updated>2016-09-26T09:55:05+04:00</updated>
    <id>http://geshan.com.np/blog/2016/09/how-to-do-a-minimum-viable-feature-switch</id>
    <content type="html"><![CDATA[<p>Feature switch is a way to switch off or on a feature on a working software during runtime. We can use configuration or condition to achieve this. Feature switch is also known as feature flag, feature toggle and conditional feature. In this post I will reveal why to do <a href="https://en.wikipedia.org/wiki/Feature_toggle">feature switch</a> and how to do it with a simple if condition.</p>

<p><img class="center" src="http://geshan.com.np/images/feature-switch/feature-switch.jpg" title="Minimum viable feature switch, with code example" alt="Minimum viable feature switch, with code example"></p>

<!-- more -->


<h2>Why do a feature switch/flag?</h2>

<p>My first experience with feature flag was when we had to deploy <code>PayPal</code> as a payment method. We wanted to be sure that it works without issues on production. How we did it then was to have a <a href="https://launchdarkly.com/featureflags.html">feature flag</a> with a condition that the user email ends in <code>@namshi.com</code>.</p>

<p>You can do feature switch for various reasons, some of them are:</p>

<ol>
<li>A very important feature needs to go into production and you need to test it in production. It can&rsquo;t be released to everyone unless everything is fine like a new payment method.</li>
<li>You want to deploy a big feature in steps and until the last step is done the feature is not complete.</li>
<li>You want your changes pushed to production and merged with the main branch. But the new changes are not public yet.</li>
<li>You don&rsquo;t want to spend hours fighting merge conflicts. You are working on it for days and your code has not been merged to the main branch.</li>
<li>You want to schedule a feature in future, you could have a feature switch based on date or time.</li>
</ol>


<h2>How to do feature switch?</h2>

<p>There are many ways to do a feature switch for this post as an example I will add a new payment method to a checkout. For this task, I will use a simple <code>if</code> condition. Other ways of doing feature switch can be with a <code>cookie</code> or even some <code>settings in the database</code>.</p>

<h3>Checkout Scenario</h3>

<p>The simple checkout already has 2 payment methods <code>Cash</code> and <code>CreditCard</code>. We will add <code>PayPal</code> to it. The current proof of concept implementation only shows the order total. For, Cash it shows 5 more than credit card as it adds <code>Cash On Delivery (COD)</code> fees.</p>

<p>The code is an addition to my previous post on <a href="http://geshan.com.np/blog/2015/07/getting-started-with-unit-testing-in-laravel/">unit testing with Laravel</a>. If you have not read it, I highly recommend you to do it. This example has <a href="https://github.com/geshan/laravel-unit-test-example/pull/4/files#diff-b3678da71dcc0bd1aa883f9f930c1ca5R34">tests</a> too.</p>

<h3>Checkout Example with PayPal</h3>

<p>Let us take the example of a simple feature switch with adding a new payment method Paypal. It should be accessible only if your email ends in <code>@gmail.com</code>. You should use <code>yourcompany.com</code> email but for an example, I will use <code>gmail.com</code>.</p>

<h3>Example Code</h3>

<p>There is a simple <code>Checkout</code> service that has a <code>calculateTotal</code> method. It calculates the total depending on the payment method and now email.</p>

<script src="https://gist.github.com/geshan/3da1d181ae26f18a0ec365a063aa5d99.js"></script>


<p>The feature flag/switch code is in line 21-23. It checks if the payment method is <code>PayPal</code> and email does not end with <code>@gmail.com</code>. The
<code>endsWith</code> method in Laravel <a href="https://laravel.com/docs/5.3/helpers#method-ends-with">helpers</a> came handy to do it. So <code>PayPal</code> is only available if your email ends in <code>@gmail.com</code>. You can check this <a href="https://github.com/geshan/laravel-unit-test-example/pull/4/files">pull request</a> for full changes and related tests.</p>

<h3>Turn it off</h3>

<p>So let&rsquo;s assume, that you tested <code>PayPal</code> intensively on your production environment. When you are satisfied you just remove the condition and fix the related tests and you are done. Deploy again do a final round of testing and you have <code>PayPal</code> on production, all your customers can use it after that.</p>

<h2>Conclusion</h2>

<p>Stop making big tasks/tickets that take weeks to complete. Apply feature switch and deploy small things. Test them on production without anyone noticing.</p>

<p>Always test critical things on production in a hidden way like a new payment method. Practice feature switch and get your code passed through your work flow to production.</p>

<blockquote><p>Hope you will benefit from feature switch and suggest it to solve complex problems.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Some Useful Resources and Suggestions for Tech Conference Speakers and Aspiring Speakers]]></title>
    <link href="http://geshan.com.np/blog/2016/09/some-useful-resources-for-conference-speakers-and-wanna-be-speakers/"/>
    <updated>2016-09-14T11:02:38+04:00</updated>
    <id>http://geshan.com.np/blog/2016/09/some-useful-resources-for-conference-speakers-and-wanna-be-speakers</id>
    <content type="html"><![CDATA[<p>I do not consider myself an experienced speaker. I have <a href="http://geshan.com.np/blog/categories/talks/">spoken</a> at a couple of conferences and some meetups in the past years. I have to learn lots of technical and non-technical things to become a better speaker. Still, I would like to share some resources that will help new and experienced speakers.</p>

<p><img class="center" src="http://geshan.com.np/images/speaker-resources/speaker.jpg" title="Some resources for conference speakers" alt="Some resources for conference speakers"></p>

<!-- more -->


<h2>Paper submission is not a lot of work</h2>

<p>Some years back, I thought that submitting a paper to a tech conference was a lot of work. General tech conferences just need you to submit a title and a 200-300 word abstract that&rsquo;s it. The organizers/paper selection committee decides to select or reject the paper on that basis. So just jot down those great abstracts and start submitting the papers.</p>

<p>You will be happy to know that some conferences also cover travel and hotel costs for speakers. So, if you get selected you get a chance to visit a new city/country and speak about a topic you like too.</p>

<h2>How Do I know which conferences have an open CFP</h2>

<p>Now, as you are excited to submit your ideas in the form of papers let&rsquo;s see where you can submit them.</p>

<p><img class="center" src="http://geshan.com.np/images/speaker-resources/cfp.jpg" title="Call for papers for a tech conference" alt="Call for papers for a tech conference"></p>

<p>Below are some of the websites that inform you about Call For Papers (CFP):</p>

<ol>
<li><a href="http://papercall.io/">Papercall.io</a> - You can also submit your papers from this web application. Generally, lists only tech conferences. You can get a weekly update about events listed in PaperCall.io subscribing to <a href="http://theweeklycfp.com/">The Weekly CFP</a>.</li>
<li><a href="http://lanyrd.com/calls/">Lanyrd.com/calls</a> - Lists call for speakers for a lot of events. Events/Conferences are both tech and non-tech.</li>
<li><a href="http://callingallpapers.com/">CallingAllPapers.com</a> - Lists all call for papers with days left marker sorted with a deadline. It has only tech conferences listed.</li>
<li><a href="https://thecfpreport.com/">The CFP Report</a> - Sends a weekly with all tech paper calls. You can even select the day of the week you want the email, I get it each Friday :)</li>
</ol>


<h2>First time speaker? Content is king</h2>

<p>Generally, first-time speakers do not get a chance to speak at conferences. So I recommend you to starts speaking at local meetups. It will be great if you record your talk and publish it as a blog post. This will help you land your first conference speaking opportunity.</p>

<p>Great, so your paper is selected at a tech conference after you already spoke at some meetups. Now after you sort out the administrative procedure like visa if any, you need to focus on your slides. The rule is simple, content is king. No matter you do a soft talk or a super technical talk with lots of code, you need to deliver great content.</p>

<p>Having a agenda or list of things you are going to talk about is a must have. Slides with content in bullets and optimal text on each slide is always better. Images play a vital role if you want to have that punch slide or convey your message in a visual form. I use and recommend right free images that I get from <a href="https://pixabay.com">Pixabay</a> and <a href="https://unsplash.com/">Unsplash</a>.</p>

<h2>Suggestions to speakers, feedback about your talk</h2>

<p>Any feedback about your talk is always helpful. Four general suggestions I have for speakers are:</p>

<ol>
<li>Keep your slides free from any grammatical errors.</li>
<li>While speaking try to avoid any <code>Ahh</code> and <code>umm..</code> etc fillers.</li>
<li>Keep track of your speaking speed, don&rsquo;t speak too fast or too slow.</li>
<li>Speaking is spontaneous. Still, try to memorize your starting and ending quote/sentence. You could even record your start and end sentences, listen to it and improve on it.</li>
</ol>


<p>The best feedback is what your audience tell you. I have got comments and suggestions on the content, the demo code as well as how I speak. It has helped me a lot. One important feedback I got was that on stage I turn myself into a rapper :) (spoke too fast). So, the next talk I gave I was conscious about my speaking pace.</p>

<p>Always try to get face to face feedback one on one with people in the audience. Whenever possible have your talk listed on <a href="https://joind.in">Joind.in</a>. Have a slide towards the end to rate your talk and ask for feedback. Joind.in also has a page to list <a href="https://joind.in/event/callforpapers">call for papers</a></p>

<h2>Conclusion</h2>

<p>Open up, submit your idea in form of a paper to a tech conference. As long as your talk topic is in-line with the conference subjects just go for it. Don&rsquo;t expect your paper to be selected in all the conferences. Tech conferences get a huge number of submissions. Unless you have some solid speaking experience in conferences, it will be difficult. Be in the conference organizer&rsquo;s shoes too. Getting a first-time speaker who won&rsquo;t be able to deliver a great talk to a paying audience is a big risk.</p>

<blockquote><p>Best of luck, hope your paper gets selected at a great tech conference.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[#LaraconEU 2016 Was a Great Experience Overall]]></title>
    <link href="http://geshan.com.np/blog/2016/08/number-laraconeu-2016-was-a-great-experience-overall/"/>
    <updated>2016-08-25T07:59:03+04:00</updated>
    <id>http://geshan.com.np/blog/2016/08/number-laraconeu-2016-was-a-great-experience-overall</id>
    <content type="html"><![CDATA[<p>It all started with submitting my chatops talk to some open call for papers in April 2016. After giving the talk in CodeMotion Dubai, I felt chatops is a useful topic. Everyone working in software development can leverage it to make their life easier. My talk was a Laravel centered version of the same talk.</p>

<p><img class="center" src="http://geshan.com.np/images/laracon-eu-2016/laracon-eu.jpg" title="Laracon EU 2016" alt="Laracon EU 2016"></p>

<!-- more -->


<h2>Talk Accepted - Woo hoo!</h2>

<p>My talk got accepted in around mid-May for <a href="https://twitter.com/search?q=%23LaraconEU&amp;src=tyah">#LaraconEu</a> 2016. It was amazing news that entailed other things to take care of. I had to sort out visa first. I want to thank Shawn for keeping like 3 months + time between paper selection and the conference. This is great for speakers like me who have to sort out the paperwork. It is also useful for speakers who get enough time to prepare for their talk.</p>

<blockquote><p>It is something that all conference organizers should  consider when organizing an &ldquo;international&rdquo; conference. Select speakers/talks like 3 months or more in advance.</p></blockquote>

<h3>Suggestions to conference organizers</h3>

<p>Then after I confirmed my presence, I started taking care of the paperwork for the visa. I also had a chat with Shawn over Skype. He gave me some pointers to make the talk more suited to the Laravel Developers audience. It was super handy.</p>

<p>Along the same lines I have 3 more suggestions to conference organizers:</p>

<ol>
<li>Have a conversation with speaker after talk selection. Advise them about content.</li>
<li>Don&rsquo;t always strive for fresh content. The speaker might have presented it earlier. Think of how the speaker can mold it to suit your conference audience.</li>
<li>Be adventurous with speaker selection. I agree it&rsquo;s a risk to select a speaker who needs a visa to be at the conference venue. Still, if you give enough time like ~3 months things generally work out :).</li>
<li>Give speakers with potential a chance, have that trust.</li>
</ol>


<h2>Conference Experience</h2>

<p>Let&rsquo;s fast forward to 22-Aug-2016 now, I arrived in Amsterdam. I am here in Amsterdam after 5 years, still seems like nothing much has changed here :). I can&rsquo;t write anything about the workshops as I did not attend it. The organizers were well prepared. All speakers already had access to the speaker&rsquo;s handbook. The telegram group was useful too.</p>

<p>Most speakers were staying at Park Vitoria Hotel. It is right infornt of Amsterdam Central. 15 mins train ride from the venue and I must tell you its a great hotel to be in.</p>

<h3>Speaker&rsquo;s dinner</h3>

<p>The ice breaking speaker dinner was great. Speakers interacted and got along well with each other. I guess they also changed their selected talks to attend talking with other speakers. I want to thank the organizers of Laracon EU for the effort they put into speaker hospitality.</p>

<p><img class="center" src="http://geshan.com.np/images/laracon-eu-2016/speaker-dinner.jpg" title="On the way to the restaurant for speaker dinner" alt="On the way to the restaurant for speaker dinner"></p>

<h3>Conference Day 1</h3>

<p>Day 1 on 23-Aug-2016 kicked off like half an hour late due to minor technical issues. Taylor Otwell rocked the stage as usual. One thing, I noticed is even a seasoned speaker like Taylor gets a bit nervous before going to stage. So for us rookie speakers it is absolutely  normal to be nervous.</p>

<p><img class="center" src="http://geshan.com.np/images/laracon-eu-2016/taylor-laracon-eu.jpg" title="Taylor Otwell with his keynote at Laracon EU 2016" alt="Taylor Otwell with his keynote at Laracon EU 2016"></p>

<p>Then I attended the talk by Hannes Van De Vreken about IOC Containers. The talk was quite helpful. We took the train together to the venue. Still, I was preparing for my talk that was after lunch.</p>

<p>My turn was next after lunch. Ubuntu wasn&rsquo;t helping much with the huge display that needed 50 Hz refresh rate. After some googling, it played out well without issues.  My talk went pretty smooth and I even got a few questions a the end. I guess I managed my time well.</p>

<p><img class="center" src="http://geshan.com.np/images/laracon-eu-2016/geshan-laracon-eu.jpg" title="Me talking about Chatops at Laracon EU 2016" alt="Me talking about Chatops at Laracon EU 2016">
More pictures from my talk <a href="https://www.facebook.com/media/set/?set=a.10154031202522979.1073741829.625427978&amp;type=1&amp;l=48cf6b4aa3">here</a>.</p>

<p>The slides of my talk are below:</p>

<script async class="speakerdeck-embed" data-id="9df0de20135d458ca8bd818176afbdca" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>


<p><a href="http://bit.ly/chatops-slides-leu">Slideshare link</a></p>

<p>I wrote a small script to pull in the latest tweet with #LaraconEu for the demo which is <a href="https://github.com/geshan/larabot-hubot">here</a>.</p>

<p>After that I attended the following talks for the day:</p>

<ol>
<li>How to avoid database migration hell - which was good</li>
<li>Varnish For PHP Developers - that was a bit of too much code still good</li>
<li>One Box Doesn&rsquo;t fit all - by Frank which was a different way at looking at scalability, still, it was a great talk.</li>
</ol>


<h3>Conference Day 2</h3>

<p>I was more relaxed on day 2, I had no talk to do. Then I focused on getting the best out of the day. Below are the talks I attended:</p>

<ol>
<li>Please Understand Me by Matthias Noback - Great talk about the tussle between Mangers and Developers</li>
<li>Lucid Architecture By Abed Halawi - Good concepts and well presented</li>
<li>Building Realtime apps NodeJs way By Sriram - He had too many slides so I was lost mid-way :)</li>
<li>Making the most out of MYSQL By Gabi - A great talk, good content and well presented. The experience of the presenter was visible on stage.</li>
<li>The State of content management By Tihomir - Generally a good talk, as I told to him the contents could be condensed better.</li>
<li>Curing the common Loop By Adam Wathan - Amazing talk a good mix of slides and live coding. Collections seems like the lodash of PHP world.</li>
</ol>


<p><img class="center" src="http://geshan.com.np/images/laracon-eu-2016/adam-laracon-eu.jpg" title="Adam talking about Curing Loops at Laracon EU 2016" alt="Adan talking about Curing Loops at Laracon EU 2016"></p>

<p>For more description of the above talks it&rsquo;s best to have a look at the Laracon EU 2016 <a href="http://laracon.eu/2016/schedule">schedule</a>.</p>

<p>The after party on day 2 was superb too. With live band performing and tech conversations around the atmosphere was electric.</p>

<p>For more photos from the conference do checkout the #LaraconEu tag with <a href="https://twitter.com/search?f=images&amp;vertical=default&amp;q=%23LaraconEU&amp;src=tyah">photos</a>.</p>

<h2>Amazing Experience</h2>

<p>Overall, it was an amazing experience. The venue was great. Organizers put a lot of effort to make sure the speakers felt comfortable. I
want to thank them. The comments I have received over <a href="https://joind.in/talk/9999a">JoinedIn</a> about my talk have been very helpful, I would really like
more ratings and comments :).</p>

<blockquote><p>I am waiting for the videos like everyone else, I have some talks I missed that I want to watch. I loved being a part of such a vibrant event backed by
an amazing community. Cheers!</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Career Paths for to Be Tech Graduates [Slides]]]></title>
    <link href="http://geshan.com.np/blog/2016/06/career-paths-for-to-be-tech-graduates-slides/"/>
    <updated>2016-06-28T14:03:05+04:00</updated>
    <id>http://geshan.com.np/blog/2016/06/career-paths-for-to-be-tech-graduates-slides</id>
    <content type="html"><![CDATA[<p>After almost 2 years, I gave another talk to the students of <a href="http://prime.edu.np">Prime College</a>. Last time it was &ldquo;<a href="http://geshan.com.np/blog/2014/08/things-i-wished-i-knew-while-doing-my/">Things I wished I knew while doing my tech bachelors</a>&rdquo;. This time it was <strong>Career Paths for to be tech graduates</strong>. I prepared the slides at 9 and was already presenting the talk at 11:15.</p>

<p><img class="center" src="http://geshan.com.np/images/career-paths-for-tech-grads/cptg-01.jpg" title="Career Paths for tech graduates the talk" alt="Career Paths for tech graduates the talk"></p>

<!-- more -->


<h2>Slides</h2>

<script async class="speakerdeck-embed" data-id="d2961b06460a443c8e13535d8add0260" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>


<h2>Participants</h2>

<p>The students were from <a href="http://www.bsccsit.com/">Bsc. CSIT</a> and <a href="https://en.wikipedia.org/wiki/Bachelor_in_Information_Management">BIM</a> of second and fourth semester. They were high on youth and not worried about their careers. As it was a short talk, I wanted the session to be interactive. I was trying to get more questions out of them. Some of them were shy to ask the questions so they came in later after the talk to have a chat with me.</p>

<p><img class="center" src="http://geshan.com.np/images/career-paths-for-tech-grads/cptg-02.jpg" title="Career Paths for tech graduates the participants" alt="Career Paths for tech graduates the participants"></p>

<h2>Questions</h2>

<p>Questions centered towards roles and problems faced by tech companies in Nepal. I answered the queries with the things I knew and what I had experienced when I was working in Nepal. Few of them were enthusiastic about opening up their own company. I wish them best of luck.</p>

<h2>Conclusion</h2>

<p>Students get serious about internship, job and career only towards their final semesters. I think they should start planning for their internship at the mid of their bachelor study. By the &frac34; stage, they should know which career path should I take.</p>

<blockquote><p>I hope the short talk and QnA session helped some of the participants to think about their career plans.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PHP Developers Nepal Meetup #16 a Round Up and My Talk on Simpilfied Gitflow With Slides]]></title>
    <link href="http://geshan.com.np/blog/2016/06/php-developers-nepal-meetup-number-16-a-round-up-and-my-simpilfied-gitflow-talk/"/>
    <updated>2016-06-25T15:50:35+04:00</updated>
    <id>http://geshan.com.np/blog/2016/06/php-developers-nepal-meetup-number-16-a-round-up-and-my-simpilfied-gitflow-talk</id>
    <content type="html"><![CDATA[<p>I had given a talk in the PHP Developers Nepal meetup #14 in Aug 2014 about <a href="http://geshan.com.np/blog/2014/08/basic-overview-of-message-queues-rabbit/">Rabbit Mq and Symfony</a>.
This time the <a href="http://developers-nepal.github.io/php/meetups/25-Jun-2016/">meetup</a> took place at
Prime College today. There were 2 regular talks for this meetup and one 5 minute lightening
talk about the community. For this 16th installment, we did an open discussion for the first time.
The topic of open discussion was &ldquo;Does automated deployment and DevOps add value to the organization?&rdquo;.
It was the highlight of the event.</p>

<p><img class="center" src="http://geshan.com.np/images/php-dev-meetup-16/php-dev-meetup-16.jpg" title="PHP Dev Meetup 16 Open Panel discussion on DevOps" alt="PHP Dev Meetup 16 Open Panel discussion on DevOps"></p>

<!-- more -->


<h2>How did it all unfold</h2>

<p>The first talk was given by Amrit GC on &ldquo;Ansible for PHP Developers&rdquo;, then I presented my talk on &ldquo;Simplified Gitflow&rdquo;.
After those two regular talks we had a lightening talk presented by Manish Jung Thapa (MJT) on PHP Developers Nepal Community.
Last part of the program was an open discussion on &ldquo;Does automated deployment and DevOps add value to the organization?&rdquo; which
got a lot of questions from the audience. It was great to moderate the open discussion. Overall, it was an amazing meetup. I guess
there were around 100 participants which makes it one of the biggest PHP Developers meetup in terms of audience size.</p>

<h2>My Talk on Simplified Gitflow</h2>

<p>This is not the first time I presented this talk :). I had already given this talk at <a href="http://geshan.com.np/blog/2015/09/how-to-use-simplified-gitflow-branching-model-video/">YIPL in Mar 2015</a>.
This time I changed the slides and made it more general. I hope it was helpful to the audience.</p>

<p><img class="center" src="http://geshan.com.np/images/php-dev-meetup-16/simplified-gitflow-talk.jpg" title="PHP Dev Meetup 16 My talk on simplified gitflow" alt="PHP Dev Meetup 16 My talk on simplified gitflow"></p>

<h2>Slides of Simplified Gitflow</h2>

<script async class="speakerdeck-embed" data-id="acdf3ecb8fd84007b33113d906e5dd3c" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>


<h2>Video of my talk on Simplified Gitflow</h2>

<iframe width="560" height="315" src="https://www.youtube.com/embed/jznORrhoV-M?rel=0" frameborder="0" allowfullscreen></iframe>


<p>More vidoes of the full event in this <a href="https://www.youtube.com/playlist?list=PLhTqkNYfkucxGk2OssIseNLMF9jPXYoHC">playlist</a>.</p>

<h2>Hope to see more meetups</h2>

<blockquote><p>Hope there will be a Developers Nepal meetup which is language agnostic soon. Kudos.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[3 Podcasts Every Software Engineer/developer Should Subscribe to - Part 2]]></title>
    <link href="http://geshan.com.np/blog/2016/05/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to-part-2/"/>
    <updated>2016-05-03T09:29:42+04:00</updated>
    <id>http://geshan.com.np/blog/2016/05/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to-part-2</id>
    <content type="html"><![CDATA[<p>Listening to podcasts is a good way to learn new things. Like the last <a href="http://geshan.com.np/blog/2015/10/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to/">time</a>, I have found some more podcasts
with amazing content and sound quality. In this post, I will list 3 awesome podcasts.
All software engineers/developers should subscribe to them now.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-2/3-podcasts-sw-eng-part-02.jpg" title="3 podcasts every software engineer should subscribe to - part 2" alt="3 podcasts every software engineer should subscribe to - part 2">
(Background image shot by me)</p>

<!-- more -->


<h2><a href="http://softwareengineeringdaily.com/category/podcast/">Software Engineering Daily</a></h2>

<p>Software engineering daily is a daily podcast hosted by <a href="http://jeffmeyerson.com/">Jeff Meyerson</a>.<br/>
He has worked at Amazon and knows what he is talking about. T
he interviews are in-depth, long and enjoyable. Jeff is sharp, there is never a
dull moment in the one to one interviews he conducts. He covers a wide range of subjects from docker/kubernates
to logging and git.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-2/software-engineering-daily-podcast.jpg" title="Software Engineering Daily podcast" alt="Software Engineering Daily podcast"></p>

<h2><a href="https://scaleyourcode.com/interviews">Scale your code</a></h2>

<p>Christophe Limpalair hosts Scale your code podcast. A new episode usually arrives every 15 days. He also interviews known
tech personalities. The podcast covers a wide array of topics from open source to performance. This podcast informs
how the big players deal with scaling and performance problems.</p>

<blockquote><p>Scale Your Code&rsquo;s mission is to organize the world&rsquo;s programming knowledge from top sources and make it universally
accessible to improve software security, speed, and reliability.</p></blockquote>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-2/scale-your-code-podcast.jpg" title="Scale your code podcast" alt="Scale your code podcast"></p>

<h2><a href="http://www.scrum-master-toolbox.com/category/podcast/">Scurm Master Toolbox</a></h2>

<p>Scrum master toolbox podcast is another daily podcast with a theme for each weekday. Vasco Duarte hosts this podcast.
He conducts the interviews with ease and a purpose to get the best out of his guests. Regardless of you do scrum or not
this will help you in your career. Software engineers are solution providers. Understanding team dynamics, product
management and change management is important in our work life.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts-part-2/scrum-master-toolbox-podcast.jpg" title="Scurm Master Toolbox podcast" alt="Scurm Master Toolbox podcast"></p>

<blockquote><p>For this time it was all podcasts with one on one interviews. Hope you like them and it helps you expand your tech horizon.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[3 Simple Rules for Less or No Git Conflicts]]></title>
    <link href="http://geshan.com.np/blog/2016/04/3-simple-rules-for-less-or-no-git-conflicts/"/>
    <updated>2016-04-28T10:14:43+04:00</updated>
    <id>http://geshan.com.np/blog/2016/04/3-simple-rules-for-less-or-no-git-conflicts</id>
    <content type="html"><![CDATA[<p>Do you write at least 10 lines of code a day in any programming language? Do you work alone or in a team?
If your answer is yes to both questions, you need to learn <code>git</code> even if you work alone in a project.
<a href="https://git-scm.com/">Git</a> is the most popular versions control system and it has become a must have
software engineer skill.</p>

<p>I have seen teams fall into this trap of git conflicts when they start using git and some type of
<a href="http://geshan.com.np/blog/2014/12/do-you-git-your-code-follow-this-simplified-gitflow-model/">gitflow</a>.
Merging branches to the main branch becomes a pain when there are git conflicts.
In this post I am going to reveal 3 simple rules to avoid git conflicts.</p>

<p><img class="center" src="http://geshan.com.np/images/3-rules-git-conflict/git-conflict.png" title="3 simple rules for less or no git conflicts" alt="3 simple rules for less or no git conflicts"></p>

<!-- more -->


<h2>Assumption</h2>

<p>You have some working knowledge of git. You follow a git branching model like gitflow or simplified gitflow.</p>

<h2>Rule 1: Keep your changes small</h2>

<p>This is the golden rule to avoid git conflicts in teams. Conflicts occurs when 2 team members make changes
around the same line of code. Like John changes like 5-10 in readme.md. Jack changes like 7-15 in the same
readme.md file on a different branch. Have a rule of thumb that each pull request can have at most 20 files
changed with 200 line addition. If changes are less there is less chances of having things overlapped. As a
side effect, it will make deploying and testing changes easy too.</p>

<h2>Rule 2: Rebase with your main branch (generally master) when it changes</h2>

<p>When your main branch changes, rebase the branch you are working on with it. Usually <code>master</code> is the
main branch so it will be best if you rebase with master at least once a day. This saves you from bringing
in lots of changes done by other team member late. Its the same concept as above, get small changes step by
step many times than getting it all at once. At the end of the day always do the following, given
you are on your working branch</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git checkout master
</span><span class='line'>git fetch
</span><span class='line'>git pull --rebase origin master
</span><span class='line'>git checkout -
</span><span class='line'>git rebase master</span></code></pre></td></tr></table></div></figure>


<p>You get the latest master. Then you go back to your previous branch and rebase your branch with latest master.</p>

<h2>Rule 3: Review pull requests faster and merge them to main branch</h2>

<p>As I have stated earlier &ldquo;An open pull request (PR) is a liability in at least 2 ways. 1 it’s a feature/fix not
shipped to customers. 2 it will invite code conflicts soon.&rdquo; Have a rule, pull requests need action by 3 days of
opening them. You can review code, if code is ok deploy and merge or review code, fix issues then deploy and merge.
This will help the team ship things faster as well as not have pull requests open unattended for weeks.</p>

<h3>Useful Tip</h3>

<p>You followed the above rules, still landed in a git conflict situation? Use <code>git cherry-pick</code>. If you have more
than one commit in your working branch first <a href="http://geshan.com.np/blog/2014/07/4-git-tips-beyond-basics/">squash</a>
it to one commit. Then create a new branch out of master/your main branch and do <code>git cherry-pick &lt;sha-of-your-squashed-commit&gt;</code>.<br/>
Given you have only 1 commit on your working branch <code>feature11</code> and you are on <code>feature11</code> right now, do the following:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git checkout master; git fetch && git pull --rebase origin master
</span><span class='line'>git checkout -b feature-11-new
</span><span class='line'>git cherry-pick 249bd9b150fdb1e6fc9e58af9823f70cc52579a3</span></code></pre></td></tr></table></div></figure>


<p>In the above example <code>249bd9b150fdb1e6fc9e58af9823f70cc52579a3</code> is used for demo only. You can know your SHA hash with <code>git log -1</code>
being on branch <code>feature11</code></p>

<h2>Conclusion</h2>

<p>There is no silver bullet to avoid git conflicts all the time. You will face it now and then.
If you run into git conflicts everyday the process and system needs to change.
Be logical, if you have a PR with 50 files changed and 700 new lines you will face conflicts.</p>

<blockquote><p>I hope you face less git conflicts or even completely avoid them.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Embrace chatOps, Stop Installing Deployment Software [Slides and Video]]]></title>
    <link href="http://geshan.com.np/blog/2016/04/embrace-chatops-stop-installing-deployment-software/"/>
    <updated>2016-04-03T14:03:09+04:00</updated>
    <id>http://geshan.com.np/blog/2016/04/embrace-chatops-stop-installing-deployment-software</id>
    <content type="html"><![CDATA[<p>On 1-Apr-2016 For <a href="http://dubai2016.codemotionworld.com/">CodeMotion Dubai 2016</a> conference I talked about chatOps at Namshi.
The main topics of the talk were:</p>

<ol>
<li>What is chatOps?</li>
<li>Why do chatOps?</li>
<li>How we do chatOps at Namshi</li>
<li>How you can start chatOps in minutes</li>
</ol>


<p><img class="center" src="http://geshan.com.np/images/chatops/chatops-hubot.jpg" title="Embrace chatOps, stop installing deployment software [Slides and Video]" alt="Embrace chatOps, stop installing deployment software [Slides and Video]">
(Illustration by Anjan Shrestha - AnjHero.me)</p>

<p>This post has the slides and the video of the whole talk.</p>

<!-- more -->


<p>I liked the overall experience of being a conference  speaker :).
I think the audience also had something new to fiddle around with by the end of the talk.</p>

<p><img class="center" src="http://geshan.com.np/images/chatops/speaker.jpg" title="Speaker at Codemotion Dubai 2016" alt="Speaker at Codemotion Dubai 2016"></p>

<p>The speaker lineup for day 1 was very good:</p>

<p><img class="center" src="http://geshan.com.np/images/chatops/codemodubai-speakers-day-1.jpg" title="Codemotion Dubai 2016 Speaker lineup" alt="Codemotion Dubai 2016 Speaker lineup"></p>

<p>For all the other news and views check the <a href="https://twitter.com/hashtag/codemodubai?src=hash">#codemodubai</a> hash tag on twitter
and on <a href="https://www.facebook.com/codemotiondubai/">facebook</a>.</p>

<h3>Talk Abstract</h3>

<p>Are you still deploying with capistrano? It is high time to put the chat bots to work. Using chatops to deploy your
software gives visibility to all team members. It also gives a consistent interface to deploy. Software Engineers do not
need to install any extra software to deploy. Ops is happy because software engineers do not need SSH access to servers
anymore. Namshi is a Rocket Internet e-commerce venture in Dubai. At Namshi, we deploy all our apps with chatbots built
with hubot. In this session, I will uncover some real life use cases of chat bots at Namshi.</p>

<h3>Some lessons learnt</h3>

<p>Just a summary:</p>

<ol>
<li>Don&rsquo;t be the last speaker of the day, people are already tired and ready to head home :)</li>
<li>Have a useful links slide that you can show towards the end while answering questions.</li>
<li>Content is king. Image intensive or text intensive slides matter less than the real content you want to deliver.</li>
</ol>


<p><img class="center" src="http://geshan.com.np/images/chatops/chatops-talk.jpg" title="Embrace chatOps, stop installing deployment software [Slides and Video]" alt="Embrace chatOps, stop installing deployment software [Slides and Video]"></p>

<h3>Slides</h3>

<script async class="speakerdeck-embed" data-id="75a57171f12c40e3939b9504c6748f74" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>


<h3>Video</h3>

<center>
<iframe width="640" height="480" src="https://www.youtube-nocookie.com/embed/GVa1I2QiZs4?rel=0" frameborder="0" allowfullscreen></iframe>
</center>


<p>(Thanks <a href="http://www.lprakash.com.np/">Prakash</a> for the photo and video)</p>

<p>I hope the talk about chatOps was interesting for you. Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[There Are Only Two Types of Automated Software Tests, Fast Ones and Not Fast Ones]]></title>
    <link href="http://geshan.com.np/blog/2016/03/there-are-only-two-types-of-automated-software-tests/"/>
    <updated>2016-03-17T09:38:18+04:00</updated>
    <id>http://geshan.com.np/blog/2016/03/there-are-only-two-types-of-automated-software-tests</id>
    <content type="html"><![CDATA[<p>Tests check that the code does what it is expected to do. It also gives confidence to the software engineer that the code
works as intended. This equates to less or no bugs in the software. You must have heard about lots of types of automated software tests.
There is unit testing, integration testing, functional testing, acceptance testing, smoke testing etc.
As per Guru99&rsquo;s <a href="http://www.guru99.com/types-of-software-testing.html">post</a> there are more than 100 types of
software testing. In this post I am going to categorize automated software tests into two, the fast ones and not fast ones.</p>

<p><img class="center" src="http://geshan.com.np/images/testing-types/software-testing.jpg" title="There are only two types of automated software tests, fast ones and not fast ones" alt="There are only two types of automated software tests, fast ones and not fast ones"></p>

<!-- more -->


<h3>How do you distinguish between slow and fast tests?</h3>

<p>Generally, if your whole tests suite runs in seconds it is fast.
If your whole test suite runs in minutes/hour it is slow. To make your tests small you need to make your application small.
As faster tests running on your Continuous Integration (CI) service will give you faster feedback.
May be it is time to go micro-services?</p>

<p>Lets discuss the more about fast and not fast (slow) automated software tests.</p>

<h3>The fast tests</h3>

<p>Fast tests are code that test one unit of code generally a method. Unit test is a type of fast test.
They don&rsquo;t depend on any external dependencies. External dependencies include file system, database, web server, network
or any third party API or service. Unit tests even mock the other code elements they need like other classes and its methods.
This makes the test focused on one unit and they run in milliseconds/seconds not minutes. A simple example is below:</p>

<script src="http://gist-it.appspot.com/http://github.com/geshan/dataprovider-example/blob/master/tests/DataProvider/Example/Test/CheckoutTest.php"></script>


<p>You can view the full code <a href="http://github.com/geshan/dataprovider-example">here</a>, yes it is a simple class with no code or external dependency.</p>

<p>Some integration tests can also be fast tests. These integration tests can test many classes. They should not
dependent on any external dependencies mentioned above to obtain speed. So these tests will still run in seconds and
not take minutes to finish.</p>

<h3>The not fast tests (slow ones)</h3>

<p>Any test that takes long to run are not fast tests (slow tests). Generally, these type of tests need to load
the whole application to test it. These types of tests depend on external dependencies. External dependencies include file
system, database, web server, network, third party API or service.</p>

<p>Acceptance tests that need to load a full web application on a browser is a type of slow tests. Even smoke tests if it needs
to load the whole application and takes long time to execute fall in this category.</p>

<script src="https://gist.github.com/geshan/4512326704954f6b8388.js"></script>


<p>The above example is taken from <a href="https://github.com/Sylius/Sylius/blob/master/features/checkout/checkout_with_offline_payment.feature">Sylius</a>
project, to test checkout with offline payment method on the browser.</p>

<h3>Conclusion</h3>

<p>Testing is super important for a robust software application. Automated testing + CI is one of the <a href="http://geshan.com.np/blog/2015/10/4-pillars-of-a-solid-software-application-and-tools-to-support-it/">four pillars</a>
of any solid software application. Happy testing hope your tests run in seconds not minutes.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[10 Software Engineering Proverbs/quotes I Wrote in the Past Months]]></title>
    <link href="http://geshan.com.np/blog/2016/03/10-software-engineering-proverbs-slash-quotes-i-wrote-in-the-past-months/"/>
    <updated>2016-03-14T15:30:20+04:00</updated>
    <id>http://geshan.com.np/blog/2016/03/10-software-engineering-proverbs-slash-quotes-i-wrote-in-the-past-months</id>
    <content type="html"><![CDATA[<p>In the past months, I was tweeting some insightful and enlightening software engineering proverbs. Like the one below</p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">There is no pill to convert yourself as a good <a href="https://twitter.com/hashtag/programmer?src=hash">#programmer</a>, it takes lots of reading, learning and practice. So start now :) <a href="https://twitter.com/hashtag/code?src=hash">#code</a> <a href="https://twitter.com/hashtag/software?src=hash">#software</a></p>&mdash; Geshan Manandhar (@geshan) <a href="https://twitter.com/geshan/status/707796907582726145">March 10, 2016</a></blockquote>


<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<p>I browsed through my twitter timeline and collected them in one place.</p>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/code-html-small.jpg" title="10 software engineering proverbs-quotes I came up with in past months" alt="10 software engineering proverbs-quotes I came up with in past months"></p>

<h2>Here are the quotes with visuals :</h2>

<!-- more -->


<hr />

<h3>There is no pill to convert yourself as a good programmer, it takes lots of reading, learning and practice. So start now.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/01pills.jpg" title="There is no pill to convert yourself as a good programmer, it takes lots of reading, learning and practice. So start now." alt="There is no pill to convert yourself as a good programmer, it takes lots of reading, learning and practice. So start now."></p>

<hr />

<h3>An open pull request (PR) is a liability in at least 2 ways. 1 it&rsquo;s a feature/fix not shipped to customers. 2 it will invite code conflicts soon.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/02PR.jpg" title="An open pull request is a liability in at least 2 ways. 1 it is a feature-fix not shipped to customers. 2 it will invite code conflicts soon." alt="An open pull request is a liability in at least 2 ways. 1 it is a feature-fix not shipped to customers. 2 it will invite code conflicts soon."></p>

<hr />

<h3>Talking about automated testing and Continuous Integration(CI) is easy, balancing it with delivery and cost as a web shop manager is hard.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/03test-ci-balance.jpg" title="Talking about automated testing and Continuous Integration(CI) is easy, balancing it with delivery and cost as a web shop manager is hard." alt="Talking about automated testing and Continuous Integration(CI) is easy, balancing it with delivery and cost as a web shop manager is hard."></p>

<hr />

<h3>Having automated tests but no Continuous Integration(CI) is like having a sword but letting it rot.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/04test-ci-sword.jpg" title="Having automated tests but no Continuous Integration(CI) is like having a sword but letting it rot." alt="Having automated tests but no Continuous Integration(CI) is like having a sword but letting it rot."></p>

<hr />

<h3>You cannot follow everything by the book. It&rsquo;s generally an ish implementation like Agileish, Kanbanish and RESTish.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/05follow-book.jpg" title="You cannot follow everything by the book. It is generally an ish implementation like agileish, kanbanish and RESTish." alt="You cannot follow everything by the book. It is generally an ish implementation like agileish, kanbanish and RESTish."></p>

<hr />

<h3>If you are thinking of a software product idea, make a pain killer people can&rsquo;t live without not an optional vitamin people can and will skip.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/06pain-killer.jpg" title="If you are thinking of a software product idea, make a pain killer people can not live without not an optional vitamin people can and will skip." alt="If you are thinking of a software product idea, make a pain killer people can not live without not an optional vitamin people can and will skip."></p>

<hr />

<h3>Software engineers have power to create great solutions but the best software to solve the least important problem is of no use.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/07solution-importance.jpg" title="Software engineers have power to create great solutions but the best software to solve the least important problem is of no use." alt="Software engineers have power to create great solutions but the best software to solve the least important problem is of no use."></p>

<hr />

<h3>Programmers/developers need to become software engineers. Think of solution then technology to implement it. Think of abstractions then code.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/08solution-abstract.jpg" title="Programmers-developers need to become software engineers. Think of solution then technology to implement it. Think of abstractions then code." alt="Programmers-developers need to become software engineers. Think of solution then technology to implement it. Think of abstractions then code."></p>

<hr />

<h3>Software developers are solution providers first, engineers second. Solution should have business value than using the latest tech fad.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/09solution-value.jpg" title="Software developers are solution providers first, engineers second. Solution should have business value than using the latest tech fad." alt="Software developers are solution providers first, engineers second. Solution should have business value than using the latest tech fad."></p>

<hr />

<h3>If you don&rsquo;t sharpen your axe then it will take more time and effort to cut the tree. Same goes for software development.</h3>

<p><img class="center" src="http://geshan.com.np/images/10-quotes/10axe.jpg" title="t sharpen your axe then it will take more time and effort to cut the tree. Same goes for software development." alt="If you don"></p>

<hr />

<h3>Disclaimer</h3>

<p>Not all of the above quotes are created by me, some of them are inspired/adapted from things I read online and podcasts I listen to. Thanks.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Wercker CI the Best CI/CD Service Is Free Till Now, Use It [Slides]]]></title>
    <link href="http://geshan.com.np/blog/2016/03/wercker-ci-the-best-ci-slash-cd-service-is-free-till-now/"/>
    <updated>2016-03-09T09:34:08+04:00</updated>
    <id>http://geshan.com.np/blog/2016/03/wercker-ci-the-best-ci-slash-cd-service-is-free-till-now</id>
    <content type="html"><![CDATA[<p>On 7-Mar-2016 I did a short talk titled &ldquo;The best CI/CD service is free (till now), lets use it&rdquo; at <a href="http://namshi.com">Namshi</a>.
It was a quick rundown of <a href="http://wercker.com/">Wercker</a> CI (Continuous Integration) features and how it works.</p>

<p><img class="center" src="http://geshan.com.np/images/wercker/wercker-talk.jpg" title="Wercker CI the best CI-CD service is free till now, use it" alt="Wercker CI the best CI-CD service is free till now, use it"></p>

<!-- more -->


<p>We are currently using <a href="https://travis-ci.com/">Travis CI</a> for running our tests and our own open source
<a href="https://github.com/namshi/roger">Roger</a> app to build docker images. The main objectives of the talk were:</p>

<ul>
<li><p>Suggest using Wercker CI to combine running our tests and building our containers in a sequence. This will prevent us from deploying broken builds</p></li>
<li><p>Inform about a free service that can run 2 concurrent workers to build and deploy containers. It supports closed source projects too.</p></li>
</ul>


<p>Here are the slides:</p>

<center>
<script async class="speakerdeck-embed" data-id="48dcb61db6eb4a50b03bfea1320bfeb4" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script> 
</center>


<p><br/></p>

<p>We discussed how it&rsquo;s still in beta, which might cause issues in the future.
We also discussed on how Continuous Delivery and Continuous Deployment are different.</p>

<p>Hope you like it :), comments and suggestions are always welcome.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[3 Weeklies Every Software Engineer/developer Should Subscribe To]]></title>
    <link href="http://geshan.com.np/blog/2015/11/3-weeklies-every-software-engineer-slash-developer-should-subscribe-to/"/>
    <updated>2015-11-13T13:39:35+04:00</updated>
    <id>http://geshan.com.np/blog/2015/11/3-weeklies-every-software-engineer-slash-developer-should-subscribe-to</id>
    <content type="html"><![CDATA[<p>Being updated is an important need for all technology professionals. These days, there are many ways to get updated and we are at times overwhelmed with the things we read. To help this situations, and get a rundown of a curated list of links to read for any topic is subscribe to a weekly.</p>

<p>Weeklies are compact and organized list of links with articles, podcasts, videos etc. They are focused to a related to a topic, technology, language or framework delivered to you email inbox each week. This post curates a list of 3 weeklies for all software engineer/developers. The main 3 weeklies are language and framework agnostic. Towards the end there is mention of some language, framework and CMS specific weeklies.</p>

<p><img class="center" src="http://geshan.com.np/images/3-weeklies/3-weeklies-sw-eng.jpg" title="3 weeklies every software engineer should subscribe to" alt="3 weeklies every software engineer should subscribe to">
(Background image shot by me.)</p>

<!-- more -->


<h2>Weeklies</h2>

<p>3 great weeklies you should subscribe to are:</p>

<h3>Changelog Weekly</h3>

<p><a href="http://bit.ly/1WQnesg">Changelog Weekly</a> comes out every Saturday. It give you a well balanced rundown of all things open source. It covers major headlines, projects and repos, videos. It also includes pings posted on its <a href="https://github.com/thechangelog/ping">ping</a> repository. So you can try a ping too :)  ChangeLog weekly is a great way to stay updated. It covers all new open source news and repositories.</p>

<h3>StakeShare Weekly</h3>

<p><a href="http://bit.ly/1N19Mx0">StackShare Weekly</a> is released every Friday/Saturday. It includes a post on how one company scaled or improved its stack. For example last week it covered how ProLeads moved from <a href="http://stackshare.io/proleads/how-we-moved-from-heroku-to-containers-with-no-docker-experience">Heroku to Docker</a>. Then it summarizes new and top 10 tools, products or services. Stack Share has a great listing of many services, products and tools categorized well. Their newsletter is super helpful to get up to date with the latest tools and services.</p>

<h3>DevOps Weekly</h3>

<p><a href="http://bit.ly/1NugCFO">DevOps Weekly</a> is released every Sunday. It recaps the major news, events and tools from the devops fraternity.  As software engineers/developers we are going more full stack. This implies that we should also be aware of the system side of things. DevOps Weekly includes condensed links from docker and containers to  monitoring, performance and security.</p>

<h3>Other Weeklies</h3>

<p>Some of the other weeklies I am subscribed to are:</p>

<ul>
<li><p><a href="http://www.phpweekly.com/">PHP Weekly</a></p></li>
<li><p><a href="https://www.docker.com/newsletter-subscription">Docker Weekly</a></p></li>
<li><p><a href="http://javascriptweekly.com/">Javascript Weekly</a></p></li>
<li><p><a href="http://nodeweekly.com/">NodeJs Weekly</a></p></li>
<li><p><a href="http://www.theweeklydrop.com/">Drupal Newsletter</a></p></li>
</ul>


<h2>Conclusion</h2>

<p>If you are working with <a href="http://rubyweekly.com/">Ruby</a>, <a href="http://www.pythonweekly.com/">python</a>,  <a href="http://androidweekly.net/">Android</a>, <a href="https://iosdevweekly.com/">IOS</a>/<a href="http://swiftweekly.com/">Swift</a> or even <a href="http://golangweekly.com/">go lang</a>. The only thing you need to do is Google <code>&lt;your language/framework/CMS here&gt; weekly</code> and subscribe to it. I think you will like the curated links you get each week.</p>

<blockquote><p>Weeklies have helped me get updated on the technology/language/framework/CMS I use or know. I hope it helps you in the same way. Happy weekly subscribing.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Started With Laravel, MariaDB (MySQL) and Docker, Docker Compose]]></title>
    <link href="http://geshan.com.np/blog/2015/10/getting-started-with-laravel-mariadb-mysql-docker/"/>
    <updated>2015-10-24T11:49:48+04:00</updated>
    <id>http://geshan.com.np/blog/2015/10/getting-started-with-laravel-mariadb-mysql-docker</id>
    <content type="html"><![CDATA[<p>&ldquo;How do I get new team members contributing code to the project in a matter of minutes/hours not days?&rdquo; is a common question heard in development teams. There are some ways to do, in my opinion <a href="http://docker.com">docker</a> is one of the best.</p>

<p>Docker enables using same software stack in development, staging and production. You don&rsquo;t need to worry about the version of PHP, MYSQL or any other dependency with Docker. This post will be about Laravel and MariaDB (MySQL) with Docker for local development. It will also feature use of docker-compose. We will use PHP 5.6 and MariaDB 10.1 with Laravel 5.1.</p>

<p><img class="center" src="http://geshan.com.np/images/laravel-mysql-docker/laravel-mysql-docker.png" title="Getting started with Laravel, MariaDB (MySQL) and docker, docker compose" alt="Getting started with Laravel, MariaDB (MySQL) and docker, docker compose"></p>

<!-- more -->


<h2>Prerequisites</h2>

<ul>
<li>You are aware about docker and is basic usage. If you are new to docker check an <a href="http://bit.ly/1LsQ4X6">introduction screen-cast</a>) or read this <a href="http://bit.ly/1FVjL0k">Docker for PHP Developers</a> post</li>
<li>You know about docker volumes and linking containers with docker-compose.</li>
<li>You are running Laravel 5.x on your local machine with some PHP and MySQL setup. The setup can be local LEMP stack or XAMPP or something similar.</li>
<li>You have docker and <a href="https://docs.docker.com/compose/install/">docker compose</a> installed on your machine</li>
<li>You have stopped your Apache/Nginx service and MYSQL service. It will free port 80 and 3306. If
you are using vagrant and homestead then you can run Laravel without starting it.</li>
</ul>


<h2>Software Versions used</h2>

<p>I am running this example on Ubuntu 14.04.2 LTS.</p>

<ul>
<li>Docker : 1.7.1 (<a href="https://docs.docker.com/installation/">Installation Instructions</a>)</li>
<li>Docker compose : 1.3.1 (<a href="https://docs.docker.com/compose/install/">Installation Instructions</a>)</li>
</ul>


<h2>Why use docker?</h2>

<p>The reasons to use docker are simiar to <a href="http://geshan.com.np/blog/2014/07/getting-started-with-php-lemp-on-vagrant/">vagrant</a>. There are some more compelling reasons to use docker and docker compose, some of them are:</p>

<h3>Quick setup of development environment</h3>

<p>The developer/software engineer does not need to know which version of PHP or MySQL is in use. All s/he needs to do is <code>docker-compose up</code> and wait for the images to download (around 230 MB). After that add a entry to the /etc/hostsfile like <code>echo 127.0.0.1 project-name.dev &gt;&gt; /etc/hosts</code>. Then the project runs at <code>http://project-name.dev</code> on the browser.</p>

<h3>No need to install software on local machine</h3>

<p>With docker containers applications are self sufficient. There is no need to upgrade to the latest version of PHP or MySQL. The right version is already packaged inside the dockerfile and also in the container. There is no problem of one developer running PHP 5.5 and another one running PHP 5.6. All developers run the same container. You can install PHP to run composer and other scripts.</p>

<h3>Same software stack in all environments</h3>

<p>Same docker container can be deployed to staging or production environments. The same software stack with correct software versions is used across environments. For example the problem of one developer using MySQL 5.6 and staging running MySQL 5.5 ends.</p>

<p>A <a href="https://github.com/jwilder/nginx-proxy">NGINX proxy</a> can be used to make the virtual hosts dynamic. This post is about keeping things simple.</p>

<h2>Steps to running Laravel 5.x with MariaDB (MySQL) with docker</h2>

<p>For this example I will use docker images with <a href="https://hub.docker.com/_/alpine/">Alpine Linux</a> base images. Alpine image is just 5 MB which makes it the best candidate for docker base images. We will use PHP version 5.6 and MariaDB version 10.1. MariaDB is a drop in replacement of MySQL and for Alpine only MariaDb is available. The example git repo for this blog post is available on <a href="https://github.com/geshan/laravel-mysql-docker">github</a>.</p>

<h3>Install Laravel 5.1 on local machine</h3>

<p>Run the following command:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>composer create-project laravel/laravel --prefer-dist laravel-mysql-docker</span></code></pre></td></tr></table></div></figure>


<p>I installed it on <code>~/Projects/misc/laravel-mysql-docker</code></p>

<h3>Add larael-docker.dev to /etc/hosts</h3>

<p>While it is downloading Laravel add <code>127.0.0.1 larave-docker.dev</code> to your <code>/etc/hosts</code> file. It can be
done quickly with the command below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo echo '120.0.0.1 laravel-docker.dev' &gt;&gt; /etc/hosts</span></code></pre></td></tr></table></div></figure>


<h3>Setup docker images with docker-compose</h3>

<p>We will use <a href="https://github.com/dydx/alpine-nginx-php-mariadb">dydx/alpine-nginx-php-mariadb</a> and modify it to suit our needs. It is a docker replacement for homestead. Both docker images are based on Alpine Linux which makes it small. Create the following <code>docker-compose.yml</code> file on root of the project:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>front:
</span><span class='line'>  image: dydx/alpine-nginx-phpfpm
</span><span class='line'>  ports:
</span><span class='line'>    - "80:80"
</span><span class='line'>  volumes:
</span><span class='line'>    - .:/var/www
</span><span class='line'>    - docker/nginx/sites-enabled:/etc/nginx/sites-enabled
</span><span class='line'>  links:
</span><span class='line'>    - mysql:mysql
</span><span class='line'>
</span><span class='line'>mysql:
</span><span class='line'>  image: dydx/alpine-mariadb
</span><span class='line'>  ports:
</span><span class='line'>    - "3306:3306"
</span><span class='line'>  volumes:
</span><span class='line'>    - docker/db/data:/var/lib/mysql</span></code></pre></td></tr></table></div></figure>


<ul>
<li>We are using dydx/alpine-nginx-phpfpm image named as front, it has PHP Nginx 1.8 and PHP-FPM.</li>
<li>It uses supervisor to keep nginx and PHP-FPM running.</li>
<li>We copy the all the files in current folder inside docker at <code>/var/www</code> to execute it.</li>
<li>Other volumes are there to override the sites-enabled with virtual host and supervisor config to fix an error.</li>
<li>The second definition is MySQL for which the data is saved in ./docker/db/data folder.</li>
<li>The front container links the MySQL (MariaDB) container with the name <code>mysql</code></li>
</ul>


<h3>Create needed folders</h3>

<p>In project root create the following folders:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>./docker
</span><span class='line'>./docker/db
</span><span class='line'>./docker/nginx
</span><span class='line'>./docker/nginx/sites-enabled</span></code></pre></td></tr></table></div></figure>


<p>All MYSQL/MariaDB data that would generally be stored in <code>/var/lib/mysql</code> will be linked as volume from <code>./docker/db</code>.
This is done as docker containers don&rsquo;t have data persistence. This will keep the MySQL data persisted on the host machine which will be reused when the MySQL/MariaDB container is restarted. The folder structure should
be like below:</p>

<p><img class="center" src="http://geshan.com.np/images/laravel-mysql-docker/folder-structure.png" title="Laravel, MariaDB (MySQL) and docker, docker compose folder structure" alt="Laravel, MariaDB (MySQL) and docker, docker compose folder structure"></p>

<h3>Create default sites-enabled</h3>

<p>Create a file named <code>default</code> on <code>./docker/nginx/sites-enabled</code> like below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>server {
</span><span class='line'>  server_name laravel-docker.dev;
</span><span class='line'>  root        /var/www/public;
</span><span class='line'>  index       index.php;
</span><span class='line'>
</span><span class='line'>  client_max_body_size 100M;
</span><span class='line'>  fastcgi_read_timeout 1800;
</span><span class='line'>
</span><span class='line'>  location / {
</span><span class='line'>    try_files $uri $uri/ /index.php$query_string;
</span><span class='line'>  }
</span><span class='line'>
</span><span class='line'>  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
</span><span class='line'>    expires       max;
</span><span class='line'>    log_not_found off;
</span><span class='line'>    access_log    off;
</span><span class='line'>  }
</span><span class='line'>
</span><span class='line'>  location ~ \.php$ {
</span><span class='line'>    try_files     $uri =404;
</span><span class='line'>    include       fastcgi_params;
</span><span class='line'>    fastcgi_index index.php;
</span><span class='line'>    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
</span><span class='line'>    fastcgi_pass  127.0.0.1:9000;
</span><span class='line'>  }
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<h3>Run Docker compose up</h3>

<p>Now give you are in the project root, you can run <code>docker-compose up</code> to build and run the containers.
Wait for the containers to download. You can do more customization if you create your own image and do a
docker-compose build to build the images.</p>

<p>After you run docker-compose up you will see output like below:</p>

<p><img class="center" src="http://geshan.com.np/images/laravel-mysql-docker/docker-compose-up.png" title="Laravel, MariaDB (MySQL) and docker, docker compose up output" alt="Laravel, MariaDB (MySQL) and docker, docker compose up output"></p>

<h3>Fix permissions</h3>

<p>The containers are up still as the cache and logs are not writable it will hit a 500 Internal server
error. To fix this use the following command to relax the file permissions inside the container in a
new console tab.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>docker exec -it laravelmysqldocker_front_1 chmod 0777 /var/www/storage -R</span></code></pre></td></tr></table></div></figure>


<p>or it can be done locally too with the following command:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>chmod 0777 /var/www/storage -R</span></code></pre></td></tr></table></div></figure>


<p>If you want to run your artisan commands you can run them inside the front container. Hit the command below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>docker exec -it laravelmysqldocker_front_1 /bin/sh</span></code></pre></td></tr></table></div></figure>


<p>You will get the shell of the front container then do <code>cd /var/www</code> and <code>php artisan</code> all your artisan commands are there.</p>

<h3>Access <a href="http://http://laravel-docker.dev">http://http://laravel-docker.dev</a></h3>

<p>You should be able to load Laravel in the browser now navigating to <code>http://laravel-docker.dev</code>. Here you can see the Laravel 5 default page loading.</p>

<h2>MySQL Settings</h2>

<p>You can check if MySQL/MariaDB is running by logging into MySQL locally with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mysql -uhomestead -psecret homestead</span></code></pre></td></tr></table></div></figure>


<p>This will connect to you local port 3306 and you can see that mysql is working. You can even use tools like
MySQL workbench to verify that MySQL is working fine.</p>

<p>From the container when you connect to MySQL the <code>DB_HOST</code> is not localhost anymore it should be <code>mysql</code> (as set in docker-compose.yml file) and you are all set to use MySQL. As an example have a look at the db part of .env file I used:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>DB_HOST=mysql
</span><span class='line'>DB_DATABASE=homestead
</span><span class='line'>DB_USERNAME=homestead
</span><span class='line'>DB_PASSWORD=secret</span></code></pre></td></tr></table></div></figure>


<p>The easiest way to verify if Laravel is talking to MySQL/MariaDb correctly is just run the following command:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>docker exec -it laravelmysqldocker_front_1 /bin/sh
</span><span class='line'>
</span><span class='line'>## you will be inside the front container now
</span><span class='line'>
</span><span class='line'>cd /var/www/
</span><span class='line'>
</span><span class='line'>php artisan migrate</span></code></pre></td></tr></table></div></figure>


<p>Then you will see some messages like below:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Migration table created successfully.
</span><span class='line'>Migrated: 2014_10_12_000000_create_users_table
</span><span class='line'>Migrated: 2014_10_12_100000_create_password_resets_table</span></code></pre></td></tr></table></div></figure>


<p>Now run the following queries on MySQL/MariaDb via the cli client or some other client like MySQL Workbench.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>use homestead;
</span><span class='line'>describe users;</span></code></pre></td></tr></table></div></figure>


<p>You will get an output like below:</p>

<p><img class="center" src="http://geshan.com.np/images/laravel-mysql-docker/users-table.png" title="Laravel, MariaDB (MySQL) and docker, docker compose users table" alt="Laravel, MariaDB (MySQL) and docker, docker compose users table"></p>

<h3>Stop docker containers</h3>

<p>You have seen that docker is running from the containers. To stop your containers you should run:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>docker-compose stop</span></code></pre></td></tr></table></div></figure>


<p>on the project root and it will stop the containers like below:</p>

<p><img class="center" src="http://geshan.com.np/images/laravel-mysql-docker/docker-compose-stop.png" title="Laravel, MariaDB (MySQL) and docker, docker compose stop output" alt="Laravel, MariaDB (MySQL) and docker, docker compose stop output"></p>

<h2>Next Steps</h2>

<p>You can carry on using the docker containers to replace your local Apache/Ngnix and MySQL. You can develop your Laravel applicaiton with ease using docker and docker compose.</p>

<h2>Conclusion</h2>

<blockquote><p>You can use this analogy that containers are cattle and virtual machines (VMs) are pets.</p></blockquote>

<p>Creating, deleting and reconstructing the containers should be easy, fast and seamless than VMs.
If you want to speed up your development flow and help other team members contribute faster to the project
opt for docker and docker-comopse. Happy Dockerizing and coding Laravel + PHP!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[3 Podcasts Every Software Engineer/developer Should Subscribe To]]></title>
    <link href="http://geshan.com.np/blog/2015/10/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to/"/>
    <updated>2015-10-15T07:17:09+04:00</updated>
    <id>http://geshan.com.np/blog/2015/10/3-podcasts-every-software-engineer-slash-developer-should-subscribe-to</id>
    <content type="html"><![CDATA[<p>I have been listening to podcasts since years now, though it has not been continuous. I remember listening to Lullabot podcast 7 years back in 2008. Some podcasts have good content and sound quality. Some podcasts start with a great intro music and their sound quality disappoints. In this post, I will mention 3 amazing podcasts I have been listening in past months. Every software engineer/developer should listen to them. They have great content and sound quality in all the episodes.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts/3-podcasts-sw-eng.jpg" title="3 podcasts every software engineer should subscribe to" alt="3 podcasts every software engineer should subscribe to">
(Background image Copyright <a href="https://www.facebook.com/san.supertramp">Santosh Manandhar</a>)</p>

<!-- more -->


<h2><a href="http://www.fullstackradio.com/">Full Stack Radio</a></h2>

<p>Full Stack Radio is a podcast hosted by <a href="http://adamwathan.me/">Adam Wathan</a>. A guest joins in the podcast. The duo talk about software development related topics from product design to system administration. The podcast has a consistent quality and good selection of topics. One of my favorite is when Adam talks with Chris hunt about <a href="http://www.fullstackradio.com/23">how Github does remote work</a>.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts/fullstack-radio.png" title="Full Stack Radio" alt="Full Stack Radio"></p>

<h2><a href="http://www.westerndevs.com/podcasts/">Western Devs</a></h2>

<p>Western Devs is another podcast that I like listening to. They have a panel of 5-7 participants and talking about tech topics. At times some of the participants seem to be quite still the discussion they have is informative. I liked the episode when they talked about <a href="http://www.westerndevs.com/podcasts/podcast-devops/">Devops</a>.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts/western-devs.png" title="Western Devs Podcast" alt="Western Devs Podcast"></p>

<h2><a href="http://www.startupsfortherestofus.com">Startups for the rest of us</a></h2>

<p>Startups for the rest of us is not a technical podcast. You should listen to it because software adapts to business and not the other way round. Many times its not about having that perfect code or applying that amazing pattern. It is about solving problems for people who were doing things in a manual way for example. If you have a business idea and want to start a startup this is a must listen. I liked the episode where they talked about
<a href="http://www.startupsfortherestofus.com/episodes/episode-168-things-that-dont-scale-and-why-you-should-do-them">things that done scale</a>.</p>

<p><img class="center" src="http://geshan.com.np/images/3-podcasts/startups-ftru.png" title="Start ups for the rest of us" alt="Start ups for the rest of us"></p>

<blockquote><p>I hope you enjoy listening to these amazing podcasts. It will make your free time/commute more enjoyable and productive.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[4 Pillars of a Solid Software Application and Tools to Support It]]></title>
    <link href="http://geshan.com.np/blog/2015/10/4-pillars-of-a-solid-software-application-and-tools-to-support-it/"/>
    <updated>2015-10-10T10:21:52+04:00</updated>
    <id>http://geshan.com.np/blog/2015/10/4-pillars-of-a-solid-software-application-and-tools-to-support-it</id>
    <content type="html"><![CDATA[<p>Software development is not just punching some code on the keyboard for desired output. The business side of software development always takes priority than the technicalities of it.</p>

<p>I have seen some software development teams are slow because they have a lot of technical debt. Some teams are naive, the members don&rsquo;t want to explore new things . They are stuck with 5 year old technology like FTP, old legacy framework etc. In this post, I will shed some light on the four basic and important things of a solid software application. This contents of post is language and framework agnostic. It is applicable to any software project.</p>

<p><img class="center" src="http://geshan.com.np/images/4-pillars-software-application/4-pillars-software-application.png" title="4 pillars of a solid software application" alt="4 pillars of a solid software application"></p>

<!-- more -->


<p><strong>Assumptions</strong></p>

<p>For this post I have made the following assumptions:</p>

<ul>
<li>The software development team is using some Version Control System (VCS) like git.</li>
<li>There is some form of project management and team structure in place.</li>
</ul>


<h2>Maintainable Code</h2>

<p>Making software work is super important, making it just work is a problem. I have seen teams writing code for the sake of making it work. Sometimes it feels like the code is there just for compilers/interpreters not humans. Code, simple, readable and maintainable is also important. We have discussed some rules about making code maintainable do <a href="http://blog.yipl.com.np/7-golden-rules-of-simple-clean-code/">read</a> it. <a href="http://www.slideshare.net/pirhilton/how-to-name-things-the-hardest-problem-in-programming">Naming things well</a> and writing relevant code comments is also undermined.</p>

<p>Having a culture of code review always helps. If someone else can check your code before its merged to the main branch, it is a good practice to follow. It opens up more ways to learn how to code in a practical way. Code reviews are better done in systems like <a href="http://github.com">Github</a>, <a href="http://bitbucket.org">Bitbucket</a> and <a href="http://gitlab.com">Gitlab</a>.</p>

<h2>Automated Testing with Continuous Integration</h2>

<p>Having automated tests is important. Opt for the test type that matches your team&rsquo;s current skill set. Unit testing are good to have. Writing testable code and giving team members the skill to do unit testing is an investment. Best way to approach unit testing will be grab the low hanging fruit. It will be better to start with Smoke Tests or basic functional tests. Doing a web application on each push/deployment? Check that all pages respond with a 200 HTTP response.</p>

<p>Step by step add more tests and time for your team members to gain more skills. As soon as you have some form of automated tests, wire it up with a <a href="https://en.wikipedia.org/wiki/Continuous_integration">Continuous Integration (CI)</a> service. Some good options are <a href="https://travis-ci.com">Travis CI</a>, <a href="http://wercker.com">Wercker</a>, <a href="http://shippable.com">Shippable CI</a>.</p>

<h2>Automated Deployment</h2>

<p>Finished feature should reach production from developer&rsquo;s machine in less time. It will be possible using automated deployment using latest tools. Are you using File Transfer Protocol (FTP) in 2015? You should stop it now, the first step towards automation for a FTP user is use <a href="http://git-ftp.github.io/git-ftp/">GitFTP</a>. It is an automated way to get the changed files to server than copying it over a FTP client.</p>

<p>Do one step deployment and least human work. Tools like <a href="http://capistranorb.com/">Capistrano</a>, <a href="http://www.fabfile.org/">Fabric</a>, <a href="http://rocketeer.autopergamene.eu/">Rocketeer</a> are used for automated deployment process. To sum it up, <a href="http://geshan.com.np/blog/2015/08/the-best-automated-deployment-tool-the-one-that-fits-your-needs/">the best deployment tool is&hellip; the one that fits your needs</a>.</p>

<h2>Logging with Monitoring</h2>

<p>Logs are the only way your software application talks back to you. Gather all your system, application logs and make it accessible via a web interface. Follow the logging <a href="https://tools.ietf.org/html/rfc5424">standard</a> and use free SAAS to render your logs in a readable way that gives you value. If dog is a man’s best friend, log is a developer’s best friend. Understand and exploit <a href="http://geshan.com.np/blog/2015/08/importance-of-logging-in-your-applications/">the importance of logging in your software application</a>.</p>

<p>Just having logs is not enough, view your logs after each change. Always check your logs after each deployment to track any suspicious activity. You can use <a href="http://logentries.com">Logentries</a> or <a href="http://loggly.com">Loggly</a> for cloud logging.</p>

<h2>Conclusion</h2>

<p>I have not focused on the server and devOps part of the software application and deployment. These are the practices all software engineers should adhere to. These should be the goals whenever a new project starts.</p>

<blockquote><p>Without 4 stable legs even a chair falls. Save your application from going down follow these 4 practices.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to Use Simplified Gitflow Branching Model [Video]]]></title>
    <link href="http://geshan.com.np/blog/2015/09/how-to-use-simplified-gitflow-branching-model-video/"/>
    <updated>2015-09-25T17:16:23+04:00</updated>
    <id>http://geshan.com.np/blog/2015/09/how-to-use-simplified-gitflow-branching-model-video</id>
    <content type="html"><![CDATA[<p>Just knowing git and all team members pushing code to the main branch (master) is not a good practice.
To leverage the most out of git, it is a good idea to do feature branching and follow a branching model.
GitFlow is one of the options for doing a feature branching model but it is not so straight forward,
In this blog post with a video and presentation I would elaborate on how a team can use <code>simplified gitflow</code>
and get the most out of using git.</p>

<p><img class="center" src="http://geshan.com.np/images/simplified-gitflow/simple-git-flow.jpg" title="Simplified git-flow" alt="Simplified git-flow"></p>

<!-- more -->


<h2>Slides</h2>

<center><iframe src="//www.slideshare.net/slideshow/embed_code/42503092" width="510" height="420" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe></center>


<p>You can also view the <a href="http://bit.ly/1KzaNbj">interactive slides</a>.</p>

<h2>Video</h2>

<center><iframe width="560" height="315" src="https://www.youtube.com/embed/nwM2U-38JP8" frameborder="0" allowfullscreen></iframe></center>


<p>I talk about git flow for the first 15-16 minutes then I start answering questions on git and gitflow. Then
I explain about other things in git which can be helpful. I did this presentation at <a href="http://yipl.com.np">YIPL</a>
on 11-Mar-2015. I know its a late post its like a part 2 of <a href="http://bit.ly/s-git-flow">Do you git your code? Follow this simplified gitflow branching model to improve productivity</a>.</p>

<blockquote><p>Hope you learn something new about git and simplified gitflow from this video.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Best Automated Deployment Tool Is... The One That Fits Your Needs]]></title>
    <link href="http://geshan.com.np/blog/2015/08/the-best-automated-deployment-tool-the-one-that-fits-your-needs/"/>
    <updated>2015-08-29T15:22:48+04:00</updated>
    <id>http://geshan.com.np/blog/2015/08/the-best-automated-deployment-tool-the-one-that-fits-your-needs</id>
    <content type="html"><![CDATA[<p>The process of getting completed feature or bug fix code from the development environment to
your web servers is web software deployment. We have been deploying code in various ways, a
decade back we were used to uploading our files using File Transfer Protocol (FTP). I would
not considering copying files from the development machine to a web server a form of automated
deployment, basically it was a necessary evil at that time.</p>

<p>If you still use FTP at this time like <a href="http://bit.ly/sw-eng-np-pt3">22%</a> of Nepali developers you really need to move on. In this post I will briefly mention some deployment tools and try to analyze their pros and cons. Still as the title reads the best automated deployment tool is the one that best fits your needs.</p>

<p><img class="center" src="http://geshan.com.np/images/deployment-tools/fabric-deployment.png" title="Automated Deployment demo" alt="Automated Deployment demo"></p>

<!-- more -->


<h2>What is automated Deployment?</h2>

<p>Generally web application deployment needs some pre-defined steps to be done so that the software
changes are shipped from the development environment to staging/production environment. It is done
so that the changes are available for customers/users to use the new features developed by the
engineering team. If some or most parts of your deployment process is manual it is not automated
deployment. For example if you ssh into your server and do a git pull it can&rsquo;t really be considered
automated deployment process.</p>

<blockquote><p>Automated deployment is a form of deployment where the defined steps for shipping code from a
development environment to staging/production environment is one step procedure and fully or partially
automated.</p></blockquote>

<p>In my opinion, automated deployment is a language/framework agnostic need for every application as it
saves lots of time and it can be one of the first steps towards devops culture. It is something both
the development and system admin/devops team can work together to automate things. It will also open
doors to further automation like continuous delivery, for example your tests pass on a CI service and
the code can be deployed automatically to your staging servers.</p>

<h2>Automated deployment characteristics</h2>

<p>It should have the following characteristics :</p>

<ul>
<li>It can be trigged with just one action like one command on the command line and it will do the job.</li>
<li>The steps will be pre-defined, reproducible and predictable.</li>
<li>There is little or no human intervention from the start to the end.</li>
<li>It should show the deployment progress as it happens, better feedback</li>
<li>It should be atomic, which means either all the steps are completed or nothing happens.</li>
</ul>


<h2>Good to have features</h2>

<p>Some good to have features for automated deployment tools are</p>

<ul>
<li>It should be able to deploy the same code in multiple servers</li>
<li>Each deployment should be done from a given branch/tag/commit of a Version Control System (VCS) like git</li>
<li>It should trigger notification in the form of email/chat message</li>
<li>Everyone should be able to view which branch/tag is deployed</li>
<li>When a deployment is in progress, it should stop other deployment to start</li>
<li>Rollback of the last deployment should be easy and fast.</li>
</ul>


<h2>Free Tools available</h2>

<p>Lets look at the free tools available and their popularity as per github activity
in the table below:</p>

<table>
<thead>
<tr>
<th> No. </th>
<th> Name       </th>
<th> Written In </th>
<th> GitHub Link </th>
<th> Github Stars </th>
<th> Github Watchers </th>
<th> Github Forks </th>
<th> Open Issues </th>
<th> Open PRs </th>
</tr>
</thead>
<tbody>
<tr>
<td> 1   </td>
<td> <a href="http://capistranorb.com/">Capistrano</a> </td>
<td> Ruby       </td>
<td> <a href="https://github.com/capistrano/capistrano">Link</a>        </td>
<td> 7457         </td>
<td> 328             </td>
<td> 1253         </td>
<td> 47          </td>
<td> 3        </td>
</tr>
<tr>
<td> 2   </td>
<td> <a href="http://www.fabfile.org/">Fabric</a>     </td>
<td> Python     </td>
<td> <a href="https://github.com/fabric/fabric">Link</a>        </td>
<td> 5805         </td>
<td> 315             </td>
<td> 1017         </td>
<td> 256         </td>
<td> 124      </td>
</tr>
<tr>
<td> 3   </td>
<td> <a href="http://mina-deploy.github.io/mina/">Mina</a>       </td>
<td> Ruby       </td>
<td> <a href="https://github.com/mina-deploy/mina">Link</a>        </td>
<td> 2694         </td>
<td> 92              </td>
<td> 267          </td>
<td> 30          </td>
<td> 10       </td>
</tr>
<tr>
<td> 4   </td>
<td> <a href="http://rocketeer.autopergamene.eu/">Rocketter</a>  </td>
<td> PHP        </td>
<td> <a href="https://github.com/rocketeers/rocketeer">Link</a>        </td>
<td> 1721         </td>
<td> 81              </td>
<td> 142          </td>
<td> 73          </td>
<td> 5        </td>
</tr>
<tr>
<td> 5   </td>
<td> <a href="http://deployer.org/">Deployer</a>   </td>
<td> PHP        </td>
<td> <a href="https://github.com/deployphp/deployer">Link</a>        </td>
<td> 1322         </td>
<td> 84              </td>
<td> 192          </td>
<td> 17          </td>
<td> 5        </td>
</tr>
</tbody>
</table>


<ul>
<li>data is from 29-Aug-2015</li>
</ul>


<h2>So which one should I choose?</h2>

<p>I cannot give you a clear cut winner from the above table, it will depend solely on your needs.
Still as per your needs I can describe briefly the two tools I have used do. I have used <a href="http://capistranorb.com/">Capistrano</a> and <a href="http://www.fabfile.org/">Fabric</a>. Let&rsquo;s look at how
they differ.</p>

<h3>Capistrano</h3>

<p>Capistrano written in ruby has been around as an automated deployment tools for years not, its quite stable and has support for lots of languages and frameworks from symfony to NodeJs etc. You can get more
information about it from this <a href="https://changelog.com/110/">podcast</a> and the official <a href="https://github.com/capistrano/capistrano/blob/master/README.md">docs</a>.</p>

<p>The good thing about Capistrano is it already has a defined <a href="http://capistranorb.com/documentation/getting-started/flow/">flow</a> on how to deploy applications.
If you can understand the flow <a href="https://raw.githubusercontent.com/mpasternacki/capistrano-documentation-support-files/master/default-execution-path/Capistrano%20Execution%20Path.jpg">visually</a> and know how to make/edit a recipe and
structure your tasks you are done. Another good thing about Capistrano as it keeps versions of releases
and does a symlink switch when the view version is ready. Same thing for rollback, it is fast because
basically it is just a symlink switch to the immediate old successful deployed version of the code.</p>

<h3>Fabric</h3>

<p>Python fabric is also an old player in the automated deployment domain, check its <a href="http://docs.fabfile.org/en/1.10/">docs</a> too. You can also get deployment
scripts for some applications but the thing here is it is more like a remote command runner. You
get a clean slate to structure your deployment process as you want then you can write your
deployment commands and run then in the sequence you want. It give you the freedom to write the way
you want and choose the sequence of tasks you want for your deployment procedure.</p>

<h3>Other tools</h3>

<p>Generally other tools are based on Capistrano style deployment, some say they are faster than Capistrano
because they batch the ssh commands and run them once etc but the basic idea does not really change. I
cannot peronally endorse any other tool as I have used them by my own.</p>

<h2>What next</h2>

<p>If you are already doing automated deployment you can look at making it even easier, like deploying
from a Chat interface like Hipchat or Slack. It is termed as <a href="http://blog.flowdock.com/2014/11/11/chatops-devops-with-hubot/">ChatOps</a> where one can instruct a
bot to deploy an application. If you don&rsquo;t want to go the chat path, you can even build a web interface
to trigger deployments like <a href="https://developer.zendesk.com/blog/introducing-samson-a-web-interface-for-deployments">Samson</a> by Zendesk.</p>

<p>If you have your tests running you can even explore continuous delivery.</p>

<p>Further more the whole deployment process can be revamped with introduction of containers and
<a href="https://www.docker.com/">Docker</a>. If docker is setup right, you may not even need deployment tools but
it will surely take lots of resources to get the docker setup running and functioning correctly for
production usage.</p>

<h2>Conclusion</h2>

<p>The decision to choose the right deployment tool that fits your language/framework, application and team
needs will be yours. Try choosing a tool that will do the job well and can be used for a long time without
big problems.</p>

<blockquote><p>So the main catch here is, if you want to deploy a big application, want stability and structure go
for the safer option like Capistrano. If you are just starting with automated deployment for a smaller
application and want to automated deploy with your own custom flow use Fabric for its flexibility.</p></blockquote>

<p>Choose the right tool and get started with automated deployment. Happy Automated Deploying. Bye Bye FTP and ssh into a server then <code>git pull origin master</code>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building Your Next Product, Get Your HTTP API Working First]]></title>
    <link href="http://geshan.com.np/blog/2015/08/building-you-next-product/"/>
    <updated>2015-08-22T14:00:22+04:00</updated>
    <id>http://geshan.com.np/blog/2015/08/building-you-next-product</id>
    <content type="html"><![CDATA[<p>We have seen many technology software products coming, some coming up as the next big thing, some
a multi-tenant Software As A Service (SAAS). Sometimes I see lots of new, useful and innovative
products on <a href="http://www.producthunt.com/">Product Hunt</a> and think how would they have planned such
amazing products. If you are planning to build your software product, this post will unfold why
you should make your web Application Programming Interface (API) working first.</p>

<p><img class="center" src="http://geshan.com.np/images/product-http-api/rest-json.jpg" title="JSON APIs" alt="JSON APIs"></p>

<!-- more -->


<h2>Introduction</h2>

<p>There are many startups listed on <a href="http://startupsinnepal.com/">StartUps In Nepal</a> as well, I hope
these people have a good backend infrastructure and have given enough importance to making their technology
strong and scalable. If anyone is trying to rewrite a product or thinking of redoing their product I would
really suggest to go the API oriented path.</p>

<p>If you are thinking of the next big product or planning a startup/product, it is a good idea to not jump start
a <a href="https://en.wikipedia.org/wiki/Monolithic_application">monolithic application</a>. Surely if you have less time/budget
or want to just build a prototype may be to pull up some investment it is advisable. If you are thinking of a long-term
product to be used by lots of people start planning your APIs.</p>

<h2>HTTP APIs first, language/framework second</h2>

<p>Rather than just deciding about the language/framework for your application, rise above it and think about HTTP APIs
that will be needed to complete your applcaiton or the Minimum Viable Product (MVP). How to make user of the <a href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> verbs/methods
GET, POST, PATCH, DELETE etc and make it easier for the clients to call your backend should be planned then you can
decide on the platform (language/framework) that can be used to realize the plans.</p>

<h2>SOA, Microservices or something else</h2>

<p>You can go a <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Service Oriented Architecture(SOA)</a> path
or even look into <a href="https://en.wikipedia.org/wiki/Microservices">Microservices</a>. It is also advised to do
RESTish/RESTful or somehow <a href="https://en.wikipedia.org/wiki/Representational_state_transfer">REST</a> based API which
accepts and gives out <a href="https://en.wikipedia.org/wiki/JSON">JSON</a>. If you don&rsquo;t want to make more desicions about
the data structure and how to accept or give out data, try implementing your APIs following <a href="http://jsonapi.org/">JSON API</a> specification.</p>

<h2>Strong backend and multiple clients</h2>

<p>If you are able to plan all your data communcation getting and giving out data to clients in the form of resource URLs,
then you can build a strong backend. When you have a strong and scaleable back-end it can handle multiple clients easily. If you have a performant backend then the same backend can serve a front-end Javascript framework or a mobile applicaiton as a client in a speedy and consistent way.</p>

<h2>Why not build frontend parallel</h2>

<p>If the HTTP backend is designed and documented well before creating it even a <a href="http://nobackend.org/">front-end first</a> approach can be done. In this case, the frontend can be developed in parallel with the backend, if there is any change it can be adjusted accordingly.</p>

<p>If your budget and resources support you can have two teams backend and frontend going in parallel to build and realize your dream product. And remember a mobile application is just another frontend client to the scaleable backend your have already built.</p>

<h2>Mobile first is a side effect</h2>

<p>If you have a strong and well documented backend HTTP APIs it can be called easily from the your mobile applicaiton to post or receive any information. Becuase is data is stored centrally on a persistent store the backend HTTP APIs work like a communication layer between your mobile applications and the data store.</p>

<h2>Speed and performance is another good side effect</h2>

<p>With great brackends all your system needs to serve is JSON and accept only JSON over HTTP following the HTTP way of working. This means the backend does not need to spit out any HTML so there are no views to code or maintain. As the view and some of its logic is decoupled and placed on the the frontend apps the backend is fast and the performance can be fine tuned from the backend perspective.</p>

<h2>Conclusion</h2>

<p>Though it looks all shiny from outside, still it is a resource intensive task to develop HTTP API backend and have multiple frontends. Both can go in parallel but it needs well planning, documentation and even better execution. That is why it is generally not recommended for web agency kind small projects but having backend HTTP APIs is applicable to products which have long life.</p>

<blockquote><p>Have fun building backend HTTP APIs for the next big thing product in your mind.
If you build your product following API oriented architecture, mobile first, speed and performance are its great side effects.</p></blockquote>
]]></content>
  </entry>
  
</feed>
