# Different Kinds of Computer Programming

I am an aspiring statistician, which means I do a lot of numerical computation on a daily basis. However, sometimes, the work I do to pay my bills makes me wonder what I am and who I am because not every element of my daily work is about statistics. It’s more web development. In some sense, I’m getting the best out of both worlds but in another sense, I’m not focusing enough on one expertise. But as far as blogging is concerned, I do have the experience to comment on both sides. So I thought, why not make a post about how to prepare for computing in general?

Back in college when I was a cute(?) undergrad, there were many friends who would ask me how to practice R. I would ask what they wanted to do with R or what kind of project they had in mind that they could do with R. Every single time, the response would be along the lines of *“I don’t know”* or *“I could use some suggestions”*, all of which essentially implied “I have no fucking clue”.

But that’s ok. We were young and naive. Asking for advice on how to practice programming when you don’t know what to do or want to do is like asking how to get better at drawing when you don’t have anything to draw on a piece of paper. So the ideal scenario would be to have your own project in mind that you want to do with programming. But these days, it’s getting easier every day to find a tutorial website that has a tab with a bunch of potential projects that you can pick up and try.

## Numerical Computing#

Numerical computing is where computer science and mathematics overlap the most. Well, technically, computers were invented, unsurprisingly, as a “computing machine” so everything you do on a computer is basic math behind the scenes like arithmetic. But there’s been so much abstraction and encapsulation thanks to object-oriented programming that we don’t really see any math happening in our eyes. So when we say *numerical computing*, it really means computation related to solving math problems in fields like sciences, engineering, statistics, and finance.

- Matrices and systems of linear equations
- More linear algebra (eigenproblems)
- Regression / least squares
- Function approximation / smoothing / interpolation (you should linearize the function but mathematically you’ll be playing with a function space)
- mathematical optimization (finding max/min) and nonlinear equations
- statistical estimation (maximum likelihood estimation)
- numerical integration -> Monte Carlo methods (this encompasses random number generation and importance sampling)
- Markov chain Monte Carlo methods (including Gibbs samplers and Metropolis-Hastings algorithms; maybe the variants of Hamiltonian Monte Carlo but this may be too niche)
- Transforms (Fast Fourier transform, discrete cosine transform, etc)

This is really a rough layout of what comes to my mind when I think of numerical computing. Honestly though, if you’re thinking of studying numerical computing in general, I recommend thinking carefully about why you need this. This is an extremely niche area that not many people will end up using for their career. If you concluded that you need this very skill, you should also think about how deep you are willing to dive in. Remember, some people do research on numerical computing for a living. Odds are you probably don’t need to be on that level.

### Which programming language?#

I’ve seen beyond enough people fighting over this. Quite frankly though, I don’t really care. You can use R, python, Java, Scala, C, C++, FORTRAN, Go, Julia, etc etc etc. Use whatever you feel comfortable. My only personal preference is an open source language, which excludes MATLAB. Unless you’re in an engineering field where you REALLY REALLY need simulink, just trust me and don’t go in that area. Or at least, don’t make it your primarily language. If you’re already in a lab and your team already uses one language, then it’s best to follow their lead. Otherwise, pick one and master it. The latter is more important: **master it**.

## Web development#

I will make another post about R shiny but to make a quick mention of it here, for the love of god, please do not use R Shiny for a full-fledged web project. Only if you are working on a *proof of concept* is it okay to quickly implement it with R Shiny.

Anyway, if you want to learn web development, I strongly recommend freeCodeCamp. To briefly explain the structure of web development, it’s divided into two parts: **front end** and **back end**.

**front end**: the part that is related to how the browser parses HTML and CSS, and how JavaScript manipulates the DOM. Essentially boils down to what you see on a browser and is very closely related to the concept of web design.**back end**: the part that you don’t see when you surf the web. Also called*serverside programming*.

The first two courses in the freeCodeCamp curriculum, **Responsive Web Design** and **JavaScript Algorithms and Data Structures** are a must. Personally, I don’t recommend the third one, **Front End Libraries**. For the back end, you can go through **APIs and Microservices Certification**.

The internet is a type of digital communication through a protocol called *HTTP*. Your clicks send requests to the server and the server responds accordingly. Keep this in mind and it will make sense that you need both components for a functioning website.

In a company, there will probably be separate teams for each. But whoever is reading this won’t likely be an expert working for a company already so you might want to try both and figure out what you find more fun. It’s not too late to specialize after.