views:

2786

answers:

28

Hello,

I am a solo developer, working in a very small web development firm. There is occasional support for development from contractors, but for the most part, if code is written in the office, I am writing it.

Many of the articles and such on here talk extensively about the tools and techniques used for collaboration of developers in teams, but that is a non-issue with me, as there is no one to (technically) collaborate with. Yet, I feel that in many ways, there are things that could be adjusted for efficiency. Our small office doesn't participate in many of the meetings/team constructions that most of the techniques rely heavily upon....we mostly just walk around and talk to one another when something is needed.

This works great for all of the Just-In-Time, 15 minute fix stuff that probably populates 50% of my day, but I am also constantly working on major projects that require my total concentration, and between a flurry of tiny fixes, and being the primary admin on the 4-6 servers that we own, I find it almost impossible to get real, heavy lifting done.

What suggestions can you some of you offer to help me/us become more productive/efficient, without adopting all of the corporate/teamwork practices that we are trying desperately to avoid? At what cost for efficiency is our total relaxation?

+66  A: 

Version control! I've got some experience using it as a single developer and even when there's just one person, it's worth it's weight in gold.

Chris Upchurch
I am a solo developer who uses Git. I write my check in comments as if I was working on the linux kernel.
Christopher Altman
+12  A: 

I'd consider having a "closed door" period on some schedule where unless somethings on fire you're left alone to be productive.

Scrum techniques are all about giving people a task with a deliverable and a finite amount of time, and then giving them the resources and environment they need to get it done.

It really helps people be more effective. See if you can't get left alone for a couple hours a day. I've done it at past jobs in similar situations and it really made a difference.

Tyler
+10  A: 

Definitely use source control. If you want something really easy to set up go with TortoiseSVN which doesn't even require a server backend to work.

Also on the productivity side try keeping your e-mail closed most of the day and only triage it a couple of times a day. If something is really important you will probably get a call :)

Søren Spelling Lund
+6  A: 

Even though most of the articles/blogs/books/... out there seem to all be talking about working within a team most of the advice applies to single developers as well. A good start is the Joel Test. Just because you are a team of one doesn't mean the advice doesn't apply.

John Meagher
Some parts of the Joel Test are a bit awkward for soloists, especially "do candidates write code during their interview."
Lucas Jones
+11  A: 

Take lots of notes. You feel like you'll remember why you did things while you're doin' 'em, but you won't. I like to use a TiddlyWiki.

AndrewJFord
I love TiddlyWiki. I use it to document issues with engineers regarding database related check ins and send it out via email.
Ethan Post
Amazing! Thanks!
Sébastien RoccaSerra
+14  A: 

Bug or ticket tracking system, preferably integrated with source control, is extremly useful even if you are the only one adding and implementing requests. Writing down what you are going to do and when you are finished with it helps to do what you actually intended.

ima
I agree, but if you're too lazy to set up a bugtracking system, todo.txt can also be very effective for small projects. (I used to have one in every project folder before I started using Bugzilla and Jira.)
Anders Sandvig
yeah my actual physical notepad scales out nicely for one person, :P
jdelator
todo.xls is even better than todo.txt
erikkallen
todo.todo is even better than todo.xls. :) Personally, I use AbstractSpoon's ToDo program; the ability to split things into subtasks is more useful than it sounds for keeping your work in control. (Link: http://www.abstractspoon.com/)
Lucas Jones
+6  A: 

The 15-minute tasks consume 50% of your day, and we'll just accept that those sorts of tasks aren't going to get any quicker or less frequent. So you're really looking for a way to maximize the productivity of the other 50%.

It sounds like you really just need a way to block out distractions for blocks of time long enough to make progress on your long term deliverables. Some interruptions cannot be avoided - if an important server goes down, it has to be dealt with right then. The rest of the interruptions, like people stopping by to talk about an issue, probably can be.

For a small office where everybody knows each other, just talking to your co-workers can help. I hope you have an office door you can close. If you explain that you're going to close the door for two hours each day, and request they not interrupt you unless something is on fire, I bet you will see some positive changes. I had a similar situation a few years ago, and it worked for me.

Shifting your office hours can also help. If you become an especially early riser or night owl you can get a couple hours while the rest of the office is mostly empty.

As a final option, consider telecommuting for a couple hours in the morning or evening and plan to work on the long term items then. This isn't a great solution - without reinforcement, people will just start sending eMail/IM/phone calls during the time you're trying to hunker down coding. It also has the distinct disadvantage of not being in the office if something crucial really does blow up. So, not a great solution.

DGentry
+1  A: 

Version Control: Subversion (SVN) is popular and open source. It is also pretty easy to get started with.

Unit Testing: You don't have to take the plunge into Test Driven Design (TDD), but getting familiar with a unit testing tool is good practice. It doesn't keep your code bug free, but it will tell you if you broke something that was working before you changed it.

Continuous Integration: This is very useful for teams, but also has benefits for the solo developer. Get some kind of build server going to you can monitor when builds are broken (code can build on your machine, and not on the build machine if you forget to check everything in, or forget a third party library, or a library is out of date on the server). This can also help when it comes time to deploy code.

All of these things will give you more confidence in the code you are producing, and allow you to react faster when you are doing bug fixes. It's hard to give specific examples since I don't know your environment, but these things will definitely help you be more efficient by making it transparent when things aren't behaving, or by allowing you to try something, and roll back to a previous version if it doesn't go as planned.

NerdFury
+49  A: 

I'm a single developer with a wide variety of tasks like you, so here's what I do.

  1. Version control is a must, plus it's a good backup "just in case".

  2. A good set of headphones so you can listen to music and drown out everything else for those periods where you really have to concentrate (if you are in a load/distracting environment)

  3. Some kind of bug/task tracking. This way you don't have keep everything floating around in your head and can just concentrate on what you are currently working on. Even if it's a folder in your email, you just need some place to put your thoughts down so you don't have to keep attention on them.

  4. I leave my IM and email on and don't find that it's that terrible as long as I'm disciplined to glance at the notifications to see if I actually need to read it then (emergency thing) or if it can wait until I actually handle my email (routine communications, jokes, invites, etc.)

  5. I really like a good IDE (for .NET stuff, Visual Studio). I find it's much easier to get back into things with the help of things like code completion and "Go to definition" (in case I have to back track to remember exactly what I was doing).

  6. A good file compare tool like Beyond Compare and a good deployment tool like Unleash IT will save you a lot of headaches remembering what you have changed.

  7. Close stackoverflow.com (it's terribly fun and distracting :)

Jared
You're right on Re #7, I too should to join Stackoverflow Anonymous. Gotta limit it to once per day.
lkessler
Better still, just add "stackoverflow.com 1.1.1.1" to your HOSTS file. Problem solved. ;)
Lucas Jones
@Lucas- But you might be pulling your hair out once you forget about it and actually _want_ it back.
DMan
@DMan: Erm. *squirms*. True...
Lucas Jones
+1  A: 

I agree that you need to be able to block out some time to work on these larger projects. Pick a time in the day when your concentration is best (for me, it's the morning) and block out at least three hours to concentrate on these projects. It is important not to get distracted, since it can take a long time to get your mind wrapped around a problem and understand it. If something distracts you between that time that you get into the problem, and when you solve the problem, all that time will be wasted.

If you have an office door, close it. If you don't, get some good noise-canceling headphones, and try to arrange your desk so you have a minimum number of visual distractions. Ask your coworkers not to disturb you during this time, unless there is some emergency, like an important server going down. Shut down your email client and IM client. Turn off your phone ringer, or send all calls to voice mail.

As long as your coworkers understand your need for a solid block of concentration, this will work well. The last thing you need, though, is for them to feel like you are too important to be bothered by them.

pkaeding
+20  A: 

If you're on your own, your time is critical. Because of that, I'd highly suggest you look into writing some decent automated tests on your code.

If you're doing web development, the quickest bang for your buck (IMO) is Selenium. It's a browser-based tool that basically uses JavaScript to perform user operations, inside a browser (works with multiple browsers and versions).

http://selenium.openqa.org/

The reason you want to be using automated tests is because you're the single point of failure. If you change something, you really don't have time to re-test everything. On the other hand, if you have even a half-way decent set of sanity test scripts, the risk of your change breaking something you're not aware of drops significantly!

I'm in a similar situation and using Selenium has saved my bacon on more than one occasion.

Peter Bernier
A: 

Besides version control I suggest an automated test suite.

Nicolai Reuschling
A: 

I'm not completely solo, but I have been adapting some things I've learned from Scrum. For example, laying out your tasks on stickies and managing that way is effective.

Greg Ogle
+4  A: 

Learn to use your boss. At one time I was the only Unix system administrator in a shop that used to have three the month before (the other two left at the same time, for the same company :-). Lets say that my time was constrained, so I started routing all tasks that did not involve a burning computer through my boss who prioritized and routed all things that someone else could solve to someone else.

I would also agree to the closed door periods, but with the added note that you should put up a note with the time that you will "be back", so that your colleges don't have to waste their time coming back until then.

Since you administer hosts, get some sort of automatic monitoring system that alerts you if something goes astray. It gives you the peace of mind to fully immerse into the code.

An physical inbox that your colleges can trust that you empty at least daily remove the disruptions that come when someone just pops in to leave a paper.

Mr Shark
Same Reason you need unit tests :)
Jiaaro
+2  A: 

I agree with a few of the comments here regarding distraction management. Coding is usually an activity that doesn't lend itself well to interruptions. Definitely block out time during your day where you can concentrate on code. If you have a door, close it, otherwise figure out some other indicator that you shouldn't be disturbed. Some teams put up red bandannas on their cubicles when there were working on code and needn't be disturbed.

Of course there are many other tools that help you organize your day and your code. Some good reading regarding task and goal management can be found at Rands in Repose, see The Taste of the Day and The Trickle List.

Redbeard 0x0A
+5  A: 

Without repeating the good opinions above (source control, testing, etc). I would add that a good self-organization process is huge. It is often easier to tackle those 15 minute problems then to go for larger priority items. They are quick, understood, and easy to generate that email praise from coworkers/clients but are a false measure of productivity. Start queuing all those up for a 2 hour window a few days a week and outside of that window DO NOT DO THEM. Each day have a 3-5 item list and stick to it unless that fire comes.

When I went solo the biggest piece of advice I got was that I had to prioritize and be disciplined and it is an ongoing battle. If I am in the zone I kill everything else and just keep going...I treat myself like I am radioactive!

Jake Hackl
+1  A: 

Not only for those lone travellers:

  • Automate as much as you can, to spare you from repetitive tasks.
  • Use the best tools available.
  • Do one thing at a time.
MP24
+1  A: 

You definitely want to set up a ticket system. An off-the-shelf one might suit your needs, or you might decide to write one yourself. At a company where I previously worked, we wrote our own ticket system where tickets were automatically created when a user received an error on our web site. Errors were automatically made top priority. We had 10 additional priority levels, each with a corresponding color. It was very helpful for prioritizing all the things that people wanted us to do.

With regards to time management, see if you can schedule your time in advance. You might meet with some resistance, so perhaps base your initial schedule on how you are working right now and make small adjustments (30 minute increments) in the direction you want to go.

Scott
+1  A: 

To add my Voice

  1. Version Control is essential even on your own. I have some projects I develop on my own and I find SVC essential. Perforce have a 2 user version available free, perfect for what you want and very easy to use.
  2. Bug Tracking again essential. Brilliant for keeping track of what you are doing and how long its taking when you dont have a project manager looking over your shoulder. Fogcreeks FogBugz has a 1 user online version which is free to use and your boss, colleagues only need to email a standard address to log a bug.
  3. Decent Text editor (Textpad for me)
  4. Learn to use Regex (RegExBuddy)
  5. One final thing would be to use a build system if possible (www.finalbuilder.com)

That should set you up nicely.

Toby Allen
+4  A: 

To add my three cents:

  1. Macros/Automation are a must. Figure out how to automate as much of those 15 minute fixes as you can, because in the long run once you have it setup the benefits really work well.

  2. Version Control is natural and has been covered in decent detail by others.

  3. Virtual Servers help me save lots of time. Many of our clients run outside hosts and which often use different version of PHP, mySQL or IIS setups than what I have ready to use. Due to the fact I have to keep up with so many versions, I have found that it was best to use VMWare Workstation images. I keep one image per project. Most of these are stripped down Windows 2003 Servers running WAMP. The beauty of the WAMP stack is you can install the exact versions of Apache, PHP, mySQL etc you need in a fast consistent manor. If you need ASP.Net v2 or v3.5 again that's not hard set up either. When you are done with the development you close the image and then can move it to a backup SAN or server and not keep it on your development box. Six months later if I need to make a change, copy the image from the SAN and bingo, the server is waiting for me exactly as I last left it. This more than anything else keeps me sane having to deal with different web hosts, development stacks, etc.

  4. Software Notes for me are very important. Because I do more of the web development by myself most Bug Tracking software just doesn't seem to fit my development pattern. Instead I use a Journal Program to keep detail notes not only on my clients and what they want, but I track individual code files and often just jot down quick revision notes on each file and there will document hacks, fixes, bugs and problems. The program I use is called The Journal. I set up each client with a notebook on it's own in loose leaf fashion. The built in template system lets me quickly insert my default form for revision notes on code files.

  5. Time Management is especially important if you bill hourly and the ability to manage half of your day doing those 15 minute fixes can get stressful. I don't use Outlook for this sort of thing but a PIM called Chaos Intellect. This is similar naturally to Outlook but without the bloat and those vulnerabilities that Outlook so often has. Additionally there is a handy activity series editor that lets you predefine appointments, to-do items in macro form. I know, nothing that you can't do yourself in Outlook but I found this light weight and easier to manage. I can get a report of my "Done" items quickly and easily. Additionally I use the spreadsheet in the memo section to track how I spend my day in program that isn't as heavy as having to open Excel for that same task.

  6. Old Fashioned doesn't mean useless. A perfect exampled of this is the fact I keep both a white board with markers and a cork board to keep diagrams, paper notes handy when working. Sometimes the very simplicity of their tactile nature really makes things far easier to visualize.

Robert
+1  A: 

My 5c:

  • source control, bug tracking, wikis, etc. There is enough free stuff around that you don't need to spend any money on it.

  • CLOSE OUTLOOK. Set an out of office, tell people to call you. If they can't get with the program, go up the food chain until they get kicked by the right person. I check my mail 2-3x a day. That's it. If someone wants me, they can call me, or WALK to my desk.

  • Speaking of: move to sit with people who don't rely on you, so they don't bother you about stuff. If you get interrupted for 30 seconds, it'll take you 15+ mins to get back to where you were before.

  • Divide up your day, if you have maintenance stuff and solid development work to do. Morning is email and maintenance, afternoon is solid development work. Swap them over every day (AM - > PM, PM -> AM) so you don't get swamped with "morning" stuff going into the afternoon every day. Or do it day-on-day-off.

  • Be really inflexible with your time. Learn to say "no". Make a sign saying "if it's not on fire, leave a message" (and if it IS on fire, call 911). There are usually a few people who you can't be inflexible with, but oddly enough, these people usually interrupt you the LEAST, and understand the MOST that you need to get work done, because they are usually very senior, and have vested interests (read: $$$$) in you doing the work :)

  • The human brain can't multi-task, so don't do it. One thing at the time. Finish it, or move it to a point where it can be parked, THEN do the next thing.

Oh, and have FUN. I you don't enjoy it, what's the point?

Nic Wise
Loved the idea for the sign. :) +1
DMan
A: 

First, get to know and use all the standard tools in your area of computing. People have usually already solved the problems you have.

Second, let your computer write the code for you. Build up a script and template library as soon as you can. Any time spent automating a task will save you many fold in the future.

Third, think twice, code once. A flawed design will steal orders of magnitude more resources than bugs. You can't find design flaws with a debugger.

denonde
+2  A: 

If you're on Windows, here's an article on setting up TortoiseSVN, written with the standalone programmer in mind. It's straightforward.

http://www.codeproject.com/KB/work/XTortoiseSVN.aspx

John at CashCommons
+2  A: 

Your problem is more general, it's addressed in length in the book "Getting Things Done" by David Allen. Basically it's about managing your everyday tasks and understanding why we feel unproductive and how to combat that. The psychological background also discussed, quite an interesting read.

+2  A: 

You can benefit from "The Pomodoro Technique" by Francesco Cirillo. The P.T. is an italian best practice, a sort of time boxing, that allows to get the maximum out from your working time. It is simple, fast and funny.

egapotz
Link appears to be changed to http://www.pomodorotechnique.com/resources/cirillo/ThePomodoroTechnique_v1-3.pdf now.
Konerak
+1  A: 

Try using a new time management system called AutoFocus.

It's free and works like nothing I've ever tried before...and I've pretty much tried them all up to now.

http://www.markforster.net/autofocus-system/

Joe
+2  A: 

Write small code. Review it and refactor it always. Don't let it going to being live and grow out of control.

You can handle thousands lines of code, but you can't handle millions lines of code working alone.

bigown
+1  A: 

Take breaks regularly.

Take a break. Take a drink, take a walk, take a nap. Wash your hands clean of your emotional commitment to the decisions you just made and the character you typed.

If you don't know what to type, then take a shower, and stay in the shower until you know what to type.

Test-driven development: by example

Török Gábor