This work is licensed under the Creative Commons Attribution 2.5 License (or at your option any greater version of it).

There is a lot of material on good software management out there, and not everybody took the time to read all the important one. This material can sometimes be contradictory, and sometimes false. Nevertheless, I decided to integrate it here into what I've perceived and concluded to be the best choices.

I'm not trying to be original in this article, because an essayist (or any kind of artist) does not get credit for coming up with perfectly original concepts or ideas (as I note later in a different context). What I'm trying to do is summarise everything I've learned, judged and concluded, so far, based on the many sources I've read. I may be just a dwarf standing on the shoulders of giant, but hopefully I'll still be able to see farther than most.

So this time, I'm going to try again and hopefully be more successful. This article aims to cover the elements that great programmers would love to see in a perfect workplace. By implementing as many of them as possible, or at least giving them a serious thought, you can make such potential employees want to work for you, love to work for you, want to stay, and be happy as long as they are working for you. Furthermore, you will know better than to irrationally fire perfectly good employees.

I can see why people would think so after reading the "End of IT Slavery". However, my intention in the article was to guide employers (and employees) as to how to best treat their employees, and give them good conditions, so they'll be happier and more productive. Going over the original article, I can see that I indeed had a very ranting tone, and gave bad examples for what not to do exclusively.

One of the comments I received said that I kept giving bad examples for conditions I disliked from previous workplaces, instead of positive elements I would have liked to see. Another commentator told me in private, that he felt that the "End of IT Slavery" and other essays of mine reflected the fact that I had a "primadonna attitude" instead of a more positive "team-player" attitude.

I originally wrote "The End of Info-Tech Slavery" about a year ago, shortly after I was fired from a job I liked and for which I worked about three months. Some people who commented on the article found it of good value. However many people who commented on it have voiced some criticism.

The Elements of a Perfect Workplace

Hire the Best Developers "Joel on Software" and others have written about the importance of having very good developers. See for example his "Guerilla Guide to Interviewing". Bad programmers will create code that's buggy, insecure, hard-to-maintain, etc. The so-called "Medium-level techs" will probably not, but will be heavily under-productive in comparison to star programmers. (And according to Brooks' Law, you can't effectively replace one good programmer with many worse ones.) As I noted there are many aspects that qualify someone as a good programmer. However, it does not change the fact that hiring a large number of mediocre programmers will never be as effective as hiring one or two good or very good programmers.

Openness One of the most important trends in the software world recently was towards "openness": open-source, open-content, open-specifications, etc. Most good programmers you can find will find the open source (also known as "Free Software") movement very appealing, and share some of its ideals. I don't propose you should make your software open-source, although, of course, this is often a good business model. However, there are other aspects of openness that you should follow if you want to attract and keep good programmers. First of all, don't over protect your code. Make it open-source if possible, give your contractors and consultants (including outsource ones) access to it, and allow your programmers to show parts of it to their online friends to get some advice. You should make as much of it as possible public, under open source licences to allow it to be used more often, increase its quality, and grow a culture around it. From my experience, working on "shrinkwrap" software that is used by end-users in the wild, and open-source software in particular, is the best way to increase the quality of the software as it requires the most discipline to work on and support. Openness does not end at that. Another important aspect is to allow your programmers to tell their friends and family about what they do. Some defence-related companies seem to think keeping everything confidential is a good idea, but that will cause your employees to feel unnecessarily trapped and unable to get help. So if you want to attract the best programmers, make sure they can tell other people of what they do, and what problems they are facing. (I'm not advocating complete transparency, if it's not appropriate, but rather not being overly secretive. ) Finally, you should avoid vendor lock-in: use standard or documented protocols and specifications, take Joel Spolsky's advice of letting your users go back, and make sure your users have control of their data and can access it, back it up and access it. A good example for this is the photo-sharing site Flickr, which has published full APIs for its service, and even allowed these APIs to be used by competing site.

Great Working Conditions You should make sure your employees have great working conditions. Kitchen There should be a kitchen with a lot of food, hot and cold beverages, etc. Comfortable Offices I don't necessarily agree that your workers should have spacious offices with doors that close, but they should still be comfortable enough. At one of my workplace, I constantly had to move to let other people out of their seats, and this was unbearable. So don't do that. In one job that I fondly remember, every employee had their own spacious cube, with a desk to put a computer and a place to put a few chairs. This was much more like it. This cannot stressed enough. As Joel Spolsky notes (based on Steve McConnell) in item No. 9 of the Joel Test, you need to "use the best tools that money can buy". If you buy old, broken and/or barely functioning hardware, you'll spend a lot of time debugging the problems there, which will waste a lot of precious time. And you may lose a lot of reputation and customers due to down-time. Relying on reliable, high-end hardware is a much better idea. I've been to two workplaces that gave me an old computer with a 40 GB hard-disk. It wasn't enough at all. At one place, we've reached the limit of this hard-disk due to several large source code checkouts, and as a result needed a bigger hard-disk. And the only hard-disks the lab had were 80 GB ones, which were bought because they were the cheapest (per-disk, not per-capacity). Please, buy large enough hard-disks. At the same workplace, I was given a computer with a read-only CD-ROM drive. It was not even a DVD reader. I brought a DVD of audio files from home, and could not read it. In this day and age, read/write DVD drives are the standard, and are ultra-cheap. Sometimes you'll need several computers, or a decent virtual machine emulator, to run alternative operating systems on the same machine. Make sure your workers have a high-quality screen. They need to look at it most of the day, and they want it to look nice. A decent 19" LCD screen nowadays is very cheap nowadays and well worth the added productivity. You also need a state-of-the-art version control system , of which there are currently several high-quality open-source alternatives. Some very costly version control systems have a bad reputation for being extreme troublemakers, while the modern open-source alternatives "just work". If there's a good commercial software that your employees like to use and can recommend, don't hesitate to buy it. You'll also find O'Reilly Safari Licences to be a good idea so your employees can easily look up and read information in many books online. Sane Working Hours Give your employees sane working hours - 40 hours work-weeks or less. While sometimes asking them to stay late to finish a deadline is acceptable, the so-called "crunch mode" is under-effective and a recipe for disaster. Location, Location, Location Find a good place which is close enough for most people to get to. Make sure your programmers can commute to you easily. Even pay for taxi-cabs out of your own expense, or ask other employees to give them a ride, if there isn't good public transportation. The money you spend on the cabs is very small compared to the one you would lose by lost productivity, and by frustrations of travelling. A Lot of Paid Vacation Give your workers a lot of paid vacation. Humans are not machines - they need rest and relaxation. The 14 annual vacation days mandated by the Israeli government are a joke. You should give them much more than that. Joel Spolsky's Fog Creek software gives 6 weeks of paid vacation, which is much more reasonable. Avoid Over-Strict Firewalls Some organisations put their intranets below firewalls that block access to almost all services. It is not uncommon to see only the HTTP and HTTPS ports open for free access. However, there are many other Internet services that star programmers need in order to be productive. Among them are: Internet Relay Chat and other forms of Instant Messaging. This allows star programmers to discuss problems and share solutions interactively with their peers, or just to take a break from work and chat. SSH - Secure Shell - allows access to remote computers over the network. BitTorrent - allows downloading some content that is otherwise not available on the Web. And naturally, malware can easily propagate and survive using HTTP and HTTPS alone, and there are ways that clueful workers can overcome such restrictions. At one of my workplaces, I was able to chat on the IRC, connect using IM, ssh to everywhere I wanted, etc. without any restriction. It was a liberating feeling and I felt at home there. At a more recent one, I needed to connect to a remote host, and invoke port forwarding in order to talk on the IRC which was annoying and error prone. So make sure your firewall is not over-zealous and does not prevent legitimate uses. About the Salary Competitive Salary? Yes, it's important, but not absolutely everything. Great programmers won't work for you for free, but they'll find many other conditions much more tempting than an over-blown salary. See what Eric Raymond wrote about it in "Homesteading the Noosphere", quoting many studies: Psychologist Theresa Amabile of Brandeis University, cautiously summarizing the results of a 1984 study of motivation and reward, observed ``It may be that commissioned work will, in general, be less creative than work that is done out of pure interest.''. Amabile goes on to observe that ``The more complex the activity, the more it's hurt by extrinsic reward.'' Interestingly, the studies suggest that flat salaries don't demotivate, but piecework rates and bonuses do. Thus, it may be economically smart to give performance bonuses to people who flip burgers or dug ditches, but it's probably smarter to decouple salary from performance in a programming shop and let people choose their own projects (both trends that the open-source world takes to their logical conclusions). Indeed, these results suggest that the only time it is a good idea to reward performance in programming is when the programmer is so motivated that he or she would have worked without the reward! Conditions: Conclusion One final note: you might thing to yourself: "how can I afford all that?". Well, the answer is that the cost of all these advantages is very small in comparison to your general operation. And they will pay themselves much more as time goes by in the happiness, productivity and loyalty of your workers. The last thing you want is to lose a competent developer. And all these things will better make sure that he or she will stay with you.

Pair Programming When doing Pair programming, there are two programmers sitting next to a single computer screen and keyboard, with one of them actually writing the code, and the other one observing and helping. At first glance, it seems like it's a waste of resources: won't they be under-productive? The answer is a "no". First of all, pair programming increases run-time code review, as the "passive" programmer observes what the active programmer writes, gives him advice and answers his question. Code-review is always a good thing. Secondly, pair programming causes both programmers to have more discipline, and they are less likely to procrastinate as the active programmer will bore the watching one. Pair programming is also more fun, because people feel more comfortable working in pairs than alone. Finally, pair programming is more productive, because it was shown that it yields more output than two individual programmers. I had had a very good experience working in pairs back when I was an undergraduate student at the Technion and can highly recommend it.

Give Your Employees the Freedom to Do What They Want If your employee is responsible, he'll care about his job to be productive, even if you don't watch him. If he isn't, then no amount of watching will make him responsible. You shouldn't constantly monitor your employees. Instead, give them time to clear their mind and do non-coding-related activities such as: Play computer games. Browse the web. Watch videos or listen to netcasts. Read articles or books. Work on open-source software or their own personal projects. Chat with their co-workers or online peers. Take walks in the neighbourhood, do sports, go to clubs and other activities. These tasks and others don't interfere with the work much, and actually contribute to productivity. And along with pair programming, you can be more certain your programmers will work. Don't judge your employees by how they spend their time at work - instead judge them by the overall progress they do in the long run. Moreover, some tasks that your employees do at their free time, may eventually bring your company publicity and esteem. Part of the reason Joel Spolsky's "Fog Creek Software" company is so well-known is because of the Joel on Software blog, which is one of the most-read weblogs about software management. This in turn resulted in a lot of publicity to the Fog Creek products. If your employees are productive, you should not really be concerned what they are doing on their work time. Google allows its employees work on non-work-related-tasks 20% of the time (while Google still owns the intellectual rights to their creations). I would go a step further by saying you simply should allow your employees to do as much non-work-related leisure as they feel they need to on their working hours. Tell them you expect long-term results, not 100% productivity-of-time.

Phrase Your Job Ads in a Unique and Smart Way "3 Years Experience in Perl - Must", "20 Years Experience in PHP - Advantage", "Team Player", "Independent Thinker". Boring. Your job ad need to stand out. Take this job ad that was posted to the Israeli Ruby mailing list for an excellent example: We are looking for a developer who: Want a full time, salaried position.

Want to work in a fun, young workplace.

Want to work in an environment that allows them to use (just about) whatever tools they wish to get the job done.

Knows and love Ruby.

Ideally have experience with PHP and Python.

Want to work on large scale Rails/Merb projects that have nothing to do with "the Social Web".

Want to drown a puppy every time they hear phrases like "the Social Web". See? I also want to write sites that are not necessarily "Social Web", and I also got tired of the "Social Web" and its association with Ruby and other similar technologies. So this ad has caught my attention. As Joel on Software notes about experience, the reason companies want people with a lot of experience in a certain niche, is because they tend to overcome problems they encounter more easily and so can help themselves and their co-workers with their problem more easily. However, as long as you have someone with enough experience, then bright people without a lot of experience can still prove to be useful and very productive. So don't demand too much from them. As of 2008, there aren't enough clueful developers in Israel for all the workplaces (and I think that's also the case in most other places), and you can't afford to be too picky. Another tip I can offer to look for employees is to use specialised job boards like the the Joel on Software job-board, and jobs.perl.org, the DailyWTF "Non-WTF" board which highly-qualified and niche people follow. Just make sure to phrase your ad in a non-boring way, as I noted earlier.

Read a Lot of Software Management Material It's impossible to put all the good advice I found regarding software management and software engineering online and offline, in one document. So I argue you as a manager or an employee to read as much different material you can find. There's a lot of good advice out there. Socrates said: "I know that I do not know.", and he was right. While it's easy to dismiss other people as "idiots" or what they say as being "stupid", one should realise that even incorrect conclusions or reasoning can bring useful insights, and give some food for thought. Sometimes, I find some useful insights in rehearsed things or short blog entries. If you're a manager or team-leader, you should make sure that you're not much more clue-less than your programmers are, but that has often been the case for me and others.

Listen to Your Developers Which brings us to this: you obviously cannot get every aspect of software management right at first. Your programmers may eventually become unhappy, and you should make sure they can tell you how they feel, and to take note of what they say. Otherwise, you're risking underproductivity or downright clinical depression.

Don't Over-Specialise Many workplaces seem to think that it is a good idea to make sure every developer is limited to a certain aspect of the development process, and will specialise exclusively in it. Taken to extreme, however, such a trend is very dangerous. Programmers need to have a solid understanding of the entire product stack in their head. Good programmers can also benefit from a change of scenery. And naturally, reviewing someone else's code, and criticising it, is also always beneficial. Therefore, you should make sure that your workers don't over-specialise. Let them dedicate some time to work on what they find interesting, and let them review and criticise other people's work. Once, before I started my undergraduate studies, I worked for a developer of a software-based modem (so-called "Winmodems"). I was impressed from the atmosphere there, and how professional and clueful the managers were. One of the things I liked about the job was that while I was initially hired as a tester, I eventually was appreciated for my eclectic knowledge of different aspects of sound, games, modems, Internet, and other fields. So, I was given more diverse things to do there, involving many aspects of our operation. You should follow suit and involve your star developers in as many aspects of your development.

Listen to Your Customers or Users Joel on Software gives a lot of good advice on having a good customer service. You should listen to what your customers (or users) say. Don't dismiss them. Don't give them annoying canned responses. Open your bug-tracker to the world as a web-service. There are many web-based, and gratis bug-trackers, such as Bugzilla, and you should use one of them for better interaction with your customers. As Joel indicates, a bug report, email, or query usually indicates a problem in the software: a bug, a missing feature, or something that's not clear enough. Such problems need to be fixed in the code. Furthermore, if one or more of your customers are requesting a feature, and it seems to be important enough, give a priority to implementing it. As a Mercury Interactive (Now part of HP) developer noted usually the features requested by the customers, are the ones that will yield the most newer customers, not-to-mention will allow keeping customers, if they are paying for upgrades or as a "software-as-a-service" model. Joel Spolsky also notes that good customer service is part of the key to a small ISV's success.

"Good Poets Borrow. Great Poets Steal." Originality and "innovation" is not as important as people think it is. It is perfectly OK to create a product in a niche which has a lot of existing competition, it's OK to build on other people's efforts, and it's OK to "borrow" or "steal" (see the quote at the top) ideas from your users, competitors and friends. You're not getting credit for originality - you're getting credit for high-quality products (software, services, support, etc. - whatever you do) and especially for revenue and profits. See "Converting Capital into Software That Works" for more information Another common fallacy is that ideas are the hardest part of the production process. However, ideas are very cheap, and creative people have far too many good ideas. It's actually harder to develop the idea into a product, to mass-produce it, and then to mass-distribute it. Edison was not the first to come up with the Electrical Lightbulb, or to develop a working prototype, but he was the one to have put up all the effort in making it so popular and prevalent. Therefore, he is rightly credited as its inventor. Similar in software, you can often see competing products displacing more established competition, or sometimes a market where there isn't a clear winner (e.g: window managers and desktop environments for Unix, Bug trackers, text editors, etc.) Even making rounder wheels is a good way to earn a living and to get respect.

Study Psychology Your co-workers are people. As such they have thoughts, feelings, emotions, and desires, which guide them and affect them. Learning how people's psychology works, and how to motivate people and help them if they are feeling de-motivated - will help an employer be more effective, and make his employees more productive. This is also the case for your customers, users, associates and friends, who you will surely have to interact with , make sure they are happy most of the time, and deal with their problems effectively. Here are a few good resources on Psychology: "Feeling Good: The New Mood Therapy" - the best book I've read about Psychology. A self-help book of Cognitive-behavioural therapy, this books explains what causes Clinical depressions, and other negative mood swings, and why people behave the way they do. It is a stark anti-thesis to Freudian psychology, which makes little sense and is completely not helpful.

"The Neo-Tech Discovery" - an off-shoot of Ayn Rand' Objectivism, Neo-Tech is the best idea-system I've encountered yet. Note that it is easy to both dismiss Neo-Tech as a stupid cult, or to hugely misunderstand it at first. So when reading Neo-Tech go over the material (preferably without skipping, but possibly while taking breaks), and then let it sink for a while. Note that as of May 2008, the old hyperlinks to the Neo-Tech site lead to redirects or PHP errors. You can still find the old pages on the web archive, and I hope they'll get fixed. In any case, it may be a good idea to order "The Neo-Tech Discovery" book. (It is not available in book stores).

"The Design of Everyday Things" - this book is a must read to everyone doing user-interface design. It explains how frustrating it is to use many everyday objects (and, by inflection, software and software devices), and how to design them right.

"Helplessness: On Depression, Development and Death" - I haven't read this book yet, but it was recommended on the "Joel on Software" book reviews, which I found to be of value. It is also written from the Cognitive-Behavioural Psychology viewpoint. Naturally, becoming a more psychologically-capable person is a process. No one is fully friendly, tactful, helpful, and considerate at all times. But one must always aspire to be more. For example, at one of the workplaces I had, whenever I told my boss that I didn't finish what he asked for, but instead found out something else of importance or made some other progress he said "So what you're saying is that you didn't achieve anything.". This is a classical case of the "All or Nothing Thinking" cognitive error, which is given in "Feeling Good" as a possible primary cause of depression. This attitude caused me to think and feel that nothing I could do, would possibly please him, and that he was demotivating on purpose. This was one of the reasons that caused me to assume a variation of a clinical depression called "Hypomania", which in turn made me under-productive.

Read Success and Failure Stories One of the many quotes featured at the signature of a friend of mine is “Learn from mistakes of others; you won't live long enough to make them all yourself”. It is important to read success and failure stories of what people did, what mistakes they performed and what are their conclusions. I believe we can learn more from the failures of ourselves and others, than we can learn from successes. That's because in a success, almost every aspect was done right, while in a failure one can look back and say where things went wrong. You can find many such stories on the Internet, and sometimes you'll hear about them in news sites, blogs, and various forums.

Avoiding "Knowledge in the Ether" One of the anti-patterns I encountered in previous workplaces and one especially is that of the "Knowledge in the Ether". Quoting from my original post: One anti-pattern I noted in a previous workplace was what I called "Knowledge in the Ether": most of the instructions for getting the application up and running, and a lot of the collective knowledge were not written down in a collective place. TDDPirate said he was familiar with it and called it the "Oral Torah" syndrome. The solution for this is simple: set up a wiki for the company, and instruct people to write a note there whenever they need to explain to someone how to do it (or give a link to a previous note), instead of guiding him how to do it. While this requires some discipline and getting used to, it can also be done after the fact. Obviously the amount of knowledge in people's head and in the Ether can never be completely eliminated. But it should be kept down to a minimum. There was also a comment that said one should write a script to do that. And it's a good idea to keep good README files, comments, etc. and to use a standard building procedure, or prepare distribution-level packages for the software. Nevertheless, a workplace should encourage its employees to note down every useful knowledge and procedure. My friend once told me that in his previous workplace they kept a knowledge-base as a group of Microsoft Word documents stored inside Visual SourceSafe. As a result, people felt it was too much bother to update and maintain them. Eventually, he set up an instance of MediaWiki there, which proved to be much more convenient, accessible and quick.