SVN Branch Management Link-a-rama

Coding Horror: Software Branching and Parallel Universes

Perforce: Laura Wingerd & Christopher Seiwald: High-level Best Practices in Software Configuration Management

InfoQ: Version Control for Multiple Agile Teams

BetterExplained: A Visual Guide to Version Control

Branch Maintenance: Chapter 4. Common Branching Patterns

Submerged: CollabNet’s Subversion Blog: Branching Strategy Questioned

CMCrossroads: Robert Cowham: Branching and Merging – An Agile Perspective

CMCrossroads: Steve Berczuk. Robert Cowham, Brad Appleton: An Agile Approach to Release Management

Related Background Links:

Version Control with Subversion: Branch Maintenance: Chapter 4. Branching and Merging

Version Control with Subversion: Strategies for Repository Deployment: Chapter 5. Repository Administration

Version Control with Subversion: Repository Maintenance: Chapter 5. Repository Administration

JavaWorld: Merging and branching in Subversion 1.5

RubyRobot: Subversion With Mac OS X Tutorial

Worth Repeating: Rob Pike “Data dominates.” and Frederick Brooks “Representation is the Essence of Programming”

Rob Pike is a famous name in programming with a history going back to Bell Labs, co-author of two often quoted books, and today works at Google.

Back in February 1989 he wrote an essay, “Notes on Programming in C” which many consider contains insight to the “Unix Philosophy”.

One of the sections of the essay people focus on were six rules he listed on complexity. Rule number 5 is:

“Data dominates. If you’ve chosen the right data structures and organized things well, the algorithms will almost always be self­ evident. Data structures, not algorithms, are central to programming.”

I’ve seen people summarize that rule (why summarize three sentences?!) into “write stupid code that uses smart objects”, but I believe that misses the point.

To help us understand the context behind the rule, Pike cites Frederick Brooks’ “The Mythical Man-Month” p. 102. Here it is for your edification:

Representation is the Essence of Programming

Beyond craftmanship lies invention, and it is here that lean, spare, fast programs are born. Almost always these are the result of strategic breakthrough rather than tactical cleverness. Sometimes the strategic breakthrough will be a new algorithm, such as the Cooley-Tukey Fast Fourier Transform or the substitution of an n log n sort for an n2 set of comparisons.

Much more often, strategic breakthrough will come from redoing the representation of the data or tables. This is where the heart of your program lies. Show me your flowcharts and conceal your tables, and I shall be continued to be mystified. Show me your tables, and I won’t usually need your flowcharts; they’ll be obvious.

It is easy to multiply examples of the power of representations. I recall a young man undertaking to build an elaborate console interpreter for an IBM 650. He ended up packing it onto an incredibly small amount of space by building an interpreter for the interpreter, recognizing that human interactions are slow and infrequent, but space was dear. Digitek’s elegant little Fortran compiler uses a very dense, specialized representation for the compiler code itself, so that external storage is not needed. That time lost in decoding this representation is gained back tenfold by avoiding input-output. (The exercieses at the end of Chapter 6 in Brooks and Inversion, “Automatic Data Processing” include a collection of such examples, as do many of Knuth’s exercises.)

The programmer at wit’s end for lack of space can often do best by disentangling himself from his code, rearing back, and contemplating his data. Representation is the essence of programming

References:

Wikipedia: Unix_philosophy

Eric Steven Raymond: The Art of Unix Programming: Basics of the Unix Philosophy

Unit Testing Python Links

OnLamp.com: Jason Diamond: Test-Driven Development in Python

OnLamp.com: Jason Diamond: More Test-Driven Development in Python

AgileTesting: Python Unit Testing Part 1

AgileTesting: Python Unit Testing Part 2

StackOverflow: Python Doctest vs Unittest

Ian Bicking: Behavior Driven Programming

NPR’s Daniel Jacobson shares details on their CMS ecosystem

Programmable Web: COPE: Create Once, Publish Everywhere

Programmable Web: Content Modularity: More Than Just Data Normalization

What strikes me is the focus on data storage and the emphasis on normalizing it to a modular form that enables re-use.

I’ve seen CMSes over the years try and deny the value in this approach – they store content as blobs and force app developers to keep access knowledge and manipulation maintained in the app layer. The idea being that you can never know what content you will need to store down the line, so why attempt to build a normalized store where data is maintained and re-used long term?

In the end, many of these CMSes embrace the Anemic Domain Model anti-pattern that Martin Fowler wrote about. More and more behavior that is related to your domain is pushed in to your app-space or into a services layer.

NPR.org confirms my past experience – the investment in building a modular data store not only establishes a strong foundation – it is one that gains in value over time. It takes research – you need to dig deep into your business’s problem domain – you need to determine what is it that is the core product(s) of your business (note – I didn’t say CMS). For NPR it’s the Story. What is it for yours?

As Martin Fowler said, “In general, the more behavior you find in the services, the more likely you are to be robbing yourself of the benefits of a domain model. If all your logic is in services, you’ve robbed yourself blind.”

Invest the time.

BTW – this isn’t a NOSQL versus RDBMS issue – there are data management solutions among each that can satisfy this.

NPR’s development team has been sharing more regularly on their blog “Inside NPR.org”.

Related:

CJR: NPR Builds a Brain Trust: Thought leaders convene for a digital “Think In”

digitalthinkin.ning.com

Thinking About Flow

If you make a living programming, you know how productive, how creative, how enjoyable this state is: you + the task at hand – any other thought in the world. Focus, flow, mindfulness only of the moment you are in.

Flow can be found in the most mundane moments (there are no mundane moments if you become aware of this): from playing a game of basketball, to playing your guitar, to a late night World of Warcraft session, to gazing at your wife, or laughing with your daughter.

Time slows when you are in flow. Anxiety about the future transforms into passion about the now. Thoughts about the past do not get a chance to play on your conscious mind.

Flow is an extreme form of the feedback I’d give my Mom, when she was falling into a bad state, and concentrating too much on mistakes made or horrors visited upon her in the past.

“All that matters is the here and now. You, right here, are safe and well. We are doing well. All of us are blessed. Don’t let what happened 20 years ago defeat you. It doesn’t matter. Besides – its kinda insulting to your current circumstances to think anything more of the past other than it helped you get to here. Now is all that matters.”

(I need to tell myself this more often!)

This doesn’t jibe so well with a lot of psychological talk about how people need to face their pasts to over come them. That’s true in many cases. In many cases we *do* need to deal with the demons in our hearts in order to achieve our potential. But Mom had already faced her past. In countless therapy sessions, with countless doctors. She had a condition. And her doctors had, at one time wrote her off as hopeless – doomed to a downward spiral of psychotic episodes.

Becoming mindful of her own thoughts was part of a larger set of solutions that helped her be very “with it” the last few years of her life before leaving us. She succeeded to the point of being aware of threatening ‘bad thoughts’ and seeking out help before cycling and requiring hospitalization. Before this, once you saw the signs, you knew it was a hospitalization that would be the result.

Its funny, when you think about it. Because while we find flow in a great many positive things, the state of flow is just as likely found in the neutral or even the negative.

We spend millions of dollars, our time and attention, following gurus of various ideologies, taking up crazy religious practices, pursuing sex and drugs, creation and destruction, creating drama upon ourselves and our fellow man – just to be in it.

Flow is so primal a force in our adult lives because its something we literally swam in 100% of the time as children.

Our schools and our parents barked it out of us as they taught us to ‘pay attention’ for the *next* moment. We shaked it out of our own hearts as we let ourselves become more and abiding to scheduling. Most of all, as we get older, time simply seems to speed up as we become aware of our looming mortality.

Psychology Today: Finding flow:

…A deprived childhood, abusive parents, poverty, and a host of other external reasons may make it difficult for a person to find joy in everyday life. On the other hand, there are so many examples of individuals who overcame such obstacles that the belief that the quality of life is determined from the outside is hardly tenable. How much stress we experience depends more on how well we control attention than on what happens to us. The effect of physical pain, a monetary loss, or a social snub depends on how much attention we pay to it. To deny, repress, or misinterpret such events is no solution either, because the information will keep smoldering in the recesses of the mind. It is better to look suffering straight in the eye, acknowledge and respect its presence, and then get busy as soon as possible focusing on things we choose to focus on.

To learn to control attention, any skill or discipline one can master on one’s own will serve: meditation and prayer, exercise, aerobics, martial arts. The important thing is to enjoy the activity for its own sake, and to know that what matters is not the result, but the control one is acquiring over one’s attention.

It is also important to develop the habit of doing whatever needs to be done with concentrated attention. Even the most routine tasks, like washing dishes, dressing, or mowing the lawn, become more rewarding if we approach them with the care it would take to make a work of art.

…Flow is a source of mental energy in that it focuses attention and motivates action. Like other forms of energy, it can be used for constructive or destructive purposes. Teenagers arrested for vandalism or robbery often have no other motivation than the excitement they experience stealing a car or breaking into a house. War veterans say that they never felt such intense flow as when they were behind a machine gun on the front lines. Thus, it is not enough to strive for enjoyable goals, but one must also choose goals that will reduce the sum total of entropy in the world.

Find your flow and you slow down time. Find your flow and time has no meaning. Find your flow and find your love.

These are things I am saying as much to myself as I am you.

Related Links:

Scratch: Lowering the floor, widening the walls, raising the ceiling

Read about the principals behind the design of Scratch in Communications of the ACM: Scratch: Programming for All: “Digital fluency” should mean designing, creating, and remixing, not just browsing, chatting, and interacting.:

It has become commonplace to refer to young people as “digital natives” due to their apparent fluency with digital technologies. Indeed, many young people are very comfortable sending text messages, playing online games, and browsing the Web. But does that really make them fluent with new technologies? Though they interact with digital media all the time, few are able to create their own games, animations, or simulations. It’s as if they can “read” but not “write.”

As we see it, digital fluency requires not just the ability to chat, browse, and interact but also the ability to design, create, and invent with new media, as BalaBethany did in her projects. To do so, you need to learn some type of programming. The ability to program provides important benefits. For example, it greatly expands the range of what you can create (and how you can express yourself) with the computer. It also expands the range of what you can learn. In particular, programming supports “computational thinking,” helping you learn important problem-solving and design strategies (such as modularization and iterative design) that carry over to nonprogramming domains. And since programming involves the creation of external representations of your problem-solving processes, programming provides you with opportunities to reflect on your own thinking, even to think about thinking itself.

On “Make It Work Make It Right Make It Fast”

Ward’s wiki: “Make It Work Make It Right Make It Fast”

If you never make it Right – you will fail.

If you never make it Work – you never ship. You have failed.

The tension between these frames the art of software development.

There are no golden hammers to navigate these waters. Don’t let anyone fool you.

Some personal growth pieces to read and re-read

Just some recent links that have connected with me as of late:

Derek Sivers: If you think you haven’t found your passion…:

If you keep thinking about something like putting on a huge conference or being a Hollywood screenwriter and you find the idea terrifies but intrigues you, it’s probably a worthy endeavor for you.

You grow by doing what excites you and what scares you.

t3rmin4t0r: A Simple Survival Guide for your Inner Child:

There are only two basic rules of survival for the individual:

  • Work the system
  • Fuck with the system

It doesn’t get any more contradictory than that.

Howard Weaver – with echos of “Data Smog”, by David Shenk – : Infobesity: the result of poor information nutrition

Chris Dixon: What carries you up will also bring you down

Pace and Kyeli Smith: The Freak Manifesto

Institute for Artificial Intelligence: Michael A. Covington: How to Write More Clearly, Think More Clearly, and Learn Complex Material More Easily

Michael Montoure: Hack Yourself:

Stop assigning blame. This is the first step. Stop assigning blame and leave the past behind you.

You know whose fault it is that your life isn’t perfect. Your boss. Your teachers. Your ex-lovers. The ones who hurt you, the ones who abused you, the ones who left you bleeding. Or even yourself. You know whose fault it is — you’ve been telling yourself your whole life. Knowing whose fault it is that your life sucks is an excellent way to absolve yourself of any reponsibility for taking your life into your own hands.

Forget about it. Let it go. The past isn’t real. “That was in another country, and besides, the wench is dead.” If we’re not talking about something that is real and present and in your life right now, then it doesn’t matter. Nothing can be done about it. If nothing can be done about it, then don’t spend your energy dwelling on it — you have other things to do.