TRI NGUYEN
Senior Node Developer
PREVIOUSLY AT

Flexiple spent good amount of time understanding our requirements, resulting in accurate recommendations and quick ramp up by quality developers.
Overall Flexiple brought in high-level of transparency with quick turnarounds in the hiring process at a significantly lower cost than any alternate options.
Flexiple has been instrumental in helping us grow at a fast pace. Their vetting process for engineers is top notch and they connected us with quality talent quickly.
Flexiple Developers are reviewed on their experience and complexity of products built. Those who display depth and have worked on end-to-end projects are given an introductory call.
Over a call, the developer’s ability to communicate in an articulate manner is tested. A deeper understanding of the candidate’s technical experience and also motivation to freelance is achieved.
Over one or more F2F interviews, the developer’s involvement and performance in building complex software products are assessed. This sets the platform to delve deeper into technology-specific discussions.
Developers' mental agility and problem-solving abilities are tested through a coding test involving algorithmic as well as skill-specific problems. A mixture of live evaluation and timed coding tests is used.
The live experience of working with developers is verified by reaching out to past clients and/or employers. Inputs on various qualitative factors such as reliability, punctuality, communication and responsiveness are received.
Performance during each engagement is continually assessed. Our developers are expected to maintain Flexiple standards across all engagements with our customers.
NodeJS is a server-side platform built on Google Chrome's JavaScript Engine (V8 Engine) written by Ryan Dahl in 2009, about thirteen years after the introduction of the first server-side JavaScript environment. According to SimilarTech, there are about 165 thousand websites build using NodeJS, with the United States having the highest share.
If you’re looking to hire a freelance NodeJS developer, this guide is going to help you find the perfect fit. We’ve included everything you need to know about hiring a great freelancer for your company.
Before diving into the fundamentals of hiring a freelance NodeJS developer, let's delve into some interesting facts about the history of NodeJS.
We have broken the sections into the following parts:
1. Let's introduce NodeJS to you.
2. Why is NodeJS widespread?
3. What are the tools used by NodeJS developers?
4. Writing the Job Description to hire a NodeJS developer
5. Interview Questions for hiring a NodeJS developer
- Basic Questions
- Advanced Questions
- Data Structures/Algo Questions
Here are some of the top tools that NodeJS developers use to build applications:
1. WebStorm
WebStorm is an Integrated Development IDE created by JetBrains. It works very well with JavaScript and is hence used extensively by NodeJS developers. The platform is lightweight and equipped with all the components needed for NodeJS development on the frontend and backend.
2. npm
npm or Node Package Manager includes a command-line client and an online registry. It is the default package manager when using NodeJS. The use of NPM sorts modules and aids in the publishing, installing, and managing of NodeJS software. NPM registry has thousands of code packages that can be used by developers.
3. Webpack
Webpack serves as a module bundler. Mainly, it puts together JS files to be used in a browser. It combines a large number of files into a few files necessary to run the app.
4. PM2
A process manager for NodeJS apps, PM2 is easy to use and comes with many in-built features. This tool monitors an application in real-time and gets it up and running without you needing to worry about restarting it.
5. Babel
This tool is a JavaScript compiler. The use of Babel allows for easy compilation of ES6 or ES7 to ES5 for use in the production of the app. In the transfer of the code from the new to the older version of ES, Babel also tries to make use of a minimal number of lines of code.
6. Electrode
An open-source platform for React/Node, Electrode enables building NodeJS apps in a well-structured way. It makes writing core NodeJS code easy as well as provides some complex modules to add advanced features. Thanks to Electrode, NodeJS developers can reuse code and optimize and deploy software with ease.
Below are some key points that we at Flexiple have learned through trial and error - a process of filtering through over 15,000 developers.
Now that you have made a quality JD, it can still be tricky to evaluate the skills of your applicants. To help you with that aspect of hiring a NodeJS developer, we have created a pool of questions that a good NodeJS developer should be comfortable with.
It is important to note that the ability to answer these questions doesn't imply that you have a top quality candidate. But it definitely is a big step in that direction.
To help you navigate through these questions, we’ve categorized the interview questions in 3 parts:
A. Basic concepts: Includes all basic concepts used across languages but we've focused on their significance in Node. This will give you an understanding of how strong their programming foundation is.
B. Advanced concepts: Includes all concepts that someone with higher expertise should know.
C. DS/Algorithm questions: To test the logical capability of the candidate.
console.log(1) console.log(2) console.log(3)
1 2 3
console.log(1) setTimeout(() => console.log(2), 0) console.log(3)
1 3 2
fun = () => { promise().then(() => { console.log("executed code") // sequential execution occurring after the promise function is executed }).catch((e) => { console.log(e) }) }
fun = () => { promise().then((data) => { console.log(data) // sequential execution occurring after the promise function is executed // and data is what it returns }).catch((e) => { console.log(e) }) }
fun = () => { promise().then(() => { return "first promise" }).then(() => { return "second promise" }).then(() => { return "third promise" }).catch((e) => { console.log(e) }) }
fun = async () => { const var1 = await promise() const var2 = await promise() const var3 = await promise() }
upstream app_servers { server backend1.example.com; server backend2.example.com; server backend3.example.com; }
server { listen 80; server_name localhost; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://app_servers; } }
Middleware Modules
These are npm packages such as Passport.js, Everyauth and Permit. These are packages that work on top of Node.js frameworks such as Express.js, Koa.js, Hapify.js. They utilise the ‘connect’ middleware conventions. This means that while using the aforementioned frameworks, you can just plug in the modules and use their functionality.app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
User Management as a Service
These are services such as Stormpath/Okta, Keycloak and Auth0. Over time, software has moved from on-premise to the cloud, to now a distributed API service. These technologies provide Identity Management APIs for software teams building web, mobile and API driven applications.var spClient = new stormpath.Client({ apiKey: apiKey }); // Grab our app, then attempt to create this user's account. spClient.getApplication(process.env['STORMPATH_APP_HREF'], function(err, app) { if (err) throw err; app.createAccount({ givenName: 'John', surname: 'Smith', username: username, email: username, password: password, }, function (err, createdAccount) { if (err) { return res.render('register', { title: 'Register', error: err.userMessage }); } passport.authenticate('stormpath')(req, res, function () { return res.redirect('/dashboard'); }); }); }); });
Custom Database and Authentication
This is the more do-it-yourself approach, where the developer builds the whole authentication architecture from scratch. It first starts with choosing your tech stack, database, hashing algorithm, method of maintaining sessions and so on. After this, the next part would be to build the user management service.class ValidParentheses{ func isValid(_ s: String) -> Bool { var stc = [Character]() for char in s { if char == "(" || char == "[" || char == "{" { stc.append(char) } else if char == ")" { guard stc.count != 0 && stc.removeLast() == "(" else { return false } } else if char == "]" { guard stc.count != 0 && stc.removeLast() == "[" else { return false } } else if char == "}" { guard stc.count != 0 && stc.removeLast() == "{" else { return false } } } return stc.isEmpty } }
The above code will input 0(false).
var a = 10; var b = 5; var c = 3; if (a / b / c) document.write("hi"); else document.write("hello");
The answer is A because the floating-point division returns a non zero value = 0.66 which evaluates to true and outputs ‘hi’.
var p = 2; var q = 4; var r = 6; if (p > q > r) document.write("true"); else document.write("false");
The answer is False. It may look like the output can be true because 6 > 4 > 2 is true, but PHP evaluates $z > $y first, which returns a boolean value of 1 or true. This value (true or 1) is compared to the next integer in the chain, bool(1) > $z, which will result in NULL and echo “false.”