- Books
- The Art of Computer Programming - Donald Knuth
- Clean Code: A Handbook of Agile Software Craftsmanship - Robert C. Martin Series
- Software Engineering at Google - SWE BOOK
- The Mythical Man-Month: Essays on Software Engineering
- Eletrônica – Para Autodidatas, Estudantes e Técnicos – 2ª Edição, de Gabriel Torres
- Staff Engineering Book
- Basecamp Books
- The Stoic Mind: A Visual Exploration Of Stoic Philosophy
- The Software Engineering GuideBook
- Ultralearning: Master Hard Skills, Outsmart the Competition, and Accelerate Your Career
- Seja egoísta com sua carreira: Descubra como colocar você em primeiro lugar em sua jornada profissional e alcance seus objetivos pessoais
- Communication for Engineers: A framework for software developers to become better communicators and increase their happiness, productivity, and impact
- The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win
- Computer Networks - Tanenbaum
- Modern Operating Systems - Tanenbaum
- Sistemas Operacionais: Projeto e Implementação
- Compilers: Principles, Techniques, and Tools - Dragon Book
- Blogs & Articles
- Github
- Sites
- Acronyms
- Linux
The 4 Steps to Competence
- 1 - Unconsciously incompetent: “you don’t know how much you don’t know”
- 2 - Consciously incompetent: “you know how much you don’t know”
- 3 - Consciously competent: “you already know how much you know”
- 4 - Wisdom: “unconsciously you don’t know how much you know”
The 4 Ways to Spend Money - Milton Friedman
According to economist Milton Friedman, there are 4 ways to spend money:
- Spend my money on me:
- In this case, I have the incentive to look for the best value for money
- Good service at a fair price
- Spending my money on other people:
- In this type of situation, the objective is to save money, the price is more important than the quality of the service
- An average service for a good price
- Spending someone else’s money on me:
- In this case, money is spent with great attention to quality, but with little interest in seeking the best price
- Excellent service at a high price
- Spending someone else’s money on a third party:
- In a situation like this, there is little incentive to care about both service quality and price
- Bad service for a high price or good service for an extremely high price
Principles
- “Bad software that adds value > Perfect software that adds no value.”
- “Learn to say: I DON’T Know, and if necessary, try to learn.”
- “Premature optimization: the root of all evil.”
- “Remember that dinosaurs are almost always the best references.”
- “He who thinks little makes a lot of mistakes” - Leonardo da Vinci
- “In God I trust. Everyone else must bring data.”
- “Lack of money is the root of all evil.”
- “There is no silver bullet.”
- “Make it work > Do it correctly.”
- “Increase revenue > reduce costs.”
- “SaaS > PaaS > IaaS > In-House”
- “You != Unicorn”
- “Always try to understand what is happening under the hood.”
- “Write code != program != software engineering”
- “Maintenance > Performance”
- “No metrics, no optimization”
- “Never stop questioning”
- “Software engineering is 80% THINKING about the problem, and 20% HOW to solve the problem.”
- “The more knowledge you have, the less you know. EGO = 1 / knowledge.”
- “Everyone should care about quality”
- “At least 80% of the code of good software has been redone, shortened or better yet, deleted. Less is more.”
- “2+2 is not 5, no matter how many people say that.”
- “Principles > Analogy.”
- “Talk and learn from people smarter than you.”
- “Always try to use the single source of truth.”
- “Don’t reinvent the wheel. That’s what ready-made frameworks and libraries exist for.”
- “It’s always good to study a tool in depth before putting it into production.”
- “Modularization is everything.”
- “Good artists copy, great artists steal.”
- “Innovation only exists in a world of restriction, not abundance.”
- “There will always be something to improve. Done is better than perfect.”
8 Lehman’s Laws
Created by Meir Lehman, are a set of principles that describe the evolution and maintenance of software systems over time.
- Law of Continual Change:
- Explanation: Software systems need to constantly evolve to remain useful.
- Current Application: Frequent software updates, new features, and bug fixes are essential to keep up with user needs and changes in the environment.
- Law of Increasing Complexity:
- Explanation: As software evolves, its complexity tends to increase unless efforts are made to reduce this complexity.
- Current Application: Techniques such as code refactoring, modular architecture, and automated testing are used to manage and reduce complexity.
- Law of Self-Regulation:
- Explanation: Software evolution is a self-regulating process, with stable and predictable patterns of change.
- Current Application: Agile project management and the use of methodologies such as Scrum help to monitor and adjust development as needed.
- Law of Conservation of Organizational Stability:
- Explanation: The amount of work and resources dedicated to software maintenance tends to remain constant over time.
- Current Application: Companies allocate specific teams for maintenance and support, ensuring that resources are always dedicated to these tasks.
- Law of Conservation of Familiarity:
- Explanation: In order for developers to maintain familiarity with the software, the rate of change should not be too rapid.
- Current Application: Clear documentation, ongoing training, and code reviews help the team stay familiar with the software.
- Law of Continuous Evolution:
- Explanation: Systems must be continually adapted and improved to avoid becoming obsolete.
- Current Application: Continuous development and regular updates are common practices to keep software relevant and competitive.
- Law of Decline in Quality:
- Explanation: The perceived quality of a system tends to decrease over time unless it is adapted to meet new requirements.
- Current Application: Incorporating user feedback, continuous quality testing, and regular updates are crucial to maintaining software quality.
- Law of System Feedback:
- Explanation: Software evolution is a process that depends on feedback received from its use.
- Current Application: Monitoring, analytics, and user feedback tools are used to understand how the software is being used and where it needs to be improved.
These laws are applicable in any modern software development environment and help guide system maintenance and evolution practices.