Slashdot Mirror


PhD Research On Software Design Principles?

cconnell writes "I am working on a PhD in software engineering at Tufts University. My interest are the general principles of good software design, and I am looking for links/references on this topic. The question is: What design/architecture qualities are shared by all good software? Good software means lacking in bugs, maintainable, modifiable, scalable, etc... Please don't tell me 'use object oriented methods' or 'try extreme programming.' These answers are too narrow, since there is good software written in COBOL, and by 1000-person teams for DoD projects. I am looking for general design principles. If it helps, I am trying to build on the ideas in this article from some years back."

541 comments

  1. Modularity by Reverend528 · · Score: 2, Funny

    The sell any one piece knows about the other pieces, the better off the system will be.

    1. Re:Modularity by Anonymous Coward · · Score: 5, Funny

      The rom anyone posts, the srow it gets.

    2. Re:Modularity by zolf13 · · Score: 3, Interesting

      I agree. Functional decomposition helps in developement scaling, but you need a genious to design an architecture and understand what "it as a whole" should do.

    3. Re:Modularity by SatanicPuppy · · Score: 4, Insightful

      You can also end up with weird, inefficient code, because the specs are poorly written and no one is allowed to have enough oversight to realize it.

      That's more of a management problem, I suppose, but I've all too often seen "glue" methods that were expanded beyond their scope due to the fact that the designers of Method A and Method C were never allowed to meet, and the people who came up with glue Method B were forced to all sorts of unholy kludge make them work with each other.

      --
      ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
    4. Re:Modularity by Anonymous Coward · · Score: 2, Interesting

      I argee. Fucntonial decompostoin hepls in delvepoeemnt scaling, but uou need a genious to design an archiertecture and ungerstand what "it as a whole" should do.

    5. Re:Modularity by Anonymous Coward · · Score: 0

      the more anyone spots, the worse it stag.

    6. Re:Modularity by Anonymous Coward · · Score: 5, Insightful

      You're a PhD student and you don't know this?

      And you apparently don't know how to find it?

      Hint: google for "Software Engineering graduate" to find grad classes in software engineering. Read their reading list. If that's too much effort, just read Parnas and Boehm to start.

      It makes me sad that I can't get into a PhD program, with thesis topics already lined up to go, and you have apparently never taken a Software Engineering grad class.

    7. Re:Modularity by FR-lopet · · Score: 1

      Modularity and keep it simple !

      Complex problems can be generally splitted in several simpler problems, easier to solve independtly.
      Then the trick is to bind everything elegantly and ... to keep it simple as well.

      Most programs written can be summarized by: a structure/class which contains an array of struct/class which contains an array/struct ...

      Another tip: if you can enumerate, half your problems are solved.

      About bugs: every software contain bugs. Even a perfect software at a given time will become buggy in the future (2k year bug anybody ?).
      That's why softwares must be maintained. Fire & forget solutions is part of the problem ...

      --
      I love the smell of lithium in the morning
    8. Re:Modularity by drpimp · · Score: 1

      While the parent does come off as flamebait. It does make a good point. I am going into my third semester of my masters in CPSC and at least 50% of the classes so far that I have taken are centered around just what the poster is asking. So in that regard, seriously, maybe the question should have been worded slightly different. The poster probably does have a knowledge of engineering at least in its most general regards, perhaps he is just hoping that there will be some highly welcomed responses from some of the professionals / old timers here on ye old /. After all, my most self admired coding practices came from asking or watching others. Which is another good reason to fire up the SVN / CVS client and check out some good open source projects and take a look for yourself to what practices look good, and which don't.

      --
      -- Brought to you by Carl's JR
    9. Re:Modularity by Reverend528 · · Score: 1

      The rom anyone posts, the srow it gets.
      ho'D.
    10. Re:Modularity by New_Age_Reform_Act · · Score: 1

      1. You should have took easy courses in your undergrad year to boost your GPA. In my example, intro to MS office worked for me.

      2. If you are a U.S. citizen, get enough loans. If you back up your studies with loans, or able to come up with funding without using your school or your professor a penny, chances for you to get into a PhD program increases greatly even with mediocre GRE scores or suckass undergrad GPA. Once inside the program, do enough things to get notice by people so you can apply for fellowships.

      3. Of course, always apply to multiple schools. And tell them that you DO NOT WANT to be considered for financial aid, for the reason above.

      The salary for the jobs after PhD can get you enough to pay off a six-figure student loan in 5 years.

      --
      "The New Age. The New Beginning."
    11. Re:Modularity by El_Muerte_TDS · · Score: 1

      I would rather say: composability

      But the answer to "What design/architecture qualities are shared by all good software?" is actually: none.
      There is no golden solution for "everything".

    12. Re:Modularity by Metasquares · · Score: 2, Informative

      I know someone who had far worse numerical statistics than I did (as in a whole point lower GPA and around 150 points lower on the GRE) and somehow got into a better Ph. D. program (we're both going for PhDs in CS). He said that his professors told him a good deal of getting into a good Ph. D. program (perhaps this doesn't apply to just getting into one at all) was name-recognition of his recommenders, and he went to a large university with lots of recognizable faculty, while I went to a small one with only a few. Apparently, it reflects well on you if you worked with someone famous, even if all you did was sweep the floors of the lab.

      To this day, that system still sickens me, but I probably would have been spared much grief if I had known that when I applied. Perhaps it would be useful information to you. You may also want to try contacting faculty directly with your research topics and seeing if you could work with them if you get in prior to submitting your application. The faculty make up the committee that reviews your application, so having someone on it that really wants to work with you is probably a good idea.

      A Ph. D is a lot of hard work and involves a lot of nonsense, however, and you can honestly gain about the same degree of skill as an average Ph. D. program will impart with about three months of research. Consider whether you really need to subject yourself to one.

    13. Re:Modularity by andy314159pi · · Score: 1

      ho'D.
      On taews, ew lla wenk tahw uoy tneam.

      And modularity is the way to code!
    14. Re:Modularity by Javagator · · Score: 1

      Yep. The ideal software module is the cos (cosine) function. It has a well defined input, well defined output, no side effects, can be plugged into any system, is easy to re-use, and is very useful.

      By the way, are you sure that there are good COBOL programs?

    15. Re:Modularity by idiot900 · · Score: 3, Interesting

      [...]you can honestly gain about the same degree of skill as an average Ph. D. program will impart with about three months of research. Nonsense. As a PhD student myself, I believe that the PhD program in question would have to be crap and your advisor an idiot for this to be true. If this is the case for you, you are not in the right place and/or you need a new advisor.

      Consider whether you really need to subject yourself to one. But this is a good point. You should only undertake a PhD if you find it intrinsically edifying - all other reasons are secondary.
    16. Re:Modularity by julesh · · Score: 1

      ho'D.


      vaj tlhIngan Hol jatlh SoH?
    17. Re:Modularity by zhrinze · · Score: 1

      There's at least a few good COBOL programs - I wrote some and I am SERIOUSLY anal retentive where structured programming/modular design and so forth are concerned.

      My list of things essential for all programs:

      Strict adherence to structured programming: sequence, iteration, decision + modularity (what I always called the DNA of a programs).

      Planning: I always PLANNED programs completely (or when working for an analyst, refused to code anything that wasn't well planned). This meant flowcharts and desk checking.

      Like I said - anal retentive. Those programs were written 20 years ago. They've been recompiled on newer equipment for over 20 years with no modifications (planning meant knowing we would have a year 2000). That doesn't mean that they shouldn't be modified (there are better database technologies) but they do still work. It's been recompiled five times.

    18. Re:Modularity by sapphire+wyvern · · Score: 4, Funny

      Wow. This is the first time I've seen endian compatibility problems in web browsers.

    19. Re:Modularity by Count+Fenring · · Score: 1

      Is... is that Klingon?

      Experience beeJ! (Spelling may not be accurate, source is the Star Trek Interactive VCR Board Game.

    20. Re:Modularity by mabhatter654 · · Score: 2, Insightful

      I think the parent would be better contacting slashdot admins to mine the postings rather than an article thrown out there.

      He's asking the wrong question the wrong way for the level of work he should be doing. Probably because he's got "book" experience, and not 10 years of work experience. That said, you won't find many people teaching at university that would do any good answering his questions either. They may be good at their jobs, but not at multiple project managements... the ones that are really good don't teach.

      I think that shows the problems with computer degrees in general. They don't really teach long-term project management in university (it's beneath them). They want to teach you lots of great theory, but just expect you to learn how to USE it thru osmosis. Something like a PhD for software engineering really shouldn't be offered to anybody with less than 5-7 years working at programming and managing programmers.

    21. Re:Modularity by Anonymous Coward · · Score: 0

      You're a PhD student and you don't know this?

      I've been through a PhD, and his question seems quite prudent. He didn't imply he doesn't know where to start looking. He asked because he wants to hear what the people here (some of which are experienced experts on this topic) have to say.

      One thing you learn in going for a PhD is that there are always specialists who know far more than is written in the books.
    22. Re:Modularity by julesh · · Score: 1

      Roughly. I just looked up the words in a dictionary. :)

    23. Re:Modularity by dashal · · Score: 1

      w00tw0t0.net]

    24. Re:Modularity by gbjbaanb · · Score: 1

      Or he's done his bachelor's degree in Sociology and is now trying to apply it to people who do real work :-)

      If he was a really good software engineer, he'd be doing that for a salary already, not hiding in academia thinking up ideas for his research project.

      I've worked with PhD programmers in the past, its never a pretty sight. They say things like "but that's not the way that should be done", and the reply is always "welcome to the real world". Perhaps he should write a research paper on why projects end up in a non-perfect design or implementation instead, a "learn from your mistakes" paper to encourage better practises (eg formalise the Big Ball of Mud pattern)

    25. Re:Modularity by LifesABeach · · Score: 1

      All softwarz have 3 parts;
      Input,
      Process,
      Output

    26. Re:Modularity by Larry_The_Canary · · Score: 1

      It makes me sad that I can't get into a PhD program, with thesis topics already lined up to go, and you have apparently never taken a Software Engineering under-grad class. Parnas and Boehm did their most influential work in the (70's?) 80's and 90's, if you're not hearing about them until a grad program consider switching schools. On a serious note, Beautiful Code is a book I'm currently working my way through and it has proved to be an enjoyable read (for most of the chapters) as well made me re-examine some of my methods and practices. Not the most technical book out there but it's like looking over the shoulder a experienced designer at work.
    27. Re:Modularity by Hasmanean · · Score: 1

      >Apparently, it reflects well on you if you worked with someone famous, even if all you did was sweep the floors of the lab.

      A system like that is ***EVIL***.

      Or to use a technical term, that is a horrible way to architect your society. It's a formula for breeding a class of sycophants and parasites.

      In social terms, that system is as badly architected like as a piece of software...with like one module with 10,000 lines of code, 6 deep nested if statements, and some monster global data structures being passed around and modified at will.

      --
      Hasan
    28. Re:Modularity by Anonymous Coward · · Score: 0

      Avoid Ajax. Ajax means the user has to spend five minutes expanding the discussion. Then after following a link and hitting the "back" button, s/he gets to start over.

  2. Simple. by Anonymous Coward · · Score: 0, Insightful

    Download the latest OpenBSD source code and read up. It's well written, well maintained and very well documented.

  3. Code Complete by Anonymous Coward · · Score: 3, Informative

    This is an excellent place to start:

    http://www.cc2e.com/

    AC

    1. Re:Code Complete by guzzibill · · Score: 1

      Personally, I think Joel Splosky has a lot to offer on this topic. see ===> http://discuss.joelonsoftware.com/?joel

      --
      computer systems : cradle-to-grave
  4. Only Hire Women? by Shadow+Wrought · · Score: 4, Funny
    That's what Slashdot told me yesterday.

    Personally I only do extreme, object oriented programming in COBOL, so I have nothing new to offer.

    --
    If brevity is the soul of wit, then how does one explain Twitter?
    1. Re:Only Hire Women? by SirLurksAlot · · Score: 3, Informative

      I realize you're joking but.....

      http://www.wiley.com/legacy/compbooks/catalog/12974-7.htm

      Not that I recommend it unless you also enjoy root canals. (Sorry about the link, I couldn't find a better one on short notice.)

      --
      God, schmod. I want my monkey man!
    2. Re:Only Hire Women? by Tablizer · · Score: 1

      Personally I only do extreme, object oriented programming in COBOL, so I have nothing new to offer.

      I swear in the late 90's there was a company that made Active COBOL Pages, a COBOL-based web scripting language.

    3. Re:Only Hire Women? by icepick72 · · Score: 1

      You laugh but look at this: OO COBOL

    4. Re:Only Hire Women? by mooingyak · · Score: 1

      I had a "poster is a moron" moment when I read the question.

      What about programming in COBOL (or any other language) stops you from using Object Oriented Methods or Extreme Programming? Those ARE general design principles and/or approaches to programming.

      --
      William of Ockham had no beard. The most likely explanation is that it was chewed off by squirrels every morning.
    5. Re:Only Hire Women? by Shadow+Wrought · · Score: 1
      I had a "poster is a moron" moment when I read the question.

      I think its likely just a MacGuffin. He's really getting a PhD in Nerdology, but posting a obviously religious topic, like Mac versus PC, or EMACS versus vi would have been too obvious. Call him a poster troll;-)

      --
      If brevity is the soul of wit, then how does one explain Twitter?
    6. Re:Only Hire Women? by Anonymous Coward · · Score: 0

      Here's a longer notice...

  5. Simple is beautiful by GerardAtJob · · Score: 1

    Simple is beautiful :)

    --
    I can't call that English ;-)
    1. Re:Simple is beautiful by dominious · · Score: 1

      Software Engineering 205:
      The KISS approach - Keep It Simple Stupid!

  6. Know your stuff by Anonymous Coward · · Score: 0

    Make sure the programmers know the application they are writing. I have seen programmers that wrote apparently competent code but it didn't do what it was supposed to because they didn't know what they were supposed to be accomplishing with the code. If the coders can't perform the task with pencil and paper (I know, how old school) then they can't possibly do it with code. This is from an accountant that has had a "home" computer since Bill Gates did tech support.

  7. Well what is my percentage? by 140Mandak262Jamuna · · Score: 3, Insightful

    I mean what percentage of your PhD will be mine? Is it your PhD or our PhD. You want the degree, son? Earn it.

    --
    sed -e 's/Chuck Norris/Rajnikant/g' joke > fact
    1. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      Exactly my thought too.

      Perhaps the person posing the question should start here:

      http://www.library.tufts.edu/tisch/

    2. Re:Well what is my percentage? by rd1101 · · Score: 2, Insightful

      Seriously. Is this what constitutes 'research' today? Undergrads copy from Wikipedia, and graduate students ask Slashdot?

      Holy hell. Find your own damn 'links' (or Spaghedeity forbid, some other books/papers).

      In all seriousness, good luck to you though.

      PS. Get off my lawn.

    3. Re:Well what is my percentage? by Sir_Real · · Score: 3, Insightful

      What? So... you can't ask for help in getting your PhD? My my... There are QUITE a large number of doctors out there that are apparently sharing their degrees with colleagues, friends, family, and... strangers on the internet....

      I suggest you stop using the services of anyone accreditted with such a degree.

    4. Re:Well what is my percentage? by eln · · Score: 2, Insightful

      I was sort of thinking this, but I was also wondering what possible value the information he got from this site could be in what should be a well-referenced work. Writing a thesis and backing it up with quotes from random people on the Internet doesn't seem like the wisest decision.

      Perhaps he should spend his time interviewing acknowledged experts in the field or at least studying papers written by them. Hell, even interviewing students in his local CS department would be better than basing an argument on what some random Slashdot user posted.

      Mostly, though, I'm appalled at the quality of post-secondary education that this guy has supposedly received (and paid for!) if he believes Ask Slashdot is a good way to conduct academic research for a PhD thesis. If I were him, I'd ask for a refund.

    5. Re:Well what is my percentage? by hcmtnbiker · · Score: 1

      I think that you would agree that if he researches this question everyone who he pulls answers from doesn't really 'own' part of his PhD. Otherwise the only way he could 'earn' it would be to pull answers out of his ass instead of figuring out what really where the best.

      --
      If i had one dollar for every brain you dont have, i would have $1.
    6. Re:Well what is my percentage? by Opportunist · · Score: 1

      Hey, he's doing the right thing in today's economy world: Try to use every resource available to you, preferably free, crib and claim it's yours.

      I predict a long and prosperous career in today's IT economy.

      --
      We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
    7. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      I mean what percentage of your PhD will be mine? Is it your PhD or our PhD. You want the degree, son? Earn it. The original poster needs some help with what makes good Phd research, not what good software design principles are...
    8. Re:Well what is my percentage? by fgaliegue · · Score: 1

      Well, just think of it this way: the author is looking for advice. Maybe you think you're the Man Of The Day(tm) when it comes to software design, but then maybe you're talking absolute rubbish.

      Such a thread is interesting to the author just as a melting pot of ideas from which he can pick... Well... Whatever he thinks fits his theory.

      See, you may well output a thousand line summary of what you think is great, he will only, maybe, pick some tens of it. But:

      * the synthesis of it won't be yours, it will be his;
      * be sure that any valuable contributions _will_ be credited to the original author (who knows, this may be you).

      I don't quite understand the "insightful" moderation, honestly.

    9. Re:Well what is my percentage? by RatCommander · · Score: 5, Insightful

      How is polling the opinions of a diverse group of people with expertise in the field not "research"?

      Sure, if he uses your ideas you will get referenced. Reading the ideas of others is an extremely important part of what research is. Just because I used Maxwell's equations in my PhD thesis, doesn't mean that it's his work and not mine. I cited the sources, and was entirely honest about which bits were mine and which were from somebody else. Then, in a seperate section, I discussed the importance of my contributions.

      The work of others typically contributes the majority of the volume (and some of the value) of any PhD thesis or research paper.

      --
      "It is better to die for an idea that will live than to live for an idea that will die" - Steve Biko
    10. Re:Well what is my percentage? by dwibby · · Score: 1

      Since when is responding to a straw poll of a group with a high concentration of software developers worthy of a PhD? If it is, where do I sign up?

    11. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      Yes, because expressing an opinion on SlashDot is 90% of the way to earning a PhD... In articles studying human behavior, you are doing a bad job if you are not interviewing humans.

    12. Re:Well what is my percentage? by mcmonkey · · Score: 2, Funny

      I was also wondering what possible value the information he got from this site could be in what should be a well-referenced work.

      Ever see Let It Ride? This guy obviously has already a long list of development philosophies and methodologies.

      Every time an item on the list comes up in this thread, you cross it out.

      Whatever is left, there's your answer.

    13. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      He not asking you to do research. I know this is an unconventional method but what's wrong with asking a question to a possibly knowledgeable community that likes dealing with the subject matter? He is not gonna copy-paste stuff. He will have to look into each +5 moderated opinion and evaluate it himself. He is asking for pointers and some general direction people take. And he is going to refer to literature too.
      Just answer the question if you have something worthwhile to say. otherwise keep mum and keep that attitude to yourself.

    14. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      I mean what percentage of your PhD will be mine? Is it your PhD or our PhD. You want the degree, son? Earn it. When I got my PhD, I had to sit in a locked room and not talk to anyone for the whole 6 years. Especially no one who was related to my topic. These young'uns have it so easy, with their newfangled "talking" and "research".
    15. Re:Well what is my percentage? by sbeckstead · · Score: 5, Insightful

      Excuse me, how do you find links? Asking people who are most likely to know seems a perfectly natural way to do research. Get off your high horses people. He didn't ask you to spoon feed it to him, he just asked for pointers. Obviously you have nothing to offer so why did you bother to post! I've never seen so many asshats in my life complaining about how he does his research.

    16. Re:Well what is my percentage? by Anonymous Coward · · Score: 1, Insightful

      Agree with RatCommander and completely disagree with eln. Software Engineering is a different discipline from most in that anyone with access to a book store/library and time on their hands can jump in.

      Even for those who go to school, most practitioners jump straight into industry after getting their bachelor's. This means that the academic research done at most universities is at least partially disjoint from what's going on in the "real world" ("Ivory Tower syndrome", blah blah blah), and a wide assortment of "best practices" and "general patterns" don't make it into academic literature.

      If one actually stops and considers the medium that he's asking the question in, which is rife with tech enthusiasts (many of us who also happen to be software engineers), one can easily see that it is a great place to get people talking and hear a lot of different ideas and concepts about how things are.

      This is obviously not the best source for expert data, but it's a great way of brainstorming and perhaps networking with experts who can provide more concrete sources later. Anyone who can't see that should be appalled by the quality of their own education.

    17. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      Not only that, but what kind of a question is that for someone working on a PhD? You're supposed to be a guru in the field, and the first thing that popped into my head were brain-dead obvious concepts that were taught in undergrad.

      Look, if I can suggest topics for your PhD with my undergrad degree, maybe you'd best start looking for another topic. Or start thinking about some industry experience, because that will teach you everything you need to know about what works and what doesn't.

    18. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      That is exactly my point. To start working on a PhD you need to:
      1) have an idea on what to work (which you seem to have)
      2) then go find an advisor who is on the same wavelength with you and is competent in the field. He will be the one who will get you started, point to references of interest and make sure whether you are doing something meaningful. In this regard you appear to be totally clueless.
      3) Don't ask Slashdot anything.

    19. Re:Well what is my percentage? by discontinuity · · Score: 4, Insightful

      I was sort of thinking this, but I was also wondering what possible value the information he got from this site could be in what should be a well-referenced work. Writing a thesis and backing it up with quotes from random people on the Internet doesn't seem like the wisest decision.

      This isn't necessarily his/her intention. The OP could just be looking for some general ideas to get going (or to rule out bad ones before proceeding). I see this as a hypothesis-generating activity, not one in which he/she'd expect to get hypothesis-validating information.

    20. Re:Well what is my percentage? by KermodeBear · · Score: 2, Insightful

      He isn't asking that you write his paper for him. He is looking for information and hoping that a colleague will point him to something interesting. I don't see anything wrong with that. Someone here might know of some research or project that would be very helpful that the OP could use.

      Sorry to see that you're so jaded. No idea why you were modded up as 'insightful'. More like troll.

      --
      Love sees no species.
    21. Re:Well what is my percentage? by barq · · Score: 1

      Do you normally expect recompense for posting on /.? Asking people who might have an opinion/vested interest is an entirely sensible way to approach a PhD because it (should) make it more relevant. As a psychologist I get attacked for being lazy when I ask people what they think, but if don't involve them I'm an arrogant detached academic who knows nothing about the real world.

    22. Re:Well what is my percentage? by netsavior · · Score: 1

      what the hell do people expect research to be in modern times? is he going to get the latest and greatest cutting edge tested but not well-known strategies from a fsking card catalog somewhere?

      Research = asking the people who know

      It just happens that now you don't have to wait for the privelaged few to publish a book, now you can just you know... talk to a few thousand people all at once.

      honestly research luddites on SLASHDOT... What the fuck is the internet even for if it isn't for the (hopefully open) exchange of information.

    23. Re:Well what is my percentage? by roguegramma · · Score: 1

      I severly doubt that he will quote "RatCommander@slashdot" as the source for any idea.

      ObSlashdot:In Soviet Russia, the thesis you writes.

      --
      Hey don't blame me, IANAB
    24. Re:Well what is my percentage? by Rary · · Score: 1

      Writing a thesis and backing it up with quotes from random people on the Internet doesn't seem like the wisest decision.

      Maybe that's why he asked for links/references, not just random quotes.

      --

      "You cannot simultaneously prevent and prepare for war." -- Albert Einstein

    25. Re:Well what is my percentage? by apoc.famine · · Score: 1

      My bet is that he's secretly doing a Sociology or Psychology thesis, by trolling dorks on the internet. I mean, Emacs vs vi would have been to obvious, as would have been Windows vs Linux. This is just far enough under the auto-flame line, and just vague enough that it could pass as actual research.

      That, or he's invested in tinfoil, and trying to make me start a hat revolution.

      --
      Velociraptor = Distiraptor / Timeraptor
    26. Re:Well what is my percentage? by Daniel+Dvorkin · · Score: 4, Insightful

      Oh, FFS. Whenever you're doing any serious research, talking to your colleagues -- and yes, damn it, when you're doing software engineering, a lot of /.ers are your colleagues -- is how you form good ideas and organize your thoughts. This is true in any field. I've noticed that a lot of hotshot geeks like to imagine themselves as Lone Geniuses Bringing Great Ideas Into The World Through Sheer Brilliance And Force Of Will. Guess what? The LGBGIITWTSBAFOW approach works reasonably well for small software projects and one-off research papers. For anything bigger, such as a PhD thesis, it's a recipe for failure. Every computational tool you use in your daily work started through collaborative research.

      The submitter is clearly not asking anyone to write his thesis for him. He's gathering ideas, that's all. If you have something useful to contribute, speak up. The fact that you choose to snipe at him instead ("I'm appalled at the quality of post-secondary education that this guy has supposedly received") pretty clearly indicates that you have neither the experience to understand what he's doing nor the expertise to contribute to or comment on his work.

      --
      The correlation between ignorance of statistics and using "correlation is not causation" as an argument is close to 1.
    27. Re:Well what is my percentage? by camperdave · · Score: 2, Insightful

      What's wrong with getting the opinions of a group of people in the field? Last I checked, gathering opinions was research.

      --
      When our name is on the back of your car, we're behind you all the way!
    28. Re:Well what is my percentage? by williamhb · · Score: 3, Informative

      This isn't necessarily his/her intention. The OP could just be looking for some general ideas to get going (or to rule out bad ones before proceeding). I see this as a hypothesis-generating activity, not one in which he/she'd expect to get hypothesis-validating information.

      Given the researcher's CV includes teaching software engineering at Boston University for several years, and being a project lead for Lotus for many years before that, I imagine he does already have many ideas and sources already. However, I imagine Ask Slashdot could provide at least two useful things for a PhD: direct data on what the "popular view amongst the technically-minded" is about what makes software better, and a wide and easily-cast net for picking up any links or texts that are in use that he might not be aware of.

      His PhD seems to be a late-career attempt to crack the big philosophical nut, rather than an early-twentysomething scratching around for an idea. So this Ask Slashdot question seems to be an attempt to search every corner for data, however unlikely, rather than a lazy lack of effort.
    29. Re:Well what is my percentage? by discontinuity · · Score: 2, Interesting

      Given the researcher's CV includes teaching software engineering at Boston University for several years, and being a project lead for Lotus for many years before that, I imagine he does already have many ideas and sources already. However, I imagine Ask Slashdot could provide at least two useful things for a PhD: direct data on what the "popular view amongst the technically-minded" is about what makes software better, and a wide and easily-cast net for picking up any links or texts that are in use that he might not be aware of. His PhD seems to be a late-career attempt to crack the big philosophical nut, rather than an early-twentysomething scratching around for an idea. So this Ask Slashdot question seems to be an attempt to search every corner for data, however unlikely, rather than a lazy lack of effort.

      You sort-of made my point for me, yet implied I called the guy lazy. Not so.

      My use of the term "hypothesis-generating activity" is not derogatory. In fact, I think his use of Ask Slashdot, while likely to have a low SNR, is an interesting non-scientific way to gauge what other SE-types are thinking.

      As you say, he can gauge the "popular view amongst the technically minded." No one would ever cite a Slashdot discussion as scientific evidence for anything. However, he can mine the results for ideas that he can firm up into research hypotheses he can then try to validate through other means. Thus, the distinction between hypothesis-generating and hypothesis-validating activities.

      Your point about his already having a solid background in SE is well taken. In fact, his experience may be exactly why he used Ask Slashdot: he's been around enough to know he doesn't know everything.

    30. Re:Well what is my percentage? by UnixUnix · · Score: 1
      "Most Ph.D. theses contain half a good idea" [David Hilbert]

      "If I have seen further than others it is because I stood on the shoulders of giants" [Isaac Newton, paraphrased(?)]

      "It can be tough when you are standing in the footprints of dwarves" [classic of Usenet]

    31. Re:Well what is my percentage? by DrugCheese · · Score: 2, Funny

      If you're graded anything higher then +3 insightful I'll be angry

      --
      *DrugCheese rants*
    32. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      Well if the OP's question "What design/architecture qualities are shared by all good software?" is what constitutes PhD research these days then perhaps I should consider going back to school.

      All this time I thought you had to actually do research and come up with something new and not fill your thesis paper with results from a survey.

      Anyone who thinks the OP's question is a good topic for a thesis needs to examine the quality of their education.

    33. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      http://imgs.xkcd.com/comics/pointers.png

    34. Re:Well what is my percentage? by plover · · Score: 2, Insightful
      You mock it, but not only does this pass for research, but it's business advice on innovation: seek outside your boundaries for answers. Businesses frequently ask outside experts to participate in design and innovation activities, and only for a stipend. Proctor and Gamble and 3M are both renowned for this type of activity.

      It's certainly not the only strategy to create or discover new ideas, but who knows when a post by J. Random Luser might contain that cool spark that sends you down a new path of thinking?

      So if you don't want to participate, don't. If you want to lie to him and tell him something like "procedural code is on the ascendancy again", that's also funny. If you just want to post goatse links; well, this is Slashdot, and nobody's stopping you from that either. But you shouldn't necessarily discount the value of what he might be gaining from this little exercise. It could provide insight into the leading edge of future software design.

      --
      John
    35. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      RatCommander, is that you? RatLieutenant, Guy "Nibbles" Cheesnak, first RatBatallion here. We were separated when the storm drain overflowed. We've surrounded the Cheetos factory as ordered sir!

      Shall we still attack at dawn?

    36. Re:Well what is my percentage? by bikkit · · Score: 1

      Despite the obvious lack of 'well referenced' information gained from the slashdot community, anyone doing research is well advised to get an idea of scope for their line of enquiry.
      What better than to get the (sometimes) insightful ideas from a self-selecting (expert) group who can (thinly) cover the ground with ideas, examples and (lots of) criticism...?
      As to referencing slashdot, or sharing their PhD, don't be ridiculous! When did anyone honestly expect that their input to an 'ask slashdot' was going to theirs until they gave permission for another to use it...!?

      All the best - a smart move to tap into this group for some err.. broadranging input!

    37. Re:Well what is my percentage? by sydneyfong · · Score: 1

      Sure, if he uses your ideas you will get referenced Which university hands out PhDs for dissertations with slashdot comments as references? Sign me up!!
      --
      Don't quote me on this.
    38. Re:Well what is my percentage? by ggvaidya · · Score: 1

      If my dad took a photo, would that make him a "papa"-razzi? If the Pope took a photo, would that make him Papa Ratzi?

      Sorry, couldn't resist :P.
      I'll go away now.
    39. Re:Well what is my percentage? by Anonymous Coward · · Score: 0

      I wasn't implying that you said he was lazy at all (I was generally agreeing with you and backing up your post) -- but plenty of other posters on the thread were saying he was lazy, so I thought it worth making the point that he was not explicitly.

    40. Re:Well what is my percentage? by Just+Some+Guy · · Score: 1

      The OP could just be looking for some general ideas to get going (or to rule out bad ones before proceeding).

      Exactly! Which is more likely to give you new and interesting ideas: a Google search which returns the 50 most popular ideas in a field, or asking a forum of your million closest friends? Google is awesome for finding answers to well-defined questions. It kinda sucks for figuring out what questions you want to ask in the first place.

      --
      Dewey, what part of this looks like authorities should be involved?
  8. code one line by Anonymous Coward · · Score: 0

    then have a shot of whiskey

    if you still can read that line, code another one.

  9. Objectmentor by Anonymous Coward · · Score: 0

    http://objectmentor.com/resources/publishedArticles.html

    Seems to be a good starting point for Design principles.

  10. Maybe this could help by cephah · · Score: 1

    Last semester we had software architecture and design and we used Software Architecture in Practice as reference. I found it pretty good and I'm sure it'll hold lots of information relevant to PhD students, too.

  11. a few things... by sneakyimp · · Score: 4, Interesting

    Good code avoids putting variables or functions unnecessarily in the global namespace. This means that the likelihood of name collisions is less likely so your code project is more likely to play nice with other code projects.

    It's also good practice to try and make all of your code non-reentrant and threadsafe. As processors sprout an increasing number of cores, it is important to make sure your code can take advantage of the extra power.

    It's also a good idea to COMMENT your code and DOCUMENT your processes. There's nothing worse than stumbling across something you wrote 10 years ago and having no idea how it works.

    1. Re:a few things... by Anonymous Coward · · Score: 0

      Yes there is... Stumbling across something you wrote 10 years ago and finding it somehow doesn't work when you're pretty sure you left it in working condition

    2. Re:a few things... by Anonymous Coward · · Score: 1, Informative

      I think you mean make your code reentrant. Reentrant is a positive property. Non-reentrancy is a negative property.

    3. Re:a few things... by Anonymous Coward · · Score: 0

      There's nothing worse than stumbling across something you wrote 10 years ago and having no idea how it works.
      Stumbling across something your idiot ex-coworker-who-is-now-your-boss wrote 10 months ago could be worse - well, worse for the "no yelling obscenities over the cube walls" policy at least. (I hate that #@!&^% policy)
    4. Re:a few things... by InlawBiker · · Score: 1

      There's nothing worse than stumbling across something you wrote 10 minutes ago and having no idea how it works. I updated your idea to something more closely in-line with my brain.

    5. Re:a few things... by Anonymous Coward · · Score: 1, Informative

      non-reentrant functions are not threadsafe.

    6. Re:a few things... by FR-lopet · · Score: 1

      Good code avoids putting variables or functions unnecessarily in the global namespace. This means that the likelihood of name collisions is less likely so your code project is more likely to play nice with other code projects.

      To be honest, name collision is the last of your problems with global variables.
      Global variables are 'evil' because sometime in the future, you'll need several instances of what you're using as a global variable today.
      And global variables limit the reuse of the code, as it can only be instanced once in the program ...
      --
      I love the smell of lithium in the morning
    7. Re:a few things... by sneakyimp · · Score: 1

      oops...my bad. still a bit new to thread safety jargon.

    8. Re:a few things... by sneakyimp · · Score: 1

      yes you are right i think. i'm down with the concept, just not the jargon. or something.

    9. Re:a few things... by Anonymous Coward · · Score: 0

      It's also good practice to try and make all of your code non-reentrant and threadsafe. you did mean to make all of your code reentrant, yes? not that i agree with that, either.
    10. Re:a few things... by julesh · · Score: 1

      Good code avoids putting variables or functions unnecessarily in the global namespace. This means that the likelihood of name collisions is less likely so your code project is more likely to play nice with other code projects.

      Name collisions are the least of concerns of most modern software projects. Any development environment worth considering using will support an automated 'rename' refactoring that will solve such a problem in seconds.

      It's also good practice to try and make all of your code non-reentrant and threadsafe.

      Ignoring the confusion between reentrant and non-reentrant here, I'm not sure why this is even relevant. In 99% of cases, it will never even matter. Wrap your object in a lock and nobody will care. Performance is not the most important quality of software design for the vast majority of cases, and if a non-threadsafe algorithm is easier for the developer to work with it will usually be better for them to do it that way.

      It's also a good idea to COMMENT your code and DOCUMENT your processes

      Yes. But better still is to write code whose meaning is obvious without documentation.

    11. Re:a few things... by Anonymous Coward · · Score: 0

      First one has to define "good".

      Is good defined by "profitable"? This may seem a given factor but open source is sometimes a labor of love.

      Is good defined by ethical practices? You can cut all sorts of corners and be profitable right? (not mentioning any names)

      Is good defined by efficient code? Performance is great... we can set a small army of mathematicians to produce codecs 3% faster....but is it worth the cost?

      Is good defined by rich functionality? Two words... scope creep.

      The answer to the question is a mix of these things and they can't really be determined without first addressing what resources you are working with, what's your product, what's your target market, and what sort of code of conduct you have.

    12. Re:a few things... by Anonymous Coward · · Score: 0

      Finally a decent comment. I've noticed that commenters of Ask Slashdot don't ever get around to answering the question, they just complain.

      Crap... kinda like I'm doing now.

    13. Re:a few things... by Anonymous Coward · · Score: 0

      What does any of this have to do with software design? I've seen similar posts (e.g., good software design is dependent on managers who trust their engineers) that have little or nothing to do with the actual design process.

      A lot of what you are talking about is good programming practice and certainly important to software maintenance (part of the development cycle), but it has little to do with design.

      Design is the systematic planning for a piece of software that occurs before its final implementation. It involves requirements specification, determining (abstract) data types, application behavior, the relationships and responsibilities of independent modules and so on. It is where the bulk of documentation occurs for a project. It may be that there is some prototyping and iteration involved in the design process, but that code is seldom production-level or ready for release. Theoretically, it's possible to design a piece of software without ever writing a line of code. It is, however, somewhat naive to assume software design processes don't carry over into production.

      Sadly, it's been my experience that good software design and development seldom happens in practice. Most people sit down and start coding away without actually thinking about what it is they're trying to do. Could it be that most developers just aren't that familiar with the software development cycle and design methodologies?

    14. Re:a few things... by Anonymous Coward · · Score: 0

      Hey you've got some really good ideas! But I think you mean make your code reentrant, not "non-reentrant".

    15. Re:a few things... by Anonymous Coward · · Score: 0

      Have you ever suffered from name clash? Me neither. Most name problems can be solved by using identifiers longer than three characters.

    16. Re:a few things... by hauk · · Score: 1

      non-reentrant functions are not threadsafe.
      Neither are reentrant functions
  12. Wow, I applaud your laziness. by Anonymous Coward · · Score: 0

    You could always read a text book on Software Engineering.

    1. Re:Wow, I applaud your laziness. by Anonymous Coward · · Score: 1, Insightful

      You could always read a text book on Software Engineering. Let me guess-- you've probably also read a textbook on Software Engineering, and complained that the author never bothered to research the experience of people outside Acadamia, thereby limiting the book's usefulness?
    2. Re:Wow, I applaud your laziness. by Intron · · Score: 1

      Or, you know, consult experts on formal software development practices rather than random slashdot readers.

      --
      Intron: the portion of DNA which expresses nothing useful.
    3. Re:Wow, I applaud your laziness. by sbeckstead · · Score: 0

      Actually he is consulting experts on formal software development, he just didn't mean to include YOU! Your sig is completely incorrect and closely resembles your idea of an intron!

    4. Re:Wow, I applaud your laziness. by Anonymous Coward · · Score: 0

      Yeah, anyone who thinks we have something useful to offer the world is D-U-M dum.

      Man, I hate people who want to hear what I have to say. Why do they keep wasting my bandwith?

  13. Process, Process, Process by CastrTroy · · Score: 5, Insightful

    From what I can see, the real answer, process. Having a documented process that you follow to ensure that code is free of bugs, and that code is readable. How you accomplish those things isn't exactly important. For making sure code is readable and maintainable, you can have formalized code walkthroughs, or you could just have another coder read it over before it is accepted into the project. Ensuring that the software doesn't have any bugs is another issue. You should have a repeatable test environment, whether it be unit tests, or even just a list of actions peformed by an actual person, in order to check that everything is working correctly. Some approaches work better than others. But the real important thing in the end, is to have a defined process, and ensure that it is being followed.

    --

    Anthropic principle: We see the universe the way it is because if it were different we would not be here to see it.
    1. Re:Process, Process, Process by Anonymous Coward · · Score: 0

      "Having a documented process that you follow to ensure that code is free of bugs" ... written by someone who has never tested software.

      I would love to see your 'bug free' software.

      People and the computers made by people are flawed. It's inherent in the system.
      No amount of documentation will change that.
      Shifting deadlines may improve the quality, but even then, it will not be perfect.

      Flawless code is the pipedream of blue pill poppers.

    2. Re:Process, Process, Process by Anonymous Coward · · Score: 0

      No. Documentation will not warranty your code is bug free. Neither will warranty readability. But helps.

      You will get this with tests. Comprehensive tests.

    3. Re:Process, Process, Process by FR-lopet · · Score: 3, Interesting

      Process are nice and needed ...
      But smart people are nicer IMO.

      A process need to evolve and when you spend more time on defining the process than solving the problem, you're in trouble.
      I read somewhere, that a project is defined by a work on a problem which has not been solved previously.

      --
      I love the smell of lithium in the morning
    4. Re:Process, Process, Process by MtHuurne · · Score: 3, Interesting

      Process is important, but there are some common mistakes that can happen in organizations focused on process.

      One mistake is thinking that a heavy process is a better process. For the 1000-person team working on a DoD project, a heavy process is necessary, but a 4-person team building a system that is not mission critical will just be slowed down and demotivated by a heavy process. Much of the ideas of agile development are about replacing heavy process elements with lighter ones (not throwing process out of the window, as some people seem to think).

      Another common mistake is thinking that the details don't matter. For example, a code review can be very useful, if used in the right way. To get useful comments, you need reviewers who have experience with the language, the problem domain, the application etc. The coder must be willing and have time allocated to make changes based on the review comments. Preferably, before the code review, the code has already been run through a static analysis tool and the violations have been fixed, so the human reviewers can focus on the nontrivial problems in the code. To summarize, just having "code review" as part of your process manual does very little to improve the quality of the code, but a well executed code review is very useful.

      Another easy trap is to have a detailed process manual, which describes a process different from the one actually used. To avoid this, you have to ensure that the developers are familiar with the written process, but you also have to change the written process when it turns out it is suboptimal in practice.

      Always remember that the perfect process does not exist. It all depends on the context: some processes work well for experienced programmers but not for inexperienced, some processes work well for simple code bases but not for complex, small teams vs big teams, mature vs experimental code, team in one location vs distributed development, fixed deadline vs release when it's done etc.

      Finally, know the limits of process. Even with a great process, you cannot get good code from bad programmers or get the code done before an impossibly tight deadline.

    5. Re:Process, Process, Process by Anonymous Coward · · Score: 0

      Great, thats just what we need; more process monkeys and less work

    6. Re:Process, Process, Process by sonamchauhan · · Score: 1

      A really smart person does the work, then frames an efficient process around what he did

    7. Re:Process, Process, Process by Anonymous Coward · · Score: 0

      If we're going to talk process, it's probably appropriate to consider the Capability Maturity Model Integration process improvement approach.

    8. Re:Process, Process, Process by KlaymenDK · · Score: 1

      True, that. Processes are helpful just as often as they get in the way, if you're lucky. I work in a very process-heavy company, and often it's clearly at odds with common sense, and hard to change. I'd rather have 'freedom under responsibility' (can't think of the proper English term this early), and face the occasional court martial.

    9. Re:Process, Process, Process by FR-lopet · · Score: 1

      There's a thing I dislike with process: it removes user responsability.
      Then people start to think: 'If it fails, it's because the process is wrong ... and not because of my lack of common-sense'.

      --
      I love the smell of lithium in the morning
  14. weak by Anonymous Coward · · Score: 2, Insightful

    Dear Mister PhD,
    do your own damn homework.

    Love,
    the management

    1. Re:weak by New_Age_Reform_Act · · Score: 1

      Many people don't know how to conduct research without knowing where to start. "Following the leads" is a simple ability, but "finding a starting point" is a rare, innate ability.

      --
      "The New Age. The New Beginning."
    2. Re:weak by SirLurksAlot · · Score: 1

      That's soon-to-be Dr. Mister PhD to you!

      --
      God, schmod. I want my monkey man!
    3. Re:weak by Fear+the+Clam · · Score: 1

      Many people don't know how to conduct research without knowing where to start. "Following the leads" is a simple ability, but "finding a starting point" is a rare, innate ability.

      Yeah, that would be the "original contribution to the field" part. Not everyone can handle the dissertation, there's a reason it's considered a significant achievement.

    4. Re:weak by chooks · · Score: 1

      Pleaz sends teh codez.

      --
      -- The Genesis project? What's that?
  15. Yourdon by davebarnes · · Score: 2, Informative

    Read books by Ed Yourdon written in the 1970s.

    --
    Dave Barnes 9 breweries within walking distance of my house
    1. Re:Yourdon by Anonymous Coward · · Score: 0

      and cite formal scientifric articles... the article you gave us is an informal publication with only a reference (which by the way is not really a reference) of the same author of the article !!

  16. Keep it simple ... by Anonymous Coward · · Score: 0

    Found this article

    http://www.faqs.org/docs/artu/ch01s06.html

    from this search

    http://www.google.co.uk/search?q=art+programming+simplicity+clarity&sourceid=navclient-ff&ie=UTF-8&rlz=1B3GGGL_enGB223GB224

    Have fun ...

  17. How to Design Programs by ramakant · · Score: 2, Informative

    http://www.htdp.org/

  18. Object Thinking by warrior · · Score: 1

    I'd recommend the book Object Thinking. The methods can be applied to any programming language. I'd also recommend that anyone working on the project have a strong background in computer science and experience to go with it.

    --
    Intel transfer the difficult from Hadware to software, for get more power, programmer need more technology. -- chinaitn
  19. The best answer I can provide you dear sir by Anonymous Coward · · Score: 4, Funny

    Use object oriented methods or, in the alternative, try extreme programming. Refactor whenever possible. Dissect and redistribute. Make sure the team is cohesive and factionalized. Compensate for all scalable factors on a frequent basis, using randomization approaches. Never, and this is not set in stone, allow the project to objectify to the point of opacity. This cannot be overemphasized: you can never add too much manpower to software tasks.

    1. Re:The best answer I can provide you dear sir by PhxBlue · · Score: 1

      That's all well and good, but he won't go anywhere without a synergized mission and vision!

      --
      !#@%*)anks for hanging up the phone, dear.
  20. Solve specific problems and avoid "frameworks" by blippo · · Score: 1



    Solve specific problems, and avoid generic "frameworks."

    Reduce configurability, dare to code business/core logic.

    Know your domain; If a problem seems complicated, the solution tends to be complicated.
    (And if you know nothing, all problems seems complicated.)

    Iterate. Refine.

  21. Trust by ELProphet · · Score: 2, Interesting

    The article from earlier today seems to tell you how not to do it.

    From my experience, I think the biggest thing is trust. The managers need to trust the developers to do what's right, and listen to the developers when they make suggestions on how to do it better. The developers need to trust that the managers won't get in their way, but will keep them on track and keep them insulated from distractions. Developers need to trust each other, that everyone's code works well etc, and trusts each other enough to ask for help when they need it. Once everyone trusts everyone else and can work well together, the project will be more successful.

    Little secret: this goes for any project.

    1. Re:Trust by CastrTroy · · Score: 1

      If you work with people you can trust, you will probably end up with a good project. However, that trust (or lack thereof) doesn't come from nowhere. If you have coworkers that you don't trust, then it probably has a lot to do with experiences that they have put you through, which have ended up in less than satisfactory results. Developers that turn in ugly/buggy code, managers that are constantly changing requirements, or trying to add an every increasing number of features, these are the things that can make you not trust your coworkers. I've worked with many people that I don't trust. But apart from firing them (doesn't usually work with managers), or changing jobs, there's a very limited number of things you can do about this.

      --

      Anthropic principle: We see the universe the way it is because if it were different we would not be here to see it.
  22. my 2 cents by trybywrench · · Score: 4, Insightful

    In my experience the single most important part to a software project is good requirement gathering and analysis. As for development, every program that i know uses some concept of divide and conquer. Breaking up a large problem in to a set of connected smaller problems simplifies writing good code. It's easier to write small bug-free modules then it is to write a large program all at once.

    It would be interesting to find the cutoff point where a problem should be further divided and when it is discreet enough. Also, it would be interesting to know when a developer begins to introduce bugs or less optimized code. Like after x many lines or like y many hours.

    It would be interesting to try and quantify code elegance. I forget who said it but there's a saying "code that looks good is good"

    --
    I came to the datacenter drunk with a fake ID, don't you want to be just like me?
    1. Re:my 2 cents by noidentity · · Score: 1

      It would be interesting to find the cutoff point where a problem should be further divided and when it is discreet enough.

      If it gets too discreet, it's called a bug.

    2. Re:my 2 cents by fabs64 · · Score: 1

      As for development, every program that i know uses some concept of divide and conquer. Breaking up a large problem in to a set of connected smaller problems simplifies writing good code. It's easier to write small bug-free modules then it is to write a large program all at once. This is probably the most important part of the software design process imho (requirements gathering is more important but that's not design).
      An effective way to design software so that it is broken up into distinct chunks of logic. This is the very reason why people are enamoured with object oriented design, as it does this in a reasonably formal manner.
    3. Re:my 2 cents by Anonymous Coward · · Score: 0

      A quote I keep in mind is " ... : premature optimization is the root of all evil" - Donald Knuth

    4. Re:my 2 cents by krasicki · · Score: 1
      The issue of requirements is essential.

      If a design attempts to answer the wrong question, no manifestation of that design can correct the original flaw.

      The issue of gathering requirements is complex. One must distinguish between the raw and the cooked. Is the software breaking new ground or a refactored design of an existing system?

      Care needs to be taken that legacy redesigns re-examine the premises that the original systems tried to solve.

      a.) What was the system trying to accomplish and is that relevant today?

      b.) Are the technological constraints that applied to the manifestation of the legacy system obsolete? today's solution to the original problem may require not a refactoring but a retooling as well (architectural considerations).

      The design (including requirements) is the most important artifact of all processes. The design instructs all subsequent implementations regardless of components or coding conventions du jour.

      Design also must define and inform cybernetic context. Where's the by-product fit? Where's the architectural edges? And what is it overlapping? In other words, how can a potential user or consumer make sense of the thing in plain verbal and visual language?

      The input to design is the question to answer. The output are precise algorithms a tool to accomplish the task will need to accurately conform to.

      How the design is built, imo, is out-of-scope and quite frankly an irrelevant distraction.

  23. Forget Emacs... by jesdynf · · Score: 2, Funny

    I'm happy I don't have to tell him to use "Ask Slashdot".

    --
    Yahoo! Pipes are awesome. How awesome? http://pipes.yahoo.com/jesdynf/slashdot
  24. Most universally useful by Anonymous Coward · · Score: 0

    // Comments.

    1. Re:Most universally useful by plover · · Score: 2, Funny

      Most universally useful

      // Comments.

      Least universally useful

      /. Comments.

      --
      John
  25. Good software by kevin_conaway · · Score: 4, Insightful

    Good software has:

    1. Continuous integration
    2. A large and useful suite of tests that are run during #1
    3. A paying customer who cares about the future of the software and is active in its development
    4. A manager who understands the full software development life cycle
    5. Developers who understand the business domain and problem the software is designed to solve
    1. Re:Good software by seeker_1us · · Score: 2, Interesting

      # A paying customer who cares about the future of the software and is active in its development # A manager who understands the full software development life cycle

      So you are saying that open source software that isn't written for a paying customer is not good?

      I think there's a lot of stuff on sourceforge that would contradict that.

      The manager thing, I can go with, if you broaden the definition of manager to include things like what Linus does with the Linux kernel.

    2. Re:Good software by kevin_conaway · · Score: 3, Insightful

      So you are saying that open source software that isn't written for a paying customer is not good?

      No, I'm not saying that. I should have worded that sentence as: A principal or group of principals who care about the future of the software and is active in its development

      There must be some end user or group of users who will continue to drive the needs of a given piece of software and help it evolve.

    3. Re:Good software by Sir_Real · · Score: 1

      So... What Open Source Software fits your bill?

      Seems to me "Good Software" is simply software that addresses the problem it was designed to address in as economical a way as possible.

      All these other facets are different beings entirely. Scalability? That's part of the problem domain, has nothing to do with how good your software is.... If your app only scales to one user, and you have..... one user.... You have created "Good Software." Software that other people can read is a often considered "good", but that's also outside of the scope of the problem itself, unless you make it part of the scope. Also, just because other people can read it, is not a sufficient condition for "goodness." I have grok'd some of the most disturbing creations of the minds of men while walking through layers of poorly thought out, but easily readable code.

      Test Suites themselves are... you realize... "software" so assuming those tests are "good software" then they already satisfy my only requirement (solving the problem economically).

      Paying customers have nothing to do with software quality. I'm not even sure where to begin with that.

      As for requiring a manager. That is simply laughable.

      Point 5 is really the only one that is necessary. You need developers to write the software. You need the developers to understand the problem so that they can create software that addresses it. If you have #5, why is anything else required for "Good Software"?

    4. Re:Good software by julesh · · Score: 1

      Good software has:

            1. Continuous integration
            2. A large and useful suite of tests that are run during #1
            3. A paying customer who cares about the future of the software and is active in its development
            4. A manager who understands the full software development life cycle
            5. Developers who understand the business domain and problem the software is designed to solve


      The submitter said he didn't want the answer to be "try extreme programming".

    5. Re:Good software by zenplanner · · Score: 2, Insightful

      This is a good list, and a great starting point for a PhD. thesis. It's the first really useful post I've seen in this thread. Too often we underestimate the "non-technology" factors (like supportive management, and a market for the end product) that go in to creating good software. I'd like to add one more item: Making the informed decisions about what to optimize. Every technology optimized for *something* -- execution speed, compiled/downloaded code size, source code elegance, system flexibility, portability, developer efficiency, shiny user interface goodness... the list goes on forever. I've seen too many projects created by otherwise smart developers (with supportive management) that have failed because they optimize for the wrong things -- for execution speed instead of portability, or for portability instead of developer efficiency. To cannibalize Sun Tzu: Every bit of software is meant to operate within a specific domain. If we don't understand that domain then the software has little chance of being successful. Best of luck figuring out how to MEASURE these things.

    6. Re:Good software by hAckz0r · · Score: 1

      I say mod the parent up! The "Open Source" model should be seen academically as the ultimate genetic algorithm in source code. The model is even self correcting so long as the developers are driven by the users needs, and not the smell of money filtering down the chain of command. The people that need the software to 'just work' are the very ones that are best qualified to describe the needs of the code base, and if those needs are held close at hand by the very one that is empowered to make those very changes then much more thought goes into the final solution of that particular instance of code. If that same instance of code in the evolution fo that software is deemed useful by the population at large, then the 'genetic traits' of that solution are eventually carried forward to all successive code generations, that is until a better solution comes along. Open Source is purely driven by the survival of the fittest. The best ones and zeros win the game.

    7. Re:Good software by Midnight+Warrior · · Score: 2, Interesting

      Good software design papers don't try to compare software development with civil engineering because (from reading the article):

      • The architect frequently fails to design something interesting that can actually be built, on the first draft
      • Commercial buildings are frequently reused in ways not envisioned by the original developer/builder
      • Single family dwellings frequently get the room scale off so that the house may only hold 4 people, but it has three bathrooms, making a regular cleaning nightmare
      • Apartment buildings are built cheap and with little care for inter-apartment noise separation
      • Builders make lots of mistakes and take many shortcuts because they know that by the time you look inside the wall, you'll never see that they didn't put insulation where they should have and you're stuck with a cold wall, or that a concrete storm drain was improperly substituted for currogated plastic
      • Principles for building things from wood or brick haven't really changed in a hundred years - slightly greater precision and a few new building materials don't change the fact that carpentry skills learned as a kid are very applicable today
      • Principles for steam houses, steel structures, etc. haven't changed in over 50 years
      • Single family dwellings are frequently built all alike for a few dozen or more houses, removing all real engineering from the problem

      People who do construction live in a very slow moving world.

      • I learned C++ in college before STL and try/catch blocks
      • Guys 7 years my senior never even got to learn C++ in college
      • My tools to build my software (IDEs, compilers, debuggers, optimizers, static analyzers, etc) change in dramatic ways every two to three years
      • Places my software is expected to work changes every year
      • If somebody breaks into my house, I buy an off-the-shelf countermeasure, but if someone breaks into my software I purchased, I frequently just have to wait for the developer/vendor to close it
      • Construction people don't visit my house every six months and make improvements - which is good - but I'm expected to provide profitable upgrades every 6 months or less to include new features at the least

      The list goes on, and is actually rather obvious in many cases. One thing that architects and software developers have in common though: If the customer writing the requirements is an idiot, or worse an idiot who is dead set that they know better than you, then you can rest assured you will never deliver a satisfactory product.

    8. Re:Good software by TheLink · · Score: 1

      Disclaimer: I am not a qualified Software Engineer or Civil Engineer.

      There are bigger differences between software engineering and civil engineering that most people don't get.

      When the time comes to actually build the design:

      Civil Engineering:
      Lots of workers, machines, vehicles, cranes start doing stuff.

      Software Engineering:
      Someone types "make all" and goes for coffee and posts on slashdot.

      Believe me this is a fundamental difference, this is the truth. Many people don't get it even when I tell them the truth.

      With Civil Engineering a design could cost 10 million and take 1 year, but the actual building could cost 1000 million to build and take 5 years, so the total cost is 110 million and 3 years. Thus if during the design phase the designers say we need two months and 1 million bucks extra to get things right, it is likely that management will say OK.

      With Software Engineering a design could cost 1 million and take 1 year, and the actual cost of building it could be 50 cents and take 1 hour. So the design phase takes the bulk of the cost and time. Thus if during the design phase the designers say they need extra time and 100K extra, it's likely that normal management will be very very unhappy.

      With Software Engineering the first draft blueprints and plastic/clay models compile and "kind of" run, and Management typically sells those as version 1.0 and 2.0 for the same price as the real product would be (after all it costs about the same to make a first draft as it does to make a final version, if not more).

      With Civil Engineering - good luck selling the plastic models to the customer for the same price.

      As for software design principles-

      1) Figure out what must be done, and what Marketing et all might want later on
      2) Figure out what data fields/structures are needed or DB schema is required that will be able to handle 1) and more. Software is often about processing data. If you have no proper place for the data, it makes things a lot harder (and crappier).
      3) Create good protocols that can be extended and built on.
      4) Insist on stuff being robust and secure - it's not paranoia - high chance of weird data appearing in your module's inputs.

      Once you have a huge system, trying to shove an incompatible protocol or schema onto it is not going to be easy. Look at the move of IPv4 to IPv6 - it sure isn't going at a quick pace.

      --
  26. spend some time a t a large software company by peter303 · · Score: 1

    I laugh at these eggheads who dont know real world conditions.

    1. Re:spend some time a t a large software company by no.unames.left · · Score: 1

      Why the assumption there is a natural and inherent link between 'people who do' and 'people who know'? Do 'real world conditions' provide the opportunities for reflexivity, assessment, and critical engagement with practices?

    2. Re:spend some time a t a large software company by SatanicPuppy · · Score: 1

      No, real world conditions provide the opportunity to view the raw possibilities of SNAFU at close range.

      The problem with theory is that theory is nice and clean and abstract, while practice is gritty and dirty and tangled. No theory of software design is going to account for the battle of the egos that goes on between teams who all think that other teams aren't doing half the job that they would be doing.

      Then you start moving into budget and manpower issues, and the very real issue that deals with actual varying levels of competence between your design teams. What happens when a dirty real world budgetary constraint makes it so that the project has to be completed more quickly. What can you cut out, and what can you repurpose?

      Nice jargon, by the way. If you want to make a "real world" type respect you, the first thing you need to do is throw a bunch of PhD language at him. Then you should probably point out that, even though he has 3 times your experience, you make more money.

      --
      ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
    3. Re:spend some time a t a large software company by Mongoose+Disciple · · Score: 1

      Why the assumption there is a natural and inherent link between 'people who do' and 'people who know'? Do 'real world conditions' provide the opportunities for reflexivity, assessment, and critical engagement with practices?

      There's a saying in boxing: everyone has a plan until they get hit. It's very similar to the saying that a battle plan never survives contact with the enemy.

      The best software design principles and processes can survive levels of incredible retardation and bad choices beyond your control that you probably will never experience in academia, but that you will experience in industry on a daily basis. It's only when you're dealing with something like having to perform maintenance on uncommented code that serves up web pages that someone unavailable wrote in COBOL ten years ago for some reason that you really can see the strengths or weaknesses of some possible design or process choices.

    4. Re:spend some time a t a large software company by Anonymous+Brave+Guy · · Score: 2, Insightful

      It's been my experience that big software development companies almost invariably spend so much of their time worrying about those horrible real world conditions that it rarely occurs to them that those conditions didn't just happen by coincidence and that they could take steps to avoid the problems in the first place. Smaller shops tend to be much better at this.

      Before anybody dives in and lectures me on scalability, let me say that IME the difference has a lot more to do with the kind of unprofessional, unproductive culture that can only thrive at mid-levels of large companies than anything to do with the scale of the project or the absolute size of the development team. Indeed, if you read the Bruce Webster article on a runaway project that was linked earlier today, it's pretty obvious that parts of the project code base were becoming unmanageably large because of incompetence and not because the project requirements actually necessitated that much code.

      If you want to learn real world lessons, go watch a small- to medium-sized software shop, where there isn't space for the lazy and/or dictatorial idiots to hide, preferably one where everyone is a partner or there is some sort of profit-related pay so people have an incentive to really follow practices they think are helpful. Plenty of difficulties still arise in such environments, but they are much less likely to be own goals by the development team, and the team are much more likely to have effective ways to deal with them that would be of interest to others.

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
  27. That kind of information by Anonymous Coward · · Score: 0

    could get you shot

  28. It's Easy by kmsigel · · Score: 1


    Write code that doesn't have bugs. Make sure it is as simple as possible, and no simpler.

    Seriously, isn't this kind of thinking what *you* are supposed to be doing for this thesis?

  29. There is no general design for good software by this+great+guy · · Score: 4, Insightful

    Good software is written by good people. There is no general rules you can follow to automagically make your software good.

    Sure some rules will tend to make your software a little bit better: KISS design principle, release early release often, unit tests, etc. But fundamentally it's all about people.

    Then you might ask "what makes a good developer good". Well's that's not so easy to answer.

    1. Re:There is no general design for good software by Anonymous Coward · · Score: 0

      For any project that requires more than one "genius" to complete it, the definition of a good developer very quickly becomes "a good communicator". The very worst developers are the lone wolf uber-coders that end up writing code that no one else in the team can understand or debug.

      Beyond good communicators I find that having a common development culture (infact the exact culture/methodologies makes only a minimal impact on the results) and to declare common goals early significantly improves the end results.

    2. Re:There is no general design for good software by Anonymous Coward · · Score: 0

      There is no General Rules you can follow to automagically make your software good.
      (Capitals mine) Damnit! And here I am, stuck in the Navy, where General Rules insists our software is the best!
    3. Re:There is no general design for good software by Mr.+Roadkill · · Score: 2, Informative

      Then you might ask "what makes a good developer good". Well's that's not so easy to answer.


      Indeed, that one is hard.

      An interesting starting point on that conversation might be Weinberg's classic The Psychology of Computer Programming.

      I've only read the original edition, haven't had a chance to get my hands on the 25th Anniversary revision yet (yeah, it's been out for a decade... I've had other things to do, and unfortunately buying and reading that has been down low on the list of priorities)

      Weinberg's still alive, and blogging, and apparantly writing novels these days too. He's probably a very good source for information on how our humanity can help or hinder our ability to design and write and test good software.
    4. Re:There is no general design for good software by UnixUnix · · Score: 1
      Quite right. Techniques and good advice may on occasion be misused. It takes ability to discern what is relevant and appropriate and what isn't.

      I remember a study comparing A, top programmer, and B, barely competent. In some admittedly vague metric A was "worth" 10 to 100 times as much as B.

      Which is not to say that A will always produce top-notch code. Practical realities and constraints may still give rise to mediocre code -- if the alternative is no code at all.

      One should also factor in the increasing, and sometimes imposed, reliance on ready-made libraries, platforms, frameworks... which often bring about acceptable but hardly stellar results.

      The classics, "The Mythical Man-Month", "Programming Jewels", Parnas, Dijkstra... are a good read and a start towards more current efforts. But the task of distilling a substantial part of a gifted practitioner's skill into articulable principles is no easy thing, and if it can be done it certainly deserves a Ph.D.

    5. Re:There is no general design for good software by Anonymous Coward · · Score: 0

      I agree use the KISS principal. Forget about all those stupid patterns, those are for two kinds of people:
          1. Those that can't code and need a pattern to copy
          2. Those that live in an ivory tower feeling best practice trumps solving the problem simply

      Remember, perfection is not reached when there is nothing left to add but when there is nothing left to take away.

    6. Re:There is no general design for good software by Puff_Of_Hot_Air · · Score: 1

      Farewell modding, but I had to reply to this post. From my experience, good people != good software. Good teams, with good leadership, combined with good process == good software. A champion team will always out-perform a team of champions. In my own working life, I have seen the best of the best in projects that fail horribly due to their inability to function as a team (add a little managment failure in recognising some of the issues in time). I've also seen average talent working well together and delivering quality product ahead of schedule. Now granted, one or two "guns", can make a big difference in a team; but the people with the most impact tend to be the ones that are making the squishy* work well. *squishy - All things human related, generally ignored by engineers except when cursing the failings of others.

    7. Re:There is no general design for good software by GWBasic · · Score: 1

      Good software is written by good people. There is no general rules you can follow to automagically make your software good. Sure some rules will tend to make your software a little bit better: KISS design principle, release early release often, unit tests, etc. But fundamentally it's all about people. Then you might ask "what makes a good developer good". Well's that's not so easy to answer.

      Agreed. Sometimes very smart people don't follow KISS. Often times it takes a few "average" people in a team to encourage KISS. My current project leader is a great guy to bounce ideas off of, because if they don't follow KISS, I can figure it out based on the look of his face.

      Furthermore, it's important to get a variety of backgrounds and expertise. A team full of C# experts witing C# code might bork interoperability. A team with no C# experts writing C# code might not take advantage of powerful features of the language.

      Finally, the attitude that "computers are getting faster, memory is getting cheaper, so I don't need to worry about performance," is misleading. Such a statement is true when it comes to error checking, caching, bounds enforcement, ect. It is not true when it comes to accessing data from a database or disk; because bottlenecks will always be bottlenecks.

    8. Re:There is no general design for good software by Anonymous Coward · · Score: 0

      Yes I agree. This is what I meant when I said "good people".

  30. Advice from another Computer Science Phd Student by thermian · · Score: 1

    You need three things

    1: A bottle of your favorite alcoholic beverage.
    2: Three seasons of Southpark.
    3: Make that two bottles, and some snacks
    4: An internet connection.
    5: ...

    Um, I forget where I was going with this, which pretty much sums up my first year. Ah, I have such fond memories of trying to find papers when I was starting. Now I'm writing up I can look down upon you first year phd noobs and laugh, oh yes, perhaps even 'heartily'.

    Well anyway, there's always google scholar. Worked for me, its an extremely useful tool.

    --
    A learning experience is one of those things that say, 'You know that thing you just did? Don't do that.' - D. Adams
  31. Time by locallyunscene · · Score: 1

    When you say "good design" do you consider efficiency to be a part of that? I work for one of those "1000 person teams" and what I have noticed is that processes(CMMI level 4) keep the schedule and quality on track. That's not really news since that's what a 1000 case studies have said before. However, I would not want to take all of that baggage to a 10 person team that needs to remain agile to compete in their market.

    IMO, designing with scalability in mind always helps, but I have no evidence beyond anecdotal to back this up.

    1. Re:Time by plover · · Score: 1

      IMO, designing with scalability in mind always helps, but I have no evidence beyond anecdotal to back this up.

      That's because the principles used to make a project scalable are sound design principles in general. Strong interfaces. High cohesion. Low coupling. Small modules. N-tier architecture. Model/View/Controller. Don't Repeat Yourself. All of those sorts of principles (and many more) are embraced by the most successful projects. They apply at all levels of design, from creating templates to libraries to user applications. They're so ingrained that designers generally don't talk about them, because they are so obvious.

      And they're all geared for scalability. By having a strong interface, you can move a function to a service, or replace it with a more efficient function. With high cohesion, your functions are reusable by more clients. With low coupling, your functions can be used in more environments. With an n-tier architecture, you can move layers to different hardware to solve different scalability problems (a bigger database engine is a common example.) MVC lets you split the UI from the business layer, perhaps enabling a web interface. Every principle has a reason for existing, and one of the effects of each of those reasons enables scalability.

      Wrapping those principles are some equally basic processes: Have coding standards. Use test driven development. Code reviews. Continuous integration. Iterative releasing. And the list goes on.

      Processes help assure quality at many levels, mostly by driving tests. Following coding standards help you work on the code without surprises. Test driven development leads to more cohesive code, with lower coupling (it's a bear to test a tightly coupled object.) Code reviews help you learn by having your peers test your skill, and help your peers learn about you and your code's function. Continuous integration ensures tests are frequently run. Iterative releasing ensures your users are testing your system frequently.

      And if you don't start out with that wonderful structure, you'd better learn how to refactor your code base and your project to get it there.

      --
      John
  32. Patterns, anti-patterns by Anonymous Coward · · Score: 0

    There are a number of nice books on software design patterns and anti-patterns. See http://en.wikipedia.org/wiki/Design_pattern_(computer_science)
    and etc. The pattern I love to contemplate the most is "big ball of mud" aka "spaghetti code".

  33. Documentation by morgan_greywolf · · Score: 5, Informative

    A software project is only as good its documentation. Look at successful open source projects -- many of these have excellent project documentation that tells you all about the architecture, structure, features, coding practices, standards implemented, data formats, data validation information and so forth.

    WHat kills so many projects is a lack of good documentation -- if no one can figure out how to pick up the ball and code a feature or a bugfix or whatever, then the code will wither. This applies even to closed source projects -- one of the things that screwed Vista over, for instance is that much legacy code was in need of rewrite -- except there no one new what the code did anymore.

    1. Re:Documentation by Anonymous Coward · · Score: 0

      MOD PARENT UP

      Documentation, man. Documentation.

      If your documentation isn't at least twice the volume of your actual code, you are doing something wrong (unless you are working alone).

    2. Re:Documentation by Xyrus · · Score: 1

      "WHat kills so many projects is a lack of good documentation -- if no one can figure out how to pick up the ball and code a feature or a bugfix or whatever, then the code will wither."

      You obviously don't work with scientist-programmed Fortran much.

      ~X~

      --
      ~X~
  34. always "age" your work by Anonymous Coward · · Score: 0

    When you finish something, hide it until the deadline. This is because if you ever give your boss something before the deadline, he will pull some nonsense out of his rear that he thinks he needs added to the project.

    Plus whatever your shortest turnaround time is, that is what he will expect in the future, no matter how complex the task.

    In general, try deceive and ignore your boss as much as possible.

  35. Quint-2 model for software product quality by mAx7 · · Score: 1

    The QUINT-2 model (extended from ISO 9126) is a model to discuss various aspects of software product quality, see: http://www.serc.nl/quint-book/

    Check the Quint-2 browser if you like a nice visual representation: http://complexitymap.com/quint2/

    Hope this helps. Don't hesitate if you have additional questions.

  36. Off the top of my head... by wurp · · Score: 1

    * Hide details that client code doesn't care about
    * Expose details that client code does care about
    * Consider building everything as event driven state machines
    * For distributed processes, read http://research.microsoft.com/users/lamport/pubs/time-clocks.pdf
    * WRITE TESTS FIRST
    * No, I really mean it. WRITE TESTS *BEFORE* YOU WRITE "REAL" CODE.
    * Design for the known specifications, only design to support expected spec changes if you're sure those particular spec changes will happen
    * Break down the system into units cohesive within themselves, but not cohesive with other units. (Duh)

    That's it, off the top of my head.

  37. default deny by Anonymous Coward · · Score: 0

    default deny (whitelist not blacklist)

  38. lots of GOTO statements by circletimessquare · · Score: 1

    no documentation, and variable names based on the names of the programmer's girlfriends

    --
    intellectual property law is philosophically incoherent. it is your moral duty to ignore it or sabotage it
    1. Re:lots of GOTO statements by Anonymous Coward · · Score: 0

      and variable names based on the names of the programmer's girlfriends

      So *that's* why so many variables are called leftHand and rightHand!

    2. Re:lots of GOTO statements by Opportunist · · Score: 1

      Umm... what girlfriends?

      Now, variable names based on cartoon characters, I could see that.

      --
      We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
    3. Re:lots of GOTO statements by Coz7 · · Score: 1

      no documentation, and variable names based on the names of the programmer's girlfriends Are you suggesting that the ban of named variables?
    4. Re:lots of GOTO statements by Tablizer · · Score: 1

      [variable names based on the names of the programmer's girlfriends] what girlfriends?

      In other words, nulls.

    5. Re:lots of GOTO statements by Anonymous Coward · · Score: 0

      But all my variable names would be NULL!

  39. Remind me not to go to Tufts by antifoidulus · · Score: 1

    seriously, your PhD thesis is THIS broad? And you have to go to slashdot even to get started on it? I feel bad for you....

  40. Well... by KGIII · · Score: 1

    Options should be where they belong. Configuration/installation should offer as many options as are needed and then more. (Since when is an "advanced installation" really just one or two options?) Remember that not all of us use a mouse all the time so keep keyboard navigation easily available. Read some of the UseIT articles. Keep the layout consistent throughout the application.

    There, those are some design fundamentals that I think are important. As for the code, don't be afraid to comment. Someone, like me, might come along after you and be pretty much inept without the comments so try to be clear.

    --
    "So long and thanks for all the fish."
  41. KISS by Todd+Knarr · · Score: 3, Insightful

    Most good software I've seen follows the KISS principle internally: Keep It Simple, Stupid. Pieces of it know what they're supposed to do and they do just that. They don't mix in functionality for several things. They don't have embedded knowledge of how they relate to the rest of the system. They've got clean, modular interfaces that let you test just that one part to make sure it's doing what it should and not doing what it shouldn't, without having to haul in large parts of the rest of the system. They either don't make assumptions about what the rest of the system will hand them or they've got those assumptions clearly documented in the interface and they test that their input conforms to those assumptions and produce a clear error if it doesn't. Eventually some pieces will have to embody the design and logic, understand how all the individual pieces fit together to make the system work, but that's their job: to orchestrate the work being done, not to actually do it.

    Another indicator is that good software is designed with the certainty that it will change, that it will be extended and altered over time. Good software has that assumption built in. Bad software, by comparison, is often flagged by statements like "Don't worry, we're never going to change that." or "We don't need to worry about doing that.". Software designed not to change or be extended is either bad software or rapidly becomes bad software once it hits production.

    And no, nothing particularly new there. It's been this way for about 50 years.

    1. Re:KISS by Anonymous Coward · · Score: 0

      There is also a necessary balance, as software evolves and acquires new functions, between extension and rewrite.

      Failing to rewrite occasionally guarantees that sufficient time will make a piece of software incomprehensible, and slowly increases the probability (to near certainty) that any further fix or extension introduces one or more bugs.

    2. Re:KISS by Anonymous Coward · · Score: 0


      I remember in college one of my professors had the class write a program from some very simple requirements. We all turned in our code and then he printed out about 5 of them and passed them out. We had to vote on which was the best. One had done it in about 30 lines. Another was several pages across multiple files with a ton of extra functionality. The person thought they were going above and beyond the call but in reality they looked foolish. The 30 liner was the best by far, as agreed by everyone who had to read it and trace it by hand.

      You're right as others have said, the best code is always the simplest. It's the most reliable, most maintainable and easiest to follow. Another side effect of writing simple code is that it performs better. The less instructions the processor has to perform the faster it will be - no getting around that. All around the correct answer. The rest is secondary but a good architecture is important too for extensibility and maintainability.

  42. Psychology by Tablizer · · Score: 1

    After years of debating on usenet and C2.com wiki, I've concluded that software engineering is largely a psychological process if one is looking beyond just performance issues. Due to Turing Complete principle, there are many many solutions to any given problem (same output). The solution that people prefer seems to be the one that best fits the way they think or the way they think about the domain (problem-space). The problem is that until we can dissect an entire working brain, psychology varies per person and is a "soft science".

    Those who claim they have objective evidence of the Golden Paradigm/Technique are probably full of squishy brown stuff.

  43. Umm.. by Anonymous Coward · · Score: 0

    Do your own homework.

  44. Fix on don'ts, better than dos by Anonymous Coward · · Score: 0

    Don't allow the executive accountant to tell how the software will work as you won't allow the executive accountant to tell where the ceiling in the hose will go.
    Don't allow the PHB to tell how long it'll take to develop as you won't allow the PHB to tell how long it will be to build the bridg.
    Don't allow the beancounter to decide on the developers' profiles as you won't allow the beancounters to decide that a mason can take the architect's role.

    Finally don't allow the company to decide to get in in projects where it's obvious the company lacks the maturity, the workforce and the professional profiles to take the deal as you won't allow a company to build an airport with two masons and a plimply young engineer.

    Ok, ok, let's return to real world: current software is just OK. People wanting to pay for it clearly shows it. The paper you cite obviates reality: "if a house were like too many software projects, people wouldn't dare to go into". Well, but they *do* dare to "go into" the software and pay good bucks for it, so who cares?

  45. Modularity, high boundaries, and simple interfaces by BytePusher · · Score: 1

    I've personally written one medium size project(around 100k). As the project scaled I found there were a few things that really made a difference. Modularity with high boundaries and simple interfaces between modules. What I mean by this is that as a program grows more complex if you reduce the number of dependencies maintainability increases greatly. Also, if it's possible to use the standard data types(i.e. deque instead of MyReallyCoolIntegerDeque) for communication between modules it's much easier to maintain compatibility between modules. Also, one thing I can never seem to get across to developers is to write readable code. This means naming functions according to their function and not as some cryptic acronym. It means naming variables what they are, even if their name has to be a sentence(Though, usually a simple and obvious name can be found if you think hard enough.)

  46. How about a practicum with LM Space Systems first? by Qbertino · · Score: 2, Insightful

    I strongly suggest you see if you can get a few weeks of academic internship with these people. Also know as 'Those who write the right stuff. They actually do know how to write software.

    Other places to look for: Linux Kernel team. Donald Knuths Tex/Latex.
    Or, believe it or not, Blizzard Entertainment. They actually are the only entertainment software company I know of with a proven track record of extremely high quality software compared to others in the field.

    But any core team of non-trivial low-level open source software technology will do actually. Python core team, PHP core team, your favourite Linux IO crew, Apache, OpenLaszlo, KDE, Haxe, Blender, ... whatever. And while people will start bickering that Apache or Blender code is oh so crappy in this or that area, rest asured that all projects of that kind, *incuding* the aforementioned *all* have core team members who are very well aware of the downsides of their software. And thus can help you out in your pursuit for details on professional software developement, because they also know the pitfalls.

    Bottom line: Join some tight crew of people that build stuff everybody uses or many people rely on to work. Hang with them for a month or two, then you'll have a better idea how exactly to approach your topic.

    --
    We suffer more in our imagination than in reality. - Seneca
  47. My Principles by Synchis · · Score: 2, Interesting

    I've been programming for almost 15 years and have spent alot of that time very gradually refining my own design principles. Here are my basics:

    1. Modular designs. Modular code is generally more maintainable and more scalable.
    2. Self-documenting code. If you read my code, you can understand whats going on just by the code. There are very few comments, because very few are needed.
    3. Occam's Razor: The simplest solution is often the best/most correct solution. Over-complicating things often leads to maintainability issues later on.

    I am currently working on a project that requires me to share code with several other people. None of them have needed much direction when picking up my code and re-using it because I've used sound design principles when writing it.
    There really is no single answer that handles all situations. I use some more specific principles when doing different types of projects, depending on whether I'm doing Database design, web development, stand-alone applications or complex application systems.
    System design is very subjective, every person seems to have a different way of doing things. One thing I always ask myself is this: Will I be able to work with this code 6 months from now? If the answer is no... then I have work to do to improve the design.

    --
    Thomas A. Knight
    Author of The Time Weaver
    1. Re:My Principles by Dutch+Gun · · Score: 3, Informative

      Self-documenting code. If you read my code, you can understand whats going on just by the code. There are very few comments, because very few are needed. I've heard this espoused before, but I think there are a lot of caveats. Generally speaking, my experience is that comments are needed in direct proportion to the complexity of the code. Code can't always be simplified. For example:

      a) What you're trying to do is extremely complex (i.e. physics simulation code)
      b) It needs to be highly optimized, which often comes at the expense of readability
      c) The language itself is not highly readable in the first place (assembly is inherently difficult to read, while C# reads almost like English)

      I find myself writing much more verbose comments whenever I tackle somewhat complex problems. Comments are not only useful in describing "how", they're important in describing "why". Code simply can't inform a reader why a particular algorithm was used in place of another. It can't describe various things to look out for the next person to modify the code which you yourself may have run into. And, it can't give nice high-level overviews of expected usage patterns. These are most crucial in your most complex code.

      It's absolutely impossible to avoid complexity at some level when you're trying to produce complex results. Perhaps it's the case where comments are largely unnecessary based on the language and type of code you're producing, but a lack of comments would be a real hindrance in the environment I work in.
      --
      Irony: Agile development has too much intertia to be abandoned now.
    2. Re:My Principles by Synchis · · Score: 1

      I agree. I'm in a situation where I'm using a very readable language (C#) and doing reasonably simple things. When I get into situations where complexity *is* required, there are definitely comments.

      I haven't programmed in assembly in years. :)

      --
      Thomas A. Knight
      Author of The Time Weaver
  48. Management by mollog · · Score: 2, Insightful

    The maturity of the management and its ability to insulate the coders from the noise from corporate is important to good code development.

    Having an experienced architect is vital. Enforcement of the values of the team, especially with respect to interface specifications, is important.

    --
    Best regards.
    1. Re:Management by blippo · · Score: 1

      Reducing bureaucracy is one good thing, but if you mean that the knowledge
      is to be portined out to the development team through one or two "experts",
      possibly through some "designers", You are in trouble.

      Locking down the information is a common mistake.

      ("Do not confuse the developers with the reality" seems to be some kind of a management anti-pattern.)

      Beeing a developer, your main task is to turn "noise" into coherent business rules.

      The reason is that Software is all about Design. There is no code factory.

    2. Re:Management by RingDev · · Score: 5, Insightful

      I would disagree about insulating coders from the "noise from corporate" in many situations.

      If you are doing development for a small organization say, 1-500 employees, you as a programmer, are not likely to have a whole lot of insight into the business rules of some department on the other side of the building. Playing opperator for specs having management relaying messages from the accountant isn't going to help your situation.

      IT has a great place as a strategic process improvement center for most companies. Everyone uses IT resources now. Accounting, shipping, sales, collections, lease/loan departments, etc... You, as a programmer, have a chance to see into the life of every department in your organization. You have the oppertunity to see process inefficiencies and recommend improvements. People as a whole, like the path of least resistance. If Jim in sales is used to entering his deals into the company's sales system, then Jill from Accounting prints out the sales report and types it into the accounting software, and finally Sally gets a copy of the bill and packages up the order in the ware house where she enters the information into the inventory system... All of these people will keep doing the exact same dual entry because that's the way they are used to doing it. But being in IT and getting to see these processes, you can see the obvious problems, the likelihood of error, and the wasted time.

      But you need to get out of the IT cave and get into action with the other departments.

      On the other hand, if you like coding and hate people, you can always get into a code ware house where an absurd number of programmers do naught but code off of specs with no input, no chance to design, no chance to see the larger picture...

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    3. Re:Management by try_anything · · Score: 3, Insightful

      I agree with what you're saying but would put a more pessimistic slant on it. A programmer shouldn't take a personal, face-to-face, cube-to-cube interest in what goes on in other departments hoping to make improvements on business processes. A programmer should do that because otherwise the specs will be wrong, the design will be flawed, and the tests will be lacking.

      You will be told, "There are people whose job it is to talk to all the stakeholders, understand their disparate needs, and assemble the requirements." This is correct. There are also people whose job it is to design the system, other people who are supposed to implement parts of the system, and other people who are supposed to test the system. Odds are that many of these jobs will be assigned to incompetent, clueless, and/or underworked people. Odds are that even the competent people will miss things that might cripple the design later. It improves your odds immensely if you do some reconnaissance work on your own.

      Don't duplicate the work done by others (unless you figure out that a particular person is useless.) If somebody talked to the manager in group X, then you should talk to the second in charge. If someone talked to a supervisor, talk to the grunts. Read their requirements first, then go casually chat with them as if the requirements were correct. Observe their looks of panic and horror. Then start taking notes. Requirements are often collected manager-to-manager and leave out vast swaths of essential functionality.

      After you feel good about the requirements, review the test plan. If anything is obviously missing, mention it. If anything looks suspiciously underspecified, chat innocently with the testers about it. "I bet testing internationalization is gonna be a bitch. How the hell do you even type right-to-left text in Windows, anyway?"

      This is your job as a coder -- to have the backs of the people you work with and save them from themselves. If you're lucky, someone is doing the same thing for you. The guy who wrote the test plan might look at your issue tracker to see what features you plan on implementing. Maybe you missed something. The guy who wrote the high-level specs might look over your design docs to see if you've made any obvious mistakes with respect to deployment requirements.

      A lot of people see this kind of behavior as being absolutely contrary to fundamental engineering principles. On the contrary; it is sound human engineering. It shouldn't even be a political problem. The only people who won't appreciate the feedback and correction are the ones who are consistently shown to be incompetent.

    4. Re:Management by RingDev · · Score: 2, Informative

      I would agree with you in large situations with more significant IT departments. But in the small business sector (up to 500 employees) your looking at an internal IT staff of roughly 4-12 people, likely split into Developers and Network/Support, with two or three of the positions being low/mid management (2 technical supervisors and an IT manager who reports to an exec in Accounting or some other non-CIO executive). With the split between Programmers, Network Admins, and General IT/Network Support leaning more heavily to the support side of things.

      In these kinds of situations, the person defining the requirements and communicating with all departments is likely going to be the programming side supervisor. The same person who is also likely responsible for scheduling, performance reviews, technical comment in departmental meetings, and is likely in their position as a result of being promoted from a programmer position after 5+ years. This person, while likely very skilled, is also likely the key contact for any number of legacy systems, and is probably so busy that developing a test plan is not even on their radar.

      In these small development shops, you are not likely going to be hired on as a 'coder'. You are going to be hired on as a 'developer'. You'll have high ownership of the project from start to finish, meaning you may get specs handed to you, but you will likely have direct contact with the users, and you will be responsible for architecture, design, interfaces, testing, deployment, documentation, and training.

      Once you get into a slightly larger IT department, and you have 4+ developers, you'll start to see more specialization and distinction. At 4+ underlings, the supervisor is going to be leaving their technical work behind and focusing almost explicitly on management and communication. But I have yet to see a company under 500 employees run more than 3 developers (with the exception of consultants brought in for very specific jobs). And once you get over 1000 employees, you are more likely to have a CIO to get IT a seat at the grown-up table and an independant process improvement unit that fullfills some of the problem spotting that IT would perform in smaller organizations.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    5. Re:Management by try_anything · · Score: 1
      I will take your word for it. My company is not typical. We have fewer than four hundred employees, but we have half a dozen admins and ten developers working on internal systems, plus some QA resources assigned to internal products, plus a few miscellaneous managers.

      You'd think we would be close-knit, but I am completely isolated from the other developers working on internal systems, and at various stages in the process I have received at least four different sets of requirements from people I didn't know, who had been assigned to gather requirements for the project, who had gathered requirements for a previous incarnation or failed start in the past, or who found out about the project and realized their department would be impacted. All of the requirements were gathered manager-to-manager (or rather, manager-to-self) and were supposed to be filtered through another manager (whom I impudently cut out) before I saw them. Of course, the end users were not consulted until much later in the process.

      You are absolutely right about testing, by the way. No QA resources have been assigned to my project, and as far as the QA manager is concerned, I am doing a fine job and should keep it up. Scary, ain't it?

      In these small development shops, you are not likely going to be hired on as a 'coder'. Yeah, I am officially a "Software Engineer" and have previously been a "Software Developer" and even (probably inappropriately) a "Member of Technical Staff." I like to call myself a "coder" or a "programmer" anyway, because I think the term "programming," like "writing," should encompass all the activities, high-level and low-level, social and solitary, that contribute to the finished product. If William Faulkner is known as a "writer" and not a "Senior Literary Engineer," then I would like to be known as a "programmer" ;-)
    6. Re:Management by pthomsen · · Score: 1

      I think that a certain degree of insulation from 'corporate' or 'other management' or the 'insane seesaw that is discussions with senior management about changing priorities and potential changes to already ongoing projects' is good.

      My experience, having taken over teams where there was no insulation from these (normal) vagaries of software development projects, is that once some insulation, and the resulting focus and direction was in place, productivity and job satisfaction was up by orders of magnitude.

      If individual contributors are never sure what's next, and even if the thing they are working on is the right thing, it's fair to say that you're very likely to see very low productivity.

      This obviously doesn't mean that your ideas about the 'life of every department' aren't valid, just that they need to be tempered by an appropriate level of focus, and, yes, insulation.

    7. Re:Management by cavebison · · Score: 1

      That's very true, and one of the reasons I enjoy freelancing, getting out into different companies.

      One example was a hospital here, using an old Access 97 database system (public hospital of course) to record detections of Staf, MRSA, etc. I cut their data entry time in half by simply suggesting that the people doing the detection actually enter the info into the system each time, rather than giving written notes to one person who did the entire thing for hours on end. This freed that one person to do more actual detection work and everyone was happy with the result.

      But that's only because everyone had an interest in their work. If it had been a private hospital, my suggestion would have been met with "what, do detection AND data entry? Sod that!" Culture is often a big factor in finding the right solution too.

    8. Re:Management by RingDev · · Score: 1

      Absolutely, the trick of being able to slide through all of the departments well, and know what and who to avoid is an art form. One company I worked for was extremely politicized. Employees from different departments were all but verboten from communicating with each other. Strategic use of smoke breaks (even as a non-smoker) and the lunch hour a long with training and site inspections did allow for a great deal of opportunities to speak with other employees and power users with out the politically charged mid level management getting in the way.

      There are times when more isolation is needed. For instance, if a developer is not actively working on an accounting project, and the accounting project is not of a urgent manner, there is no reason to be dragging your developers off to the accounting department. On the other hand, if your developer is knee deep in an invoicing application and struggling with complex business rules, getting them face time with the accounting department can be critical. In larger organizations, with a more structured IT department, you will likely have a project manager and IT management to help control these situations. In a smaller IT department, you'll have to find a way to balance those demands on your own.

      Obviously, as a programmer, you still need to focus on programming. But as a developer in a small IT shop, you'll be wearing a lot more hats than just that of a code monkey.

      -Rick

      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    9. Re:Management by Anonymous Coward · · Score: 0

      But you need to get out of the IT cave and get into action with the other departments.

      On the other hand, if you like coding and hate people, you can always get into a code ware house where an absurd number of programmers do naught but code off of specs with no input, no chance to design, no chance to see the larger picture...

      -Rick Rick, not everyone who codes is in IT. There are some companies that make software as their product, not as lubrication for the organization.
  49. Value of a PhD from Tufts? by microTodd · · Score: 3, Insightful

    I'm intrigued by this question, because I would assume that by the time you've reached this level (i.e. have a Master's in CS or something related) you would already have an idea as a starting point. Furthermore, I thought that the first part of any PhD-level research was an intensive Literature Review.

    So, in other words, you should search LexisNexis, EBSCO, etc., and find some journal articles that talk about this. Read some books like Gang of Four or Mythical Man Month. Lastly, do your own data gathering. Find a bunch of Post-Mortems and start to put your own patterns together.

    Oh, wait, all that would require work.

    Seriously...I teach college-level courses and have multiple graduate degrees...and I'm continuously amazed at the quality that schools put out nowadays.

    --
    "You cannot find out which view is the right one by science in the ordinary sense." - C.S. Lewis on Intelligent Design
    1. Re:Value of a PhD from Tufts? by going_the_2Rpi_way · · Score: 1

      Agreed. Get thee to a library my friend. If you can't cite the 10 most important and 10 most recent journal articles on the question, what the hell are you doing asking for help on Slashdot? Who's your supervisor?

    2. Re:Value of a PhD from Tufts? by cconnell · · Score: 4, Informative

      1) I do have a starting point. See the article I linked to in my OP.

      2) I am doing separate literature searches, in various ways. I also wanted to get input from practitioners in the field, since much good work in software engineering does not come from the academic community.

      Chuck Connell

    3. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      Look at the guy's site: CHC-3 Consulting. He's not some wet-behind-the-ears n00b.

    4. Re:Value of a PhD from Tufts? by going_the_2Rpi_way · · Score: 2, Interesting

      That is not a peer-reviewed article is it?

      Get some good journal papers and go from there. Please, please take 'articles' with a grain of salt, no matter where they come from, but particularly online articles and to a lesser extent 'proceedings' (I note Stafford lists her journal papers with her conference ones, and this can be problematic)

      Just my 2cents.

    5. Re:Value of a PhD from Tufts? by cwingrav · · Score: 1

      I think the input from the masses on this is quite an interesting approach. Heck, it could be a whole line of research. Keep in mind, not all these comments are good comments. Some are good. Some are bad. Some are so bad they are good (remember negative examples are useful). Some are good but highly related to the context that the forum poster is coming from.

      As an academic myself, these comments are TRULY interesting!

      Relax on the harshness, especially when you do not know the entire story behind the post.

    6. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      All I see is a glorifed Notes admin. ...Which explains a lot.

    7. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 1, Insightful

      You assume a lot of things, "Professor". I just started my first year of a PhD in CS last year, and it turns out that taking Senior level classes in Electrical Networks, Operating Systems, Databases/what have you *doesn't* actually prepare you for the task of writing research papers or performing literature reviews.

      Many departments are now offering direct-to-PhD programs from Bachelor's degrees, without having any required courses in Research Methods or anything close to what graduate academic life is actually like, and for some there's a major adjustment period involved.

      If you don't have an advisor or someone familiar with the process helping you (and most departments don't exactly facilitate that process either), it can be quite a daunting task.

      Say what you will about self-direction and "figure stuff out on your own" /what have you, but at least he's showing the proper attributes that any truly educated person needs to have: the fundamental thirst for knowledge to ask questions and the desire to elicit feedback from various sources...

      Say what you will about the "quality that schools put out these days", but it looks like academic arrogance is something that has stuck around since your day as well.

    8. Re:Value of a PhD from Tufts? by mds820 · · Score: 1

      Seriously... I am entering my senior year of undergraduate studies in CS at mediocre at best institution (no where near as well-known and of the quality as Tufts)... and seeing as how I intend on graduate school after I graduate and have experience in undergraduate research, I'm shocked at even the idea of asking Slashdot specifically for LINKS. You stole the keystrokes right from my fingers with your Literature Review linkage.

    9. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      Exactly! When I read the question I was intrigued. The poster shouldn't be asking to the Slashdot community such general questions on software engineering. By now, and after doing the appropriate literature review, the poster should have much better knowledge than 99% of Slashdot audience.

    10. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      If you cannot handle basic research methods like literature review etc., then you are not qualified to pursue PhD studies.

      And a PhD is always a daunting task, that's the way it's supposed to be. Real research is not like fooling around with some OSS project.

    11. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 1, Insightful

      You teach college-level courses and yet don't understand research? The so-called "academic silo" is a negative thing and that's for a reason. I personally can't imagine anything useful coming from Slashdot, but I'm in a PhD program and the most useful lesson I've learned is that people are the primary resource.

      Sure, you cite the papers and the literature, but you talk to people to find out what papers and literature you should be looking at.

      Again, Slashdot is probably all but useless - people are not. When I'm starting a new research problem, I ask myself - who would know about this. Then I go talk to that person. Saves a TON of trouble.

    12. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      I'm intrigued by this question, because I would assume that by the time you've reached this level (i.e. have a Master's in CS or something related) you would already have an idea as a starting point. Furthermore, I thought that the first part of any PhD-level research was an intensive Literature Review.

      So, in other words, you should search LexisNexis, EBSCO, etc., and find some journal articles that talk about this. Read some books like Gang of Four or Mythical Man Month. Lastly, do your own data gathering. Find a bunch of Post-Mortems and start to put your own patterns together.

      Oh, wait, all that would require work.

      Seriously...I teach college-level courses and have multiple graduate degrees...and I'm continuously amazed at the quality that schools put out nowadays. How do you know the original poster isn't already searching LexisNexis, etc?

      Getting leads from professionals who perform this work day in and day out is a completely valid form of data gathering.

      I really would question the quality of the school(s) YOU went to. Why make conclusions about the quality of the poster's degree based on one post.

      Sounds like you aren't able to exert enough authority in your day job because you really sound like a jerk.
    13. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      A little harsh don't you think? Oh yeah, you have multiple graduate degrees. I guess one in civility is not one of them. . .

    14. Re:Value of a PhD from Tufts? by thelandp · · Score: 1
      So asking practitioners that work in the industry itself is somehow wrong? Heaven forbid it might turn up something contradicting academia, which is of course the only valid source of knowledge (/sarcasm) Also, you've jumped to the false conclusion that asking slashdot is all he is doing.

      I teach college-level courses and have multiple graduate degrees...and I'm continuously amazed at the quality that schools put out nowadays. Me too. I'm amazed at the lack of respect that academics seem to have for the knowledge of people working in the field.
      --

      -- the only thing we have to fear is really scary things
    15. Re:Value of a PhD from Tufts? by smallshot · · Score: 1

      And I'm still amazed at the lack of respect and insight college professors (no offense to you, as I don't know you, but ALL of my college professors) have on the real world. I have great respect for academics as well as their research and reading materials, but seriously... All of my professors thought they knew everything about programming and good design in the real world... but each of them had little more than a few years of experience (anywhere from 0 to 10 years, usually in just one area of software development) in the real world and they were the ones writing the books and articles on software design!!!!

      I personally would very much like to see SERIOUS answers to this question because even though I am a slightly experienced programmer and software designer, I would very much like to see what the more experienced IT Professionals (who may not be writing books & articles) have to say about what works for them.

      BTW (if I may rant for a moment), each of my CS Professors told me I'd never find the job I currently have because it doesn't exist... yet here I am, for 3 years strong, straight out of college with the "impossible" job. Apparently, according to them, I am the ONLY programmer that performs the entire software design process by myself without having to physically write out every step and document every detail for my superiors... AND all from home.

    16. Re:Value of a PhD from Tufts? by Anonymous Coward · · Score: 0

      Since you're in academia, you need to be publishing in peer reviewed conferences and journals. To publish in those places, you need insight, experimentation, and results. If I was reviewing the paper you linked to, I would certainly reject it. Anecdotal stuff doesn't seem to float these days. Sure, it was great back in the 60s when Dijkstra was writing his "Hey, check this out. We actually built this!" papers. At best, the paper you linked us to could be condensed to one or two anecdotal paragraphs in the introduction section of a larger paper.

      I recommend that you canvass years and years of post-mortems on software projects, both successful and unsuccessful. Distill this information to find what you feel to be traits of a successful project.

      Then start running psychological experiments. Take one group of volunteers, and have them work in ways that you believe will be successful, and take another and force them to work in ways that are unsuccessful. Randomize the population. Follow psychological study approaches.

      And above all . . . good luck. This area has been completely tapped out of good research. There is a reason that software design sucks as much as the rest of the design world -- there is likely no magical secret to success.

    17. Re:Value of a PhD from Tufts? by bugs+longa · · Score: 1

      Sorry Chuck; you were hoping for a hint of wisdom from a presumed community of expert programmers, but all you got was the collected typings of 999,999 monkeys. The quality of the responses should tell you all you need to know about what is wrong with most software, and why work like yours is desperately needed, even though it will not be widely appreciated.

      --
      Bugs longa, ars brevis
  50. Tardy question... by glgraca · · Score: 2, Insightful

    In some countries you have to submit a project in order to enroll into a doctorate programme, in others you become part of an ongoing project and your work will be a spinoff from that. Either way, I can't see how you are already working on your PhD and still making these sorts of questions.

    1. Re:Tardy question... by pimpimpim · · Score: 1
      I can't see how you are already working on your PhD and still making these sorts of questions

      I can.

      To all the "do your own work" flamers out here: More often than not, PhD projects are based on vague ideas or old projects that were left lying around by the professor because it is too risky to put an expensive PostDoc on it. What your PhD is all about is filtering out the bad ideas from your Prof and do your best to get something consistent that you can write up in a solid thesis. Really, even if you come with your own ideas to apply for a PhD, by the time that your work as a PhD starts you will find out that instead of working on your idea, you're first supposed to end some work that has been left by the previous PhD. You get my point.

      Then, consider that any PhD subject can be approached from many different ways, and to work out a single approach will take at least a year. My PhD was on computational modeling of biomolecules, and trust me, by just reading the literature you still won't get an idea of the kind of problems an experimentalist faces. Talking to people that have been around longer is really smart, and helps not waste your time on irrelevant details.

      Besides, just imagine that the poster ends up working in your firm as a contractor, being a fresh fancy PhD from Tufts and all. Would you like someone who tries to figure out everything by his own, or asks around at the workers in the field first to see what the issues are.

      What I've noticed about being a scientist, is that in many cases the ability to ask questions is the most valuable skill you can have. If you know how to ask the correct question you are already halfway to the answer. Besides, what is a scientist that doesn't ask questions good for?

      --
      molmod.com - computing tips from a molecular modeling
    2. Re:Tardy question... by going_the_2Rpi_way · · Score: 1

      To all the "do your own work" flamers out here: More often than not, PhD projects are based on vague ideas or old projects that were left lying around by the professor because it is too risky to put an expensive PostDoc on it.

      Complete bullshit. If you're going to say that, cite a reference. I can find 5000 that say the opposite, but if pressed I'll list 10.

      That's why I have a Ph.D. and you don't even know how to abbreviate it properly.

  51. Sorry but I must rant ! by iXiXi · · Score: 1

    How can you do PhD work on software design principles if you haven't delved into all forms of programming for yourself and applied them to real world scenarios? Please don't tell me you are an academic writing some paper to then stay school-side and claim you are an expert. You should get a job, assuming you don't have one already, in the corporate jungle like the rest of us and do the research for yourself. A /. doctor, is this a first? How do you put that in your thesis and defend it? If you are an industry expert soliciting opinion only, then more power to you.

    1. Re:Sorry but I must rant ! by cerberusss · · Score: 1

      How can you do PhD work on software design principles if you haven't delved into all forms of programming for yourself and applied them to real world scenarios?
      Sure, experience would be a good thing, but I fail to see why he must apply them all to find commonalities in good software design.
      --
      8 of 13 people found this answer helpful. Did you?
  52. 2 things by Maxo-Texas · · Score: 1

    1) Affordable.

    2) Good foundation.

    ---

    1) is where most software and management people both fail.
    managers refuse inexpensive updates to keep the software robust because there is "No R.O.I." until they then buy or have written a new "wonder package" at much higher expense than the deferred maintenance.
    Meanwhile developers (and users) design systems that are nice but so expensive they really can't be done.

    2) Software, unlike buildings, is constantly changing- and usually it is equivalent to adding new floors onto buildings more than adding new wings. This means as you add more and more floors, the foundation must be made stronger. This work is rarely allowed (see #1) so when you write software, you need the experience to say, "I can inexpensively make this foundation strong enough to handle 3 new floors of upgrades and triple the expected load... however i can see that making it handle 5 times the load is so expensive the project won't happen.

    ---

    So you have such basics as
    Reasonably normalized data.
    Abstraction layers so that you can replace a layer without breaking anything.
    Fields big enough to hold at least 3 digits more than you ever expect to happen in reality.
    Foundation library classes that are well-defined, obviously reusable- and not too many of them (maybe 80-100 max - more than that and people start rewriting them because they can't find them).

    ---
    the worst bit is that now managers think
    1) programmers can maintain skill without actually working on code
    2) programmers are generic resources and that a college grad or indian resource can step right in at full productivity.
    3) languages and platforms will not expire within 3-4 years because the old mainframe programs never did (but they do today-- they are all so interdependent on each other).

    --
    She was like chocolate when she drank... semi-sweet at first and then increasingly bitter.
  53. You're going to need more than that... by Anonymous Coward · · Score: 0

    I hope you have more of a frame work to build your thesis on. Have you read many PhD dissertations? They are usually centered around in-depth research on a very specific problem. You are describing getting some general design principles that might make a great book on the subject, but not a thesis.

    C.f. "Good building techniques" with "Primary cause of premature failure of self sealing stem bolts in extra-solar habitation facilities". See the difference?

  54. Sorry buddy by flowerp · · Score: 1

    Slashdot won't be doing the PhD work for you.

    --
    --- Eat my sig.
  55. Books to Read: by Doctor-R · · Score: 1
    Read: The Mythical Man-Month: Essays on Software Engineering, Anniversary Edition by Frederick P. Brooks

    Literate Programming by Donald E. Knuth

    Beautiful Code: Leading Programmers Explain How They Think by Andy Oram and Greg Wilson

    But the real answer is: since there is no professional testing / licensing for software engineers or software managers; most of them are actually incompetent and/or inexperienced.

  56. Good Projects? by Kevin72594 · · Score: 1

    I don't have an answer to your question, but it might be helpful if we could get some examples of projects people think embody the idea of "good software." Then discuss principles these projects used which made them "good software."

  57. Anonymous Coward by Anonymous Coward · · Score: 0

    "My interest are the general principles of good software design, and I am looking for links/references on this topic."

    FAIL. You might squeak by on a masters thesis with that kind of topic. Maybe.

  58. Re:Advice from another Computer Science Phd Studen by Opportunist · · Score: 3, Funny

    2: Three seasons of Southpark.

    That's The Simpsons for coding. Southpark is for debugging.

    Man, you obviously have no idea. One of the critical skills is to choose the right tools for the right job.

    --
    We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
  59. Translation: by Anonymous Coward · · Score: 1, Insightful

    Dear Slashdot,

    I thought getting my PhD would make me uber 1337. Well, I finally got accepted into a PhD program, and now I find myself completely over my head. I don't even have a topic for my thesis!

    Could someone do my homework for me? Also, could you supply your name, address and phone number? I'm going to need someone to go in and defend my dissertation for me. kthxbai.

  60. Good software, by Anonymous Coward · · Score: 0

    I find that good software is usually grown. It is not about specifying everything upfront and building it. But also good software doesn't always mean popular or user-friendly. It is simply modular and has easily replaceable pieces that communicate with more(mostly) or less well defined interfaces. This to alleviate the growing pains when the software evolves. Plan9 comes to mind or Unix shell utilities.

  61. For an extreme example, take a look at Lockheed by merreborn · · Score: 1

    Specifically, the group that wrote the software for the space shuttle. With a defects-per-line rate less than 1/1000th of the average, they're doing something right.

    http://www.fastcompany.com/magazine/06/writestuff.html

    Of course, with a full pages of documentation for every 10 lines of code, and an average daily output of roughly a dozen lines of code, their process is much more time consuming and expensive than can be supported by most development budgets.

    But they serve as an example of the wide spectrum of approaches to software development.

    1. Re:For an extreme example, take a look at Lockheed by cerberusss · · Score: 1
      Actually, he doesn't give the metrics for good software design. This could mean lots of things:
      • In how far the original design held up during the lifespan of the software
      • How quickly the design was grokked by new people on the project
      • When delivered, the amount of deviation from the project's schedule
      • The total lifespan of the software
      • The amount of bugs
      Any of these metrics might be miserable for the shuttle software team.
      --
      8 of 13 people found this answer helpful. Did you?
    2. Re:For an extreme example, take a look at Lockheed by merreborn · · Score: 1

      You bring up a good point:

      The metrics that matter are really dependent on the project. For the shuttle software, the number one priority is reliability. Their software, above all else, must do one thing: not kill a handful of people floating tin can surrounded by vacuum. If that means going over schedule and over budget, while not ideal, better that than 4 corpsicles floating in orbit.

      On the other hand, if you're developing the latest and greatest web app, time to market is huge -- otherwise someone else is going to beat you to it. If you took the approach the shuttle team took, by the time you launched, your project would have been obsolete for years, and you'd have sunk more money into development than you could ever recover.

      So I suppose that's perhaps that's the first step to good project planning: identify the metrics that really matter for your project.

    3. Re:For an extreme example, take a look at Lockheed by cerberusss · · Score: 1

      So I suppose that's perhaps that's the first step to good project planning: identify the metrics that really matter for your project.
      You had me snickering there, since the original question was "what's good software design". The two of us already have agreed that what's really important for us is: "what's good project management". So I guess our answer to the original question is: narrow the scope of your research -- which makes it less and less relevant to our daily routine...
      --
      8 of 13 people found this answer helpful. Did you?
  62. Read Code Complete by bleuchez · · Score: 1

    I've been reading Code Complete by Steve McConnell at home and he really hits the nail on the head on how do design and write good software.

    He now has a second version of his book out, I highly recommend it as a study on good software.

    --
    bleuchez!
  63. Litmus Test by Anonymous Coward · · Score: 0

    In my experience, the best litmus test for good software design is if the application, when finished, can accomplish useful tasks that were never in the original requirements. I've seen numerous such occurrences.

    For example, a month after deployment, a customer has called and said, "I need a report for X". Then, I've responded with something like, "Go to this report, filter on this field, and sort by that field". In this manner, one can accomplish some specific task without making a single change to the application. And, it's not just limited to reports. I've seen various non-report examples as well.

    If written well, the application has a built-in X factor that anticipates future needs.

  64. How about a reasonable schedule? by jimbertling · · Score: 1

    Not that a reasonable schedule always results in good software, but an unreasonable one always seems to result in bad software.

  65. The most important... by Chysn · · Score: 1

    ...thing about the study of software design is good analogies. Without good analogies, your thesis won't make any sense at all.

    Compare software development to carpentry, automotive repair, civil engineering, cooking, music composition, sex, stamp collecting, spelunking, bird-watching... software developers can't understand treatises on software development unless there's metaphor involved.

    And mix it up a bit. If you use carpentry in a paragraph about class modeling, make sure to use automobiles in a paragraph about unit testing.

    Or, if you find mixed metaphor lacks grace, just stick with cars.

    --
    --I'm so big, my sig has its own sig.
    -- See?
  66. You might want to clarify your ideas w/ analogues by Anonymous Coward · · Score: 0

    If you consider good software to the clear, effective, and durable communication of heuristics then one might look to other aspects of the human condition where this has become necessary or brought forth fruit. Law? Math? Economics? The Art of War? If you can identify the over-arching ideas that seem to lead to good heuristics, how they're expressed in software should become more obvious, and then you can work on devising some system of quantifiying the meaningful attributes.

  67. That concept may not exist by unity100 · · Score: 1

    since everything related to design and implementation are generally defined by the datelines and budget that is available. you may have to define what the context for 'good' is.

  68. Open-Closed Principle by betelgeuse68 · · Score: 1

    You want princples, the Open-Closed Principle would be a big one:

    http://www.objectmentor.com/resources/articles/ocp.pdf

    Too bad 95% of the code bases out there suck a**. Which is why I don't do software development anymore. I'll stop there.

    Sytems Admin/Integrator,
    -M

    1. Re:Open-Closed Principle by Anonymous Coward · · Score: 0

      ... and the rest Dependency Inversion Principle? Liskov Substitution Principle? Single Responsibility Principle?

      About half of this book is pretty good:

      http://www.amazon.com/Principles-Patterns-Practices-Robert-Martin/dp/0131857258

      The best bits cover design principles which I've not really seen covered elsewhere, and then cover component design. Anyone seen anything as good (or better) elsewhere?

  69. "Writing Solid Code" by Anonymous Coward · · Score: 0

    ..published by the Microsoft Press.

    I kid you not.

  70. Good programming..... by lpcustom · · Score: 3, Insightful

    Sit down because what I'm about to say is very profound and could make you tear up.

    I've heard that the key to good programs is.......GOOD PROGRAMMERS

    --
    Beer! It's what's for breakfast!
  71. Hmmm by Anonymous Coward · · Score: 1, Insightful

    If researching your Ph.D. thesis involves an "Ask Slashdot", change topics or drop out now. This is akin to asking the undergraduate Math club for ideas on your thesis, is it not? We are not (and should not) be anywhere near the level of knowledge you already have on this topic...

  72. False Analogy by Anonymous Coward · · Score: 0

    TFA:
    "Most software design is lousy. Most software is so bad, in fact, that if it were a bridge, no one in his or her right mind would walk across it. If it were a house, we would be afraid to enter."

    If you want to define what quality software is, you must first use accurate analogies. Software is not like a bridge or a house.

    Software is more like a tool. You may have an ax that's not as sharp as you like and it may have splinters. But you still use it because its nearly impossible to cut down a tree using your teeth.

    TFA states software developers "get away" with poor implementations because poor design is hidden, but architects can't "get away" with poor implementations because bridges and houses are visible. This is not entirely true because end-users do notice bugs and poorly designed interfaces. The reason software developers "get away" with poor implementations is because it still acts as a useful tool.

    Remember, house foundations are also hidden, but architects do not "get away" with building poor foundations. A basic need of a house is to weather storms and not kill its inhabitants. When most software crashes, it usually does not kill the person who used it.

    The basic need quality software fulfills is to make work easier. While it would be nice if the software did not have bugs, it is not an essential attribute.

  73. The Joel Test by flashnode · · Score: 4, Interesting

    From one of the most respected developer/managers in the business, The Joel Test is a checklist that may help you with your ideas. http://www.joelonsoftware.com/articles/fog0000000043.html

  74. How about the KISS principle? by KiltedKnight · · Score: 1
    It's something we always seem to forget...

    Keep it simple, stupid.

    That along with some comments and a clear writing style to include readable indentation levels, consistency of style, reasonably descriptive variable names, data structure fields, or object member names...

    And as much as you might try to write a "beautiful algorithm," some of the best ones are simpler, have less feature creep, and can be used along with other simplistic ones that will achieve the same results.

    --
    OCO is Loco
  75. Re:Advice from another Computer Science Phd Studen by Anonymous Coward · · Score: 0

    or CiteSeer. Man, that site is useful. Nothing like a bit of "reference surfing" from paper to paper to get a feel of an unfamiliar topic.

  76. Depends on the softwares purpose - Design Patterns by SplatMan_DK · · Score: 1, Informative

    I would say that in many cases the answer to your question depends on the purpose of the software in question.

    Common for most (i don't know about "all") succesfull software products is the fact that they are implemented using one or more Software Design Patterns. For instance you will find that Model-View-Controller (MVC) is extremely widespread in administrative software and similar database-driven applications, while it is probably not really usable in many other types of software (like graphics editors or a spreadsheet app).

    But I would say that "Uses an established Design Pattern" is one aspect you need to include.

    Another aspect might be the method in which the actual programming is planned and controlled during implementation. A documented and proved method for the implementation, such as Unified Process (UP) or similar, may be something you could consider adding to your answer.

    :-)

    - Jesper

    P.S. Please forgive me for adding Wiki-links. Having a PhD in Computer Science I am sure none of this is new to you. They are mostly provided for other readers :-)
    /JS

    --
    My security clearance is so high I have to kill myself if I remember I have it...
  77. Re:Psychology (clarification re "performance") by Tablizer · · Score: 1

    by "performance issues", I mean computer hardware speed, not people productivity.

  78. Never let a PhD design software by Proto23 · · Score: 1

    seriously!

  79. come up with a new metaphor .... by lexluther · · Score: 1

    Okay since its your PhD thesis you should aim high. Try to come up with a new metaphor. The tired, oft-wrong, and certainly too-broad-to-have-any-real-value metaphor of the "building" or "house" as software needs to be retired. I don't really know many professional software engineers who also design skyscrapers, but I know that my architect friends aren't using software engineering terminology, such as, "no code dup" to reason about how many doors we might want to stick on their new projects.

    The metaphor should be helpful. It should make us believe that the same principle which governs one domain is applicable in another domain where reasoning is often more difficult. The metaphor breaks down however when we try so hard to "fit" it to the second domain.

    I am saying that the parts of the building metaphor which fit -- we get (that doesn't mean we design correctly). Its the parts that don't really fit that are interesting. This might be were software design is somehow different than building design.

  80. Not a simple answer by Anonymous Coward · · Score: 0

    and a general solution is going to be difficult.

    I assume you're read the Mythical Man-Month (at least as a start) and realize the 4 types of software project/products out there. Some of the answers people have given you are solutions depending on the type of software project.

    Generally though, good software faithfully implements the model it is designed under, with the limitation of the model being known and accepted by all the principles involved.

    Furthermore, the code is sufficiently engineered to allow for changes demanded by the customer in a timely manner (ie: upkeep, bugs, etc).

  81. Re:Modularity, high boundaries, and simple interfa by Anonymous Coward · · Score: 0

    HAving not long been on a large dev project(multi user, networked _ control of external hardware) doing exactly what you have mentioned made the project smoother and reduced problems during code merges(multiple devs) and integration testing.

    The only time specialist types were used was when absolutely required.

  82. Software Design Considerations by Anonymous Coward · · Score: 0

    Read the DO-178B document.

  83. Requirements by Mustakrakish · · Score: 1

    Before you even start any software design, nail down the requirements of the project. This is critical. How can you, or anyone else, design software when it hasn't been established what that software is supposed to do?

  84. Start with the maths by Colin+Smith · · Score: 1

    Work out how the mathematics of software development works.

    --
    Deleted
  85. Good software means lacking in bugs, maintainable, by flaming+error · · Score: 1

    Good software means lacking in bugs, maintainable, modifiable, scalable, etc.. Then here's the best program in History (Assembly):

    xxxx:0100 NOP
  86. User Centered Design principles... by rtilghman · · Score: 1


    You've heard the saying, "garbage in garbage out", right? Modularity is important from a code perspective, and obviously simplicity and scalability matter. However, it all dials back to the design principles that drove the solution in the first place.

    Many software design projects are driven by a core set of requirements developed by a small collection of SMEs or business stakeholders with a supposition about their client or target users but little in the way of hard data. From this ungrounded starting point bad projects just start spiraling; developers inevitably go in 50 directions due to conflicting requirements and a lack of any cohesive "strategic vision", their solution is further undermined when the same business users invariable "tweak" and redesign aspects of the app on the fly, and are even further undermined when parts of the app are wholesale redeveloped due to user dissatisfaction.

    In contrast, UCD basically advocates allowing user needs, tasks, routines, and missions to drive application design. You conduct detailed research and investigation up front to determine the competitive landscape, business priorities, and user context and goals, you marry these into a collection of critical directives and capabilities matrix, and you then develop a comprehensive design that supports this from an application perspective. Because you defined and designed the application from the perspective of user need you are much closer to providing exactly what is required, but you are also better able to dial extensibility into the application both from a feature perspective and an architecture perspective. THIS means that you've accounted for all those changes and modifications users will expect, which means that it is far more likely the developers will be able to build out the application in a logical, modular, and scalable way that requires less churn, less rewrite, and less compromises.

    Anyway, that's my perspective as a design lead whose worked on a lot of different engagements ranging from knowledge mananagement systems to rich applications, etc. Like anything else, if you take the time to build a sensible framework it will generally go better than if you fly by the seat of your pants. The issue is that this framework pushes all the way to requirements, not just within the development thread, and you need to think about the different project phases as a continuous and inter-dependant thread.

    -rt

  87. Rise, Doctor Conaway. by 140Mandak262Jamuna · · Score: 1

    For your insightful contribution to Slashdot, I dub thee Doctor of Philosophy in the field of computer science, for the thesis "Good Software Design Principles", and award you all the rights and privileges due thereunto. Rise, Doctor Kevin Conaway.

    --
    sed -e 's/Chuck Norris/Rajnikant/g' joke > fact
  88. Can you understand it? by scruffy · · Score: 1

    Someone (or some group) understands the software.

    Anyone (or any group) that is knowledgable enough can learn to understand the software.

    What makes anything easier to understand? Good teachers/documentation, good organization, and good semantics (in this case, the correspondence between the components of the software and the components of the task domain).

  89. heh by B3ryllium · · Score: 1

    Kudos to the editors for posting this (apparently) un-edited. I got a chuckle out of it.

    "Dudes! I totally need to graduate. Write my thesis for me!"

  90. No Such Thing by Anonymous Coward · · Score: 0

    Please identify essential design principles common to all of the following items:
    Nuclear Reactor
    Airplane
    Baseball Bat
    Lawn chair

    Stumped? Thats because there aren't any.

    The idea that there are one-size-fits-all design principles is fundamentally flawed. There are design principles that lead to maintainable software, and ones that aid in developing extremely complex software, and ones that minimize initial development cost, and ones that encourage faster understanding of the problem domain, and ones that improve execution speed, or memory footprint, etc. If you try to use all of them at the same time, you product will be a mess.

    So, fundamental principles:
    1) Understand the problem you are trying to solve.
    2) Use the best tools for solving that particular problem.

    1. Re:No Such Thing by cerberusss · · Score: 1

      The idea that there are one-size-fits-all design principles is fundamentally flawed.
      I bet the original poster has over-simplified his question a bit too much. Of course there is no silver bullet, but there are probably subsets in that pool of good software design that share characteristics.

      If such a subset would be 'embedded software', or 'administrative/business software', it would be pretty interesting.
      --
      8 of 13 people found this answer helpful. Did you?
  91. Low coupling... by IvanCruz · · Score: 1

    between modules and high intra module cohesion: http://en.wikipedia.org/wiki/Coupling_(computer_science)

  92. Don't forget your .bib file by CapnYarrrrrr · · Score: 5, Funny

    Just be sure to add your Slashdot research to your .bib file:

    @MISC{Slashdot:2008,
    AUTHOR = "Level 70 Opinionated Geeks",
    TITLE = "Musings on Software Design Principles",
    HOWPUBLISHED = "Randomly Moderated Posts",
    MONTH = "June",
    YEAR = "2008",
    NOTE = "Results from Ask Slashdot when I was too lethargic to look up CS articles online",
    }

    1. Re:Don't forget your .bib file by pbot · · Score: 1

      Roll for initiative...

  93. Interfaces are very important by Ichoran · · Score: 2, Insightful

    One of the most useful principles I've found for making "good" software is to design very clean, very powerful interfaces. Focusing on "modularity" often puts the focus in the wrong spot, namely on the center of the module. The point is that the details there *shouldn't matter* because you can abstract away all sorts of fiddly detailed functionality.

    It is difficult to make clean and powerful interfaces, however. You really have to understand the nature of the problem you're trying to solve in order to pick the most natural groups of functionality. Very often, if you're trying to get something done in a reasonable amount of time and don't need to maintain the code for that long (though beware--you'll find yourself using, a decade later, programs that you thought you'd rewrite "next month"), it's better to code something quick and specific.

    The cleanliness of an interface basically boils down to how little information you can pass to it, and how little information you need from it, in order for it to do what you want; and to what extent all information and data goes through explicitly defined interface elements (e.g. an interface in Java). (Here I'm drawing a distinction between data, e.g. the content of a character stream, and information, which is "hey, there's a character stream here, go work on it".)

    The power of an interface basically boils down to how many different high-level operations can be constructed from mixing and matching components of the interface. For example, compositing operations tend to be powerful (e.g. take A, take B of the same type, perform some operation to produce C of the same type from A and B).

    There are lots of other generally useful strategies, but I find this one of the most overlooked, especially by otherwise really talented coders (who can tend to make interfaces more complex because they are talented enough to work with something that complicated).

    1. Re:Interfaces are very important by Frans+Faase · · Score: 1

      I have also discovered that with interface design, one should focus on the view of the users of the interface, not on the implementers. If an interface is designed by the person having to implement the functionality, there is a great danger that the interface will reveal unneccessary details of the implementation and thus break encapsulation. These kind of interfaces also tend to have to many elementary methods, often resulting in the same sequence of methods being called by the code that needs to use the interface. Whenever this happens, it means something went wrong in the interface design.

    2. Re:Interfaces are very important by gr8dude · · Score: 1

      After analyzing some of my past failures and examining the bottlenecks of the current projects - I reached the same conclusion. You expressed everything nicely, I hope others will take their time to read your comment and understand the nature of the problem without going through all that trouble.

      Being unable to establish an interface makes the entire project unreliable - I can't start working on a different module because I have a feeling that I will find a new "latest greatest" way to do something, thus alter the interface again... Eh...

      One of my conclusions is that one needs to dedicate enough time to formally describe all the requirements, and freeze them once they think they got everything covered. With that done, it is easy to figure out "how little information you can pass to it, and how little information you need from it, in order for it to do what you want".

      This only addresses one part of the problem - the high-level perspective. The second part is mapping it all to data structures, data types, library functions. I have a hard time coming up with a design from my thought-out list of requirements.

      I've been struggling with this for a while, can you recommend some reading material that covers this aspect of software development?

    3. Re:Interfaces are very important by Ichoran · · Score: 1

      I haven't the foggiest idea about good reading material for the mapping-it-all-out level.

      Personally, I've found mental exercises of the "how many things can you do with a paperclip" type to be at least as useful as the books I've read on the subject.

      If you haven't read Code Complete (by McConnell) and/or Refactoring (by Fowler), doing so will help, as keeping some of those things in mind when going to the implementation level will help you choose data structures and libraries (or will help you avoid ones that violate too many principles). But they're hardly a tutorial on the subject.

    4. Re:Interfaces are very important by tonyt3 · · Score: 1

      I'd like to add a super-hooray to this suggestion. I had a programmer a few years ago who presented me with a program that had an interface to die for; everything I might need to tweak in the program had an obvious "click here." (the code also worked.) by contrast, we have an accounting system now for the whole university that may just possibly work, but the user interface seems designed to keep me out. Not a good way to go. by the way, you probably know that a few years ago there was an article ( Scientific American?) about those very few places that know how to write code that doesn't break. They showed some general principles for the design. The L-M team is one way to go; damn few others. good luck with the thesis. t

    5. Re:Interfaces are very important by Ichoran · · Score: 1

      I was speaking of internal interfaces, not user interfaces.

      However, if all of your internal interfaces are powerful and clean, it makes it a lot easier to make the UI the same way--because it just hooks directly into underlying powerful, clean functionality, instead of being a nightmarish remapping exercise.

      There are still plenty of ways to break a UI even if you have a good underlying architecture. But it won't hurt to have a good foundation.

  94. see OODP, OOSC by hzamir · · Score: 1

    Object Oriented Design Principles have been distilled and are known by 3 letter codes (OCP = Open Closed Principle, LSP = Liskov Substitution Principle). Google that. The best book I know of on this subject is "Object Oriented Software Construction" by Bertrand Meyer.

  95. usability by postbigbang · · Score: 1

    try googling jakob nielsen's work.

    one link: http://www.useit.com/papers/heuristic/heuristic_list.html

    or, just http://www.useit.com/jakob

    as nothing works unless you can use it.

    --
    ---- Teach Peace. It's Cheaper Than War.
  96. Something old,something new by Anonymous Coward · · Score: 0

    I thought one of the criteria for gaining a doctorate was that your thesis make a novel contribution to the field of human knowledge.

    Not, for instance, simply listing a load of things thought up by others and playing compare and contrast.

    Or am I just being old fashioned?

  97. What the Heck? by ZonkerWilliam · · Score: 3, Insightful

    Why would a PhD student solicit for information on a social website? Shouldn't you be doing the research yourself??

    1. Re:What the Heck? by Anonymous Coward · · Score: 0

      Slashdot is social? :O

    2. Re:What the Heck? by iceperson · · Score: 1

      because every thing worth knowing is clearly already in a peer reviewed article somewhere. there's obviously nothing more to be learned.

    3. Re:What the Heck? by Anonymous Coward · · Score: 0

      Seriously. Besides this being borderline academic dishonestly (well...it's certainly not a secretive solicitation)...

      The whole point of having a PhD is that you prove to the world that you have earned the right to think for yourself, and come to different conclusions.

      Real PhD software engineers are building and specifying the tools that we will use to solve outstanding problems (coupling, correctness proofs, metrics, languages, performance engineering, etc).

      Chuck Connel, you tell US something we don't already know.

    4. Re:What the Heck? by UnixUnix · · Score: 1

      Uh... to save time in locating useful material? He still has to "do his research" himself, namely, assess what he reads, AND come up with a new contribution of his own.

    5. Re:What the Heck? by Anonymous Coward · · Score: 0

      Part of doing research is gathering information from different sources. It's not like he is asking anyone to write his PhD thesis. So please crawl back into your hole.

  98. Prototyping is best... by Emperor+Shaddam+IV · · Score: 1

    I don't think you should be asking for help for your PhD on the internet. I sincerely hope your professors are cool with this, are you may be in for a nasty surprise.

    There are tons of books written on the subject.

    That being said, I think prototyping is best...
    Rapid
    Application
    Development

    Now go buy or read some books, before your professors discover what your doing out here...

  99. PhD thesis by oldhack · · Score: 1

    I sure hope you have better focus than "good design principles" for your thesis. Seems a vacuous subject as "good business management principles".

    --
    Fuck systemd. Fuck Redhat. Fuck Soylent, too. Wait, scratch the last one.
  100. Conference Proceedings and Journals by Rui+Lopes · · Score: 1

    Easy. Start by reviewing the state-of-the-art in Software Design. A quick search on ACM's Digital Library can yield interesting results.Try looking particularly to the proceedings of the OOPSLA and ESEC/FSE conferences. Furthermore, don't forget to check SIGSOFT's Website for other conferences in the area.

    And, last but not least, read seminal papers on the topic, check references/citations. It'll probably take you one entire year to have the feeling about the entire (relevant) state-of-the-art in your PhD topic. Trust me, it took me that long too. But it's worth it.

    --
    var sig = function() { sig(); }
  101. Lakos by Anonymous Coward · · Score: 0

    Check out Lakos, "Large Scale C++ Design".

  102. Good design is "Process Improvement." by Hunkdaddy · · Score: 1

    Good design is "Process Improvement." If the application is successful, users will naturally accept it as their preferred work method. Too often, software is designed such that it is more cumbersome to the user than the legacy process it was intended to replace.

  103. Think about how new tech changes the landscape by Anonymous Coward · · Score: 0

    Now now, any serious PhD student in software engineering automatically knows the answer is "It depends...", especially if you've studied with Jim Collofello...

    If you're looking specifically at Design and architecture you might want to check out Design Patterns by the Gang of Four...if you're looking for general concepts, Pressman is a good friend to go back to (you'll probably appreciate the book more now than in undergrad software engineering classes)

    If you're mainly trolling for research ideas, I've got one for you (since my own research seems to be taking me in a different direction): namely what's the major role that Software Configuration and Project Management play in determining quality Open Source Software?

    For example: Web Content Management Systems are a new and burgeoning area of development. Architectures such as WordPress, Joomla, and Drupal offer "easy, modifiable solutions" to the challenge of creating dynamic websites.

    Drupal in particular features a framework of hooks (non-object oriented, written in PHP) and a completely open documentation and development policy...

    This means that any Tom and Jane who know *nothing* about software development or how to write a for-loop can develop "Yet Another RSS Module" and contribute it directly to the project homepage (or write a help doc!), leading anyone who *actually knows what they're doing* to SPEND HOURS digging through poorly documented (or in some cases just suboptimal/just plain incorrect) and poorly implemented piles of crud that offer nothing close to the concepts of Polymorphism, Inheritance, or a Unified programming model to work with, and yet by most accounts it is a successful and powerful piece of software...! (>o) ...But I digress (sorry bad class project experience last semester)...Point is, it's an exciting time to be looking at software because most of the academic research up to this point has been focused on DoD projects with more archaic system architectures and development methodologies. Try looking at some of the emerging paradigms/technologies and seeing what jumps out at you.

  104. Good general design by iso-cop · · Score: 1

    What makes for good general design? Here are some general bits.

    Localization of information--minimize the scope of all identifiers: localize variables, minimize coupling of subroutines.

    Descriptiveness or understandability--name identifiers in an intuitive manner, provide comments that explain the purpose of each section of code as well as any tricky constructs.

    Defensiveness or robustness--each piece of a design assumes it will be misused and handles misuse gracefully.

    Well defined interfaces--each design item has a clearly defined purpose, input and output ranges, pre-conditions and post-conditions, and error states.

    Peer review--each bit of design is inspected per some criteria as well as their personal expertise.

    I am sure there are more of these...just off the top of my head.

  105. Academic links by cwingrav · · Score: 1

    All these papers can be found online, if your library gives you access to IEEE and ACM pubs. These are the classic papers so you might might see who cites these papers (Google Scholar) to get more recent refs.

    Parnas discusses modularity:
    [Par72] D. L. Parnas, "On the Criteria to be Used in Decomposing Systems into Modules", CACM: 15:12 1972.

    Another good read for a critique of software engineering (but not what you are looking for):
    [Par85] Parnas, D. "Software Aspects of Strategic Defense Systems." Communications of the ACM, 28(12), 326-335, 1985.

    Boem is the person you want to read though:
    B. W. Boem, J. R. Brown and M. Lipow, âoeQuantitative Evaluation of Software Quality.â Proceedings of the 2nd international conference on Software engineering, 1976.
    B. W. Boehm, "Software Engineering," IEEE Trans Computers, Dec. 1976, pp. 1226-1241.
    B. W. Boehm, âoeSoftware Engineering â" As It Is.â Proceedings of the 4th international conference on Software engineering, 1979.

    Hope that helps. Email me if you can't find the papers.

    1. Re:Academic links by cwingrav · · Score: 1

      Oh yeah, Bertrand Meyers does a great job talking about this in his OO book Object-Oriented Software Construction.

    2. Re:Academic links by cwingrav · · Score: 1

      Seriously, no love to the guy that actually posts useful links about software quality research? And actually answers the question? No bumped up moderation but dudes that rant about crazy stuff get labeled as informative... ....

  106. This doesn't sound like a grad student ... by frogzilla · · Score: 0, Troll

    This doesn't sound like a grad student that I would like to have in my department. This sounds like a high school or undergraduate project.

  107. Software Design Principles. by LoyalOpposition · · Score: 1

    I read a book about that years ago. I wish I could provide you the name of the book, but I can't remember it any longer. It had five principles of which I still remember only two. They were stated "module strength should be as great as possible" and "module coupling should be as low as possible." Great module strength is achieved when a module only does one thing. For example, you shouldn't have a flag where the module extracts the square root for one value of the flag and returns the absolute value for another. Low module coupling is achieved when all the variables that the module references and all variables that the module modifies are passed through the argument list. Sorry about losing the other three.

    -Loyal

    --
    I aim to misbehave.
    1. Re:Software Design Principles. by gr8dude · · Score: 1
  108. Write Less Code by johannesg · · Score: 1

    Any of line code that is written can fail; any line of code that is not written will never need to be debugged, documented, examined, nor will it ever crash.

    Based on that principle, the ideal program consists of the minimum number of lines of code that leads to the desired result. In many situations you will find that you cannot get away with having zero lines of code; in the lines that _are_ necessary, strive for maximum clarity above all else. Always ruthlessly cut everything that does not need to be there.

    Try to make the code as boring as you possibly can; always strive to use the same patterns for everything where possible and appropriate. Seeing an alternative implementation then automatically becomes a flag, warning about potential mistakes and unusual circumstances.

    _Do not_ maximize comment density. Whenever you _should_ write a comment, consider if you can use variable or function naming to achieve the same effect.

    Don't use variables; only use constants (i.e. prefix declarations where possible with 'const'). Minimize their scope. You will find that only a very small number of the things that you think of as "variables" today are in fact variable.

    Make your code checkable by the compiler as much as you can. This is not the same as turning on all warnings, and then peppering the code with workarounds for nonsensical warnings. It is ok to turn off silly warnings, such as 4800, 4100, or 4786 in Visual C++.

    I could write another ten pages, but this should get you started. For the record, my credentials mostly include C++ software used to control and test spacecraft. Software failures can in principle lead to "loss of item under test", with associated astronomical price tag. So I have some appreciation for good code.

  109. Metrics used in your PhD by d60k8p · · Score: 1

    There is plenty of good material posted here...I would say you probably need to take a step back. What are the metrics you want to use? Are they relevant? Why - or why not? What are the strengths and weaknesses of each? That is probably a PhD thesis in its own right. I would argue that this is largely defined by the domain in which you are working. In the case of my doctorate (in industrial automation), I decided that code was largely irrelevant - and what was of most importance was the process. Conversely, another member of the research group chose to look at the same codes - but by applying a series of standard software engineering metrics. It doesn't matter which way you go, provided you have justification for your approach. Off course you need to do better than reference an open forum on slashdot ;-) There's an article in the forthcoming articles in the IEEE Transactions on Automation Science and Engineering which might give you more detail on what I'm getting at...

  110. Doctor Hunter S. Thompson by Ethanol-fueled · · Score: 1

    Mail-order Ph.D FTW!

    1. Re:Doctor Hunter S. Thompson by notdotcom.com · · Score: 1

      In the late sixties, Thompson obtained his famous title of "Doctor" from the Universal Life Church.[38] He later preferred to be called Dr. Thompson, and his "alter-ego" Raoul Duke called himself a "doctor of journalism". [wikipedia.org]

      --
      Grandpa: My Homer is not a communist. He may be a liar, a pig, an idiot, a communist, but he is not a porn star.
  111. Re:Advice from another Computer Science Phd Studen by Emperor+Shaddam+IV · · Score: 2, Funny

    Real engineers watch Futurama.... South Park and the Simpsons is for programmers and QA testings....

    Muhahahah

  112. Early Days by Shadow+Wrought · · Score: 1
    I'd start by looking back in the early days of coding. Punchcards even. With all of the limitations on memory, storage, and processor, the coders had to make everything work as effeciently as possible. I'd also look at the demo scene. I remember some crazy long, graphic and audio intesive demos that my friend showed me on his Amiga 2000 that were fairly long to boot.

    Once you know what those techniques were, and the way things are done today (that require 10 times the resources to do a fraction as much), you'd have a fairly decent baseline I'd think.

    The short answer is: Python.

    --
    If brevity is the soul of wit, then how does one explain Twitter?
  113. Abstraction and Frameworks by RingDev · · Score: 2, Informative

    To go even further on this path, abstraction and frameworks have improved my code quality and reduced my time to production.

    Abstracting code as much as appropriate allows you to reuse a significant portion of your code base. And with designing a framework for your applications that utilize that abstracted functionality to allow for a modular design of the actual business logic will greatly improve almost all projects.

    The business layer should have no idea what the database is or how it works.

    The presentation layer should have no idea what the business layer is doing or how it works.

    We really pushed these principals on a project I worked on a few years ago. We had a reporting system that had to access 3 different databases, 2 3rd-party systems, and interface with business rules over 4 different departments and employees/sales in 3 different states. We created a custom data access layer that handled all of the data-related functionality for us. So in the business layer code, we never had to care about the data source, we had objects that represented the data in memory that all inherited from the same base data object/collection. Each specific report or functionality was based on one of 4 specialized frameworks that handled Crystal Reports, Office automation, work flow, and HTML generation. Each of the frameworks was based off of an even more basic type that handled the underlying multi-threading and work flow of the process. And all of that functionality was designed to be abstracted from the user interface so that we could build a Windows based interface to start with, and as the 3rd party apps gained more flexibility we could directly call our application's business logic and work flow from the other applications.

    Anyway, one of the first projects I look at when stepping into a new project or job is to get the abstraction and design cleaned up. There is no sense beating on business logic when the underlying technology is going to cause you more headaches and piss off your users. And once you get that technology straightened out, you can focus on business logic and get the users a product that not only meets their needs, but also meets your needs in support and maintenance requirements.

    -Rick

    --
    "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    1. Re:Abstraction and Frameworks by blippo · · Score: 1

      You are my exact anti-these.

      google "The Magical Business Layer".

      Really.

    2. Re:Abstraction and Frameworks by RingDev · · Score: 1

      There were no results in your selected language(s). Showing worldwide web results for "The Magical Business Layer".

        Web
      Information No results found for "The Magical Business Layer". Tried it with out the "The" and with out the quotes, I found nothing on the top page to elude to a contrary point of view.

      I am curious about your thesis though if you are opposed to data abstraction and an independent business layer. Please, do tell!

      -Rick
      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    3. Re:Abstraction and Frameworks by debatem1 · · Score: 1

      If you can't abstract in engineering, you're dead. Its the only way to deal with complex systems- to reduce otherwise complex behavior into simple, predictable building blocks, from which you can abstract still further. In the ideal scenario, your business layer describes in near natural language exactly what's going on at the top level of abstraction of your program, and everything else is only for the curious.

    4. Re:Abstraction and Frameworks by Anonymous Coward · · Score: 0

      are you two competing for most hilarious misuse of an English word? "anti-these" v. "elude to"

      hint: try "antithesis" and "allude to"

  114. No, seriously... by jafo · · Score: 0, Offtopic

    >"I am working on a PhD [...]

    Why would you want to be a doctor when you could be a MASTER?

    Sean

  115. Organize the files themselves by b4dc0d3r · · Score: 1

    It's kinda in that link, but I cannot stress enough organizing the code files themselves. Unless you have a very tiny project, you probably have bunches of stuff like the main application, some GUI work, support functions, classes/libraries, different architectures, translations, documentation, meta-documentation, build files, configuration...

    I know you're not (necessarily) talking about open-source, but it's easy to pick on. There is nothing worse in open-source than downloading a promising application's source code and having hundreds of files in the root folder with no obvious organization, and having to do a full text search on "main" to see where the ignition key is.

    You may not release your code to the public, but think of the poor guy/gal who replaces the guy who just retired/quit. How long will it take him to figure out where everything goes? Taking the perspective of a new user and organizing the files so you can find the entry point, or the platform-independent sections, or the file-format logic. It forces you to think about where things belong, or don't belong, and what to keep private versus exposed.

    I would just be belabouring a point if I didn't have my latest example, Firefox. The windows build is buried way at the bottom in a non-intuitive location, and the installer code actually seems to be copied (with different versions of some files, sometimes one folder is newer, sometimes the other) in another location ("moztoolkit" versus "xpinstall"). I honestly can't see the difference or figure out where each is called out or which one actually runs without doing a full-text search on the whole source tree. The installer build itself is in .bat files, perl, and normal make, and the resulting executable is a mess of UPX'ed 7-zipped SFX with the 7z stub UPX'ed and that just gets you to the NSIS setup.exe installer. What a disaster it is! And not organized!

    Lay out your code like you lay out a book - so you can just go to a specific chapter and read the parts you want. If you need to add something, you should be able to find where it goes, and may be surprised to find it already exists. It makes porting, library replacement, task distribution, and many other things a lot easier. If listing just the folder names doesn't add any clarity or value, you probably need t reorganize.

  116. Wizard of FOSS by Anonymous Coward · · Score: 0

    100,000 monkeys and a IBM PC-AT keyboard.

  117. Reflection... by telbij · · Score: 1

    Here's one idea:

    http://michaelfeathers.typepad.com/michael_feathers_blog/2008/06/the-flawed-theo.html

    Personally I think good software is a result of re-using what works in the form of libraries or design patterns, keeping things as simple as possible, and utilizing developer experience and judgement.

  118. Huh? by Anonymous Coward · · Score: 0

    There's somebody who got into the Ph.D. program at Tufts, who can ask such questions?
    Dude, write your own dissertation.

  119. Re:Depends on the softwares purpose - Design Patte by SplatMan_DK · · Score: 1

    Oh, and by the way: Parent was posted using Firefox 3.

    Get it NOW and join the attempt to set a new official world record in software downloads :-D

      http://www.spreadfirefox.com/

    And before you go marking this post as "offtopic", perhaps we could suggest that "number of downloads" could be added to the answer? A high number of downloads could very well (but not always) be a sign of good software quality - at the very least from an end-user perspective. :-)

    - Jesper

    --
    My security clearance is so high I have to kill myself if I remember I have it...
  120. "Pretty" warning by Tablizer · · Score: 1

    It would be interesting to try and quantify code elegance. I forget who said it but there's a saying "code that looks good is good"

    I have to disagree. If you factor out the duplication/repetition, the result is rather compact and non-uniform. Repetition of form is what makes code *look* neat, but lots of repetition is generally considered poor form.

    Also those big verbose asterisk box banners some developers put in their code to make it look "professional" just waste space. A lot of that info should be in the source code tracker or is redundant in one way or another.

    1. Re:"Pretty" warning by Daniel+Dvorkin · · Score: 1

      If you factor out the duplication/repetition, the result is rather compact and non-uniform. Repetition of form is what makes code *look* neat, but lots of repetition is generally considered poor form.

      Compact, yes; non-uniform, no. Consistency of style (variable naming, indenting, braces, use of spaces, etc.) leads to code that looks good on the screen and is more readable. This isn't repetition of actual code, which is indeed bad (someone once said that if you write three or more lines of code that do essentially the same thing more than twice, that's a good sign you need to put it into a function) but a lot of it is repetition of the way you write the code.

      Also those big verbose asterisk box banners some developers put in their code to make it look "professional" just waste space. A lot of that info should be in the source code tracker or is redundant in one way or another.

      Wasting space doesn't seem like much of a concern; the days when storage was priced on a per-byte basis are long gone. If a header block that adds a kilobyte to the size of a source file saves whoever inherits the project an hour in how long it takes to understand the code, that's a worthwhile tradeoff -- and well-written header blocks can very often save days, not just hours.

      Never, ever, ever rely on external organization to contain all the necessary file information. In any project of any size, someone, sooner or later, will end up with an orphaned source file: no information about it except the file name and contents. No matter how tight your version control system, this is pretty much guaranteed to happen. Good in-file documentation is the only way to ameliorate this.

      --
      The correlation between ignorance of statistics and using "correlation is not causation" as an argument is close to 1.
    2. Re:"Pretty" warning by Tablizer · · Score: 1

      I suppose we'd have to compare actual examples. The devil is in the details.

      Wasting space doesn't seem like much of a concern; the days when storage was priced on a per-byte basis are long gone.

      I meant "eye-space" more so than disk.

  121. The real answer by blueforce · · Score: 2, Funny

    is quite simple, actually.

    First, if it's not invented here, then it's crap.

    Second, I'm the only one I trust to write it correctly.

    Third, I work alone, and I don't write comments - see number two.

    --
    If you do what you always did, you get what you always got.
  122. Programmer Processes vs. Monkey Management by Bookwyrm · · Score: 1

    Without specifying the scenario, the answers to this question is pointless.

    If you have a bunch of professionals working together, their ability to follow processes and perform will be different than if you are managing a bunch of monkeys. If all your programmers only speak Japanese, giving them a bunch programming principles written in English is not going to help. If your programming team is full of people who have been programming in Java for their entire careers in enterprise applications, then toss them into a low-level hard real-time embedded system C-only programming environment, it's going to be interesting. People apply their own perceptions and prejudices (and blind-spots) when following software design principles (or when they *think* they are following principles.)

    If the only common language your programming team knows between all of them is BASIC, your application is going to end up in BASIC. If all your programmers are OO folks, your application is going to be built OO. etc. If you have a mixed team of local programming teams in different product groups in a company with different priorities vis-a-vis the project, some contractors, stuff out-sourced to a group in Asia, etc. etc. etc. Theory in software design principles can take a flying leap. Each situation is different and the importance of the skills and experience of the people involved can trump the technology or design principles.

    If your vaunted software design theory ends up pounding square people into round software princple holes, things can go amazingly badly. This does not mean that the software design principle is bad. It does not mean that people are bad. It means that the design principles are not being applied properly. A herd of cats is managed and is better at different things than a pack of dogs. If you are trying to manage a group of distributed developers who are more varied than zoo, then software design principles take second stage to management principles. First, you need to figure out roughly what each group is good at, and then you can apply the proper design strategy/development principles to each groups.

    This sort of theorizing is only valid in the laboratory or for small target groups in reasonably controlled circumstances. The personnel and personality issues (internal team conflicts, design blind-spots, personnel turn-over, etc.) and outside influences (changing target market/customer requirements, abrupt budget cuts, scheduling changes, etc.) tend to trump design principles in practice. In order to make such design principles work in practice, it takes a combination of constraining the domains being worked on and resources to create a (mostly) controlled environment in which to apply the principles. Few design principles can cope with situations where the outside world (or internal personality issues) are allowed free reign to interfere with the development.

    So, first posit a controlled situation and specify your group of developers, and then maybe you could come up with principles that apply. Sometimes, principles that apply to one situation don't actually work in another. (Generally, for instance, commenting the code is a good idea, for instance, but the person writing the comments needs to be able to write *good* comments. If the person doing the commenting is only putting in unimportant stuff, or not aware of what they ought to be documenting, then they product crappy comments. If the person who is then going to be dealing with the comments is not experienced enough to tell good information from bad, this situation can be harmful because it creates the illusion of understanding. So, do you have a team where most of the people are inexperienced? If so, then the group design/management/development principles may need to be organized so that the experienced people are in the path to check on the work of the inexperienced, and you don't have the inexperienced people cross-checking their own code without a sanity check.)

  123. Follow these by slasho81 · · Score: 1

    Epigrams on Programming by Turing-award laureate Alan Perlis.

    1. Re:Follow these by UnixUnix · · Score: 1

      Thank you for reminding me of a wonderful man and master of our craft, whose graduate course I remember fondly -- as well as his penchant for wicked APL one-liners! :-)

    2. Re:Follow these by UnixUnix · · Score: 1
      I add as footnote an assignment given by A. Perlis to our class:

      1. The Billiard Ball Reflection Problem

      2. Recognition of Trigonometric Identities Problem

      3. Shortest Mutation of Strings Problem

      4. [I don't remember the 4th one]

      For each of the above four problems

      i) Discuss which programming language you consider most appropriate for the problem

      ii) If you do not already know said language, learn it.

      iii) Write a program in said language solving the problem

      I did (1) in FORTRAN, just to prove a point about libraries. I did (2) and (3) in LISP. That is how I learned LISP :)

  124. Use Vi by Anonymous Coward · · Score: 0

    EOM

  125. Re:Depends on the softwares purpose - Design Patte by Anonymous Coward · · Score: 0

    . . . For instance you will find that Model-View-Controller (MVC) is extremely widespread in administrative software and similar database-driven applications, while it is probably not really usable in many other types of software (like graphics editors or a spreadsheet app). What? Graphics editors and spreadsheet apps don't have models, views and controllers? Those are two really great examples of where that pattern can apply extremely well.
  126. Science Citation Index! by Tired+and+Emotional · · Score: 1
    You want to use a citation Index. Use references in papers you know about to move backwards and, as a citation index is an inverted index, that will allow you to come back forward.

    Here are a couple of starting points for a citation search. You are going to get a lot of stuff but if you are doing a PhD you should be prepared to read a lot of papers, and reading them in historical order for a evolving subject like this is probably as good an approach as any - at least if you hope to produce any original ideas, which ought to be a goal of a Doctoral Candidate.

    "Goto Considered Harmful" by Edsger Dijkstra. (You probably want to discard about a million ensuing (X considered Y) papers from Sigplan immediately)

    You might also see what comes up for "Sale AHJ. 'Proposal for extension to Pascal', SIGPLAN Notices, 16, 4, 98-103. " - it might be more focussed.

    Another interesting starting point would be anything by C.A.R Hoare and the papers on Majester Stacks. You should also look at the works of Niklaus Wirth.

    The beginning point for object oriented programming was Simula-67 so references to the original paper on that are another path forward. Ada is another language that was designed with programming methods in mind.

    For applicative (functional) styles, start with Lisp and FP (Floyd Productions I think it stands for) and "Applicative Programming". Two other names to look for are Church and Rosser.

    A lot of language design (but not C++) has been closely tied to ideas about what constitutes "good" programming and the two subjects were closely linked for a long time.

    --
    Squirrel!
  127. Re: Only Hire (russian) women? by Anonymous Coward · · Score: 0

    I believe during the cold war the DoD wasted a ton of money on shoveling ADA on people. This was to prevent the superior mathmeticians and other russian "ivan geeks" from having a chance to continue dominating the field with clean terse code and innovative resource stretching algorithms.

    If you really look at it hard, why is it every program seems to grow by 5 or 10 or 50 megs for every revision?

    Bloatware is a concept that defines modern programming. Because hardware changes so rapidly, and people find enhanced job security in being able to show off something "new" they tend to keep upsizing their code.

    Really though, I've seen some interesting hacks where people were watching divx in 4 color on 8086 machines using assembly and higher level languages.

    A move away from object oriented programming actually could help refocus the field...I mean come on, what WOULD happen exactly if you could update the drivers to windows 3.1's basic graphics/sound/and io bus....It would scream...I mean the entire win 3.1 install was what? 4-6 1.44 meg floppies?

    of course ...I've been feeling nostalgiac lately.

  128. Why is everybody hating on the OP? by crazybilly · · Score: 2, Informative
    I don't get it. Why does everybody hate that as part of his research he would pose a question to the general (programming) public? Can somebody explain to me how that's laziness or poor research?

    Now, if Slashdot is his ONLY source, it's a different story. But I find that rather unlikely. This seems like a pretty good shot in the dark that might yield some interesting leads that he can research further.

    Maybe it's just me, but exploring a wide variety of sources seems like GOOD research rather than poor.

  129. Vista! by cerberusss · · Score: 1

    What design/architecture qualities are shared by all good software?
    Well damnit, I haven't got the faintest clue what you're talking about, but Windows Vista is the answer! Vista, man! VISTA!
    --
    8 of 13 people found this answer helpful. Did you?
  130. Security by Heembo · · Score: 1

    Good software means lacking in bugs, maintainable, modifiable, scalable, etc... Do not forget security. In the web world, you need to abide by the OWASP TOP 10 defense principals http://www.owasp.org/ - it's a very difficult aspect of Code Quality - very few developers have even a clue about what application security is. No university trains developers to write secure code, hence most websites are insecure (XSS, CSRF, Access Control Issues, etc).
    --
    Horns are really just a broken halo.
  131. Short and Known Requirements by Cassini2 · · Score: 1

    Good software means lacking in bugs, maintainable, modifiable, scalable, etc.

    The only way you get software with few bugs that is easy to maintain is if you are developing simple software against known requirements. Unfortunately, almost all the interesting commercial software has unknown software requirements.

    In embedded systems, which often have simple programs, the enemy is unforeseen conditions. What happens to this system in actual use? If the system is always doing the same thing, then the software may have lots of "software engineering" bugs, but in practice has a very low bug count. Alternatively, the inputs could be relatively unknown, things could be constantly changing, and lots of practical problems (bugs) will happen. Bottom line: the real world makes it impossible to predict the environment that embedded software will execute in. This causes lots of problems for an embedded application.

    Leaving the embedded world, you have programs that interact with people. Getting accurate requirements information on them is next to impossible. How are you supposed to write a "bug-free, maintainable, modifiable, and scalable program" when you don't actually know what the program is supposed to do? Many people related applications involve user-interface design, requirements analysis and business processes. Software engineers gradually learn about the intended application through a process of iterative improvement. The constant iterations cause the complexities in software that drive bugs, make code difficult to maintain, create endless modifications, and add scalability as a last minute requirement.

    About the only category of program that is easy to get bug-free is something that is designed to interact with another program, or a program that takes very defined inputs and has very defined outputs. Compilers are often in this category. Even with compilers, there are complexities. Theoretically, you can formally prove a complier correct. In practice, I am just not sure that once software programs become large (like gcc), that it can be proven correct and optimal Formal methods can get stuck on rather complex proofs. For instance, given an idealized computer, one might hope to prove a C compiler generates code as intended. However, this would be an idealized compiler generating code for an idealized computer architecture.

    In the real world, the IA-32 computer architecture is a mess. Intel doesn't even know how all possible instruction sequences should execute. To help solve the problem, Intel created a software model of their own microprocessor, and this model became the Intel internal standard. Intel has not released this model to the general public. Further, if Intel did release it, the formal methods people would likely find obscure bug cases that also exist in silicon. Thus even something obvious like proving a compiler generates correct code, becomes a very difficult when one realizes that the real-world lacks proper mathematical definitions.

    Real-life contains much grey. The greyness drives the software problems.

  132. Simple by dazedNconfuzed · · Score: 1

    What design/architecture qualities are shared by all good software?

    Honesty, clarity, thoroughness.
    Do what needs to be done.

    Bad software cuts corners on those, and suffers accordingly.

    Sounds stupidly simple, but that's really all it is.

    --
    Can we get a "-1 Wrong" moderation option?
  133. Start with motorcycle maintenance by bperkins · · Score: 1

    Then move onto the metaphysics of quality.

    From there the rest is easy.

  134. Same goes for educators by iceperson · · Score: 1

    I'm continuously amazed at the quality of educator that schools hire nowadays.

    Then again, we all know where those who can't "do" end up...

  135. Modularity + Parallelization by Anonymous Coward · · Score: 0

    Componentization is a time-honored tradition in the hardware industry where it has been a huge success for decades. Componentization is the key to reusability. It is based on plug compatibility and makes drag-and-drop software construction possible, thereby openning programming to the masses. The reason that the same has not happened in the software world is that software is inherently sequential whereas hardware is parallel and signal-based. We need to go beyond the Turing ideal of sequential computing and adopt a computing model that is inherently parallel and signal-based. For more info on this topic see Why Software Is Bad and What We Can Do to Fix It. See also Parallel Computing: The End of the Turing Madness, although I would not recommend the latter to Turing worshippers as they might take offence.

  136. Good projects for the DOD by qkslvrwolf · · Score: 1

    Can someone please cite me a DOD software project that doesn't suck? Please? Because I was an air force comm officer for 4 years, and now I'm a Systems Engineering contractor, and I shudder if fear every time I find out I'm going to have to work with a GOTS product. Seriously...these morons couldn't figure out how to update the mouse driver include in GDSS2, saying that it was going to cost them half a million and two spirals to make mouse scroll work on their windows client.

    --
    Or have you only comfort...that stealthy thing that enters the house and guest then becomes host, then master - KG
  137. Re:Depends on the softwares purpose - Design Patte by Anonymous Coward · · Score: 0

    Care to site any studies supporting these claims that design patterns such as MVC and UP objectively improve the quality of software produced by a given number of people in a given amount of time? If not, your opinion, despite your merits, remains only that - otherwise how could we call ourselves scientists?

  138. Anonymous Coward by Anonymous Coward · · Score: 0

    Do some statistical analysis of software projects as part of your research. Here is one way is has been done:

            http://www.enerjy.com/papers.html

  139. Combination of Several Design Principles by tj111 · · Score: 1

    The key to a good software project is the ability to apply several different design principles in the most efficient manner. You want to have a clean code-base that manages memory in the most efficient way. For example, a Singleton Constructor would be ideal for a database connection to prevent accidentally opening multiple database connections and causing things like memory leaks, while things like Interface elements would probably want to be created from a base Factory class, allowing for minimal customizations to describe UI elements. . Also, keep your class interfaces as loosely-coupled as possible. That is, keep only a bare minimum of properties and methods of one class visible to outside classes. When coding, a class or function should never know or rely on the internal workings of another class. . So, good software design principles come down to a good hacker knowing the most efficient method to accomplish his/her goal.

  140. Ha by magikker · · Score: 1

    As a Comp Sci PH.D. student myself, This seems like a really weird way of doing research. Are you going to cite slashdot? I'd love to see that.

  141. I have found that the Unix design philosophy... by pqsass · · Score: 1

    can be applied broadly with great success. See: The Art of Unix Programming by Eric Steven Raymond http://www.catb.org/esr/writings/taoup/html/ch01s06.html

  142. Requirements by Anonymous Coward · · Score: 0

    Clear Unambiguous Testable Requirements.

  143. Good software is written for people, not computers by Anonymous Coward · · Score: 0

    Good software is written for people to read and only incidentally for computers to execute.

    Karl O. Pinc

  144. What an idiot. by Anonymous Coward · · Score: 0

    This is the foundation for your doctoral thesis?

    This is the answer you need:

    Close your books, withdraw from the program, thank your academic advisers, but politely inform them that you are too stupid to be pursuing a PhD.

  145. use a dynamic language ! by Anonymous Coward · · Score: 0

    http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html

  146. Good management is the #1 determining factor by r39525 · · Score: 1

    Good management is the biggest factor in any project, not just software. The management must:
    A. Know what they want and how to measure it.
    B. Know how to hire staff they trust and stand behind them.
    C. Listen more than talk.
    D. Be decisive when needed.
    E. Provide adequate resources.
    F. Encourage the staff to tell the truth and be willing to hear it.

    I've been doing engineering projects for thirty years; both hardware, firmware and software. I've worked on a few projects that were well managed. They all succeeded and were fun. I've worked on many more projects that were managed okay or badly. These did not fare as well and were not much fun.

    In one company the president threatened the programmers with a baseball bat and knocked a hole in a cubicle wall with it. In another incident at the same company the chief engineer threatened to get his cattle prod out of his truck (this is in Texas) and use it on some of the staff.

    Thankfully that company went out of business. Funny thing though ... I think a lot of their problem is they had too much money, not too little. The sales staff kept thinking up new products and selling them without asking engineering if they could even make them, much less by the deliver date they promised to the customer.

  147. ummmmm design patterns? by OshMan · · Score: 1

    I only did a quick look down the replies, so sorry if someone has already mentioned this. But it sounds like you're talking about "Design Patterns". Wikipedia has a post on it and if you Google it you'll get something on the order of 9 million hits. That should get you started anyway.

  148. Not sure such a thing exists.... by Anonymous Coward · · Score: 0

    I'm not sure such a thing as "beautiful code" or "good software" really exists outside of a context (referencing the article the OP posted). It's like saying "tell me about beautiful woodwork". If I'm framing a house, then "beautiful woodwork" is straight studs and solid fasteners. If I'm talking about fine furniture then "beautiful woodwork" is mahogany wood crafted slowly and carefully, usually by hand, and usually by a skilled master. If I'm talking about a dog house, then "beautiful woodwork" is any structure that Fido won't quickly destroy that keeps him cool in the summer and warm in the winter, and has half way straight corners and edges.

    So, the "beauty" or "goodness" of woodworking depends totally on the context. The form / function dichotomy has to be considered when discussing software quality. Is it "beautiful" to build a 3 story dog house with a flat screen TV, toilet, bunk bed, and working plumbing? Probably not (more like excessively extravagant). Is it beautiful to build fine furniture out of MDF with robot labor? It might be fast, and maybe inexpensive, but it's probably not beautiful. So, to some extent I actually disagree with the idea that there are generic principles for beauty in software design, unless you define "beauty" to include some means of establishing context.

    To a large extent that's why we tolerate so-called "bad code". When a house is designed and built, the consequences of poor design or building choices are often obvious (to those skilled in building trades) and often dangerous. If I have walls that cannot handle the load of my roof, the roof sags and might collapse and kill someone. Software is rarely in such an important role... and software that is in that role is usually HEAVILY tested at great expense, and changed very rarely with additional expensive testing. So, generically speaking, the context (in which most software runs) defines "beauty" as including two major drivers: cost and delivery date. If a copy of Windows Vista cost $17,999, came out in 2015, but never had any problems because every single line of code had been reviewed three times by skilled craftspeople, and all rough edges were worked through to completion, would anybody care? Would anybody buy it? Probably not. They'd use whatever Linux had evolved into because it was free, was at least reasonably stable, and had surpassed the functionality of "Windows Vista 2015" back in 2008.

    Over time, core concepts (how to frame a house, how to build a fine quality musical instrument, how to write a kernel) begin to coalesce into a standard way of doing things, where further refinements provide little or no marginal improvement, and begin to be considered detrimental. I would argue that software design simply hasn't been around long enough for that to happen, whereas building construction certainly has. However, certain "saints" of data processing exist out there to help point us in some directions: Knuth, Von Neumann, Turing, Torvalds (couldn't resist)... by studying the writings and code of these folks, we can begin to see areas where things are coalescing or have already coalesced.

    Finally, there's the instability of the platforms themselves that contributes to code "ugliness". Windows and Linux (as we know them today anyway) didn't really exist 20 years ago. Can you imagine what municiple building codes would look like if things like concrete slab construction had been invented only 20 years ago?

    So, coupled with the "context" problem, the "coalescing" problem, and the general state of operating system platforms themselves, I'm not sure such a thing exists (yet) as "beautiful code." Things are all still in a state of relative chaos, and cost is likely to remain king in most software design for a long time.

  149. Each enviroment by geekoid · · Score: 1

    needs it's own methods.
    The most basic techniques would be using small readable chunks of code, as well as getting sign of of the features.

    BUt good comes in many forms.
    I oeice of crappy code that gets the job done now can be far more valuable to an organization then spending 8 months laying out every possible scenerio. SO to the organization the get it down now is 'good'.

    Water fall methodoligy a poor one that fails in practicality most of the time.
    This is because managment wnats to push an application out the door the moment they hear the code has been written, even thought here should be several more runs and refinements.

    Using a method that you completly design up front is likely to go out with fewer bugs because they have been worked through, so when managemnt pushed to go out before proper QA, your odds of success are highr.

    If tyou want ONE(1) common reason for all good software, it would ahve to be disciplen.

    The fact that you consider Agile or OO not good examples of methodologies makes me thing you aren't qualified to be doing this.

    For the record, Agile and OO aren't for the same thing. You can do Agile with OO.

    Are you sure you should be doing this?

    --
    The Kruger Dunning explains most post on /. http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
  150. Architects - any real ones here? by wytcld · · Score: 1

    Forget software. Are there principles to good architecture? Please don't answer the question in terms of bamboo, wood, steel, straw or bricks. Name the principles that apply to all buildings, everywhere, in any climate, for any use.

    Now, for those with deep software-crafting experience: Is architecture even an accurate metaphor here? Code is, after all, something you write. Yet are there principles to good poetry architecture? Maybe you like iambic pentameter; yet plenty of excellent poetry has no meter at all. Should we ask how good an architect James Joyce was?

    Or are we in a "writing about music is like dancing about architecture" zone? Is architecture a completely different art, with not much to suggest to coders, even metaphorically?

    Would agriculture be a better metaphoric soil? Do we grow good code? How about hunting? How does one shoot for the perfect algorithm? The principles of the best software creation may be quite different from what the architectural metaphor suggests. Even so, some architects believe form should follow function. Yet if we try to program in an "architecturally" correct way, we're expecting function to follow form. That's sort of a Turing machine thing: that some form should be universal, capable of all functions. Even so, are the best programs all general purpose machines? Hardly.

    --
    "with their freedom lost all virtue lose" - Milton
    1. Re:Architects - any real ones here? by Anonymous Coward · · Score: 0

      Excellent point. Maybe the question itself is wrong.

      Maybe we're still in the weeds, and using metaphors like "architecture" really just misleads us into (mis)applying things that don't really apply to our craft. Wow, don't tell all those high paid IBM consultants that....

  151. how to measure programming "goodness" by goffster · · Score: 1

    Here is an a good graduate studies problem:

    Pit several software teams against each other.
    Instruct one team to use one set of methods.
    Instruct another team to use another set of methods.
    Each team is given a time budget.

    Give them each a unit test framework.
    Their project is not complete until it passes.
    Now, change requirements, and do it all over again,
    several times.

    the method showing consistently lower overall cost
    might be considered "better" than others with
    higer costs.

  152. You're asking the wrong question... by Anonymous Coward · · Score: 0

    The best design principle is that you should code for re-use and never forget to code for the failure paths. You can't call software "working" unless it can deal correctly with failure conditions.

    Coding for reuse generally means that one should be able to use a piece of software without understanding its internals (it's a black box). That requires good documentation, a clean and clear interface and clean understanding how it should be integrated.

    To be honest, your question is wrong. Commercial code too often lacks experienced engineers that understand that design, information analysis and architecture is the most important step in the process (and not coding the project). So good code is derived from those projects that were granted sufficient time for design, evaluation and architecture, done in such a way that it has been given the right foundation for evolution.

  153. Problem vs solution space by jdhenshaw · · Score: 1
    Good software design is like good design in general: it maps the problem space to the solution space in a way which appears natural, given the right concepts presented in a specific context. I think that most of the advice you'll receive here will focus for the most part on techniques, not concepts, so I urge you to think about frameworks that group the techniques. Another word for this is architecture.

    In my experience, most software is 95% glue and 5% wood. (i.e. 95% interfaces, and 5% algorithms). So suggestions such as modularity, encapsulation, information hiding, class hierarchies and so on are useful, as they serve to help us with the glue.

    Good luck with your thesis. You might get more use from others if you ask them, not for solutions to your problem, but rather as for a characterization of the class of problems associated with software design itself.

  154. Re: Only Hire (russian) women? by Shadow+Wrought · · Score: 1
    of course ...I've been feeling nostalgiac lately.

    I totally understand. In college (early 90's) I had an Amiga 1200 that could do more than my roomates Mac- with only a fraction of the resources. I think the biggest factor in bloatware is simply the speed with which people want projects done. If it "Just Works" then there is no longer a business reason to go back and make it work better, even if it would make for better code. Even a savings in speed may or may not be worth it, especially if the difference is only a handful of seconds.

    --
    If brevity is the soul of wit, then how does one explain Twitter?
  155. Em-pa-thy by crash.killer · · Score: 1

    Process, testing, documentation... all necessary disciplines, but they only provide a framework to help prevent the writing of bad software. Software is written once, read many times and used many more. Writing good software is about empathy. Empathy for the reader of software. Empathy for the user of software. I'm sorry... software isn't about computers, its about the humans that use them.

  156. what is 'good software'? by poot_rootbeer · · Score: 1

    "Good software means lacking in bugs, maintainable, modifiable, scalable, etc..."

    I disagree with all but the first one.

    Software is a tool. A hammer is a tool, too, but we don't expect it to be maintainable, modifiable, or scalable. There are different kinds of hammers for different tasks, just as there are different kinds of software. Yet we do expect a good hammer to be lacking in bugs: a design flaw that makes the hammerhead splinter into jagged shards upon impact would be considered unacceptable.

    I would say that Good Software is that which has reliable behavior, and is well suited to its intended task. That's all.

  157. Weak thesis by Anonymous Coward · · Score: 0

    This is a weak thesis, since it does not contain a shred of scientific principle. Where is your hypothesis? I don't see that anything in your text is testable. Asking for opinions on Slashdot is cool and all...but _I_ certainly wouldn't want to go before a dissertation committee armed with only opinions!

  158. there is no good design, only good implementation by petes_PoV · · Score: 1
    Any design method or technique can result in a good product.

    All it needs is the tried and trusted combination of

    • talented workers
    • experienced managers
    • clear vision
    • sufficient time and budget
    Without these features you will not get top grade product, no matter what development methodologies you use. If you do have these factors in your favour, the methodology, tools or standards won't matter.
    --
    politicians are like babies' nappies: they should both be changed regularly and for the same reasons
  159. Good? 1000-person teams for DoD projects? by Anonymous Coward · · Score: 0
    1000-person teams for DoD projects don't write good software. They write software that adheres to requirements. No more, no less.

    Having worked in an environment like that for more than a few years, I'll say that it is oppressive. You hardly ever see your code run and have to trust interface testing to prove you did what you were supposed to do. Not very fulfilling.

    OTOH, I also worked on the space shuttle flight software for 5 years. I still get joy from watching every landing - knowing my code is controlling both the elevons and nose wheel steering. I'll have that job satisfaction and KNOW that was the code with the least number of bugs of any project I've ever worked on ... adhering to the requirements.

    Oh, for an out of date reference that still applies - http://findarticles.com/p/articles/mi_m0ISJ/is_n1_v33/ai_15103437

    employees were empowered to stop the "software assembly line," if quality issues arose. This was completely true when I was there.

  160. The basics by kent.dickey · · Score: 1

    Language, environment, or any buzzword from the last 20 years don't make or break a project (although they certainly can be the proverbial straw that breaks the camel's back).

    The development team needs to be as small as possible. If it's more than about 10, it needs to have technical leaders who own areas with team(s) under them. A good seasoned architect (or two) should lead the project. You cannot have 3 (or more) co-leads, they will have trouble agreeing and may fracture the project. A hierarchy tends to work best, with clear ownership.

    Balance leadership with team experience--plan on the leads doing mostly mentoring if the rest of the team is inexperienced.

    There needs to be more effort in the schedule working on testing then on development. If developers write tests, try to have them not own testing their own code.

    Integrate often, and set up processes so that it is more work for developers to do "the wrong thing" than the right thing. Examples: make it more work for developers if they check in code which doesn't compile (immediately eject their code, adopt other penalties as you see fit); reduce overhead as much as possible when developers are following the right processes; automate builds and releases.

    Reward the testing team for finding bugs. Reward the development team for quickly fixing bugs. Plan on a lot of bugs. Use a bug tracker. Don't let bugs get old.

    The most successful teams are usually doing something similar to what the technical leads have done before (so the problem is well understood), following known methods. Limit new major risk areas to 2, maybe 3. (E.g., switching to a new language or platform which no one has experience on would be one new major risk; going from unthreaded to a high-thread-count design would be another; using a new buzzword-compliant tool/strategy would be another; etc.). Try to have realistic fallback plans for at least one risk, or carefully watch any risk without a fallback plan.

    The above pretty much are true of any successful engineering group.

  161. helpful links. by mapleneckblues · · Score: 1

    1. http://citeseer.ist.psu.edu/
    2. If you have an ACM membership:
    http://portal.acm.org/portal.cfm
    3. If your university gives you access to engineering village:
    http://www.engineeringvillage2.org/controller/servlet/Controller
    IEEE transactions on software engineering
    4. http://csdl2.computer.org/persagen/DLPublication.jsp?pubtype=t&acronym=ts
    5. Google:
    http://www.google.com/
    Beyond this, its upto you to do your own research.

  162. The area most neglected by spaceman375 · · Score: 1

    is Humor. You know that someone, most likely not you, will have to read your code at some point. Others have spoken about documentation and readability, but even coders are human. Put a joke or three in there. How long a variable name is in the source code doesn't affect the size or speed of the compiled binary. If you only need that variable once or twice, make it funny. Better yet, tell a short story or quote a movie. Some of my personal examples: When I opened the employee file for a payroll application, I used the filehandle "the.downtrodden.masses." One of my favorites was when I assigned a few variables ahead of time and was able to write (and use) open(the.pod.bay.doors, please.HAL) else print Im.sorry.Dave.I.cant.do.that Contributing to a happy workplace is essential to good code!

    --
    On the one hand you take life too seriously, and on the other, you do not take playful existence seriously enough. Seth
  163. Re:Depends on the softwares purpose - Design Patte by anomalous+cohort · · Score: 1

    Another aspect might be the method in which the actual programming is planned and controlled during implementation.

    Quite right. This page contains links to pages that may of interest.

  164. Perhaps I am being disrespectful by l0ungeb0y · · Score: 1

    But wouldn't "PhD research" in Software Design be akin to PhD research in modern art principals? While I am sure you can point out some useful information to the executive set and the novice, I suspect this might never exist in the real world.

    Taking the time constraints of most projects coupled with the established "bad manners" of any given development team and their own entrenched "best practices" and design patterns, will your findings make any real impact on practical development?

    I would suspect that unless you were given carte blanche and an iron fist to rule with, you would find the vast majority of your ideals flying out the window when put to a real life development cycle.

  165. faulty foundations by fuliginous · · Score: 1

    You have already assumed that there are principles common to all good software and that those that are remain so without the context in which they formed.

    Neither should be assumed.

  166. Like a book by lymond01 · · Score: 1

    Good code could be like a good novel. Certain characteristics are shared between all good novels: compelling story, strong characters, good flow, and interesting dialogue.

    Good code is more like a documentary. Purposeful, segmented for easy understanding, comprehensible to the lay person.

    No spaghetti; modular; well commented.

    The rest makes the difference between fair, good, and great programmers.

  167. "How to Design Programs" book is free online by Khopesh · · Score: 1

    The book How to Design Programs specializes in this topic. It is available for free online, it was written by a programming languages specialist at Northeastern University (a 30 minute T ride from Tufts) and published at MIT (a 15 minute T ride from Tufts).

    Yes, it's very academic in nature -- it uses Scheme as its base language (well, a very simplified/gimped Scheme) under the premise that it's not your standard procedural language (so you won't fall into old habits) yet it is easy to pick up and learn the fundamentals of programming rather than the specifics of a useless language (e.g. whatever language-of-the-day is liked by industry).

    I'm sure there are several research papers tied to the book, and I'm also sure that Matthias Felleisen (its author, trustee professor at Northeastern University) would be happy to sit down and talk to you about it.

    --
    Use my userscript to add story images to Slashdot. There's no going back.
  168. "Enough" by Viking+Coder · · Score: 1

    I read an interesting article about how it's impossible to write a max (as in, which of these two values is the maximum) function in C++ that simultaneously satisfies a list of seemingly reasonable requirements. Hell if I can find the dang thing, but it was a good article.

    My point is that we write programs to express the way to solve problems, and for even the simplest of problems, there's a lot of debate about the best way to do it.

    So, what are the attributes of the best software? It's good enough, it's readable enough, and it's easy enough to modify. (Also, it's fast enough, but too many people worry too much about that one.)

    --
    Education is the silver bullet.
  169. The most important pattern of all... security by ajv · · Score: 1

    You should research software security in the agile setting.

    The primary thing missing from today's software is safety, accountability, robustness, and resilience. Modern software is disgustingly weak when it comes to meeting core non-functional requirements.

    The agile mindset - deliberately - has no place for non-functional requirements, and in fact often calls them "constraints".

    This is exactly like saying the engineers who designed Tacoma Narrows bridge built a successful bridge. Which fell down in moderate winds due to harmonics brought on by winds not unusual for the site. Therefore, designing bridges after then to take into account seismic activity, load, winds and harmonics - truly non-functional elements - are "constraints" !!

    Security is not a constraint - it's an enabler that allows secure business. Imagine if the user stories for Amazon went like this:

    Allow an anonymous buyer to add an item to their cart (this is true today)
    Allow a buyer to checkout their cart by obtaining their address
    Ship item(s) to that address

    Amazon would be out of business in a matter of hours. A solid security architecture is a fundamental requirement, and in fact, the ONLY requirement shared by ALL applications.

    --
    Andrew van der Stock
  170. Code Complete by ghostlibrary · · Score: 1

    Read 'Code Complete', by Steve Mcconnell. Then tell your advisor that you just found this great new book (that's been in print for 15 years and happens to be part of most good undergraduate CS programs.) And yes, you should have read it already-- part of getting a PhD is problem solving, and part of that is actually looking up the relevant works in the field _before_ asking your neighbors "hey, how do I do this?" There'a fancy place called a 'library' at most schools that also can come in handy.

    And if you answer that "Oh, I've already read it", remember that part of writing a good research question is mentioning the research you've done before, so you lose points for not citing it in your query. So either way, you're one point down. Why are you still reading this, instead of 'Code Complete'? I'm not your advisor, you don't have to listen to my rants! Get back to work! Geeze, students today, they expect everything handed to them. Why, in my day... (voice trails as sleep descends...)

    --
    A.
  171. Apple Human Interface Guidelines by bgspence · · Score: 1

    If you are creating software intended to be used by Humans, you need to consider designing interfaces which work well with them. Apple's Apple Human Interface Guidelines remain remarkably unchanged from the first days of the Macintosh. Here is the basic bullet point topic list.

    http://developer.apple.com/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGHIDesign/chapter_5_section_2.html#//apple_ref/doc/uid/TP30000353-TPXREF130

    Metaphors
    Reflect the User's Mental Model
    Explicit and Implied Actions
    Direct Manipulation
    User Control
    Feedback and Communication
    Consistency
    WYSIWYG (What You See Is What You Get)
    Forgiveness
    Perceived Stability
    Aesthetic Integrity
    Modelessness
    Managing Complexity in Your Software

  172. There really only one principle by hey! · · Score: 1

    The single, fundamental software design principle that underlies every other one is this: every decision should ideally be implemented in one place, or as close to one place as possible.

    That's why good programmers often like terse languages. Terseness often makes things difficult to read, but it makes repetition and dependencies stick out like a sore thumb.

    Sometimes the principle is referred to as DRY -- Don't Repeat Yourself, but in fact it's even more fundamental than that. Repeating yourself is lazy, but sometimes you doom yourself to future repetitions before you've begun repeating.

    This explains why the initial versions of J2EE were bad. Too much ink was spilled over the amount of configuration and bookkeeping style programming forced on programmers. Some people rightly pointed out that it's really not that much to learn your way around these things, given what J2EE tries to do for you. But the real issue was the way that the decision to use the framework extruded itself into so many places, which was symptomatic of a faulty design. When Spring came along, the people who hated J2EE because of all the configuration took to it, even though Spring requires its own configuration files. The difference was a given decision clearly belonged in one and only one place: in the code or in the deployment configuration. Spring freed you, once more, to concentrate on one problem at a time.

    Good design is a pleasure to work with for this reason, because it presents you with well contained problems to solve. Bad design is tedious to work with, because you must adjust your approach to each problem to so many prior "solutions".

    Aside from that, I wonder if there is really that much practical value in researching new design principles. There's some value of course, but the worst perpetrator of bad designs is not bad design theories (which do exist), but bad organizations. You'd really need to work with a sociologist or anthropologist to describe why nearly everyone does less good design than they're capable of.

    --
    Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
  173. build on? by speedtux · · Score: 1

    I don't see much potential for building a good Ph.D. thesis on that kind of fluff piece.

    As a practical matter, getting a Ph.D. in software engineering or software design may be a good academic choice. It's a bit like getting a Ph.D. in art history or sociology, in that there there is a wide variety of approaches and no clear right/wrong; and if your math and science is a little weak, it doesn't matter. Unlike art history, with a Ph.D. in software engineering, you will have good employment prospects.

    Still, as a Ph.D. choice, that kind of topic never made much sense to me. If your heart is in software development, you're better off just working as a software developer. And if your heart is with academia, then there are better and more interesting academic subjects.

  174. Keep it Simple by sheetzam · · Score: 1

    Maintainable code is code that isn't tricky, doesn't use every piece of the language just cause you can, and isn't written to showcase how clever you are. You don't know the skill of the person following you, so keep it straightforward.

    --
    "Actually, I enjoyed this in the same vague, horrible way I enjoyed the A-Team" P. Opus
  175. "Understandability" by Anonymous Coward · · Score: 0

    The most important single thing about good code is that the source is easy to understand, because every other thing you do with it (fix bugs, improve performance, add features, add test cases, document it, etc.) hinges on your ability to understand the darn thing and then modify it.

    So if I were you, I would rephrase the question as, "What sort of source code is easy or difficult for a human to understand?" This sounds much easier to design experiments around than the more open-ended original question.

  176. This is computer science, not philosophy by Yogs · · Score: 1

    You really, really, really have to narrow your question down or the whole thing is transparently a load of BS.

    There's good practical advice out there, some on this thread, much more in the books referenced... but extracting advice from uncorrelated sources does not make for a phd or even necessarily anything particularly useful, because some advice applies best in some situations, and other, possibly conflicting advice applies best in other situations.

  177. Things not to do by 1+a+bee · · Score: 1

    Here's are some themes of things to avoid..

    • Avoid duplication. Duplication, whether found in the constants of a program, snippets of code, whatever, is the enemy of good design. Duplication is mitigated by centralization (e.g. #define).
    • Avoid information sharing. When a piece of code needs to know about how a lot of other code is structured and works, that piece of code shares information with a lot of other parts of the code. That makes the overall code brittle and unmaintainable. Information sharing is mitigated by such techniques as layering, modularization, and separation of concerns.
    • Avoid complexity. The process of making code and architecture better (e.g. refactoring) involves simplifying complexity. But beware: number of lines of code is a poor measure of complexity.
    • Don't reinvent.
  178. Coherent requirements by cat_jesus · · Score: 1

    A good business analyst is worth their weight in gold in a large project. Determining what the relevant requirements are, in a form that both the user community and the programming staff understand is the most important piece of a software project as far as I'm concerned. I've only had a little over 20 years experience but this seems to be the deciding factor for all the projects I've participated in. Not only that but when the BA makes the users sign off on the requirements, you have a reference to go back to when the users try to claim that something wasn't coded the way they wanted it. It sounds petty but it's amazing how often users will try to add features to a project by claiming something was forgotten or coded incorrectly.

    Also heavy use of environmental variables makes maintenance and code migration so easy that it's something you don't even think about... until you don't have it anymore. I started in shops where environmental variables were *always* used and didn't realize how great it was until I went to another shop that recoded everything that went into prod and the drop in productivity is astounding. I never had a failed implementation until I went to a sloppy shop.

    Document in the code. Always. Even if you have robust documentation, document in the code. I have praised and cursed many programmers whose code I ad to support based mainly on this criteria.

  179. Obvious? by Coppit · · Score: 1

    I wasn't going to comment because I thought it was obvious, but it looks like most people are answering some other question than the one you asked... You asked about design principles and people are giving you process answers. (Hm... but then you muddled things with XP as a non-example.)

    I would start with Parnas. His papers on principles of modularity are the foundation for OOP. Keywords to search for on: coupling/cohesion, cross-cutting concerns, stable interfaces, encapsulation, fan-in and fan-out, architecture, frameworks.

    A meta-point though is that software design is a huge area. You need to get much more narrow. Your advisor should provide guidance on how broad to start, how quickly to narrow, and what path to take to get there.

  180. Loose couplings - strong bindings by Anonymous Coward · · Score: 0

    Universal and eternal software design and programming quality criteria from Structured Programming's time even older than Yourdon's Structured Analysis and Design from the 70s.

    Loose couplings (externally) - Different components/modules/methods/functions/whatever should be loosely coupled with well-defined, relatively simple input and output data structures. One module should not know the inner workings and data structures of another module.

    Strong bindings (internally) - Internally all program code in each component/module/method/function/whatever should be directly related to one task and one task only. Different tasks should be split into different components/modules/methods/functions/whatever. Different input parameters should not trigger different functionality (except for "controllers" which only determine which other components/modules/methods/functions/whatever to run depending on the input parameters.

    There were different classifications of bindings and couplings but unfortunately I do not have these or any old book references at hand.

  181. Go Back to Basic Principals by Anonymous Coward · · Score: 0

    Loose coupling, strong cohesion.

    From that axiom you can derive all other design criteria. E.g encapsulation, information hiding, abstractions, patterns, ...

  182. Never hire a PhD by Anonymous Coward · · Score: 0

    The key to quality software is to never hire a PhD in software engineering from Tufts University, because whatever part of the project you give them, they'll just post something to Slashdot asking people to figure it out for them.

  183. Re:Advice from another Computer Science Phd Studen by Anonymous+Brave+Guy · · Score: 1

    Man, you obviously have no idea. One of the critical skills is to choose the right tools for the right job.

    [Sings] We're gonna need a montage!

    --
    If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
  184. Solution by Anonymous Coward · · Score: 0

    I would suggest that you have a look at Basili's GQM-Method and develop a overall quality model for software design. Then select a appropriate number of projects. And then answer the metrics.

    As a result you get projects divided into "good" and "bad" projects. Then you can extract their design structure and voila you have your "good" software design pattern.

    I hope this is not your whole PhD thesis. As this could easily answered in a 6 month master thesis.

  185. nobody's against research on /. by Anonymous Coward · · Score: 0

    we're against the idea that /. can contribute anything meaningful to a doctorate thesis, unless we're talking about a degree in some social engineering field.

    A doctorate is the attempt to establish oneself into uppermost levels of a given field, into the most respected and generative sphere of that field. The submitter should be thanking everyone who points out the folly of starting a doctorate research by asking /.

    You're welcome, future expert.

  186. My Laundry list by maraist · · Score: 1

    General rules:
    1) Unrelated code should not be capable of interfering with each other (liberal use of unique package-name-spaces)

    2) Load order should not affect the outcome of the application (php/jsp/javascript include-files)

    3) Transient data should naturally expire (block-scope or ref-counting or garbage-collection)

    4) Side effect programming should be avoidable.

    5) Where possible, data should be immuteable (a specialization of item 4)

    6) Where possible, code should reflect hierarchical abstractions, where the least amount of information is needed to follow or use a code snippet (this encompases data-hiding, procedures/functions with minimal input parameters, function-names / variable-names that naturally match the intended execution).

    7) Code (the language) should be expressive and concise. You should be able to do a powerful thing with a few lines of code. A regular expression, a SQL statement, a lex/flex BNF-form expression, a prolog-rule. These are well-thought-out highly capable and flexible sub-languages. To whatever degree your code can leverage multiple languages (presumably by leveraging libraries that interpret syntax differently at different sections of your code), your code will have fewer bugs, be easier to make small changes that have radically different outcomes, and be easier to read - At the expense of more training time for new coders.

    8) A language should be a building block, such that coders do not need to start from scratch - but instead search for the module/capability, and instead of coding, you are 'wiring' the 3'rd party library to act as you intend. This is as much a social issue as a language issue. If a language has a single repository / standard, it's easier for this social dynamic to occur. If, like C, most vendors do not play well with one another, you will be hard pressed to expand on a repurposeable building block.

    9) Code should lend itself to run-time analysis. Debugable, steppable, stack-traceable, efficient and run-time configureable log-file emmission (log4j and friends is a nice framework), live thread-execution analysis (with little or no obstruction), memory allocation analysis (histograms of data-types, both count and size).

    10) Code should be unit-testable. This isn't as easy as it sounds.. This means all references to dates and other OS resources need to be abstracted such that a unit-test can mock an OS resource. This also means the setup of a code resource (beit a class instance or the setup of global variables (ick)) should be sufficiently simple that the unit-test does not need to test the configuration aspect of the code; just the code itself. Note that unit tests don't necessarily need to have 100% code-coverage (as many philosophies dictate), BUT when there is a production-environment issue that needs resolution, the ability to divide-and-conquer the problem by QUICKLY throwing together specific unit-tests is indescribably valuable. Code that is not designed with the idea that it MIGHT be unit-tested is almost impossible to do this with. Languages that facilitate unit-testing are also invaluable.

    11) Naming conventions should be consistent within a project.. And ideally across the language. XXImpl, XXBean, xx getXxx(), setXxx(xx), XXFactory, XXAdaptor, XXReader, XXWriter, XXController, XXDAO, etc, reduces the learning curve for any API.

    12) Inputs and Outputs of any function/procedure must be absolutely clear.. If you're sadly using a language that requires 30 input parameters for a procedure/function, and the language doesn't have sensible defaulting capabilities (overloading or default field parameters) then A) shoot-yourself B) write an adaptor which minimizes the inputs. Create XXAdaptor adaptor code with setXX(x) and xx run(); that uses appropriate/sensible defaults.. This should work for most any language.

    13) Reduce the impedance mismatch between unrelated code. A standard imposed by the language (InputStream, OutputStream, Runnable, Method, Reader, Writer, Co

    --
    -Michael
  187. Lemme get this straight by Anonymous Coward · · Score: 0

    You've spent x years as an undergrad, y years doing post grad and NOW you want US to tell YOU how to design software for your PhD? Go and start doing something useful with your life. WRITE CODE.

  188. Good software design is done by: by Anonymous Coward · · Score: 0

    People that care... Tools and Language are very unimportant in producing good software.

    Caring is defined as: Fewer lines are better and clearer. If you are cutting and pasting a lot (duplicating code), then you are doing it wrong. Parameterize and remove duplication. Minimize the definitions while keeping the functionality.

    Take (or be given) the extra time to make a pass at just cleaning up duplication.

    Decide if a variable is a locally used item or globally used item and declare it accordingly.. Change your definitions to match reality as the software develops.

    If your team gets this, then you will end up with good software... If your team does not, then you will get working software, but it will be slow/inefficient and hard to maintain.

    People who are logical and desire simplicity are the key.

  189. here's my two cents by fred+fleenblat · · Score: 1

    >> I am looking for general design principles.

    Clearly people are more frustrated with being overridden by management than they are with design issues. I can't fault them for that, for I know of which they speak.

    Leaving that issue aside, here are some of my personal design principles, no particular order:

    * push for written project specifications. if nobody can be bothered to write down exactly what they expect the software to do, then it's extremely unproductive to proceed any further. i don't mean low productivity, I mean negative. if you don't have a spec, anything you do may have to be undone at some point in the future.

    * make an effort to understand the problem space. i usually don't go out and talk to experts or take courses, I just pick up a well-regarded reference book to get a good grounding in what kinds of things are going on for the people who are going to use the software. then when someone asks me a question about the design or the code, I don't have to answer them with a nerdy coder answer... I can either point to the specific area of the problem space that's at issue, or at the very least make a metaphor that they'll understand. on rare and shining moments, a knowledgeable user can have some surprisingly useful insight. do not let this go to waste.

    * write code such that every layer is a useful API. Module A uses module B which is a subclass of C etc, okay fine things can get complicated, but there should be a .h for each .cpp (or as appropriate for other languages) and the .h's each should individually represent a re-useable, unit-testable module that accomplishes a distinct goal in the overall project. Other modules must use the published interface to get things done (no hidden APIs, little or no "friend" access).

    * Every piece of code should be a model for others to follow. You should be able to look at some minor code that converts strings to uppercase, and say to yourself, that's exactly the best way to do that, and immediately see how you could extend or re-use it to say, convert to lowercase, or make it understand UTF.

    * Be object oriented if you wish, but don't abuse the class hierarchy. Specious subclassing is a rampant problem, and debugging stuff that has multiple superclasses and/or a surprising link in its chain of superclasses is a nightmare.

    * regardless of OO-ness, the code should be well balanced in terms of calling other functions to get things done vs. just doing it right there. Hard to give a guideline beyond that, but it's pretty clear something is questionable when someone is using an SQL statement to get the current date or using system("sort") instead of qsort.

    * don't just write a bunch of code and hope it sticks together, make clearly defined areas like basic data type tools, enabling technologies, glue or wrapper code, metadata management, plug-ins, client/server tools, business rules, report generators, auditing. Some stuff (security, performance) is transcendent and needs to be brought up over and over, but once you get linked-lists working you should be able to use that without any further drama. as the project proceeds, having things divided up makes it clear where the enhancements and new features need to go, and since all the knowledge of that area is embodied in one place the change can be integrated into the existing code neatly and fully.

    * abstraction, symmetry, factoring, normalization, whatever is appropriate for the project. in multi-person projects things can get chaotic very quickly. somebody needs to be on the lookout to make sure that various APIs, tools, objects, tables, that you've worked so hard to maintain in the correct modules actually fit together in a way that works well overall. I personally have kind of a twisted view where I look at function parameters as if they were rows in a table and ponder whether the function would be more apt if it referred to a column, a row, or a view instead of what was naively

  190. Good Software Design by Anonymous Coward · · Score: 0

    There are two problems here:

    1. There is, because the subject is very young, very little real design practice, time tested, to rely on. Almost all quote 'advances' are really just snake oil.

    2. It turns out that good programmers can write quality software 30-80 times better and more quickly than the average guy, which occurs in no other human endevour, and dosnt seem to be teachable and is 1% of the population ...

    This is a very hard area, but hint it scales with human numbers and can easily be lost during formal education ...

    So EU + USA must isolate, educate and cosset these guys ... think India + China population
    so you don't need to be a Harvard MBA with a pre-schooler's understanding of statistics to understand that the USA has a huge problem due to "no Child left behind" mentality.

    You need to deal with the brightest, most able
    and best otherwise you wont have the tax dollars

  191. Easy by randomlynamedguy · · Score: 1

    I was beaten repeatedly after school for continually using goto's, or maybe that was something else ..it's all a blur, actually. What was the question?

  192. You came to the right place by mrroot · · Score: 1

    First of all, like you said, using OO and Extreme Programming will be critical to designing good software. Also, shoot for a nice SOA architecture and use Ruby on Rails if possible. For the UI, use AJAX because if the browser never has to post back, the end users really like that. Store all of your data using XML, because its self-describing. Split your classes up into several tiers and make sure you have a tier called the Facade, that one is the most critical, plus it sounds really cool when you say it... Facade.

    Finally, I read this book one time called the "Magical Man Month" (I think) that said no matter how far behind a project gets, you can always catch up by adding more developers to the project. So just remember that if the project starts to slip away.

    Best of luck with your PhD, and let us know how it goes!

    --
    I Heart Sorting Networks
  193. Find Mel annd ask him. by techno-vampire · · Score: 1

    If you really want to find out how to make programs as efficient as possible, read The Story of Mel. I've never heard of anybody who could optimize code so well. Find out if he's still alive, and if so, ask him your questions.

    --
    Good, inexpensive web hosting
  194. Software Engineering study published in ACM Journl by David+W.+White · · Score: 1

    I read a set of articles in the November 2007 Journal of the ACM that seem to address the questions you ask. In the section on "experimental algorithms" a study was published on the software design principles e.g. at NASA that led to successful software for the agency (people factors), while other articles in the section looked at how asymptoctic analysis could lead to more effecient software (software design factors).

    I read a printed copy of the publication but I guess it might also be available online.

    DW White

  195. The most general design principle by 5pp000 · · Score: 1

    Minimize entropy.

    It sounds facetious, and it's certainly not simple to apply, but it's ultimately the one we always come back to.

    --
    Your god may be dead, but mine aren't!
  196. A better answer by Anonymous Coward · · Score: 0

    Normally I don't post here, but I was less than impressed with the answers given here. Of course, I don't have a perfect answer either, but I'll tell you about some things that seem to help.

    Far and away the most important thing about software (source) is that people need to understand it. Programmers can make code easier to understand with the following techniques:
    * Use consistent style. If you ever break style, have a good reason and highlight it.
    * Use line ordering and whitespace sparingly to highlight similarities and differences between lines of code. Group similar lines together, and leave oddball lines ungrouped, or grouped with other oddball lines.
    * Keep functions/objects small and coherent. Coherent is more important than small. No not permit side effects. Ideally a programmer should be able to read the name of a function/object and understand what it does (also, what it's supposed to do).
    * Make well defined concepts that naturally break down a problem.
    * As far as possible, give functional areas to individuals to own. Ownership is incredibly important, even in professional software development. Unowned code will be bad code, because anyone will hack it, and nobody will clean it up. Furthermore, the owner will be your expert on that code.
    * Use interfaces between functional areas. Do not allow deep penetration between functional areas unless you're desperate for performance gains. Interfaces can be changed (relatively) easily, but if external code knows details about internal data structures and algorithms, it becomes very difficult to change code.

    Some other ideas:
    * Strongly consider moving common code into helper 'objects'. These objects can be used, tested, and even optimized much better than dozens of instances of similar code.
    * Let the compiler/environment help you. Write code that allows the c/e to show you mistakes, and as far as possible, do your work for you.
    * If you have more developers than natural functional areas, either assign area leads with a small team, or assign (senior) developers to global concepts multi-threading performance. In the latter case, ensure that developers communicate, or previously owned areas will become a dumping ground!
    * Adapt to the situation. Don't be afraid to change things. Don't be afraid to break 'rules', if you understand the consequences.

    I hope this helps. Looking at the highly ranked comments in this story is frightening, honestly. Unit tests? Frequent releases? Documentation as the most important element in a project? Paying customers? Those items can be very important, *in some situations* *on some projects*. The advice I've given is all relevant for any[1] project with more than one person, and mostly relevant to single developer projects as well. In fact, the only good bit of advice I see from a Score:5 comment is requirement gathering, and even that isn't universal (yes, it really isn't).

    You may notice that the advice I've given is vague. That's intentional. Developers need to apply these 'rules' as appropriate given the project and situation.

    [1] Projects with less than 500 lines of code can easily break all of these rules and still be acceptable. Projects that small can do almost anything and still be comprehensible.

  197. Model Concepts and not Procedures by KidSock · · Score: 1

    I have a mantra that I follow that has served me well over the years. It's somewhat abstract but it goes something like this: Model the concept of what your software is doing and not the physical world or procedures. If you model a concept correctly, the result will be equally useful 10 years from now because a concept, in the most abstract sense of the word, does not change over time. Modeling a concept as it pertains to software ultimately means designing an API.

    [I can hear people sarcastically saying "So what you're saying is that if you do it right it will be right - whatever dude."]

    Let's say you do an analysis of a task that your software is supposed to perform and you identify parts X, Y and Z. Most people are compelled to simply write some code that does X and then some more that does Y and then a bit that does Z. But I would stop and ask myself "What is X, what's it's relationship to Y and do I really need Z at all?".

    If you philosophize over the task enough you should begin to identify patterns. Those patters outline the concepts involved in the task. Those patterns and concepts dictate the API.

    The purpose of all of this is of course normalization. As you develop a tool-chest of modules and libraries that implement each concept the end result is highly normalized code. The chances of running into a problem that transcends the codebase is greatly decreased and the flexibility of the codebase is greatly increased. If you do encounter a problem it is more likely to be isolated and therefore easily replaced. That is what makes good software.

  198. What all good software has in common.. by tagattack · · Score: 1

    The single greatest attribute to good software is that the group or individual responsible for it both really wanted to write the software, and really wanted it to work well. This is typically attributed, not to much of a surprise, by the ego of the individual or collective ego of the group responsible.

    The things that makes software good, in my opinion, is having created a program that performs a collection of tasks which solve the problem for which the program was intended, and doing it without unexpected errors and within the parameters of it's environment. This means web software that scales to load, desktop software which doesn't -- but scales to features, and software that in general...works. No stack traces (except in a log, maybe) and no null pointer exceptions, and naturally no segfaults.

    One thing java programmers should learn is to treat NPEs like they are segfaults -- because, if this wasn't java, they would be.

    All of the best programs, never mind how horrendously ugly their code might be, must be tested thoroughly...this typically requires support from developers to accomplish effectively. That being said, the best programs that most programmers will ever write, are the programs that they themselves will *use every day*. They thoroughly use it, and use it regularly. This tends to lead to a lot of really good QA. Unless they are lazy.

  199. "Structured Design" sez it all by stremo · · Score: 1

    Start with Yourdon and Constantine, "Structured Design". Nothing significant has been said about software quality since this book appeared.

    1. Re:"Structured Design" sez it all by aGuyNamedJoe · · Score: 1

      I'd agree with 'start with Yourdon & Constantine', but I'd add Christopher Alexander's "Notes on the Synthesis of Form", and M.A.Jackson's "Structured Design", and his earlier work "Principles of Program Design" -- and probably his later work, although I've not actually spent much time with it. (Jackson's books are not meant to be "read" however, they're meant to be worked through -- if you don't stop and do the exercise when he suggests it, you'll say "Oh, yeah! That's what I would have done" -- and miss the point. )

      It is important to recognize that design is in the realm of art, not in the realm of rules -- intuition not logic. It's a "right-brain" activity -- you have to trust your feelings, not your reason, to do good design. That's not to say reason and logic are not important and very useful -- but "The way that can be told is not the real way" -- like riding a bicycle -- staying upright comes from sensing and reacting, not from reasoning and reacting. (I got very frustrated trying to teach design / patterns to people looking for lists of rules to add to their process.)

      The "Analysis of Design" is a left-brain activity -- reason and logic are what it's all about. Don't confuse "Design" and "Analysis of Design".

  200. some suggestions by neonsignal · · Score: 1
    • partitioning of problems
    • well defined interfaces
    • trained/experienced software engineers
    • adequate time
    yeah, I know, it's a dream...
  201. coupling and cohesion by Anonymous Coward · · Score: 0

    Maximum cohesion
    Minimum coupling
    I'll leave the rest to you..

  202. XP practices by Anonymous Coward · · Score: 0

    You asked not to point you towards XP, but a lot of practices in XP result in "good" (as in maintainable, low bug-count) software.

    Use of TDD (BDD) results in testable (duh!), low-cyclomatic complexity code (which tends to have less bugs). Check "Peripatetic Axiom" blog (http://peripateticaxiom.blogspot.com/) - Keith Braithwaite has some interesting statistics about that.

    I also recommend "Agile Software Development, Principles, Patterns, and Practices" by Robert Martin. Check the "Agile Design" section of the book, it explores the building blocks of good design.

    hope this helps,
    -Dmitri

  203. It's all about the tradeoffs by MtHuurne · · Score: 1

    In my opinion, the hard part of software engineering is not finding the best solution, but picking a solution when there isn't a best solution.

    Let's say you have a simple but slow algorithm and an alternative which is fast but complex. Whether one is better than the other depends on a lot of factors: Can you prove the complex one to be correct? Does it have a significant impact on the system performance as a whole? Will the people who have to maintain it understand it?

    The most common tradeoff is development time: often you know what the "right" way is to do something, but a shortcut is possible that can be implemented much quicker. Whether you should use the shortcut again depends on many factors: How much time does it save and how important is that for the project? Is the shortcut bad design (could lead to future bugs) or will it produce wrong results (immediate bug)? In the latter case, do you know when it will be wrong? If so, can you prove those cases do not occur in today's use of the code? Or is it acceptable to have the program fail in those cases? Will the right solution have to be implemented eventually? If so, does taking the shortcut now increase the amount of work to be done then?

    There are many other tradeoffs: Do you use an existing library for certain functionality or write it yourself? Do you optimize for CPU use or memory use? Do you use advanced language features or do you avoid them? Do you prefer a simple interface that requires a lot of code to implement or a more complex interface that can be implemented with less code?

    I think the real skill in design is to make good decisions regarding these tradeoffs. So I am not so sure it is possible to say all good software shares the same qualities. There are qualities you want to have in all software and you should try to get all the ones that are not conflicting and the most important qualities (for your project) that are conflicting. But in most cases you cannot have them all, certainly if you take development time into concern.

  204. The Zen of Python by Anonymous Coward · · Score: 0

    Abstract
            Long time Pythoneer Tim Peters succinctly channels the BDFL's
            guiding principles for Python's design into 20 aphorisms, only 19
            of which have been written down.

    The Zen of Python
            Beautiful is better than ugly.
            Explicit is better than implicit.
            Simple is better than complex.
            Complex is better than complicated.
            Flat is better than nested.
            Sparse is better than dense.
            Readability counts.
            Special cases aren't special enough to break the rules.
            Although practicality beats purity.
            Errors should never pass silently.
            Unless explicitly silenced.
            In the face of ambiguity, refuse the temptation to guess.
            There should be one-- and preferably only one --obvious way to do it.
            Although that way may not be obvious at first unless you're Dutch.
            Now is better than never.
            Although never is often better than *right* now.
            If the implementation is hard to explain, it's a bad idea.
            If the implementation is easy to explain, it may be a good idea.
            Namespaces are one honking great idea -- let's do more of those!

  205. Lakos by lasse_2 · · Score: 1

    Read
    Lakos, "Large-Scale C++ Software Design"

    I love it..

    Regards,
    Lars

  206. Re: Only Hire (russian) women? by XHIIHIIHX · · Score: 1

    if you could update the drivers to windows 3.1's basic graphics/sound/and io bus....It would scream...I mean the entire win 3.1 install was what? 4-6 1.44 meg floppies? It would either hang or crash just like it always did, no mysteries there. BSODFTW4EVER
  207. Here's all you need to know: by BlueBoxSW.com · · Score: 1

    1) Understand the business problem
    2) Solve the business problem
    3) Profit

  208. In the Words of Craig Kilborn from the Daily Show by Anonymous Coward · · Score: 0

    "You graduated from Tufts, can you name a good school in Massachusetts?"

  209. David M. Pye by Anonymous Coward · · Score: 0

    Read anything by David Pye.

    For a short course, try:

    Design and Aesthetics

    And I find it incredible that you've reached the Ph.D. level in Software Engineering without ever _thinking_ about this topic.

    Lazy bastard.

  210. Design the code bottom-up ... by DrJimbo · · Score: 1

    ... then write the code top-down.

    This means you need one person who groks the entire project but you can have many people writing the code. See Feynman's critique of the design process used in for the Space Shuttle.

    --
    We don't see the world as it is, we see it as we are.
    -- Anais Nin
  211. I disagree with the opening para of the link by JimToo · · Score: 2, Insightful

    Actually, when you realise what sort of horrors are present in a house you realise that the author of the linked document is drawing a false analogy. Both in houses, and in software, various shortcuts are taken for pragmatic reasons, and these are often because the shortcuts do not undermine what is the primary function of the "house" or the "software". For example, the concrete floor in my house is lousy rubbishy stuff. Probably doesn't meet the codes, yet except when the carpet layer has a hard time laying I never notice, nor really am I too concerned, about the failure to meet some "ideal" standard. So in doing research in this area, a reality check is required and the article you have chosen to refer to starts out with a poor example to prove a point ... I am not convinced.

  212. mythical man month by aoeu · · Score: 1

    Oh! Wait. The architect, Gates Windows PROFIT!!!

    --
    All your database are belong to U.S.
  213. Please don't publish anything by gr8_phk · · Score: 1

    I can see it now. "We have to use methodology X because this smart PhD guy researched it and concluded this is the way...." Little does the boss know he was soliciting information from slashdot :-) Please just use this investigation for your own personal education and do your dissertation on something else :-)

  214. a real answer by bokmann · · Score: 1

    I had a uch longer post but I wasn't logged in - when I logged in, slashdot ate my homework. so, shorter and more to the point this time:

    1) the most important feature set a language can offer, and the most important thing that separates intermediate from awesome programmers is proper packaging of concepts in code. I don't mean packaging for the language, or for the IDE... I mean for the human to solve a problem at one level of abstrction, maintain it at that level, and use it at another level of abstraction without thinking about it too much. Java got this mostly right with packages (and the little used package-level access modifier), and is one of the reasons I still like Java so much. This is also one of the reasons Ruby is such a nice language - I can bundle abstractions up in declarative statements that start to look like keywords in the language - think of the way Rails does things like "belongs_to" and "validates_presence_of". I was on the JSR for the upcoming Java Module System, so this is something I have thought about.

    2) regardless of the process methodology, configuration management is something that has to be disciplined for real software development. I don't just mean version control - I mean requirements management (work backlog), version control, branching, merging, repeatable builds, continuous integration, defect tracking, deploys, backup and restore, reconstitution plan, and a bunch of other things that about to project-wide afety nets and 'undo' operations. Rather than try to build the perfect softare, we (very zen-like) embrace the fact that we can't write perfect software and plan accordingly. This makes the software better.

    If you want to get some real thought provoking converation about this, I would suggest that you find the nearest NFJS conference to you (www.nofluffjuststuff.com), and hang out with the speakers some saturday night as we drink scotch in a hotel bar and discuss this kind of stuff until we annoy everyone else out of the area.

    -db

  215. Andrew Ko's thesis... by ap0 · · Score: 1
  216. Almost all software are bad by kentsin · · Score: 1

    Engineers make design decisions carefully. Programmers always take short cuts. A computer program is a rough abstract of a real world problem, but programmers were trained to work with SPEED SPEED in mind.

    Safety were important in engineers, but programmers were rush to speed and ignore anything else.

    The education of programmers do not teach them to review, to re-examine, to verify, ask for peer review, examine.

    They never explore all possibilities before code.

    Engineers were humble, but programmers having a cultural that they were god. The programmers never care about the users. Because they are god and users do not known any thing about code.

    It is very difficult to find a program to prepare for changes in real world. It is design as if the problem never change, it is so designed that things happen in a normalized way, they do not prepare for surprise.

    The whole education and cultural should be changed in order to have a new generation of programmer to produce safe engineering level code.

    As of coding practice, if you start it without wanting to code for real, how do you expect got a good result?

  217. Re:Depends on the softwares purpose - Design Patte by fabs64 · · Score: 1

    Slight correction:
    You are talking about architectural patterns here, not design patterns.
    Design patterns are generally ways to solve much smaller problems than the architecture of a system.
    I've always been iffy about calling MVC a design pattern too, it seems very difficult to fit into the original GOF specification.

  218. Two important ideas by mengel · · Score: 1
    There are three aspects of good software that I find are not mentioned nearly often enough:
    1. Using what you write -- systems like the original Unix(tm) operating system (as opposed to what got released later, commercially, by AT&T) were actually used and maintained by the people that wrote them, every day. This is partly why things like version 6 unix are so readable and maintainable. This is also largely true of Linux and much other Open Source. For all of the Cathedral vs Bazaar type discussions out there, I think this "eating your own dog food" approach is critical. If instead you use a big IDE to develop software that other people use, but not you, you have a different attitude about it. On the other hand, Microsoft claims to do this -- that is, use their own produtcs -- however I'm not sure how often the developers themselves use the packages that they write in their daily work....
    2. Having to explain your code. There are pushes for this -- code reviews, literate programming, etc. but these often actually diverge from explaining how the code works, and thus falter. In my formative years I used to be a site consultant at the Purdue University computing center, and I found that most people who came up to ask why their program didn't work would figure it out on their own if you asked them to explain how the program worked. There is also the IBM research on "clean room" software development, which pushed this to the extereme, where people never got to run their software, they only got to discuss it with their coworkers and hand it over to a build and test team. This got really good quality, delivered on time software, the only problem was that none of the developers would ever agree to do it again.
    3. What is now called testing by design -- you work in a mode where you define test sets first, then the test harness, and then write the code; module by module.
    So combining these, I think you get a system where you design tests, discuss the tests with your team and justify them, then design code & discuss it with the team, and ensure it passes the test suite, and then you spend a noticable portion of your time using the software for its intended task. That is, if you're writing hotel management software, you should be spending a chunk of your time at a checkout desk at a hotel, filling in in the kitchen off hours, etc. using the system the way a real user does. Failing that, you should spend a chunk of your time on the support hotline with real customers finding out how they use the software, and what they like and don't like about it.

    I don't see much of this in many of the software methodologies I hear discussed.

    --
    - "History shows again and again how nature points out the folly of men" -- Blue Oyster Cult, 'Godzilla'
  219. Did it succeed? by warfi380 · · Score: 1

    The true secret to software design: Did it meet the user's needs? If it was a public company, did the design make money for the company? Buggy, poorly documented software can make a lot of money. If it was for a government/military organization: Did it kill your enemies/save the lives of your own folks. Did it pay your folks their monthly allotment on time? If it was open source: Did others use it? The best design in the world is worthless if it does not meet the needs of others.

  220. My two cents by Anonymous Coward · · Score: 0

    Having designed and developed software for 30 years, and used a half-dozen different methodologies (and at least twice that many languages/IDEs/toolchains/etc) I thought I'd offer these observations:

    1) Software design is not science. It's art. Ask any hardcore developer or designer what they mean by "elegance" and you'll start to get a clue about what I mean.

    2) Methodologies (Agile, XP, RUP, etc. - I've experienced them all) are just different (and sometimes useful) ways to look at the same process. In the end it always comes down to talent. Talented people create good software. Less talented people can be prevented from creating truly bad software by implementing a particular methodology, but it will never be good.

    3) Most designers and developers cringe when you mention either documentation or testing - generally it's because they're not good at it. In many cases it's a waste of time and talent to make them do it. When possible, hire people who are passionate about documentation and/or testing to do those jobs.

    4) No single methodology, language, IDE, etc. is good for all projects. A good designer will always give serious thought to the appropriate environment and tools for a given job (and team) rather than taking the "I always use ..." approach.

    5) Too many people get sucked in by the common mythologies these days. These include "portability", "object oriented programming", "top down design", and so on. These are great concepts, but, like anything else, should only be used where they make sense.

  221. The Trustworthy Systems Textbook by Bernstein by RobBebop · · Score: 1

    You could try Trustworthy Systems by Bernstein. I own the book, but never actually read it because the lectures from Bernstein's associates at Stevens Institute of Technology did a sufficient job to explain the examples and concepts in the book.

    Another favorite of mine is the work of Nancy Levenson and her students at MIT.

    --
    Support the 30 Hour Work Week!!!
  222. Try this by Anonymous Coward · · Score: 0

    Butler W. Lampson. Hints for computer system design. Proceedings of the Ninth ACM Symposium on Operating Systems Principles, Bretton Woods, New Hampshire (October 10-13, 1983), pages 33-48. Published as Operating Systems Review 17, 5 (1983)

  223. design principles by rtayek · · Score: 1

    you said design. look at cohesion and coupling from the structured programming era. also uncle bob's o-o design principles: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf. in architecture, the dependency inversion principle and http://en.wikipedia.org/wiki/Hollywood_Principle in http://en.wikipedia.org/wiki/Inversion_of_control frameworks like spring. you should expect to see o-o design patterns

    --
    vice chair orange county java users group (ocjug.org).
  224. areas where I think more research might be needed by Anonymous Coward · · Score: 0

    Is there a high-level language which can be used to write requirements (input, output), conditions, constraints etc that are usually translated into while, if, do etc. Writing the requirements in a human language can be done precisely, but it takes so much work to do so. So, some form of simpler, easy-to-write, mathematical, analytical specification language would be nice. Yes.. there are UML and other tools.. I have yet to see a complete full project that does not go through customization. The trick would be to be able state the customizations at a higher level than writing C code. If that were so, an automaton could just create the programs and get all the programmers back to the job market. Seriously, I am sick of some of my team programmers not testing if the software meets the requirements.

  225. Re:How about a practicum with LM Space Systems fir by RobBebop · · Score: 1

    I disagree with the suggestion for the Lockheed internship to gain experience. I have known people who have worked for Lockheed and their stories are similar to other work I've done in the "process heavy world of the CMMI" and have to say that the best practices are only as good as the practitioners who are applying them.

    I also disagree with the suggestion that Open Source development experience will teach good design. The Open Source world isn't documented well enough to serve as an example for a PhD student in pursuit of the "best of the best".

    I would stick to the latest and greatest theory that has come from veterans in academia. In another post within this article, I link to several examples of what I think the best of the best is. (click my username above, and then find the first response I made to this story).

    --
    Support the 30 Hour Work Week!!!
  226. design principles are universal by Anonymous Coward · · Score: 0

    One thing I have found over the years is that the principles of good design apply regardless of the area

    A could discussion of the principles alibet with an art bias can be found at http://www.bluemoonwebdesign.com/art-lessons.asp

    Balance - a feeling of equality of weight, attention, or attraction of the various elements within the composition as a means of accomplishing unity

    Movement - the suggestion of action or direction, the path our eyes follow when we look at a work of art

    Repetition and rhythm - the act of repeating an element either regularly or irregularly resulting in a rhythm of the repeating elements

    Emphasis - the stress placed on a single area of a work or unifying visual theme

    Simplicity (a.k.a. visual economy) - the elimination of all non-essential elements or details to reveal the essence of a form

    Contrast - the difference between elements or the opposition to various elements

    Proportion - the relation of two things in size, number, amount, or degree

    Space - the interval or measurable distance between objects or forms (two dimensional or three dimensional)

    Unity - the relationship between the individual parts and the whole of a composition
    source

  227. How does advancement happen by Anonymous Coward · · Score: 0

    How many times did the light bulb filament fail until the birth of the light bulb?

    Maybe you should be looking for what NOT to do!

  228. a sociological question by Goldsmith · · Score: 1

    Given that Chuck Connell is not really asking us to do his research for him, but is actually conducting a survey of what people think good programming principles are, I wonder if this section of his research isn't really sociological? If so, did he get IRB approval for human research?

    (Sorry, this is just a really bad university bureaucracy joke, IRBs make me glad I'm not a social scientist.)

  229. Writing software is NOT engineering by samgeribo · · Score: 1
    I read the link. I think you should give up the analogy between writing software and engineering. The requirements space is WAY more complex and extensive in software engineering than it is in regular engineering. In everyday engineering, there are not that many types of desired functionality to build. Houses, bridges, spaceships, etc. Someone has always done it before and you just have to follow the procedure, possibly elaborating on it if you are building a bigger/faster thing than has been built before. In software, there are literally *hundreds* of thousands of different types of programs out there, all doing different things from each other. The requirements space is much more complex. It is not written down how to solve the software problem you are solving, because there are too many different problems to solve and no one can write them all down. In addition, the software engineering meme will lead you to wrong assumptions, e.g. that software components will solve everything. The requirements space is too complex for software components to be reused.

    Yes, there are useful libraries, frameworks, and components out there, but they succeed precisely because they are low level and therefore don't apply to the high-level requirements.

    I DO believe that it will get you an A+ on the paper however, as I am a previous software engineering grad student.

  230. Don't forget the solution domain... by Capt.Albatross · · Score: 1

    Design is a creative activity, so your developers also have to understand the domain of possible solutions. Case in point: the Therac 25 disaster, where the developer's lack of understanding of concurrency contributed to the death or maiming of several people (e.g. http://courses.cs.vt.edu/~cs3604/lib/Therac_25/Therac_1.html .)

  231. If you don't know what the requirements are... by Anonymous Coward · · Score: 0

    you're unlikely to meet them.

  232. Agile Programming by wzinc · · Score: 1

    Agile programming is a lot like what is described in the paper you linked to.

    http://www.pragprog.com/titles/pad/practices-of-an-agile-developer
    http://product.half.ebay.com/_W0QQprZ45402847QQcpidZ1294591165

    I'm a big fan of agile, and each one of the points in that paper. I hope you do well; you can't put a price on good design principles!

  233. Lack of Metrics by Jekler · · Score: 1

    One problem with examining good design principles is that a lot of successful projects seem to succeed in spite of what would be considered poor design by any computer science theory. A lot of large open source projects are famous for just how disorganized, unmaintainable, and poorly documented they are. They barrel forward by sheer volumes of code that are submitted and are perpetually in a state of being put together with patchwork. There just isn't a metric for the scalability level of one project is versus another. Scalable, maintainable, etc. are common buzzwords but nobody really has been able to say project x has a maintainability level of 5 while project y has a maintainability level of 8. Current software publishers pretty much use their bottom line to determine good design principles. And the vast majority of software doesn't have a long enough life cycle to extract any realistic data about what's maintainable and what isn't.

  234. Factor in the human component by Anonymous Coward · · Score: 0

    I'm an exceptional programmer - I started building international enterprise systems when I was 18. Humility is a strong area too, second only to sarcasm.

    Sometimes there's too much focus on the brilliance of computers, doing precisely what they are told. And too little recognition of the fact that the computers telling them what to do are deeply flawed and ineffective at doing so.

    Good long term code factors in the programmer's flaws, where they will likely trip up, anticipate common errors they might accidentally introduce. It either forces them to avoid those errors, or anticipates them, handling them in advance.

    Some specific tips:

    1) The downside of being an awesome programmer, is that while I was comfortable with a great deal of system complexity, and built systems accordingly - it became damn near impossible to pass the code onto anyone else, even with documentation.

    The lesson learnt: keep your code as legible, simple, and straightforward, for the next poor soul who'll look after it.

    Even sacrifice a little performance in favor of clarity and simplicity. Do you really need to triple the amount of code, just to squeeze out another 5% performance?

    2) Build code that can go wrong, and still work. Never make assumptions about what inputs will be (even internally). Never assume that the code you're about to write to call this code will be correct. We're humans, we stuff up.

    Years from now, you or someone else make work on the code, and enough time has passed to make you forget that "Yeah I can't pass Nulls to that parameter, it's OK I'll remember".

    On a public web service server, this rigor is vital - use the same rigor internally in your code.

    3) And that's why I like consistent coding and naming conventions. Consistency makes it easier for the next poor bastard.

    -The Consistent Coder

  235. good software creates/follows a model by Anonymous Coward · · Score: 0

    that is powerful, elegant, comprehensive, consistent, and clear to its users (after sufficient training; specialized software might require a specialized degree). Perhaps more accurately, the software must present a set of models which can interact with each other in powerful ways; the facilities of the Unix shell are a good example.

    Once the users have grasped the model(s), they can begin to think creatively about using the software to solve problems, perhaps even while away from their computer; while driving a car, for example.

    Many of the issues being discussed in this thread - design patterns, modularity, loose coupling and the like - are important, but they must be subservient to getting the basic external architecture right in the first place. Otherwise you could hire Bill Joy, John Carmack, and Alex Stepanov as programmers and still not come up with a product that customers will love.

  236. python -c "import this" by pikine · · Score: 1
    The Zen of Python, by Tim Peters

    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!
    --
    I once had a signature.
  237. Off on a tangent, via a counterexample by Capt.Albatross · · Score: 1

    I saw your first line in the preview, and immediately thought, 'have you never forgotten to unlock a mutex?' Failure to check return codes or catch exceptions also fall into the same category of missing code that causes failure. Nevertheless, I am in complete agreement with your general principles: from my experience, I have come to consider the prevalence of inordinate and gratuitous complexity as being the least-recognized problem in software design today - though it's really a symptom of a deeper problem, in how developers think about design, for which I have no solution.

    I am in complete agreement with you on the value of compile-time checking, and I have found the Gimpel Lint to be helpful with C++, though only with code that was written from the start to be checked this way.

    I don't believe that code can be truly self-documenting (at least not in C++ and similar languages), and I see that, unlike some other responders to this question, you don't take an absolute position on this. The problem lies in dealing with interactions between textually and temporally separated aspects of the code: two components whose interaction preserves some invariant; "we need to do this / it's safe to do this because..."; "this is better than {the obvious solution} because...". Design needs to be understood, and to be understood, it needs to be explained where not self-evident (is there a self-documenting C++ implementation of the qwiksort algorithm? Even if there is, it's too small in scope in comparison to real-world software engineering problems.) Nevertheless, I agree that naming is important, and for this reason: if you can't give a good name to a component of your code, that's a warning that it has ill-defined semantics.

    The idea that good design should be readable is not new: Donald Knuth, no less, wrote about 'Literate Programming' three decades ago. The technology has moved on, but the principle remains sound.

    1. Re:Off on a tangent, via a counterexample by johannesg · · Score: 1

      I saw your first line in the preview, and immediately thought, 'have you never forgotten to unlock a mutex?'

      No, my cMutex class has never yet failed to unlock upon leaving the logical block that contained it. But thank you for your concern ;-)

      Failure to check return codes or catch exceptions also fall into the same category of missing code that causes failure.

      Of course. Removing too much code is just as wrong; if something is checking return codes it is doing that for a reason and must be there. Having said that, I prefer to wrap such functions in something that throws a proper exception. Typically they work on some parameter that is better controlled using RAII anyway so having a class is a natural choice.

      And once your code is exception-aware, adding a new source of exceptions somewhere is typically not an issue at all.

      Nevertheless, I am in complete agreement with your general principles: from my experience, I have come to consider the prevalence of inordinate and gratuitous complexity as being the least-recognized problem in software design today - though it's really a symptom of a deeper problem, in how developers think about design, for which I have no solution.

      I try to approach it as a cost driver: a simpler problem is a cheaper problem. This is something you can do at any level: when bidding, during contract negotiation, during requirement gathering, when drawing up the architecture, etc. In my experience at least, customers generally do appreciate it when I attempt to keep complexity down (of course I give them good reasons for wanting to do so).

      I don't believe that code can be truly self-documenting (at least not in C++ and similar languages), and I see that, unlike some other responders to this question, you don't take an absolute position on this.

      Generally speaking, any absolute position is going to be wrong at least some of the time. For example, if a goto really is the best way to express something, fine, use one already. The tools in your toolbox are there for a reason, and each has its proper time and place.

      In that vein, I spit on any coding standard that forbids the use of exceptions, operator overloading, or templates, to name three of the common culprits. Why not forbid the use of the letters T and G while you are at it?

      "Hi mr. carpenter, I want you to renovate my house. But you don't get to use a saw or a drill, because people might get hurt using them."

      The problem lies in dealing with interactions between textually and temporally separated aspects of the code: two components whose interaction preserves some invariant; "we need to do this / it's safe to do this because..."; "this is better than {the obvious solution} because...". Design needs to be understood, and to be understood, it needs to be explained where not self-evident

      Exactly. And that's where comments have their place: to explain _what_ is going on, and _why_ it is going on. I'm not so much interested in _how_ unless it's been mangled beyond recognition, and in that case I first want to know about _why_ that was necessary anyway. After which I'll probably flag that code for rewriting anyway.

      is there a self-documenting C++ implementation of the qwiksort algorithm?

      I doubt it. Quicksort is not obvious. But hey, this will go a long way:

      void QuickSort (vector &Array) ...

      Apart from unnecessarily reproducing an STL function, and thereby making it redundant (and thus fall foul of the "cut where possible" rule), it _is_ clear what is going to happen in this function: the variable 'Array' is going to be sorted in ascending order.

      If that is not true, no amount of commenting will save you from the maintenance horror that ensues. Changing the name, however, will.

      Actually I have another little rule that I find helps my code considerably: don't use negative names. What do you find mor

  238. Why would a PhD candidate need help? by rpbird · · Score: 1

    I don't want to come off harsh, but this guy is from a good university, in a graduate program, and he needs help in basic research on his dissertation? Look at the question, this isn't a survey: "...I am looking for links/references on this topic."

    Having gone through a similar process several years ago, I can tell you that this guy is trying to get started on his dissertation, and he's already lost.

    Even a half-assed google on software design strategy can turn up stuff on the utilization of quality control techniques from aerospace programming in medical devices, the application of evolutionary theory to software design, even a nifty little blog called Coding Horrors. And he can't find this himself?

    He also needs to ask himself certain basic questions. What is a good program? What is a bad program? Do their failures and successes arise from the design environment? Or do they arise from the choices about the actual program that programmers made while constructing it, regardless of the "design environment"? What strategies do good programmers use? The article he cited can be challenged conceptually is about five different ways.

    Doesn't this guy have a faculty adviser? I had an entire freaking committee, and I had to scoot around to five different guys and get their feedback on every aspect of my work.

    Here's an idea. Arrive at a list of good software products, then seek out the design teams and interview them. Find out what effective people do and why they do it. If a real answer is desired, the work will be immense, and the project will take a couple years.

    My advice? Read, research, read, refocus your research, talk to anyone who'll sit still for five seconds, read somemore, and keep your committee clued in to what you are doing. If you don't do these things, you're boned.

    1. Re:Why would a PhD candidate need help? by rpbird · · Score: 1

      This just occurred to me - what if there is no answer? What if there is no such thing as "good software design," only good and bad software? What if the demands of individual projects determine the software design environment?

      If you think these questions are silly, you have never been the focus of a thesis or dissertation defense. Those guys on your committee? They gang up on you at the end of the process and grill your ass off.

    2. Re:Why would a PhD candidate need help? by fartrader · · Score: 1

      Good posts - I agree with your points. I would add that the result that "there is no good software design" is still a valid thesis - its just proving the negative and therefore an original addition to the body of knowledge.

      I think that the person asking this question clearly isn't well enough prepared to do a PhD - as you state he could just google an answer - but when I did my PhD the first place I went to was the library - and their CS section must really really be awful if they don't have a book on software design.

      The big issue here is the topic - part of a PhD (I did mine in the UK) is originality, this topic seems to be done to death. There are literally hundreds of books on software design currently in print, and thousands of papers - so where's the angle? What's the original content? His advisor as you rightly point out should be pushing him towards the right texts, and telling him that he's going to have to pull a rabbit out of the hat to add to something original to this area.

  239. Elegance does not mean "Pretty" by gishzida · · Score: 1

    Elegance is simplicity of form and function. Coding remarks are good. Simple code is better. There was a time when "systems analysis" was used to get the "lay of the land" to find what the business objectives were, then start coding, then document the code (for future programmers) and the associated processes (for end users and management). Back in the day I wrote a data translation program that was "in service" for nine years. It never had or needed any revisions because it did what it was intended to do. To address the "general question" posed: Elegance of form and function in most things (not just software) is something that can be usefully investigated when looking at the subject from the view point of "Systems Theory" http://en.wikipedia.org/wiki/Systems_theory

  240. Its all about being lazy by Anonymous Coward · · Score: 0

    You should always strive to get the job done with the least amount of effort -- Taking the entire product lifecycle into account including all the effort needed by your end user to be productive.

    Asking a general question and expecting a specific answer in return is one sure-fire way to fail in any endeavour.

  241. Is this for real? by Anonymous Coward · · Score: 0

    What the fuck? You don't deserve a PhD if you honestly think you can just ask for one of the most complex answers from a website of the most ignorant and arrogant teenage programmers who think they know EVERYTHING and pray for the day Microsoft goes bankrupt.

  242. get this book by ammoQ · · Score: 1

    "Facts and fallacies of Software Engineering" by Robert L. Glass. Good stuff, and lot of references to more good stuff. For a PhD thesis, you rather want to cite academic work than the /. crowd, won't you?

  243. See Knuth - Literate Programming by strangeattraction · · Score: 1

    Unfortunately most of the objected_oriented/patterns/agile/your_buzz_word_here is fairly worthless or at least only useful rules of thumb used to prevent the average programmer from having to think too much. (They also make a good PhD thesis) It just isn't worth the time to handcraft the code for the average application. It would take too long; cost too much. It is much better to take the Microsoft approach and burden your users with the problems you didn't want to spend the time/money solving because they have no other choice. Knuth's approach is to force the programmer into expressing the solution both in code and in language. The extra effort requires the programmer to understand the problem with both sides of the brain which leads to better algorithms, fewer bugs more maintainable code (its documented what a concept). Unfortunately this leads to literate programmers which is a nightmare most companies cannot deal with. No company wants employees to actually think because it makes things take to long and cost too much.

  244. Bertrand Meyer by Anonymous Coward · · Score: 0

    Bertrand Meyer has written a lot around good design and software reliability.

  245. Separation of Concerns, Four Causes, etc. by Anonymous Coward · · Score: 0

    This is the flip side of a principle with an old name: Separation of Concerns. Separation of Concerns means "to do one thing at a time." This refers not to multithreading but to what is happening in one place in a program.

    Reading an essay in which multiple arguments are mixed across paragraphs is hard. It becomes much easier when each argument is given paragraphs of its own and when they are grouped. Only when it is necessary to bring the points together are they combined, in the simplest way possible.

    Likewise in programming, you should not litter a decision with deep details needed to implement it, nor let your reader forget why you have written it.

    Separation of Concerns is the foundation of many approaches: modularity, information hiding, object orientation, aspect orientation, etc.

    (Some people will be able to identify me from the following; so be it.)

    There are just four things which make programs unclear: Disorganization, Obfuscation, Poorly Chosen Representation and Recondite Algorithm.

    Disorganization I have covered above and will cover further below. It is by far the greatest cause of unclear programs.

    Obfuscation is any violation of "say what you mean, simply and directly" (Kernighan and Plauger). Different things may be obfuscative in different contexts: Using extremely long variable names for control variables in short loops, splitting simple computations across multiple lines, failing to structure "external variables" and enums in structs/classes/your-language's-constructs so that they are given a context to provide meaning, ... the list is endless and the list of good practices is endless, too. Unfortunately, we don't pay enough attention to the good practices.

    Poor choice of representation often shows up in the use of state variables in a loop that would be much clearer with early exit or early restart. Sometime's it's the opposite: contorted branching in a computation that would much better be represented by state variables. The use of functions that return a hard-to-use type is another problem.

    Recondite algorithm is the rarest type of unclarity, and the only one for which commenting is the correct cure. Every attempt should be made to summarize the computation, with appropriate references to places needed for study. References should not be too much relied upon, however: One very early UNIX password algorithm was based on the Hagelin rotor machine. The commentary was limited to identifying what the variables did, naming the major steps (one sentence or less, each) and giving the patent number of the machine. More is needed!

    Concerning organization: I like a 'radical' definition of cohesion and coupling. It's radical in that it goes to the root of the issue: the relationship between the problem and the solution embodied in the program. A program is cohesive to the degree that each problem element appears in just one place in the program; it is decoupled to the degree that each element of the program represents just one element of the problem.

    For the program to be stable under minor changes in the problem or increases in the program's scope, its hard-to-change elements must represent the unchanging, core parts of the problem; the connections between them must be flexible enough to deal with the changes and rearrangements that will occur in the problem or its definition as time goes by.

    Whew! Lots of words. But a good starting point.

    Let me add one another issue: surface versus volume complexity. A moderately complex algorithm/data structure is safe to use and robust under change to the environment only to the extent that there is a stable and simple interface for it. The complexity of understanding (I am not speaking of computational complexity) needed to use it depends on the surface complexity at that interface. Its independence and stability under changes in the other parts of the program also depends on its innards being independent of what lies on the other side of the interface.

  246. Good encapsulation by Slur · · Score: 1

    Clear designs result in good implementations. Object-oriented syntax is the vocabulary in which design is expressed. Clarity of expression is key to making solid systems that are self-documenting, robust, and interchangeable. Modular software design maximizes the value of its all its constituent parts.

    C++ and Apple's Objective-C 2 each provide access to a strong set of data models - like arrays and dictionaries - in the form of STL and CoreFoundation. The best runtime libraries let you start working without needing to reinvent data storage. Garbage collection reduces typing.

    The best APIs and libraries use consistent and clear semantics in their naming conventions, which allow the casual reader of the code to get a good idea of the system, algorithm, or process expressed.

    Languages with flexible semantics can help you express systems at higher levels, and the growing set of code design tools is making it easier to visualize inheritance and container relationships before generating any of the interface code.

    The best code doesn't have to be the fastest, it only has to be fast enough. Sometimes that does mean, as optimized as possible. In code-world, less code equals more speed. The more instructions you run through, the more complex the branching, and the more scattered the memory access, the longer the processor will take to crunch through your tasks. The best code minimizes these hits through intelligent data organization, indexing, feeding the compiler what it likes to optimize, and using threads smartly to take advantage of multiple cores.

    If optimizations lead to obfuscations, kind programmers unroll it in a comment. A good idea for their own future reference.

    Code at even the highest levels may not in any way express what you end up with in the output. The code to generate the Mandelbrot fractal has no turtles or curlicues in it. When you look at the algorithm carefully, though, you see that it expresses ideas not only about fractals and the endless complexity that even a simple iterative process can produce, but the language itself embodies connected ideas about the limited nature of the FPU and the square cartesian grid... which itself speaks to the way humans take in data.

    Good code therefore recognizes both the low level, concrete resources it maps onto, and respects the clarity of all that it models, all the way from the naming conventions it applies for an auto variable, up to the balletic organization of the master controller's minions.

    The end result of really good code is that someone can sit down at a BASH terminal and express in 6 lines of generic shell-speak a powerful transformation of input to output, which provides insight through and into the system it embodies.

    Graphical interfaces and such should embody ideas differently than the internal models. Database designers often make bad interface designers because they expect end users to think in their own inverted fashion about child-parent relationships. Freudian as that sounds, it means end-users should relate to the data at the overview level, so that casual scanning and targeting can be applied to interact and modify what is there.

    The best code expresses the interface (e.g., in the "View" corral of an MVC program) in its own internally-consistent manner, relating interactivity to controller messages. Controllers act as mediators between Views and Models.

    Things I shouldn't say... Good code uses Doxygen or something like it to document at the model and interface level. Good code avoids putting inlines in headers, and good compilers will inline when optimizing for speed. Good code keeps interface and implementation separated. Good code is code you can return to in a year and still comprehend quickly.

    The best code teaches you something you didn't know about the world, reveals subtle patterns in systems, unfolds its own unique sphere of creation, immerses and engages human minds, and has a loose, organic quality that is sensed rather than known.

    Did I forget to mention encapsulation? Good code encapsulates what it should, how it should. It streamlines clear thinking.

    --
    -- thinkyhead software and media
  247. Time by KlaymenDK · · Score: 1

    Time and (not so) common sense in your working environment.

    If you're looking for "what design/architecture qualities are shared by all good software, lacking in bugs, maintainable, modifiable, scalable, etc, then your best bet is *a sane environment*. That is, enough time to actually do the job without having to crunch through 80% of it, and no unbridled pointy-hairs or ever-changing requirements (that old walking on water joke).

    If you have that, the actual tools you're given to work with are a secondary matter. Really.

  248. Keep it simple by Vapula · · Score: 1

    Well, from my own experience (which is in no way related to huge programs),and from common sense, I'd say

    1) Keep it simple.
    No need for convoluted algorithms that noone can understand or for complex class hierarchy. If it can't be easily understood and need complex documentation, it's going to fail in the long term
    2) Don't over-feature it.
    Useless features takes time to be programmed and are source of bugs which could easily have been avoided by NOT implementing these...
    3) Functions/méthods/procedures should be understandable
    If you need lots of comments and documentation to understand what a procedure do, it's time to rethink it. Meaningful function name, consistent coding (loop index using the same variable set in the same order everywhere, consistent indentation, ...)
    4) Use the proper tool/langage
    Programming a text-parser from scratch in C/C++/... can be "fun" but doing it using Lex/Yacc is much more efficient, less prone to errors and easier to maintain. Using C/C++ for web coding when a simple PHP script could do the same is looking for trouble, ...
    5) Avoid marginal or zealot langages
    If can be cool to program in WinDev, Forth, Lisp, ... but these langages are definitively not mainstream. It's better to concentrate on stable well known langages and avoid those with too much zealotery behind them (like .NET, Python, ...)
    Langages like C/C++/Java/PHP can solve most of the problems, share a common syntax and are not rewrotten every second year.
    6) beware of OOP
    Object Oriented programming often allows reusing the same components again and again... But this has a cost : each class is like a new library added to the program, with it's API and so on...
    Newcomers to the projects could easily need to have to study half of the code to make a minor change (or to read tons of documentation).
    Inheritance (and worse, multiple inheritance) can easily make the program hard to understand and bring cascades of bugs if the base class has to be changed.

  249. U need experienced people by Anonymous Coward · · Score: 0

    Process does not mean anything. If I follow the process at my workplace, I'd still come up with code but it is highly unlikely that it will work. Experienced developers have learned the hard way and unfortunately some people never learn so spending a lot of time doesnot necessarily mean experience either.

  250. that's your job to figure it out by Anonymous Coward · · Score: 0

    Is this an attempt to make the community to work for your PhD? Well, if it is then will your dissertation be published under GPL license?

  251. Problem with the question by Eivind+Eklund · · Score: 1
    You are asking what design/architecture qualities are shared by all great software, with a definition of great software.

    I believe the question is wrong. Because there are many ways to reach maintainable/solid software, there are likely no qualities beyond those you list shared by all such software. Most, maybe, but not all.

    Eivind.

    --
    Doubting the existence of evolution is like doubting the existence of China: It just shows that you're uninformed.
  252. The common property of all good software by Anonymous Coward · · Score: 0

    All good software has source code that can be easily understood. This statement is not as trivial as it sounds, because arranging something complicated so that it is easily understood is significantly challenging.

    Nonetheless, this is the metric you have to use. If every piece of software can be understood, then all the pieces are good. If the interactions of all the pieces can be understood, then the combined behavior will be good.

    To figure out what can be easily understood, put down your computer science books and open up a psychology book to learn about the limits of human cognition. Free hint: Look up short term memory (aka "working" memory).

    Good luck on the PhD process.

  253. define good by kwikrick · · Score: 1

    good for what? good in what way? good for whom?

    I'm not just being an asshole here. For good answers you need to ask the right questions.

    --
    assignment != equality != identity
  254. Mean-spirited rubbish by golodh · · Score: 1
    This sort of reply might fly on Slashdot, but it's a mean-spirited attempt at being funny and absolutely misunderstands the difference between plagiarism and sharing ideas. I think it ought to be modded both "redundant" and "troll".

    In fact, confusing this sort of question with plagiarism would mean that you would consider reading trade journals, talking to practitioners, and reading Open Source coding as "plagiarism" too. In fact, posting on slashdot might, to some limited extent, be considered part of "talking to practitioners".

    Whatever people answer here, it won't be anything near what you can put into a Ph.D. thesis because you can't, in any significant way, prove or demonstrate that the ideas thrown up idea are valid. If you could, it would have been published it already and the originator would be a well-known software engineering theoretician. At the very most it's a suggestion for a line of research; all the hard work (telling real from bogus and understanding why) is yet to be done.

  255. Design to withstand change by c0nst · · Score: 1

    You might want to read: Design Patterns Explained. There's useful information in there as to what good software design principles are. The gist of what the book says is that all software is bound to change and evolve over time, and that a good design is one that allows us to make these changes with minimum cost by judiciously encapsulating the variable pieces. They go on to explain how all design patterns essentially are built on this core idea.

  256. Hilarious by severoon · · Score: 2, Interesting

    If you're looking for great software design principles, start with the greats: Liskov, Fowler, Martin. Go to Object Mentor's published articles, click on "Design Principles", and start reading.

    These handful of articles changed the way I look at software, particularly OO software, but not necessarily restricted to OO, and highlighted the importance of controlling dependencies. All of the Gang of Four design patterns use one or more of the principles laid out in these white papers. I would go so far as to say that good architecture and design primarily revolves around managing dependencies correctly around your functional requirements and points of future extension, no matter what language you're in.

    These concepts are going to become ever more important as we have to scale across more cores and more machines using functional languages like Erlang and Scala and techniques like map/reduce (see Hadoop, for Java).

    --
    but have you considered the following argument: shut up.
    1. Re:Hilarious by bishiraver · · Score: 1

      You'd think a site with articles on good coding style would use quietly degrading links, instead of anchor tags with javascript in their href field. I tried to middle click them to open in new tabs, but was completely let down!

    2. Re:Hilarious by severoon · · Score: 1

      I'm pretty sure the site was not designed by the guys that authored those articles. :-)

      --
      but have you considered the following argument: shut up.
  257. My four page rule by Douglas+Goodall · · Score: 1

    I try to keep the code modules from being so long that I cannot read them over with a minimum of scrolling. By the time they are over four pages long, there is usually something there that can be factored out and placed in a separate function . For easier maintenance files longer than that are hard to comprehend.

  258. Simplicity, Readability, Testability by iwein · · Score: 1

    in that particular order.

    Simplicity: In good software I see that if two things do the same thing the simplest solution is favored.
    Readability: In good software I see that code that is more readable for humans is favored.
    Testability: Good software is easy to test (by design)

    These properties are usually attained by aiming for separation of concerns, the right abstraction level and the proper granularity. Some methodologies like XP, SCRUM and other Agile seem to be more successful in delivering good software, but it is not a property of the software itself that it is made using CI, TDD and what have you.

    --
    Show a man some news, distract him for an hour. Show a man some mod points, distract him for the rest of his life.
  259. No! Accountability by nten · · Score: 1

    I am the anti-process. I am not a cowboy coder. But rules and formality are never a substitute for an actual human thinking about what makes sense. Written formal process ends up being an impediment to getting work done *and* followed only in word, not spirit. This results in all the costs of process with none of its benefits. Instead, decide what you mean by quality, spot check it, and punish/reward accordingly. I agree the actual practices you mention are the way to go in almost all cases. But what matters is if it works, and the documentation is adequate and correct. How they got there is of no importance. It is even less important that they get to that point in the same way every time. Consistency leads to stagnation.

    --
    refactor the law, its bloated, confusing and unmaintainable.
    1. Re:No! Accountability by darkwing_bmf · · Score: 1
      But rules and formality are never a substitute for an actual human thinking about what makes sense. Written formal process ends up being an impediment to getting work done *and* followed only in word, not spirit.

      And thinking about what makes sense is no substitute for a good test team trying to prove you wrong. Everything has a time and place. The formality of testing everything (within reason) before release is a good formality. The formality of specifying interfaces, hardware specs and user requirements is a good formality.

  260. Check the implicit assumption first by Blue+Warlord · · Score: 1

    Your question to the audience was: What design/architecture qualities are shared by all good software? However, this question has the inherent assumption that for good software design/architecture qualities are relevant. Is this the case? Do some research on what "good software" is and you will discover a very ugly multi-headed monster. The perspective on "good software" radical differs between software engineers, management, customers, and society as a whole.

  261. WTF by kramulous · · Score: 1

    Here's another way to test the quality of code ...

    http://www.osnews.com/story/19266/WTFs_m

    --
    .
  262. Managing complexity by Anonymous Coward · · Score: 0

    I really think that it would depend on your circumstances. Your approach towards developing a product suite (where testability, maintainability, reliability are key) would be completely different to developing a once-off import tool.

    In general however, the main underlying concept IMHO would be managing complexity. Different paradigms use different approaches, but modular design, service-orientation, encapsulation, etc, are all directed at managing complexity - layering / packaging things in such a way that the overall level of complexity of the entire solution is lowered.

    Bad software typically has very little concern for managing complexity, leaving a solution which is difficult to understand, debug, modify, etc. What separates good software from average software is that the overall approach to managing complexity has been successfully executed. I say "executed" specifically because designs often do not stand up to changing requirements and environments, even if they initially look good. Once again, there are many different approaches to achieving this, such as an architecture-oriented approach (I recommend the book "Managing the Object-Oriented Project" by Booch), or the more modern, iterative approaches involving TDD, refactoring, etc.

    Unfortunately I don't think I've said anything new here (flipping through the article you mention, I get the feeling that I have kind of summarised what they are saying), but I hope this helps.

  263. What is good *writing* by wrook · · Score: 1

    Probably this will never be seen by anyone. But oh well....

    Programming is a work of writing. Sure, it's written in a strange language. Sure it's constrained by having to actually do something useful. But from an asthetic point of view, it's still just writing.

    What is good writing in English? If you can come up with a sound bite that is concise, exhaustive and true, then you are a great person. The same is true for programming.

    You can find *examples* of good writing. You can argue if it is really good or not (and everyone will have their opinion). But this is not something you can define easily (or possibly at all).

    If I were you I'd go from the exact opposite direction. I'd look for good design. Then I'd talk to the people who wrote it. I'd ask them, "What do you think is important in order to create good design". Then I'd write down what they said.

    Finally, I would start a practice of design criticism. Review design. Write about it. Start a dialog with others.

    In other words, do what English PhD candidates are doing...

  264. Spark ADA by Pegasus · · Score: 1

    Take a look at http://www.praxis-his.com/sparkada/ and "correctness by construction" design process. Something good came out of DoD ;)

  265. Licensing and components by dmhayden · · Score: 1

    I think the article that the author refers to hints at the answer. The way to build good software is the same as the way to build good buildings.

    To build a good building, we have building codes that have been carefully thought out and they're enforced by law. In software we have the design fad du jour and programmers get defensive when you suggest that anyone, even a peer, review their code. Suggesting that they be legally bound to a set of principles simply sends them off the deep end (see the stream of flames that this will generate for an example). But think about it - we require enforced standards in buildings for quality and safety. Why shouldn't we require the same thing in software?

    In the building industry we have licensed contractors who should know the codes and follow them. In software, anyone can do it. A lot of them aren't very good.

    In the building industry, if you want a nail, you walk into Home Depot and there's an entire aisle full of them. There are long nails and short ones, thin and fat ones, nails that are coated to prevent rust, nails with wide heads for roofing, nails with a square shaft that's twisted so they spiral in, skinny nails with a dimple so they can be counter sunk (finishing nails) etc. etc. Oh, and that doesn't even begin to talk about the slight variations on nails. There are screws (nails that burrow in), staples (two connected nails), spikes, and on and on and on.

    The point is that there's a nail for each specific need.

    Now consider the sofware industry. Suppose you need a list. I'm a C++ programmer and until a few years ago, if you needed a list, you rolled your own or maybe used one from a commercial library. Only just recently have templates made lists easy and only more recently has the STL given us a standard. But if you want a list you have 1 choice.

    If software was like the building industry, I could open a catalog and choose from all sorts of lists: singly linked lists, doubly linked lists, lists that own the objects within them and lists that don't, lists that are thread safe and ones that aren't, lists that allow callback functions when you insert/delete, lists that keep ref counts, lists that ensure an item can only be on one of them at a time, etc. etc. etc.

    The point is that there would be a standard component to do almost anything I want. Today we write and rewrite the same stuff over and over again and each time someone new does it, they make some of the same mistakes, both obvious and subtle.

    If people built houses the way we build software, there would be a sawmill at every job site and the contractor would be using studs of his own favorite size. There would be a metal forge there too where the they'd be making nails in whatever dimensions seemed handy and out of whatever metals they felt like.

  266. PhD For Dummies by fartrader · · Score: 1

    1. GO TO THE LIBRARY - read every paper that they have on software design principles from books and periodicals - follow the reference chain and order more - use inter-library loan to get everything you need.

    2. Elementary Internet research - this is a good link http://www.cetus-links.org/top_architecture_design.html its one of literally thousands - and is an excellent starting point for architecture and design principles

    3. Find an original angle - I presume you (the original poster) wrote that paper? No offense but it doesn't leap out at me as an original paper - it isn't bad - but it certainly isn't the basis for a PhD at the moment. You need to find an original angle, something that will add to the body of knowledge - not a rehash of other peoples written observations - thats degree or MS level, you need to say something that hasn't been said before.

    4. Drop the architecture / building / bridge analogies - thats nice in a software architecture 101 class to give an undergraduate a basis to understand what it actually is - otherwise its nonsense - like comparing chip design with book writing, yes they both have structure buts that where the analogy ends. Such a justification for good design has no place in a thesis. ...I'd be happy to dispense more patronizing advice on demand :)

  267. Wow... by microTodd · · Score: 1

    I must have been having a bad day or something yesterday, because this morning when I re-read my post even I thought it was awfully harsh.

    Its just that at first glance this question struck a personal pet peeve. My frustration comes from being a college teacher. I have many, many students who don't take any of their own initiative to learn anything. I can provide them books, articles, methods, lectures, tutoring, and yet they just want me to hand it to them on a platter. For example, if I teach them the step-by-step process for calculating the 95% or 99% confidence interval they have no problem if I just give them N, u, Z, etc. But if I give a word problem to calculate the CI for the average bowling scores in a league, they are stumped. Remember the article on Slashdot about this the other day?

    I did not take the initiative to read the poster's background. He is definately not some "wet-behind-the-ears" grad student. But I'm still intrigued by this question. My experience working at graduate-level computer science is that a professor would chew me out for using something like Slashdot as a research point. (Although I can see why the editors would post this story, if only because the answers from people experienced in the field would be interesting.) My education is from public southern universities...looking at Tufts' background its a different "flavor" of school.

    --
    "You cannot find out which view is the right one by science in the ordinary sense." - C.S. Lewis on Intelligent Design
  268. Re:People, People, People by c0d3h4x0r · · Score: 1

    Process is worthless unless people follow its spirit to the letter, and no process can completely enforce 100% good behavior. I've been a professional software developer for over 10 years and it has become quite clear to me that the most important two factors in software development are selecting the right people to work on it and managing those people well.

    --
    Moderator hint: a comment is neither "Flamebait" nor "Troll" if it is true.
  269. No silver bullet by hauk · · Score: 1
    Like all work, software development can be categorized into three groups
    1. Problem definition
    2. Problem solving
    3. Routine work

    Routine work is defined as work where both the problem and solution is known. In problem solving, the problem is known, but not the solution. The hardest group is problem definition, where neither the problem nor the solution is known.

    When people are comparing software development with building a house (a ridicules metaphor but one that seems to stick around), they are talking about routine work and to some degree problem solving. Software development in these two categories can benefit from rigid processes control and following some form of software development method.

    There have been a few articles about the teams that build software for the space shuttle program and space probes and how well they build software, with close to zero bugs, delivery on time and within scope. It can be useful to look at their techniques, methods and tools as well as the development process. However keep in mind that these groups build software mainly in the problem solving and routine work category. Building software after a stable blueprint is "easy" and as long as you have good developers and follow a proven process it is hard to fail. Not that I don't admire those guys, but I am not surprised that they succeed.

    However, the reason software projects often fails spectacularly is because they fall into the problem definition category. That is; no one really knows what the problem is and there is no clear solution. In this case, the target (i.e. realization of the specification) is fluctuating and because of this, it is very hard if not impossible to create a good project plan, allocate resources and estimate the cost.

    Projects in the Problem solving and Routine work category will almost always succeed no matter which software development method, techniques and tools are used. In fact, the often debunked waterfall method can be useful for many of these projects.

    For projects in the problem definition category, using such methods will be fatal. Instead some form of iterative evolutionary development process must be used to try and narrow the scope, follow the target and at the same time have some form of forward progress. There is no silver bullet as Fred Brooks concluded a long time ago. If you only have one set of tools (method) in your box, like most consulting companies, you will fail sooner or later.

    The solution is to realize that each software project is different and to have a box full of tools, techniques, principles that can be applied to different situations and problems. And in this case; "death to methods!" Following a software development method for projects mainly in the Problem definition category is fatal.

  270. Swebok by alapointe · · Score: 1

    Take a look at the chapter 3 of the Software Engineering Body Of Knowledge. It's the most complete source of information I've ever found on the subject (and the project is managed by the University where I did my master's degree !! ). Of course, check the list of recommended references for more information.

  271. That's a lot of criticism, so for the record.... by cconnell · · Score: 2, Informative

    - I am also doing standard academic literature surveys, in several different ways.

    - I am not conducting an opinion poll. I asked for links/references to known work.

    - I am asking "the software development community" for input because software engineering is different from some other disciplines. It is unlikely a physics researcher would get new ideas about gravity from a public discussion forum. But there is a lot of good work about software engineering that does not come from the academic world, and is not published in academic journals. Some is not in printed format at all.

    - If someone tells me an original idea, or a new take on an old idea, I will cite them in my paper.

    - Asking people for ideas is not "getting someone else to do my homework for me". Anyone who thinks that it is has never done anything difficult.

    Chuck Connell

  272. Don Philip by Don+Philip · · Score: 1
    You could do worse than to look at the work of Kim Vincente who deals with human factors engineering, or the work of Donald Norman, who deals with much the same area.

    References:
    Norman, D., Things that make us smart. Defending human attributes in the age of the machine. 1993, Cambridge, MA: Perseus Books. 290.
    Vincente, K., The Human Factor. Revolutionizing the way people live with technology. 2003, Canada: Alfred A. Knopf. 351.

  273. Good Software by the DoD? by Anonymous Coward · · Score: 0

    Here's a quote from 'the best developer' from a particular work unit on a major DoD project regarding published data:
    "While it might be good coding style to initialize [variable x], I'm pretty sure [our software unit] has no requirements to provide any logic for determining [the value of this variable]...."

    So they had an interface unsupported by requirements, but they kept the interface.

  274. Recommended site: InfoQ by davide+marney · · Score: 1

    I think infoq.com has some wonderful resources on "general principles of good software design". In particular, I recommend reading Jean Jacques Dubray's terrific mini-book on composite software construction, which will definitely give you some serious food for thought.

    Speaking for myself, I think perhaps the most important principle is to keep thinking until it's really right.

    I've been around some extremely intelligent people in my time, and none of them ever got it right on the first pass. You think of solution "A", which leads you to think of solution "B", which finally lands you on solution "C", the right one. The point is, the only way you COULD have gotten to solution "C" is by way of "B", and so on.

    Naturally, this means one has to spend enough time upfront to come up with the right idea. It is a mistake to think that EVERYTHING needs to be documented up front (the classic "waterfall" method), but you've really got to have the essential idea and its approach before you even touch that code.

    To me, UML has become an increasingly important design tool for expressing the essence of a system before we get down into the trenches.

    --
    "We receive as friendly that which agrees with, we resist with dislike that which opposes us" - Faraday
  275. PARNAS PARNAS PARNAS PARNAS by willisbueller · · Score: 1

    The subject says enough. Pick up Software Fundementals: A collection of his papers. It is the foundation of the accredited software engineering in Canada

  276. Start with a better definition of "good software" by Twylite · · Score: 1

    Good software means lacking in bugs, maintainable, modifiable, scalable, etc...

    No, "good software" is a subjective measure.

    • Programmers almost always define "good software" in terms of source code characteristics (including design, structure, layout, and derived qualities like perceived maintainability and scalability).
    • Users define "good software" in terms of the user experience with includes ease of use (for the task they intend to accomplish), look & feel, and bugs (including user errors!).
    • The manager on the customer's side who has budgetary control and final responsibility over the software acquisition will define "good software" to include correctness (meets requirements specification) and promises of maintainability and scalability.

    Charles Connell asserts that "Most software is so bad, in fact, that if it were a bridge, no one in his or her right mind would walk across it." How would a layman know if the design of a bridge was bad; or if the bridge was functionally sound despite an outward appearance of rot or corrosion? Many people are afraid of rope bridges, but this negative user experience doesn't prevent them from being useful for particular applications.

    The correct definition of "good software" involves quality attributes that are agreed on by all interested parties. Quality cannot be defined in the absence of the consumer. Given real-world budgetary constraints a slow application with a buggy UI may be acceptable to a customer if data reliability is guaranteed. An imperfect tool is often more valuable than no tool at all.

    The most important reference you need is ISO 9126 which provides a quality model for software. The Wikipedia page on Software quality is also worth reading, and you may find ISO/IEC 14598 (Software Product Evaluation) worthwhile as well.

    --
    i-name =twylite [http://public.xdi.org/=twylite], see idcommons.net
  277. a different approach by Darth_Burrito · · Score: 1

    The question is: What design/architecture qualities are shared by all good software? Good software means lacking in bugs, maintainable, modifiable, scalable, etc...

    This is a very academic way of looking at "Good Software". Good software does not have to be all those things because those attributes are not of primary importance in all situations.

    A one time import script does not need to be maintainable, modifiable, or scalable. However, it is sometimes very important that it is bug free or that it is written quickly.

    One place I worked, we developed very expensive packaged software that was often installed in remote locations. It was important that it work and work the first time. Another place I worked programmed for inhouse systems and there the primary driving force was always speed and features. This resulted in some crappy code which was considered to be good software by the business because it was what they needed when they needed it.

    Had I spent the same amount of time and care developing at the second job as I did at the first, I would have been rightly labeled incompetent. It didn't matter that the code was difficult to maintain because the most oft overlooked requirement for maintainability is profitability.

    My point is just that your definition of good software really only makes sense in an abstract sense, when looking at software in isolation from its intended purpose, or in very specific situations where those attributes are overriding concerns.

  278. Design Patterns by Anonymous Coward · · Score: 0

    Not sure if anyone has mentioned this but have you looked into Design Patterns? I am an undergrad double majoring with Business and Computer Science and i have taken Design patterns and its really useful.

    The ones that commonly get used are:
    Bridge Pattern,
    MVC (Model-View-Controller),
    Factory,
    etc.

    You can also find more info with regard to encapsulation of variability, flexibility, reliability, usability, and some other "requirements" for good code.

    Also look into software life cycles, and avoid using the life cycles that microsoft's vista uses (sends the prototype to users and change with feedback using users as the QA dept)

  279. Knuth, McConnell, Fowler et. al. by Anonymous Coward · · Score: 0

    Look for stuff from the authors of Code Complete, Design Patterns (aka. Gang of Four), Programming Pearls, The Pragmatic Programmer, and Refactoring:Improving the Design of Existing Code.

    Donald Knuth, Steve McConnell, and Martin Fowler stand out, because they're pretty vocal.

    The bibliography for Code Complete also has a number of great research references.

  280. No really .. software design patterns by OshMan · · Score: 1

    Wow, a lot of very vague stuff here. If he/she hasn't already the poster really needs to take a good hard look at software design patterns. Its pretty well established that the majority of software problems are not unique and that we don't need to come up with clever new solutions to them every time we encounter them. The real trick is in recognizing which pattern applies to a given situation. Most of these patterns are applicable to many different technologies although there are also a handful of domain or technology specific design patterns as well.

  281. Further interviews. by RingDev · · Score: 1

    I'm not real big on the fishing expedition either, but...

    If he does see a few responses that hit on points he is researching, he could attempt to contact those specific people and conduct more traditional interviews. And interviewing industry professionals, last I heard, is an acceptable form of research. Not enough to write a thesis on, but enough to get some more detailed statements than can be quoted and attributed as supporting arguments.

    -Rick

    --
    "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
  282. Recommendations by BigBlueOx · · Score: 1

    Glad ye asked, sonny. *spit*

    90% of the software life cycle is maintenance so any o these here design "principles" you fancy-schmancy PHDs come up with that don't create code that's *trivially* easy to maintain is bullsheet *spit*

    Dip into the little book "The Martian Principles for Successful Enterprise Systems: 20 Lessons Learned from NASA's Mars Exploration Rover Mission" by Ronald Mak (John Wiley & Sons - ISBN 9780471789659) for a smattering of generic language-and-project-size-agnostic Good Processes.

    Now help me get my walker so ins I kin git me tobaccy *spit*

  283. Formal design by Anonymous Coward · · Score: 0

    Prof. Manuel Caeiro in University of Vigo (Spain) works on Software Engineering Principles, focusing on formal design. He is part of the GRIS (Grupo de Redes e IngenierÃa del Software - Software Engineering and Networks Group), the website of the group is http://www-gris.det.uvigo.es.

    Good luck with your PhD!

  284. good by dadatianpu · · Score: 1

    i do not repla http://www.google.com/

  285. How software fails by YuuShiSann · · Score: 1

    I think studying how different kinds of software fail will help you to understand what is a good software design principle e.g. M$ addressed blue screen of death. Software can fail in many dimensions e.g. cost, performance, time-to-market. Each dimension demands different approach. So I guess by addressing these topics, they should get you somewhere for your thesis.

  286. Topic Change... by Anonymous Coward · · Score: 0

    You might want to consider changing your topic to how much information you can actually obtain from people on social sites such as slashdot. I should hope you learned your lesson today... ...see you around campus, I guess.

  287. Some thoughts on this issue by slbain · · Score: 1

    I agree that the principles, practices, qualities, wisdom about good software are not confined to OO technologies (I've seen design patterns used in Fortran, and my friend Amir Kolsky once taught a TDD course in COBOL). However, they are easist to see/discuss/outline in OO, because OO sprang from them. Here's a link to a talk I did about the subject: http://www.netobjectives.com/resources/books/emergent-design (click on the link "Watch Scott's webinar about Emergent Design (1 hour)" It's a multi-media (camtasia) recording, so be a little patient if your bandwidth is limited.

  288. a consistant environment & stringent conventio by stoobers · · Score: 1

    Any time spent dealing with overhead is time not spent being creative and solving problems. All the overhead keeps people frustrated.

    Don't use an environment that needs makefiles. Pick an environment that manages compiling issues for you. Or one that doesn't need make files at all.

    Write mini-compilers that generate code from config files for you, rather than spend hours hacking out code in languages that weren't designed for the purpose they are being used for.

    Use very strong data types. That way, bugs get stopped at compile time.

    Use very strict naming conventions: either camelHump or underline_no_caps - no frustration!

    Should variables have plurals? Yes or no? Naming conventions for the file system: caps or no caps, underscores_or_not. If you make everything singular, there will never be confusion or the variable names.

    Code review is essential. Make everything look the same, so you can't tell who wrote what.

    Don't use comments - use conventions.

    Use opensource. Its less likely to stop a developer over technical issues, like windows does. And opensource grows old and fades like bluejeans rather than suddenly exploding for unknown reasons, as closed source does.

    "Spec" the hardware the software will run on.

    "Spec" the software the hardware will run.

    Stop pretending databases can effectively abstract data and still maintain acceptable performance. Just spec the hardware.

    Publish performance expectations, rather than just say "We'll optimize as needed". What the hell kind of spec is that?

    Plan the project around remote developement techniques.

    Make part of the project GPL/commercial licensed and roll the code into a Linux distro.

    Be proactive in keeping one individual from having too much influence and becoming so important that the project can't function without him.

    Find people dedicated to helping one another at all costs, instead of jerks who want to do it their way, is nice (hire some women).

    Get rid of the CEO who didn't used to be a techie.

    Get rid of the CEO who thinks the engineers should speak to him using "CEO-speak"

    Hire someone who's sole goal is to sit between the developers and the bosses and translate.

    Figure out what the programmers needs and goals are for their lives, and figure out a way to help them, rather than present some static employment deal that requires them to fabricate need as a means leveraging their career.

    Donate money to local causes. A lot of money.

    Let developers work from home.

    Cover 100% of their health benefits.

    Honestly, there is no technical limitation that a skilled individual can't overcome. Now, market and interpersonal limitations... That's where the real road block comes in. It doesn't matter how good your code or environment is - no matter how smart your people are. If you boss is a dumb ass, that's the person who will stop you project from being successful.

  289. Limit the scope by Anonymous Coward · · Score: 0

    It seems to me that all great software I have encountered either has limited scope. The fewer things a piece of software does, the more likely it is that the software will be excellent.

  290. Signal:noise about 1:20 by cconnell · · Score: 1

    Yes, there are a huge # of criticism, but I still got some useful comments and links.

    Chuck

  291. A lot of noise from the other coders by lugonnn · · Score: 1

    When i first started coding, i listened to the senior coders for hours on how the reservations, sales, and acct software worked together. That told me what files to code.

    Then i went and stayed in the Sales floor for a month and found out how it really worked.
    I went to the Accounting dept. and found the workarounds they used every day, to bypass our software.
    I even made a sale to test the whole thing!

    Long story short, coders don't use software. Seriously, they don't. They don't know how, because they know how it works.
    they bypass things in their head, they don't answer to anybody. Go find the Standard Operating Procedures and see how closely they are followed. Go do the job, be the tester. Everything else is useless assumption.

    --
    Don't apologize for your own behaviour.
  292. My book might be of interest by cjonslashdot · · Score: 1

    Not sure if it is of interest, but my own book, High-Assurance Design (2005, Addison-Wesley; http://assuredbydesign.com/haa/) attempts to identify a useful set of "principles" pertaining to both security and reliability for practical software engineering. I tried to target practicing software architects, and so the book is not written as a "security book" or a "reliability textbook", but a handbook of sorts. The taxonomy includes about 180+ principles, each explained in detail, with design patterns. It is not a programmer's book, as there is not alot of code in it, but rather a book about design. It also contains a taxonomy of social engineering techniques, which you might not find elsewhere. The book has a foreword by Peter G. Neumann, one of the pioneers of Multics and of secure design in general. I hope it is of value. Best regards, - Cliff.

  293. The right team at the right time by Anonymous Coward · · Score: 0

    Hi Folks

    Reading through many answers, the funny and the earnest ones, I honestly think that your are ALL mislead. 'Good software', what makes good software? WHAT _MAKES_ GOOD SOFTWARE? It can certainly not be pinpointed on the requirements, the architecture, the design nor the code: Good softwaree is made by the 'right people at the right time from end to end'. You might have the perfect architecture, design and code. However, if the business analyst screwed up, the software is crap. You can turn it as you want. In the end if you had the right people to work with - hopefully including the customer - everyone will happily think back about his time on this project and the final result. You do not even require the market hot shots - or /.lers - simply the 'right people'.

    Regards
    Chatzi

  294. General Design Principles by Anonymous Coward · · Score: 0
    Here's the set I always use, which can be applied at any level of the programming process:

    • Flexibility: allows uses not thought of by designers
    • Extensibility: can be customized to accommodate specific end-user needs
    • Reuse-ability: of both code and user data
    • Controllability: higher-level code or external programs can drive it
    • Portability: can operate in different environments
    • Simplicity: easy to understand and use, with limited side-effects


    I've published that list before, so credit me if you use it. If you want to know more, just email me. You can figure out my address with the info provided here.
  295. One posible reference by Anonymous Coward · · Score: 0

    Only an interesting reference:

    Beautiful Code
    by Andy Oram, Greg Wilson
    June 2007

  296. Architect the solution by Anonymous Coward · · Score: 0

    To be honest, The best software development starts with good architecture. Good architecture is usually Simple, straight forward, and follows the way the architect thinks. Too many people try to do things in too complex a fashion. If a function can be used to add numbers, adding 10 parameters to make it add objects is not very useful.

    Developers should not try to who off either. Just write what is necessary to fit into the overall architecture. Document the architecture. Programs without a solid architecture are not good programs.

  297. Thanks! by cconnell · · Score: 1

    I did get some good ideas within all the hate. (And of course this is not my only method of research.)

    Chuck (OP)

  298. Made with love by joto · · Score: 2, Insightful

    Most bad software is rushed, created by bored programmers, in a corporate decision to create another boring and faulty-by-design software system.

    Most good software is written by a small team of very excited developers who love what they do, are given the resources to do so, and who couldn't even think of a more exciting system to build.

    You can add all the modularity or simplicity or readability or whatever you need, but unless it is made with love, it won't be beautiful.

  299. Good software needs good analysis. by Anonymous Coward · · Score: 0

    No matter which kind of software. A good software design needs a good previous analysis. Software "usually" has an objective. If it's soft to be used by human beings. A good point to start is asking what the user need, by figuring wich are his objectives. Once you have a good user-model to ask what he need, you'll need to figure the context in which the user is going to work. May be you'd like to read Cooper, Saffer, Weimberg,... a little recomendation list I found:

    http://astore.amazon.co.uk/ricdevass-21/026-1329438-3042066?_encoding=UTF8&node=2

  300. We CAN learn from other areas by Anonymous Coward · · Score: 0

    I'll argue strenuously with #4. Many of the principles of good prose (organization, omit needless words, say what you mean simply and directly) apply very well indeed to software.

    As to architecture: if we strip the application-area details, architecture is neither more nor less than the relationship by which the parts become the whole. Given that almost all programs are organized from smaller parts, architecture is a critical consideration at every level above the individual variable or constant.

    To describe an architecture, you must identify the whole and the parts and, for each part, identify what it does, what resources it uses from other parts, and what it contributes to the whole by doing it.

    Regarding the old input-process-output view, a similar view may help when looking at the architecture. The uppermost 'layer' of software provides certain semantics at its top. Its interior expresses those semantics in terms of what the lower layers/modules provide. This continues downward until the semantics are provided by the programming language, the hardware, libraries, or some external facility (perhaps at the other end of a socket or pipe).

    Oh, I'm the AC who wrote above about Separation of Concerns and the radical definitions of coupling and cohesion.

  301. The Pragmatic Programmer by darCness · · Score: 1

    Read this book. Then read it again. One of the best books written on the subject in recent years. I think it's been updated recently, so you may want to get that one, but this version is excellent.

  302. Did it succeed? is not enough by Anonymous Coward · · Score: 0

    We must realize that one of the most critical users of the program is the next generation of the same software. If it cannot be modified as needed without introducing bugs, it will not meet the needs of the users. The program must have a stable design (change in code is roughly proportional to change in problem definition), which requires that the right things are flexible and, as a corellary, that the right things are fixed.

  303. Software too young? by Anonymous Coward · · Score: 0

    One problem is that software managers prefer young programmers. They are cheaper and have less experience to get in the way of getting it done now.

    Somewhere in the last few weeks, physorg.com captured an article which reported that while older people often work more slowly, it is not always that they are slower by nature but that they have more experience to bring to bear.

    Getting 1500 lines of code written in a week sounds good until you discover that it takes six weeks to go through test. If an older programmer got the same results with 1100 lines and those lines took two weeks to write but only two to go through test, you have a considerable win ... especially if you need to modify that code for the next version of the product.

  304. Boring code? by Anonymous Coward · · Score: 0

    I can't agree with the idea of making code boring. Boring code makes the reader careless.

    Nor should the code be challenging; challenging code leads to the reader skipping it.

    Code should be interesting in that the reader should be able to learn about the problem solution while reading it. It should turn a hard problem into a simple one.

    And, if it can, it should be exciting in how well it expresses the problem.

    If you can get your hands on the source code for the very early Unix OS versions (v5, v6) and Dennis Ritchie's C compiler, I suggest you do them. There is much to criticize, but far more to revel in; this is exciting code in the amount it accomplishes with relatively few lines; if you are still malleable it may change your code permanently--for the better.

    1. Re:Boring code? by johannesg · · Score: 1

      I can't agree with the idea of making code boring. Boring code makes the reader careless. Fine, the chances of me employing you were slim to start with so it isn't a great loss for either one of us ;-)

      And, if it can, it should be exciting in how well it expresses the problem. I guess you are a few years younger than I am. I used to think like that. After enough years in the corporate grinder, you are just happy when you find some lucid, boring, non-special piece of code that just does what it is supposed to do in the simplest way possible. Because let's face it, I (and I guess everyone else) gets to see lots of exciting, dare-devil, unusual code and it always sucks having to understand, maintain, or change it.

      If you can get your hands on the source code for the very early Unix OS versions (v5, v6) and Dennis Ritchie's C compiler, I suggest you do them. There is much to criticize, but far more to revel in; this is exciting code in the amount it accomplishes with relatively few lines; if you are still malleable it may change your code permanently--for the better. Wasn't I just arguing for precisely that? Doing what is needed in the most simple, most lucid way possible?

  305. Re: your thesis by liacona · · Score: 1

    You've chosen a wonderful topic ... I won't point to specific URLs, but you will find a lot of information around software design/development best practices. You will quickly realize that this discipline is part science and part art (arguably, the latter is more important). You are correct - OO, XP are not stand alone answers, but such methodologies do provide very good pillars to lean on. And while there are well implemented COBOL applications, I would argue that OO does matter - 20 years of history tells us that an OO approach tends to yield more stable and maintainable systems when applied properly (and that's key!). I believe the answers you seek are multi faceted - rooted in technology, approach, teamwork, management ... discipline - what we do is often called a 'discipline'. There's a double meaning there. I'll call out a few specifics: 1 - design/implement at the right levels of abstraction. Push complexity down to it's proper level. If 80% of a code base looks like pseudo code, a good job was done. 2 - Separation of concerns can't be over stated. Modularity is great, but only if each module minds its own business. 3 - Pick a language / technology whose expressiveness / facilities match the problem at hand ... life will go a lot smoother. 4 - Only a project that takes refactoring seriously, and builds in the overhead for refactoring cycles will succeed in the long term, and yield an elegantly designed & implemented solution. Management that poo-poo-s such measures as wasteful play time is doomed to fail - in a business sense and in the context of your thesis. 5 - The team must work with a common mindset and apply principals intended to yield a system that has the qualities your thesis wishes to quantify. I would strongly suggest - along with your other research - to take a breeze through "The Pragmatic Programmer" by Hunt & Thomas. It's a must read. Good luck with your project. Would love to offer feedback as you proceed - feel free to ask - louis.iacona@verizon.net -- Louis Iacona

  306. software design by Anonymous Coward · · Score: 0

    Martin Fowler has published a lot work in this space. While very little is original, he is a great communicator and ties various concepts together well.

  307. Look at the masters of coding for insight by danielstoner · · Score: 1

    You can start by reading what people who have written good software have to say: The Creators of 30 Programming Languages: pages, biographies, blogs, interviews

    --
    www.littletutorials.com
  308. What is good software and who created it? by danielstoner · · Score: 1

    In my opinion good properly designed software has to do a lot with "who" and less with "process and how". If you look carefully you will see real people behind good software. You should try to find out how these real people think and work, what are their values. If you consider for example the most important programming languages as examples of well designed software (sometimes debatable, I know), you could try to read more about them: The Creators of 30 Programming Languages: pages, biographies, blogs, interviews

    --
    www.littletutorials.com
  309. My rant by DogPhilosopher · · Score: 1

    Given that every reply you got here basically says something different, I'd say that although many people have very strong opinions on this subject, nobody really knows. The same goes for me, and I have been developing for 24 years, I have a PhD in Computational Linguistics, worked in industry, taught software engineering courses etc. Of course you should be aware of methodologies such as waterfall, XP etc. But if you take a closer look you will see there is neither much of a theoretical nor an empirical basis for them, it always comes down to some guys saying 'this is how you should do it, trust us'. Think about it, would you buy a mortgage backed bond from somebody who tells you that documentation is a bad thing? Only in software engineering will you hear such a thing. So, the truth of the matter is, nobody knows. I think heavy engineering-type approaches generally do not work and are not used in practice. As an example, take OO programming. Almost any programmer will tell you that principles like inheritance, data encapsulation etc help you write better code. But, as far as I know, nobody bothered to check whether this is actually true (in a scientific way) until Les Hatton did, and guess what: he claims that OO code is significantly more buggy than non-OO . It seems counter-intuitive, but there you go. Another disturbing finding is that software quality has steadily decreased over the last few decades. I don't think his work has had much impact on how code is written nowadays. Another example, Cleanroom. It sounds good, the most scientific approach to software development I know of (http://en.wikipedia.org/wiki/Cleanroom_Software_Engineering). Case studies have indicated that it's really good for delivering high-quality, cost-effective code. So good in fact that, as far as I know, nobody has ever adopted it. Cleanroom is an extreme case, but I could give many more such examples. The main reason for bad software is not technical, it's caused by the way the industry works. It's run by the kind of people that believe in motivational posters. That kind of mentality is dangerous in any engineering discipline, where you need to think defensively. Another problem is that there is no regulation as found in any other industry (food, aviation, civil engineering, healthcare etc). The way I see it, there's a war going on between professionals and 'generalists', and in ICT the latter have been on top for decades. Compared to say lawyers and surgeons, software developers have very little status. I hope I don't sound too cynical, of course I think there's a place for SE and I wish you the best of luck with your research. But I'm very sceptical about software quality going up in the near future as a result of SE research. There is hope though. If a team manages to steer clear of worst practices, and uses some kind (any kind!) of methodology, it would already produce code that's way beyond industry standard. The things you read on http://thedailywtf.com/ are just the tip of the iceberg. I've seen industry-grade code which had an implementation of bubble sort (in C). Some of the worst practices imho: - hiring the most uneducated and uncaring people you can find. All large IT firms do this, they're cheap, malleable, and motivated by money, which is something any manager can understand. Also, managers don't like to have people work for them that are better educated than they are. So as a customer, you pay extortionist prices to have art history majors and ex-cons build your back-office software. Another problem is that, even if a firm does not have this kind of policy, recruiters tend to be clueless bimbos. I've heard one of them complain about not being able to find C-programmers, "only C++, and what use are those!". I've also heard a recruiter proudly proclaim "we only do projects for large companies, the others can't afford us". - hiring antisocial, narcissistic people. Obviously arrogant behaviour is an indication of high market value. Never mind that such people check in non-comp

  310. PhD Fail by Anonymous Coward · · Score: 0

    Don't take this the wrong way, but this is a worrying question for someone who is allegedly going to complete a PhD in this area.

    Be aware there is a risk you will spend the next year or two procrastinatng, then becoming hugely depressed and ultimately giving up your PhD. Get your s**t together now, son, or start doing something else.

  311. Design principles by ElecCham · · Score: 1

    A bit of explanation: my background for most of the last ten years has been in building frameworks that get mostly used by others - specifically, applications/libraries that get used to write tests and/or build field tools for hard disk drives. An awful lot of this was "oh shit" sort of work - someone comes running to my group after discovering an issue on a product after it's shipped, and they need a tool to fix the problem, and they need it a week ago. So a lot of my designs grew out of the need for extremely flexible code that could be repurposed quickly - in other words, the ultimate in code reuse and modularity. Most of it also needed to run on three different OS families (and they would have liked a couple more).

    Here are the ones that I try to follow; most of them apply to design of just about anything, not just code:

    0) Using performance as a reason to bypass any of the following rules is acceptable only once you've demonstrated a problem with a profiler. "Programmers are notoriously bad at predicting how their programs actually perform."

    1) Decide before you start what toolboxes you're going to require. Invest (money, time, whatever) in the best tools you can afford. If you have to spend time wondering whether your tools are broken, you've probably chosen poorly.

    2) Spec your functionality, then design your public interface. Write to the interface. Do your damndest not to change that interface after you "ship" your module.

    3) Do not include anything in your interface that falls outside the toolboxes you've selected in item 1.

    4) Decouple your modules. I cannot possibly over-emphasize this. No "convenience exceptions"; the time you save by tying two modules together will be lost the moment one of them needs to get used somewhere you didn't plan for... and you *will* need to.

    5) Along with decoupling, try to keep your functions as general as possible (but see also rule 0). It's a bit more work to write a general-case function than a specific one, but when you end up needing a variant of that function later, you'll be glad you did.

    6) When possible, write portable code; you never know when you'll need it to run somewhere else. This also provides you the ability to use additional debugging tools that might not be available to you on your first platform. How to accomplish this is a topic worth its very own list...

    7) Pivot the world around configuration files. That doesn't necessarily mean a file on the end-user's drive - it can mean a compiled-in source file which configures the program's behaviour. But don't hard-wire it into the function.

    --
    Sig broken, watch for .finger
  312. Sure they do ... but ... by SplatMan_DK · · Score: 1

    Sure they do. But they also have many places where using an MVC would slow down performance without justifying the benefit. So perhaps they use it in some places, but I can't imagine they do it for every single pixel/cell you can edit :-)

    - Jesper

    --
    My security clearance is so high I have to kill myself if I remember I have it...
  313. You are missing the point :-) by SplatMan_DK · · Score: 1

    Care to site any studies supporting these claims that design patterns such as MVC and UP objectively improve the quality of software produced by a given number of people in a given amount of time? If not, your opinion, despite your merits, remains only that - otherwise how could we call ourselves scientists? You are missing the point - that is exactly what the author went out to do. Perhaps he may prove my examples/opinions/experiences wrong. In that case: fine :-) But the author is the scientist, so it is his/her job to include topics like implementation methods (such as UP) and Software Patterns. His paper will then (hopefully) either confirm or deny these common conceptions.

    :-)

    - Jesper

    --
    My security clearance is so high I have to kill myself if I remember I have it...
  314. I respectfully disagree :-) by SplatMan_DK · · Score: 1

    I respectfully disagree :-)

    An MVC implementation can be quite lightweight and small. And used in very small apps where data is altered from multiple sources and the view needs to be kept up to date automatically.

    - Jesper

    --
    My security clearance is so high I have to kill myself if I remember I have it...
    1. Re:I respectfully disagree :-) by fabs64 · · Score: 1

      True enough, but if that's all you're using it for what difference of intention is there between that an the Observer pattern?

      IMHO MVC Always seems like a pattern to design a system around (architecture) rather than a part of a system (design).

      I do see your point though.

    2. Re:I respectfully disagree :-) by SplatMan_DK · · Score: 1

      You are correct in stating that MVC is often used as an architectural approach. But I think that is the result of a few decades advanced system development. Today MVC is used a lot in the middle-tiers of n-tier solutions. That observation certainly supports your statement. Business consulting companies have also added a lot of BS terms to describe the same problem/solution, giving it names such as "model-based application", "GUI/logic separation", etc.

      But when MVC was originally conceived in the late 70s on mainframes, it was merely a way of solving a very primitive issue: how to ensure that many users viewing the same database record had the latest information on their screen.

      You can find very lightweight MVC implementations in modern IDEs, and the sole purpose of those lightweight implementations is to ensure a correctly updated user interface (view) in a program where the underlying data is changed often and by other sources than direct input from the view itself.

      A good example could be a hard disk defragmentation tool with a graphical display of the actual defragmentation. While the defragmentation process is moving data on the hard disk, the GUI needs to be updated with the new information. Perhaps even for multiple disks (and thereby multiple different defragmentation processes). At the same time the user might want to interact with the view (pushing buttons or resizing the graphs). The user might even have multiple windows open displaying the same defragmentation process, in which case all open views should be updated to reflect the same information. In this case a lightweight MVC approach would be sensible to use.

      The observer pattern you refer to can be used in about a billion different scenarios, for a billion different things. It is much more general in nature (which is not bad, just different) than MVC, because MVC is used solely for applications with actual user interaction and a UI displaying information. In other words, MVC solves a much more specific problem than the publish/subscribe (observer) pattern. Most MVC implementations also provide you (the developer) with a library of ready-to-use classes and methods, with which you can construct models, views and controllers. If you used the observer pattern for the same job, you would be required to write a lot of code from scratch (defining which events to publish, which ones an object should subscribe to, and what to to with them when they are triggered).

      Perhaps it could be argued that the observer pattern is used in modern MVC implementations, as a method for handling the messages between the objects - i don't know if that is true though. I am not a programmer on that level :-) I use frameworks, I don't actually make frameworks myself... :-)

      - Jesper

      --
      My security clearance is so high I have to kill myself if I remember I have it...
  315. Re:How about a practicum with LM Space Systems fir by deanlandolt · · Score: 1

    Other places to look for: Linux Kernel team. Donald Knuths Tex/Latex. You don't believe in testing either?
  316. Data Persistance by GWBasic · · Score: 1

    It's still difficult to program with large amounts of persistant data. Object/Relational mapping needs to be much better; and this might mean blending aspects of SQL into traditional OO languages; and making relational databases a little more friendly to objects.

  317. Is this question real? by fish_in_the_c · · Score: 1

    Don't forget the parent could just as easily be doing PH.D work on the pshycology of web boareds and how they effect software engineering concepts then the question would be a really good one to ask ;)

    --
    âoeTolerance applies only to persons, but never to truth. Intolerance applies only to truth, but never to persons.
  318. Start with Vitrivius by Anonymous Coward · · Score: 0

    Start with the Roman author Vitruvius. Writing in the 1st century AD about architecture, he recommended three principles: firmness, commodity, and delight. In other words: It works, it does what it's supposed to, and it's a pleasure to use.
      - Jim Hoekema

  319. google or citeseer by Anonymous Coward · · Score: 0

    Google it:
    http://www.google.com/search?q=Software+Design+Principles+conference
    Oh, see, there's even a conference as 1st link. Read the papers of the previous conferences, look at their references, get more papers to read, more conferences/workshops to look for. Submit to that conference, get accepted, present and discuss with people there.

    Citeseer is also helpful sometimes: http://citeseer.ist.psu.edu/
    Search also in LNCS (Springer), ACM or IEEE

    Concerning your paper: mmyaaaa, I didn't read it, but still, I won't bother even skimming through it as there's no references (except Code Complete).

  320. Anonymous Coward by Anonymous Coward · · Score: 0

    Read what is asked for.

    It asks "general principles of good software design", such as maintainability, and reuse-ability . Or is the question about QA and catching bugs?

    quote - "object oriented methods' or 'try extreme programming". OO design or paradigm.

    The question don't make sense and I confused myself!!!!

    Do your own PHD or atleast know a little about what you are asking