Supernote Manta: Review at Eight Weeks

I’ve been using the Supernote Manta as my exclusive object for taking notes and reading e-books for eight weeks. This review is a follow-up to Supernote Manta First Impressions and Supernote Manta: Review at Four Weeks.

Before choosing the Manta, my requirements for an electronic writing device were:

  1. It had to be hard to use the machine for anything but reading and writing because I want it to be more like factory equipment.
  2. It had to have a long battery life (like the Kindle).
  3. It had to be easy to get files to and from the device (unlike the Kindle).
  4. It had to be able to read Kindle books.
  5. It had to be readable in sunlight (I live in Florida and read at the beach).
  6. It had to be A5-sized.

It has delivered on all of these requirements, but there are some disappointments (as I mentioned in past reviews), with the main one being that the on-screen keyboard is terrible.

But there are other issues. For context, here is how I currently use the Supernote.

  1. I made a PDF journal using My 2025 Journal PDF for Supernote A5. I write in this daily.
  2. I use the Kindle app on the Supernote for all e-book reading.
  3. I make new notes all of the time for various ad-hoc uses. Each of these becomes the start of new kind of dedicated journal. For example, my wife and I have a monthly “family meeting” to discuss our finances—my notes are now all together in a note file. Previously, they were spread throughout my paper daily journal.

So, I have to manage a bunch of files, which isn’t great on the Supernote. It has a very “functional” file manager, but it’s bare-bones. Now that I have a lot of files, I am running into limitations.

The first problem is that I didn’t think through a folder and file naming strategy before making notes, and now I just have a bunch of randomly named files. I would like to rename them, but the keyboard is so janky, that I have just put it off. On a Mac, this would take less than a minute, but it will just be frustrating on the Supernote.

Related to that, when you take the “New Note” icon, you can’t see the folders or other files. So (as far as I can see), you can’t put the new note in a folder with the shortcut and if you have a naming scheme, you aren’t reminded of it by seeing the other files. This dialog uses the entire screen, so there’s plenty of room to show the folders and files (like any typical “Save as…” dialog).

Another issue is that I can’t reliably lasso an area (select objects by drawing an outline around them). It’s a two-finger gesture in the corner along with using the stylus, but most of the time I do it, the stylus draws the shape instead of lassoing the objects. After a few tries, I do it accidentally—I have not figured out how to do it reliably, but also, I have not investigated this to find out if I am doing the gesture and pen movement as documented. It feels like I am getting worse at this over time.

This all being said, I am very happy with the Supernote. I use it all of the time. As I was writing this post, the Supernote asked to update itself. So, I hope that they addressed some of these issues. The keyboard is mostly a speed issue, so hopefully, not hard to improve.

What To Do If You Have a Tech Interview This Week (or Tomorrow)

Your goal is to be able to answer questions that you can answer. If they ask a question and you have no idea at all, then you might not get an offer. But, if they ask a question that you definitely know, you will feel bad if you flub it.

So, practice. If you have a friend that can do a mock interview, do it. If you have time to practice leetcoding, set it at a level you can do and just practice coding under a little pressure.

You are not trying to learn more algorithms, you are trying to get better at performing what you already know.

See also Professional Performances

How it Feels to “Program” with AI

When I type a prompt into the chat pane in Cursor, it is indistinguishable from programming to me. The part where I tap tap tap on the keyboard and code comes on the screen isn’t programming, that’s typing. The part where I use keyboard shortcuts to navigate the IDE isn’t programming either. Both of those parts (the typing and navigating) is being done by a robot when I prompt Cursor, but the programming is still done by me.

When I look at a ticket in JIRA that says, for example, “add a way to archive a contact” in my React/Node/MySql application, when I estimate, I think

  1. Add an archived field to the contact entity, default to false, set as non-nullable
  2. Generate a migration and run it on my local database
  3. Add DB service functions to archive and unarchive contacts
  4. Write unit tests for those DB service functions
  5. Add GQL mutation functions to archive and unarchive a contact
  6. Add archived to client GQL queries
  7. Add archived to the client-side contact model by running the GQL code generator
  8. Make sure to set up the model’s archived field from the GQL query in Redux
  9. Add a Redux reducer to set the archived field
  10. Add Client-side functions to optimistically update the redux and call the GQL mutation (undoing on error)
  11. Add an “archive”/“unarchive” button on edit on the contact edit dialog (show the one that applies to the contact)
  12. Look at lists that show contacts and decide if they need a way to filter archived contacts out or not

I can tell you from experience, that I can do steps 1, 3, 4, and 5 with a prompt that has basically what that says and at-mentioning the files that will be updated and that serve as a model (I probably have another entity with an archived field). Step 2 is a yarn script for me that compares the schema in my code to the one in my DB. Steps 6, 7, 8, 9, and 10 would be another prompt, and finally I will do 12 & 13 manually or with completions because I might want to adjust the UI.

Before Cursor, I still wrote out that list because I like to Build a Progress Bar for My Work that helps me make an estimate, keep on track, and know if I am not going to make it. When I work with Junior devs, I often develop this list with them to communicate what I want done with more details.

Is this programming? I think so. Instead of TypeScript, I am “programming” in a loosely specified, natural language inspired, custom DSL. I run scripts to generate my migration code from schemas and my client side models from GQL queries, and to me, prompting Cursor is basically the same thing.

Fluent Forever Review

I’m learning German for a trip this spring. Last week, I found out about the book, Fluent Forever [affiliate link] by Gabriel Wyner, which I really love. He also has an app with the same name—it’s fine, but very buggy. It’s hard to recommend the app, but I am convinced his process is going to work for me, and the app is better than trying to his process without it. I bought it after trying it out—despite the bugs. If you read the book, and want to do the process, then you should consider the app.

One reason Wyner’s process resonates with me is because it is centered on Spaced Repetition flash cards, which I already use for other things. I use Anki for spaced repetition practice, but his process isn’t easy to implement in Anki.

Wyner recommends building very custom flashcards that don’t use translation. So, I wouldn’t put an English word on one side and the German translation on the other. Instead, he recommends using an image in place of an English word. He wants you to associate the new language with an image so that you map the word directly to a concept, and don’t have to mentally translate through your native language. Since, I am thinking about how to Apply Program Language Learning Techniques to Learn a Foreign Language, and I never translate between programming languages, this makes sense to me.

Each card in his system is personal to you. He doesn’t supply pre-made cards—he wants you to build them. Building them is part of the process. For example, when I made the card “Großmutter,” I spent at least 10 minutes looking at pictures of my grandmother before I found the perfect one. To represent a concept, sometimes I need to combine several images. That time helps cement the concept before I have even tested my memory with the card. Also, I know what I mean by the image—this would be hard to do with someone else’s images.

The Fluent Forever app helps you build cards, implements a spaced-repetition algorithm, speaks the words (to teach pronunciation), and has many other helpful features. Like I said, if you want to learn this way, the app is better than trying to replicate it with Anki or paper (although the book does show you how to do it). It’s also cheaper than the popular language learning apps. The book, though, is worth a read if you want to learn a language.

Swimming in Tech Debt Book Update

I am aiming to be done with my book, Swimming in Tech Debt, by the end of May 2025. But, very soon, I will start to post edited excerpts. Until now, all of my posted excerpts have been first drafts, but I’ve been working with a professional editor who is helping me make the manuscript better. If you want to read those excerpts, sign up here:

Push, Kick, and Swim (through Tech Debt)

My swimming workouts are in a pool, so each lap starts with me pushing off the pool wall, kicking underwater for a bit, and then turning that momentum into a freestyle swim until I get to the opposite wall and start again. The speed of my lap is determined by the efficiency of my strokes, but the push and kicks overcome the water resistance and generate the initial momentum. That push-off is analogous to how I incorporate tech debt payments into my work and is the core idea in my book, Swimming in Tech Debt.

In a single lap, most of the distance is covered by swimming, and that’s the same in my programming. Most of what I do will be directly implementing the feature or fixing the bug, but I start with a small tech debt payment to get momentum. That small payment is improving the area I am about to change, which makes it easier and faster to do that change.

After the push comes underwater kicking, which is so effective that its use is limited to 15 meters in competitions. After that, the swimmer must begin normal strokes. The same principle applies to tech debt payments. They are effective, but they are not the goal. If all you do is pay down debt, you won’t deliver anything of real value. Paying tech debt makes me happy, so I have to limit how much time I spend on it and get back to my task.

Finally, while I am swimming, no matter how tired I am or how slow I am going, I know I’ll get to the other side eventually. When I do, I get to push and kick again to get some extra momentum. Similarly, when I am stuck on a coding task, I sometimes switch to an easy and productive task (like adding a test) while my brain works on the problem in the background. I know I will do this if I have to, so I keep coding on the main problem for as long as I can. I finish my lap.

Then, I push and kick to start a new lap. That cadence of pushes, kicks, and then a nearly full lap of coding is how I finish the task at hand but leave a series of tech debt payments in my wake.

Swimming to Focus on a Problem

Yesterday, I wrote about how I use Swimming as Meditation. The extreme solitude afforded by the sensory depravation and the rhythmic repetition of strokes, kicks and breaths keep my mind in the present. Usually I try to think about nothing, but sometimes I decide to use the time to solve a problem.

I start the swimming session with a question. I will keep asking myself the question over and over. It’s similar to Natalie Goldberg’s suggestion in Writing Down the Bones to start your writing practice by repeatedly finishing the sentence “I remember…” She is using this as a prompt to keep you writing. I am using a question as a prompt to generate ideas.

One I use often is “What should I blog about today?” The last time I swam, since I am trying to learn German, I asked myself to name German words I know. The questions that work best can be repeatedly asked and answered—meaning, they prompt me to make a list. It’s hard to have a complex string of thoughts that I can remember without being able to write anything down.

Because I can’t write them down, if I have any good ideas, I have to just keep repeating them to myself until I am done swimming. I try to come up with mnemonics that will make sure I remember them. I number them and incorporate them into my stroke counting. That’s usually good enough to keep it top of mind until I can get to my phone.

It seems like it might be hard to swim and think, but actually it’s easier. If I am doing a 30 minute swim, then I will definitely think for 30 minutes. There is literally nothing else to do.

Swimming as Meditation

I don’t have a regular mediation practice, but I’ve started to think of my swimming sessions as one. When I go into the pool with this frame, it gives the meditation more purpose and the exercise extra meaning. I have intrinsic motivation to do each, and it gets combined.

Before swimming, most of my meditation has been guided by an app. I learned how to do it with Headspace, and then moved onto the Apple Watch Breathe app for lighter guidance. But, I do need some prompt to direct my thoughts. Swimming has that built-in because I need to refocus on the parts of my technique constantly.

Whenever I notice that my thoughts have drifted, I count my strokes, kicks, or breaths—or concentrate on their polyrhythmic interplay. I have a cadence of each I am trying to meet, so counting them makes it more likely that I will do it correctly. I also have a target stroke count per lap, so counting is already a part of my swimming. It incidentally keeps me in a meditative zone.

It also helps that the pool is a sensory depravation chamber. I wear non-corrective goggles and earplugs, so my vision and hearing are dulled to start, and being in the water gives me nothing to see or hear anyway. It’s the only workout I do without any distraction, and so I have been avoiding underwater headphones to keep it that way. This may be the only waking part of my day with extreme/literal solitude.

I picked up swimming again because it’s the central metaphor of my book on tech debt. This meditation frame also applies to coding. When I’m in a coding flow, I must stay present to extend it. Like swimming, the interplay of the purpose of my work and enjoyment of meditation makes me want to keep going.

Question on r/ExperiencedDevs: Getting Code Reviewed Faster

I saw this question on the ExperiencedDevs subreddit today: My colleague’s code gets reviewed no questions asked. Getting mine reviewed takes a couple of nudges. How can I improve the situation? The answers on this subreddit are usually helpful, and I saw one that I resonated with me:

Personally quick PRs, sub 15 minutes total review time, I consider to be a mini-break from whatever feature I’m working on over the span of multiple days. If your PRs are 1000s of lines long and require an entirely different headspace it may cause delays that way.

This is what I was getting at in PR Authors Have a lot of Control on PR Idle Time where I told a story about the analysis a colleague at Atlassian did on our PR data. He found that short PR’s had less idle time.

On my team, where short PRs were highly encouraged, most reviews were done in a couple of hours, with 24 hours being the absolute max. Any longer than that would often be resolved by a live 1:1 review because it meant that the code was too complex to be reviewed asynchronously.

The thread on r/ExperiencedDevs has some more advice on solutions that try to resolve the social aspects, which are helpful, but I do think PRs that are easier to review will sit for less time. If your code is inherently complex, there is still a lot you can do to make the review easy (see A Good Pull Request Convinces You That it is Correct).

Applying Program Language Learning Techniques to Learn a Foreign Language

I’m an “expert” in learning programming languages. Just counting languages that I have worked with professionally for at least 5 years, I know more than a dozen and I am 4 years into adding TypeScript to that list. But, I only speak and read one non-programming language, English, proficiently.

Learning traditional languages has not been easy for me. I learned French in school just enough to pass my statewide tests and didn’t retain enough for practical use. I tried DuoLingo for Spanish a few years ago, but felt like I got caught in a rut of naming farm animals.

But now I am planning on going to Germany for vacation this year, and I would like to know more than I do now. I know a little tourist-level German from having to travel there for work regularly in the early 2000’s. Not enough for even a simple interaction, though

Since nothing I have done has ever worked, I want to do something different this time—perhaps building on my programming language learning experience. The easy thing to see is that put serious time and energy behind learning a traditional language. I don’t have that problem with learning programming languages. I usually spend several hours a day using them when I want to learn them. Also, I have external motivation: when I got a .NET job with 0 .NET experience, I needed to learn C# fast, but I was paid to do it.

My motivation will be to have fun experiences when I am in Germany. Most of the time I will be able to use my phone to translate written text (e.g. a menu). If I need to know something quickly, it will likely be because something is being spoken to me. I might want to interact a little better with people in hotels, restaurants, and other tourist attractions (where taking out my phone would be awkward). This means more of a focus on listening exercises.

Finally, when I learn a programming language, I usually start to make something practical early into it. I can do this because I can program already, but for novices, I recommend starting with whatever canonical language book was written by the designer and to generate focused exercises that use only what you know. I’m a novice, so that’s the approach that I think I should take.

So, here’s the skeleton of my plan

  1. Allocate serious time to it.
  2. Convert some of my random YouTube and podcast consumption to German audio content.
  3. Find or generate exercises beyond DuoLingo so that I can practice remembering more vocabulary.