SWE interview
Software management tools?
- used Gantt chart on capstone project - Redmine issue tracker - git commit issue tracker
What are some of the principal's of object oriented programming?
-Single Responsibility: applies information hiding specifically to classes, and reinforces the original idea that our choices stem from our preparation for possible future changes. -Open-Closed Principle: -Liskov Substitutability -Interface Segregation -Dependency Inversion
Types of Software Maintenance
-corrective: repair flaws in design or programming -adaptive: accommodate business requirements/needs -preventative: routine; reduce chance of future problems -perfective: improve performance (like processing time) or user interface; or add "bells and whistles"
What is your familiarity building web-based and client/server applications, preferably with the Microsoft .NET Framework?
ASP.NET MVC or ASP.NET Core MVC? I have coded a small asp.net core app that pulls data from a database, and displays the results on the page.
When was a time you had to take lead on a project? Tell me a time you showed initiative when working on a software engineering project. Tell me about a time you expressed leadership?
At my previous company, I was paired with another developer and it was my responsibility to proof code. It was a difficult thing for me to do because he had more experience and followed a meticulous process.One thing I always look for is readability and after many hours I found an area where we could simplify. We talked about it and were able to find the best approach. The code worked about 20% more efficiently with the alterations. I excel at working with others and find that the best work comes when there are many people who can contribute and lend their expertise.
In simple terms, how does a binary search work?
Binary search shines when you are maintaining something in sorted order, and doing repeated search queries on it. Analagous to how you use a Dictionary; you don't often need to modify or add words to the Dictionary, but you do often need to look up words. Each lookup is O(log N) time. By 'preprocessing' the dictionary once, then performing many search queries, you are saving time in the long run with binary search.Binary search shines when you are maintaining something in sorted order, and doing repeated search queries on it. Analagous to how you use a Dictionary; you don't often need to modify or add words to the Dictionary, but you do often need to look up words. Each lookup is O(log N) time. By 'preprocessing' the dictionary once, then performing many search queries, you are saving time in the long run with binary search.
What do you know about the company?
I want to be in a place where my work has an impact on millions of users. I think Doma is has a bright future and I want to expand my skills in that direction. I think you guys are forward-thinking for using workflow automation, artificial intelligence, and intuitive cloud tools.My impression is you run a good software development process and I think that helps foster a good work culture.I admire some of the charitable initiatives you've taken such as the DOMA Gives program
How do you measure success for yourself technically? metrics measure performance productivity. How do you measure success in an engineering project?
Cycle time - measure of the time it takes for a bug, feature, or task to move from one status to another. measure of total work output - including the number of features, tasks, bugs, or chores completed that are ready to test and ship measured over a discrete period (like a week or a month) and tracked over time so you can see that your team is working consistently. Measuring success for tech products is complex - not because it is impossible, but because there are so many different approaches tailored to different scenarios and audiences. The key is to choose a mission, and let that mission drive the product's strategic and tactical success metrics.Let's assume that we are talking about a product like LinkedIn groups.LinkedIn's mission can be thought of as driving engagement between and among employers and workers to ensure as many matches as possible, which leads to a growing and dynamic economy and workplace.To that end, the success of LinkedIn groups can be strategically measured in terms of:The number of groups and their growth rate Quality of engagement, which are things like how long people stay in groups and how often they return.More tactically, I'd look at things such as:The number of members per group and their growth rate The number of posts on things like jobs, shares, and invites And finally, I'd also look for things like if people who get jobs through the Groups feature are coming back to post jobs, and if they are referring their friends to those groups.The purpose of these groups is to grow engagement and employment and then have that growth flow back to the groups themselves.As I build technical features, I would look to see how my architectures and features drive such numbers and innovate accordingly.
If you were stuck in solving a technical problem, how would you ask for help?
Engineering work can be very context-sensitive but still have a high impact. That is, I may have a unique understanding of something I am building, like a system architecture or code. Still, it could impact others if I am stuck or get things wrong.In that event, if I am stuck, who and when I ask for help depends on how time-sensitive the task is, where I am in the project life-cycle, and whether I have exhausted all the tools available to me.Let's assume that I am stuck in system architecture. I'd make sure I have a well-thought-out diagram and come prepared with options and specific questions. If it is code, then it gets tricker since it is hard to debug someone else's code. In that case, I'd want to isolate the specific area that is incorrect, present the expected and demonstrated behaviors, and seek out debugging tips.Once I am unblocked, I would document my decisions and outcomes so as to create a living resource for anyone else who has the same issues down the line.
strengths
Experience with the full stack.Adaptability, adaptability, and growth are all qualities of this skill...A business acumen is what you need.Managing your time well...Having the ability to communicate with others.
What is the mix of technical and management qualities you look for in engineering leaders and managers?
I think of a manager as a multi-dimensional leader. A manager would be part coach part mentor.As a mentor, a manager would help guide me and build my skills. As a coach, their responsibility would be to extract the best out of me while also holding me accountable. So, I'd expect a combination of both incarnations.This relationship would vary depending on the company, the work culture, how thinly spread the manager is, the stage of the project, and the uniqueness of a specific situation.. This is where honest and transparent communication, which is the foundation of a trust-based relationship, comes into the picture.To that end, it is my own responsibility to ask for help early, set clear expectations, communicate crisply and make sure I keep my manager in the loop at all times. This is critical since I may have more brass-tacks awareness than my manager, but my manager may be more organizationally connected than I could be.That way, the relationship is mutually beneficial.
Experience working with APIs
I used Google Maps Android API to integrate google maps in the last android app prototype I built which was a fitness app. I wanted to add GPS functionality to track the Geolocation to track walks. To use it I install Google Play Services SDK in Android Studio. I created a Google Maps activity in the IDE which generated a class MapsActivity.java which had instructions in the comments to generate a Google Maps API key to access Google Maps servers. Then I created a project in Google console and created an API key to call the API. After the key was generated I went back to Android Studio and pasted the key into the xml file.
When is a time you encountered a difficult software development problem? How did you solve the problem?
I was interning at a small tech company in college and my manager asked me to build an ETL process. After several tests, optimization and clean-up, I still couldn't get the run time down to an acceptable point. I discovered I could solve the problem using multithreading to run multiple batches of data through the ETL in parallel rather than recursively. In the end, I achieved the run time I desired.
Describe the last project you worked on, including any obstacles and your contributions to its success.
In my previous position as a web developer at odu I was tasked with re-designing and developing and our responsive distance learning online resources webpages. The purpose of one of the webpages was to make sure all distance learning students could identify upcoming online courses to help plan their schedules. I began by researching other similar responsive datatable systems to figure out what worked and what didn't. Next, I developed the backend in Python and made a python scraper for Banner, which is ODU's course catalog and registration system. It parses data from both the catalog and the schedule into Python objects, which can then be serialized to XML or JSON with the provided convenience functions. I used html, javascript and css to style the responsive datatables for the front end. After testing the simplified program, I added elements to make it more engaging to students, such as table sorting options and a responsive mobile navigation menu. This program was well-received by the students of ODU, and their student service success rates increased by 25% after distance learning students took feedback surveys
What is an example of a time you have learnt on the job?
When I was assisting with the development and maintenance of ODU's distance learning department's web application development in my last job: Learned a lot about SQL/databases, SVN, Agile Development, working in a team, Mobile Application Development, and RESTful services.
How would you explain concepts like polymorphism and inheritance to a computer science student?
Inheritance lets us inherit attributes and methods from another class. Polymorphism uses those methods to perform different tasks. This allows us to perform a single action in different ways.For example, think of a superclass called Season that has a method called areDaysHot() which prints out "It depends on the day". Subclasses of Season could be Summer, Winter, Fall - And they also have their own implementation of areDaysHot() (to reflect that summers have hot days, winters have cold days and fall days are a mix.)Now, we need to use the Season class and create objects for the sorts of days we see depending on the season. As an example, we can create a Summer object and call the areDaysHot() method which prints out "The Days are hot".Season mySeason = new Season();Season midJune = new Summer();This is polymorphism in action. The same method - areDaysHot(), in this case - produces different output depending on which object is used to call it. So, mySeason uses the parent class version of areDaysHot(), while midJune uses the inherited version and therefore produces different output. The output will be as follows:mySeason.areDaysHot() produces "It depends on the day"WhilemidJune.areDaysHot() produces "The days are hot"Additionally, I mentioned earlier about Fall. Since the days are often a mix of hot and cold, you could just define a class Fall extends Season without a areDaysHot() function, in which case an object defined for the Fall class will invoke the parent class function.So, as you can see, we have reused a core capability and repurposed to a different, more derivative use case. This is a great way to keep your code manageable and more intelligent.Does that help explain these concepts or would you like me to elaborate on anything specific?
Can You Describe the Steps Involved in Software Development?
Initial planning and brainstorming is the first step in software development. During this stage, I determine the purpose and functionality of a program. The next step involves team analysis of the project, including the time frame and which tools and team members are needed. Then comes the design stage, where a program is designed by a team of software engineers before moving on to the development stage. Once in development, I step in to transform the design into functional software. It's then shipped off to quality assurance to identify any defects or bugs. Lastly, the software is officially installed and launched.
weaknesses
It is difficult to establish boundaries between work and life.Being impatient.
What is big O notation?
It is essentialy a way to compare how fast an algorithm will run given a set of size n.Big O notation is the worst-case runtime for an algorithm on a dataset of size n, ignoring constants. Basically it's an abstract way of talking about how an algorithm will behave as the dataset grows.For example, say you've got an unordered list of numbers and you want to find a particular one. Since the list is unordered, the only solution is to check every number in the list. If the list has 3 numbers, it will take at most 3 comparisons to search the list. If the list has 10 numbers, then it takes 10 comparisons. If the list has a million numbers, then it will take (at most) a million comparisons.So the rough behavior of the search algorithm above is O(n). That is, the worst-case runtime of this search algorithm on a dataset of size n is n operations.Now lets say we have a sorted list of numbers. Since the list is sorted, we don't have to scan through the entire list to search for a number; we can use a binary search instead. The worst-case runtime of a binary search is O(log n); that is, for a dataset of size n, it will have to examine at most log(n) elements. For a list of 3 numbers, at most 2 will need to be examined. For a list of 10 numbers, at most 3 will need to be examined. For a list of a million numbers, at most 14 will need to be examined.
Why is sub versioning important?
It is extremely important in environments where you're using others' code, i.e. packages. If the package owner creates a change that could break the code of which uses their package, they denote that by changing the major version, from 1.2.2 to 2.0.0 as an example. By doing this, users of the code know "I cannot just automatically start using this new version 2.0.0, if I do so my own code may break. I need to read the docs to understand what big changes have occurred.
What steps do you take to find bugs in an application? and give an Example of Difficult Bug?
My first step is to understand the whole module before running test cases then I'll prepare my test cases by creating sufficient test data, including test conditions and database records. Then I perform testing in different test environments to find a pattern. I then compare these patterns with previous test cases, which shows me any errors in code that I need to fix.
Tell me about a time you had to push back on an unreasonable request from an executive or customer.
One such project involved creating an activity dashboard for the users of a retail company by leveraging their Facebook data with permission. The dashboard would contain information such as their top friends or their most visible social posts. It was a great way to drive social engagement and make the brand hip in the eyes of the tech-savvy younger demo.We learned how to use the Facebook APIs - and this was during the early days of Facebook when documentation was sparse. We figured out how to get the data from Facebook by understanding how their API rate-limiting worked and how the data schemas were set up.After weeks of coding, testing and working with the design team, we had a prototype ready.And then, the customer asked us to do the exact same thing with Twitter.At the time, Twitter was too new and did not have diverse enough data to justify the effort. This would require significant changes to our backend data processing that we could not implement without delays and going over-budget. I was almost certain that all the API calls would slow down the experience and we'd lose the impatient younger clientele our customer was hoping to entice.I felt that if we allied with the client's IT team, we may have success making the case for delaying this additional request for v2. This additional request probably came from someone who did not have the technical background, and if the client heard it from an insider, they may be more likely to come around.Sure enough, when the client heard this assessment as a team effort from both engineering teams, they understood and accepted that the new request would need to come in as a phase 2 effort.
How would you describe an API to someone who knew nothing about programming?
PI stands for Application Programming Interface. APIs exist to allow programs to communicate with one another. For example, if you wanted to schedule a hair appointment on a salon's site and have that appointment show up in your Google calendar, an API would allow the salon's server to communicate directly with Google's. APIs allow users to complete an action without leaving the website.
What do you think an ideal product-engineering relationship should look like?
Product management and engineering are like pieces of a puzzle; incomplete without each other. But often it takes a bit of an effort to see how they best fit together.Product management sets the parameters of the innovation: what we are building, why we are building it, who we are building it for, and how we would measure its success.Engineering has to provide the "how": the instrumentation, the personification of the design, the logistics around the building, and the iterations in which smaller chunks can validate the progress towards the whole.Ideally, you want a relationship where product management is in close contact with the end-users and brings that perspective to the engineer—with enough technical judgment to understand what is doable.Engineering should be technically sound enough to execute as well as provide product management choices and feedback based on technical tools available.On an ongoing basis, the two arms of the team should work together to validate progress, rule things in or out and measure outcomes against goals and the larger product vision.
How do you stay up-to-date on your software engineering skills?
Read O-Reilly books. GitHub explore,
What motivates you during complex projects?
Set deadlines - have a sense of progress. (I will complete one module of my online JavaScript course by Friday every week I will finish two projects by the end of the month) Spice it up - sI've found it helpful to vary how I study the material. (YouTube videos and podcasts stack overflow, articles, written documentation, books) Identify the end goal - Finally, learn with a clear goal in mind, and use this goal to remind yourself why you're learning.
What was the development process of one of your previous projects?
Software development processes, including the waterfall, unified OO, and extreme programming models Revision management: local, centralized, & distributed approaches Configuration Management: project configuration, managing external libraries Continuous Integration, including testing in the cloud (AWS) Analysis tools, including CheckStyle, SpotBugs, & PMD Build Management, including Ant, Maven, and Gradle Unit & Integration Testing: coverage, JUnit-style frameworks, mocking, designing for testability Test-driven development Issue tracking Software Forges & Repositories Dev-Ops
How would you explain a web service infrastructure to a technical audience with a software background but limited system-level knowledge?
The web service architecture consists of several key components, and we will incrementally demystify it by way of several concepts that will serve as building blocks.A web server is a piece of hardware that responds to a user request with data. It could be as simple as loading static files from a computer.A database—known in technical lingo as the "persistence layer"—is a resource for the web server to persist, or store, data. Even though these two technologies work together, they sit on separate computers so as to not compete for resources.- From an instrumentation standpoint, you will want to make changes to the database by inserting data into it and reading data from it. This is where you'd use SQL. SQL covers the gamut from data transfer to creating databases to setting permissions. You can use SQL in MySQL, SQL Server, etc.- From an operational standpoint, the front-end, which could be a browser, makes a request for information to the back-end, which is the web server. For example: This is a simplistic version of what happens when you search for "cat food" from Amazon and a bunch of options show up.Since so much of our web architecture depends on data storage, it helps to understand your options vis-à-vis databases.- If you plan on using data arranged in neat categories —think key-value pairs or tables —then you want to use relational databases (RDBMS) like MS SQL Server, IBM DB2, Oracle, MySQL, and Microsoft Access. The data in RDBMS is stored in database objects called tables. A table is a collection of related data entries and it consists of columns and rows.Databases like Cassandra and MongoDB are great for unstructured data in which case performance would be a predominant concern. It's especially great when the data structure is going to evolve over time, as its schema-less operations allow you to update the data on the fly.The backend, which is the web server, then calls the database to get data, and possibly run some logic on that data and return the output to the user.Some context here: since we are discussing data transfers, I'll provide a quick overview of HTTP. HTTP is a protocol which allows the fetching of information, such as HTML documents. It enables data exchange on the Web and it's a client-server protocol, which, as I indicated, means requests are initiated by the recipient, usually the Web browser.Clients and servers communicate by exchanging individual messages. The messages sent by the client are called requests and the messages sent by the server as an answer are called responses.So, to summarize, a web service architecture involves the client (i.e. the user seeking the information) and the server (which has the information), and the server consists of the webserver and database.
Tell me about a time you disagreed with a fellow engineer and how that issue was resolved.
This happened a year ago. I disagreed around the scope of a major system redesign with a new engineer, who was junior to me.Every few years, our company would redesign our customer-facing login experience. This was a chance to add new features, make it compatible with new devices and broaden our reach.I was the project lead, and having paid my dues fixing smaller components of previous designs, this was my chance to own the end-to-end architecture of the system as a whole.My partner was a brand new engineer. He had graduated from Carnegie Mellon just months before. I had taken him under my wing since I admired his intelligence and pluck as well as the fact that he had succeeded in an area where I had not.I helped him ramp up, and we then started tackling the system design. We immediately had a different strategic view.I wanted to fix as many bugs as possible and then add new features. Jake, on the other hand, did market research that showed that we could entice new customers and juice up revenue by adding new features. In his mind, the bugs were benign and, by now in the minds of our customers, had settled in as quirks, so there was no need to chase after them as our competitors lapped us.During one scoping session, he made a remark that engineers like me are often too tied to the old system they built. I countered that people who have never built a system often underestimate the tradeoffs around maintenance and innovation.We needed to improve the app, but what would be better was to see what the best mix was. What features could we add that could fix the maximum bugs, and what bugs could we fix that would bring new features along with them?So, we went back and did our homework. Jake took the first task, while I took the second.Our combined research led to a clearly defined MVP that improved the product stability as well as added key new capabilities.Our new product design won rave reviews, and both Jake and I developed a new respect for each other.
What would you do if asked to take on a problem where you did not have the technical skills?
Unless there is an explicit set of constraints, I will assume that the task at hand is to implement a web-based capability. And the skill gap in question is that of language—more specifically, the language used in the company being one I am not terribly conversant in.Does this assumption work as a starting point before I dive in?I would examine the difference in the two languages; the scope of the project; the timelines; how much old code I could build on; and whether the work rests solely on me or whether I can tag-team with others.Based on all my findings, I would create a technical spec and system design that would contain assumptions and call out technical decisions. I would have a peer or senior leader validate my assumptions just in case my technical gaps have led me astray.As I move forward, I'd check in every week or two to make sure I am executing as expected and then become more independent. I'd be sure to align with experts in the new language so as to build my knowledge and expertise in the context of the intended outcome.Throughout the process, I would focus on the end result and what skills would take me—and the work itself—toward that end goal. That way, I will grow my skills in a way that maximises my impact as well as collective success. That will enable me to leverage available resources in the team as well to close my gap.
Validation vs Verification
VALIdation: Do the specifications capture the stakeholder needs? VERIfication: Does the design meet the specification? Did we build the solution right?
What is the difference between black box and white box testing?
White box and black box testing both validate a program's inputs and outputs. The difference between them is that white box testing also validates the program implementation, whereas black box testing does not.
Tell us a bit about the latest project you worked on. Was it completed successfully? Explain how you contributed to its success and how you handled any obstacles you may have run into.
Yes, it was an Android app called MoodEX. It was me and two fellow cs students we wanted to make an app that will shows how the correlation between the user's wellness choices and their mood. We used Android Studio as the IDE, used Java, XML and firebase for the database. Since it was a small team I was a full stack developer so I implented both Backend and UI Interface features. Specifically: Mood logging interface Water logging interface Calorie input interface Splash, login and registration screens. Set up authentication Firebase database and SQLite database Things I learned: Make use of logcat for debugging Look at documentation for the APIs using Google Maps Make user of neat open source libraries that add a lot of value to apps Libraries such as pie chart and floating action button Make sure you have a physical test device because the emulator doesn't have the physical sensors needed (i.e. for step tracking) Get started early and do not procrastinate every feature takes way longer than expected to complete Get design and layout inspiration from other popular applications on the market Usual they have intuitie, clean layouts that you can recreate
Outline your process completing a programming task from assignment to delivery.
hen completing a programming task, I first like to understand the project in its entirety. I take into consideration the time frame, the cost and the end user's desires to ensure I'm including business strategic objectives in my plan. After I've collected all the requirements, I use these in my design and frequently revisit the goal of the assignment to make sure I'm on track. Development and coding are undoubtedly important, but ultimately worthless if I've rushed integration and testing. During this phase, I think it's important to revisit the goals I set out when I started the assignment. Once I've fully implemented and delivered the program, I stay alert to any necessary bug fixes or additional features that need to be deployed. I'm constantly learning and adjusting my process to meet the needs of my specific assignments.
When you join a new technical initiative, what is the first thing you do?
o get their hands dirty right away. They learn by joining existing initiatives, shadowing engineering leads and completing tasks that enable them to learn the stack and forge relationships.I will find an area that is short of help, and I am optimistic that such needs exist given your company's four key growth areas. Having done that, I'll also help debug and scale existing capabilities. That will give me a sense of the core and tech landscape while adding value as well.Upon demonstrating my capabilities, I will start setting goals to own specific functionality that I can take from 0 to 1, with the trust of the team that I will have earned in my early days.
What are requirements?
try to see what the User/Client wants. Try to think a bit like them. What would they need this App to do? How would they want the App to do it? Ask questions until you feel confident. That can be hard and take time and sometimes needs a lot of diplomacy, depending on the client.Then:Write everything down so even someone with no technical background can understand it. "We're developing an App that serves as [something]. It has to be able to do Y and also Z. If Z happens it also has to be able to do this and that.". This is very important. It's a clean and clear definition of what your goal is. This is what everything else builds upon.Flowchart that just describes what's happening on a "non-technical" level.Look for "But what if..." cases. Think ahead."What if I want to do X, will this still work?" - "What if we later want to do ABC, where would we integrade this in the process?"Then it get's more technical.Lay out all variables that are needed to make this happen - usually more than needed in the beginning.If needed lay it out as an SQL/Entity Relationship model. Helps a lot imho.Dataflow. What goes where and when.Describe Functions with names for those actions. Just names like "MoveCharacter", or "getAvailablePerson".Make a Diagram, a technical one, a UML. Lay out classes with their variables and functions. Doesn't have to be perfect.Decouple as much as you can and keep stuff extendable (That's actually the hardest part that takes a ton of time). Agile n stuff, you wanna be open for last minute changes without rewriting a ton of things or writing icky workarounds.