How to think and work like a software engineer?
experiment, and learn new things every day
an experienced engineer has failed more times than a beginner has tried.
from: I have to learn new things
to: I get to learn new things
Breaking down a problem into smaller, manageable parts is a critical problem-solving technique used across many disciplines. This approach allows for a deeper understanding of each component, making the problem less overwhelming. By addressing each part individually, you can create a clear path toward a solution. This method is especially useful in software development, engineering, and complex project management, where tackling smaller tasks often leads to more efficient and effective solutions.
Stepping back or stepping away from a problem can be an effective strategy for gaining clarity. Giving yourself time to think allows your brain to process the information subconsciously, often leading to new insights or solutions. This practice can reduce mental fatigue and help you return to the problem with a fresh perspective, making it easier to approach challenges creatively and more effectively.
Learning one new thing at a time, while connecting it to what you already know, is a key strategy to avoid being overwhelmed. This approach allows you to build on your existing knowledge, deepening your understanding without overloading your mind with too many new concepts at once. By focusing on incremental learning, you ensure better retention and application of new skills, leading to more sustainable progress over time.
To overcome impostor syndrome, remind yourself that everyone knows things others don't. You have unique skills and knowledge that others may not possess. Also, while you are aware of what you don’t know, others often aren’t, and that doesn’t diminish your competence. Focus on continuous learning and recognize that feeling uncertain at times is a normal part of growth.
this is a chance to learn these things
A T-shaped engineer has deep expertise in one area (the vertical part of the "T") and broad skills across multiple areas (the horizontal part). This allows them to specialize while also collaborating effectively with others. Their combination of depth and breadth makes them adaptable, versatile, and valuable in multidisciplinary teams.
a reason for being
the best skill any engineer can have is the ability to learn new skills
Windows Subsystem for Linux (WSL) allows you to run a Linux environment directly on Windows without the need for a virtual machine. It's lightweight and integrates seamlessly with Windows, making it a great option for developers who need Linux tools while still working in a Windows environment. WSL 2 brings improved performance with full Linux kernel support.
Vagrant, together with VirtualBox, enables the creation and management of lightweight, reproducible virtual environments. It's a powerful tool for developers who need to standardize development environments across teams. Vagrant's configuration files make it easy to automate the setup of multiple virtual machines with consistent settings.
Developing directly on Linux or macOS provides a native Unix-based environment, which is ideal for most software development workflows. With native tools and no need for virtual machines, it offers great performance and is typically favored for server-side development, containerization, and tools like Docker and Kubernetes.
Understanding the operating system and how computers work is foundational for effective software development. Knowing how processes are managed, how memory is allocated, and how filesystems operate allows you to troubleshoot issues and optimize performance. Whether you’re working on Linux, macOS, or Windows, familiarity with basic system commands, process management tools, and how the OS interacts with hardware can significantly improve your ability to write efficient and reliable code.
Using an isolated package manager, such as `pipenv` for Python, `npm` with `nvm` for Node.js, or `rbenv` for Ruby, ensures that each project has its own dependencies and versions, preventing conflicts. This isolation allows different projects to run independently without affecting each other’s environment, leading to greater stability and easier debugging. Additionally, it makes it easier to replicate and share environments with other developers, especially in team settings or CI/CD pipelines.
logging - structured logging to a file
chrome plugin - debugging in the browser
vscode - step thru debugging
wireshark - network packet capture
mitmproxy - man-in-the-middle the traffic
where else might you get information from?
or where might you take this data?
but be sure you save those asks, and bring information
Think beyond individual components. Understand how different parts of the software interact, affect each other, and work as a whole. Focus on the big picture as well as the details.
Being a good engineer isn't about knowing every tool. It’s about breaking down problems into manageable parts, finding the root cause, and solving them systematically.
Successful software development relies heavily on communication. Whether it's documenting code, participating in code reviews, or working with cross-functional teams, communication is key.
Every engineering decision has trade-offs. Balancing between speed, scalability, complexity, and technical debt is essential. There is rarely a perfect solution, so optimize for the best choice under the circumstances.
Always be willing to learn. New technologies, frameworks, and practices constantly emerge. Cultivate curiosity and the desire to improve continuously in both technical and soft skills.
Clean, readable code is more valuable than clever, obscure code. It’s easier to maintain, scale, and debug. Write with future maintainers in mind, including your future self.
Debugging is an inevitable part of the engineering process. Stay calm, break down the problem, and approach bugs systematically. Understand the root cause instead of applying quick fixes.
Git and other version control systems are essential tools for collaboration. Learn how to create meaningful commits, branch properly, and handle conflicts gracefully. This ensures smoother team development.
Don’t over-engineer by creating features or abstractions that might never be used. Focus on the immediate problem at hand and avoid unnecessary complexity.
Manual processes are prone to error and take valuable time. Automate tasks like testing, deployment, and monitoring to ensure consistency and save time for critical work.
All code has a cost. Understand that shortcuts taken today can create technical debt, which will need to be paid later. Regularly review and refactor code to avoid accumulating too much debt.
Use metrics and data to inform decisions. Whether you're optimizing performance, identifying bottlenecks, or improving the user experience, objective data helps remove guesswork.
Feedback loops help you iterate and improve your work. Whether from code reviews, users, or monitoring systems, timely feedback will help you adjust and evolve your engineering solutions.
Understand common design patterns but don’t force them into every situation. They are tools in your toolkit but should be used when the problem fits the pattern.
Security isn't an afterthought. Think about potential vulnerabilities early on and build secure systems by design. Regularly review code for potential weaknesses.
Build systems that can handle growth and recover gracefully from failures. This requires thinking about architecture, data flow, and fault tolerance from the start.
Engineering is a team sport. There’s no shame in asking for help when you’re stuck. Leverage the knowledge of your peers, mentors, and community to solve problems more efficiently.
The SOLID principles are a set of five design guidelines that help software engineers create maintainable, flexible, and scalable code. Each principle focuses on a different aspect of software architecture, promoting clean and robust designs.
A class should have only one reason to change, meaning it should have only one job or responsibility. This principle emphasizes that each class should focus on a single part of the functionality provided by the software and should encapsulate it entirely.
Software entities such as classes, modules, and functions should be open for extension but closed for modification. This means you should be able to add new functionality without altering existing code, which helps prevent bugs and maintains stability.
Objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program. This principle ensures that derived classes extend base classes without changing their behavior, supporting the use of inheritance.
Clients should not be forced to depend on interfaces they do not use. This principle suggests splitting larger interfaces into smaller, more specific ones so that clients only need to be aware of the methods that are relevant to them, avoiding unnecessary dependencies.
High-level modules should not depend on low-level modules. Both should depend on abstractions, and abstractions should not depend on details. This principle encourages the use of interfaces or abstract classes to reduce the dependency on concrete implementations.
read or listen to new things..
audible & speechify are cheat codes I use
Summary: "Modern Software Engineering" advocates for a disciplined approach to software development, rooted in empirical data and proven methodologies. Farley highlights the importance of feedback loops, reducing complexity, and making incremental improvements. The book covers key concepts like DevOps, Continuous Integration (CI), and test automation, giving engineers practical tools to adopt modern engineering best practices.
Summary: "Designing Data-Intensive Applications" explores the core components of modern software architecture: storage, indexing, and data models. Kleppmann explains how to choose between various database technologies, the trade-offs involved in replication and sharding, and how to build reliable distributed systems. The book provides real-world examples of data processing and architectural design patterns that can handle immense amounts of data.
Summary: "The Pragmatic Programmer" covers a wide range of topics that are foundational to becoming a better software engineer, including effective coding habits, debugging strategies, and how to work efficiently in a team. The book is filled with practical tips on writing flexible, maintainable code, managing complexity, and learning from failures. It also emphasizes the importance of automation and constantly improving your skills.
Summary: "The Software Architect Elevator" uses engaging metaphors and stories to explore the role of a software architect in a modern enterprise. Hohpe discusses critical topics like cloud adoption, microservices, and how to communicate effectively with both business leaders and technical teams. The book is filled with real-world advice on how to balance strategic objectives with technical execution in complex environments.
Summary: In "Clean Code," Robert C. Martin outlines principles and best practices for writing code that is easy to read, understand, and maintain. The book provides concrete examples of both good and bad code, illustrating how even small changes can dramatically improve code quality. It covers critical areas like naming conventions, function design, error handling, and unit testing, helping engineers develop cleaner, more effective codebases.
other engineers are sharing their excellent work
The Macquarie Engineering Blog offers insights from engineers working at Macquarie, a global financial group. It focuses on the challenges and solutions related to technology in financial services, covering topics like cloud architecture, DevOps, security, and digital transformation. It's a great resource for understanding the intersection of finance and cutting-edge technology.
The Uber Engineering Blog dives deep into the technical innovations behind Uber's platforms. The blog covers large-scale distributed systems, data infrastructure, and optimization techniques, with contributions from engineers across the company. It’s a valuable resource for software engineers interested in the complexities of global systems and real-time data processing.
The Netflix Tech Blog provides a behind-the-scenes look at the engineering that powers Netflix’s global streaming platform. It covers a wide range of topics, from microservices and cloud infrastructure to machine learning and content delivery optimization. Engineers at Netflix share their experiences on building reliable, scalable, and innovative systems.
Spotify’s Engineering Blog showcases the technology that supports its massive music streaming service. The blog covers topics such as backend infrastructure, data pipelines, and the use of machine learning in music recommendations. Spotify’s engineering team regularly posts about how they scale their systems to handle global demand.
The Stripe Engineering Blog focuses on the technology behind building secure, reliable, and scalable financial systems. Engineers at Stripe share in-depth technical discussions on topics like APIs, cloud infrastructure, and payment systems, making it an excellent resource for developers working on high-availability and security-critical applications.
another way to keep current and listen while you do other things...
Software Engineering Daily is a daily podcast that covers a wide range of topics relevant to software engineers, from cloud computing and distributed systems to machine learning and security. The podcast features interviews with industry experts, providing deep insights into modern engineering challenges and solutions.
The Changelog is a weekly podcast that focuses on open-source software, the people behind the projects, and the innovations driving the tech industry. Each episode features conversations with developers and maintainers, providing an inside look into the world of open-source development and software engineering trends.
Engineering Culture by InfoQ explores the latest practices and technologies that are shaping software development. The podcast covers topics like DevOps, agile methodologies, and team culture, making it essential for engineers and leaders interested in improving collaboration and delivery practices within their teams.
Command Line Heroes is a podcast that tells the stories of the developers, engineers, and innovators who have shaped the technology world. Each season dives into different themes such as the history of programming languages, software architecture, and the evolution of computing, offering a mix of technical content and storytelling.
The Stack Overflow Podcast covers all things related to software engineering, developer culture, and the latest trends in tech. It features discussions on coding, debugging, and developer life, as well as interviews with industry leaders, making it a must-listen for developers of all levels.
finding the gems of knowledge among all the content
The DevOps Toolkit Series, hosted by Viktor Farcic, focuses on advanced DevOps topics, Kubernetes, GitOps, and infrastructure as code. It features hands-on tutorials and deep dives into modern DevOps tools and methodologies, making it a must-watch for engineers looking to improve their DevOps skills.
DevOps Toolkit SeriesThe Primeagen offers a blend of coding tips, development tools, and live streams focusing on topics like Vim, TypeScript, Rust, and high-performance coding techniques. With a quirky and energetic approach, this channel appeals to developers looking for practical tips and an engaging coding experience.
The PrimeagenTech With Nana provides clear, beginner-friendly explanations on cloud-native technologies like Kubernetes, Docker, and AWS. Nana’s channel is known for breaking down complex topics with practical demos, making it accessible to both new and experienced DevOps engineers.
Tech With NanaThe Continuous Delivery YouTube channel, led by Dave Farley, focuses on modern software engineering practices, particularly continuous delivery, DevOps, and Agile methodologies. It offers in-depth discussions on the principles of building high-quality software at speed.
Continuous DeliveryFreeCodeCamp is a non-profit platform that offers free coding lessons in a variety of languages and technologies. Their YouTube channel hosts full-length courses, tutorials, and coding challenges, covering web development, data science, machine learning, and more, making it a fantastic resource for learners at all levels.
FreeCodeCampstart/continue the practice of learning every day
establish a network, connect with me on linked in, attend a meetup and learn something
now its time for the Q/A