Interview questions: Managing large scale projects independently
Introduction
As your rise up in your career, one question you will often face during interviews is around planning your work and how you execute large scale projects. Here is an helpful guide I have written to help you through such questions.
Table of contents
-
How do you approach large scale projects as a senior frontend engineer ?
-
How do you operate in an environment where there is less guidance ?
-
We are using this new technology that you are not experienced with, do you think you can manage ?
-
What kind of experience you have with build processes and version control ?
How do you approach large scale projects as a senior frontend engineer ?
There are three challenges when dealing with big projects.
Ambiguity
The real challenge of large scale projects is ambiguity. We have a broad understanding of what needs to be achieved but we do not know what steps to take to reach to that goal. I always like to look at the big picture and break it down into smaller steps by applying my experience.
In most cases this involves looking at what we have and where we need to be and then to identify the gaps. This is supposed to be collaborative work we need to achieve by talking to all the stakeholders.
Ambiguity is a result of complexity and once you reduce complexity by splitting it into smaller projects and tasks you have a clearer picture. Making people walk through your plan and getting feedback helps being on track.
Overall I think ambiguity can be resolves by composing the larger project from smaller tasks and actively communicating the plan with others.
Technical challenge
Second problem is that of technical challenge. What kind of front end technology we will use ? How we will architecte our codebase, if we are using say react then how we will create different components, whether we will use Redux for state management or not etc. are many technical questions which I like to discuss.
Generally the level of technical challenges differ from project to project and team to team. I have worked a lot in ecommerce and data driven environment so I do understand the challenges there much better than others. But often the core problems remain the same. How do you design a complex application using more simpler components and how to plan their interactions.
Deadline management
The hardest part of software engineering is managing deadlines. Breaking down a complex project into smaller tasks is how I try to manage deadlines. This is where my experience comes into picture. Also, this is where we also manage the risk. What if we can not implement feature X because it is too complicated ? We should always plan our projects such that we build it incrementally and not as either 0 or 1 mentality. For example you can derisk a project by focusing on happy paths first and then focusing on the error paths.
How do you operate in an environment where there is less guidance ?
I have worked with many technologies for last many years and I never had problem understanding the technologies and building projects. Once you have a mentality where you focus on getting things done, you learn how to solve problems that appear unsolvable. It is great to have people around you who can guide you but in the absense of those people it is not the end of the world. There is always larger internet community that can help, there is always existing code you can refer to and there are always smarter and more intelligent people in every company who can assist you or give you directions.
I constantly focus on building products that are useful and a mindest to get things done is my strength.
We are using this new technology that you are not experienced with, do you think you can manage ?
Software engineering is an art and science. I am a frontend engineer and I do not like to claim I know only one technology. In engineering we should have strong fundamentals. Once you have strong fundamentals and you understand key problems it is much easier to learn a technology or a programming language. For example Angular and React have evolved over a period of time but both of them are eventually based on similar principles of separating data and view, reacting to events, ability to organize code more logically instead of mixing up everything, designing smaller components that can be combined to create larger components etc. Once you understand these principles learning a new technology or framework is much easier.
If a new technology needs to be learned, I always look at the sample code and the existing community, I ask questions on the forums etc. to understand this technology more deeply.
I think the mindset that is required is to get things done and not to obsess over tools that will be used. Tools in the industry keep changing very rapidly and we must adapt to those always.
What kind of experience you have with build processes and version control ?
Version control/Source Code management
I have extensive experience in using Git. I have used Github and similar services in past and I have worked with monorepo based code as well as multi repo based code. I am familiar with concepts like git branches, pull requests, code review flows, git rebase, pull, fetch etc. though I do not claim to be a git expert.
I am also familiar with code rollbacks and similar operation tasks.
Build processes
Frontend technologies use wide variety of build technologies. I have used webpack, grunt and many more. It often involves builiding code from typescript, optimizing the CSS and Javascript code and creating bundles that can be sent to the browser. The key principles remain the same no matter the tool.
Static Code Analysis
I have experience with SonarCube and other static code analysis tools that run on every Pull Request and then report possible issues such as unneccessary variables, unused methods etc. This is used to keep the code clean and simple.
I have not setup such systems but I know how to debug issues they report.
Project management tools
I have experience with google docs, quip, JIRA and similar tools for managing a project, creating tasks, wikis etc.
CI/CD
Continuous Integration and Continuous Deployment pipelines is what I have always used in most of my work. I understand their core principles that we continuously run tests against the developed code and push the latest version to the mainline as soon as possible and develop against it, instead of writing code in chunks and deploying it at a longer period. Advantages of CI/CD is that we can release improvements faster and also catch issues as early as possible. This allows us to change our priorities and direction faster.
I am familiar with Docker containers and how to run them to manage complex arrangement of systems as well though I am not an expert.
Conclusion
The important thing in such interviews is to focus on giving your interviewer a larger picture of everything you have worked them and give them the confidence that you have what it takes to succeeed in their environment. Interviewers here are often focusing on some keywords they want to hear and might probe you more on those specific keywords but if you are totally blank on those keywords they might see it as red flag.
Do not talk continuously but rather talk in points. Always make sure that you give a short summary first and then expand. Also after every answer ask the person if that is whay they have been looking for or if they meant something else.