Git Product home page Git Product logo

apprenticeship's Introduction

These are notes for the Apprenticeship Programme. Distributed under Creative Commons Attribution Sharealike International 4.0

Preface

This programme intends to embed the same baseline knowledge into a new person, to avoid discovering holes in their knowledge later.

This programme needs a one-to-one pairing of apprentice with a senior developer. It must be implemented within existing team structure, already working on some project. The reason for such requirements is to present the apprentice with real-life problems. Because of the above it works best with long-term assignements, where you invest in a person and your team dynamics up front to get the work quality you need.

Recommended timeframe for covering the topics below is 3 months, however can be shortened/made longer depending on the progress of the apprentice.

Tested on several mentor-apprentice pairs, always with local pairing. No remote experience here, would probably need adjustment for remote settings. Have such experience - please contribute !

If you have experience being an apprentice or a mentor - feel free to add a pull request here, however small !

Don't want to create a pull request ? Starting an apprenticeship programme and unsure how it should be run in practice ? World seems bleak and stripped of joy ? Contact me: email/jabber/xmpp: [email protected]

Goals

  • for the apprentice to be able to learn on their own
  • baselining knowledge - this allows other, equally trained, people to expect knowledge of the subjects below when working with the apprentice
  • for the apprentice to feel comfortable when asking questions
  • allows the apprentice to formulate a plan of approaching a problem on their own - do not hand over a complete plan of actions

General

Before apprentice starts:

  • decide on the mentor
  • make sure that everyone understands that we're investing the time now to iron out all of the issues today - this means that the whole team is taking a performance hit by accepting the apprentice, and they do want to do it anyway.
  • make sure to announce when the apprentice starts to everyone involved.

Starting

  • look through this document
  • look through other materials available
  • discuss your experience, come up with a plan for first week together
  • after the week come up with the plan for the next week and so on every week
  • treat this document as a rough sketch of a overarching plan/list of goals
  • revise the progress on the bigger picture every week

What's where

  • office supplies

Who's who

  • show the apprentice how to locate subject-matter experts using in-house tools
  • introduce people when working on particular problems [X might know about this, let us ask her !]

Office tech

  • email setup
  • email groups
  • IM setup + testing
  • VPN setup + tests
  • WiFi

Company network

  • intranet
  • distribution lists
  • Wiki
  • Task management

Project infrastructure.

  • Build servers

Knowledge sources

  • schedule slots for reading - make Friday the day of learning
  • Fowler's "Refactoring"
  • RSS feeds [share people's feeds - see .opml files in the repo]

Noting stuff down

  • introduce to 'note everything, sort later' aka 'post mortems and time management for free' approach

Learn to learn

  • review mistakes and sucesses every Friday
  • open discussions with your peers, and not being afraid to ask stupid questions

Tech

commandline:

  • bash/zsh [cygwin if Windoze]
  • pipes, redirects
  • when in doubt use the simpliest, most brute force tools possible, i.e. grep and find. introduce grep as a tool to check for mistakes during refactorings, etc
  • involve grep and find for finding places in legacy code

SCM

project setup -> ability to deploy

Algorithms:

  • RSA
  • hashes and dictionaries/hash maps

Memory management:

  • mapping between native memory and JVM/CLR memory
  • GC
  • heap
  • stack

Computer bootup process

Networking:

  • ssl/tls
  • C10K problem, implement singlethreaded low level server on raw sockets

IPC

Multitasking:

  • OS-level threads vs green threads
  • async io
  • immutability of your data and multithreading - functional programming vs object oriented

Working with code

  • codetiquette - remember that in most cases you are not the only one working on this code
  • code standards - the more boring the better, the more uniform the better
  • ability to read code
  • working with legacy code [freeze with tests + cut out approach]
  • negate condition -> decrease indentation
  • guard clauses at the beginning
  • ifs/switch -> dictionary
  • when to refactor ?
    • symmetry broken
  • continuous refactoring - improving your codebase rather than regressing it
  • error and exception handling
    • do not use exceptions for flow control
    • talk about the difference in execution paths, how exceptions affect stack etc
    • introduce monadic error handling
    • care about what you can handle, pass all other stuff upwards
  • always reproduce a bug with fully automated test first
  • good naming: what it does, not how it does it
  • introduction to TDD
  • inner TDD loop vs outer, acceptance-tests driven TDD loop
  • spikes in TDD

META

  • Recommend changes to the apprenticeship programme

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.