Is your Spring Boot app a "Lean Machine" or a 200MB "Hello World"? 🛑 We’ve all seen it. A simple microservice that somehow ends up with a JAR size larger than a high-def movie. As Backend Developers, our job isn't just to "make it work." Our job is to make it efficient. In 2026, "Performance" isn't just about execution speed—it’s about footprint, security, and maintainability. Here is my 4-step "Spring Clean" for Java developers: 1️⃣ The Dependency Audit 🔍 If you’re pulling in a 5MB library just for one String utility method, you’re doing it wrong. Check your pom.xml. If it's unused or redundant, exclude it. Your build server (and your security scanner) will thank you. 2️⃣ Kill the Boilerplate 🪓 If I see manual Getters, Setters, and Constructors in a modern project, my soul hurts. Use Lombok or, better yet, Java Records. Less code = fewer places for bugs to hide. 3️⃣ You Ain't Gonna Need It Rule 🚫 Redundant logic and "future-proofing" are the biggest sources of technical debt. If the requirement doesn't exist today, don't write the code for it. Over-engineering is just performance optimization for your ego, not your app. 4️⃣ Streamline the JAR 📦 Use mvn dependency:tree to find those transitive dependencies that are just hitching a ride. A smaller JAR means faster startup, lower memory footprints, and cheaper cloud costs. 5️⃣ The "AI Hallucination" Debt 🤖 ⚠️ Here is the hard truth: Blindly using AI on big projects is a recipe for bloat. AI is great at solving a single function, but it lacks "Contextual Efficiency." I've seen AI-generated PRs that: • Import entire heavy libraries for a task Java handles natively. • Suggest deprecated Spring Security patterns. • Add redundant "safety checks" that are already handled by the framework. • Result: You get code that "works" but a codebase that "suffers." Don't let your LLM be your Architect atleast for now. The Goal: Every line of code should earn its right to exist. The Big Debate: 💬 When it comes to cleaning up boilerplate, are you Team Lombok or Team Java Records? Or do you still prefer writing your own POJOs? Let’s hear the horror stories of the biggest "bloat" you've ever found in a legacy project! 👇 #Java #SpringBoot #BackendDevelopment #CleanCode #SoftwareEngineering #Microservices #Java21 #CodingTips #PerformanceOptimization
Spring Boot Performance Optimization: 4-Step 'Spring Clean'
More Relevant Posts
-
🚀 What actually happens inside the JVM when a Spring Boot application starts? Most developers run a Spring Boot app with one command: "java -jar app.jar" But inside the JVM, a lot happens before your API becomes available. Here’s a simplified breakdown 👇 --- 🔹 1. JVM starts the application The JVM creates the main thread and executes the "main()" method. @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } --- 🔹 2. Class Loading The JVM loads classes using the ClassLoader subsystem. • Bootstrap ClassLoader → loads core Java classes • Platform ClassLoader → loads JDK libraries • Application ClassLoader → loads your Spring Boot classes Class metadata is stored in Metaspace. --- 🔹 3. Bytecode Verification Before execution, the JVM verifies bytecode to ensure: ✔ Type safety ✔ Stack safety ✔ No illegal memory access This protects the JVM from invalid code. --- 🔹 4. Spring Boot Startup Begins "SpringApplication.run()" starts the Spring ecosystem: • Creates ApplicationContext • Reads "application.properties" / "application.yml" • Determines auto configurations --- 🔹 5. Component Scanning Spring scans packages to detect components like: • "@Controller" • "@Service" • "@Repository" • "@Component" These become Spring Beans. --- 🔹 6. Bean Creation Spring first creates Bean Definitions and then instantiates beans. Process: Constructor → Dependency Injection → Bean Post Processing --- 🔹 7. AOP Proxies For features like: • "@Transactional" • "@Async" • "@Cacheable" Spring creates proxies using JDK Dynamic Proxy or CGLIB. --- 🔹 8. Embedded Server Starts Spring Boot starts an embedded server like Tomcat and initializes DispatcherServlet. Your APIs are now ready to serve requests. --- 💡 Full Startup Flow JVM Start ↓ Class Loading ↓ Bytecode Verification ↓ main() execution ↓ SpringApplication.run() ↓ ApplicationContext creation ↓ Component scanning ↓ Bean creation ↓ Dependency injection ↓ AOP proxy creation ↓ Embedded server start ↓ Application ready --- ⚡ Senior developer insight Most startup issues in production happen during: • Bean creation • Dependency injection • Auto configuration • Missing environment properties Understanding this flow makes debugging Spring Boot startup failures much easier. --- If you're a Spring developer: 👉 Which startup error has troubled you the most? #Java #SpringBoot #JVM #BackendEngineering #SoftwareArchitecture
To view or add a comment, sign in
-
-
𝗦𝗼 𝗠𝗮𝗻𝘆 𝗙𝗿𝗮𝗺𝗲𝘄𝗼𝗿𝗸𝘀… 𝗪𝗵𝘆 𝗰𝗵𝗼𝗼𝘀𝗲 .𝗡𝗘𝗧? Choosing the right framework is never simply about performance benchmarks or popularity charts; it is about stability, maintainability, ecosystem maturity, and long-term support. Python frameworks such as Django, Flask, and FastAPI each offer compelling strengths, but they come with trade-offs in asynchronous consistency, structural enforcement, or ecosystem maturity. Node.js provides enormous flexibility and an unmatched package ecosystem, yet places structural responsibility squarely on the developer. Go offers performance and simplicity through compilation and concurrency control, though certain language features and patterns are still evolving. Java with Spring delivers enterprise-grade robustness and structure, but requires careful management of the JVM ecosystem and configuration complexity. This is where C# and .NET distinguish themselves. Unlike many language–framework combinations where versioning, governance, and ecosystem direction are fragmented, .NET operates as a unified platform under a clear and consistent release strategy. The alignment between the C# language and the .NET runtime reduces the uncertainty around compatibility. The predictable cadence of short-term and long-term support releases provides both innovation and stability. Beyond governance considerations, .NET offers a well-rounded architecture: near-native performance, mature asynchronous capabilities, clear and enforced project structure, built-in security, and strong first-party integrations that minimise reliance on third-party dependencies. Developers can choose minimal APIs for lightweight services or structured controllers for enterprise applications, without sacrificing cohesion across the platform. While no framework is without drawbacks, .NET’s blend of performance, structure, tooling, and long-term stewardship makes it a compelling choice for modern API development. It offers not just a way to build applications, but a stable and scalable foundation upon which those applications can evolve confidently over time. Damian Paul Matthews, a senior developer at CBOS, pulls together all these points in his full article: https://lnkd.in/dAskp8FA
To view or add a comment, sign in
-
My first try at a blog post, so go easy on me. It’s a discussion on the various languages and frameworks to use as an API, and why I believe .NET sticks out. I draw comparisons across most newer and widely used options, but chose not to include Ruby and PHP as their market share has decreased over the years.
𝗦𝗼 𝗠𝗮𝗻𝘆 𝗙𝗿𝗮𝗺𝗲𝘄𝗼𝗿𝗸𝘀… 𝗪𝗵𝘆 𝗰𝗵𝗼𝗼𝘀𝗲 .𝗡𝗘𝗧? Choosing the right framework is never simply about performance benchmarks or popularity charts; it is about stability, maintainability, ecosystem maturity, and long-term support. Python frameworks such as Django, Flask, and FastAPI each offer compelling strengths, but they come with trade-offs in asynchronous consistency, structural enforcement, or ecosystem maturity. Node.js provides enormous flexibility and an unmatched package ecosystem, yet places structural responsibility squarely on the developer. Go offers performance and simplicity through compilation and concurrency control, though certain language features and patterns are still evolving. Java with Spring delivers enterprise-grade robustness and structure, but requires careful management of the JVM ecosystem and configuration complexity. This is where C# and .NET distinguish themselves. Unlike many language–framework combinations where versioning, governance, and ecosystem direction are fragmented, .NET operates as a unified platform under a clear and consistent release strategy. The alignment between the C# language and the .NET runtime reduces the uncertainty around compatibility. The predictable cadence of short-term and long-term support releases provides both innovation and stability. Beyond governance considerations, .NET offers a well-rounded architecture: near-native performance, mature asynchronous capabilities, clear and enforced project structure, built-in security, and strong first-party integrations that minimise reliance on third-party dependencies. Developers can choose minimal APIs for lightweight services or structured controllers for enterprise applications, without sacrificing cohesion across the platform. While no framework is without drawbacks, .NET’s blend of performance, structure, tooling, and long-term stewardship makes it a compelling choice for modern API development. It offers not just a way to build applications, but a stable and scalable foundation upon which those applications can evolve confidently over time. Damian Paul Matthews, a senior developer at CBOS, pulls together all these points in his full article: https://lnkd.in/dAskp8FA
To view or add a comment, sign in
-
🤖 Spring Boot + Claude API: How I Wired a ReAct Agent Loop in Production Most LLM integrations I see are just fancy API wrappers. One prompt in. One response out. Done. That’s not an agent. That’s autocomplete. A real agent reasons. It decides what tools to call, observes the result, and adjusts — all on its own. Here’s how I built one in Spring Boot. 👇 The pattern is called ReAct — Reason + Act. The loop looks like this: Thought: I need the weather in Pune first. Action: weather_tool(“Pune”) Observation: 32°C, partly cloudy. Thought: Now convert to Fahrenheit. Action: calculator_tool(“32 * 9/5 + 32”) Observation: 89.6°F Final Answer: Pune is 32°C (89.6°F), partly cloudy. The LLM isn’t hardcoded to call those tools in that order. It decided to. Based on reasoning. The architecture is simpler than it sounds: 🔹 ClaudeClient — thin wrapper over the Anthropic API 🔹 Tool interface — every tool implements name(), description(), execute() 🔹 AgentState — the scratchpad. Grows with every Thought/Action/Observation 🔹 ReActAgent — the loop. Calls Claude → parses response → runs tool → repeats Spring autowires all Tool beans automatically. Add a new tool? Just annotate it @Component. The agent picks it up instantly. The thing most tutorials skip: Production ReAct agents need hard guardrails — ⚠️ Max iteration ceiling (unbounded loops will drain your quota fast) ⚠️ Tool timeouts (one slow API call blocks the entire loop) ⚠️ Structured logging at every step (your scratchpad IS your trace) ⚠️ Retry logic on Claude API calls (Resilience4j saves you here) An agent without these isn’t production-ready. It’s a demo. Why this matters for Java engineers: The AI tooling world is Python-first. LangChain, LangGraph, CrewAI — all Python. But enterprise backends are Java. Spring Boot. Microservices. You don’t need to rewrite your stack to build agents. You just need to understand the pattern — and wire it yourself. That’s a skill very few Java engineers have right now. I’ve put together a full working demo — source code, architecture diagram, and production tips — if you want to dig in. Drop a 🙋 in the comments and I’ll share it. #Java #SpringBoot #ClaudeAPI #LLMEngineering #AIEngineering #ReActAgent #GenerativeAI #PrincipalEngineer #BuildInPublic
To view or add a comment, sign in
-
For years I believed Java + Spring Boot was the ultimate backend stack. I’ve been building with it since my college days (2014-current), and it has powered many reliable systems. Recently I came across a benchmark comparing backend stacks under ~1M concurrent users, where Go and Node.js appeared to outperform Java in areas like cold start, memory usage, and throughput. It was definitely an eye-opener. However, it also reminded me that AI-generated comparisons and benchmarks are not always correct and must be validated carefully. When I cross-checked these claims with other AI tools and sources, the results were surprisingly different, highlighting how AI responses can sometimes be biased or incomplete. The takeaway isn’t that other tech stacks are bad. Go, Node.js, and others are excellent in many scenarios. The real point is that with the right JVM tuning, architecture, and optimizations, organizations can significantly improve Spring Boot performance as well. In today’s world, the real skill is validating information and choosing the right tool for the problem. attaching both the comparisons below 👇 Evaluation from AI tool 1 (attached as an image) Evaluation from AI tool 2 1️⃣ Cold start comparison is biased Spring Boot cold start 6–15s is typical for JVM warm start, but: GraalVM native image → ~50–200 ms Spring Boot 3 + AOT significantly reduces startup Many production systems don’t restart pods frequently, so cold start is less critical. 2️⃣ Memory comparison ignores JVM tuning JVM can look heavy, but with tuning: Java 21 + ZGC + container-aware JVM can run much leaner. Frameworks like Micronaut / Quarkus reduce memory drastically. 3️⃣ Throughput numbers depend heavily on the benchmark Benchmarks like TechEmpower measure raw HTTP JSON serialization, not real applications. Real systems involve: -DB latency -network calls -caching -message queues Those usually dominate latency, not the language. 4️⃣ Why Go looks strong Go performs well because: -lightweight goroutines -small runtime -simple networking stack But it trades off ecosystem maturity and type safety features Java has. 5️⃣ Why big tech still uses Java Despite these benchmarks, companies like: Netflix Uber LinkedIn Amazon still run massive Java services because of: stability tooling JVM optimizations mature ecosystem.
To view or add a comment, sign in
-
-
Spring Boot MVC Architecture | Backend Fundamentals Writing backend code is not just about implementing endpoints — it’s about designing systems that are structured, maintainable, and scalable. One of the core architectural patterns used in modern Java backend development is Spring Boot’s MVC architecture. At a high level, every request follows a well-defined flow through multiple layers: 🔹 Client The process begins when a client (web application, mobile app, or external service) sends an HTTP request to the backend. 🔹 DispatcherServlet (Front Controller) Spring’s DispatcherServlet acts as the central entry point. It handles request routing, delegates to the appropriate controller, performs request mapping, and manages the conversion between JSON payloads and Java objects. 🔹 Controller Layer Controllers expose REST endpoints and handle incoming requests. They are responsible for request validation, mapping request data to DTOs, and orchestrating calls to the service layer. 🔹 Service Layer This layer contains the core business logic of the application. Services coordinate operations, enforce business rules, and interact with external systems or APIs when required. 🔹 Model Layer The model represents the application’s data structures, including entities, DTOs, and domain objects used for transferring and persisting data. 🔹 Response to Client After processing the request, the application returns a structured response (typically JSON) back to the client. This layered architecture enables: ✔️ Separation of concerns ✔️ Improved testability ✔️ Better scalability and maintainability ✔️ Clear debugging and traceability of request flow Spring Boot MVC is more than just a framework feature—it promotes an architectural mindset that encourages clean design, modularity, and production-ready backend systems. Understanding how these layers interact is essential for building robust and scalable REST APIs. Still learning. Still building. Still improving. #SpringBoot #MVCArchitecture #BackendDevelopment #Java #RESTAPI #CleanArchitecture #SoftwareEngineering #LearningJourney
To view or add a comment, sign in
-
-
🚀 How to Use Claude Code Effectively Let’s break down how to actually use it effectively 👇 🧠 1. Think in Terms of “Tasks”, Not Prompts Instead of asking: “Write a rate limiter” Do this: “Design a scalable rate limiter using Redis, explain trade-offs, then generate production-ready code in Java Spring Boot with tests” 👉 Claude performs best when: You give context You define output expectations You break problems into clear steps 🧩 2. Use the “Multi-Step Prompting” Pattern Claude shines when you guide it step-by-step: Example workflow: Ask for system design Ask for API contracts Ask for DB schema Ask for code Ask for improvements 👉 Example: Step 1: Design a distributed rate limiter Step 2: Suggest multiple approaches (token bucket, sliding window) Step 3: Compare them Step 4: Implement best approach in Spring Boot Step 5: Add caching + scaling strategy This avoids shallow or generic answers. 🛠️ 3. Treat It Like a Pair Programmer Instead of generating full code blindly: Ask Claude to: Review your code Find bugs Suggest optimizations Explain complexity 👉 Example: Here is my code. 1. Find bugs 2. Suggest improvements 3. Optimize for performance This is 10x more valuable than copy-paste coding. ⚡ 4. Use It for System Design + Real-World Thinking Claude is especially strong in: Backend architecture Microservices design Trade-off discussions 👉 Ask like this: Design a URL shortener like Bitly: - Handle 10M requests/day - Use caching + DB strategy - Discuss bottlenecks You’ll get interview-level answers. 🧪 5. Ask for Edge Cases + Production Readiness Most people stop at “working code”. Go further: - Add edge cases - Handle failures - Add retries - Add logging - Add monitoring 👉 This is how you move from developer → senior engineer 🤖 6. Use It for AI + Agentic Workflows Since you’re exploring AI, this is 🔥 for you: Use Claude to: Build RAG pipelines Design AI agents Generate prompts for automation Create workflows 👉 Example: Build a job application automation agent: - Scrapes jobs - Matches resume - Sends applications - Uses LLM for personalization 📚 7. Learn Faster (Not Just Build) Instead of Googling: Explain Kafka like I’m a backend engineer Compare it with RabbitMQ Give real-world use cases 👉 Claude compresses hours of learning into minutes 🎯 8. Give Constraints (VERY IMPORTANT) Bad: “Write a backend service” Good: Write a Spring Boot service: - Uses Redis caching - Handles 1000 req/sec - Follows clean architecture - Includes unit tests 👉 Constraints = better output 🔁 9. Iterate, Don’t Expect Perfection Claude is best used iteratively: First output → refine Ask follow-ups Improve step by step 👉 Think: “conversation > one-shot answer” 💡 10. Pro Tips (Most People Miss This) Ask it to think like a FAANG interviewer Ask for trade-offs ALWAYS Ask for multiple approaches Ask it to challenge your design Example: Critique my system design like a senior architect 🧠 Final Mindset Shift ❌ Wrong: “Claude, do my work” ✅ Right:
To view or add a comment, sign in
-
I used AI to write Spring Boot code for 90 days. Here's what no one tells you — and why most devs are using it wrong. 🧵 Most Java engineers treat AI like a Stack Overflow replacement. Copy. Paste. Pray it compiles. That's leaving 80% of the value on the table. After shipping 3 production microservices with AI-assisted development, here's what I actually learned: 📊 Key data points: • 55% faster boilerplate generation with structured AI prompting • 40% reduction in bug rate using AI code review workflows • 3× faster onboarding to new Spring modules (Source: GitHub Octoverse 2023 + Engineering case studies) // TIP 01 — Context is everything Stop pasting raw code. Give AI your architecture first. Before asking anything, paste your entity model, service layer contract, and constraints (pagination strategy, security config). AI writes dramatically better Spring Boot code when it knows your design decisions upfront. // TIP 02 — Prompt for patterns, not just snippets Ask AI to generate full service + repository + DTO + test stubs in one shot. Instead of: "write a JPA repository" Say: "Generate a Spring Data JPA repository for this entity with paginated queries, custom projections, and corresponding service layer using the Strategy pattern. Include Mockito test stubs." // TIP 03 — Make AI your code reviewer Paste your service class and ask: "What SOLID principles am I violating?" AI catches SRP violations, missing null guards, N+1 query risks, and missing transaction boundaries faster than most human reviewers. Make it a pre-PR ritual. // TIP 04 — Use AI to master Spring internals, not just generate code Prompt: "Walk me through exactly how @Transactional propagation works when calling one @Service method from another in the same bean — and why it silently breaks." You'll learn more in 5 minutes than a week of docs. 🏢 Case Study: A 4-engineer backend team at a Series A fintech adopted AI-augmented Spring Boot development. Result: sprint velocity +47%, production incidents -38% over 2 quarters. The engineers winning with AI aren't "prompt engineers." They're senior architects who've delegated execution to AI. Your job is now: → Define contracts clearly → Review AI output critically → Know Spring deeply enough to catch AI mistakes → Use the saved time to design better systems AI doesn't replace Spring Boot expertise. It multiplies it. Which of these tips are you already using? Drop a 1–4 below 👇 And if this added value — repost to help another Java dev level up. #Java #SpringBoot #BackendDevelopment #AI #SoftwareEngineering #TechCareer #GenerativeAI #JavaDeveloper #MicroServices #CleanCode
To view or add a comment, sign in
-
-
🚀 What Really Happens When You Run a Spring Microservice? (Deep Dive) Most developers hit “Run” and see the service start… but under the hood, a lot is happening. Let’s break it down simply 👇 🔹 1. JVM Comes to Life When you start your Spring microservice, the Java Virtual Machine (JVM) boots up first. Allocates memory (Heap + Stack) Loads your compiled .class files Prepares execution environment 👉 Think of this as turning on the engine of a car. 🔹 2. Spring Boot Kicks In The main() method runs, usually with: SpringApplication.run(App.class, args); This triggers Spring Boot’s auto-configuration magic ✨ Scans your project (Component Scanning) Detects dependencies from pom.xml / build.gradle Starts configuring beans automatically 🔹 3. Application Context Creation Spring creates something called the ApplicationContext 🧠 It’s like a container that holds all objects (Beans) Manages lifecycle (creation, injection, destruction) 👉 Example: Your @Service, @Controller, @Repository → all become beans 🔹 4. Dependency Injection Happens Spring wires everything together 🔌 Finds dependencies Injects them automatically using @Autowired or constructor injection 👉 You don’t create objects manually → Spring does it for you 🔹 5. Embedded Server Starts Spring Boot starts an embedded server (like Tomcat) 🌐 No need to deploy WAR files Runs directly as a standalone app Opens a port (default: 8080) 👉 Now your microservice is ready to accept requests 🔹 6. Dispatcher Servlet Setup Spring sets up the DispatcherServlet (the brain of request handling) Routes incoming HTTP requests Maps them to controllers (@RestController) Handles responses 👉 This is where APIs actually start working 🔹 7. Database & External Connections If configured: Database connections are initialized (via JPA/Hibernate) Connection pools are created Kafka / Redis / external services get connected 🔹 8. Application Ready 🚀 Finally, you’ll see: Started Application in X seconds Now your microservice is: Listening for requests Processing business logic Returning responses 💡 Final Thought Running a Spring microservice is not just “starting a server”… It’s: 👉 Bootstrapping a container 👉 Wiring dependencies 👉 Starting infrastructure 👉 Preparing a scalable system All in a few seconds ⚡ 🔥 Next time you hit RUN, remember — you're starting an entire ecosystem, not just a program. #SpringBoot #Microservices #Java #BackendDevelopment #SoftwareEngineering #SystemDesign #Developers #TechDeepDive
To view or add a comment, sign in
-
-
🚀 Day 7/100: Spring Boot From Zero to Production Topic: @Configuration and @Bean Building on what we discussed yesterday, we can’t really call ourselves Spring Boot developers until we truly get a grip on Annotations. They are the heart of how this framework functions. Today, we’re looking at two heavy hitters: @Configuration and @Bean. -> What’s the deal with Custom Configuration? In a ideal world, Spring Boot’s "Auto-configuration" handles everything. But in the real world, we often need to override the defaults or provide our own custom setup. While we do a lot of this in application.yaml or application.properties files, there are scenarios where we need the power of Java code to define our components. 1. @Configuration: The Blueprint This is a class-level annotation. When you mark a class with @Configuration, you’re telling Spring: "Hey, this is a configuration component. Look inside for bean definitions!" The Role: It flags the class as a source of beans. The Scan: Because it’s a specialized version of @Component, the @ComponentScan we talked about yesterday will find it automatically. 2. @Bean: The Object Factory Methods inside a @Configuration class are usually annotated with @Bean. These methods return an object (like a library client, a security filter, or a data source). The Container: Spring executes the method, takes the object it returns, and registers it in the Spring Container. The Benefit: Once it’s in the container, Spring manages its entire lifecycle making it ready for Dependency Injection anywhere else in your app. 💡 The "Hidden" Singleton Pattern Here’s a cool technical detail: this is actually a clever implementation of the Singleton Pattern. By default, when one @Bean method calls another @Bean method within the same @Configuration class, Spring intercepts that call. Instead of running the method again and creating a new instance, it simply pulls the existing instance from the container. Working with Spring Boot, you are going to see @Configuration and @Bean everywhere. They are the bread and butter of a flexible backend! Below is an example attached from one of my demo projects. If you have any questions about how these work or when to use them over properties files, just leave a comment and I’ll be happy to address it. 👋 See you in the next post! 🚀 #Java #SpringBoot #SoftwareDevelopment #100DaysOfCode #Backend
To view or add a comment, sign in
-
Explore related topics
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development