Tag Archives: software

Model Code

phrenologyThe ultimate goal is a consideration of how to create a working model of the human mind using a computer. Since no one knows how to do that yet (or if it’s even possible to do), there’s a lot of guesswork involved, and our best result can only be a very rough estimate. Perhaps all we can really do is figure out some minimal requirements.

Given the difficulty we’ll start with some simpler software models. In particular, we’ll look at (perhaps seeming oddity of) using a computer to model a computer (possibly even itself).

The goal today is to understand what a software model is and does.

Continue reading

System Code

os-0We started with mathematical expressions, abstract algorithms, and the idea of code — a list of instruction steps in some code language. We touched on how all algorithms have an abstract state diagram (a flowchart) representing them. Then we looked briefly at the stored-program physical machines that execute code.

Before we go on to characterize the complexity of a computer, I want to take a look — very broadly — at how the computer operates overall. Specifically, look at another Yin-Yang pair: the computer’s operating system versus its applications.

This has a passing relevance to the computer’s complexity.

Continue reading

Sideband #50: Pawn to King-4

Spock ChessLast time I mentioned wanting to write a chess move parser since my earliest days of programming. Hard-core coders often see things in terms of the software behind them. For instance, I sometimes wonder about the software running my microwave oven. Andy Warhol drew our attention to how an artist is behind even a mundane soup can label. Similarly, every computer-driven item in your growing collection of smart tools and toys has a programmer or many behind it.

Dedicated coders also look at problems in terms of the software to solve them. When my (ex-)wife complained about the difficulty of scheduling teachers, rooms, and classes, for the year, I began pondering scheduling software. I think a big part of it is the challenge of solving a double-puzzle. First you have to figure out the problem; then you have to figure out the software solution.

And one area that programmers find extremely attractive is games!

Continue reading

My Life 3.0

Recently I told you about how, in high school, a casual decision to take an elective added a new direction to my compass. That new direction turned towards a world I had never imagined, and the path along that direction brought me to many joyful and wonderful experiences. For a long time I followed that path towards an imagined future somewhere down the road.

But in college, once again, a casual decision to try something new added yet another direction to my compass. And that path, too, led to joy and wonder. And that path did take me down a road towards my future. Towards my present.

At some point a few years after discovering this new path, I began to refer to the high school discovery as “my first rebirth.” That made the college one my second “rebirth.” And the term is apt, because I was, indeed, reborn into a new world of experience and knowledge. But these days, to be “reborn” has another meaning I don’t intend.

Continue reading

Reflections: Work & Change

This is a piece I started almost a year ago, set aside for polishing and never returned to. It started as a rant and morphed into a looking back at what, now, might be the fullness of a career.

It seemed like it might be a good companion piece to the recent post, Ground Rush, so here it is for your dining and dancing pleasure.

The original title was…

Vent: Work

Things have been changing recently at work. In fact, for two years or so, lots of things have been changing at work; you’ve probably noticed.

The economic and work scene has been chaotic and scary; our government appears out to lunch; a fix seems far off and challenging at best… The uncertainty and foreboding, not to mention the financial situation itself, has generated many changes at work and in our lives.

Me, I keep waiting for a change that doesn’t suck.

I keep waiting for change that will make things better.

Continue reading

CS101: Four Principles

If nothing else (and I think there is plenty of else), I can look back on all those years of writing code and pick out the main themes and principles, the things that seemed to matter most. That’s what this CS101 series is about: things I think matter most when it comes to designing software.

Lately I’ve been looking into fours, doing things in fours. With that in mind, here’s Four Primary Principles for Programmer:

  1. Learn to learn.
  2. Learn to look stuff up.
  3. Learn to communicate.
  4. Learn your craft.

That’s right; learning your craft is number four! I think the first three are good principles in general. All three are useful skills in life, but I’ve found them to apply particularly to software design. I’m not saying software is unique in this; many professions need constant access to stored knowledge. No one knows all the details, so everyone needs documentation at some point!

Knowing your craft is certainly important—it made it into the top four! But the first two are constant job requirements, and the third is an invaluable skill. All three apply regardless of your craft. Let me explain them in more detail.

Learn to learn. This is a required skill. Programmers constantly learn new things. There are new tools, new languages, new processes, new standards, new client contexts and new technology. This is an evolving field; there’s always something new. I’ve learned as much in this past year as in every one of the 30+ past years I’ve been doing this.

In fact, I advocate teaching yourself one new computer language a year. I don’t make the recommendation to exercise your learning skills, although it does do that. I think learning new programming languages is important to your understanding of what they are and how they work.

It’s like a musician learning many instruments. If it’s about the music, then the tools—the instruments, the programming languages—don’t matter. Which is not to say that becoming a virtuoso on an instrument isn’t a valid choice. But the job pool is limited, so you need to be a true virtuoso.

Each year,  just pick a new language and learn it (the interweb makes that very easy). You have plenty to choose from: Python, Ruby, Scheme, Haskell, Smalltalk, Lisp, Erlang, Prolog, APL, Forth, Eiffel, Perl, Ada,… The list continues, and those are just a few of the slightly to somewhat off-the-mainstream languages! You might be amazed at how many programming languages there actually are.

Learn to look stuff up. Another required (and acquired) skill. No one can know it all, so the key is knowing where to look stuff  up. As I said, we all need the documentation sometimes. That was Scotty’s secret, you know. He had access to Wikipedia!

Seriously, Wikipedia is wonderful for technical research. The quality of Wiki entries is high on technical material (probably because of the many technical people involved in Wiki and in the interweb). And technical material doesn’t have the political freight as does some social material. Genuine error is rare, let alone deliberate disinformation.

The interweb in general was always rich in technical resource. Its origins were technical, so for a long time its content was also heavily technical. But recent searches turn up results with a lot of (a) people already asking your question and (b) people guessing at the answer for group (a). It has become harder to sift out the actual answer.

But it’s usually still there. The interweb remains a great, if noisy, technical resource!

Learn to communicate. This covers tools, such as Word and Excel (or whatever), but also has to do with improving your writing, and possibly speaking, skills. You may need to do documentation for others, or give a presentation, but you’ll find that skill with documentation and analysis tools is also a benefit to you.

This occurs in two ways. First, you can use these tools to explore a problem or at least put it down on paper. Sometimes a diagram or a flowchart or some kind of drawing is very helpful in breaking down and understanding a problem. Second, documenting your work using modern tools for the job is almost pleasant; the result definitely is!

You will want to be familiar with a good authoring tool (such as Word), a good data analysis tool (such as Excel), a good drawing tool (programmers make many diagrams), and maybe a presentation tool (PowerPoint; sorry about all the MS Office references, but they are very good tools) and a database tool (guess what: MS Access).

The world is increasingly electronic, and it is more and more common to communicate by electronic means. You’ll want to be facile (which includes being literate and clear) with email as well as with whatever other tools make sense in your business. Increasingly, communication means the interweb, so you’ll want to be interweb aware if not savvy.

Interesting how the interweb manages to be a part of all three first general principles. Think it’s invaded and permeated our life much?

Learn your craft. Well, duh. Naturally you want to be good at what you do. That includes the background knowledge, such as knowing the programming language, as well as specific knowledge, such as the data scheme of your database. The stronger your background knowledge, the more you can see of a system, the more of that system you understand. The more you can see, the better you are at debugging or making changes.

Background knowledge also tends to transfer from position to position better than specific knowledge. XML, for instance, is used in so many areas of the computer world now that knowing it is a big benefit. Knowing how computers work and communicate on a general level can be extremely helpful in giving you utility in many areas. It gives you a strong foundation on which to build.

Knowing a given language, such as Java, is fairly useful, but can narrow down the field some. And consider that a C programmer, or a C++ programmer, might well have felt like a Java Programmer does today. This, by the way, is why you want to learn new languages! It looks like Java is here to stay, it looks like there are plenty of Java jobs, but eventually the next new thing does come along. Background knowledge (and the ability to learn!) helps with the next new thing.

There’s a lot more to it, of course. Programmers need attention to detail, for example. When it comes to software, you do have to sweat the small stuff. Each bit matters!

CS101: Always Use LT

Here’s a simple tip! I can’t begin to count how many potential code bugs this has eliminated. It takes some getting used to but once you make it automatic it’s a real help in keeping code and your thinking correct. The tip is this: when you write relational expressions, always use less-than, never use greater-than.

Tip: Always write (B < A), not (A > B).

Make Less Not More

Always write your relational expressions to use less-than and so that a true evaluation puts the lesser quantities on the left of the greater quantities. In rare cases a language doesn’t allow the appropriate syntax, but in most cases you can write the less-than version of any expression. This is especially important when testing a value range (for example, between ‘A’ and ‘Z’).

By the way, I admit to assuming the Euro-American left-to-right bias here. In cultures with strong right-to-left orientation, I hope my logic works in mirror reverse.  The  point is to use instinctive mathematical less-to-greater orientation in relational expressions to help avoid logic errors.

The intent is to apply the left-to-right orientation of the number line to relational expressions. On the (Euro-American) number line, values run from lesser on the left to greater on the right. If you pick a number, L, from the line and pick another number, R, to the right of it, the relation (L < R) is always true and (L > R) is always false.

If the expression logic follows number-line logic, the expression logic makes more sense. For example, if we want to test that x is in the [A–Z] range, one way to write the expression is:

(‘A’ <= x) AND (x <= ‘Z’)

The test value, x, visually falls between the ‘A’ and the ‘Z’. In this form, the expression resembles a common mathematical form:

(‘A’ <= x <= ‘Z’).

Most computer languages do not allow the above syntax, but nearly all allow the first one, which comes very close. Compare this to a common alternative, that places the variable first:

(x >= ‘A’) AND (x <= ‘Z’)

In a complex expression, following mathematical number-line logic can make an expression more clear and help highlight logical errors. For example, consider this (which is not at all untypical code):

((‘A’ <= x) AND (x <= ‘Z’)) OR ((‘a’ <= x) AND (x <= ‘z’)) OR
((‘0’ <= x) AND (x <= ‘9’))

And compare it to this:

((x >= ‘A’) AND (x <= ‘Z’)) OR ((x <= ‘a’) AND (x <= ‘z’)) OR
((x >= ‘0’) AND (x <= ‘9’))

I think it’s much easier to use the first one! In fact, did you spot the error in the second version? The first version is much easier to debug, because you know all the arrows point to the left.

Note that this follows the standard looping conventions:

{J=0;  J < N;  next J}
{J=1; J <= N; next J}

It takes a while to train yourself to use less-than strictly, but once you do, your coding skills will be stronger. You may even find yourself going back and “correcting” old code. It will start to look “wrong” to you!

CS101: Clarity Trumps Everything

Clarity is the #1 priority when writing code. Clarity trumps everything else; it’s even more important than the code being correct! One of the biggest wins a serious programmer can offer is writing clear, readable code.

Source code is for the human reader; it’s not written like that for the computer. If it were up to the computer, humans would use the same ones and zeros it does. It would be much more efficient that way. But us (inefficient) humans need ways to write and talk about computer programs. We use many invented languages, computer languages, to do that. And when we write in these languages, it is crucial to be clear.

Clarity is more important than correctness (which is still very important!), because clear code can be fixed if it’s incorrect. Unclear code is harder to work with. It’s harder to find, let alone fix, bugs. Clear code also helps debug as you write; you are more likely to catch your own errors when you write clear code.

Clarity is more important than comments (which are still very important!), because clear code is readable! Part of clarity is using good object names, and that helps the code be self-documenting. On the other hand, writing clear code means writing good comments, so don’t skip commenting just because you think you write very clear code.

To be honest, writing good comments is such a close second, it’s hard not to argue it’s tied for first as being a #1 priority when writing code. It’s a wash as to which mess I’d rather not clean up: clear code with no comments; code with good comments but no clarity. I think it would be easier to add my own comments to the clear code than to clear up the commented code.

Clarity is important, because it enables change. Clear code has a longer life. Unclear code can be difficult (or impossible) to maintain.  I have sometimes found it easier to throw code away and start fresh, than to try to work with “a big ball of mud.” Clear code is maintainable and reusable.

The Lesson for Today

Always think about the next programmer who has to read and understand your code. That programmer is quite possibly you in six months when you have to revisit your code. Except now you’ve forgotten it all and it looks as new to you as to anyone else! Writing clear code benefits you when you revisit it as well as when you write it.

Write code that a human being can read. (Assume a human being that is a programmer who knows the language.  You don’t have to write code for novices.)

Write a Formal Letter

Think of writing code as you think of writing a formal letter.

When you write a formal letter, you have two goals: you have a message to communicate, and you must follow the protocol of a formal letter. Your message comes through when your writing is clear and good. Following the protocol is a matter of knowing and following some syntax rules.

A message + formal syntax. The result is a document with a context.

Code is the same way.  It has a specific message to communicate, and there is a formal syntax the writing must follow.

Following the syntax of the programming language is just one part of the formality of writing code.  In a formal letter, every part has meaning. In some contexts (international diplomacy, for example), every sentence, every punctuation mark has meaning. Even the spacing between parts can mean something in some contexts.

So when you write code, think of it as a message you wish to communicate and make your code look clean and readable.

Literate Programming

Literate Programming is a specialized approach to writing code that enables a programmer to write at a more human logical level, somewhat like a story. The source code was designed to be very readable by humans, and literate programming tools could translate the source into both code for the computer and documentation. It’s a huge win when you have the language, tools and practice to use it.

In the meantime we can borrow from the idea of source code as a book that can be read sensibly.  A source code file should unfold from top to bottom like a story with a beginning, a middle and an end.  The idea is to give the reader a good understanding of the function and purpose as they read.

For example, in Java this applies to how your write your class and interface files.  Where do you put the constructors? Where do you put the static and instance properties?  Where do you put static properties and methods versus the non-static?  Where do you put the get and set methods?  Is there a specific place for standard methods such as toString, equals, compareTo and hashCode?

The real point is this: the order of things in a code file is important.  The order communicates information.  If there is no structure in your source code, if the order of things has no meaning, then you lose the chance to communicate to the reader. You lose the chance to give yourself a known environment! Skilled programmers use the ideas behind literate programming and structure their source code to communicate more richly.

This means that once you know a programmer’s structure, you can navigate their code better. You know where things are. You know what they are likely to be named. When code has structure and order, it has a familiar shape.

Clarity, Clarity, Clarity

The order of things is one way you make source code clear. I’ve also mentioned the importance of good comments. (I’ll talk about good comments vs bad comments another time.) There are other important ways you write clear code.

The names of your variables go a long way in communicating your intent. The compiler couldn’t care less, but a longer, descriptive name can be a blessing for a human reader. Don’t be afraid to use descriptive variables names. The days of compiler length restrictions are safely behind us, and editing environments help remember and type names for us. Besides, programmers should be good typists, right?

At the same time, don’t go nuts. Verbosely long names can make the code look cluttered and ungainly. You want some degree of streamlining; that’s a part of clarity, too.

The thing about variable names is that you want a naming convention. You want a way of going about the business of variable names that gives you the same name in the same situation. I’ll talk more about that another time, but one example is that my loop indexes are always ix. The i changes to other letters, but the two-letter name ending in x is a standard I use faithfully.

After years of doing this, I sometimes surprise myself by how well variable names match across a project. Sometimes on a large project I’ll start to create a new class and then realize something like it already exists in the project or in a library. If it’s one I made in the last few years, chances are the one I just started looks surprisingly the same. Source code is one place where you want to be predictable. You want some moves to be instinctive.

A more subtle form of clarity, one that takes experience, has to do with the form of the code. The way the code goes about its business can be opaque or transparent. Source code should be as transparent in its intention as possible. Source code should speak its mind about what it’s doing. There isn’t space here to go into that, but I’m sure I’ll return to the topic often down the road.

Let me end with an example of a very simple form of clarity. It has to do with lining things up in your source code. Compare the two variable lists below:

    protected Logger myLog;
    protected HashMap<String,String> myMappedFields;
    protected HashMap<String,QueryChild> myChildEntityTypes;
    protected String myInstanceId;
    protected WebServiceRequest myRequest;
    protected SAXOnDemandMapping myFieldMap;
    protected SAXOnDemandEntity myCurrentEntity;

Just aligning the names makes the code easier to read:

    protected Logger                       myLog;
    protected HashMap<String,String>       myMappedFields;
    protected HashMap<String,QueryChild>   myChildEntityTypes;
    protected String                       myInstanceId;
    protected WebServiceRequest            myRequest;
    protected SAXOnDemandMapping           myFieldMap;
    protected SAXOnDemandEntity            myCurrentEntity;

It all boils down to the first rule:

Always write source code to be read!

Computer Programming Ducks

Time to start talking more about programming. It’s one of my defining aspects. I’ll try to make it as interesting as possible for the non-programmers. For the programmers, I’m sorry, but that means sometimes I’ll have to get a little basic or skirt a few corners. Feel free to use the Comments section!

True computer programmers, the ducks taking to the water of making software, are their own special kind of odd duck. Life is filled with different ducks: sales ducks, art ducks, factory ducks, music ducks. Lots of ducks. I’m just saying that computer programmers float in a different part of the pond.

I know this because I’m one of the flock. I have been for over three decades. That’s right; I’ve been doing this since before some of you reading this were born. It would be nice to believe I’ve figured at least some of it out by now. Feels like I know a thing or two. One thing I’ll say: I do know this part of the pond. Been here a while!

Software: It’s just zeros and ones

Software is an abstraction of a process, for instance a calculator process or a spreadsheet process. It can be the abstraction of the process of managing payroll or process operating a machine (even of flying an airplane). The process is also an abstraction. Knowing how to use a spreadsheet or fly an airplane is abstract. Actually doing it is concrete.

So software is an abstraction of an abstraction! And that’s my point: there’s a lot of abstraction in computer programming.

Physically software is just a long string of numbers. In fact it’s really just a string of things and not things. Holes in paper; or not holes in paper. Magnetic domains magnetized; or not. Tiny electronic switches turned on; or not. You can represent software as a string of black and white jelly beans. It’s all the exact same thing. What matters is the pattern of thing and not thing.

So the final product is created out of thin air and is nothing more than a string of numbers. (And yet it can do so much.) The final product is an abstraction filled with abstractions of its own.

Starting at the bottom, the string of ones and zeros form a complete package of information: a software application. The standard that describes how to organize the bits as a software application is an abstraction. The context for the bits is specified by the standard, so it embodies the encoding information needed to make sense of the bit pattern.

The bits themselves clump into small packages (bytes, or more properly, octets) of eight each, which is important for network transmission and storage. The whole octet thing is an abstraction.  Not to mention the related UTF-8 and Unicode abstractions regarding bit clumping. Not to mention the abstraction of various computer hardware architecture.

Now the packages of eight bits, the bytes, are clumped into small groups, usually, of four (4 x 8 = 32). These are called words. In some cases the words are of two bytes (2 x 8 = 16) or eight bytes (8 x 8 = 64). The phrases “32-bit” and “64-bit” refer to this is the level of abstraction. The software is a string of words now rather than just a string of bits. The words are meaningful in the (abstract) language of the program.

A computer program use an abstract language to describe abstractions such as lists, containers and pipes. It uses them to implement the abstract design of the program. The implementation, the string of words, must be executed (run is the friendlier word) for the abstraction of the program to spring to life. The context in which the program is executed (run) is one more abstraction!

Abstractions on top of abstractions using abstractions to do something concrete.

Even our tools are abstract. Programmers are tool users; the good ones are also tool makers. And our tools are as abstract as our product. In fact, most tools are the product of some other programmer! The key tool any software maker uses is a software writing tool, but there are many important others: analyzers, debuggers, organizers and wranglers. Without them we couldn’t do our abstract job.

So it’s no wonder we’re a little different.

Software Design

Software development is hard to describe or compare, because it depends so much on the use of abstraction. There is a continuum of professions based on how much abstraction they tend to require from their workers. You may not realize the degree to which you use abstractions at work and in life. (But that’s a discussion for another time.)

Still, many professions focus on concrete objects: doctors focus on bodies; chefs on food. Police, fire, nurse, EMT, social workers of many types see people in need. Factory workers make concrete objects; sales people sell them, marketers advertise them; technicians fix them; maintenance crews clean them and junk them. And that’s the short list.

Other professions deal more with abstraction. Architects and Mechanical Engineers, for example, deal with drawings and models, which are abstractions of buildings or machines. They start from a pure abstraction, the idea and design, and work to build a concrete thing. [In passing, computer models and 3D printers have made the abstractions much more concrete. We’ve come a long way since faded blue prints.]

Lawyers and accountants deal even more with abstraction; the books only record the abstractions of justice and cash flow. Even the objects of their professions, clients and businesses, can be abstractions. A corporation is an abstraction, but it can have lawyers and accountants, and recently it has achieved legal “person” status. At some point business and law come down to people; that’s where it becomes completely concrete.

Composers, poets and other artists are heavily into abstraction. As with law and accounting, the paperwork often just stands for the real product. Artists have in common with architects that they design a product from an idea. The final design is an abstraction represented as lines, notes or words on a page (or bits stored in memory). Architects go on to realize their design by building it; some artists build their design, others perform it (some may record the performance). In some cases, a book for example, the design is copied and others bring the design to life by reading the text.

Mathematicians and theoretical physicists are entirely in the realm of abstraction! In some cases, 11-dimensional objects for example, a concrete object is not possible. Or took place long ago; the Big Bang took place a very long time ago! In other cases, the forces, energies or times involved are far beyond our technology. They could be concrete in theory, but we’re not likely to pull it off any time soon.

Software workers are similar to architects; they design from an idea. But once completed, the design is the product. Software is like a book in this sense. And like a book, it is read (or run). More than just read, the software design is performed every time you run that software. The software design that is your browser (Chrome, FireFox, IE, Safari, Opera, et alii) is performing right now, acting like a browser, which is how you can read this article.

Software Engineers

I don’t like the term Software Engineer. Real engineers have licenses and certifications and prescribed educations. No such exists (currently) for software makers. It is still a new craft in our society (it goes back only to the 1950s or so), and we haven’t caught up to how complex and demanding it really is. Anyone can use the term Software Engineer, so it doesn’t have the meaning it could.

The meaning it could, should, have is the same meaning as for Civil, Electrical, Mechanical and other Real Engineers. It should mean a prescribed area of knowledge and skill for anyone who would be an Engineer. Until software education and the software profession catches up with reality, I continue to resist the term.

Knowledge Workers

People who work with software are sometimes called knowledge workers, but I think that’s also poor terminology. All workers use their own knowledge as well as the business’s knowledge. Some professions require more base knowledge than others, but it is still a continuum. I just think it’s a vague way to specify a profession.

I’m fine with computer programmer, actually. Maybe that’s low-brow, but I like it. I’m fine with software designer or software maker (but not software engineer). Bit wrangler is a fanciful, fun term, although byte wrangler sounds a little more dangerous. You can’t really say you make holes in paper anymore.

I kinda like telling people I train silicon life forms.

Computer Programming is Hard!

Computer Programming is hard! It’s at least as hard as what commercial architects do, and I will argue that it’s as intellectually difficult as what doctors and lawyers do.

Many people think it’s easy, because they know some nine-year-old who “programs,” but there’s a difference between fooling around with the computer and building good software applications. Here’s the deal.

Continue reading