Announcement

Tuesday, December 03, 2019

Where are the 'average engineer students' ?


I am pondering on this question for last 2 months. I will really like to hear from more people.

I work with Smart India Hackathon and was mentor to teams in Smart India Hackathon and Singapore India Hackathon. Here I work students who are enthusiastic and ready to learn. They are ready to experiment, they are confident, they are not afraid to fail initially to succeed later. Its a joy to work with them.

Obviously they are high in demand in job market and command premium for salaries. Recently I was recruiting for my startup and salaries of many of these students do not fit in our budget. Also lot of our work do not require high end talent. We are looking for students good in attitude and programming aptitude but may not be the best. We are also looking for interns.

For internship, we ask students for solve some small programming problems. I got 40+ responses from 2-3 colleges. 35+ students have copy/pasted the code from internet. Come on guys, I am using google since before your birth. I can find from where you copy/pasted your code in 5 mins. I still talked with 3-4 students and realized that they have not taken any efforts to understand the code. They don't want to take any efforts. I have similar experiences of interacting students with few colleges from Pune (not naming the colleges). These students are essentially at the bottom and practically unemployable.

Where did the average students disappear ??? Expected "normal" distribution will mean small set of students at both extremes and large number of average students in middle. However, now we have 'skewed' distribution with really large number of unemployable students at one end and small number of top notch students at another end and nothing in between. How did we land up in such a bad situation ??

Saturday, April 06, 2019

D10X - Starting a new exciting and challenging journey

On this auspicious day of Gudhi Padava (6th April 2019) I am starting a new , exciting, challenging journey with some new friends. D10X is an outsourced product development company.

D10X is founded on 3 key principles 
  • We will make profit when our customer makes money 
  • Quality Products, Delivered Fast at Fair Cost (not always cheap) 
  • Start small, plan and grow as needed.   
It is going to be exciting venture. 

WE ARE HIRING. There are exciting opportunities ahead with different domains and interesting technologies. We are looking for new comers and also few seniors.  If you are interested, contact me.  

#hiringnow, #startupcompany

Saturday, December 15, 2018

Sane Branch Management of Version Control Systems for Teams

[NOTE : This is still a 'draft', please point out mistakes and suggest changes/improvements]
Some time back Nagaraj Mali asked a question about 'best practices for repository branch management' on one of our whatsapp groups. This is commom query. 'bad branching strategy' or 'no strategy about branching' are very common mistakes in project teams. These mistakes can seriously impact the teams productivity and quality. Unfortunately very few manager/scrum masters or tech leads really understand devastating impact of 'bad version control practices'. In this blog, I am attempting to explain my views and logic behind various practices that I recommend.

Mistake : Too many branches


A developer need to understand the difference between a 'branch' and a 'tag'. Many times teams use 'branch' where tag is sufficient. 'branch' is an 'active line' of development. Common practice is product teams is to support 3 previous versions (i.e major releases) for bug fixes and one new release'. For example your current release is Ver10 and you may supporting major Versions9, 8 and 7. Essentially you have 4 'lines of development'. Then you need 4 branches. Ideally you should checkout 'only' the  branch that you are working on. There is no need to checkout all branches. Since 'branches' represent 'live lines of development', once you stop supporting a particular major release, you should 'delete' the branch for that release. Typically you will have 4 to 6 branches and many/many tags.

Mistake : Creating new branch for every minor release


Assume a major release is 'version 9'. Then 'version 9.1' is developed on 'version 9'  branch ONLY. Remember 'Version 9' is the supported major release and 'live development line'. Version 9.1 is usually a 'NOT live development line'. Any code changes/bug fixes for Version 9.1 should be developed in 'Version 9' branch'

Common complaint : We spend long time in merging.

This is another symptom of bad branching and bad practices followed by team. Consider following branch scenarios.

  1. Release branches for past releases

    Lets assume that new releases are developed in 'master' and team is supporting 2 previous release 'Version1' and 'version2'. Now team have done a bug fix in 'Version1'. Obviously customers will expect that same bug fix is available on 'patch release on Version2' and also available when new Version3 becomes available. So every day branches must be merged 'upstream'. i.e. merge Version 1 commits to Verson 2. And merge version 2 commits to 'master'. If you get any merge failure fix them. Daily changes are typically small and can be easily merged. This simple practice ensure that time required to do merges are drastically reduced and bug introduced because of merge problems are almost entirely eliminated.

  2. Feature branches

    Many teams create 'feature' branches for every new feature or bug fix. However, they don't delete the feature branch one the feature development is over. At end of 'feature' development feature branch must be merged into 'master' and then delete the feature branch. It is best to use 'git flow' plugin/workflow for working on feature branches.

    Typical feature branch flow will be 
    • create feature branch from 'master' (so 'parent branch' will be 'master')
    • keep making changes and commiting in feature branch. Its ok to push feature branch.
    • every day merge 'parent branch' to 'feature' branch. This way any changes to 'parent' branch done by other developers are available to you and any conflicting changes are detected early.
    • once the feature is done, merge the 'feature branch' to 'parent branch' (usually 'master'). Since you are regularly merging the 'master' to 'feature', you will not see any conflicts when you merge 'feature' to master. Now delete the feature branch

    In both scenarios 'key' is the regular (preferably every day) merge from 'release branch' to master' or 'master to feature' branch.

Remember It is OK to delete a branch

Remember in version control there is nothing like 'permanent delete'. When a branch is deleted, you will not see it 'branches list'. But that does not mean all the history of such branch is also deleted. Recommended practices is to create a 'tag' from branch and then delete the branch. This will keep the history intact. It will also allow to restore a branch from the tag, if you need to do some critical bug fix in an older (now unsupported) release

Bottomline


Remember 'version control' is 'productivity tool' for the development team and NOT just a backup tool. Learn how to take advantage of the version control system and you will see signficant increase in productivity of your team.  Start by defining policy for 'branch creation/branch deletion and daily merge'.