Joel Spolsky came up with a twelve-item checklist in August, 2000 that provides a rough measure of-- in his words-- "how good a software team is":
These are great lists. But Spolsky's list is 6 years old; McConnell's is almost 10 years old! Does your software project meet all these criteria?
The lists are still highly relevant and definitely worth revisiting today. But I wonder if the field of software development has advanced far enough that we can take any of the items on this list for granted. I also wonder if any new practices have emerged in the last 6 years that aren't accounted for on either list.
So here's my question to you: what core set of practices constitutes modern software development in 2006?
Ohh! I know!
XML, XML, Web Services, XML, and ahh yes... ajax.
Did I miss anything else enterprisey?
Ben Scheirman on July 24, 2006 3:19 AM"Do you have unit tests?"
Markus Freericks on July 24, 2006 3:21 AMContinuous integration is rather new but it's objective as to wether or not it's necessary. For big projects you may shoot yourself in the foot without it but for small projects it tends to be overkill.
Jeremy Brayton on July 24, 2006 3:28 AMI don't think we remove anything from the lists. Other than source-control, I have seen every rule violated at one time or another in the last 5 years.
"Do you follow agile methodologies"
suren on July 24, 2006 3:51 AMDo you have unit tests?
I agree. I am inclined to add this to the list. But I am wondering if, like Continuous Integration, this is too specific. Clearly unit testing alone isn't enough; what about other kinds of tests, such as code reviews? Why not single them out as well? McConnell's "do you have a quality assurance plan" might cover it.
Other than source-control, I have seen every rule violated at one time or another in the last 5 years.
Well, at least we got source control going for us. Although it's debatable whether Visual SourceSafe is a good or bad influence on developers.
Do you follow agile methodologies
OK, but what does "agile methodologies" *mean*? Be specific.
Jeff Atwood on July 24, 2006 4:08 AMDo you have a stakeholder/sponsor?
Scott W on July 24, 2006 4:14 AM1. Are your customer's expectations managed?
2. Do you have good people?
Did I miss anything else enterprisey?
EJB
Web 2.0
.NET
Expensive consultants, preferably supplied by IBM.
do you care about your users?
Rimantas on July 24, 2006 5:06 AMJeff:
I mean eXtreme Programing.
Suren
I'd go with the simple, direct stuff:
* do you have automated tests at both unit and project level?
* does more than one person see every line of code before it ships?
* do you review each project after it's delivered (viz, look back as well as forward).
* do you know who your users are? Do they talk to you?
* do you have a pattern implementation repository?
There's bound to be others
MoZ on July 24, 2006 5:17 AMwhat core set of practices constitutes modern software development...
Good communication skills.
I've met many developers that are good at coding and making things go, but when it comes to communicating they just fail. It doesn't matter if they're communicating with customers, other developers, or bosses...they just don't do it successfully and that puts the hard work of others, the project, and themselves in jeopardy.
I mean, e-mails, phone calls, person-to-person - they're just not people persons, which is fine and all, but to me, being a developer means communicating clearly and confidently so the person you're talking with understands everything they need to -- and so you understand everything to finish the job well.
Brian on July 24, 2006 5:41 AMDon't take "best practice" lists seriously. Come on. In modern software development, aren't we supposed to think for ourselves? Is that an idea STILL before its time?
-- James
james bach on July 24, 2006 6:13 AMaren't we supposed to think for ourselves?
How, exactly, does a list prevent us from thinking for ourselves? Isn't that what we're doing right now?
James, I think you assume that lists are used to replace critical thinking, when in reality they're used to supplement it.
Jeff Atwood on July 24, 2006 6:36 AMDo you have a way of matching what your final outcome to your original goal?
- Unit testing is one step along this path.
- Requirements tracability is another.
Different SDLCs meet this criterion in different ways but all should meet it. (Hands up whose team does NOT have a formal SDLC - defined and agreed to - whether XP, Waterfall or something in between).
Note that this is NOT just quality assurance. QA ensures that you have a good product. It does not ensure that the product does what it is supposed to.
Peter on July 24, 2006 8:40 AMFirst of all - great blog, Jeff, big props! I've never made a comment before, but I thought I'd make one now :).
I've extended Joel's list a while ago myself and it caused quite a stir after I posted it to one of the forums. Here're the additions:
- Do you write unit tests for most of the code?
- Do you use unit test coverage analyzer?
- Do you use automated code analyzers?
- Do you conduct code reviews on the regular basis?
- Do you use version control for all documentation?
- Does your development lead/architect write code?
- Do you refactor existing code?
A lot of it is arguable, most folks didn't like the two last points the most. But from my experience on the variety of projects, they all make sense.
Just thought I'd share. :)
Stas on July 24, 2006 11:33 AMMy favorite definition of a "legacy system" is "a system without automated unit tests". After spending my entire working life (nearly 25 years) in software development, and having worked for over 3 years in the IT division of a huge organization on one-million-line projects that have virtually no automated unit tests, I can confidently say with no doubts that automated unit tests are an absolute, total, unqualified, 100% must-have for the medium- to long-term viability of a large project. There are many reasons for this, but the most important one is this: I have seen many developers in this organization almost tremble in fear at the thought of having to make a change to production code, lest it result in an expensive and high-profile production outage. The lack of unit tests to catch functional regression is so fearsome that teams have written totally new systems rather than try to work with existing ones. Of course, said teams write legacy code right from the start because they *still* don't create unit tests, so their successors will throw away their code, too.
I cannot even begin to estimate the massive waste of resources, the frustration, the stress, the long hours - all totally unnecessary - as a result of not having automated, properly designed and executed unit tests. I'm not going to go into what constitutes a proper unit test - there's not enough time for that and there are plenty of resources out there.
What many people don't realize is that the mere fact of having thorough unit test coverage ensures that you have testable code. Testable code is *in general* better designed and more flexible than the alternative. It *has* to be by the very nature of testability, which requires a great degree of decoupling and reusability (namely, the code needs to be "reused" by the test cases).
In addition, unit tests help to answer many questions about what the code is supposed to do. The reality of many large IT divisions is that there is never adequate documentation, and there are literally millions of lines of code that people simply don't understand and are afraid to touch. A decent unit test suite would go very far towards compensating for the lack of other information about what all that code does.
However, from what I have seen, the likelihood that the corporate IT developer will create anything approaching good (or any!) unit tests approaches zero. Sorry to be negative, but I have just seen too much (or, perhaps I should say, too little). Quite frankly, I have come to believe in Sturgeon's Law, which I will paraphrase: 90% of software is crap, because 90% of everything is crap. Have a great day.
Well, XP and agile methodologies are good but I don't think they are still a very accepted standard of modern software development.
Being generic, I will suggest "Automated Test" instead of "Unit Tests". It covers a wider range of techniques ..
Do you record historical data of past projects for use with Software Estimation techniques?
Or in short:
Do you measure?
genghis on July 24, 2006 12:33 PMTesting.. what is testing? It sounds like a swear word.
rid00z on July 24, 2006 12:52 PMAnother problem with this is it doesn't scale up. I have mentioned this before, but even the agile zealots will admit that an agile approach just won't work for projects that are millions of lines of code.
Umm... you obviously haven't talked to many agile "zealots." Obviously there is no silver bullet, but I am a firm believer that ANY project will benefit from most of the concepts. Not every concept is appropriate for every project.
Read Kent Beck, he's pretty modest about agile in v1 of his Extreme Programming Explained, but in the 2nd edition he makes much bolder claims.
Ben Scheirman on July 25, 2006 2:30 AMI agree that unit testing is highly important. And unit tests become even more useful, if you run them automatically on a regular basis. as a result you'd want a central source repository, automatic builds, but most important:
You must keep your code working at all times.
Maybe that's an item to add to the list: "Do you have a working product from start, and keep it working at all times during the project?"
Gertus on July 25, 2006 3:39 AMovertime! do you (not) work overtime?
bahri on July 25, 2006 4:51 AMObviously there is no silver bullet, but I am a firm believer that ANY project will benefit from most of the concepts.
Which is a little tricky:
- Some of the tenets of XP are incompatible with many projects (such as on-site customers, frequent releases, minimal design, pair programming).
- Not everyone thinks the XP approach is an improvement on what was done 10 years ago.
I would replace most of these with one simple question:
* Does _anyone_ on the team fully understand the problem?
If you can't answer yes, then source control, automated tests, code reviews, etc. aren't going to help much.
And I don't believe that having a product spec is a replacement for understanding the problem. I doubt that most people can really build a working solution based solely on a product spec (at least I've never seen one that was thorough and clear enough to do so).
David Avraamides on July 25, 2006 6:54 AMI'm still having trouble pursuading people to use Source Code Control, let alone all the other points raised.
We still have a long way to go where I'm living before those lists are considered by the mainstream as anything but 'fussy' and 'adding to cost and development time' (oddly, the latter is the opposite of the truth, but few managers believe that).
There are a number of reasons behind this attitude, which are too long to mention here, and make it hard to do otherwise. (and another reason that I really need to write my own blog articles rather than reply to other peoples, *sigh*).
Paul Coddington on July 25, 2006 7:51 AM"Do you follow agile methodologies"
Ah, that question just translates to "is your process up-to-date with trendy buzzwords?".
Focus on what people actually do, rather than which development religion they belong to.
dave on July 25, 2006 8:01 AMDo you follow a Coding Standard?
Having and following some kind of coding standard is key. Per McConnell's Code Complete, while there are better/worse standards, generally any coding standard is better than none.
I tend to agree that:
Do you use and maintain unit tests?
is another good candidate for list. The only problem I have with this one is that unit testing is not a substitute for writing good code. Relying on unit tests to "test in" quality is a bad practice. It is clearly better than not unit testing at all, but you hope your unit tests are used for verifying you have good quality at each unit, and are not a mechanism to assist in obtaining correctness.
I am not sure the best way to capture the notion....but whether or not you are doing unit testing, if there is any part of your project code that just about anybody on the team would not be willing to sit down and examine and then make changes to it without lots of trial and error, then you are doing something wrong!
"Do you follow agile methodologies"
Another problem with this is it doesn't scale up. I have mentioned this before, but even the agile zealots will admit that an agile approach just won't work for projects that are millions of lines of code.
Craig Hoedebeck on July 25, 2006 8:24 AMHave you removed every last error message from your user interface?
Angus Glashier on July 25, 2006 9:36 AMAbout agile methodologies: there's a lot to like about them, but they are again no panacea. There are many situations where you would not dream of using them (like writing space shuttle software). Alistair Cockburn has a matrix that determines how heavyweight a process is needed, based on the team size and the size of potential loss due to system failure (e.g. loss of time, loss of money, loss of life). I propose that there is another factor that needs to be considered: volatility of interfaces.
When you are architecting a large system that presents many interfaces, especially external interfaces, you can't blithely say that if you don't need it right now, you'll put it in sometime in the future. Quite frankly, as with writing software libraries, if you don't get your interfaces right by the time you release the software, you are S.O.L. because the interfaces are now cast in concrete. Once you have a large user base out there you can't just decide to refactor and rearchitect because you didn't get it right before releasing it. You will face a revolution in your user base, unless your user base is so captive that all they can do is grumble and shake a fist at you. A case in point: Microsoft changed the Windows API many times in the early days, and it cost the world a huge amount of grief. Not that MS Agilists; far from it. At the time, they were little more than cowboy coders, but the principle holds.
I am not saying that Agile methodologies are bad - on the contrary. In many cases they are just what you need. Just use them when applicable.
One poster said that you must have detailed and well-written requirements documents. Well, I have news for you. In many of the jobs I have had, that was just not possible because (a) very, very few people can write a really good requirements document (b) the end users/stakeholders often don't know what they want up front, and they often don't even know what they know, so it takes a highly skilled analyst to get the details out of them (c) there is such a lot of pressure to get a project going that not enough time is given to do this, and (d) the information superhighways are littered with the corpses of projects that tried to use a waterfall methodology, which is what I think of when I read about having complete requirements up front.
I mean, yeah, I'd love to have great requirements docuemnted up front, but in reality? I have seldom seen it happen. If you get anything, it's a stack of documents that are so inconsistent, and missing so much necessary detail, that you wind up interviewing the users yourselves, and doing an evolutionary delivery of the system. By all means, if you have a crackerjack business analysis team that can nail 99% of the requirements, that's great. Many of the rest of us don't.
So, as people like Steve McConnell recommend, adopt the development practice that is most suitable for your particular project. If that's an Agile, low-ceremony practice, great; if it's a heavyweight, high-ceremony process, well, that's what is needed. The only general certainty I have is that of the systems I have worked on in the past 20 years, only those that were developed using a model based on iterative development and incremental integration were truly successful. Some had comprehensive upfront requirements; most didn't.
One important difference from even just 5 years ago ... (esp. for small companies)
* Does your development methodology work well with people in opposing timezones?
(Think Bangalore and San Jose -or- New York and Moscow)
A few more checks ...
- Do all locations have VoIP (Skype)?
- Does everyone use some webmeeting (VNC)?
- Does everyone use IM software that logs all chats (Trillian) ?
Do you measure compliance with regulations including:
* Retention and versioning of requirements
* Testing and test results
* Approvals
* Bugs and work requests
I'm amazed that nobody proposes the following:
"Do you usability test often?"
Usability testing is cheap if you keep it simple (and follow Steven Krug's advice). And it helps guide software development of features of uncertain metrics such as the GUI to the right track.
Spike on July 25, 2006 1:18 PMI agree to whatever mentioned in the top of this mailing list. In fact, we try to follow them as far as possible for small team.
I depend on following ...
1. Comprehensive realistic schedule
2. Weekly tracking
3. Bring up close risks as early as possible.
4. update everyone (who are party to this project) about the status.
Do you reuse components from earlier projects in order to speed up software development?
Per Henrik Lausten on July 26, 2006 11:59 AMWhere I work, the motto is:
When in doubt, rush it out.
Jeff can you take care of reorder every one input either on a reply post or a new one, I belive that doing such act could create a community, that urge such a list on each dev houses
Rani on July 30, 2006 1:10 PMI think an internal blogging system is essential. "Knowledge Capital"; I know it's a tireless term but I'm amazed at the inefficiencies of most work places due to lack of information sharing. I learn a lot from subscribing to your blog and I get the information quickly and efficiently (please, no more email lists for me). Email is such an inefficient way to share and collect information. How To's, tricks, tips, documentation, ideas, discussions, you know the drill. Everyone on a development team benefits by the collective knowledge of the group; few places leverage this well.
Alan Kleymeyer on July 31, 2006 1:38 PMI think an internal blogging system is essential. "Knowledge Capital";
Alan has hit on something important. One of the few things the last shop I worked in did well was to share information in an internal Wiki.
Source control is important. Furthermore, it is important to use it properly. I've seen more than one shop where institutional processes sabotaged the full benefit that could be obtained from using a source control system.
Creepy Cold Guy on August 15, 2007 7:49 AMTo quote my exproject manager "if you do it right the first time you don't need tests" .
brian on August 20, 2007 12:57 PM1. Is your specification stored in RDF and versioned?
2. Are your unit-tests linked directly to the specification(s) they test?
3. Is your issue database versioned along with the code?
4. Do your unit tests run live while writing your code?
5. Are user and developer commentary automatically included and versioned alongside the code and issue database?
Or
1-5: Can you look at any point in the history of the project and find the exact state of the code, documentation, tests, test results, code reviews, specification, issues and comments?
Oh wait ... that's the 2012 list ..... damn.
Michiel Trimpe on August 21, 2007 3:12 AM"Do you follow agile methodologies
OK, but what does "agile methodologies" *mean*? Be specific."
"Jeff:
I mean eXtreme Programing.
Suren"
Hmmmm, either you're joking or you missed the point.
deworde on November 20, 2007 5:52 AMDo you have: "A defined process for end-to-end software release?"
... a software release meaning any iteration of your software in some working, tested state. I propose this since 'modern software development' seems to be about process driven development; refining of, and adhering to.
John Beech on January 13, 2008 11:17 AMQuality Assurance doesn't necesarily imply testing so to that one I would add
* Do you have a plan for testing?
That ropes in unit, integration, system ... testing.
As far as the development goes a simple question is:
* Do you follow a defined process for development?
This ropes in all of the methodolgies out there as long as they are defined as a standard process for the development effort. If they are not then it is ad hoc and you really can do whatever you wish.
I think the first set can also be modified from just "spec" to "spec/requirement" and somehow is it clear. A badly written spec or requirement could have you developing something bipolar to what the customer wants. This is where the customer-developer communication would come in. If you had that, then you would know.
Also there is no one reviewing anything that anyone is doing. Potentially it is covered in a QA plan but there is no explicit peer review of the code or the documents. Sure it is implied but someone needs to be doing that otherwise you are developing in a vacuum.
Sandwich on February 11, 2008 2:31 AM#1605;#1608;#1583;#1585;#1606; #1587;#1576;#1608;#1585;#1578;
MAHROUS on April 13, 2008 8:02 AMThis website http://thebullshark.net/ has a version of Modern Software Development with a 15 point list.
Some Legend on April 16, 2009 7:12 AM* Do you test before or after delivering the solution?
For most projects we run out of time. But there are several advantages to this:
- The customer does the testing instead of us
- Management on both sides is happy because the quantifiable targets are met (delivery date + development costs - any development post-delivery becoming 'debug')
- The customer is much more inclined to sign the maintenance contract.
As for specifications, in my experience, customers usually don't know what they really want until you've done what they asked you to do.
Anon doesn't want to lose job on February 6, 2010 9:51 PMAn other great article about the problems and their solutions of software development: http://www.blog.mediaprojekte.de/webdevelopment/technical-web-20-startup-basics-and-software-quality-improvements/
Simon Brchner on February 6, 2010 9:51 PMThe comments to this entry are closed.
|
|
Traffic Stats |