Skip to content

Latest commit

 

History

History
428 lines (330 loc) · 37.7 KB

guide.md

File metadata and controls

428 lines (330 loc) · 37.7 KB

Table of Content


Introduction to CS


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.

Contributing to Open Source


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 or MyFirstContribution 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 :)

Coding


C++

Basics to Advanced

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

Misc Resources

Other programming tools and concepts

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

Cryptography


  • 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 and Wireless Networks


  • 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 :)

High Performance Computing


Quantum Computing


Blog by ACM IITR: This blog provides a good starter pack on QC.

Computer Architecture


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.

Operating Systems


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.

Competitive Coding


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.

ML/DL


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:

Linear Algebra

  • 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

Probability

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

Computer Vision

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

Natural Language Processing (NLP)

Reinforcement Learning (RL)

Implementation

General Resources for DL

  • 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

Mobile Development


Here's a list of beginner resources for mobile development in Android and Flutter.

Android Resources

Flutter Resources

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

Game Development


When you want to make a game

  1. Pick up an engine.
  2. Start using it.
  3. Understand the architecture followed by it.
  4. Publish? (completing a game is daunting task)
Engines
  • 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)

Guides

When you want to learn the in and out of a typical game

Keep in mind that video game is just a big while loop. Everything else is normal everyday programming.

Making Game Engine
Graphic Programming

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).
Misc
  • 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.

Information Security (InfoSec) / Hacking


How to get into Hacking

Exploits and pwning

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

Web Security

Web Development


  • 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:
    • This is an introductory course to web development.
    • W3Schools is one of the most popular website to learn basics in minutes.
  • 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:
  • 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):
  • 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.