“Arbisoft is an integral part of our team and we probably wouldn't be here today without them. Some of their team has worked with us for 5-8 years and we've built a trusted business relationship. We share successes together.”
“They delivered a high-quality product and their customer service was excellent. We’ve had other teams approach us, asking to use it for their own projects”.
“Arbisoft has been a valued partner to edX since 2013. We work with their engineers day in and day out to advance the Open edX platform and support our learners across the world.”
81.8% NPS78% of our clients believe that Arbisoft is better than most other providers they have worked with.
Arbisoft is your one-stop shop when it comes to your eLearning needs. Our Ed-tech services are designed to improve the learning experience and simplify educational operations.
“Arbisoft has been a valued partner to edX since 2013. We work with their engineers day in and day out to advance the Open edX platform and support our learners across the world.”
Get cutting-edge travel tech solutions that cater to your users’ every need. We have been employing the latest technology to build custom travel solutions for our clients since 2007.
“Arbisoft has been my most trusted technology partner for now over 15 years. Arbisoft has very unique methods of recruiting and training, and the results demonstrate that. They have great teams, great positive attitudes and great communication.”
As a long-time contributor to the healthcare industry, we have been at the forefront of developing custom healthcare technology solutions that have benefitted millions.
I wanted to tell you how much I appreciate the work you and your team have been doing of all the overseas teams I've worked with, yours is the most communicative, most responsive and most talented.
We take pride in meeting the most complex needs of our clients and developing stellar fintech solutions that deliver the greatest value in every aspect.
“Arbisoft is an integral part of our team and we probably wouldn't be here today without them. Some of their team has worked with us for 5-8 years and we've built a trusted business relationship. We share successes together.”
Unlock innovative solutions for your e-commerce business with Arbisoft’s seasoned workforce. Reach out to us with your needs and let’s get to work!
The development team at Arbisoft is very skilled and proactive. They communicate well, raise concerns when they think a development approach wont work and go out of their way to ensure client needs are met.
Arbisoft is a holistic technology partner, adept at tailoring solutions that cater to business needs across industries. Partner with us to go from conception to completion!
“The app has generated significant revenue and received industry awards, which is attributed to Arbisoft’s work. Team members are proactive, collaborative, and responsive”.
“Arbisoft partnered with Travelliance (TVA) to develop Accounting, Reporting, & Operations solutions. We helped cut downtime to zero, providing 24/7 support, and making sure their database of 7 million users functions smoothly.”
“I couldn’t be more pleased with the Arbisoft team. Their engineering product is top-notch, as is their client relations and account management. From the beginning, they felt like members of our own team—true partners rather than vendors.”
Arbisoft was an invaluable partner in developing TripScanner, as they served as my outsourced website and software development team. Arbisoft did an incredible job, building TripScanner end-to-end, and completing the project on time and within budget at a fraction of the cost of a US-based developer.
Most of us start our coding journey from the legendary ‘Hello World’ program. Many programming languages showcase their simplicity and beauty through the simplicity and beauty of the Hello World program in them. From there on, we tend to learn a lot of coding that is not just limited to a programming language but also includes many core concepts. Concepts like the runtime complexity, space complexity, the invariant, and so on. Besides all these technical aspects of programming, we also learn how to write clean and manageable code that is both readable and concise.
After the Hello World program, we start driving on a practically endless road. There are several crossroads in between where you can decide your future endeavors. You could be a Machine Learning Engineer, a Software Developer, a Frontend Developer, or a Full Stack Developer. The list goes on and on.
No matter which set of expertise you choose, you will be working to achieve a code that is a masterpiece in terms of its conciseness, efficiency, and readability. To achieve such greatness, we learn how to write clean code, best practices, trending frameworks, design patterns, tips and tricks, and so on.
Then you jump into the industry and start writing or working on already written code. Here you come to realize that all of this learning was only for the sake of learning, and the senior developers there with more experience than you, with more tools at their hands, with more exposure to the market, write code that is unimaginably far from what you had learnt throughout the ages. The only Design Pattern the codebase has is “Design, Develop, and Ship.”
Your Awesome Schema Validation
What a concise and beautiful way to validate your user’s input:
const schema = z.object({
name: z.string().min(1, 'Please enter your name.'),
email: z
.string()
.min(1, 'Please enter an email')
.email('Please enter a valid email e.g. name@email.com.'),
phone: z.string().min(7, 'Please enter a phone number.'),
message: z.string().min(1, 'Please describe the project.'),
});
Wake up to reality. The awesome product that your company is super proud of, and you should be grateful to get an opportunity to work on, has no such thing as schema validator. Instead, you have gotten yourself a file with 15000+ lines of conditionals that are validating who knows what. These 15000 lines contain snippets like:
export const awesomValidator = (values, t = null) => {
const errors = {};
if (!values['offered_date'] || !(values['offered_date'] instanceof Date)) {
errors['offered_date'] = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.DATE_MISSING') : ERROR_MESSAGES.DATE_MISSING;
}
if (!values['joining_date'] || !(values['joining_date'] instanceof Date)) {
errors['joining_date'] = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.DATE_MISSING') : ERROR_MESSAGES.DATE_MISSING;
}
if (values['send_mail']) {
if (values['template_id'] === -1) {
errors['template_id'] = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.EMAIL_TEMPLATE_MISSING') : ERROR_MESSAGES.EMAIL_TEMPLATE_MISSING;
}
if (isEditorEmpty(values.content)) {
errors.content = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.CONTENT_MISSING') : ERROR_MESSAGES.CONTENT_MISSING;
} else if (hasInvalidVariables(values.content)) {
errors.content = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.INVALID_VARIABLES') : ERROR_MESSAGES.INVALID_VARIABLES;
}
}
if (values.salary < 0) {
errors.salary = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.INVALID_VALUE') : ERROR_MESSAGES.INVALID_VALUE;
}
if (values.salary && !values.accepted_currency) {
errors.accepted_currency = t ?
t('DISPLAY_TEXT.ERROR_MESSAGES.FIELD_REQUIRED') : ERROR_MESSAGES.FIELD_REQUIRED;
}
if (values.salary < 0) {
errors.salary = ERROR_MESSAGES.INVALID_VALUE;
}
if (values.salary && !values.accepted_currency) {
errors.accepted_currency = ERROR_MESSAGES.FIELD_REQUIRED;
}
return errors;
};
Your Top-Notch Network Request Handler
You are well equipped with React-Query and its best practices and whatnot. Wake up to reality. Your company’s marvel doesn’t contain such a thing.
The network requests are handled with Redux. Not the awesome RTK-Query that you leveled up your skills in over the past 2.5 months. It’s not even the Redux Thunks. It’s your team’s Solution Architect's brilliant idea of the cleanest way to handle api calls in the code.
What’s the idea?
Just do the api call and update the redux store. Now your components are rendering 48 times on just visiting them back and forth, because the 5 api calls are sharing the same store’s loading and success status states. Even the error state is common. Now, the solution architects define a way to tell the code which error belongs to what api call. We usually solve the problems that we created ourselves using poor and hastily made decisions.
You’re fully equipped with React 19 and its awesome new features that allow you to better handle the failures, loadings, and fetches.
The great product your company has launched is built on React, amazing. Wake up to reality. The project is using React 16. Class Components everywhere, Components wrapped with tens of Higher Order Components. No hooks in sight. Props drilled down to the Earth’s core. Props are injected from somewhere, and no one knows from where; all we know is that there must be an HOC up in the hierarchy injecting these props (optional).
All those sleepless nights learning typescript on top of JavaScript to produce a more robust and error-free code. What types? Wake up to reality. The awesome company showcase is all in JavaScript. There is absolutely no auto-complete working. All you see is a function with argument ‘values’ and nothing else.
Now you figure out the position where this code is being used. Then you traverse up from its caller and reach the point where you finally breathe a sigh of relief because the values are being returned from the ‘abc’ callback. Now all you have to do is check this ‘callback’ and voila, the callback is a network request, and all you see is this:
this.props.getSiteGroupsList();
Maybe it's just me, but if you find a way to figure out what the response type is, do let me know.
Why so Harsh?
Me or reality? I guess both of us.
If you’re with me till now, let me tell you that there is a reason why I decided to keep a harsh tone throughout this blog. The reason is that it depicts reality - the harsh reality.
Most of the codebases are years old, and you have to live with them. No one out there is motivated to do any refactoring or include any new libraries to reduce the code clutter or reduce the tech debt. Everyone is focused on writing code, generating output, and nothing more.
Senior leadership, clients, and advisory committees are all focused on the goal, not the road. But we don’t necessarily have to compromise the goal in order to get a smoother journey.
Why can’t we enjoy the destination and the journey both? Why can’t they both be fun and beautiful?
“I guess we’ll never know” - Kanye West.
Takeaway
The purpose of this blog is not to downgrade any project or any developer or anyone else, for that matter. No one hurt me either. I just wanted to share what’s really out there. If your project looks similar to the snippets I’ve shared above, maybe it's time to start working on making things better step by step.