- Introduction to CS
- Contributing to Open Source
- Coding
- C++
- Other programming tools and concepts
- Cryptography
- Computer and Wireless Networks
- High Performance Computing
- Quantum Computing
- Computer Architecture
- Operating Systems
- Competitive Coding
- ML/DL
- Mobile Development
- Game Development
- Information Security (InfoSec) / Hacking
- Web Development
This section contains the starter pack to understanding Computer Science. One obviously needs an introduction to the field before picking up an interest. Sometimes it takes people an year of exploration before they can pick a field of their choice and it is genuine because everything seems to be gold at the start, right? I am putting so much emphasis on this section because this may be the most crucial part of this whole journey, trying to pick something to work upon.
- Map of Computer Science: A detailed video(sort of?) on CS and its disciplines. A must watch
- Harvard's CS50: A really good and highly recommended course on introduction to CS. It also provides a hands-on experience to the student.
The phrase you hear the most after coming to IITR is '1 cr ka package pakka' followed by 'Open source mein contribute kar!(Tr: Contribute to Open Source!!). So what exactly is Open Source? How to get started in Open Source? You may find tons of definitions online, but here is a concise and maybe easy to understand version.
-
Open Source code is a piece of code/program/application whose code is available online for free. This means that the code is free to use and modify(though there may be certain extra constraints as well which depend on the licence used by the code).
-
Such programs may be developed by a person(s) or organization(s) and is maintained by a community of people who find the software interesting or worth contributing to. Some examples of tools/software falling in the open source category are: Git, Linux, VLC, OpenOffice, dia, etc.
-
Now, the main question is, How to contribute to Open Source???!! Mind you, this is a very subjective answer and may vary from person to person, but here it goes. Generally, Opn Source communities are very friendly to newcomers and help an enthusiastic learner a lot in getting started with contributions. Many organisations have a
Contributing
orMyFirstContribution
type of guides which guide a newbie in getting around the code and provide an overview of the contribution process and what counts as contribution and how to start. Here is Git's guide. Many communities have a slack channel too for communication. -
How do I choose an organisation?! The answer is well not so simple. It is totally upto someone which organisation does one have to choose to contribute to. Generally, it depends on which programming language interests you and what are your interests. For instance if someone has interests in networks and communication protocols and the like, they may like OpenSSL. It is not necessary to contribute to a big shot organisation for starters. Some known names in Open source whose codebases are well-maintained are:
- OpenSSL
- Git
- CGAL(Computational Geometry and Algorithms Library)
- Kubernetes
- tensorflow
- boost
- OpenCV, to name a few..
Also, one can look at the Google Summer of Code Organizations page. I am advising this because it has a ton of organisations, using different types of languages and tools, all at one place.
-
Why contribute to Open Source? Because, you get to learn tons of new things! Such organisations have a codebase which spans millions of lines hence this aids in increasing one's capability to connect the dots in a large codebase(which two functions and classes are related to each other etc.) Open source orgs have a NO bullshit policy, meaning they don't tolerate people who don't want to learn and are just depending on others to write their code. They are very nitpicky meaning they look at the smallest of the errors possible, ranging from using tabs instead of spaces, to a ill-formed commit message. They provide a genuine opportunity to someone to grow.
-
Though this is not exactly related to open source, but my advice to the reader would be that they try answering to people's questions on StackOverlfow and Reddit because these websites too have a no-bullshit policy and if you try to mess around with them you get downvoted to hell.
I hope this helps you :)
- Accelerated C++ by Andrew Koenig: Effective for students starting with C++
- A tour of C++ by Bjarne Stroustrup: Effective for those who wants to revisit C++
- Effective Modern C++ by Scott Meyers: A medium difficulty book expecting a decent grasp over C++. Explains the key features of modern C++.
- C++ Template Metaprogramming by Aleksey Gurtovoy: An advanced book for enthusiasts who wishes to play with type traits and compile time optimizations.
- Modern C++ design by Andrei Alexandrescu: An advanced book for enthusiasts who wants to build massive C++ libraries and wants a standard to help them build.
- Concurrency in Action by Anthony D. Williams: An advanced book for enthusiasts who wants to use the multithreading features introduced in C++11.
- Cherno's C++ series: Really useful if you're starting with C++.
- C++ Annotations: Can be considered as a manual for C++.
- Free books on goalkicker: This website contains free reference books on programming languages (such as C, C++, Ruby, Java, etc.), tools such as Git, Powershell and frameworks such as ReactJS, .NET, AngularJS, etc.). Totally worth checking out!
- Art of the Problem: YT Channel
- John Hammond: YT Channel
- Practicing
- [Cryptopals](https://cryptopals.com/): It is a great website to do challenges on cryptography. The challenges start with some basic string manipulation tasks, but after that they are grouped by theme. In most cases, you first implement something, then break it in several enlightening ways.This is a different way to learn about crypto than taking a class or reading a book.
- [CryptoHack](https://cryptohack.org/): Another fun platform to learn crypto.
- Doing some CTF challenges is also helpful.
- Courses
- Introduction to cryptography by Christof Paar
- Learn Crypto: Free course on Coursera by Dan Boneh
- crypto101.io: Free crypto manual and course
- Computer Networks: A Top-down approach; Kurose & Ross: A must read book on Computer networks.
- NPTEL course on Computer Networks by Prof. Sujoy Ghosh: A good and detailed course on computer networks.
- Video on Network Coding and MIMO by Art of the Problem.
- A glossary of terms used in Telecommunication: TelecomABC
- Communication Systems by Linköping University: A good channel I just came across which explains key cellular network concepts.
- alantalkstech: Another youtube channelwhich explains networks concepts (this may be a bit high level and obsolete (the videos date back to late 2000s so proceed with caution).
- Introductory video on 5G: A good introductory video by IEEE on 5G technologies.
- edX course on 4G: Here is the course.
- Telecome Networking
- A good blog on Massive MIMO
- To further explore modern cellular networks, reading research papers would be a good start.
I will be creating a Google Drive link to host variouos books, videos and research papers that I have found. Need some free time for that :)
Blog by ACM IITR: This blog provides a good starter pack on QC.
This deals with the design of computers, and how their are architected. Really cool if you like knowing how stuff works and so on. MIT's 6.004 is a great place to start.
Super tough and super rewarding if you get it right. There are different things that one may look for when trying to learn operating systems:
- How to use operating systems: This deals with the interfaces they provide and a good book on this is The Linux Programming Interface. It deals with the features that linux provides to the user at the basic level. Really helpful to understand the interfaces that operating systems provide.
- Operating system concepts: This deals with abstract ideas of how operating systems work, their policies and mechanisms, and their role in a computer system. A computer science undergraduate would typically learn this in one of his courses. An excellent book to start off would be Three Easy Pieces. Try to read Professor Andrew S. Tanenbaum's books as well (He made Minix).
- Operating system development: This deals with making an operating system/components of it. It is arguably the toughest task in Computer Engineering. Doing this is HARD! A good place to start would be the OsDev wiki.
To start with Competitive Programming there are a few prerequisites. It is highly advisable to first start with these basics(if you have not yet done so) and only then move forward. These include:
• Get familiar with at least one programming language. C++ is highly advisable followed by python. Though you may choose any other language too.
• Understand the needs and implementations of different data structures in the language. For example, in C++ checkout the STL, vectors, maps, sets, lists, stacks, queues etc.
After this, you should start with the basic problems, the ones having higher acceptance ratio or the ones with many correct submissions, and then move on to tougher problems slowly. It is very necessary to find the best approach for the problem. Don’t get a habit to just submit a working code and then move on to the next problem. Try to analyse your solution and enhance its time and space complexities. Also try to implement any pre-existing algorithm and do not just find brute-force solutions.
To learn new algorithms, the ‘Introduction to Algorithms by CLRS’ is a very good book. Read the topics that you are willing to learn or need to learn, completely. Try not to skip sub-sections from it and clear any doubts you have. Another source can be http://cp-algorithms.com/. It is a good collection of several important algorithms and their pseudo-code implementations.
Also, try to focus on one topic at a time in the beginning. For example, if you read about Dynamic Programming, try to solve a few problems on it to get a better understanding of the topic, before moving further. You can read about its different variations and what are its main uses on the go.
Do not neglect some topics that you consider are trivial. If you have not read the topics formally but have rough ideas about it, you should at least give it a reading. For example, you may have some ideas about Number Theory or Game Theory, but might not know some theorems relating to it, which are in general quite useful. Nevertheless, this can be skipped if you feel confident about the topic.
The platforms that are highly advisable include:
• Codeforces
• Spoj
• Hackerrank
• Codechef
In the beginning focus on learning concepts and not improving your contest ratings. This is very helpful and in fact necessary. If you have weak concepts, it may create a huge problem in the longer run. Refrain from focusing on quantity of knowledge over quality.
These are just a few things to keep in mind as a beginner. You will be able to figure out other things as you move on. All the best! Cheers.
To start with Deep learning first, you will need to brush off some basic Machine Learning skills. You can do any of the below to get a basic idea about Machine Learning
- Machine Learning Coursera: The most popular course on Machine Learning. It explains most of the basic concepts in ML in an easy manner. Highly recommended. Cons - It might come off as a bit boring.
- UD120 - Udacity Intro to ML: If you find the Coursera ML course boring, try this one. It's illustrative, fast-paced and more implementation focused. Cons- A bit less comprehensive than the Coursera ML course.
- Machine Learning Stanford CS229: This is a fairly advanced course on ML. Highly comprehensive, great for a deep-dive into ML fundamentals. Recommended only if you want an advanced knowledge in ML.
The above courses will give you a brief introduction to ML. After this to begin with DL, we highly suggest reading Neural Networks and Deep Learning. It gives a highly intuitive beginner level introduction to DL. After this it's suggested to do the Deep Learning Specialization by Coursera. A general recommendation would be to read the Deep Learning Book by Goodfellow et al.. It is the so-called "Bible" of DL and a highly recommended read.
Now for more advanced knowledge, there is a lot you can do, and honestly, you can never do enough. The field is growing at a mind-numbing rate and its tough to keep track of all the stuff going on. Still here are a few "standard" advanced level things to do:
- Essence of Linear Algebra 3B1B: Do yourself a favour and watch this awesome piece of art. It's the most aesthetically pleasing way Linear Algebra has ever been taught.
- Linear Algebra Review and Reference CS229: A crisp and easy to understand explanation of the concepts of Linear Algebra you will need in Deep Learning.
- MIT OCW 18.06 Linear Algebra: Recommended if you want to deep dive into Linear Algebra. Will teach you pretty much everything you'll ever need in DL. PS. It helps a lot in Quantum Computing as well :P
- Stanford Probability Stat110: If you think that probability is only limited to Bayes Rule, watch this and have your mind-blown as the instructor derives results to highly complex problems seemingly out of nowhere leaving you awestruck.
- Stanford Computer Vision CS231n: The defacto choice to dive deep into Computer Vision. We'll recommend doing the first seven lectures from the 2016 version and then continuing off to recent year versions for other recent topics.
- Stanford NLP course CS224n: The defacto choice to dive deep into NLP.
- RL course by David Silver: RL course by DeepMind the leading organization in the field. Awesome for an easy introduction to the field.
- RL course by UC Berkley: A relatively more advanced and comprehensive introduction to RL.
- Reinforcement Learning: An Introduction: The Bible of RL. Super comprehensive and highly recommended.
- Deep Learning with Pytorch by Udacity: To get familiar with PyTorch.
- TensorFlow in Practice by Coursera: To get familiar with Tensorflow.
- Guide to Deep Learning: A comprehensive Guide to Deep Learning.
- Distill: Awesome blogs on deep learning with highly interactive visualizations.
- Towards Data Science: Collection of premium quality blogs on datascience on medium.
- DL topics: Detailed list of general topics in DL to read about to get a respectable amount of knowledge in the field.
Aside from all this. Keep on reading blogs on Medium, recent research papers on Google scholar. Follow leading researchers on Twitter and join discussions on Reddit. Keep on contributing to OpenSource Projects or take on a project yourself. Keep on mailing professors or budding startups until someone gives in and offers you a research position. Success in DL is slow but its highly rewarding :P
Here's a list of beginner resources for mobile development in Android and Flutter.
-
First of all, you must have a basic knowledge of Java or Kotlin language to get started with Android development.
-
Setting up the Android Studio IDE, the most preferable for Android development, is a great option to go ahead. Refer here for installation guides.
-
The best resource to refer to for Android developers is Official Android Developer documentation. It contains every resource you need for Android development.
-
Starting with some tutorials or courses that make developing apps from scratch is a great way to start getting deep dive into Android. Here are a few suggestions from me:
-
Android Development for Beginner by Udacity - A complete beginner-friendly course series by Google for learning basics of the android development.
- Android Basics: User Interface - Learn how the hand-drawn app designs are transformed into layouts in phones.
- Android Basics: User Input - Learn how to add interactivity to the apps with some basics of object-oriented programming.
- Android Basics: Multiple App Screens - Learn how to show multiple screens and add visual changes on touch events.
- Android Basics: Networking - Learn the basics of networking in Android.
- Android Basics: Data Storage - Learn how storing data works in mobile applications.
-
Understand Android Activity Lifecycle
- Moving to Single Activity Structure
- Android Lifecycle cheat sheet
- Detailed Guide
-
Building maintainable and performant apps
- Once you have got a basic familiarity with Android Dev, it's highly important to learn about app architecture and start writing your apps in "proper" manner.
- Android Jetpack: Improving App's Architecture
- Guide to App Architecture
- Android Architecture Samples
- Viewmodels and LiveData patterns and anti-patterns
-
Google Codelabs for Android - Awesome interactive tutorials that teach you the fundamentals of building Android applications.
-
-
After learning about the basics of the frontend and networking, it's also necessary to take a look at the backend. Implementing a self-made backend might become difficult for the beginner. So, Firebase by Google proves to be a great solution with easy use APIs. It provides all the facilities such as database, cloud messaging, and many more. Here are some resources to get on with Firebase:
- Firebase Documentation - A complete step-by-step guide that helps you get started with Firebase.
- Tutorial for Firebase implementation - Complete video series for implementation of Firebase in mobile applications.
-
Also, implementing material design is a great way to improve the UI and UX of the app. They make your app look more realistic and enhance user experiences. Here's an excellent resource from Android Team.
-
Some blogs containing short tutorials, tips, and hacks for Android developers.
- First of all, why learn Flutter if Android is already present? It's a cross-platform UI toolkit that helps developers build apps for Android and iOS from a single codebase.
- It has its own benefits. Some of them are
- Hot Reload - Build your code to life in just milliseconds that make development faster.
- Expressive, beautiful UIs - Helps to delight the users with great UI with incredibly fast rendering and flexible designs.
- Native Performance - Flutter’s widgets incorporate all critical platform differences such as scrolling, navigation, icons, and fonts to provide full native performance on both iOS and Android.
- Flutter Docs
- It's obvious as in Android, but it is a good and thorough walkthrough of Flutter. Even it gives directions for getting started with Flutter if familiar with any other mobile development environment such as Android, iOS, React Native. Here are the links for the same:
- Google Codelabs for Flutter - This provides a guided, hands-on coding experience on building Flutter apps.
- Udacity - Build Native Mobile Apps with Flutter - This course can be a great start to get know things about Flutter. It is being offered by the Flutter team.
- Flutter Widget of the Week - A video series on youtube each explaining the working of a single widget in Flutter.
- Awesome Flutter - A GitHub repository with a great list of the best Flutter libraries, tools, tutorials, articles and many more.
- Some good blogs containing short tutorials and latest news about Flutter.
- Flutter also has a huge community where you can do any discussions, showcases and many more related to Flutter. Here is the list:
Stack Overflow - This Q/A platform will most probably answer to any of your problems in the development. If sometimes it misses, Google is always there to help you!
I think these are enough resources to get you familiar with the mobile development field, whether it is Android or Flutter!
- Pick up an engine.
- Start using it.
- Understand the architecture followed by it.
- Publish? (completing a game is daunting task)
-
Editor based
- Unity / Unreal (bread and butter engine for indies/AA/AAA studios, GUI based editor)
- Godot (Open Source, kinda new, GUI based editor)
All three of them have a dedicated forum to ask/answer question. However, for Unity take a look at Brackeys and for Godot take a look at GDQuest
-
Code based
- Raylib (Great for starting out, beginner friendly)
- Cocos2d-x (Seems small and unpopular but It is hugely popular in Asia)
- LibGDX (It is java based, so GC is available for help)
Again, all of them have respective forums to ask/answer questions.
For Raylib, I would recommend joining their discord server to ask questions
For Cocos2d-x see Ray's website, it is mobile focused so you would find topics related to Android/iOS too. It's hard to find tutorials in English (most of them are in Chinese)
- Besides these specific resources check Mike's website Games From Scratch especially his Getting Started Guide and Game Engine Introduction Series where he setup and review game engines/ framework.
- r/gamedev has a detailed getting started guide
Keep in mind that video game is just a big while loop. Everything else is normal everyday programming.
- The best way to learn the internals. Take a look at TheCherno's Game Engine Programming Series
Programming the graphical aspect of games.
- Start with OpenGL. Keep your linear algebra in check.
- For Vulkan, check Khronos Group's starting guide. Although OpenGL is enough for hobbyist and fundamentals, Vulkan is the future. I wouldn't recommend going this far.
- To learn CG from scratch visit ScratchAPixel 2.0 It's the best guide for CG fundamentals.
- Tiny Renderer is a brief version of ScratchAPixel (skipping some concepts like ray tracing).
- When you start spitting spaghetti code then Game Programming Patterns will help. These patterns are useful in general programming too. Bob's Crafting Interpreters is a gem for programming language development. It's so good that due to lack of section, I am mentioning it here.
- Networking is an interesting part of multiplayer games (most interesting for me), check Gaffer On Games and Valve's articles. These resources are a very high level view of this topic.
- Gamasutra is a website focused in game development. There are many great articles.
- For talks and slides related to this field watch Game Developers Conferences. Their archives GDC Vault
- Join r/gamedev to find more guides/articles/news related to this field.
- How to get into Hacking: Livestream by Gynvael Coldwind
- So you want to get into security: Essay by by Parisa Tabriz
- picoCTF: great beginner friendly CTF, challenges stay online all year round
- LiveOverFlow's binary hacking playlist: A good playlist to know about binary hacking as well as C and Linux.
- pwnable.kr: Challenges starting from basic programming errors to standard pwnables
- pwnable.xyz: Challenges based on easy-to-find vulns and interesting exploits
- gracker.org: Nice binary exploitation challenge series. Good for beginners
- https://dhavalkapil.com/archive/: Blogs by Dhaval Kapil on some basic/intermediate information security
- pwnable.tw: Medium to difficult pwning challenges. Great if you want to try your hands on some real world exploit development.
- Gynvael Coldwind's youtube channel: One of the best channels if you want some good CTF experience, tips and reverse engineering tips too.
- Murmus CTF youtube channel: Channel talking about real world exploit development and 0days.
- Shellphish how2heap: This repo contains POCs of the standard and modern heap based exploits and their well-put explanation.
- Natas Wargame from overthewire: Beginner friendly web-security challenges based on various topics, mostly covering php
- PortSwigger WebSecurity Academy
- There are no prequisite though, but you should have a habit of googling things because on the go you need a heck lot of knowledge about multiple things extending from OOPs to cloud computing to security. Why you need to know about these? Because :
- You want your web app source code to be scalable(as new features are getting added, complexity increases which can only be coped up by following some proper structure and principles).
- You don't want your web app server to go down due to increase in user traffic.
- You don't want your web app to be vulnerable and exploitable.
- Start with obvious stuff, HTML and CSS. They may seem a bit boring but they are the core of webdev. So, here are some of the resources:
- Next thing to learn is Javascript a.k.a JS. This is used for both frontend and backend work and in fact it's used for non-browser work too. JS is bundled with many principles and structures. You should also know how to use OOPs with JS. So here are some of the great resources:
- Telusko Javascript Tutorial
- Object-oriented Programming in JavaScript: Made Super Simple
- ES6 Javascript: The Complete Developer's Guide by Stephen Grider (68 lectures / 6hrs).
- Now once you are done with basics, you are ready to learn some awesome frontend frameworks(I would really urge you to first understand what's difference between these frameworks and normal HTML & CSS, trust me internals are really soothing and beautiful):
- ReactJS : When it comes to creating painless and interactive heavy UIs, this is the best to opt.
- React for beginners by Codevolution.
- React component, elements and instances by Dan Abramov.
- React is incomplete without redux. So do check it out.
- Vuejs : Vuejs is really easy to get grasp on, it takes hardly any time to write code in Vue. And best things about Vue are elegant programming style and patterns and massive documentation.
- Vue documentation Trust me, this is really good!
- VueJs Crash course
- ReactJS : When it comes to creating painless and interactive heavy UIs, this is the best to opt.
- Now, let's hope into backend/server-side stuffs. For a beginner, it's always good to start with NodeJs because you have already learnt Javascript(I hope you followed my prior steps :P) before, so it will be very easy to catch up new concepts. Nodejs is JavaScript runtime environment that lets developers write command line tools and server-side scripts outside of a browser. Here are some of the resources with which you can get started:
- Nodejs internals(Must read)
- Nodejs course by Brad Traversy.
- Django: Django is one of the most customisable and user friendly production level web application backend.
- Tutorial the documentation itself provides a great tutorial series.
- REST framework django's implementation to build RESTful APIs without any hassle.
- Flask: Flask is framework to build lighwieght backends swiftly in Python.
- I think these are enough to pave your way through the basics of web developement.