• IPhone 15 Pro Review

    I’m upgrading from the iPhone 12 Pro to the iPhone 15 Pro. Here’s what I’ve noticed as the biggest differences so far.

    Despite all the talk about the titanium case, I barely notice the difference in the hand. It’s slightly lighter but now more top heavyβ€”presumably because of the large size increase in the protruding camera sensors.

    The high-refresh rate screen is a big improvement. Scrolling feels like moving around high-gloss magazine paper. It’s smooth and sharp without the blur you see on when scrolling quickly.

    The always-on display was surprising at first. It seems pretty handy for how I use the phone by putting it on my desk when I’m working.

    The new camera options are pretty great. I briefly tried out taking pictures in RAW and the ProRes codecs. I read about the new Apple Log video recording which makes it easier to adjust video by starting with flatter colors to start (that’s my understanding at least). With a little bit of effort, photos and videos can feel more professional to my eye at least.

    See also:


  • When to Set Up Channel Partnerships

    You should set up channel partnerships when it helps your business access new customers while filling an existing need for the partner and not competing with your direct business.

    The first part “accessing customers” means that setting up the partnership should benefit you by cheaply acquiring customers the partner already has. It doesn’t work if the partner doesn’t have an ongoing relationship with these customers and it doesn’t work if you can’t make money from these customers.

    The next part about filling an “existing need” is that the partner likely has many other partnership opportunities without you so by solving a problem they have already recognized will help prioritize partnering (keep in mind the build, buy, partner framework).

    Finally, while partnerships can accelerate growth, long-term you need to be sure it doesn’t compete with your direct business. It would be a bad trade to cannabilize your business by offering the same thing to the same target market through a partner and make less money.

    See also:


  • Emacs Hyperbole

    Hyperbole is an emacs package that matches text and turns it into links (buttons in hyperbole parlance). Links can execute arbitrary code so it’s kind of like a universal emacs subsystem for linking things together (i.e. hypertext).

    In some ways you might describe hyperbole as “M-RET does what you expect at point”.

    From this generic abstraction you can do a number of things. You can unify the behavior of clicking on file paths, regardless of what mode or programming language you are writing in. You can link together org-mode documents to python code in another directory. You can implement “do what I mean” when you press M-RET anywhere since you can add your own buttons that execute arbitrary code.

    I’m not sure how practical hyperbole is yet. It’s hard to discover what is a button (at least in my setup) and I don’t know when I would want to add my own buttons but now that I know this exists, I’m sure I’ll start to see opportunities crop up.

    See also:


  • At Mentions for Org-Mode

    A pattern I really like in Notion is that you can a @ (at) mention any page with search as you type and autocomplete. I’d like to do something similar in org-mode so that I can quickly link related headlines.

    Using the fantastic org-ql library for Emacs, I integrated it into completions triggered by letters following the @ symbol. This translates the input after the @ symbol into a query and inserts a org-id link when selecting a match.

    (require 'org-ql)
    
    (defun my/org-agenda-completions-at-point ()
      "Function to be used as `completion-at-point' in Org mode."
      (when (looking-back "@\\(\\(?:\\sw\\|\\s_\\|\\s-\\|\\s-:\\)+\\)")
        (defvar heading-to-id (make-hash-table :test 'equal))
        (let* ((start (match-beginning 1))
               (end (point))
               (input (match-string-no-properties 1))
               (candidates (org-ql-select (org-agenda-files) (org-ql--query-string-to-sexp input)
                             :action (lambda ()
                                       (let* ((heading (org-get-heading t))
                                              (id (org-id-get (point))))
                                         ;; Avoid having to look
                                         ;; up the ID again since
                                         ;; we are visiting all
                                         ;; the locations with
                                         ;; org-ql anyway
                                         (puthash heading id heading-to-id)
                                         heading))))
               (exit-function (lambda (heading status)
                                (when (eq status 'finished)
                                  ;; The +1 removes the @ symbol
                                  (delete-char (- (+ (length heading) 1)))
                                  (insert
                                   (format "[[id:%s][%s]]" (gethash heading heading-to-id) heading))))))
          (list start end candidates :exit-function exit-function))))
    
    (defun my/org-agenda-completion-hook ()
      "Configure org-mode for completion at point for org-agenda headlines."
      (add-to-list 'completion-at-point-functions 'my/org-agenda-completions-at-point))
    
    (add-hook 'org-mode-hook 'my/org-agenda-completion-hook)
    

    See also:


  • Migrations Are Mini Rewrites

    As software grows, patterns and practices naturally evolve. Inevitably, someone comes to the conclusion that a change should happen and code should be migrated to the new thing.

    While many agree full rewrites are a bad idea, migrations tend to slip under the radar.

    Migrations are mini rewrites and the same caution should be applied.

    When you think of migrations as rewrites, you think about the problem differently. Rewrites are an exercise in chunking. The total cost of ownership is not just adding it the first time, but updating all other places for consitency, fixing bugs introduced along the way, and maintaining the new thing forever. Unfortunately, many large scale codebases end up with tech debt because of half completed migrations (probably several because a migration are needed to fix the other partial migration!).

    You’ll often hear justifications like, “We can do this gradually” and, “We’ll add this to new code first.” All lies we tell ourselves to do the thing we want.

    What can you do about it?

    Approach the migration as if it needs to happen all at once in one effort or not at all. This pierces the illusion that future us will have the time and focus to complete the work present us doesn’t do (experience would suggest this is never true unless you absolutely have to).

    Don’t accept installment plans, pay the whole thing up front or move on because worse is better.

    See also:


  • We've All Been Marl

    Marl is the marginal user. The one who represents the broad base of users that drive most product decisions to the lowest common denominator. Attention is short. Intolerance for change is high. When you ask why they dumbed down your favorite consumer app into a sugar coated dopamine factory, it’s probably because of Marl.

    We’ve all been Marl at one point in time or another.

    The thing people forget is that we are all Marl. The things we think couldn’t possibly apply to us, what we think is designed for a mindless scrolling drone, is us too. We are not always Marl and some might be more Marl than others, but we truly are that way some of the time.

    Read The Tyranny of the Marginal User.


  • It Only Takes Two to Make an Auction

    When it comes to selling an asset, it’s helpful to remember that it only takes two people to make an auction. Auctions result in higher sales prices as it’s not just the value of the thing being purchased, but the dynamics of winning. In the sale of a company for example, it’s not just about buying the company but preventing the other party from getting it.

    What’s the lesson? Creating an auction for an asset is clearly better and all you need is two interested parties which is a low enough number that it is always worth the effort.

    See also:


  • No Next Step, No Deal

    In sales, it’s easy to mislead yourself into thinking a sales deal is on track when it’s not. A simple way to know that it’s not is to ask yourself if there is a clear next step that both parties have agreed to. Without it, you won’t close the deal and if you do, it’s probably a nothing sale.

    Agreeing to a next step can be as simple as deciding whether to move forward with your solution by the end of next week. There is a clear action and deadline that makes it easy to agree. It also keeps the door open for the lead to ask for more materials or proactively raise that there is someone else you need to meet with.

    (I didn’t come up with this but I can’t find the source of where I found it).

    See also:


  • Directly Responsible Individual

    A DRI is a commonly used organizational pattern where one person is directly responsible for the overall outcome of an initiative. This avoids many pitfalls like a tragedy of the commons where responsibility is shared amongst everyone and therefore everyone loses all accountability.

    It’s challenging but rewarding. This model relies on individual contributors that have the skills to successfully lead, project manage, communicate, and be effective outside of their own domain. For example, a backend engineer might be the DRI for a product feature that includes UI design and frontend work even though they themselves are not a designer or a frontend engineer. The key is being able to extract the best result from others and work through them.

    In my career, I’ve worked with this “DRI model” for many years with mixed results. As a manager, I’ve had to intervene in projects going off the rails (delegation not abdication). The most common complaint I’ve heard about being a DRI is that larger initiatives require project managementβ€”widely undervalued by engineersβ€”and needs a lot of coaching and help.