Lessons from my first tech internship
I rejected two offers from a top bank to seek hands-on growth at a fast-paced tech startup. From navigating chaotic guidance to learning hard lessons about communication and self-preservation, here is my unfiltered guide to surviving the experience.
Introduction
Three years ago, if I told myself I would reject two offers from a top bank in Singapore, I would not have believed it. Those roles offered exciting technology and a huge boost in brand prestige.
Rejecting them was a hard decision, but it boiled down to a simple truth. Some environments prioritize high-level observation, whereas I wanted a place that offered direct, hands-on experience.I chose growth over prestige. I wanted an environment that would push my technical boundaries.
The Reality of the "No Kiddy Pool"
Some companies sell a "No Kiddy Pool" philosophy. They claim they trust employees to figure things out without handholding.
The reality I faced brought steep challenges. With minimal onboarding, it felt like being thrown into the deep end with competing priorities and vague instructions.
Going through that chaos taught me some hard lessons. The skills and knowledge you need to survive go way beyond writing code.
Crucial Lessons in Communication
In a fast paced and stressful environment, communication is your lifeline.
- Overcommunicate: It is always better to overcommunicate than to undercommunicate. Do not just say you have a problem. Explain that you faced a problem and detail the active steps you are taking to fix it. Do not wait too long out of fear or embarrassment.
- Choose words carefully: Choose words carefully: High stress makes people sensitive. Mind your phrasing during high-pressure moments. A comment meant as harmless can easily be misinterpreted when team members are exhausted.
- Set upfront expectations: Observe red flags early. Ask more questions upfront before taking on a task. Be direct and clear about your limitations and expectations.
Navigating the Work (What I Wish I Did)
In the absence of structured guidance, my natural instinct was to go "lone wolf" and figure everything out myself to prove I could do it. I realize now that is the wrong approach. This is what I learned afterwards, and what you should do instead.
- Seek out the best: Be daring and do the things that are hard. But do not do them alone. Find likeminded individuals willing to help. Find the person who is performing the best at their job, follow their lead, and ask them directly for guidance.
- Time-box the struggle: Try to solve a problem for a fixed period of 30 minutes. If you are still stuck after that, drop your ego and ask for help.
- Quality first: It is always better to deliver high quality first, then focus on speed. Speed is useless if it creates defects.
Preserve Yourself
Above all else, your wellbeing is more important than anything in this world. Preserve yourself. If an environment becomes unsustainable, know when to step back. Enduring a bad fit long-term is rarely worth sacrificing your mental health.
Technical Resources to Kickstart Your Journey
During my time, I was pushed to perform at a SWE1 level, dealing with code tracing, production bug fixes, and incident response. Because the learning curve was steep, I had to learn frameworks in my free time.
Here is a summary of the core concepts to help you survive a similar backend environment:
Nest.js
main.tsbootstraps the app via NestFactory.app.module.tsis a module that packages other modules.- Modules are containers that organize a part of the application. They contain controllers, services, repositories, entities, and DTOs.
- Controllers: Handle HTTP routing and requests.
- Services: Execute business logic.
- Repositories: Data access layer via ORM.
- Entities: Class that maps directly to the database table.
- DTOs: Define data shape for validation during transit.
- Principles: Heavy Dependency Injection for modularity and easier unit testing (SOLID).
N8N
- Use drag and drop to design your own automation flow.
- Behind the hood, it is Node.js. You can write custom code for more complex tasks.
- Create AI agents and link up with AI models. Define system and user prompts.
- Use tools to call APIs for Jira, Gitlab, Slack, Google, and Email.
- Use databases to persist knowledge via Vector, Postgres, or Redis.
Kafka
- Brokers host Topics, which are split into Partitions (append only logs).
- Producer: Serializes and sends data.
- Consumer: Deserializes and "polls" data. It sends Heartbeats to signal liveness.
- Unlike a queue, messages persist after being read using Offset tracking.
Database Optimization
- Seq Scan: Reading every row, which is slow.
- Index Scan: Using a B-Tree or map to jump directly to data, which is fast.
- Analysis: Use
EXPLAIN ANALYZEto identify bottlenecks.
Datadog
- Use dashboards for a high level overview of services like endpoints, logs, metrics, traces, and overall health.
- Metrics: Tells you "Is it broken?" by checking CPU, RAM, and Latency.
- Traces: Tells you "Where is it slow?" by following the path of a single request across services.
- Logs: Tells you "Why is it broken?" by showing error messages and timestamps.