Skip to content

Commit

Permalink
Merge pull request #35 from baonguyen96/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
baonguyen96 authored Jan 29, 2025
2 parents a2bf630 + 5ea8b38 commit 49cef9e
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 24 deletions.
9 changes: 4 additions & 5 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,12 @@ <h1>BAO NGUYEN</h1>
<section class="section" id="aboutSection">
<h2><span>About Me</span></h2>
<p>
I am an aspiring Software Engineer with more than <span id="yearsOfExperience"></span> years of experience. My expertise involves architecting/implementing big data lake/warehouse,
modernizing/migrating on-prem applications to Cloud-centric solutions, as well as building infrastructure and CI/CD pipelines.
I am an aspiring Software Engineer with more than <span id="yearsOfExperience"></span> years of experience.
My expertise involves architecting and implementing big data lake/warehouse, modernizing applications to Cloud-centric solutions, as well as building infrastructure and CI/CD pipelines.
</p>
<p>
I graduated from the <a href="https://www.utdallas.edu/" target="_blank">University of Texas at Dallas</a>
with <i>Cum Laude</i> honor for my Bachelor of Science degree in
<a href="https://www.utdallas.edu/academics/fact-sheets/ecs/bs-software-engineering/" target="_blank">Software Engineering</a>
I graduated from the <a href="https://www.utdallas.edu/" target="_blank">University of Texas at Dallas</a> with <i>Cum Laude</i> honor for my
Bachelor of Science degree in <a href="https://www.utdallas.edu/academics/fact-sheets/ecs/bs-software-engineering/" target="_blank">Software Engineering</a>
and Master of Science degree in <a href="https://catalog.utdallas.edu/2016/graduate/programs/ecs/computer-science" target="_blank">Computer Science majoring in Information Assurance</a>.
</p>
<p>
Expand Down
58 changes: 48 additions & 10 deletions scripts/contents/experience.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
let workExperiences = [
{
"jobTitle": "Vice President, Lead Software Engineer",
"company": "JPMorgan Chase & Co.",
"period": ["January 2025 - Present"],
"contributions": [
"Modernize and expand Chase Pay over Time application, integrating with additional partners to rollout installment plans to eligible customers",
// "Implement event-driven and highly scalable installment workflows",
]
},
{
"jobTitle": "Senior Associate Data Engineer III",
"company": "JPMorgan Chase & Co.",
"period": ["February 2023 - Present"],
"period": ["February 2023 - January 2025"],
"contributions": [
"Design and implement high-performance Cloud-native applications that process and store total of more than 400 TB of data",
"Lead international team to migrate 14 data catalogs and their permissions from legacy central data lake to their own federated lake successfully with limited time and resources, providing impact isolation and more flexible decision for each data domain",
"Design and implement high-performance Cloud-native applications that process and persist total of more than 400 TB of data",
"Successfully lead international team to migrate 14 data catalogs from legacy central data lake to their own federated lake on schedule of 3 months and resource-constraints, providing impact isolation and more flexible development/deployment for each data domain",
"Implement highly performant and secured Data-Mesh solutions for flexible, scalable, and easy to operate data management among 20+ data products",
"Optimize Airflow on EKS resources and configurations to efficiently orchestrate more than 450 interdependent DAGs to process data for more than 8000 tables daily within SLAs, improving job performance by 50%",
"Manage features roadmap and coordination among teams to ensure necessary functionalities are prioritized and delivered on time and avoid duplication efforts",
"Optimize Airflow on EKS resources and configurations to efficiently orchestrate more than 450 interdependent DAGs to process data for more than 5000 tables daily within SLAs",
"Maintain overall IaC and ensure systems and components are up-to-date and secured",
]
},
Expand All @@ -21,9 +30,9 @@ let workExperiences = [
"Design and implement Airflow DAG Generator that consumes dynamic configuration and automatically builds and deploys DAGs to Airflow server, reducing developers' effort and time to build workflows by 90%",
"Develop and maintain Infrastructure as Code setup using Terraform/Sceptre/Cloud Formation",
"Implement distributed event-driven system using native AWS services utilizing SNS/SQS/Cloudwatch EventBridge",
"Develop Spark-based application that reads raw files in multiple formats (CSV / Fixed width / JSON / Avro / XML / ByteArray / Excel) in a configurable fashion and converts to Parquet format with optionally additional transformations for better downstream consumption",
"Develop highly configurable Spark application that consumes raw files in multiple formats (CSV / Fixed Width / JSON / Avro / XML / Byte Array / Excel) and converts to standardized Parquet format with optional transformations for seamless downstream consumption, improving maintainability and reducing time for each new data source integration by approximately 15%",
"Optimize Cloud workloads (refactor SparkSQL queries, fine-tune EMR/EKS resource usages, setup lifecycle policies for S3 buckets, etc.) to reduce overall operational cost by more than 70%",
"Integrate with ServiceNow API to manage operation workflow",
"Integrate with ServiceNow API to manage operation workflow, providing timely alerts for operation team to take action",
]
},
{
Expand Down Expand Up @@ -63,12 +72,41 @@ let workExperiences = [
];


$(function () {
let firstYear = workExperiences[workExperiences.length - 2].period[0].split(" - ")[0].split(" ")[1];
function monthNameToNumber(name) {
let months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];

return months.indexOf(name) + 1;
}


function getYearsOfExperience(fromYear, fromMonth, toYear, toMonth) {
let months = Math.max(0, (toYear - fromYear) * 12 - fromMonth + toMonth);
return Math.floor(months / 12);
}


$(function() {
let firstPeriodNotCountingIntern = workExperiences[workExperiences.length - 2].period[0].split(" - ")[0];
let firstMonth = monthNameToNumber(firstPeriodNotCountingIntern.split(" ")[0]);
let firstYear = firstPeriodNotCountingIntern.split(" ")[1];
let currentWork = workExperiences[0];
let today = new Date();

$("#yearsOfExperience").text((new Date()).getFullYear() - firstYear - 1);
$("#currentTitle").text(`${currentWork.jobTitle.split(",")[0]} @ ${currentWork.company}`);
$("#yearsOfExperience").text(getYearsOfExperience(firstYear, firstMonth, today.getFullYear(), today.getMonth()));
$("#currentTitle").text(`${currentWork.jobTitle.replace(",", "|").split("|")[1].trim()} @ ${currentWork.company}`);

const START_HIDING_FROM_INDEX = 3;
let experience = $(EXPERIENCE_TEMPLATE);
Expand Down
19 changes: 10 additions & 9 deletions scripts/contents/projects.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
let projects = [
{
"title": "Image Catalog",
"intro": createIntro("A suite of applications that scan through file system to collect metadata of images and provide useful insights. " +
"intro": createIntro("A suite of applications that scans through the file system to collect metadata of images and provides useful insights. " +
"It consists of C# application for image crawler, Microsoft SQL Server for data storage and ETL, and PowerBI dashboard for insights consumption and presentation.",
["C#", "SQL", "PowerBI"]),
"links": [
Expand All @@ -21,18 +21,18 @@ let projects = [
{
"title": "Dark Chroma",
"intro": createIntro("A Chrome extension that reverts the color of the page " +
"(bright text on dark background) to reduce " +
"eye-strains from long working period.", ["Chrome extension"]),
"(bright text on dark background) to reduce eye-strains from long working period.",
["Chrome extension"]),
"links": [
createDemoLink(),
createSourceLink("https://github.com/baonguyen96/DarkChroma"),
]
},
{
"title": "File Transfer Application",
"intro": createIntro("This Java project implements a unique File Transfer Protocol " +
"utilizing Socket, Connection Management, Reliable Communication, " +
"and Security (Public Key Crypto and Symmetric Key Crypto). ", ["Java"]),
"intro": createIntro("This Java project implements a unique File Transfer Protocol utilizing Socket, " +
"Connection Management, Reliable Communication, and Security (Public Key Crypto and Symmetric Key Crypto).",
["Java"]),
"links": [
createDemoLink(),
createSourceLink("https://github.com/baonguyen96/FileTransferApplication")
Expand Down Expand Up @@ -118,8 +118,9 @@ let projects = [
{
"title": "Tickets Reservation System",
"intro": createIntro("This C++ project simulates an online ticketing systems. " +
"It lets user reserves seats, flies the plane when full, or puts the selected seats " +
"onto the wait-list. The price depends on different configurations of user's data.", ["C++"]),
"It lets user reserves seats, flies the plane when full, or puts the selected seats onto the wait-list. " +
"The price depends on different configurations of user's data.",
["C++"]),
"links": [
createDemoLink(),
createSourceLink("https://github.com/baonguyen96/AirplaneTicketsReservingSystem")
Expand Down Expand Up @@ -245,7 +246,7 @@ function showDemo() {
}


$(function () {
$(function() {
let projectSection = $("#projectsSection");
let projectsGroup = projectSection.find(".projects");
let projectsHiddenGroup = projectSection.find(".projectsHidden");
Expand Down

0 comments on commit 49cef9e

Please sign in to comment.