7 Habits I Wish Every (Junior) Programmer Should Have

Over the last 11 years as a programmer, I have made some habits that have helped me in my day to day work. In the process, these habits have successfully translated into productivity and they have made me more organized.
I consider these as essential habits that every programmer should have, but I find them missing especially in junior developers. In my case, I was fortunate enough to be mentored by my seniors, who taught me these basic stuff. In this blog, I will share 7 habits that must be inculcated to become an effective programmer.

Habit 1: Spend time to organize stuff

As a software developer, we have to work with many files like installers, project sources, documents,etc. Make a directory layout with a separate directory for each topic. For example, I put all the softwares in the tools directory, project source code in the dev directory, and technical books or documentation goes to the books directory. Inside each directory, there are sub-directories for different sub-topics. Below you can see a directory layout that I use on my machine.

| — books
| | — java
| | — javascript
| | — mobile
| ` — react
| — dev
| | — office
| | — opensource
| | — personal
| ` — tmp
` — tools
| — browser
| — editors
| — ide
` — vms

Habit 2: Use version control for everything

Make sure you put all the projects in a version control system. You can use it for taking backups or for storing revisions of your software projects. I use Git along with Github for all my projects both personal and official. I have a Github repository called writings where I store my blogs, articles, or a random list of things. Couple of years back, I wrote one book. I used Git to store my book artifacts including content, images, invoices, source code etc. Using a version control helped me in analyzing my writing habits. For example, the Github repository contribution graph shown below clearly shows my writing flow during that period.

Habit 3: Invest in books

Gone are those days when we can survive with our limited skills. But, nowadays we must keep ourselves updated with latest technologies. I find books as the best medium to learn. Whenever someone asks me how to learn a specific topic or how I learned, then I recommend them a couple of books. The immediate question that I am asked is Do you have a PDF for the book? or Can you refer me to the location from where I can download it for free?. My answer to them is Always invest in your learning. Buy an original book be it an ebook or a paperback. When you invest your money, you make an effort to read.

Habit 4: Don’t fear the command-line

Most junior programmers fear the black screen i.e. terminal. They are always looking for the GUI tools that they can use instead of poking with the command-line. I have met many developers who are unaware of the most basic commands of their terminals. What I have learned over the years is, you spend more time in the terminal than on any other tool. Even learning the basics of the command-line can take you very far. There are tasks that can be performed more quickly with command-line tools than any GUI tool. For example remote SSH. Also, you can automate stuff by putting commands in a script easily. Every developer should try to at least learn the basic commands like cp, mv, find, grep, ps. One reason why beginners find command-line difficult to use is, they are overwhelmed by the help offered by man pages. It contains so much information that most of the time you don’t understand what to do. I have recently discovered a very helpful node.js module tldr that gives just enough information one needs to know to use a command. An example is shown below.

$ tldr zip
Package and compress (archive) files into zip file.
- Package and compress multiple directories and files:
zip -r compressed.zip /path/to/dir1 /path/to/dir2 /path/to/file
- Add files to an existing zip file:
zip compressed.zip path/to/file
- Remove unwanted files from an existing zip file:
zip -d compressed.zip “foo/*.tmp”

Also, I find Conquering the Command Line book by Mark Bates as a very good introduction to most commands that we need to know.

Habit 5: Master your IDE(tools)

A good craftsman always master his tools. This should be true for us programmers too. Knowing the shortcuts of your editor or IDE can make you productive and help you in writing less code. Developers should know refactoring shortcuts like extracting a method or renaming stuff. When you use shortcuts a lot, then actions like formatting a code becomes ingrained. You don’t even have to think about it,you automatically do the right stuff. IDE like IntelliJ and Eclipse have one shortcut that can give you a list of all other shortcuts. For IntelliJ it is CMD+Shift+A on Mac or Ctrl+Shift+A on Windows. Always keep a cheatsheet of your favorite tool handy.

Habit 6: Write and share everyday learning

We all learn something new each day. It could be a new command, a shortcut, a new tool, a new language feature or something new in your web framework. Start sharing what you have learned today with the world by posting a small blog post or creating a Github repository where you can keep all your tips. I started blogging in 2009 and it has been one of the best decisions of my life. Had I not, I don’t think I would have become a technology evangelist and later ended up writing a book. Yesterday, I found a very cool project by Josh Branchaud called TIL Today I learned. Josh is maintaining this repo for last one year and has collected more than 300 tips that he had learned. A very cool idea indeed!!

Habit 7: Watch conference videos

One habit that I introduced early in my professional career is to watch technology conference videos on Infoq. Most of the conferences post their videos either on Youtube or Vimeo. Watching good programmers can not only help you in understanding a topic, but it can also motivate you to learn and become like them. Good programmers talk very passionately and I swear that is infectious. Most of the technology videos are also hands-on so you can learn how they use their tools or other day to day things that are not part of the topic. Often, my reading list comes from these good programmers.

I consider the above points as good habits that developers should adopt. They have helped me a lot.

If there is no opportunity then create one…

In 2005, I joined a company as a trainee programmer right after finishing my college. I did Mechanical engineering(2001-2005), but during the campus placement I was placed in a software company so I ended up in the IT industry. I had no programming experience when I started my first programming job. I know it sounds weird, but many Indian software programmers start with a limited programming knowledge/experience.

My first year as a programmer was very rough. I spent most of the time looking at other people’s screen(pair programming) and trying to understand how I can fit myself into this world. It was demotivating and most of the time I felt like giving up. Programming is tough and when you don’t know where to start it becomes much more difficult. Before you Google something you need to know what you want to Google.

During my first year appraisal meeting, my manager asked what rating he should give me? Rating was from 1 to 5 where 1 being the highest and 5 being the lowest. He said he can’t give me 5 because I have not done anything wrong in the company. And, he can’t give me 1 or 2 because I have not done anything good in my daily work. So, the only two valid choices were 3 and 4. Then, he asked me why didn’t I perform well? My answer was,  “You didn’t give me any opportunity to work.” He responded, “Why didn’t you create one?” I didn’t say anything after that. He said that he will give me 3 rating like he had given to others in my team.

This 5-minute meeting had a profound impact on me. Since my first year, I have applied this many times. And, each time it worked!

Most of the time we don’t succeed because we don’t get out of our comfort zone and ask others for their help or opinion. We stick to our old ways of working and we never try to change our mindset.  Steve Jobs once said:

Most people don’t get those experiences because they never ask. I never find anybody that didn’t want to help me if asked them for help.

Around the same time, I also had these discussions with my father. My father has a lot of positive influence on my life. My dad once told me:

You can either succeed by being the best in your field or by becoming a people pleaser.

The problem was I had neither of those qualities. Knowing myself  I realized, I can’t be a people pleaser. So, the only way to succeed is to start learning. In last 10 years, I have tried spending couple of hours every day learning and honing my skills.

Currently, I am working on a year long blog series 52-technologies-in-2016 where I learn something new every week and write about it.

Docker Machine Error Unable to Query Docker Version

Today, when I created a new docker machine I started getting Unable to query docker version: Get x509: certificate is valid for, not

To fix this error, run the following command.

docker-machine regenerate-certs default

Please change default with name of your docker machine.

Sentiment Analysis in Python with TextBlob

Welcome to the eleventh blog of 52 Technologies in 2016 blog series. If you are following this series then you would have probably noticed that I already wrote week 11 blog on tweet deduplication. I was not happy with the content so I decide to write another blog for week 11.

In week 11, I decided to spend time to learn about text processing using the Python programming language. We will only focus on Sentiment Analysis in this blog. I have written about sentiment analysis multiple times in last few years. We learnt how to do sentiment analysis in Scala using Stanford CoreNLP in week 3 blog. Sentiment analysis gives you the power to mine emotions in text. This can help you build awesome applications that understand human behavior. Few years back, I built an application that helped me decide if I should watch a movie or not by doing sentiment analysis on social media data for a movie. There are many possible applications of Sentiment analysis like understanding customer sentiment for a product by analysis of reviews.

You can read full blog here https://github.com/shekhargulati/52-technologies-in-2016/blob/master/11-textblob/README.md

Gatling: The Ultimate Load Testing Tools for Programmers

Welcome to the tenth blog of 52 Technologies in 2016 blog series. Gatling is a high performance open source load testing tool built on top of Scala, Netty, and Akka. It is a next generation, modern load testing tools very different from existing tools like Apache JMeter. Load testing is conducted to understand behavior of an application under load. You put load on the application by simulating users and measure its response time to understand how application will behave under both normal and anticipated peak load conditions.

Gatling can be used to load test your HTTP server. HTTP is not the only protocol that one can load test with Gatling. Gatling also has inbuilt support for Web Socket and JMS protocols. You can extend Gatling to support your protocol of choice.

Load testing is often neglected by most software teams resulting in poor understanding of their application performance characteristics. These days most software teams take unit testing and functional testing seriously but still they ignore load testing. They write unit tests, integration tests, and functional tests and integrate them in their software build. I think part of the reason developer still don’t write load tests has to do with the fact that most load testing tools are GUI based so you can’t code your load tests. They allow you to export your load test as XML.

You can read full blog at https://github.com/shekhargulati/52-technologies-in-2016/blob/master/10-gatling/README.md

Realtime People Counter with Google’s Cloud Vision API and RxJava

Welcome to the ninth blog of 52 Technologies in 2016 blog series. Recently, Google released Cloud Vision API that enables developers to incorporate image recognition in their applications. Image Recognition allow developers to build applications that can understand content of images. Google’s Cloud Vision API is very powerful and support following features:

  1. Image categorization: The API can help classify images into categories. You can build powerful applications like Google Photos that do automatic categorization.
  2. Inappropriate content detection: The API can detect inappropriate content in an image like nudity, violence, etc. It uses Google Safe search capabilities underneath.
  3. Emotion detection: This allows you to detect happy, sad or moderate emotions in an image.
  4. Retrieve text from the image: This allows you to extract text in multiple languages from the images.
  5. Logo detection: It can help you identify product logos within an image.

There are many possible applications that you can build using this powerful API. In this tutorial, we will learn how to build a realtime people counter. The application will subscribe to a twitter stream for a topic and would return number of people found in each image. We can then use this data to get advanced statistic like number of people in a time frame using RxJava buffer capabilities.

You can read full blog https://github.com/shekhargulati/52-technologies-in-2016/blob/master/09-cloudvision/README.md

CoreOS for Application Developers

Welcome to eighth week of 52 Technologies in 2016 blog series. This week we will learn about CoreOS, an Open source Linux distribution built to run and manage highly scalable and fault tolerant systems. It is designed to docker and rocket containers. When I started learning about CoreOS, I was overwhelmed by its complexity and different components that you have to know and interact with like etcd, systemd, fleet, Flannel. I am not an Ops guy so CoreOS documentation and many tutorials that I found on the web didn’t clicked with me. The goal of this tutorial is to help application developers understand why they should care about CoreOS and show them how to work with CoreOS cluster running on top of Amazon EC2.

What is CoreOS?

According to CoreOS website, CoreOS is a Linux for Massive Server Deployments. This means it is not a general purpose Linux distro that you can use as your development workspace instead, you will use it to run and your applications at scale.

Built on Chrome OS, CoreOS is a lean and mean operating system that runs minimal Linux. When you limit your OS to the bare minimal i.e. just openssl, ssh, linux kernel, gcc then you need a mechanism to run package and run applications that you want to use. CoreOS does not even has a package manager like yum or Apt. CoreOS is very different from other Linux distributions as it is centered around containers. Linux Containers is an operating-system-level virtualization environment for running multiple isolated Linux systems (containers) on a single Linux control host. CoreOS uses containers to run and manage applications services. You package application along with its dependencies within a container that can be run on a single or multiple CoreOS machines. CoreOS supports both Docker and Rocket containers.

Docker is the poster child of containers. In November 2013, I first learnt and wrote about Docker. Docker is a set of toolset geared around containers. Docker clicked with everyone and overnight became the tool that everyone wanted to learn and introduce in their organization. One reason Docker became popular very quickly is its approachability to an average developer. To use Docker, you don’t have to know Linux internals and work with complicated tools.

CoreOS developers claim that it is 40% more efficient in RAM usage than an average linux installation.

Read the full blog at https://github.com/shekhargulati/52-technologies-in-2016/blob/master/08-coreos/README.md