Marcus Pope

Husband, Father, Inventor, Programmer Austin, TX - °

Interview Faq

Greetings! This is a compendium of interview questions and code samples that I have answered on my own time or during previous interviews. Feel free to virtually interview me by searching or browsing for questions. I'm also available for real interviews via phone, chat or video. Just send an email to whatever name you want at marcuspope.com and we can setup a time.

Questions & Answers


What is the most technically challenging project you've worked on?

I have three that challenged me in completely different ways:

AgileLaw: An enterprise level, multi-os, multi-device SaaS platform built with a dozen different major technical components.

RenewData: Created a petabyte scale data processing system for forensic review. Developed process automation software that could saturate our in-house server farm without succumbing to disk/network IO contention, in order to extract and deduplicate documents from years of tape backups.

MyEdu: Created a cloud-based web crawler and data extraction framework capable of self-load-balancing and rate limiting the extraction of course schedule data for over a thousand universities.

What project are you least proud of?

Most of the public facing work I did for HIL. While I was able to cleanup the infrastructure, the end product was still click-bait that looked like it was published in the late 90's.

What would you do if senior management demanded delivery of software in an impossible deadline?

In most cases (save for retroactively I suppose) something can be delivered in any amount of time as long as feature set and quality are not in contention. Adding resources usually makes the situation worse, but under the right circumstances it can help mitigate defects.

Tabs or Spaces?

Spaces - nothing else renders the same everywhere, and looking at 8-space tabs inside the Win32 console is just awful - I don't know how Linus Torvalds does it. In practice tab-based layouts not enforced by an interpreter like Python always produce mixed-tab+space results. That produces a worse problem for people who use different tab-widths.

But I'm also an advocate for individual coding styles, and allowing for 2 space, 4 space and 8 space indents per developer is OK by me. While I loved Silicon Valley's take on the tab v space debate, space-advocates never hit the spacebar four times to indent code :D

Windows/Mac/Linux?

Windows. It's hard to leave the domain you are an expert in. Linux has enough issues still that I'd opt for Mac in second place for a desktop environment. But for servers I strongly advocate Ubuntu.

Why is multiple inheritance not supported in Java?

Because the language syntax and compiler directives do not support conflict resolution when two parent classes implement the same method signature with competing implementations. And that doesn't exist because there is still controversy behind the design. I think it's necessary to accurately model many situations, which is why my preference leans towards mixins and prototypal inheritance instead.

What is the difference between a Set and a List?

In Java, the difference is a purely artificial constraint (sets are fixed) enforced by the compiler to optimize low level code.

What are your personal goals for the next 5 years?

I'm currently focused on developing an AI application. The foundation work and voice synthesis components are complete and I'm currently working on NLP functionality. I've solved a lot of problems adjacent to the AI space so I think I have a good chance of making a useful application. But I don't subscribe to the singularity theory, so I don't expect to create a sentient overlord.

What programming languages can you work with?

I'm comfortable with most c-style languages. I prefer higher-level loosely typed languages like JavaScript, but I still keep my skills fresh in C#. Perl is starting to look a little foreign to me which I thought would never happen given my history with it. Java is all but dead to me, I have a hard time seeing myself back in that ecosystem.

How do you keep up with current trends and advances in this field?

When I write software for myself I always write it from scratch. This keeps my problem solving skills active regardless of what SDLC phase I'm in at work. But for business I almost always research for a library before I write something. Even if I have a go-to product, I check for a new alternatives with a couple Google searches. If there is something new I check its bug list and support channels for activity. Then I evaluate/run the sample code. If all of that checks out I'll try using the product. Most of the software I evaluate doesn't make it past the support checks.

What is your ideal work environment?

I prefer working remotely if it means I skip a long commute. I'm really comfortable with voice and text chat for communication, and I can get into a zone far more easily when I'm not distracted. So an office or cubicle would be my second preference even though those are in seeming short supply these days. If I have to work in a dev pit you'll find me with my headphones on most of the time as a lesser of two distractions.

Can you name a number of non-functional (or quality) requirements?

That basically includes anything besides the behavior of the application design. Security, testability, usability, visual appeal, accessibility etc are all types of non-functional requirements.

What is your advice when a customer wants high performance, high usability and high security?

Nothing is really orthogonal in those concepts. The only consideration I think a customer would have is the price. Each of those tenants are infinitely scalable and logarithmically harder to attain. So if they want all three to be perfect they should expect to pay the sum of the world's GDP to attain them.

Can you name a number of different techniques for specifying requirements? What works best in which case?

Technical specification documents, user stories, requirements matrices, flow-charts, UML documents, pseudo-code and I'm sure a few others that I missed are all examples of ways to convey requirements. I personally like technical specification documents for large projects because they serve as a global reference point. I then sprinkle in flow-charts for complex 4th dimensional workflows, user-stories for feature-level comprehension and pseudo-code for complex algorithm requirements.

What is requirements tracing? What is backward tracing vs. forward tracing?

I believe this is a meta-analysis on the source of requirements to the alternate formats of a large list of requirements. Compatibility tables, for instance, can help you determine if there are incompatible requirements. I would assume that forward vs backwards just indicates reference points from a tech spec to an alternate form like user-stores or vice-versa.

Which tools do you like to use for keeping track of requirements?

I used to use MS Office and various project management tools like GreenHopper, JIRA or RallyDev to track requirements in various stages of the development process. I have even used kanban boards and story boards in a similar fashion but they all have major impediments on distributed and centralized teams alike.

These days I'm a big fan of plain text files, using keywords and requirement ID's to enumerate the requirements. Then I rely on change-tracking software like a VCS to manage modification audits. Nothing is more easily managed, and exported than text. Find & Replace keeps the information accessible. And you can have as many files as you need to grow with a project.

How do you treat changing requirements? Are they good or bad? Why?

They can be a sign of poor leadership, or they can be a sign of a competitive problem space. Either way, I just clear my brain of what I was working on with a short 5 minute break and then I change direction. If the change is a good change then it's super easy to get behind it. If the change is an obviously detrimental change I'll voice my concerns and accept the fate of the decision makers. In collaborative environments those decision makers are often able to provide insight into the decision calculus as to why we would risk any glaring issues. In poor environments the concerns are usually dismissed without explanation or discussion.

How do you search and find requirements? What are possible sources?

This is a pretty vague question, but I'll assume it was meant to explore interviewing stake holders, end-users and product managers or reviewing technical specifications. The first is kind of obvious, go talk-to/communicate-with them, so I'll focus on the latter.

With a well documented spec, you can usually find the section header for a particular feature and review it for your needs. Sometimes the non-functional requirements are placed in an odd section so I would speak with someone familiar with the spec about areas I should be focused on. If there is no such domain expert then I would read and model the entire spec (or what was most likely to apply) and come to my own conclusions about which requirements apply.

How do you prioritize requirements? Do you know different techniques?

Given the considerations for the project based on time, money and features I would prioritize accordingly. Then I would rank each feature/requirement based on necessity, required, trivial, nice-to-have etc. After confirming with the stake-holder the general accuracy of the ranked features I would check to see if they fit into the budget.

I would also take into account the strengths of my development team, giving small quick tasks to more junior members, while allowing senior members to focus on underlying architectural problems. I would focus on incremental builds to each of the required features so that even if they weren't 100% complete, the foundation for each would exist.

Can you name the responsibilities of the user, the customer and the developer in the requirements process?

The customer usually provides the general outlines of the vision. The developer is there to catch incongruities, do estimation of work, and fill in gaps. The user is generally there to provide feedback on the features and their workflow to ensure the customer didn't make any major mistakes in their model.

What do you do with requirements that are incomplete or incomprehensible?

Depends on how incomplete or incomprehensible. For minor or common mistakes I draw from my technical expertise to make the right call. For utterly meaningless babble, I seek out a product manager or domain expert to clarify the spec. I would then revise the spec accordingly so others don't repeat the process.

What are metaphors used for in functional design? Can you name some successful examples?

They are designed to create a relatable experience to users in a digital environment. Kindle used the concept of turning pages for a digital e-reader, desktop operating systems use the concept of folders to store files, etc.

How can you reduce the user’s perception of waiting when some functions take a lot of time?

Keep the UI asynchronous so it doesn't lockup the interaction. Furthermore you can background the task to take it out of mind if the duration is really intensive. Endless spinners tend to make the problem worse so whenever a progress meter can be used once that moves is one that keeps users happy.

Which controls would you use when a user must select multiple items from a big list, in a minimal amount of space?

Check boxes work well for lists that are intended to scroll. They are a small footprint and have a better UX than Ctrl+select of traditional list boxes.

Can you name different measures to guarantee correctness of data entry?

Input validation and referential integrity are the first two that come to mind. Using an audit trail helps with retroactive analysis. Peer review helps as well so there are usually several review phases where different people analyze different portions of the data stream.

Can you name different techniques for prototyping an application?

Wire-framing, white-boarding, rapid application development, and even design comps come in handy for ironing out the details before a full development cycle.

Can you name examples of how an application can anticipate user behavior?

On-boarding workflows help new users familiarize themselves with an application. You can also use input analysis to do things like auto-completion of data inputs, and determining when a user is stuck in an application workflow. Much of the responsibility of UX design is anticipating how a user will use the software, so hints and wizards help users traverse workflows as well.

Can you name different ways of designing access to a large and complex list of features?

I think this is referring to access control lists, permissions groups, and cascading restrictions. But it could also refer to using search and tree structures to present complex option panels to the user.

How would you design editing twenty fields for a list of 10 items? And editing 3 fields for a list of 1000 items?

I would use a slider-style form input system for the 20 fields. Fields should be tab-interactive and there is probably good opportunity to create default fields and dependent fields to improve data entry.

For 3 fields over 1000 items I would use a table, perhaps with a search filter if the list of items are not all related.

What is the problem of using different colors when highlighting pieces of a text?

People with color-blindness and or vision impairment of many forms will have an impossible time knowing the meaning. But more generally that would look horrible to many people to the point of causing eye-strain if there are lots of highlights with poor color choices.

Spiraling Square

Starting at the upper left corner of the square and walk its edges clockwise. Just before re-approaching the upper left corner, spiral into the square instead, ultimately arriving at the center of the square.

require('verbotenjs');

invoke(function() {

    //aliases for the rect and coord array indexes
    var x = 0, y = 1, w = 2, h = 3;

    //10-cell grid
    var rect = [0,0,9,9];

    //start in first cell
    var coord = [rect[x], rect[y]];

    var last = coord.join("");
    while(true) {
        //traverse grid according to rules in question
        //@note: this is a good example where duplicate logic is more
        //maintainable than a clean functional abstraction
        if (coord[x] < rect[w] - 1) {
            //move right
            while (coord[x] < rect[w] - 1) { coord[x]++; }
            rect[y]++;
        }
        if (coord[y] < rect[h] - 1) {
            //move down
            while (coord[y] < rect[h] - 1) { coord[y]++; }
            rect[w]--;
        }
        if (coord[x] > rect[x]) {
            //move left
            while (coord[x] > rect[x]) { coord[x]--; }
            rect[h]--;
        }
        if (coord[y] > rect[y]) {
            //move up
            while (coord[y] > rect[y]) { coord[y]--; }
            rect[x]++;
        }

        //if we stop moving, bail
        if (coord.join("") == last) break;
        last = coord.join("");
    }

    alert('done', coord);
});

Sunday, Sunday, Sunday!

For the years 1901 to 2000, count the total number of Sundays that fell on the first of a month.

require('verbotenjs');

invoke(function() {
    var t1 = new Date('12/31/2000');
    var count = 0;

    while(t1.getYear() >= 1901) {
        //look for Sundays on the first of the month
        if (t1.getDOWName() == "Sunday") {
            if (t1.getDayNum() == 1) {
                count++;
            }
            t1 -= 7..days();
        }
        else {
            t1 -= 1..days();
        }
    }

    //output: 171
    alert(count);
});

How would you write a function to reverse a string? And can you do that without a temporary string?

//js
var str = "Madam Im Adam";

var x = str.length,
    r = -x,
    i = 0;

while (x--) {
    str = str.slice(0, i++) + str.slice(-1) + str.slice(r++, -1);
}

But it would be much better to use a temp var from a clarity perspective:

//js
var str = "Madam Im Adam";
var x = str.length;
var rev = "";

while (x--) {
    rev += str[x];
}    

Or if str is always going to be a reasonable length, a more functional approach would be best

//js
var rev = str.split('').reverse().join('');

In an array with integers between 1 and 1,000,000 one value is in the array twice. How do you determine which one?

I would coerce the integers into a hash table and check for an existing key
during iteration.

require('/dev/verbotenjs');
var x = 0;
var y = {};
var l = [];
for (var i =0; i < 1000000; i++) {
    l.push(i);
}

var x = 988402;
l[234] = x;

var t = Date.now();

l.ea(function(v) {
    if (!y[v]) {
        y[v] = true;
    }
    else ea.exit(v);
}).alert();

alert(Date.now().minus(t));

//took 31ms in near-worst-case scenario.

What is the number 21 in binary format? And in hex?

Hex is F6, binary is 10101, I built a small table to calculate, binary is not a strong point :/

    02     10
    04    100
    08   1000
    16  10000
    21  10101

Can you name some limitations of a web environment vs. a Windows environment?

Without special considerations a web environment doesn't have access to most of the OS API. Further still the browser window itself is restricted more than ever in terms of the chrome and toolbar/status bar features. But a windows application can act as a request broker to the win32 API allowing for a seamless integration if the end-user is willing to install an application. Similar systems have been designed as Chrome plugins for Linux/ChromeOS support.

What do low coupling and high cohesion mean? What does the principle of encapsulation mean?

Tightly coupled software is code that depends on specific logic external to the module it is contained in. Low coupling works by creating a boundary between the two zones along dependency lines to keep them logically separated, usually through an API that is not concerned about the implementation details.

High cohesion refers to the degree of relation between groups of logic within a single module. A utility class would be an example of loose coupling but low cohesion.

How do you manage conflicts in a web application when different people are editing the same data?

You can chose a bunch of strategies from order of operations precedence (ie last edit wins) to semaphores with restricted access to collaborative entry and visual conflict resolution like a Google sheet with contributors.

Do you know about design patterns? Which design patterns have you used, and in what situations?

I used to have so much of the GOF book memorized, well before I even understood some of the more practical solutions. But I've come to learn that most of them applied to low-level systems development only. There are so many patterns that exist today in functional paradigms that I rarely use any of the patterns from that book.

These days I favor composition over virtually all inheritance, I program to a data interface over a class interface and I rely heavily when possible on dependency injection and basic encapsulation. While I end up writing a singleton here and there, firt-class functions and global namespaces really solve the problem better. Prototypal inheritance solves the base-class pattern. I favor queues, caching and event loops and async callbacks over threading and distributed processing - despite having a decade of experience of doing it well.

Do you know what a stateless business layer is? Where do long-running transactions fit into that picture?

It's a common software model that provides a fresh instance of the software environment to each request. Data is loaded and persisted in the single request. Long running processes generally get persisted to a backend queue process and a timer interval or web socket invocation will trigger a follow-up request to retrieve the results.

What kinds of diagrams have you used in designing parts of an architecture, or a technical design?

Workflow, Entity Relationship, Schemas, UML models (though that was over a decade ago) and I suppose a requirements matrix would qualify as well.

Can you name the different tiers and responsibilities in an N-tier architecture?

While N-tier offers multiple breadth and depth layering and redundancy strategies the basic ones include a request layer, a business logic layer, and a data layer. Others can include view rendering, background processing, ETL pipes, and load balancing.

Can you name different measures to guarantee correctness and robustness of data in an architecture?

Schema normalization, field constraints and foreign key constraints all ensure proper data alignment. ORMs help with developer error in terms of data acquisition, and unit tests along with some functional tests would help ensure application logic process the data correctly.

Can you name any differences between object-oriented design and component-based design?

While both use encapsulation OO typically focuses on inheritance and scope management where as component design relies more on the module pattern with greater focus on public interfaces.

How would you model user authorization, user profiles and permissions in a database?

This is a weird question - if it is asking for what would the model look like I would say that's a big question because all three models would be very different and very detailed. So I'm going to assume it means what modeling method would you use for each.

In that case I would use a workflow diagram for user authorization, an entity diagram for user profiles and a schema diagram for permissions.

If I was wrong and the latter former was the appropriate point, I would say checkout my Simple Security Layer implementation where I used a two-factor key authentication scheme to encrypt communication over a public non-ssl route. Profiles and permissions would be simple tables with the latter having a many to many relationship with profiles.

How would you model the animal kingdom (with species and their behavior) as a class system?

I would not. I would use a mixin system instead. Much of the business logic would involve hyper specific resolution strategies between namespace conflicts that even multiple-inheritance supporting languages cannot handle.

How do you make sure that your code can handle different kinds of error situations?

I use try-catch blocks with minimal exception branches if possible and heavily prefer finally blocks over not.

Can you explain what Test-Driven Development is? Can you name some principles of Extreme Programming?

TDD is developing your tests first before writing code so that you code until your tests pass. TDD suffers from the chicken-egg problem of how can you be sure your test logic is correct, enough to write code against it until it passes. Unless the tests are nearly perfectly designed in terms of logic and functionality-coverage coding until your tests pass does not guarantee anything. I'm a bigger fan of automated testing that is used for regressions instead.

XP has things like TDD, paired-programming, and rapid iteration cycles along with many other agile tenants.

What do you care about most when reviewing somebody else’s code?

I care most about the logic and maintainability of the code. I actually prefer for the code to be in the developers native style, so I don't generally care about coding style guide alignment, but would if the company felt it was important. I also find code-reviews as a good way to ensure reuse of common logic that individual developers might not be aware of.

When do you use an abstract class and when do you use an interface?

I prefer the use of interfaces when there is a strict API communication, but I really prefer abstract classes for their flexibility in design iteration where interfaces might not be known ahead of time.

Apart from the IDE, which other favorite tools do you use that you think are essential to you?

Devtools, VCS, memory analyzers, fiddler, unit and functional testing applications, and a large swath of CLI tools are considerably more important than an IDE. While I think Visual Studio is king, I get more from VIM key bindings than the code intel provided by an IDE. A visual debugger is nice, but I can resort to gdb and other language specific CLI debuggers.

How do you make sure that your code is both safe and fast?

I rely on frameworks to provide most of the safety in terms of application security. Nonces, SSL, white-listing system inputs, and treating user inputs like viruses are the usual means I keep systems secure. When I need to design a layer on top of that, like data encryption for instance, I design a common API that is dead simple to integrate. Reducing the complexity of use ensures that it will be used, but applying it globally through DI is the best option.

When do you use polymorphism and when do you use delegates?

I would typically fall back to polymorphism if the dependent logic is tightly coupled with logic inside the container. Where as a delegate is generally better for workflow logic that doesn't need extensive access to parent or subclass state.

When would you use a class with static members and when would you use a Singleton class?

A utility class is good for static members because it will likely be globally defined, and it will likely not need interfaces. Where as a singleton is better for managing a database connection, where interface implementations would allow for validating various data source layers (RDBMs, FileSystem, REST API etc.)

Can you name examples of anticipating changing requirements in your code?

I suppose coding to an interface and use of dependency injection are examples of coding styles that allow for easier modification. But then code comments would also qualify so I'm not sure about the specific angle of the question.

Can you describe the process you use for writing a piece of code, from requirements to delivery?

That depends entirely on the piece of code. If I was doing workflow logic I would use a diagram to map it out. If it was data transformations I would just write the code. Sometimes requirements matrices help with complex dependencies and taxonomies. Sometimes pseudo-code helps me pin down a complex recursion problem.

How do you find out if a number is a power of 2? And how do you know if it is an odd number?

While I know the answer to the last one, check if N modulo 2 == 0, I don't know the first one. However it took 2 seconds for me to find the answer on Stack Overflow.

How do you find the middle item in a linked list?

I think you iterate over the whole list, keeping track of pointers to the next item and the next-next item until the next-next item is the last item. Then your next-item pointer would represent a mid-point. I would probably white-board the algo if you needed exact mid-point vs mid-two points for even-element lists. But I haven't worked with linked lists in the last 15 years.

How would you change the format of all the phone numbers in 10,000 static html web pages?

Either via find/sed or an IDE that supports directory replacements if I wanted to visually inspect the replacements before making them.

Can you name an example of a recursive solution that you created?

The last one I wrote was probably my WordPress-style short-code processor for ScrewPress. I implemented basic stack overflow protection via repeating pattern detection with 2 orders of magnitude repetition limits.

Which is faster: finding an item in a hashtable or in a sorted list?

I would suspect a hash-table would either be as fast or much-faster in most cases. If there was a small-N scenario that caused better performance from a sorted list, then I would expect the hashtable implementation to adopt it internally.

What is the last thing you learned about algorithms from a book, magazine or web site?

Besides how to determine if an integer is a power of 2? ;) I supposed I've been studying binary search trees in preparation for interviews. While they are cool structures that allow for some awesome navigation properties, I have never needed to implement one manually. Databases, caching systems and traffic routers etc, all have their own very optimized and very supported implementations. It's a pattern I leave up to the domain experts who maintain them.

What type of language do you prefer for writing complex algorithms?

Any high level language will do, C#, PHP or JavaScript. I prefer to scale performance with system design over low-level constructs because they are easier to maintain and extend with the high-level language features and the low cost of hardware services.

Do you know about the Traveling Salesman Problem?

Yeah, it's an NP-complete problem that asks for an optimal route for a salesman to travel between N locations without visiting a single location more than once. It's a problem space that has some decent shortcuts, but ultimately is still expensive to compute on any non-trivial number of locations.

Data Structures

How would you implement the structure of the London underground in a computer’s memory?

I suspect that it is best represented by a directed acyclic graph, but I have zero knowledge of the London underground or train maps of any form.

How would you store the value of a color in a database, as efficiently as possible?

Depends on how much depth you want. I can keep a black and white color space in a boolean field. Or a true color RGB value with 3 bytes.

What is the difference between a queue and a stack?

A queue processes first in first out, where as a stack, like a stack of papers only allows for accessing the last page placed on top of the stack.

What is the difference between storing data on the heap vs. on the stack?

Storing data on the stack has run-time memory implications in large call stacks typically involving recursion or complex logic chains. Storing it on the heap suffers a performance penalty for access to a larger pool of memory space, but leaves you with space for larger objects and reference points that last longer than a call point.

How would you store a vector in N dimensions in a datatable?

I would assign each dimension to a column, but I'm not sure if you mean the N is constant or dynamic. If it was dynamic I would store the values as repeating rows keyed off a common vector id column.

What type of language do you prefer for writing complex data structures?

JavaScript - nothing like JSON to simplify the manipulation of a complex data structure.

What is the last thing you learned about data structures from a book, magazine or web site?

No idea, I'm not much of a data structure geek. I prefer more high level constructs functionally applied to simple scalars vectors and dictionaries.

How would you store the results of a soccer/football competition (with teams and scores) in an XML document?

I would not. I'm pretty sure that represents a breach of the Geneva Conventions.

Can you name some different text file formats for storing unicode characters?

UTF-8, 16, 32, and I'm sure there are many ISO standards for such purposes.

Do you know what a regression test is? How do you verify that new changes have not broken existing features?

A regression test is a full execution of the test architecture after changes are made to a codebase. Assuming no new tests fail you can reasonably assume existing features are working assuming you have good test coverage. But there is not way to be 100% sure.

How can you implement unit testing when there are dependencies between a business layer and a data layer?

Use of mock objects and services would allow for minimizing the dependencies.

Which tools are essential to you for testing the quality of your code?

Unit testing and functional testing are the minimum requirements for any mid-size or above project.

What types of problems have you encountered most often in your products after deployment?

The most often scenario is typically device/platform related. Although that problem is getting less of an issue as browsers continue to meet standards, there are still usability considerations that happen on varying screen sizes and processing speeds.

Do you know what code coverage is? What types of code coverage are there?

It generally refers to the amount of your code that has tests that validate the functionality. Some algorithms have too much cyclomatic complexity to reasonably test all permutations, so concessions are often made in terms of "coverage" in those situations.

Do you know the difference between functional testing and exploratory testing? How would you test a web site?

Functional tests deal with workflow testing and feature testing across large portions of an application. Exploratory is more like a randomized use of features that may or may not adhere to the designed workflow. I would test a website with functional tests, smoke screens and unit tests. I would leave exploratory testing to the initial QA round that validates a feature as launch-able. From there I would transition to functional tests so that changes in QA/Dev iterations aren't broader in scope than necessary.

What is the difference between a test suite, a test case and a test plan? How would you organize testing?

A test case is a step in a test plan which is a "chapter" for testing a specific feature. A test suite is a collection of test plans that are designed to test various aspects of an entire product.

What kind of tests would you include for a smoke test of an eCommerce web site?

Ability to access products, ability to manipulate a shopping cart collection, and ability to make a purchase. If those can be tested quickly I would add other tests like commenting or reviews, but the primary function of purchasing products in a quick screen method is all that would be necessary.

What can you do reduce the chance that a customer finds things that he doesn't like during acceptance testing?

Get customer sign-off on feature design before development, and integrate QA in the initial feature development process so that they have a good understanding of how to test the product and making sure it meets the sign-off checklist.

Can you tell me something that you have learned about testing and quality assurance in the last year?

GapDebug was sunsetted which makes iOS development with PhoneGap a total pain.

What kind of tools are important to you for monitoring a product during maintenance?

Bug tracking, log monitoring, revision history, project tracking, and usage statistics.

What is important when updating a product that is in production and is being used?

There is very little about a software stack that doesn't require special consideration for live deployments. Ensuring you have caching busted for new users, migrating segments at a time so as to be able to rollback fewer customers during failure, and ensuring users sticky sessions redirect to the proper cluster are some of the basic considerations. It really depends on the type of feature and the platform components.

How do you find an error in a large file with code that you cannot step through?

I suppose it really depends on the type of error. I'd run a syntax checker and linting utility first, see if that points to any areas that are obvious. If it is just that I don't have access to a debugger then I'd run the source through an abstract syntax tree parsing library and pogrammatically insert a series of debug statements through out the functional closures and produce my own callstack. If all else fails I'd grab some coffee and start reading. But not having stack trace info from the interpreter/compiler seems like an alternate reality.

How can you make sure that changes in code will not affect any other parts of the product?

By only adding comments? Basically you can't. You can try to mitigate it with decoupled interfaces and complete test coverage etc, but ultimately the answer is you can't make sure it won't.

How do you create technical documentation for your products?

For personal projects I embed a series of specialized code comments and use an AST walker to produce documentation via reflection. And for an overview I create a readme file with an audit log of every technical consideration and task I've done.

What measures have you taken to make your software products more easily maintainable?

KISS, DRY, and encapsulation are the primary design principles I use to streamline maintenance. I prefer loosely typed data-oriented-programming that more flexibly handles modifications to the data and input layers. Making the number of changes and the scope of that modification as limited as possible is the best way to improve maintenance. Keeping a regression suite updated helps mitigate side effects from cross-feature modifications.

How can you debug a system in a production environment, while it is being used?

Many IDE's support remote debugging, which when combined with session-based debugger breakpoints, allows for debugging production code. Outside of that you can use dbg to analyze core dumps. And at the very least you can tail some log files to analyze production logic.

Do you know what load balancing is? Can you name different types of load balancing?

I'm only aware of round-robin and sticky-session based load balancing for web traffic. I suspect there are lots of N-Tier solutions at the hardware layer and software layer for achieving balanced loads across systems, disks and CPU's. From a web server perspective a load balancer is hardware or software that distributes traffic across multiple processing units. Another example would be scripting AWS to spin up new servers to balance resource usage in a cloud cluster.

Can you name reasons why maintenance of software is the biggest/most expensive part of an application’s life cycle?

In most cases it's the longest phase. But if the software is poorly designed and implemented the cost of undoing that technical debt is significantly more difficult than building it correctly from the start. If the system is fragile, then more effort is wasted on fixing side-effects than fixing the application logic.

What is the difference between re-engineering and reverse engineering?

Re-engineering is the process of refactoring code to be more efficient, understandable, or maintainable. It probably covers rewrites as well. Reverse-engineering is the process of deducing system requirements from code, particularly obfuscated code, or the application interface.

Do you know what a baseline is in configuration management? How do you freeze an important moment in a project?

While I did not know what this question was referring to, a quick Google search shows that it is referring to the sprint/milestone concept of project status tracking. Basically it's an agreed upon target for a phase of development that tracks progress. You can freeze a baseline through just about any means, verbal, read-only software configuration, data export etc.

Which items do you normally place under version control?

Everything but your data, binaries and environment config (servers/passwords/settings/logs.) But code and documentation are must-haves.

How can you make sure that team members know who changed what in a software project?

Version control will tell you modification history of a codebase. Decent project management systems will provide an audit log for project features and requirements. Office document managers also provide revision history for spec changes.

Do you know the differences between tags and branches? When do you use which?

A tag is good for a point in time reference - like a revision just before or just after a merge. A branch is used for sort of a code sandbox that may or may not need re-integration into the main development line.

How would you manage changes to technical documentation, like the architecture of a product?

This is the primary reason I like to keep technical specs inside regular text files inside the codebase itself. Then it's an easy matter of doing a code review with the team via a diff. For stakeholder edits, I setup a shared-drive and I run an auto-check-in on a chron job. Conflicts between dev changes and stakeholder changes are easily flagged for team review.

How do you deal with changes that a customer wants in a released product?

You make those changes on a staging environment and let the customer sign off. Then you update production after they have been verified.

What is the difference between managing changes in text files vs. managing changes in binary files?

Many VCS systems do not support binary differentials. Even those that do like Git can bloat quickly because binary production isn't easily reducible due to their compression layer. So for binaries, I prefer to use a single or limited backup system instead of a version change graph.

How would you treat simultaneous development of multiple RfC’s or increments and maintenance issues?

Isolating change is important for multiple development streams. Each change should be isolated in terms of a sandboxed environment. Each should be integrated individually into the main development branch and tested for integration and regression issues. Generally a first-come-first-serve model is ok to use, but often competing changes need to be prioritized by technical considerations for easier integration.

How many of the three variables scope, time and cost can be fixed by the customer?

All of them, because there are three other primary axes that affect software development: Quality, Scalability and Security. All three independently affect the software product and roadmap. So if a customer wants XY and Z, done in 3 weeks for $5K, that can be accomplished as long as the other axes are not concerns. There are obviously lower bounds so asking for them in 3 minutes is not feasible.

Who should make estimates for the effort of a project? Who is allowed to set the deadline?

The development, QA and OPS teams should make estimates and the stakeholders should make deadlines. Project Managers should then work on whatever trade-offs are necessary to meet the deadline with the best product possible.

Do you prefer minimization of the number of releases or minimization of the amount of work-in-progress?

Minimizing a release schedule is important even under continuous delivery models as the more frequently you deploy the more overhead you incur per feature. Even if your deployments were 99% automated and took only 15 minutes to do, that's still 15 minutes for 1 feature vs 15 minutes for 10 features. So why you would do 15 minutes per feature 10 times over is beyond me.

Which kind of diagrams do you use to track progress in a project?

A burn-down chart, haven't had much need of anything else over the last decade.

What is the difference between an iteration and an increment?

Depends on the domain. Iteration can mean a sprint or partial version increment (ie multiple iterations to release and increment.) Or it can mean an incremental change that is completed along with many others in a single iteration.

Can you explain the practice of risk management? How should risks be managed?

Risk is basically the sum of unknowns in a project. Exposing those unknowns early and often is the basic premise for managing them. There are lots of strategies for managing them, but prototyping and exploratory development are often key for technical risk. Schedule padding is commonly used for estimation risks.

What do you need to be able to determine if a project is on time and within budget?

A final product, an audit of effort, and an operations expenditure table. Otherwise scope creep and unknowns will always prevent knowing what state the project is in. Estimates are king.

Can you name some differences between DSDM, Prince2 and Scrum?

Wow, DSDM goes way back to the RAD days in the late 90's, but it is generally what you see in bug-tracking systems today. Scrum focuses more on feature development than the technical components to production. And I've never heard of Prince2 but a cursory review of it on Wikipedia conveys a process-heavy system that other agile methods have proven to be less effective over modern agile workflows.

How do you agree on scope and time with the customer, when the customer wants too much?

Raise the price to handle more development resources and explain that even with additional resources feature quality may be impacted by time and scope constraints. In practice it's probably best to just agree to the terms and deliver what you can. Software is not a manufacturing process, and when the end of the project timeline nears, they can either accept this reality and continue to finish it or move on as is.

What excites or interests you about coding?

As a child I always wanted to be an inventor when I grew up. But I always lacked access to the raw materials and machinery necessary to bring my ideas to life. When I discovered I could write software, I realized I could invent anything I wanted with virtually limitless raw materials. I haven't stopped developing software since.

Which version control systems are you familiar with?

I started with CVS and SVN from the late 90's to mid 2000's. I switched to Git around 2007. Since about 2009 I started using Mercurial for personal projects because I preferred it's simpler commit workflow. I worked with source safe for a brief stint, long enough to learn exclusive checkout was the only option.

I'm familiar with various branching and tagging strategies, conflict resolution workflows and general repo management from the CLI. I've also managed two SVN to Git migrations, including training and support.

If you have 5 different stylesheets, how would you best integrate them into the site?

I would merge them into a single file (either manually or via a tool like webpack or browserify) and host it on a CDN.

Can you describe the difference between progressive enhancement and graceful degradation?

Progressive enhancement is the notion of delivering a bare-bones content and adding features / interactions if the environment allows. Whereas graceful degradation tries to deliver the full feature set to the client, and safely degrade the experience if features are not supported.

How would you optimize a website's assets/resources?

I try to keep CSS and WebFonts loaded at the top for primary elements to prevent a major FOUC. Primary JavaScript libraries go at the bottom of the body, and non-primary resources should be loaded on demand as features require them.

Combining all assets with whitespace removed and gzipped across the wire keeps the overall pageweight to a minimum without affecting production debugging or relying on source-maps in unsupported environments like selenium automation.

Finally I host image assets in sprites on a dedicated CDN (with sticky endpoints based on geolocation if necessary.)

How many resources will a browser download from a given domain at a time?

Generally its around 4 to 6 per domain. I'm not sure what the upper bound is for total number of connections.

Name 3 ways to decrease page load (perceived or actual load time).

You can reduce Request to first Byte times with high performance server software. You can enable caching of resources to improve subsequent page loads. You can put style resources at the bottom of a document to prevent their download from blocking content. You can reduce the number of external references by directly embedding content in the initial request.

If you jumped on a project and they used tabs and you used spaces, what would you do?

I would change the project settings in my IDE to use tabs instead of spaces.

Describe how you would create a simple slideshow page.

For the portfolio on my website I wrote a very basic slideshow. The design uses an image to render the current slide, and a hidden image to pre-load the next slide. When the timer elapses it swaps out the old image with the preloaded image using a CSS transition.

If you could master one technology this year, what would it be?

I've started digging into Pythong and MatPlotLib earlier this year after discovering that XKCD (an internet comic I love) was coded with these technologies, not hand-drawn.

Explain the importance of standards and standards bodies.

Most of my career was spent memorizing useless inconsistencies and browser hacks before browsers put for standards compliance as a priority. Even today when there are still hundreds of divergences, the ability to write code and reliably know it will work cross environment is priceless. I can't fathom how much time and effort was wasted (from the world, let alone myself) before such concerns were taken seriously.

What is Flash of Unstyled Content? How do you avoid FOUC?

Keeping your styles and fonts loaded at the top of the head and loading content after dom init is the safest way to eliminate it completely. But with the right page weight you can get away with loading the content on the initial request.

If you had two 6-sided die, are you more likely to roll an 11 or a 12 and why?

Uhg, I failed this one at first during a phone screen, but I was able to answer correctly on my second attempt. I don't really like logic puzzles because I tend to over-think them. I initially answered 12 thinking two dice would produce an even number more likely. But after trying the top permutations for 12 I immediately realized by mistake. The answer is 11 because there are two scenarios that sum 11 (5, 6) or (6, 5). But only (6, 6) can roll a 12.

Can you tell me the difference between an Abstract class and an Interface?

An interface is just a contract for the classes that implement it. Classes can implement multiple interface contracts. Where as an abstract class can define a recommended contract, and it can define implementation as well.

What are some security measures you should implement on a website?

SSL would be my first step for obscuring traffic. Using encrypted cookies with the HttpOnly flag will secure your sessions. Using strong encryption for your application layer like AES256 with proper 32bit salts will keep your client data secured. Using nonces will prevent against XSS replay attacks. And finally all user input should be scrubbed and escaped before injection into the database. Any user-generated content that is rendered to the client should also be scrubbed and properly escaped. An ORM and quality Web Framework should provide the bulk of these options for you.

Explain the difference between overloading and overriding.

Overloading is when you have the same function namespace on a class, but with a different method signature. Overriding is where you subclass a parent's implementation with a different one in the child.

Explain what ARIA and screenreaders are, and how to make a website accessible.

ARIA, is a tagging system for accessibility utilities. They allow screen readers to describe websites more effectively with text that is not visible on the screen. They have special tags for menus and things to ignore.

Other strategies for accessibility include offering alternate style sheets that use high-contrast and enlarged elements for people with vision impairment. Further still offering a text-only option is helpful for information heavy sites.

What does CORS stand for and what issue does it address?

CORS is what allows for accessing resources across different origins via AJAX. When AJAX was restricted for security measures we used jsonp for delivering 3rd party javascript with a callback feature. Then CORS was established to give control over the request from the 3rd party by using specially designated response headers and an 'allow' parameter. CORS can also be limited to a domain or subdomain for private use of a given site.

What are data- attributes good for?

Data attributes are good for storing data on an element. Because they are standardized you don't end up with namespace conflicts with existing and future element attributes.

But any more than a couple of data points and it is far better for maintenance to populate a JS variable with JSON instead of bloating up the markup if you are passing data through a template.

What's your spirit animal?

I laughed pretty hard when I was asked this during an interview. I don't even remember what I said then, but I wouldn't seriously expect you to buy any answer I gave now either ;)


Hmm, nothing found. Try searching for multiple topics with commas. Something like: