The Art of Finishing
The article addresses the "Project Hydra Effect," where developers face ongoing challenges that hinder project completion. It suggests strategies like defining "done," using MVPs, and celebrating small achievements to foster personal growth.
Read original articleThe article discusses the challenges faced by developers in completing projects, highlighting a common phenomenon referred to as the "Project Hydra Effect." This effect describes the frustration of encountering new challenges that arise as one attempts to finish a project, leading to a cycle of enthusiasm followed by disappointment. The allure of starting new projects often overshadows the satisfaction of completing existing ones, as unfinished projects carry a sense of potential but also mental clutter. The author emphasizes the importance of learning to finish projects, as it fosters skills like perseverance and attention to detail. To combat the cycle of incompletion, the author proposes several strategies: defining what "done" means from the outset, embracing a minimum viable product (MVP) approach, setting deadlines, practicing small completions, separating ideation from implementation, celebrating achievements, and seeking accountability. The article concludes with a commitment to overcoming these challenges and developing the habit of finishing projects, ultimately aiming for personal growth as a developer.
- The "Project Hydra Effect" describes the cycle of starting projects but struggling to finish them due to new challenges.
- Unfinished projects can drain mental energy and hinder creativity, leading to self-doubt.
- Strategies to overcome project incompletion include defining "done," embracing MVP, and setting deadlines.
- Celebrating small completions and seeking accountability can help build the habit of finishing projects.
- The journey of completing projects is seen as essential for personal growth and development as a developer.
- Many commenters emphasize the importance of defining "done" to avoid endless tinkering and to foster a sense of accomplishment.
- Several individuals share personal strategies for managing projects, such as breaking tasks into smaller, manageable goals or focusing on low-energy tasks when feeling overwhelmed.
- There is a distinction made between personal projects, which can be exploratory and less pressure-driven, and professional projects, where completion is often more critical.
- Some commenters express that the journey of a project can be just as valuable as the end result, suggesting that not all projects need to be finished.
- Common themes include the struggle with perfectionism, the mental energy required for project completion, and the benefits of collaboration and accountability in finishing projects.
As long as I don't care what project gets completed at what time, I've found a little trick to broadly move the needle. I jokingly call it "Sol's fast five" but the name is actually pretty on point.
I take a step back, look around me, and pick out the first five things I can reasonably achieve in less then a day prioritizing things where I have all the tools and materials at hand. These 5 things are never entire projects, the goal is to maximally decompose the projects until each action is as close to trivial as possible.
Once I have my list of 5 things I stop thinking about anything else and strictly work towards those 5 goals. There is a sense of relief in having reduced the scope and the tasks tend to be finished very quickly. Checking them off the list always feels good.
Once I have completed my 5 items I start a new list and pick out the next five items. This can feel like a huge reward.
I've used this system to great effect in the past few years.
1. Genuine intellectual interest
2. A desire to improve particular skills
3. A vague sense, acquired by osmosis, that industriously working on side projects during one's free time is what a Real Engineer does
Disentangling these motives and identifying a clear primary drive behind each project clears up the "hydra" feeling wonderfully, as most of the heads simply disappear once you realize that you never had a strong reason to pursue them in the first place. (3) in particular is often merely the self-castigating whisper of the internalized "should" rather than a valid reason to embark on a long and open-ended project.
I think proscratination is because we use a high power gear too frequently, we are exhausted mentally, and it is too painful. so we say let's do it later. But what if you have a small task that does not need a lot of thinking to do? something not painful? Well this is easy. I can do it. The trick is, it needs to be easy. you should not waste 1 hour to set up your environment to be able to start. it has to be easy.
So to advance on a project, I need to make sure I always have low energy, easy tasks ready for me when i am not in my mental capacity to use my high power thinking.
It is as if I am 2 persons. a developer and an intern. you need to make sure there is enough easy tasks for the intern to work on. You have to accept this about youreself
Dont waste days planning and creating issues for youreself. This is too draining. you need to write the big plan only and make sure you have few tasks ready. not all of them defined from day 0. do a big planning every 2 to 3 weeks (looks similar to a sprint)
It is all about conserving your mental energy
Not finishing and endlessly moving from one project to another is bad because it prevents you from making meaningful progress. You end up spreading your efforts too thin and never see the results of your hard work. This can lead to a lack of closure, decreased motivation, and a cycle of unfinished projects that never reach their potential. Moreover, without finishing, you miss out on valuable feedback and the sense of accomplishment that comes from completing a project, which can be crucial for personal and professional growth.
How? My projects are tiny. If you’re building solo, you have to tackle projects reasonable for a solo dev.
I primarily build chrome extensions because the simplest ones can be finished in one night, and the hardest a month or two. It’s frontend only work, so you minimise the project surface area. I’ve only been building them for a year but I finish all of them.
And I focus on getting an MVP out, and only polish if I can be bothered.
Now that I’ve mastered the finish, I’m moving on to different projects:
- API only projects - Scripts - NextJS projects (simple backend) - static pages
Sometimes it is fun to explore something and sometimes it’s better to never start. I have a running list of ideas i will never work on until the opportunity of time and savings align.
I’m not sure if it’s common but i heard this quote from an entrepreneur: “There’s nothing worse than a mediocre business “. A bad business will die of its own, a good one sustains itself, and a mediocre one grinds you down.
Edit: To add, I don’t expect perfection from my wood projects. There are gaps and cracks, I use the wrong wood or don’t orient the grains properly, etc. That doesn’t matter, though, because everyone who sees my projects are amazed at my skill, partly because they don’t know where to look for the errors, but also because just finishing anything physical like a door represents a great feat that most won’t even try. It’s different for software, there’s a greater expectation for some reason, or perhaps a virtual product isn’t as tangible as a physical one.
Setting goals, time-boxing, accountability, celebrations — it’s all built in.
I’ve definitely found that during the 6 weeks that I find a laser focus on what I want to do and how I want to do it.
It adds a fence to the green field project, so to speak.
Highly recommend building alongside others, if you haven’t tried it yet.
[0] https://lmt2.com
The solution I’m afraid is only one: solve smaller problems. There is no way a single person can solve a team’s problem as a side project. A small problem does not mean small codebase. It means small as in: focused, simple pain, simple solution, low amount of open questions.
Yes there is value to all of the other strategies mentioned. But if you want the root cause and the solution for this hydra effect it is the one I mentioned.
If you were born anywhere in the 80s, you might have spent the 90s and early 00s building side projects that you actually finished and felt no remorse over. That’s because scope was naturally small, problems were more focused, and there were multiple order of magnitude less options to choose from (in any domain: programming languages, libraries, interfaces, user flows, business workflows — everything was less)
A man is measured by the things he finishes, not by the things he starts.
Since taking that to heart, I've never really had a problem with finishing things. :)1. rebuild IBM Model-M Keyboard after kids spilled water on it (open for 2 years now)
2. complete floating shelves in office (open since March - 95% done - slowwww)
3. build temperature sensor network for my house using ESPHome firmware and Home Assistant. Hardware purchased.
4. repurpose old 3d printer servo motors to automate etch-a-sketch (popular project out there). Software part started.
5. split-flap display: make my own. research on CAD models for 3d-printing completed.
Progress is being made, but now and again I face something particularly difficult, I can get waylaid.
Right now I’m in such an impasse. I was moving along, making some good progress, when I turned a corner and went “oh no”. It’s like hiking a trail and you turn a sharp curve and see it gets really steep. “Ugh”
That whooshing sound is the wind falling out of the sails. Right now I’m in a dead calm.
But that’s ok. I have several, large subassemblies at the 85% mark, and others to work on that will slot into this thing.
I have “shipped” one project. Docs, releases, installers, whole thing. Getting that polished was 2-3 months. (Calendar, these are not full time projects.)
Finishing was important because I am not a finisher. I like to say I’m a framer and drywaller. Someone else needs to come in to mud, sand, paint, and trim. I’ve never worked well at that level of detail. It’s another reason I’m not very good with GUIs. Lots of detail. But, these are GUI projects.
But also, I shipped my “1.0”. I do not consider it an MVP. No, it’s done. I have no real plans to go back to it.
If I were to ship an MVP, that’s just an excuse (for me) to not finish it. And I did not want to leave a lingering carcass. My drive is already filled with those.
So I continue to push my boulder in silence. Maybe I can release this thing next year. Waiting for the breeze to come up again.
came for the fish, stayed for the all-too-familiar feeling of incomplete projects.
I'm not allowed to start a new project until I complete my current one.
Since I have a huge backlog of ideas, my "reward" for finishing a project is that I get to work on the next most exciting idea. Yay!
This forces me to keep the scopes small.
I'm allowed to rescope my current project to something smaller/imperfect after I've started (for example if I discover that my initial vision is going to take too long), but I still have to finish it before I'm allowed to start the next one.
1.) When you run, you’re only finished training when your body gives out, you die or give up the sport. In software, a product is never really finished; a version is. Therefore if I forget something or mess something up, I already know what tasks to work on for the next version. Forgetting something is bad but it makes planning easier. If finality is scary, turn it into a yield sign.
2.) If you want to run well at a distance, you have to specialize in that distance. If you train for Leadville and the 100m dash simultaneously, you won’t perform as well at either. In software, I work on one version of one product at a time. If I have to choose which one to work on when I sit down, I have already failed.
3.) I’m a human so for me, running is all about pace. Anyone can complete any race if they find and keep their pace. Software is the same. So find your pace and learn how to keep it. When I’m trying to find my pace for a race, I run that pace six days a week regardless of my distance - on shorter days, I’ll add in gliders at the end so I get the workout. With software, I have to keep the same kind of consistency or it takes me too long to get back where I was to ever finish anything.
4.) If you want to run fast so you can see the stars backs for a few moments, you have to treat every single training session just like the race. If you want to run fast enough to be one of the stars, it has to be your whole life. With software, everything even silly side projects gets the same name - product - and I follow the same methods. Practice is always good but deliberate, competitive practice is better.
Shipping, is, by definition, "finishing." Lots of boring stuff involved.
Most of my R&D and learning is geared towards shipping projects.
I will "let stuff go," if I find I'm in a rabbithole. Learning when to do this, is important. I just let go of some ML stuff for Apple systems, mainly because I can't really apply it [yet] to the types of apps that I'll ship. It wasn't a total loss, though, because I learned that I really need to use Intents for what I want.
So, right now, I am learning Intents development for Apple systems. It's a pain, because the documentation is really haphazard, but I'm muddling through.
I'll start by adding them to a released app that I tend to use as my "pointman" for new stuff, then, I'll add it to some of my other shipping apps. While I'm doing this, I'll become "conversational" in the tech. That's how I always learn this stuff. Maybe I'll write something up on it (like I did for Universal Links[0]).
My biggest impediments to finishing in recent years has been setting too big of a scope for "done" and running into hundreds of yaks that need shaving off from some buggy-ass framework or library (literally all of them). Rarely anything is as advertised and it has major impacts on delivery.
The only frameworks that let me get shit done without six ways of hell was WPF and Swing.
Yes, you should definitely learn what's involved in finishing a work project and how difficult this actually is. The old I'm 80% through and I just need to finish off the last 80% is something that can only be learned by experience.
But honestly, why ruin your fun projects by turning them into work.
In professional settings, being known as someone who starts things but doesn’t finish them can be detrimental to your career.
I would also take issue with this. It may hurt your career, but it may also be your career. Being someone who can break new ground and start a project from nothing can be incredibly valuable and is often a very different skill from putting something into production.Fixing Someone Else's Code is not the point of such endeavors. Reduce tooling and dependency complexity to the bare minimum, even if it means adopting a bit of NIH mindset.
*as used by Fred Brooks in _No Silver Bullet_, https://www.cgl.ucsf.edu/Outreach/pc204/NoSilverBullet.html
It’s better to just not do things than to do something unnecessary really well.
Example: I'm in the middle of moving jobs (military to other military). I was given a couple weeks to train my replacement, an impossible task. My boss just asked me if I had "finished" training him. Um ... well .. I am leaving. So whatever training we are doing is certainly over. That is what "finished" actually is. Is the job finished? Certainly not. But my time as a contributor has come to an end and so I am finished with the task and am jumping ship.
Which is to say, I believe the "productivity porn" angle - setting up certain processes/systems - is a red herring. Inspiration is the driving force.
- having unfinished projects gives my mind a comfortable place to go think itself out when I'm tired and need to sleep.
- each project doubles as a kind of lookout tower providing some perspective on other related projects or relevant technologies, and this keeps me interested in paying attention to new developments in non-superficial ways.
- every once in while a spark of motivation will appear for a project I haven't touched in years and it'll be something I recently learned backpropagating constructively, tightening the whole mess up a bit and helping me retain it all.
But like the comments say, I had way too much fun on the journey of a side project, just doing other things like configuring the website and playing around with the design elements like font and how the overall website looks (I'm a data scientist and never usually get to play with design as much as I want to at work). And recently, with claude's help built some cool react elements to push my story further.
Hopefully after this, I ship at least one blog and iterate on the design elements.
Drives me up the wall.
For example, I made a notes web app that syncs to S3, has full text search, has a "daily note" button that auto creates a note for the day, etc. This app was not the most fun and exciting app to make, but I made it anyway because I wanted it to exist.
There comes a point in projects where you're in the middle of it and you want to switch and do something else. But if you constantly find the desire for the thing you're making, invariably you'll finish. And it gets more fun after the trough of boredom.
Before this threshold, you're learning new technologies, trying new techniques, and generally developing skills that could be applicable elsewhere. After this threshold, you're becoming an expert in the project itself, which will all be for naught if you don't finish it.
So my advice would be give up on projects that are near that threshold, and only continue beyond if you intend to finish it.
If the rewards are nebulous, then so will the motivation to complete anything.
Make the goal at the start and ruthlessly discard (note somewhere else) any additional ideas. I find myself giving up projects after coming up with brilliant extensions to the project. When I look at it, it's way too big and immediately demotivating.
When people see some things as beautiful,
other things become ugly.
When people see some things as good,
other things become bad.
Being and non-being create each other.
Difficult and easy support each other.
Long and short define each other.
High and low depend on each other.
Before and after follow each other.
Therefore the Master
acts without doing anything
and teaches without saying anything.
Things arise and she lets them come;
things disappear and she lets them go.
She has but doesn't possess,
acts but doesn't expect.
When her work is done, she forgets it.
That is why it lasts forever.
It takes months of full time effort to built something that resembles a working application.
1. Bigger than I thought 2. Dumber than I thought 3. Too small to really be proud of
The hardest part is finishing a project pre-revenue. There's just little motivation to do it because, at that point, it's too boring to be about the 'journey' anymore; it becomes all about money... Yet you don't know if the project will be able to generate revenue so it's about 'hypothetical money'. As someone who has a huge number of failed projects under their belt, for me it feels like working for 'magic unicorn money'. I rely 100% on the enthusiasm/delusion of my non-technical co-founder to keep me going. In my mind, it's not going to make it... Though I like the fact that my current project is in a niche that I would never have chosen on my own because it's so damn boring (it's in HR search/recruitment sector *vomits*). I was literally optimizing for boringness.
I wish I could come up with one of these startups which can be monetized straight away, no free tier, no complex sales funnel but I think these opportunities are very limited and highly competitive.
Impossible for almost any non-trivial project.
This has helped me tremendously. Great article.
It's more about moving forward, and dropping projects that aren't interesting anymore.
Well put.
1. Clearly identify why your are doing something.
2. Is it really a benefit to _both_ yourself and _society_ . Or are you solving someones issues for a false sense of accomplishment, and silly wages. Note, I do realize the irony of this post, but I find it entertaining so it still meets the criteria.
3. Summarize your time-bounded project goal in one sentence.
Example: “I believe that this nation should commit itself to achieving the goal, before this decade is out, of landing a man on the moon and returning him safely to the earth." (John F. Kennedy)
4. Draft the probabilistic path forwards, by adding the finish line first.
https://en.wikipedia.org/wiki/Program_Evaluation_and_Review_...
5. Identify the key deliverables necessary to meet an MVP in your TRL. This narrows the scope of the project to mitigate feature creep etc.
https://en.wikipedia.org/wiki/Technology_readiness_level
6. Are there people with the right skills and motivation to finish each stage of the project? Note, statistically if you are 93% sure you are only really 60% certain on average.
7. Justify the liability of the budget is consistent with personal and corporate budgets. Solving the worlds problems for free may sound noble, but a half-baked attempt is usually foolish, hapless, or destructive to yourself and others. i.e. if the only motive is to make something cheaper, than you will likely end up worse off for the effort.
8. Landing the belly flop... Can deliverables be re-used in other projects? Does the project still meet its goals in commercial, scientific, and or entertainment markets.
9. Start testing the hardest key deliverables first with toy sub-projects. If these don't succeed, than don't bother tooling up with funding for the rest of the project.
10. toy sub-projects are sometimes regression tests, small programs, or key problems with unknown solutions. Expect these to fail or be repurposed 52% of the time, but if they don't work for the intended role than the path is non-viable.
Finally, I must observe an interesting phenomena when the probability of completing a key deliverable is below 50%, number more the 3 nodes in a PERT serial traversal, and do not have redundant options. Irrespective of a project complexity, the team will fail to reach its goal regardless of the talent pool, time window, and budget.
Best of luck, =3