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

Personal Productivity

Pomodoro

GTD

White Noise

ABC 

Write Code Every Day

Lifestyle

Excercising ( 7 Minute Workout )

Meditate ( Headspace )

Prioritise Sleep

Eating Regime

Deep Work

  • 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

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,234