Pragmatic Programmer
Pragmatic philosophy
- Your life it’s your life
- Craftsmanship
- Early adopter
- Responsibility
- Offer options
- Software Entropy
- Simplicity
- Maintenance
- Good enough software
- Quality is a requirement
- Your knowledge portfolio:
- Investment in knowledge always pays the best interest
- Read nontechnical books
- Read conceptual books
- Learn one new language every year
- Communicate
- Testability is key
Pragmatic approach
-
The essence of good design: ETC
-
DRY: Code, Data, Documentation (Knowledge)
- Don’t abstract too early, wait until you have copied and pasted a couple of times, examples are needed to create good abstractions
-
Orthogonality:
- Eliminate effects between unrelated things
- Understandable, and easier to debug, test and maintain
- Design patterns
- SOLID
- Prefer composition and FP languages
-
Reversibility:
- Flexible architecture
- Have options
-
Tracer bullets:
- Code lean and complete
- Find the target
-
Prototypes and post-it notes:
- Information gathering
- Is coupling minimized
- Collaborations between components well-defined
- Responsibilities
- Interfaces and data clear and available
-
Domain languages:
- Program close to the problem domain
-
Estimation:
- I’ll back to you
- optimistic, most likely, and pessimistic
- model building: someone that already did it
Basic Tools
Be more productive with your tools
- The power of plain text:
- Self-describing data
- Shell games
- Power Editing
- Debugging skills
- localhost test
- Explain to someone else
- Text manipulation
- Unix: sed, awk
- Scripting languages: Python
- Engineering daybooks
Pragmatic Paranoia
Validate all the information we’re given, assertions of bad data, and distrust data from potential attackers
- Design by contract
- Preconditions, postconditions: Clojure Specs
- Dead programs tell no lies
- Crash early
- Defensive programming is a waste of time let it crash! (Supervisor)
- Assertive programming
- Use assertions to prevent the impossible
- How to balance resources
- Release free resources
- Don’t outrun your headlights
- take small steps always
Bend or break
Make our code as flexible as possible, a good way to stay flexible it’s to write less code
- Decoupling
- Allow flexibility
- Shy code that promotes cohesion
- Law of Demeter: Depend on abstractions
- Avoid global data
- Avoid inheritance
- Juggling the real world
- Events
- Finite state machine
- Observer
- Publish/Subscribe (Channels)
- Reactive Streams
- Transforming programming
- Think in programs like Input Output and transformation of data
- Process of data
- find . -name ‘*.java’ | xargs wc -l | sort -n | tail -11 | head -10
- Programming is about code but programs are about data
- Inheritance tax
- Coupling
- Interfaces to express polymorphism
- Configuration
- Parameterize your app using external configuration
Concurrency
- Concurrency: Two pieces of code run at the same time using Fibers, Threads, and process
- Parallelism: Hardware that can do two things at once
- Breaking temporal coupling
- Avoid shared state
- Actor and process
- Blackboards
- Communication using Kafka or other streaming services
While you are coding
- Listen to your lizard brain
- Give time and space to your brains to organize your ideas
- Algorithm speed
- Refactoring
- Rethink
- Gardening
- Unit test
- (Duplication, Not DRY, Bad performance, Outdated knowledge, Test passing. Nonorthogonal)
- Redesign
- Refactor early and often is like a surgery
- Test the code
- Feedback
- Improve design
- Embrace TDD
- Property-based testing
- Security
- Authentication
- I/O data
- Principle of least privilege
- Up to date
- Encrypt sensitive information
- Naming
- In programming all the things have names and reveal the intent and belief of the system
- Communication
## Before the project
- Requirements Pit
- User doesn’t know what he wants
- Our job is to help businesses to understand what they want
- Improve the feedback loop
- BDUF is not a good thing
- Work with the user to think like one
- Solving de puzzle
- Think out of the box
- Make time to think in the unfocused mode
- Working together
- Pair programming
- Mob programming
- Agile
- It’s about values, context, and feedback loop
Pragmatic Teams
- Pragmatic Teams
- No broken windows
- Be aware of the environment and health of the project
- DRY
- Small teams
- Cross-functional teams Tracer bullets
- Automation
- Create and identity (Team name)
- Schedule time to improve knowledge portfolio
- Context
- Use the right tools and practices
- Software delivery (When release flow is slow status meetings are high)
- Kanban
- The programmer starter kit
- Version control
- Ruthless testing
- Unit, Integration, Component, Performance
- If modules don’t work well as a unit, they won’t work well as a system
- Saboteurs: Chaos engineering
- Automate everything
- Software delivery es fully automated
- Delight your users
- What are your expectations
- Deliver quality not code
- Pride and prejudice
- Code that you feel proud
- Collective ownership