To my surprise, lots of people regularly ask me where I learned to program. I have lots of posts on the subject and even multiple categories on the blog concerning the topic but maybe they’re “too disguised” under obscure titles for willing learners to actually find them. So I decided to give you a short summary with the key takeaways of what I’ve written on the topic so far and the most important links – boths to my other detailled blogposts and also on the resoures I would recommend as of now.
However, before the “short summary” of takeaways and suggestions for willing learners, let me start with a deep dive into the very personal side of the question “Where did you actually learn to program?”.
Now where did I actually learn to code?
To answer the question “Where did I actually learn to program?”, we need to talk about my journey first. And..
Well, in order to answer this you first have to accept that I do know how to program as a first proposition (and “knowing how to do sth” of course always is a somewhat ambiguous term since it covers anything from barely fluent to absolute pro). But since a computer science buddy just recently told me he thinks I have turned into a “geile Coding-Sau” to quote the exact words.. how can I translate that to English? 😉 Maybe a cool coding ninja 😀 Also, in case you speak German, it definitely was meant as a compliment in the best (non-sexist) way possible, albeit the statement being somewhat ambiguous in that domain 😉
So now we’ve cleared that up, I’m going to take you on my long and winding journey to get where I am now. And brace yourselves, this is a long story. Feel free to skip to the bottom if you’re only interested in the practical starting points. TL;DR is: The journey will be messy and there is more than one possible way.
Actually it started way back in my late childhood / early youth, although I was far from what you would generally think of as a classical “computer kid”. I quickly was better at computers than my parents but that wasn’t a big deal. I loved to play the SIMS and download lots of additional stuff on the internet which made my computer so slow that I litterally had to wait 30 minutes for the SIMS game to actually start up 😀 Man, those were the good times when I still had lots of free time on my hands. I also modified some textures but my results.. let’s say they were kinda sub-par 😀
So you could say I tended towards a “super-user mindset” from early on. Even though I never did any really advanced stuff, I liked to tweak things and use the capabilities of computer beyond what the Graphical User Interface readily provided. I think I first brought up the term “superuser mindset” in the last issue of TUGboat in the proceedings of my TUG2020 talk on “Didactical reduction versus references. How to better teach LaTeX” and have found this Linux style distinction of “user versus superuser” very helpful. Also regarding the discussion of “digital/numerical/computerational Humanities” versus “digitized Humanities”/”label DH”.
Later I had a homepage. I don’t know if you remember but back then, there used to be these little HTML generators where you could input your first name and then it would output a scarily glittery and flashy and blinking image-y thing where it added a characteristic beginning with the letter of your name, for each letter of your name. I thought that this was the summit of awesomeness at the time.
In order to do some more complicated (yet ultimately utterly senseless) shit, you needed to manipulate some HTML. Then I took up the hobby of creating website background images. That was at the time when browser backgrounds all had the same dimensions (something like 1024×768 pixels), so you could just input your elements into the graphic. You would then locate the pixels where the HTML was meant to start and place the elements there. Then you could use some CSS which I didn’t do very well but I managed to play around with it alright. Btw, I’m not sure if I was the only person in the world creating websites like that. If you, too, remember this time, please let me know!
Well, now you’d maybe expect some glorious story about how I learned to program and whatever but no. I never learned to program. I never even really went back to these cringe-ily bad skills I had developed in my nightly interactions with the web (creating templates for the blog I had back then, we see some precedents to the Ninja here 😉 ).
Hiatus at university, then LaTeX
I went on to graduate from school and enrolled at the University of Graz to become a Latin teacher. No more coding ever.
But wait.. this is where LaTeX comes in!
My back-then ex was in computer science and when I had to write my first term papers, they suggested I use LaTeX. I then was handed the Technical University of Graz’s corporate LaTeX template and some modifications were done to make it useable for Humanities seminar papers. Which was a challenge actually because each and every lecturer had different requirements when it came to citation styles. I used LaTeX for a few years and learned some skills debugging and typesetting my master’s thesis (more on my LaTeX journey here).
At this stage, maybe one could say that there were more signs of me being more persistant than others. LaTeX never scared me. I just learned how it worked and used it. Other people might have never considered using it because it was different from GUI WYSIWYG softwares like MS Word, while I never questioned it. I think maybe that’s because it had seen code looking different from the GUI “behind the scenes” in my youth tweaking blog templates.
In the TUG 2020 talk cited above, I also introduced the term “tech privilege” (analogous to male or white privilege), i.e. being in an environment which encourages you to improve at tech stuff. Maybe that’s what I had? Maybe it’s a character thing of having the traits of what we nowadays refer to as a “nerd”?
Even though I find today’s “nerd culture” very problematic as mostly white male privileged people identify with it and it seems to me a disguised continuation of the 19th century idea of “genius”, even though it’s mostly a socially-learned behaviour (and a label assigned to/reserved for those who are part of what Muslow might call Wissensbourgeoisie) that should say nothing about your skills or “talents” (if we agree talent exists). If you find these discussions interesting, stay tuned. There will be some DH and empowerment reflections coming in vDHd2021…
My LaTeX code didn’t always compile but I learned to take care of errors at least enough so that it would compile again. (Actually solving errors which don’t hinder compilation (and warnings) still is one of my bad habits from back then, but I’m starting to have a more rigourous code of conduct for myself now :D)
Stumbling into DH
At the time, it had been dawning on me for a relatively long time already that becoming a teacher (like all my family) probably wasn’t for me after all. I love teaching, I write tutorials here, I really like it in a university/DH setting but I really don’t appreciate playing the mean parent part for families who didn’t think it necessary to parent their own children.
So I did a BA in Archaeology, went for a semester abroad in Montpellier (which also allowed me to rethink my life on a broader scale) and when I came back, I went on a “get all the certificates you can get at Graz University” (in the Humanities) binge. And one of them happened to be the DH certificate (“Information Modelling in the Humanities”). I took the (actually sequential) classes on XML and XSLT in the same semester to save me some time and I have to admit that I wasn’t all that interested in the beginning. For the first three or so homeworks, I actually had my computer scientist do them for me minutes before the deadline 😉
But at some point, when XSLT came up, I was surprised to find that it had suddenly “clicked” even though I hadn’t really been trying at all. And then it was fun. And then I immediately got my first job in the DH and I was hooked ;D
Moving on to deliberate practice and professional usage in my job
I learned lots of bits of programming in one-semester-classes (Java), or summer/winter schools (NLP in Python) but I worked mostly in XSLT and was starting to think about my PhD project. At the same time, I also started taking classes at the Technical University to learn some actual programming (C, C++, Java, Python, etc.).
I also had a quite rigorous routine of waking up early every morning to do exercises on Hackerrank and read lots of computer books. (I’m an obsessive type, as you can tell :D)
I also started the LaTeX Ninja blog (and project), so that meant starting to create my own templates and learning TikZ. I actually think that a big part of learning to program actually came from LaTeX, even though some people don’t really accept it’s “actually programming”. TikZ was my way of understanding visualization and graphics programming. And my first interaction with LaTeX as an actual programming language. I took this learning very seriously and I think I learned a lot. Damn, I should have probably posted about it back then because it’s already pretty hard to remember now.
Oh and also I worked in a project as the technical employee, so that meant I did everything from thinking up a suitable model for the data in TEI, transforming it from Word template to TEI, using the TEI source to generate web views and LaTeX print output, all using the GAMS infrastructure.
So what are the takeaways?
Well, like I said before, it has been a long and winding journey. On the other hand, the point where I was launched into a more active pursuit developing my programming skills has only been in 2016. So that’s about four years. Now four years are a short time and a long time.
Let me explain: If you want to get something out of coding in the short run, four years are terribly long. If quick wins are all you care about, it’s probably not worth it. But then again, if you think about this like an investment in the future, four years are really not all that long given all the stuff I did and all I learned in that period of time.
Like I said, maybe I pursued this in a more obsessive way than other people would. But four years also aren’t that long given that I had a paid job which had something to do with my coding progress right from the start. I was able to develop my skills as I went along. But, it also has to be noted that I took it very seriously to get in deliberate practice (a routine combined of coding exercises and reading, for about one hour each morning before admin tasks and meetings started).
I can’t guarantee you’ll have sustained progress if you only use the skills you already have (in fact, I think you very likely won’t). But if you make deliberate practice a habit and just manage to stick around long enough, you will eventually get there. It takes persistence, yes. There’s no way around that.
But it also means that you will gain considerable (and probably sufficient) proficiency basically by only sticking around. So also don’t get discouraged if more seasoned colleagues are more proficient than you. It doesn’t necessarily mean that they have more “innate talent”. Likely it’s very achieveable for you to reach the same skill level as them if you just keep around and add a little bit to your skills every once in while as you go along.
Please note, too, that learning in a sprint at the beginning and then just using your skills will get you some experience but it has been shown by the science on expertise that there really is no way around deliberate practice if you actually want to improve. The lack of deliberate practice might even be the reason why you feel that you have hit a plateau in your progess even though you’re, for example, working in the DH full time. If you want further learning to occur, you need to constantly challenge yourself, identify weaknesses and strategically work on them. Just doing what you already know how to do very well, without having to think about it, will not give you sufficient stimulus for further learning to occur!
The best way to ensure that constant stimulus, in my opinion, is setting up a daily routine, preferably in the morning before starting your day (or any other time of day you can spare), for deliberate practice. This is the most reliable and thus, in a way, simplest path. It will also make sure you learn about some theoretical concepts or things you don’t currently need as opposed to just need-based (“on demand”) learning – which will give you the best practical output but will also ensure you likely will never get around to learning high-level concepts. However, while starting a daily habit of deliberate practice might be simple, it’s not easy. Maybe you can use a #100DaysofCode/#100DaysofDH challenge to your advantage.
(I’ll LINK a book review on Anders Ericsson’s (science-to-pubic) book on expertise and deliberate practice here soon. Many of my other posts on programming progress have also touched on this topic.)
But would I recommend you follow the same path?
So in which one of these very many steps I just recounted did I actually learn to program? Well, I’d say it’s a journey and none of the places was the definite thing. The gist is that there’s more than one way.
You need to find some joy in programming to succeed
The takeway for me is that it probably wouldn’t have worked if I hadn’t been passionate about it. If I hadn’t been humble enough to be a noob at something right after having finished a degree in my field and feeling (kind of) like an expert. This is where – I think – I have seen most humanities people fail. They never got to the point where they enjoyed the game and challenge that is programming because they never admitted that they didn’t know how to do it to begin with.
You also need to live with your own incompetence. If you can’t accept that and aren’t willing to ask for help, it ain’t gonna work out for you
Accepting your own not-knowing is not only very Socratic, it’s also necessary if you don’t want programming to become a pain. And don’t get me wrong, programming will still be a pain many times (error messages, program doesn’t compile for no apparent reason, etc.). But it can also be a joy. (Read about my experience rediscovering the fun of coding after a long period of dissertation writing.)
I have seen in many (especially seasoned) Humanities scholars that they didn’t want to start from scratch again after already having completed a PhD and being an expert in their sub-field. It’s undertsandable. But also, be honest with yourself: If that’s you, DH and programming probably won’t be for you. And it doesn’t have to be. Not everybody is meant to do that and it’s not the only way to success in Academia. Do what you do best. But give yourself some time to actually try digital stuff. If your digital literacy is very sparse, expect this process to take a bit longer.
If you have read my programming story, you will have seen that even for me it was a long and complicated process to where I am now and even here, I still have lots of learning to do. Even though I didn’t start as a complete idiot when it comes to digital stuff. Also, don’t get me wrong: It’s ok to be an idiot at first. You will learn faster than you think but it’s an endurance sport. Essentially, you need to make a lifestyle change and commit to learning every day.
No way around lifelong learning
Which gets me to the next point: Lifelong learning is a necessary requirement. If you can’t do that due to some circumstances or aren’t willing to, then maybe now is not the best time to start.
So what would I actually recommend?
In this part, I’m trying to limit myself to my most important suggestions. You get extensive lists and explanations in my dedicated blog posts on Learning Programming from Video Tutorials and How to improve at programming when your current position doesn’t require it & Online Learning Resources.
HackerRank for exercises, Blondiebytes and freeCodeCamp for videos
I would probably recommend HackerRank – but use it for some deliberate practice (like explained in this post). One of my absolute favourites on Youtube is BlondieBytes (she also created Hackerrank’s 30 Days of Code challenges which are really good!) and freeCodeCamp also has developed a huge series of Youtube tutorials (I never liked their text-based stuff so much but video tutorials can be helpful if used deliberately, like I explain here).
Learning from books
I also definitely still like learning from computer books – but I often feel like I’m the only one ^^
Starting points on this blog
If you’re looking for starting points, consider checking out my blog categories Learning to program, Programming and Learn DH Crashcourse. Also, if you’re a complete noob to programming and don’t know any of the concepts (algorithm, function, etc.), read this post first: Algorithms, Variables, Debugging? Intro to Programming Concepts.
To get started with DH more generally (and also very basic programming), consider my tips in: What are ‘real’ Digital Humanities and how to get started?
Common advice: Start working on a private project
Maybe starting a #100DaysofDH challenge might work for you as a starting point (see things to look at in the #100DaysofDH Category). This is especially good if you want to work on a bigger project which you can then use to show off your technical skills on your CV if your current job doesn’t really allow you to demonstrate them. Having a project with some concrete result is often named as a remedy for being stuck in “tutorial hell”.
So, these are my tips for today. I hope this helped someone gain a better overview!
Hopefully see you soon!
Buy me coffee!
If my content has helped you, donate 3€ to buy me coffee. Thanks a lot, I appreciate it!