Learn To Say No

Time and again I end up discussing about importance of saying No with my friends and colleagues. I believe that yes should not be the answer to most requests that comes our way. Still, most of us end up saying yes out of obligation or just to be accepted and part of the crowd.

Yes has no meaning if we never say No.

Saying No to most of the choices help me focus on few things. There is no point in becoming jack of all traits and master of none. This is a lesson that I have learnt after wasting many years playing with many things.

Why we say Yes?

There are many social and psychological reasons why saying yes is much more easier than saying No.

  1. You want to oblige to people so that you don’t hurt their feelings.
  2. You don’t want to be excluded from social group.
  3. You don’t want to be alone.
  4. You don’t want to disrespect your elders.
  5. You don’t want to hurt anybody’s feeling.
  6. You don’t have guts to face the truth.
  7. You don’t want to explain your rationale behind saying No.

Saying No Makes You Say Real Yes

When you don’t do something, you have option to do something else. Richie Norton beautifully articulated in his quote

Say no to everything, so you can say yes to the one thing.

You work on tasks that you truly believe in. You go out with people you want to spend your time with. You behave the way you are. You are not faking or putting a mask to be liked by other people.

Saying No Simplifies Life

Life is a mess these days with so many options to choose from and so many things to say. We are living in a world of information overload so we have to limit ourselves to few things to make it easy for us to digest and not get influenced. You start making right choices evaluating all the options you have and picking something you truly believes in.

Say No Without Having To Explain Yourself

Stephanie Lahart summed up very well

Let today mark a new beginning for you. Give yourself permission to say NO without feeling guilty, mean, or selfish. Anybody who gets upset and/or expects you to say YES all of the time clearly doesn’t have your best interest at heart. Always remember: You have a right to say NO without having to explain yourself. Be at peace with your decisions.

Saying No does not mean you are selfish

When you start saying No, people will start perceiving you as a selfish person. I don’t think caring about your needs and time is selfish. Even if it is considered selfish it is for your own good. If you can’t do good to yourself, you can’t do go with others as well. Suzette Hinton put it beautifully in following lines:

We must say no to what, in our heart, we don’t want. We must say “no” to doing things out of obligation, thereby cheating those important to us of the purest expression of our love. We must say no to treating ourselves, our health, our needs as not as important as someone else’s. We must say no.

Even Steve Jobs Believe In Saying No

Working through sbt test deadlock

Today, I encountered an issue while running tests for one of my Scala SBT projects. Each time, ran sbt test command hang. After running jvisualvm, I discovered that it is due to thread deadlock. I couldn’t figure out why deadlock is happening. Test cases worked fine when ran individually. To work through this issue, I disabled parallel execution of tests.

From command-line, you can use following command to disable parallel execution of test:

$ sbt 'set parallelExecution in Test := false' test

You can also set this setting in your build.sbt to avoid setting this setting manually.In your build.sbt , add the following line.

parallelExecution := false

Hands-on guide for building Serverless applications

Yesterday, I released hands-on guide to building Serverless applications using AWS Lambda and Serverless framework. The guide is open-source and available on Github. Checkout the guide and please give feedback.

Serverless is an overloaded word. Serverless means different things depending on the context. It could mean using third party managed services like Firebase, or it could mean an event driven architecture style or it could mean next generation compute service offered by cloud providers or it could mean a framework to build Serverless applications. This series will start with an introduction to Serverless compute and architecture. Once we learned the basics, we will start developing application in a step by manner.

Read more https://github.com/shekhargulati/hands-on-serverless-guide.

Why it’s hard for programmers to write a program to flatten a list?

I take many programming interviews at my current organisation. These days one of my favourite interview question is to flatten a nested list structure. I give user an input [1,[2,3], [4, [5,6]]] and ask them to write a program that will give output [1,2,3,4,5,6]. So, far I have asked this question to at least 20 candidates and 18 out of them have failed to write this program. I find this question better than canonical FizzBuzz problem as flattening a list is comparatively more involved problem.

This is how interview goes:

  1. I ask candidate to write a program that takes [1,[2,3], [4, [5,6]]] as input and return [1,2,3,4,5,6] as output. I specifically say you have to flatten a list.
  2. They can choose any programming language they like. Usually they are Java programmers so they end up choosing that.
  3. I ask them to write test case as well.

The common patterns I have noticed in most interviews:

  1. Candidate fail to write proper method signature. They get confused about what type of list they should use. Some start with List of integers List<Integer> ints. They fail to see how they will store a List<Integer> to a List<Integer>.
    public List<Integer> flatten(List<Integer> numbers)
  2. Some candidates start with a primitive array. Very quickly they realize array is fixed size data structure so they should use a List.
  3. They give method bad name like getList or processList etc. While explaining the problem, I explicitly mention that they have to flatten a list still they don’t use flatten as name of the method.
  4. Most programmers fail to get that they can recursion to solve the problem. Candidates who solved this problem get that they have to use recursion in a few seconds.
  5. Some programmers have hard time storing result in a List using the recursion approach. They use recursion but forget to store result. Most don’t know difference between recursion and tail recursion.
  6. Some programmers have hard time thinking how they should check instance is of some type.
  7. Most of them make flatten instance method. Programmers don’t think whether they should make method static. Programmers for some reason think static is bad.
  8. No one starts with a test. Most jump straight away to code. You have to pause them and ask can you please write down in plain English what you are trying to achieve.
  9. I tend to give a lot of help and pointers to the candidate. I want to make sure that they solve this problem. Candidates end up taking close to 45-60 mins to finish the solution. Some fail to get it working even after an hour.
  10. No one thinks about generic program so that solution will work across all types.
  11. No one used Java 8. Candidates tell they have heard some features of Java 8 but they don’t use it. I doubt adoption of Java 8 has reached a critical mass.

I am not sure what makes this problem tough for candidates. May be pair programming with interviewer just does not work. What are your thoughts?

OkHttp with Let’s Encrypt Certificates

If you are using OKHttp to make request to a server that used Let’s Encrypt certificate then you might get following exception.

&lt;br /&gt;Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1506)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:241)
at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:198)
at okhttp3.internal.connection.RealConnection.buildConnection(RealConnection.java:174)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:114)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:193)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:129)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:98)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:109)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:124)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
at okhttp3.RealCall.execute(RealCall.java:60)
at com.shekhargulati.thereader.readers.FeedReader.readFeed(FeedReader.java:22)
... 28 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1488)
... 56 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 62 more

One way to avoid this error is by using JDK 1.8.0_101. This will make your code run fine. If upgrading is not an option, then you can try to add certificates to keystore by following this stackoverflow post.

Be a Rock Star at Work

Yesterday, I started reading The Greatness Guide book by Robin Sharma and one of the important lessons he shared is Be a Rock Star at Work. This looks obvious but if you ask yourself honestly you will be surprised how many times you failed to live up to your own expectations. We all want to do best at our workplaces but fail to make an impact or do justice to our work. This could be because you don’t enjoy your work or your workplace sucks. At the end, we end up just being mediocre rather than achieving to our full potential. We waste a hell lot of time in office politics or tea time gossips that pollute our mind so much that we don’t give our 100% at work. Our mind is always occupied by so many other thoughts that we never do justice to our work. This is a very important lesson as work is what defines us and provide meaning to our life. When you go back home after office day you should be satisfied that you gave your 100% to the problem at hand.

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
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.