Software Engineering 101
Hello, I am Alex
Self-taught
FullStack Engineer
Web Frontend Expert
Coach
TopTal
Upwork Pro
Freelance
Freelance
Freelance
Startup
Startup
Pet project
Pet project
Pet project
Pet project
Pet project
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges in Development
- Refactoring
- Code is for Humans
- Failures
- Good Practices in Development
- Learning
- Mentoring
- Communications
Engineering & Professionalism
Cross-Disciplinary Subject
Technologies
Psichology
Science
Sociology
Software Engineering
Software Engineering is an application of systematic, disciplined, quantifiable approach to development, operation and maintenance of software.
- IEEE90
Programmer
Historically negative context
Someone who uses the spec to code it down
Developer
Purely development of software products
Rarely operations or maintenance
Not only code
Engineer
Development + Operations + Maintenance
Focusing on Value?
Wider responsibilities
Professionalism
"How you do anything is how you do everything"
- Secrets of Millionaire Mind
Secret secrets
Always perform to the best of your abilities
Do more than expected
Stay optimistic
Honour your values!
Mindset: Principles -> Values
Say NO!
It's your responsibility
Empathy
We work with people for people
Put your customers first!
Be predictable!
Strive for reliability and consistency
Be replaceable!
Share, mentor, learn, stay open for opportunities
Be pragmatic
not dogmatic
There are no silver bullets
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Context
Experts spend more time on understanding the problem
Know your team
Whom do I do this with?
Know your resources
How can I do this?
Know your goals
What am I doing?
Know your reason
Why I am doing this?
Cynefin
Expert's Decision Making
4. Evaluate, select the best solution
1. Define the challenge
2. Isolate factors causing the challenge
3. Construct multiple solutions
Listen and Ask
to get the whole context
There is always
"it depends"
argument
Be proactive
to find the limitations
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Velocity
Sprint vs Marathon
More work != better results
Productivity
vs
Effectiveness
vs
Efficiency
Productivity
+
Effectiveness
+
Efficiency
Aim for Sustainable velocity
Eliminate waste ( Kaizen )
Personal Productivity
Not the amount of work done
But the ability to deliver a product
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Processes
Agile and XP
Software Craftsmanship
Well-Crafted Software > working software
Steadily adding Value > responding to change
A Community of Professionals > individuals and interactions
Productive Partnerships > customer collaborations
Project Management
... is still a mess
Scrum vs Kanban
Scrum
"Agency - Customer" model
Warzone methodology
Expert-Driven micromanagement
Kanban
Pull-based model
Involves everyone
Quotas
Eliminating Waste
Build your own processes
We are still "not there"
Optimise for
Sustainable and reliable progress
Getting things out of your head
Fighting complexity
Changeability
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Technologies
Technologies
does not matter!
...as much as we want them to
Good software
is done by good
software engineering teams
Project success has
no correlation
with used technologies
Pick any technology
pragmatically
Pragmatic arguments
logically fit
your context
Pragmatic arguments
are based on practical
rather than theoretical
considerations
My team is proficient with it
People are excited by this technology
Easy to find and add new people
Helps to do things right
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Estimations
Task vs Project
Task Estimation
No more than 2 weeks!
Include all phases
Task Estimation Phases
Implementation
Testing
Logging / Metrics
Design / Refactoring
Implementation is what
can be estimated
and only optimistically
Task Estimation
30% Implementation
30% Testing
10% Logging / Metrics
30% Design / Refactoring
Realistic estimate = 3 * implementation time
Multiplication Factor
will vary
based on experience
Project Estimation
Divide & Conquer:
Epics, Stories, Tasks
Make optimistic task estimates
Add time boxed investigations
Include risks
4 weeks per story max, otherwise investigate!
Project Estimation
Realistic path =
3.14 * Optimistic path + 2 weeks
Risks
Bus Factor
Illness
Fuck ups
Vacations
Holidays
Design Mistakes
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Hardest Challenges
How do you communicate?
Problems
Context
Goals and Focus
How do you manage complexity?
Divide and Conquer
Structure
Conventions
How do I name things?
Domain Driven Design
Aim for self-documented code
Name things based on "What it does" not "How it does" (declarative)
How do I evolve a system?
Reduce cost of change
Communicate
Measure -> React
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Refactoring
Has no direct
business value
Should not be
a part of the backlog
Opportunistic Refactoring
The only one working method
Rule #0:
never talk about refactoring
Rule #1:
Refactoring is an essential part of a task
Rule #2:
Boy Scout Rule
Boy Scout Rule
Always leave the code behind
in a better state
than you found it
Learn
how to work with
Legacy Software
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Code is for Humans
It is all about people
Use simple technologies
Hard vs Easy
Complex vs Simple
Always think about maintenance
More time is spent on
reading and debugging
than on writing code
Readability and simplicity
is always better
than no duplications
and following best practices
"Always code as if the guy who ends up maintaining your code will be
a violent psychopath
who knows where you live."
- John Woods
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Failures
Do not be afraid
2 steps
Step #1
Learn first how to cope with failures yourself
-
How do you feel about it?
-
How do you learn from it?
-
How do you fix the consequences?
Step #2
Learn from other people failures
-
Networking!
-
Conferences, Meetups, Chat rooms
-
Case Studies
-
Share Failures!
Failure is the source of experience
Experience is the source of intuition
Success is a side effect
You cannot escape it
Failures and Edge Cases
are essential to our craft
Be responsible!
Respond to failures
Safety Nets / Plan B
Design for Failure
vs
Happy Path
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Good Practices
in Software Development
Magic
TDD
Code Reviews
Routine Automation
OSS
Pair Programming
Know your tools
Git
IDE
CI / CD / QA / Ops
Know what others do and how you can help
Rebase Add Patch Bisect Gitflow
Hotkeys Snippets Plugins Theme
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Learning
Stay curious
Ask questions
Tell things
Knowledge
vs
skills
Knowledge
- Won't feed you today
- Opportunities
- More influence
Strategic Value
Skills
- Immediate value and benefits
- Get Stuff Done
- More freedom
Tactical Value
How-To
How-To
- Analyse breadth-first
- Grasp the basics
- Go deeper when you are in the context
Hacks
Hacks
- Never learn alone!
- Mentor others!
- Spaced Repetitions
- Learn How To Learn
- ABC = Always Be Coding
Spaced Repetitions
Hype
Hype
Tech Spiral
Learn from History
Hype
Follow the trends only if you are an expert in the niche
Hype
Only bet on strategical investments
Yes, I am sure I will do this in 5 years and pursue this goal whatever it costs
Hype
Ignore “moving train”
and “become pro in 21 days!”
Say NO
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Mentoring
Teaching is an effective learning!
Does not require expertise
just be a step forward
Deep understanding = simple explanation
5 yo kid
Teaching effects
Restructures data (systematisation)
Creates new connections
Brings intuition to consciousness
Dreyfus Model
- Engineering & Professionalism
- Context
- Velocity
- Processes
- Technologies
- Estimations
- Hardest Challenges
- Refactoring
- Code is for Humans
- Failures
- Good Practices
- Learning
- Mentoring
- Communications
Communications
Max info in Min time
Rule #0:
Do not explain the answer
before
answering the question
Rule #1:
Start with
the single most important
fact
Talk to hear,
not to be
understood
Prove to
understand
Not to "be right"
Not to "be better"
Constructive criticism
Close the loop: offer some options
Constructive: help them become better
Stop your judgement
the ultimate relationship destroyer
the ultimate happiness killer
Be the last one to provide a summary
Active Listening
Active Listening
Eye contact
Relaxed Attention
Imagine things
No interruptions and suggestions
Body language
Feedback
Train your expressiveness
Blogging
Chats
Talk to people
Thanks!
Take Aways
Engineering & Professionalism
Take Aways
Context
Velocity
Productivity
Take Aways
Lifestyle
Processes
Take Aways
Failures
Hardest Challenges
Good Practices
Take Aways
Refactoring
Learning
Communications
Take Aways
Bonus
Software Engineering 101
By Alexey Migutsky
Software Engineering 101
- 16,104