Showing posts with label process. Show all posts
Showing posts with label process. Show all posts

Maintenance, evolution, and technical debt are different

I was listening to a recent Stack Overflow podcast on technical debit and was getting progressively annoyed. The cause of the annoyance was that the speaker was lumping all changes that were not feature changes as technical debit. The changes he was speaking about are better characterized as either maintenance, evolution, or technical debt.

Maintenance is bug fixes. The original implementation is deficient and needs to be repaired. This work is only related to the original design and current feature set.

Evolution is change needed due to alterations in the runtime environment. This work is only related to the original design and intended runtime environment. For example, you need to update a library and that results in a need to update the original implementation.

Technical debt comes about when the original design is unable to accommodate a new need. For whatever reason, it is no longer suitable.

Too often "technical debt" is used to mask an organization's lack of timely maintenance and planned evolution. Don't do that.

Clare Sudbery on what CI was intended to mean

I found this talk by Clare Sudbery on what continuous integration (CI) was intended to mean illuminating. In short, trunk based development, frequent commits, and all hands on deck when the tests aren't green. Her arguments are compelling, as are her critiques of PRs and the working environment they can engender. Unfortunately, it is not a practical methodology to use with legacy products that exhibit inconsistent architecture, poorly implemented, with spotty test coverage. Perhaps use feature branch development to address each of these failings so that you can have true CI in the future.

Is it a future I would enjoy? I don't think so. I can't help but think that trunk based development will further speed the assembly line that agile, esp Scrum, has already placed us all on.

Continuous Integration: That’s Not What They Meant • Clare Sudbery • GOTO 2023

ps I listen to this stuff on drives. Good talks generally don't need slides.

Completing tasks stepwise

After waiting on an improbable response from the HealthSource RI health benefits web app I lamented on Twitter
Every time I have to wait for the interactive response of some application I wish the Envoy Framework was common. December 20, 2019
So what was so great about the Envoy Framework, a framework that was designed 28 years ago for a pre-Internet environment? You should read the whole article, but in short there were two user interaction aspects that I wanted

1. A user is able to disconnect from their session and return at a another time and continue where they left off.

2. A user is notified when requested work has been completed or can continue using their immediately appropriate notification mechanism.

In the HealthSource RI situation I was signing up for 2020 benefits. There is a short window of time to make these benefit decisions and there are many people making them. These circumstances put a strain on an implementation not designed to scale. Even an implemented designed for the cloud will be handicapped when there are choke points. That is, one or more resources that every request needs to interactive with. There are a number of technical solutions to these, but there are also user interaction solutions also. The easiest solution is to ask the user to come back later to complete the work.

On the surface interrupting the user seems the wrong action to take. The person is here and now and so the system should use this opportunity to complete the task. The rub comes when the system slows down and the task is taking longer than the person has time to give here and now. It is better to let the user leave and notify them when the system is ready to continue. When the user returns the system reestablishes the user's context, ie it brings them back up to speed, so as to not unduly prolong the time to completion.

If I were designing HealthSource RI I would make interactions interruptible. Long tasks are broken down into short tasks, each of which can be completed with limited (near zero) interaction with the system. Each time the user returns to work further on the long task they are presented with a plain summary of what has been accomplished and what is left to accomplish. This summary can be written or visual. When a long task is interrupted the user will be contacted, repeatedly if necessary, to return and complete the task. For time critical tasks the contact mechanisms may need to escalate; a person might need to actually phone the user and compete the task over the phone.

People are used to completing tasks stepwise in the physical world. Why not make enabling that a norm in the virtual world too?

Chris Sinjakli's talk "Doing Things the Hard Way"

I am sure you watched James Mickens's talk Q: Why Do Keynote Speakers Keep Suggesting That Improving Security Is Possible? today. It was honest and funny — even my ceramic artist wife laughed at the IoT humor — and contained a great primer on machine learning — my wife skipped that part. As it ended YouTube's autoplay started Chris Sinjakli's talk Doing Things the Hard Way from this years SREcon18 Asia/Australia. From where I sit today his experience, analysis, and advice are spot on. So, if don't have 51 mins to listen to Mickens I high recommend you spend 22 mins listening to Sinjakli. On second thought, listen to both.

Technical Junk

Much of what is called "technical debt" is more likely "technical junk." Technical debt has the ring of responsibility around it. As we build new services and maintain the others we tell ourselves that we have made reasoned judgments as to what to ignore for now:

• We don't need to update that library just yet, but we know 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 through 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?

Why have group meetings in software development? I think there are only three good reasons.

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.

The third good meeting is for celebration. I am most interested in celebrating the group's achievement as a whole. Generally, everyone contributes as they are asked and as they are able, and so I see no need to single out individual contributions. The one exception is for someone who has shown marked growth. Pizza in the conference room can work, but you will have more success if you take everyone out to lunch.

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."

Some more comments about a healthy software development organization

That last posting was a little to high level. Especially for someone like me that likes things to become grounded — at least for one day! Most of my career has been in small companies building small products. Apart from places like Lotus and Geac my employers have had less than 20 developers. This organization size has shaped my expectations of what is useful for a project to succeed.

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.


When getting it to work is the least of your problems

There are 3 important traits of good software implementation
  1. It works.
  2. It is maintainable.
  3. It is reusable.
We have heard many times over the years how a language, a framework, or a methodology are better (and often "the best".) And I don't doubt this for a minute, but over time their betterment is very unlikely to prevail. Three examples are in order.

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.

Problems of a modern, digital, open office

Never liked open plan offices. Lots of studies going back to the 1960s on their problems. This new, small study shows the problems of a modern, digital, open office. Summary at Open Offices Make You Less Open.

Sleeping dogs

Sometimes you forget those services that quietly run for months at a time in a corner of the datacenter. I am thinking of using gRPC to replace the communication layer for our micro-services. They currently use a home-grown RPC over HTTP that, while successful and simple to use for new services, is home-grown, non-streaming, and Java specific. One of our earliest micro-services handles over 2B requests per month. Perhaps I should let sleeping dogs lie....

Two masters

I attended last night's release of the Providence Geeks new website developed by Kenzan. Owen Buckley, Kenzan's director of engineering, did a good job describing the management and implementation of the project. The final result is a useful website, but with little polish.  This is because Kenzan had two customers and not one for this project. Providence Geeks (customer 1) wanted a new website to replace Facebook. Kenzan (customer 2) wanted a learning opportunity for its staff. So the project had too many acceptance criteria, or, as Owen Buckley said "when do you know it is done?"  Unfortunately, "done" was having built an 18-wheeler to haul a pin.

The quiet crisis unfolding in software development

Bill Jordan's essay The Quiet Crisis unfolding in Software Development is spot on. Good advice for any development manager. (Ignore the hyperbolic title.)

Guidelines for presenting a document for discussion

The following guidelines are for presenting a document for discussion. They seem obvious, but it seems they are not in common practice in public policy fields, esp. the South Kingstown School District.
Revision number
What revision number is the document? The number should be (mostly) consecutive -- 1, 2, 3, etc -- but, when not, at least increasing. If an established document is being changed then consider using the software version system. Revision number must be in the footer of every page.
Revision date
When was the revision finalized? Use YYYY-MM-DD date format so as to avoid international date ambiguity. (Is "10/2/12" Oct 2, 2012 or Feb 10, 2012, or Feb 12, 2010.) Revision date must be in the footer of every page.
Revision history
Summarize how the document changed with each revision. The revision history is usually located in the front matter and presented as a table of revision number, revision date, revision authors, and revision summary columns.
Page numbers
What page am I looking at and how many pages are there in total? Page number and page count must be in the footer of every page.
Line numbers
Use line numbers to give the discussants a means to directly reference a portion of the sentence or the paragraph for discussion. Line numbers appear in the left margin of every page. Line numbers are consecutive across the whole document (and not just per page). It is common to only show every 5th or 10th line number. ¶ With online documents there are no fixed lines so use numbered paragraphs.
Changebars
When content is changed change bars allow the reviewer to focus only on the changed content. With a long document, or one that has had intense discussion, not having to reread the whole document aids in moving along the document to completion. Change bars are usually placed in the left margin, but either is fine.
Table of contents
For a long document a table of contents, especially an annotated table of contents, is a guide to quickly understanding the overall structure of the document's content. A good table of contents can substitute for an executive summary.
Also of interest:
  • The International harmonized stage codes is a rather sophistated encoding of ISO's document development process. I just use WORKING (not yet draft), DRAFT (not yet final), FINAL.

When the organization can consistently repeat the success ...

When I read headlines like "Building a Trading Platform in 6 Weeks in an Organization That Would Really Rather We Didn't" I think "So what? Anyone or any small team with sufficient domain knowledge, technical skills, and tools could can do that." A one time success is only that -- a one time success. When the organization, and not a specific person or specific team, can consistently repeat the success then tell me about it.

Atlassian has forgotten that Jira is a communication tool

Atlassian has forgotten that Jira is a communication tool. Comments need numbers so the team can communicate with specificity everywhere. See Skype and development teams as it applies to Jira also.

Jeff Bigler's tact filter theory

An oldie, but a goodie. Jeff Bigler's tact filter theory

W.A.I.T

When wanting to talk WAIT: That is, ask the question "Why am I talking?"

Non-NISO duration standard

My peers have adopted the following non-NISO duration standard:
  • Shortly is less than 17 mins or 29 mins.
  • In-a-bit is less than 29 mins.
  • Half-hour is 30 to 50 mins.
  • In-a-while is about 1 hour.
  • Later is about 2 hours.
YMMV.

If your presence doesn't work, neither will your words.

“If your presence doesn't work, neither will your words.” - Yogi Bhajan