While reading through “Seven Reasons IT Projects Fail“, I came across an interesting statistic (source):
By categorizing documented causes of IT project failure, a majority—54 percent—are attributed to project management. Surprisingly to some, technical challenges are the least-cited factor at 3 percent.
For me, this is just a confirmation of the gut feeling I had for years. It doesn’t really matter which technology stack you are using for your project. The reasons for success or failure are usually somewhere else.
The article lists the following seven reasons for IT projects failure:
- Poor Project Planning and Direction
- Insufficient Communication
- Ineffective Management
- Failure to Align With Constituents and Stakeholders
- Ineffective Involvement of Executive Management
- Lack of Soft Skills or the Ability to Adapt
- Poor or Missing Methodology and Tools
Well, I didn’t know that I was a practitioner of SWAG estimations …
Scientific wild-ass guess (SWAG) is American slang meaning a rough estimate made by an expert in the field, based on experience and intuition. It is similar to the slang word guesstimate, a portmanteau of guess and estimate.
I came across this rather strongly opinionated blog post – GitFlow considered harmful, and I have to say that I mostly agree with it.
In our company, we use a similar approach to the Anti-gitflow, but with even more simplicity. This is one particular thing I like so much about git is that each person, team, or company can pick the workflow that suits them best.
Just to give you a little bit of context, we have a rather small development team (under 10 people), but we do a large number of projects. All our projects are web-based, varying from small and simple websites (static HTML), through more complex WordPress sites (multilingual, e-commerce, etc), to business applications like CRMs. Each project is done by several developers at a time and can later on be passed on to other developers, often much later (another iteration after several month). Each developer is working on a number of projects at a time. And we do very fast-paced development, often deploying multiple versions per day. Given the nature of the projects and the development pace, we don’t ever really rollback. Rollback is just another step (version) forward. And we don’t have long and complex roadmaps in terms of which features will be released in which version. It’s more of a constant review of what’s pending, what needs which resources, and what we can do right now. (It’s far from ideal project management, but it somehow works for us. If you think you can do better, send me your CV or LinkedIn profile, and we’ll talk.)
In our case, we do the following:
- We have one eternal branch, and we call it master.
- The master branch is always stable and deployable. Even though we don’t really deploy it directly.
- Nobody is allowed to commit directly to the master branch. Initially it was just an agreed convention, but because people make mistakes, we now have this rule enforced with the technology. Both BitBucket and GitHub support protected branches. BitBucket, in my opinion, does it much better.
- All new features, fixes, and improvements are developed in separate “feature” branches. Most of these are branched off the master. For large chunks of work, we can create a feature branch, and then introduce incremental changes to it via sub-feature branches, branched off the feature one. This allows for easier code reviews – looking at a smaller set of changes, rather than a giant branch when it’s ready to be merged.
- We do code review on everything. The strongly suggested rule is that at least two other developers review the code before it is merged. But sometimes, this is ignored, because either the changes are small and insignificant (CSS tweaks or content typos), or we are really in a hurry (we’ll review the changes later). But whatever the case is, nobody is allowed to merge their own pull requests. That is set in stone. This guarantees that at least one other person looked at the changes before they were merged in.
- We tag new versions only on the master branch.
- We use semantic versioning for our tags.
- We don’t deploy branches. We deploy tags. This helps with preventing untested/unexpected changes sneaking in between the review of the branch and the deployment.
The above process suits us pretty well.
Timofey Nevolin wrote an excellent article “Eight Rules for Effective Software Production” over at Toptal.com. The whole thing is well worth a read, but here are the 8 rules to get you started:
- Understand the IT Mentality
- Do Not Mix Software Production and Development Methodologies
- Use Persistent Storage as an Extension to Human Memory
- Stop Wasting Time on Formal Time Estimation
- Understand the Cost of Switching Tasks and Juggling Priorities
- Use Architecture Reviews as a Way to Improve System Design
- Value Team Players
- Focus on Teamwork Organization
All of these are good and true, but if I had to pick one, I’d say that rule 4 is my personal favorite. Sometimes I feel like I’ve spent a good quarter of my life in meetings, discussions, and other estimation sessions. And looking back at all of them, I have to honestly say that they all of them were a waste of time. The only useful part of an estimation session is a high-level project plan, but that can be achieved with a project planning session – much narrower goal, much more measurable, and much easier to achieve.
Fergus Henderson, who has been a software engineer at Google for 10 years, published the PDF document entitled “Software Engineering at Google“, where he collects and describes key software engineering practices the company is using.
It covers the following:
- software development – version control, build system, code review, testing, bug tracking, programming languages, debugging and profiling tools, release engineering, launch approval, post-mortems, and frequent rewrites.
- project management – 20% time, objectives and key results (OKRs), project approval, and corporate reorganizations.
- people management – roles, facilities, training, transfers, performance appraisal and rewards.
Some of these practices are widely known, some not so much. There are not a lot of details, but the overall summaries should provide enough food for thought for anyone who works in the software development company or is involved in management.
CommitStrip strikes again! Brilliant.
HipChat blog runs a rather lengthy post on what ChatOps are – “What is ChatOps? A guide to its evolution, adoption & significance“, which provides some insight into how the new generation of teams communicate.
At Qobo, we are at Stage 3 – Gimini, with a whole lot of dedicated rooms (one for each project, and a few more), some workflows (most notably “Hey Leonid, can you merge and deploy this pull request please“, or a shorter “@leonid, please m&d”), and some automation (we get monitoring notifications from Nagios and Zabbix, repository activities from GitHub and BitBucket, as well as do project deployments using slash commands).
We haven’t eliminated email completely, but combined with Redmine project management tool, we’ve significantly decreased the role of unstructured emails in our work.
“Agile Failure Patterns In Organizations” explains why Agile is simple and complex at the same time.
Finally! Something I can distract all those Agile prophets with, while I sneak out to do some work.
deadline driven development:
when management believes that the only path to improved developer productivity is imposing arbitrary, unrealistic deadlines.
… there are more good ones.