Skip to main content

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

Meta #

Process #

  • Linux how to get started with learning and using Linux
  • Software Development how to approach writing a software project using Linux
  • Software Patterns 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

Tools #

  • 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 #

2023


Learning to Learn: Software Teams

·1815 words·9 mins

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.g. if you need to manufacture a physical thing), or expensive resources are consumed (e.g. issues that only manifest when using 1000 nodes) and have to be more planning focused. Other line of business or research applications can afford to be more iterative. Knowing which situation you are in is key to crafting your process to be more effective. Regardless, there are some timeless principles of teams which are important to consider when working in or leading a team. In this post, I will highlight what research says makes effective teams and highlight how one popular approach implements these principles.

Learning to Learn: Task Management, Time Tracking, and Journaling

·1770 words·9 mins

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.

Learning to Learn: Software Development on Linux

·15089 words·71 mins

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.

Learning to Learn: MPI

·1036 words·5 mins

MPI is the de-facto standard way to write distributed programs that run on super computers. Many have tried to replace it, but so far none of them have succeeded. Learning to use it successfully, will enable you to write powerful distributed programs.

Learning to Learn: GDB

·1729 words·9 mins

GDB is a powerful tool that is underutilized by most programmers that I’ve met. It can tell you the state of one or more running or crashed programs, and even manipulate the memory of a running process. It is an invaluable tool for understanding what is going wrong with your programs.

2022


Learning to Learn: CMake

·1003 words·5 mins

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.

Suggestions for the Design of Computational Experiments

·3294 words·16 mins

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. Questions of values require trade offs, and while important can’t be solved with the scientific method of stating assumptions, posing questions, designing experiments, collecting data, and interpreting results. “Can method A achieve more flops than method B in a given specific context?” Is more of a scientific question.

2019


Learning to Learn: Linux

·4987 words·24 mins

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.

Learning to Learn: High Performance Computing

·2233 words·11 mins

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.

Learning to Learn: Writing

·3470 words·17 mins

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. However writings portability and durability are the same feature that present its central challenge: With the author long gone, how can the he still communicate his or her intent? In this post, I ponder how I face these challenges and encourage others to do the same.