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.
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?
- Software design;
- Factoring & chunking. Putting structures in useful size blobs;
- Expectations of communication, one of the things I take from Agile and new media, is regular information flows;
- Consistency - that is my APIs and similar have a coherent structure, so one may learn them quickly;
- Simplicity of abstractions. To solve a complex problem in a clear and understandable method is sign of deep understanding and value of aesthetics;
- 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?