Well, sometimes at least...

I'm posting this as a way of thinking something through and getting some feedback. The advice in the title is really for me, not completely general, but I think it makes sense more often that some folks seem to think

First an overview of the playing ground:

So, what's this got to do with reinventing the wheel, you ask? Answer: I believe that one way for me to learn is to reinvent the wheel, and that's what I've been doing for the last week. I had a breakthrough this morning, and this is the post too-much-coding debrief. I want to justify this to myself and see what others think.

Quick background. I'm a teacher and part-time sysadmin at a school. My primary job is teaching, but I also administer one of our internal servers. I do this because we are a Mac shop, and I'm the only one there who is comfortable at the command line. The server I administer hosts blogs, a school-wide wiki and is testing Moodle. We started with the wiki and one blog. We now have 65 blogs, the wiki and the test Moodle installation. Bully for us. However, 65 blogs require a lot more babysitting than one. Most of my coding is for and about the blogs: keeping track of them (versions, administrators, database titles, etc.), patching and upgrading them, backing them and their databases up regularly, updating them. Over the last year, I've written about 4,000 lines of code, mostly in Perl, to help me do all this. (Sloccount says that's about 2.5 person-months worth of code, which kind of hurts, but what are you going to do?)

I joined PerlMonks a few months after I started to learn Perl, which means I've been writing code for about a year and a half. I have zero background in CS. I came to all of this sideways (started using Ubuntu, then Debian in 2006). I've read Beginning Perl, Learning Perl, Intermediate Perl and quite a lot of the documentation in perldoc. I took an Introduction to C class at a local college on the weekends.

Early on, I learned the lesson that using other people's code is a Good Thing (TM), and up until recently, I've done just that.

Recently, however, I've begun to have my doubts. Working the way I have been, I ended up writing the same sorts of (reasonably basic) things over and over while letting more mature modules do the "heavy lifting." In one sense, that's obviously smart: they write much better code than I would, even if I had the time to write the whole lot of it (which I don't). But - and here's the kicker - I want to learn more. If I keep going the way I have been, I never will.

Luckily, I'm on vacation (ah, the life of a teacher) and my wife's out of the country, so the last week, I decided to write my own version of File::Find plus a custom pretty printer for it. It's primitive as hell, lacking most every feature you might want, and I still had to steal most of the ideas from Intermediate Perl and Higher Order Perl. Later today when I start to look at the guts of File::Find, I will probably feel very stupid about my choices. (I deliberately didn't look up until now, which is kind of silly considering how much I stole from Schwartz, foy, Phoenix and Dominus.)

Nevertheless, it bloody works. It's even nicely decoupled: the main routine lives in a module, you feed it callback routines in the calling script, and it's easy to customize to produce a variety of reports. (It's first job is to tell me just who is uploading all those f@$#king .ppt files to the damn server.) Although I could have done this in a tenth the time with File::Find, I feel that I've learned more in this one week than in all the rest of the previous year. Callbacks and coderefs finally make (some) sense to me, and I'm starting to get a sense for how and when to use recursion, when and how to build a complex data structure, when to process individual items immediately as you go. (You can't group all the files in one directory (or sub-sub directory) and then sort them by size & then name if you've already printed them. But sometimes, you just want the list without any further sorting or processing needed. If you take these two functions apart, you can choose when to do it one way or the other. Obvious, but only after you see it.)

Anyhow, this has been too long and rambling. My point is this: I reinvented the wheel, probably poorly and with far too much effort, but I did it and I'm glad I did. I plan to do it again this summer when I have more free time. If you're still reading, and you think I'm barking up the wrong tree, please let me know.

Discuss.


In reply to Reinvent the wheel! by telemachus

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.