Sep 15th, 2012 | People, Productivity, Skills
Do you want to get all your tasks done fast and furious? Shore up your spectacular software development work with this post!
The Imperfect Brain
Lets start with the brain – the most important organ for software development work (I would be surprised if you have even more important organ for this job). This biological tool, composed from 100 billion of neurons and many legacy structures inherited from worms, reptiles, mammals and other animals, is not really perfect for programming tasks.
I think I know – you want to have between ears obedient powerful and reliable machine like the shiny new computer on your desk that crunches tasks with the highest performance without taking breaks, emotional drops and losses of attention.
Unfortunately, our brain reminds more an old computer that barely runs your development activities competing with other processes for limited memory and processing resources on the top of overloaded unstable Brain OS.
Yes, writing software is not easy and not the most important biological mission for your busy brain. It is difficult to achieve top mental performance for your tasks, especially, if you are just doing your daily job and not writing the next Facebook in your basement.
How can we still squeeze good performance from our programmer’s favorite organ?
Great mental performance for development tasks
Focused & Productive Brain
Unclear goals – brain confusion with lack of certain direction and understanding what to do
Dissipated Time – absence of dedicated committed time for the task opens rich possibilities to avoid hard work and procrastinate.
Multi-tasking – running several activities in the same time significantly drops your IQ.
Insufficient energy – tired, emotionally overwhelmed or indifferent brain is not productive at all
Distractions – frequent interruptions do not allow to immerse into the task
Mismatching task – too boring or challenging tasks prevent full brain engagement
Brain overload – complex, dull or voluminous information inhibits your brain operational abilities.
There are three elements of your performance
Tasks – what should be done.
Time – how long and what way you work on your tasks.
Mind – mental energy and abilities to get tasks done.
Read full post >>
May 17th, 2012 | Agile, Concepts, Lean Startup, Practices, Process
“Devoted to Facebook IPO”
Is there any development process that can really increase chances of the software system market success in this uncertain world?
Traditionally Project Managers make decisions for the horde of software developers what features should be attacked in the long release. Yes, this approach frees busy developers brains from the mind boggling task of thinking about the business. But developers no longer get business context – why features should be done and what is important for the business. In addition, long releases detach developers from the product market results and inhibit learning and adaptation to the customer needs.
Agile fixes these problems with three important practices – The Whole Team, Small Releases and User Stories. Customers and developers are one team that frequently discuss features face-to-face and create User Stories together. Important User Stories become part of the new release, others go to Backlog. The team releases features frequently and learn from customer feedback and implementation.
User Story captures the ‘who’, ‘what’ and ‘why’ of a requirement in a short simple way from the customer perspective. A user story is a unit of requirement, estimation and planning. It should be testable and fit into a single iteration. Often a user story is broken into programming tasks which describe specific implementation steps.
User Story is done when it is:
- Code Complete and Working
- Accepted by customer
Agile is wonderful process! Developers work closely with business providing speed, accurate interpretation of requirements and intellectual contribution (surprise!) in translating business vision and needs into the concrete software system.
The Customer accepts the User Stories at the end of frequent iterations, provides feedback and change future User Stories based on experience with this real working system. In short, the customer steers the direction of the project instead of being a hostage of the unruly slow development machine.
However, one big problem remains – everything depends on the customer’s ability to get brilliant ideas, correctly read the market and envision what set of features will succeed. Unfortunately, it is almost impossible to get right. Business geniuses (except Steve Jobs), smart analysts or even consumers themselves cannot reliably predict how people would react, what they really need and will like next. And developers can contribute more to the market discovery and quality of business decisions.
Read full post >>
Apr 21st, 2012 | Agile, Architecture, Design, Lean Startup, System
The main architecture goal is to strengthen and align system ideas, muscles and structures in areas most impacted by stress, changes and expansion.
In short, architecture covers every important aspect of the software system.
A good thoughtful software developer is torn apart by conflicting approaches for architecting complex software system:
- Heavy upfront system design leads to rigid, costly and over-engineered solutions
- Ignored business and technical perspectives cause business irrelevance or failure
- Poor reliability, performance or flaws could kill promising beautiful software system
What is the best approach to build a sound and successful system?
Let’s consider several architecture challenges that a software team faces during system development.
- Idealism (assumed known knowns) – mostly theoretical views, lack of practical experience, illusions. We often exaggerate our intellectual abilities to find right solution theoretically.
- Open problems (known unknowns) – problems or needs without foreseeable solution. These evil inconvenient unknowns could seriously impact the course of the project
- Uncertainty (unknown unknowns) – low predictability of the future in technology, business and Universe. Many good decisions could turn to be wrong after some time.
- Over-complication – over-engineering for domain problems because of over-thinking, misunderstanding, lack of information or technical enthusiasm. Over-complication steals development time and increase cost and complexity.
- Fragility – poor system quality (performance, reliability, uptime, security, etc.). Neglecting quality could cost reputation and harm system success.
- Complexity – complex structures, unpredictable behavior and states that turn a system into the Ball of Mud.
- Inconsistency – dissonance of the system approaches and parts; fragmented and incomplete knowledge in heads. Development teams produce incoherent system without coordination of ideas and implementation.
- Inertia– difficulties to introduce disruptive changes (for business, users, operations). People and established processes resist changes and have inertia that is difficult to overcome.
- Misalignment – with business goals, existing systems, infrastructure. Building a software system without considering business vision, existing IT landscape is the path to disaster.
Three Architecture Answers
There are 3 useful approaches to Software Architecture that address these challenges:
Read full post >>
Feb 10th, 2012 | Architecture, Concepts, Design, Practices, System
The software system in the period of active growth is a really wild beast. Excited developers with creative minds and feature obsessed marketers consistently add the fuel to this fire of software creation.
Uncontrollable growth, race for features and engineering wonders sometimes give rise to a monster – a software system bloated with useless features, over-engineered internals and erratic behavior.
Read full post >>
Jul 10th, 2011 | Practices, Process, Productivity
What does a customer wants?
Usually your customer wants to know a simple thing – when your team will deliver working software based on agreed requirements. They naively want to safely bet on highly uncertain future outcome – delivery of the complex never created before system that completely fulfil their dreams.
The customer wants reliable McDonalds experience, but with a little tweak – they want to hand in their own exclusive menu, often created by people who don’t have any idea how to cook.
In short, the customer requires creative flexibility of Cooking Master Chef fortified by ability to predictably deliver hamburgers as McDonalds.
But, is it possible in our development reality to chase two opposing goals – Predictability and Flexibility in the same time?
Read full post >>
Apr 24th, 2011 | Practices, Productivity, Skills
Sometimes I am stuck on a mind-boggling task. I know this because I found myself fiddling around, giving advises to other people, searching for food, drinking coffee or working on low priority stuff. Clock is ticking but little gets done. After I notice this unfortunate state, I talk with myself seriously – calling to conscience, sense of duty and pride of a man who never fails his mission and the team.
Over the time I have learnt how to return to a productive state and even finish difficult tasks. I want to share my experience here.
I assume that you have a good idea what you should build. If not, you have to get back to your notes, client or a drawing board. You definitely will be unproductive if you don’t have clear understanding of your task. Most probably you will waste your time and client’s money.
Now, you know what to do but don’t know how and intellectually overwhelmed by this too big to bite piece!
I recommend 3 phase strategy to conquer your difficult task:
- Hit the road – start moving and build the confidence
- Take control – conquer uncertainty and map the road
- Accelerate – drive on full speed while keeping control Read full post >>
Mar 20th, 2011 | Job, Management, People
I noticed that three spirits are fighting in the soul of a software developer – Great Artist, Reliable Worker and Selfish Pragmatist.
If you hear a voice within you say, ‘You cannot paint,’ then by all means paint, and that voice will be silenced. – Vincent van Gogh
The first spirit is a Great Artist who pushes our fellow programmer to work on challenging tasks, invent new approaches and seek for self realization. The spirit gives power and desire to create state of art solutions and move forward with learning and practice. The Great Artist spirit is behind the best software; it makes the developer to think out of box, strive for beautiful code and forget everything outside the problem. It is powerful spirit but dangerous for ordinary business – there is no predictability and assurance that developer will remember what client really needs. The developer driven by this spirit tend to reject mediocre, but good enough solutions, will do stuff his own way and go far beyond what is necessary. This developer has zero tolerance to poor code and will refactor most important pieces of code even night before important demo… after testers go home to sleep.
Read full post >>
Dec 5th, 2010 | Expertise, Skills
A. Life Challenges and Systems
Your life continuously presents new challenges. And your success directly depends on your ability to meet these challenges. You can choose various approaches – react on problems as they come, appeal to supernatural forces or seek for advise.
But how many times
- you didn’t understand why thing happen and what to do
- you found that reality and challenges are more complex than they seem
- your solutions create new problems and make things worse
Welcome to the messy world of complex systems that encompass your life and compose our Universe.
1. You can be the master of your life if you can understand and influence systems involved in your challenges. That means that you should become the Master of Systems Thinking.
However, it is daunting task to understand and use the systems around you. That is why many people stuck without career growth, cannot achieve their top level or stop pursuing big goals. They gave up attempts to master systems that drive our projects and life.
Sep 13th, 2010 | Concepts, Management, Practices, Productivity
Seasoned project managers will tell that delivery of software is result of many trade offs. The main trade off is between Time (when project will finish) and Scope (how much will be done). This post will show that using right tools you could gain improvement for both variables.
While it is possible to create orderly step-by-step process for increasing productivity of software teams, it will never be ideal – too many variations and situations will hinder it usefulness. I believe in set of useful tool that could be combined to craft custom optimal solution.
There are several strategies that lead to increase in productivity – how many units of scope software team can produce within fixed time.
- Increase Capacity (Capacity) – increase capacity by hiring more people or increasing work hours
- productivity is increased as result of more resources and hours available
- Improve Value Stream (Value) – increase added business value on each step and reduce waste and overhead
- productivity is increased as result of optimized delivery of value
- Adaptat to Reality (Adaptation)– learn from practice and mistakes, validation of ideas by reality, adapt to changing situation
- productivity increased as result of early corrections and improving how things are done
- Empower Individuals (Individuals) – boost people knowledge, skills, morale and focus
- productivity is increased as result of higher individual performance and motivation
- Enhance Communication (Communication) – improve communication and mutual understanding inside and outside of the team
- productivity is increased as result of availability of necessary information, clarity of what should be done and exchange of ideas for implementation
- Organize Better (Organization) – structure team and assign roles for better coordination and decision making
- productivity is increased as result of better decisions and focus on important areas
- Expand Expertise (Expertise) – increase range of skills and services offered by team
- productivity is increased as result of better execution of necessary project activities
- Scale Externally (Externality) – outsourcing and involvement of external communities
- productivity is increased as result of involvement of more people outside of team
- Tame Complexity (Design) – manage complexity and provide simple and well designed solutions
- productivity is increased as result of reducing complexity burden on software development
- Preserve Quality (Quality) – use defensive tactics to ensure high quality
- productivity is increased as result of preventing system flaws and reduced effort to fix bugs
I separated tools into three categories:
- People-oriented – people are the creators of software and have major effect on output
- Process-oriented – the way how people work has significant impact on outcome
- Development-oriented – development practices and approach to the system implementation matters a lot
Read full post >>
Jul 6th, 2010 | Architecture, Concepts, Expertise, Skills
in·no·va·tion – introduction of new things or methods
im·i·ta·tion – the copying of patterns of activity and thought of other groups or individuals
in·te·gra·tion – an act of combining into an integral whole.
What is the best strategy for an effective developer – innovation, imitation or integration? Should you introduce new creative solutions, adapt other people ideas or just integrate existing components?
Software Development is an exciting intellectual endeavor without physical barriers. It is easy to start innovating – come up with new ideas and quickly submerge into their implementation. And I don’t mean here fundamental breakthroughs. I consider as innovation building of any non-trivial solution that is not directly stemmed from Google search results, development resources or available examples. And certainly, I pose the dilemma – innovate or not innovate – to skillful developers who are quite capable to innovate and who enjoy meaningful creative work.
Read full post >>