Wednesday, December 11, 2013

Artistic Specialty


To some extent folks adopt their software development specialization depending upon their own skills and tastes: do they feel more comfortable with a broader and lighter background or do they prefer to be deeper and more focused? Managers may also have a strong influence over how employees develop their skills simply by the tone and expectations that they set.

Obviously software development requires some specialization, since the technological complexity and the rate of change in our profession precludes a sole person from spending the time required to be a technical expert at all the myriad skills that span the available range of tools. If you wish to employ an expert a direct corollary will be that you therefore choose a specialist. If you plant a honeysuckle tree, you are going to get hummingbirds: that's the sort of specialist this tree desires.

Selecting specialists for software development presents some challenging issues. Unlike hiring engineers to design cars -- where once the model rolls off the production line the engineers move along to their next project -- hiring engineers for a software project is likely hiring them for the entire life of the system.

In this instance the problem that a manager faces is that quality, job security, and concurrency are in opposition. Asking your staff to specialize may give them greater job security and improve the quality of your operations, but they will lose their awareness of how to incorporate and apply new tools and hence lose their personal marketability.

If you hire a specialist to do the job then the result is going to be somewhat unmaintainable by anyone but that specialist. If you hire a generalist it will be far easier to maintain the resultant system, although the final product may well appear less slick and polished.

Ultimately then who you hire depends upon the "positioning" your company is trying to achieve. Are they looking for a short-lasting expensive best of breed solution? Or something long term, stable, and adequate? What sort of tree exactly are you planting?


Wednesday, November 13, 2013

Artistic Goals


Developing software is both about balancing competing forces and optimizing numerous goals. Down in the trenches all of this happens within the craft of describing to the computer what to do by using a programming language or development tools, but it is still beneficial to keep in mind at a much higher level what should be the general objectives of /any/ large software system:

+ Validity
Your software must meet its functional requirements

+ Parsimony
Keep it simple, avoid bloatware, use a declarative approach that saves intermediate values

+ Incrementality
Plan from the start to make your software readily extensible by incorporating real-world modeling

+ Perspicuity
Strive for clarity and aesthetics; make both the use and the maintainability of your software intuitive

+ Modularity
Remember the advantage of being maintainable and reusable, stay functionally focused, but loosely coupled

+ Resiliency
You need to be tolerant of system faults and provide excellent error recovery

+ Adaptable
Hardware can change -- be flexible for changing environments

+ Performance
Strive to be both efficient and fast

... and yes, these are in precise order of importance.


Monday, October 28, 2013

Artistic Optimization


I suppose that from a certain perspective an analyst can argue that success really depends on the optimization of the person. In other words if you focus on optimizing your self, then everything else will follow naturally. Here is a cogitation I had a couple decades ago where I explored this in greater detail. Basically, you spend your time....

Learning
Teaching
Organizing
Reviewing
Creating
Re-creating
Investigating
Playing
Resting

Everybody has their own individual needs for time allocated to each of these items in order to feel comfortable. If you have too little of an item to do you will either search for something to allocate more time to it, or you will feel uncomfortable. If you have too much of an item to do you will either find a more efficient way of doing it, or you will feel uncomfortable. You can not become more efficient with an item until you are willing to find more of the item to fill the time you need allocated to it.

Some general excuses that folks use to rationalize their inefficiency are:
+ I already have enough work to do and would not be comfortable with more.
+ I do not want to be more efficient because then I would not have enough to do.
+ I am already satisfied with the time I ave allocated to these items.
+ I feel uncomfortable allocating more learning, creating, or playing time to become more efficient.

Here are hints on how to become efficient across the dimensions of your activities.

Learning
Learn Learning: do you keep your eyes open for more efficient ways to gain information?
Teach Learning: do you share your good sources of information with others?
Organize Learning: do you track where to go to find things out?
Review Learning: how long until you realize that an old source of information is obsolete?
Create Learning: do you imagine a better way to learn something and then seek for that method?

Teaching
Learn Teaching: What inhibits your sharing your sources of information?
Review Teaching: is the information you share still accurate and do you teach it well?
Create Teaching: imagine -- who might benefit from your knowledge?
Play Teaching: do you share what you know anyway?

Organizing
Review Organizing: are your current methods of organizing still efficient?
Create Organizing: what could be the ideal way for you to organize? Can you find help?
Play Organizing: do you experiment with your current methods?

Reviewing
Review Reviewing: can the information pass though fewer hands? Can it be created more accurately to start with?

Creating
Create Creating: do you think of /how/ you want to create? Might there be better ways?
Review Creating: why are you locked into your current methods of creating things?
Play Creating: do you experiment with the means by which you create?

Re-creating
Review re-creating: do you organize your creating in the first place?

Investigating
Teach Investigating: do you share your investigating techniques?
Organize Investigating: do you keep track of your methods?
Review Investigating: are there more efficient ways for you to investigate?
Create Investigating: might there be better ways to investigate? Who provides them?
Play Investigating: do you experiment with new ways to analyze your information?

Playing
Teach Playing: do you share the things that provide you with new thoughts?
Review Playing: do you realize your old habits are no longer fun?
Create Playing: do you imagine techniques that might develop new ideas?

Resting
You rest most efficiently when you have nothing to do.