Interview Checklist for Software Engineers

Technical

  1. do they have opinions about software engineering?
  2. are those opinions sensible?
  3. do those opinions conflict too strongly with our existing team?
  4. do they really want to make good software?
  5. do they really want to make the software we are making?
  6. are they interested in users?
  7. do they bring skills we don’t already have?
  8. do they have the self discipline to work effectively within a team?
  9. do they have the self discipline to make good quality software?
  10. is their personality such that will they work effectively within our team?
  11. are they creative and clever and self-motivated to apply it?

Non-Technical

  1. do they have good negotiation skills?
  2. can they explain themselves clearly?
  3. can they learn something quickly? (do they listen to others?)
  4. do they know how to learn in the medium and long term?
  5. are they honest and insightful about the limits of their own knowledge and abilities?
    1. do they know what they can do already?
    2. do they know what they can’t do yet?
    3. are they willing to tell me what they can’t do yet?
    4. are they trying to blag?
    5. are they self-motivated?
    6. do they have something they want to achieve from working?
      (money, status, skills, friends, fun, whatever)?
  6. do they like to share what skills they have with others?

Start-ups only

  1. do they understand what a start-up is (in business terms)?
  2. do they understand what a start-up needs?
  3. do they understand the risks of a start-up?

Distributivity of Sequence Map over Function Composition in Dafny

Distributivity of Sequence Map over Function Composition in Dafny

lemma MapDistributivity(xs:seq<int>, f:int->int, g:int->int)
   requires forall x :: x in xs ==> f.requires(x);
   requires forall x :: x in xs ==> g.requires(f(x));
   ensures forall x :: x in MapSeq(xs,f) ==> g.requires(x);
   ensures MapSeq(MapSeq(xs,f), g) == MapSeq(xs, Compose(f,g));
{
   if xs != []
   {
     MapDistributivity(xs[1..], f, g);
   }
}
 
function Compose(f:int->int, g:int->int) : int->int
{
  x
    reads f.reads(x)
    reads if f.requires(x) then g.reads(f(x)) else {} 
    requires f.requires(x) 
    requires g.requires(f(x)) 
      -> g(f(x))
}
 
function MapSeq(xs:seq<int>, f:int->int) : seq<int>
   reads MapSeqReads(xs, f);
   requires forall x :: x in xs ==> f.requires(x);
   ensures |xs| == |MapSeq(xs,f)|;
   ensures forall x :: x in xs ==> f(x) in MapSeq(xs,f); 
{
  if xs == [] then []
  else [f(xs[0])] + MapSeq(xs[1..], f) 
}
 
function MapSeqReads(xs:seq<int>, f:int->int) : set<object>
   reads if |xs| > 0 then f.reads(xs[0]) + MapSeqReads(xs[1..], f) else {};
   decreases xs;
   ensures forall x :: x in xs ==> f.reads(x) <= MapSeqReads(xs,f); 
{
  if xs == [] then {}
  else f.reads(xs[0]) + MapSeqReads(xs[1..],f)
}