Sohan's Blog

Living the Developer's Life

So You Want to Be a Software Developer. Where to Start?

You didn’t go to college to study computer science and you have no background on computer programming. You’re not quite happy with your current job area, and looking forward to something more rewarding and exciting. You’ve heard software development is generally a good area and often times people without any prior software background can actually get a job. But where do you start?

First, you’re thinking in the right direction, and I can assure you that if you like making things and have a nack for problem-solving, you can learn the skills to become a programmer. Now, let me share a path forward from here:

  1. Take an online course and learn a programming language. I’d suggest learning the programming language Ruby, using the courses offered by CodeSchool

  2. Build a demo application. Here’s an idea: Make an app for tracking personal expenses so that you can enter all your expenses and see reports about your expenses on a weekly / bi-weekly / monthly basis by type of expense such as food, transportation, accommodation, utility etc.

  3. Publish the application to the internet. Use Heroku to pubish your app to the internet and use it for yourself. When things don’t work as expected, fix bugs or extend the application to better serve your needs.

I’d say spend about 6 months on the steps 1-3. Once you’ve an application that you’re somewhat proud to show to your friends or prospective employees, it’s a sign that you’re progessing. But don’t apply for jobs just yet. I’d suggest spending another 6 months to learn a few more fundamental programming topics:

  1. Algorithms: Take an online course on basic algorithms to understand the different types of algorithmic approaches that can be used to solve known problems.
  2. Data structures: Take an online course on data structures since you’ll need to use them on a daily basis and this is one of those topics where it’ll be hard to learn on the job from no prior background.
  3. Object oriented concepts: Take an online course to understand the fundamental concepts behind object oriented programming. It takes years to master the concepts, but taking a course will greatly help you to get the basics right.

If you spent a year of your free time (8-10 hours a week), you’ve now acquired the basics that will be required to find a job. Obviously, you can squeeze it in a much smaller time window if you dedicate more time and already have some background with math / computing skills. But at a mimimum, I think it’ll take six months for most people to get there.

Now, I’d suggest you to take two bootcamps. The bootcamps are great in two ways. First, you get to work with peers and immerse into building something. Second, you can judge yourself against the peers to understand where you stand against the pros and newbies. Take notes and get ready for a second bootcamp. This time, the idea is to understand if you’ve improved since the first bootcamp and able to perform better than the first time.

After the bootcamps, if you’re feeling positive, it’s time to start looking for jobs. Make sure to find a job that matches your skills and keep an open mind about accepting a job that may not pay top dollars yet. If you find a job, and you’ll, go ahead and take it. You’ll be learnig at a fast pace on the job, and if you’re good, you’ll be rewarded accordingly either on the current job or on a new job. The idea is to focus on learning on the job, but also off the job to learn topics that may not be of interest on the job.

If you followed this plan, I expect you to get your first job as a programmer in 1.5-2 years, and get profecient in 4 years. Prepare accordingly. May be the 4 years is worth when you consider you’ll be happier and better rewarded for many more years to come.

Why Do You Want This New Job?

No matter which side of the table you’ve sat during interviews, you’ve probably heard this question: ‘Why do you want this new job?’

In the recent past, I’ve interviewed a few candidates and heard the following answers so far:

  1. I’m not learning much on the current job after it’s been 2-4 years.
  2. I’m looking for something that offers better work-life balance.
  3. I’m not really looking for a job. The recruiters got in touch and I thought I’d discuss.
  4. I’m looking for more challenging work.

All of the above are valid answers. I think there’s another perfectly valid answer that candidates seldom mention probably due to the gravity of the interview room situation. I’ve interviewed over a hundred candidates across different companies and am yet to find anyone that mentions: I am not happy with my current salary and benefits compared to my skills

Back to topic of answers. So, when someone answers that they are not learning new things on the job, obviously, you’d be curios to know why and how they have tried to change things. Unfortunately, most candidates simply mention that they are doing repeat work and there’s not much to learn doing the same thing over and over again. This is where I start feeling a little uneasy. However, I understand that it’s a true statement. If you’re in a similar situation, here’s some suggestion: read books, and write code based on what you’ve read. Then, you can tell a much convincing story that, I’ve forced myself to learn new things and here’s some proof, but I really want to apply the newly learned skills outside the scope of the “hello world” skills.

About work-life balance, I totally hear you. And if your current job doesn’t suit what you need out of your life, it’s a perfectly valid reason to look for new opportunities. However, make sure you’re able to clearly set the expectation with your potential employer about what work-life balance means for you. For example, if you can’t work over 40 hours a week, or must work from home one-two days a week, it’s best to discuss this even before an interview starts to ensure you’re a good match with the employer.

If you showed up at in interview just because a recruiter got in touch, I’d say introspect first. It’s possible that on our subconcious mind you have expectations that the potential of the new job offers you something that you don’t get at the current job. So, instead of a passive asnwer that the you simply acted based on the recruiter’s invite, it’s much convincing to see if you can lay down one or two things that you expect from the new job that you don’t get at the current job.

About looking for more challenge, it sounds like a cliche unless you can share examples of work that is of challenging to you. May be you like the challenge of using more complicated algorithms, may be you like dealing with a lot of data, may be you like supporting production emergencies, but there’s gotta be something that you can explicitly mention as challenging. It helps employers to understand if they’re able to provide you with enough challenge on the job.

Finally, if you’re looking for a new job because the current job isn’t paying upto the level of your skills and contributions, make sure to communicate it clearly as well. With salaries and benefits, I find it much easier to work with people that know the actual $ figure that’ll make them happy instead of beating around the bush to create confusions all around. Just be confident and tell what makes you happy. If the employer can afford it, most likely they’ll want to get you onboard as a happy employee. If they can’t afford it, they’ll do their best. The key here is to be explicit about what you want and be sure and confident about it.

In a nutshell, when you walk into an interview it’s yours to lose. The potential employer is investing their time and resources and would rather have you hired than having to interview other candidates. As long as you are able to justify why you want the new job, they’ll be quite accommodating.

2017 and Beyond

2017 will be the year to get closer to my PhD defense, and spending my time with family and dear ones. It means a stricter control on the daily use of social media. That’s pretty much it.

I’ll sharpen my focus on events and matters that I can influence with the aim to get better at achieving the most within my limited circle of influence. This is a fairly small circle; myself, family, team at work, and a handful of friends.

Wishing everyone a happy new year.

Annual Letter

2016 Highs and lows

Baby #2, it’s a girl

Shera, our little daughter, was born this year. She has been happy, healthy, and an absolute source of joy. Almost hard to believe that we somehow sustained the pregnancy period of my wife, while also running after our active toddler son, Shopoth. Such a pleasure to see the two already reaching for one another, cuddling, giggling, and occasionally fighting.

Canadian Citizenship, eh!

I’m very glad and proud to be a Canadian citizen starting this year. I just realized that I spent 21% of my life in Canada already! For those of you that haven’t been to Canada yet, you should visit some time for it’s one of the most beautiful places on earth with people of good heart.

Life & Work, well balanced

Mostly doing 40-hour work weeks and working from home once / week. The team I’m managing has built up on solid foundations now. This is super exciting to see motivated people working on challenging projects and consistently delivering quality outcome.

Personal finances, thumbs-down

While the return on my experimental investing portfolio has been great, I didn’t make good on the car-buying decision. Ended up getting into a 4-year lease on a car that has more seats than our living room, and we only really needed it for the summer while we had family with us.

Health, got lazy

Honestly, it was a tough year to dedicate time for health. I know you’re thinking “it’s a lame excuse.” On the bright side, our team won the friendly soccer tournament this summer, and played soccer almost each of the Friday nights starting October. However, I got lazy otherwise. Probably also just too tired from the kids and housework at times.

Relationships, so-so

Met some friends and had a few phone calls with friends throughout the year. But, I failed to connect with relatives outside my first family. This is likely a result of being so far physically, but also something that only gets worse unless actively taken care of.

Remote work, didn’t work too well

We spent the first month of 2016 in Bangladesh with family. It was my first time experiment working remotely with a 12 hour timezone difference. It was fun to start. But I could feel the stress of having to stay up till 2-3AM each night and dealing with Internet latency issues. While I had a decent accommodation and a makeshift office arrangement, it got harder to get enough sleep. Next time if I work remotely, I will limit my commitment to midnight.

Misc. things

  1. Continued our charity program financing to support education in Bangladesh.
  2. I didn’t have any public speaking session in the whole year for the first time in past 10 years.
  3. Ended up spending too much time on social media for little gain.
  4. While made some progress towards my PhD thesis, didn’t submit any paper.

There’s a 2nd post coming about the new year’s resolution. Come back in a few days.

Rails: Please Include a JS Test Runner

For an opinionated framework like Ruby on Rails, I expect it to come pre-bundled with a CoffeeScript based test framework and test runner. Here’s why:

  • Teams don’t need to waste time deciding which one to use among the mess of Jasmine, Mocha, Expect, Sinon, Chai, Bower, Grunt, Teaspoon, Npm… you name it.

  • It’d work better than what’s out there since the Rails team will focus on clean integration with Rails and will have a much larger user base to collect contribution from.

I’d prefer Jasmine to be the test framework and a runner similar to teaspoon that can run the specs both on the command line and on the browser, with asset pipelines enabled.

Rails made a huge promise to test automation by shipping with a nicely structured way to test the ruby code and doing the same for JS would make life better for so many people like me, I believe.

You Can Haz Automated REST API Documentation

Let’s face it, the manual process of documenting REST APIs sucks big time. The process goes like this:

  1. Craft a cURL request for an API Endpoint.
  2. Copy the response.
  3. Narrate the API, paste the cURL and response on an editor.
  4. Edit the response, describe necessary request and response headers, query parameters etc.
  5. Repeat steps 1-4 for each of your tens of Endpoints.
  6. Publish the documentation on the web.
  7. Repeat these steps for each release.

This is a laborious process. However, it doesn’t have to be this way. Meet SpyREST to see how it produces purely organic, automated, replayable, published, version aware and customizable API Documentation for you.

This is how it works:

  1. You script the API calls using any scripting you prefer, including bash/cURL, automated test frameworks, etc. For example, using a test framework:
1
2
3
4
5
6
7
describe 'gists' do
  it "List a user's gists since a time:" do
    response = Github.get '/users/smsohan/gists?since=20140101T00:00:00Z', @common_options
    assert_equal 200, response.code
    refute_nil response.body
  end
end
  1. Use the SpyREST http proxy http://SpyREST.com:9081 to perform this call on a real API.
  2. You get the same response, and SpyREST produces a fully baked API documentation as you see here:

Try here if you want to see for yourself:

1
curl -k -x "http://spyrest.com:9081" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/users/YOUR_GITHUB_USER_NAME/gists"

See the documentation at

http://spyrest.com/api_resources/gists?api_host=api.github.com&api_version=v3

Drop me a line if you’d like to use this to publish your API documentations.

2015

This is a much shorter new year post. 2014 was the year of focusing on health, soft-skills, Haskell, social contribution and PhD in addition to typical everyday stuff. Hoping 2015 will be the year of:

reconnecting with friends and relatives

perfection

While Facebook and Twitter make it easy to browse through my friends’ photos and status updates, I feel quite reluctant to interact on these media. Also, this passive mode of keeping in touch sucks, since my friends are largely unaware of the fact that I still care. So, 2015 will be the year when I regularly call people, and talk to them on the phone/skype/in person.

Perfection. On most occasions I’m happy if something I tried yielded just enough. 2015, I’ll strive for perfection beyond just enough.

Wishing everyone a joyful 2015, Happy new year.

Lessons Learned: Entrepreneurship and Innovation Course

This fall semester, I signed for the Entrepreneurship and Innovation course (ENTI 781) at the Haskyne Business School of University of Calgary. Wanted to capture my thoughts on this course for my readers here.

First, the course was unconventional since there are very little academic material to teach entrepreneurship and innovation. The teacher, Olga Petricevic, did a decent job of collecting materials comprising of academic papers, case studies, newspaper articles and YouTube videos as well as bringing in a local entrepreneur for a lecture one day. But none of these were the highlights for me.

The course had a few assignments and I liked a couple to be specific. In one assignment, the students were asked to find a project in Indigogo or Kickstarter to put their own money. This was eyeopening, as I had hard time finding a project that looked to have any potential to become a successful venture. Moreover, even if I liked it, there were almost no incentive to “donate” your money since all you got was a token for your money in a way that you bear the risk without any potential for a profit.

The other assignment was about compiling a list of 50 things that bug me in everyday life. This was the most fun assignment of the semester and I had a decent list with bugs such as:

1. Did I leave the stove on while leaving the house?
2. Vacuum cleaning the stairs.
3. Finding a plumber NOW.
4. Waiting at airport.
...

All in all, the worst assignment was the group assignment. The group I worked with was very collaborative and did a great job in keeping everyone in sync with clear messaging around individual expectations. However, the project itself sucked. We were asked to create a stupid business plan for a venture around “watervate” - innovative solution to save water that could turn into a profitable business. In an entrepreneurship course, the deliverable was a business plan, with detailed text on the product, marketing, strategy, financial data etc. that were completely fake. The fakeness of the whole assignment made it super boring for me.

After finishing this course, I actually have a better trust in online education. The course was unplugged, so students had to keep digital devices off. But on one class the rules were lax because it was about presenting. I saw people browsing sports scores, watching memes, playing games and random youtube videos etc. right in the class. These students are mostly MBA students, holding a good day job, but it hurt my eyes to see them paying so little respect to the fellow students presenting.

Online education on the other hand, is so much so for self driven students that, I expect them to carry much respect for their own time. I suggest people taking online courses to save their money and time and also to learn better than traditional classroom settings.

What’s Wrong With the Default Alert Rendered by the Browser?

Browsers have carefully crafted the alert and confirm dialogs for everyone under really simple APIs as follows:

1
2
alert('Failed to send the email. Check your network connection.');
confirm('Are you sure you want to delete this email?');

While writing cross-browser JavaScript is not as painful today, custom implementation of these natively supported dialogs seem to be a complete waste of money and time to me. With all the different browsers that we have to support today, including the mobile browsers, it seems a lot of wasted effort in trying to render a custom alert and confirm dialog under any circumstance. I’ve never implemented one, but if you ever attempted, you probably know how much work it is to get it right and consistent. Here’s a short list of requirements if you want to build one:

  1. Should work on all browsers.
  2. Needs to disable all other controls on the website.
  3. Needs to be on the view port so the user can take an action immediately.
  4. Should not leak any memory if used repeatedly on a single screen.
  5. Should be fast.

While I’ve seen some magicians to make these requirements look silly and do a decent job of implementing a custom version of the alert and confirm dialogs, I’m yet to see one that satisfies all the above essential requirements, and does a better job than the browser’s native implementations. If you haven’t looked recently, see the current rendering of the confirm dialogs across different browsers:

Safari Chrome FireFox iPhone

If you look carefully, you’ll see subtle things. For example, did you notice the nice shadows around the confirm dialogs rendered on Chrome and Safari? There are live effects on the cancel and ok buttons as well, where you’ll see a little shining effect on the ok button. These are carefully crafted buttons. The Cancel and OK button are perfectly sized for fat fingers on the iOS safari. Also, these are familiar to the users, so they immediately know what they are clicking on. Keyboard navigation works as expected. And lastly. the buttons will change labels based on your preferred language settings. All for free. Now, try to replicate that on your custom control, across all these browsers and show me how it does any better.

If your sole business is indeed building these custom dialogs, you can probably invest the time and money here. But as far as I’m concerned, I’d not put a single $ from my pocket if I was funding a project to either build such custom implementations or using your custom implementation. I’m aware of the fact that, even if it’s free and open source, it still requires additional maintenance dollars.

As a user of web, I’ve never been bothered by the websites that show me these familiar browser rendered alerts and confirms. Were you?

100 Miles, a 100 Miles…

So, on the 18th of October, 2014, I’ve completed my goal of running a 100 miles in 50 days and wanted to share some data for my readers. Enjoy!