- A 'Hunt the Wumpus' like maze adventure program on my Commodore P100 programable calculator.
- Given the max of 72 program steps and 10 memory cells of the P100, this was probably the first time I used a rudimentary hash noise function (in this case to generate the maze 'on the fly', and not need to store it).
- A primitive LISP like eval loop on my HP-41C, with symbolic derivatives and simplification.
- The integer part of the memory cells were the 'car' part, and the fractional part being the 'cdr' part (with an appropriate scaling).
- A Fortran 2d finite element solver, 'mesher' and plotter on my schools 'new' VAX/VMS.
- The only early program that I still have, as it is printed as an appendix to my 'hand typed' BS EE thesis.
- A bridge calculation:
- A two player 3d wireframe helicopter against tank simulator/shooter game (C and assembly, on my 4MHz Intel 8088 Cannon AS-100
- The screen and keyboard were split in two,. The game animated a bit more than 100 segments for both the helicopter and the tank. "Space dots" were projected in front of each 'camera' to improve the feeling of motion. Frame rate was about 4 frames per second.
- Fun fact: the 3d rotations matrix was 'compiled' in real-time to shift and add/sub instructions, as this was faster than using the CPU's multiply instructions.
- A Warnock algorithm to render only spheres on my Canon AS-100. Example, 3d triangles were many small spheres, cubes were a recursion of well placed spheres of various sizes.
- The resulting rendering where very 'organic' because of all those 'spheres' meant that everything looked 'soft',
- The 'radius testing' code was somewhat similar to the (later) doom distance calculation code, as it was one table lookup of the scaled argument, plus one fix-point iteration to refine the result.
- A scan line based design rule checker and layout 'compactor' (at the CSEM, for the analog CAD system we built)
- Initially Manhattan (orthogonal) geometries, then 45'' angles too, then any 2d geometry.
- It implemented 'boolean' and 'sizing' operators on 2d polygon geometries which my colleague Thomas Schwarz used to implement a window manager 'for fun' on the serial Tektronix color terminal. (Slow but ultra-cool effect!)
- Mentor Graphics integrated this CSEM development into their ECAD suite:
- A symbolic determinants simplifier using minimum weighted matching, used to symbolically extract dominant poles and zeros out of analog circuit sizings.
- The better algorithm came out the same year and worked on weighted matroids.
- It is this type of experience in applied math that gives you a 'bottom-up' understanding of Laplacian matrices.
- A multi-model hybrid-grid-graph simulator (as part of my PhD).
- The generic sparse matrix assembly based on priority queues meant that all sparse matrix formats and parallelization schemes were supported efficiently for very large systems (think supercomputers). As a by-product, compact models could efficiently be extracted from large grid based simulations, which ensured the simulator's and ISE AG's commercial success.
- Grid properties could be computed using Jean-Bernard Lasserre's recursive simplex volume algorithm. This generic n-dimensional algorithm was a bit slow but quite useful as many meshing systems provided incorrect volume/area/length values to the simulator for difficult mesh geometries.
- Some early ISE AG goodies (ISE was later acquired by Synopsys):
- A distributed object protocol with futures in C++ (early Actant).
- Prior to Eurex only VMS and AIX based APIs existed to quote options on Deutsche Börse. I had a good experience in serializing C++ objects to files (for my PhD). I adapted this code to make a remote object socket protocol to allow our Windows based option quoting system talk to VMS and we used this until Eurex became live (1998 I believe).
- Remote calls could be chained as a 'future protocol'. While 'cool', I later disabled the 'futures' functionality having learned that too much generality is sometimes too expensive to maintain.
- Some Actant AG goodies:
Sunday, July 03, 2022
Some favorite early programs I wrote
Saturday, March 12, 2022
Thinking about parallel and distributed computation
A classical way to look at parallel / distributed systems is in terms of:
- Work-Efficiency
- Parallelism
- Locality
- Velocity
- Resources
- Work
- Momentum
- Quality
- Traffic
- Consistency
- Availability
- Partition tolerance
- Fast
- Good
- Cheap
- Two people must work together vs an engineer and a sales person must work together
- Two time constraints must be considered vs a measurement must last one microsecond and be done in the next two weeks.
- Work-Efficiency of all durations
- Parallelism of long durations
- Locality of short durations
- Small
- Large
- Slow
- Fast
- Short
- Long
- Light
- Heavy
- Precise
- Approximate
- Predictable
- Unpredictable
- Efficient
- Inefficient
- Up-stream
- Down-stream
- Present
- Future
Monday, March 07, 2022
Six ways to improve your organisational agility
Failing smart
"Failures must bring you closer to your vision"
It is a mantra I have often used. And very much how I approach agile innovation (e.g. see Search and Vision for Systematic Innovation)
However...
It is only partially true, as failure may happen simply because you are disorganised, with no relations to your vision. Fixing organisation issues helps avoid drifting further away from your vision, it does not bring you closer to your vision! Still, unmanaged organisational issues will eventually consume you 'from within', therefore they too must be addressed.
Can we focus on fixing organisation issues? Can we identify a subset of failures as 'organisational failures', and others as 'non-organisational failures on the way to our vision'? The simple answer is yes! Yet we most know what we are looking for.
Six types of failures
When I act as agile manager I try to distinguish between six types of failures. These are:
- Fail Goal: Fail to achieve previously promised goals
- Waiting: Fail deadline because of waiting on others
- Underutilisation: Fail to use all your team members
- Exhaustion: Fail to stay productive because of exhaustion
- Inconsistency: Fail because of misalignments
- Queuing: Fail because of past work no longer relevant, or past work never finished.
Six ways to improve your organisation
# | Failure type | Observation | Corrective action |
---|---|---|---|
1 | Fail Goal | Fail to achieve previously promised goals | Review / pivot how resources approach goals |
2 | Waiting | Fail deadline because of waiting on others | Review how resources approach work |
3 | Under-utilisation | Fail to use all your team members | Review how goals are broken down into work |
4 | Exhaustion | Fail to stay productive because of exhaustion | Review how goals are picked up by resources |
5 | Inconsistency | Fail because of misalignments | Review how work is shared across resources |
6 | Queuing | Fail because of past work no longer relevant, or past work never finished. | Review how common work impacts different goals |
You may note the common patterns both in the observations and in the corrective measures above. This is because they all refer to the same system! This is important, and maybe the most important learning from this post. When managing fast greenfield innovation projects:Comparing failure types is as important as to address specific failures!
This is because when a failure type happen more often than others, we can take organisational actions even before we understand the specific details of each failure!
A final note: the approach is scalable.
All original content copyright James Litsios, 2022.
Comparing failure types is as important as to address specific failures!