• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Dion Almaer

Software, Development, Products

  • @dalmaer
  • LinkedIn
  • Medium
  • RSS
  • Show Search
Hide Search

Archives for August 2015

The Increase in Gardening with Mobile

August 31, 2015 Leave a Comment


I do a lot of gardening these days. I am not talking about the physical kind (I am not as cool as Joe Hewitt!), although I do find myself wondering why we have so many lawns instead of veggie gardens.

The type of gardening that I do is splitting up flows as I use online services, mainly because of my heavy use of mobile. I think that many of the services that I use could benefit from thinking about to let users deal with their own gardening.

Quick Input

When I get a thought (a note, or a task to do) I try to capture it immediately. I may be at my computer, but I will definitely have my phone in my pocket. I fire up Asana and tap to add [+].

ASIDE: I have a love / hate relationship with Asana. I love how I have been able to contort it to be a personal database vs. the “team productivity” tool that it has become. I dislike various parts of the experience though. The relevant frustration here is that it doesn’t work well offline. This means that I have to use an alternative workflow when connectivity is poor, which results in me: a) inputting into a local note named “Add To Asana”, and b) when online again move the info into Asana. This is an act of gardening itself!

A bit of Asana’s “add” modal

If I have time I make sure to put in as much information as possible. I fix typos. I make sure the data is in the right project. I tag the content appropriately. I attach images. Chances are though that I don’t have time to flush things out to my liking, and then the name of the game is to get the minimal info into a task. This thought could happen at any time, which may mean using voice input hands free.

Once the core information is captured I send it up as a “task for me”. This is my garden in Asana, the garden of new tasks. The benefit of getting something down on paper, is that my mind is free to move on. It also means that I got the information out of my head into my system without forgetting it.

More applications should not only have a trivially fast way to get input into their system, they should understand the need for partial incomplete information.

The Gardening

At a later time I do the act of gardening. I will go through the weeds that are the new tasks, flush them out and file them. I wish weeds didn’t grow, but rather than ignoring that they do, I have a process to deal with them.

I often hoe the garden on a mobile device, but when at my desktop I can get the power tools out. This is a somewhat obvious but interesting to think through in your applications. How does your mobile application help garden? How can your desktop application (including your website) do even more?

The Reaping

The third stage is often the actual reaping. This is where you do work that uses the data that you input. It could be that the input stage is enough (e.g. you sent the email) but generally there is more work to be done.

One example at the top of my mind these days is my spaced repetition learning system. Here are the stages:

Capture

Ah! I should remember this. You are having a conversation where something comes up. You don’t want to wander off to get all of the data into the learning system perfectly, so you through in “remember Bob loves cherry pie” into the garden.

Organize

When it is time to garden you go through and create the appropriate questions and answers for the knowledge about Bob.

  • “What type of desert does Bob love?”
  • “Who loves cherry pie?”
  • “What should I bake Bob for his birthday?”

You notice there are multiple questions pointing to this one piece of knowledge. I have found that this drastically improves my ability to learn. More connections for the brain.

I tag this knowledge with $Bob, #pie, #birthday, #food and place it in the “People” knowledge collection. Since I am on my desktop application I grab a photo of Bob and cherry pie to add visual connections to the mix, adding to the neural connections. Who knows, maybe I will dance on my left leg to add some movement connections too!

Study

I have time set aside every day for the actual act of studying my content.

Setting Aside Distinct Times For Stages

I have found it very useful to split up the type of work into separate time periods. I used to set aside time to look through Twitter and various technical content. I would find that I would quickly go down a rabbit hole and the time would get sucked up with whatever that rabbit hole provided.

Now I have time to capture content, which involves me going through Nuzzel, Medium, Twitter, TechMeme, and friends… adding anything interesting to Pocket. At a later time I have time to actually read content. At that point I can pick the content that looks the most important to me, and I end up spending time in better rabbit holes 🙂

Some kudos to Pocket. I love how they execute, and they just updated their application to suggest content, so I have another good source of great information. If I peak at my Pocket queue now I am reminded that there truly isn’t enough time in the day :/


Getting Things Done

Wait a minute, when I look at having my applications consider various stages and context for their user experience the above looks a little like GTD:

  • Capture what has our attention
  • Clarify what each item means and what to do about it
  • Organize the results
  • Reflect on them
  • Engage with those.

When looking through UX wireframes it is easy to fall into the false mindset that the user is always linearly going through steps in a process flow from start to finish. “Ok, first they will create a new item, then they will fill out all of the information, then they will move it to the next step, etc etc etc”.

In reality the linear flow may be anything but. Information may come in asynchronously, via multiple platforms, from multiple people, and with many constraints (e.g. “the user has something on his mind, has people around her, but wants to get this infomation into the garden for later processing as quickly as possible”).

Another good example of where a “garden” area would help me with Asana is when you have multiple workspaces or organizations. As soon as this decisions is made your ability to quickly input something into the system is compromized. I can’t use the “tasks for me” hack, as I have to first make sure I am in the correct workspace. The net result is that I find myself putting raw info into the wrong workspace all the time.

Does your application support a gardening approach? Are there flows where enabling this will be helpful for your users?

Kids, A showcase for the Availability Heuristic

August 26, 2015 Leave a Comment

I study using spaced repetition as part of my daily checklist, and one of the geekier topics that I learn about are the many (and growing) cognitive biases.

A question related to the availability heuristic popped up, right as I looked over to see my son Sam working on his 4th grade “introduce yourself to the class” poster.

He had just finished a section documenting some of his favorite things:


I had to smile and laugh as I looked them over, and I thought about what was going through his head:

  • Color: “hmm, I guess I should write the color blue in actual blue”
  • Movie: ant man <= last movie he saw
  • TV show: The Goldbergs. I was surprised he didn’t write Family Guy :). I love that he loves the goldbergs…. as it is one of the shows we watch as a family.
  • Sport: Lacrosse <= last sport he participated in (having just started)
  • Animal: “I like pandas… hmm but I like penguins too, I should put them both down”. Ah, just when he seems so old to me… starting 4th grade, he then reminds me that he is still my lil guy. As a baby he slept with and loved his “guiny”
  • Snack: “I like hamburgers.” He will argue with you about In and Out vs. Five Guys vs. The Counter vs. Gotts vs. …. He does like brussels sprouts and seaweed too!
  • Drink: “San Pellegrino”. Wow! He is his father’s son! 🙂
  • Holiday: “Christmas”. Duh. Although I could have seen halloween. His favorite comedy sketch is Seinfeld on halloween, and it is epic: “Who is giving out candy? EVERYONE I KNOW IS GIVING OUT CANDY?”
  • Song: “Cheerleader”. Really? Man, I hate those lyrics. It is one of the songs on repeat these days in the Aiden Mix. Others include: Honey, I’m Good, Pompeii, Sugar, The Lazy Song (they love the monkeys in the video!), and Party Rock (you have to watch with the stormtroopers!)
  • Celebrity: “DJ SoLoMaNXX”. Because he just wrote Party Rock. It it wasn’t for availability I think he would have gone for a Minecraft YouTuber!
  • “Any”. I love how he started by putting any as answers, bypassing the whole point of showcases your favorite!

A slew of these answers are not true favorites in the measured sense. The availability in memory, enforced with the anchoring of prior questions ends up with these answers on paper.

The glimpse into Sam that his class will get is fairly representative, but isn’t the full picture.

How many of the impressions that we make are like this?

“I have never had a fight with my wife!” The Importance of Resilience

August 25, 2015 Leave a Comment


I overheard a conversation that you have probably heard a variant of yourself. A bloke was so proud of the fact that he hadn’t had a serious confrontation with his spouse to date. Ah, the perfect union.

While some joined him in appreciation, I had to hide the real thoughts going through my head:

“Oh crap, he may be lucky and truly have the perfect situation, or when something does come to a boil, they have never practiced the art of disagreement. They have never worked though a tricky situation”

Resilient Software

This reminded me of a similar conversation that I had awhile back, where I heard an admin act so very proud that one machine had been up for over a year. That scared the hell out of me too. It meant that a restart hadn’t been tested in over a year, and can you imagine the magic and cruft that was built up? That is one of the reasons why folks are excited about immutable servers, or at the very least having systems that get built up from scratch.

I am building a new application, and not only should it be mobile first, it should also be offline first. The majority of experiences should probably be architected in the same way. You notice the opposite these days, and often from applications that were built before the mobile revolution. It is often much harder to bolt on offline capability after the fact.

When you build an offline first client you tend to get some great side benefits:

  • If you are working on local data you can keep a responsive UI (as long as you are smart about keeping off the main thread!)
  • You can progressively enhance when online
  • For example, when DuoLingo matches your typed in answer a simple match can occur locally while a more complex match can be kicked off online (if the client is offline).

You can also get into a situation where you are out of sync. The client and server see differing versions of reality.

Shift+Reload

In retrospect we had it lucky in the Web 1.0 days. We could purely server render and the client was a dumb terminal that recreated itself on every request. As browsers got richer caching we needed to give users the nuclear option: Shift+Reload. Not exactly user friendly, but it sure came in handy (and still does!).

These days we need to make sure that our rich clients aren’t getting corrupt. For our clients to work well offline they have local state and data to work on. We have all been frustrated when there is a bug that you can’t easily restore from.

Borken Downloads

One example for me is installing applications on my devices. As I type I have gotten into the situation where my download is hung, yet I have no way to kick start it or even delete it. There is something so very infuriating when this happens, when a version of a shift+reload doesn’t fix the situation. Just yesterday a coworker and I created the same projects on Asana because we didn’t see that the other had already done so. It took forever for me to see his version, and be able to clean it up.

It is tough to get this right. We are trying to do the right thing for the user by caching and keeping their application responsive, yet we should take some hints and have systems to help out. If a user is killing and restarting their application, that is the modern shift+reload is it not?

Micro Services

In theory the birth of micro services and trying to hide the complexity of functionality behind nice clean decoupled APIs helps us with resiliency. In practice I have seen this turn out to be a real mess. It isn’t the fault of the practice, but rather the implementation details. Here is what I have seen go wrong:

The scope of the services isn’t defined correctly

  • In one example the scope seemed to be a function of team size vs. the natural composition of the functionality

Inter-dependency killers

  • There were separate small services, but they all depended on each other. The result was a lot of communication around “a new version of service X was deployed and it broke service Y in QA”

No view of the system as awhole

  • When something goes wrong, how are you made aware? How do you then find where the problem is? Due to not having enough of a view on the whole system it can be hard to get this information. You have to explicitly spend time on the seams

Poor exception handling

  • I hate it when all errors and exceptions are treated as equal. This results in socket closed exceptions being thrown into the mix where they weren’t errors at all…. the client just disconnected and it was fine! As soon as you get this wrong you get a sea of information that you can’t trust, and the killer errors can go un-noticed. I have seen shocking bugs live in production for far too long due to this :/

Finger pointing

  • The worst situations occur when you have constant finger pointing. Something is wrong in the system but each team is arguing about what is actually broken. Services teams point at each other, and point at the network guys, who point at the infrastructure guys who …. point back to the services folk!

Spending time up front to get ahead of this is vital. Certain platforms shine here too. Erlang is known for holding resiliency as its core tenet. Various reactive platforms do well, but although these can make life better for you, you need to care.

I have often had to hold my nose and do the impure. I have setup proxy layers that do automatic retries when the core backend should have been fixed. This is risky, because you can end up increasing the traffic and causing even more issues, but if done right it can save your bacon.

Have you gone through and spec’d the SLA needed for various services? So often we see a least common denominator when it is better to split things out. As an example, if you look at an API that gives you information on a product (description, price, availability, reviews, images, etc) you may want an up to date price but those reviews? Not so much. You can probably deal just fine without that one review that just came in. In this case you probably want to say the equivalent of:

“try to get the latest reviews, but if they don’t come back in Xms then use the last grabbed…. and when that call comes back update the cache for next time maybe, cool?”

It isn’t a surprise that hapi, which Eran Hammer and his team started with me at Walmart, does this pretty well thanks to a box for a cat, as well for handling microservices in general.


For a great modern experience that is fast and works well for your users, chances are that you should:

  • Build an offline first client, but give it enough intelligence to be able to handle corruption and get back to a clean state of health, even with nuclear options
  • Build a services tier that assumes failure at each tier, and that can deal with that failure gracefully
  • Progressively enhance the experience on both the client and the server to make sure the core service always works, but that it can also turn on features and tweaks when available.

And as soon as you have something running, start taking your code to counselling so the system can get good at dealing with disagreements and disruption 😉

Next Page »

Primary Sidebar

Twitter

My Tweets

Recent Posts

  • I have scissors all over my house
  • GenAI: Lessons working with LLMs
  • Generative AI: It’s Time to Get Into First Gear
  • Developer Docs + GenAI = ❤️
  • We keep confusing efficacy for effectiveness

Follow

  • LinkedIn
  • Medium
  • RSS
  • Twitter

Tags

3d Touch 2016 Active Recall Adaptive Design Agile Amazon Echo Android Android Development Apple Application Apps Artificial Intelligence Autocorrect blog Bots Brain Calendar Career Advice Cloud Computing Coding Cognitive Bias Commerce Communication Companies Conference Consciousness Cooking Cricket Cross Platform Deadline Delivery Design Desktop Developer Advocacy Developer Experience Developer Platform Developer Productivity Developer Relations Developers Developer Tools Development Distributed Teams Documentation DX Ecosystem Education Energy Engineering Engineering Mangement Entrepreneurship Exercise Family Fitness Founders Future GenAI Gender Equality Google Google Developer Google IO Habits Health HR Integrations JavaScript Jobs Jquery Kids Stories Kotlin Language Leadership Learning Lottery Machine Learning Management Messaging Metrics Micro Learning Microservices Microsoft Mobile Mobile App Development Mobile Apps Mobile Web Moving On NPM Open Source Organization Organization Design Pair Programming Paren Parenting Path Performance Platform Platform Thinking Politics Product Design Product Development Productivity Product Management Product Metrics Programming Progress Progressive Enhancement Progressive Web App Project Management Psychology Push Notifications pwa QA Rails React Reactive Remix Remote Working Resilience Ruby on Rails Screentime Self Improvement Service Worker Sharing Economy Shipping Shopify Short Story Silicon Valley Slack Software Software Development Spaced Repetition Speaking Startup Steve Jobs Study Teaching Team Building Tech Tech Ecosystems Technical Writing Technology Tools Transportation TV Series Twitter Typescript Uber UI Unknown User Experience User Testing UX vitals Voice Walmart Web Web Components Web Development Web Extensions Web Frameworks Web Performance Web Platform WWDC Yarn

Subscribe via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Archives

  • February 2023
  • January 2023
  • September 2022
  • June 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • November 2021
  • August 2021
  • July 2021
  • February 2021
  • January 2021
  • May 2020
  • April 2020
  • October 2019
  • August 2019
  • July 2019
  • June 2019
  • April 2019
  • March 2019
  • January 2019
  • October 2018
  • August 2018
  • July 2018
  • May 2018
  • February 2018
  • December 2017
  • November 2017
  • September 2017
  • August 2017
  • July 2017
  • May 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016
  • August 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • February 2016
  • January 2016
  • December 2015
  • November 2015
  • October 2015
  • September 2015
  • August 2015
  • July 2015
  • June 2015
  • May 2015
  • April 2015
  • March 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • August 2014
  • July 2014
  • June 2014
  • May 2014
  • April 2014
  • March 2014
  • February 2014
  • December 2013
  • November 2013
  • October 2013
  • September 2013
  • August 2013
  • July 2013
  • June 2013
  • May 2013
  • April 2013
  • March 2013
  • February 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012

Search

Subscribe

RSS feed RSS - Posts

The right thing to do, is the right thing to do.

The right thing to do, is the right thing to do.

Dion Almaer

Copyright © 2023 · Log in

 

Loading Comments...