Grumble about Google Calendar display of vacations
Ousterhout's "A Philosophy of Software Design"
In this talk Ousterhout is chronicling his attempt to teach software design at Stanford University's CS 190: Software Design Studio class. I want to find out if the local universities are trying this and offer to be a teaching assistant.
Technical Junk
• We don't need to update that library just yet, but we know not that falling too far behind the current version will make updating grueling and so will do it later.
• We don't rewrite a troubled module just yet, but we know the rewrite will relieve us from burdensome support and so will do it later.
• We don't replace the data design implementation just yet, but we know its scope has been exceeded and is now impeding enhancements and so will do it later.
• We don't broaden the testing regime just yet, but we know that doing so critically supports systems changes and so will do it later.
• We don't speed the ever slower, periodic, automated task just yet, but we know that task overlap has dire consequences for downstream processes and so will do it later.
• We don't hire additional staff just yet, but we know that additional staff is critical to efficiency and so will do it later.
Now, this sounds like technical debt and it is when you actually attend to it later. When you don't you have technical junk. The system and its data are patched, brittle, duplicated, lossy, slowing, and only though the sheer force of willpower can it be enhanced and maintained. Still, we continue to tell ourselves and our management a compelling story of progress on the two-fronts of enhancement and maintenance.
Update, 2018-10-26: Anecdotal slow motion story The Drift Into Technical Bankruptcy.
Why have group meetings in software development?
The first good reason is when several people need to come to a consensus. The outcome of these meetings are decisions. Ideally, everyone comes to the meeting prepared for the discussion. I like for a proposal to be written and distributed before the meeting. This means that at least one person has thought through the decision's context and ramifications, and that the meeting's participants have time to read and ponder it beforehand. Jeff Bezos has an interesting workaround to unprepared participants and that is to have meetings start with several minutes dedicated to reading the prepared materials. That Inc. article has several other good tips. I can't help myself and so must include a reference to Tufte's The Cognitive Style of PowerPoint. Thankfully, slide decks have been mostly absent from my last several years of professional work.
The second good meeting is the daily standup. It is too easy for a developer to not ask for help soon enough, and standups quickly stop that situation from worsening or the developer going dark. My manager at Cadre used a system of green, yellow, and red work status. If the work was going well then it was green. When there were complications the work was yellow. When it was red it was blocked. It is useful to use this system even in a standup. The first part of the standup has all participants give a brief status. The second part deals with yellow statuses with a brief description of problem and assignment of who is best able to help. Red statuses are dealt with outside of the standup. In all cases, however, don't solve problems in the standup. Giving solutions might not derail the standup the first few times, but has been my experience that by not maintaining the standup's principles it will soon devolve into a group chat and finally abandonment.
Update: The TechCrunch article "Distributed teams are rewriting the rules of office(less) politics" had the link to Amazon's "narratively structured six-page memos."
Awesome Java list of exceptional, reusable Java libraries
Some more comments about a healthy software development organization
The first document any project needs the "Product or Feature Digest" A template of which is here. This document organizes the other documents. It is the one place everyone can read and get a grounding on the product and its implementation. If what is being built is very small then it might be the only document. Most sections of the document have an obvious purpose. However, the first two require further explanation.
I have never worked on a product or feature that did not change its goals. I doubt you have either. Most changes are refinements due to a better customer understanding, or due to initially unforeseen constraints, or revisions to feature priorities, or features removed or added, etc. The reason we keep product management's original document is that it was the locus of everything that happened afterwards. The differences between it and the current revision gives the reader an understanding of the maturation of what is being shipped. For senior management, where their attention to the project is periodic, it helps bridge their previous understandings to a current understanding.
I like my projects to have this kind of documented grounding, but this does not make me waterfall methodology advocate. I agree completely with Kent Beck's statements in Extreme Programming that software change is cheap. I like the agile methodologies that stem from this seed. I draw the line, however, that product management and software development is nothing more than reorganizing and implementing the backlog. Developers need to know that what they are doing is coherent and concise. Otherwise the work becomes little more than hacking at the coal face — an endless drudgery.
Within a project I don't care much what tool you use to enumerate the work items and their dependencies. What I do care about is that the discussions related to these work items are located in that tool. If the tool's commenting interface is cumbersome then don't select it. If you do, your staff will not use it. Let me repeat that. Your development staff, as a whole, does not like to write stuff down, and if you make it inconvenient to do so they will attempt to make progress without using it [1]. When this happens the only record you will have of the obstacles found and decisions made will be in heads. When the project ends and the staff disperse you will have little from which to draw on to hold a successful postmortem. Worse, however, is that your development organization is doomed to remain, at best, at Level 2.
Lastly, for now, where do instant messaging tools sit in a software development organization? For me, at the bottom of the communication modes. What message is so urgent that it can't wait until tomorrow morning or some other synchronization time [2]? For smaller organizations where one developer might have multiple roles the interruptions will be harder to control, but they can be controlled. The head of development needs to take control of them.
The other problem with instant messaging is that it becomes the primary mode for discussions and decisions. Instant messaging is technically an asynchronous form of communication, but it is rarely used with that expectation [3]. Instant messaging has become akin to oral communication with all of its concomitant weaknesses. It is too easy for a senior staffer to initiate, for example, a Slack conversation to come to a decision than it is to open an issue and discuss it there or simply wait until a next meeting. Or the developer who interrupts everyone to ask a question that could have been answered elsewhere with a little effort on his or her part.
At this point I am sure you are thinking I am a madman. I have the developers sitting alone at his or her desk coding and communicating only online and only asynchronously. It would be a lifeless place without actual face to face communications. Hallway conversations and meeting are vitally important to a development organization. Important enough to write about separately in another posting.
[1] Jira is a good example of a bad interface. Atlassian has put so much effort into enabling customizability that its has made the hourly effort of interacting with issues & comments to be on a par with the one time effort of creating a set of project "status" tokens.
[2] For example, place all announcements on the kitchen refrigerator or on the bathroom mirrors.
[3] Why We’re Betting Against Real-Time Team Messaging criticism of Slack is spot on.
Some comments about a healthy software development organization
I have worked for several heads of development. All were good people. All managed differently. Some were curt, some loyal, some inclusive, and some neglectful. I have learned much from working with them. Here is some of what I have learned.
A healthy development organization is one that has
- Staff with a range and overlap of skills & experiences.
- Work that is finished when all steps are complete.
- Communication is balanced between structured & unstructured.
- Achievements are celebrated.
[1] I am going to use the term software development and not software engineering. My ego is buffed by the engineering term, but, frankly, software development is far from an engineering discipline as the term is used in other inventive organizations. Our work is, with the best of meanings, craft.
The best way to think about Silicon Valley is as one large company
-- Valley of Genius
Found at Stuff The Internet Says On Scalability For August 3rd, 2018
Gaming with Alexa
When getting it to work is the least of your problems
- It works.
- It is maintainable.
- It is reusable.
The developer that creates a data driven implementation that only he or she can understand is not gong to be maintainable by your low skilled, procedural developers. The implementation works, but it can not be considered maintainable and reusable if these activities are limited to one developer.
The development team that picks a language that has a passionate following and generally good library coverage for implementing the initial product release, but it does not have broad acceptance in the development organization. This implementation is not going to have staff readily available for maintenance. So the original staff become its maintainers and these are, very likely, the most expensive developers on your staff.
The development organization that eschews using anything but in-house developed tools and frameworks. No matter how well it is architected, systems designed, used in implementations, and available on-boarding training it is never going to be better than what is available outside. The longer your staff remain, the less employable they become, and so the more anxious they are to leave or, worse, hunker down into survival mode.
When you are creating a product for a one-time use then by all means use whatever it takes to get it working. Remember that these products are gadgets. Even if the gadget is critical to success of some other endeavor -- eg, it specializes in an island's one-time disaster response logistical problems -- it is still a gadget and so expendable. When you are creating an appliance then getting it to work is the least of your problems. Maintaining it and making its parts reusable are central to the development organization's success and repeatability. This requires that you be able to continually staff your organization with the range of developers with costs appropriate to the lifecycle stages of your products.
Slack and "Operation Crossfire aftermath"
I should note that using Slack in this way is not the same as using a messaging platform such as Skype, IRC, etc. In a messaging platform you are talking with an individual within the context of the rest of their life's conversions. Instead, a Slack workspace is being using to gather individuals for a shared purpose. The rest of their life happens outside of the workspace. When the individual is in the workspace they are, for all intents and purposes, the character they are playing. This is reinforce by their communicating via the named channel. I am no long Andrew Gilmartin, but instead I am #Second Lieutenant Anderson.
[1] This is a follow up to Slack for One.
[2] I know next to nothing about who is Lindybeige. I do enjoy his YouTube channel.
Slack for One
Recently, I had the idea that you could use a private Slack site for personal projects and journals. Each channel is a new project or a journal. Slack's chronologically organized messages allow for text, images, (simple) formatting, and the inline inclusion of external content such as from Google Apps. There are many bots for managing each project's actions and reminders, for example. And if you do need to share the project you can. As I thought about this more there seemed no end to how to use Slack as purely a personal information tool rather than a group communications tool. I wonder if anyone has actually used Slack this way?
So, how little data are too few?

So, how little data are too few? I would say anything less than 100 data points.
Four at a time
Months later I was reading about primers, as you do, and was inspired by the article on using Krylon ColorMaster ultra flat black primer. I stripped all 27 of the figures again and applied the primer. My results were not so good. I am sure it was my fault. Again, the figures sat on the worktable in limbo. My guilt grew heavier.
This weekend I stripped all 27 figures again. They are, as I write this, sitting in a second round of stripper. Each of my successive primings seems to have actually added tooth to the figure's surface and so has made cleaning them more difficult!
I have learned a few useful lessons form this experience. The small lesson is that the primer I have used for years works and I really don't need to experiment. The big lesson is I can't work on so many figures at once. If I had only worked on 4 figures at a time then by the end of each week I would have 4 painted figures. Within two months all the figures would have been painted and have been on the table killing the Anglo-Saxons.
When the second round of stripper has eaten away at the bond between primer and figure I am going to pack them away. Too much bad karma has enveloped them. I and they need to rest. Instead, I am going to paint some old Warhammer 40K space marines. 4 at a time.
Getting Things Done for Teens
My children are off to college in the Fall and so my mind has been on what will help them succeed. I have always liked GTD and so I read the recent publication of Getting Things Done for Teens. The book does a good job of using a voice that it is not too young and not too formal. The GTD advice is laid out as any other GTD tutorial and is supported with some useful illustrations. I don't mind the two cartoon characters that are used to distinguish the impulsive and the steady centers of the brain. Monkey brain and Owl brain are useful mnemonics, but, perhaps, a little childish.
The book is composed of 3 sections. The 1st section is the GTD framework. The 2nd section is life planning with GTD. The 3rd section is troubleshooting with GTD. The 1st section is required reading. The 3rd section is useful, but its advise could have been rolled into the 1st section. The 2nd section is a mistake. Few American teens are mature enough to use the advise in this section. The 2nd section adds a considerable page count to the book's total. And here is the rub; the book is useful, but at 288 pages it is 200 pages longer than most American teens are willing to read without a clear & present need.
I don't doubt that the authors know their audience. I suspect they would agree that a shorter book is more likely to be read than a longer one. So why included the 2nd section at all? I suspect it has more to do with selling a standard sized product than helping the teens. My advise is to tear the book into front and back parts and then throw away the back part.
Graphviz online
JNDI, Tomcat, and ClassLoaders
public <T> void bind(String name, Class<T> valueClass, T value) throws NamingException { ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { Context c = new InitialContext(); Thread.currentThread().setContextClassLoader(valueClass.getClassLoader()); c.bind(name, value); } finally { Thread.currentThread().setContextClassLoader(cl); } } public <T> T lookup(String name, Class<T> valueClass) throws NamingException { ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { Context c = new InitialContext(); Thread.currentThread().setContextClassLoader(valueClass.getClassLoader()); return (T) c.lookup(name); } finally { Thread.currentThread().setContextClassLoader(cl); } }I am passing the valueClass to bind() so that an interface can be used if wanted.
Problems of a modern, digital, open office
Off-shore oil rigs

Now, of course, an internet search finds enough information to become an armchair expert in the off-shore oil industry. There are models to build. There is even, it seems, a sub-culture of 3D renders of them and other industrial sites (eg).
Photograph is of Norway's Draugen Oil Platform (src).
Computer assisted support for historical wargames will happen if...
My favorite wargames podcast is Meaples & miniatures. The hosts are all wargaming butterflies, and I mean this kindly, and so there is a good amount of new and old discussed and compared. Their 250th episode is their last of the Summer as they take a break to, well, rest and renew like the rest of the northern hemisphere. For this episode they are answering questions from their audience. I've not finished listening yet, but felt the need to bring a different perspective to one of their answers.
The question was whether or not an assistant computer application would be used in historical wargaming? Apps are appearing more regularly now for boardgames. Some of these boardgames have game mechanics and parts that are very close to those of miniature wargames. Even the forthcoming X Wing 2 is supposed to be app assisted. So, there is a trend in apps and there is a trend in wargames to be more like boardgames (in their initial costs and time commitments). An overlap is inevitable.
The hosts' common answer was one having to do with implementation rather than game play. They discussed how an app is dependent upon a general device, and a large networking and computing infrastructure. The general device being your phone which, for all practical purposes, you own but have little control over its OS or applications suite. The infrastructure being mostly the publisher's backend servers in data centers that run the core of the game programming; which, again, you have no practical control over. The hosts see these dependencies as the achilles heal of apps. They suggest that only large publishers have the money to continue to support a game that has passed its peek sales and so must sustain the game's implementation on smaller, incremental sales. While not said, and I expect that the hosts would agree, that it is optimistic to expect that any publisher would continue to support a game beyond its suitable profitability; ie, if profitability is too small then the company is better of discontinuing the game and use the freed-up resources on higher profit games. So apps are doomed!
Not so. There are implementations that do not require the publisher's continued support. First, some assumptions.
1. A phone or tablet is cheap enough to have a single, specialized use. The device is the game and it is the "rule book." Rule books are around US $15 to $50 these days. The device would be the same. The device will never be upgraded so the apps on it will continue working baring mechanical failure.
2. The device needs access to a messaging network. The messaging network is one where every device has a unique address and that a message can be sent to that address. If players are not colocated then a wide area network would be needed. The Simple Message System (SMS, ie texting) is one such network. There are others, but SMS is by far the most common, well supported, and almost future-proof given the world's telecoms commitment to it.
In many ways, the Kindle with 3G is an archetypal example of this device and network.
With such a device and network you can implement a multiplayer game very successfully. All the algorithms needed, eg peer to peer and modular co-operating services, are battle tested and open. The device's computational and storage requirements are minimal. The networking bandwidth needed is small, eg a few kilobytes, irregularly sent around to all player devices [1]. Embedded systems manufacturers have been designing and massively deploying just this kind of environment for years.
So, if you consider this different implementation of computer assisted support for historical wargames then the answer is yes, just as soon as gaming companies have lead engineers and architects that have a broader view of the devices and their communication. Now the real and important question can be asked, is historical wargames game play enhanced by having this assistant?
See my earlier posting $0.43 for Psychotherapist Barbie services about funding backend servers for toys.
[1] MMOs, massive multiplayer, online games, is a different beast. These systems do need a central or federated infrastructure.