top of page

My First Experience as a Software Engineer

My name is Anh Kent, and I am currently a Computer Engineering student at Bach Khoa University. As I progressed through my studies, I felt the need to gain practical experience in the field. Therefore, I made the decision to pursue an internship at atWare Vietnam.

Embarking on this internship was an exciting step for me as it allowed me to apply the theoretical knowledge I had acquired during my university studies to real-world projects. I was particularly drawn to atWare Vietnam due to its reputation as a leading company in the industry, known for its innovative solutions and commitment to excellence.

During my time at atWare Vietnam, I had the opportunity to work closely with a team of experienced professionals who guided me through various projects and assignments. This hands-on experience not only allowed me to enhance my technical skills but also provided valuable insights into the practical aspects of software development and project management.

Below, I will outline the key learnings and insights I gained during my training week

Day 1: Introduction to the Tech Stack

On the first day, after completing the necessary security orientation and receiving our laptops for work, we had an overview session to familiarize ourselves with the technology stack we would be using. The stack included TypeScript, React, an in-house CSS library, GraphQL, and AWS (CDK for Terraform).

During this session, we had the opportunity to discuss and explore the benefits and use cases of each technology with our fellow interns. The goal was to gain a deeper understanding of how each component fits into the development process and the advantages it brings to our projects.

The discussion allowed us to share our knowledge, experiences, and perspectives on the technologies. We discussed the advantages of using TypeScript, such as its static typing and improved code maintainability. We explored how React simplifies the development of dynamic and interactive user interfaces. We also delved into the capabilities of the in-house CSS library, which could streamline styling and ensure consistency across our applications. Additionally, we learned about the benefits of GraphQL for efficient data fetching and manipulation.

Furthermore, we discussed the significance of AWS and how the CDK (Cloud Development Kit) or Terraform could help us provision and manage infrastructure resources in a scalable and automated manner. This provided us with insights into the cloud's capabilities and the potential for building robust and scalable applications.

To support our learning and exploration, we were provided with resources for further reading and self-exploration. These resources could include documentation, tutorials, online courses, or relevant articles. By having access to these materials, we were encouraged to deepen our understanding of the technologies and enhance our proficiency in their usage.

Overall, the overview session and discussions on the technology stack allowed us to establish a common understanding and lay the foundation for our work. It fostered collaboration among the interns, promoted knowledge sharing, and equipped us with the necessary resources to continue our learning journey.

Day 2: TypeScript and React

On the second day, our focus was on learning and getting hands-on experience with TypeScript and React.

We began with an introduction to TypeScript, covering its syntax, type annotations, interfaces, and generics. We learned how TypeScript enhances JavaScript by providing static typing, which can catch errors during development and improve code reliability. The session included explanations and demonstrations of various TypeScript concepts, helping us understand how to use type annotations to define variables, functions, and objects, as well as how to leverage interfaces and generics to create reusable and type-safe code.

After gaining a foundational understanding of TypeScript, we moved on to an introduction to React. We learned about React components, the building blocks of user interfaces, and how they encapsulate reusable and independent pieces of UI logic. The session covered concepts such as state management, props (properties), and the JSX syntax for writing React components in a declarative manner.

To solidify our understanding, we engaged in hands-on exercises to practice TypeScript concepts and their integration with React. These exercises involved writing TypeScript code with type annotations, defining interfaces for data structures, and utilizing generics for reusable components. We also had the opportunity to apply our knowledge of React by building a small React application using TypeScript. This practical exercise allowed us to experience the power and simplicity of building user interfaces with React while leveraging TypeScript's static typing and type safety.

Day 3: GraphQL Backend with TypeScript

Following our introduction to TypeScript and React, the next topic on the agenda was an introduction to GraphQL.

We began by learning about the key concepts of GraphQL, including queries, mutations, and subscriptions. We understood how GraphQL provides a flexible and efficient way to request and manipulate data from a server. We explored the benefits of GraphQL's declarative nature, which allows clients to specify exactly what data they need, reducing over-fetching and under-fetching of data.

To gain hands-on experience, we set up a GraphQL server using TypeScript. This involved configuring the server environment and establishing the necessary dependencies. With the server in place, we learned how to define GraphQL schemas, which act as a contract between the client and server, specifying the types and available operations.

In addition to schemas, we also focused on defining GraphQL resolvers. Resolvers are responsible for fetching data from various sources and resolving the queries and mutations defined in the schema. We learned how to write resolvers that interact with databases, APIs, or other data sources to retrieve and manipulate the requested data.

To interact with the GraphQL server and test our queries and mutations, we used the GraphQL Playground. This powerful tool provided a graphical interface where we could write and execute GraphQL queries, visualize the data responses, and experiment with different operations. It offered a convenient way to iterate and fine-tune our queries and mutations as we developed a deeper understanding of the GraphQL syntax and capabilities.

Day 4: Infrastructure with AWS CDK for Terraform

On the fourth day, we will delve into the world of Amazon Web Services (AWS) and explore its various services, including AppSync, Lambda, and DynamoDB. Additionally, we will gain an understanding of Infrastructure as Code (IaC) and its benefits in modern software development.

Introduction to AWS and its Services:

  • Get acquainted with AWS and its significance in the industry.

  • Gain an overview of the key AWS services, including AppSync, Lambda, and DynamoDB.

  • Understand the use cases and advantages of each service.

  • Explore real-world examples and success stories of companies utilizing AWS services.

Introduction to Infrastructure as Code (IaC) and its Benefits:

  • Learn about Infrastructure as Code (IaC) and its role in automating infrastructure management.

  • Comprehend the benefits of IaC, such as consistency, version control, scalability, and reproducibility.

  • Explore popular IaC frameworks (Terraform) and tools, highlighting their features and use cases.

  • Understand the concept of declarative infrastructure and its advantages.

Day 5: Software Development Methodologies and Best Practices

On the final day of our training week, we were introduced to Scrum: roles, events, and artifacts. Overview of clean architecture principles, understanding clean code, and SOLID principles. Furthermore, we also learn about how our team operates. Our team follows the Scrum methodology, with some major terms that I need to be familiar with, such as: “What is a Sprint, a Sprint Review, a Sprint Retrospective, Daily Meeting, and Backlog Refinement.

1. What is a Sprint?

In Scrum, a sprint is a time-boxed iteration during which a development team works to complete a set of user stories or product backlog items. It is a fundamental concept in the Scrum framework for agile software development.

2. What is a Sprint Plan?

Sprint planning is a collaborative meeting that occurs at the beginning of each sprint in the Scrum framework. It involves the Scrum team, which includes the Product Owner, Scrum Master, and development team members. The purpose of sprint planning is to define what work will be accomplished during the sprint and create a plan for achieving the sprint goal.

3. What is a Sprint Review?

A Sprint Review is a meeting that takes place at the end of each sprint in the Scrum framework. It provides an opportunity for the Scrum team to present the work they have completed during the sprint to stakeholders and PO, receive feedback, and discuss any changes or adjustments that may be needed. The Sprint Review is an essential part of the inspect-and-adapt process in Scrum.

4. What is a Sprint Retrospective?

A Sprint Retrospective is a dedicated meeting that takes place at the end of each sprint in the Scrum framework. Its purpose is to reflect on the sprint that just concluded and identify opportunities for improvement in the team's processes, collaboration, and overall effectiveness. The Sprint Retrospective is a crucial component of the inspect-and-adapt cycle in Scrum.

5. What is a Daily Meeting?

The daily meeting in Scrum is called the Daily Scrum or Daily Standup. It is a short, time-boxed meeting that takes place every day during a sprint. The purpose of the Daily Scrum is to provide a regular opportunity for the Scrum team to synchronize their work, discuss progress, and identify any impediments or obstacles that may affect achieving the sprint goal.

6. What is Backlog Refinement?

A backlog is a prioritized list of work items or requirements that need to be addressed to deliver a product or achieve a project's goals. It serves as a single, comprehensive source of requirements, enhancements, bug fixes, and other items that need to be completed.

Backlog refinement is an ongoing activity in Scrum where the Scrum team collaborates to review, clarify, and prepare backlog items for future sprints. The purpose of backlog refinement is to ensure that the items in the backlog are well-understood, appropriately sized, and ready for implementation.

Our team has successfully implemented all of the events mentioned above. We have embraced the Scrum framework and its core ceremonies, namely the Sprint Retrospective, Daily Scrum, and Backlog Refinement. Below is the schedule of our team's weekly meetings.

  • Monday: Daily Meeting at 8 a.m.

  • Tuesday: Daily Meeting at 8 a.m.

  • Wednesday: Daily Meeting at 8 a.m, Sprint Review at 12 p.m, Sprint Retrospective at 1 p.m, and Sprint Planning at 2 p.m.

  • Thursday: Daily Meeting at 8 a.m.

  • Friday: Daily Meeting at 8 a.m, Backlog Refinement at 12 p.m


1. About atWare Viet Nam

atWare has a great culture surrounding personal development. I was given the opportunity to improve myself and have the opportunity to showcase my best skills and knowledge.

My mentors helped me greatly in orientation, and also met great people who were able to guide me through all of these tasks and more.

2. About myself

I learned a lot during my time at atWare, though it was short but valuable. I discovered what I like about software engineering in general and ignited my interest in cloud computing platforms, distributed systems, and database engineering.

Thanks to the experience with atWare, I now feel more motivated to take necessary, though harder classes in school to complete my skills and learn more about the theoretical side of all the knowledge I have gained.

38 views0 comments

Recent Posts

See All


bottom of page