Important non-programming skills for programmers
welearncode.com
welearncode.com
Sure, you can get technical writers to do it for you if you have a big team, but a lot of small, open source projects suffer from the lack of proper documentation.
- near nothing, good luck
- debian, ultra structured, .. hard to digest / boring
- gentoo / arch, barely structured, just enough content to get the gist, yet precise, and a lot more tips for funsies.
this is an art
I particularly like that if I have an issue, and I figure it out, I can just pop a quick line in there. h4:"Issues snafucating while running nvidia proprietary driver". Body: "you get this error message. <snip>. This is due to <snip>. Run this command to fix it." And it's already at the quality that people expect.
Software is often documented as if it was a integral part of the program, but it's wrong on the human level I believe.
Good documentation also needs ‘testing’ by someone who is not already familiar with the content.
It seems that taking care of oneself is a problem for at least one person on every team. Either they don't regularly bathe, wash their clothes, or they smell (either due to smoking, drinking, or body odor).
In my experience half of these people are suffering from mental health problems such as depression.
1. What did you do? (Report the steps exactly.)
2. What did you expect?
3. What happened instead? (Report the messages exactly.)
4. What are your wild speculations about the causes and solutions?
I remember when I worked second-level support. Most of us had no programming ability. I did. A coworker used to spend hours—when he had many other things he should have been doing—on some ridiculous task that a bit of text processing could have automated. When I found that out, I wrote him a script and told him, "Be on the lookout for things like this. Don't ever waste your time with something like this again. Ask someone who knows how to program if there is something that could be done."
I'm guessing there is a lot of that out there.
Seriously. One simple intro to CS class will allow a non-programmer to more easily differentiate between what can be done easily and what can't [1].
[0] https://ocw.mit.edu/courses/electrical-engineering-and-compu... [1] https://xkcd.com/1425/
Talks about the essential technical skills -- managerial skills to manage a team of programmers, ethics of working as a programmer, and being part of a team. I remember loving the topics on how to talk to non-programmers and deal with difficult people.
1. https://www.amazon.com/How-Be-Programmer-Robert-Read-ebook/d...
You can read it for free online here: https://github.com/braydie/HowToBeAProgrammer
In my experience, I've found that:
(1) good "self documenting code" is typically written by programmers who care enough about documentation to write at least a high-level description of what their code is trying to achieve, what problems it is trying to solve.
(2) programmers who swear by "self documenting code" usually write code that is anything but self-documenting. Their output is usually so gloriously complex that nobody apart from them can easily read and understand their code.
Based on the people I met, this usually comes with a great talent in completing tasks within the imposed delay, by putting in the least amount of effort as possible (especially with regards to understand the task), providing a solution that is only acceptable at a very shallow level, and forgetting everything about it as soon as possible.
Basically, the developers who are most appreciated by box thicking managers are usually the culprits of overall project slowness or plain failure.
Had specific advice with examples. I think it's been helping me all my life. It is based on the work of the Harvard Negotiation Project.
https://www.amazon.com/Getting-Yes-Negotiating-Agreement-Wit...
I will say that this is true more for entrepreneurs that for Corporate America. I had many successful years as an independent consultant where being likeable was more profitable than being most other things. But I learned when I took the corporate job that it really seems like assholes get ahead more than anyone else. Or as I say, "the biggest bully wins." (Unfortunately, I am not a very good bully.)
After years in consulting I would say most project failures I see are failures of empathy.
That is quite the statement. Would you provide some examples of situations that made you come to this conclusion?
Lack of empathy toward programmers led to imppssible schedule. Real story.
Lack of empathy between team members who were supposed to lead cause spectacular dysfunction of team I am in right now.
When I say failures of empathy, I'm not even saying that that was the failure of a single person to empathize, but that at the end of the day the collective parties could not understand enough about what all the other parties needed to create an actionable plan and put the people in places to do it.
This can be:
A software developer failing to empathize with someone in the c suite and understanding the direction the project needed to go in to be considered a successful project
The c suite failing to empathize with the development team in terms of understanding what skills and abilities they are offering and what resources and direction needed to be given to them to properly convey their goals
Failures of the dev team or executives to empathize with their users in order to create a thing that is actually wanted in a way that will actually be used.
Failures of technical teams to empathize with budgetary and business concerns and the reverse.
All sorts of other failures between people in the middle to empathize in terms of being able to understand priorities and goals and allocate energy accordingly and understand the hierarchy among those goals.
Failures within a dev team to empathize with each other leading to all sorts of various breakdowns.
People are generally not very good at mapping out complex webs of incentives and goals and the ability to empathize is what underlies that in my opinion.
I've sat in on an absurd number of projects where whatever silly stuff they thought was their roadblock was so far away from what was meaningful to the higher level goals of the project that they were absolutely doomed from the start. You can have projects like that go on for years in enterprises where they never even get on a viable path to creating anything productive. It generally ends up as some sort of battleground for internal politics in that case.
At the end of the day, the ability to think in terms of hierarchical goals and incentives and escape the concerns of your personal silo is a majority of the time what could avoid this in my opinion.
Link to HN submission: https://news.ycombinator.com/item?id=24533181
- estimates: ability to balance between showing off when estimating the skills and technologies you know well and then underestimating the process ahead and overestimating the unfamiliar territories.
- fast typing: I could never relate to developers as senior, no matter the years of experience, if I see them shooting the keyboard with two or four fingers. Despite my subjective position on this, fast typing "releases" your brain to think only about the problem you're solving or achieving the goal you have without dialing 911 to "find that letter".
EDIT: I've used a wrong phrase in my second point. I meant "touch typing" instead of "fast typing".
No judgement, I also have a disability that only allows me to type with one hand.
I wonder if due to reduced typing speed the developer in question had a higher ratio of kept code to deleted code.
Someone only able to type 3 words per minute may have developed patterns of thought and deliberation that maximize those 3 words rather than follow development habits of faster typists that might be prone to generate code which never sees the light of day.
I type quickly and have no qualms about deleting entire stanzas of code and rewriting them when things don't work out. If I could only type 3 words per minute, my approach to writing code would radically change, perhaps for the better.
A ‘prolific’ codewriter, writing a ton of code, most of which is thrown away.
Would we assume a novelist that types faster writes better stories?
(I type around 110 WPM, but I have no frame of reference for whether this is "good". Who cares?)
I always type everything out the first time I’m introducing something into a code base even if I’m taking something straight from the docs or Stack Overflow that solves an issue I’m dealing with.
It helps me understand how the data is flowing through whatever it is I’m doing, the structure of the code, and ensures I don’t leave in extraneous unnecessary flags and options.
And I’ve always done this, I much prefer engineers who work slowly and methodically, understanding what they’re doing.
It more than makes up for the “lost time” when you need to debug a complex system that’s on fire and people don’t even understand what the options and flags they’ve pasted in actually do.
But on the other hand, I can’t imagine having two good hands, be a professiomal software developer and not learning how to touch type. It just would seem to be a level of laziness.
Btw, I've learned it almost the same way, but while playing the typing games with my kids later in life, I've upgraded the skill a bit.
One of my very good friends and one of the best programmers I know types slowly and using only four fingers and a thumb. He's paralyzed in one arm.
He's still been an absolutely prolific open source contributor and 2x YC startup CTO. Typing speed probably isn't as important as you might think.
I think someone should write a blog post about the non-programming skills you need to be a staff/principal engineer.
Anyone got a good read on how can one sell oneself?
Just posted!
Software developers generally have two jobs: to figure out what to make, and to make it. They have to build the right thing, and to build the thing right.
I don't put much stock in an article like this that doesn't even mention requirements engineering.
Building the right thing is product, building it the right way is engineering, and they both feed in to defining the requirements for a feature.
I've seen things get morphed from what the users need to what management wants and end up badly misaligned.
You're also right that there's a gulf between what users ask for and what can be sensibly implemented due to security, etc. considerations. E.G. wanting SSL to just work and ignore all cert changes magically just isn't ever going to be secure.
Maybe even more for your future self than for when you won't be around anymore, given that will impact you if you don't even if you are selfish, whereas you could just quit and not care anymore about remaining or new people. Of course you should not be selfish, but even if you are, write requirements.
In fact the article is so generic it could fit any job. It basically says: be a well rounded person.
Actually gathering and maintaining the fucking requirements in a useful way.