Good reading for self-taught programmers?



  • I find myself (due to our team being down a QA person and a designer) often without business work to do. My company says that an acceptable use of time when that happens is "self-improvement in your job" (my paraphrase).

    I'm also entirely self-taught. The only programming class I had was a Numerical Methods class as an undergrad physics major, and that was more about convincing Matlab to do what I wanted, not actual programming. And that was a long time ago (16 years).

    So what should I read? What books, long-form articles, or other sources (other than TDWTF) have you found helpful in your IT careers? I'm willing to go quite broad-based here, not just programming/computer science. Things like product development, etc.

    Ideally these would be available as free (or cheap) pdfs, but other suggestions are welcome.


  • Considered Harmful

    @Benjamin-Hall The Pragmatic Programmer, the 12 factor, Agile, and GoF manifestos, and the current Java Language Specification.

    for extra fun, take a drink whenever the JLS introduces a novel word or hyphenated term.


  • Discourse touched me in a no-no place

    @Benjamin-Hall said in Good reading for self-taught programmers?:

    So what should I read? What books, long-form articles, or other sources (other than TDWTF) have you found helpful in your IT careers?

    If you're doing anything with UIs, consider:

    The copy I have is outdated (and an older edition) but very good. I found it helped me think much more clearly about how to design the GUI of an application for users instead of my convenience.

    Also,

    is a very good book indeed on Design Patterns (along with the other books by the author in the same series). In particular, pay attention to the fact that it does not require that you involve fancy classes in the pattern; yes, Java patterns tend to have that sort of shape, but that's just a consequence of the language, and the fundamental principles are far more widely applicable. (It'll be dated now, but most of the patterns will still apply; the principles — forces, standard solutions, and consequences — still all apply.)

    Also, these are definitely both books for people who have practical experience. It's hard to appreciate the deep parts of what they're talking about without knowing how programming works in practice.


  • Discourse touched me in a no-no place

    This post is deleted!


  • @Benjamin-Hall All the classic articles by Joel Spolsky on https://www.joelonsoftware.com/. It has a bit of all the related topics. I don't think he's done much essays after SO really took off, but there is a lot of really good stuff from before around 2010.



  • The mythical man month is interesting, if not for the code but for the parts about the other, much larger part of software development.



  • The other thing I'd recommend is try looking for some open source projects where you can fix a bug or two while training your code reading skills. Being able to read other people's code – or your own old code you no longer remember much about – is an essential skill and you'll pick up a lot of idioms along the way. Some of them will be really bad, but when you pick enough, you'll be able to sort them to the ones you think turned out well and the ones that turned up crap.


  • Considered Harmful

    @Carnage said in Good reading for self-taught programmers?:

    The mythical man month is interesting, if not for the code but for the parts about the other, much larger part of software development.

    Good point. Add Systemantics to the list, if you can find a copy.


  • Considered Harmful

    @Bulb said in Good reading for self-taught programmers?:

    training your code reading skills

    However you do this, it matters, you need to be able to read it like a book.



  • @Carnage said in Good reading for self-taught programmers?:

    The mythical man month is interesting, if not for the code but for the parts about the other, much larger part of software development.

    Its wisdom stands the test of time, but its comments on "surgical development teams" are no longer relevant. It suggested that you should do development like a surgical team: one guy doing the actual work, with a team of other people doing all of the supporting tasks. Since compute cost has fallen through the floor, having a separate person "desk check" the programmer's code is not a valuable use of time.


  • Considered Harmful

    @PotatoEngineer said in Good reading for self-taught programmers?:

    having a separate person "desk check" the programmer's code is not a valuable use of time.

    I'd take more issue with other outdated points of concern than this one - merge sort is generally done on single machines now but code review is still useful.



  • @Gribnit said in Good reading for self-taught programmers?:

    code review is still useful

    … and most teams finally started to do it when Linus, who was one of the few who did it even before, infected them with git, which was largely designed around the workflow involving review before integration. :tro-pop:



  • @Gribnit said in Good reading for self-taught programmers?:

    code review is still useful

    :doubt:



  • @Benjamin-Hall But for a halfway serious answer, either How to Win Friends and Influence People or The 48 Laws of Power, depending on your disposition. I found my college SQL textbook and a VB book I bought right before my internship infinitely more useful from a technical standpoint, but those two explain why I keep getting fucked and, if I wasn't so stubborn, how I could avoid some of it.



  • @dkf I'm reading About Face, and one thing it keeps saying is really bugging me.

    It wants software to be "smart" and "proactive", remembering everything you've done and trying to apply it, relying on undo rather than asking.

    And I hate that. It's everything about Apple's software (their autocarrot especially, but Numbers and Pages as well) that I dislike. I will tell you when to remember things. Unlike what they're saying, I don't do the same things over and over and over again. If a browser started to pull all the links on a page in anticipation of me viewing one, I'd be furious. If it remembered all the things I typed and tried to autofill stuff without being asked, I'd throw it away and get a new one. It even suggests having a thread running so it can watch for changes to files you made with it. NO! Or dynamically creating interface elements. NO! Don't move my interface around based on what you think I want! If I want a button there, I'll put one there.

    I want machines to do what they're told, and tell me if they can't (because of reasons). I don't want machines (or the idiots who program them) burning the energy and resources trying to be "helpful", because in my experience, that's way worse of an experience than just being simple and doing what you're told.

    Sure, I don't want endless dialogs that forget from one step to the next. But between sessions? I absolutely want it to forget most of what I told it other than "exactly what was the state before I left" for editing applications. Because the next time is likely to be quite different.


  • Considered Harmful

    @Benjamin-Hall said in Good reading for self-taught programmers?:

    If a browser started to pull all the links on a page in anticipation of me viewing one, I'd be furious. If it remembered all the things I typed and tried to autofill stuff without being asked, I'd throw it away and get a new one. It even suggests having a thread running so it can watch for changes to files you made with it.

    They all do this tho? Including the browser you are using. Not sure about the file watcher but I kinda suspect some watch their configuration files even.



  • @Gribnit said in Good reading for self-taught programmers?:

    They all do this tho?

    Lynx and links sure don't and never did 😼. But really I think most actually gave up doing it by default. There may still be some “google web accelerator” plugin or some similar stupidity, but doing it by default had so many issues from utterly clogging the link – because for every link that gets clicked even somewhat commonly each page has dozens that don't get clicked almost ever – to occasionally destroying users data, that's when some webs use GET requests for destructive actions.



  • @Bulb said in Good reading for self-taught programmers?:

    use GET requests for destructive actions

    Um, don't do that.



  • @PotatoEngineer said in Good reading for self-taught programmers?:

    @Carnage said in Good reading for self-taught programmers?:

    The mythical man month is interesting, if not for the code but for the parts about the other, much larger part of software development.

    Its wisdom stands the test of time, but its comments on "surgical development teams" are no longer relevant. It suggested that you should do development like a surgical team: one guy doing the actual work, with a team of other people doing all of the supporting tasks. Since compute cost has fallen through the floor, having a separate person "desk check" the programmer's code is not a valuable use of time.

    "The mythical man month" is not that relevant in its original form, but 21-century editions usually contain "No Silver Bullet" and other essays from 1980s and 1990s. Unlike the "man month", these papers aged very, very well and are extremely relevant today.

    I still recommend buying this edition and reading through it. The realization that "the revolution" in SW development happened between 1965 and 1985 (before most readers today were even born) and very little changed since that time is quite an eye-opener.



  • also, if you read something that either sounds extremely good, or that you don't agree with it's suspicious. These forums are pretty good for discussing all sorts of things. There might not be clear cut answers, but the discussions can be pretty enlightening.



  • @Kamil-Podlesak said in Good reading for self-taught programmers?:

    between 1965 and 1985 (before most readers today were even born)

    👴 👎 :belt_onion:



  • @Kamil-Podlesak said in Good reading for self-taught programmers?:

    The realization that "the revolution" in SW development happened between 1965 and 1985 (before most readers today were even born) and very little changed since that time is quite an eye-opener.

    And that there were so many interesting ideas that just never got any traction. There are plenty of things to learn from old stuff. In particular the frontend ideas that slowly crystallized into things that works. These things have now been completely thrown out in favor of FOTM frameworks in JS.



  • This one is pretty good. And free to read online:

    Despite the name and theme, the patterns themselves have wider applicability.

    Actually, if you read the Gang of Four's Design Patterns: Elements of Reusable Object-Oriented Software, you should read the Game Programming Patterns right after. The commentary on some of the Design Patterns' patterns is gold.


  • Considered Harmful

    @Benjamin-Hall said in Good reading for self-taught programmers?:

    I want machines to do what they're told

    But you know how the "normal user" part goes, right? They want the machine to think for them. This is not possible, of course, but it appears you don't want to even meet in the middle.

    That was the frist lesson provided to me. And I still haven't learned it, hence I avoid frontend, and tools written by me are generally console applications.

    But frontend needs to be designed and implemented by someone, who understands what users want, not what you want or you think they should want (within reason: they don't want passwords, but they want security - something's gotta give). It is a very difficult task, it is why it's mostly done wrong. Other factors contribute, of course. Intentionally making it obtuse, so that you can change it later and tout innovation. Or masquerading spying and slurping as convenience features. But also plain old incompetence and misguidedness.

    Users are bad at explaining what they want. Tom Smykowski was a kneeling warthog, but it is true that engineers are bad at talking to people.
    You used to be a teacher. Without trying to sound derisive - because this is a help thread and I respect you in general - aren't you supposed to know what it means not to know something?

    There is, of course, a certain degree of skill to be required from a user to use a program, but it should not deviate far from being able to use a computer in general. The cryptic bullshit and all the rainmaking while playing a tambourine is very real. It's perhaps good for the industry, but it holds us back as a species.



  • @Applied-Mediocrity Something that I have to add to that:
    Software should absolutely gush out any and all information it has. Sadly the current trend is to hide "unnecessary" information. Like how the Windows bluescreen now has a frown smiley instead of the minimum information of what went wrong. But that just leads to frustrated users.

    I'll give an example:
    Untitled.png

    Notice how it tells absolutely everything that was available about the USB-Serial adaptor through the API. A computer might have a dozen adaptors and an internal serial port somewhere on the motherboard (that sure doesn't have any obvious connector that I could see) for :raisins: .
    You want to help the user differentiate between the options.

    By contrast, most software that play with serial ports just tell you the port name. Some don't even do that, but just throw you a text box.

    Also notice how the auto-populated port selection has a Refresh-button. Because sometimes you need to do that. And it shows the manufacturer of the COM port in the drop-down, so the user can skip entries that are obviously wrong.



  • @Applied-Mediocrity said in Good reading for self-taught programmers?:

    But you know how the "normal user" part goes, right? They want the machine to think for them.

    But it should also always tell the user how it arrived at its conclusions. Even if the user does not understand the explanation, they'll have a hell of a lot easier time googling for the solution when the automation fails. And it always fails for somebody.


  • Discourse touched me in a no-no place

    @acrow said in Good reading for self-taught programmers?:

    Notice how it tells absolutely everything that was available about the USB-Serial adaptor through the API.

    Alas, it isn't absolutely everything. There's a ton more of manageability stuff that you don't usually want. (Or maybe you're interested in exactly how the device can be set into low-power mode when the computer enters sleep mode?) The problem is typically that there's so much stuff that the computer knows that if it were to show it all, you'd have a user interface à la Ling's Cars. Some industrial consoles come close, or older planes where all the controls are physical.

    So you leave information out, typically stuff that the user absolutely cannot do anything sensible with. (And then you decide that users are complete idiots and remove all the information and put a sad smiley in place instead. Which offends the people with an IQ greater than that of a mouldy turnip. :-()



  • @dkf In this case, I actually included absolutely everything available from the API. The API in question being QSerialInformation in Qt5.

    And you can always add a button for extra information that you think the user won't need but you can't rule out conclusively. You don't need to show all at once. But it should be easily available through a click of a button. Preferably right next to the field(s) it should apply to.



  • @acrow said in Good reading for self-taught programmers?:

    But it should also always tell the user how it arrived at its conclusions.

    Veering into the next lane a bit (so what else is new?), but this is one reason I'm leery of contemporary "AI".

    With an old-fashioned expert system you could, at least in principle, instrument it to produce a trace of its inferences and see just how it arrived at its conclusions.

    With a machine learning neural network, all you can do is pay appropriate obeisance to The Algorithm.


  • Discourse touched me in a no-no place

    @Watson said in Good reading for self-taught programmers?:

    Veering into the next lane a bit (so what else is new?), but this is one reason I'm leery of contemporary "AI".

    With an old-fashioned expert system you could, at least in principle, instrument it to produce a trace of its inferences and see just how it arrived at its conclusions.

    With a machine learning neural network, all you can do is pay appropriate obeisance to The Algorithm.

    In theory you can do that with machine-learning based “AI”, but you'd better be happy with solving very complex matrices if you want to do so! That might be easy for computers, but it is awful for people.

    Standard machine learning is mostly about feature detection, but those features can be entirely abstract and with multiple layers you can have features of features, and with feedbacks you get temporal features as well as pseudo-spatial ones. It's extremely hard to unpick, especially when you've got very high order transforms, and that's in part why at least one mathematician I know argues that you should include forgetting as part of the training process; it means you get lower complexity results and that consequently makes them both far more explainable and more biologically plausible.


  • Java Dev

    @dkf Forgetting in which sense? For temporal features, AIUI these are typically fixed in size so remembering new information would necessarily mean old information is simplified or removed.

    Or is this in a training sense, where it loses the ability to distinguish differences which are no longer relevant?



  • @PleegWat I think he's talking about dropout, which is where you randomly reset the connection weights between units, or remove units in the network entirely during the training process.

    I'm not mathematically sophisticated enough to explain exactly how it helps, but I think the basic idea is that it helps to avoid the learning of spurious relationships present in just the training data. Or, maybe I'm wrong and he's not talking about that at all!



  • @Benjamin-Hall said in Good reading for self-taught programmers?:

    I want machines to do what they're told, and tell me if they can't (because of reasons). I don't want machines (or the idiots who program them) burning the energy and resources trying to be "helpful", because in my experience, that's way worse of an experience than just being simple and doing what you're told.

    QFFT.

    I've come to the conclusion that less is more when it comes to software and systems trying to be smart or helpful. (Right now pissed a certain piece of software where I ended up patching out a particularly irritating attempt of "smartness".)


  • Discourse touched me in a no-no place

    @PleegWat said in Good reading for self-taught programmers?:

    Or is this in a training sense, where it loses the ability to distinguish differences which are no longer relevant?

    I'm specifically talking about applying a kind of non-linearity to the weights in the matrices that means that very low weights are more likely to be set to zero so that only more important signals retain influence on the output. It makes more sense in the domains of biological neurons and spiking neurons, where it corresponds to setting low synaptic weights to zero (and, if you work that way, outright disconnecting them; that's been observed to occur between neurons in the lab and is assumed to occur in vivo as well).

    This is important because you really don't need to retain all the bits of information you could potentially collect. After all, why would you remember the number plates of all the cars you saw as you drove into work on the final working day of October 2019? Yes, you might have that, but it really isn't relevant to very much at all so you're better off throwing it away and not letting it influence decisions you take now.


  • Considered Harmful

    @dkf I find this strategy very useful and only somewhat harmful in use, although I suspect there is a random factor on weighting in addition to a severe high-pass


  • Discourse touched me in a no-no place

    @Gribnit said in Good reading for self-taught programmers?:

    I suspect there is a random factor on weighting in addition to a severe high-pass

    Yes. It looks like connections are formed randomly, strengthen or weaken (i.e., gain or lose the actual channels and vesicles that make up the synaptic junction) according to how much they are used, and are pruned semi-randomly when the connection strength is low. We've done some investigation of online learning via this mechanism in simulation (a very challenging thing to do at sufficient scale) and it looks extremely good at handling the standard tasks, converging rapidly and reliably despite the fundamental reliance on randomness.



  • @dkf said in Good reading for self-taught programmers?:

    @Benjamin-Hall said in Good reading for self-taught programmers?:

    So what should I read? What books, long-form articles, or other sources (other than TDWTF) have you found helpful in your IT careers?

    If you're doing anything with UIs, consider:

    The copy I have is outdated (and an older edition) but very good. I found it helped me think much more clearly about how to design the GUI of an application for users instead of my convenience.

    FYI: Just looked on Amazon, there's now a v4 available:
    https://www.amazon.com/About-Face-Essentials-Interaction-Design-dp-1118766571/dp/1118766571



  • @dcon Which was the version I read.


  • Notification Spam Recipient

    If you're working in brownfields and willing to be pragmatic this is quite a good book.

    Be wary of pattern books. You can learn a lot from them but everything might start to look like a nail.

    If you're not that experienced clean code is a good hand up but be wary that it doesn’t scale well. Code complete is a bit dated but the pragmatic programmer is quite good but I haven't read it for a while.

    Be aware that a lot of language books and courses should be treated as an introductions. Nothing really beats reading the most recent documentation, poking around in an ide and seeing a result.

    @cartman82 recommended rewriting your own personal todo app in every new language you have to work with to get acquainted with it. It's solid advice. They're deceptively complicated apps to write.

    I wish you well and godspeed!



  • @dkf said in Good reading for self-taught programmers?:

    In theory you can do that with machine-learning based “AI”, but you'd better be happy with solving very complex matrices if you want to do so! That might be easy for computers, but it is awful for people.

    Agreed, but:

    Standard machine learning is mostly about feature detection, but those features can be entirely abstract and with multiple layers you can have features of features, and with feedbacks you get temporal features as well as pseudo-spatial ones.

    So the Justification Problem shifts to trying to relate these features to the real-world things that the network is supposed to be making decisions about, and explaining why they're as relevant as they're deemed to be in the context that they're being used.

    It's still a way from having a system showing its work by logging messages along the lines of "Lemmas 13225 and 336612 with Inference Rule 3 (Modus Tollens) to give Lemma 6318861: ..." You could easily imagine writing a navigator for examining such logs and using it to investigate a whacked-out decision to try and diagnose why it went down the rabbit-hole it did.



  • @Benjamin-Hall said in Good reading for self-taught programmers?:

    It wants software to be "smart" and "proactive", remembering everything you've done and trying to apply it, relying on undo rather than asking.

    I had forgotten how infuriating was chapter 8 before I got to re-read it. I always remember examples of software trying to be "considerate" in terms of the book, but failing badly. Perhaps Cooper et al. would argue that the programs were :doing_it_wrong:; I just think what a privacy nightmare it could be made into. Bloody software! I don't want a program that learns! I want a program that stays stupid!

    (In the spirit of advocatus diaboli, perhaps I'm just jaded by software that tries and fails to be considerate and hate the idea of "smart" software because of that, but maybe could find a really considerate program convenient. I don't know; I've never seen one that was.)

    For me, useful lessons start approximately from chapter 9.



  • My own quest for The Book on Architecture has yielded Clean Architecture: A Craftsman’s Guide to Software Structure and Design
    by Robert C. Martin
    . I haven't finished it yet, but I think it's good. It's not only about patterns, it dips into fundamentals where needed, but it doesn't stray too far from the main path.

    It also has funny pictures.
    functional.png

    Evidence-based Software Engineering has been sitting in my reading list for a while. I like the idea but I don't know yet how well it's been implemented.

    I've also read Systemic Software Debugging by Per Mellstrand and Björn Ståhl. Given your experience, it's unlikely it would tell you something you don't already know, but maybe it's helpful to just skim it.

    SICP was fun, but I'm not sure how useful. Knuth is very fundamental, I didn't have enough free time to do it justice.

    A Description of One Programmer’s Programming Style Revisited is just fun to read. Very :belt_onion:.


  • Banned

    @Benjamin-Hall said in Good reading for self-taught programmers?:

    If a browser started to pull all the links on a page in anticipation of me viewing one, I'd be furious.

    Who wants to tell him?


  • Banned

    @aitap said in Good reading for self-taught programmers?:

    My own quest for The Book on Architecture has yielded Clean Architecture: A Craftsman’s Guide to Software Structure and Design
    by Robert C. Martin
    . I haven't finished it yet, but I think it's good. It's not only about patterns, it dips into fundamentals where needed, but it doesn't stray too far from the main path.

    It also has funny pictures.

    There's also a 20-hour video version with tons of Star Trek cosplay, if that's your thing. At my first job we were required to watch it all (on company time so I didn't complain.)

    It's the book we argued over with @MrL in another thread a few days ago. It's a weird one. It's absolutely full of knowledge that's very good to have, but you shouldn't actually do anything the author says you always should do. But it's great to keep it in the back of your mind, there's many useful tips in there for things that constantly come up on the job. And the best explanation of SOLID principles I've ever seen (at least in the videos, not entirely sure about the book.)



  • @Gąska I think you mean https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ but it’s far from every link on the page, it’s selected by the web site itself if it wants to hint it and I think only Firefox implements it at the present time.


  • Banned

    @Arantor Chrome has it too, controlled by setting "preload pages for faster browsing and searching". Not sure if it's enabled or disabled by default. IIRC they were actually first to implement it. And since every browser is now Chrome, every other browser has it too.



  • @Gąska <link type=“prefetch”> was in Netscape 7 and FF1, it’s older than Chrome. But it’s still the server saying “here pre-load me these pages next” rather than the implied “speculatively load everything”.

    Browsers can do this but Chrome and friends generally don’t because of what Firefox learned back in the day - too many apps have things like logout links as regular links, plus apps that have other data-changing behaviours on GET requests.


  • Banned

    @Arantor I distinctly remember this feature being touted as the latest and greatest in browser technology that makes everything faster, no more than 10 years ago.



  • @Gąska I mostly remember the articles about the fallout from it prefetching links it shouldn't have. I'd guess it existed for a short while, but since getting people to fix their wobsites is more or less impossible, browser developers clued up and removed/restricted prefetching.

    But, yeah, I too remember it being a thing at some point.



  • @aitap said in Good reading for self-taught programmers?:

    A Description of One Programmer’s Programming Style Revisited is just fun to read. Very :belt_onion:.

    A decade later the author feels that programming productivity in our “post modern” world has decreased sharply from 1990 to 2000. Many of the reasons for this decline were discussed in the original version of this paper. Our pleasure in prescient prognostication is mitigated by frustration with the “dumbing down” of computing in general. Based on this unhappy downturn of programming education and style, we have added materal (in italics) emphasizing areas of recent concern

    I wonder what's his opinion of present-day NodeJS 🤔


Log in to reply