Disclaimer: Opinions shared in this, and all my posts are mine, and mine alone. They do not reflect the views of my employer(s), and are not investment advice.
This is a long post, so here’s the list of sub-topics to help you navigate:
Introduction
As I’m writing this, it’s been about 5 years since I graduated with an undergraduate degree in electrical engineering. Whenever I talk to current students, a part of me goes back to my time in undergrad - I think about the things I did right, things I did wrong, and how everything played out in the end. This post is an attempt to consolidate my reflections, and answer a broad question many students ask: How do I navigate my undergraduate degree to successfully pursue a career in computer engineering?
A few caveats:
When I say “Computer Engineering”, I’m specifically talking about the typical skillsets needed to design a digital computing processor.
Your time in college plays an important role in transitioning you to adult life. This post talks only about one aspect of that transition - your career. This is not a “how to live your life” guide.
This post makes most sense if you are about to start a typical 4 year undergraduate program. If you are in a different situation, you can still use some of these ideas, but modify them according to your situation.
My initial plan was to list out a set of tips, but to make it more fun for me to write (and hopefully more fun for you to read), I have framed your progression as a game, called “The Computer Engineering Game”. Our game has 5 levels. Each level has:
Objectives: What you should achieve at the end of the level
Gameplay: Different ways to achieve your objective
Cheat Codes: Something you can use, if you have the option, to make the level easier (not everyone can use cheat codes, and that’s fine!)
Traps: Things to watch out for as you navigate each level
If you have understood the rules, scroll down to start your journey in the computer engineering game.
Level 1: The branch prediction conundrum
Like every good processor, you need to make a key early decision as you are decoding your career.
Objectives:
This level has a very simple objective - at the end of this level, you need to decide whether you would like to pursue a career in computer engineering, or not. At this stage, you don’t need to know the specifics about what sub-domain within computer engineering you are interested in - it’s a simple ‘Yes’ or ‘No’ to computer engineering.
Gameplay:
I think if you are reading this, you already have some inclination towards computer engineering. I can write a whole post about what makes computer engineering great, but here, I’d like to focus on questions that highlight the realities of working as a computer engineer. These questions may sound grim, but that does not mean computer engineering is a bad career - semiconductors continue to be the vehicle on which all technological progress is built, and computer engineers make this progress happen. So treat these questions as a reality check, instead of something that drives you away from the field.
To decide if computer engineering is right for you, I suggest answering the following questions:
At a high level, do you understand how a processor works?
If not, that’s totally fine. You are a short video away from saying ‘yes’ to this question. I recommend something like this: How a CPU Works.
If you have the time, the extended version of this video is a book called But How Do It Know by J Clark Scott.
Does the idea of designing a computing chip (like a processor) excite you?
If the answer is No, computer engineering is likely not the best choice for you.
Do you like problem solving and debugging?
Your daily job would involve thinking very deeply about problems. It sounds cool on paper, but advancing in this career needs you to continue to be an excellent problem solver over many decades. There are other careers (and I mean no disrespect to them while saying this), which are primarily based on different skills - like communication, planning, and so on. Computer engineering isn’t like that.
A career in computer engineering is slow moving - you need to spend many years at what you do to feel (and be recognized) as an important contributor. Does that sit well with you?
I think doing great things takes time in any field, but some others like software engineering have quicker feedback and progress (like quicker promotions, and more opportunities to change jobs). It’s important to understand, and accept this reality about computer engineering jobs today.
Can you tolerate longer project cycles?
This is a nuanced extension of the previous point. But depending on your role, the product you are working on could take anywhere from 6 months to 5 years to be fully realized. A lot of people are motivated by seeing their work out in the world quickly. I get that, but the complexity of modern semiconductor manufacturing does not allow for this. There is a good chance you may not be in the same role when the product you worked on is actually released.
You might make lesser money than some of your peers as you are starting your career. Is that an acceptable tradeoff?
As much as I hate saying this, the honest truth is that if you are a smart, driven individual looking to make the most money, there are better options than computer engineering (fields like software engineering and quantitative finance come to mind). There is a fundamental reason why this might never change - computer engineering companies produce physical products (or sell to others who produce physical products), and it costs money to make these physical products. Having said that, computer engineering salaries have been increasing recently, and continue to be on the higher end of the overall salary distribution among all careers.
Despite what I said, you also need to ask yourself a different question here: can I be one of the best computer engineers? I think the best computer engineer would make more money than the average in other fields, so if you think you can be one of the best, then money shouldn’t be a problem.
It’s important to take time, gather more information, and answer these questions carefully. If you can say YES to all these questions, computer engineering is a great career choice for you and you can move forward to level 2. If there are some clear NOs, I think you should look at other careers.
Cheat Codes:
Do you have a friend or family member that works as a computer engineer? If yes, ask them questions to understand what you might be getting into. Go to their workplace, see what they do on a daily basis.
Can you get some part time work in computer engineering? College clubs are one way. Other options could be to get some (likely unpaid) internship, or work in a research lab at your university.
Traps:
While making this decision, separate the “product” from the “job role”. I did say you need to be excited by processors to take up this career, but that’s the least significant question in my list. Unfortunately, we do not have one man computer engineering teams today - maybe AI can change that, but until then, you only play a role in making a product (especially early in your career). This is different from a solopreneur who can design an app by themselves - here, the line between “product” and “job role” starts to blur)
Don’t take up computer engineering for a specific company, or the money. Companies become irrelevant quickly, and the money comes at the cost of a challenging job. These external factor should be treated as a nice to have, not the basis for your decision.
I mentioned college clubs. While they are an effective way to get hands on experience, they sometimes present a rose tainted picture. Your experience will be seriously impacted by how you feel about the people in the club. It is unlikely that you will work with the same set, or even same type of people in the future. Take only the work aspect of your college club experience while making a career decision.
It’s understandable if you change your mind later, but don’t rush through this level - it is more optimal to spend more time in Level 1, make the right decision, that to regret your decision in a few years.
Level 2: The compilation grind
Assemble information from different sources and create a binary representation in your head.
Objectives:
Welcome to level 2. Your goal in this level is to understand the fundamental ideas in computer engineering. Broadly, I have defined three main categories which are important:
Electrical Engineering 101
Computer Engineering 101
Computer Science 101
Gameplay:
Let’s look at each category from above in more detail. I’ll provide a “bare-minimum” list of topics to be covered, along with a free, publicly available course as a template for each topic.
Electrical Engineering 101
This includes fundamental topics in electrical engineering - usually these are required courses for any student pursuing an electrical engineering degree. There are two fundamental categories of courses I recommend here:
Circuits 101
Topics:
Basic circuit analysis methods
Analog vs Digital circuits
How do fundamental circuit components work - Capacitors, Diodes, MOSFETs, Operational Amplifiers, Memory elements, and Filters
An Example Course: https://ocw.mit.edu/courses/6-002-circuits-and-electronics-spring-2007/pages/lecture-notes/
Signals 101
Topics:
Continuous vs Discrete signals and how to mathematically represent them
Manipulating signals - why, and how?
Useful operations - Convolution, Filtering, Modulation, Sampling, and Interpolation
Transforms to change signal representations (Fourier, Laplace, Z transforms)
Systems with feedback
An Example Course: https://ocw.mit.edu/courses/res-6-007-signals-and-systems-spring-2011/pages/lecture-notes/
Computer Engineering 101
I have defined this category to include the basic courses that will tell you more about the building blocks of a modern computer. I’m sharing two reference courses here:
Digital Logic Design
Topics:
Combinational logic blocks
Arithmetic blocks
Sequential logic blocks
State Machines
Memory
An Example Course: https://ocw.mit.edu/courses/6-111-introductory-digital-systems-laboratory-spring-2006/pages/lecture-notes/
Computer Organization
Topics:
How instructions/data move in a computer
Data representation in computers - binary/hexadecimal, floating point representations
Things computers can do - arithmetic/logic, data movement, conditional execution
Computer architecture concepts at a high level - Pipelining, Caching, Memory hierarchy
An Example Course: https://www.youtube.com/playlist?list=PL-Mfq5QS-s8iUJpNzCOtQKRfpswCrPbiW
Computer Science 101
This is an important category, and the one that is most often neglected. (Most universities do not enforce these as mandatory requirements for an electrical engineering degree.) However, a good computer engineer should at least know as much computer science as a CS sophomore. Any CS 101 course would do. (Harvard CS 50 is a popular choice - https://www.youtube.com/playlist?list=PLhQjrBD2T381WAHyx1pq-sBfykqMBI7V4).
The topics covered by such a course would be:
Types of programming languages, and compilation flow
Basic programming constructs (pick any one language here)
Fundamental data structures (Arrays, Stack, Queue, Linked Lists)
Simple algorithms (Search, Sort, Recursion)
Memory allocation (pointers, dynamic memory, segmentation fault)
At the end of this level, you should be able to answer the following questions:
What are the fundamental components in electronic circuits, and how do they work?
How do we represent physical values in digital form? (this is why you need the Signals 101 course!)
What is digital logic, and what are the building blocks of a digital circuit?
How does a processor work? (You might realize I asked this in level 1 as well. In level 2, you should have a much more detailed answer)
Given a problem, and I know a solution to the problem, can I write a program to solve the problem for me?
Cheat Codes:
The name of the game in level 2 is: “Cover maximum number of topics, with minimum overlap”. So depending on the university you are in, or the material you are using, you could optimize this level - for example, you may find a course that combines Digital Logic Design with Computer Organization.
Programming coursework has become a lot more accessible, so you can try to finish your CS 101 topics before you start level 2. (Don’t worry, even if you choose not to pursue computer engineering after level 1, programming is a valuable skill that you will end up using at some point in your career)
Prefer courses that have a lab or project component. Often, these courses involve more work, but as you will see, they will save you time in level 3.
Traps:
What you learn in level 2 is the foundation for everything that comes next in your computer engineering career. Resist the temptation to skip topics or breeze through this level. Any additional time spent here, will speed up your upcoming levels.
If you are in a university, following their curriculum is good enough for level 2. You don’t need to do anything fancy here. Introductory courses at universities are usually well designed - there is no need to game the system.
There is a tendency for students pursuing computer engineering to assume that programming is optional, or that they only need conceptual understanding of programming. If you feel this way, please get this thought out of your head. Being a good programmer is now a prerequisite for most computer engineering careers. The earlier you start programming, the more you will do it, and the better you will become. I can’t stress this enough - programming is just as important as anything else you do in this level!
Level 3: From simulation to emulation
Time to load up some real hardware
Objectives:
In Level 3, you are going to put the theoretical knowledge from level 2 into practice. The goal is to identify the type of work you like, while simultaneously earning some CV points. At the end of this level, you should be able to answer the following question: What kind of computer engineering job would I like in the future?
Gameplay:
Remember how I said level 2 is straightforward if you are enrolled at a university? Level 3 is on the other extreme - it is mostly self-driven. There are many types of “real-world” jobs that you can do to achieve the objective of this level. I’ll talk about three common approaches that I have experienced:
Corporate Internships:
In my experience, these are the most sought after, and as a consequence, the hardest to get at this level. However, at major tech companies, especially in the US, I see a lot of students interning very early in their academic career (even right after their first year!). If your goal is to work at one of these companies in the future, this is a perfect opportunity to see what your life would look like (FYI - interns get much better treatment than employees to lure them to join, but you can still assume you would get 80% of what you see.) I don’t have too much to say about this category, except that hiring at this level is fairly random (there isn’t too much to differentiate candidates). So everyone should try for one of these, but it’s not the end of the world if you don’t land one at this level.
Working with a professor:
This is what I would classify as the “sweet spot” for this level. Good professors encourage students to work with them, and be involved in their research group. I also think academic research is perfect for this level, because it gives you an understanding of what’s new in the field - so you pick a more future-proof career. I’ll just throw in a few caveats:
Don’t expect too much attention from the professor that you are working with. All you need from the professor is to introduce you to the other members in the group, and involve you in their discussions. The rest is on you.
For the goals of this level, you actually don’t need a hands-on advisor. Reach out to other members who have been in the group longer (like PhD students) to get started.
If you really want the professors attention, “show, don’t tell”. Give them something useful, don’t give them more work to do.
Do an actual project as part of your research. Reading papers is important, and that’s how you get started at this level, but you should quickly move on to actually producing some results. The purpose of this level is to get experience working in the field - so don’t just read.
Personal Projects:
After reading the first two categories in this section, this might look meek to you. But this was my main intention for this level. A personal project may not look as good on your resume, but it’s actually more useful than internships for this level, because:
Anyone can do it
You can do multiple such projects
You can choose exactly what you want to work on
My suggestion before embarking on a personal project is to actually talk to someone who has more experience than you - could be a college senior, or just someone who is at the position you want to be. Ask them what kinds of projects would be useful for your goals. This will ensure that your experience is realistic and actually prepares you towards your future career.
If you want to make this a bit more formal, I suggest looking into some open source projects/programs in your field of interest. Unfortunately, computer engineering lacks dedicated programs like software engineering, but you can still find some hardware engineering projects in something like Google Summer Of Code (GSoC). Also, open source EDA is on the rise, and I have shared some resources in an earlier post that would also help in getting started.
I want to end by saying one thing - irrespective of whether you are working on an established open source project or something you just cooked up yourself, document it with all the details. If you have code, have a well maintained repo on Github. I think documenting helps you learn better, but more importantly, it can legitimize your projects - solid documentation seen by the right person could open up a lot of doors in your career.
I want to end with some questions that you should be able to answer at the end of this level.
Do I like working in a lab, or do I like working in an office?
Do I like the slow grind of research, or the fast pace of corporate life?
What subdomain do I want to explore in more detail? (Spoiler alert, you will lock this down in level 4.)
Cheat Codes:
One of the best ways to be accepted into a professor’s research group is to take a course with them, secure a good grade, and reach out to them as the course is about to end. Even if you don’t have a good grade, give this a try if you liked the course - professors prioritize familiarity over anything else.
If you know someone that can get you some unpaid projects at their workplace, you can take that up. But remember that if you are doing unpaid work at this level, you should be compensated with flexibility - in terms of what you want to work on, and for how long. Use that flexibility to your advantage.
If you had a project in one of your courses in level 2, the easiest way to play level 3 is to just take that project to the next level. But try to expand your knowledge while doing this so that it takes you closer to the objective of this level.
Traps:
A lot of students assume this is an optional level - it is not! I understand that not everyone might get an internship at Google, or be accepted into a professors research group, but you can certainly do a project on your own - there are great resources available for free. (Even if you have no ideas, today, you can ask ChatGPT to come up with an idea for you, and tell you exactly how to implement the idea!)
When looking for work opportunities at this level, a lot of students optimize for the wrong things - money, or reputation. Don’t do that. I’m not giving generic advice like “follow your passion”. The reality is that at this level, you don’t have enough leverage to demand either - so it is better for you to focus on the type of work, and bet on the long term.
If you were able to score a corporate internship, that’s fantastic. But remember that it could be a double edged sword - you might be doing dull, redundant work that does not push you towards the objectives of this level. I would still suggest taking up corporate internships if they are available, but if you have more than one option, choose wisely.
It’s okay if you want to work on group projects. But it is very important that you get your hands dirty and make significant individual contributions to the project - otherwise, you won’t really know if you like the work, or you just like the end result of your group project.
Don’t undersell yourself - successful applications at this level are mostly a result of confidence. If you have done level 2 right, you have the skillset needed to manage most tasks you would be working on. The bar is very low for positions at this level.
Level 4: Finalizing the floorplan
Place all your blocks at the right place, and start to connect them. The quality of chip you end up with depends on this!
Objectives:
This level has two missions
You need to decide what sub domain in hardware engineering you want to pursue
You need to get proficient with the coursework for those sub-domains.
At the end of this level, you will have the skillsets needed to move forward to a career in your desired sub-domain.
Gameplay:
Level 4 is the longest level in this game. Here, you will be taking up advanced, but niche coursework (If you remember, level 2 had fundamental, but broad courses). At the university level, these courses are usually “electives”, or optional - which means you need to put together the best combination of courses for your needs. Along the way, you also need to decide on the sub-domain you want to start your career in.
What are the different sub-domains?
I have classified all the traditionally useful skills in computer engineering into three broad categories, each with three sub-categories:
Building the chip: This includes roles that are needed to create a semiconductor chip from a concept. I would say this is roughly what is called Digital VLSI Design. It covers the following areas:
Microarchitecture design: Here, you take some functionality, and come up with the most efficient arrangement of digital logic blocks to implement that functionality. Traditionally, this involves RTL (Register Transfer Level) design using a HDL (Hardware Description Language) like Verilog.
Physical design: This is where you actually decide where each transistor should be placed, and how they should be connected. Today, this is achieved using EDA (Electronic Design Automation) tools - so the role of a physical design engineer is to understand how to use these EDA tools to get the best possible chip.
Verification: When you build a chip, it is crucial that you build something that works as expected. This is where verification comes in. Verification happens at many levels in the chip design process - functional verification (called DV (design verification)), performance verification, verification after the chip is manufactured (post-silicon), and so on.
Making the chip usable: When you design a chip, all you have is a fancy looking solid made of silicon and other materials. A chip becomes useful when it comes with some supporting software that makes it capable of running existing applications (like booting an operating system, or running a game). This is where skills in this category come into the picture. I am mentioning three sub-topics to better explain this role:
Compiler design: If you finished the Computer Science 101 course in level 2, you know what a compiler is. Depending on the type of chip you have designed, you will either need to modify existing compilers to fit your needs, or build a new compiler from scratch.
Driver design: A driver is a piece of software that ensures that your chip can communicate with the operating system you are building for. This is another key component that most computing chips need.
Firmware design: Not everything the chip does is governed by the user application (through the compiler) or the operating system (through the driver). There are some tasks that need to be run automatically - for example, when a chip is first booted up, some tasks needs to be executed to make sure it works correctly. This is done through a special type of software called firmware.
Analyzing the chip: This includes what we commonly refer to as “Architecture roles” (Not the house building kind :) ). Computer architecture is simultaneously the first and last step in chip design - you analyze how your current chip has done, and what your next chip should do. I have divided architecture roles into three categories:
Modelling: Come up with a software version of the chip, so that new features can first be experimented there (before you ask someone to “Build the chip”)
Workload analysis: A workload is a standard piece of software that is meant to demonstrate the operations needed for a particular application. A workload analysis role is needed to ensure that workloads execute efficiently on the current chips, and also identify bottlenecks for future chips to address.
PPA/Competitive analysis: This is closely related to workload analysis, but here, you focus on Performance, Power, Area (PPA) on your current chip, and try to compare it with what your competitors are doing, to plan for future generations of the chip.
There may be other roles that don’t fit exactly into one of these categories, but broadly, this covers the typical skills you would find in a chip design team.
Suggested Coursework:
I’ll start with courses that I think you should do, irrespective of the sub-domain you are interested in. I’ll use the same format as level 2.
Computer Architecture:
Topics:
Instruction Set Architectures (ISA)
Pipelined processors
Handling Hazards
Out of Order execution
Memory hierarchy and caching
An Example Course: Onur Mutlu’s Computer Architecture lectures - https://www.youtube.com/playlist?list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq
VLSI Design Flow:
Topics:
Cover the different steps from RTL to GDS
RTL design and simulation
Logic synthesis and static timing analysis
Floorplanning, placement, routing
Clocks and clock distribution networks
Verification and testing
A simple project covering all these steps would be a nice add-on
An Example Course: NPTEL VLSI Design Flow: RTL to GDS - https://nptel.ac.in/courses/108106191
Operating Systems:
Topics:
Processes and Threads
Synchronization
Scheduling
File handling
Interrupt/Exception handling
Virtualization
An Example Course: CSE 421 by Geoffrey Challen - https://ops-class.org/
Coursework specific to your sub-domain:
Building the chip
CMOS Digital VLSI Design
Topics:
What is CMOS design
Building combinational CMOS logic circuits
Building sequential CMOS logic circuits
Designing memory circuits
Metrics to analyze different circuits - logical effort, fanout, parasitics, etc
An Example Course: IIT Roorkee CMOS VLSI Design - https://www.youtube.com/playlist?list=PLLy_2iUCG87Bdulp9brz9AcvW_TnFCUmM
VLSI Design Automation (how EDA tools work)
Topics:
Algorithms to implement different steps in the RTL to GDS flow
Synthesis
Floorplanning
Placement
Routing
Clock Tree Synthesis
An Example Course: IIT Kharagpur VLSI Physical Design - https://www.youtube.com/playlist?list=PLU8VFS-HdvKtKswbcvvA8yVhzleTV7OE8
Some bonus courses
A dedicated RTL design course - https://www.youtube.com/playlist?list=PLwdnzlV3ogoVlY7iVqr-FhWUQEX7JDdiP
A course on verification methodologies (UVM/OVM) - https://www.youtube.com/playlist?list=PLBIILfL2t1lnvzw7vF0arlvu36Wj4--D7
FPGA and High Level Synthesis - https://www.youtube.com/playlist?list=PLf4U4tpbjjz7x_bsG3sBEuXgVQPZfWJgW
Making the chip usable
Compilers
Topics:
Lexical analysis
Parsing and Abstract syntax trees
Semantics
Register allocation
Code generation
An Example Course: Stanford Compilers - https://www.youtube.com/playlist?list=PLTsf9UeqkRebOYdw4uqSN0ugRShSmHrzH
Data Structures and Algorithms
Topics:
Standard DSA topics like different data structures, and their use in algorithms like sorting, searching, etc
An Example Course: MIT OCW DSA course - https://ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/
Some bonus courses
Programming Language Design - https://ocw.mit.edu/courses/6-821-programming-languages-fall-2002/
Something related to LLVM/GCC internals - https://www.youtube.com/playlist?list=PLlONLmJCfHTo9WYfsoQvwjsa5ZB6hjOG5
Analyzing the chip
Parallel computer architecture
Topics
Multicore
Multithreading
Caching in multicore
Interconnects and Dataflow between cores
An Example Course: CMU 742 - https://www.youtube.com/playlist?list=PL5PHm2jkkXmh4cDkC3s1VBB7-njlgiG5d
Computer Networks
Topics
Packet Switching basics
TCP/IP
Router design
Multicast networks
Security and scalability considerations
An Example Course: MIT OCW Computer Networks course - https://ocw.mit.edu/courses/6-829-computer-networks-fall-2002/
Some bonus courses
A course on GPUs, or Domain specific (like AI) accelerators - https://www.youtube.com/playlist?list=PLbRMhDVUMngfj_NXI7jqMYLnhcRhRKAGq
A course dedicated to memory systems - https://safari.ethz.ch/memory_systems/ACACES2024/doku.php?id=start
How to navigate this level:
So far, I have listed the different sub-domains in computer engineering, and the different courses in each sub-domain. Ideally, if you already know what sub-domain you want to pursue, all you need to do is to take up the coursework for that sub-domain. But often, you are still discovering your interests. I recommend an iterative process like this:
Ask yourself if you know what sub-domain you want to pursue
If Yes, great, focus on courses in that domain
If No, take a broad course (or one of the mandatory ones I mentioned), and try to find your interest
Repeat this until you converge at one sub-domain.
Cheat Codes:
All courses you do here should ideally be accompanied with a project. If it is not, make a pseudo project on your own - it could be as simple as a review of state of the art research in the field. This will help in your decision making process, and also make your life easier in level 5.
Similar to level 2, if your university offers courses that cover maximum number of topics in minimum number of courses, that would help you reach your goal more easily.
Use your learnings from level 3 here:
If you liked, and were successful at the projects you took up in level 3, that’s a good indicator towards the sub-domain you should pursue.
If you really disliked a project you did, use that signal to eliminate sub-domains
Traps:
I understand if I get some pushback for recommending a VLSI course to someone interested in compilers/firmware, or an OS course to a VLSI engineer - but I think there is value, especially in the long run.
As someone working in the software side, understanding the VLSI flow will help you make better decisions about hardware vs software tradeoffs (Basically, you can answer the question: why is something implemented at compiler/driver/firmware level, when it can be implemented directly in hardware?)
As a VLSI engineer, understanding how the operating system works can help you extrapolate how a change in hardware propagates to the application, and can push you to do more impactful work for your organization
This level could become extremely long if you go into “analysis paralysis” mode and cannot decide on the sub-domain you want to take up. Take your time, but remember that they are all equally important aspects in hardware engineering and your goal is largely the same - to build the best computing chip. Think about the type of job you would like doing, and give yourself a hard deadline to take a decision. The sooner you decide, the more time you will have to become more specialized in your sub-domain.
Some of you reading this might actually be high performers that feel they can cover all sub-domains. That’s a great attitude, but I still recommend going deep in one sub-domain at this level. I will talk more about how you can maximize your skills in an upcoming “bonus level”.
Level 5: Making the state transition
As the clock hits “posedge” (I.e. “positive clock edge” in Verilog), its time to take the leap.
Objectives:
This level is meant to successfully transition you from a student of hardware engineering, to a practitioner. At the end of this level, you should:
Know what you are going to do next
Have the means to get there
Gameplay:
Most of us don’t play the hardware engineering game for fun - there are typically two outcomes:
Join the hardware engineering industry
Pursue advanced training (like graduate school)
Each of these topics deserve their own post (which I want to compile at some point.) Here, I’ll just talk about reasons to pick one over the other, and briefly mention few ways to be better placed for these opportunities.
What should you do in level 5
Draft a strong CV that is ready to be shared
I’m not talking about specifics here like 1 page only, action points, etc. The key is “maximum impact in minimum space” - whatever that means to you
Make sure to link to documentation of the projects you pursued (this is why I mentioned documentation as a key in level 3)
Decide which path you want to pursue in the future
Reasons why you should take up a job
You need financial stability in your life
You want to gain some work experience to move to something different (like an MBA, or management roles)
You want to see how things are working in the real world
You want a break from the academic life
Reasons why you should go to grad school
You feel you want to gain expertise in some niche topic (this should lead you to a PhD)
Either the role, or the location is inaccessible without graduate school (this is a common reason why students pursue a Masters in the US)
You have some fellowship or funding opportunity that makes grad school financially attractive
You want to pursue a career in academia
You want to change sub-domains
What should you do in level 5, specifically if you want to take up a job
Prepare for job interviews
It’s not ideal, but there are some aspects of interview preparation that are not covered well through your coursework - so I recommend taking interview preparation as an independent task, and giving it sufficient time and effort.
I have a post that talks more about how to prepare for interviews for some roles here: https://chipinsights.substack.com/p/hardware-engineering-interview-resources
Actively reach out for jobs in your desired sub-domain
Here are some ways:
Apply directly on job sites of your target company (if you have the right profile, you’ll be surprised how often this works)
Through your university (see Cheat Codes below)
Through contacts you made in earlier levels (Internships, Projects, etc)
Through social media like LinkedIn
Recruiters are active here - you can directly reach out to them
Some managers post when they have openings
Just message strangers (even if people can’t directly hire you, most people would offer you a referral at their companies)
Attend industry conferences or networking events (this is a bit of a lucky draw, but you may stumble upon the right person)
What should you do in level 5, specifically if you want to go to grad school
Start connecting the dots from level 1 to 4
A key component of any graduate school application is a “Statement of Purpose” - something that explains why you want to pursue graduate school in the first place. In level 5, you need to start thinking about the story - and the way you make it stand out is by combining all the aspects of your journey.
Focus on academic research
Even if you have no experience working with research group or publishing papers in levels 1 through 4, if you want to go to graduate school, I highly recommend doing that now. Typically, this means working with a research group at a university, and producing at least one of the following artifact:
A research paper
A thesis/dissertation
A strong letter of recommendation from your supervisor
Maximize your grades
I have not really spoken about the value of grades in this post - I think it’s a convoluted debate for another day. But grades actually play a very important role in your graduate school application. Ideally, your grades would stay healthy from the start; but even if you are at the end of your program, pushing for some good grades is still useful.
Come up with a list of universities you want to apply to for graduate school
This depends a lot on what your goals out of grad school are. In summary, it depends on the following factors
Matching your interests/background with that of professors at the university
Prospects after grad school (job? academia?)
Location/Expenses
Prepare all the pre-requisites for graduate school applications
Do I need to take some aptitude tests like the GRE
What all do I need to apply (like recommendation letters, documents from your undergraduate university)
Cheat Codes:
If you are studying in a reputed university, you can use that to your advantage when looking for jobs, through:
career fairs or campus placements
if you have worked closely with a professor who has industry ties, they may also be able to get your profile at the right hands
Reach out to alumni who are now working at your target companies
If you are still at university while doing this level, apply for an internship first instead of a full-time job: companies are more likely to convert their interns to full-time than to hire from outside.
I think in today’s world, it really helps if you have some kind of “influence” on social media that comes from your projects - so post about your projects, experiences, learnings on places like LinkedIn or Twitter. Level 1 to 4 is about grinding when no one is watching, but level 5 is about grabbing eyeballs, so use social media to your advantage.
It is usually easy to transition from an undergraduate to graduate degree at the same university. You may also be able to pursue a accelerated BS+MS program. This is a good hack to do grad school, but ensure that doing this is actually helping you end up where you wanted to after grad school.
I believe that if you have done level 1 to 4 right, and you have some financial flexibility, both these options should be realistic for you. In that case, there is nothing wrong in trying for both, and deciding which one to choose based on your options - for example, you might want to take up graduate school only if you are admitted at a specific university, or you might want to take up a job only if it is at a certain company. In cases like this, pursue both paths together and buy yourself more time to decide.
Traps:
Resist the temptation of short term gains. I see a lot of students going through level 1 to 4 perfectly, but ending up with a job in software engineering or finance because it has a 10% higher salary. I completely understand that money is important, but if you like computer engineering and can afford a minor short term financial hit, stay with it - with strong fundamentals, you will have a richer (literally) career in the future.
Be very careful before you take up graduate school - it usually comes with a financial strain, and immigration laws in countries like the US puts additional pressure on you. Take up graduate school only when you feel you are truly ready.
This point is more important if you are also using grad school as an opportunity to change sub-domains (for example, from RTL design to compiler design) - avoid this if there is already a lot of uncertainty in your life.
Remember that applications for a job, or for grad school, usually take place many months before you graduate - so if you want no breaks in your career, you need to act fast on level 5
Bonus Level: Positive slack optimization
If you “meet timing”, you have the luxury to optimize for power, area and other aspects of your chip
Objectives:
If you actually made it so far (both as a reader, and in your career), give yourself a pat on the back. Going through level 1 through 5 already prepares you well for a career in computer engineering. I have included this level for the ambitious-types who want to push themselves even more.
This level is all about combining time, knowledge, and flexibility, and exploring what you can do with it. In this level, you goal should be to expand your skillsets and build a stronger profile to differentiate yourself from your peers.
Gameplay:
While this level is meant to be flexible, here are a few ways to achieve the objectives of your goal:
Explore coursework in the sub-domain that you did not pick
While in level 4, I insisted that you should pick a sub-domain and go deep, this is a chance to explore some other domains in detail as well. For example, if you would like to specialize in workload analysis, and have already secured a job in that domain, this might be a good time to explore RTL design, or compilers. Although this won’t help you immediately in your job, you will need skills in multiple areas if you want to move to an expanded role at an organization, or maybe even build a product of your own someday.
Complete a major project
While you have been doing projects consistently from level 3, it’s very likely that they were small projects targeting a specific skillset. In this level, you have the freedom to take up something bigger. Of the top of my head, these are some ideas
Work with a professor at your university on a thesis
Build a real chip using Open Source tools (Basically go through all the steps from scratch)
Combine the different projects from your past to build a useful product (this could potentially lead you to starting your own company someday)
Get some (more) work experience
If you have the opportunity, pursue an internship at a company or with a research group. I would recommend to go somewhere different from where level 5 is taking you - for example, if you have a job lined up at a company, try to intern at a different company. This is a good way for you to gain different perspectives that could be valuable in the future. (For example, if you want to change jobs at some point.) Plus, you can make decent money while doing internships at this level.
Take a bet on a new technology
By this point, you will have a good idea about the way computing technology is evolving. As you are going through these levels, you would have come across a lot of buzzwords - “Artificial Intelligence”, “Quantum Computing”, or whatever else that looks promising when you are reading this. In the bonus level, spend some time to pick one area that you think will be “the next big thing”, and gain some knowledge about the field. This will certainly help you in the future - if you were right, you have a first-movers advantage; if you were wrong, understand why you were wrong, and how to choose better. If you aspire to be at leadership positions in the future, having “good taste” is important. I wrote a piece on taste in my other blog if you would like to know more about this:
Develop a voice
As I mentioned in level 5, having influence can open a lot of doors. This level is a good opportunity to start thinking about that. Ask yourself: Is there something that I like doing that offers value to others? This could be anything, like starting a research paper reading group, mentoring students at your university, or producing content online. All of these will start off very small, but if you do it consistently, you could become a very influential voice in the field.
Cheat Codes:
If you have the luxury to take some time off before you transition to the next stage of your career, you can fit in the bonus level there. That way, you can move at a more natural pace and still get ahead of your peers before you make your career transition.
Although I have mentioned this as a level, you can (and should) do the things listed here at different points later in your life. Even if you are in your 40s, and want to take up something listed here, you will still see benefits in your career.
Traps:
Make sure that you have completed level 5 before starting this level. It is possible that this level would change your decision from level 5 (say you built a product and want to start your own company instead going to graduate school), but that’s not a reason to do this level first. In my experience, time in this level is used most effectively when uncertainty is minimal - and completing level 5 greatly reduces your uncertainty.
Along the same lines, don’t burn out. This level is a luxury. The objectives of this level can be achieved at other points in your career. I have included this for those who are comfortably through the other levels, and are wondering what’s next.
Given flexibility, we all have a tendency to optimize for the short term. Resist that feeling, especially in this level. If you are playing this level, you are already ahead of many others in the short term (1-2 years) - the goal of this level is to be ahead in the long term. (10-15 years) Keep that in mind as you plan for this level.
Difficulty Settings
You can play the computer engineering game at different difficulties - you just have to change the time you spend in each level. From my personal experience, and having spoken to other students, here’s a template for three different difficulty levels, assuming a 4 year undergraduate program.
My Walkthrough of the Game
I usually don’t talk about myself on this substack, but for a post like this, I thought it would be unfair not to put myself in the scanner. Remember, a lot of points in this post comes from things I did not do - so my path isn’t meant to be a perfect example.
Level 1: The decision to pursue computer engineering
I don’t think I used a structured framework like I recommend in this post. If I’m being completely honest, for a long time I was just following people around me with no clear idea of what I wanted to do.
Things I did right:
I liked electronics, so I knew I wanted to pursue a career in that domain (this is not as specific as I recommend)
I enjoyed fixing (usually the things I broke in the first place) issues on a computer we had at home - as it turns out, that was dress rehearsal for the debugging I do in my current job roles.
Things I did wrong:
For the longest time, I had no idea what a job in computer engineering would look like - in hindsight, I should have spoken to someone about it.
I did not put myself in situations that would have helped me make this decision quicker - I was not involved in any technical clubs at my university, and was not really expanding my knowledge beyond university coursework.
Level 2: Completing basic coursework
I think I went through this phase even before I decided I want to pursue computer engineering - this is because all the basic courses were mandatory at my university. (I still recommend completing level 1 before level 2 to get the best results.)
Things I did right:
I kept things simple - I followed the course curriculum without too much experimentation (this usually works for basic coursework)
Things I did wrong:
If I’m being very critical, I would have liked to put more effort into programming during this phase
Level 3: Getting some internship/work experience
Of all the levels, I would say this was my best, and it set me up nicely for what I wanted to do. First, I pursued a summer internship at a research lab (Central Electronics Engineering Research Institute in India), and soon after, I got involved as a student researcher with a professor at my university. Both of these proved to be pivotal.
Things I did right:
My first internship was not in the computer engineering domain - but I was able to talk to others about their projects, and I figured out two things:
I wanted to pursue computer engineering
I don’t want to work in a lab setting (I prefer working on my computer)
I was very productive as a student researcher - I started producing results early, which got everyone in the group more involved, and it led to 3 journal publications in a year. I think it led to two very important outcomes:
Working in research gave me a better sense of where computing is headed
My CV got a big boost, which helped with future opportunities
Things I did wrong:
Hindsight is 20/20, but if I had to do it again, my summer internship would have been a corporate internship - that way, I could have covered more aspects of level 3.
Level 4: Going deeper into a sub-domain
If I could do one level from scratch, it would be this one. I don’t think I was very precise about a sub-domain, which resulted in a lack of depth in any one sub-domain.
Things I did right:
I put a lot of effort in the one VLSI and one Computer Architecture course I took up, which went on the save me in the future
Things I did wrong:
I was not prepared for the vastness of computer engineering - I was jumping between various different sub-domains, and could never really pick one.
I also think I rushed through this level, especially considering that I was still unsure about the sub-domain I wanted to pursue.
Level 5: Applying to graduate school
I came to the decision to apply to graduate school very early in this level. This gave me enough time to build a profile that maximized my chances.
Things I did right:
I applied and got accepted for the prestigious DAAD Working Internships in Science and Engineering (WISE) to pursue a summer internship at Center for Cognitive Interaction Technology in Germany. I published a conference paper based on my research.
Soon after, I completed an undergraduate thesis at one of the best research universities in India (The Indian Institute of Science, Bengaluru). This rounded up a strong research-focused CV which is what graduate schools prefer.
I managed the rest of the application prerequisites, applied, and got accepted into some of the top graduate programs in Computer Engineering in the US.
Things I did wrong:
I think the areas of interests I spoke about in my statement of purpose were still quite general (This is a direct consequence of not doing level 4 right)
Knowing what I know now about graduate schools in the US, my university choices and application strategy would have been quite different (I’ll save this for another post someday)
Bonus level: That elusive corporate internship
I had some time between level 5 and starting my graduate school, and I really wanted to use this time to intern at a company. As it turned out, this was a very important decision.
My research experience led me to an opportunity at Intel Labs, and I got to work on AI accelerator architectures. (this was in early 2020, long before the chatGPT/Nvidia moment.) I still consider this one of my best internship experiences, and I gained a lot from it.
I got work experience at a company, which matters a lot when applying for other jobs (Spoiler alert, I needed it immediately)
The good thing about corporate roles, even in research, is that they help you understand what the different sub-domains are. This experience at Intel gave me a clearer idea that I wanted to pursue microarchitecture design.
I ended up with 3 patents in AI architecture, which I’m very proud of.
My Conclusion
As it turns out, when I completed my undergrad (in the year 2020), the world was going through something much bigger that my little computer engineering game. COVID-19 travel restrictions meant that I had to defer my Masters at UCLA. I was lucky to land a job at Xilinx (now AMD), despite no efforts made in this direction in level 5. (the fact that I pushed for the bonus level when I didn’t have to is what made the difference.) I eventually went to graduate school a year later, interned in the summer at Google, and a landed a job in GPU microarchitecture at Qualcomm.
Final Thoughts
If you have actually read through this long post and reached here, I want to end by saying this:
You’ll be fine. You might mess up different levels (like I did), or life will throw you an unexpected curveball. In the end, successfully navigating your career boils down to one thing - managing anxiety. The only difference between a successful student and a failed one, is that the former either never had to face anxiety (through some form of privilege), or dealt better with anxiety. In my experience, you can handle your anxiety better if:
You know where you are going;
And you are prepared for everything you will face on that path.
I hope this post can help you with both, and make you a successful computer engineer.
This post took a lot of effort to compile. My goal is to keep this post relevant over time through regular update. So if you are reading this and find this post to be useful, please share this with someone you know.
Wow! So well thought out, extemely thorough . I'd say you packed the maximum in minimum space xD.
I wish i had read this before i graduated.
I loved so many things about it.
1. Extreme clarity with the strcuture ( esp lvl4 and 5 , which can be tricky) .
2. Personal Journey, helps have the connection between the reader and author.
3. Anxiety, I think a very human aspect and you mention of it. It's an underrated aspect. I did not expect it.
What an amazing breakdown. I'm sure i'll come back to it as i go through the stages .
Beautiful writing and categorizing!