Good coding books (yes, I’m old)

Are there any books the seasoned programmers would recommend?

Obviously everything is accessible online but I’d love to highlight and post-it note some pages.

I’m thinking topics that endure like writing clean code, algorithms and data structures…
TIA

The major ones that are brought up on many a list:

  • Clean Code by Robert Martin
  • Refactoring by Martin Fowler
  • The Pragmatic Programmer by David Thomas and Andrew Hunt

My personal favorite:

  • Growing Object-Oriented Software, Guided by Tests by Steve Freeman and Nat Pryce
5 Likes

Legend - thanks Colin. Definitely most interested in the personal faves.

I’m just a kid (66 years old). I had a bad experience with my algorithms course at Stanford being cheated out of my grad certs in Advanced Systems and Databases by a faculty that broke their own written rules apparently to favor on-campus students. But I still love the school. I cannot name any specific books, but you might want to check out anything by John Ousterhout. And even though I got into an argument with Jeffrey Ullman over that algorithms course, he and other Stanford professors are quite amazing. You might want to check out his book on finite automata. For networking, my professor was Craige Partridge. He’s a nice guy, very personable, and very, very knowledgeable. He is referenced in most networking books. And one all time favorite writer on Network Programming is, of course, the late W. Richard Stevens. I believe I have three of his books, TCP/IP, another explaining the source code of TCP/IP, and another for network programming. These, of course, are in C. As for databases, my professor was Serge Abiteboul. In his pictures on the web, he’s smiling, but he’s quite serious and a little stern in person, but very, very good–very rigorous. If you study his works, prepare to study relational calculus and relational algebra and comparisons of the coverage of both from a mathematical perspective. Be ready for database optimization, distributed transactions, etc. For machine learning, Andrew Ng is great. Geoffrey Hinton is a perfectionist–rigorous, and not so cheerful–somewhat stern, but you’d be surprised to find a pretty genious sense of humor. Anything by him is bound to be great. Oh. If there’s anything by Nick Parlante, he was my teacher at Stanford for Software Engineering in C.

All of this may seem really, really old as I studied there in the mid-1990s. But for me, I kind of go back to the mid 1970s with BASIC, Fortran IV, COBOL, old assemblers like IBM’s BAL, Modcomp, Cyber, 8080, 6502, etc. I saw a new language come out of UCSD called Pascal :-). I was an IBM mainframe programmer when the IBM PC first became available, and I started programming it in Microsoft compiled Basic and Pascal as well as DB II. Actually, I sort of reverse engineered that database, which is good for learning but not good for actual production work. I dabbled in Lisp and Prolog but did not get into neural nets until the 1990s when I wanted to use them with TradeStation to build stock investment systems. Then in 2001, I went through a divorce and didn’t get back into neural nets until just a few years ago–perhaps 2016 or so.

Going back to programming, the reason I brought up John Ousterhout, a professor I never studied under, is that there are many perspectives and strong opinions whether object oriented programming is good or evil, whether it’s better to use strictly typed languages or ones like javascript where you might have enough freedom to shoot yourself in the foot. You may find it interesting how languages evolved. Sounds boring? Well, originally, you plugged in cables and flipped switches to program in binary. Then assemblers let you use commands like LDA for “load accumulator” or “JMP” to jump to an address. Most used hexadecimal rather than binary and macros allowed you to reuse code very easily. Then there were compilers that translated languages into binary code, or actually into assembler. But then it became helpful to compile programs into modules and reuse those modules storing them into libraries. So, then you had link-loaders that would combine that object code into binary executables. Languages like COBOL, Fortran, and such were compiled while BASIC took a different approach. You would run your Basic programs inside a Basic interpreter which would read each line of code, translate it on the fly and execute it, then go to the next line and do the same, and so on. It ran slower–especially if you had a FOR loop that ran a million times as you might have to re-interpret that line a million times. And people started to optimize. They optimized both compiled and interpreted code. Some produced “just-in-time” or “jit” compilers so their programming language would enjoy the benefits of an interpreter with its ability to run code immediately while enjoying the speed of a compiler.

One programming language called “Forth” introduced the idea of a TIL or threaded interpreted language. It was stack oriented, sort of the way that HP calculators are somewhat stack oriented rather than being algebraic. You push a couple numbers onto the stack and tell it to add. The forth interpreter would take the top two numbers on the stack, pop them off, add them, and push the result back onto the top. And when laser printers became popular, one language called Postscript was also designed as a somewhat stack oriented language. HP had their own language and that seemed to pass up Postscript.

But you can start to see that so many languages developed over time. UCSD came up with Pascal which could be compiled on one machine into something called “p-code”, which is similar to the way Java compiles into a byte-code. Then the pascal runtime would run the p-code version of your program. Borland came up with a version of Pascal that compiled into machine code and ran really fast for that time, and it became popular with students at universities in the early 1980s. I used it and tutored many students in that language myself.

But then a CSci student friend of mine told me about this cool new operating system called “Unix”. I bought a book and read it cover to cover and then resigned my job to volunteer at Fresno’s Veteran’s Hospital working for a Neurologist and Psychologist doing research into the effects of damage to the parietal region of the brain–specifically how it affected the speed and accuracy of the subject’s ability to detect left-right and right-left movements visually. Programming in C on the PC and on the Vax running 4.2 BSD unix came naturally, and I had a great time doing it. And then I went into systems totally unprepared. At Fresno State, a system administrator handed me 9-track tapes for a Vax 11/730 with 1 meg of RAM and 110 meg of disk. Not gig. Not terrabytes. Megs. The machine was being switched back and forth from Unix to VMS on different days of the week. The sysadmin left for L.A. and for me, it was sink or swim. I learned fast, but sometimes, with the politics of a university, it could be a living hell. Other times it was a joy, and I became close to several Indonesian students. This started me down a path that would change my life forever. I ended up at an Indonesian church married to an Indonesian woman, and I learned the language. I moved to the bay area and worked for NASA, Ingres, Oracle, PeopleSoft, and then a startup called Clickmarks. During that decade and a few years, I was fortunate enough to study at Stanford and to be trained professionally by several companies in systems, databases, project management, customer support, people management, and various applications. That, and the wonderful experience of being a dad to an amazing daughter. Then I had the gut wrenching experience of divorce. I returned home to Fresno to heal and deepened my web skills. Years later, I remarried, and returned to software architecture and development in PL/SQL and Perl and later supported Epic systems at a local healthcare organization for a few years. My parents became frail, and by the time we moved in to care for them, we had a baby son. I lost my mother in 2014 and worked on developing my virtualization and DevOps skills as well as mobile development, and then returned to studying machine learning and artificial intelligence, which I am still doing today.

So, what language do I focus on now? Python mostly. The libraries available to Python are amazing. I’m about equally comfortable in Windows, Mac, Linux, and most variants of Unix.

I told you I was old. But I think you’re in a great place for studying today’s languages.

I’d look for books on concepts including old ones–structured programming, modular programming, DRY or don’t repeat yourself, Object oriented programming, why it’s loved and hated, functional programming and the use of immutable variables and its effect on multi-threaded programming, or the concept of thread-safe programming. One thing of extreme value are concepts around UX/UI and design, but not to confuse them. Also, data modeling, and software development related to project management–concepts such as Agile, Kanban, and as for PMI related project management, you may want to limit yourself to the 1997 one rather than the whole PEMBOK which could demand that you become overwhelmed with things entirely unrelated to software development. You may want to study product lifecycles, versioning, oh, and GIT, github, etc. And Docker. And consider kubernetes and micro-services. Docker containers are sort of like tiny, mini-virtual machines, but not really. They’re actually more like single processes that ordinarily serve one function. They don’t require a boot-up of the operating system. But they have much of the isolation of a separate machine. They run inside an already running Linux kernel.

Well, computer science in general is so wildly massive. And by the time you barely begin to learn a big part of it, there will be so much new stuff invented that you will have more to learn than when you started.

I hope this massively gigantic reply was helpful and not irrelevant or boring or overly random. But I think freecodecamp is an awesome place to learn.

I’m finishing up my specialization through DeepLearning and Coursera from Andrew Ng and am going through an AI and Machine Learning bootcamp at this time, too. The latter is expensive. But I wanted the practical training in addition to the theoretical training I got through Andrew Ng. Plus I thought it might be nice to have both Stanford and Caltech on my resume. So there’s a little bit of a vanity thing going on with me.

In the end, here I am at age 66 wondering what i am going to do when I grow up. When you say you’re “old”, I hope you’re not old like me, but it is great to be actively learning at 66. It would be cool to be much younger, but then I would not have the kids or wife I have now, and that’s a blessing I would never want to give up.

Best wishes from a very verbose man.

2 Likes

Hi Daniel,
This was great. I liked reading about your adventures through the evolution of computer science/programming. It sounds like all that learning has kept you young! Something I’m definitely about.

There’s lots here for me here to ponder, so thank you. I’m starting a job in November in a grad program where I’m likely to be the only person who doesn’t hold a degree (and the only person over 25 haha) so I’m trying to bridge that foundational knowledge gap as best I can between now and then. :nerd_face:

1 Like

I found Don’t Make Me Think a good read, semi-related. Cracking the Coding Interview is a classic, too.

4 Likes

Is there a particular subject that you’re looking for a book about?

1 Like

Was the first book in mind when I read Karolines question. I like the Reilly Books most when it comes to coding. It is purely information. Latest bought this year is the latest version of Javascript
Link: JavaScript: The Definitive Guide, 7th Edition [Book]

The problem with coding books is they are old when printed. But I agree with you, I can’t watch 18h on a screen and the touch of a book will never be replaced with some electronics… (I am 36, not sure if that is “old” but probably “patinated”) :smiley:

2 Likes

Ha! A new word for me, and much more intriguing than old. I’m 40 this weekend (and don’t really feel old at all, except while learning to code).
Thanks for weighing in with your thoughts!

Thanks for asking Ariel - I was vague because I’m finding that hard to answer. Maybe my intention would help more than an area of interest:

I’m beginning an entry level job in November. I’ll have spent 9 intense months learning some C, Python and Javascript (I’m just arriving at the end of 3 months with C now). My colleagues in the grad program I’m joining will (most likely) all have finished undergrad degrees, maybe even postgrad.

I’m very lucky to have a place in this program and also aware that there’s going to be a gap between my knowledge and that of the grads - I want to bridge that gap as much as possible between now and then and thought some solid computer science books and “be a good programmer” books might help. Not so much language or area specific as I think there’ll be time for that later. Maybe a book on agile would be helpful?

I’m using git daily and working on group projects, branching, merging etc so I feel like I’m going to have some decent skills under my belt, but nervous about the necessary foundational knowledge I’ll be missing (as distinct from the superfluous uni info that I’m happy I’ve been able to avoid).

Sorry, such ramble. Probably doesn’t help to orient things but it’s my best shot.

1 Like

What sort of grad program? What’s your undergrad in? The needs of different grad programs vary, but really some foundational logic and programming skills with the ability to dig into documentation and the willingness to experiment will get you pretty far.

Context: I started with a math undergrad and just finished my grad degree. I now work as a programmer for academic software.

Well, that’s the thing, I don’t have a degree. I received a scholarship from a betting and gambling company here in Australia to take a 9 month computer science/programming course. They were doing it as an initiative to get more women into tech and because Australia has a severe tech skills shortage at the moment. Over the last 3 months I’ve built a solid relationship with them and when I asked if I might be able to secure an entry level position with them in November, they offered me a position in their newly created grad program. They said it was also for career switchers but now I see the ad for it and they’ve only targeted people with undergrad or postgrad in IT, engineering or design.

And so naturally I’m freaking out.

A tech-based one? Sorry, bit naive. Here is the ad for it: Junior Software Engineer - The Draft - Melbourne, VIC, Australia
They’ve been pretty vague on the actual program details (still designing it, I think), but it says: “You will have the opportunity to work on both big and small projects and autonomously write secure, stable, testable, and maintainable code with minimal defects. You will be working with the latest technologies within a super talented team to build and deliver amazing customer experiences.”
I don’t think it’s a cycle through the business experiencing different areas kind of program.

Understandable. It’s a tricky situation.

It would probably help to get a list of skills/knowledge they expect people starting the program to have.

1 Like

Ok. I think that some of the confusion just comes from language differences. In the US, the term “grad program” refers exclusively to being enrolled in a postgraduate degree.

The posting you shared is definitely a little confusing. It’s mostly written as a typical job description, but it also refers to some sort time period after which (all? some?) people will be offered full-time positions.

Since this seems to be a job (with a training period), I would focus on practical skills more than trying to gain parity with any cohort members that may have a CS degree. The relevant information seems to be “Java, Node, cloud infrastructure, domain modelling and event driven architecture” and " java, React, Python".

You seem interested in studying some of the concepts, more than the specific technology, so from that list the research topics seem most likely to be domain modelling and event driven architecture, but those are probably going to be most likely found in online articles than books. At least, I don’t have any books that I can recommend.

In terms of more general “good books to read if you’re going to be a software developer”, one of the most recommended classics is " Clean Code: A Handbook of Agile Software Craftsmanship" By Robert Martin (aka Uncle Bob). It’s a bit dated now and has some rather arbitrary specific recommendations, but if you focus on the concepts rather than the details it’s still a good guide to thinking about writing good code (assuming that you already can write working code).

If you want some physical books to look up references in various languages, the O’Reilly “animal books” (they have animals on the cover…it’s a thing) are sort of the default standard. If you want to really learn a new language from a book, Paul and Harvey Deitel have good books for C, C++, and Java - and you can often by old copies of previous editions very cheaply. I learned C from “C: How to Program” and C++ from “C++ for Programmers”. Their approach is very code-heavy.

2 Likes

Same for me with 36. But with a good patina you can tell the youth how it was in the “early days” with 56K modem, self-made endless loops for XAMPP servers, when everyone thought Javascript is made from the devil (before they put it into the sandbox concept) and you had the flash installed instead… Hard to imagine for a new Gen with tablet, smartphone and bad vibes when the wireless connection goes down a millisecond … :smiley: /Grandpa talked now enough about the stone age/

1 Like

Gambling sector requires a quite specific set of stuff. You need [soft] realtime systems, and you need to deal with loads that can spike an enormous amount. You need hefty security (edit: of a kind, people not cheating is more important than anything else). You need to be able to track events chronologically in a sane manner to avoid cheating. It’s heavily regulated, there are very specific legal constraints that are jurisdiction-specific, often at local level. Then the company in question’s systems are Java-backed (OO), but at same time if it’s event sourced, immutability is highly important (so FP techniques are also v important).

So the key domain modelling book is Domain Driven Design by Eric Evans. I find it incredibly a little dry, but YMMV. It introduced a language for talking about DDD - overview from Martin Fowler here. Definitely worth giving it a go, it’s not a big book & it’s considered the touchstone.

Versioning in an Event Sourced System by Gregory Young is very good; obviously specific to versioning software, but the writer is good, and sometimes having a specific focus can help with understanding the general subject (did for me, anyway).

Other stuff pulled out of a list I keep of books/papers related to software design I refer back to regularly, contains things that you may find interesting and informative*:

nb: quite a few of these books involve languages you are not going to be using: I personally don’t think that matters an awful lot, they’re just about concepts, but YMMV

  • How to Design Programs by Matthias Fellieson et al. Using the language Racket, demonstrates a method for constructing programs. There’s a very good course based in it that used to be on Coursera at one point, I think it’s all on YouTube now.
  • A Philosophy of Software Design by John Outerhout. Concise, some pretty excellent advice. Here is a set of notes on it.
  • Thinking Forth by Leo Brodie. Using the language Forth, demonstrates a method of breaking down and thinking about problems. Fully applicable to any other language, very readable, doesn’t require any use of Forth to benefit from the book.
  • Algorithms + Data Structures = Programs by Niklaus Wirth. Uses the language Pascal to build a simple compiler. Language is a bit dated (edit: as in the actual written language – for example the programmer it is adressed to is a he). His explanations of fundamental data structures are better than anything else I think I’ve read.
  • Concurrent Programming in Erlang by Joe Armstrong/Robert Virding/Claes Wikstrom/Mike Williams. Erlang is a language designed for building extremely reliable concurrent systems based on passing messages between processes. It’s used quite a bit in the gamblng industry (it’s primary function is soft-realtime systems, so it’s a good fit), and even where it isn’t, the way it works is something that is very useful to understand. For example, see the Java framework Akka, or Microsoft’s Orleans framework. If nothing else, read Joe Armstrong’s PHD thesis Making reliable distributed systems in the presence of sofware errors (don’t panic, he’s a good writer). There is a movie, too: Erlang: The Movie - YouTube
  • Programming Object-oriented Design in Ruby by Sandi Metz is just a really good book on OO design. In Ruby, but the advice is pretty applicable anywhere.
  • Probably the Gang of Four book, Design Patterns: Elements of Reusable Object-Oriented Software. However, if you use it prescriptively and think “that’s that”, you’re likely going to end up with a solutions in search of problems. If you use it more as suggestions to build on (as is the intention of the book it tries to emulate: A Pattern Languge), then that’ll likey be a lot more fruitful. It’s a shortish book, extremely influential. Head First Design Patterns is imo a pretty good alternative for exploring the different described patterns (if the humour in the book isn’t too grating).
  • Concepts, Techniques, and Models of Computer Programming by Peter van Roy. This is the “Oz” book: it uses a language called Oz [that afaik is used exclusively for the book] to teach [all] programming paradigms. It’s massive a wee bit chunky. Very good though, here’s a chapter.
  • Managing the Development of Large Software Systems by Winston Royce. This is the “waterfall paper”, it describes how waterfall works/should work, and is useful to know about. Just a paper, v short, v readable. Oh and compare with The Agile Manifesto**.
  • Big Ball of Mud by Brian Foote/Joseph Yoder. Describes systems that…well…are big balls of mud. Just a paper, v short, v readable.
  • 7 Languages in 7 Weeks and 7 More Languages in 7 Weeks by Bruce Tate. Nice compact introduction to 14 languages (Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell, then Lua, Factor, Elixir, Elm, Julia, MiniKanren, and Idris). Very useful for getting a taste of different ways of approaching problems. Only issue is that basically all the languages have been updated since the books were written. If using the latest versions of given language whilst trying to follow a chapter, one can end up bogged down on Stack Overflow trying to translate things that don’t work now into things that do work.
  • Umm, and why not, a series of very serious blog posts related to interviewing: Reversing the technical interview, Hexing the technical interview, Typing the technical interview, Rewriting the Technical Interview, Unifying the Technical Interview
  • umm and also why not, this very important article: Programming Sucks

* nb I always hate being recommended books, they normally just sit mouldering in a stack while I read ones I actually picked myself. So make of this list what you will and just ignore it if you’re anything like me

** Regarding the latter, and I particular its application to DevOps, The Phoenix Project is highly regarded. But I generally hate didactic novels and so I hate it on principle (and hated it in practice, it’s a novel about DevOps, christ) so can’t recommend it personally

5 Likes

You are not old! I was in college before the world wide web even existed. Now that’s old :slight_smile:

1 Like

There is far more goodness and guidance here than my wishy-washy question deserved. Thanks very much, everyone - but especially to @ArielLeslie for helping me get clearer on the role-specific focus areas, and to @DanCouper for the awesome reply and industry-relevant info.

The weight of how much I don’t know felt heavy for a moment there but I’ll just start eating this elephant with a few little bites, being the following books to be read between now and November:

  • Clean Code by Robert Martin
  • Domain Driven Design by Eric Evans
  • Concurrent Programming in Erlang by Joe Armstrong/Robert Virding/Claes Wikstrom/Mike Williams
  • Algorithms + Data Structures = Programs by Niklaus Wirth

On the languages front, I’m a good way into C (recently struggled through co-writing a basic shell program). I’m about to start Python in the course I’m enrolled in and I was going to attempt to learn Java on the side - but then I remembered I’m not a robot and have a family to enjoy soooo Java can wait a bit.

On a side note, having actually turned 40 over the weekend, I’m going to stop thinking of myself as old in terms of this new career. I said it tongue in cheek on this post, but the truth is, I still do feel age-conscious heading into tech - even though I’m successfully learning the content of my course, and even though I have an entry-level job under my belt… It’s my thinking that’s dodgy, not my age. Although, my thinking could be a result of my age… but let’s not haha

2 Likes

I really like Clean Code by Robert Martin. Jue cool tips really. I’ve been spending more time reading fiction lately. One of the books that has really impressed me lately is Into The Wild. At Best Into The Wild Essay Examples on Artscolumbia you can read some interesting articles about this book and its impact on world literature.

1 Like