Learning to Learn#
Learning is a life long process, and learning computer science is no different. This set of articles serve to be an overview to some of the areas of academics and life that I get the most questions about. Think of them as something between a frequently asked questions and an introduction to a topic.
What order should I tackle these? The articles are grouped by topic, so you can start reading through them according to the topics you are interested in. However, if you have no idea of where to start, consider reading the articles in “Meta” first. These articles will better equip you to read and get something out of the other articles
Along the way you will find activities added to each post formatted like this:
- This is an activity designed to help you master the content in this section
Lastly, if you find the articles insufficient in some way, please email me, and I’ll try to make updates to fill out the missing information
Process#
- Linux how to get started with learning and using Linux
- Software Development how to approach writing a software project using Linux
- HPC how to write software for High Performance Computing
- Experiments how to write empirical computer science experiments
- Software Teams: how to lead and be an effective member of a software team
Programming Languages#
- C++ how to learn C++, a low-level systems language that helps you get the most out of your hardware
- Python how to learn Python, a high-level programming language aimed at developer productivity
- CMake the defacto C++ build system
- GDB the most commonly used open source debugger for natively compiled languages.
- MPI the defacto parallel processing framework in C++ for HPC
Most Recent Updates#
Outside of school very seldom in software development will you completely work alone on a project. Leading and being an effective member of a software team will be critical to your success in this field. However each team and project is different. Some projects have a high iteration cost because testing could cause people to die (e.g. bugs in rocket guidance systems in manned space flight), testing could be lengthy (e....
What is software development? At a most basic level, it is the activity of using a programming language to achieve some set of goals over time. It includes everything from scripts that a graduate student might write to analyze some data to massive systems that control aircraft. As our world continues to progress technically, software development will likely become even more commonplace than it is now. In this post, I aim to provide a comprehensive overview of how one can develop software efficiently using free and open source tools on Linux....
A few of the key things that you will need as you need as a professional are the ability to manage tasks, understand how you spend your time, and improve your own processes. For me and many others, journaling, task managers, and time trackers help you answer these important questions.
What is Journaling? Journaling is a reflective process which aims to capture tasks, observations, ideas, and lessons in order to be able to recall and learn from them....
CMake is the de-facto C++ build system used by an overwhelming number of C++ projects. Even if you personally favor more modern alternatives such as Meson, Bazel, or Pants, if you ever pull in a 3rd party dependency, there is a good chance that it uses CMake so knowing enough about CMake to understand it is worth knowing.
How to get started I recommend new users to CMake start with the following resources:...
So you want to do empirical computer science? Doing good science is difficult. It requires discipline and attention to detail. However there are strategies that can help you focus on answering the questions you can attempt to answer. First you should ask, “is this a scientific question?” Not all questions are scientific questions. Questions about aesthetics, values, ethics are not science questions. “Is A better than B?” is not a scientific question, it’s a question of values....
There’s at least for me an inherent coolness to be able to say that I can run code on a super computer. However, there is often a gap between the kind of programming that you learned in your introductory classes, and what kind of code runs well on a computing cluster. In this post, I try to provide an introduction to high performance computing, and some of the differences between it and personal computing....
So you want to or have to try this thing called “Linux.” Just like curry powder isn’t just one thing, but a distinct mix of spices that come together into a tasty mixture, Linux is much the same. Also like curry, Linux isn’t for everyone. In this post I describe the process of choosing the “flavor” of Linux that will work best for you, introduce a powerful tool that will help you to make the most of Linux, and describe some first steps to take when things go wrong....
Communication is essential to the enterprise of knowledge. Without communication, we would never be able to build upon the works of others or have them build upon our own. One of the most important – and challenging – arts within communication is writing. Writing is unique among commutative forms in its durability and portability. Once written, the words of the author can transcend even their death and travel places they never dreamed to tread....
Efficient study of a topic is a powerful skill for a wide variety of domains. However – despite having several classes on writing and research in High School and Undergraduate Studies – it wasn’t something that I truly appreciated and learned how to do well until Graduate School. I think this really boils down to lacking the kind of personal application that makes these efforts meaningful. However now that I have come to appreciate it, I want to highlight how I think how I study new topics, and how this applies to many topics outside of academic research....
Python is a relatively simple language compared to others such as C++. Despite its simplicity, Python really shines because of its robust standard library, extensive 3rd party library ecosystem (especially for statistics and data analysis), and intuitiveness. This post tracks my process of learning how to program well in Python.
Order of Topics The listing of topics here is arbitrary and represents the path that I took to learn Python roughly organized by topic....