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

75 of 541 comments (clear)

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

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

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

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

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

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

    This is an excellent place to start:

    http://www.cc2e.com/

    AC

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

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

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

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

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

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

    8. 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.
    9. 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.
    10. 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!
    11. 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.
    12. 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.

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

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

  7. weak by Anonymous Coward · · Score: 2, Insightful

    Dear Mister PhD,
    do your own damn homework.

    Love,
    the management

  8. 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
  9. How to Design Programs by ramakant · · Score: 2, Informative

    http://www.htdp.org/

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

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

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

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

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

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

  18. 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
  19. 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.
  20. 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 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
    2. 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.

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

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

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

  23. 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.
  24. 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!
  25. 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

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

  27. 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).

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

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

  30. 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
  31. 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.
  32. 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.

  33. 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.
  34. 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.

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

    Most universally useful

    // Comments.

    Least universally useful

    /. Comments.

    --
    John
  36. 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.
  37. 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

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