Kicking Off a Complicated and Long-Term Programming Project in the Real World...
The following post was submitted by guest blogger, Ben Oksman.
I am currently in the process of starting an extraordinarily complicated development project. Unlike an academic, the slightest problem or delay with my projects could have dramatic consequences. So one of the questions that is always on my mind is how to start a new project without becoming overwhelmed.
A little about me:
I am currently the director of technology for a medium-size hedge fund in the NYC area. I have been designing financial systems for over 15 years now. I come from an electrical engineering and mathematics background but have been a computer guru all my life. Many of the systems I have built have tens of millions of dollars passing through them on a regular basis, have multiple heavy users, and communicate with a large number of counter parties. Moreover, they have to process large amounts of data and make complicated calculations in real-time. These same systems also regularly use dozens of thorny algorithms and formulas that if they went wrong could have dramatic real world consequences.
Here are some of the primary design issues I face:
- Generally speaking my users have only a vague idea of what they want and are mostly inaccessible.
- Time to market is critical.
- Information on critical parts of the project are limited or overwhelming - including third party APIs, protocols, and data sets.
- Access to third-party commercial products and outside help is extremely limited.
- I have very few people who can double-check my work directly or that I can bounce ideas off of.
- Although somewhat useful, design processes and documents tend to be disconnected and waste a tremendous amount of time.
Here is some of what I have learned and what I typically do to overcome these problems:
- Close your eyes and dive right in. Starting a new project is like jumping into a cold swimming pool. You know it's going to be a shock but its going to be worth it at the end.
- Compartmentalize. Break your project into small components in your mind or on paper and work on them as if they were unrelated.
- Name your project. Give it a unique and interesting name. This will help you commit to the project as a good name is often hard to find. My current project involves research and exploring new ideas so I called it Voyager.
- Know your design and architectural patterns beforehand. You may not know all the requirements for the project yet, however you should have a solid feeling for the design patterns and architecture available to you. Before the project begins, you should choose which patterns you will generally be following to solve all the unknowns going forward. For example, on the current project I choose a simple three-tier architecture and will follow general object-oriented design patterns.
- Leverage existing infrastructure, open source software and frameworks. This will save you a bunch of time. Choosing a framework, in particular, will solve a large number of remedial problems right out of the starting gate and will facilitate your architectural and design patterns selection. I use the Spring Framework for most of my projects.
- Start small but think big. I usually start by forming the project file structure and coming up with some basic interfaces for the most critical parts of the project.
- Keep it simple and don't focus on the details. The foundation and walls of a house only take a couple of days; the devil is in the details. Often-times, users are more interested in seeing a working system than having all of the requirements met. A simple login screen with some basic functional requirements can go a long way to satiate a tough crowd.
- Don't be a perfectionist. You will make mistakes and will have to redo large parts of your code. Coming to terms with this will help you alleviate your anxieties.
- Focus on added value. Remember you are not making a Hollywood blockbuster. At the end of the day what matters is how this will add value to your career and/or the firm you are working for. Don't worry about bells and whistles. You can add those later.
- Sleep. It's critical that you sleep and well. I find that most of my problems are solved by a good night's sleep. Often-times, when I am stuck on a particularly tough problem, a good night's sleep will bring me results.
- Use caffeine effectively. Although caffeine can improve your development productivity and reduce attention lapses, it can also build up your anxieties and has limited effect on more complex cognitive function. Use it appropriately and watch for its effects.
- Diet and exercise. My work colleagues joke that I am the most fit director of technology that they know. I see myself as a cognitive athlete and try to be very body aware. Things like flexibility, cardio heath, muscle mass, type of food, and the quantity of food you eat can have a dramatic affect on your productivity. Starting a project can be particularly overwhelming and without some balance you will soon find yourself overwhelmed by your body's inefficiencies. I, for example, have a mixed regiment of cardio workouts, strength training, and flexibility exercises. I eat small launches to avoid the midday energy lapse and have several small healthy snacks.
- Stand. I, for one, am a big proponent of the standup-sit down desk. Sitting is one of the most inactive things you can do and you create a psychology of inactivity. Get the sit/stand desk and when your blood starts to pool and you are tired of standing, lower your workstation to a sitting position. Sitting all day will also tighten up your hip flexors and put pressure on your hamstrings and lower back. Eventually, this may create muscle imbalances that sap your strength or distract you with pain.