Hacker News new | past | comments | ask | show | jobs | submit login
Professional Programming: The First 10 Years (thorstenball.com)
131 points by keegancsmith on May 19, 2022 | hide | past | favorite | 33 comments



A lot of really good stuff here, for example reaffirming YAGNI and a focus on customer value. One part I think falls short:

> Negativity begets negativity

I think this is coming from a very common and fundamentally misguided premise - the obsessive focus on emotional valence, on whether we're being positive or negative. The real problem is not whether we are being positive or negative, it's the rush to attach emotional valence to things we have not adequately understood or described. As C. S. Lewis said, "the human mind is generally far more eager to praise and dispraise than to describe and define. It wants to make every distinction a distinction of value." This rush to emotional endpoints is the root of both toxic negativity and toxic positivity.

Instead of taking positivity and negativity as endpoints, take them as prompts to better understand your surroundings. You are feeling bad about something - why? What about it makes you feel that way? Would improving it cost more than it would benefit? Is it the least bad of the alternatives?

A willingness to feel and acknowledge and investigate your negative emotions is a superpower. It gives you x-ray vision into things that very few other people have. They look away from problems and let them fester because they've been taught to be allergic to negativity. The ability to look at problems is inseparable from what the author points out is a very important trait, the ability to roll up your sleeves and get stuff done.


People are emotional, at least to some degree. Most people find emotions contagious. If you're surrounded by people being negative, it's draining, even if you don't give in to the negativity.

One think I would say the article is wrong on, though - snark doesn't have to lead to cynicism. At my place, we talk a fair amount of smack, but it's just entertainment. (One difference - the smack is self-directed at least as often as it's directed at any particular other person.)


Author here. Just wanted to add that I don’t think all forms of snark, sarcasm, and cynicism are bad. Or even negativity! But what I learned the hard way is that there’s a time and a place for this and often it’s not “your team & whenever something pops in your head”. I very much agree with the GP here in that I value mindfulness when it comes to negativity.


I just wanted to say I loved your post and I think this is a very hard thing to articulate in our culture. Because you're absolutely right about the social impacts of many forms of negativity. But "negativity" seems too broad of a term for the thing we need to avoid. But then, what is the more precise alternative? I guess "mindless negativity" is something closer, at least.


On the other hand, if you model productive negative thinking and communication, people will be relieved that they have the space to express their problems, and you will accelerate genuine team bonding and psychological safety.

I have success stories from my personal experience doing this.


I think some big things to consider is what the negativity is trying to accomplish, how is it presented, and is any solution presented?

Is there vindictiveness in the negativity? resentment? superiority? smugness? irritation? is it directed at a person, a process, a project?

Is the negativity being brought up just for the sake of complaining? to solicit empathy or solidarity?

Is the negativity specific? actionable?

Those may be valid feelings, and great things to examine...and then probably keep to yourself, and find productive ways to either soothe/cope or change the environment/root causes.

I say this as someone that endeavors to do what you've described in your initial post, but also as someone that struggles with adhd/depression, keeping it to myself can be it's own struggle. And then I worry that I've rained on my coworkers parade, or that I've worsened their work environment.

People have something of a battery when it comes to this sort of thing, and it can definitely be drained, so it's important to be conscientious of that.

Mindfulness exercises and meditation help me a great deal with all of the above, by doing what you suggest, and being inquisitive about the feelings. And also being aware of how the body is behaving during those feelings.


Yeah, doing negativity right isn't easy! It's essential to look inward for how the expression might impact people.


This is very well said. I am trying to practice this myself as I find myself to be very mercurial. I have been going through the book living untethered by michael a. singer to guide the way.


> Fearlessness is undervalued

Being technically fearless is also a trait I've identified in engineers I enjoy working with. It's hard to quantify how you gain this. I think it's a combination of strong fundamentals and deep curiosity. It forms when things stop being magic.


I observed that many people are really afraid even of basic things. "I don't want to click here because I don't know what it does. Maybe it breaks my computer or deletes all my stuff."

Maybe it's because I started using computers as a child (~9 years old or so) but I always had the mindset to just try things out. You cannot really break the computer or delete stuff. Every tool will always put a very clear warning before you do sth stupid. And if you are really unsure with some action, just make a backup before. Reinstalling Windows every so often was anyway the norm in my youth.

And just trying things out, clicking through the menu, through the actions, just playing around, make some dummy playground, this is often how I discovered the functionality of most tools. This is a very effective way to get familiar with most tools.

But others, when they say they don't know how to do X in tool Y, they never have just tried around. And when I ask them why they have not, they tell me that they are afraid of breaking or deleting sth.

With coding, it's very much the same. And now that we have Git, with some backup somewhere remote, and hopefully a test suite, maybe even with CI, it's even much less of an issue if you break sth because it always can be undone and you normally should notice with the tests (or if you don't, you can blame the incomplete tests).

Btw, regarding reading other code bases: I very much can recommend that. You will most likely learn a lot. And there are many great open source projects where you can just dive in.


It goes deeper than this. It's not just about trying things; some people do the opposite: they try too many things at once.

The real skill lies in trying things systematically, carefully, querying your mental model of the system and invalidating hypotheses along the way.


You mostly can't break computers, except when stuff actually breaks in production and it hurts users/customers a lot. And thus we have engineers responding to incidents and writing postmortems. :D I have learned a lot from alert and incident management!


I think it's a mix of curiosity, lack of deadline pressure - and something else I can't put my finger on.

An example is being comfortable reading a dependency's source code. Once you realize you can do this by going to Github/Gilab - or even navigating to where a function is defined via your editor - you realize it's all layers 'down' and you can go in there as far as you want. Another example is using dev tools to prettify the code (but it's rarely readable).

Another thing is the payoff: how often can you deep dive and make changes to solve your problem? This determines if the reading through a huge library is worth it.

Starts with curiosity but requires lots of time available and a bit of confidence that the endeavor could lead to a solution.


> I think it's a mix of curiosity, lack of deadline pressure - and something else I can't put my finger on.

I'm not sure I agree on lack of deadline pressure.

There's a virtuous cycle somewhere if I squint that's fundamentals -> makes it easier to find where the problem is -> makes you more willing to dive deeper -> leads to stronger fundamentals. In parallel maybe, curiosity -> dive deeper reading other people's code / learning about software -> stronger fundamentals

This all leads to things like "I bet this is a network or protocol level issue in this dependency" -> even in someone else's large, open source codebase, I can quickly track down the problem without needing to understand the entire structure, for example. But gaining that ability to intuit takes time, especially for newer engineers.

Edit:

Technically fearless though isn't really the above example for me, it's more, if the business needs it, and we want to allocate resources, there's nothing I can't build or learn how to build in a reasonable amount of time. When you're layers and layers of abstractions up, you're constrained at each layer on what you're allowed to build. Perhaps a simple definition of being technically fearless is the ability to drop down layers of abstraction as needed to solve problems.

I think John Carmack[1] is technically fearless, for example. Known for video games, but I would hire John in any domain and have no doubt he'd be successful.

1 - https://en.wikipedia.org/wiki/John_Carmack


That definitely relies on a lack of deadline pressure... which is really about knowing that your team lead trusts your judgement in how you allocate time.


Absolutely agree, but I like to think the magic bit can stick around as wonder. Perhaps that's bundled into deep curiosity.


This is what I tell anyone trying to learn programming or any computer related craft. The first step is to not be afraid of the computer. Only then you can learn.


> Look at that little program go, holding the internet together, despite the 17 TODOs in it.

This hit a little too close to home.


Awesome article!

> Typing can be the bottleneck Agree! Learning touch typing (at 30 :)) was a big relief for my fingers and wrists. Also it's important to have a good mechanical or scissor keyboard so that typing actually feels good.

> Hiring is hard And it's like dating: you only get to know the people who you actually hire and never learn what would have happened to the people that you have rejected. That is some selection bias in the system.


Really enjoy the fearlessness. I wanted to share my main guide for programming, my dad always told it to me it comes from KentBeck: First, you make it run. Then you make it right.

It is a bit connected to fearlessness, because you need to be a little fearless to start something without knowing where it will go. I think fearlessness originates from a trust in oneself, and maybe the universe too haha


I agree with this article 100%. Got 14 years in the field and I've come to the same conclusions as well.


Amazing post, thanks for putting this together.

Three points I think are undervalued in my experience:

> Typing can be the bottleneck

> The most important trait in developers: rolling up their sleeves because it has to get done

> Nothing really matters, except bringing value to the customer

I often feel the code needed to deliver value is not that complex and most senior folks can do it, but in an effort to "save time" on typing, they try to design something complex and debate endlessly, when what's really needed is rolling up your sleeves, getting it done, then saying "oh that? I finished coding it and it works, let's ship it already"

(edit: formatting)


I think the author was being a tiny bit hyperbolic saying "nothing really matters but value for the customer". In a restaurant kitchen, the goal is to get food into the customer's mouth... but you still want to keep your knives clean and tidy. Of course, keeping them tidy isn't the point of the restaurant either.


Always leave something unfinished at the end of the day

--

definitely helps me get focused the next day


The point about other people's code rings true for me. What I've been trying to do is gather a collection of good code I've written over the years - solutions that can work for a variety of problems. They're like my own little npm packages, except I have full access to the source and completely understand them inside and out. I can also completely explain how they work to my team, and how they can make changes to the behavior if need be.


A lot of the time it's not characteristics of the code itself but the business mission it needs to fulfill.

good code can give you a lot of headaches if the external business environment sees qualitative changes while that sloppy code over there is has being going hassle free for the last 6 years because the end-goal and patterns that it needs to fulfill didn't change much during that period.


This is a gem:

> When you’re glueing other people’s code together, there’s a very real danger that the glue is where complexity will accumulate. But glue code is the last place where you want your complexity to live. It hides complexity. What you want is to make complexity as visible as you can, shining a light on it with the hope that it turns into dust and disappears.


"Code has mass". Following from that, attention is force and understanding is acceleration.


Code has mass has another interesting corollary: large enough collections of code tends to almost gravitationally attract more code. This results in god classes and those huge libraries of diverse functionality that usually go by the name "misc" or "util".

The mechanism for this is fairly obvious: it is usually convenient to put new functionality next to existing one because it allows you to reuse things that maybe should not be reused. The more diverse a big lump of code, the more potential future functionality is convenient to add to the lump.

This is a reason to be very vigilant against this type of accidental reuse and incohesive modules. It's a reinforcing feedback loop that needs a balancing mechanism.


No I dont think that follows. Forces don't cause accelerations. But attention is required for understanding.

> Every additional line of code you don’t need is ballast. It weighs your codebase down, making it harder to steer and change direction if you need to

So code as mass is the scalar part of the momentum. So the directional part is where this code is going in "purpose space".


I think understanding would be velocity. Acceleration would be change in understanding, which is proportional to attention.


thank you for writing this.

i am programming (and-all-that-goes-with-it = mostly-mentoring, both downwards and upwards) for 35 years... and it is somewhat difficult for me to tell the things you wrote there, to my pupils/students/team/s, because i have kind-of found them loooong time ago, and since then have much further understanding, and now i consider them obvious/intrinsic and don't even think about them... and they are not obvious at all.

And yes, i still love programmming very much (although sometimes it is about programming the people. But not direct, it's more like building a language, to enable further things with it :).

Now, if it's only one thing from me: it's all about people. okay, Mostly about some-people somewhere in the chain. Not about code/architecture/....

have fun

www.svilendobrev.com


Great article. The point about fearlessness resonated. Ray Tomlinson (wrote the first inter-machine email, picked the @ symbol, helped design TCP) was one of the best and most fearless engineers I ever worked with.




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: