6. ACM COMPUTING CURRICULA
● Algorithms and Complexity
● Architecture and Organization
● Computational Science
● Discrete Structures
● Graphics and Visualization
● Human-Computer Interaction
● Information Assurance and Security
● Information Management
● Intelligent Systems
● Networking and Communications
● Operating Systems
● Platform-based Development
● Parallel and Distributed Computing
● Programming Languages
● So ware Development Fundamentals
● So ware Engineering
● Systems Fundamentals
● Social Issues and Professional Practice
8. PROGRAMMER COMPETENCY MATRIX
2^n (Level 0) n^2 (Level 1) n (Level 2) log(n) (Level 3)
data
structures
Doesn't
know the
difference
between
Array and
LinkedList
Able to
explain and
use Arrays,
LinkedLists,
Dictionaries
etc in
practical
programming
tasks
Knows space and time
tradeoffs of the basic data
structures, Arrays vs
LinkedLists, Able to
explain how hashtables
can be implemented and
can handle collisions,
Priority queues and ways
to implement them etc.
Knowledge of advanced
data structures like B-
trees, binomial and
fibonacci heaps,
AVL/Red Black trees,
Splay Trees, Skip Lists,
tries etc.
algorithms Unable to
find the
average of
numbers in
an array (It's
hard to
believe but
I've
interviewed
such
candidates)
Basic sorting,
searching
and data
structure
traversal and
retrieval
algorithms
Tree, Graph, simple greedy
and divide and conquer
algorithms, is able to
understand the relevance
of the levels of this matrix.
Able to recognize and
code dynamic
programming solutions,
good knowledge of
graph algorithms, good
knowledge of
numerical computation
algorithms, able to
identify NP problems
etc.
9. FIND YOUR WEAKNESSES
1. Learn about IT Knowledge Areas
2. Fill a competency matrix
3. Create roadmap from the results
10. GOOGLE TECHNICAL DEVELOPMENT GUIDE
1. Take an “Introduction to CS” course
2. Code in (at least) ONE object-oriented programming language (C++, Java®, Python®)
3. Learn other programming languages (JavaScript, CSS, HTML, Ruby, PHP, C, Perl, Shell script, Lisp,
Scheme)
4. Test your code
5. Develop logical reasoning and knowledge of discrete math
6. Develop a strong understanding of algorithms and data structures
7. Develop a strong knowledge of operating systems
8. Learn UX design
9. Learn artificial intelligence
10. Learn how to build compilers
11. Learn cryptography
12. Learn parallel programming
13. Work on projects outside of the classroom
14. Work on a small piece of a large system (codebase), read and understand existing code, track down
documentation, and debug
15. Work on projects with other programmers
16. Practice your algorithmic knowledge and coding skills
17. Become a teaching assistant
13. TEACH YOURSELF
Follow the trends
Read (a lot of)
so ware engineering blogs
So ware Engineering blogs (aggregated version)
technology books
Practice
Katas
CodeWars
CodingDojo KataCatalogue
Challenges
Project Euler
Python Challenge
Ruby Quiz
CodinGame
Pet projects