Current skills

This is one of those sections which is too wordy to fit on my CV.

I think skills and experience is difficult to organise and needs factoring into several categories. From the perspective of skills for employability, everything [especially in technology] is time bracketed. I omit everything I have done with mobiles from my CV, as it is two generations ago, and irrelevant. The visual ratios I learned as a small boy doing graphical stuff will never change. Conversely the preferred method for doing AJAX changes quite often. Can I do page design? yes. Should I apply for print industry jobs? probably not.

This document will be the long version of my section in my CV.

Meta skills

I have a persistent conflict on what people actually want from “experience”. Strategy level decisions are what will kill a project most easily. To describe one trend: to follow the herd leads you to have a good tool chain, wide understanding on your goals, and objectives. The other trend is to be different, this lets one have abnormal advantages. That is, a new process may give one much bigger margins or reduced risks. For some time at an employer, despite pure Linux live environment, I was anomalous for favouring Linux rather than an ms product for my desktop. I felt that Linux had many more tools that needed to do my job.

I am an experienced OO developer. My skills on this are OOA and OOD, not concentrating on any tool chain. I have been using OO PHP is some guise for nearly every working day for more than ten years. When I need to use strpos() I look up the order of the params (in IDE). If this was a brand new language and library suite I had never used before, I may not know specifically what the function was called, but I would know where to look (string manipulation). What therefore does experience mean?

UPDATE 2013: In my current situation, I am changing languages and platform with higher frequency. I now have to reference manuals regularly, as I have changed API four times in the five last days for accessing DB (DBI, Moracle, Ora_perl, PDO). Likewise I am concurrently editing content for three different wiki processors (including the text you are currently reading); and use six regex libraries (JS, vim, Perl, a wiki library, grep, mysql regex). As I know how to use each library, this doesn't slow me down noticeably; but I am dependant on documentation, and a network connection to access it.

Having written all of the above, a decent Perl programmer I am working with, recently patched a PHP application. He opened a vast security hole, as he didn't know what he is doing in that foreign language, and choose a really simple solution. When I write that I understand a libraries methods and concepts; I am claiming I don't do things like that, as I understand it already.

What would I consider my meta-skills?

  1. Software design;
  2. Factoring & chunking. Putting structures in useful size blobs;
  3. Expectations of communication, one of the things I take from Agile and new media, is regular information flows;
  4. Consistency - that is my APIs and similar have a coherent structure, so one may learn them quickly;
  5. Simplicity of abstractions. To solve a complex problem in a clear and understandable method is sign of deep understanding and value of aesthetics;
  6. Graphical layout/ 2D & 3D topology. I don't understand the separation of this from my second point;

Languages and Environments

The following is a relatively complete list of tools that I have used in my professional or academic past.

  • MVC as academic & commercial, in Java, PHP and Perl. Third party: Symfony, Catalyst, Express, Zend;
  • OO as an architect, a designer, and a tester;
  • Team coding; code standards, API docs, design meetings;
  • Kaizen adaptive process; internal tool improvement, to improve business flow;
  • Feature scheduling, release and management;
  • RDMS, normalising, re-indexing, lock management, type and date mangling;
  • Unit testing: phpunit, Test::more, qunit, tidy, validate, xmlspy, swarm punit;
  • PHP 5.6, 5.5 (and other editions but too old to be useful); all OO, packages, full impl for most business requirements;
  • vim 7; vim scripting, vim as a stream editor, vim as code management;
  • Perl 5.x; OO Perl, DBA Perl, language design & parsing;
  • Java 1.2,1.3,1.4; heavy OO, networking, graphics & rendering, text processing, template systems, multi-threaded & parallel processing, packaging;
  • Java SWT, Java Swing; event programming;
  • Python, threading, tk;
  • Some C inside Unix, make;
  • sed, awk, troff (as man);
  • gd, imagemagick (as image manipulation);
  • SQL: MySQL, Oracle, Postgres, Mongo (yes, but this is the right list), FMP;
  • ODBC (as 2001 edition, and 2011 edition ~ didn't actually notice that much difference);
  • Email systems and routing; IMAP, POP3, SMTP, MIME, encoding, creating these from base language, templating systems for the contents, mailbox backup software;
  • quite a few data validation schemes, mostly rule based;
  • expect; process automation, automated decision making;
  • RPM, yum, dpkg, apt-get, aptitude, suse tools;
  • Templating systems: Smarty, twig, catalyst, several JSON to HTML renderers, ghostscript scripting (PDF and TIFF output);
  • Apache 2; web applications, vhosts, mod_rewrite;
  • HTML 4.1 & 5, cross browser compatibility, w3c standards, sensible use of lesser tags, HTML5 form items, semantic markeup;
  • digital asset management; backups, file system standards;
  • wireshark; protocol analysis, bottleneck analysis, data clean-up on full dumps, traffic summaries;
  • PSP, gimp; Photo edit & manipulation, lighting stuff;
  • PHP 5.x; multi-process, sockets, XML, binary, protocol stack impl;
  • XML/ SOAP &1; business infrastructures, B2B automation;
  • PO, XML, JSON, UTF-8 transcoding, fluid layouts;
  • Payment gateways for several vendors, management on payments, invoices etc;
  • Creation of a multi-tier billing system, multi-banded rates for reseller infrastructures;
  • JS, most versions between 2000 and today, ECMAscript; input validation libraries 2nd & 3rd generation, dynamic selects, experimental windowing toolkits in JS;
  • JS as an OO language, JS DOM, jQuery, some prototype;
  • JS modernizr etc
  • Encryption, to implement several protocols (L2TP, RADIUS, HTTPS, password);
  • Regression test suite x3;
  • CSS 1, 2 and 3, bootstrap, foundation, inc transforms, browser compat CSS;
  • PHP opcode optimisers, managing process signals;
  • XML1.0, XML1.0 with namespaces, XML1.1 SOAP;
  • IP address management (traditional ranges, CIDR, routing) + integrity checking;
  • SMS integration;
  • web based map API: google map, bing map, google heatmapapi;
  • several JS graphing tools;
  • Unix tools; sed, expect, grep, ssh, ssh-agent;
  • Netflows, several versions;
  • RADUIS protocol (including several specialised RFCs, Cisco specific features);
  • Documentation systems; man/troff, ms-word, PDF exporters, documentation tools;
  • L2TP protocol, LCP protocol, kernel IO streams;
  • syslogd, configuration and management;
  • Several bulk data import tools (mostly that I wrote);
  • Log management, extraction and summary;
  • Time regulated behaviour on products;
  • Invoice reconciliation;
  • Firewalls; iptables, ipchains;
  • Voice integration, asterisk, asterisk modules, voice casting/push, complex behaviour on anwserphones;
  • Non-IT-peoples data-systems;
  • The ISP industry - not that I was intending on working inside this again;
  • The car industry - not that I was intending on working inside this again;

The above is not my limits, just my past.

I deny being limited to what I have done before. Neither is anyone else.
As a back of envelope calculation, you need to solve problemX, I can:

  • Implement featureX using methodX (cost X, risk X, results X, known process);
  • Implement featureX using methodY (cost to plan X, cost to implement X, risk 3X, therefore 2X or 3X testing, outcome upto 2.5X);

Which is better?