Learning is a Journey.You will never know everything you need to know to solve all your problems.
Alternatives to learning from textbooks
Most people find the task of reading books, courses to be daunting and don’t take the first step. To keep yourself motivated to take that first step,
- You can follow few blogs such as paulgraham, joelonsoftware and also technical people e.g thegeekstuff (thegeekstuff) on Twitter. But blogs are just first steps.
- The most helpful method is to have a motivating project at hand and to learn the necessary stuff required for that. There are lot of good projects.
- You can also participate in forums, discussion groups and meetups to interact with fellow tech enthusiasts.
For CS topics, we have a tech Group on Facebook, with around 2Lakh members, and lot of people from research and academics. I originally started this forum, but now it has taken life on its own with lot of prominent people like PhD scholars and book authors contributing.
Learning new skills is time consuming because currently there are no good websites that help in adaptive learning or structure the course according to specific needs of the user.
Most of the current websites are good, if you already know some basics about the topic, but what is missing is the perspective from a newbie.
At CareerHunt, we give a good plan for learning a particular topic. We manually aggregate the best content on the web for a particular topic. We validate our contents by asking feedback from freshers – if they could follow our lesson plan.
We believe this kind of adaptive learning can shorten the time taken to learn new skills. Courses are structured using hyperlinks of concepts rather than bookish linear way
Start with a small project and learn the necessary materials. Think of how you would have approached a particular problem before looking at the existing solutions.
Take a concrete product and get an understanding of the high level architecture.
- if you are interested in OS, read about linux kernel at high level and various algorithms .
- Or if you like database, look at Sqlite or mysql.
- Think of using a simulators to understand the flow . For example if you are learning Architecture, use SimpleScalar to know how instructions are processed.
- For networking there is NS.
Participate in forums like stackoverflow, quora, programming blogs (Joel on Software, Coding horror, AllThingsDistributed, Steve Yegge for example but this widely varies depending on your interest)
Some concepts are hard to understand, but most concepts are harder to discover in first place (even if they are easy to understand and even obvious — otherwise everything in CS would have been discovered in 5 years after invention of the computer ).
The stack algorithm for evaluating expressions seems obvious now, but there have been hundreds of not-so-neat tricks that were deployed by hackers earlier
The breakthrough by computer scientists are achieved after years of struggle with ideas. On top of it, publishing the ideas and getting reviewed for publication takes lot of time, So what might seem obvious in retrospective may not be in fact obvious.
Quicksort seems obvious now – its inventor C.A.R.Hoare narrates an incident that when he discovered quicksort, it was hard to convince the people about its efficiency (and even correctness).
Dijkstra narrates that he was working for long time on shortest path problem, and suddenly one day on a vacation he discovers the proof. (office hours seem bad even for computer scientists )
I have listed the references for various CS topics which i have used during my engineering course.
- Polya– How to solve it
- Engel – Problem solving strategies
- Dromey How to solve it by computer
— a common problem in many textbook presentations is many are theoretical
— suggest students to start with algorithms used in databases ( many practical applications )
- Start with basic algorithms in sorting and searching .
- Especially merge-sort will teach about divide&conquer
- Hashing – is used to partition data
- Merging – you have two input streams and combine them into a single stream
- Dynamic programming is used for implementing join algorithms
- some binary tree exercises
refer hashing https://www.youtube.com/watch?v=AfKV7YXGY-I
- pick a database like mysql (install on ubuntu)
- try designing a simple database – it may be a library management or ticket booking (redbus) or bookstore (flipkart)
- how to arrange data so that it can be efficiently accessed
- what are the entities , relations
- entities in ecommerce(flipkart) – product(book), customer , order
- relationship – a customer orders a book
- if data is repeated in multiple places , there is problem of anamolies
- so there is need for normalization
- how the data is stored on disk. file organization / btree
- File structures Book by Michael J. Folk
- Most of the algorithms (binary search tree) were in-memory with random access (accessing any address location)
- whereas in disk , random access is not possible – you have to access sequentially (block by block) – so contiguous storage like arrays is preferred
- so have a combination of contiguous storage + flexibility of trees
- when data is too large to fit in memory, external sorting algorithms
- codd – instead of nesting data , use relation tuples
- relational algebra simplifies programming (you can reason about it). SQL is a language that implements this relational algebra
- you can learn a bit about optimizing SQL queries. How queries are executed parse tree of sql query
- CL Liu and Rosen
- DM and programming are related in same way as toc and compilers
- to understand the importance of DM, imagine a programmer trying find the names occuring in 2 files
- kiran sir always stresses the importance of discrete
- Linear algebra
- implement a recursive descent parser – take a simple grammar for evaluating arithmetic expressions
- lex and yacc (from kernighan and pike book)
- we find there are two ways of approching the problem of parsing — top down vs bottom up
- when parsing a language (english)- we have these layers – recognize words , recognize sentences , recognize meaning. similar with parsing a computer langue
- ref http://www2.gvsu.edu/boucharj/Prog1.c
THEORY OF COMPUTATION
- it is time to look into more detail about fsm and parsing – fsm didn’t have memory / parsing needs stack. The programs you wrote are called machines (since programs are implemented using them). The input stream you feed into the machine is the language
- machines and languages
- 4 levels of machines – fsm , pda , lba, turing
- 4 levels of languages – regular, CFL, CSL, decidable
- finite state machine – the one without memory (useful for embedded systems )
- turning machine – with memory, abstraction of digital computer – computes everything that could be computed.
- halting problem – there are somethings that cannot be computed
- there is a class of problems (equivalent to one another) that doesn’t have efficient solution
- this leads to problem of studying NP-Completeness
- turing machine https://www.youtube.com/watch?v=dNRDvLACg5Q
- FSM http://www.inf.ufsc.br/~joao.dovicchi/pos-ed/pos/exerc/machines2.pdf
- finite state machines are used in digital logic – gates, counters, registers(memory), ALU, hardwired control , CPU
- Kiran https://www.youtube.com/watch?v=8S9MMsaUMg4
- Memory hierarchy (keep frequently accessed things closer)
- Digital logic – appendix chapter from Hamacher
- build a computer from first principles
- nand2tetris https://www.youtube.com/watch?v=iE7YRHxwoDs
- layers build logic-gate / memory / ALU / CPU
- Peterson Davie
- Journey of letter via post box goes through layers
- Layers each packet
- All systems courses are about building layers upon another layer
Join Our Forum discussion on various CS topics and subscribe our Youtube channel to get updates on webinars.