Learning to Learn: Travel
Travel can be an opportunity to see and explore new cultures. I’ve had the chance to do a lot of traveling with work. Here are some of the things I’ve learned along the way.
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:
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
Travel can be an opportunity to see and explore new cultures. I’ve had the chance to do a lot of traveling with work. Here are some of the things I’ve learned along the way.
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.
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 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.
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.
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.
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.
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.
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.
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.