what we think


Keep up with our latest news, tech advancements, and articles contributed by our staff. You will discover our official announcements, exciting events, technological insight, and our staff voice.

November 24, 2023

A small story about relationship and coding

As a married couple, my wife and I are constantly trying each other’s field to be able to better understand each other. Lately, as I am trying to do more housework, my wife is beginning her journey to programming.

To help my wife, I set up her MacBook with Swift Playground. It has a cartoony interface and simple objectives like collecting gems and toggle switches, it makes learning more like playing a game. And it introduces you to the basic concepts of programming, great for starters.

Then came last week, she was introduced to the concept of function.

For those of you who are unfamiliar with programming, a function is “a sequence of program instructions that performs a specific task, packaged as a unit. This unit can then be used in programs wherever that particular task should be performed.” (the definition taken from Wikipedia).

You can turn right by turning left 30015 times (or 3 times)

When she completed the task, I helped review her code as always.

The problem has 4 lines, each has 2 gems and 2 switches, and expects the learner to make use of function and loop.

She has a function named goToCollectGems, which is looped to run 4 times. So far so good.

But that function do: tell the character go to the nearest gem’s position, collect the gem, go the the next gem’s position, collect it (so far so good); then turn around, go back to starting position, then go to the nearest switch, then toggle the switch, then go toggle the next switch, then back to starting position, then go to the beginning of the next line.

I told her that it is not good to make a function do more than what is written in its name. She was confused to hear that, she said: “But I expect you guys to know better than what you are told to do”. That is when something suddenly clicked for both of us.

  • Ah, no wonder you always lack the ability to understand my expectations. - said my wife.
  • Now I know why you always group a lot of tasks to your function. - I told her my realization.

We are both not wrong, we just have different ways of thinking. She, being my wife, expects me to understand and do everything with only a hint from her. I, as a programmer, expect everything to be clearly and exactly defined, so they can be applied and followed correctly.

I explained to her that functions are to be reused, and should do exactly what it is expected to do, no more, no less. “Maybe next week you will call that function again, and because you have forgotten what it does, you will then make the character move unnecessarily”, I said, she agreed.

Her code after fixing my review (it reminds me of my high school time)

I also told her next time when she tells me to “go out for dinner”, I will also budget the time and money for moving, having dinner, strolling around, shopping and watching a movie.

  • Yeah, that’s the way - she said.

A snippet of “my code” after fixing her review


Image source: https://www.freepik.com/

View More

November 24, 2023

Some useful extensions in Visual Studio Code

Visual Studio Code is a useful programming tool, it supports almost all popular programming languages: Python, JavaScript, HTML, CSS, TypeScript, C++, Java, PHP, Go, SQL, Ruby, ...


Another thing regarding language support is that documentation for popular programming languages in homepage. Shows that the development direction of this editor is aimed at all programmers, regardless of what programming language or field they use in the programming industry.

It can be said that it is one of the software with the richest extension store with thousands of extensions of all types such as programming languages, themes, services,...

VS Code extensions let you add languages, debuggers, and tools to your installation to support your development workflow.


In my work,  I have found some extensions to be particularly useful, so I would like to share them with everyone below.

The first:  I will introduce about install 
+ Find and install an extension:
In the Extensions, input 'code' the search box to filter the Marketplace offerings to extensions with 'code' in the title or metadata.
You can see this extension and choose what you want use.


Some useful application for developers:


1.Git Graph

- Introduce: 

View a Git Graph of your repository, and easily perform Git actions from the graph.

Normally we will use some tools like Tortoise Git, Source Tree, Git Base to manage our git,
track commits, merge requests, see git branches, people committing code,...

The purpose is to know where the information about these branches will come from, when they committed, and who committed them in a clear diagram with easy-to-see colors.

To meet this need, we will have an extension called Git Graph, we can use the extension to review all necessary information without using other external tools.

- Install: Menu Extensions-> Search Git Graph -> Click Install Button

2.GitLens — Supercharge

- Introduce: 

If Git Graph helps us review all the information through the commit schedule.

But it has a limitation: to view information, we need to click on the menu of this extensions , and only view each file.

On the contrary, GitLens can help us see information about each line of code: who wrote this line of code, what date it was committed, branch name, version ,...

We just need to click the cursor directly on that line of code to see the information

- Install: Menu Extensions-> Search GitLens -> Click Install Button

3. Rainbow Tags
- Introduce:

Rainbow Tags are extremely useful Extensions, especially for web programmers, for pages with too much html code.

It is difficult for us to check the opening and closing of tags, parent tags, and child tags.

Rainbow Tags will help us review code easily, the tags are colored differently for each level, there will be no color overlap if the same type of tag

Then we will easily see the opening and closing of this tab. Color will make us feel more interested in programming

- Install: Menu Extensions-> Search Rainbow -> Click Install Button

4. Lines of Code (LOC)

- Introduce:

At the end of the project, we will have an extremely important job: to summarize the number of lines of code of that project.

This is for the purpose of accurately evaluating and making statistics about our projects to report to superiors, customers, to evaluate KPIs, Sales,...

And Lines of Code will support us very well in this.

Lines of Code can be listed by file or by entire project: total number  files, number code, number of comment lines, number of blank lines

The results are exported as json files and txt files

- Install: Menu Extensions -> Search Lines of Code -> Click Install Button

[Reference Source]









View More

November 24, 2023

Excel4node lib for Vuejs

For Vue programmers, a great excel file creation library with full format is required. It's Excel4node.

Excel4node is a node.js module that allows you to create and manipulate Microsoft Excel spreadsheets.

It's easy to use as generating Excel files with complex formatting, formulas, and charts, hide sheet, protection sheet,...


1. Simple: it is simple to makes it easy to generate Excel files in just a few lines of code.
2. Formulas: can add and edit formulas in your spreadsheet.
3. Charts: can create charts and graphs in your Excel files.
4. Flexibility: allows to create and modify Excel files with a variety of formatting options, including cell alignment, font style and color, and background color.


1. Read: don't support function read file in lib, must use other lib to read.
2. Environment: some time, when export at other environment and get it to read have problem.


I would like to show you how to use it in Vuejs.

The first : We need to install package excel4node

+ Open cmd of windows and go to project: I use project Demo in here D:\.

cmd : D:\Demo\web>npm i excel4node

+ Import the library into the project : To use this library, We need import it to project.

// Require library
var xl = require('excel4node');

+  Create file excel with sheet name [sheet 1] with 5 column and 3 row have special template

+ Create css common apply for excel : border color 000000, style thin , font-size = 11, font family MS PGothic

+ Apply column B to column F , Line 2 to line 5 

// Apply

ws1.cell(2, 2, 5, 6, false).style(styleBorder)

+ Add data to column 

B2 :
. have text : Text demo 1
. (text bold) : text is bold
. text red) : text is red color
C2 :
. have text : Text demo 2
. (text bold) : text is bold
. text red) : text is red color

D2 :
. have text : Text demo 3
E2 :
. have text : Text demo 4
F2 :
. have text : Text demo 5

+ Finally we will get the excel file as expected : 

  1. Column B to column F , line 2 to line 5 : have border
  2. Column B to column E , line 2 to line 5 : have background #fcd5b4
  3. Column B and column C , line 2 have text data as format

[Reference Source] 



View More

November 24, 2023

What is CI/CD?

Nowadays, developing a software project requires many processes. To reduce time and improve product quality. One of the most widely applied processes today is CI/CD.
So what is the meaning of CI/CD? What are the benefits of the CI/CD process?
Let's find out together!

1. What is CI/CD?

The CI/CD (Continuous Integration/Continuous Delivery) process is a method used to deploy software regularly by applying automated methods during the software development process. The main idea of CI/CD is to continuously perform software integration, migration, and deployment on a regular basis.

This process includes the following steps:

  • Build: Build based on the source code and add new features.
  • Test: In-depth testing of newly changed features and code.
  • Deliver: Codes and features that have been tested will be put into the testing environment.
  • Deploy: New changes and features are deployed in the final product to users.

Build Automation & CI/CD



The CI/CD process helps integration happen faster and the finished product is delivered to users in the shortest time.

Currently, CI/CD has been widely applied to the workflow of businesses in the IT field, along with DevOps and Agile.

2. Why use CI/CD?

The CI/CD process helps automate software development and faster product deployment. It helps software development teams test, integrate, and deploy products continuously and synchronously. This enables software development teams to focus on creating higher-quality products while reducing the time and cost of product development.

The benefits of a CI/CD process include:

  • Increase productivity: CI/CD processes enable software development teams to focus on creating higher-quality products while reducing product development time and costs.
  • Minimize errors: The CI/CD process helps software development teams check and handle errors during product development quickly and effectively.
  • Increased stability: CI/CD processes enable software development teams to continuously test and verify product stability, ensuring that the product always performs well.
  • Increase reuse: The CI/CD process enables software development teams to create reusable components that are tested and verified for stability, saving time and costs in the process. product development process.

3. Disadvantages.

Although the CI/CD process has many benefits, there are also some disadvantages.
Here are some disadvantages of the CI/CD process:

  • Security: CI/CD pipelines can encounter security issues, including security vulnerabilities and issues related to identity management.
  • Resources: The CI/CD process requires many resources, including servers, tools, and human resources.
  • Implementation difficulties: Deploying a CI/CD pipeline can present many difficulties, including integrating tools and managing software versions.
  • Difficulty of change: Changing the CI/CD process can be fraught with difficulties, including changing tools and managing software versions.

4. Software\tools commonly used for CI/CD process.

Currently, there are many tools used for the CI/CD process.

Here are some common tools used in the CI/CD process:

  • Jenkins: Jenkins is a popular open-source tool for deploying CI/CD.
  • GitLab CI/CD: GitLab offers CI/CD integration within its source code management platform.
  • Travis CI: Travis CI is a CI/CD integration service commonly used in the open-source software development community.
  • CircleCI: CircleCI is a CI/CD integration tool widely used in enterprises.
  • TeamCity: TeamCity is a CI/CD integration tool developed by JetBrains.



CI/CD is closely related to Agile and DevOps. The combination of CI/CD, Agile, and DevOps creates a flexible, optimized, and high-performance software development process.
Hopefully, through this post, you will have an overview of what CI/CD is and the benefits of CI/CD.

[Reference Source]

  1. https://www.portainer.io/blog/best-ci/cd-concepts-for-devops (Source of images)
  2. https://about.gitlab.com/solutions/continuous-integration
  3. https://docs.gitlab.com/ee/ci/


View More

November 24, 2023

Some Tips And Tricks In Javascript Help You Code Easier

JavaScript is a scripting language that enables you to create dynamically updating content, control multimedia, animate images, and pretty much everything else.

To help everyone handle things more simply in JavaScript, I would like to introduce some tips and tricks that I have learned.

1. Every and some function:

every function returns a boolean value. If all elements in the array satisfy the condition, it returns true. Besides, some function only checks if there exists at least one element in the array that meets the condition and returns true.

     const numberArray1 = [2, 4, 6, 8, 10];

     const numberArray2 = [2, 4, 5, 8, 10];

     const isEvenNumber = (number) => {

          return number % 2 === 0;


     console.log(numberArray1.every(isEvenNumber)); // return true (because all elements in this array satisfy the condition)

     console.log(numberArray2.every(isEvenNumber)); // return false (because there is an element 5 that does not satisfy the condition)

     console.log(numberArray1.some(isEvenNumber)); // return true (there exists an element that satisfies the condition)

     console.log(numberArray2.some(isEvenNumber)) // return true (there exists an element that satisfies the condition)


2. Convert from Number to Boolean:

Declaring a variable with a boolean value, in addition to the usual declaration (giving the value of the variable true or false), can be done in the following way.

     const isTrue = !0;

     const isFalse = !1;

     const alsoFalse = !!0;

     console.log(isTrue); // return true

     console.log(isFalse); // return false

     console.log(alsoFalse); // return false


3. Convert to String type:

With other programming languages, we can convert numbers to strings using the toString() function. Although Javascript is the same, there is another faster way to do it.

     const string = 1 + ''; 

     console.log(string); // return '1'


4. Convert to Number type:

In Javascript, there are many ways to convert from String to Number. For example, parseInt(),... But there is a shorter way to do this, which is to use the ( + ) operator.

     const value = '10';

     value = +value;

     console.log(value); // return 10

     console.log(typeof value); // return 'number'


5. Convert from Decimal to Integer:

If you want to convert from a decimal number to an integer, you can use Object Math functions like Math.floor(), Math.ceil() or Math.round(). But the fastest way to do this is to use the bitwise OR ( | ) operator.

     console.log(10.9 | 0); // return 10

     console.log(10.1 | 0); // return 10


6. Use splice() instead of delete:

When using the delete method, an application replaces an item with undefined instead of removing it from the array. So it is better to use splice() to remove an item from an array.

When using delete:

    const fruits = ['apple', 'orange', 'kiwi', 'banana', 'lemon'];

     fruits.length; // return 5

     delete fruits[3]; // return true

     fruits.length; // return 5

     console.log(fruits); // ['apple', 'orange', 'kiwi', undefined, 'lemon']

When using splice():

     const fruits = ['apple', 'orange', 'kiwi', 'banana', 'lemon'];

     fruits.length; // return 5

     fruits.splice(3, 1); // return ['banana']

     fruits.length; // return 4

     console.log(fruits); // ['apple', 'orange', 'kiwi', 'lemon']


7. Combine two Objects using the spread operator:

There are many situations where you have to combine two or more data sets from different sources. In such cases, there are ways to do this in JavaScript.

Below is a typical example:

     const person = {id: '001', name: 'Tran Van A'};

     const address = {id: '001', add: 'district 1'};

     const personDetail = Object.assign({}, person, address);

     console.log(personDetail); // return { id: '001', name: 'Tran Van A', add: 'district 1'}

However, you can use the spread operator to combine person and address into a single object.

     const personDetail = { …person, …address };

     console.log(personDetail); // return { id: '001', name: 'Tran Van A', add: 'district 1'}

An important note is that duplicate keywords will be overwritten on previous objects.



Like any other programming language, JavaScript has many tips and tricks to handle Objects, Arrays, etc., allowing us to write our programs simpler and more beautifully without using functions, and verbose methods. Hope it will be of some help to those of you who are learning Javascript.







View More

November 23, 2023

Tips to communicate and work effectively with Japanese

Working in a Japanese company and coming into contact with the Japanese side, surely you will gradually get used to the personality and working style of Japanese people. However, each person's personality and working style are different, so getting along with everyone is not easy.

The purpose of this post is to share a little of my experience in nearly 10 years of supporting project members to communicate with Japanese members (members of parent company).

For me, to communicate and work effectively with the Japanese side, we need to pay attention to the following points:

  1. Always in time

Punctuality is a habit that is deeply ingrained in each individual and gradually becomes an implicit rule, a basic consciousness. Japanese people always avoid bothering others. Therefore, being late for an appointment is considered impolite behavior, causing harm to others. Being on time is the right thing to do in every situation.


  • Pay attention to the time in everything.
  • Remember the meeting time and always arrive at least 10 minutes before.
  • Whatever time you report to do (release, submit report, etc.), remember to do it on time. In a force majeure situation, at the time you discover that you cannot respond in time at the reported time, you must immediately contact the Japanese side and explain the situation (reason, cause, etc.) fully.



  1. Create a habit of greeting

The greeting in different situations will have different ways of saying it, and Japanese greetings are extremely important in daily life and communication. Therefore, we must pay attention when communicating with Japanese people, remember to say the greeting no matter what you do.

For example,

When sending email or chat message:

Type Japanese English
Opening greeting お疲れ様です Thanks for your effort
お忙しいところ失礼致します I apologize for the inconvenience
昨日は遅くまでお疲れ様でした Thank you for staying up late yesterday
Closing greetings 以上、よろしくお願いいたします Thank you very much for your understanding
ご検討をお願いします Please consider this
ご連絡お待ち申し上げます We look forward to hearing from you


When meeting online:

Type Japanese English
Opening greeting おはようございます Good morning
お疲れ様です Thanks for your effort
お久しぶりです Long time no see
Closing greetings ありがとうございました Thank you very much
お疲れ様でした Thanks for your hard work
失礼いたします Excuse me


  1. Don't be surprised to hear the word “Sorry” a lot

While Vietnamese people only thank when they receive a favor and apologize when they cause something really annoying to others. For Japanese people, constantly using the phrase "Sorry" is a daily habit, their minimum politeness. Therefore, you do not need to be surprised when the story always starts.

                                    申し訳ございませんが、(I'm really sorry but …)

Therefore, when working with Japanese people, do not think too deeply about the word "Sorry", consider it just a word used to say hello.


  1. Listen patiently and don't be afraid to confirm

With the above mindset of avoiding offending others, Japanese people rarely say "No" to people who are not close to them. Instead, they often talk in circles and hope to receive the other person's understanding when communicating. They do not express their feelings and thoughts clearly but always keep those feelings within a very vague limit. Therefore, it is not easy to know what the other person is thinking or feeling.

For example, when making a request, they won't say "I want you to do this" right away but will explain the context surrounding the request. And they won't say directly "you should do this", but they will say "I think we should do this". That's why many times the interpreters are confused after hearing the request, not knowing what they want them to do in the end. At that time, your job is to confirm the request again if you do not understand the request clearly.

For example, you can confirm that "So we understand that we will do ABC, right?" If they confirm that you got it right, then just do it. If you make a mistake, they will explain again until you understand what they want.

Please listen patiently and confirm if you do not understand clearly.


  1. Should not directly say "No"

If you pay attention, you will see that it is very rare for Japanese people to answer you "No" right away, because they care about your feelings, so instead of bluntly saying "No", they will be more flexible. They will say "I think it's unlikely, but I'll reconsider" for example.

To respond to this gentle behavior, we should do the same, right? For example, when receiving a request, even if you know 80% of it is "impossible", instead of bluntly answering "No, we can't do it, it's too unreasonable", please answer that "I understand your request, but because we need more research, we cannot answer you right away. Please give me some time, we will reply to you as soon as we have the results of the investigation."

Why do you need to do that, because if you immediately answer "We can't", firstly, with a blunt "No" answer they will be shocked, secondly if they ask you again "Why can't you do it? Can you explain right at that time why it's not possible? Can you give a basis for what you say?”

Therefore, based on the investigation results, it will help them understand your "impossible".

Source of images: https://www.pexels.com/

View More

November 21, 2023

The Benefits of Multiskilled Developers in a Software Company

Having multiple skilled developers in a software company is crucial for adapting to the ever-evolving target market and staying competitive in the tech industry. Here are some reasons why diverse skill sets are essential:

View More

November 16, 2023

The difference between Japanese and overseas recruitment strategies and the concept of SNS strategy

Differences in awareness regarding job hunting and recruitment between Japan and overseas

There are many things I felt when I came to Vietnam from Japan, but there are many opportunities to feel differences in the way of working. One of them is the concept of changing jobs.

In Japan, there is a concept of lifetime employment, and it is not unusual for a job seeker to continue working for one company until retirement. In contrast, in American culture, changing jobs is common, and the average number of job changes is more than double that of Japan, which is a surprisingly different attitude.

In Vietnam, as in the U.S., changing jobs is a common practice, with the culture of changing jobs taking root as a matter of course.

Recruitment marketing is widespread in Japan due to difficulties in attracting job seekers

In modern Japan, the declining birthrate and aging population have become very serious social issues, so many Japanese companies that have focused on recruiting university graduates in bulk are having a hard time securing workers, and in recent years Recruitment marketing, which involves creating recruitment websites exclusively for job seekers and disseminating various content in order to appeal to a large number of human resources, is becoming more active.

In Vietnam, on the other hand, the average age of the workforce is young and competition among job seekers is fierce, making it a buyer's market.

Recruitment marketing is a similar concept to B2B marketing

I believe that recruitment marketing here can be thought of in the same way as "B2B marketing."

This is because finding a job is an opportunity for job seekers to make important choices in their lives, and even though changing jobs is common, people don't change jobs every day, so they need to think carefully and rationally. This means that when conducting recruitment marketing, you need to provide more information to job seekers. When you think about it that way, it is understandable that there is a need to proactively disseminate information through an independent recruitment site like Japan does.


About SNS Recruitment

Independent recruitment websites are already common as a recruitment strategy for Japanese companies today, and it can be said that each company is at the stage of searching for new strategies.

I have recently been paying attention to "SNS recruiting.

"Linkedin" is popular as a business SNS in the United States and Vietnam, and is also used for job hunting and recruitment, but it is not so common in Japan, where X (twitter), Instagram, and Tiktok are widely used. In SNS recruitment, recruitment activities will be carried out through these services.

What is the difference between using SNS and recruiting sites?
I think this is due to the casual nature of information dissemination.

To digress, the objective of conventional marketing has been to deliver "completed services and products" to the target , but in current marketing, many methods are used to create added value by "providing the process and concept of how the product is made.

For example, “NIKE” is a manufacturer that sells shoes, but its advertisements often emphasize the wonders of sports, but do not talk much about the performance of the shoes themselves. In other words, it can be said that the goal is to encourage purchasers to identify with the brand's values, rather than the shoes themselves.

How about applying the above ideas to recruitment?

If a company's salary level is among the highest in the industry, simply posting job advertisements will likely attract many applicants. However, the reality is that it is difficult for all companies to offer top-level salaries. Therefore, companies can differentiate themselves from other companies by disclosing their unique opinions and values, such as “why we exist” and “why we conduct recruitment activities”.

This kind of method is compatible with SNS. The website is published as a completed product, and from the job seeker's point of view, the truth is, “There is no way it says anything bad about it, and I don't think it's true.” However, with SNS, you can see the thoughts and company culture of the human resources department in a more casual way.

It is often expressed as a marketing strategy for websites that "only posting good things will not move the target's heart." What is meant here is to convey "thoughts and values" other than "good things.

I also believe that verbalizing such thoughts and values will lead to the development of a corporate culture.

In the America and Vietnam, SNS recruiting using “Linkedin" is already in place, but it is only used as a contact tool, and I feel that there are still few companies that are using it strategically. At the same time, I believe that in the future, job seekers will be looking not only for "conditions" such as salary and number of holidays, but also for "values" communicated through SNS and other means.


※Source image

View More

November 6, 2023

Pleasanter - A no-code/low-code development platform.

Have you ever wondered how can an accountant create a web application without programming? Is there any solution to replace Excel with a web application with the following criteria: quickly  setup, stability, ease of use, Granular access control ?

Pleasanter is a no-code/low-code development platform (Opensource) that runs on .NET. It has developed by the Implem Inc Japan since 2014. You can quickly create business applications without programming. 

View More

November 15, 2023

GraphQL - The ecosystem needs to be explored

1. What is GraphQL?

GraphQL is an open-source data query manipulation language intended for developing APIs.

- Provides an easy-to-understand data structure.

- Determine what you need or no need when you request.

- With many developer tools and easier upgrades in the future.


2. Major advantages of GraphQL

- One of the best solutions for microservices and complex systems.

- Using Hierarchical Structure.

- Way faster than other communication APIs.

- Easy to learn, use, and explore an API quickly.

- It only has a single endpoint.

- Fetching only the exact and specific data in a single request.


3. Language support

GraphQL supports many popular current programming languages such as:

  • JavaScript
  • Python
  • C# / .NET
  • Go
  • PHP
  • Ruby
  • Java / Kotlin
  • Rust
  • Swift / Objective-C
  • Elixir
  • Scala
  • Flutter


4. Some compare between GraphQL and Rest API

Data access

  • Rest API: multiple endpoints.
  • GraphQL: has a single URL endpoint.

Response data

  • Rest API: the server fixes the Rest API structure response data.
  • GraphQL: the client fixes GraphQL structure response data.

Best suited

  • Rest API: suitable with simple data sources where resources are well-defined.
  • GraphQL: suitable with large, complex, and interrelated data sources.

Validate error

  • Rest API: check and return in client if the returned data is valid.
  • GraphQL: the schema structure will reject the invalid data.


Here’s an example of how a REST API and a GraphQL API would handle a request for a user’s name, email, and phone number:

Rest API


GET api/informations/13
 "name": "Thormetal",
 "email": "thormetal@ivc.com", 
 "phone": "xxx-xxx-xx90",
 "infor": {
   "street": "123 Cong Hoa",
   "city": "HCM",
   "company": "ISB",
   "section": "Sec 6"
GET api/graphql
query {
 information(id: 13) { 


In the below example, I just want to get information on name, email, and phone number.

- The REST API returns a fixed data structure that includes: name, email, phone number, and many other information.

- The GraphQL API, on the other hand, allows you to specify exactly what data you need, so it will return the correct data you.

specified (name, email, phone)


[Reference Source]

  • https://graphql.org/
  • https://medium.com/swlh/a-quick-intro-to-graphql-1c6e651562c8
  • https://www.javatpoint.com/graphql-advantages-and-disadvantages
  • https://aws.amazon.com/compare/the-difference-between-graphql-and-rest
  • https://dev.to/callebdev/understanding-graphql-and-its-design-principles-fd6
View More
1 2 3 4 11
Let's talk about your project! CONTACT US

At ISB Vietnam, we believe in making a positive difference to our clients through our software development outsourcing services.

As a prestigious offshore software development company in Vietnam, we've been providing top-notch solutions to numerous clients for over two decades since 2003.

Add the attachment
*Up to 10MB