I Shipped, Therefore I Am
hardcoresoftware.learningbyshipping.com
hardcoresoftware.learningbyshipping.com
Whenever I'm building something, I get really strong tunnel vision. Part of what makes me a good engineer – submerging myself extremely deep and specific context, "the zone" – seems to work against me becoming a good product person. There's always product stuff I seem to forget, or don't pay attention to, or I end up focusing on the wrong things.
After "shipping", however, the tunnel vision goes away. I can view my work with a level of clarity. Some features I built might be valuable, and some won't.
By splitting my work into build/evaluate phases, rather than continual building, I've become much better at focusing on the impact of what I'm building, and not the engineering in-and-of-itself.
I have a terrible habit of spending too much time building, and not enough time thinking/marketing/etc. This is how I try to manage that.
Some people just are better at changing their doing-hat to the editing- or evaluating-hat in a rapid fashion than others. Being (and staying) conscious about this is already 80% of the solution. However the real reality check is always when you have a room full of people look at ghe thing you made.
If it helps, try to make rituals around the reflection part. Be it something simple as putting your hands into your pockets, making a cup of tea or showing it to a friend. Everything that gets you away, everything that makes you explain it to aomeone else etc. will help.
I only recently realised that, for me, "dev mode" and "product mode" are entirely distinct. I'd been trying to mush them together in a haphazard way, with haphazard results.
In my opinion, this is a really important insight. It's analogous to the De Bono thinking hats, divergent/convergent thinking, etc – distinct phases of cognition that can't happen simultaneously.
> If it helps, try to make rituals around the reflection part.
Great idea! Is this something you learned in art school?
In my experience, every art student seems to incredible at "shipping". I've always been jealous. Way better than most CS or business grads. I guess it's a core part of the degree?
Guess which one ended up with just not more vases but much better quality ones...
Focused/directed practice makes perfect, each iteration your brain is strengthening the pathways associated to that activity, making it easier for you to add more nuance/attention to detail at each iteration...
One can always keep practising without focusing in improving, which isn't as useful...
I feel a lot of this from the other side of the table. Part of what works against me in engineering is my lack of fluency in focusing deeply on very insulated challenges for a long enough period of time. I've always said this works against me but makes me great at the product side of the house because I can leverage my natural inclinations better.
When building a website I would use bootstrap or similar to design the website as I implemented it.
Recently I have been designing the website in figma some days, and implementing said design other days, and my productivity had skyrocketed.
For me, it simulates a boss giving me requirements. I can focus on the task at hand without context switching all the time (or that is my rationalisation)
Edit: typos
Going further down that line of thought, pen and paper really works. You don't have to bother with colours, fonts and rounded edges.
A fun exercise I do, when solving a creative problem, is this:
1. Divide a sheet of paper into 8 squares
2. Set a timer for 40 to 60 seconds
3. For each square, start the timer, and attempt to draw a different solution in each box
This forces you to stop worrying about the individual ideas, and focus on generating lots of them. It also gets you past the "immediate solution" thoughts you have, and into more interesting ones.
At the end, you can collate the ideas, and pick the best parts from each one.
The split also applies to developing code. I've learned to switch quickly between two modes: I either focus on typing code, or on architecture/design decisions. When I coding is getting hard - I feel lost, unsure about what to write - I switch to design mode. When I feel I have something conceptually sound and my brain doesn't want to generate more ideas, I switch back to coding. This can happen multiple times per day. The point is to be always working in the mode that's easier to make progress in at a given moment.
It's probably an obvious technique to many, but I've worked with people who struggled with making these switches - they tried to power through coding even though it turned spaghetti, or considered "design phase" to be something Big to be done seldomly and up front. But it's wrong. The mode switch isn't a big deal - preserving the context in your head is. I solve that by writing down any outstanding thoughts before mode-switching. Often as a string of //TODO //FIXME //NOTE in code.
(This is through analogy to a soldier, who carries a primary weapon - perhaps one that's heavy and unwieldy, like an anti-materiel sniper rifle, or one that they can't move by themselves, like in artillery teams - but is also issued with a pistol as sidearm. While having limited range and lethal power, a sidearm can also be grabbed, aimed and discharged quickly, and can be carried and used in situations where the primary weapon cannot.)
My current sidearm is a Dell 5290 2-in-1, with a stylus. Basically a cheaper version of Microsoft Surface. I use a vector drawing app called Concepts[0], which offers an infinite canvas, and is streamlined for use on tablets with pens. This is as close to a good whiteboard experience as you can get on a computer - you draw as if on paper, and then freely pan/rotate/zoom the canvas (or your drawings).
I don't really manage my canvas, I just keep the app open, make drawings and notes and diagrams, and occasionally sort them into "galleries" when the main screen gets too crowded.
--
[0] - https://concepts.app/en/, has versions for Windows UWP, Android and iOS.
what software do you use for your infinite virtual whiteboard?
EDIT: whoops, just saw my Q was redundant; thanks for responding to the other comment
[0]: https://designsprint.org/
[1]: Those 4 days they mention on the website can often be reduced to a day or two once you've already done the sprint in the same problem area a few times (and provided you're tackling a small enough and specific enough issue with your sprint).
Or do you just not go the full distance a design-only designer might, and do more of a just-the-critical-stuff approach in Figma as if it were a sketch?
I used photoshop for this level, kinda specifically because it's not intended for this and I can't take it too seriously. I fiddle with and position the art, add some text boxes, etc, and squint a bit to see how it looks in broad strokes.
And how do you handle situations where:
(1) you know you must ship, but it’s not good enough?
(2) you know you must think/market/etc., but you’re building?
With that said, I think product/solution ambiguity is rooted in confusion about the problem being solved. It comes from starting with an idea, and not a painful problem that people already experience. Alternatively, from a problem that exists, but is incredibly ill-defined.
It would be disingenuous for me to comment further, because I'm still learning! My view is it's easy to create a solution, but really hard to find & well-define a really painful problem.
I’ve had and still have some great ideas, and that’s all they amounted to thus far.
When I’ve started to build, I get stuck spending a lot of time to produce very little, because I try to implement a novel way to do something simple that no one would want while deploying it easily and handling requests quickly.
My greatest dream is that I write something eventually that actually works and that people would want to use.
My greatest fear is that either that no one would use it, because I don’t need it or understand the need for it, or that it would work, not scale, and I’d have leveraged everything and let everyone and myself down.
Also, execution bores me. It’s more fun ideating, thinking and analyzing, but I’d like to be responsible for creating things that are interesting and solve problems or make life better.
I’m unsure where the risk-averse creative fits into a startup CEO role.
Accept that is the case and let yourself code anyways. Then you may end up being surprised by what you can accomplish.
I think staring this fundamental truth in the face goes a long way. Very few projects can allow the development window to expand indefinitely. A startup needs customers and feedback, even if only for another funding round. An established company generally has deadlines driven directly or indirectly by customers. Both can slip a little, but not indefinitely. Not all features are strictly necessary. So you optimize for time and importance.
The hardest thing to get over is that you will never think it's good enough because it could always be better. But existence is a feature. The ultimate feature. So you'll have to ship an imperfect product and iterate. Experience usually gives better hand-holds on shipping something.
I also tend to find that half-features please no one. You're better off either finishing something or cutting it.
At my current job I kinda have to do all of them, I'm the solo developer on the UI of our application (my colleagues work on the C runtime, the UI generates configuration for it and shows diagnostics and statistics data). What this project really needs though is more people working on it, and the way things stand I'd be in the lead there, so I have to take a step back from the nitty-gritty.
When you are young you may think that you can just adapt to anything (I did). But you often can't. You will be lazy, procrastinate, feel like you deserved a relaxing day, get cranky for (un)known reasons, etc. You will have emotions, and they are not rudimentary things you can ignore because the annoy you from time to time. They are you and they need to be listened to and understood.
This is what experience is to me: Getting to know yourself and riding your own waves of enthusiasm and productivity and knowing when to stop and reflect or seek help or when to accept your shortcomings and move on without shedding tears. To know when you are fooling yourself and know that you will get disappointed in yourself and will develop negative emotions and learn how to avoid that by being more realistic about your abilities (and time management skills).
More an more I accept deep down that I won't be the next president or the next Steve Jobs even though my parents told you I could do anything I set my mind to! And I know that that is ok.
> parents told you I could do anything I set my mind to! And I know that that is ok.
Well that truism only misses nuance, it's really true you can/could/will do anything you want, If you do believe in free will after all.
I would just add the stoicism on internal/external locus of control.
IMHO the part parents mostly miss, is you cannot control how others, as in other humans, society, et all, will react to you/your actions/your creations, or if you will even be noticed or not before you're out of the game...
Just look at all the bullshit some scientists, artists, businessmen, etc or anyone trying to challenge the status quo, had to go through just for the mere fact that their ideas didn't match those of their time...
I often get completely lost in the minute details, and find it really, I mean, really hard to move on to more important things in the bigger picture.
Then, just getting stuff out and sharing it with people becomes a chore as soon as I'm done with the more difficult parts of work.
Things I've tried:
- follow TDD and XP, Design Thinking/HCD (iterative methodologies that allow you to slice problems differently, split them into smaller chunks)
- Build smaller products/tools (most of my apps are really, really tiny, an old example: http://facade.photo)
- Build a tool to separate writing from editing (https://sonnet.io/posts/ulysses/)-I've been using it every day for the past 1.5y
- Force taking regular breaks, even if I'm focused, to regain context (pomodoro)
- therapy (I got to the point where building a calculator in JS took me a week, which made me realise that maybe there are some deeper problems at play here)
I was at the point where I would run courses on having this high-level perspective: XP, pairing, workshops on Human Centred Design, and ironically, I find all of that paralysing in my solo work. So, I guess the last point from the list (therapy, taking time off) seems to be the most helpful one. I still find all of that extremely frustrating, almost destructive.
Side note: either Clean Coder or Pragmatic Programmer criticises being "in the zone"/the state of flow precisely for the reason you've mentioned. I recommend reading both, although I think the approach to the craft they describe is to put it mildly, draconian.
Broaden your view. You are not put on earth to write great code, but to solve real world problems. Software development is a means to an end, not the end itself.
Most probably this is because Elon, being the CEO, has enough technical prowess to oversee both the real-world requirement and technical aspect of the product. This allows the company to streamline the practical/from-real-world requirement and the technical specification, therefore eliminating "things that shouldn't have been built in the first place".
This is luxurious because other tech company either does not have and/or does not realize it must procure.
One of my personal daydream is to be in a period where this streamlined real-world requirement and technical specification is common, not a luxury.
My wish is not only for my organization but for everybody. The world might be a better place if things are cheaper to maintain.
Including the folks at Valve.
> A loss of reflective self-consciousness
Developers who spend all their time in flow state are not thinking about other people. Worse still, in many cases their emotional attachment to the code they wrote in Flow can be very high, leading to defensiveness and rationalization.
Really any time you write a module someone will take issue with how you did it, so it can be a little difficult to discern if “you do it too”. If you can make most of your decisions outside of Flow, this seems to go a bit better in this respect.
If you get stuck, leave your desk, snap out of it. Think. Which is another way of saying that if you’re going to rely on Flow then you’d better figure out how to drop in and out of it more or less at will.
Also, acknowledging and leveraging different modes of thinking: "open" or expansive, broad, associative, free-form on one hand vs "closed" or focused, directed, narrow, deep on the other. We tend to associate flowstate with the latter, but some of the most profound and impactful work I've ever produced has stemmed directly from the former.
So many thoughts here; this topic fascinates me.
I wonder if separate rooms, with distinct smells, and wearing different hats would ease the transition.
Both solve problems.
At their best though, they are as harmonious as art and mathematics.
Engineering is about the thing itself; marketing is about the market. Engineers want the thing itself to be good, by various metrics; marketing is motivated by market needs/wants and competition/alternatives.
For example, coherence and high performance are properties of a product, that an engineer might value. But for the market, a shopping list of properties at good-enough performance, may be what's needed.
OP's "tunnel vision", undistracted by the market, is how the best engineering is done. But of course, maybe nobody wants or needs this - that's the role of marketing.
Typically, engineering is market-led, with the marketing deciding what is to be built and engineering building it. But because engineers can create things that the market didn't imagine was feasible, it is sometimes engineering-led.
Henry Ford apparently said the market would have wanted "faster horses".
Startups ideally exist at this intersection, where engineeing creates things that never were, and marketing creates needs that never existed.
Note startups are often co-founded by a duo of engineering/marketing - because these inconsistent value-systems are easier to have in separate people.
Friday’s are my evaluate days with tons of both customer and internal calls to get feedback.
Tue-wed are my build days. I try to not to have any meetings after lunch. That is my in-the-zone time.
And don't talk about VB redistributable, that weren't funny at all in the dial up era...
Does anyone feel the same? If someone told me "I sold stuff, therefore I am", it just leaves a bad impression of them for me.
Build stuff with care and craftsmanship. Strive for excellence, take pride in your work and deliver, not ship.
https://thenextweb.com/apple/2011/10/24/steve-jobs-obsession...
Original Apple cables seem to suffer from the insulation flaking over time — and Genius Bars all around the world (I've tried, many times) refuse to acknowledge that it's a manufacturing defect.
Back when software was treated as a physical packaged good, it had to physically leave your "factory" by a certain date to qualify as a sale during the quarter, allowing it to be claimed in a quarterly income filing, which would boost the stock price and, thereby, the compensation of execs and employees. So, the sales team would sometimes have to carry an armload of shrinkwrapped boxes out the back door into the parking lot to claim a sale for that quarter. It had legally "shipped". The programmers (former high school nerds) would be desperately hanging on to the code until the last possible minute--there was always more that ought to be done--while the sales team (former high school jocks) would be forcing the programmers to "hand over that disk, now, nerd!"
No courage was required by the sales team to ship. Their job was just to book the sale. In the parking lot by midnight? Hello sales bonus. But real courage (or threat) was required by the programmers, who would be forced to let go of code that could not be fixed "thru the wire" in those days, knowing that they would be blamed for every flaw that they "shipped".
Now a days, shipping to me evokes “Fuck it, ship this shitty MVP to customers because ship ship ship” and then they wonder “Gee, why didn’t my app take off?”.
I understand the need to ship, but I never see anyone daring to challenge the frantic broken shitty app philosophy and maybe wondering if they built them with care, maybe... just maybe customers with actually come? Has anyone tried to go against the grain since the SEGA days? It’s high risk.
Thanks for a great perspective.
And for me it's all a (sometimes not so) fun little side project. If I had never launched at all then it's possible no one would ever get the benefit of my unique feature.
There are similar competitors which I'd rather just buy and use, yet they don't have the one killer feature I wanted.
Right now, you need more selling than ever to get found and heard. Put this in perspective, even if you went down the low-touch, organic selling route of content marketing and you were building a MarTech product. You would as of my last check be competing against 2000+ MarTech SaaS all effectively blogging to the marketing department, every week. You then could switch to advertising but again, there's probably 200+ platforms already in your product area.
Slow growth is the best growth, technical debt is minimized and you can call the customer directly to learn from them what they like and dislike. Which is still considered selling and unless you 'ship' you get no feedback. I feel like people are too focused on the 'meaning' of words when really, it's sink or swim when most products launch.
The evocation of image of frantic developers churning away might be coming from your previous experience working at or reading about that shipping culture. Unfortunately, I am exposed to that chaotic shipping culture too. I feel this disastrous shipping stories is everywhere, enhanced by the nature of software development that gets more social each day.
At the end, it is the bad practices that leads to bad shipments that we must resolve. I'm comfortable to keep the original meaning and feel of the word "ship" to separate the bad practices from it and acknowledge them as problems -- the first step of a problem resolution.
This is so true, and not only in software development. When you embark on a project that has to deliver a concrete result, the first time is hard, the second time is already much easier.
And not finishing something means you do not necessarily understand what you shipped.
IMO nothing came close to Visual Basic from that era. It really was a GUI builder IDE all in one.
It would enforce a event based style of coding a decade before the coming of Flash. I still think HTML5 has not recaptured that (VB and Flash).
Can somebody explain?
I for one would not have liked to wear it after Ballmer.
Descartes answers "i think no-" and promptly disappears.