Books that changed my career as a software engineer
julianogtz.github.io
julianogtz.github.io
i.e. “You are a bad programmer/engineer/scientist/person, because you did not read this book, or know this technique.” Thing.
I see this frequently. As a [mostly] self-taught software developer, I’ve been on the receiving end of a lot of this behavior.
In my case, I have a real “Oh yeah? I’ll show you!” streak. I became expert at stuff, simply because some e-bully told me I was bad at it (because they were the only ones fit to judge others).
Not everyone has that kind of stubbornness. I suspect that a hell of a lot of truly gifted folks never realized their passions, and that our industry has been robbed of significant talent, as a result.
Maybe I’m looking at the past with rose-colored glasses, or I was fortunate to run into the people I did, but I don’t recall encountering a lot of this behavior, when I was getting started. I needed a lot of help and nurturing, when I was younger, until I reached the confidence level required to have an “Oh yeah?” response. I’m grateful that I got it.
"A new idea is delicate. It can be killed by a sneer or a yawn; it can be stabbed to death by a joke or worried to death by a frown on the right person's brow." -Charles Browder
A little over a decade ago I was working a gig at the software subsidiary of a fairly large non-tech multinational. It was a lot of mostly nice people and a mix of skills and experience as you’d expect.
Anyway - there was a manager (M) on a project I was on who was.. unpleasant. They had quite an ego, and were very much the type to pass blame down the chain.
Regardless, there was a student on one of their projects who was struggling - I had spoken to this person a few times and they seemed eager enough to learn and had a friendly manner. I never worked with them directly so couldn’t comment on their capability - but even then, they were at the start of their career and still learning so obviously you would have tempered expectations.
Anyway, one day M comes in and people ask if newbie is out sick or is coming in later that day. M proudly exclaims that they won’t be coming back as they had a heart-to-heart the day before and M let them know that software development was not the career for them, that they didn’t have the right skills for it, and that they should pursue a career doing something else instead.
M was saying this with a grin, not out of malice, but as if they’d just saved this poor soul from wasting their time trying to succeed at a career that this expert of the craft could tell they were unfit for.
I was utterly dumbfounded that someone could be so incredibly conceited as to think they could possibly make a determination like that of someone just starting out that was getting no support from their boss.
I left soon after in no small part because I actually felt nauseous being around the person after that. I don’t think they stayed around for long but I heard from long-term folks in the same place that the distaste of this individual was fairly widespread.
tldr; we’re all just bags of meat, eating and pooping on a ball of rock flying through the cosmos. Be kind to people, and pull your head out of your ass.
I was a manager at a company that paid “competitive” (i.e. “low”) salaries.
A significant part of my job was identifying “diamonds in the rough,” and helping to train and nurture them; then, encourage them to stay.
I feel that I did fairly well, here. When they finally shut down our team, the person with the least seniority had a decade.
These were senior C++ developers. They could have gone anywhere.
The pay wasn’t awful, but I was a good manager, and worked hard to accommodate things like family obligations, and, in a couple of cases, serious medical issues. The company had its flaws, but, for the most part, treated its employees well. As time went on, that became less and less. By the time I left, I felt as if the company had become quite rapacious, in its HR policies, and that made me sad.
The pay may not have been that great, but the work was very interesting. We were a marquee brand imaging corporation (which is why they felt they could get away with mediocre pay), and the technology was pretty awesome. We regularly worked with some of the top engineers and scientists in the world. It was an excellent line in your CV.
I have come to learn that money isn’t everything. There’s a tremendous amount of cynicism in our industry, and that is really pretty discouraging. Money has been quite corrosive to the joy of software development, in my opinion. Real damoclean sword.
That is: we should just be naively encouraging of people to pursue whatever they happen to be trying to pursue. This seems born of a boomer-era "be yourself" world view in which "anything is possible". I think this cheats people a great deal.
When physics is demonstrated in schools and TV as some game, it shouldnt take until Masters to figure out it isnt. Programming likewise.
What I see in this culture of "be yourself" is really an admonishment for not "trying to be successful", in the narrowest sense, ie., blindly pursuing programming even though you're not suited to it.
People shouldn't be hoodwinked into careers they arent going to like on the basis they "should like them" because presumably "anyone can be successful" and "everyone needs encouragement". Underneath this ideology is a very narrow notion of success, and a very concerning lack of empathy.
"Encouragement" isnt a neutral good; it's an instrument to develop people -- often in one's own image. There's a lot of people "encouraged" into career's that depress them.
That is: if you arent passionate enough to overcome discouragement, you arent passionate enough to excel.
Of course, we dont need excellent programmers en-mass. However, it is interesting to observe that this "egotistic troupe leader" is a fairly common form of small-group excellence-seeking human organization -- and appears to work.
It gets more-and-more common when looking at how the best "troupe-sized" groups in the world are organized.
I'd be interested in research on this area.
Teams are how we make awesome stuff, but individuals are how we conceptualize awesome stuff.
I've found that the best products come from hybrids of the two.
If you look at where this works, the team simply needs to execute -- largely not think creatively. I can see, then, why this is a comparatively rare form of organisation in programming teams.
I wonder if there's room for it in programming training. Imagine being drilled to produce the same algorithm in a variety of languages over-and-over. Would this be useful? (I use to drill myself in writing dynamic dispatch MVC frameworks as a teenager; I could produce a whole framework and app in a 1hr technical interview -- is this useful? I dont know).
I raise this because I've become increasingly interested in rationalising the Ramsey-esq autocrat, as its always been a part of myself I have been most self-critical of; because I am at once very sensitive to upsetting people but also "brutally attentive" to their (and my own) failure.
I have recently been asking myself: is this brutality actually useful? How much? Does it really require the humiliation a Ramsey or drill-sarg engages in?
Recent western cultural mores are aimed at ameliorating ego-injuries. Is there value in causing ego-injuries? Is there value in humiliation? Clearly there is -- it works in some cases.
Its a weird question to ask though: our culture is so preoccupied with preventing ego-injury... it seems immoral and absurd to suggest causing them.
Importantly you are discouraging a whole bunch of folks who might have much to contribute but have been chased away by the distasteful practices in the industry.
Here’s the thing though: the person in question was already struggling, as a new person in an office of people with experience, without assistance from their manager.
For their boss to tell them some variant of “you’re not cut out for this” in that vulnerable of a position when you have no frame of reference (and when it’s from the same manager that was supposed to have been helping you) is wildly different to hearing that from an impartial peer.
Not just ideas, people have lost their careers to unkind jibes. Here's English Cricketer Monty Panesar explaining the unexpected course his life took after a retort by Australian cricketer Shane Warne that "Panesar hasn't played 33 matches, but the same match 33 times" in a damning indictment of his uninventiveness and inadaptability: https://www.theguardian.com/sport/2021/nov/28/monty-panesar-...
A relevant comment from a thread on CalyxOS: https://news.ycombinator.com/item?id=28101853
So now I'm thoroughly confused, which one is better?
I don't think the concept was as well known. There was less chance for robotic/fragile implementation of things in the past.
Ooh... that's ugly.
It's not that I don't comprehend, it's that my brain finds it boring and hard to focus. I think I have trained my brain so much on rapid skimming of websites for useful info, while throwing away most of the content, that I tend to do the same with books, which really doesn't work well.
Has anyone found alternative ways to consume this information for brains that work like mine?
We skim websites/articles because there is so much information out there, and not all of it is useful. I skim articles and then go back to fully read them once I make sure they’re actually worth the time. Same with some books, but books generally are worth it since they went through the publishing process, etc.
I set a single New Years Resolution goal to build this muscle: 12 books in this year. I’ve read 22 now.
What compels me to keep reading is the Reading Insights Streak feature in Kindle. It’s like a little reminder I can always check on to see if I’ve read today or not.
Schopenhauer’s essay “On Reading” is instructive here. He recommends reading fewer books but going deeper into them.
A book that definitely wasn't in the category I described above (for me) was John Ousterhout's Philosophy of Software Design - https://www.amazon.com/Philosophy-Software-Design-John-Ouste... . I haven't run into software design/tech books like that very often.
Many books belabor the point and take a chapter to explain what a paragraph could.
It might sometimes be useful - for example, to explain a scenario to a newbie who can't relate from their own experience - but for someone who's been in the industry for a while, most of that information is just not useful.
This style is popular nowdays and finding books that succintcly describes a subject is hard. This is mostly because you need to have common ground, and writing for the smallest common denominator is better.
Trying to pick up a book about a new programming language that is trying to explain the concept of an 'array' or whatever is annoying--I wish there was something to just lay out (still in a thoughtful and guided way) the concepts I needed to understand for that language based on already knowing several others.
The a builds on b builds on c style of learning is only one way of learning things, and in many cases, the foundations (a, b) serve you no real value.
Just jump to the sections that interest you (c) and go back to previous sections if you feel like you’ve lost track of what they’re talking about.
For example, the first 20 pages of ‘Remote’ cover why remote working is good. It is intended for people who are considering if remote working is suitable. If that’s not relevant to you, do not waste your time reading it.
Of course, you still have to actually sit and read the chapters that interest you… but, if you struggle with that for the chapters you’re actually interested in perhaps a more project based (do a thing, use references from book) approach, or notes based (treat book as study text, rewrite it as your own notes) might work for you.
…but, don’t feel bad. These are super boring ass books with a few interesting parts to them.
Often, it’s some variant of starting with studying the table of contents then doing a fast first pass of the text. That’s usually a pretty good way of figuring out where to start.
Does that mean reading it end to end?
If you can't read books, then you are missing out on a lot. It's important to be able to read books (and work through large portions of them). Start reading books by reading fiction, then transition into nonfiction books (that are closer to fiction at first, e.g., history), finally transitioning into long-form technical books. If your budget permits, buy a long-form book on a technical topic and commit to reading it instead of just jumping on a website. For example, if you want to learn Kubernetes, just buy the Kubernetes book written by Beda et. al. I doubt any website will be better than that, and you will spend perhaps a week or two on a shallow read of the book, but you'll have found that you have a much better appreciation of the subject matter than you would have had you just glanced at a few website articles.
What helped me to go back on track was reading novels and constantly asking myself: did I understand the last sentences that I've just read?
I love reading literature though. Hours, engrossed.
This might just be me. Tech is just a means to pay the bills for me - there’s no passion, hatred, love involved here.
I cannot just sit and listen without doing anything, I need to be doing something with my body to be able to stay focus on an audio feed. I mean, I can do it but I won't be able to keep my attention on the audio content. When I bike, walk, or do laundry, no problem at all!
The only exception was a Linux kernel podcast but the format was really unsuitable for the topic.
Do you have any good technical podcast to recommend?
"Algorithms + Data structures = programs": https://adspthepodcast.com/
Crypto Critics' Corner may be my favorite podcast: https://cryptocriticscorner.com/
Anything from microbe.tv: https://www.microbe.tv/science-shows/. They have podcasts covering evolution, microbiology, neuroscience, parasitism, virology, urban agriculture, and more. Lot of stuff to dig into, you can try and see which one you like.
Not technical, but I like to listen to Startup Therapy, I like how they openly talk about failures and mistakes: https://adspthepodcast.com/
Someone once recommended me to start at the back of each chapter and do the the problems and only read the chapter or even parts of the chapter for problems I couldn’t solve.
It comes with its own set of drawbacks but it does help with getting through text books where the author was paid by per letter.
For the really good books you’ll actually reach the end.
When I was a kid, I read books by the meter, regular at the local library. At age 35, after life happened and after I was immersed in quick internet articles, I realised I haven't finished a book in ages. Which made me slowly read more, having that extra page after "mental exhaustion", slowly working my way up to a while chapter ... trying to get back into the habit.
Now at age 41, I read long stuff again - best decision I've made. But I am under no illusion that I won't fall back into bit-sized consumption if I would stop keeping it up.
Pragmatic Programmer for example could be thought of as a very curated list of blog articles. Great book, but also not intimidating or deeply technical in that sense.
My example is from the Windows Internals books, it’s a great book, but I don’t think the authors could write it in a “gripping” way, that’s just technical books.
What I do however be it books or video is chunks, takes MUCH longer to do but I find for me it sticks, so if in my learning season (I do bursts of learning, burn out leave it for a couple of months, rinse repeat),
- Read a section or chapter - Make quick, rapid notes in my notes app (or notebook, I use bear but whatever suits yourself) - Once I’ve done, go to sleep (I normally study at night, my brains more in a learning mode then for me) - Maybe at dinner time (at work) I go through my notes, if it’s something I feel may benefit my colleagues I make a brief PowerPoint, I try to translate it into a less technical write up, not everyone is super technical, it’s just a job to them!.
I have a terrible memory for learning, I remember things long term great, short term not so much, so I reference my notes a lot, it’s essentially my mind map/bank.
Video learning is very subjective, I’m currently learning Cisco Umbrella and it’s very boring to me, the creators voice is very mono tone and boring to the point I’ve nearly fallen asleep, but other creators (mostly in the Microsoft MVP zone) are very lively, a good mix of demos and theory that keep me engaged and actively want to learn, Pluralsight is the same, keeps me awake and motivated, I found CBT a little on the boring side in comparison.
No issues doing the actual programming, could sit for hours on end without any issues.
One nifty thing about my ADHD is that something that was super interesting can become dull as hell. For no apparent reason.
Issues with focus, staying on task and motivation are generic issues that everyone has. Just like everyone gets sad or down sometimes. When it becomes a constant problem that affects your life, that's when it becomes a depression and needs treatment. ADHD is similar, except that it doesn't really come and go but is more of an undulating constant.
On my phone I've read 250k word books cover to cover, same books I could never read on a PC. Attention is weird like that.
Another trick is getting your dopamine* externally. There's an association between ADHD and substance abuse, and I can see why. Pharmacology is a cheat code: a few hours of infinite motivation, will power, and attention.
Unfortunately, when people start needing a substance just to feel normal, that is the definition of an addiction.
(* More complicated than just Dopamine or Serotonin, both seem to play a role. Medecine has not solved this one yet.)
If they would otherwise not feel normal and there are no negative side effects, is that a problem?
Negative side effects of note with usual ADHD medication (amphetamine salts) include increased cardiovascular load, development of a tolerance (you need higher doses to achieve the same effect). Sometimes amphetamines induce small changes in personality, rarely full blown psychosis (this has happened at therapeutic doses!).
In general you should apply the same sort of risk-benefit analysis we use for every other drug. If you don't experience any side effects so strong you want to stop, and you believe you're aware of the risks, great.
If you're taking them without a script, I'd advise you to find a steady-state dose that works for you and stick to it. Don't let yourself increase the frequency or the dose without a conscious decision. That's how many people have spiraled.
Finally, I think it's important to have a lot of respect for psychoactive chemicals. Nature doesn't care very much for human overconfidence. If you start being careless, chemistry will do what chemistry does.
I'm a prescription-attention-drugs person and specified drugs do not exist.
Disagree. What is 'normal'?
A better definition for addiction is the brain no longer produces the neurotransmitter without the presence of the drug (or is doing so at a highly diminished rate). There's no evidence that such occurs with the amounts prescribed for adhd.
For that matter, people needing an external source of a substance to feel normal is unavoidably part of being an organism. We need water, or we wont feel normal. We need vitamins -- and plenty of people have vitamin deficiencies, are they addicted to said vitamins?
I use one of them, and it has been a great help for me for studying and for work. I don't take them during "off-time", i.e., weekends and holidays, and I don't feel like I need them for my hobbies, where part of what makes it fun for me is that I can take my time, shift my focus constantly, and define "progress" by my own internal metrics.
I don't know how to evaluate the risk, basically. Medical stuff tends to have a lot of noise.
But also, every body and mind are different. Consult a specialist. There's many different types of ADHD medication out there now.
w.r.t. books on programming - I've found that ones that offer a hands on project really aid in staying engaged with it. That's usually enough to give you a solid primer on a topic, where other literature starts to become a bit more accessible/less of a drag/less overwhelmed with unknown terminology
No, your brain just tricked you. It trained you into thinking that you're doing rapid research of useful info, while it just looks for path of least resistence.
Minimum means that I need to finish it that day no matter what.
I put a maximum because I found through trial and error that if I push myself too hard, even if a topic is interesting, I burn out quickly and procrastinate, sometimes for months, before continuing reading said book. And that is worst case scenario for me.
Maybe your brain does not need to work like that.
On the other hand, I taught myself electronics and programming from a combination of books and just trying things. Maybe trying things is a different kind of classroom in a sense. Certainly a different teacher: Mother Nature, who takes no crap from cocky teenagers.
The content may not be super relevant immediately, but the book and (really simple) methodology of taking notes on these readings and graphing relationships between concepts means you're slowly building a network of knowledge that grows and becomes more powerful over time.
I used to but now it feels like a fun game to me.
As for having trouble reading difficuly texts try this - read two pages. Try to recall what you read. Then try to connect it with what you already know. You only need to do it for the fundamentals not every sentence and it will help build up flow.
I think the generic bit of this advice is to excel as an engineer is to focus on the business, not the tech.
I must admit that this kind of attitude triggers me. I have worked in the energy sector, in engineering (but not IT) heavy companies, and many have this attitude. "its easy to learn programming", "we just need to teach the engineers python" etc etc, and I have seen MOUNTAINS OF SHIT so tall you would faint. It's easy to get tricked, because being both the user and developer at the same time can be such a boost. But the moment there are more users things get hard. The moment the code base gets so large that you can't keep it all in your head, it gets hard.
Software development is easy until its not, and it surprisingly quickly gets to the "it's not" stage. And then you get excel sheets in python.
Some "subject matter experts" make good programmers, but in my experience its not because their background, but because they are smart and have talent for it.
I believe it was this one with a slightly different name
For example, if you are developing software at Uber, there is no "domain" to speak of. Ditto for a search engine at Google. The company pioneered information retrieval in the internet age, so what's the relevant "domain" there?
Of course, if you are writing MCAS software for Boeing, having a good understanding of Control Systems, or Aeronautics (which you can gain by attending nontraditional programs in colleges or universities) will be very helpful. Same thing for something like trading firms (where it's practically formalized and there are programs that turn out quants), accounting firms (e.g., Intuit) etc.
The general advice that would still apply to both would be: understand who your client is and what they need in the context in which they evolve, be they consumers in a country you're not familiar with or mechanical engineers you barely know the job of.
- "Hey, I saw a statistic that females are anxious about taking taxis at night in France. Why don't we add a feature to let people share their locations with others?"
- "In London taxi drivers have to pass The Knowledge, a test on roads! Have we considered adding a similar pre-requisite test for drivers in that city?"
- "I noticed a lot of drivers on Reddit have been complaining that the tips aren't viewable on the app, but we have the data. Why don't we add that to the drivers UI?"
Etc... The sources of this information would be user channels like Reddit, taxi-related news sources in countries you operate in, and keeping up to date on legislation. Sure you might not have the ability to make any of these changes yet but if you stay ahead on these factors it's definitely the way to move into a position where you can have that level of impact.
As a consequence if one changes jobs say every 2-3 years (different domains) then they become generalist engineers.
In my experience one has to spend 10-12 months at a company to pick up a domain by being deliberate at it. It may look like a big investment but the payoff will be significant once they have sufficient context in their head.
For me, there are books that had a negative impact on my work. The GoF book is one such book, and its impact on my development is so distructive I can't even begin to explain. It's not only because it tries to codify coding as a sum of recipes, but people reading it end up with the scary idea that there is only one way of doing things, and that one way has a clear name, and a single possibility for implementation. The GoF buffs are those that keep stressing the most autoerotic interview question: „describe me one design pattern, other than Singleton”.
Now worse than people who read the GoF book are people who dove deeper into the issue and learned about more design patterns from other books. One such people screwed my career development for 7 years because at one internal interview he asked me out of nothing about the „half sync half async pattern”, that solves a problem that he wasn't able to describe to me. And since I failed, I was forever on their s*t list.
I think there are good books that can influence your life in a positive manner, but those are incremental changes, things that add a few things here and there. I would expect to see on lists that „changed careers” books on programming languages, like Kernighan & Ritchie on C, or Stroustrup's or Alexandrescu's books on C++. Or books on fundamentals, like Hennessy and Patterson, like Tannenbaum's Network or Operating systems, Knuth, or Cormen&al on Algorithms. But since I rarely do...
This is a sign, that in order to solve the problem, you must move on to a job that isn't the problem.
Abelson, Sussman's Structure Interpretation of Computer Programs also good recommend - helps show that whilst it's not magic, fact everything still works is magical
1. https://stackoverflow.com/questions/19546115/which-lang-pack... 2. https://eli.thegreenplace.net/2007/06/19/introducing-the-sic...
I also agree that "changed my x" is a bit of a stretch; perhaps it's hyperbole and should be taken as such. There are very few "things" that change one's life. Perhaps being in a war, or a natural disaster or some such, having an encounter with death but averting it or some such event could singlehandedly change one's life, but I doubt that reading a book or a set of books is one of them.
Somehow related, Google right now demands interviewees to prepare using the Cracking the Coding Interview book. Pretty much it's like someone sells you a door and hands you a set of lockpicking tools instead of you using the key to enter.
I think the problem are the people who can’t abstract the message of the book and instead use it as their reference for absolutely everything, over-engineering the hell out of things. When I’m asked the sort of questions you describe, I also just ask if they could instead explain the problem, because being able to solve problems is all design patterns are about. If they can’t, I would respectfully ask how their knowledge of the design pattern will then help them in their job.
Advocating for a perverted cloudy way of overengineered sw that builds cvs and horrible enterprise sw.
There are much better ppl to read out there. Anyone actually writing long lived sw. Linus, sam neal, anyone actually DOING it rather than living off self indulgent books.
I think Fitnesse [1] is quite relevant. That said, not a lot of FOSS work from someone like him, to put the things he preaches in large and complex projects that we can look at the source and learn from.
The problem was with this person, not so much with the GoF book. In present days this person might have become an FP fundamentalist and come up with some exotic category theory quiz question that he was very fond of himself. The GoF book is now of course outdated but the idea of categorizing best practices from the industry was a good one. Unfortunately many good ideas will be abused by people who lack the common sense to know how and where to apply them. A similar thing has happened to the agile software development movement, to microservices architecture (every service is a microservice?!), unit testing (people trying to reach 100% coverage).
It doesn't do anything of the sort. It may try to codify some specific solutions to SOME specific types of problems, in a very narrow OOP'y context, but if "codifying coding as a sum or recipes" is what you took from it there's little wonder it has colored your view, so.
"The book is strictly about career development and it has a lot of insights ..."
"The book is filled with classic and fresh anecdotes, thoughtful examples, ..."
"This book is amazing to understand the corporate structure and how you should behave ..."
These generic praises aren't good enough to overcome my threshold of interest, so to speak. A better way, if I'd suggest, is to pick a choice quote from the books. Quotes can be hit and miss, but when they click, it can pique the reader's interest in a much more acute way.
I really don’t get why this has 500+ updoots. What am I missing?
* The Mythical Man-Month, Brooks
* Rapid Development, McConnell
* Extreme Programming Explained, Beck, et al
* Test-Driven Development by Example, Beck
* Domain-Driven Design, Evans
And something that wasn't a book but made a huge impact was Eric Ries's blog, Startup Lessons Learned, circa 2009. He correctly spotted that things like Extreme Programming are generic software development processes, but that in specific domains you could take advantage of their flexibilty to enable new business practices, as in Blank's "Customer Development" process.
It'd be one thing if there were managers out there actively disputing the ideas in the book, but I don't really ever see that. Like you say, more often I find managers that claim to have read it and agree. But still, shit like "let's flag if this project is late so we can try to add more people to it" gets said all the fucking time.
I think with a lot of managers, trusting downwards just isn't a thing they're able to do, and so the only move they think they have is to view engineers as miners chipping away at "man-months" of software work. Sometimes I almost think it doesn't matter to them if it actually works or not, it's just the only move they see so it's the only thing they'll do.
Heck, I stepped away from my last job in part because the environment was that (really, 'leadership' was just generally so bad, and this was but one of its manifestations of suck). I kept having status meetings as we neared a due date (that had been set by product, not engineering, and which our velocity said we would not make) asking us if we'd make the date. To which I replied "Data says no; gut says maybe. If I say we're not going to make the date, what are we going to do differently?", and to which they had no answer -except- "pull people from other projects and put them on this one". Nevermind that the whole difficulty was learning the integrative aspects, i.e., communication, NOT implementation (and that was why gut said maybe; we had learned a lot already, which is what took a lot of time; we were still facing both known and unknown unknowns).
Meanwhile, the teams that were getting kudos were the ones where managers were just like "yep, we're floundering; give us more people". If they succeed, they were brilliant and knew to ask for help. If they failed, well, it was doomed, but at least they knew to ask for help. Nevermind if more people were actually helpful, and derailing other projects just to get them was worthwhile. Clearly, I was a bad cultural fit; I cared more about getting things done efficiently.
The Mythical Man Month reference there was helpful for not derailing things by having more people thrown in the mix; it wasn't helpful for avoiding blame.
For sure. One of the curses of the modern business environment is the belief in management as a universal skill. That if one has an MBA one can manage anything. That all one needs to do is find the appropriate graph and make it go up and to the right. In practice it ends up being an erasure of domain-specific knowledge in favor of the naive beliefs of the powerful.
A great example comes via Poppendieck's "The Tyrrany of the Plan": https://www.infoq.com/presentations/tyranny-of-plan/
Transcript here: https://chrisgagne.com/1255/mary-poppendiecks-the-tyranny-of...
The Empire State Building was built on time and under budget, but they did not have a complete plan when they started. This sounds impossible to the modern ear, but that's because executives see plans as a substitute for competence.
It wasn’t until our 3rd or 4th interaction that I put two and two together. The result was a very nicely signed and personalized copy of the MMM.
It's difficult to get a man to understand something when their raise depends upon them not understanding it.
I can still remember when the CTO I argued with came into the room one day and said that he'd been given the green light to hire as many additional people as he liked. He was grinning from ear to ear. I suspect he knew it wouldn't actually fix any of our issues but he didn't really care.
On the other hand, as a mentor I found it useful to re-read it (or, read it through properly, I'd read large portions when I was younger but never all the way through). There's a problem of becoming too expert where you can't communicate with novices in the field anymore, at least not like they actually need you to communicate with them. There was benefit, for me, in re-reading it and nodding along and being reminded of the things I'd learned along the way, getting a name for them, and a discussion I could use as a basis for my mentoring.
Such as?
But they get very helpful once you've been in a few battles and failed miserably. You'll be able to determine where you went wrong, whereas before it escaped you. You'll then find out how to not make those mistakes again, and do it right next time.
The real value is that it is much much harder to pass that sort of insight along to engineers you work with or (especially more junior) manage. Books like that didn't make me a better writer of code, but I think they made me a much better communicator, engineer and manager.
Code: The Hidden Language of Computer Hardware and Software
The Design of the UNIX Operating System
Designing Data-Intensive Applications
They taught me that there is no magic. Everything is logical and comprehensible.
UNIX taught me about the how an OS deals with hardware resources and the software that run on them. I now understand the environment in which my processes live as well as the structure of a process.
DDIA taught me about the structure of data, how databases operate on data through transactions, the difficulties of synchronization across databases, and the way data streaming works.
Designing Data-Intensive Applications was really good too, the best new technical book I've read in the last five years or so, though I have had trouble applying its techniques thus far.
- The Elements of Computing Systems: Building a Modern Compiler from First Principles
- Operating Systems: Three Easy Pieces
- Systems Performance: Enterprise and the Cloud
- Exercises in Programming Style
- The Little Typer
- Conceptual Mathematics: A First Introduction to Categories
I could add Queinnec's Lisp in small pieces (for the gradual derivation of fancier and fancier interpreters, the continuation one in CLOS was cool, and the bytecode part also very very cool)
Bratko's Prolog book was nice.
I'm tempted to mention the dragon book but I only read 40%.
Other have mentioned The Mythical Man Month, and I'd say it's a great book. Sadly, more often than not, it's something I wish I could staple to managements foreheads. "read this now before our next planning session"
The Rspec book was a great book, that helped me fully embrace TDD, and this has led to more sleep filled nights than I had a right to before its consumption.
1984... This one terrified me so much, that I have to include it. I write code much more securely because of it.
Strange in a Strange Land. If only because I learned what GROK means.
You may find this post interesting http://number-none.com/blow/john_carmack_on_inlined_code.htm...
Did you read the book? It's not about the (ab)use of mandays/months in planning sessions, it's about the huge differences in capacities between individual programmers and the importance of having some "10x programmers" in your team.
I thought the whole thing was about having a plan, and many well structured, organised teams; having a 10x programmer makes no difference at all without the rest of the things; no matter how great you are, you can’t do everything, and if you try, you’ll become a bottleneck.
I sympathise very much with wanting to staple “do you actually have a plan for how that’s going to work?” to someone in a planning meeting.
> Very good professional programmers are ten times as productive as poor ones, at same training and two-year experience level. (Sackman, Grant, and Erickson)
> Sackman, Grant, and Erickson's data showed no correlation whatsoever between experience and performance. I doubt the universality of that result.
> A small sharp team is too slow for really big systems.
^ literally a quotes from the book.
What book?
To this day I cringe when I see dogmatic opinions of a fraud taken like an absolute truth.
I looked around and found this video [[https://www.youtube.com/watch?v=mb9VPWbrqmE][Uncle Bob (Robert Martin) is a Fraud!!!]] but most of the comments are dismissive of the review.
qntm did an extensive overview of this: https://qntm.org/clean
I'm not sure if fraud is quite the right word but he gets a lot of flak on HN for being something of a religious fanatic. E.g. the top comment in this thread:
https://blog.wesleyac.com/posts/robert-martin - this is a good article
> While Martin advocates for a small, dogmatic, and incorrect set of technical ideas for making code better, that's not why most people are upset with him — it's far more common for people to be upset about his views on race and gender, and particularly the way that someone in a position of power expressing those views hurts people in the communities that he's a part of
Uncle Bob puts forth a couple of good ideas from time to time, but none of those good ideas are his.
Wait until you have to follow dozens of 5 lines methods for the sake of unrequited abstraction that could have been compacted in an easier to read 30 line method.
The top 2 recommendations - based on return to learning on time invested - are: 1. Computer Systems: A Programmer's Perspective 2. Designing Data-Intensive Applications
I worked through The Little Lisper when I was at university and I got a lot out of it, for example.
Can you recommend any other content like that?
Still, a couple of random things I can think of:
The Spatialite Cookbook is no longer maintained, but I think still useful. That's structured as a sequence of fun exercises: http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/index.h...
I also enjoyed Peter Norvig's Design of Computer Programs online course: https://www.udacity.com/course/design-of-computer-programs--...
But in general - if you are just trying to become a better software developer (e.g write clean, well tested code) you are absolutely right no book will get you there, hard work will.
[0] https://archive.org/details/the-unwritten-laws-of-engineerin...
* Effective Python
* Designing Data Intensive Applications
* High Performance Browser Networking
* Google SRE Book (maybe)The Effective Engineer: How to Leverage Your Efforts In Software Engineering to Make a Disproportionate and Meaningful Impact
Effective Engineer - Notes : https://gist.github.com/rondy/af1dee1d28c02e9a225ae55da2674a...
https://www.amazon.com/Effective-Engineer-Engineering-Dispro...
The book for the last PC that I could completely comprehend and bend to my will. And then came the #$_! Mac OS. Freedom into slavery. Rainbow into chrome.
As somebody who didn't study CS in college, the books that most changed my career were:
* Algorithms, by Robert Sedgwick (probably not the best algorithms book, but lots of hands-on stuff)
* Learning From Data, by Yaser S. Abu-Mostafa et. al. This one has video lectures to go along with it.
* C Programming: A Modern Approach. (Definitely not the best, but also lots of hands on stuff)
Another thing I've found extremely educational is to read major incident postmortems (SEV0s and security SEV1s at FB, "huge" OMGs at Google). If you ever find yourself anywhere with planet-scale infrastructure, make sure to read these write-ups. They are treasure.I was fortunate enough to be around senior engineers who took upon themselves to mentor junior engineers like myself. Now that I'm in their shoes, I find that the engineering landscape has changed quite a lot (especially in software) and often find that junior engineers don't see themselves needing to be mentored and sometimes even offended by recommendations.
I think some of this can be seen in this thread as well - some are commenting about how bad these recommendations are, and some even about the general practice of recommending books (how dare you!).
Given that the OP is just talking about books that he felt changed "his" career, I think it's really not something to be challenged and disagreed in such manners.
Just the section on correlation vs causation is invaluable.
Link to a pdf of the book: https://web.mit.edu/alexmv/6.037/sicp.pdf
For nonfiction books I mostly put myself in the mindset of learning or conceptualizing the content in a more abstract way, like building a mind map.
For fiction, I picture the story like a movie, which distracts me from bad writing, so this book hit that sweet spot for me, personally, where I could imagine the world and the events but also conceptualize the abstract content.
I actually wish I could read more technical books that have fiction and technical concepts mixed like that!
Edit: Also, for as much as people complain about DevOps here, I'm amazed so few people have read this book. It's literally the book that invented DevOps as a term, right?
Other places credit Patrick Debois who ran the first devopsday in the same year: https://newrelic.com/devops/what-is-devops
A few in there are marked as "dangerous" - books that I've seen totally destroy productivity, but I included them since it's impossible to refute what you don't understand.
Genuine question, as a software engineer of 3-4 years professional experience, how should I approach furthering my skills? A lot of advice is just "do more, practice more, try things" and while that is going to be a significant part of it, I don't believe we should outright ignore books as a valuable source of info. How should I approach and identify books that contain "outdated" or sometimes "wrong" advice?
Some views have to be considered in context. If OO means Smalltalk to one author and C with Classes to another their statements on “OOP” will actually be about two different things, learn from them both but don’t misapply the lessons from one to the other (happens a lot).
With that in your head, read the books and question them. Experiment with their ideas where you can or run thought exercises, “What if…?”
Also, read “The Psychology kf Computer Programming” by Weinberg. He presents many different case studies (though briefly) and commentary. One of the few books where it is clear his prescription is, “Study people and their behavior” not “Do what I say and you’ll make perfect code.”
I love it!
Personally, I got a lot of value from Designing Data-Intensive Applications by Martin Kleppmann.
* Rapid Development (Profession)
* Epistulae Morales ad Lucilium (You're not alone, we all share this.)
* The War of Art (At 9am, you are alone.)
* Competitive Advantage (Porter, a personal choice, it's not about the bytes.)
* For those who don't already know, it's a very quick read. And the type of book you'll gladly reread every one to three years.
Exceptional in every way.
I repeat with emphasis: It is exceptional in every way possible. Improvements that you suggest should be addressed if it doesn't take away from the breadth + detail and only make it more clear.
* The Passionate Programmer: Creating a Remarkable Career in Software Development
* The Pragmatic Programmer - your journey to mastery(20th Anniversary Edition)
* Unwritten Laws of Engineering - Second Edition
* Remote: Office Not Required
* Explain the Cloud Like I’m 10
They're excellent books, but they're targeted for early career developers and people struggling to figure out the office work life. It's fair to say that you're probably not the target audience, but they're really great books for their niche.
I'm also extremely interested in the idea of reading a book about remote work after reading the blog.
Maybe it's not Remote, but I should definitely read a book about working remotely, considering I do it for so much of my time.
* ANSI C, Ritchie and Kernighan. This was my first real programming book.
* Essential C++, Lippman. This book helped me move from C to C++, and I usually reread the series prior to interviews.
* Introduction to Algorithms, CLRS. I've read this cover to cover many times, and it motivated me to go to graduate school.
* Zero to One, Theil. This book made sense of the world of tech startups.
* The Innovators Dillema, Christensen. This book shaped my world view of how business should operate.
It is important to keep those in mind and then determine what is more important: career progression or work satisfaction.
o Computation: Finite and Infinite Machines --- Minsky
o The Art Of Computer Programming --- Knuth
o Structure and Interpretation of Computer Programs --- Abelson and Sussman
In that order. Everything else is syntactic sugar. <g>
"Developer Hegemony"
Take the 37signals Remote book, for example: as a run-of-the-mill engineer, you quite literally have no say in what the work/office culture of your employer is. Unless you're (at a bare minimum) a VP, no one cares what your opinion is, as you have zero political capital. I don't want to be too negative, so here are some books I would suggest:
The 48 Laws of Power
Outliers: The Story of Success
The Black Swan: The Impact of the Highly Improbable
How to Win Friends & Influence PeopleBeing a good engineer is necessary, but not necessarily sufficient, for being promoted.
There are some toxic workplaces where politics is the only way to get ahead, but they tend to fizzle out quickly as the upper ranks become filled with people who aren't good at anything but politicking and the good engineers and managers leave for greener pastures. It's certainly not characteristic of a typical, successful company.
In fact, neglecting engineering skills and trying to exclusively play political games is one of the quickest ways I've seen people tank their engineering careers. The problem is that it might work at first, for a short while, but eventually the people around the person realize they're all talk and no show.
Reputations are hard to build but easy to destroy.
That’s when they pull up stakes and move to the next company.
I disagree. In fact, the third or fourth stage of your promotion will often be a leadership position (junior, senior, principal/tech lead). If you're okay with being a "senior engineer" until you're 45, you're going to be in for a rough time when you get inevitably laid off.
Most competent companies let good engineers who won't be good leads stay in IC roles with bigger responsibilities.
And I’ve seen many cases of “run-of-the-mill engineers” change cultural aspects of the office and the company.
This is all based on mostly one employer, but a very big one. I suspect smaller companies make fast promotions for talented engineers and cultural changes even easier.
(I do agree that sometimes people that look in no way special at first glance turn out to be fantastic founders)
The operative words being "My Career". The article is a subjective listing of books that the author found to be useful in their career and at the stage of their career they read them. Not an edict of what every SWE needs to read to progress in their career.
I have read 1 of the 4 books on your list (and read another partially) and haven't found them to be remotely helpful in my career progression. They may have huge impact on someone else at another stage of their career, that is the point of lists like these.
They will fuck anyone over for telling them they must lower their standards for the crap like being inclusive or no kids left behind, as if everyone can learn advanced maths. They's how they got better at maths. That's how they produce good students: they believe everyone's potential, and push students as hard as necessary. They still have catch-up to do, but they are getting closer everyday.
Who hurt you?
My experience has been quite the opposite. Creating a great work culture is well within the ability of even new engineers. I would probably suggest the opposite of you, in fact, and suggest that, between engineers and the VP/C-Suite level, mid or senior level engineers probably have the most sway over company culture. As an engineer, you have time, inclination, and ability. VPs don't have the time, CEOs don't have the inclination, and, frankly, no one but the boots on the ground have the ability.
Ah yes, the same companies that laid off mass numbers of engineers in 2000 and did it all over again in 2008. The same companies that vehemently fight any kind of unionization efforts and the same companies that insist to haze potential hires with live-coding & whiteboarding tests even though folks have 10+ years of experience. The same companies that were wage-fixing employees' salaries and had to pay out almost half a billion dollars in restitution[1]. Those companies? If you think you have any kind of influence on corporate culture as random engineer #3419, I've got a bridge to sell you.
[1] https://www.npr.org/sections/alltechconsidered/2015/01/16/37...
Don't see any problem here. I've met my share of "10+" years of "experience".