August 24, 2006
It's unbelievable to me that a company would pay a developer $60-$100k in salary, yet cripple him or her with terrible working conditions and crusty hand-me-down hardware. This makes no business sense whatsoever. And yet I see it all the time. It's shocking how many companies still don't provide software developers with the essential things they need to succeed.
I propose we adopt a Programmer's Bill of Rights, protecting the rights of programmers by preventing companies from denying them the fundamentals they need to be successful.
- Every programmer shall have two monitors
With the crashing prices of LCDs and the ubiquity of dual-output video cards, you'd be crazy to limit your developers to a single screen. The productivity benefits of doubling your desktop are well documented by now. If you want to maximize developer productivity, make sure each developer has two monitors.
- Every programmer shall have a fast PC
Developers are required to run a lot of software to get their jobs done: development environments, database engines, web servers, virtual machines, and so forth. Running all this software requires a fast PC with lots of memory. The faster a developer's PC is, the faster they can cycle through debug and compile cycles. You'd be foolish to pay the extortionist prices for the extreme top of the current performance heap-- but always make sure you're buying near the top end. Outfit your developers with fast PCs that have lots of memory. Time spent staring at a progress bar is wasted time.
- Every programmer shall have their choice of mouse and keyboard
In college, I ran a painting business. Every painter I hired had to buy their own brushes. This was one of the first things I learned. Throwing a standard brush at new painters didn't work. The "company" brushes were quickly neglected and degenerated into a state of disrepair. But painters who bought their own brushes took care of them. Painters who bought their own brushes learned to appreciate the difference between the professional $20 brush they owned and cheap disposable dollar store brushes. Having their own brush engendered a sense of enduring responsibility and craftsmanship. Programmers should have the same relationship with their mouse and keyboard-- they are the essential, workaday tools we use to practice our craft and should be treated as such.
- Every programmer shall have a comfortable chair
Let's face it. We make our livings largely by sitting on our butts for 8 hours a day. Why not spend that 8 hours in a comfortable, well-designed chair? Give developers chairs that make sitting for 8 hours not just tolerable, but enjoyable. Sure, you hire developers primarily for their giant brains, but don't forget your developers' other assets.
- Every programmer shall have a fast internet connection
Good programmers never write what they can steal. And the internet is the best conduit for stolen material ever invented. I'm all for books, but it's hard to imagine getting any work done without fast, responsive internet searches at my fingertips.
- Every programmer shall have quiet working conditions
Programming requires focused mental concentration. Programmers cannot work effectively in an interrupt-driven environment. Make sure your working environment protects your programmers' flow state, otherwise they'll waste most of their time bouncing back and forth between distractions.
The few basic rights we're asking for are easy. They aren't extravagant demands. They're fundamental to the quality of work life for a software developer. If the company you work for isn't getting it right, making it right is neither expensive nor difficult. Demand your rights as a programmer! And remember: you can either change your company, or you can change your company.
Posted by Jeff Atwood
We have all of this except number 6; unfortunately, a tram passes the window making a very loud "bing, bing" noise every few minutes.
Oh, and some manner of versioning system is, of course, essential. (I favour SVN, but really anything would do.) I've only worked for one company that didn't use one, but I nearly went mad while doing so.
I question the "two monitors" requirement. I won't accept two low-resolution monitors instead of one high-resolution one. Having a good clear high-resolution monitor is a major productivity win since all things being equal I can present more information to myself on a high-resolution monitor. I'm not sure if two monitors does a lot for productivity since most of the time one monitor is idle--I could get much the same effect from virtual desktops (which I do use quite vigorously) and save two square feet of desk space. Desk space is important since I usually have two machines on my desk.
I rarely work with less than two machines. I see a single-machine developer as a developer working in a developmestuction environment (development, test, and production all smashed together): OK for amateurs and hobbyists, very much not OK for professionals. We are long past the days when a computer is proportionally a large expense--even in the mainframe days, the vendors implemented various partitioning schemes to divide their computers into smaller pieces as soon as they were powerful enough.
A developer has two sets of machine requirements which often conflict. One requirement is a machine which must be optimized for developer productivity--high end hardware, lots of software, both development software per se and various non-development software like email and web browsers. The other requirement is a machine which must be optimized for software testing and debugging--strictly controlled hardware and operating system configuration, isolation from external networks (provided that doesn't conflict with the requirements of the application), remote debugging software or ICE hardware installed. When those two requirements conflict, you need two machines.
Sometimes the second machine is shared between developers, and sometimes involves some kind of virtualization. Multi-user Unix servers shared by developers with desktop PC's or workstations filled this role in decades past. Today virtual PC machines are available gratis or free. In mainframe days the first thing vendors did when their machines got powerful enough to run an OS at all was to implement various degrees of virtual machine partitioning.
I have developed the following kinds of code at various times:
* CAD software, games, productivity apps - need one machine to run the program and debugger back-end, another machine to run the debugger's front end, and a farm of a few dozen machines to rebuild the software in under three minutes. The major problem here is debugging interactive event handling, where the keyboard and mouse must not be operated while single-stepping through code. This is impossible with a single machine, possible but often non-trivial with a virtual machine. Performance issues usually arise from display driver software which is in turn tightly coupled to the hardware, so nothing short of executing the code on exactly the target platform will work.
* Web servers and database code - usually there are two machines involved because two middle-of-the-road machines specialized for the two tasks are cheaper than one high-end machine that can handle both workloads at the same time. My laptop has all of these on a single machine, but that's only useful for field patches and developer sandbox testing, and only in cases when absolutely no other computer, nor a suitable network connection to another computer, is available. The single-machine configuration is painfully suboptimal and I use it only as a last resort.
* Firewalls, bastion hosts, Internet-facing servers - Since each piece of software installed on the machine has possible security implications, I'm not going to even think of installing anything on the machine that doesn't *need* to be there. That means the code is built on some other machine and shipped to the server ready to run. Besides, the server is going to be a headless box in a rack locked in a tiny aggressively cooled closet, I couldn't use it as a development workstation even if I wanted to.
* OS kernels, device drivers - in many cases the machine where software development is done is nothing like the machine where the code executes. Although Linksys routers are in theory much more powerful than the fastest developer workstations of 15 years ago, nobody in their right mind uses their Linksys router to do a self-hosted kernel build today. Although it's possible to emulate the router's CPU and network ports, neither real testing nor real development can be done without having two physical machines.
* Industrial automation software - the machine literally costs a million dollars, software has to run in real time, and a software bug could do physical damage in dollar amounts with five digits. The hardware is much more powerful than my development desktop, but I wouldn't dream of running my dev compiles on it...OK, actually, I *do* dream of running my dev compiles on it...but the first item in my project plan is to put together a software emulation of the expensive pieces of the machine so that I can build copies of it on many machines.
Most non-trivial applications don't need exactly the same hardware to run than you would use to develop them. The one major exception might be those who develop compilers, RAD tools or IDE's, where the development environment and the runtime environment are identical by definition. This includes all those embedded application scripting languages like spreadsheet macro functions, but on the other hand these languages offer little or nothing in terms of "developer tools" per se. Often it's difficult to tell the difference between a "development" and "user" environment in embedded scripting languages since the difference often boils down to the existence of documentation installed on the machine.
All my single-machine work has been:
* Embedded application code in interpreted languages - runtime and development environments are identical by definition, no more than 1K LoC
* Programming contests - please leave your laptop at the door, sir
* Trivial productivity scripts - one- to ten-liners with no product life cycle.
* Code to bypass corporate firewalls - Someone else's corporation. Boredom. Wanted to browse web. Unsupervised access to locked-down firewalled Windows computer for hours. Let's not say more.
* Coding in University or high school - can afford only one computer, or more like 0.001 of a computer--all undergrads on a single machine
I question the "two monitors" requirement. I won't accept two low-resolution monitors instead of one high-resolution one.
And why accept one high-resolution monitor, when you could have two? Or three?
This is not a zero-sum game. You should have your cake and eat it too.
# Every programmer shall have two monitors
my company only provide us wif faulty/blinky 14" CRT monitor... not even the flat screen ones...
only when u are real lucky, u get the 15" LCD monitor... very rare...
# Every programmer shall have a fast PC
hmm let's see... what we have... a P4 2.8ghz PC... with 1gb of ram.. that's all!!! nothing extra.. and we are running Eclipse(240,000K), SQL developer(76,000K), weblogic(151,000K), and company's own software suite (100,000K)... all of those are memory consuming and free software... :|
# Every programmer shall have their choice of mouse and keyboard
u only get those OLD keyboards and a roller ball mouse!! it's ROLLER BALL!!! damn it...how can u live with it?
at last... i brought my own keyboard and mouse set...
# Every programmer shall have a comfortable chair
Chair... hmm some chairs are even broken... without wheels... and they refuse to replace them
# Every programmer shall have a fast internet connection
i do not have much complains for this...
# Every programmer shall have quiet working conditions
my office is like a wet market... where there is so many ppl walking behind u... and oh ya... our desk is just a normal desk with 3 drawers and 3 piece of small partition... where u can see each other when u sit up straight...
so most of us are on our headphones most of the time... else we could not work!!!
Two monitors are a must if you are developing a UI component. When it comes to debugging, if you have only one monitor (however large), whenever you hit a breakpoint and the debugger comes up on top of your application, the window messages are screwed.
Otherwise, dual monitors are nice, but not nearly as important as the right chair / keyboardmouse / PC.
Duh, we pay programmers anywhere from 60k to 120k but cannot afford to provide them adequate RAM which for 4 gigs typically only costs around maybe $500! 1 gig is not enough, 2 is avg. Now 3 is where your productivity starts to give the company some results!
Generally speaking, companies are just STUPID and for some reason get a trip off being skimpy on PCs for developers when they are not saving a dime. It's just a power trip by Network Admins and Accounting.
Know your rights as a professional developer and demand a PC that is powerful so you don't waste your own life waiting around for Visual Studio or SQL Server to get done opening, loading, or compiling!
Help us all!
I would like to use your image of the Bill of Rights for educational purposes in the classroom. Please let me know if that is alright with you.
I definitely agree with most of this Bill of Rights. I'm in junior high, programming in True BASIC, and I wish I had what this bill of rights talks about! Our computers are slow, crash at least once a day, the class is always noisy with disruptions every minute, and the network is set up horribly so that we can't share any files (even if we aren't cheating) A lot of these things wouldn't work at a school (1000+ students, all picking out their own mice and keyboards? 2 monitors for every student?), but even amateur programmers have rights too.
I used to work for a somewhat large dotcom and I actually did have two screens and a very nice chair (not to me ntion the superspeedy machine they gave me) - but since then I have moved on to a smaller company. It's hard to get used to a single screen, handed-down computer and a pretty shitty chair compared to my old one. Yes, the salary is a whole lot better, but my back hurts :( Cheers for the article!
I remember my college days when I was coding in a corner of my own room. No one bothered me. I would look up and see dawn begin to creep up and realize I'd worked the night off without any problems. I miss those days. I was in the zone! If I ever had any mental blocks, I slept then woke up with solution in mind.
Nowadays, I have to listen to music to block out office chatter, telephones ringing, shoes tapping against the floor, etc. Listening to music is a distraction. I'd rather be able to talk to myself when I work.
The zone is important. It increases a developer's productivity a billion times more. I'm not kidding. You want a developer fiddling with his headphones and squeezing in a few games and uses up most of his time writing reports or a developer who won't talk to you for two weeks but delivers a finished product by then?
Maybe one of the alternative of this is to provide the programmers a powerful laptop, a fast mobile internet and work where he/she is comfortable with.
#7 should be "Every programmer should know and appreciate the language known as PHP: Hypertext Preprocessor"
Every programmer to learn to think "out side the box" and realize without companies, and their customers, we not be making 60-100K.
Quite whining and do the job best you can, the pay check will be the same regardless of whether or not your chair is comfortable.
Sorry to be contrary, but as the son of a garbage man, I know there are tougher jobs I could be doing other than software development.
Every programmer shall have two monitors :-
Can't even think of it. Got just a 15" lcd capable of displaying scrollbars at both sides. :( :(
Every programmer shall have a fast PC :-
512mb ram, and processor of good ol' days. havn't rebooted my system for weeks cuz it takes 15 minutes minimum. :( :( :(
Every programmer shall have their choice of mouse and keyboard :-
Using scroll mouse. Do I have to say anything more about it. :( :(
Every programmer shall have a comfortable chair :-
No comments. It's there, that's enough. :(
Every programmer shall have a fast internet connection :-
It takes 25 seconds to open google, and asks for password everytime I open a new IE instance, that counts for 5 seconds more. :(
Every programmer shall have quiet working conditions :-
Only thing that's there. Everyone's quiet over here like they have never talked in their life. Seems like I am working with robots. Of course, it sucks too. :(
O GOD, help me. Take me out of this hell. My job sucks.. :( :( :( :(
I worked as a PABX technician in a Telco in Trinidad for 15 years, but I had a secret life as a C++ programmer for about 10 years.
Also, in my personal development environment, (at my cost) everything was perfect, large 21 inch monitor (2 not required) fast dual core CPU LOTS OF RAM, RAID1 (mirror) all this I put together my self and a backup PC of slightly less capacity but operable. I will backup my work, replicate it to other PC for backup...everything was hunky dory as can be.
After lots of contemplation, I decided to jump ship to another part of the same company as an administrator with numerous job functions including server support and programming (ambiguous internal advertisment in my opinion).
It was my first job in the I.T. field.
I was there for a total of about 6 months.
Yep, I resigned the company after 16 years.
1. The PC was dead and deadly slow that I was given to do work with - don't ask to change it (talking to a brick wall).
2. The laptop was kinda working and I was not allowed to use my personal laptop which was faster and better for the job at hand.
3. The job function included c++/php/sql/server administration/tech support and I was supposed to do CISCO and had to work late - both of which I NEVER did before and do not want to do.
4. I was working in the city and around us there were about 4 building constructions around us at the time....
5. 14 Inch monitor.
6. The late work was conflicting with my personal development and part time computer development initiatives (major reasons).
7. This job made me start to dislike programming (VERY BAD).
So I left this permanent job and moved full time to my temporary initiatives.
Now I work from home, going quad core, 24 inch monitor.
Don't pay much yet but more pleasant than before.
And before I left, I already had a separate pension plan going for about 10 years. (you guys may know it as 401k plan).
Colin B Maharaj
A glance at the URL of each blog shows the naming/numbering system of the individual blogs.
I entered 000001.html, and got test1, but upon looking in the archive, I can't find it. Why was this one not included (and #000002 and #000003), in your "complete" archives, eh? eh? :D
AND one more thing, why is #000666 about The Programmer's Bill of Rights? Hmm? Trying to tell us something?
Sadly you'll probably not overflow by going past #999999, but I must say, I am very pumped for an upcoming stackoverflow! :)
Love the list. Unfortunately, I've often had to pull teeth at the management level to get most of these things.
But there should also be a list of responsibilities for programmers:
1) Don't hog the credit - give it where it's due. The more you give your co-workers credit, the more your boss will attribute it to you. Strange, but true.
2) Share what you know. You don't become invaluable by keeping everything to yourself, in fact it makes you expendable.
3) Never cheat the boss/company. It's one thing to need to screw off to blow off steam or regain your focus. It's another to just screw off.
4) Relate what you want in business terms, not IT terms. You can't win every fight, sometimes there are business-related reasons for why things must be the way they are.
5) Ask users for their input. They'll be using your program, not you. Build it so they can use it, and they will.
There may be others, but these come to mind immediately.
Industrial strength hearing protection did the job for me in item 6 -- I posted links to the stuff I use in #6's linked article.
I I, We should start our own parties in every country for programmers everywhere and introduce the Programmers bill of rights
As for a quiet environment, I find that it's easier for me to listen to music than to code in complete silence.
Solution: Work for people who need fast computers for their own jobs. I work with engineers who need 8 gigs of RAM, 4 processors and 2 monitors (with 1600x1200 resolution), so that's what I get too. When I say need, I mean it. The CAD program they use won't always run correctly on the one computer in the office with under 8 gigs of RAM and 4 processors (it has 4 gigs and 2 processors, so it's not slow by any means). One of the engineers even has a second machine with TWO quad core processors.
Heck, while we are dreaming, let's go for broke...Every programmer shall have his or her own private cubicle consisting of an area of no less that 100 square feet. He or she shall share this space with no one, the cubicle should come with a standard entryway and four adjoining walls that are no less than 6 feet in height.
The programmer shall also have access to modern conveniences in his or her said cubicle that will consist of the following: (1) Indirect Lighting that can be variably adjusted to coincide with the developer's mood; (2) A floor heater that can be turned on and off; (3) A fresh air vent that can be turned on and off; (4) A white noise creator to drowned out loud music and non-essential conversations that happen in adjacent cubicles; (5) A flexible work schedule that allows the developer to determine the most productive periods of the day for him or her to work. That should do it. :P
There is a list of responsibilities for programmers called the Software Engineering Code of Ethics and Professional Practice.
Wtf? Programmers have rights? How about the children making the expensive brand name clothing they wear? What about the factory workers that make their cars, and the folks working at mcdonalds making their food.
Lazy programmers don't need comfy chairs. Lazy programmers need a swift kick in the ass.
Right to a BACKUP media.
The right to BACKUP one's development PC software is always overlooked.
Either tape or 2nd hard drive. Bosses love shifting risk to you to save a buck. A major crash can leave you weeks behind.
I liked what was said about one's choice of OS and tools as a religious choice. In that case their should be a separation of Environment and Requirements.
By requirements, I mean a statement of the problem and its possible solution. E.G. the client wnats a prime number 20 digits long with the sequence 789 in it somewhere.
By environment, I mean the OS, Windows, Linux, OS X. I also mean the tools, Vi, Emacs, Eclipse, Visual Studio.
If there is a separation of environment and requirements, a developer will always code pretty fast.
Great post :)
If you get the time, please create a similar Bill of Rights for Technical Writers, and include one of the bylaws to state individual sources of information must understand what they are talking about before indirectly delivering misinformation to an otherwise technical audience.
Thanks and keep up the great work with this blog :)
Are you kidding me?
How about the right to quit if you don't like the job that you agreed to be paid for. You still have that right. If you were dumb enough to not negotiate all those things before you accepted your position, then quit. Whining spoiled babies.
About you should have negotiated before, quit whining, and similar remarks.
You are missing the point: The *employer* should be the one worrying, because he is wasting money by the bucket load. If his programmers are constantly distracted by noise, or people interrupting them, their output will be low...but their salaries remain unchanged.
If they have to waste hours and hours because of antediluvian equipment, you still have to pay for these hours. Poor equipment is not only slow, but quite often you have to spend a lot of time to fix it, clean the registry, use some hack settings that are marginally faster, and perhaps more importantly, you force yourself to run only the bare minimum in terms of applications: if it is slow, you try to run as few applications as possible, which means that if you need something from another application, you have to start it. Wastes time and takes your attention away from what you were doing.
All these add up to a lot of wasted time and a much lower productivity. If you save $2000 on equipment and waste 500 hours of your programmers' time, you are a moron.
A second monitor goes for about USD 250. Assuming $50 per hour (for the sake of simplicity) and a 5% productivity increase (on the low side), you will recover your investment within 45 days and by the end of the year, that investment will have paid for itself 7 times over.
Even if your attitude was screw the programmers, I pay them, they are mine to do whatever I want, you still want to get them a proper development environment, because if you don't, it's going to cost you.
Thanks for your post, Sylver. It sounds like, Middle Manager, has been in, middle management, far too long; and harbors a whole lot of resentment.
Personally, I liked this piece on the programmer's bill of rights. If you aren't too into yourself, (or a resentful middle manager), most of this was tounge and cheek stuff; and should not have stirred up some of the negative emotions that it did.
I also thought the post on the programmer's responsibilities was excellent. If we are going to have rights, we also need to have, (and except), certain responsibilities.
Two monitors? I'd |S| rather have one big
screen the same si|A|ze as two little ones.
It gets on my tits|M|. Seriously.
no doubt the formatting will screw this up....
I just reread this article after finding it over a year ago. I am diligently trying to move our department towards the things listed in this article, though some items, such as dual monitors, may be difficult given the economic climate. It is difficult for developers to understand why a company might resist making changes like these, given the tangible benefits of these practices. Monitors for example are cheap compared to the cost of a programmer's time. I tell my team "Your problem is that you think logically" ;-) In a lrage company, the bucket the money comes out of is almost more important than the actual cost. Programmers are often viewed as overhead. The company pays the same amount on a monthly basis regardless of how long it takes to perform development tasks.
Thanks again for putting this to "print". It might just help us move the ball forward.
really good, very creative, bill of rights, just respect each other.
Absolutely wonderful and amazing. I would also like to add "allow beer while working" :-)
I think a lot of the proposed additions could be summarized thusly:
8: Every program shall have access to the right tools.
Don't forget good development tools... It surprises me how many companies are still using gdb for debugging, when there are much better commercial tools out there.
"Every painter I hired had to buy their own brushes."
for consistency sake, you should apply this analogy to the entire programmer's toolbox you have listed above, including chair. this is a standard way of doing business for men who make their living as mechanics. when you come to the job, you bring your own tools, and when you leave, you take them with you. the same should go for programmers.
If you want a programmer to work more than 40 hours a week, you need to pay them for more than 40 hours a week.
Just because the boss was once an Arthur Android, and gets a heroin-like endorphin rush from working from 4AM to 10PM doesn't mean everybody else in the industry does, or should. The practice of the "exempt" employee, paid for a week's work, but continuously worked for double shifts because of artificially-skewed deadlines, poor specs, feature creep, and salesman's disease (of course it can display your data in Klingon! It'll be in the demo next Thursday!) should be banned outright. It burns out more programmers than any other practice, bar none.
My favorite poster: "A lack of planning on your part does not constitute an emergency on my part."
---Gwen (who still has nightmares of being chased by androids)
I agree with Chris Szurgot - I don't mind too much whether the workplace is silent or has a lot of background noise, but I don't see that anyone can work productively if they're faced with constant distractions.
What we need is a big sign.
(No, really - I mean it)
Oh, and regarding fast machines, I agree with the point that developers need two machines - a high-spec box for coding and building, and a testing machine with similar spec to what a customer will use.
Although testing on a customer-spec box may not help if the developer isn't testing with customer-level data. A UI might be fine on the small volume the developer tested with, but fail miserably when put into production with a thousand times the volume.
7. Every office, like we'll ever have one, OK, every Roomic Cube should have Indirect lighting with dimmers. Trying to work though the glare of an overly lighted workspace is not only annoying, but eventually will blind you.
No programmer shall be forced to use a CRT monitor. LCD monitors are cheap and much easier on the eyes after a long day of hacking away.
Rightly said.. I would add one more-
"Every programmer shall have their choice of IDE." - Just like an artist has his choice of tools, the IDE is a programmer's prime tool. It's his personal choice and can never be enforced on him and he can never be deprived of his favorite IDE by the employer.
Proud to be working for Clarity Systems.
#2 and #6 seem to be issues with a lot of companies. This is because 'programmers' are sometimes grouped in with 'IT' which a lot of people think is a help desk and don't fully understand software engineering and its needs. Standard issue computer that everyone else in the company gets, plus a cube in the middle of noisy traffic.