Bitwise Operator
by Matt Slot
Up until this point, the Bitwise Operator column has provided an introduction to writing software on the
MacOS. While this would continue to be a valuable journey, there are 3 important reasons to change the
content: the effort to create and maintain the library is prohibitive, there is enough controversy regarding the
lifetime of the platform, and there are many more topics of general interest to developers.
To this end, I'm changing the content of the column to include general topics relating to software
development and maintenance. If you are anxiously interested in learning to program for the MacOS, I'd
strongly recommend that you purchase and read some of the excellent Mac programming primers and visit
the Mac related discussion areas on UseNet and IRC (as described in my first column).
On Software Development
Now, software development is something that really isn't taught very well in college. Sure, most people take
some courses to learn the necessary languages and algorithms, and get a fair dose of practice on small
homework projects. After about 2 years of this, most are able to implement small and specific programs or
libraries. Unfortunately, most undergraduate CS programs don't prepare them for "real world" projects,
software debugging, and maintenance.
"Wait a minute," you say. "I'm a damned good programmer!" And most people for whom programming is
incidental to their job or for whom it is a hobby, indeed are good programmers. But once the project grows
beyond one or two people, the source code spans several projects and libraries, and/or you are targetting for
multiple platforms, it becomes easy to waste time in unnecessary or avoidable situations.
Each of the upcoming columns will address a different aspect of software development: design techniques,
project structuring, and tools for writing, debugging, and managing your code. Some of them you may be
familiar with, others you may or may not have heard of in passing. Regardless, the focus will be on filling in
those gaps that even a traditional CS degree will leave you with.
Focus, Focus, Focus
One way I like to divide the programming community is by the way they approach a programming project.
Some people are able to dive right in and begin writing code and implementing features; others take a studied
approach, so that they can implement the project once, in the most efficient way possible. While there is
nothing wrong with either method, each can be carried to an extreme.
The first type of programmer gets off to a fast start, and generates alot of code very quickly. He is able to
dive into 3rd party code and libraries, and make use of them quickly with little fuss. He sketches out the
program structure in broad strokes, making some basic assumptions about the intended design so that the
code can continue to flow.
As the project continues to grow, the programmer needs to address issues that were previously postponed.
Early assumptions often become hard coded limitations of the engine. The application is structured
incrementally, and may not be very extensible or even efficient, although it works adequately. Common or
repetitive tasks are often implemented in several locations, so continued development and maintanence
becomes increasingly difficult.
Later in the development cycle, user feedback may indicate a change in direction to which the developer must
modify the architecture. Poor design may make portions of the code difficult to extend without significant
retooling, which means redundant work. In effect, such a programmer gets a good start on the project,
which is fine for small or one-off products, but which will only hamper an extended project or large source
base.
The second type of programmer (of which I am) spends time planning the project, so that it's implemented
"right" from the beginning. He lays the framework for the project with a flexible infrastructure, handy utility
routines, and extensible handlers. He'd rather spend time preparing for the major tasks than diving in, so
that the code doesn't need to reimplemented from the ground up for later enhancements.
The programmer likes to pay attention to the details, and will spend a fair amount of time optimizing what he
sees as the most important parts of the program. Rather than just drop-in third party code or libraries, he
insists on being familiar with the mechanism; he may even reimplement some of the core, or at least wrap his
own handlers around the API.
The biggest pitfall these programmers face is procrastinating the coding process too long. They often diddle
with design sheets, utility libraries, or optimizing the core engine, and postpone the more significant portion
of the engine until everything is "just perfect". While infrastructure is important, so is actually getting the
project to work.
While some coders and software engineers fall into the extremes of these stereotypes, most fall somewhere
in between. Despite this, everyone should be wary of falling into either "trap" -- and what that requires is
focus. Coders in the first group must be willing to step back and look at the big picture. Bootstrapping some
functionality is fine, but you should focus on some goals -- keep the code modularized, the APIs clean, and
always leave room for extensibility (reference constants, accessor function, opaque data types).
Engineers in the second need to roll up their sleeves early in the process. Writing your plan on paper is fine,
as long as you recognize two things: even the best plans may need to be revised or discarded in the future,
and spending too much time on too little code (no matter how essential it is or how often it's invoked) affects
the whole project. Save the 5% speed gains for version 1.1, and focus on making something functional.
Frameworks and early development versions are much more interesting to demo than a handful of really
optimized blitter functions written in assembler. (Use the "mom test" -- which one would she be more
impressed with?)
In the end, it's a matter of not drifting to one extreme or the other, but walking carefully in between. If it
takes weeks to plan and organize the project, it's easy to fall behind schedule while not making observable
progress. If the first pass of code seems to work, but it's not well organized or debugged, then it becomes
difficult to complete and maintain the project.
Matt Slot, Bitwise Operator