Archive for the 'Softwares' Category

19
Mar

Software assumptions: does compiling have to be determinstic?

I was reading a bit about the usefulness of keeping your class diagrams hand-drawn, and the idea really appealed to me. But for purposes of this post, hand-drawn diagrams aren’t nearly as interesting as the fact that I like hand-drawn diagrams.

You may have noticed I’m sort of a software hippie. I want us to all draw, brainstorm, think, talk, break free from various shackles and sit in a circle weaving software out of reeds.

I have this hope that by challenging some assumptions about software engineering we can make it easier to do, more creative, natural, etc.

Which of these assumptions are simply unchallengeable though? Which are just inherent to software? How about the fact that we need to create compile-able code? After all, if we don’t create code, is it still software engineering? Is it still programming? If we say we should let people translate our source code into assembly, we still have people making code, we’ve just moved it down a notch. If we try to say that we should write instructions to people, who will wizard-of-Oz some standard components around the screen, we’re really just designing a service or process, one which happens to interface through a computer; we’re not really programming anymore. So lets call that one insurmountable – we need to create compile-able code.

That may be an obvious assumption, but to me it is a bit of a sobering one. The fact is, no matter what you put in between, people need to create something that a machine knows how to turn into a program. That implies that no matter how creative and free spirited we want to be throughout the process, eventually we have to play by the machine’s rules.

I want to know what other assumptions really truly hold about the way we do software though. What is inescapable, and what is just really deep-seated. The later stuff might be worth challenging. So today I want to look at deterministic compiling.

Continue reading ‘Software assumptions: does compiling have to be determinstic?’

13
Feb

So, I was looking over my blogs, and realized I haven’t touched this in forever. It’s officially dead until further notice, though I’ll keep it up for now.

I think part of the problem is that I’ve been explicitly rejecting theorizing and navel-gazing for a while now. I could do that forver if I’m not careful, and I need to actually accomplish some stuff and get my PhD already.

The purpose of this blog was allways just to dump stuff half formed, but I’m in a bit more of a convergent, practical mindset for a while.

13
Feb

I’ve kept this blog pretty professional, but some quick recommendations, if you want to know what I think is what:
All-time, hands-down favorite anime:
FLCL
Soul-rendingly good albums of late:
The Hold Steady - Separation Sunday
Girl Talk - Night Ripper

13
Feb

Returning to coding for the first time in years, I was struck by a thought. Nothing groundbreaking, the sorts of things Davis and Brooks and god knows who else has been saying forever, but it struck me with a certain clarity how software’s nature both encourages and punishes change. What a jerk.

//Software is an information product
//Because it is intangible, it is easy to change
//But because it is invisible, understandability is brittle to change
//This means creating software, and therefore undergoing the modifications that are inherent to creating software, requires discipline

13
Feb

Design Principle: 3-Tiered Cost of Trying

Tier 1 - The Team Activity Level
Herbert Simon discusses a principle whereby one must weigh the value of learning something about a design against the cost of learning it. This generally is applied at the level of analysis techniques, or rigorous design methods. For example, you might run a user test whereby 15 groups of 10 people are each given a different possible design. Based on their feedback about the designs, you can learn about which qualities of those designs are more or less desirable.

But this is a very costly exercise, in terms of time and money. You must create 15 disctinct, functional prototypes, organize 150 subjects and to test them, not to mention employ those who will help administer the testing sessions. You must analyze the feedback recieved and derive useful insights. You must pay everyone involved, or otherwise incentivise people to participate in your study.

Information gathering is good, but is such an activity the best course of action? Would it have been easier to do a computer simulation, create less different prototypes, research existing studies on similar problems, or simply do without the information you gathered? In many cases, other options present themselves, and the costs must be weighed.

Tier 2 - The Individual Task Level
This sort of equation is usually performed implicitly by the designer, and is a fundamental force that shapes the way that we perform our design process. We are always going through implicit cost-benefit analyses, and choosing the route that seems to provide the most benefit for the least cost. We do this without even thinking about it. We know that early in the building design process, it is “cheap” and extremely useful to draw sketches, and to get a feel for the sorts of structures and layouts seem most promising. We do this without even thinking about it.

This provides us with a way to shape the way a community of designers performs: change the costs or benefits of different design activities. Oftentimes, in software, we try to prescribe certain process models or workflow models, and tell people explicitly “do X, then do Y after you have completed Z”. But people’s internal cost-benefit analyses weigh heavy on their choices. If we are able, as a community, to provide software designers with activities that are perceived as low cost and highly informative, we are able to influence approaches.

Currently, there exists little in the way of low-cost ways to gain early, divergent ideas about a software project. We can sketch interfaces, but the feedback gained is not always all that useful, and provides little insight into class-level design decisions. We can prototype out several possible solutions to see which is best, but this is extremely costly, and likely to be refused.

What I’m driving at is: I think we need more divergence in software design, but if this is to be achieved, it won’t be through activities or process models, it will be through tools that give good, cheap feedback.

Tier 3 - The Per-Click Level
In a way, these first 2 “tiers” are obvious. Simon presented the idea of analysis-tier cost-benefit thoughts, and it seems obvious that everyday design activities are goverened by this kind of thinking, if at least implicitly. But what intrigued me about this idea is the way that, taken to the extreme, it ties into another idea that has long been travelling around my research group.

A couple years ago, my group started really focusing on design environments, and 2 ideas that came out as desirable were super-undo (much like Photoshop’s concept of History) and layers (much like Photoshop’s concept of, well, layers). I don’t necessarily know the underlying desires that pushed us towards these features. On one hand, we figured, creating UML diagrams is essentially a drawing exercise, and photoshop is an image manipulation tool, so what’s good for the goose is good for the gander. But I think there was more to it than that, we sensed that these features could provide something for software that had previously been missing.

Insight into what these features provide can be found by considering the cost-benefits of design at the single-action level, which I have spontaneously called “tier 3″. When you are designing, and you have a partial design in front of you, you have several options. You can continue to flesh out this design, of you can explore several options and choose one, or you can undo some of your work and try a new direction for the design altogether.

Its really not so different from the thought process you undergo when you decide whether to perform a user test or charge forward with a promising, if untested design. The decision-making on this micro-level revolve around your notions of cost-benefit. There is not mathematical analysis that you perform for this, you don’t weigh the numerical value of exploring versus completing. But in the back of your mind, you feel a certain way about your options.

To illustrate this, consider the process you use when you’re writing in a fully featured text editor like Microsoft Word. If you want to try to rephrase something, you can try just making the change, confident that the program’s many undo’s will restore your old version if you don’t like the way your changes worked out. Or you might move your cursor above an old paragraph to try rewriting it, allowing you to glance down at what you had before opportunistically, guiding you towards a new version that is different, but draws inspiration from the old one.

Compare this to using an old word processor, maybe an old version of wordperfect, running in DOS. Here, you might only have 1 undo level, if any at all. At best you can move the cursor with the number pad, but you might not even have a cursor, being forced to backspace back through, deleting everything after the point you want to change. Copy and paste features aren’t what they’re going to be.

In the latter case, the cost of making changes, of adjusting course, of exploring your design space, is very high. You are implicitly discouraged from trying a given design path. So you dutifully chug down to a single, likely imperfect document. Similarly, if you do want to try something new, the benefit is often reduced. Suppose you want to try a new version of a previous paragraph. You may not be able to easily move your cursor up to write alongside the old paragraph, forcing you to take your hands off the home keys and scroll up every time you want to check your old paragraph against the new one. Your benefit for the “try a new paragraph” activity is limited (because of its cost, its all interlinked).

In the end, with the poorer word processor, you are less inclined to follow a good, exploratory, divergent design process. Its a hassle, so you become a bad designer because of the tool you use.

All the Tiers Together
And of course, these tiers ripple up. If its hard to compare paragraphs, the cost-beneift of this activity is low, and you won’t bother writing a second one. If your writting process doesn’t involve paragraph comparison, the docments you write are less likely to be effective, and so perhaps document writting becomes an activity that is less desirable, in a cost-benefit sense, in a larger design process. If it is extremely hard to write good documents, you might be less inclined to jot down your design thoughts in a document, and might be more inclined to make handwritten notes or drawings. This continues to ripple up. Maybe if you have an analysis activity that you’re considering, that involves creating writeups of the attributes of several possible designs. If the cost of electronic document creation is high, the cost-benefit of an analysis activity might be unfavorable, and you might not bother. In theory, the word processor you use can determine whether you explore several architectural designs for a building.

And so we get back to software. The fact that our UML-document-creators don’t have good undo options means that we are less inclined to explore different options. The fact that they don’t have layers means that it is hard to gain the benefit of comparison if we do create multiple designs. These facts together mean that exploratory UML document creation is not all that great from a cost-benefit standpoint, which means that creating UML documents isn’t such a great deal, which cheapens the value of up-front diagramatic design in the first place. Taken to its extreme, a poor UML tool prevents us from following a good design process at all.

This may seem like exagurated reasoning, but I think there is some truth to it. People won’t do things they don’t see as worthwhile. If we want software engineers to design we need to engage their sense of value on the per-click level. We need to provide them with tools that give them real, useful feedback, at a low cost in terms of time and mental effort. We can prescribe processes from on high all we want, but if we are fighting against a designer’s day-to-day, minute-to-minute, thought-to-thought instincts about what to do next in the tools they use, we’re doomed to failure.

13
Feb

Makeblog links to World’s Largest Band
This is not normally a personal blog, but Make magazine’s blog linked to my HTML-to-MIDI converter. Make is one of my favorite magazines, and a pretty popular blog, so I am pretty happy about it.

http://www.makezine.com/blog/archive/2006/06/html_to_midi_what_does_a_site.html

13
Feb

Making Software is like: Solving an Excessively Difficult Wooden Block Puzzle
I’ll warn you now, this post is much more rambling than usual; I am a bit out of practice and I am trying to tackle an issue that is still a bit ill-formed in my own mind. I want to discuss the fault-based nature of the software design process. Why do we seem to describe a software design more in terms of what it does wrong, than what it does right?

In my pen-and-paper maze post, I explained that software design seemed like it was about bumping into problems and adjusting, rather than plotting a course and following it. I emphasized that the problems were often difficult to foresee. I think this is true, but I want to elaborate on it, because I am increasingly thinking that this is central to the difficulty of software design.

Consider a given design, whether it is a blueprint of a building, a spec of a product or a software design document; the object described has its strengths and weaknesses. The blueprint might specify a building that is majestic-looking, will provide a great deal of useful space and will be inexpensive to produce. But it might be susceptible to earthquake damage, or violate a local building ordinance. Every designer tries to maximize the positive aspects of his or her products, while minimizing the negative. But is this especially difficult in software? It feels like it – it seems to me that the negative consequences of a design are difficult to anticipate, and difficult to fix, compared to other fields.

The first aspect of this is the inevitability of problems in software designs, that is, the difficulty of foreseeing problems and avoiding them in the first place. In some fields, the sorts of problems that might befall a design are often easy to understand beforehand, internalize and use to intuitively guide the design as it progresses. It’s an oversimplification, but we might consider the major problems that an architect’s design might have to be: structural instability, failure to provide enough space of the necessary kinds, and aesthetic unpleasantness.

The first of these is intuitive to the architect; he will rule out and design paths that would cause structural problems without even thinking about it. He can then think about the types of rooms that are needed (meeting spaces, bathrooms, hotel rooms, whatever) and begin to compose frameworks of ideas that incorporate these needs. He might consider the necessary rooms to be building blocks to be arranged, and can then focus on assuring himself that the final concern, aesthetic pleasantness, is met. As each possible problem is considered, it can be internalized, and used as a set of constraints that will frame the next phase of the problem.

But in software, there are countless things that can cripple a given design. It might be too slow, too difficult to understand, too difficult to maintain, have modules that contain too much functionality, have overly complicated interfaces, fail to provide the needed functionality, make bugs difficult to find, and so on and so on. I am of course, being more meticulous here, which makes the architecture comparison a little unfair, but bear with me.

The problem is that there are numerous concerns, and it is very difficult to internalize one and thereby focus on the others. I’m sure others have covered this ground (wicked problems?) but the problem seems to be that these failures of a design are emergent, they only crop up as the consequence of several interacting parts, their creation is not predictable and doesn’t adhere to intuitive rules. And the number of possible concerns means that focusing on one or two leaves plenty of others to stumble into. There simply isn’t a way to design with all the possible pitfalls in mind. This might explain why much of the software design I have been exposed to has consisted of designers sketching out a design, standing back from it, pointing out the problems, and adjusting. There is no room to make a design that is innovative or beautiful or amazing, they are just simply trying to work their way to something without glaring flaws.

The other problem is the interconnectedness of software problems (once again related to the concept of wicked problems). Whenever we adjust one aspect to fix one problem, it is very easy to introduce others. The result can be frustrating. I won’t venture that this is more a problem here than it is in other design fields, but it compounds the difficulty in software’s seemingly inordinate level of problem inevitiability. (This is related, in my mind, to a different angle on puzzle games, but I will come back to that in my next post, perhaps.)

And finally, of course, the abstraction and unpredictability of software design means that some problems simply can’t be found until you have compiled the program. And even then, linking problems seen in running programs back to their sources in the code, let alone module-level design, can be terribly difficult. These are pet points I have beaten to death elsewhere, if not in this blog, so I’ll leave them for now – but they present yet another level of difficulty.

I started off with the question: “Why do we seem to describe a software design more in terms of what it does wrong, than what it does right?”. I’m not sure I have the answer, but I think the problem is that there are so many ways we can go wrong, that we will take anything that works. We can’t appreciate the beauty of something that is this hard beyond the fact that it works. If we saw a software design that was truly appealing, we might even distrust it, given our prejudices that such things are supposed to be workhorses.

I don’t think there is such a lack of joy in many other design fields. Architects, fashion designers, graphic designers, product designers, and I suspect even process designers and mathematicians are able to look at others’ designs and get joy from them. They can really appreciate exceptional designs.

I can liken a design to one’s process for solving a wooden puzzle. It’s a bit of a weird metaphor, because I am comparing the actual design result to your own process for solving the puzzle, not your appreciation for the puzzle itself, but bear with me.

Do you enjoy a given design? That depends on how many good, clever, beautiful ideas are in it, versus workarounds to simply make the thing work. Similarly, when a wooden puzzle is just hard enough, the process of solving it can be very satisfying. You start to gather information about how it works and feel smart, and you get stuck, but not so often that it kills your good time. Afterwards, you can look back on the solution, perhaps repeating it, and see all the nice tricks you used to make sense of the thing. This puzzle hit that sweet spot for me nicely, as did this computerized puzzle game.

I liken software to the process for solving a puzzle that is just too damn hard. You are so burdened with interlocking interrelationships that it becomes work. You are often more relieved than you are excited when you finish it. You may look back on your process with pride (as a software designer might look back on his or her work), but it probably won’t be a sense of joy (I’ll use this excuse to link to some really amazing puzzles that look really difficult, though they might still be satisfying to solve - video too).

Of course, maybe I am just not experienced enough. Much as the Rubic’s cube seems utterly unknowable to most, there are some who have penetrated its mysteries and find it to be a very satisfying process. In this case, we should find ways to make software more readily appreciable, I would argue that the curve for its true appreciation is much too high. Not sure how to tackle that just yet, though :)

Finally, I’ll touch upon a possible alternate explanation for software’s ugliness:
Each of my examples of joyful designs is a product that is viewable and appreciable by the public at large. There is an incentive for the designer to make something that is beautiful, as well as functional. Software designs, meanwhile, are hidden behind the curtain of compilation. What use is there in creating a beautiful design is no-one will ever see it? Better to just create a beautiful interface and some business code that will ensure that technical problems don’t get in the way. Its not that software design is a thornier process, it’s just that its beauty is hidden, and therefore (quite reasonably) neglected.

There is definitely some nugget of truth to this; designs would be prettier if anyone would ever appreciate them. But I still think that the process of software design is so riddled with possible problems and difficulties that it is difficult to imagine someone making an amazing design, one that really brought joy to the creators and observers, rather than an admiration of its lack of flaws.

Software is workmanlike stuff. Maybe it shouldn’t be surprising that it is not attractive. But I think this has a negative effect on those who create it, and I want to try to find out what that effect is, and how it can be diminished.

13
Feb

Software Design: Learning and Teaching
Andre and I just finished our submission to FSE, a paper about software design. We are also working on his undergraduate software design class, which is going well. All our theories are pretty involved these days, so it is a useful exercise to try to make them digestible to students who have had little previous exposure to software engineering.

Oftentimes, when I am thinking about design (not necessarily software design, mind you), I get thinking about education. I have always had an interest in education, but I am starting to think there is more to it. That maybe there is an interesting connection between design and education, besides the overlap in my interests. Consider that design is a matter of idea generating, of information gathering and of decision making. It is a matter of figuring out the solution, and then recording it in a way that will tell others what to do to produce the final product. It is the planning, rather than the doing.

In many ways, design is all about learning and teaching. The designer is a student. He learns about the situation, from books, from clients, from other designers, from experiments with the materials, from simulations of possible solutions.

In other ways, the designer is a teacher. During the design process, intermediate ideas must be conveyed to others. A head designer needs to instruct his team, creating a consistent vision. This might be achieved via exacting constraints, vague guidelines or an aesthetically motivated vision.

And once a design vision is fleshed out, the knowledge must be gathered into some representation that will tell an implementer or manufacturer how to enact the planned solution. In some sense, the implementer must be taught how to build the designed object.

There are several questions, then, that underlie both design and education. For example:
- How do people learn about unfamiliar situations?
- How can we make complex ideas understandable?
- What are the best representations for conveying different kinds of information?
- How do leverage what our audience already knows to support our explanations and representations?

These sort of questions are interesting to me. They are challenging and will never fully be answered, and yet progress always seems tantalizingly close.

In a final personal note, one other thing that appeals to me about these subjects is the “teach a man to fish” factor. I dislike the idea of my main contribution to the world being a specific tool or algorithm or approach. Rather, I want to provide designers with an understanding of how they work, to provide researchers with a framework in which to explore, or to provide students with the understanding they need to do whatever it is they have planned for themselves.

I fear that I use this angle as a safety net against failure; a tool can be useless, but its hard to prove that in idea is without merit. But also think it is just a sound way to approach things. People, especially in computer science, are wrapped up in exacting solutions that will fix a problem. But many of the most important problems out there, especially those of design and education, are made up of myriad unique instances that defy sweeping solutions. If a single research contribution hopes to help, it will need to reach and teach the designers and educators out there and give them help they can apply, flexibly and creatively, to their own unique situations.

Its this guiding-and-constraining-while-allowing-for-personal-choice balance that is key to this approach. Its also at the heart of game design, now that I think of it, but I’ll have to get to that another time.

13
Feb

Old-School Code Visualization
There is some hint as to why I like old video games in this page:

http://benfry.com/distellamap/

Maybe I just don’t want to contend with the sort of complexity of modern programs, or maybe I see in them the seeds of a useful approach that can be extrapolated in these more easily understood situations, but I love these diagrams. Because the images are hard coded as bits, visualizing the bit structures recreates the freaking graphics in the diagram! Because the translation method that the code used to turn data into images was so simple, the visualization was able to achieve a satisfying result via a transformation that didn’t feel like a cheat. That simple translation from bits to visualizability is simply lost in any programs more complicated.

This is maybe further proof that the complexity of software really doesn’t appeal to me past a certain threshold, a threshold that has been long since passed by modern computing. Whether I can make software appeal to me through some clever conceit, or whether I’m in the wrong field remains to be seen.

PS:
http://benfry.com/disarticulate/
This picture awes me in its own way. It is less understandable, but it is so striking, and appears to be on much more complex code. The way that the appearance of frenzied, ragged brushstrokes is created by the rote mathematical operation of a program is hugely appealing. A friend pointed out that some aesthetic choices must have been made in terms of code layout, something which only increased my enjoyment of the image.

13
Feb

Update
So this blog has been lying stagnant for a while now, for a number of reasons. Partially, I just got caught up in the holidays and got out of the habit. Also, lately I feel like its hard to make posts that are interesting in and of themselves, since most of my thinking is tied up in larger conceits, wrapped up in epic theories that simply don’t lend themselves to blog-sized nuggets. I’ll try to get some posts back on here at some point, but I can’t let it get in the way of my “real” research, which is plenty consuming on its own. Time will tell…





Page copy protected against web site content infringement by Copyscape

 

October 2008
M T W T F S S
« Sep    
 12345
6789101112
13141516171819
20212223242526
2728293031