Software Engineer: A Short Guide on how to be

Note: Still under construction / last update 15 August, 2017

What?

A short guide customized mainly for software development/engineering role. That is, you know your destination.

The plan is as follows:

  • 1.5-2 of study years to build enough background to pass interviews and work smoothly as a fresh Engineer.
  • In next years, e.g. parallel to your work, you study more to go deeper in your CS knowledge.

Acknowledgment: It is really hard to write such a guide. I studied full-time. It is not easy to cut many things and meanwhile one grow up properly, but Let's try.

Update (Oct 2018): Some popular page has a bigger path. Please also check it and make use of it

Background

From time to time, someone asks me about a guide to the software engineering market. There are 2 cases for such a request. First, Someone with a specialization far from Computer Science and want to do a career shift. The other case: a student who is about to graduate and used to ignore studying, but now regrets and wants to find the shortest way to the market.

There are some good curriculum suggestions already on the web (e.g. Google one / OSSU). Although I consider them good selections, I am afraid they may take much time. It is an excellent choice for people who are not in a hurry, but if you want to find your fastest way to the market, this guide may be better.

For Egyptians graduated since 5 years, 9-months scholarship at ITI is a much better opportunity of for more tracks.

Few Facts

  • In a CS faculty (or CS related), and even in many disciplines, where one studies 4-5 years, the students study many things that they don't actually use in the market. Why?
    • One reason is to let you explore several directions and maybe find your passion in one of the directions.
    • Studying basic courses that you 'might' need their information in an explicit or implicit way.
  • In my Country, Egypt, and in many countries, Software Engineering is the most frequent job for computer science graduates
    • Hence, having a short guide really makes much sense. It is just a puzzle, for me at least, to determine it.
    • Other roles? Software Quality, Security/Network/Database Engineers, research, ..etc

Front-End / Back-End / Full Stack Developer

  • Most of the time, an application has some front end (Web or Mobile [Android or IOS]) and backend (processing business logic).
  • Sometimes, the application is an infrastructure project, this is where no front-end is needed (other things exist, e.g. API)
  • In my opinion, one should be familiar with both sides. Or growing up in the career might be problematic.
  • Note Fresh students who try web or mobile and start to run away as they feel it is boring. You typically underestimate the whole application complexity.

The core to master (9-12 months - 10 hours a day)

  • Programming lies in the heart of the Software Engineering Process
    • Keep that in mind: If you are strong in programming => Most of next things in the career will be a piece of cake
    • Focus for a whole year with a single language.
    • You should learn multiple languages, some compiled and some interpreted. That will help you understand programming concepts and other concerns.
    • Which language to start with? Try to know what is the frequent languages in your local market are.
    • Java or C# are always there and they are general purpose languages with great support behind them.
  • Step 1 - Basic knowledge / Experience
    • Let's select Java, which is 2 parts: Java SE and Java EE.
    • Find a good book for Java SE or a YouTube playlist (In all cases read a book).
    • Go ahead till mastering the basic syntax
      • Data types, Selection, Repetition, Functions, Arrays, Creating multiple files.
      • Learn to create a base class that has some data types and member methods.
      • Learn using the Java Collections very well.
    • Implement 2-3 projects of a reasonable size. Here is an example.
  • Step 2 - Basic Problem Solving Skills
    • We need to be good problem-solvers. Competitive programming offers a smooth way for that.
    • At codeforces site, Master Div2-A, then Div2-B.
    • Follow my sheet to master these 2 levels.
  • Step 3 - Object-Oriented Programming
    • Every day in our work we use OOP/OOD.
    • Resume learning the language to learn the OOP basics.
      • You may need some time to be able to view things around you in terms of Objects.
    • Develop new 2-3 projects using OOP, preferred to be from TopCoder projects.
      • TopCoder is a great way to enhance your Design Skills.
        • it has lots of projects with their docs, design, and code to learn from.
  • Step 4 - Algorithms and Data Structures
    • You can do this step in parallel to step 3 or after it.
    • Data structures:
      • Study the basic topics (Stack, LinkedList, Queue, Binary Search Tree) + Advanced Topics (Hashtable, Heaps, Balanced Binary Search Tree (e.g. AVL or Red-Black Tree).
      • In any of these topics, avoid learning the different variabilities in the data structure (e.g. circular linked list, different hash table probings...etc).
      • Read the codes, but preferred to write some by yourself.
      • The most critical thing:
        • When to use a data structure?
        • What is the time complexity of it?
      • Don't burn much time in that field. Most of the time, we use ready-made data structures. It is all about proper usage, which is not the case when people don't understand what they are using.
    • Algorithms
      • Learn to compute Algorithm Order Complexity (but not other types such as theta/omega).
      • Graph Theory: Representation (DFS, BFS, Dijkstra, MST).
      • Greedy and Dynamic Programming.
      • Binary Search technique / Trie Data structure..
      • Fast iteration on NP-Completeness.
      • You may keep going in my Codeforces sheet to master Div2-C.
  • Step 5 - More programming concerns
    • Keep going to finish your Java programming book.
    • Learn to use to do multithreading, client-server app, crawl internet pages.
    • Be aware of things such as Unicode, Internationalization, ...
    • Don't waste time with Desktop GUI.
  • Courses/Skills to cover in parallel to above Steps.
    • Computer Science Intro (one with diversity, not programming focused, e.g. CS 101).
    • First 3 lectures (and may sample little more): Mathematics for Computer Science.
    • Learn Soft Skills (e.g. leading, management, communication.., etc).

CS courses to know about

  • There are many core CS topics to study. However, their benefit is either rare to use (Assembly / Probability) or not critical to know for a fresh Engineer but may be important later (OS/networking) ... etc.
  • Avoid Math (Probability, Calculus, Linear Algebra).
  • Read 1-2 chapters in
    • Computer Theory, Assembly programming, Computer Architecture, Computer Graphics.
    • Cryptography, Security, Cloud Computing, Parallel Computing, Discrete Mathematics
  • Read 3-5 chapters in
    • Networking, Operating Systems, Databases
    • These courses are important. So keep reading in them.
    • For back-end guys, go deeper in Databases.
  • You can study these chapters in parallel to the next stage..

ITI Scholarships

  • In Egypt, for graduates within 5 years, one could apply fo ITI. I think 9-months scholarship. It gives you good skills and may match opportunity for you.

TODO