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."

37 of 541 comments (clear)

  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. Code Complete by Anonymous Coward · · Score: 3, Informative

    This is an excellent place to start:

    http://www.cc2e.com/

    AC

  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!
  5. 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 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.

    2. 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
    3. 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.

    4. 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.

    5. 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.
    6. 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.
  6. 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.

  7. 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 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
    2. 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.

  8. 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.

  9. 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?
  10. 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 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.

  11. 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.

  12. 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.

  13. 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.
  14. 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.

  15. 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 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

  16. 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.

  17. 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.
  18. 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!
  19. 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

  20. 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",
    }

  21. 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??

  22. 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
  23. 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.
  24. 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.
  25. Re:Modularity by sapphire+wyvern · · Score: 4, Funny

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

  26. 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.