Buy @ Amazon

Search This Blog

April 12, 2021

Book Review : Elasticsearch 7 Quick Start Guide

The author lived up to the expectations of the book title, especially the book serving as "Quick Start Guide" and I am thankful to it. In days of chaotic full-stack development and technology changes, you need a go to book for quick refresher on topics. This book serves that purpose and in fact has gone beyond in the sense that that author also shares some of the best practices based on his experience which are both valid and unfortunately no practices in many implementations.

If your team is using Elasticsearch, I would recommend you have at least a copy of this book as team's go to reference manual.

If you have O'Reilly's Safari Online subscription like I do, you can check it out there.

Check out my review of this book in GoodReads.

March 6, 2021

Go - Strengths, Weaknesses and Threats

This post is web-developer's point of view on the strengths, weaknesses and threats of employing Go as a programming language having used (and continuing to use) programming languages like Java, C-Sharp, Ruby, Python, Javascript etc.

The Strengths

  • Fairly straightforward and simpler to learn and be productive. 
  • Less features implies less things to worry about -- no OOP and thus no classes, objects, inheritance, polymorphism and associated complexities.
  • Errors as return values instead of thrown exceptions. Now this is a different way to see an error/exception.
  • The world is circling back to Statically typed languages and Go is statically typed. 
  • Programming concurrency is simplified with Goroutines.
  • Arguably consumes lesser resources (Memory, CPU, etc.) than other programming languages. 
  • Has the goodness of JVM/Dotnet world's Garbage Collection freeing the programmer of worrying about freeing the critical resources.
  • Employs Pointers only in specific use-cases (like Pass-By-Reference to mutate state or get reference to a specific object) where you can't have other way to solving your problem.


The Weaknesses

  • If you are from the world of OO-programming, you will find OOP amiss. You have workarounds with methods attached to Struct constructs, as an alternative.
  • The fact that Go was written as viable alternative to C programming language can be felt with the absence of abstractions that is available in high-level language. Take `slice` data-structure in Go, which is a wrapper on `array` data-structure for the sake of flexibility in size. The slice data structure, however would NOT provide you with any convenience method to say remove an element from it.
  • Go lacks fluent interfaces that languages like Java, Python etc have and so you do frequent context switching between the business problem you are solving and the programming language nitty-gritties. For instance instead of iterating a collection using high level constructs such as `for each`, you resort to your older ways of introducing local variables in for loop construct. And I don't think, you can have fluent interfaces without Go first introducing Generics :(
  • Not much of mature tooling support in terms of IDE or libraries as things stand today.
    • Take for instance I have an exported method in a file that I try to have unit tests for in another file. The VS-Code editor wouldn't recognize this method name all of a sudden (say when you refactor/rename your method) and would give go lint error like `UndeclaredName` in spite of it being there. But if you try running your tests, it will work fine. This kind of false negatives defeats the purpose of linting and not sure why this supposedly basic thing is broken for a good while now. You can refer issue in github. Guess what worked for me? Close and re-open the VS-Code IDE.
  • You will experience the pain of missing Generics as in Java or the power of dynamic-languages when trying to design a solution. This leaves you with writing a little verbose code and unwarranted duplication of code-logic.
  • Go doesn't support method overloading and the convenience default parameter values. As per Go FAQs, this is a decision taken consciously to simplify things.


The Threats

  • Go emphasizes on shorter naming convention than meaningful names even if it were to be longer. It's been a hard efforts for the world to come to terms to having meaningful names as naming convention fighting the bad habits of shorter names. Go language is taking programmers to older bad habits with pride :(
  • Modules and Packages are a little confusing and takes a while to wrap your head around it; I had to make mistakes and pause for a while to get it right (hopefully). 
    • The package name need not be the same as the enclosing directory, for instance.
    • That your import statements points to directories where the packages are contained and not the package themselves is weird to me. 
    • If you declare a package `game` under `games` directory in a file `f1.go`, then you cannot declare a package other than `game` in another file `f2.go` under the same enclosing directory. Try creating a package like `othergame` in the file `f2.go` in `games` directory and you'll see compile-time error showing `package othergames; expected game compiler(MismatchedPkgName)`.
      If you were to look the go docs for `MismatchedPkgName`, it will read as `MismatchedPkgName occurs when a file's package name doesn't match the package name already established by other files.` only confusing you in this occasion.
      Brain friendly way for this to stick in your mind is thinking about it as you wouldn't want to distribute your packages in different directories for the sake of modularity.
    • So in Go, think of `Module` as an independent project on its own. Your current project is a module, for instance. A module can have many packages, each under its own directory as a convention.

February 23, 2021

My thoughts on hiring and retention

A question to motivate : 

Which of the below candidate do you prefer? 

  1. A candidate who stayed in a company for good deal of years but has left it leaving a gaping hole in the knowledge. 
  2. A candidate who made it a point to share his/her knowledge by way of brilliant documentation making him/her irrelevant to the company before leaving.
If your choice is option 1, then I would love to learn your though process around that decision of yours and what is your take on mine that I have put forth in this blog post. If your choice is option 2, I am go glad about your choice and would ask what did you do to ensure that your company as well embraces it in its hiring process.

How I approach the hiring side of things?
 
One of the key things I do working with the Talent Acquisition team is to set the basic value system is set right and that we are all aligned to it, so that we can spot the right candidates that others miss. Having said that, I admit this is not an easy thing to do. One thing that worked for me is to have frequent conversations with stakeholders concerned around the following questions (I often trigger the conversation asking one/some of them):
  • Do you look for an individual's stickiness (duration of his stay) to a company in his career?
  • What is your metric of measuring stability?
  • How do you measure productivity and professionalism of an individual against his/her stickiness to a company?
  • How do you measure experience -- number is experience or experience in number?
  • What specific positive/negative traits do you look for in a candidate? 
During my conversation (aka interview) with the potential hires, I ensure that not only are the candidates treated as people (instead of resources) but are well respected as a courtesy. This sets the stage for me understand the candidate better and that the candidate as well gets a fair insight in the job, the workplace, the company and me as a person. Two things I really care for in any candidate, irrespective of their experience or role are their teaching-ability and learning-ability. I do my homework to ensure I get a decent hunch on these attributes during my time with the candidate.

How I approach the retention side of things?

Retention is yet another hard-ball game. I would bet any day in making the workplace atmosphere more transparent, safe, productive, and guaranteed learnings from solving problems as a team. With this in mind, I start looking out for opportunities for improvement and go about executing them. This is multi-dimensional requiring help from many stakeholders in solving the problem and unfortunately this is often over-looked; take for instance if an outgoing employee cites any of the following reasons for leaving the company in your personal 1-to-1 conversation, what can you do about it:
  • pay-scale disparity (you can't drill down on this one in your conversation)
  • concerns of discriminations (you really got to win the trust of the person to hear this one out but often isn't something within your control)
  • lack of opportunities to pick up better work (you must tactfully drill down on this one to get a hang of ground-zero reality) when they see some of their peers get to work on niche areas
  • lack of learning opportunities (you got to drill down to the specifics) when they end up taking too much of support work or see some of their peers getting special privileges of say, certification reimbursements and they feel so left out.
  • work-life balance going for a toss because of recurrent production issues, time-crunched deadlines, unplanned works etc. hurting their weekends and holidays. 
Not all the above problems might be in your direct control to bring about change. Not all the above problems can be tackled directly or immediately. Some of the measures that I have taken to improve the workplace atmosphere are below:
  • Encourage the habits of documenting key knowledge in business, technology and practices. 
  • Encourage more and more work related conversations to happen. It is important that there are conflicting opinions for the teams to get better in what they do. Unfortunately, conflicting opinions are discouraged in most workplaces.
  • Encourage brownbag or lunch-hour sessions within teams, within horizontals and slowly stretching it to the outside world as talks in meetups and conferences.
  • Encourage pairing not just within roles but across roles.
  • Make it a point to reach out to individual team members to understand their aspirations and look for opportunities to accommodate and nurture it as part of their goals. 
  • Encourage team work by breaking silos.
  • Discourage gossip against person by encouraging open discussions on work subject.
Measure what matters. Loyalty trumps stability; for in my world, retention is not just about how long one stays in a company, but how safe and productive (s)he is at work. Measure an individual's contribution at work and in developing other team members. I look not for how long one stayed in a company but how one helped the company, and the team grow during their tenure. 

10 Benefits of Remote Working

I have good enough experience in both working from office and home. But when everyone works from home as a habit or culture there are some unique benefits to it. This post lists advantages when the office in entirety works from home.

  1. Home food over junk food
  2. Better work-life balance
  3. Lesser office gossip opportunities
  4. Lesser scope for office politics
  5. Lesser scope for blame game
  6. Everyone is forced to communicate better
  7. Gaps in current system show up and the team is forced to address it
  8. Remote work is pocket friendly
  9. Escape from city traffic
  10. Ones attitude towards their team, their work and their company stand out distinctly

How has it been for you since the start of Covid-19?

December 27, 2020

12 Tips To Interviewing For Identifying Good Talent

Candidate Interview Photo Sample
Photo by Steve Halama on Unsplash

Interviewing is a job that requires preparation and coordination among various stakeholders. Unfortunately, though in many places that I have been to as part of my Consulting gigs, I have witnessed first-hand on the very many things that go wrong in the preparation and conduct of interviews. In this post, we shall focus on the things to do before, during and after the conduct of an interview to aid better decision making in identifying talent.

  1. Prepare. Know what you want. Do know the expectations of the role you are hiring for.
  2. Prepare Again. A candidate's CV is a window to his world. Fish for things you want from the CV against the job expectation. You may or may not have clarity at this point in time. But you mind keeps working behind the scenes, and this is important.
  3. Prepare Yet Again. Unless you are a recruiter yourself, you wouldn't be the first person to interview the candidate. So, see if you can collect the feedback from earlier interviewers. Why? So you don't overlap what was done in earlier rounds and may want to know the gaps that could or should be filled in. This way, you make the best use of your time with the potential hire, continuing where things were left off in the earlier rounds of candidate interview.
  4. Prepare One Last Time. Once you know the gaps and the areas you may want to double-check, prepare on a set of questions to ask. Frequent and odd silences during an interview would be perceived as company's lack of competence and professionalism.
  5. Start the interview by introducing yourself and the company you represent in a manner that eases the candidate's stress and making him want to join your team. Do not forget that you are an ambassador of your company and thus have the responsibility to present yourself well enough.
  6. Stop examining the candidate. Start exploring the candidate for his strengths and weaknesses. As bonus, you would even encounter red-flags in the candidature. The secret to exploring is having a conversation.
  7. Respect. It is not your choice but an obligation. Throughout the interview, irrespective of the candidate's race, ethnicity, background, or experience level, demonstrate your respect for him/her by being humble. You are duty bound to protect and build the brand of the company you represent.
  8. Do not forget to noting down key observations. Every observation counts. Usually this aids in sharing meaningful feedback about the candidate post the interview to the Talent Acquisition team.
  9. Be mindful of the interview time and try to complete it within time. If you had to extend it, don't drag it much and ensure that the candidate is okay with it.
  10. Just before you end the interview, make sure give room to take questions from candidate.
  11. End gracefully by being thankful to the candidate for his time spent exploring the open opportunity at your company.
  12. Immediately after an interview, re-visit your notes and construct meaningful feedback about the candidate that you can share to the Talent Acquisition team for use by the next round of interview.

Whether or not you hire the candidate; whether or not the hired candidate joins your company; the interview experience should be a win-win. There can't be second thoughts about it.