Everyone knows CD and CI, we are here to present CR: Continuous Recruitment. This talk will describe key cultural and technical aspects of hiring engineers with using AUTO1 as a case study, how business and culture are influencing candidate requirements, how one can solve finding engineers fulfilling those requirements and how continuous delivery principles can be applied to reduce this growing heap of work.
2. Who is speaking
Paul Hofmann ─ Director of Engineering
• Started 2008 at Rocket Internet
• Spent four years at Groupon
• Joined AUTO1 in early 2015
• Bootstrapped java ecosystem
• Today responsible for engineering hiring,
personal growth and development, java platform
architecture, three feature and two platform
teams
5. The Situation
! Massive Recruitment Funnel
! Very, very individual and open solutions to our puzzle
Continuous Recruitment
6. The Situation
! Massive Recruitment Funnel
! Very, very individual and open solutions to our puzzle
! Individual reviews to those solutions
Continuous Recruitment
7. The Situation
! Massive Recruitment Funnel
! Very, very individual and open solutions to our puzzle
! Individual reviews to those solutions
Across the board: Consistency and Scale are a requirement
Continuous Recruitment
17. Quantify Code
Baseline: PMD and custom rules
! Cyclomatic Complexity
! Escaping the static context
! Abstraction of input and output
! Dead Code vs. Test Coverage
Continuous Recruitment > The Implementation
18. Cyclomatic Complexity (McGabe)
Each method starts with a score of 1.
Then we score++ for each
! return that isn't the last statement of a method
! if, else, case, default
! for, while, do-while, break, and continue
! &&, ||, ?
! catch, finally, throw, or throws clause.
<2😍 <5😎 <10😑 ≥10😡
Continuous Recruitment > The Implementation > Quantify Code
19. Escaping the static context
static methods and members are not OOP
Entry point into your app is almost always
public static void main(String [] args) {}
Continuous Recruitment > The Implementation > Quantify Code
20. Escaping the static context
static methods and members are not OOP
We simply count the number of occurrences of the static keywords in the code.
==1😍 <5😎 <10😑 ≥10😡
Continuous Recruitment > The Implementation > Quantify Code
21. Abstraction of input and output
Having output in one place is a great indicator
So we simply count the amounts of System.out and System.in statements or
equivalents.
==1😍 <1😑
Continuous Recruitment > The Implementation > Quantify Code
22. Dead Code vs. Test Coverage
Note: The puzzle doesn’t require tests!
If a candidate decides to provide tests, we measure line coverage.
Line coverage drops when there is dead code.
We like to feedback this, because removal of dead code is just base hygiene.
Continuous Recruitment > The Implementation > Quantify Code
23. Parameterize Feedback
! Identify relevant information from raw data
! Create a sophisticated template
Continuous Recruitment > The Implementation
24. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
Continuous Recruitment > The Implementation > Parametrize Feedback
25. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
! Are there instructions on how to run the code?
Continuous Recruitment > The Implementation > Parametrize Feedback
26. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
! Are there instructions on how to run the code?
! Size parameters, i.e.: Line count, line coverage
Continuous Recruitment > The Implementation > Parametrize Feedback
27. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
! Are there instructions on how to run the code?
! Size parameters, i.e.: Line count, line coverage
! Cyclomatic Complexity, static context, I/O abstraction
Continuous Recruitment > The Implementation > Parametrize Feedback
28. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
! Are there instructions on how to run the code?
! Size parameters, i.e.: Line count, line coverage
! Cyclomatic Complexity, static context, I/O abstraction
! Was playing the game fun?
Continuous Recruitment > The Implementation > Parametrize Feedback
29. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
! Are there instructions on how to run the code?
! Size parameters, i.e.: Line count, line coverage
! Cyclomatic Complexity, static context, I/O abstraction
! Was playing the game fun?
! Have there been plagiarised files?
Continuous Recruitment > The Implementation > Parametrize Feedback
30. Identify relevant information from raw data
Incomplete list of examples:
! Have all stories been implemented?
! Are there instructions on how to run the code?
! Size parameters, i.e.: Line count, line coverage
! Cyclomatic Complexity, static context, I/O abstraction
! Was playing the game fun?
! Have there been plagiarised files?
And many more...
Continuous Recruitment > The Implementation > Parametrize Feedback
31. Create a sophisticated template
! Jinja2 python templates
Continuous Recruitment > The Implementation > Parametrize Feedback
project for use of 3rd
libraries and frameworks and were {% i
data.THIRD_PARTY_LIBRARIES_USED == false %}
very happy to find that you haven’t used any,
for anything other than tests, so thank you
for sticking to the rules.{% else %}not so
happy to find that you have used some
libraries, although it’s a violation of our
requirements, it’s not a showstopper for us.
{% endif %} {{ data.GAME_JOY_CUSTOM_TEXT }}
{% if data.GAME_JOY_FACTOR == "low" %}We
found the game play to be satisfactory.{%
elif data.GAME_JOY_FACTOR == "medium" %}We
enjoyed playing the game for quite some time.
Thank you for that.{% elif
data.GAME_JOY_FACTOR == "high" %}Every minute
of the game we have played brought us more
joy, we truly appreciate the extra mile you
went here. Good job!{% endif %}{% if
data.STORIES_IMPLEMENTED == "all" %} We're
happy to confirm that all of your stories
were successfully implemented.{% elif
data.STORIES_IMPLEMENTED == "most" %} We can
state that some of the stories you were
tasked with were implemented.{% else %} We're
sad to state the none of the stories were
implemented.{% endif %}
We then started looking at the code. With
approximately {{ data.CODE_LOC }} lines of
code, we classify your solution as {% if
data.CODE_LOC_VERBAL == "lean" %}lean{% elif
data.CODE_LOC_VERBAL == "average" %}average{%
else %}bigger than average{% endif %} in
terms of size. {% if data.CODE_COVERAGE > 1
and data.CODE_COVERAGE <= 30 %
32. Create a sophisticated template
project for use of 3rd
libraries and frameworks and were {% i
data.THIRD_PARTY_LIBRARIES_USED == false %}
very happy to find that you haven’t used any,
for anything other than tests, so thank you
for sticking to the rules.{% else %}not so
happy to find that you have used some
libraries, although it’s a violation of our
requirements, it’s not a showstopper for us.
{% endif %} {{ data.GAME_JOY_CUSTOM_TEXT }}
{% if data.GAME_JOY_FACTOR == "low" %}We
found the game play to be satisfactory.{%
elif data.GAME_JOY_FACTOR == "medium" %}We
enjoyed playing the game for quite some time.
Thank you for that.{% elif
data.GAME_JOY_FACTOR == "high" %}Every minute
of the game we have played brought us more
joy, we truly appreciate the extra mile you
went here. Good job!{% endif %}{% if
data.STORIES_IMPLEMENTED == "all" %} We're
happy to confirm that all of your stories
were successfully implemented.{% elif
data.STORIES_IMPLEMENTED == "most" %} We can
state that some of the stories you were
tasked with were implemented.{% else %} We're
sad to state the none of the stories were
implemented.{% endif %}
We then started looking at the code. With
approximately {{ data.CODE_LOC }} lines of
code, we classify your solution as {% if
data.CODE_LOC_VERBAL == "lean" %}lean{% elif
data.CODE_LOC_VERBAL == "average" %}average{%
else %}bigger than average{% endif %} in
terms of size. {% if data.CODE_COVERAGE > 1
and data.CODE_COVERAGE <= 30 %
! Jinja2 python templates
! Results are pushed to GitHub as comments
Continuous Recruitment > The Implementation > Parametrize Feedback
40. Q&A
Meet me at our booth here @codemotion
email: paul.hofmann@auto1.com
LinkedIn: http://linkedin.com/in/paul-hofmann-auto1
More Info: http://auto1-group.com/team/tech
Continuous Recruitment