People-First Jobs & My 8 Criteria

There’s a new curated job site around (h/t Swanand). The headline spiel is indeed what it is about:

Tired of “growth at all costs” work environments?
Find companies who take a healthy approach to work,

Their criteria is interesting:

  1. Remote work
  2. Asynchronous communication
  3. Deep work
  4. Sensible hours
  5. Flexible schedules
  6. Outcome-oriented
  7. Professional development

I think all of these are valuable, but perhaps a few can be clubbed together. I had these 8 criteria when I was job hunting:

  1. Product: Product company, not services or a software consultancy.
    Simply because products matter. There’s a good Steve Jobs video as to why!
  2. Bootstrapped/Public: Not stuck at going after growth for VC’s sake.
    Venture capital is great for most companies, but I’ve rarely seen it have the right indicators to build the kind of product I want to contribute to: those with long-term, lasting value, and simple economics.
  3. Profitable: Ideally a profitable SaaS or other company that is making money.
    Profitable companies are just great. It’s again the simplicity of the economics that appeals: there’s no hockey-stick growth required: you spend less than you make, and you save for a rainy day.
  4. Salary: Pays within 10% of top-of-market.
    I think Software Engineering is enough of an in-demand skill that if you are good, this should be a given.
  5. Remote: Is primarily remote (truly remote, not just US) or has a good remote-working culture.
    The truly remote also includes asynchronous communication.
  6. Open Source: Has significant open source contributions.
    Two reasons, one: because most often stewarding a good open source community looks a lot like building a good remote company. And the next, giving back starts at home.
  7. Interviews: Has a sensible interviewing process with a take-home test.
    I despise the whiteboard interview. It’s much harder to be a company that executes the alternative—a take home test—but it’s much more humane and respectful.
  8. Balance: Respects personal time. Allows for at least 20 days of vacation in a year.
    This should be self obvious. Taking downtime is as important as work.

Make your criteria before you start a job hunt. But People-First jobs is definitely a good place to start.

Gap by Ira Glass

Came across this lovely video recently:

Gap by Ira Glass

This really spoke to me for the simple reason that so many, many times, I’ve started projects only to abandon them halfway simply because it wasn’t good enough. Recently, I’ve convinced myself to finish by saying: “It’ll never be good enough.” But: this video put a much more positive spin to it.

I got this from this excellent new blog post on Enneagrams on the Doist blog btw, do go read!

Why Reading Stories is Important

I know a lot of my friends who swear off anything related to fiction, at times even if it has a semblance of a story, like biographies or histories. They prefer to read “hard non-fiction”, stuff that titillates the brain-cells, and provides the most information per page read. I think that is a mistake, and here’s why.

The brain remembers associations

It’s been well proven that the brain doesn’t remember facts in isolation, but instead it’s very good at visualisation and association. This is why if you have to learn how to memorise a random pack of cards, you can never do it simply by chunking: you need to visualise cards as people and associate funky actions they perform to the order. What I’ve found is that the lessons that stuck to me most in terms of wisdom per page read were in those stories where I could visualise those life lessons. Reading a biography of Bruce Lee for e.g. is much akin to the experience of reading Deep Work. It’s better in some senses because while Deep Work is more structured and digestible, it never talks about the impact of its lessons. Bruce Lee’s life is probably a good condensation of its good—and more importantly—bad elements, stuff that happens to you when you take a philosophy to extremes.

For structured information per page, you cannot beat the non-fiction book, but if you want a more holistic view, read a good biography of somebody who lived its lessons so you can visualise those lessons in action. And learn about the good and the bad together.

Emotions are important to memory

There are some good examples of non-fiction books that emote. But most are dry: they present facts and quote examples from history to substantiate their arguments. A lot fiction books don’t really have a lesson to teach, their main purpose is to entertain. But read good literature, and this often changes quite a lot. Alex Haley’s Roots for example was one such book that brought the negro slave trade home for me: its vivid descriptions of African life, and how a young man’s search for his roots can lead to something sublime is still vivid in my memory. I’ll never forget how much that book contributed to my understanding of one simple fact: at one point of time, owning people was normal. The “good” slave owners routinely slept with their slaves, paid them nothing, and expected complete loyalty. The bad slave owners were worse. Now, I could have gotten this information from a book—even from an encyclopaedia—but thinking about these characters in the book, even now, years after I’ve read it, brings tears to my eyes.

Emotions are a powerful catalyst if you want to learn some lessons that’ll you’ll never forget. And the most emotion per page is from fiction.

The pleasure and whims of serendipity

You can get far with structured learning, setting your aims and goals and dreams together into yearly, monthly and daily plans. And then the whims of fate will upset all of your plans—like they often do—and then you can start over with a new set of unfulfilled wishes. Or: you can combine your goal setting with a healthy dose of serendipity and resilience in your life. I read non-fiction books for the information. Effective Typescript as I’m currently trying to learn some functional programming, and writing a blog article series on lessons learnt. But nothing makes me as happy or strokes my accidental creativity as reading fiction. It was when a stray character made a despondent comment about his life in Way of Kings that I conceived this blog post. Something about fiction resonates with you: brings neurones together in new mashups, and strokes your creative fire.

So: read fiction. There is nothing as good as curling up with a good book, and reading a wonderful old yarn.

Advanced Typescript

Typescript is a very nice and pragmatic addition to Javascript, and enables a bunch of nice programming safety features that would be more difficult to implement without it. I’ve been reading the book Effective Typescript recently, and I thought I’ll start a short series on the tips and tricks I’ve picked up from it. So here’s part 1 of a 5 part series on some advanced things you can do with Typescript.

To Follow Along

Please install ts-node and typescript globally:

npm install ts-node typescript -g

& then just ts-node should give you a terminal:

❯ ts-node
> 1 + 1
> const a = "hello"
> a

You can use this to get a Typescript REPL & then follow-along with the rest of the examples.

typeof operator

typeof is a Javascript construct that gives you a type of an object. If you use this in Javascript, then you get simple Javascript types:

> const a = {hello: "world"}
> typeof a

But in a type context, the same operator can be used for much richer type information:

> let b: typeof a;
> b = {hello: 1}
[eval].ts:4:6 - error TS2322: Type 'number' is not assignable to type 'string'.
4 b = {hello: 1}
    1 const a = {hello: "world"}
    The expected type comes from property 'hello' which is declared here on type '{ hello: string; }'

As you can see, using typeof as a type annotation on the left side of the new variable b produced the inferred type { hello: string }, a much more complex type than just object and Typescript good at this kind of inference. It works for more than simple variables too:

> let isNegative = (b: number) => b < 0
> let isPositive: typeof isNegative = "hello"
[eval].ts:7:5 - error TS2322: Type '"hello"' is not assignable to type '(b: number) => boolean'.
7 let isPositive: typeof isNegative = "hello"

Here we see that we can use typeof to infer the type of a function. This can be used in several different places, and even when you import values or functions from an external library that has types.

Constructing Partial Types with Pick and Omit

You can use Pick and Omit to construct subset of types pretty easily:

> let metadata = {
... isOpen: false,
... isDraft: false,
... isComplete: true
... }
> type Metadata = typeof metadata;
> type SaveMetadata = Pick<Metadata, "isOpen" | "isComplete">

Here we’re defining a new type SaveMetadata as being derived from Metadata but having picked up only the isOpen and isComplete keys. This saves duplication & makes the code a lot more DRY. Omit is the reverse:

> type SaveMetadata = Omit<Metadata, "isDraft">

These are the same types written in two different ways.

That’s it for today! More Typescript goodness when we meet next!