Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/antz22/high-school-guide-to-compsci

A basic guide on how to move forward in Computer Science as a high school student!
https://github.com/antz22/high-school-guide-to-compsci

ai algorithms-and-data-structures app-development competitive-programming computer-science computer-science-education deep-learning electrical-engineering guide hackathon high-school ml research web-development

Last synced: about 19 hours ago
JSON representation

A basic guide on how to move forward in Computer Science as a high school student!

Awesome Lists containing this project

README

        




:bulb: High School Guide to Computer Science :bulb:


A complete guide on how to get started with Computer Science as a high schooler, from a high schooler.


Table of Contents


  1. Introduction


  2. Computer Science - Theory



  3. Computer Science - Application


  4. Computer Science - Theory & Application

  5. Electrical Engineering

  6. Final Thoughts

  7. Contributing

## Introduction

Are you looking to dive deep into **Computer Science** during your time in high school?

Being a high schooler myself, I have found that it is often frustrating how difficult it can be to understand **where** to spend my time, **what** to spend my time on, and **where it will get me**. Something that would have helped me is an **in-depth guide** on how to explore Computer Science, and what competitions or actions to take to show off my skills. That is what I hope I have provided you with here.

Computer Science is a **huge realm** of topics spanning from Artificial Intelligence to Competitive Programming to Cryptography and more. Here I will attempt to briefly cover information on how to get started in each topic, which you can select entirely **based on your own interests**!

Please do not be overwhelmed by this list. You are by no means obligated to pursue any one of these tracks. This list is also by no means a complete guide. I hope that this can simply serve to inform you of what is possible in high school, something which can be frustrating to be unaware of. With that said, I also hope that you can gain some inspiration from this guide.

To start off, let's get started with **your** interests... Choose a track or two to learn more about!

## Computer Science - Theory

### Algorithms and Data Structures

At its essence, Computer Science is the **study of computers and algorithms**. The subfield of **Software Engineering** entails creating software applications that can help a company or an entity perform a certain function that is important - for example, an airplane company may want to write a piece of software that can help a user book the fastest flight possible to a certain airport from their home airport.

Writing robust and efficient algorithms thus requires an in-depth study of **algorithms and data structures**, the first track.

Studying this subject will cover topics such as Big-O Notation, Search, Greedy Method, Dynamic Programming, and more, on the algorithms side. On the data structures side, also expect to learn topics such as stacks, queues, hash maps, and more.

Being able to **efficiently manipulate** these data structures into complex algorithms is often what most Computer Science students spend their time studying **in college**. Learning this will put you **ahead of the game** and will also be able to land you jobs in the industry if you are proficient enough!

__Resources__
- MIT OCW 6.0001, 6.0002
- Coursera, Algorithms Part I, II

### Competitive Programming

Once you learn all the theory of algorithms and data structures, one fun way to apply them in problems is **competitive programming**!

Competitive Programming is a Computer Science discipline in which participants try to **program a solution** to a challenging problem, which will programmatically calculate an output given a certain input. Such problems also rely on the **speed and efficiency** of the algorithms written, meaning that you will have to optimize for speed and memory use as an added challenge.

As a high schooler, you will be able to learn about Competitive Programming through excellent sources such as [USACO.guide](https://usaco.guide), [Competitive Programmer's Handbook](https://cses.fi/book/book.pdf), and [GeeksforGeeks](https://www.geeksforgeeks.org/competitive-programming-a-complete-guide/).

Your final goal will be to copmete in competitions such as [USACO (USA Computing Olympiad)](http://usaco.org/), which holds four competitions every year and a training camp for finalists, with four people selected to represent the USA during the IOI (International Olympiad in Informatics).

Each USACO competition lasts for four hours, and is (usually) composed of solving **3 problems in 4 hours**. Your solution will be compared to **10-15 inputs**, and if your program takes in those inputs and outputs the correct solution for each of them within the **speed and memory constraints**, you will advance onto the next tier.

The USACO competition is divided into **tiers**. Every participant begins in the **bronze** tier, and if you compete and pass the bronze tier by scoring above a certain threshold, you advance onto the **silver** tier. Once on the silver tier, your competition will contain more difficult problems to solve with stricter time and memory constraints. However, if you pass the silver tier, you advance onto the **gold** tier, which is an accomplishment in and of itself, and usually requires months of diligent practice.

For the serious competitive programmers, passing the gold tier takes you to the **platinum** tier, after which a handful of finalists are selected to participate in the prestigious training camp.

Another note is that Competitive Programming solutions can be coded in **any language**. With that said, certain languages still have a performance advantage over others (*C++* and *Java* are the preferred Competitive Programming languages) but generally any language is okay.

If you would like to learn more or get started yourself, take a look at the resources below.
- [USACO](http://usaco.org/)
- [USACO.guide](https://usaco.guide/)
- [Competitive Programmer's Handbook](https://cses.fi/book/book.pdf)
- [GeeksforGeeks Complete Guide](https://www.geeksforgeeks.org/competitive-programming-a-complete-guide/)

Some resources to help you practice:
- [CodeForces](https://codeforces.com/)
- [HackerRank](https://www.hackerrank.com/)
- [CSES](https://cses.fi/problemset/)

### Internships and Industry

Another thing you might be looking for as a high school student is an **internship** in a large or small company. Working in the industry will provide you with a **whole new perspective** on Computer Science, will help you advance your career, and will help you gain **job opportunities** in the future!

You can look to local companies for job opportunities (CodeNinjas, Ziplyne, etc) or you can aim for large companies (Microsoft, Bloomberg, etc).

The process of getting an internship often consists of an **interview** with a technical assessment. This usually consists of solving a programming problem in front of the interviewer, which often has to do with algorithms and data structures, like Competitive Programming.

Some resources to get you started:
- [Cracking the Coding Interview](http://englishonlineclub.com/pdf/Cracking%20the%20Coding%20Interview%20-%20189%20Programming%20Questions%20and%20Solutions%20(6th%20Edition)%20[EnglishOnlineClub.com].pdf)
- [freeCodeCamp](https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/)

### Artificial Intelligence

Another facsinating realm of Computer Science is **Artificial Intelligence (AI)**. AI consists of many subfields, including the following:

- Computer Vision
- Reinforcement Learning
- Robotics
- Deep Learning

Depending on the level of understanding you wish to gain and your prior experience, learning AI can take years or months.

To start, you should first learn the basics of Machine Learning (ML). ML requires some basic knowledge of multivariable calculus, but is not too difficult to understand. There are **many resources** to help you get started with ML. One of the most famous courses is **Machine Learning**, provided by Andrew Ng (Stanford University) through Coursera.

- [Machine Learning - Andrew Ng](https://www.coursera.org/learn/machine-learning)
- [Machine Learning - Fundamentals](https://towardsdatascience.com/machine-learning-basics-part-1-a36d38c7916)
- [Basic Concepts in Machine Learning](https://machinelearningmastery.com/basic-concepts-in-machine-learning/)
- [Machine Learning Tutorial for Complete Beginners](https://www.mygreatlearning.com/blog/machine-learning-tutorial/)

With a basic conceptual understanding, you will next need to learn the basics of **matrices** and **a programming language** of your choice. Since the majority of ML libraries are developed for Python, the recommended choice is Python.

Once you know ML, you can dive deeper into AI. One part of AI that has gained popularity recently is **Deep Learning**, which involves the use of Neural Networks in classifying objects or outputting numerical values based on given inputs. Within Deep Learning, **Computer Vision** is the part of DL that involves algorithms sensing the visual world. This often entails the use of Convolutional Neural Networks (CNNs) for **image recognition**, **object detection**, and more. Much research is conducted in this field.

**Reinforcement Learning** is another subset of AI in which an algorithm trains itself by attempting to maximize the total reward of some aaction, given a method of evaluating its own performance. This is often applied with games and autonomous driving.

AI can also be applied to **robotics** to create robots that can **detect objects** (using computer vision), perform **complex tasks**, or react to new environments.

As you can see, AI is a **vast field** with many opportunities for you to find!

### Research

As a high schooler, your ultimate goal for diving into some of the fields may be to **conduct important research** in one of the subfields of Computer Science (the aforementioned list is not all-encompassing!).

You can show your accomplishments by pursuing an independent research project or a project with the assistance of an institution or a professor. You can reach out to a professor (cold-email) if you have an interesting idea of proposition. It is often necessary to read currently published scientific literature in order to get an idea of what you can work on.

Some of the opportunities to show off your work can be through **publishing your work** in a prestigious journal (**avoid predatory journals** that cost lots of money to publish in) or showing off your work in a competition. Competitions include your **regional ISEF-affiliated science fair**, your local **Junior Science and Humanities Symposium** (which feeds into the National Symposium), and a number of other science fairs.

Additionally, you may apply to certain summer programs in order to pursue research with an institution. Princeton's **Laboratory Learning Program** offers a way to conduct research with a Princeton research group, but is highly selective (summer program). MIT also has the **Research Science Institute** program. A number of other prestigious summer programs exist, including the **SSP** program, the **MITES** program, and more.

## Computer Science - Application

In the realm of Computer Science applications, you will mostly find entrepreneurial means of utilizing Computer Science to better the world - business and startup-esque ideas.

### Web Development

Web Development is one of the most basic forms of applied programming, in which programmers develop code for a **website** or a **web application**. The difference is that web applications **deal with manipulating user's data**, and will provide a complete product for users to use.

Some great web development resources are out there, including ones from Codecademy, Khan Academy, Coursera, Mozilla Developer Network, and more. Personally, I took the [CS50 Web Programming with Python and Javascript](https://cs50.harvard.edu/web/2020/), which is an excellent course covering Django, Javascript, HTML, and CSS, from two Harvard educators.

At its core, Web Development will require you to learn about how to write static webpages using HTML, and styling them with CSS. Further functionalities can be added to your website with javascript.

However, Web Development that involves complex application interfaces and user interactions often require **web development frameworks**. Frameworks can be split into **front-end** and **back-end**, where front-end deals with what you see (how the site looks) and back-end deals with what happens with the data (what happens if you make a new account, purchase something, etc).

Popular front-end frameworks include [React.js](https://reactjs.org/), [Vue.js](https://vuejs.org/), and [Angular.js](https://angularjs.org/). Popular back-end frameworks with Python include [Django](https://www.djangoproject.com/) and [Flask](https://flask.palletsprojects.com/en/2.0.x/), and other frameworks with Javascript include [Express](https://expressjs.com/). If you use Express, another popular choice for managing the database is [MongoDB](https://www.mongodb.com/), which, collectively paired with Express and React, make up the MERN stack (a valuable stack to learn for getting internships!).

### App Development

Venturing further into the world of programming, you will find mobile app development - creating mobile apps rather than websites.

There are two main tracks to App Development - developing **Native Apps** and developing **Cross-Platform** Apps. Let's focus on native development first.

For those of you who are Android users, you may be disheartened to see that some apps are **only available** on iOS. Likewise, some iOS users may notice that some apps are only available on the Play Store. This is an example of natively developed apps - apps that were only developed to be on iOS, or only developed to be on Android.

For most people, developing iOS is the better option as there is a larger audience in the US for Apple devices. However, if you are interested in developing to a global audience, Android would be the choice.

To develop iOS, you have to learn a language called [Swift](https://developer.apple.com/swift/), which requires you to own an apple computer! There are many tutorials out there to get you started. To develop Android, you can use [Kotlin](https://kotlinlang.org/) or [Java](https://developer.android.com/ndk).

However, there exists development kits that allow you to develop one app for both iOS and Android platofrms - cross-platform frameworks! The most popular options on the market right now include [React Native](https://reactnative.dev/) and [Flutter](https://flutter.dev/). Although these frameworks allow you to develop one codebase for two platforms, do note that they will not have the same performance or design consistency as native development.

Once you've learned App Development, you can show off your skills in the prestigious [Congressional App Challenge](https://www.congressionalappchallenge.us/), or a number of hackathons held by different institutions across the country (which I will get into next...).

### Hackathons

Want a fun way to **make something innovative and unique** in a **short span of time**? Then hackathons are for you!

Hackathons are **coding competitions** that often span from one to four days, in which teams of (usually) one to four participants work together to 'hack up' a viable solution to a specific problem. These solutions can be developed through **web applications**, **mobile applications**, **hardware**, or a combination of the three!

If you are interested in viewing past hackathon projects, feel free to look at my [Alertra](https://github.com/antz22/Alertra) and [MedCheck](https://github.com/antz22/MedCheck) repositories. I submitted these applications with their demos to two hackathons that had themes of security and healthcare respectively.

As a high schooler, you be limited in the scope of hackathons you are able to attend (there are many collegiate and corporate hackathons that only 18+ can attend), but there are still **plenty of great options**.

Some of the best high school hackathons (at least on the east coast) include [PeddieHacks](https://peddiehacks.peddie.org/), [hackPHS](https://www.hackphs.tech/), and others that can be found on [HackClub](https://hackathons.hackclub.com/). Otherwise, high schoolers can attend certain collegiate hackathons such as [PennApps](https://pennapps.com/).

On the corporate level, one glorified hackathon that high schoolers **can attend** is [ImagineCup](https://imaginecup.microsoft.com/en-us/Events), a global-level competition where teams **first compete locally** to qualify for the **World Finals**, with the requirement that the project utilizes **Microsoft Azure** in some way. Although large hackathons like Imagine Cup operate on a much larger scale at a much higher level, there are also much **bigger prizes**!

## Computer Science - Theory & Application

Of course, Computer Science can't purely be separated into theory and application. There are the gray areas, in which both are at play.

Some examples of this include applications of AI - researching the use of AI in a new field through an application, such as a web or mobile app. Many more examples exist that I won't mention here.

## Electrical Engineering

Aside from Computer Science itself, some students may be interest in learning more about circuits, and the low-level components of computers.

Some great resources to learn about this can be found on platforms like MIT OCW, Coursera, EdX, and lectures on YouTube here and there. To get hands on experience, buying and playing around with an **arduino kit** is especially useful.

## Final Thoughts

I understand that this list is very long and overwhelming, but don't be afraid - I have provided a very large list of objectives that you may or may not be interested that you may or may not pursue! It is totally up to you what you pursue, and it need not be anything here, and it need not be for the purposes of advancing your career. Your choices are **limitless** and I have simply provided a loose collection of information for those of you who may be interested in starting here.

If you are concerned about being advanced as a high schooler, do remember that you do not need to pursue every single item on the list here. In fact, it is better if you focus all of your time and energy on one or two of these items. There are exceptional students who spend all of their high school studying for USACO, who get to the platinum tier by the time they graduate! There are students who dedicate their high school to conducting research, who advance to the ISEF competition! There are students who develop apps that reach a national audience! And there are students who don't do a single one of these things, who end up totally successful, happy, and satisfied with their lives!

I hope this can give you a sense of what pursuing Computer Science in high school looks like. And I wish you good luck on your journey. Peace!

## Contributing

This is by no means a complete guide - I probably missed a ton of stuff. Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions to improve the quality of this guide are welcome and greatly appreciated!

1. Fork the project
2. Create your feature branch (git checkout -b feature/AmazingFeature)
3. Commit your changes (git commit -m 'Add some AmazingFeature)
4. Push to the branch (git push origin feature/AmazingFeature)
5. Open a pull request