1. Courses
  2. Developer Foundations
  3. Software Development: Idea to App
  4. Stop 2

30 minBeginner

Screens and flows

A spec says what the app is for. A flow says what the shop owner does, screen by screen, and what the app shows when the network fails halfway. In this lesson you turn the reorder spec into a flow, sketch the screens on paper, and test them in a partner shop before anyone writes code.

By the end you can

  • Write a user flow for one task: the happy path, its branches and its tap count
  • Sketch low-fidelity screens with one main job each, and every state each screen can be in
  • Design what the app shows when an order is slow, fails, or might have gone through
  • Run a 20-minute test of a paper prototype with a shop owner and turn your notes into ranked changes
  • List the data each screen needs, ready for the data model in the next lesson

The everyday picture

When Mangrove Market opens a new store, the store manager does not order the shelves and checkout counters first. She marks the layout on the empty floor with masking tape: the entrance here, fruit and vegetables there, two tills by the door. Then she asks a cashier to push a full trolley along the tape, from the entrance to the till and out again. The cashier bumps into a corner, finds that the queue blocks the exit, and asks where the empty baskets go.

Moving a strip of tape takes a minute. Moving a counter that is bolted to the floor takes a week. Screens and flows are the tape on the floor for an app. A sketch on paper is cheap to change, while code that is written, tested and released is the bolted counter. This lesson is about walking the path with a real person while it is still tape.

From the spec to a user flow

In From idea to one-page spec you wrote the smallest useful version of the reorder app: Ravi signs in, sees his last orders, repeats one in three taps with quantities he can adjust, sees the order's status and gets a weekly summary. A spec lists what the app must do. It does not say in which order things happen, what the owner sees at each moment, or what happens when something goes wrong. A flow does.

A is the path one user takes through the app to finish one task. Write it as numbered steps, and give each step three parts: the screen the user sees, the action they take, and what the app does in reply. Write one flow per task, and start from the user's goal in their own words: "Order the same as last Monday, with two more cases of cooking oil." Then write the steps.

  1. Home: Ravi sees his last three orders as cards. He taps last Monday's order. (tap 1)
  2. Order detail: he sees the 22 items and the total. He taps Repeat. (tap 2)
  3. Review: the same items appear with last week's quantities. He changes cooking oil from 6 to 8 cases and the total updates. He taps Place order. (tap 3)
  4. Status: the app shows that Mangrove received the order and the delivery day.

That list is the : everything works and the user makes no mistakes. It is where you check the spec's promise. Count the taps. The "three taps" in the spec are open, repeat and place. Changing a quantity costs an extra tap or two, and that is fine because it is optional. Writing the count down early stops a common drift, where each review adds "one small confirmation" until the core task takes seven taps.

Then go back over each step and ask what else could happen there. Ravi has no orders yet. An item from last week is out of stock. The price of rice went up. The network drops while he taps Place order. Each answer is a , another way out of that step. You do not need to design every branch today, but you must list them, because each one becomes a screen state, a rule in the API or a test later. A good rule for a first flow: one happy path, and for each step the two or three branches that will happen every week.

Quick check

The spec says "repeat an order in three taps". Which change breaks that promise?

Home last 3 orders tap 1: open Order detail items and total tap 2: repeat Review quantities editable Out of stock shown at 0 tap 3: place Sending button locked fails retry Not sent same order key server: placed Status received 10:42 3 taps to a placed order
The reorder flow. The happy path runs down the left: open an order, repeat it, place it. Branches leave from the step where they happen: an out-of-stock item shows on the Review screen, and a failed send offers a retry that reuses the same order key.

Sketching screens: one job each, every state

Now draw each step as a screen, on paper, on a whiteboard or as boxes in a design tool. Keep it at : grey boxes, real words, no colours or logos. Low fidelity helps you. People criticise a rough sketch more freely than something that looks finished, and you can redraw a sketch in two minutes while the shop owner watches.

Give each screen one main job and one main action. The Review screen's job is "check this order and send it", and its main action is the Place order button. Everything else on the screen supports that job: the item list, the steppers, the total. Put the information a user needs for a decision on the same screen as the decision. Ravi decides whether to send the order partly from the total, so the total belongs on the button itself: "Place order, $412.60". Use real data in sketches: real product names, real quantities, prices with cents. Placeholder text like "Item 1" hides the very problems you are looking for, such as a long product name that wraps onto three lines on a small phone.

Every screen that loads data also has several . Sketch each one, because each needs its own words and layout:

  • Loading: the data is on its way. On patchy mobile data this can last several seconds, so show what you can, such as the orders saved on the phone last time, instead of a blank screen.
  • Empty: there is nothing to show yet, as for a new shop with no orders. Say what will appear here and what to do next.
  • Error: loading failed. Say what happened in plain words and offer one action, usually Try again.
  • Partial: some of it works, such as an order where two of the 22 items are out of stock.
  • Normal: the screen as you first imagined it.

Draw for the real conditions. Partner shop owners use their own phones, often cheap Android phones with small screens, used with one hand while a customer waits at the counter. Keep the main button near the bottom where a thumb reaches it, and make tap targets large. Android's accessibility guidance asks for at least 48 by 48 density-independent pixels, and Apple's asks for at least 44 by 44 points. Design for PMs and Designing for frontline work go deeper into hierarchy, accessibility and working conditions.

Quick check

A new partner shop signs in for the first time and has never ordered through the app. Which state of the Home screen does the owner see, and what should it do?

Designing the unhappy path: slow, failed or unknown

The most important branch in the reorder flow comes after Ravi taps Place order. On a fast connection the reply comes back in under a second. In a shop with patchy mobile data, one of three things happens. The server replies that the order is placed. The server replies with an error. Or no reply arrives before the app stops waiting, which is called a . The third case is the dangerous one, because the app does not know whether the order reached the server. The request may have been lost on the way, or the order may have been saved and only the reply lost.

If the screen says "Failed, try again" in that case, Ravi taps again and may get two deliveries of 22 items. If it says "Placed", he may wait for a delivery that never comes. Neither is acceptable for an app whose purpose is to be more reliable than a phone call, when about 1 phone order in 12 is corrected after delivery today. So the flow needs a third message, such as "Checking your order", and a rule: the app asks the server whether the order arrived before it offers to send it again.

Protect the screen from double taps, too. From the moment Ravi taps Place order, the button shows "Sending" and cannot be tapped again. Each order attempt gets an , a unique ID the app creates once and sends with every retry of that same order, so the server can recognise a repeat and return the first result. You will build the server side in Data model and API and the app side in Building the app, and the idempotency lesson in the API course goes deeper. At this stage your job is to put the states on paper, so the people who build them know they exist.

Quick check

Ravi taps Place order, and after a long wait the app still has no reply. What should the screen do first?

Ready button shows total tap Place order Sending button locked error retry Not sent Try again placed no reply in time not found Placed show order number Not sure ask: did it arrive? found Same order key on retry, so no order is doubled
The states of the Place order button. An error reply leads to Not sent and a retry. A timeout leads to Not sure, where the app asks the server whether the order arrived before it offers to send it again. Every retry carries the same order key.

Testing the flow with a partner shop

A flow on paper is still your guess. Before anyone writes code, put it in front of the people who will use it. Testing ideas cheaply explains usability tests in full. Here is the short version for one developer and one flow.

Make a : one card per screen and per important state, drawn at roughly phone size. You play the computer. When the owner taps a button with his finger, you put down the next card. When he taps Place order, you put down Sending, wait three seconds, and then put down the result you planned to test, including Not sure. A clickable prototype in a design tool such as Figma or Penpot works too, and it runs on the owner's own phone, which is closer to the real thing. Paper is faster to change between sessions.

Run each session in the shop, at a quiet time the owner chooses, for about 20 minutes:

  1. Explain that you are testing the design, not him, and that nothing he does can be wrong.
  2. Give one task as a goal in his words: "Your delivery comes Thursday. Order what you ordered last Monday, with two more cases of cooking oil." Never name the button.
  3. Ask him to think aloud, and do not help. If he asks what to do, ask what he would try if you were not there.
  4. At each step, write down where he hesitated, what he tapped that did nothing, what he said and how many taps it took.
  5. At the end, ask what he expected to happen after Place order, and how he would know the order went through.

Three to five shops, in one or two days, will show you most of the serious problems. Then sort what you saw by severity. A stops the task or makes the owner finish it wrongly. A slowdown makes the task slow or uncertain. A cosmetic problem is everything else. Fix every blocker in the sketches, then run a second small round with different owners to check that the fixes worked. Keep your notes and the list of changes: the course project asks for them.

Build it

Produce the three working documents for the reorder flow: the written flow, a screen inventory with the data each screen needs, and a test script. Keep them as Markdown files in a docs/ folder of your project repository, next to the spec from app-01, so they change in pull requests like code.

  1. Write the flow

    One file per task. Start with the goal in the user's words and the tap budget, then the happy path, then the branches, each tagged with the step it leaves from.

    Markdown
    # Flow: repeat last order
    
    Goal (owner's words): "Order what I ordered last Monday, with two more cases of cooking oil."
    User: partner shop owner, own Android phone, patchy mobile data
    Start: Home, signed in.  End: Status shows "Received".
    Tap budget: 3 (open, repeat, place). Quantity changes are optional taps.
    
    ## Happy path
    1. Home: last 3 orders as cards (date, item count, total). Tap a card. [tap 1]
    2. Order detail: items, quantities, total. Tap "Repeat and review". [tap 2]
    3. Review: same items, last quantities, steppers, total on the button.
       Tap "Place order, $412.60". [tap 3]
    4. Sending: button locked, "Sending".
    5. Status: "Received by Mangrove at 10:42", order number, delivery day.
    
    ## Branches
    - 1 Home, no orders yet: empty state, "Your past orders will appear here".
    - 1 Home, offline: orders saved on the phone, banner "Offline".
    - 3 Review, item out of stock: shown at 0, greyed, "Not available this week".
    - 3 Review, price changed: old and new price shown, total updated.
    - 4 Sending, error reply: "Not sent. Try again." Retry uses the same order key.
    - 4 Sending, no reply in time: "Checking your order", then Status or Not sent.
    
    ## Open questions
    - What is the cut-off time for Thursday delivery? (ask the DC team)
  2. Make the screen inventory

    One row per screen. The last column, the data each screen needs, is the input for the tables and endpoints in Data model and API. If a screen needs data that no system has, you find out now instead of in week three.

    Markdown
    | Screen         | Main job               | Main action       | States                                   | Data it needs                                   |
    |----------------|------------------------|-------------------|------------------------------------------|-------------------------------------------------|
    | Home           | pick an order to repeat | open an order    | loading, empty, offline, normal          | last 3 orders: id, date, item count, total cents |
    | Order detail   | see what was in it     | Repeat and review | loading, error, normal                   | lines: article name, pack size, qty, price cents |
    | Review         | check and send         | Place order       | normal, partial, sending, not sure, not sent | today's price and availability per article   |
    | Status         | know it arrived        | back to Home      | normal, error                            | order number, status, received time, delivery day |
    | Weekly summary | see the week           | none              | loading, empty, normal                   | orders this week, total cents, top 5 items      |
  3. Write the test script

    Use the same script word for word in every session, so the results can be compared.

    Markdown
    # Test script: repeat last order (about 20 minutes)
    
    Before: owner agrees; paper cards at phone size or the prototype on his phone; notes sheet.
    
    Say: "We are testing the design, not you. Nothing you do is wrong.
    Please say what you are thinking as you go. I won't help, because
    I want to see where the design is unclear."
    
    Task: "Your delivery comes Thursday. Order what you ordered last Monday,
    with two more cases of cooking oil."
    
    Notes, per step: screen | what he did | what he said | pause (seconds) | taps
    If he asks for help: "What would you try if I weren't here?"
    
    After the task, ask:
    1. "What did you expect to happen when you tapped Place order?"
    2. "How would you know the order reached Mangrove?"
    3. "What would make you use this instead of phoning your sales rep?"
    
    Result: finished alone / finished with help / did not finish
  4. Summarise the round in numbers

    After the sessions, count before you discuss. Each finding gets a severity, how many owners hit it, and the change you will make.

    Output
    Round 1: 5 partner shops, 1 task, paper prototype, about 20 minutes each
    
    Finished alone        2 of 5
    Finished with help    3 of 5
    Did not finish        0 of 5
    Taps, happy path      3 designed, median 5 seen (back-tracking from Review)
    
    B1 blocker   3 of 5  expected Repeat to send at once, missed the oil change
                         -> "Repeat and review", Review titled "Check before sending"
    B2 blocker   2 of 5  tapped Place order twice while Sending
                         -> lock the button, same order key on any retry
    S1 slowdown  4 of 5  asked how they would know it arrived
                         -> Status shows order number and received time, large text
    C1 cosmetic  1 of 5  wanted a different icon for the summary
    
    Round 2: 3 new shops, after the changes: 3 of 3 alone, no blockers
  5. Write the flow as data and check the tap count

    A flow is a small graph: screens are points and taps are the arrows between them. Writing it as data lets a test check the tap budget whenever someone adds a screen. The Practice exercise asks you to write the function that counts the fewest taps.

    JavaScript
    const reorderFlow = {
      home:    [{ tap: 'Open order', to: 'detail' }, { tap: 'Weekly summary', to: 'summary' }],
      detail:  [{ tap: 'Repeat and review', to: 'review' }, { tap: 'Back', to: 'home' }],
      review:  [{ tap: 'Place order', to: 'status' }, { tap: 'Back', to: 'detail' }],
      status:  [{ tap: 'Home', to: 'home' }],
      summary: [{ tap: 'Home', to: 'home' }],
    };
    // the spec's promise, as a check you can run on every change:
    // fewestTaps(reorderFlow, 'home', 'status') must be 3 or less

Bring it to your team

Ask these in the review of the sketches, before the first line of app code.

  • What is the owner's goal for this flow, in his words, and how many taps does the happy path take?
  • For each screen, what do we show while loading, when empty, on error and when only part of it worked?
  • What does the owner see if Place order gets no reply, and what stops a double order?
  • Who outside the team tried this flow, in their shop, and what did we change because of it?
  • Does every screen's data exist somewhere today, and can the API give it in one call?

Red flags

  • Polished, coloured screens before anyone has tried the flow with a shop owner.
  • Only the happy path is drawn, and errors are "for later".
  • The test was run with teammates or sales reps instead of shop owners.
  • A confirmation pop-up added to every order "to be safe".
  • Sketches full of placeholder text such as "Item 1, $0.00".

Practice

Count the fewest taps

Write fewestTaps(flow, start, goal). flow maps each screen name to a list of actions, and each action is { tap, to }: tapping it takes you to screen to, as in step 5 of Build it. Return the fewest taps that get from start to goal, 0 if they are the same screen, and -1 if the goal cannot be reached. Flows have Back buttons, so they contain loops. Hint: look at all screens one tap away, then all screens two taps away, and so on, and remember the screens you have seen.

JavaScript exerciseRuns in your browser with tests
function fewestTaps(flow, start, goal) {
  // flow: { screenName: [{ tap: 'Label', to: 'otherScreen' }, ...] }
  // return the fewest taps from start to goal, 0 if start === goal, -1 if unreachable
}
Ctrl + Enter runs
Show a solution
JavaScript
function fewestTaps(flow, start, goal) {
  if (start === goal) return 0;
  const seen = new Set([start]);
  let frontier = [start];          // screens reachable in `taps` taps
  let taps = 0;
  while (frontier.length > 0) {
    taps += 1;
    const next = [];
    for (const screen of frontier) {
      for (const action of flow[screen] || []) {
        if (action.to === goal) return taps;
        if (!seen.has(action.to)) {  // skip loops such as Back
          seen.add(action.to);
          next.push(action.to);
        }
      }
    }
    frontier = next;
  }
  return -1;                       // ran out of new screens
}

This is a breadth-first search: it tries every one-tap screen before any two-tap screen, so the first time it reaches the goal is the fewest taps. The seen set stops Back buttons from making it go round in circles.

Pass the exercise to finish this task.

Rank the findings and change the flow

You tested the reorder flow with four partner shop owners. Your notes: (a) 3 of 4 did not notice that two items were out of stock and expected them in the delivery; (b) 1 of 4 said the green of the Place order button was too bright; (c) 2 of 4 scrolled the Review screen for a while looking for the total, which was at the top; (d) 1 of 4 asked to add a new product he had never ordered, which the spec lists as a non-goal. Label each finding blocker, slowdown, cosmetic or out of scope, name the two changes you make before round two, and say what you will watch for in round two.

  • (a) is a blocker, because owners finish the task with a wrong picture of what will arrive
  • (c) is a slowdown, fixed by putting the total where the decision is, such as on the Place order button
  • (b) is cosmetic and (d) is out of scope for this version, written down to count how often it comes up
  • The two changes are concrete changes to the sketches, not "make it clearer"
  • Round two uses new owners and checks that the out-of-stock items are noticed
Show a model answer

(a) Blocker: three owners would expect goods that will not come, which is the same kind of surprise as a corrected phone order. (c) Slowdown. (b) Cosmetic, leave it for now. (d) Out of scope: new-item search is a non-goal, so note it and count how many owners ask. Change 1: out-of-stock items move to the top of the Review screen under a heading "Not available this week (2)", shown at 0 with the reason. Change 2: the total goes on the button, "Place order, $388.20", and updates as quantities change. In round two, with three or four new owners, I watch whether each owner mentions the missing items before tapping Place order, and how long they spend on the Review screen.

Check yourself

Imran wants to add a "Rate your last delivery" screen between Review and Status in the reorder flow, because the team needs delivery feedback. What is the best response?

In a test round, 4 of 5 owners finished the reorder task, but 3 of them needed help on the Review screen. What do you do next?

Which choice in a paper sketch is most likely to hide a real problem?

Flashcards

Open my review

Key takeaways

  • Write the flow before the screens: the goal in the user's words, the happy path with its tap count, then the branches for each step.
  • Give each screen one job and one main action, put the decision's information next to the decision, and sketch every state with real data.
  • After Place order, design for three outcomes: placed, failed and not sure. Lock the button and reuse one order key on every retry.
  • Test paper sketches with three to five real owners in their shops, rank what you see by severity, fix the blockers and test again.
  • The screen inventory's data column is the starting point for the data model and API.

Sources

Episode transcriptTape on the floor, cards on the counter · about 13 minutes · tap any line to play from there
  1. NadiaImran, picture Ravi's shop on a Monday morning. Two customers at the counter, his phone in one hand, one bar of mobile data. He taps Place order in a new app, and nothing happens for eight seconds. What does he do?
  2. ImranHe taps it again. Probably twice.
  3. NadiaAnd if the first tap did reach the server, Mangrove now sends him two deliveries of twenty-two items. Today is about catching that with a pen and paper cards, weeks before anyone writes code.
  4. ImranThis is lesson two of the reorder app. Last time we wrote the one-page spec. So what comes after the spec?
  5. NadiaScreens and flows. Let me start with a picture. When Mangrove opens a new store, the manager doesn't order shelves and counters first. She marks the layout on the empty floor with masking tape.
  6. ImranFruit here, tills there, the entrance by the door.
  7. NadiaThen she asks a cashier to push a full trolley along the tape. The cashier hits a corner, finds that the queue blocks the exit, and asks where the baskets go. Moving tape takes a minute. Moving a counter that's bolted down takes a week.
  8. ImranSo a sketch is the tape, and released code is the bolted counter.
  9. NadiaExactly. And this lesson is about walking the path with a real person while it's still tape.
  10. ImranFine, but the spec already lists what the app does. Sign in, see last orders, repeat one in three taps, see the status, get a weekly summary. Isn't that enough to start drawing screens?
  11. NadiaThe spec says what. It doesn't say in which order things happen, what Ravi sees at each moment, or what happens when something goes wrong. That's what a user flow is for. It's the path one user takes to finish one task, written as numbered steps.
  12. ImranAnd each step is a screen?
  13. NadiaEach step has three parts. The screen he sees, the action he takes, and what the app does in reply. And you start from his goal in his own words. Order the same as last Monday, with two more cases of cooking oil.
  14. ImranLet me try. Home shows his last three orders. He taps Monday's. That's tap one. Order detail shows twenty-two items and a total. He taps Repeat, tap two.
  15. ImranReview shows last week's quantities. He bumps the oil from six cases to eight and taps Place order. Tap three. Then the status screen.
  16. NadiaThat's the happy path. Everything works and nobody makes a mistake. And you just checked the spec's promise by counting taps.
  17. NadiaThe oil change cost an extra tap, and that's fine, because it's optional. The count matters because flows drift. Each review adds one small confirmation, and a few months later the core task takes seven taps.
  18. ImranSo if someone wants an are you sure pop-up after Place order...
  19. NadiaThat's a fourth tap on every single order, even for owners who change nothing. A clear Review screen with the total on the button already is the confirmation.
  20. NadiaIf you can see your screen, the first diagram shows the flow. Down the left side there are five boxes, from Home to a green Status box, with tap one, tap two and tap three on the arrows. Off to the right sit two side boxes for things that go wrong.
  21. ImranThose side boxes are the branches?
  22. NadiaYes. After the happy path, go back over each step and ask what else could happen there. A new shop with no orders. An item out of stock this week. Rice went up in price. The network drops during Place order.
  23. ImranDo I need to design all of those now?
  24. NadiaList them all. Design the two or three per step that will happen every week. Each one turns into a screen state, a rule in the API, or a test later in the course.
  25. ImranNext is drawing the screens. My instinct is to open a design tool and make it look nice, so the shop owners take it seriously.
  26. NadiaThat's the trap. Keep it low fidelity. Grey boxes, real words, no colours, no logos. People criticise a rough sketch more freely than a finished one, and you can redraw a sketch in two minutes while the owner watches.
  27. ImranWhat goes on each screen?
  28. NadiaOne main job and one main action. The Review screen's job is to check this order and send it. Its main action is Place order. And put the information for a decision next to the decision.
  29. NadiaRavi decides partly from the total, so the total goes on the button itself. Place order, four hundred and twelve dollars and sixty cents.
  30. ImranAnd real product names, I assume. Not item one, item two.
  31. NadiaReal names, real quantities, prices with cents. Placeholder text hides exactly the problems you're looking for, like a long product name that wraps onto three lines on a small phone.
  32. ImranYou also said every screen has states.
  33. NadiaFive of them, for any screen that loads data. Loading, empty, error, partial and normal. Loading on patchy data can last several seconds, so show what you can, like the orders saved on the phone last time.
  34. NadiaEmpty is the new shop with no orders yet. Error says what happened in plain words and offers Try again. Partial is the order where two of the items are out of stock.
  35. ImranAnd normal is the one everybody draws first.
  36. NadiaAnd often the only one. Teams forget the empty state most, because their test accounts always have data.
  37. ImranNow back to Ravi tapping twice. That's the part that worries me.
  38. NadiaAfter Place order there are three outcomes. The server says placed. The server says error. Or no reply comes before the app stops waiting. That's called a timeout.
  39. ImranAnd a timeout is the same as an error, right? It failed.
  40. NadiaThat's the reasonable guess, and it's wrong. After a timeout the app doesn't know. The request might have been lost on the way. Or the order was saved and only the reply got lost.
  41. ImranSo if the screen says failed, try again, Ravi might get two deliveries. And if it says placed, he might wait for a delivery that never comes.
  42. NadiaRight. And this app exists to be more reliable than a phone call, where roughly one order in twelve is corrected after delivery. So the flow needs a third message, checking your order. The app asks the server whether the order arrived before it offers to send it again.
  43. NadiaThe second diagram shows those states. If you're looking, Ready is at the top, then Sending. A red Not sent box on the right is for an error reply. A green Placed box sits below. And an amber Not sure box catches the timeout, asks the server, and then moves to Placed or Not sent.
  44. ImranAnd the double tap?
  45. NadiaFrom the first tap, the button says Sending and is locked. And each order gets an idempotency key, one unique ID the app creates once and sends with every retry. The server sees the same key and returns the first result instead of making a second order.
  46. ImranThen we test. With whom?
  47. NadiaReal owners, in their shops. You make a paper prototype, one card per screen and per important state, about the size of a phone. You play the computer. He taps a card with his finger, and you put down the next one.
  48. NadiaWhen he taps Place order, you put down Sending, wait three seconds, then put down the result you want to test, including Not sure.
  49. ImranWhat do I say to him?
  50. NadiaTell him you're testing the design, not him. Give one task as a goal. Your delivery comes Thursday, so order what you ordered last Monday, with two more cases of cooking oil. Never name the button. Ask him to think aloud, and don't help.
  51. ImranWhat if he asks me what to do?
  52. NadiaAsk what he'd try if you weren't there. Note where he hesitates, what he says, and how many taps it takes. At the end, ask what he expected after Place order, and how he'd know it went through.
  53. NadiaHere's how it went at Mangrove. Leila, the designer, drew six cards. You and a developer took them to five partner shops on a Tuesday morning, starting with Ravi's.
  54. ImranI remember. All five finished. Only two finished without help.
  55. NadiaThree tapped Repeat and expected the goods to be on their way, so they skipped past Review and missed the oil change. Two tapped Place order twice while the Sending card was down. And Ravi asked how he'd know Mangrove got it. Four owners asked something like that.
  56. ImranSo we changed three things before any code. Repeat became Repeat and review. The button shows the total and locks while sending. And the Status screen shows the order number and the time it was received, in big text.
  57. NadiaAnd a second round, with three new shops, found no blockers. That's the loop. Sort what you see by severity. A blocker stops the task or makes someone finish it wrongly. A slowdown makes it slow or unsure. Cosmetic is the rest. Fix the blockers, then test again with new owners, who haven't learned your design.
  58. ImranSo what do I actually produce in the Build it section?
  59. NadiaThree Markdown files in a docs folder next to your spec. First the flow: the goal, the tap budget, the happy path and the branches. Second a screen inventory, one row per screen with its job, main action, states and the data it needs. Third a test script you read word for word in every session.
  60. ImranWhy does the data column matter?
  61. NadiaIt's the input for the next lesson. If a screen needs data that no system has, you find out now instead of in week three. Then you summarise the test round in plain numbers. And finally you write the flow as data, so a small function can check that the happy path still takes three taps.
  62. ImranThat's the practice exercise. A function that counts taps.
  63. NadiaIt looks at every screen one tap away, then two taps away, and it remembers what it has seen, so Back buttons don't send it round in circles. The first time it reaches the goal, that's the fewest taps.
  64. ImranFor my next sketch review, what do I ask?
  65. NadiaThree questions. What does the owner see if Place order gets no reply, and what stops a double order? For each screen, what shows while loading, when empty and on error? And who outside the team tried this in their shop, and what did we change because of it?
  66. ImranAnd the red flags?
  67. NadiaPolished screens before anyone tried the flow. Only the happy path drawn. And a test run with sales reps, because they already know what every button means.
  68. NadiaHere's one to think about. In a round, four of five owners finished the task, but three of them needed help on Review. Do you build it as it is? Take a second.
  69. ImranMy gut says eighty percent finished, so it's close enough.
  70. NadiaFinishing with help isn't a clean success, because in the real app nobody is standing next to him. Three of five is a clear signal. Change the Review sketch and test again with new owners.
  71. ImranLet me sum up. One, write the flow before the screens. The goal in his words, the happy path with its tap count, then the branches.
  72. ImranTwo, sketch every state with real data, give each screen one job, and put the total on the button. Three, test paper with three to five real owners in their shops, fix the blockers, and test again.
  73. NadiaAnd add one thing to the second point. After Place order there are three outcomes, placed, failed and not sure, and not sure is the one teams forget.
  74. NadiaNext time, the data model and API. We take the data column from today's screen inventory and turn it into tables and endpoints for shops, orders and items.
Finished reading?Mark it complete to fill in its stop on your course line.

Use it at work

Loyalty card screen (React)

A phone screen with its points rules in a tested helper file.

Open in the Code Lab
Next stopData model and API
Was this lesson helpful?
Questions and discussion

Loading the discussion…