Software Craftsmanship

Become greybeards! Journey to galaxies far away! Master your tools!


Tomasz Borek, @LAFK pl,


Refurbishing the cubbyhole

  1. a bed with sliding drawers

  2. a locked wardrobe, 3m high

  3. a set of book-shelves

  4. a PC-adjusted desk with drawers and monitor stand

  5. a little book-case

  6. a sliding door with glass windows

  7. a wooden wainscott

  8. and of course a paint job was due

I learned

  1. metalworking

    1. cutting the bed frame

    2. and soldering it

  2. woodworking

    1. from choosing to painting or polishing

  3. painting

    1. included mixing the paint

I learned

  1. tooling: screwdriver, hammer, angler, ruler, flex-ruler

  2. and power-tooling: sander, grinder, driller

I learned

  1. know-how

    1. wood durability and weight

    2. soldering

    3. handling sparks

    4. handling tools that could overpower or harm me

  2. tips&tricks

    1. unlocking a simple lock,

    2. good measuring practices,

    3. marking places for drilling…​

I learned

  1. metal-/ wood-working

  2. painting

  3. tooling and power-tooling

  4. know-how and tips&tricks

I was learning

a craft.

Other examples

  1. a mini-drawer

  2. a dishwasher door

  3. a door-hiding wardrobe

  4. a bathtub shelf

A music-score stand

musical-score stand
musical-score stand

The point?

  1. crafts aren’t isolated

  2. planning matters

  3. volatile code is not a constraint

  4. you can do things better

  5. small improvements - automation

Practice begets experience

NowyTarg wŚniegu


In the apprentice - journeyman - master cycle, mastery was confirmed by other masters upon journeyman’s producing the master toolset - his own masterpiece.

Blacksmith tools


All in order

typical bug fixing - one thing after another

Richard Stallman started with a compiler and then moved to Emacs.


  1. a professional

  2. a certain level of quality

  3. a consistent level of quality

Today’s rules

Questions as we go
Break - one half-way through.

About Sages

  1. Trainings and advisories for IT professionals

  2. for companies in IT and outside, as long as it’s about software

Sages' mission statement

Company’s mission is to support the process of designing, creating and deploying software in corporations and public institutions, to minimize cost, time and risk associated with these endeavours.
— Sages - o nas

translation mine

About me, when not representing Sages

LAFK pl wSieci

My jobs include

  1. audits of: code, infra, components, design, systems

  2. performance or security tests and audits

  3. dealing with DBs, OS', networks or security

  4. programming jobs

  5. lectures, talks, workshops, trainings


question mark
appears rarely, so don’t wait for it

Software Craftsmanship Kraków

  1. Started as NoSQL summer

  2. reading club

  3. reading computer science papers

  4. interdisciplinary

    1. Scala, Java, Assembler, C#, .NET, devops…​

Formula: reading club

  1. choose a paper (voting)

  2. read at home

  3. during the meeting - discuss

  4. paper proposals

Occasionally other formulas:

  1. code retreat

    1. legacy one

  2. security dojo,

  3. lean coffee,

  4. lightning talks,

  5. regular presentation,

  6. etc.

Exemplary papers

Raising the bar

  1. be better than yesterday

  2. apprentice - journeyman - master

  3. deepen the T

  4. widen the T

The T or the I?

Tmodel Imodel

The T model

Tmodel MaherArafat

The Dreyfus model



  1. Well-crafted: pro, consistent level of quality

  2. Steady improvements, not just responding to change

    1. not like gamedev

  3. Grow the community

    1. again, not like gamedev, share with others

    2. give back to community, train, speak, mentor

  4. Customer is always right

    1. except that pro should say no

In a nutshell

  1. improve

  2. master your tools

  3. deepen and broaden your T

  4. journey to mastery

  5. take pride in your crafts

  6. become a greybeard

Mastering something

Great designers design, that’s why they’re so great.
— Tomasz Borek on Archi-kata
In one way or another, all professionals practice. They do this because they care about doing the best job they possibly can. What is more, they practice on their own time because they realize that it is their responsibility – and not their employer’s- to keep their skills sharp. Practicing is what you do when you aren’t getting paid. You do it so that you will be paid, and paid well.
The Clean Coder
— Robert C. Martin
Computer programming, like any creative activity, demands constant study and practice. Vladimir Horowitz practiced the études of Chopin every night, after he performed a concert, to maintain his skills for the next performance. Tiger Woods drives a thousand balls on the driving range, every day. Pablo Picasso sketched a bull ten times before the eleventh bull was right.
— Programming Praxis


  1. first master your language

  2. then master your everyday tools

  3. then choose new tools, languages, domains

Is this even needed?

  1. we had devs and admins, but devops came

    1. and ate build engineers too

  2. we had BAs and DAs, but Data Scientists came

    1. and got some programming thrown in

  3. we had QAs and devs, but SDETs came

    1. like automated testers but with programming

  4. polyglot programmers?

  5. polyglot persistence?

Throughout my whole career I never had to use scripting. Not even once.
— anon who programmed on Windows
You will not use multithreading in a true business software.
— anon from a conference

Mastering a language then

  1. language spec

  2. new features

  3. document your findings (blog)

  4. use your findings (code)

  5. books have a progression as well




kata, a Japanese word, meaning literally: "form" (型 or 形) - Wikipedia

A form of a (usually) solo training

A kata typically refers to fundamental movements in Japanese martial arts, but can refer to any basic form, routine, or pattern of behavior. Recognizable patterns of behavior and clear expectations make it easy to recognize abnormalities (problems) and also serve as a basis of improvement, setting and attaining higher standards.

In lean management, kata refers to two linked behaviors: improvement kata and coaching kata.
— Lean lexicon

Where to use?

  1. Management - The Toyota Kata

  2. Security - phishing game

  3. Programming - Code Kata

  4. Designing - Architectural Kata

  5. Mastering specific area, tool, domain

Code Kata

  1. Pragmatic Programmers, Emily Bache, Uncle Bob

  2. Programming Praxis and other code sites

  3. Robert Dunaway (JS, Angular, Bootstrap, Gulp)


Great designers design, that’s why they’re so great.
— Tomasz Borek on Archi-kata

Choose a problem

  1. e-voting system

  2. SMS campaign system

  3. software for a travel agency chain

  4. securing a SAAS

  5. …​


  1. 0,5h for an introduction and early problem Q&A

  2. 1h for designing

  3. 1h for presentations (count 10 minutes per team)

  4. 0,5 h for voting and wrap-up


  1. only an hour for designing

  2. you don’t have time to check

  3. assumptions allow to go forward

  4. what if they’re wrong


  1. if you don’t draw with presenting in mind, you can’t win

  2. nobody does priorities

    1. even on conflicting reqs

  3. group size and conceptual integrity

  4. holding the reins from behind vs stifling others

  5. plan B on broken assumptions or one bridge too far

  6. brilliant idea gets people


comes in several forms, uses several techniques

a challenge-based programming, where you compete with others


  1. two people sit down opposite each other and code same problem

  2. time-based event

  3. may be done as a relay-race

the usual form


Known outside of dojo and recommended since XP, heck even appropriated by Agile. Great for mentoring or knowledge transfer.

Code reviews

  1. As above.

  2. Public code reviews may even be recorded.

  3. Group ones with many reviewers or many learners

    1. useful when recruiting

Craftsman exchange

how about exchanging an employee with another company?
unlike gamedev…​

Code retreat

Legacy code retreat

Like a code retreat, but focuses on dealing with legacy code.

You don’t code from scratch, you have an app already.

SCKRK does them

Code Retreat is a fun exercise. You meet a bunch of strangers and friends alike, mix with them for a 45 minutes pair-programming and try to solve a simple (deceptively!) problem in a TDD manner.
GDCR meeting description
— Tomasz Borek

Code Retreat is a fun exercise. You meet a bunch of strangers and friends alike, mix with them for a 45 minutes pair-programming and try to solve a simple (deceptively!) problem in a TDD manner.

So, you code a lot and…​ you learn a lot. Different IDEs, different languages, different versions of Java, different testing frameworks, keyboard shortcuts, etc. etc.

Code Retreat is a fun exercise. You meet a bunch of strangers and friends alike, mix with them for a 45 minutes pair-programming and try to solve a simple (deceptively!) problem in a TDD manner.

So, you code a lot and…​ you learn a lot. Different IDEs, different languages, different versions of Java, different testing frameworks, keyboard shortcuts, etc. etc.

The exercise is famous enough to have its global edition, every November. Hence - this meeting.

Aside from the first (two?) session(s?) each session will have its unique constraint, to make things more interesting. :-)

GDCR meeting description
— Tomasz Borek

Global Day of Code Retreat

Toy project

Perhaps a most famous one…​

I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since April, and is starting to get ready. I’d like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).
25 August 1991 post to comp.os.minix
— Linus Torvalds



Just Another Perl Hacker


v=0000;eval$s=%q~d=%!^Lcf<LK8,                  _@7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC       "%.#%  :::##"       97N-A&Kj_K_><wS5rtWk@*a+Y5
yH?b[F^e7C/56j|pmRe+:)B     "##%      ::##########"     O98(Zh)'Iof*nm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y?    "##:         ###############"    g6`YT+qLw9k^ch|K'),tc
6ygIL8xI#LNz3v}T=4W    "#            #.   .####:#######"    lL27FZ0ij)7TQCI)P7u
}RT5-iJbbG5P-DHB<.   "              ##### # :############"   R,YvZ_rnv6ky-G+4U'
$*are@b4U351Q-ug5   "              #######################"   00x8RR%`Om7VDp4M5
PFixrPvl&<p[]1IJ   "              ############:####  %#####"   EGgDt8Lm#;bc4zS^
y]0`_PstfUxOC(q   "              .#############:##%   .##  ."   /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!;  " %%            .################.     #.   "  ;s="v=%04o;ev"%
(;v=(v-($*+[45,  ":####:          :##############%       :   "  ])[n=0].to_i;)%
360)+"al$s=%q#{  "%######.              #########            "  ;;"%c"%126+$s<<
126}";d.gsub!(/  "##########.           #######%             "  |\s|".*"/,"");;
require"zlib"||  "###########           :######.             "  ;d=d.unpack"C*"{|c|n=(n||  ":#########:           .######: .           "  )*90+(c-2)%91};
e=["%x"%n].pack   " :#######%           :###### #:          "   &&"H*";e=Zlib::
Inflate.inflate(   "  ######%           .####% ::          "   &&e).unpack("b*"
)[0];22.times{|y|   "  ####%             %###             "   ;w=(Math.sqrt(1-(
(y*2.0-21)/22)**(;   " .###:             .#%             "   ;2))*23).floor;(w*
2-1).times{|x|u=(e+    " %##                           "    )[y*z=360,z]*2;u=u[
90*x/w+v+90,90/w];s[(    " #.                        "    ;y*80)+120-w+x]=(""<<
32<<".:%#")[4*u.count((     " .                   "     ;"0"))/u.size]}};;puts\
s+";_ The Qlobe#{" "*18+ (       "#  :#######"       ;"Copyright(C).Yusuke End\
oh, 2010")}";exit~;_ The Qlobe                  Copyright(C).Yusuke Endoh, 2010

Yusuke moved forward

Since 2010, where he did this quine, he made also others. See his YT channel. :-)

Online CV?

Mastering JS?

  1. Vanilla.js: OOP, FP, prototyping, quirks

  2. Wtf.js:

  3. microframeworks?

  4. your tooling

  5. CSS3 and HTML5

Frameworks, if you need them

  1. Angular, React, Ember, Vue

  2. jQuery / Zepto

Zen Garden

Wow factors

Go and tests?

  1. BDD and Go: Gomega and Ginkgo

  2. testing/quick

  3. rapid.check

  4. gopter


Landen’s work, like toybox:

Something useful?

  1. 10minutemail?

  2. log parser?

  3. Fancy Quotes?

  4. Ascinema or Byzanz-recorder?

  5. SMOG station?

  6. your own portfolio


Landen’s work, like toybox:


If you can’t explain something to a first year student, then you haven’t really understood.
— Richard P. Feynman


  1. synthesis

  2. revising what you know

  3. for others


  1. sketching

  2. cheat sheets

Julia Evans, b0rk


Julia Evans, b0rk


Julia Evans, b0rk


Julia Evans, b0rk


Julia Evans, b0rk - zines

Jerry Hargrove, AWSGeek

Cheat sheets

A shell-level cheat sheet

Write a tutorial!

  1. forces to reexamine what you think you know

  2. for others you may find motivation you won’t for yourself

  3. this will be seen!

  4. which steps should one take - do you know?


  1. Bug hunting

  2. Bug bounties

  3. CTFs

  4. War games

Deliberate practice

  1. War Games, hacking marathons, hack-days

  2. Reading about a topic, deep-diving into it

  3. exercise sites like Programming Praxis or Euler

  4. Steve Yegge has a few pieces on his blogs about practising programming.

  5. including a critique of kata and replacing it with a deliberate practice

  6. and series of practice drills


Practice Drill #1: Write your resume. List all your relevant skills, then note the ones that will still be needed in 100 years. Give yourself a 1-10 rating in each skill.
— Steve Yegge practice drill


Practice Drill #2: Make a list of programmers who you admire. Try to include some you work with, since you’ll be borrowing them for some drills. Make one or two notes about things they seem to do well — things you wish you were better at.
— Steve Yegge practice drill


Practice Drill #3: Go to Wikipedia’s entry for computer science, scroll down to the "Prominent pioneers in computer science" section, pick a person from the list, and read about them. Follow any links from there that you think look interesting.
— Steve Yegge practice drill


Practice Drill #4: Read through someone else’s code for 20 minutes. For this drill, alternate between reading great code and reading bad code; they’re both instructive. If you’re not sure of the difference, ask a programmer you respect to show you examples of each. Show the code you read to someone else, and see what they think of it.
— Steve Yegge practice drill


Practice Drill #5: Make a list of your 10 favorite programming tools: the ones you feel you use the most, the ones you almost couldn’t live without. Spend an hour reading the docs for one of the tools in your list, chosen at random. In that hour, try learn some new feature of the tool that you weren’t aware of, or figure out some new way to use the tool.
— Steve Yegge practice drill


Practice Drill #6: Pick something you’re good at that has nothing to do with programming. Think about how the professionals or great masters of that discipline do their practice. What can you learn from them that you can apply to programming?
— Steve Yegge practice drill


Practice Drill #7: Get a pile of resumes and a group of reviewers together in a room for an hour. Make sure each resume is looked at by at least 3 reviewers, who write their initials and a score (1-3). Discuss any resumes that had a wide discrepancy in scoring.
— Steve Yegge practice drill


Practice Drill #8: Listen in on a technical phone screen. Write up your feedback afterwards, cast your vote, and then talk about the screen with the screener to see if you both reached the same conclusions.
— Steve Yegge practice drill


Practice Drill #9: Conduct a technical interview with a candidate who’s an expert in some field you don’t know much about. Ask them to explain it to you from the ground up, assuming no prior knowledge of that field. Try hard to follow what they’re saying, and ask questions as necessary.
— Steve Yegge practice drill


Practice Drill #10: Get yourself invited to someone else’s technical interview. Listen and learn. Try to solve the interview questions in your head while the candidate works on them.
— Steve Yegge practice drill


Practice Drill #11: Find a buddy for trading practice questions. Ask each other programming questions, alternating weeks. Spend 10 or 15 minutes working on the problem, and 10 or 15 minutes discussing it (finished or not.)
— Steve Yegge practice drill


Practice Drill #12: When you hear any interview coding question that you haven’t solved yourself, go back to your desk and mail the question to yourself as a reminder. Solve it sometime that week, using your favorite programming language.
— Steve Yegge practice drill

Coding sites

This blog publishes new programming exercises weekly, at least, so that savvy programmers can maintain their skills by working the exercises and thinking outside their normal skill set, whatever that is.
— Programming Praxis

Example sites

  1. Coding Bat

  2. Code Wars

  3. Coding Game

  4. LeetCode

  5. HackerRank

  6. VimGolf

  7. Wargames in OverTheWire or WeChall

How about rolling your own?

  1. Your own toy project

  2. A recruitment help

  3. A refresher prior to your own interview

Practice makes perfect



  1. Perfect practice makes perfect.

    1. a violin story

    2. a tennis story

  2. Psychological Review had a paper on it:

    1. The Role of Deliberate Practice in the Acquisition of Expert Performance

To maximize gains from long-term practice, individuals must avoid exhaustion and must limit practice to an amount from which they can completely recover on a daily or weekly basis.
Ralf Th. Krampe
— K. Anders Ericsson
A number of training studies in real life have compared the efficiency of practice durations ranging from 1-8 hr per day. These studies show essentially no benefit from durations exceeding 4 hr per day and reduced benefits from practice exceeding 2 hr (Welford, 1968; Woodworth & Schlosberg, 1954).
Ralf Th. Krampe
— K. Anders Ericsson
Many studies of the acquisition of typing skill (Baddeley & Longman, 1978; Dvorak et al.. 1936) and other perceptual-motor skills (Henshaw& Holman, 1930) indicate that the effective duration of deliberate practice may be closer to 1hr per day.
Ralf Th. Krampe
— K. Anders Ericsson
How does the average guitarist practice? In the years before I started getting serious about lessons, I played a lot — 6 to 8 hours a day for about 5 years. I learned a lot of songs, all by memorization, and I had to play them constantly to keep them in memory, so at least 2 hours of every day was wasted just running through the pieces. Through brute-force effort I eventually started to sound like I knew what I was doing. Fooled myself and most of the people around me, anyway.
on guitar-playing
— Steve Yegge
I felt I could muddle through almost anything, but it was clear that I became progressively sloppier as the music became more technically challenging. And there were some things I just couldn’t play.
on guitar-playing
— Steve Yegge
The problem was that I had no idea how to practice correctly. The saying "practice makes perfect" is inaccurate, as any music teacher will happily tell you. Perfect practice makes perfect. I’d been practicing sloppily, and had become very good at being sloppy.
on guitar-playing
— Steve Yegge


question mark





Taxi on a Sunday

a COBOL story

The curse

Majority of software developers are fated to become managers

Classical technical path

  1. Junior - Programmer - Senior

  2. Architect - Principal Architect

    1. Box, System, Solution

Or a team-leader, one leg in a grave already!

Other paths

  1. Scrum / Agile

  2. Consultants

  3. Managers of course

  4. ???

Number of good reasons to be a manager


Reasons boil down to

  1. people can be fascinating

  2. decision power, career, money - so-called fate or reality

Majority of software developers are fated to become managers

Classical technical path?

back-end, front-end, full-stack?
programmer, administrator, devops?
manual tester, QA, SDET

Technical Mastery

Programming (general, scripting, web)
Devops (infra, scripts, built tools, OSes)
DBs (SQL, non-SQL)
Low-level programming, mechanical sympathy
FP, FRP (infinite streams), Big Data
Distributed systems (networks, clusters, HA)
Multithreading (which paradigm?)
IoT, hardware programming (drivers, firmware)
Android / iOS / native mobile apps

Become a greybeard then!

Technical and domain mastery
Step out of comfort zone
Don’t go for „sad manager”
Increase skills, amass experience
Greybeard, because it takes time
    Is there plan minimum?

Plan minimum: growing a beard

spend time on programming
chase after wisdom
deepen your skills
things you haven’t yet done
share experience with others
throw-away programming cause "career"
get lulled into thinking years == experience

Learn your (many) tools

VCS: Git, Mercurial, Fossil
Testing libraries or frameworks
Build tools
Multithreading paradigms / libraries
OS and it's distros
Other languages

Learn your (many) tools

This fixes several problems

Hammer and nail problem


SODD problem


Magical frameworks problem

Framework was built to solve problem
    author’s problem, not yours
I know Spring / Git / whatever
    I know… how to use

Master many tools then!

Wield your tools like a pro

  1. Business casual

  2. Toolbox expansion

  3. How it works (understand, not just use)

  4. No hammer and nail

  5. No SODD

  6. Not piecing lego together

  7. No magic, just frameworks


question mark

Movement Criticism

  1. primadonnas that the client pays for

  2. guild mentalities, a step back to medieval era

  3. journeyman? really? who’s "a master"?

  4. I’m no plumber

  5. coder - programmer - engineer - developer - …​

  6. kata, dojo, ninja, why the whole martial arts fix-up?

  7. turned into business

Summarizing then?

  1. SCKRK is awesome

  2. manifesto calls for professionalism

    1. you have it? then raise the bar

    2. your call, not your employers, so YOUR skills are admirable

  3. it’s about self-improvement, a journey to mastery

    1. your masterpiece? your T?

  4. PRACTICE - in many shapes, forms or directions


  1. Flash galaxy

  2. C, Java, Perl, Python, Go, JS, Lisp, Scheme…​

  3. dev, ops, devops,

  4. front, back, full-stack

  5. dev, qa, SDET

  6. security


iconic or just often associated with Software Craftsmanship

bookCover SoftwareCraftsmanship
bookCover TheCraftsman
bookCover PragmaticProgrammer
bookCover Mastery
bookCover ApprenticeshipPatterns