Mastering DSA and knowing about all the theories is not enough and can’t guarantee you a secure job. No doubt an employer looks for a programmer who knows both the theory and the practical aspect but if an employer has to choose between one then he would choose the one who is practical and not one who is theoretical! Many employers are so interested in your GitHub “profile” and the projects that you have built over the past years. In this article we’ll look at the projects – implementation questions of which are posed in lots of interviews (particularly system design interview) and which every developer should lay their hands on.
1. A Text Editor
With their relevance in every programming, sub-culture Text Editors tops the list since text-editor is the basic tool every programmer uses and he must be familiar with how a text-editor works. Companies like Flipkart, Microsoft, etc. constantly asks questions related to text-editors in their interviews-questions related to the two-stack model, undo-redo operation (with unlimited stack size unlike Notepad which allows only single undo/redo operations), finding and replacing text, using the trie data-structure (for scaling the text-editor to a word-processor), pattern-based searching (using regular expressions), stylizing text (as in code-editors) and so on. So a Text-Editor project is worth a shot.
Below are some relevant articles you can look up to for learning how to make your text editor:
2. A Graphical Calculator
A calculator is a simple application but a graphical calculator is interesting mainly because of the compact user-interface (not displaying all functionality at once). There are a lot of things that can be expanded to it such as allowing complex expressions in the text-field (as input – which may involve Expression trees), allowing user-defined functions (similar to GNOME Calculator) and so on! The complexity of the project shouldn’t be under-estimated and one must try to keep the user-interface as compact as possible. All and all even if interviewers do-not ask that many questions related to expression trees yet making a graphical calculator can be a good GUI exercise and a project every developer should lay their hands on!
- Java Swing Simple Calculator
- HTML Scientific Calculator
- Python Simple Graphical Calculator using Tkinter
- Expression Evaluation
- Expression Trees
3. Snake Game
Snake Game is definitely a project that every developer should lay their hands on! An interesting thing about making a Snake game is that there are infinite ways to do it! Some little things in Snake can confuse anyone and that’s why companies like Amazon, etc ask questions related to Snake Game Design. Questions such as How’d you re-implement the game such that instead of restarting the game when the snake bites itself it’d cut the segments of the snake and decrease its life by one? or What if the apple is spawned at the snake or one of its segments? and What algorithm would you use to make sure that doesn’t happen?, How would you make an animated Snake game – one that’d use different sprites for snake’s head-tail and body?. The last question is very relevant and I strongly suspect that interviewers will move on to ask the last question since making a sprite-based snake game (similar to Google Snake) is not so trivial as simply making a snake game! The rendering technique is really what makes it difficult.
4. TicTacToe/Connect 4 with AI
Sounds easy, right? We are talking about the unbeatable AI – one that requires the minimax algorithm and alpha-beta pruning! How to making a board game AI – this question is asked in many system-design interviews and interviewers will continue to ask this question until it becomes trivial for everyone! Making an unbeatable TicTacToe AI is pretty easy and nothing to brag about but AI for other board games such as Connect 4 and especially Chess can be pretty daunting (since it involves alpha-beta pruning and handling with a lot of corner cases).
5. Terminal Shell
Shells involve a lot of string-processing and smart use of the two-stack model for storing the history of commands and to locomote between them! Making a Terminal Shell is a great exercise project for learning systems programming since it involves turning on/off a great number of bit flags to have to enter the raw-mode. A lot of GUI applications nowadays have a graphical console in them which works the same way as a shell-commands are entered, parsed and then processed! Ancient games had a console them which was often a time the only means of interaction (text-based adventure games which had their window)! At one point terminal shells can also include some kind of meta-programming (talking with other programs dynamically)!
Below are some relevant articles you can look up to learn more about terminal shells (or consoles) and how to implement them:
6. Sudoku (with AI)
Sudoku is a mathematical puzzle developed by the great Swiss mathematician Leonard Euler. Some say it was originally a Japanese logic puzzle but we won’t get into that. We’ll concern ourselves with the project only – which is about making a Sudoku generator, as well as solver (the solving would be done by an AI-agent) Sudoku can be pretty complicated especially if puzzle has to generate based on the difficulty as that would involve using Las Vegas and also high level of genericization! The AI-part is pretty trivial but depending on your implementation and the data-structure you use, it can be difficult.
For Example, it can be complicated if you define the grid as a matrix rather then an array! Note that we didn’t place Sudoku in the above category – this is because Sudoku is a single-player board game. The player plays Sudoku with himself and there is no second player in the game – meaning no possibility has to be generated at every step. There are a lot of ways you can make the AI – you can simply use backtracking or you can use advanced AI methods such as constraint propagation and make use of data structures such as BST.
7. A Node-Editor
A lot of GUI applications nowadays have something that’s called a node-editor. Every productive software is nowadays expected to have a node-editor in them! 3D Modelling software like Houdini and Blender, game-engines like Unity and Unreal, and story-telling software like Twine – all of these have a node-editor in them. A Node-editor can come in all sorts but the fundamental principle is this that there are basic entities called nodes that have a pin in them that needs to connect to another pin of other nodes! And nodes are connected via wires which are mostly represented by Bezier curves but some represent them as elliptic curves (Twine) or simple lines (Blender 1.8). I recommend you to use Bezier curves in your project since they are the fashion nowadays! Below are some relevant articles which will help you make your node-editor:-
8. Web Crawler
Web Crawlers can be mysterious and not many people know the secret of making a scalable web-crawler and this is how interviewers select the best candidates! Google asks this question of implementing a web-crawler in lots of its system-design interviews and it’d be difficult to answer if someone has never built his web-crawler! Below are some relevant articles you can check out to learn how to make your web-crawler:
- How to make a spider-bot in PHP?
- How to make a web crawler in PHP?
- How to detect SpiderBots with PHP?
- Nodejs | Web Scraping using Cheerio
- Python | Program to crawl a Webpage to get most frequent words
- Python | Implementing Web Scraping in Python with Scrapy
- Python | Tools in the world of Web Scraping
- Implementing Web Scraping in Python with BeautifulSoup
- Deploying Scrapy spider on ScrapingHub
9. Klondike/Spider Solitaire
There are hundreds of different varieties of Solitaire ranging like Golf, Tripeaks, Bakers Game, Thirteen and so on but probably the most difficult ones are Klondike and Spider solitaire! Klondike solitaire (which many people simply call solitaire) can make use of data structures ranging from stacks to splay trees! Also solitaire games can use Fisher-Yates Shuffle algorithm!
10. Chess Game
A Chess game will always be a project that every developer should lay their hands (at least every developer who wants to be a software engineer)! A Chess game has lots of moving parts and lots and lots of corner cases that one must consider! It involves and a lot of Graph Theory and even to this date making an unbeatable AI for Chess is no child’s play! Even with the aid of the minimax algorithm, it can be very difficult to make an unbeatable AI for Chess (since the number of combinations is very high) and one must apply some performance optimization techniques to reduce the memory overhead! A Chess game can also test your design skills such as Are you implementing duplicate behavior or are you using the concept of inheritance, etc?
- Check if a given chessboard is valid or not
- Minimum number of moves required to reach the destination by the king in a chess board
- Design a chess game
- N-Queens problem